When it’s ready.

出来るまで出来ない

im.kayac.comを知り、coderepos にコミットした

数日前から、デブサミのビデオがニコ動に色々上がっていた。何個か見たけど、とぎれとぎれだったりしてよく理解出来なかった。今日は、そんなデブサミで使用されたパワポらしきものが、上がっていたのでボチボチみてたらotsuneさんの資料の中にim.kayac.comの事がのっていた。

im.kayac.com は今まで知らなくて、この資料で初めて知った。
まず試すためにアカウント(a2c)を作った。んで、そのあとにGTalk宛にIMを送るように設定した。GMailからだと新規アカウントにメッセージが送れなかったので、iChatを使って、アカウントを追加した。認証用のパスコードを送ったら一瞬で承認された。あとは、kayacAPIに何か投げれば返ってくるはず

仕組みはよくわからないけど、

POST /api/post/username HTTP/1.0
Host: im.kayac.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 22

message=Hello%20World!

こうするだけでいいらしい。via:http://im.kayac.com/#docs

だがしかし、こうするだけでもよくわからないので、ターミナルで試してみた。

$ telnet im.kayac.com 80
Trying 210.158.205.232...
Connected to im.kayac.com.
Escape character is '^]'.
POST /api/post/a2c HTTP/1.0
Host: im.kayac.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 22

message=Hello%20World!


おぉー!来たぁ!!
って感じで、メッセージが流れてきた。ひとまず成功。

これをPythonで組めば、自分のいろんなツールに組み込んでIMでお知らせが簡単に出来るハズ。
やり方はよくわからんが、POSTメソッドで投げるだけポイので、作ってみる。

import urllib
import os,sys

base_url = "http://im.kayac.com/api/post/"
message = {"message":"ここにメッセージ 入れてみる"}

params = urllib.urlencode( message  )

d = urllib.urlopen(base_url+"a2c", params)
print d

動くぞ、コレ。ここまで作ってみて、codereposにあげたくなってきた。
こんなスクリプトあげたって誰も喜ばないけど、自分みたいな人がいたら、きっと参考になるかもしれないと思って。あげると決意した。が、こっからが結構大変だった。
そもそも、usernameが直接書いてあるし、他のファイルからimportして使うにはどうするの?なにかやらなきゃ行けない事があるのかな?他にも、importせずに直接叩いても動いてほしいしパスワード付きの時はどう処理するのさ?というような感じで、自分で使えればいいっていう状態と、最低のレベルだとしても、公開して誰かに使ってもらえるような状態っていうは、天と地ほどの差がある。

 とりあえづ、クラスを使う事にした。インスタンスにIDとパスワードを持たせる。その後送りたい時に、sendメソッドでメッセージをバシバシ送るようにすればいいのかなぁと思いながら作る。認証方式は、「なし」と「パスワード」と「秘密鍵」とあるけど、秘密鍵はめんどくさそうなのでパス。
 例外処理も全く入れてない。だめだった時に何か返したいが、im.kayac.comからのレスポンス文字列をそのままハッシュに理解するにはどうするの?JavaScriptでいうところのeval()みたいな事をしたいけど、やり方がわからずに断念。

結局出来たスクリプトが

#! /usr/bin/env python
# coding:utf-8

"""
imkayac.py
This script send message to im.kayac.com .
ver 0.1 

Created by atusi on 2008-02-17.
Copyright (c) 2008 __atusi nakamura__. All rights reserved.

## how to use ##
from imkayac import *
a = KayaTalk("yourID", "yourPass")
a.send("your message")
################

"""
import urllib

class KayaTalk(object):
    """docstring for IMer"""
    def __init__(self, usrname, password=None):
        #super(IMer, self).__init__()
        self.usrname = usrname
        self.password = password
        self.message = {}
        self.base_url = "http://im.kayac.com/api/post/"


    def send(self, message):
        """docstring for sendData"""
        if (self.password != None):
            self.message["password"] = self.password
        self.message["message"] = message
        self.params = urllib.urlencode( self.message )
        d = urllib.urlopen(self.base_url+self.usrname, self.params)
        #x = d.readline()
        #print x
        d.close


if __name__ == '__main__':
    import sys
    print len(sys.argv)
    if len(sys.argv) < 3:
        print >> sys.stderr, "Usage: username [password] message"
        sys.exit(1)
    
    else:
        if (len(sys.argv)==4):
            a = KayaTalk(sys.argv[1], sys.argv[2])
            a.send("%s"%(sys.argv[3]))
        else:
            a = KayaTalk(sys.argv[1])
            a.send("%s"%(sys.argv[2]))

とりあえづ、直接引数渡しても、他のPythonファイルからimportしても使えるようになった。ちょっと感動ですよ。そんで、どきどきしながら、codereposへのコミットの仕方を調べる。
ここで、気づいたのは既に作っている人がいるかもしれない。って思ったけど、codereposにはまだpythonでは上がってなかった。

検索したけど、「正しいcodereposの使い方」的なページは見つけられなかったのでココに乗っていた

Commit message rules ¶

svn ci -m "lang/LanguageName/BigProjectName: Commit message."
svn ci -m "lang/LanguageName/misc/ScriptName: Commit message."
svn ci -m "dotfiles/SoftwareName/Username-Filename: Commit message."

このルールに従うことにした。
上げるところはroot/lang/python/misc に上げる事にした。
MacBookAirでまだ、チェックアウトしてなかったので root/lang/python 配下をとりあえづcoした。いろんなところにsvkの使い方的な事が書いてるけど、svkは良くわかんないのでパスした。

lang/pythonはそんなに重くないので一瞬で落ちてきた。miscディレクトリにimkayac.pyをコピっておもむろに、svn add imkayac.py コワー。ローカルの作業だけどドッキドキです。人様のリポジトリにコミットするのは、人生初経験になります。って、まだコミットしてないけど・・・

ルールは、コミット時のコメントなのかなぁ?とか思いながら、上記ルールに従って(従えてると思ってるけど、間違っているかもしれない)

 % svn add imkayac.py                                                                                                                
 A         imkayac.py
 % svn ci -m "lang/python/misc/imkayac.py: send message im.kayac.com."                                                               
 Username: a2c
 Password for 'a2c': 
 Adding         misc/imkayac.py
 Transmitting file data .
 Committed revision 6833.
 

若干整形したけど、こんな感じで、r6833無事に上がったですよぉ!
これであってるのかな?すごい不安です。そのあとアップデートかけたけど、特に問題な感じなので大丈夫だと思うけど自信ないです。

退屈な週末が、かなりワクドキな週末になりました。今回の経験で、いつ死んでも大丈夫なようにコードは書いておいた方がいいなぁと思ったですよ。自分だけ読めればいいとか、そんな小さな事を言っていたらいつまでたっても甘えコードしかかけない気がした週末でした。

来月のPyDevで、テストファーストのコースが有るらしいのでそれはぜひ行こう。さらに、なぜか自腹でシカゴのPyConにも行く事にしたので、そこでもいろんなコードを見たり聞いたりしてきたい。