20250523 TSKaigi 2025 Day 1

n円払って有給取って行ってきました。

SignalとObservable―新たなデータモデルを解きほぐす

https://x.com/laco2net

https://docs.google.com/presentation/d/1c7fYqn7-v3hnbKtmwXHbvwuCs6cNq_ThLKVDZ7rvbA0/preview?slide=id.g260298bad6d_0_77

UI開発における状態管理の話に始まり、歴代の状態管理ライブラリを概観しつつ「結局やりたいのって状態+派生状態+イベントドリブンな副作用なんだよね」と整理する(mobxが言及されて嬉しい)。さらにそれを「値の生産」というレベルにまで抽象化し、見慣れた同期/非同期・単一/複数という軸に新たにpull/pushという軸を加えることで、Signalの話とObservableの話はFunctionやIterator、Promiseから全部つながっていたんだと最後に納得させられる大回転。

すごいことをすごいスピードで流し込まれたのでわかったようなつもりで大してわかってないんだけど、すごいので忘れない。きっと必要なときに思い出せると思う。すごすぎてこんな顔になった。

Language Serverと喋ろう

https://x.com/pizzacat83b

https://speakerdeck.com/pizzacat83/language-server-todie-rou-tskaigi-2025

Language Serverとは何か、意義、使い方、応用、AIなど幅広く理解できた。なぜLanguage Serverを使うのかという点も発表者のバックグラウンドから納得のいく説明がなされて、TSだけ書いていてはわかりにくい一段階高い視点が得られて有意義だった。

AI Coding Agent Enablement in TypeScript

https://x.com/yukukotani

https://speakerdeck.com/yukukotani/ai-coding-agents-enablement-in-typescript

AIコーディングエージェントを速く正確に動かすため、我々は何をすればよいのか。意味があることとないことが最新の研究成果の引用とともに紹介され、基本的な結論はそりゃそうだよねという感じでありつつも、そこに至る筋道が明確で非常に参考になった。「入力方法はどうでもいい(中略)大事なのは入力に値する情報の整備」は名言。開発を効率化するという包括的な視点の中でツールチェインに対しても考察されており良い。

fast-checkとneverthrowのPBT+Result型で堅牢なビジネスロジックを実現する

https://2025.tskaigi.org/talks/kueda

TSにはthrow型が無いのが辛い、という積年の問題について、現状を分析した上でneverthrowのようなライブラリをどのような形で、どこになら導入できるのかというのが経験に基づいて丁寧に考察されており、同じ問題に苦労している人間として地に足がついた報告が参考になった。さらにPBTという独特な手法についても知ることができた。

Rust製JavaScript/TypeScript Linterにおけるプラグイン実装の裏側

https://x.com/unvalley_

https://speakerdeck.com/unvalley/typescript-linters

Rust製LinterはESLintをパフォーマンスで上回るものの、ESLintが支持される理由であるプラグインシステムの再現にはRustがRustであるがゆえの困難がある。針の穴を通すような技術的な挑戦が僕らが日常的に使うツールチェーンを支えていることが実感される感動的な発表だった。yukukotani氏の発表でLinterの速度の重要性を再認識したところでこの発表が出るというのもアツかった。

その他

そこそこ知り合いがいたのと、スポンサーブースが普通に盛り上がっていて楽しい。エンジニアは問題を解きたがりなのでわかるかな?的な挑戦問題の掲示が多かった。お弁当おいしい。30分単位の発表は長くはないけど連打されるとそこそこ疲れる。集中してるし。自分的安牌みたいな発表を聞きがちだけど裏でトンデモアイデアみたいな発表もあったりして分身したい。数年前なら全然わかんねえよって話題ばっかりだったと思うけど、今はどの話題もそこそこ意義やポイントが理解できるので成長したなという実感がある。楽しいね。

20250521 肉に謎の硬いものが入ってた

