react-guiが話題になってた。なんか軽量でよく使われるhooksとコンポーネントまとめみたいな感じ。
The library integrates directly with the native DOM event system (i.e., it does not use React DOM’s synthetic event system); this provides excellent flexibility and performance, as well as broad compatibility with alternative renderers.
SyntheticEventではなくてネイティブなDOMEventを使うらしい。ていうかSyntheticEventってこんなにあったんだ。
合成イベント (SyntheticEvent) - React
このリファレンスガイドでは、React のイベントシステムの一部を構成する SyntheticEvent(合成イベント)ラッパについて説明します。詳細については、 イベント処理 ガイドを参照してください。 イベントハンドラには、 SyntheticEvent のインスタンスが渡されます。これはブラウザのネイティブイベントに対するクロスブラウザ版のラッパです。 stopPropagation() と preventDefault() を含む、ブラウザのネイティブイベントと同じインターフェイスを持ちつつ、ブラウザ間で同じ挙動をするようになっています。 何らかの理由で実際のブラウザイベントが必要な場合は、単に nativeEvent 属性を使用するだけで取得できます。合成イベントはブラウザのネイティブイベントとは別物であり、直接の対応があるわけでもありません。例えば onMouseLeave イベントの場合、 event.nativeEvent は mouseout イベントになっています。個々の対応については公開 API の範疇ではなく、常に変わる可能性があります。すべての SyntheticEvent オブジェクトは以下の属性を持っています。 補足 v17 以降、 SyntheticEvent は プーリングされなくなったため、 e.persist() は何も行わなくなります。 補足 v0.14 以降、イベントハンドラから false を返してもイベントの伝播は止まりません。代わりに、 e.stopPropagation() または e.preventDefault() を手動で呼び出す必要があります。 React は異なるブラウザ間でも一貫したプロパティを持つようにイベントを正規化します。 以下のイベントハンドラはイベント伝搬のバブリングフェーズで呼び出されます。キャプチャフェーズのイベントハンドラを登録するには、イベント名に Capture を追加します。たとえば、キャプチャフェーズでクリックイベントを処理するには onClick の代わりに onClickCapture
合成イベント (SyntheticEvent) - React
ReactのEventの仕組みはEvent delegationで実現されているらしいから、それをやめてネイティブなDOMEvent使うことでパフォーマンス向上するってことかしら。まぁ実際のコード見てみないとわからないんですが。
ReactがネイティブなDOMEventを使ってないの理由は↓。仮想DOMはそういうものなのかもしれん。preactはネイティブらしいけど。
 

ここ3ヶ月ほど、あすけんってアプリを使ってカロリーを気にしながら食事を摂っていたが、自分に合わなかったらしくてそれほど成果もでず、いちいち記録しないといけないめんどくささでストレスが溜まったのでやめた。体動かしたほうが自分としてはいいのかもしれない。本当はどっちもやったほうがいいのだろうけど。
食品まつりをよく聴いている。
あとDNA。Apple MusicにCBGBでのライブ盤があった。なつかしくてDNA on DNAも買ってしまった。シンプルでミニマムでかっこいいですね。

インゲボルク・バッハマンの「三十歳」という短編小説集を読んだ。オーストリアの作家らしいが自分はとくにオーストリア文学に興味があったわけではない。今年三十歳になり、三十歳っぽい本ないかなーと思って読んだ。アマゾンへのリンクを貼っていますが、実際は大田区馬込図書館で借りました。
もともとバッハマンは詩人だったらしく、ストーリを表現するというよりも風景を描写するだけみたいな文章が多い。そこまで詩に詳しくないのでこれが詩人だったためなのかはわからない。一人称、二人称、三人称が混在する作品や、登場人物の説明がまったくない作品があったりで、なんのことやらわからないまま読み終えてしまう人もいそう。
正直、表題作の「三十歳」は退屈だったけど、「すべて」、「人殺しと狂人たちのなかで」、「ゴモラへの一歩」はとても面白かった。とくに「すべて」は父親となった人やこれからなるであろう人は読んでみるといいかもしれない。
バッハマンに興味をもったので他の作品も読んでみようと思う。ちなみに一番有名なのはラブレターらしい。

