🧊

2023年の振り返り

今年もお疲れさまでした。

2023年の稼働は、年の前半に副業が固まってたり、年の後半は本業が久方ぶりにやや忙しかったりと、例年よりも波が大きかった印象。 ただ直近が山だったというだけで、平均するとまあ暇はあった気がする。

そして物理的な稼働と、精神的な満足度はまた別の話で、「充実したいい年やったな〜!」とは思えてないのもまた、素直な気持ちである。

というか、ここ数年ずっと同じような感想になってる気がしてきた。どうすれば満たされるのか、もはやわからない・・・。

01月-03月

社内サービスをメンテしつつ、社員の稼働を可視化するサービスを作ってた。

  • GitHub Projectsの操作ログWebhooksを、Cloudflare Workersで受けてKVに保存
  • 同Cron triggersで、表示に便利な単位に集計
  • 集計結果をブラウザでよしなにクエリしてグラフで表示

ってな感じのやつ。

グラフ表示部は、一般的なチャートライブラリをあえて使用せず、あえて自作するという突飛なことをやってた。

単に世のチャートライブラリどれも重すぎっていうのもあるけど、そのおかげで「数値が異常に大きい場合、グラフの外枠を突き抜けて異常っぷりを表現する」という、一般的なライブラリでは対応できなさそうなUIを実現したりしてた。謎のこだわりである。

D1がまだまだ使えない雰囲気の頃だったので、データ集計はクライアントサイドで、LovefieldというSQLライクなライブラリに突っ込んでた。

ブラウザで動くSQLite alternativesとしてのLovefield | Memory ice cubes https://leaysgur.github.io/posts/2023/03/03/092649/

今ならD1でやってもよいかな?

これはSvelteKitでSPA構成にしてて、その他にもReact/Next.jsなSPAを書いてたりもした。

04月-06月

ChatGPTの波を受けて、社内でもAI活用だ!みたいなブームが一瞬あり。

個人的には、既存のコンテンツをEmbeddings化して、それをChatCompletionのネタにする、いわゆるRAG的な用途を追ってた。

ただ自分のスキルセットの問題ではあるけど、この分野をいわゆるフロントエンド系の資産だけでやるのがかなりつらかった。外部サービスをメンテする体力はないので使わないとすると、どうすればコンパクトかつまともに動くものを作れるか?っていう。

最終的にそれらしい仕組みを作ることはできたけど、当時はOpenAIのAPIにしてもトークン数4096が限界で、その予算でどこにどれだけEmbeddingsの検索結果をブレンドすべきかみたいな調整が主になってくると、何もわからない・・って感じ。

そもそもベクトル検索するにしても、ただのBrute Forceしか実装できないとなると、データ量にも制約が生まれ・・・などなど、「にわか片手間では、やはりめぼしい成果は得られない」ってことがわかったことが収穫というか。

分野として興味はあるので、ちゃんと裏側の仕組みに詳しい人と一緒に、なんかやれる機会があればよかったなあとは思う。

TensorFlow.jsのUniversal Sentence Encoderで、ブラウザ上でEmbeddingsを作る | Memory ice cubes https://leaysgur.github.io/posts/2023/05/31/133105/ 続・ブラウザ上でEmbeddingsを作る | Memory ice cubes https://leaysgur.github.io/posts/2023/06/07/133443/ Cloudflare Workers + KVだけで、ベクトル検索を実現する | Memory ice cubes https://leaysgur.github.io/posts/2023/06/29/104234/

その他には、Solid.jsでSPAを書いてたりもした。

07月-09月

Cloudflareスタックでの仕事が主だった。

D1を本番投入するためにいろいろ調べたり、ローカルでよしなに開発するためにはどうすればいいかを模索してた。

その結果で生まれたのが、ローカルのNode.jsからでもKVやD1のAPIを叩ける某ブリッジの実装。

leaysgur/cfw-bindings-wrangler-bridge: This bridge makes it possible to interact with remote Cloudflare Workers bindings(like KV, D1, etc…) from anywhere you want. https://github.com/leaysgur/cfw-bindings-wrangler-bridge

対応してるバインディングに限りはあるけど、ViteベースのフレームワークでSSRするスタックも、大した手間なくローカル開発できるようになってハッピー。

ちなみに、この時期に書いてたSPAはSvelteだった。

10月-12月

引き続き、Cloudflareスタックで仕事してた。

特にD1の情報が世の中になくて、あれこれ調べるのが大変だった。

Cloudflare D1が、SQLiteのビルドオプションをどう設定しているか | Memory ice cubes https://leaysgur.github.io/posts/2023/09/28/093909/ Cloudflare D1の、複数テーブルのJOINで同名のカラムが取得できないバグとその理由、そしてDrizzle ORMでの対処法 | Memory ice cubes https://leaysgur.github.io/posts/2023/10/14/180508/ Cloudflare D1の、D1_ERROR: too many SQL variablesについて | Memory ice cubes https://leaysgur.github.io/posts/2023/12/13/135042/

このブログも今年は50記事くらい更新してたらしいけど、だいたい半分くらいはCloudflare関連だったりする。

それこそ「Workers Tech Talk」というCloudflare Workersユーザーが集うイベントで登壇したりもした。

Workers Tech Talks #2 に行ってきたメモ #workers_tech | Memory ice cubes https://leaysgur.github.io/posts/2023/12/15/205050/

受託メインなので、来年もCloudflareのことをやってるかはわからんけど、何かあればやっていきたい所存。

D1それ自体やCloudflareスタックは、単機能で見ればそこそこ実用的になってきてるとは思う。 ただやはり細かいところを見ると粗があったり、チーム開発みたいなスケールで捉えるとちょっと頼りないというか、まだまだこれからに期待かなって。(特にPages君はもっと本気出していい)