項目 内容 得点 換算点
睡眠時間 7時間34分 100 13.0/13.0
起床 8:27 78 6.2/8.0
散歩 実施・ゴミ拾いなし 100 5.0/5.0
朝食の栄養カバレッジ 3色カバー 100 5.0/5.0
体操 ノー 0 0.0/5.0
労働 passion: 75点, discipline: 75点 75 18.0/24.0
ジム 休養日 100 12.0/12.0
勉強会 参加 100 12.0/12.0
個人開発 ノー 0 0.0/7.0
あすけん - 61 5.5/9.0
総合 1日の総合評価 - 77

よく眠れた。が、8時前後に散歩したいので起床時間をもっと前にしたい。ということで入眠を早める努力をしてみる。睡眠力で、世界を制覇する。

昼食は松屋のいつものセット。自動呼び出しシステムが止まってたし肉に謎の硬いものが入ってたし、割と悲しい寄りの食事だった。

Gemini2.5-flashの新バージョンが出たそうですね。前の2.5-flashはなかなかやるなという感想で、今回の2.5-flashもなかなかやるなと思った(違いがあまりわからない)。安くて強いモデルが出てくるのはいいことだ。最近は仕事でも上手くAIにやらせることを意識しているが、残念ながらかなりシンプル目のタスクでもAIがまともにやれたものは1つもない。長々指導していても途中で集中が切れるのか俺もAIも理解できないぐちゃぐちゃの変更を入れ始めて矢面海!!と絶叫することになる。既存プロダクトにAIが触れるような仕組みを用意してやるのは結構大変そうで、新規プロダクトの初速の方が強そうだ。

20250520 フラッシュ!

項目 内容 得点 換算点
睡眠時間 6時間19分 73 9.5/13.0
起床 7:40 100 8.0/8.0
散歩 実施・ゴミ拾いあり 100 5.0/5.0
朝食の栄養カバレッジ 3色カバー 100 5.0/5.0
体操 実施 100 5.0/5.0
労働 passion: 80点, discipline: 85点 83 19.9/24.0
ジム 有酸素+筋トレ 100 12.0/12.0
勉強会 参加 100 12.0/12.0
個人開発 実施 100 7.0/7.0
あすけん - 80 7.2/9.0
総合 1日の総合評価 - 91

最近はひたすらGemini2.5で色々やっている。こいつは本当に賢い。そしてproとflashの間には確実な知性の差がある。しかしAIは周囲の文脈を読んでそれに合わせることが得意だ。proである程度下地を固めてやると、その後のパターン量産はflashでもかなりいい線いける(それでもproには劣るが)。

今月は珍しく完全な家計簿を付けている。不意の出費が多く、単月黒字になるかギリギリのラインだ。22日までに3000円くらいでやりくりすることになる。ちょっと意識していれば余裕か?だからgeminiもflash使いたいんだよな。

謎の思索 1

米の値段について考えている。安くなってほしいが、特に国産米については国土の制約から技術による効率化があまり期待できず、安くなってほしいと願うことが従事者の給料が低くなってほしいと願うことにつながってしまい、それなら誰にババを引かせるかという話にしかならないなあと思っている。でもまあ国民の腹を満たすのは経済だけで語って良いものではないし、バカほど関税かけて市場歪ませてる政府がなんとかしろよと思わなくもない。

謎の思索 2

介護従事者と市役所についても考えている。人口ピラミッドが極端な形で無い限り、人口が2倍になれば要介護者も介護従事者も2倍になるので、介護従事者の不足に対して国外の労働力を入れるのは、一時的にピラミッドの形を変えて対策にはなるが、その人たちもいずれ要介護者になるとすれば根本的な解決にならないという考え方を前江添さんが言っていて、そのときは納得した。しかしよく考えると要介護者が2倍になったときに必要な介護従事者が2倍になるのか?という問題だ。スケールメリットが効くとすれば、社会の人口増加はエッセンシャルワーカー比率の低下を可能にし、その結果僕のように謎の何かを作る人間が生きられるようになる。

