RustでGyazoクローンを作った

RustでGyazoのサーバ側と同じ機能を有するRyazoを作りました。リポジトリはここです。
https://github.com/ota42y/ryazo

オリジナルのGyazoと比べてDBにSQLiteを使っているところが若干違いがあります。

使い方

サーバを立てる

docker hub にpushしてあるので、pullするだけで使えます。
ただし、DBファイルを先に作る必要があります。

mkdir data
cargo install diesel_cli --no-default-features --features sqlite
export DATABASE_URL=./data/ryazo.db
diesel setup
docker run -v `pwd`/data:/app/data -p 8888:8888 -e SERVER_ADDRESS=localhost:8888 -e BIND_ADDRESS=0.0.0.0:8888 -e SAVE_FOLDER=/app/data -e DATABASE_URL=/app/data/ryazo.db -it ota42y/ryazo  /app/ryazo

Gyazoのアプリをビルドする

今回作ったのはサーバ側だけなので、アップロードするアプリはありません。
Gyazoのアプリをcloneして向き先をサーバに変えます

git clone https://github.com/gyazo/Gyazo.git
# open ./Gyazo/script
# change HOST (line 50) to your ryazo host.
# if you change port, change 80 (line 72) to your port
# build by xcode

オリジナルとの相違点

DBがSQLite

オリジナルのgyazoはSDBMを使っていますが、こちらはSQLiteを使っています。
とはいえ、使う上で気にするほどの違いはありません。

gyazo.comとは非互換

gyazo.comは公開されているGyazoとは大きく仕様が違います。
そのため、公開されているGyazoをクローンしたRyazoもその影響を受けます。

  • 画像ページを挟むか挟まないか

    • Gyazoはアップロードすると画像のURLをクリップボードに入れる
    • gyazo.comは画像を表示するwebページのURLを入れる
      • webページなのでgyazo.comの便利機能が使える
      • 画像直リンクだとほかの様々な機能を入れられない
  • リサイズに未対応

    • gyazo.com/HASH/thumb/1000 とかでリサイズ後の画像を得られる
      • scrapboxはこれを使って表示しているみたい
      • 1000より小さかったらリサイズしない的なのがありそう

と、プリミティブな機能しかサポートしていないため、gyazo.comとはだいぶできることに差があります。

今後やりたいこと

  • webページ対応
    • 機能は全くなくてよさそう
    • 後々正式版のgyazo.comに置き換えた時に非互換になると困るので
  • リサイズ対応
  • エラー対応
  • テスト
  • 画像をS3にアップロード
  • データベースのmysql対応

rustの感想

よかったところ

  • ライブラリが複雑なデータ構造を返してきても理解しやすい
  • 型を間違って処理しようとしてもエラーになってくれる
  • エラー処理が怪しいところに警告を出してくれる
  • エラー処理を棚上げできる
    • 処理しなくても実行できる
    • 警告が出ているので後から見つけられる

つらかったところ

  • stringの扱い
    • to_string()面倒
    • rustに慣れていないせいな気もする
  • テストしにくい
    • ライブラリのパラメータを手元で作るの困難
    • このテストではこの値だけしか使わないから作りたいけど無理みたいなのがある
    • テスト力が上がれば解決する?

つらいところはrust力が上がれば改善が見込めるので、現状はとても良いのではといったイメージです。