これはなに。
Supership株式会社 Advent Calendar 2016 の22日目です。
15分で勤怠システムを作る方法
15分でタイムカード機能を作る方法。(15分はちょっと盛ってる。)
経緯
弊社採用のwebの勤怠管理システム、利用者側から見るとあんまりイケてないなー。操作が面倒。面倒すぎて、ちゃんと打刻した事ない。
そういや昔の (x68k) 某パソコンのコミュニティの合言葉が 「無い物は作る」 だったなー。某perlの壁のように偉大な人も言ってたなー。怠惰であれ。
よし、せめてタイムカードのパンチング部分だけでも作ろう!!!
名づけて、 PunchDrunker !!
ちなみに僕はアルコールを嗜みません。
そして、advent calenderだし、どうせやるなら15分という時間しばりで!!
取り敢えずざっと考える
とにかく15分で作る為に楽出来る処は楽する。
- いつも持ってるandroidで、会社近くにいる事を検知して、その領域に入った時、出た時に打刻する。
- 打刻時刻の最初と最後を取って、その日の出勤と退勤にする。
- 最近仕事で使ってる rails を使う。
- ログイン部分: oauthにおまかせ。
- 画面遷移: なんか変でもOK。
- 画面の装飾: 一切無し
- 動作環境: 貧乏人に優しい heroku
という事で、作っていみた。
ichiro.matsunaga@PC0190:~/vcswork/punch_drunker
[master]$ git log
commit c0d5e67dc17816af1c52a29d4539b5d059f62d94
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Wed Dec 21 00:56:55 2016 +0900
token認証通過させわすれてた
commit 89c3cef9b52f51ea428e403b592c9fe5b69fa7bb
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Wed Dec 21 00:31:42 2016 +0900
index.
commit 683f9dc8e57a8a10ef9fd8f41167782816903178
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Wed Dec 21 00:03:32 2016 +0900
punch一覧。
commit 2e899189e68c3c8456c27688c1472a4a588dfe1e
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Tue Dec 20 14:58:40 2016 +0900
punch 登録。
commit ae1137086f0f8e074e551bccd1aacb4a2b870063
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Tue Dec 20 01:30:01 2016 +0900
heroku接続確認。
commit ff3476cd566cb177452b7ac6cd04495ef41bd824
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Mon Dec 19 00:50:04 2016 +0900
regen punch_token.
commit 3f42b7308bbea3f9bf7f2fd8cd769719ef1f5045
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Mon Dec 19 00:21:34 2016 +0900
punch token.
commit 0b1cd296fc81712e63cbdefc37a483d345b9e372
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sun Dec 18 23:38:31 2016 +0900
login / logout / unauth check.
commit ed28ffe31564063776a181b480fc24b58c4dba6f
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sun Dec 18 22:05:59 2016 +0900
impliments oauth.
commit 7ee20c8d4f04bca7a0729f6c3085573988fd2098
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sat Dec 17 01:01:14 2016 +0900
heroku.
commit 2fed602d86b6c21fdd6ebe8ef3495812ff981173
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sat Dec 17 00:12:39 2016 +0900
generate sessions.
commit 2f02ab83dd2a6c98b70dac2dae634b5e7cc82d71
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Sat Dec 17 00:00:29 2016 +0900
generate punch
commit b5bed7145f0e96bd73285813185cd5a23466f633
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Fri Dec 16 23:48:02 2016 +0900
generate user.
commit 46c500b7b45cd092831fa9c63cd9847f5aea9450
Author: MATSUNAGA Ichiro <vikke.bsd@gmail.com>
Date: Fri Dec 16 00:30:51 2016 +0900
init.
...15分どころじゃないじゃないか。
いいわけすると、すごく最近急がしいのです。その合間を縫って作りました。
実質は30分くらいです。15分は厳しかったけど、30分では行けた。
はまったのも1箇所だけで、omniauthのcallbackurlを不用意に設定し、ちゃんっと値が帰らなかった時です。
セットアップ
- herokuにappを作り、add-onsでheroku-posgresを足しておく。
- pipelineとかは今回無視。
- googleのoauth認証を使っているので、 developer consoleの認証情報でtokenを発行する。
セットアップしてみる。
- おもむろに https://punch-drunker.herokuapp.com/ (僕の作ったインスタンスの場合) にアクセスする。
- googleでログインをクリック
- googleのアカウント選択が出てくるので、会社のアカウントを選択する(もちろん個人のアカウトを選んでも良い。但し、あたりまえだけど、oauthで認証しているので、googleで払い出されているアカウントに限る。)
- tokenをコピる
だれでも、上記インスタンスを使ってかまいません。が、一切の保証はしません。保持している個人情報はemailアドレスのみです。emailアドレスを個人情報屋に売りはしませんが、流出した場合の保証はしません。
つかってみる。
さて、サービスのセットアップは終わった。クライアントはどうするか。
android ユーザーの皆さんはTaskerを使いましょう。iPhoneは知らん。下記のurlをgetするだけなので、そういう事ができるツールがあればiPhoneでも出来ると思う。
Taskerには、電話のアンテナのidを見て、そのアンテナの範囲に入る/出るをトリガーにタスクを実行出来ます。そのタスクの中にはhttpの発行もあります。
よって、その機能を使いましょう。
Taskerのセットアップ
- Profile -> +ボタン -> State -> Phone -> CellNear を選択。
- Scanボタンを押して10分くらい放置する。社内をブラブラ歩くのもあり。(これで近くの携帯のアンテナのIDを取得する)
- 終わったらStopを押して、確定させる。
- 戻るとTaskとのひもづけをうながされるので、NewTaskを選ぶ。
- punchと名前を付ける。
- Task Editで+を押下して、Net -> HTTP Getを選び、Server:Portに、
https://punch-drunker.herokuapp.com/punches/tokentoketoketokentoekn
を入力する。 - Profilesに戻って、さっきのprofileを選択、緑の->punchを長押しすると、Add Exit Taskが出てくるのでここでも先程のpunch taskを選択する。
これによりアンテナのあるところに入った時、出た時にpunchを打つようになります。punch-drunkerは一覧で日付でgroup byしているので、最初と最後のエントリーを取り出すようになります。
出来るようになった事。
- 毎日の打刻時間のメモは、これで自動化された。
TODO
- Taskerに頼っている部分をnativeアプリ化して、iPhone/androidどれでも簡単に使えるようにする。
- 打刻した内容をPhantomJSとか使って社内の勤怠システムに自動入力するようにする。
- 表示対象年月の指定が出来ない。
- まー、これは、punchesをバッチで過去分を消してしまえば当月だけになるじゃん!! Heroku Postgresの無料分はrow数制約あるし。
- でもまだそのbatchは作ってない(遠い目l
まー、なんとかなるかな。
感想
- あらためて思うけど、 rails って強力。
スタートレック見ながら他の仕事しながらでも30分切る勢いで作れてしまう。 - とは言うものの、型が無いのは後程辛くなるのはわかってるので(経験済み)、他の言語でも作ってみたい。GoとかSwiftとか。
- 来年はNativeアプリの勉強をする年にする。