ここで問題になるのは職種ごとのスケールメリットの効く度合いだ。たとえば市役所のような集約管理型業務は効きやすいだろう。実際行政効率化のために合併するという話はよく効く。逆に介護従事者は?これは効きにくいだろう。

20250513 faviconを変えるか!

項目 内容 得点 換算点
睡眠時間 6時間30分 80 10.4/13.0
起床 8:00 100 8.0/8.0
散歩 実施・ゴミ拾いなし 100 5.0/5.0
朝食の栄養カバレッジ 3色カバー 100 5.0/5.0
体操 実施 100 5.0/5.0
労働 passion: 65点, discipline: 60点 63 15.1/24.0
ジム 休養日 100 12.0/12.0
勉強会 参加 100 12.0/12.0
個人開発 実施 100 7.0/7.0
あすけん - 72 6.5/9.0
総合 1日の総合評価 - 86

ランチは吉野家の親子丼。外食日だが特に食べたいものが思いつかなかったので牛丼チェーンになる。食事に油が足りておらず、カロリーが少ない。しかし塩分はオーバーしている。バランスが難しい。

ジムは休養日。若干膝が痛かったので丁度いい。時間があったのでパケットキャプチャの続きをやっていた。IPのフラグメント再構成が相変わらず難しい。1つフラグメントが届くたびに再構成が可能かどうかチェックしなければならないのは非効率な気もするが、避けようがなさそうだ。いや、でも前回のチェックの情報を利用してチェックを単純化することはできるのか。たぶん実際に稼働している機器ではその辺もゴリゴリにやってるんだろうなあ。

時間はあったんだけどさ、ジムの休養日に時間があるのは当たり前なんだよな。ジムに行った日でも余裕があったなと思えるように最適化を進めたい。

watch-duty-managerのfaviconを変えるか!と急に思い立ってClaude3.7+Roo CodeのOrchestratorモードにやらせてみた。Orchestratorモードというのはあるセッションが管理役になってタスクを細分化して別のセッションに割り振るので、割り振られた方は背景情報をあまり知る必要がなくコンテキスト(つまり費用)が節約できるというやつだ。この仕組みはなかなかいい感じに機能したが、頼んだタスク自体はClaudeがどれだけやってもicoファイルを作ることができず頓挫した。悲しいね。

最近の日記、つまんねェ〜〜〜〜。まあアレなんですよ、僕の日記道は何かあるたびにネタ帳に書いておいて日記には夜それをまとめて書くというあり方を良しとしていないので、朝から夜まで何かしら思い悩んだことがないと面白いこと書けないんだよな。でも「日を記す」という原義に立ち返るなら、その日の出来事をきちんと記せるようにメモを使うというのも正しいあり方のように思える。

20250512 CUDAがサスペンド復帰後に壊れるやつ/パイプライン処理

20250511 CUDAがサスペンド復帰後に壊れるやつ

のんびり起床。朝食(論理)。無慈悲な掃除。ジムで相撲見る。昼寝、夕食、ゴミ捨て。

ローカルでollamaを使うときに、OS(Ubuntu24.04)がサスペンドから復帰して以降はGPUが利用されないという問題があった。GPUを利用するSpeech Noteも同じ問題があった。

これはollamaやSpeech Noteがサスペンド中もnvidia_uvm(CPUとGPUでメモリ空間を共有するためのモジュール)を掴み続けており、nvidia_uvmが再起動すべき?なのにできないのが問題のようだ。

なので一旦stopで利用を止めてやってモジュール再起動を再起動してやると直った。
https://github.com/ollama/ollama/issues/8426

sudo fuser -v /dev/nvidia*
sudo systemctl stop ollama && sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm && sudo systemctl start ollama

CUDAを利用するいろいろなアプリケーションで起きるのかもしれない。

RAM32GB, VRAM6GBの僕のマシンだとqwen3:8bとか、ものによっては12Bのモデルも動いたりする。でもしっかり電力は平常時の倍くらい食ってるので、効率はよくはないよなあ。

20250512 パイプライン処理

