メンバー: @H1rono_K @ikura-hamu @mehm8128 @itt @zer0-star
作ったもの
年賀状投稿サービス「postQard」を作成しました。
年賀状を作成して投稿日時と投稿先チャンネルを指定すると、自動でtraQ(部内SNS)に投稿してくれます。
年賀状作成画面
年賀状一覧
traQに投稿された年賀状
反省
フロントエンド
以下の技術スタックでした。
Next.js: app routerを使いました
fabric.js: お絵かき用。@mehm8128が過去のハッカソンで使ってちょっと慣れていたので今回も使いました
jotai: 状態管理。編集履歴の表示や、fabric.jsの諸々の処理で使いました
shadcn/ui: デザイナーがいなかったこともあって1からCSSを書くのは大変なので、ライブラリに頼りました。内部でtailwindが使われていて、importするのではなくてコピペして運用するタイプなので気に入らないところは自由にスタイルを変えられていいです。これを使ったことが理由で、他の箇所もスタイリングはtailwindを使いました
biome: 最近話題のあれです。prettierとeslintの代わりとなるもので、爆速でformat&lintしてくれます。気になっていたので使ってみましたが、stableなルールは特に問題なく使えたので、今後プラグインが使えるようになったりしてより便利になってくれるといいなと思いました
react hook form: フォームがあったので使いました
msw: モックサーバー。使おうと思っていたのですが、現状server componentで使えないことと途中まで認証が上手くいっていなかったことが理由で入れるだけ入れてほとんど使っていませんでした
バックエンド
技術選定:
- 使用言語: rust
- 非同期ランタイム: tokio
- Webフレームワーク: rocket
- DB: SeaORM
- S3: rust-s3
- cron: tokio-cron-scheduler
- その他たくさんのライブラリたち
SeaORM周りメリット・デメリット
- メリット
- @itt 型の恩恵を受けられる
- デメリット
- @itt 難しい
- ドキュメント読まないと
ActiveModel
,Column
,Entity
,Model
- @itt CLIでのentityの生成がびみょい
- relationを定義してから再生成を行うとrelationの部分も上書きされて消されるなど
- 生成をやめて手動でentity書いてた
- @itt 難しい
Rocket周りメリット・デメリット
- @H1rono_K ハンドラーが型引数を持てない
- DIがめちゃくちゃ面倒
- @H1rono_K Stateがコンパイル時に決まらない
- axumの
with_state
はコンパイル時に決まるのに...
- axumの
- @H1rono_K 検索で引っかかるのがv0.4 (最新はv0.5)
- @H1rono_K async_traitとその他マクロを多用するせいでrust-analyzerが死ぬ→VSCodeの体験が最悪!
- 設定をいじりなさい、はい...
- @H1rono_K CORSを自前で実装する必要がある
- @H1rono_K traitのライフタイム制約が不十分
- @H1rono_K
Outcome
型がよくない、?
のreturnができないFromResidual
の安定化がいつになるやら
- @H1rono_K ライブラリに乗り切れなかった感じがある
- async対応版Rocket、v0.5を試してみる - paild tech blog rocket_db_poolsでsqlxとの繋ぎこみができるんですねー
tokio-cron-scheduler周りメリット・デメリット
- @H1rono_K まあまあ、crontabの記法一回ミスった https://github.com/traP-jp/h23w_01-backend/commit/bc1a64d99f1e9fd7855636b4610b147de24c4740
- @H1rono_K Apalisなるものがあるらしい(使ってない) Writing Cronjobs in Rust
DI感想
- @H1rono_K 判断が遅かった(DB実装が予想以上に律速してしまった)
- @H1rono_K 最初からDIするつもりでやればよかった
- @H1rono_K rocketが予想以上にDIやりづらかった
- 慣れてないだけかも
- @H1rono_K Cake Pattern知らなかった(ここではやってない)
ほか
- @H1rono_K tracing入れたつもりないのにそれっぽいログ出た
その他
traP部員の認証にNeoShowcaseの認証を用いて、アクセスした人をNeoShowcase側で認証してくれるような設定にしたのですが、フロントエンドとバックエンドの間での認証がCORSやcookieの扱い周りなどで上手くいかず、Next.jsのapi routeを一度経由してバックエンドに渡すということをしてしまったので、そこをもうちょっときれいにできていたら開発効率やパフォーマンスの向上に繋がったと思います。
感想
@H1rono_K 筋肉が足りなかった。ハッカソンで触ったことのないライブラリに挑戦するのはもうやめたい。来年もrust書きたい
@mehm8128 認証周りもうちょっと詳しくならないとなと思いました。来年は多分いません
@ikura-hamu いつもはバックエンドを書いていますが、今回はフロントエンドに挑戦しました。難しい部分はめふもさんがやってくれました。普段と違うことができて楽しかったです。
@zer0-star 初めてRustでまともなアプリケーションを作りましたが、なんとかなって良かったです。来年はHaskellでなんかやります
@itt 今までwebサーバーをほとんど書いてこなかったので経験が積めてよかった。来年はzigかも