車の走行距離を記録するWebアプリを作っている

aereal/careco

フロントエンドはVue.jsでVercelへデプロイ、バックエンドはgqlgen + FirestoreでGoogle Cloud Runにデプロイしている。

可観測性

車には好きで乗っているのでとりあえずいろいろ見えるようにしておきたい。また運転者としてメンテナンスに責任を負わないといけない。

とにもかくにも走行した事実の記録から始まるので、走行距離の記録からはじめた。毎日、タコメーターの値を記録し、前回との差分を表示したり。

もともとスプレッドシートにちまちま書いていたけど、だいぶ習慣になって久しいし、いろいろな可視化とか細かい使い勝手の改善を試したいのでWebアプリとして作ることにした。

Next.jsからVue.jsへ

途中までNext.jsで作っていたけどVue.jsに切り替えた。

一番大きかったのはRCEの脆弱性が入り込んだ機序・設計で、いろいろ思うところがあった。とはいえ即ちNext.js (React RSC) はアホの設計だなどと考えたわけではなく、趣味ではほとんどReactばかり触ってきたので気分転換するいい機会だろうくらいの気持ち。

Vue.jsがSFC (Single file component) というコンセプトを打ち出したことはぼんやり知っていたけど、思っていた以上に書き味がよくて気にいった。

エディタ拡張が発達したおかげで、特殊なファイル形式でもきちんとハイライトや補完が効くとか、そういう細かい体験の良さがある。

あとちょっと文芸的プログラミングっぽいコンセプトだと思う。

生成AIとの付き合い

生成AIに仕事を任せるにしても最終的に自分で検めないといけないし、そもそもこれは趣味プロダクトなので効率よりも作る過程そのものも味わいたい。

なので、そういうおいしいところは多少非効率でも自分自信で味わい、反対に特に味のしないつまらないこととか、あまりこだわらないことについては積極的にアウトソースすることにした。

具体的にはCloud Traceでトレースが表示されないトラブルの原因を探る時にブレインストーミング的に使ったりなどなど。

あとは先に書いたようにNext.jsから乗り換え先を探そうという時に「これこれこういう条件を満たすフレームワークを調べて」みたいなプロンプトを投げてレポートを作らせるなど。

当たり前だけど、自分にある程度勘がある (AngularとVueとがあって、……程度) ことを前提とできるのでレポートを評価できるけど、まったく土地勘がないことをやる時には、そもそも評価フレームワークを作るところからはじめないといけない。

他に気付いた点としては、仕事で使っている時には気にならなかったけど、趣味プロダクトの伴走者としてはいささか真面目に仕事をしすぎるきらいがあるので、ちゃんとコンテキストを与えて枠を広げてあげないと無限にお小言を言われるということ。

コーディングエージェントが使われる文脈としては特殊といえるのでこれ自体は不満だと思わないけど、自分の脳みそを絞って鍛えたいよという時にネタバレを食らった気持ちになることがあるので、そういうことはきちんと指示してあげたほうがよい。

またこうしたやりとりを繰り返すことで、自分が趣味プロダクトでどんな体験を重視しているのか省みるきっかけにもなった。

ちゃんとテストを書く

趣味プロダクトでの最大の悩みは品質担保だと思っている。テストを書く労力を厭いがち。

単に創造的な作業にもっと時間を割きたいだとか、そもそもどうテストを書いたらいいかわからないので手を出しあぐねているだとか、いろいろあると思う。

書き方がわからない中にも、どういう設計にすればテスト可能になるのか考えないといけないというレベルから、テストフレームワークの使い方がわからないというレベルまで様々ある。

そういう時にとりあえず「テスト書きたいのでどうしたらいいか考えて。趣味プロダクトなので正常系だけあればよくて、Renovateのライブラリ更新時に自信が持てる程度でよい」みたいなプロンプトでClaude Codeに壁打ち相手してちまちま書くなどした。

これは大きな一歩で、品質担保ができれば継続的に更新できるし、時間があいてから手を入れようという時にも自信が持てる。

「2024年に買ってよかったもの」のその後

2024年買って良かったもの - 『言葉を吐く』

アークテリクス ベータインサレーテッドジャケット

今年 (今シーズン) も着ている。2025年の1〜2月は雪も多く、12月に入ってからはまだ本格的な雪はまだ降っていないけど、雨・風がとにかく強いのでこれがあるとなにかと安心。

年明けて雪が積もったら霧ヶ峰を歩こうと思っており、運動量が少なくかつ標高の高いハイキングにはインサレーションとシェルが一緒になったこれが使い勝手よさそうなので活躍が楽しみ。

