実家の八百屋のためにRailsアプリを作った話
はじめに
こんにちは、higasunです。
普段は東京でソフトウェアエンジニアとして働いています。
今回は、実家の八百屋のためにRailsでアプリケーションを作った時の話をします。
「八百屋」と言っても、もう店先で青果を売るような業態ではなくなり、今は飲食店や施設への青果の配達を主に行っています。
下の画像のようなアプリを、研究や仕事の合間で開発して、2,3ヶ月ほどで現場に導入しました。
2025年1月の現在では、このアプリで1人あたり毎日30分程度の業務時間の短縮ができています。
背景
開発を始めたのは1年ほど前です。当時、自分は大学院で機械学習の応用研究をしており、実験用にPythonでプログラムを書いたり、Vueで簡単なアプリを作ったりしていました。
ある時、帰省した際に実家の業務をあらためて眺めていると、アナログな部分がたくさんあるのに気づきました。例えば、納品先からFAXで届いた発注書を見て、仕入れる品物の数量を紙に転記して集計していました。
それを見て、「自分がプログラムを書けば、もっと業務が楽になるだろうな。というか、自分がやるしかない」と思い、アプリ開発を決意しました。
開発の流れ
自動化する業務の洗い出し
まず最初にやったのは、「どの業務をアプリケーションで自動化すべきか」という選択です。
自分は実家の手伝いをしていたこともあったので、大幅に効率化できそうな業務が大体わかっていました。それが、「仕入れの数量の入力・集計」です。
実家では、次のように作業を進めていました。
- 従業員は自分の担当の納品先からの発注書を確認して、仕入れたい品物の数量を紙に記入する
- 品物ごとの仕入れ数量を集計し、発注をかける
この一連の業務を、バインダーに挟んだ紙を使って入力・集計しており、特に時間がかかっていました。
ここをアプリで自動化することで、
- 従業員はそれぞれのスマホから数量を入力し、
- 集計担当の従業員はPCから既に集計された数量を閲覧する
という流れで、スムーズに発注をかけることができそうだと考えました。
設計と実装
まずは、現場の方と話し合いながら要件をまとめていきました。
ある程度要件がまとまると、必要なデータが洗い出せるので、そこからテーブル設計を行いました。
例えば、商品や納品先の情報、従業員の方の情報と担当の納品先の紐付けなど、業務における登場人物とその関係性を素朴にモデル化すれば、ここは問題なくクリアできました。
テーブル設計は以下の本を参考にしました。
後でも紹介しますが、フレームワークにRailsを使ったので、テーブル設計ができてしまえば、あとは素直に実装できました。できるだけフレームワークに逆らわないように設計と実装を行うことで、公式ドキュメントや過去のブログの知見をフル活用しました。
気合でデータ入力
アプリができても、肝心のデータがDBにないと何にもなりません。
もともと紙で管理されていた商品情報を、全てデジタルに移す作業が必要です。数千行のデータを全てデジタル化してDBに投入しました。
大変ではあったのですが、iPhoneのOCRで文字起こしをしたり、商品名の揺れをGPTに直してもらったり、工夫して効率よく入力するのが楽しいと思える部分もありました。
できたもの
従業員の方は、それぞれのスマホから下のように数量を入力していきます。
集計担当の方は集計ページを見れば、品目ごとに必要な仕入れの数量が分かります。発注したらその品目にチェックを入れてもらい、重複が起こらないようにしています。
他の機能
上で紹介した機能を最初の2,3ヶ月で作ってリリースした後、
- 商品の原価や単価の管理
- 打刻などの勤怠を管理する機能
というような機能を次の2、3ヶ月で追加しました。現場の方々にインタビューして、どの業務の優先度が高いのかを伺い、実装コストも考えつつ、追加する機能を選んでいきました。
使用した技術
フレームワーク
フレームワークはRuby on Railsを使いました。理由としては、当時参加していた内定者インターンでRailsが使われていたからです。
ちゃんとしたWebアプリを作ったことがなかった自分にとって、とっつきやすいフレームワークでした。
特に、開発する中でRuby on Railsガイドを読み込んだのは、Web開発の基本を学ぶ良い機会になったと思っています。
フロントエンド
Rails 7から標準搭載されたHotwireという技術に乗っかってフロントエンド周りを作りました。
スタイリング
Tailwindcssを使いました。PCとスマホの両方から使うことを想定していたので、ある程度レスポンシブになるようにスタイリングしました。
Railsの場合は、rails new
する時に、tailwindを指定するか、後からでもtailwindcss-rails
というgemを入れれば導入できます。
インフラ
こちらも内定先がGoogle Cloudを使っていたので、勉強のためにGoogle Cloudにデプロイしました。
RailsアプリケーションはCloud Runに置き、RDBはCloud SQLを使った単純な構成にしました。
こんな感じの構成です。
費用はできるだけ抑えたかったので、Cloud Runの最小インスタンス数を夜間は0にしています。日中は最小インスタンス数を1にしてコールドスタートを抑えています。
Cloud SQLもdb-f1-micro
の最も安い構成にしています。
これで、1ヶ月あたり2,000円ちょっとで運用できています。
テスト
基本的に、MVCのModelとControllerについてRSpecでテストを書きました。
Viewに関しては自分で動作確認するようにしました。
CI/CD
本当はGitHub Actionsを使って、テストが通ればdockerイメージをビルドして...とやりたいところですが、自分1人の開発ですし、何より早く現場に導入することが目標でもあったので、作り込みませんでした。
ローカルでテストを行い、通ればCloud BuildでDBのマイグレーション、イメージのビルドとプッシュを行います。Cloud Runのリビジョンはgcloud
コマンドで作成しています。
IP制限
基本的には、八百屋からのアクセスに限定したいので、IP制限をかけました。
今回の構成では、コストカットのためにCloud Load Balancingなどは置いていないので、RailsアプリケーションにIP制限を実装しました。
RailsアプリでIP制限をかける場合は、信頼できるプロキシのIPを設定しておかないと、remote_ipで取得できるクライアントのIPアドレスが偽装される可能性があります。
以下のサイトが参考になるので、気になる方はご覧ください。
お世話になったZennの記事たち
このアプリを作るにあたって、たくさんのZennの記事に助けてもらいました。
特にお世話になった記事を挙げておきます。
この場を借りて著者の方々に感謝の気持ちを示しておきたいと思います。🙇🏻♂️
伸び悩んでいる3年目Webエンジニアのための、Python Webアプリケーション自作入門
PythonでWebフレームワークを自作する記事です。
この記事で簡単なHTTPサーバーを作ることで、フレームワークの骨子をなんとなく掴むことができました。
元々Pythonしか触っていなかった自分が、未経験のWebフレームワークをすんなり受け入れることができたのは、この記事のおかげです。
猫でもわかるHotwire入門 Turbo編
Rails 7からデフォルトで導入されたHotWireという技術についてまとめられている記事です。
本当にお世話になった記事です。
自分のアプリでも、HotWireを利用して、インクリメンタルサーチ機能を作ったり、インラインの編集機能を作ったりしました。
おわりに
今振り返ると、もっとこうすれば良かったなと思えるところがたくさんあるのですが、現場の方、ひいては家族から「仕事がラクになっている」という声が聞けるのは、開発の純粋な楽しさを感じられる良い経験になりました。
皆様も機会があれば、ご家族や身の回りの方のためにアプリを作ってみてはいかがでしょうか。
紹介
個人のブログもやっております。英語版の記事や、自分の経歴なども載せていますので、よければご覧ください。
Discussion