Tuesday, August 25, 2009

IMAProwl 0.4

安定して動いてるのでリリース
  • base64, quoted-printable な本文もデコードしてnotifyするようにした
  • notification に添付する本文の長さを、設定項目"BodyLength"で設定できるようにした (default: 100, MAX: 1000)
  • IMAPでのヘッダ取得方法を変更
  • IMAP/SSLのcertificate check をしないように変更
  • そのた雑多な変更
  • Ruby 1.9.0 (Debian sid), Ruby 1.9.1(mswin32)で動作確認.

OS Xで動作確認したいけど、OS Xは環境がないなぁ。
後日Windowsでの導入手順でも書いてみます。

Edit: update to 0.4.1
Edit: まちがえてコミットしちゃいけないもんをコミットしてしまったのでリポジトリ作りなおしました。0.5になっとります

Sunday, August 23, 2009

IMAProwl 0.3

というわけで IMAProwl 0.3はRuby 1.9以上を動作対象とすることになりました。
これでサーバ側から不意に切断されても大丈夫になったかと思われます。

http://github.com/takuo/IMAProwl

ところで IMAProwl は IMAP IDLEコマンドで監視を実現していますが、公開サービス系のIMAPサーバはIDLEが使えないことが多いそうです。
たとえば iPhone の i.softbank.jp ではつかえません。

こういったサーバでこのスクリプトはつかえないので、もし必要なひとがいたら実装してみてください。
もともと GMail を push するのが目的ですし、自分は GMailおよびGAfYDでしかIMAPつかってないので・・・。


Tuesday, August 18, 2009

Strange behavior Ruby Net::IMAP

Net::IMAPの挙動が変なの。

GMailのimapアクセスにて。
$ irb1.8
irb(main):001:0> require 'net/imap'
=> true
irb(main):002:0> imap = Net::IMAP.new('imap.gmail.com', 993, true)
=> #<Net::IMAP:0xb7a5eb0c [略]
irb(main):003:0> imap.login('example@example.com', 'example')
=> #<struct Net::IMAP::TaggedResponse tag="RUBY0001", name="OK", [略]

[ここで ウェブインターフェースで「他のセッションをすべてログアウト」を実行する]

irb(main):004:0> imap.capability
ブロックののち segmentation fault.

同様に Ruby 1.9では
$ irb1.9
irb(main):001:0> require 'net/imap'
=> true
irb(main):002:0> imap = Net::IMAP.new('imap.gmail.com', 993, true)
=> #<Net::IMAP:0x9387314 [略]
irb(main):003:0> imap.login('example@example.com', 'example')
=> #<struct Net::IMAP::TaggedResponse tag="RUBY0001", name="OK", [略]

[ここで ウェブインターフェースで「他のセッションをすべてログアウト」を実行する]

irb(main):004:0> imap.capability
EOFError: end of file reached
from /usr/lib/ruby/1.9.0/net/imap.rb:1016:in `get_tagged_response'
from /usr/lib/ruby/1.9.0/net/imap.rb:1073:in `block in send_command'
from /usr/lib/ruby/1.9.0/monitor.rb:190:in `mon_synchronize'
from /usr/lib/ruby/1.9.0/net/imap.rb:1058:in `send_command'
from /usr/lib/ruby/1.9.0/net/imap.rb:316:in `block in capability'
from /usr/lib/ruby/1.9.0/monitor.rb:190:in `mon_synchronize'
from /usr/lib/ruby/1.9.0/net/imap.rb:315:in `capability'
from (irb):4
from /usr/bin/irb1.9:12:in `<main>'
irb(main):005:0> imap.disconnected?
=> false

ということでRuby 1.8ではサーバから一方的に切断されても、それを検出することができません。
1.9 でも #disconnected? は false がかえってしまう。
ここで #disconnect すると Errno::ENOTCONN: Transport endpoint is not connected

うーん。
どうしたものか。Socketのほうかなぁ。
まぁIDLEの実装も1.9.2からぽいのでそっちのほうも試してみなくては。

