Upgrade to Pro — share decks privately, control downloads, hide ads and more …

シャッフルランチシステムを刷新してみた話

 シャッフルランチシステムを刷新してみた話

個人開発で社内で使用するシャッフルランチシステムをリメイクした話
言語は Go で、GIN や GROM といったサードパーティ製のフレームワーク等を取り入れてみた感想を記載しています

RyotaNakaya

May 28, 2020
Tweet

More Decks by RyotaNakaya

Other Decks in Technology

Transcript

  1. シャッフルランチシステムを
    刷新してみた話
    ~個人開発~
    nakaya ryota
    2020/05/28

    View full-size slide

  2. 自己紹介
    ギフティ入社:2019年1月
    所属:CC Div. PU2(SBJチーム)
    前職:バックオフィス系システムのパッケージベンダー
    最近は Ruby より Go 書いてる
    犬より猫が好き
    キノコよりタケノコ派

    View full-size slide

  3. シャッフルランチってあるじゃないですか

    View full-size slide

  4. 運用
    ・太古の時代
      → 温もりのある手運用
    ・令和の時代
      → 一応シャッフルして対象を抽出する部分はシステムで自動化

    View full-size slide

  5. 自動化の経緯
    (旧イベ班スーパーエンジニア
    )
    システム化したよ!
    (自分)
    おお
    エンドポイントが二つあって、curlすれば
    (嫌な予感が...)
    人の追加とシャッフルだけはできるよ!
    hai

    View full-size slide

  6. つらみ
    ● 登録されている人の一覧がわからん
    ○ 毎月社員が増えるけど、誰まで追加したっけ ...みたいな
    ● 登録した人の編集、削除ができん
    ○ 当然辞めちゃう人もいるわけで ...
    ● 立松AWSにロックイン
    ○ 立松AWSのsandbox環境で lambda と DynamoDB が動いている状態
    ○ →DBメンテしたいときは立松 API(本人)を叩くしかない現状
    ● (...ぶっちゃけ1ヶ月に一回しか使わないし、別にいいんだけど )

    View full-size slide

  7. 画面作るか
    (Go のテンプレートエンジンの勉強がてら)
    (ついでにデータモデリングも見直す)

    View full-size slide

  8. 使用技術
    Gin
    (Web Application Framework)
    GORM
    (ORM)

    View full-size slide

  9. What is Go?
    ● 2009年にGoogleが開発した静的型付けプログラミング言語
    ● 「軽量・高速・シンプル」
    ● executableが作れる
    ○ クロスコンパイル可能で、実行速度が高速
    ○ JVMとかインタプリタといったランタイムが必要ないのでデプロイが楽
    ● 統一された記法
    ○ 継承、Generics、例外機構などはない(例外機構はあるにはある)
    ● 標準ライブラリが整備されていて、無駄にFW等入れなくても動く
    ● 国内外だとNetflix、Docker、twitter などが導入
    ● 国内だとメルカリ、Freee、クックパッド
    ● https://go.dev/
    gopherくん

    View full-size slide

  10. データモデル

    View full-size slide

  11. 画面(トップ)

    View full-size slide

  12. 画面(プロジェクトトップ)

    View full-size slide

  13. 画面(メンバー一覧)

    View full-size slide

  14. 画面(タグ一覧)

    View full-size slide

  15. 画面(シャッフル画面)

    View full-size slide

  16. ● Go の標準の html/template ライブラリ
    ● ソースコードとテンプレートを読み込んでHTMLを表示
    ● 基本的なことはできるが、基本的なことしかできない
    ○ 条件分岐(if)やループ(range)は可能
    ○ 四則演算はできない
    ● 一応、ファンクションを渡すことができる
    ○ 複雑なことをやりたい場合は独自関数をサーバー側で定義して明示的に渡す
    ● ディレクトリでネームスペース切れない
    ○ 同名のtemplateファイルがあるときに一番最後に読み込んだファイルが認識される
    ○ 同名ファイルを作りたい場合、いちいちファイルごとにdefineしないといけない
    ● テンプレートファイルを実行バイナリにビルドするのが面倒臭い
    ○ シングルバイナリに含めるならそれ用のライブラリ入れてコンパイルしないといけない
    Go のテンプレートエンジンについて

    View full-size slide

  17. ● フルスタックで軽量なWebフレームワーク
    ● 今回はルーティングとレスポンス部分のみ使用
    ○ これだけなら組み込みの net/http パッケージ
    で全然事足りる
    ● ミドルウェアを挟むことができる
    ○ rackと同じイメージ
    ■ 認証挟んだり
    ■ in/out のロギングしたり
    ● リクエストパラメータの取り扱い
    ○ デフォルト値設定したり
    ○ カスタムバリデータの差し込み
    ● クッキーの管理
    ● 他にも色々できるすげーヤツ
    Gin について

    View full-size slide

  18. ● Go 界隈では defacto standard になりつつある ORM
    ● MySQL/PostgreSQL/sqlite/SQLServerに対応している
    ● ActiveRecordに雰囲気かなり近い
    ○ gorm Model(構造体)を中心にデータ操作を行う
    ○ データベースへの操作はそのモデルを介して行う
    ● 1対1から多対多までアソシエーションできる
    GORM について

    View full-size slide

  19. GORM について
    ● メソッドチェーンでクエリビルドできる
    ○ 以下の例だと、プロジェクトIDの指定とタグのプリロードを行なってから、Findでクエリ実行
    ● 生SQLを実行することもできるっちゃできる
    ● ORM記法を覚える手間はやはりあるが、ARに馴染みがあればまあまあ楽
    ● マイグレーションが貧弱なので、長期運用するなら別のツールが必要
    ● 一周回って、生SQL書いた方が楽じゃね?という悟りを得た人は sqlx などの薄いラッパーを使う方がオススメ

    View full-size slide

  20. 雑感
    ● 基本的なCRUDとシャッフルロジックがちょうど良い勉強になった
    ○ シャッフルのロジック書くのはダルかった ...
    ● Go でも簡単なビューを実装できるぞ
    ● rails のようなフルパッケージではないので、使いたいものを適宜取り入れて開発できる
    ● 今回ぐらい小さくて単純なプロジェクトだと rails で作った方がやっぱり早そう感
    ○ scaffold でパパッと
    ○ 慣れの問題かもしれない ...
    ● ホスティング考えてないけど、 edmond と同じで、社内のマシンローカルでいいかなあ ...
    ● 今回のソースコード https://github.com/RyotaNakaya/shuffle-members

    View full-size slide

  21. Thank you for listening.

    View full-size slide