くろみーの日報テンプレ

日常のつぶやき

tbls-ask-agent-slack の v1 をリリースした

先日 tbls-ask-agent-slack の v1 をリリースした

github.com

tbls-ask-agent-slack は tbls で生成したデータベースのスキーマ情報をもとに、Slack からの質問に LLM が答えてくれるボット

主な変更点は以下の通り

OpenAI互換サービスへの接続

これは親プロジェクトである tbls-ask のほうに手を加えた

github.com

これまで tbls-ask は OpenAI と Gemini に対応していたのだが、それぞれの処理を個別に書いていたため汎用性がなく、メンテナンス性が低いところがずっと頭の片隅で引っかかっていた

プロバイダが増えるたびに個別実装を追加するのも筋が悪いと感じていたので、今回思い切って OpenAI 互換エンドポイントへの接続に対応させて実装を一本化した

これによって個別の SDK メンテナンスから解放されただけでなく、OpenRouter や LiteLLM といったゲートウェイ経由の呼び出しにも対応できるようになった

結果的に Claude や各種オープンモデルなど、これまで直接対応できていなかったモデルも幅広く呼び出せるようになった

こんな感じでローカルで動かしている Qwen 3.8 も呼び出すことができるようになって嬉しい

Helm チャートへの移行

恥ずかしながら最近 Helm チャートなるものを知り、k8s の manifest file を直に書いていたところを Helm チャートに移行した

github.com

移行してみて感じたメリット

  • k8s へのデプロイがシンプルになって Makefile がすっきりした
  • values.yaml や --set で環境変数や接続先設定を外から注入しやすくなった
  • 片付ける際も helm uninstall 一発で関連リソースを綺麗に削除できるようになった(一部だけ削除されている状態を気にしなくて良い)

まだ Helm チャートについては知らないことも多いのだが、このツールをひとつのきっかけにしてこれから勉強していきたい


GHCR のダウンロード数などを見るともうほとんど使われていなさそうなツールではあるのだが、ふとした時にリファクタリングしたくなったのでやってみた

とはいえこれ以上あまり手を加えたいことも思い浮かばなくて、なんとなく区切りをつけようと思って v0 を脱して v1 にした

AIエージェント全盛期の今、エージェントが開発環境の中で直接スキーマやコードを読んで作業してくれるようになり、昔みたいに Slack から Chat API を呼び出して何かするということ自体がもう少なくなりつつある

このツールを作り始めた時の高揚感を考えると少し物寂しくもあるのだが、時代の流れは止められないし、ツールとしての役目は静かに終わりつつあるのはたしかだ

それでもこのツールを作り始めた時のワクワク感や試行錯誤の記憶は自分の中にはっきりとあって、趣味プログラミングとしてはツールそのものよりもこちらの方が実体なのかもしれないと思う秋であった

nulab/bee でメタ認知を保つ

昔観たインド映画で「3 Idiots(邦題:きっと、うまくいく)」という映画の歌詞が頭に残っている

Confusion hi confusion hai, solution kuch pata nahi

Solution jo mila toh saala question kya tha pata nahi

混乱ばかりで解決策がさっぱり分からない

やっと解決策が見つかったと思ったら、そもそも問題は何だったのか分からなくなってしまった

作業をしていると、目の前の作業に夢中になって本来の目的を忘れてしまうことがよくある

例えば、新機能の開発中につい dotfiles の設定をいじり始めたり、報告書を書いていたはずが差し込みの Slack 対応に没頭していたりする

「答えを出すより問題を見極めるほうが難しい」とよく言われるが、同じくらい「今解いている問題を覚えておくこと(メタ認知)」も難しい


最近はチームの文化として Backlog を使った課題管理を行なっている

前職では自分で課題を作ることはなかったので気づかなかったが、Backlogはマークダウン記法が充実していて、実はかなりエンジニアフレンドリーに作られているツールなのではと思っている

そんな折、Backlog の公式 CLI ツールがリリースされた

nulab.com

名前は nulab/bee API キーを使って課題の参照や編集ができる

単体で使っても便利だが、個人的なおすすめは定期実行スクリプトに組み込む使い方

今やるべき本筋のタスクを定期的に通知し、メタ認知を取り戻す仕組みを作ってみた


仕組みはシンプルで、nulab/bee で自分にアサインされている「進行中」タスクを取得してデスクトップに通知する

