Hatena::ブログ(Diary)

shichisekiの日記

2009-05-08

Firefox拡張機能でEcho Server 02:27  Firefoxの拡張機能でEcho Serverを含むブックマーク

Firefoxのextentionではサーバーソケットが開けるらしい,というのを見かけたので試しにエコーサーバを作ってみました.Firefoxの拡張を書くのは初めて.そもそもどうやって書けば良いのか分からず,XULってなに?ってところから初めたので時間がかかりました.大体半日ぐらい.IDLとかは去年触る機会があったのでその辺の知識がなければもっとかかってたと思います.参考にしたのは以下のページ.

Firefox拡張機能(extension)の作り方 — ありえるえりあ

nsIInputStreamPumpの非同期処理にジェネレータを使う - Gemmaの日記

Fx Socket - 枕を欹てて聴く

動かすもの一式はgithubに置いています.

404 - GitHub

jsのコードは少し苦労したので貼っておきます.

let log = Application.console.log;
 
let Cc = Components.classes;
let Ci = Components.interfaces;
 
let EchoServer = function(port) {
    this.port = port;
    this.isRunning = false;
    this.server = Cc['@mozilla.org/network/server-socket;1'].
        createInstance(Ci.nsIServerSocket);
};
 
EchoServer.prototype.handleClient = function(trans, func) {
    let [is, pump] = this.socketInputStream(trans);
    let os = this.socketOutputStream(trans);
    let g = func(is, os);
    let listener = {
        generator: g,
        transport: trans,
        istream: is,
        ostream: os,
        onStartRequest: function() {},
        onStopRequest: function() {
            log("stop");
            this.generator.close();
            this.transport.close(null);
            this.istream.close();
            this.ostream.close();
        },
        onDataAvailable: function() {
            this.generator.next();
        }
    };
    g.next();
    pump.asyncRead(listener, null);
};
 
