例えばリファクタリングとか。
こういうタスクを先延ばしすると忘れ去られるらしい。そしてそれは良くないらしい。
そういう記事や本を読んだからそういう固定観念があるのかもしれない。
ここで気になるのは実際に放置して何が起こるのか。
私はまだそこまでの問題が起きたことがない。実際に忘れることは体験済み。
記事や本を読んだ知識と、実体験が乖離しているため頭が混乱している。つまり、本には良くないと書いているが、私に問題が起きたことはない。しかし私は実際に先延ばしにして忘れていく。
白黒つかないこと。うーん。時間をかけてタスクを洗い出すことはできるけど、全タスクにそれはできない。結局その時にやるべきと思ったことしかできない。
健康になる技術 大全 を読んで、ヨガに興味を持った
運動には4種類くらいあるらしいが、それを全部カバーできるって書いてた気がする。
やったことないのでとりあえずやってみようと思う。
ヨガの教科書ってなんだろうと思って、ヨガインストラクターの資格を調べた。
JAY日本ヨガ連盟というのがヒットしたので、それの教科書を買って読んでみることにした。
https://amzn.to/3NzZmbx
https://amzn.to/3Pib4IY
あと、座るのがあまり良くないとのことでなるべく立ってやることにした
https://github.com/kajirikajiri/cypress-component-test-mui-next-ts
@mui/material/TextField
@mui/x-data-grid
を対象にテストを書いてみた。
普通にかけた
技術書読んで共通化に目覚めて、共通化してたが最近してない。
特にテスト。例えばrspecでdescribeやcontextで共通化してたが、最近はitの中に全部書いてる。
例えばorganizationっていう変数を使ってるとして、他とちょっと異なるとき、外側で共通化されてると剥がすの面倒ってなるのが辛い。
なんだろう、そっちに頭のメモリを使いたくない。あっちのテストにもこっちのテストにも影響あるかも、、、ってなると、頭が辛い。itの中に全部書いてあればそこだけ気にすれば良くて頭が楽。
kernelを以前にインストール済みの5.10.0-23にしたらチラつきは発生しなくなった。なので、デフォルトで起動するカーネルを変更した。
/etc/default/grub
のGRUB_DEFAULTを変更した。
GRUB_DEFAULT="Advanced options for Debian GNU/Linux>Debian GNU/Linux, with Linux 5.10.0-23-amd64"
15分程使わずにログイン画面に戻された場合に電源ボタンが効かない。ログイン状態であれば使える。ただし、bullseyeの時と挙動が違って、60秒後にログアウトしますという画面が表示される。
電源ボタンを押したらシャットダウンして欲しいので、設定を変える。
GPT-4に聞いた。成功したので載せておきます。
私
電源ボタンを押した時にシャットダウンするようにできますか
https://www.debian.org/releases/bookworm/amd64/index.en.html
GPT-4
はい、あなたの問題を解決するためには、ACPIイベントを設定してシャットダウンさせるスクリプトを作成します。以下にその手順を詳しく説明します。しかし、この変更はシステムレベルの変更となるため、どのような影響があるかを理解してから行うことをお勧めします。
まず、ACPI(Advanced Configuration and Power Interface)サポートが有効になっていることを確認してください。これは、あなたのマシンが電源ボタンの押下を認識できるようにする機能です。これを確認するためには、以下のコマンドを使います:
grep -i acpi /boot/config-$(uname -r)
出力が CONFIG_ACPI=y を含んでいれば、ACPIが有効になっていることが確認できます。
次に、/etc/acpi/events/ ディレクトリに新しい設定ファイルを作成します。例えば powerbtn という名前でファイルを作成します:
sudo nano /etc/acpi/events/powerbtn
このファイルに以下の内容を記述します:
event=button/power (PBTN|PWRF)
action=/sbin/shutdown -h now
これは、電源ボタン (PBTN または PWRF) が押されたときに /sbin/shutdown -h now コマンドを実行するという意味です。
最後に、ACPIデーモンをリスタートします:
sudo service acpid restart
これで、電源ボタンを押すとシステムがシャットダウンするはずです。
それでも問題が解決しない場合は、具体的なエラーメッセージやシステムの詳細情報を教えていただければ、より具体的なアドバイスが可能です。
https://chat.openai.com/share/550b906c-9af8-4c46-8717-65e81cdfa767
自分だけで使う。
1日10,000件。1時間1000件。
効率よくやって10時間で10000件。
1時間ごとに1000件づつやる。
https://support.apple.com/ja-jp/HT202299
共有アルバムの 1 時間/1 日ごとの制限は次の通りです。
すべての共有アルバムに対して参加者 1 名が投稿できる写真とビデオの 1 時間あたりの最大枚数:1,000 件
すべての共有アルバムに対して参加者 1 名が投稿できる写真とビデオの 1 日あたりの最大枚数:10,000 件
これらの共有制限は、上記のアップロード制限とは別途設けられています。たとえば、同じ日に 10,000 枚の写真をマイフォトストリームにアップロードしてから、それらの 10,000 枚の写真、または 10,000 枚のほかの写真を共有することができます。
共有アルバムについては、次のような制限も追加で設けられています。
1 人のオーナーが共有できる共有アルバムの最大数:200
1 人のユーザが参加できる共有アルバムの最大数:200
共有アルバムあたりの最大参加者数:100 人 (共有アルバムごとの参加者数)
1 つの共有アルバムで参加者全員が投稿できる写真とビデオの合計枚数:5,000 件
共有アルバムの 1 枚の写真または 1 つのビデオにつき投稿可能なコメントの最大数:200 回 (「いいね!」またはテキスト入力をコメントとみなします)
コメントあたりの最大文字数:1024 文字
1 日に共有アルバムのオーナーが招待通知を送信できる最大数:200 件
nvm以外からインストールしたnodeが見つかったので、削除したら解消した
which -a node
brewでインストールしたnodeが入っていたので削除したらnvmでインストールしたnodeのバージョンになった
開発体験は良い
会社のApple M1 Pro 32GB 14インチ 2021年モデルはdockerを動かすととても遅い。dockerでrubocopしたり、dockerでgatsby立ち上げたり、Nextjs立ち上げたりがとても遅い。体感的には1/10くらいの速さで色々が終わる。
e2eテストが特殊だった。
自宅PCで立ち上げたlocalhostをLocalForwardやRemoteForwardでどこからでも使えるようにして、e2eテストはmacから実行する。
なので、実装は自宅PCのコードを編集。テストはmacのコードを編集するのでなんかやりづらかった。
あとは、一応sshしないといけないので手間がある。
2023/06/02
まだ色々残ってるが、忘れるとあれなのでメモ。
浸水したのを発見したら写真を撮りましょう。ちょっと片付けてから気づいたので。多分保険が降りるよ。
後で見たら、weather news で16時に31mlだった。
システム設定 → キーボード → キーボードショートカット → キーボード → 次のウィンドウを操作対象にする
これでVSCodeのwindowを切り替えれるようになった。このショートカットの存在を知らなかった
これで外出先からでも電源をonにできる。マジックパケットより楽そうなのでこれにした。まあ、物理的に取れたら終わりだけどね。10回くらい動かした感じは大丈夫そう。最初の一回で、電源スイッチから遠すぎて、スイッチを押そうとして平面を押してswitchbotが剥がれた落ちたけど、近づけたら大丈夫だった。落っこちたときにswitchbotのパネルが外れてビビった
こんな感じの設定ファイルを書いた
# /etc/systemd/system/[email protected]
[Unit]
Description=Setup a secure tunnel
After=network.target
[Service]
User=User
ExecStart=/usr/bin/ssh aws
RestartSec=5
Restart=always
[Install]
WantedBy=multi-user.target
手動で立ち上げる
systemctl start secure-tunnel@.service
このコマンドでパソコン起動時に実行されるようにした
systemctl enable [email protected]
ログは以下のコマンドで確認
sudo journalctl -u secure-tunnel@.service --no-pager
or
systemctrl status secure-tunnel@.service
あとは、magic packetを送って外部から起動しようと思ったが、無線LANだとめんどくさいとどこかの記事で読んだので断念して、switchbotを取り付けて起動してみようと思う。長押しもできるようなのできっと大丈夫
参考
https://gist.github.com/drmalex07/c0f9304deea566842490
参考 GPT-4
QUESTION
How do I run the ssh command when my computer starts up?
ANSWER
Starting an SSH command or any command at startup can be done by setting up a script to run when the system boots. Here is a general approach for different operating systems:
Windows:
Open Notepad.
Write your command in the format: "C:\Program Files\PuTTY\putty.exe" -ssh user@hostname.
Save the file with .bat extension.
Press Win + R to open Run, type in shell:startup, and press Enter.
This opens the Startup directory. Move your .bat file into this directory.
MacOS:
Open Terminal.
Write crontab -e and press Enter.
Add the command @reboot /usr/bin/ssh user@hostname.
Press Ctrl + X to finish editing, Y to save changes, and Enter to exit.
Linux (systemd):
Open Terminal.
Write sudo nano /etc/systemd/system/sshcommand.service and press Enter.
Enter the following (replacing 'user@hostname'):
csharp
Copy code
[Unit]
Description=My SSH command
[Service]
ExecStart=/usr/bin/ssh user@hostname
[Install]
WantedBy=multi-user.target
Press Ctrl + X to finish editing, Y to save changes, and Enter to exit.
Enable this to start at boot by running sudo systemctl enable sshcommand.service.
Note: These examples assume you have the SSH command or an SSH client available and in your PATH. Adjust paths and command options as necessary. Please be careful with security considerations. Running an SSH command on startup often means either using key-based authentication, which requires careful handling of SSH private keys, or storing passwords in plaintext, which is a security risk.
macos 500gbにssd 500gbを接続して、ssdを初期化したつもりが、macosを初期化した。
1008エラーが出たり、アクティベーションロック解除してもダメだったりして面倒だった。
https://support.apple.com/ja-jp/HT206989
apple-configuratorを使って復活に失敗したので復元して、
https://support.apple.com/ja-jp/guide/apple-configurator-mac/apdebea5be51/mac
途中でディスクユーティリティを起動させ、ハードディスクをeraseして、macosを再インストールした。
https://support.apple.com/ja-jp/HT204904
再インストールしようとしたら、フォーマットが違うとか言われて、何回かeraseを繰り返した。
以下のようなメッセージだった。
This disk doesn't use the GUID Partition Table scheme.
Use Disk Utility to change the partition scheme. Select the device containing the disk, click the Erase button, select the Volume Scheme and then click Erase
This Mac can only install macOS on APFS-formatted drives.
言われた通りにフォーマットしたら、macosの再インストールに成功した。
データは全て消えたようだが、消えてもいいようにしてるので特に問題ない。
今はventureにupdateしてる。
家にデスクトップPCを置いて、そこにsshして開発している。
自分も家にいる時は、デスクトップPCにノートPCからsshしてLocalForwardで開発している。デスクトップPCで動かしているdockerのポートをノートPCのポートから読み込めるようにしている。遅延とか特に感じない。vscodeもsshで動かせるので、ノートPCからデスクトップPCのファイルを変更している。
自分が外に行く時は、デスクトップPCをawsのインスタンスにsshしてから外出している。デスクトップPCでRemoteForwardしているので、awsからデスクトップPCにsshできる状態になっている。あとは外出先でノートPCからproxyCommandでawsにsshして、デスクトップPCにsshしている。次にデスクトップPCからRemoteForwardでdockerのポートをawsに接続して、そこで指定したポートにノートPCからLocalForwardでsshして開発している。
これのいいところ
欠点
以下のようにしたら、localForwardしたターミナル上でエラーが発生した。これはなんだろうか?
mac --ssh--> aws --ssh--> linux --remoteForward--> aws
mac --localForward--> aws
普通に開発して、1日0.1GBだった
無料の範囲が月に100GBあるのでまあ無料で使い続けられそう
以下参考
https://aws.amazon.com/jp/ec2/pricing/on-demand/#Data_Transfer
AWS をご利用のお客様は、すべての AWS のサービスとリージョン (中国と GovCloud を除く) で合計 100 GB のインターネットへのデータ転送 (アウト) を
毎月無料でご利用いただけます。インターネットへのデータ転送 (アウト) のための 100 GB の無料利用枠は
グローバルであり、AWS リージョンに個別にまたは別個に適用されるものではありません。
https://qiita.com/koji4104/items/60454f6a92c14016f2b1
請求書ページのコストエクスプローラーへ移動します。
グループ化の条件を指定します。詳細→タグ→Name
使用タイプグループを指定します。EC2: Data Transfer-Internet (Out)
https://zenn.dev/voluntas/scraps/2650bc3e6b4ea6
100 GB/月まで
無料
hostname -I
ipaddressが表示される
whoami
usernameが表示される
ssh <username>@<ipaddress>
ipaddressは複数表示されていたが、先頭のやつでsshできた
秘密鍵やport番号を変えているのであれば適宜セットしてください
アップグレードがあるよって、通知が出てたのでアップグレードしたら、tp-linkのusb-wifiでwifiできなくなった。再度ドライバ?をインストールしたらwifiが繋がったのでok。もうすぐ、ubuntuの本の虫?がリリースされるので、その時のアップデートでも多分同じことが起きるので覚えておきたい。
上記をすることによって、家のサーバーにsshできて、家のlocalhostで立ち上がっているrailsやnode、goやreactなどのサービスをofficeから操作できた。vscodeのremote接続をすることにより、コードの編集もofficeからできたので満足。
以下は図にまとめた。
また、sshのconfigには適宜これらを追加したい。
ExitOnForwardFailure yes
TCPKeepAlive yes
ServerAliveInterval 30
これによって、家に強めのデスクトップPCを置いておいて、外出先から動かすことができるので非常に便利。
あとは、awsの通信量が気になるところ。
そもそもmacのdockerが遅くて作業が捗らなかったところから、色々考えてこういう構成になった。
macとlinuxか、macとwindowsのノートパソコンを持ち歩くと、2台で重い。それにノートパソコンは高い。2年前くらいに買ったthinkpadはトータル30万くらいしたが、今回は15万くらいで収まっている。
できれば2年に一回くらいは新しいPCにしたかったので、これなら半額で買い換えれる。嬉しい。
今回の色々でsshに詳しくなった。
debianを放置して、ディスプレイが消えたが、音はなっていて、 LEDはついている状態でキーボードやマウスをクリックしてもディスプレイが表示されなかった。
強制終了すればいいのだが、気分的によくない。
それっぽい状況をみつけた。
https://unix.stackexchange.com/a/521612
Hibernationというのは冬眠とかでてきたので休止状態と思われる。
自分の状況は放置して休止状態になったか、スリープしたのでは?と思ったので、記事の通り、swapファイルを設定した。
# swapを表示
sudo swapon --show
NAME TYPE SIZE USED PRIO
/dev/nvme0n1p3 partition 976M 0B -2
# RAM(メモリ)を表示
free -h
total used free shared buff/cache available
Mem: 31Gi 2.0Gi 27Gi 209Mi 1.4Gi 28Gi
Swap: 975Mi 0B 975Mi
# 記事を参考に、38GBのswapファイルを作成
sudo fallocate -l 38G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
Setting up swapspace version 1, size = 38 GiB (40802185216 bytes)
no label, UUID=b9cf574a-ab09-44d3-8033-01b26f8ec0b3
# おそらくswapを設定
sudo swapon /swapfile
sudo vi /etc/fstab
# swapを確認
sudo swapon --show
NAME TYPE SIZE USED PRIO
/dev/nvme0n1p3 partition 976M 0B -2
/swapfile file 38G 0B -3
# swapを確認
sudo free -h
total used free shared buff/cache available
Mem: 31Gi 2.0Gi 27Gi 156Mi 1.4Gi 28Gi
Swap: 38Gi 0B 38Gi
設定できたっぽいのでok
swapの参考値は以下。参照した記事が参照した記事中にあった
https://askubuntu.com/questions/594054/how-much-swap-should-i-take-for-1gb-to-8tb-of-ram-on-14-04-or-higher
RAM No hibernation With Hibernation Maximum
1GB 1GB 2GB 2GB
2GB 1GB 3GB 4GB
3GB 2GB 5GB 6GB
4GB 2GB 6GB 8GB
5GB 2GB 7GB 10GB
6GB 2GB 8GB 12GB
8GB 3GB 11GB 16GB
12GB 3GB 15GB 24GB
16GB 4GB 20GB 32GB
24GB 5GB 29GB 48GB
32GB 6GB 38GB 64GB
64GB 8GB 72GB 128GB
128GB 11GB 139GB 256GB
256GB 16GB 272GB 512GB
512GB 23GB 535GB 1TB
1TB 32GB 1056GB 2TB
2TB 46GB 2094GB 4TB
4TB 64GB 4160GB 8TB
8TB 91GB 8283GB 16TB
追記
色々調べた結果、セキュアモードだと休止状態にできないとか?そんな記述を見かけたので、時間が経過しても休止状態にならないようにして、画面だけ消えるようにした。あとは、適宜シャットダウン。起動は十分に早いのでよしとする。
自作PCの作成やmx-linux、ubuntu、debianのインストールを試したりしてて、GWのほとんどの時間を費やした。
ubuntuは自分のpcでは安定して動かず、debianを選択した。
ubuntuはシャットダウンでシャットダウンしなかったり、chromeが急に終了したり色々大変だった。
マザーボードにはwifi、bluetoothが付いてなかった
まさかついてないと思ってなくて確認してなかった。後付けでusbで繋ぐやつを買った。
wifiを使えるようにデバイスドライバとか入れるのが面倒だった。
debianのインストールで失敗しまくった
bootloaderのインストールに失敗したり、パッケージマネージャーのインストールが成功したり失敗したりで面倒だった。
GPTとMBR、UEFIのあたりのパーティションについて知見が溜まった。GPTの方が新しい。MBRは2だか、4TBまでの記憶領域しか使えない。GPTとMBRを共存できない。
ASUSのマザーボードはUEFIのenableとdisableが直接的な表現でなかった。
https://www.asus.com/support/FAQ/1049829/
debianのインストール手順が悪いのか、SSDが壊れたのか判断がつかなくてSSDをもう一個買った
結果、インストール手順が悪かったと思われる。
EFIリムーバブルメディアパスにGRUBインストールを強行しますか?とでた場合にYESでよかった。
リムーバブルメディアパスというのが、USBのことだと思ってて、USBにインストールされても面倒だな。と思いNOを選択していたのがよくなかった。
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%A0%E3%83%BC%E3%83%90%E3%83%96%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2
asusのClear Secure Boot keysしたら、Install default Secure Boot keysが表示されるのでそこから戻せた。
Select “Clear Secure Boot keys” (You will have the option “Install default Secure Boot keys” to restore the default keys after you cleared the Secure Boot Keys)
Secure Boot keysを一回削除したあたりから、なんかうまくいかず、default Secure Boot keysに戻したあたりでうまくいった気がするけど、原因であったのか?不明。
もうすぐ、debianの最新版が出る。1ヶ月後くらい。
debianはめちゃくちゃ派生?クローン?されててすごいなと思った。ubuntuはdebianのUnstable、Testingを使って作られてた。
https://askubuntu.com/a/701364
Soaring
ssh -R 1111:localhost:2222
で開いたportに接続する側はport 1111に接続する。いつも2222に接続してエラーがでる
かっこよくないですか、ゲームに出てきそうですよね
サボテン
<->はsshのRemoteForward
<-はssh
ubuntu <-> aws <- mac
https://man.openbsd.org/ssh
RemoteForwardで接続した
A Reverse SSH Tunnel is a technique used to create a secure communication channel between two hosts, typically through a firewall or NAT (Network Address Translation). It involves establishing an SSH (Secure Shell) connection in the opposite direction of a standard SSH connection, allowing a remote host to initiate a connection back to the local host.
In a standard SSH connection, the local host (client) initiates a connection to the remote host (server). However, in some cases, the remote host may be behind a firewall or using a NAT that prevents incoming connections. A reverse SSH tunnel can bypass these restrictions by initiating the connection from the remote host to the local host.
The process involves the following steps:
The local host starts an SSH server and listens for incoming connections.
The remote host, which is behind a firewall or NAT, initiates an SSH connection to the local host.
During the connection setup, the remote host specifies a local port to be forwarded and a remote port to listen on.
The local host accepts the connection and binds the specified local port to the forwarded remote port.
The local host can now initiate connections to the remote host through the bound local port, effectively bypassing the firewall or NAT on the remote side.
Reverse SSH tunnels are useful for various purposes, such as remote administration, accessing internal services, and establishing secure connections in otherwise restrictive network environments.
deeplの翻訳
リバースSSHトンネルは、2つのホスト間で安全な通信チャネルを作成するために使用される技術であり、通常はファイアウォールやNAT(ネットワークアドレス変換)を介して使用されます。標準的なSSH接続とは逆方向にSSH(Secure Shell)接続を確立し、リモートホストがローカルホストに戻る接続を開始できるようにするものです。
標準的なSSH接続では、ローカルホスト(クライアント)がリモートホスト(サーバー)への接続を開始する。しかし、場合によっては、リモートホストはファイアウォールの背後にあったり、着信接続を防ぐNATを使用していることがあります。逆SSHトンネルは、リモートホストからローカルホストへの接続を開始することで、これらの制限を回避することができます。
このプロセスには、次の手順が含まれます:
ローカルホストは、SSHサーバーを起動し、着信接続をリッスンします。
ファイアウォールまたはNATの背後にあるリモートホストが、ローカルホストへのSSH接続を開始します。
接続の設定中に、リモートホストは転送するローカルポートとリッスンするリモートポートを指定します。
ローカルホストは接続を受け入れ、指定されたローカルポートを転送されたリモートポートにバインドします。
ローカルホストは、バインドされたローカルポートを通じてリモートホストへの接続を開始できるようになり、リモート側のファイアウォールやNATを効果的にバイパスすることができます。
リバースSSHトンネルは、リモート管理、内部サービスへのアクセス、制限のあるネットワーク環境での安全な接続の確立など、さまざまな用途に役立ちます。
静的 IPv4 アドレスが有料だから
https://azure.microsoft.com/ja-jp/pricing/details/ip-addresses/
awsは1つなら無料でできそう
https://repost.aws/ja/knowledge-center/elastic-ip-charges
RemoteForward(-R [bind_address:]port:host:hostport)するとき
使うコマンドがこれだとして -R 11111:example.com:22222
11111をインスタンス上で受信ポートを解放すると、RemoteForwardできず Warning: remote port forwarding failed for listen port xxxx のエラーが発生する。
インスタンスに入り、sudo lsof -i | grep xxxx
すると、 xxxxをLISTENしているポートが見つかるのでkill -9
で消すが、即座に別のプロセスがたちあがる。
なので、受信ポートとして、11111を解放しない
数字 | 分解 | 意味 | 英字 |
---|---|---|---|
7 | 4 + 2 + 1 | 読書実行 | rwx |
6 | 4 + 2 | 読書 | rw- |
5 | 4 + 1 | 読実行 | r-x |
4 | 4 | 読 | r-- |
3 | 2 + 1 | 書実行 | -wx |
2 | 2 | 書 | -w- |
1 | 1 | 実行 | --x |
0 | 0 | なし | --- |
エラーハンドリングをほぼやらないでSentryに任せるだけでやってきたが問題が出てきたので調査した。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Error
JavaScriptのエラーは5パターンの引数の受け取り方があるようで、便利に見えたのはこの1つ。
Error(message, options)
optionsはobjectでキーcauseを持っています。
エラーのre throwに使われる。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
stack traceを引き継いでくれるようです。便利。
JavaScriptをブログ上で実行したいと思ったので色々調べました。
思いついたのは、MDNのサイト上の埋め込みとVSCodeでした。
MDNのやつはこれ。
https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Page_structures/Code_examples#try_it
VSCodeは調べてみるとMonaco Editorでした。
あと、TypeScriptのPlayGroundもありますね。
https://www.typescriptlang.org/play?#
エディタは実装できそうでしたが、コードの実行はどうするんだろうと思い調べると、普通に文字列を実行していました。
https://github.com/mdn/bob/blob/main/editor/js/editable-js.js#L81
これを組み合わせれば実行できそうですね。
あとはiframeに埋め込まれてました
new Functionを使って文字列を実行すると危ないかもしれない。MDNのように、iframeに閉じておくべきか
iframeに閉じた。
https://github.com/kajirikajiri/monaco-editor
mdnのbobのコードを真似してコード実行環境をブログ上に作成した。
monaco editorを使ったので、補完が効いてmdnよりいい感じになった気がする。
mdnのbobはどうやってconsole.logを出力してるんだ?console.logを上書きでもしてるのか?と思ったら本当に上書きしてた。
あとchatGPTの解説が良すぎる気がする。とてもわかりやすい。
最近for await ofをよく使うが、Promiseを先に共通化しとけばいいやんと思って、共通化したら、1回目のループでPromiseが解決して、2回目以降のPromiseが即解決するというミスをした
/\Ahttps?:\/\/[^.]+\.example\.com\z/
この形式のURLにアクセス。
https://dash.readme.com/project/YOUR_DOMAIN/VERSION/reference
例えば以下のURLになる。
https://dash.readme.com/project/example-project/v1/reference
アクセスすると、API Settingsページが開くので、Your API Definitionsセクションへ移動。ID: xxxxxxという形式で記載されている。
また、API_KEYは https://dash.readme.com/project/YOUR_DOMAIN/VERSION/api-key にある。
いづれかのkeyがあればそれを使うし、なければ作ればよい。
ググっても全くヒットしなかったので、readme.comのドキュメントがもう少し検索にヒットしやすいとうれしい。
プロミスで返信できる
https://github.com/ctimmerm/axios-mock-adapter/issues/232#issuecomment-576822968
mock.onGet('/any').reply(function(config) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve([201, null]);
}, 2000);
});
});
const withDelay = (delay, response) => config => {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(response);
}, delay);
});
});
// And then use it:
mock.onGet('/any').reply(withDelay(2000, [201, null]));
delayResponseを使う
https://github.com/ctimmerm/axios-mock-adapter#example
https://github.com/ctimmerm/axios-mock-adapter/blob/4d68a19e46c08e7b636d575087abf9982a67858b/README.md#example
// All requests using this instance will have a 2 seconds delay:
var mock = new MockAdapter(axiosInstance, { delayResponse: 2000 });
烏山付近に行った後に、リサイクルショップを巡りながら下北沢に行ってきた
メキシコ雑貨屋さんでサンタと雪だるまのフェルトを買えてえい満足
メンテした
https://github.com/kajirikajiri/eslint-plugin-mui-path-imports
1passwordを導入中
求めていたものだと思う
パスワード、秘匿情報、口座とか全部まとめれる。
あと、ブログのアクセス数が30日で400超えてる。mau400?
じわじわと増え続けてる
ここから最新のzipをダウンロードして
https://github.com/NemProject/NanoWallet/releases
readmeにあるとおりに、start.htmlを開いて、あとは以前までと同じようにできる
https://github.com/NemProject/NanoWallet
walletのrepositoryはこれ
https://github.com/NemProject/NanoWallet
公式サイトが移行したっぽい
https://nemproject.github.io/nem-docs/pages/Guides/nanowallet/nanowallet-explorer/docs.en.html
githubがわからないともはやwalletにすらアクセスできないのはびっくり。開発者じゃないとむりやんとおもいました
よく紹介してある、walletをダウンロードするリンク先は以下ですが、存在しないといわれます。
https://nem.io/downloads/
xem公式とかでググると、https://nemproject.github.io/が見つかりますが、いまいち信用できんな。。とおもったけど、リポジトリとか確認したらそれっぽかったので信用した。
メインの口座とクレカ、仕事の通知はONにした
iPhoneはホーム画面から取り除くことできるようになったので、ホーム画面のアプリを全部消した
https://support.apple.com/ja-jp/guide/iphone/iph248b543ca/ios
これでホーム画面には何もなくなった
ホーム画面に通知アイコンが見えると開きたくなってしまうので、それがなくなったのが嬉しい
結論として、時間が勿体無いと感じたため。
プレミアムを契約していたし、1日5回くらい見てたけど、その時間が勿体無いなと思った。
20個くらいは口座とかクレカを連携していた。
口座は1つにして、クレカも1つにして時間がかからないようにした。
無料アカウントの連携数が10から4になったが、それが原因ではない。
https://moneyforward.com/customer_news/vuUE2Nwg8IrcKD6XCp4O2Q
熱海駅にきたよ
これは秘宝館のいりぐち
プリン屋さん
海
issuconで高得点出せるようになれば、いろんなことに対応できそう。
パットしか見てないから、もう少し調査が必要かもしれないけど。
おそらく直近のやつを見た。そのときに記憶に残ったもの
ということはある程度出来上がったシステムがあって、それに改善を加えてパフォーマンスを良くするのかな?
無から有を作るのとはまた違いそう。
場当たり的な対応力だけでも対応できそう。
お題は毎回異なると思う。
パフォーマンスチューニングを求める会社はおそらくある程度成長した会社である。
こんな感じか。どうかなー、楽しそうではあるなー
この人のリンク先が良さそうだった。
https://zenn.dev/tohutohu
大体一致することをHuman Interface Guidelinesから参照してドキュメントに記載できた
利用者はデバイスが変わったとしても同じ並びを期待するはず。なぜなら、、、みたいなところに参照として貼り付けておいた。
自分がデザイナとして権威があれば不要かもしれないが、現在の本職はエンジニアなので、権威があるドキュメントを示せる場合、相手に対して説得力が増すはず。
https://developer.apple.com/design/human-interface-guidelines/foundations/layout
Design a consistent layout that adapts gracefully to context changes, while displaying the same content as much as possible. People expect your experience to work well and remain familiar when they rotate their device, resize a window, add another display, or switch to a different device. Ensure an adaptable interface by respecting system-defined safe areas, margins, and guides and specifying layout modifiers to fine-tune the placement of views in your hierarchy.
明日も行こうかなー
トップページの感じはGoogleのMaterial Designと似ている。
ナビゲーションを理解しておき、いざという時に使えるようにしておく。
9000円で年払い
material design 3のサイトを自動で翻訳して欲しくて拡張機能を入れて課金したが、メインコンテンツが翻訳されなかった。ナビゲーションとフッターだけ翻訳されるかんじ。。。
まあ、他のやつでも使えるのでok
https://obsidian.md/1.0
そのうち使ってみる
https://material.io/
https://m3.material.io/
本でいう目次にあたると思う。ここは大事だと思うのでまずはここから把握。
コスモス咲いてたよ!
噴水があったよ!
金木犀咲いてたよ
踊ってばかりの国のライブに行くよ🏃
なんかモヤかかってるー🥜
前提
Nisaとは積立NisaとNisaのことです。
普通の積立は課税口座で積立したやつです。
検討すべきことを追加します。
積立Nisaは保持した期間が長くなるだけ、利益が増えるはず。であれば、非課税とはいえ、早期に売るということはその後には利益が増えたはず。つまり利益が増えれば非課税額も増えるので、その分損しているような気もする。
まあでも非課税期間が終了した後は結局また株を買うか、特定口座にそのまま移すんだろう。そして寝かせ続けるだろうから、まあ、どれから売っても一緒な気はする。
であれば、その時になるべく現金を多く得られるようにするのがいいかな。例えばNisaじゃないやつは20%くらい税金とられるはずだから、Nisaから取り崩した方が、同じ額ならNisaの方が現金を多くえられるはず。
あと現金とか株の割合が気になる。みんなどんな感じなのかね。
あとこれ強くない?
eMAXIS Slim 米国株式(S&P500)
購入時手数料: なし
信託財産留保額: なし
運用管理費用: かなり低い(マネックス証券のidecoラインナップで見比べると一番低い。 https://www.dcnenkin.jp/search/product.php?mode=show&item=784)
https://emaxis.jp/pdf/web/viewer.html?file=/pdf/koumokuromi/253266/253266_20220723.pdf#page=7
https://emaxis.jp/fund/253266.html
以下2つのリンク先を見る限り、主な費用は上記3つ。それがほとんどかからないということになる。
一般社団法人投資信託協会
https://www.toushin.or.jp/investmenttrust/costtax/index.html
松井証券
https://www.matsui.co.jp/service/fund/study/cost/
これってつまり
ということで相当強い気がする。
例えば、ちょっと試しにやってみて、急に現金が必要になったとしてうるとしても、その期間の下落or上昇+運用管理費用しか取られない。便利だなー
あと、idecoで eMAXIS Slim 米国株式(S&P500) に掛けれるのは、SBI証券 | マネックス証券 | 松井証券だけっぽい。
https://www.am.mufg.jp/service/ideco/sales_slim.html
楽天だと積立Nisaはあるけど、idecoはないとか。そういうことがあるので注意。
売却優先順
どうどうじゃないよ、ほらほらだよ!
途中でオモチャカボチャ
ネロリっていうハーブティー屋さんも行った
あとはメキシコの雑貨屋さんと、MoMAって言う雑貨屋さん
あとはダルトンでフィッシュがついたバターナイフとアナログキッチンタイマー買った
あとはスプラトゥーン3やってた
最近知った。これは便利!
type Animal = {
type: 'cat',
name: string;
} | {
type: 'dog',
age: number;
};
type Cat = Extract<Animal, {type: 'cat'}>
type Dog = Extract<Animal, {type: 'dog'}>
この辺の公式の例とかリテラルの場合のみ記載ありで最初気づかず
https://www.typescriptlang.org/docs/handbook/utility-types.html
vscode.commands.registerCommandの第一引数のコールバックでvscode.window.createWebviewPanelを実行するとこのエラーがなくなった。
vscode.commands.registerCommandの第一引数のコールバックの外でvscode.window.createWebviewPanelを実行し、戻り値を使ったらエラーが発生した。
これであとはPlantUMLで作成したSVGを読み込ませれば、一覧で確認できる。
設定はjsonファイルに持たせたので、gitで管理できるはず。
会社で設計スキルがもう少し欲しいなという気持ちになって、色々本を読んだ結果、RDRAに書いてあることが、今の自分が困っていることまさにそのものだった。このへんが特に気になった。
影響力の大きい人が、雑誌や技術プレゼンに触発されてスタートさせたようなプロジェクトにありがちなケースが「コンセプトの不在」です。システムについてのアイディアがあり、ブレーンストーミングによって有望なアイディアがいくつもでてきます。そのアイディアを検証または分析すべく、役割を決めて作業を始めます。そして、その結果を持ち寄り、またブレーンストーミングします。プロトタイプを作成し、実現可能性や機能の有効性を検証します。一ヶ月がたち、アイディアがそこそこ形になり、この業界流行りの魅力的なセールストークがちりばめられています。でも、リーダーは何故か「これでいいのだろうか」という疑問を感じています。「分かってきたことは沢山あるけれども、そのひとつひとつがどうもうまくつながっていかない。細部をみると面白いことや今までになかったものができ上がってくるように思える...でも結局いまひとつ製品の全体像がつかめていない。これで本当にシステムのイメージが固まるのだろうか……」。
神崎善司. モデルベース要件定義テクニック (Japanese Edition) (Kindle の位置No.413-416). Kindle 版.
アイデアはどんどん広がっていくが、イメージが固まらない。
結局その時は、コンセプトに戻って、最小用件を決めた。
しかし、スムーズに決まったとは言えない。もっと快適に作業できるはずと思っていた。
RDRAは全体を図にして、理解しやすくする感じ。
それぞれの境界を明確にし、アクションを一つ一つ検証していく。
例えば、利用者、外部サービス、内部、ブラウザアプリ。
それぞれに接点がある。利用者はブラウザを操作し、結局は内部のDBにデータを保存したり、外部サービスにアクセスしたりする。
それらを完璧にとは言わないが、全体を洗い出す。
こんな感じのことが書いていた。
これは、最近フロントを書いている時にも意識していたあたり。
結局は利用者がブラウザという境界からしか操作できない。その操作ごとに、データや見た目に変化が起こる。それを洗い出し、テストを書けばいい。そういった経緯もあり、何かしっくりくるところがあったので、PlantUMLや、Miro、FigmaでRDRAを書こうとしたが、Miro、Figmaは管理しづらい。やはりGithubのようなもので管理したい。他にも色々検討はしたが、PlantUMLが良さそうという結論に至った。
ただ、ちょっと、ソフトウェアの限界があったので、補助的なものをVSCodeの拡張機能で作成している。Chrome extensionとReact, Nextjs、それとElectorも検討したが、VSCodeの拡張にした。
必要だと思ったのは一覧性。
SVGを複数読み取り、表示できればよかったのだが、見当たらなかったので作成中。
PlantUMLで作成したSVGをまとめて閲覧するのに使う
RDRAの読み方はラドラです。
RDRA:ラドラと呼びます。
神崎善司. モデルベース要件定義テクニック (Japanese Edition) (Kindle の位置No.259). Kindle 版.
港が見えるよ🐼
日傘と衣以🐼
アメリカとフランスがあったよ🇫🇷🇺🇸
夜は中華食べるよ
Write Better Commits, Build Better Projects
最近、コミットを書いていて思っていたことが全て書かれていた。
ソリューションを全部書き出すと
シナリオを作成し、それに合わせてコミットを再編成する。
それぞれのコミットメントを "スモール "と "アトミック "の両方にする。
コミットメッセージには、何をしているのか、なぜそれを行っているのかを記述してください。
こうなっている。元記事を全部ちゃんと読んでください。以降は感想です。
これらは順番に、適応されている。
最初はwipコミットが含まれ、途中でリファクタし、別の関心ごとにふれているように見える。
これではPull Request(以降でPRとする)を投げられた方はたまったものではない。
だけど、最初から、全てのソリューションを適用したコミットを書くのは個人的にはできない。
コードを読み、wipコミットを加え、途中でリファクタし、別のことが気になってしまう。
おそらく最初はそれでいい。
もちろん、最初から完璧なものが書ければそれでいい。
でも、やってみたけど、それはできなかった。
だから、PRを出す前に綺麗にしよう。
リファクタは最初に済ませよう。
途中で気づいたリファクタでも、きっと最初に切り出せるものがあるはず。
それはもう、別のPRに切り出して、リファクタのPRを出せばいい。
とはいえ、難しいこともある。
リファクタだって、意味があるから。
今の流れだと、リファクタをして、その後に本来追加しようとした機能が入るはず。
その文脈があるから、そのリファクタが成り立つと思う。
そういうところが個人的には難しい。
ちなみに、この文章自体が、ごちゃごちゃで、リファクタが必要な文章だけど、走り書きなので許してください。
もし、別の関心ごとに触れたくなったら、それはそれで別のPRにしよう。
大体は、PRの前にレビューがあるから。
レビュワーの時間を大事にしましょう。
そうやって、一つのPRの関心ごとを一つの事柄にすれば、おそらく1 PRは 1コミットになるんじゃないか?と最近思っている。
また、コミットはリバートできるべき、というのも最近思っていること。
戻したら壊れるコミットを本流のブランチ、mainとかmasterに含めれるのはおかしい。
いざというとき、戻すのに時間がかかってはいけないはずだから。
こういったことをやっていけば、mainブランチを見ると、これまでの歴史が分かりやすく積み重なったブランチが完成すると思っている。
ただ、ここまでくると、githubが最適ではないのでは?とも思う。けど、今は置いておきます。
そういえば最近思ったことがもう一つ。
PRを出す前にrebaseして綺麗にしよう。
レビューとレビューの間にrebaseすると、以前のレビューとの差分がわからなくなるらしいです。
だから、レビュー前に綺麗にしよう。
これですね
施策1は既に受取済みだったので
施策1
マイナンバーカードの新規取得等
最大 5,000円分のポイント
マイナンバーカードを新たに取得し、マイナポイントの申込み後、20,000円までのチャージまたはお買い物をすると、ご利用金額の25%のマイナポイント(上限5,000円分)を受け取ることができます。
マイナポイント第1弾に申し込んでいない方が対象です。
2021年12月末までにマイナポイント第1弾に申し込んだ方で、まだ20,000円のチャージやお買い物を行っていない場合(最大5,000円分までポイント付与を受けていない方)は、上限(5,000円分)までポイントの付与を受けることができます
・マイナポイント申込み期限:2023年2月末
・マイナンバーカードの申込み期限:2022年9月末
施策2と施策3を申し込みました
施策2
6/30スタート!
施策2
マイナンバーカードの健康保険証としての利用申込み
7,500円分のポイント
お持ちのマイナンバーカードを、健康保険証として利用できるよう申込み、マイナポイントの申込みをするとマイナポイントを受け取ることができます。
まだ利用申込みが済んでいない場合、マイナポイントの申込みの際に一緒に申込めます。
6月30日のマイナポイント申込み開始より前に、マイナンバーカードの健康保険としての利用申込みを行っていた方も対象です
・マイナポイント申込み期限:2023年2月末
・マイナンバーカードの申込み期限:2022年9月末
6/30スタート!
施策3
公金受取口座の登録
7,500円分のポイント
ご自身の預貯金口座を国(デジタル庁)に登録し、マイナポイントの申込みをするとマイナポイントを受け取ることができます。
マイナポイントの申込み完了後に、公金受取口座の登録をすることもできます。
・マイナポイント申込み期限:2023年2月末
・マイナンバーカードの申込み期限:2022年9月末
楽天ポイントで受け取り成功しました
通常ポイントでの付与でした
楽天ペイアプリではマイナポイントとして楽天ポイント(通常ポイント)を進呈致します。
楽天ポイントについては楽天ペイアプリをご利用した街でのお買い物のほか、通常の楽天ポイントと同様に様々な用途でお使いいただけます。
マイナポイントは楽天ペイアプリからお申し込みいただけます。
詳しくは以下の特設ホームページをご参照ください。
ポイント運用ができるやつにしようと思い、楽天、ペイペイで迷いましたが、ペイペイは1%手数料で引かれるので、楽天にしました
成功しました
私の横で今チカチカしております
とりあえずはまったところ
ファームウェアのインストール
公式サイトからダウンロードしてインストールした
ドラッグアンドドロップしたらUSBが接続解除された!!
どうやらこれで正常な挙動
動きましたー
最終目標はエアコンの制御です
てかスイッチとかないじゃん
オンオフはパソコンからやりました
温度センサーはついてるらしいけど
そこらへん試してからー
スイッチつけれるならつけたいなーパソコンからオンオフは面倒なのだ
USBから給電だけするから、あとはcronで動いてほしいのだ
赤外線の送受信も欲しい
受信した赤外線情報を保存する容量も欲しい
wifiもつけれるならつけたい、有線でもいいけど
ビビった
今日つかったんだけど、直感的に使えた
以前のautolayoutよりいいです
5/10日にリリースされたようだ
https://www.figma.com/community/file/784448220678228461
https://github.com/kajirikajiri/eslint-plugin-mui-path-imports
muiを使ってて、開発環境のhotreloadを早くしたい人におすすめ
import { Box } from '@mui/material';
↓
import Box from "@mui/material/Box";
muiはこうすると、開発環境で読み込みが早くなるのです。
mui公式が言ってるし、実際読み込むモジュー数が10000くらい減るので間違いない
BEFORE
event - compiled successfully in 287 ms (11756 modules)
wait - compiling...
event - compiled successfully in 384 ms (11756 modules)
wait - compiling...
event - compiled successfully in 301 ms (11756 modules)
wait - compiling...
event - compiled successfully in 298 ms (11756 modules)
AFTER
event - compiled successfully in 69 ms (1867 modules)
wait - compiling...
event - compiled successfully in 72 ms (1867 modules)
wait - compiling...
event - compiled successfully in 64 ms (1867 modules)
wait - compiling...
event - compiled successfully in 84 ms (1867 modules)
私の開発環境でテスト済み。
mui公式: importサイズを小さくする
https://mui.com/material-ui/guides/minimizing-bundle-size/
eslint公式: ruleの作り方
https://eslint.org/docs/developer-guide/
eslint公式: ruleの詳細
https://eslint.org/docs/developer-guide/working-with-rules
mdn公式: named import
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
awsexplorer: eslintのルール作るときに個人的に必須
https://astexplorer.net/
autofixリポジトリ
https://github.com/aladdin-add/eslint-plugin/tree/master
eslint-plugin-importリポジトリ
https://github.com/import-js/eslint-plugin-import/blob/main/src/rules/no-import-module-exports.js
autofixのリポジトリが紹介されてる
https://qiita.com/the_red/items/2725246044a225174d98
eslintのルールの作り方
https://blog.scottlogic.com/2021/09/06/how-to-write-an-es-lint-rule-for-beginners.html
eslintのルール作成
https://flexport.engineering/writing-custom-lint-rules-for-your-picky-developers-67732afa1803
typescriptでeslintのルールを作る
https://blog.sa2taka.com/post/custom-eslint-rule-with-typescript
zenn: named import
https://zenn.dev/captain_blue/articles/javascript-import-braces-memo
面白いコマンドだったよ
merge commitをrebaseしたら差分が消えたので、diffとってpatchしたー
https://beyondjapan.com/blog/2019/08/git-diff/
https://git-scm.com/book/ja/v2/Git-%E3%81%A7%E3%81%AE%E5%88%86%E6%95%A3%E4%BD%9C%E6%A5%AD-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%81%8B%E5%96%B6
react-testing-libraryのメンバーに入っているKent C. DoddsがReactテストライブラリでよくある間違いの記事を書いてるのを見つけたので読む。
今日は西馬込に内見🐼
メゾネットというタイプですた📦
部屋の中に階段があればメゾネットなんじゃないですかね?
コンクリート打ちっぱなし、デザイナーズマンションっていうんですかね?
かっこよかった、ウッドデッキもよいかんじ🪵
適当に作ってみた
https://calculate.app.kajiri.dev/
今日はエラーメッセージを追加した
実装してて困ってたんですよねー
letで定義して、forEachで副反応を実装しました。
そしたら、初期値で代入したやつしか出てこない
以下を読むとそういうことになったらしい。トレードオフ。
https://stackoverflow.com/questions/67084305/variable-set-in-foreach-loop-getting-wrong-type
This is one of the trade-offs of the control flow analysis.
By annotating the type string | null you tell the compiler the variable, obviously, expects a value of either type. You then make an assignment to null, which lets the compiler narrow the type to null.
You expect that TypeScript accounts for the assignment inside the callback and forgoes the narrowing, but it does not. This is a trade-off the team made when deciding whether mutations happening in functions passed as parameters to higher-order functions should leak to the outer scope.
See this source repo discussion on the matter.
ちょっと参照先のgithub issueがcomment多すぎて全部読めないが。
どうやら、callbackが確実に呼ばれるかどうかわからないから初期値のままにすることにしたっぽいが?
foreachで言えば配列の要素数が0の可能性があるし。まあ、しょうがないのか。
試してみたけど、どうやら、初期値を代入せずにtypeguardで型を確定させてやれば使えそう
これがいいかなー
っていう気持ちになった
既存のやつがあるんじゃ?と思って探したが、問題を発見した。
よく考えてみたら、特定のobjectの形式で特定のkeyだけを探したいとか要件が色々あるので、既存のやつだと厳しいと思われる。
独自実装するか
そういうことだったのねー
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
axiosの絡みとかも見といた
少々忘れてる箇所とかあったが問題ない。テスト書きまくってるからね
アニメ一気に全部見ました!
勝手な思い込みで、雛人形の擬人化アニメだと思い込んでましたが違いましたよ
そのビスクドールはこいをする
えいといくよ🐼
物件みてくるよ🏠
やっと日傘をさせて嬉しいえい⛱
ランチ調査えい🐼
テラス席にすぐにひかれるえい☀️
お昼はサンドイッチになりました🥪
コンクリートにわんこ🐶
晩御飯は空野豆腐🫘
半年前にえいときたお店🐼
名物の空野豆腐🫘
豆乳ブルーベリーと豆乳抹茶🫐🍵
たまご🥚
今度は猛毒豆腐🫘食べてみたいな
以前の記事で書いたやつを参考にgithub actionsで定期的に結果を出力したい
おすすめのcommit messageとか欲しい。
できれば、関数の内部に定義した関数の数とかも知りたい。
OSS
ゲーム
webgl
unity
https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype
4.8くらいで出るかな。
結構いろいろなプラットフォーム向けに出力できるなー
https://docs.unity3d.com/ja/2018.4/Manual/Standalone.html
JavaScriptです。関数b, dが実行前に評価されてしまった。
本当は実行時に評価したかった。
失敗
({
a: b()
c: d()
})[t]
成功
({
a: b
c: d
})[t]()
最近発売された、良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方 単行本(ソフトカバー) – 2022/4/30が、いい感じだと思ったが、TypeScriptのclassが個人的に好きじゃないので、classが存在しない言語ではどうしてるんだろうって気になった。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12239608832
https://chris-wood.github.io/2016/02/12/Polymorphism-in-C.html
TITLE: David Bryant. Sustainable Web Development with Ruby on Rails: Practical Tips for Building Web Applications that Last . David Bryant Copeland. Kindle 版.
To make better technical decisions, you need access to more information than simply what someone wants the software to do. Do you know what economic or behavioral output the software exists to produce? In other words, how does the software make money for the people paying you to write it? What improvements to the business is it expected to make? What is the medium or long-term plan for the business? Does it need to grow significantly? Will there need to be increased traffic? Will there be an influx of engineers? Will they be very senior, very junior, or a mix? When will they be hired and when will they start?
より良い技術的な決定を下すためには、誰かがソフトウェアに何をさせたいかということよりも、もっと多くの情報にアクセスする必要があるのです。そのソフトウェアがどのような経済的、行動的成果を生み出すために存在するのか知っていますか?言い換えれば、そのソフトを書くためにお金を払っている人たちにとって、そのソフトはどのようにお金を生み出すのでしょうか?そのソフトウェアはビジネスにどんな改善をもたらすと期待されていますか?そのビジネスの中長期的な計画は何でしょうか?大きく成長する必要があるのでしょうか?トラフィックを増やす必要がありますか?エンジニアの流入はあるのか?そのエンジニアは、上級なのか、下級なのか、あるいは混合なのか?彼らはいつ採用され、いつ入社するのか?
The average tenure of a software engineer at any given company is pretty low, so I’m assuming that the software will outlive the team, and that the group of people charged with the software’s maintenance and enhancement will change over time. I’m also assuming the experience levels and skill-sets will change over time as well.
ソフトウェア・エンジニアの平均勤続年数はかなり低いので、ソフトウェアはそのチームよりも長持ちし、ソフトウェアの保守や改良を担当する人々のグループも時間とともに変化していくと想定しています。また、経験値やスキルセットも時間とともに変化していくものと考えています。
git config --global commit.cleanup whitespace
or
[commit]
cleanup = whitespace
1はこんな感じ
find . -type f -mindepth 10 | grep ".js" | grep -v "node_modules"
2はこれでいいでしょう
find . -type f -size +100k | grep ".js" | grep -v "node_modules"
facebook/react
1: max 14
2: 観察中
git-scmをDeepL翻訳
別の言い方をすれば、あるコミットを最初のコミットの履歴をたどれば到達できるコミットとマージしようとするとき、Git はポインタを先に進めることで物事を単純化します。なぜなら、一緒にマージすべき分岐作業が存在しないからです。
backlog
このbugfixブランチをmasterブランチにマージする時、masterブランチの状態が以前から変更されていなければ、非常に簡単にマージを行うことができます。 bugfixブランチの履歴はmasterブランチの履歴をすべて含んでいるため、masterブランチは単純に移動するだけでbugfixブランチの内容を取り込むことができます。なお、このようなマージをfast-forward(早送り)マージと呼びます 。
qiita
ブランチXと、そこから切ったブランチYがあるとする。
YがXでの変更をすべて含むときに行われるマージをfast-forward(早送り)マージという。
つまり、分岐後に、元ブランチXにおいて変更がないときに行われるマージのこと
git-scmをDeepL翻訳
現在のブランチヘッドは、指定したコミットの先祖であることがよくあります。これは、特に git pull から実行した場合によくあるケースです。上流のリポジトリを追跡していて、ローカルでは何も変更しておらず、より新しい上流リビジョンに更新したい場合です。この場合、結合した履歴を保存するための新しいコミットは必要ありません。代わりに、余計なマージコミットを作成せずに HEAD (とインデックス) を更新し、指定したコミットを指すようにします。
この動作は --no-ff オプションで抑制することができます。
github
your enterprise上のプルリクエストでSquash and merge(squashとマージ)オプションを選択すると、そのプルリクエストのコミットは1つのコミットにsquashされます。 トピックブランチからコントリビュータの個々のコミットをすべて見る代わりに、コミットは1つのコミットにまとめられ、デフォルトブランチにマージされます。 squashされたコミットを持つプルリクエストは、fast-forwardオプションを使ってマージされます。
stackoverflowをDeepL翻訳
あるコミットと、最初のコミットの履歴をたどれば到達できるコミットをマージしようとしたとき、Git は一緒にマージする分岐作業がないため、ポインタを先に進めることで物事を単純化します。これを "早送り" といいます。
詳しくは : http://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging
別の言い方をすると
master が分岐していない場合、git は新しいコミットを作成する代わりに master に feature ブランチの最新コミットを指すようにします。これは "早送り" です。
マージの早送りでは、「マージコミット」は発生しません。
早送りという意味
英辞郎
〔テープ・録画映像などを〕早送りする
mergeのとき、他に取り込む変更がなければ、ポインタを移すだけと理解した。
たまに、ffとかfast-forwardとか聞くけど、そこまで気になってなかった
今日は暇だったので調べてみた。
Note
This is a note
Warning
This is a warning
Note
This is a note
Warning
This is a warning
react-testing-libraryなどを用いた、JS-DOMのテストだと思っています。
既存のinteration-testが失敗した場合、その時のDOMが表示されるはず。以下のような。
<div>
<span>hello</span>
</div>
jest-previewを導入すると、失敗した瞬間にその時の画面の状態がブラウザに表示されます。
DOMを確認するより、画面を確認する方が直感的にどこが失敗したのか分かりやすいので、とても助かる。
最近はよく、えいとコナンくんの映画をみてるよ👓🎬
20個くらい見たきがするなー
今日はストリートの亡霊だよ👻
axiosをfetcherにしてuseSWRを使っていた。
統合テストを書こうと思い、axios-mock-adapterでmockした。
しかし、戻り値がmockされない。
useSWR公式のMiddlewareの説明やzennの記事をみて、Middlewareにしたら戻り値をmockできた。
jest-previewで確認しても、処理の直前、直後でlogを出力しても解決できなかったのでなかなかてこづった。
症状の詳細として、1つのテストだと成功するが、2つ以上のテストだと失敗した。
stackoverflowに沿って修正してみても効果なしだった。
例えば、名前を取得する関数があるとする。
犬ならpochi、猫ならtamaだ。
ifで書いて、もう片方をelseにするか。
これは個人的に好きでない。animalが増えると、elseに入ってしまう。
playground
const getName = (animal: 'cat' | "dog") => {
if (animal === 'cat') {
return 'tama'
} else {
return 'pochi'
}
}
ifで早期リターンするか。
これも同様にanimalが増えると、elseに入ってしまう。
playground
const getName = (animal: 'cat' | "dog") => {
if (animal === 'cat') return 'tama'
return 'pochi'
}
elseにして、throwするか。
これはまあまあ好き。場合によるけど、throwしなくてもいいケースはあるのでそこらへん微妙。
playground
const getName = (animal: 'cat' | "dog") => {
if (animal === 'cat') return 'tama'
if (animal === 'dog') return 'pochi'
throw Error()
}
最近のTypeScriptは賢いので、switchにするとdefaultを書かなくてもundefinedを返さないので、その時のコードは美しい。
が、animalが増えた時にundefinedが戻り値に含まれてしまうのはいただけない。
playground
const getName = (animal: 'cat' | "dog") => {
switch (animal) {
case 'cat': return 'tama'
case 'dog': return 'pochi'
}
}
これがいいのではと最近思っている。
animalが増えると、TypeScriptが型エラーを吐いてくれるのでとてもわかりやすい。好き。
playground
const getName = (animal: 'cat' | "dog") => {
return {cat: 'tama', dog: 'pochi'}[animal]
}
ワイフがお呼びです
最近はSolanaに興味がある。
Devnetへのデプロイは成功した。
Solanaはstepnで使われてるのが最近は盛り上がってるようだ。
個人的に気になったのは、うる覚えだが、rentが、デプロイ時に確定。2年分を定額で収める。以降のrentは不要というもの。
後々、定額ではなくなるっぽい記述があったし、まだbetaなので動的になるだろうと思ってる。
というのも、見た感じ初回以降のデプロイではrentが不要である場合、初回のprogramを超軽量でデプロイして、以降のデプロイで容量を増やされると困るだろうと感じたから。
ただ、容量の上限は10mbだったと思うので、そこまで問題ないのかな?
えいと行くよ🐼
すき家でご飯食べたよ🍚
京葉線に乗ったよ🚃
とても暑いよ🫠
yo-yoチェケyoー by えい🐼
バズライトイヤーはかじ7000点だった、えい10万点だった、えいすごい🐼
スティッチはaiだった機械学習すごい🤖
スターウォーズは怖かった、ジェットコースターではないけどな🤠
スモークチキンレッグうま🍗
ピザうま🍕
イッツアスモールワールド平和🕊
フィルハーマジックは水がかかったよ💦
広場をキャラクターが走ってくよパレード🏳️🌈
ティポトルタうま🤤
キノピオ平和🕊
ピーターパンは浮いてた🧚♀️
ホーンテッドマンションは暗いよ、クルクルまわるよ💫
白雪姫は平和🕊
クルーズは平和です、船長がハイテンション⚓️
最後にエレクトリカルパレード🧚♀️
吉野家でネギ塩豚丼食べて終わりー
いい天気だった☀️
「楽天モバイル」から「povo2.0」へのりかえた。
楽天モバイルから新料金プランへ自動移行すると発表がありました。
私のメイン回線はIIJmioの4gb。
IIJmioの容量がなくなった時に予備として楽天モバイルを使用していました。
予備ということもあり、直近の楽天モバイルの利用履歴はほぼ0だった。
新しい楽天モバイルよりpovo2.0 の方が必要な時だけトッピング方式なので、自分の用途にあっていると判断し、移行した。
また、ラッキーなことに、povo2.0 からキャンペーンが来た。
一日データ無制限にできるクーポン10回分。
以下メール内容
■コードの入力期限
2022/08/31
■コードの利用回数
10回
※本コードは上記の回数繰り返し入力できます。
※利用した回数を確認することはできません。別途メモをとるなどしてお忘れなきように願います。
5/31まで新規加入で貰えるよう。
画像に電話番号乗ってるけど、もう使ってないやつ!
クーポンは早速、ディズニーランドで使わせていただきました♪
石神井公園あたりに行きます
2つの物件を見てきます
ふふーん!
ふぐ屋さんにいたふぐ🐡
ふぐ
Github actionsのcronで1日1回webhookをcurlでpostする。
webhookはCloudflareのDeploy Hook。
CloudflareでNext.js のSSGビルドが実行され、静的ファイルホスティングする。
https://github.com/kajirikajiri/jamstack-tech-blog/discussions/categories/scrawl
curl -H "Authorization: bearer TOKEN" -X POST -d " \
{ \
\"query\": \"query { viewer { login }}\" \
} \ " https://api.github.com/graphql
curl -H "Content-Type: application/json" \
-H "Authorization: bearer TOKEN" \
-X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {description}}"}' https://api.github.com/graphql
curl -H "Content-Type: application/json" \
-H "Authorization: bearer TOKEN" \
-X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 10) {nodes {id} edges { node {id} }}}}"}' https://api.github.com/graphql
curl -H "Content-Type: application/json" \
-H "Authorization: bearer TOKEN" \
-X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 10) { totalCount }}}"}' https://api.github.com/graphql
curl -H "Content-Type: application/json" \
-H "Authorization: bearer TOKEN" \
-X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 10) {nodes {title}}}}"}' https://api.github.com/graphql
curl -H "Content-Type: application/json" \
-H "Authorization: bearer TOKEN" \
-X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 10) {nodes {title body bodyText}}}}"}' https://api.github.com/graphql
curl -H "Content-Type: application/json" \
-H "Authorization: bearer TOKEN" \
-X POST -d '{"query": "query {rateLimit { limit cost remaining resetAt } repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussions(first: 100, after: \"CURSOR\", categoryId: \"CATEGORY_ID\", orderBy: {field: CREATED_AT, direction: DESC}) {edges {cursor node {id title body}}}}}"}' https://api.github.com/graphql
curl -H "Content-Type: application/json" \
-H "Authorization: bearer TOKEN" \
-X POST -d '{"query": "query {repository(owner: \"kajirikajiri\", name: \"jamstack-tech-blog\") {discussionCategories(first: 10) { nodes{id name} }}}"}' https://api.github.com/graphql
Github
https://docs.github.com/ja/graphql/overview/resource-limitations
https://docs.github.com/ja/graphql/reference/objects
https://docs.github.com/ja/graphql/reference/objects#discussion
https://docs.github.com/ja/graphql/guides/migrating-from-rest-to-graphql
https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions
https://docs.github.com/ja/graphql/guides/forming-calls-with-graphql#example-query
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token
Cloudflare
https://developers.cloudflare.com/pages/platform/deploy-hooks
GraphQL Variables
https://dgraph.io/docs/graphql/api/variables/
GraphQL APIをfetchメソッドで叩く方法
https://zenn.dev/mayo_dev/articles/fetch-graphql-api
curlでGraphQLの長いqueryを投げる
https://qiita.com/ikemura23/items/ff5af3775006c3f7fb0c
giscus
https://giscus.app/ja
stackoverflow
https://stackoverflow.com/questions/52601436/graphql-how-to-handle-prev-page-next-page-last-page-and-first-page-properly
https://stackoverflow.com/questions/42021113/how-to-use-curl-to-access-the-github-graphql-api
Next.js で Markdown ブログを作る
https://blog.chick-p.work/next-js-blog/
Reactでマークダウンエディタ作成とマークダウンからHTMLに変換(ハイライト付き)
https://qiita.com/t_okkan/items/0a3318f90ee6c4468f82
marked.jsを利用してMarkdownをHTMLに変換
https://www.wakuwakubank.com/posts/699-javascript-markedjs/
followed by some text
followed by some text
followed by some text
followed by some text
followed by some text
followed by some text
Auto-detected link: http://www.france.com
Some Ignored_multiple_underscore_italics here
A line of normal text with inline code
and italics, strong font, and even some μ†ℱ ╋ℯ╳╋. Followed by lots of Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id sem purus, eu commodo tortor. Donec malesuada ultricies dolor a eleifend. In hac habitasse platea dictumst. Vivamus a faucibus ligula. Nullam molestie tristique arcu, eu elementum metus ultricies sed. Aenean luctus congue lectus, vitae semper erat rhoncus non. Nulla facilisi.
Followed by another line of normal text with inline code
and italics, strong font, and even some μ†ℱ ╋ℯ╳╋. Followed by lots of Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id sem purus, eu commodo tortor. Donec malesuada ultricies dolor a eleifend. In hac habitasse platea dictumst. Vivamus a faucibus ligula. Nullam molestie tristique arcu, eu elementum metus ultricies sed. Aenean luctus congue lectus, vitae semper erat rhoncus non. Nulla facilisi.
Thin horizontal rule:
--
Thick horizontal rule:
Table Header 1 | Table Header 2 |
---|---|
Content | http://example.org |
Content | http://localhost:\<port> |
Text right below table. Follows is a table with an empty cell, and unaligned indenting. |
Table Header 1 | Table Header 2 |
---|---|
Content | Cntent |
Content |
Empty line between table and this text
def this_is
puts "some #{4-space-indent} code"
end
def this_is
puts "some #{code tag} code"
end
def this_is puts "some #{pre tag} code" end
def this_is
puts "some #{fenced} code"
end
class Classy
def this_is
puts "some #{colored} ruby code with ruby syntax highlighting"
@someobj.do_it(1, 2)
end
end
var test = function this_is(){
console.log("some" + colored + "javascript code with javascript syntax highlighting really long");
}
(defproject myproject "0.5.0-SNAPSHOT"
:description "Some clojure code with syntax highlighting."
:dependencies [[org.clojure/clojure "1.5.1"]]
:plugins [[lein-tar "3.2.0"]])
var test = function this_is(){
console.log("language declared as 'js' instead");
}
var test = function this_is(){
console.log("language declared as bogus_language");
}
here is blockquote
Test from https://github.com/suan/github-flavored-markdown-test