以下のコマンドで進行中のタスクを取得できる

bee issue list -S 2 -a @me

取得したタスクを整形し、macOS の osascript で通知する(スクリプトは一部省略)

osascript - "$TASK_LIST" "タスクリマインダー" <<'EOF'
on run argv
  display notification (item 1 of argv) with title (item 2 of argv) sound name "default"
end run
EOF

このスクリプトを LaunchAgent に登録し、定期的にデスクトップへ通知させている


ポイントは進行中のタスクのみを通知し、未着手タスクはあえて通知しないこと

未着手まで通知すると優先順位がぼやけ、さながら全部終わるまで帰れま10状態になってしまう

進行中だけに絞ることで、今まさに手を動かすべき本筋のタスクに意識を集中できる

またこの通知をきっかけに進行中タスクを積みすぎない(WIPを制限する)規律にも繋がる

3歩歩けば忘れてしまうトリ年の私にとって nulab/bee は非常にありがたいツールだ

Researchmap の業績から個人サイトを生成するツールを作った

業績管理によく Researchmap を使っているのだが、デザインをカスタムできなかったり独自ドメインでの運用ができなかったりするので、個人サイトと2つ並行して運用している研究者も多いと思う

しかし同じ業績情報を両方に登録・更新していくのは二重管理になってしまい億劫だ

というわけで Researchmap の情報を SSOT(信頼できる唯一の情報源)として個人サイトを生成するためのテンプレートを作った

Astro ベースで構築していて、Cloudflare Pages(または GitHub Pages や Vercel 等)に手軽にデプロイできる

github.com

使い方はシンプルで、Researchmap の「データ管理・エクスポート」から JSONL 形式でエクスポートして zip を展開し、以下のコマンドで取り込む

npm run import /path/to/rm_researchers.jsonl

import コマンドを実行すると非公開項目の自動除外(サニタイズ)やアバター画像の取得もまとめて行ってくれる 取り込んだデータ自体は .gitignore されているので、Public レポジトリでも安全に管理できる

あとはローカルで確認してデプロイするだけ

npm run dev
npm run deploy

ENABLE_EN=true を指定してデプロイすれば、英語表記がある項目のみを抽出した英語版ページ(/en/)の生成も可能だ

生成後のサイトはこんな感じ

kromiii.info

本当は Researchmap の API を使ってもっとスマートに連携したかったのだが、運用元に確認したところ API は機関向けに公開されているもので個人利用は想定していないとのことだったので、おとなしくエクスポートデータを使う方式にした

このままだと単に Researchmap のガワを変えたような感じになってしまうので、個人サイトとしての内容をもうちょっと充実させたいのだがなかなかそこまではできていない

テンプレートレポジトリとして公開しているので、ぜひお好みのデザインやコンテンツを追加していってほしい

近況ーそれはゴミだから触らない

最近娘が歩けるようになったので散歩の時は後ろを歩いてついていく係をやっている

何をやっているかというと、落ちているゴミを拾おうとする娘に対して「それはゴミだから触らない」と注意するロボットのような仕事

多分人間はデフォルトで落ちているものを拾うように生まれてきているのだが、現代のコンクリートジャングルに適応するためにはいったんその本能を消去しないといけないのが大変

ゴミ判定機になったすね毛のおじさん


来週分担執筆した本が出ます

www.utp.or.jp

内容は東大附属の卒業調査パネルを使った分析で、2019年に東大に所属していた時にやっていた内容をベースにして、去年会社で働きながらセコセコ書いていたものです

学術書ですがお求めやすい価格になっているのでぜひ


来週金沢でセミナーに登壇します

dri.w3.kanazawa-u.ac.jp

タイトルは「電子ラボノートの活用によるメタデータ管理」で数ヶ月前の自分なら全く縁もゆかりもなかったテーマなんですが、今はこんな感じの仕事をやっていますという共有

後日資料も公開されるそうなのでよければチラと見てください

レポジトリをまとめてアーカイブできる gh 拡張を作った

5月から dotfiles のパッケージ管理を mise に寄せる試みをやっている

zenn.dev

やってみて一番嬉しいのは Renovate によってツールのバージョンが自動的にチェックされ、最新版への移行PRを毎日立ててくれることだ