昨日のエラーについて根本的な原因はわからんけども直接の原因と回避策はわかった。別のissueとQiita記事がヒントになった。
ページ遷移の際、page.waitForSelectorを使い、次のページにしかない要素の出現を待って遷移が完了したかどうかを確認しているのだけど、このときに Protocol error (Runtime.callFunctionOn): Target closed.が発生しているようにみえた。
要は↓のような感じのコード。page.gotoだけじゃなくてclickで画面遷移する場合も同様に発生する。
await page.goto("https://......"); await page.waitForSelector("#kokonisikanaiID"); //ここでエラー
エラーになっていたコード
↓のようにすると Protocol error (Runtime.callFunctionOn): Target closed. は発生しなくなる。なぜこれでエラーがでなくなるのかはさっぱりだが、Promise.allで解消するところをみるとおそらく実行順序が原因なのだと思う。この辺のテストを見ても参考になりそう
await Promise.all( page.goto("https://......"), page.waitForSelector("#kokonisikanaiID") );
対策を施したコード
検証はここ終わりです。なぜなら今朝になって元のコードでもテストが落ちなくなったからです。レスポンスの遅延か?また発生したらまとめます。
 

そういえばNotion APIが公開されていた。このブログではNotion内のコンテンツを取得するのにsplitbee社が作った非公式なAPIを使っている。まぁもともとNotionのAPIをこっそり叩く方法はみんな知っていたし、notion-blogとかもそういう類だったと思う。
さらに言えばsplitbeeは上述のAPIと組み合わせてreact-notionという簡単にNotionっぽく作れちゃうreact componentを提供しているので、公式のAPIを使うには自前でデザインとか色々凝ってやったるでっていうモチベーションが必要になってくるのだった。
 
話を変えます。
最近はすこぶる仕事が捗っている。どんどんとタスクを消化している。緊急な仕事をやりつつ重要な仕事も進めている。優秀ですね。理由はわかっていてあんまりおおっぴらに書けないですが、まぁとにかくめちゃくちゃ気持ちよく仕事ができています。お仕事楽しい。
そしてここ2、3日、屁がすごいでる。なんかの病気か?本当に尋常じゃなくてずっとブーブーやってます。リモートワークで本当によかった。

Rustの本読んでるけどトレイトの導出がさっぱり理解できないです。
 

最近は電子音楽をよく聴いている。よかったやつを載せておきます。多いけどこれでも絞った感じです。Bandcampサイコー。

今日で三十歳になりました。とくに感慨はないです。
二十五歳を超えてから時間の経つスピードが増しているように思ったけど、二度の転職、結婚、引越しをやっているのでそのせいかもしれない。
三十歳になる直前に電動シェーバーが壊れたので今髭が伸びまくっている。妻に縄文人みたいだねって言われた。

警察は別に好きじゃないんだけど刑事ドラマは結構好き。最近は警視庁捜査一課長やってると観てしまう。熱心なファンではないので食卓についたときにやってたら観るみたいな感じ。たいてい犯人の登場シーンは見逃しているから、クライマックスで犯人がでてきても誰かわからない。だから驚きも爽快感もない。じゃあなんで観ているかというと泥臭い人海戦術でしらみつぶしに手掛かりを捜すシーンが好きだから。様式美があり、あのシーンが出てくるとああもう終わりだなと思う。あと内藤剛志が帰宅して妻とのやりとりの最中(もしくは猫の様子から)、ハッとなにか思いつくのも好き。

アップダウン奏法についての動画みている。こういうのちゃんと意識したことなかった。意識しろよ。近所にスタジオ見つけたので練習します。
ユリイカがレイハラカミ特集をやってたので買って読んでいる。
特集と関係ない「新しい動物文学の誕生」っていう記事が面白かった。大江健三郎の「飼育」、「人間の羊」を引用して、人間を動物のように表現する技法が生み出す効果について紹介している。物語を食べるっていうシリーズで赤坂憲雄って人がやってるらしい。

コンビニを利用しまくっている。夕ご飯以外はコンビニで買ったものを飲み食いしていてほぼコンビニ人間になっている。マネーフォワードを見ると一日2~3回ほど利用していて一度で300~800円くらい使っていた。節約しよう。
とりあえず6月はコンビニの利用回数を減らします。タバコをやめたので抵抗がすくない。一週間くらい続けてみてどれくらい節約できたかチェックしてみます。
  • アイスコーヒやアイスティー、麦茶は作り置きしておく。
  • 朝昼晩はできるだけ作る。朝は喫茶店のモーニングでもよい。