MAZDA3 エアロ

引き続き満足。雪が積もるとどうかなーというのはちょっと気になっていたけれど、大雪でも特に亀になることもなく無事に越した。

ノーマルでそもそもアプローチアングルがきついので、付けたところでそんなに悪化していないという説もある。

なおMSR仕様はまったく音沙汰なし。

Oura Ring 3rd gen.

目論見通りシーズン通して就寝時含めてつけっぱなしにできている。

4th gen.が出たけど、たぶん比べなければ突起は気にならないとみている。バッテリの持ちが思ったよりよくないのは少し気になっており、4thでめちゃくちゃ改善されるならちょっと考えるけれど、いうて2倍とかにはならないだろうしなあ……とこのまま使い続けそう。

真夏の汗をかくシーズンでもさっと水洗いすればベタつかないし、そもそも肌に接する面積がとても小さいので気になりづらい。

3年目の思い出

最近、仕事で3年目だか2年目だかの方が社内で発表されるところを見ていて、そういえば自分が3年目くらいに関わった仕事ってなんだろうと思い返した。

speakerdeck.com

speakerdeck.com

ここらへん。カンファレンスとかで話して資料も置いておくと、ぱっと思い出せて実に便利。

Scalaのほうはプロジェクトを始める時に自分に主導させてくださいって手を挙げたことを覚えている。

自分より経験のあるエンジニアが2人いて、何もしなければ自然と2人のうちどちらかがリード的な役割を担うのだろうということがわかっていて、2人とも忙しそうだったので手伝いたいという気持ちと、自分でもやってみたいというエゴを出してみた。

そこそこ大事 (おおごと) なプロジェクトを3年目 (4年目か?) に任せるというのは大胆な決断に思えるし、受け入れてくれた当時のチームやマネージャーにはただただ感謝しかないなあと今になって実感する。

それに何もかもひとりでうまくやれたわけもなく、いろんな人にサポートしてもらえてのことだったと思う。

いずれにせよなんとなく燻っていた当時の自分にとっては「やれるはずだ」と思って大きな仕事を引き受けて実際にうまくやれた・力不足だったという経験を積めたのは本当によかった。

ある意味で天狗というか、周りの評価に対して「いやそんなことない、チャンスさえあればもっとうまくやれる」という気持ちがあったので、チャンスを得てはじめて冷静に受け止められるようになったと思う。

けっきょく白湯

ちょっと前に無印の保温ポットを買い、紅茶を入れたりそば茶を入れたり模索していたけれど、最終的に白湯に落ち着いた。

お茶の類だとティーバッグを抜かないといけなかったり、ついた茶渋をしっかり洗い落とさないといけなかったり、地味にやること・考えることが増える。

お茶を淹れる際はむしろ少し冷めているくらいが湧かしたてより飲みやすかったりするので、そういう意味でもポットに常備しておけると便利。

また、最近は冷えてきたので起きたあとに飲むものを白湯にしている。暑かったらぬるくすればよい。

広口で洗いやすい 保温保冷 卓上ポット | 無印良品

車山高原ハイキング

登山というかハイキング。

ビーナスラインにドライブをするついでに手軽に2,000m近いところを歩く体験をしようみたいな目的。

9時前に車山肩を出発してぐるっとまわる小回りルート。

修学旅行っぽい中学生か高校生くらいの集団がいた。学校行事でハイキングするのはなんとなくだけど長野県とかの内陸っぽい気がするから修学旅行とかではなくて遠足みたいなかんじなのかもしれない。

今でこそ自分も登山とかに興味を持っているけど中学生とか高校生当時にハイキングだぞって言われたら嫌いになっていたかもしれない。あるいは早くに目覚めていたかどうか。

既に日は登っていたけれどまだ霜が残っていて、標高の高さと秋の深まりを感じる。

チェーンスパイクとかがいるようなかんじではなかった。この日は既に朝7時ごろの気温が5℃くらいの予報だったので、前日に雨が降ったらあちこちに氷が張っていたかもしれない。

全体的に勾配はほとんどなく、特に登りらしい登りはあまりない。ので単にちょっと負荷のあるウォーキングというほうが正しい。

しかし着実に標高は上がっていくので眼下に見るビーナスラインや遠くのアルプスの山並みは壮観。

ビーナスラインは何度か訪れているけれどあくまで車道から眺める景色しか見たことなかったので、広い視界に長く続く道程が収まってしまうのを見るとちっぽけに思えるような気もしてくる。

ミスってPeak DesignのLeashという細いストラップしか持ってきておらず、これでS1Rを吊るしたらだいぶ肩が痛くなってしまった。