毎日 GitHub の通知欄を見に行って、Renovate の PR があるかチェックして、あったらレビューしてマージ…という生活を一ヶ月ほど続けていた

あるときふと gh-dep というツールがあったことを思い出して、わざわざ GitHub のサイトにアクセスしなくてもターミナルからRenovateのPRをマージする方法を思いついた

github.com

ここからようやく本題に入るが gh-dep を使うようになって気づいたのが、今はもう使わなくなったレポジトリに Dependabot の PR が大量に立っていることだった

そのまま放置しててもいいのだがなんとなく気持ち悪いと思って、レポジトリをアーカイブしたくなった

しかし量が多いのでブラウザで一つづつアーカイブしていくと日が暮れそうであった

ネットで探すと下記のようにレポジトリを一括でアーカイブする便利なワンライナーはあったのだが、個人的にはちょうど gh-dep みたいにインタラクティブにレポジトリをフィルタリングしてアーカイブできるようなツールが欲しかった

zenn.dev

既存のツールを探したが、探しても見つからなかったので自分で作ってみることにした

github.com

使い方はこんな感じ

Typeでフィルター、Spaceで選択、Enterで実行というシンプルな構成にした

gh extension なので以下のコマンドで簡単にインストールできる

gh extension install kromiii/gh-archive

これによって無事レポジトリが整理され gh-dep で快適にdotfileの運用ができるようになった

今の時代頑張ってワンライナーを書くよりもAIに任せて拡張機能を書き切ってしまう方がトータルで見ると早いということを感じた初夏であった

Gemini Live API を使って論文と対話できるZotero拡張機能を作った

5月から国立情報学研究所のクラウド基盤研究開発センターというところで働いている

大学院を出てから三年企業で働いていて、もちろん得たものは大きかったものの、錆びついてしまったスキルもいくつかあって、その一つが英語力だ

博士課程のときは研究室に留学生が多かったのもあって、留学経験がない人間にしては英語ができる方(自認)だった

今月上旬にオンラインでドイツの研究者と話す機会があったのだが、妙なところで度胸がある自分は、三年のブランクはあるもののどうせやってみたらなんとかなるだろと思っていた

結果ものの見事に撃沈してしまった

昔ならジャパニーズイングリッシュで発音は良くないけど、とりあえず英語の構文は成り立っていて、簡単な単語をいくつか組み合わせることで無理やり会話ができていたのだが、今はもはや会話が文章の体をなしておらず、相手にも気まずい思いをさせてしまった

これは何とかしないといけないと思い、あわてて昔やっていたオンライン英会話のサービスを調べたりしたのだが、安いものでも月額数千円はかかってしまうし、家庭を持った今となっては、毎回英会話講師と予定を合わせて決められた時間にレッスンに参加するのはちょっと難しい

そもそも今やAI時代なので、英会話の練習をするのに生身の人である必要もな以下と思って Gemini Live で英会話の練習をする方法を調べたら似たようなことをやっている人がいた

neoverseai.main.jp

英語の練習ならこれでもういいじゃんと思ったのだが、英語を使う場面がもうわかっているのであれば、最初からその文脈で練習をするのが手っ取り早いのではということで、ZoteroとGemini Live API を使って論文を題材にした英会話練習をするためのプラグインを作った

github.com

Zotero の設定画面で Gemini API Key を設定すると、開いている論文の内容をコンテキストとして読み込んだ上で Gemini Live が応答してくれるという仕組みとしては簡単なもの

Zotero の拡張機能は Zotero の内部APIにアクセスできるので、自前でPDFのテキスト抽出を考えなくても良いのはありがたかった

とりあえず動作確認も兼ねて何回か使っているが今のところは良い感じ

いわゆるテキストモデルと比べると音声モデルは値段が高くて、累計(おそらく)十数分ほど動かしてみての請求額はこんな感じ

とはいえそれでも生身の人間と話すよりは安いのと、論文について音声で議論できるというのはなかなかに得難い体験ではあって、しばらく自分用に使ってみようと思う

ぜいたく三昧

ぜいたく三昧というぬか漬けの素があって、最近よく使っている

www.kokujo.jp

ぬか漬けというとなんだかハードルが高い印象があったが、去年の今頃義母がやっているのを見ていてこれならできそうだと思って自分でもやってみることにした

我が家ではぬか床にはジップロックを使っている