項目 内容 得点 換算点
睡眠時間 5時間54分 56 7.3/13.0
起床 9:17 36 2.9/8.0
散歩 ノー 0 0.0/5.0
朝食の栄養カバレッジ 3色カバー 100 5.0/5.0
体操 実施 100 5.0/5.0
労働 passion: 80点, discipline: 70点 75 18.0/24.0
ジム 有酸素 100 12.0/12.0
勉強会 ノー 0 0.0/12.0
個人開発 実施 100 7.0/7.0
あすけん - 80 7.2/9.0
総合 1日の総合評価 - 64

昼は松屋。ブルーレットを買うときにクーポンを使い忘れて40円くらい損した。もやし買えるじゃん。ジムで相撲観戦。最近人生最大に体重が増えていて56.8kgあった。

ジムでストレッチマットを使った後は、

  1. 消毒液を噴霧
  2. モップをかける

の2つの作業を順番に行う必要がある。消毒液もモップも1つしかないが、2人が同時にこの作業を行いたい。その場合Aがまず消毒液を噴霧し、Aがモップかけに移行した段階でBが消毒液噴霧を行う。そしてAのモップかけとBの消毒液噴霧が終わったら、Bがモップかけを行う。これはマット後処理という作業が2つのステップに分割されているから可能な、パイプライン処理である。ということがあり、こういうことを考えていた。

紙ゴミを縛るか。書くことがない。

20250425 チーズバーガー丼

項目 内容 得点 換算点
睡眠時間 3時間30分 0 0.0/13.0
起床 8:31 74 5.9/8.0
散歩 ノー 0 0.0/5.0
朝食の栄養カバレッジ 0色カバー 0 0.0/5.0
体操 ノー 0 0.0/5.0
労働 passion: 70点, discipline: 70点 70 16.8/24.0
ジム 休養日 100 12.0/12.0
勉強会 ノー 0 0.0/12.0
個人開発 ノー 0 0.0/7.0
あすけん - 45 4.0/9.0
総合 1日の総合評価 - 39

↑結構いろいろ改修した(させた)。今回はGemini2.5Pro。小規模アプリケーションだとめっちゃ賢いよ。ちゃんと.clinerulesに従うしpackage.jsonのコマンドも読める。まあコスト的にはハイエンド側だからね。コメントが過剰気味なのは変わってない。そう言えばYouTubeのある英語話者がジェミナイって読んでたけど、本人(?)に聞いたら発音はジェミニって言ってたな。


(世代がバレる)

夜眠れず、眠れないことにイラついて開き直って5時頃まで起きてた。健康も精神も全てが破滅している。

友人からのタレコミで松屋の新メニューチーズバーガー丼を食べた。美味いかまずいか以前に「普通にパンでバーガーにすれば良いのでは…?」という疑問が湧くほどには単にチーズバーガー。味の評価は米に酸味を合わせることをどう思うか次第。僕は若干懐疑(しかし改めて考えてみると酢飯・ケチャップライス・ケバブ・ドリア等は違和感なく食べてはいるな…)。シンプルに肉がデカいのは満足感がある。

休みが多い期間に入る。と言ってもカレンダー通りだが、憂鬱だ。休みは退屈で、休みを退屈にしてしまう自分の至らなさを思い知るのは辛いからだ。

基本的に僕はポイントカードアンチなのだが、ここに住み始めて結構長く、そろそろ近所のスーパーで使えるカードなら作ってもいいかなという気分になってきた。しかし僕は基本的にデジタル国粋主義者なので、GAFAにピンハネさせないでポイントカードを活用するためにはどういう方法がいいかなと考えている。

20250421 もう一人のボク

項目 内容 得点
睡眠時間 5時間0分 20
起床 6:30 100
散歩 ノー 0
朝食の栄養カバレッジ 3色カバー 100
体操 ノー 0
労働 した・passion: 75点, discipline: 80点 78
ジム 有酸素 100
勉強会 ノー 0
個人開発 実施 100
あすけん - 64
総合 1日の総合評価 59

