非エンジニア(鉄道乗務員)がアプリ作ってとお願いされ、インフラから作った話。
パソコンが得意と言ったらアプリを作らされました。インフラから…
その奮闘記です。
軽い自己紹介
普通科高卒 27歳
鉄道乗務員 (IT経験なし)
趣味 キャンプ カメラ パソコンを弄ること。
IT全般が好き
💻依頼されたアプリ
まずは依頼されたアプリですが、
鉄道乗務員は皆それぞれその日の担当の電車があり、その担当は番号で管理され割り振られています。
たとえば、1番の番号の人はその日の
6:53
9:35
12:07
の電車3本を担当します。
その番号は50個ほど存在しており、循環で日毎に回しています。
そこで依頼されたのが
担当乗務員が出発する時間を気軽に確認できるように、順番に表示される時間を表示されるアプリを作って欲しいと言うものでした。
頭を悩ませた制約
頭を悩ませたのはその制約です。
列挙するとこんな感じ↓
- セキュリティに気をつける。
- 1ヶ月で作る。
- お金をかけない。
上司から言われたのはこの三つです。
すごく軽く言われたのですが、
僕の頭ではこのように変換されました。
- ネットワーク無し。
- 2週間程度で作る。
- webアプリケーションで作る。
です。まったく違いますが説明させてください。
ネットワーク無し。
まずセキュリティに気をつける。がなぜネットワーク無しになるかの説明です。
鉄道会社はコンプラに厳しく、社内に引かれたネットワークから外部サービスは使えません。
勝手にWiFiを契約して繋げる方法もありますが、それもコンプラに引っかかるしお金がかかる為申請に時間がかかります。
と言うことで、
セキュリティに気をつける。
が、
ネットワーク無し。
に変換されました。
2週間程度で作る。
上司に言われたのは1ヶ月です。
それは社内で開催される事故防止に関するプレゼン大会で発表するためです。
それが1ヶ月後でした。
それはつまり1ヶ月後というタイムリミットは
アプリを作る時間❌
プレゼン資料を完成️✅
です。
ちなみにその資料を作るのは僕です。
つまり資料を作る時間を差し引くとアプリ開発にかけられる時間は2週間程度と判断しました。
webアプリとして作る。
上記の要求はお金を書けないこと。
それがなぜwebアプリとして作る。
に変換されるか?ですが、これが一番悩みました。
その真意は、事務所に放置されている古いパソコンとipadを使って。という意味です。
そして、置く場所が1箇所であればどちらかを使えば良かったのですが、2箇所に起きたいとのことで、違うデバイス間で同じアプリを使う方法を私はwebアプリ以外に思いつきませんでした。
どのように突破したか?
以前TCP/IPの本をサラッと読んだことがあり、
何となくネットワークについての知識もあったので、ラズベリーパイで完全ローカルのネットワークを作ってみました。
しかし、ラズベリーパイは料金が高いため、より安価なesp32を使いました。
構成はesp32を3台で
- ルーター
- webサーバー
- apiサーバー兼データベース
にしました。
3台に分けた理由は負荷を分散するためと保守性を良くする為です。
アプリケーションは最近ハマっていたのと、少しでも自分の糧にするためにNext.jsでSSG出力をしてそのままwebサーバーに入れました。
時間もなかったため、ほとんどclaudecodeで書かせています。
動けばいいやの精神なのでコードはかなりグチャグチャです。
claudecodeへの指示
構成が決まったので、あとはコードを書くだけです。
esp32はC++で書きますが、C++は読む事は出来るにせよ、書くのはあまり出来ません。
なので、最初からClaudeに書いてもらいました。
指示は主に
ルーター
ルーターのコードを書いてください。
固定ipを使う予定なので、
DHCPは50から割り振ってください。
webサーバー
Next.jsSSGで出力した静的webサイトを配信するwebサーバーを作ってください。
固定ipを付けてください
apiサーバー
アプリの説明
データベースの説明とファイルシステムを使ってデータベースを作ってください。
固定ipを付けてください。
こんな感じです。
動かしてみたところ、esp32を電源に刺した順番によって動かなくなることがありました。
コードを調べたところesp32のライブラリにDHCPの範囲を50からとする機能は無かったようで、固定ipの範囲を50からに移動させ、DHCPは自動で割り振るように変えました。
アプリの開発📱
インフラの構築ができた所で、アプリの開発に取り掛かりました。
保守性を高めるためにフレームワークを使いたかったのですが、
reactだとSPAで、ブラウザ側の負荷が多くなりそうでした。
そこで、Next.jsのSSGならjsバンドルは必要な部分のみにしてくれるので最適であろうと思い選択しました。
apiをesp32内にC++で書いたため、開発でapiに通信ができませんでした。
そこでClaudeにこのapiをJavaScriptに変換して。と指示し、開発用のapiを作成しました。
開発用と本番用でenvを用意し、スムーズな開発に成功しました。
あとは古いパソコンにWiFiの子機をつけ、初めてのCDからのドライバインスールを経験し、Chromeの古いバージョンをダウンロードしてきてインストールし、完成です。
開発にgithubを使っていないため、現在アップしていません。
GitHubにアップしたらこちらにリンクを載せたいと思います。
結び🪢
長くなってしまいましたが、無理難題を解決する過程で沢山の学びがありました。
現在安定稼働できており、AIの力も思い知りました。
今回技術的な話と言うより個人的な感想でした。また気が向いたら詳しい技術を別記事で書きたいです。
もしここまで読んでいただけたら凄く嬉しいです。ありがとうございました。
Discussion