Lサイズを買うとぜいたく三昧が一パック丸々入るので便利

なんとなくぬか漬けは夏場に食べたい感じがあり、冬の間しばらく休止していたが春から再開した

ぜいたく三昧と言いつつ価格はリーズナブルで一袋330円

これで数ヶ月は持つんじゃないかと思う


最近巷でAI疲れなる単語がよく聞かれるようになった

何のことかというと、とにかくずっとAIを働かせていないと気が済まなくなってしまい、AIからの問い合わせに応え続けるうちにメンタルに不調をきたしてしまう状態のことらしい

自分はあまりその状態になったことはないが、AIに疲れたらぬか漬けをやってみるのもいいんじゃないかと思う

ぬか漬けをつければ自分が寝ている間も微生物が働いて勝手に食材を美味しくしてくれる

AIを並列で回したければぬか漬けを何個もつければいいだけの話で、これは全然難しくない

とはいえぬか漬けのスピード感で仕事をするのはなかなか許されない世の中になっているのも確かで、そう考えると何かを待っていられる時間というのは確かに贅沢なものなのかもしれない

ぜいたく三昧というのは価格のことじゃなくて時間のことを言っていたのか、とそれらしいまとめを置いてみる

zengin-rb の軽量版 gem として zengin-lite を作った

最近部署異動があり Good First Issue として銀行コードの絡むお問い合わせの対応をした

結論から言うと、銀行コードのバリデーションに使われていた zengin-rb という gem が最新の支店の追加に追従できていなかったことが原因だったため、当該の支店のバリデーションを個別に追加することで対応した

そのときの話を Omotesando.rb で話したときのスライドはこちら

speakerdeck.com

というような話を社内でもしていたら @akatsuura さんから

「この gem 使いやすいんだけどメモリ結構食うんだよね」

という話があり、調べたら確かにメモリ使用量だけでいうと重量級(サービスで上から数番目くらい)のgemだった

zengin-rb は gem が読み込まれる際に呼ばれる preload! メソッドが全銀行の全支店をメモリ上に展開するのだが、ご存知の通り(?)日本の銀行の数は多く、さらにそれぞれの支店まで全て読み込むとなると軽く10MBくらいはいってしまう

現代のProduction環境で10MBのメモリなんてほぼ気にしなくて良いと言われればそれはそうなのだが、なんとなくメモリ使用量の少ない zengin-rb を作るとしたらどんな感じになるんだろうかと気になったので作ってみた

rubygems.org

コードは GitHub で公開している

github.com

ZenginLiteのLiteはもちろん読み込みが高速という意味もあるのだが、今回メモリ使用量を削減するにあたって SQLite を使うことにしたのでその意味あいの方が強い

heap-profilerで読み込み時のベンチマークを取るとメモリ使用量だけで見れば zengin-rb の 1% ほどに抑えることができた

Total Memory Allocated:
  zengin-rb:   10.09 MB
  zengin-lite: 91.04 KB
  Difference:  10.0 MB
  Ratio:       zengin-lite uses 0.9% of zengin-rb

gemロード時のメモリ使用量が少ないということはgemの読み込みかかる時間そのものも少ないということで、zengin-lite は zengin-rb よりも4.1倍早く読み込むことができる

Gem Loading Time (require time):
  zengin-rb:   233.93 ms
  zengin-lite: 56.92 ms
  Difference:  177.0 ms
  Result:      zengin-lite is 4.1x faster (75.7% faster)

ベンチマークに使ったスクリプトはこちら

ただし副作用もあって、どんなシチュエーションでも zengin-lite の方が優れているというわけではない

  1. 依存関係が増える(SQLiteをbundleしているため)
  2. データ読み込み時に毎回クエリが走るので全銀行・全支店のイテレーションなどには不向き

このあたりはレポジトリの README に注釈として書いておいた

とはいえ自分たちのように単一の銀行・支店のバリデーションに使うだけなら全データをメモリにロードするよりも都度クエリしたほうがトータルではコスパ良い気がしていて、うまい使い分けができたらいいと思う

Claude Code の Plan モードはサブエージェントだった

今年の9月からClaude Code を使い始めた

カスタムスラッシュコマンドあたりまではまだギリギリついていける気がしてきたのだが、サブエージェントやらスキルやらが出てきたあたりからClaude Code のアップデートに完全についていけなくなってしまった

