node.js と websocket を使ってチャットサーバを書いてみたメモ。

さらっとブラウザ上で動作するリアルタイム通信処理が書けた。

以下、今回作ったチャットサーバのインストールや実行手順について。

環境構築

node.js をインストール。

$ git clone https://github.com/joyent/node.git
$ cd node/
$ ./configure --prefix=/path/to/node
$ make -j 4
$ make install

node.jsパッケージ管理 npm をインストール。

$ curl http://npmjs.org/install.sh | sh

今回使用するパッケージをインストール。

$ npm install socket.io
$ npm install express
$ npm install jade

socket.io は websocket のラッパ的なもの。
express は node.js のウェブフレームワーク。
jade はテンプレートエンジン。

チャットサーバ

インストール&実行。

$ git clone https://github.com/utahta/node-chat.git
$ cd node-chat
$ node server.js

ポートは 8080 を使います。

 

以前、localStorage でオプション設定の管理 というメモを書いたけど、それよりもっと良い管理方法があったので再度メモ。

JSON

JSON.parse と JSON.stringify を使う。

JSON.parse はテキストをオブジェクトに変換してくれる関数。
JSON.stringify はオブジェクトをテキストに変換してくれる関数。
Google Chrome は、ネイティブでこれら2つを使うことが出来るらしい。

以前、eval でせっせと書いていた箇所をまるまる削除することができる。

var options = {
    cat:{
        name: "tama"
    },
    dog:{
        name: "pochi"
    }
};
// 文字列にする
var options_txt = JSON.stringify( options );
 
// 文字列なのでそのまま保存可能
localStorage.setItem( 'options', options_txt );
 
// 保存した文字列を取得してくる
options_txt = localStorage.getItem( "options" );
 
// オブジェクトにする
var options_obj = JSON.parse( options_txt );

こんな便利な関数があったとはなー。ありがたや。

 

Google Chrome extension のオプション設定周りについてのメモ。

localStorage は、データをローカルに保存したり管理したりする機能。
Chromeブラウザのキャッシュをクリアすると保存データも一緒に消えてしまったり。
永続的に保存することができるわけではないらしい。
あと、html5 の機能で Chrome 独自の機能というわけではないらしい。

キーと値の連想配列ような感じで使える。文字列しか保存できないといった制限がある模様。

Chrome extension ではこの機能をオプション設定の管理に用いることが多い様子。

簡単な使い方

localStorage.setItem( "short_cut1", "ctrl" );
localStorage.setItem( "short_cut2", "shift" );
 
var val1 = localStorage.getItem( "short_cut1" ); // ctrl という文字列が取得される
var val2 = localStorage.getItem( "short_cut2" ); // shift という文字列が取得される

というように例えばショートカットの設定なんかに使ったりする。

しかし、文字列しか保存できない制限の為、設定が構造的な場合、管理が煩雑になってしまったりする。

var hoge_option = {} // hoge 設定用の連想配列
hoge_option["short_cut1"] = "ctrl";
hoge_option["short_cut2"] = "shift";
//localStorage.setItem( "hoge_option", hoge_option ); // 本当はこうしたいけど、文字列しか保存できない。
localStorage.setItem( "hoge_short_cut1", hoge_option["short_cut1"] ); // 1つ1つキーを作るのは管理的に辛い...
localStorage.setItem( "hoge_short_cut2", hoge_option["short_cut2"] );

構造的に保存

文字列しか保存できないなら、連想配列を文字列に変換して保存すればいいじゃない。

文字列から連想配列への変換には eval を使ってみた。

// 連想配列を文字列へ変換する関数
function toSource( elm )
{
    var out = '';
    for( var key in elm ){
        if( out != '' ) out += ',';
        out += "'"+key+"':'"+elm[key]+"'";
    }
    return '{' + out + '}';
}
 
var hoge_option = {}
hoge_option["short_cut1"] = "ctrl";
hoge_option["short_cut2"] = "shift";
localStorage.setItem( "hoge_option", toSource( hoge_option ) ); // {'short_cut1':'ctrl', 'short_cut2':'shift'} という文字列が保存される。
 
eval( "var hoge_out = " + localStorage.getItem( "hoge_option" ) );
hoge_out["short_cut1"]; // ctrl という文字列が取得される
hoge_out["short_cut2"]; // shift という文字列が取得される

toSource 関数は改善の余地が多分にあるけど、まぁ大体こんな感じでいけるっぽい。

eval が遅いとかありそうだけど、オプションのロードで最初に1回呼び出すぐらいなら問題ないと思いたい。

FastLookUp for Chrome のオプションは、この方法を使って設定を管理ちう。

12月 232009
 
2011.12.11
2011年12月1日にGoogle Translate API v1が利用できなくなりました。
そのため、当プラグインも動作しない状態になりました。
このまま公開していても意味がないので、公開停止したいと思います。
いままで使ってくださった皆さんありがとうございました。