EchoServer.prototype.socketInputStream = function(trans) {
    let is = trans.openInputStream(0, 0, 0);
    let cis = Cc['@mozilla.org/intl/converter-input-stream;1'].
        createInstance(Ci.nsIConverterInputStream);
    cis.init(is, "UTF-8", 1024, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
    let pump = Cc['@mozilla.org/network/input-stream-pump;1'].
        createInstance(Ci.nsIInputStreamPump);
    pump.init(is, -1, -1, 0, 0, false);
    return [cis, pump];
};
 
EchoServer.prototype.socketOutputStream = function(trans) {
    let os = trans.openOutputStream(0, 0, 0);
    let cos = Cc['@mozilla.org/intl/converter-output-stream;1'].
        createInstance(Ci.nsIConverterOutputStream);
    cos.init(os, "UTF-8", 0, Ci.nsIConverterOutputStream.DEFAULT_REPLACEMENT_CHARACTER);
    return cos;
};
 
EchoServer.prototype.start = function() {
    let self = this;
    let listener = {
        doEcho: function(is, os) {
            let str = {};
            let len;
            while (true) {
                yield;
                len = is.readString(1024, str);
                if (len == 0) continue;
                log("client read: " + str.value);
                os.writeString(str.value);
            }
            log("client closed");
        },
        onSocketAccepted: function(serv, trans) {
            log("client accepted");
            self.handleClient(trans, this.doEcho);
        },
        onStopListening: function(serv, trans) {
            log("server closed");
            return true;
        }
    };
    this.server.init(this.port, false, -1);
    this.server.asyncListen(listener);
    log("server started");
    this.isRunning = true;
};
 
EchoServer.prototype.stop = function() {
    if (this.isRunning) this.server.close();
};

InputStreamのread系がasyncだったのでnsIInputStreamPumpとJavascript 1.7以降でサポートされているyieldを使ってます.ジェネレータって言うらしいですね.id:Gemmaさんの記事がとても参考になりました,というか該当部分はほとんどパクリ状態です..勉強になりました.

2009-05-06

連休も今日で終わり 21:18 連休も今日で終わりを含むブックマーク

どこに行くでも、なにかやるでも、勉強するでも、論文書くでもなく。相変わらずやる気がない感じです。やらなきゃいけないことはたくさんあるのですが。

以下は最近読んだ本の感想。ほかにも読んでいる本はいくつかあるのですが、目を通しきってないのが多すぎて感想がなかなか書けません。

Op.(オペレーション)ローズダスト〈上〉 (文春文庫)

Op.(オペレーション)ローズダスト〈上〉 (文春文庫)

星ひとつ。『亡国のイージス』ぐらいまでは好きな作家さんだったので読んでみましたが、テクニックに走りすぎ、無駄に長い、ひとりよがりかつ代わり映えしないストーリー、といった感じで、いいところがまったくありませんでした。もうこの作家さんは読まないと思います。

グーグル・ジャパンで働く11人の英語勉強法

グーグル・ジャパンで働く11人の英語勉強法

こちらは暇をもてあましたときに本屋で立ち読みしたもの。なんというか、スカスカなので20分もあれば読めます。働いている人の人となりを知るにはよかったです。

2009-04-23

ドラゴンブックにまつわる話 19:09 ドラゴンブックにまつわる話を含むブックマーク

sumiiさんのtwitterでの発言を契機にいろんな人がドラゴンブック読みづらいよねーとか,コンパイラ本だったら構文解析は少しだけでいいよねー言っておられます.

Twitter / Kazuhiro Inaba: コンパイラの勉強と称して構文解析の勉強してる人をみる ...

Twitter / Kota Mizushima: ドラゴンブックはあくまでコンパイラ本なんだし、型シス ...

Twitter / 松本宗太郎: 構文解析って、5ページくらいで良いと思う。型システム ...

岩波ソフトウェア講座シリーズのプログラミング言語処理系構文解析がやたらと長かった記憶があります.最後まで読んでないですが.しかしドラゴンブック一度読んでみたいなあと思っているんですが,ちょっと尻込みしてしまいそう.コンパイラ(というか言語処理系)の良書って無いんでしょうかね..

2009-04-09

母校訪問 13:18 母校訪問を含むブックマーク

今所属している大学の学生リクルータとして母校の高専を訪問してきました。

やっぱりというか、高専の学生さんとしゃべっていると、志望校としてでてくるのは地元の国立大ばかり。うちの大学のメリットをたくさんしゃべってもなかなか反応が薄い。地元である(九州内)ことと知名度の2点が彼らの最大の関心みたいでした。個人的には大学院としての環境はうちの大学が優れていると思うので、もう少し視野を広げてみてほしいと思ったりしました。

うちの大学は研究費が多いとか、就職がいいとかいろいろメリットもありますが、個人的に一番よかったと思うのはいろんな優秀な人に出会えた事です。修士の同期入学にはid:mamorukさんとかid:myuiさんとかがいるし(表立って出てない人も含めるともっといる)、Labの先生、先輩、後輩にも尊敬している人がたくさん居ます。特に修士のときに指導していただいた先生にはすごく感謝しています。もちろん他の大学でも同じ事が言えるんでしょうけど、理系の大学院にしては多様なバックグラウンドを持つ人が集まるという意味では他にはないと思います。

しかし母校に帰るたびに、建物が増築・改築されていたり、2年生が混合学級(昔は5年間ずっと同じクラス)になっていたりと、時間の流れを感じます。先生方と話していても「君たちの学年の時は〜」みたいな話で盛り上がったり。先生方は思った以上に学生の事を覚えくれていてうれしくなります。今回も複数の先生から「君は授業態度はよくなかった(=よく寝てた)ね(笑)」とか言われたり。。今思うと数学と専門ぐらいはきちんと聞いておいた方が良かったなあと反省というか後悔してます(苦笑)。

2009-03-19

GSoC2009 accepted organizations list has published 00:49  GSoC2009 accepted organizations list has publishedを含むブックマーク

Accepted organizations for Google Summer of Code 2009

Google Summer of Code 2009 のmentor organizationsが公開されました.前年と同じような顔ぶれが目立ちます.以前の日記にも書きましたが,GSoCは学部生,修士1年生ぐらいの腕試しにちょうどいいと思いますので,該当する学生さんは是非チャレンジしてみるといいんじゃないかと.student applicationの期間は3/24-4/4のようですので,今のうちに興味のあるorganizationを調べてコンタクトを取るとよいかと思います.