このままではまずいと思い、年末この本を買って読んだ

gihyo.jp

最新の情報はドキュメントにあるんだから公式のドキュメントを読めよという話もありつつ、やはり紙の書籍からしか得られない栄養というのはあるみたいで、1冊ざっと流し読みしたら最近のトレンド(サブエージェント、スキル、スペック駆動開発あたり)の概要はある程度つかめた気がする


中でも一番驚いたのは Claude Code の Plan モードが実は(自分がマニア向けの機能だと思っていた)サブエージェントだったということだ

Plan モードは Claude Code 上で Shit + Tab を何度か押すと切り替わるモードの1つで、Plan モードになっていると Claude はコードの編集をせずに、コードベースから実装方針だけを立ててくれる

plan モードに切り替えた状態

実装の方針がよくわからずとりあえず Claude の意見だけ聞きたい時に便利で自分は好んで使っていたのだが、この本を読んでこの機能が実は Claude Code 上でサブエージェントとして実装されていることを知った

https://code.claude.com/docs/en/sub-agents#plan-subagent

サブエージェントになっていると何が嬉しいかというと親タスクのコンテキストを圧迫しないことだ

サブエージェントは親タスクから呼び出されると独立したコンテキストで調査を開始し、結果だけを親タスクに返す

こうすることによってサブエージェント内でどれだけのファイルを読み込んでも親タスクのコンテキストを圧迫しないので、調査用に大量のファイルを読み込んでも後の実装フェーズへの影響がない

Planモード、今まではClaudeの書き込みをブロックする機能くらいの理解しかしていなかったが、これを聞いてサブエージェントの使い所がちょっとわかった気がした

奈良時代の水筒

奈良時代からの水筒を持っている

といっても日本史の奈良時代ではなくて自分史の奈良時代だ

奈良に住んでいた2022-2023年の間を自分の中での奈良時代としている

同様に京都に住んでいた期間は京都時代、三鷹に住んでいた期間は三鷹時代とよんでいる

記憶の引き出しは時間で区切るよりも場所で区切ったほうが自然な気がする

何年何月に何をしていたかと言われてもパッと思い浮かばないけれど、この場所住んでいた時の感情はありありと想起することができる

この水筒を買ったのは奈良生活の最終日、就職のために東京へ向かう電車の待ち時間だった

就職先で無料で水が飲めることを知って感動した僕は、仕事内容などそっちのけで、これだけは準備しておかねばとあわてて購入した記憶がある

自分はモノを多く持たない主義なので奈良時代の持ち物いまほとんど手元に残っていない

写真の水筒は自分の持っている物の中ではかなり古参になってしまった

今日家族から新しい水筒をもらったのでこの水筒も今日限り

ものはなくなるけれど奈良時代の記憶はずっと色褪せずに残っている

一生ぶんの体育座りをしている

ここ最近、体育座りを酷使している。 というのも、子供の寝かしつけに非常に便利なのだ。

以前、寝かしつけからのベッド移行が難しいという話を書いた。

blog.kromiii.info

理化学研究所の研究によると、抱っこで寝かしつけた後、すぐにベッドに置くのではなく、5分ほど座って抱っこを続けてから置くと成功率が上がるらしい。

www.riken.jp

この記事では椅子に座った状態での寝かしつけが紹介されているが、自分が寝落ちしてしまうのが怖い。そこで編み出したのが、体育座りの膝に赤ちゃんを乗せ、45度くらいの角度で保持する方法だ。これなら安定感があり、自分も寝てしまう心配が少ない。

小学校の時、なぜあんなに体育座りをさせられたのか不思議だったが、すべてはこの時のための伏線だったのかもしれない。

スティーブ・ジョブズがスピーチで語ったように、未来を先読みして点と点を繋ぐことはできない。しかし、過去を振り返った時に初めて、その点と点が繋がっていることに気づく。

youtu.be

まさか、あの体育座りの日々が、数十年後の我が子の寝かしつけという形で繋がるとは。子供の穏やかな寝顔を見ながら、人生の不思議な縁(えにし)を感じている。

イシトビキャベツ『New Driveway』感想

先日オンラインで購入した書籍の感想

cabbage-shop.stores.jp

作者のイシトビキャベツさんは元会社の上司で、会社にいた時はトビーさんと呼ばれていた

