20250423 MicroStar International

項目 内容 得点
睡眠時間 5時間9分 26
起床 6:41 100
散歩 実施・ゴミ拾いなし・犬遭遇0匹 100
朝食の栄養カバレッジ 3色カバー 100
体操 実施 100
労働 した・passion: 80点, discipline: 60点 70
ジム 有酸素+筋トレ 100
勉強会 参加 100
個人開発 実施 100
あすけん - 72
総合 1日の総合評価 81

犬遭遇で荒稼ぎ、ズルいので廃止します。

眠りはあまり良くない。早期覚醒が早起きとして点数化されるのはバグっぽいけど睡眠時間の方が重みがかなり大きいので許して。昼間もあまり調子は良くなかった。春の雨、若干寒いような、でも油断すると蒸し暑いような気温だ。

ジムで腹筋をやっていたら鋭い痛みが走った。くしゃみをするととても痛い。笑わせないでください。

個人開発はパケットキャプチャ。MACアドレスをパースして表示できるようになり、ベンダーを調べて遊んでいた。マザボ側がMicro-Star(MSIってMicroStar Internationalだったゆんか!?)、ルータ(イーサネットのレイヤーはルータって言わないのかも?マサカリ回避)側はHUMAX。JCOMのやつ。

この前のprismaでgroupByに対してサブクエリで良くない?と友人に言われ、なるほどな〜と思った。ちなみに現状は2つのクエリに分けてサブクエリと同等のことをしている。サブクエリ化するとトランザクションになるしオーバーヘッドが小さくなるが、メモリの使用量が増える。あとテーブル名が単数形なのは気持ち悪いとも言われたが、それは後の祭りだ。

米を炊いて冷凍した。カブのサラダ(切っただけ)もまだ大量にある。春なのでカブ。

20250422 フロントエンドDDDの記事を読んで思うこと

項目 内容 得点
睡眠時間 6時間39分 86
起床 7:47 100
散歩 実施・ゴミ拾いなし・犬遭遇3匹(プープーパピ?) 130
朝食の栄養カバレッジ 3色カバー 100
体操 実施 100
労働 した・passion: 75点, discipline: 85点 80
ジム 休養日 100
勉強会 参加 100
個人開発 実施 100
あすけん - 22
総合 1日の総合評価 88

今日はよく眠れた。そのせいか労働は特に気合が入っていたというわけでもないが自然体でスムーズによく進んだ。そうそう、これが僕の本当の能力よ。

いい気分になったのでお菓子を大量に食べてしまった。すまん、あすけん女。

イーサネットフレーム

個人開発ではパケットキャプチャを進めた。久々にRustのBoxやdynのことを思い出していた。Rustはコンパイル時にあらゆるデータのサイズが決まらなくてはいけないので、関数の返り値としてトレイトを返すことは原則できない。なぜならトレイトはその実装ごとに型とサイズが違うからだ。しかしその返り値への参照を返すという作りにすれば参照のサイズは固定だから問題なく、その方法を使ってトレイトを返り値にするときに dyn traitname と書くのだ。

まあなんか書くときの感覚よりもメモリ管理のルールが優先されるのはいかにもRustだよね。

今日は生のイーサネットフレームを得るところまで成功した。 u8[] で得られたのでそのままGeminiに放り込んでみたら普通にパースできてすごい。

フロントエンドDDDの記事を読んで思うこと

そう言えば今日は フロントエンドDDD という記事を読んだ。クラスなりなんなりで豊かなデータ構造を作ってそこにドメインロジックを集約するという考え方はとても良く、業界でも重厚なフロント作っている方だと自認している私としてもぜひ見習いたい考え方だと思った。

一方でこの記事が改めて注目を集めるほどに珍しいのは、フロントエンドの世界はどうしてもバックエンドからの通信でシリアライズされてメソッドが消えたり、Reactベースの世界観になるとクラスの差分検出がめんどいというところもあったりする。『コア価値であるロジックがフロントエンドの技術変遷の影響を受けすぎない』で述べられていることを裏返せば、通信やフレームワークの事情先行で作っていくとプリミティブ中心に薄く薄く…ということになりがち。そういうところを上手く分離して丁寧に構築する作り方をしてもなおメリットが上回るような重いものを作っていて、難なくそれを扱えるチームの熟練度があってこそかなあと思う。

関連記事: https://panda-program.com/posts/clean-architecture-and-frontend

『生成AIの作業領域との分離』という切り口は考えたことがなかったが確かにその通りだ。賢い。

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%。自室で服を脱いでいて、暑くもなく寒くもない。蒸しもせず乾燥もしない。布団を被っても気持ちいいし蹴飛ばしても気持ちいい。

import typeならallowImportingTsExtensionsは不要

import { foo } from "./foo.ts";

