Hatena::ブログ(Diary)

Windchase

2007.6.26

LimeChat for OSX 0.3 リリース

PPC環境で Enter や Delete などの一部のキーが効かなくなるバグを fix しました。致命的なバグなので、0.3 としてリリースしておきます。

Intel環境では、今のところバグが再現しないことを確認していますが、念のためアップデートをお願いします。

http://limechat.sourceforge.net/index_ja.html

2007.6.25

LimeChat for OSX 0.2 リリース

日常的にほぼ問題なく使えるレベルまで開発が進んだので、リリースしておきます。

追加した機能

  • キーワードハイライト
  • DCCファイル送受信 (レジュームには未対応)
  • プリファレンスダイアログ
  • ニックネーム変更ダイアログ
  • 入力履歴 (↑↓キーでアクセス)
  • 複数行をペーストするとダイアログを出すようにした
  • 自分のIPアドレスを取得するようにした
  • 文字属性の描画 (送信は未実装)

未実装の機能

  • サーバ、チャンネルの順序入れ替え
  • ダイアログ、ウィンドウの初期位置の調整
  • 半角カナ対応

ダウンロード

2007.6.11

RubyKaigi2007 はアツかった

この2日間、本当に楽しかったです。こんなにぎゅっと詰まった感じのするイベントは久しぶりかも。いろんな人たちと話すことができたことも、大きな収穫になりました。

運営スタッフの方々、おつかれさまでした。そして、ありがとう。

発表資料をアップしました。

http://limechat.net/presentation/inside_lingr.pdf

2007.6.10

LimeChat for OSX 0.1 リリース

今日、RubyKaigi に続く RejectKaigi にて、RubyCocoa で書いた LimeChat の OSX 版を発表しました。

いまのところ、まだ未実装の機能もたくさんありますが、初期バージョンということでリリースしておきます。

http://limechat.sourceforge.net/index_ja.html

2007.6.7

Lingr が Opera 9 対応に

Operaでも非同期リクエストが並列処理できる img-JSONPLingr に実装してみたら、ばっちり動きました。おかげで Lingr が Opera 9 でも動くようになりました。感謝。

実際には、他のブラウザに影響しないように Opera 9 でのみ動作するように分岐しています。

if (window.opera) {
  navigator.userAgent.match(/Opera[\/\s]*([0-9.]+)/);
  if (parseInt(RegExp.$1) >= 9) {
    // Opera 9 用の処理
  }
}

ところで、JSONP って Wii のインターネットチャンネルでは普通に動いてるんだけど、PC版には backport しないのかな。

2007.6.5

JavaScript でお手軽テンプレートエンジン

JavaScript で DOM をがしがしいじるのは大変だけど、でかいテンプレートエンジンを使うのはちょっと大げさだ、というときがある。そんなときに気軽に使えるテンプレートエンジンを作ってみた。

ソースは以下の通り。

function applyTemplate(template, f)
{
  try {
    return template.replace(/#\{[^#{}]+}/g,
             function(s) {
               var v = f(s.slice(2, -1));
               return v == null ? '' : v.toString().escapeHTML();
             });
  } catch (e) {
    return '[' + e.name + '] ' + e.message;
  }
}

使い方は、

<div id="template" style="display:none">
  <h2>#{title}</h2>
  <p>#{langs[0]} is invented by #{authors[langs[0]]}.</p>
  <p>#{langs[1]} is invented by #{authors[langs[1]]}.</p>
</div>

のように隠しエレメントでテンプレートを用意しておいて、

var title = 'Authors of Programming Languages';
var langs = ['JavaScript', 'Ruby', 'Perl'];
var authors = {
  'JavaScript' : 'Brendan Eich',
  'Ruby' : 'Matz',
  'Perl' : 'Larry Wall'
};
var result = applyTemplate($('template').innerHTML,
                           function(v){ return eval(v); });
Element.update('canvas', result);

という感じでテンプレートを適用する。

ポイントは、第2引数に eval を包んだ関数を渡してやり、呼び出し側環境を持って行くところ。こうしてやることで、テンプレート内部でローカル変数をそのまま参照できるので、JavaScript のテンプレートエンジンにありがちな、

var env = {
  'title' : '...',
  'lang[0]' : '...'
};
s = applyTemplate(template, env);

というように、あらかじめハッシュに変数を登録して渡さなくていいところがうれしい。

ちょっとトリッキーだけど、JavaScript には Ruby の binding のような仕掛けがないので仕方がない。

ただし、このままでは列挙や繰り返しには対応してないので、使えるところは限定的かも。

動作サンプル: http://limechat.net/sample/template/