入眠困難・眠い浅い・悪夢の三重苦。一応早起きした(してしまった)がその後も半覚醒でボーッとしていたのでゴミを捨てそこねた。

昼食は日高屋のW餃子定食。いつもながらあんまり美味しくない。なんならいつもあんまり美味しくなさすぎて思ったより美味しいまである。あすけんに入力するときキムチか唐揚げか選べるようにしてほしい。

神の気温。むしろ適温に近すぎるせいで日に当たると暑いし風が吹くと寒い。フィードバック処理なら平滑化を入れないと高速で服を着たり脱いだりし始めて他の行動ができなくなる。

最近は睡眠の不調を反映してか頭の動きが悪い。とっさに単語が出てこなかったり、複雑な仕組みをイメージするのに時間がかかったりする。元気もあまりない。年齢もあるだろうが、それよりも体調による短期的変動のほうがずっと大きい。

ふと思い立って自分の全ツイートと全日記をNotebookLMに突っ込んでみた。全然面白くなくて、あれこれ質問しても自分がもう知ってることを自分よりも曖昧で不正確な文章で返答してくるだけだった。

20250420 モアイ回し

項目 内容 得点
睡眠時間 5時間37分 45
起床 8:38 68
散歩 ノー 0
朝食の栄養カバレッジ 3色カバー 100
体操 ノー 0
労働 休日 100
ジム 有酸素+筋トレ 100
勉強会 ノー 0
個人開発 実施 100
あすけん - 72
総合 1日の総合評価 66

睡眠時間を追加した。

朝食。2時間おいてジム。風呂上がりに扇風機の風を浴びるおじさん、脱衣所あるあるだと思うんだけど今日は2台の扇風機で2人のおじさんが同じポーズで浴びてて面白かった。モアイ回し(ああ、僕が小学生の頃に遊んだブラウザゲームたちは今どこにいるのだろう)。帰りに『爽 とろける濃厚完熟マンゴー』を買って食べてみた。うん、確かにマンゴーらしい風味はあるけど、そもそも爽があんまり好きじゃないんだよね。シャリシャリ系なので。

↑の点数計算アプリケーションをGPT-4.1-miniでvibe codingしていた。いじるファイルが3つくらいで行数も少ないのでこのAIでもかなりいい具合に動く。激安だし。やってる最中にちょっと面白い発見があって技術ブログも書けた。AIもフロントエンドのツールチェインの複雑さには勝てないようだな。

逆にもっと複雑なwatch-duty-managerはAIに任せるのはかなり難しい。AIが何をしているのか俺にはよくわからないし、AIも俺が何をしているのかよくわかってない。相当上手く操縦しないといけないがそんなことするなら自分でやったほうが早い。.clinerulesを当然のように無視してくるのでこちらがノウハウを積み重ねられないんだよな。

気候がとても丁度いい。26度で湿度50%。自室で服を脱いでいて、暑くもなく寒くもない。蒸しもせず乾燥もしない。布団を被っても気持ちいいし蹴飛ばしても気持ちいい。

20250420 回転寿司/gpt-4.1-miniの印象/prismaでgroupBy

遅めに起きて布団カバーを洗濯した。また冬が終わったので毛布類をコインランドリーで洗った。待つ間にくら寿司で豪遊(1100円)。

回転寿司

回転寿司というのは、極みである。食事の進行中に1品ずつ注文を受けてオンデマンドで調理される自由度の高さ、それを支えるweb注文とコンベヤ輸送という温かみの欠片もない高度な技術によるオペレーション、射幸心を煽るびっくらぽん。揚げ物スイーツラーメンなんでもありの無文化性。そんなに美味しくない寿司、腹に貯まる米による満腹感。誰も触らないせいで回転レーンで干からびていく寿司(そしてそのせいで一層誰も触らなくなる)。

食べる分量が空腹である入店時には決まらないという性質上食べ過ぎにくいというのはなかなか良いところだと思う。

洗いたての毛布を持ち帰って神の昼寝。起きたら友人が麻雀で大負けしていた。

gpt-4.1-miniの印象

