15分で勤怠システムをつくる方法

# これはなに。

[Supership株式会社 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/supership) の22日目です。

# 15分で勤怠システムを作る方法

15分でタイムカード機能を作る方法。(15分はちょっと盛ってる。)

# 経緯

弊社採用のwebの勤怠管理システム、利用者側から見るとあんまりイケてないなー。操作が面倒。面倒すぎて、ちゃんと打刻した事ない。
そういや昔の ~~(x68k)~~ 某パソコンのコミュニティの合言葉が **「無い物は作る」** だったなー。某perlの壁のように偉大な人も言ってたなー。怠惰であれ。

よし、せめてタイムカードのパンチング部分だけでも作ろう!!!

名づけて、 **PunchDrunker** !!
ちなみに僕はアルコールを嗜みません。

そして、advent calenderだし、どうせやるなら15分という時間しばりで!! 

# 取り敢えずざっと考える

とにかく15分で作る為に楽出来る処は楽する。

* いつも持ってるandroidで、会社近くにいる事を検知して、その領域に入った時、出た時に打刻する。
    * 打刻時刻の最初と最後を取って、その日の出勤と退勤にする。
* 最近仕事で使ってる rails を使う。
* ログイン部分: oauthにおまかせ。
* 画面遷移： なんか変でもOK。
* 画面の装飾: **一切無し** 
* 動作環境: 貧乏人に優しい heroku

# という事で、作っていみた。

https://github.com/vikke/punch-drunker

```
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を不用意に設定し、ちゃんっと値が帰らなかった時です。

# セットアップ

1. herokuにappを作り、add-onsでheroku-posgresを足しておく。
    * pipelineとかは今回無視。
1. googleのoauth認証を使っているので、 developer consoleの認証情報でtokenを発行する。
<img width="1248" alt="認証情報_-_My_First_Project.png" src="https://qiita-image-store.s3.amazonaws.com/0/7395/32be209c-dc04-9e48-2f48-50646a50d390.png">
1. consoleから取得されたCLIENT_IDとSECRET_IDをherokuのconfig_varsに設定する。
<img width="1248" alt="punch-drunker_·_Settings___Heroku.png" src="https://qiita-image-store.s3.amazonaws.com/0/7395/fe09fd75-dc3a-4bfc-275a-7024dc533d19.png">
1. git push heroku master
    * deploy
1. heroku run rails db:mimgrate

# セットアップしてみる。

1. おもむろに https://punch-drunker.herokuapp.com/ (僕の作ったインスタンスの場合) にアクセスする。
1. googleでログインをクリック
1. googleのアカウント選択が出てくるので、会社のアカウントを選択する(もちろん個人のアカウトを選んでも良い。但し、あたりまえだけど、oauthで認証しているので、googleで払い出されているアカウントに限る。)
1. tokenをコピる

 **だれでも、上記インスタンスを使ってかまいません。が、一切の保証はしません。保持している個人情報はemailアドレスのみです。emailアドレスを個人情報屋に売りはしませんが、流出した場合の保証はしません。**

# つかってみる。

さて、サービスのセットアップは終わった。クライアントはどうするか。
android ユーザーの皆さんはTaskerを使いましょう。iPhoneは知らん。下記のurlをgetするだけなので、そういう事ができるツールがあればiPhoneでも出来ると思う。

Taskerには、電話のアンテナのidを見て、そのアンテナの範囲に入る/出るをトリガーにタスクを実行出来ます。そのタスクの中にはhttpの発行もあります。

よって、その機能を使いましょう。

## Taskerのセットアップ

1. Profile -> +ボタン -> State -> Phone -> CellNear を選択。
    1. Scanボタンを押して10分くらい放置する。社内をブラブラ歩くのもあり。(これで近くの携帯のアンテナのIDを取得する)
    2. 終わったらStopを押して、確定させる。
1. 戻るとTaskとのひもづけをうながされるので、NewTaskを選ぶ。
    1. punchと名前を付ける。
1. Task Editで+を押下して、Net -> HTTP Getを選び、Server:Portに、 `https://punch-drunker.herokuapp.com/punches/tokentoketoketokentoekn` を入力する。
1. 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アプリの勉強をする年にする。