pebbleを使ってエレベータからタイムカードを押すシステム

- 他ブログからの移行、昔の記事です。
- 今はなき[pebble watch](https://www.kickstarter.com/projects/getpebble/pebble-2-time-2-and-core-an-entirely-new-3g-ultra)というスマートウォッチが好きでした。
- 誰でもアプリを自作できる環境があったため、一部のユーザに熱く愛されていましたが2017年にFitbitに買収され消滅。
- だがしかし！有志の皆様が[Rebble](http://rebble.io/)という形でOS開発を継続していて、一応まだ使えます（自分はもう使ってないですが...）

---

どうも、しゅーいっちです。

はっきり言って自分の環境でしか使えないやり方なんですが、うまく動いて嬉しかったのでその方法です。

##状況
- 勤怠管理のサイトを開くのに２分位かかる
- 自分は常にギリギリに来るやつ
- 社外ネットワークからクリックするとわかるようになっている
- リモートデスクトップは繋がらないようになっている

##mechanizeでタイムカードをクリックする

まずはクリックする部分です。社外ネットワークだとバレるので、職場の自分の端末にクリックするスクリプトを入れておきます。

ブラウザの挙動を自動化するmechanizeというgemを使いました。
[mechanize](https://github.com/sparklemotion/mechanize)

所定のURLにアクセスして所定のフォームを選んだりパスワードを入力したりしてクリック、さらに移動して所定のボタンをクリック、のように連続して記述していきます。

退勤時にも使っているので出勤と退勤の切り分けしてますが、そこは今回の話とは直接関係ないです。でも消すのが面倒だったのでそのまま残してます。

サイトが遅いので、出勤してこれを走らせるだけでもかなり時間の節約なります。2分が8秒くらいになります。

```click.rb
require "mechanize"
 
def stamp_time_card(mode="s_go")
  agent = Mechanize.new
  agent.user_agent_alias = 'Mac FireFox'
 
  # select your section
  page = agent.get("ログインURL")
  form = page.form("form2")
  form.field_with(:name => "lgid").option_with(:value => "XX").click
 
  # load uid options and submit
  uid_page = form.submit( form.button_with(:name => "s_change") )
  uid_form = uid_page.form("form2")
  uid_form.field_with(:name => "uid").option_with(:value => "XX").click
  uid_form.field_with(:name => "_word").value = "XXXXXXXXXX"
  agent.submit(uid_form)
 
  # move to timecard url and click btn
  time_card_page = agent.get("つぎのページのURL")
  time_card_form = time_card_page.form("_form")
 
  # taikin or shukkin
  if mode == "s_leave"
    puts "Are you sure you taikin?"
    puts "[Y/n]"
    if gets.chomp == "Y"
      time_card_form.submit( time_card_form.button_with(:name => mode) )
    else
      puts "so bad... keep working!"
    end
  else
    time_card_form.submit( time_card_form.button_with(:name => mode) )
  end
end
```

##メールをトリガーにする

するというか、しました。新しくgmailアカウントを作って、そこに特定の件名のメールが特定の時間内に来ていたら上のスクリプトが実行されるようにすることにしました。

gmailをチェックしてくれるgmailというgemと、chatworkに投稿してくれるchatworkというgemを使いました。chatworkのAPIは、成功した時にマイチャットにお花を投稿してくれる部分にしか使ってないです。

- [gmail](https://github.com/nu7hatch/gmail)
- [chatwork-ruby](https://github.com/asonas/chatwork-ruby)
- [chatwork API](http://developer.chatwork.com/ja/)

午前9時から9時31分までの31分の間、20秒毎にメールチェックします。ほんとは5秒くらいでやっときたいのですが、小心者なのでなんとなく20秒にしています。

```check_mail.rb
require 'gmail'
require 'chatwork'
require './click_timecard.rb'
 
ChatWork.api_key = "CHATWORKのAPIキー"
 
def chat(text)
  ChatWork::Message.create( room_id: "xxxxxxx", body: text )
end
 
begin
  gmail = Gmail.connect("メアド@gmail.com", "パスワード")
  puts "login OK." if gmail.logged_in?
 
  t = Time.now
  nine = Time.new(t.year, t.month, t.day, "+9")
  nine_thirtyone = nine + 1900
 
  100.times do
    if Time.now.between?(nine, nine_thirtyone)
      if gmail.inbox.count(:on => Date.today, :subject => "出勤したよing!!!") > 0
        shukkin = true
        stamp_time_card
        chat("(F)")
      else
        puts Time.now
      end
    end
    break if shukkin
    sleep 20
  end
rescue => e
  puts(e)
ensure
  gmail.logout
end
```

##Automatorでスクリプトを実行するアプリ作成

職場で使っているのがOSXのSnow leopardです。そいつのAutomatorにApplescriptでスクリプトを起動するだけのアプリを作って保存します。

```launchClickApp.scpt
on run {input, parameters}
	
	tell application "Terminal"
		activate
		do script "cd /Users/rubyスクリプトまでのパス/time_card && ruby check_the_shukkin_mail.rb && exit"
	end tell
	
	return input
end run
```

##毎朝定時に自動起動させる
で、そのアプリを平日の午前９時になったら毎朝起動するように設定します。自分が使っているのはcronnixというGUIのアプリです。
[cronnix](https://code.google.com/p/cronnix/)

##メールを送るだけのウェブアプリを作る

アプリと言っていいのかわかりませんが、URLにアクセスがあるとメールが送られるだけです。

さくらのVPSにdokku-altを入れてsinatraでやりました。
[さくらのナレッジ：Dockerを使ったミニPaaSのdokkuをパワーアップさせた「Dokku Alternative」を試す](http://knowledge.sakura.ad.jp/tech/2545/)

```send_mail.rb
require 'sinatra'
require 'mandrill'

def send_mail
  m = Mandrill::API.new 'APIキー'
  message = {
    :subject=> "出勤したよing!!!",
    :from_name=> "shukkinApp",
    :text=>"出勤したよing!!!",
    :to=>[
      {
        :email=> "メアド@gmail.com",
        :name=> "おれおれ"
      }
    ],
    :from_email=>"送信元メアド@gmail.com"
  }
  sending = m.messages.send message
  puts sending
end

get "/長いURLパス" do
  send_mail
  "yay!"
end
```

普通にメールを送ろうとしたらタイムアウトするので（もう詳細覚えてない）、MandrillのAPIを使うgemを使いました。1日1万2千通まで無料で遅れますが、1日1通、週5,6通しか送信していません。

[mandrill](https://mandrillapp.com)


#pebble app作成

一番簡単そうなsimplyjsのチュートリアルアプリをcloudpebble上で編集する方法でやりました。

http://simplyjs.io/
https://cloudpebble.net/

SELECTボタン（真中のボタン）を押すとさくらVPSのURLにアクセスするだけです。

```letMailSent.js
# https://cloudpebble.net/
 
simply.on('singleClick', function(e) {
  // console.log(util2.format('single clicked $button!', e));
  if (e.button == "select"){
      ajax({ url: 'アクセスするとメールが送られるappのURL' }, function(){
        simply.text({ body: 'Mail sent!' });
      });
    }
});
 
simply.setText({
  title: 'My SHUKKIN App',
  body: 'PRESS SELECT for Shukkin',
}, true);
```

###結果
動きました。かなり快適です。エレベータの中で焦っている同僚を尻目にカチリとボタンを押す快感、相当やばいです。


###問題点
- oh my zshのアップデートでたまに止まっている（ギリギリで画面見てめっちゃ焦る）
- pebbleが壊れた（液晶が映らなくなった。交換品がそろそろ届く）
- カードキーが導入されることになった（どうやら自分がその担当らしい）

というかPebbleなしでもできます。

が、あると嬉しいです。