ググると結構他の会社さんもやってたりするのですが、今働いている会社でもやってみたいなーと思ったので初期段階の半年前ぐらいから導入してみましたというお話。
Wifi打刻とは
個人のスマホなどが会社の Wifi に接続されたことを検知して打刻として記録します。打刻忘れで注意したり修正・承認したりとかそういうことに使う非生産的な時間と精神の消耗を抑えられるのが良いです(そもそも忘れんなというのはごもっともなんですが…)。
基本的な仕組みは、 ARP と呼ばれるプロトコルを利用して Wifi に繋がっている Mac アドレスを取得し、事前登録した名簿と突合させます。
実装
ARP をスキャンする部分とそれを集計して表示する部分に分かれて 2 人で本業の片手間に作りました。
ARP Scan
TCP/IP と比べるとそれほど有名ではないですが、ルーターが直接繋がった機器と通信するためにいつもお世話になっているプロトコルです (RFC 826)。「この IP 誰?」「ワイやで (MAC アドレスを返す)」という感じです。
シェルスクリプトで作ったりすると簡単ですが、人数によっては細かい調整が必要かなとか Windows でも動かしたいとかあると思い Go で Daemon として実装しました。 github.com/google/gopacket を利用して、 Scan 結果を Web API に投げます。
コマンドで実装する方法と比べて良いのは、 ARP を常に Read したままにできることと Write の頻度を調整できるあたりです。
examples/arpscan
の readARP
を継続したまま、適当な頻度で writeARP
を呼び出します。このとき、おそらく writeARP
の頻度が高すぎると、スマホ側の応答回数も増えて電池の消費やネットワークの品質に関わってくるはずです。ある程度調整した結果、皆が出社してくる辺りだけ 10 秒間隔にして、それ以外は 1 分ごとにしました。
ただ、 /16より大きいネットワークは制限されているので、ここだけは組織が大きくなってきたときにちょっと注意が必要です。そもそもそんなサブネットに皆が直接つなぐ運用するのかという話ではありますが。
UI/Chat bot
こちらはもう一人別の方の成果なのですが、 Firebase を GSuite のドメインで絞って (参考:[Firestore] Google認証で特定のドメインのユーザーだけアクセスを許可する) 作っています。
スキャン結果がアップロードされるとすぐに画面が更新されるので、確認するともう打刻されてる!って感じがとても気持ち良いです。
Chat bot は Scan されなかった通知や直行・直帰などで関わってきます。こちらも内輪ネタを軽く含みつつ親しみやすいように作られていて快適です。
運用
共有の端末にスキャンする Daemon を仕込んで動かしています。
複数拠点対応
ローミングできるように SSID や暗号化方式等を合わせて Wifi を組むことで、普段とは別な拠点に出社した場合でも自動で Wifi に繋がって打刻までされるという状況が出来上がりました。
Daemon の配置も Go で作るとバイナリを配置するだけなので楽です。 また、(結局はやらなかったのですが) Npcap を使えばライセンスの制限内なら Windows 機でもいけるようです。
サポート
導入の段階では何度か人事・労務の方々と調整して疑問を解消したり小さい改善をしたりしてしていました。特に Mac アドレスの表示方法は iPhone, Android 両方の画像を用意するのが良いと思います。また、システムに関わる質問等は Slack で勤怠関連のチャンネルと混ざると苦しいので、 Wifi 打刻システム専用のチャンネルに分ける方が良いです(といっても最近は 1 ヶ月に 1 件あるか無いかぐらいですが)。
発生したトラブル
50 人程度を超えたあたりでルーターの限界が来るようになって、スキャンしている端末の方が Wifi から切断されるようになってしまいました。早めに来た方に Wifi を繋ぎ直してもらって回避しつつ、結局はネットワークの増強で解決したのですが、本当はスキャンする側で一旦 SQLite とかで保存して繋がったら同期するとかがスマートなんだと思います。
他社さんの事例
まとめ
ビットキーでは独自の打刻方法を導入しているんですけど、これはあるエンジニアが構想含め0から作っているものなんです。今では日々の勤怠において欠かせないものになっています。こういった開発は事業にダイレクトに影響する訳ではないですしもちろん売上に貢献するということもないですが、会社として時間を投資することを認めているし重んじているんです。テクノロジードリブンな文化がエンジニアとしては素直に嬉しいですし面白いですね。
- 打刻そのものの手間はもちろん、打刻忘れから発生する色々な消耗が減ります
- Go で ARP を扱うと、結構細かい調整までできます
- ローミングと合わせて構築すると、拠点が増えても快適です
- ルーターの負荷にはお気をつけください
- 人事・労務の方とも連携しましょう