キャベツがどこから来たのかは知らない

自費出版の本をオンラインで買うというのは自分としても初めての体験で、このまま代金を持ち逃げされないだろうかと心配していたら、Amazonプライムもびっくりの早さで届いた

現在絶賛子育て中ということもあり、なかなか本を読む時間は取れないのだが、光の速さで本を送ってくれたトビーさんに対する感謝もあって、子守りの合間にポチポチと読み進めた


読み進めていく中で思い出したのが、昔好きで読んでいた沢木耕太郎の『深夜特急』

www.shinchosha.co.jp

全6巻でそこそこボリュームのある旅行記なのだが、一度読み始めるとあっという間にその世界に引き込まれてしまう

『深夜特急』がユーラシア大陸を西へ進んでいったのに対して、『New Driveway』ではアメリカ大陸を東から西へ横断する話である

場所と時代こそ違うものの、今回の『New Driveway』でも旅のリアルな感情描写が魅力的だった

これは個人的な見解なのだが、「旅」と「旅行」の違いは何かと言われればそれはリスクをはらんだ見通しのつかなさだと思う

開幕冒頭に書かれていたこのフレーズはまさにそれを端的に表している気がした

長期旅行の直前は期待や高揚感より、日本の夏を楽しみたい気持ちや防衛本能的な不安が混ざった感情になる

誰に言われたわけでもない、自分が決めたことなのに、なんかやりたくないような気がする

とはいえもうここまで来たら行くしかない、出たとこ勝負だ

冒頭のフレーズは自分が昔長期のバイク旅に出かける前に感じた気持ちを思い出させてくれるような気がする


リスクをはらむ分、旅に出たことで得られる予想外の出来事(プラスもマイナスも)は、日常では絶対に得られなかったものだ

旅に出たからといって何かが変わるわけではないけれど、それでもその体験は自分の人生を確実に豊かにしてくれる

自分はこれまで日常のトビーさんしか知らなかったが、会社で見かける日常のトビーさんの裏で、こんな冒険が繰り広げられてたのかということを知ると、なんとなく昔の思い出も変わった味になった気がした

Siriの便利さに気づいた

これまでいわゆる音声アシスタントというものを毛嫌いしてきた

Windowsを買ったらまずCortanaをオフにする

iPhoneを買ったらまずSiriをオフにする

変なところにお金をかけなくていいから、どうかそっとしておいてくれというのが自分、そして全人類の声だと思っていた

しかし子育てを始めてから事情が変わった

おむつ替え、ミルク、抱っこ、全て両手が塞がるものばかり

育休に入る前は、優雅に読書でもしながら子育てをする夢を描いていたが、そんな幻想は一瞬で消え去ってしまった

スマホすら操作できず、ピヨログの記録すら追いつかなくなる状況の中で、最近ふとSiriの存在を思い出した

設定からオフにしたSiriを再びオン

「Hey Siri、ピヨログでおしっこを記録して」

話しかけるだけで、うんちやおしっこの記録ができるようになった

特別なデバイスは何もいらない

感動した私は、それから狂ったようにSiriを使うようになった


ある時抱っこでの寝かしつけに成功して、暇だからポッドキャストでも聞こうと思ってSiriに話しかけた

「Hey Siri, ポッドキャストを再生して」

ところが声が大きかったのか「Hey, Siri」の声で赤ちゃんがびっくりして起きてしまった

本末転倒とはまさにこのことなり

育休を取ることにした

先月子供が生まれたので、今日から3ヶ月育休を取ることにした

blog.kromiii.info

育児は思ったより5倍ハードで、今ちょうど一ヶ月が経過したところだが、ちょっぴり疲弊しながらこの記事を書いている

何がハードなのかと言われるとなかなか言語化が難しい部分はあるのだが、自分の場合はまだ力の抜きどころがわかっていなくて、常に緊張状態になってしまうのが大変

慣れの問題だと思うので、これから少しずつ肩の力を抜いていきたい


よく子育ては自分の子供時代の追体験だと言われるが、まさにその通りだと思う

kangaeruhito.jp

この記事は村井理子さんという方のエッセイで、子供を見ながら自分の子供時代を思い出したエピソード