またいろんなLLMを試しながら個人開発。これ自分じゃメンドクセぇ〜って思うところはやっぱりLLMにも任せられないね。今日の感触としてはこんな感じ。

  • gemini2.5: やたらと作業ログをコメントで残す。やめろと言ってもやめない。diffツールの使い方が下手で何度もやり直し金ばかりかかる。触るなと言ったところを触る。
  • gpt-4.1-mini: 頭も記憶力も悪いが時間をかけて誘導すれば一応仕事はできる

僕は安くてそこそこ使えるやつに興味があり、その点ではgpt-4.1-miniは良い。claudeはお高くて使いづらいんだけど優秀であるということを痛感。gemini2.5は高いし評判も良かったけど使ってみたらそれほどでもなかった。

prismaでgroupBy

具体的にやった作業はprismaのクエリいじり。アニメの作品(work)とエピソード(episode)が一対多対応であるという前提で、ある条件を満たすようなepisodeを2つ以上持つworkを抽出したい。生SQL(を使えるprisma API)だと

const works = await prisma.$queryRaw`
  SELECT w.*
  FROM work w
  JOIN episode e ON e.work_id = w.id
  WHERE e.some_condition = true
  GROUP BY w.id
  HAVING COUNT(e.id) >= 2
`;

のようにwhere→group by→havingの流れで2回絞り込みを行うことで実現するらしいのだが、これをprismaに持っていくと

const works = await prisma.episode.groupBy({
  by: ['workId'],
  where: {
    some_condition: true,
  },
  _count: {
    workId: true,
  },
  having: {
    workId: {
      _count: {
        gte: 2,
      },
    },
  },
});

となり、返り値の型が { _count: { workId: number }, workId: number } になる。つまり SELECT w.* が再現されずworkIdしか取れない。

既知のissueとしてはこの辺りが近い話に思われるが、いずれも対応される雰囲気がない。
https://github.com/prisma/prisma/issues/24816
https://github.com/prisma/prisma/discussions/6517

まあしないだろうなという感覚もわかる。prismaはそもそも様々なデータベースを隠蔽する抽象化の役割も持っており、各データベースのある程度細かい機能に逐一対応するのは無理だ。TypeScriptとの堅固な統合が持ち味であることを考えれば難易度は一層高い。

ある程度複雑なクエリ、パフォーマンスチューニングが求められるクエリは生SQLのAPIを使ってくださいよということなのだろう。

20250418 車輪の日

項目 内容 得点
起床 8:20 83
散歩 ノー 0
朝食の栄養カバレッジ 3色カバー 100
体操 ノー 0
労働 した・passion: 60点, discipline: 50点() 55
ジム 有酸素 100
勉強会 ノー 0
個人開発 ノー 0
あすけん - 48
総合 1日の総合評価 53

入眠が遅かった。コンディションは微妙。仕事で使えるLLMは当然個人開発よりは制約があるので、その中で上手く活用できる方法をいろいろ試している。同じLLMでもClineとCopilotだとClineのほうが遥かにいい動きをするのだが、開発元の基礎力から考えるといずれCopilotが勝つ未来も十分にあり、慣れておきたい。

ジムはアークトレーナーが珍しく埋まっていたので車輪を漕いだ。これめっちゃしんどい。膝爆発するかと思ったけど終わってみたら意外とそうでもなかった。ジム帰りに御徒町で酒が立っているのを観測したので集合。いつもの中華へ。女将に「顔見て(いつもの連中だと)わかった」と言われて複雑な気分。4月で環境が変わった友人たちの話を聞くのは楽しい。

帰宅してDota2して歯磨きして日記書いて寝ようとしている。WordPressのテーマの更新中にうっかりブラウザバックしてしまったらメンテナンスモードが終わらなくなった。フロントエンドの操作でそこに影響出ていいんだ…。サーバーに入って .maintenance を消したら復活。

徐々に冬服をしまい始めている。毛布・上着類もクリーニングに出したいな。着衣終了・脱衣開始。