その制約やクセをカバーできる腕力があるのであれば、普通に良い選択肢になる場面もあると思う。安いし。

感想など

2023もやっぱりSPA

本業でも、副業でも、あいも変わらず。

ただAPIを叩いて、それを画面に表示するだけの簡単なお仕事。 前工程から流れてきたUIとAPIでがんばってそのまま実装するより、仕様を精査しなおしてデザインも調整するほうが、みんなハッピーになれる・・・、そういうお仕事。

正直JSまわりで悩むことはほとんどなく、マークアップをどうすべきか問題と、案件ごとに変わるCSSの使い方(TailwindだったりCSSinJSだったり)に思いを馳せる仕事。

こっちの世界線にRSCやらServer Actionsやらが来るのは、一体何年先になることやらって感じ。 クラサバ分離な状態でもカオスなコードベースをよく見るので、あまり想像したくはないけど。(むしろ同居するほうが余計なレイヤー減って楽になったりする?いや、ないか)

まあ無理してSPAをやめる必要はないし、それが最適なアーキテクチャと判断した上での採用なので、それ自体は別によい。

むしろ最近よく考えてるのは、最初はSPAで良いと判断された管理画面とかでも、機能追加が重なるにつれてどうしても重くなっていくことにどう立ち向かうか。 URLによって、ページごとにチャンクを非同期ロードするのは当然やってるとして、それでも単一Page配下が重くなる問題をどうするか。

クラサバ(会社)分離の世界でRSCは使えないので、個別に一部のコンポーネントを非同期ロードするしかなく、そうなるとやはりQwik・・・ってなるけど、世界がまだ追いついてないよな〜〜。

Svelte 5への期待

SPA定番構成としては、APIからのデータ取得まわりをTanStack Queryに任せることになり、ただDOMを形成するテンプレ用途 + たまにUIインタラクションってのがUIフレームワークの仕事になってしまうけど、そうなるとほんとReact/Next.js|Remixを使いたい理由がない。(個人の感想です)

なので基本的にはSvelteで、パフォーマンスにシビアな要件がありそうならSolidって使いわけが、2023の個人的な選択だった。 Svelteやってるとコード量を減らしたくてsvelte/storeを使わないようになりがちだが、そうするとたまに道連れre-renderが発生して精神衛生が脅かされることがあるのよね。

そんなわけで、Svelte 5のRuneの書き味次第では、Solidの枠を奪うこともあるかも・・?乞うご期待って感じ。 にしても今のRuneのあれこれは、数年前のMobXで見たやつ感が半端ないので、同じ轍を踏まないようさっさといい感じに着地してほしい。

バックエンドは大変

今年は普段やらないバックエンドの設計に少し携わることがあって、それがまあ〜大変だった。 端的にはDB設計や、サービス全体の構成を決めるところ。

フロントエンドの実装に比べると、なんかあったときの影響範囲が圧倒的に違うので、ほんと素人がなんとなくで決めるもんじゃない・・・。(巷でやらかして話題になってる案件に初歩的なミスが多いのも、こういうことなんやろうとも思う)

便利なサービスがどれだけ増えようと、結局はそれを扱う人間のスキルが足りてないなら、本質的には何も変わらんということ。

できる人レビューのありがたさよ。

WeztermとNvim

iTerm2とVimから移住して1年が経つことになるけど、なんの不満もなくいい感じ。

https://github.com/leaysgur/dotfiles

せっかくVimを使ってるので、もう少し効率的なキー操作とかは体に染み込ませたいなとは思ってる今日このごろではあるけど、矢印キーはやめられそうにない・・・。

一瞬だけHelixを使おうとしてたけど、オールインワン路線ならVSCode Neovimで良いかなってなった。

Nvimの設定で今年一番よかった変更は、ディレクトリツリーを左ではなく右に出すようにしたこと。toggleしてもメインがガタガタしないのが良い!

ブログ移行

そういえばこのブログも、はてなブログから引っ越して、Astroで0から作り直したのであった。

GitHub Pagesにデプロイする関係上、CIで全ページを事前ビルドしてるけど、630ページくらいを生成するのに10秒くらいは待たされる。 めちゃめちゃ遅いってわけではないけど、AstroのIncremental Buildが実装されたら、ローカルで差分ビルドしつつ全コミットでもいいかもなとか。

Incremental Build RFC by natemoo-re · Pull Request #763 · withastro/roadmap https://github.com/withastro/roadmap/pull/763

AdventOfCode 2023とRust

今年もPart.1だけRustでやるチャレンジをやってた。

https://github.com/leaysgur/adventofcode-2023

基本文法はすぐ思い出せるけど、今年もアルゴリズム系がいまいちで、動的計画法!ダイクストラ!グラフ!3D!みたいなやつが解けなかった。 毎年年末になってコレで学び、1年かけて忘れるみたいなことを繰り返してる。

Rustの読み書きが多少できるのをもっと伸ばすべく、やっぱフロントエンド関連ツールリライトブームにあやかって、なんかやったほうがいい?

私生活など

👶だった👧も3歳になり、だんだんと人間味を帯びてきたなと。

おかげでいろんな振れ幅が大きくなってきてて、対応する大人側の精神修行みたいなシーンも出てきた。 ストレートに呼びかけてもダメなシーンで、いかにモチベートして目標を達成させるかみたいなの、人材育成にもつながるものがあると思う。

毎日めちゃめちゃ叱ってるけど、めちゃめちゃ笑ってるし、プライスレスってのはこういうことなんやろう。

2024年は

引き続き、一定のアウトプットは出しつつ、稼げるものは稼ぎつつ。

ただそろそろいい加減に、なんか真にやりたいことを見つけたい・・・。誰か会って話そうぜ!

というわけで、よいお年を。