自分は思い出せる最古の記憶が小学校1年生くらいなので、育児をする中で自分の子供時代の記憶が蘇ってくるという体験ができるのは、残念ながらもう6〜7年後になりそうだが、そうでなくても0歳の子育てを通して、0歳の自分の姿に想いを馳せてみるのも悪くないと思う

前世の記憶があるという一部の人を除いて、多くの人は自分の子供時代を知らない

あるときふと気がついたら人生が始まっているというのは、知らない間に映画館に来ていて、目が覚めたら上映中の映画の途中だった、みたいな感じだろうか


今でもかろうじて覚えているのが1999年にスターウォーズのエピソード1が公開された時

スターウォーズシリーズは当時もうすでに不動の人気を獲得していて、当時は世界全体がお祭り騒ぎ

我が家でももれなくレンタルビデオ店から借りてきたVHSをセットして意味もわからず見ていた記憶がある(残念ながら2つとも死語になってしまった)

その後しばらくして、ある程度分別がつくようになってから、スターウォーズシリーズが実はエピソード4から始まっていたという事実を知って、てっきりエピソード1から始まったと思い込んでいたゆとり世代の僕は衝撃を受けた記憶がある

映画は最初から見るもの、途中から見るなんて言語道断と思い込んでいた自分は、このエピソード4から始まる奇妙な映画が世界中で大ヒットを記録したという事実が理解できなかった


とはいえ、よく考えると人生もエピソード1~3をすっ飛ばしていきなりエピソード4から見始めるようなもので、とりたてて騒ぎ立てるようなものではないのかもしれない

そう考えると育児というのはエピソード6からエピソード7へと進むのを止めて、エピソード1を見るような楽しさがある

もちろんこれは娘にとってのエピソード 1 であって、私にとってのエピソード 1 ではない

しかし子供の成長を見ることで、自分もこうだったんじゃないかとか、あのとき親はこう思っていたんじゃないかとか、現在まで続く物語の裏側を想像することができるのは楽しい

エピソード1の面白さを理解するには、1999年の自分には早すぎた

妻が妊娠中に作っていたアプリたち

妻が妊娠中に作っていたアプリたちをこの機会に紹介する(日本語の係り受けが複雑なので文脈から適切にパースしてもらえると)

pregnancy-meal-bot

聞き馴染みのない英単語だが、こういう感じのLINE Bot

食事の画像をアップロードすると、妊娠中に食べて良いものかどうかを判定してくれる

妊娠中の食事、結構トラップな組み合わせが多くてなかなか覚えるのが大変なのでこういうのがあったらどうだろうと思って作ってみた

蓋を開けてみると結局あまり使わなかったのだが、それはそれでよし

サーバーサイドはGASで動いていて、コードはこちらで公開中

github.com

LINE Botとして公開したかったが、医療・健康周りのサービスは色々と法律の規制が多そうなので断念

これまでGASは直接 Google App Script を書くことが多かったが、今回は clasp というパッケージを使って TS から生成する方針をとった

生成結果のデバッグがちょっと難しくなるのが難点だが、それ以外は使い慣れた言語でスムーズに開発できるのは良い

Baby Gender Reveal Generator

オンラインで Gender Reveal するためのサイト

Gender Revealとは、2000年代の米国で始まった胎児の性別を親しい人に知らせるイベント

本来はケーキや風船など趣向を凝らした演出でやるものらしいが、直接会えない人にも使えるようなアプリが欲しかった

ググれば出てきることは出てくるのだが、広告のついているものが多くてちょっと萎えていたところ、静的サイトでできるんだったら無料で広告なしで作れるじゃんと思って作ってみた

成果物はこちらで公開している

https://simple-gender-reveal.netlify.app/

使い方としては、まずは正解の性別をクリック、リンクが発行されるので、これをシェアすることで簡単に Gender Reveal を行うことができるという仕組み

https://simple-gender-reveal.netlify.app/reveal/omfegc9oc9q-enNmbWhiLWJveQ==

工夫したポイントとしてはURLから性別がわからないようにする部分で、単純な実装だとクエリパラメータで ?gender=male のようにしてパラメータを渡す感じになってしまうが、それだと本末転倒なので Base64 encode してなんとかした(目視でdecodeできる人には効果がないかもしれない)

サイトは bolt.new でAIにさっと作ってもらった

Netlifyと連携しているのでデプロイもほぼお任せでできたのは良かった