« 2012年02月 | メイン | 2012年04月 »

2012年03月 アーカイブ

2012年03月11日

TraChat - Tracにチャット機能を追加するプラグイン(WebSocket使用)

TracとIRC等のチャットと連携させる方法はあるけど、Trac上で直接チャットする方法がなかったので作ってみた。
名前は「TraChat」。
コードはGitHubに公開してある。
目的
「Trac上でチャットをしたい。」
「WebSocketを使ったTracプラグインを作りたい。」
WebSocketに対応していないブラウザでは使えないけど、IEも次のバージョンで対応するから良いよね?
インストール方法
内部で「mod_pywebsocket」を使っているのでまず「mod_pywebsocket」をインストール。
% svn checkout http://pywebsocket.googlecode.com/svn/trunk/ pywebsocket-read-only
% cd pywebsocket-read-only/src
% python setup.py build
% sudo python setup.py install
次に、「TraChat」をダウンロードしてeggを作成。
% git clone https://github.com/Kanasansoft/TraChat.git
% cd TraChat
% python setup.py bdist_egg
「dist」というディレクトリが作成され、中にeggファイルができているので、これをTracのプラグインディレクトリに複製する。
どうもコンパイル環境によって名前が違うらしいので注意。
手元の環境では「TraChat-0.1-py2.7.egg」という名前になった。
% cp dist/TraChat*.egg [Tracのプラグインディレクトリ]
「trac.ini」の「components」セクションに次の記述を追加。ない場合は「components」セクションを新規に追加。
[components]
trachat.* = enabled
TraChat内のWebSocketサーバが使うボート番号を指定するには、「trachat」セクションを追加して、次のように「port」を指定する。
指定がない場合は、8081番が使われる。
Tracが使っているポート番号と同じにできないので注意。
[trachat]
port = 8000
後は、Tracを再起動するだけ。
チャットルームは、Tracのプロジェクト単位で作成される。
出来ない事
Tracのログイン名をチャットの発言者に指定したかったけどスキル不足で断念。
Tracのタイムラインを流し込みたかったけどスキル不足で断念。
Tracのデータベースに発言を保存したかったがスキル不足で断念。
問題点
WebSocketサーバをTracプラグインから起動するために、「mod_pywebsocket」のプライベートメソッドを直接呼び出すという愚行を...。
感想
Python初心者にTracのプラグイン作成は難易度高い...。
Python初心者に「mod_pywebsocket」は難易度高い...。

2012年03月18日

開いたStreamを安全に閉じる仕組みを作ってみた(Java6向け)

C#にはUsingという仕組みがあるし、Java7なら既にtry-with-resourcesが導入されている。
しかし、何らかの理由でJava6を使い続けないといけないような場合でも、安全に簡単にリソースを解放させる方法はないかと考えて、最終的にはライブラリとして使えるようにまとめてみた。
作成中によしおりさんのProc.retryの記事を見てしまい、参照させてもらったので、最終的な構造がよく似ている。
JUnitのメソッド名に日本語が使えるのは知っていたけど、やり方がわからなかったので大変勉強になった。
使い方
生成したCloseableなインスタンス(例えばStream等)をregisterに登録しておくと、runメソッドを実行後にcloseを実行する。
Using.execute(new Runnable() {
    @Override
    public void run() throws IOException {
        XxxOutputStream os = new XxxOutputStream();
        register(os);
        XxxInputStream is = new XxxInputStream();
        register(is);
        ...
    }
});
発生した例外を参照したい場合には、次のような書き方をすれば取得できる。
戻り値が配列になっているのは、例外が複数回発生した場合にも対応できるようにするため。
例えば、runメソッド内で例外が発生した後にclose処理でも例外が発生、複数のclose処理で例外が発生する等を想定している。
IOException[] exceptions = Using.execute(new Runnable() {
    ...
});
参照
思考実験の過程は以下。
「アイディア その1」なんかはそのまま使えるかも...。
Google

タグ クラウド