Google Chrome Extension に満足いく英和&和英アプリがなかったので自分でつくってみたメモ。

本当は Firefox で便利だった fastlookupalc をまんま模倣したかったけど、肝心の英訳をしてくれる Alc(英辞郎 on the WEB) が残念ながら規約的にプラグインから利用できない?ようだったので、代わりに excite 翻訳と google 翻訳を利用しました。
(2010/01/16 追記:excite 翻訳に関しても、利用を制約・制限される可能性があるもよう orz)

個人的にあったら便利だなーと思ってた、「英単語は意味や品詞や用例」を「その他長文や英語以外の文字は単純に翻訳」的な機能(というほどのものではないけど)をつけてみました。

インストール

FastLookUp for Chrome インストールページ

ソース

fastlookup-for-chrome.git

コミット履歴

Commit History

使い方

Ctrl を押しながらマウスでピーっと文字を選択すると翻訳結果がポップアップ。
多々ある fast lookup 系と同じ形式。

いまのところフォントサイズとかショートカットキーが変更出来ます。
(2010/03/25: フォントカラーや背景カラーも変えられるようになりました。)

つくって思ったこと

ブラウザ互換を気にせず、javascript ることの素晴らしさ。
謳い文句通り、作るの簡単。
テスト的なインストールもアンインストールも簡単。
デバッグ環境は、Firebug に比べると少し物足りなかった。使いこなせてないだけかも。

参考

Chrome extension tutorial: チュートリアル。
Bubble Translate: Chrome extension やら CSS やらたくさん参考にさせていただきました。いっぱい模倣してます。
AutoPatchWork: 複雑で全部は追いきれてないですが、こちらも Chrome extension 作成にあたって参考にさせていただきました。
fastlookupalc: そもそも移植したかったスクリプト。とにかく発想がすばらすぃ。

 

メモ。
MetaGraphic Cell B4F – Scripts

4月 072008
 

iframeを使ったページをhttpsで開くと警告が出る問題。

何が悲しいって「IE6 + select + ポップアップ + javascript」で紹介したバグ潰しをうっかり適用すると、httpsに持ってったとき、警告が頻発する事に。
バグを解決する為に、バグを作り出すなんて本当に最悪!

解決するためには、src=’javascript:false;’ を追加してあげれば良いみたい。

<iframe src=’javascript:false;’></iframe>

↑こんな感じ。

IE7では例によって修正されているのかな。

参考

 

Firefox で困ったちゃんな問題に出くわしました。

XMLで 4096 byte以上のデータをjavascript側で受け取ってごにょごにょしようとすると、4096 byteで勝手に切り詰められてしまうという
正確には、4096byteずつchildNodesに分割されてしまうみたいでした。
childNodes[0].nodeValueの4096byte以降は、childNodes[1].nodeValueに格納されるようです。
つまり、10000byte送ったらchildNodesが3つ作成されるみたいな。
しかし、なぜそんな仕様にしたのやら。

滅多に4096byte以上の文字列なんて送らないからいいけど、送りたいときとても困る。

解決策を探したら、どうやらnormalize()をしてあげるとうまくいくみたいです。

また、JSON形式で送って受け取っても問題ないようです。

IE, Safariではうまくいくものだから、またなんとも。
このブラウザ依存性は、本当になんとかして欲しいと切に願う。

responseXML

以下、ソース。

responsexml.html

responsexml.js

responsexml.php

XML形式は視認性がよくて好きなんだけどなぁ。
おとなしくJSON使っとけってことなのかしら。

 

CSS の display を使ってポップアップ処理を作成した際の問題。

IE6 では select の zIndex が効かない為、select が常に前面にきてしまう。
(IE7 で修正されているようですが)
これは、非常にうっとうしいです。

対処法を探した所、どうやら iframe を上に被せるしかない模様。
これだから IE6 は!!

popup.html

ソース

これでどうにかなりました。

関連:IE6 + https + iframe

12月 072007
 

Ajax楽しいよ。Ajax。

IEは、本当に世話がやけるうんこ。

まったくエラー内容は、意味不明で特定できないし。
○○行目って、どのソースのこと言ってんの(‘Д’)ハァ?だし。
W3Cをちょくちょく無視してくれるおかげで互換性とれないし。

アンチIE!!

alertを仕組んでいるものの。
IEでjavascriptのいいデバッガないのかな。
FirebugLiteは、ソース弄るとか面倒。

もうみんなFirefoxにしたらいいのに。

しかし、この追跡を楽しいと思うあたり、マゾなんだろうか(‘A`)

11月 142007
 

今日はとある仕事をしていたのだけど、innerHTML の挙動が
IE と Firefox で微妙に違って戸惑った。

innerHTML に “” を入れると IE だと改行らしきものが入り
Firefox では入らない。入らなくていいと思う。

謎すぎるし、見た目も崩れるし。

IE は本当にウンコ。