How it was made

所在表の作り方

研究室で各メンバーの所在を共有するために、Raspberry Pi 4、Flask、LINE APIを組み合わせました。

1
Raspberry Pi 4オンプレミスで自分の手元に置けるサーバ。
2
FlaskPythonでWebアプリを動かすためのフレームワーク。
3
LINE APILINEのメッセージ経由で更新。

方針

研究室では各メンバーの所在を学生居室の一枚のボードで管理していましたが、いじるのが面倒だったり、実験室に直接行くと変更できなかったり、問題がありました。 そこで、所在表をインターネット上に置いて、居室や実験室ではディスプレイに移す形で確認、各自のスマホから更新する形にしようと思いました。 高々30人しか使わないサービスならクラウドにする必要もないのでオンプレミスで動かしたいという気持ちがありました。 外部サービスに丸ごと預けるのではなく、手元のラズパイでWebサーバを立てて、 ネットワークやアプリの動きまで自分で見える状態にしたかったからです。

そのうえで、PythonでWebアプリを動かしてみたかったのでFlaskを選びました。

各自のスマホからサーバ上のファイルを変更することを考えたとき、まず簡単なのはWebブラウザから編集させる方法ですが、 これだと入力欄や認証、WebからのSQLインジェクション対策など考えることが増えてしまいます。 そこで、LINEのメッセージ経由で更新することにしました。slackやdiscordにもbotサービスはありましたが、LINEは研究室メンバーの利用率100%だったので。 LINEを使うことでユーザー認証をLINEに任せることができます。 LINE botは基本的には無料で、bot側から多くのメッセージを送ると有料になります。 ユーザーからはいくら送っても大丈夫なので更新はユーザーの任意のタイミングで送ることができます。

LINEでいちいちメッセージ送るのもめんどくさいなと思って、実験室にカードリーダーなりを置いてタッチするだけで所在表を更新しようかとも思いました。 PaSoRiで学生の持っているカードキーを認識するプログラムを作るところまではいきましたが、頓挫しました。 他の研究室と共有の実験室にカードリーダーを置くわけにもいかなかったので。

なぜこの構成にしたか

オンプレミスにしたい

ラズパイ4なら省電力で常時起動でき、サーバを自分の管理下に置けます。

Pythonで作りたい

Flaskを使うと、PythonだけでWebページ、API、CSV処理を素直につなげられます。

直接編集は怖い

サイト上で所在表を直接いじらせると、入力欄や認証、SQLインジェクション対策など考えることが増えます。

更新の流れ

ユーザーはLINEに部屋名を送ります。 FlaskアプリはLINEのWebhookを受け取り、登録済みユーザーかどうかを確認してからCSVを書き換えます。 サイト側はそのCSVを読み、所在表として表示するだけです。

LINEで送信 例: 自宅、会議室1、実験室1など、決めた場所名を送る。
Webhook受信 Flaskの `/callback` がLINEからのイベントを受け取る。
CSV更新 登録済みユーザーなら、`whereis.csv` の所在を更新する。
表として表示 `/table`がCSVを読み込んでHTML表にする。

これから

作りはしましたが、LINEでメッセージを送ってwebページが更新されるのを見ただけで満足してしまって、実運用はしていません。 それと単純に実験室に入るたびにLINEでメッセージを送るのは面倒だなと。 各自のスマホのMACアドレスを登録して、Wifiルーターに認識されたものを入室扱いにしたらいいかなと思っています。