話を変えます。
先日、ファミコン探偵倶楽部 消えた後継者 クリアしました。久々にゲームを頭からケツまでやった。すげー長く感じた。
後半。登場人物が手紙を書くシーンがあるんですが、その手紙を読み上げるセリフに合わせて手紙を書く手が動いたり止まったりしてめっちゃ凝ってんなと感動しました。まぁゲームめっちゃやってる人からしたら当たり前かもしれないですが。あとシナリオも面白い。

Rustの本を読んでいる。トレイトって馴染みないなぁ。
以下は雑なメモ。
RustはGCを持たない。所有権、借用、ライフタイムとプログロミング言語でメモリ管理を行う。
スコープを出た途端に破棄することを言語レベルでサポートしていることです。
ゼロコスト抽象化を追求、抽象化の機能を追加のコストなく使用できる(静的ディスパッチ)。
関連関数は型から関数を呼ぶ形式で定義される関数のこと。

React Hook APIの不満について述べた記事。依存関係が変更されたかどうかを参照でしか比較しないのが不満らしい。個人的には基本型以外をhook内で扱わないようにしています。特定の関心事に集中できていればローカル変数がCustom Hook内で登場してもあまり気にならない...と思うけど、続きの記事を読んでいくにつれて何を問題としているのかよくわからなくなってきた。
続きの記事
正直、現状のReact Hook APIにはかなり満足していて記事で述べられている問題点に関してはあまり意識できない。ただこれは自分がプログラミングパラダイムへの理解が浅いことにあるかもしれない。のでその辺勉強しようと思います。

最近読んだ本。マインドフルネス系の書籍はいままで忌避していたんですが、そろそろ三十路になるし食わず嫌い減らしたいなと思って手を出した。Kindle Unlimitedだったし......。
ブッダの言葉みたいなくだりはへぇ〜だったけど、かるい瞑想のやり方みたいなのも書いてありそれがとてもよかった。本書は欲望は人間の業からくる妄想と定義していて行動する前に心を整理しましょうねぇ、最近はコンプレックスや競争心、承認欲求が刺激される機会が多いですけど全部それあなたの妄想ですよねぇみたいな感じです。
社会人になりたてくらいの頃、誕生日に母親からアドラー心理学の本を5、6冊送られたことがあって当時はまぁげんなりしつつ読んでたんですが、アドラー心理学は我慢せずに辛い現状から逃げようぜ!みたいな感じなので、マインドフルネス系の書籍はなんか本当に読む人の現状によって評価変わるなと思いました。
次は意識高めの自己啓発系ビジネス書でも読むか、世界のエリートはなんちゃら〜みたいな本。
 

Blender全然やらんからとりあえずやってみたいチュートリアルをピックアップして年内にやるみたいな感じにするか。やる気がないな本当に。

ducks module patternのいいところはめちゃくちゃ単純でわかりやすいっていうのにある。弊社のアプリケーションでも採用していてまぁうまくいっている。redux-toolkitのcreateSlice関数同様、ポータブルに扱えるのは機能を優先できるので重宝されるのだと思う。
気になるところをあげるとするならば、あまりにもわかりやすくて簡単なので本来propsで渡せばいいのにわざわざstoreを経由していたり、ReactのContext APIで解決できるシーンでstoreをつかって結果としてContext APIを使うためのノウハウなんかが身につかないとかです。前者はレビューで指摘すればいいし、後者はContext API使うのを諦めたらいい。
Context APIは使用するコンポーネント(Consumer)を明示的に制限できるのが利点。これreduxのstoreに置くのは大袈裟だよな〜っていうstateを管理するのに使えるんですが、結構考慮することが多くて、弊社のアーキテクト的な人もあんまり理解できていないと思う。
余談ですが、Context API vs Reduxみたいな記事でContext APIは簡単!ProviderとuseContextわかれば使える!ってたまに見かけるんですが、前述のとおりContext APIをreduxのように使うのはいろいろと考慮が必要なのであれは嘘です。