Sunday, August 16, 2009

ProwlでなんでもPush Notification



つうことで。
Prowlって何でもpush notificationできて便利なんですよーっていう記事です。

ここのところRubyつかってnotificationしてましたが、今回はWindowsのPowerShellを使ってみます。

というのも TVRock っていう録画マネージャアプリケーションがWindowsで、こいつの録画開始と終了をpushしてみたかったというだけなんですが。

そこで、Windowsで最も楽にscriptingできるのはなんだっていったらWSHかPowerShellなわけで。
まぁここは.NETのクラスライブラリがつかえるPowerShellにしてみましょう、と。

書いたコード
$state = $args[0]
$title = $args[1]

$url = "https://prowl.weks.net/publicapi/add"
$apikey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

$data = New-Object System.Collections.Specialized.NameValueCollection
$data.add("apikey", $apikey)
$data.add("application", "TVRock")
$data.add("event", $state)
$data.add("description", $title)

$wc = New-Object System.Net.WebClient
$res = $wc.UploadValues($url, $data)
$wc.Dispose()
無駄に変数使ってるけどこれだけ。
WebClient は勝手にUTF-8にしてくれるので何もしなくていいんですなぁ。

TVRockの設定


もうひとつ重要なのが、PowerShell で not-signed なスクリプトを実行できるようにしておかなくてはならない。
PS> Set-ExecutionPolicy RemoteSigned
x64環境の場合はTVRockが32bitなので32bitのpowershell.exeで実行しておくこと。
詳細はget-help about_signingで。

こんな感じで、録画待機に入るとPush。さらに終了時にPush。
特定のアプリケーションやサービスに限定されずに Push Notification を利用できるのはいいですな。

Saturday, August 15, 2009

Twitter Notification with Prowl

勢いあまってTwitterのiPhone Push Notificationを作ったので公開。
Rubyです。

http://github.com/takuo/TwiProwl/

TwitterのMentionsとDirect Messagesを監視してProwlにnotificationします。
特に目立った機能はないです。
一応複数のTwitterアカウントに対応。

Thursday, August 13, 2009

IMAProwlを更新

IMAProwl更新。
http://github.com/takuo/IMAProwl

一応RFC的にはIDLEしてから30分間は何もせず待ってていいことになってるのだけど、すべてのサーバが準拠しているとは限らないので一応サーバごとに任意の間隔で再IDLEするように変更。
 -
Application: IMAPServer
User: gonbe
Pass: himitsu
Host: imap.example.com
Interval: 10

config.ymlにこんな感じでIntervalを定義する。分単位で0にすると再IDLEチェックしない。デフォルトで20分。
GMailのサーバは定期的にEXISTSを送ってきてそのたびにUNSEENチェックと再IDLEが入るので特に何もしなくていいのです。(0にしといていい)
NOOP じゃないのはIDLE中は Tagged command を発行できない(DONEしか発行できない)ため。

あと、なんかのタイミングでスレッドがデッドロックして死ぬのを確認しているけど再現性がわからないのでとりあえず放置
#!/bin/sh

while true; do
./imaprowl.rb
sleep 3
done
こんなんしとけばとりあえずいいかと。

http://github.com/takuo/IMAProwl

余談ではあるけど、近頃セムパイが監訳なさったgit本が発売されたので宣伝。

安達太良山登山


福島県は安達太良山へ登山に行ってきました。
どうも安達太良は初心者向けっぽく。途中までゴンドラで登れたり、距離もそれほど長くない感じでした。

今回は例によってCW-Xのスタビライクスモデルを着用。これも15000円くらいだったかな。まぁスノボするにも使えそうなので奮発。

やはりサポートウェアがあるとなしじゃぁ雲泥の差ですなぁ。
若干靴があってなかったかも知れないけど特に問題はなく。

結局登りはゴンドラを活用し、下りは徒歩で。
久々の登山だったのでこんなもんですか。
安達太良 at EveryTrail

Map created by EveryTrail: GPS Community

見下ろし

山頂