Macで地震速報を通知してみた 続編

先日作成したTwitterの地震速報を受信してMacのGrowlへ通知するツールを作り直しました。
仕組み的には前回とたいして変わっていませんが、以下の機能を追加しました。

  • 複数の対象をFollowする事を可能にした。
  • SIGHUPを受信するとTwiterサーバに対して強制的に再接続を行うようにした。
  • PIDファイルを出力するようにした。

前回のツールも今回のツールも、Macのスリープ復帰時にTwitterとの再接続が出来ないという
致命的な問題があります。
この問題への対策としてツールがSIGHUPを受信すると再接続を行うようにしました。
ですので、スリープ復帰後にターミナルから kill -HUP `cat ~/hogehoge.pid` てな感じで
SIGHUPを送信するとサーバーへの再接続が行われます。

スリープ復帰の度に手動入力するのは面倒なので sleepwatcherデーモン等を使って
スリープ復帰時にkill -HUPを自動実行すると良いのではないかと思います。

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'tweetstream'
require 'ruby-growl'
require 'webrick'

# 監視するTwitterアカウント (どちらか片方で十分だと思う)
# @earthquake_jp (4104111)
# http://labs.transrain.net/products/earthquake_jp/
# @eew_jp (16052553)
# http://quake.twiple.jp/

# 複数の監視対象に対応するため配列に格納
# ID番号
id = [4104111,16052553]
# アカウント名
id_name = ["earthquake_jp","eew_jp"]

# 自分のTwitterのアカウント
$USERNAME = "username"
$PASSWORD = "password"

### tweetの受信およびGrowlの送信処理 #################################
def EarthquakeNotification(id,id_name)
  # SIGHUPを受信したらメソッドを終了する
  Signal.trap(:HUP){return}
  
  # Growlへの接続をオープンする
  g = Growl.new("localhost","Earthquake Notification",["Notification"],nil,"")
  
  # TweetStreamはデーモンではなくクライアントとして動作させる
  TweetStream::Client.new($USERNAME, $PASSWORD).follow(*id) do |status|
    # screen_nameが監視対象と同一か判定する、同一なら通知を行なう。
    if id_name.include?(status.user.screen_name) then
      g.notify("Notification","地震速報",
                   "** #{status.user.screen_name} ** \n#{status.text}\n")
    end
  end
end

### 本体 ##############################################################
# PIDファイルの名前を生成 "HOME/スクリプト名.pid"
pid_name = "#{File.expand_path("~")}/#{File.basename(__FILE__,'.*')}.pid"

# TweetStreamでのデーモン化は行なわず、自力でのデーモン化を行なう
WEBrick::Daemon.start do
  # PIDファイルの作成  
  File.open(pid_name,"w") do |file|
    file.puts(Process.pid)
  end
  
  # 再接続を行うためにループ処理で通信系を呼び出す
  loop do
    EarthquakeNotification(id,id_name)
  end
end