ImGrate
Image Gallery immediately rated by favorites or comments
その名の通り、お気に入りとコメントで即座に評価される画像ギャラリー
シンプルだからimmediateと付けたという建前にしている
実情はサービス名の "Im" 部分に合わせただけ
ImaGe + Gallery + IMmediately + RATEdみたいなノリで命名
ChatGPTにどういう名前がいいか相談したけど、あんまり良いのが出てこなかったので自分で考えた
@Watasuke102: ちまちま作っていた画像の閲覧・評価サービスこと ImGrate 、完成に近づいてきた気がする もうちょっと早く完成させられると思ったけど、そんなことはなかった
https://pbs.twimg.com/media/FxrWwqlaUAEnO08.jpghttps://pbs.twimg.com/media/FxrW1y7aYAADtrG.jpg
身内に大量の画像を見てもらってコメントとかランキング付けをしてほしいと思う機会があったので開発
類似サービスくらい探せばいくらでも見つかっただろうけど、フロントエンドのプロジェクトを立ち上げるチャンスを逃すわけにはいかなかった
技術選定
フロントエンド
Next.js
話題のAppディレクトリやTurbopackを触ってみたかった
前者はChakra UIが対応してなくて駄目だった
後者は、最初Chakra UI導入前に導入したvanilla-extractとの兼ね合いで駄目だった気がする
つまり今やろうと思えば出来るのでは?
Chakra UI
最近よく名前を聞く(気がする)コンポーネントライブラリ
そもそもコンポーネントライブラリというものを使ってみたかった
ロジック部分を特に書かないでもModalとかToastとかを使えてとても良かった
それはそれとして、デザインシステムの複雑さみたいなものや、コンポーネントライブラリのくせにHookまで用意している巨大さは本当に少し若干ちょっとだけ微妙に気になった
次はヘッドレスなライブラリにしたい
Scaffdog
watasuke.netなど既存プロジェクトにおいて、絶対導入したほうが楽になるんだよなあ~~~と思いながらずっと導入を見送っていたScaffoldingを試したかった 体感かなり良かったのでいつか入れる
CSSを書いていないせいか、フロントエンドはだいぶ軽いような印象がありますね
バックエンド
Golang
「RustはWebバックエンドには重すぎる」という話をTwitterで聞いたことがある
もちろん実行速度的な重さではない
バックエンドを書く時に所有権を意識しなきゃいけないのはちょっとつらい、GCあり言語で書いたほうがコストが低くて良い、みたいな主張だったはず
セマンティクス?と言って良いのだろうか
Webバックエンドでモダンな言語といえばGolangかな~という偏見があった
Twitterでも全人類が書いているため、一度試してみたかった
よく揶揄されがちという印象があった if err != nil だらけ問題についてはさほど気にならなかった
全体的に書きやすいという印象を受けたけど、気になる点もないわけではなかった
調べたところ、Golangはヒープに確保するか否かをいい感じに決めてくれるらしく、それ故にこういうことが出来るらしい(たぶん)
今までCやらRustやらしか触ってこなかった故の感想であって、別にGoが悪いわけではないと思うけど……
僕の書き方が悪いだけかもしれない
GraphQL
いつか触ってみたいなあと思っていたもの
Gatsby.js(というよりwatasuke.net)で使っている時、「GraphQLってfilterとか使えて便利だなあ」と思っており、今回ユーザー名でfilterをかける等の使い方を考えていたので採用した ちなみにこれは間違いで、Gatsbyが生やしてくれていただけだった
この「filterはGraphQLが勝手に実装してくれるもの」という勘違いを元に採用したものの、最終的にはこのプロジェクトには巨大すぎたなあと思った
普通にREST APIで良かったと思います
ただし、Goのgqlgen・Node.jsのgraphql-codegenは非常に良かった
データ型を schema.graphql で管理し、それらを使ったquery / mutationを documents.graphql で管理
これらのライブラリを用いてコードを自動生成する
特に後者は、面倒なAPI処理の諸々を省略できてかなり良かった
SQLite
ファイルひとつでデータベースを管理できるのが良さそうだとずっと思っていた
一瞬だけNoSQLを触ってみたいかもという理由でMongoDBに手を伸ばしかけたけどやめた
感想
GolangとChakra UIに関してはかなり印象が良かったし、今後も書く必要があるなら喜んで書くけど、新しいプロジェクトを立ち上げる時に自ら率先して導入しようとは思わないかなというのが結論
ScaffdogとGraphQLはかなり良かった
TAGether ではバックエンドを薄くしすぎてしまったという後悔があり、それをある程度は活かすことが出来たのではないかと思っている と思ったけどフロントエンドでもちょっと色々させてしまった
今回も結局フェッチライブラリ(というよりSWR)に手を出せなかったのが少し心残り
SWRを使わなかったのは、別にミューテーションとか再検証とか使わないだろうし……と思ったのと、graphql-requestとの組み合わせ方がいまいち分からなかったから
結局ミューテーションみたいなものを自前で実装したので、普通に採用しとけば良かった
今度こそ採用したい
今度っていつ……
当時は1日で終わるだろうと思っていた
こんなツイートもしている
結局終わらず、土日は全て開発に費やす事になった
GraphQL(というよりgqlgen)まわりで躓いてしまったのが原因だと思っている
おおよそこれのせいで、テスト本番においてそれほど難しくない積分を解くことが出来なかった
教科書に類題があったはずだから、それをやっておけばよかったのに
そもそも前日にテスト範囲1周をちょうど終わらせるレベルで時間がなくてつらかった
しかもアイデア(?)を思いついてから開発を始めるまで数日しか空いておらず、設計や要件(そもそも何がしたくて何が欲しいのか)についてあまり考えることなく始めてしまったのは失敗だった
データベースの構造も幾度となく変更された
設計はだいじだなあとあらためておもいました