のように .ts を付けてimportするためにはtsconfig.jsonでallowImportingTsExtensionsがtrueになっている必要がある。しかしこのオプションはnoEmitも同時にtrueにしなければならない。その理由はuhyo氏が解説している。トランスパイルしたら.tsファイルじゃなくなるのでimportできなくなって意味ない(そこの辻褄合わせまでtscはやりません)のでトランスパイルしないでくださいということ。

https://zenn.dev/uhyo/articles/rewrite-relative-import-extensions-read-before-use#--allowimportingtsextensions-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3

じゃあトランスパイル後に消えていいimport、つまりimport typeならよくね?と思って調べたら、実際そうだった。

// allowImportingTsExtensionsがfalseでもエラーにならない
import type { foo } from "./foo.ts";

https://github.com/microsoft/TypeScript/pull/54746

これに気づいたのは、vibe codingで軽めに作っているアプリケーションにテストを追加しようとしたときだ。現状nodeのビルトインテストフレームワークと--experimental-strip-typesを使うとjestやらvitestやらがなくてもそれっぽいテストが作れる(jestのためにトランスパイルとか、結構複雑だったよね)。

https://blog.koh.dev/2024-10-23-nodejs-builtin-test-typescript/

しかしnodeとして実行するならimportには拡張子が必要であり

https://zenn.dev/mizchi/articles/experimental-node-typescript#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E8%A7%A3%E6%B1%BA

拡張子をつけると今度は「allowImportingTsExtensionsをtrueに旋回!」と怒られる。うーん、このルールの意図を考えればimport typeにすれば通るんじゃね?と思ったら通ったという次第。import typeにできる箇所で良かった。というかそうでなければそもそもtscだけではビルドできなかったんだけどな。

nodeのドキュメントにもimport typeはstripすると読める説明が書いてあった。

https://nodejs.org/api/typescript.html#importing-types-without-type-keyword

Due to the nature of type stripping, the type keyword is necessary to correctly strip type imports.

TypeScriptとの微妙な距離感が面白かった。

https://nodejs.org/api/typescript.html#importing-types-without-type-keyword

As in JavaScript files, file extensions are mandatory in import statements and import() expressions: import './file.ts', not import './file'.

The tsconfig.json option allowImportingTsExtensions will allow the TypeScript compiler tsc to type-check files with import specifiers that include the .ts extension.

あくまで拡張子付きのimportという文法が先にあり、それをTypeScriptが許可するかはオプション次第ですね〜というスタンスが感じられ、なるほど言語を作っている方からはそういう見方になるんだなあと思った。

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 を消したら復活。

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

20250418 27度

項目 内容 得点
起床 8:10 92
散歩 ノー 0
朝食の栄養カバレッジ 3色カバー 100
体操 ノー 0
労働 した・passion: 75点, discipline: 65点() 70
ジム 有酸素+筋トレ 100
勉強会 参加 100
個人開発 ノー 0
あすけん - 68
総合 1日の総合評価 73

入眠が困難だったが中途覚醒はなかった。日中のコンディションはやはりイマイチ。

ジムが開いたので久々に。少し負荷を上げたがやはり厳しい。ジム内のいろんな業者が怪しい健康グッズを売るコーナーに体温を上げると健康になるという掲示物が貼ってあり、「27度 死体」って書いてあってじわじわきた。

アイスの珍味を見ると買いたくなるので『爽 Wラムネ』を食べてみたが、まあ普通の爽。というか僕は爽あんまり好きじゃないんだ。シャリシャリ系はちょっとね。

だんだん春になって暖かくなってきた。私は自宅では脱衣によって体温調節をするが、早くももう脱げるものが減ってきていて危機感がある。でも冷房って暖房よりだいぶ安いんですよね。

20200416 エビバターまぜそば

今日も良くない日だった。眠りの質が中途覚醒を繰り返してかなり悪かった。

昼食は近所の二郎系ラーメンでエビバターまぜそばなるものを食べてみたが、しょっぱすぎた。

ジムは休業日。読み手に優しい記事。

20250415 もやし売り切れ

あまり調子が出ない日だった。睡眠がそこまで短いわけではないがひどく眠かったし、気持ちも上がらなかった。仕事は短めにしたがよく進んだ。

豆苗がそろそろ収穫できるのでもやしと合わせて食べたかったが、もやしが売り切れていた。ご飯を食べるときに、朝食では魚肉ソーセージ、夕食ではnoshの塩分と合わせて食べるが、少しご飯が余るのでふりかけを使っている。わさびふりかけがそろそろ切れるのでとり&たまごそぼろを買ってきた。

あすけんを見ながら栄養調整して点数をあげるために冷凍の今川焼や肉まんを活用している。冷凍できてレンジですぐ食べられる食品、募。

書くこと、無w