なんだかA要素の直後の空白が無くなってしまいますね。

Windows用Safariのバグかと思ったら、Macでも同じ挙動でした。 とりあえず、 以下のように無理やりA要素の後にテキストノードを詰め込むことで対処。

   1  var spacer = document.createTextNode(' ');
   2  element.parentNode.insertBefore(spacer, element.nextSibling);

posted by Png genki on Mon 10 Mar 2008 at 13:23

ちょっと必要になったので、 タグや空白を無視して、ある文字列の中から、 指定した文字列がマッチする範囲を計算するJavaScript を書いてみました。

   1  /* (C) Genki Takiuchi. New BSD License */
   2  var findSelection = function(html, sel){
   3    var chars = html.split(''), sels = sel.split('');
   4    var start = 0, end = 0, step = 0, tag = false;
   5    var cur = function(){return chars[end]};
   6    var parse = function(){
   7      switch(cur()){
   8      case '>': if(tag) tag = false; return go();
   9      case '<': if(!tag) tag = true; return go();
  10      case '\n': return go();
  11      case ' ': return go();
  12      case '\t': return go();
  13      default: return tag ? in_tag() : out_tag();
  14      }
  15    };
  16    var go = function(){return(chars[end++] ? parse:reject)()};
  17    var in_tag = function(){return go()};
  18    var out_tag = function(){
  19      return(cur() == go_sel() ? match:not_match)()
  20    };
  21    var not_match = function(){step = 0; return go()};
  22    var match = function(){
  23      if(step == 1) start = end;
  24      return(sels[step] ? go:accept)()
  25    };
  26    var accept = function(){return [start, end + 1]}
  27    var reject = function(){return [0, 0]};
  28    var go_sel = function(){
  29      var s = sels[step++];
  30      return white_space(s) ? go_sel() : s
  31    };
  32    var white_space = function(c){
  33      return c && c.match(/[\s\n]/)
  34    };
  35    return parse();
  36  };

使い方は、こんな感じ。

   1  >> findSelection('hello, <b>world</b>!', 'llo, world')
   2  [2, 15]

選択範囲を取得して、選択している領域をRangeを求めるために作りました。 selに指定した文字列にマッチする箇所が複数ある場合は、 最初にマッチした場所のRangeを返します。

posted by Png genki on Sun 9 Mar 2008 at 10:54

CG系の話題を書きやすいように、数式を書けるようにしました。 これでレンダリング方程式も想いのままです。


L_o(x,\vec{w}) = L_e(x, \vec{w}) +
\int_\Omega f_r(x,\vec{w}',\vec{w})
L_i(x,\vec{w}')(\vec{w}'\cdot\vec{n})d\vec{w}'

以下のように、latex形式で数式を記述します。

   1  [math]
   2  L_o(x,\vec{w}) = L_e(x, \vec{w}) +
   3  \int_\Omega f_r(x,\vec{w}',\vec{w})
   4  L_i(x,\vec{w}')(\vec{w}'\cdot\vec{n})d\vec{w}'
   5  [/math]

インライン形式で {}_{y=\frac{d}{dx}f(x)} のように記述することも出来ます。 その場合は、

   1  [math]y=\frac{d}{dx}f(x)[/math]

のように、改行せずに記述します。

posted by Png genki on Sat 8 Mar 2008 at 19:38 with 1 comment

autotestは、Railsアプリケーションのテストを自動化する、 非常に便利なユーティリティです。 昔はlib/以下のファイルの自動テストには対応していなかったのですが、 いつの間にか対応していたみたいです。

lib/foo.rbファイルをテストする場合、 test/unit/foo_test.rbにUnitテストとしてlib/foo.rb のテストを書けば良いようです。 そうしておくと、いずれか一方のファイルを編集したタイミングで、 自動的にテストを走らせてくれるようになります。

posted by Png genki on Sat 8 Mar 2008 at 16:19

Webサービスを作っているものにとっては、サーバの監視は重要なことです。 サーバが落ちていない事を絶えず確認していたいパラノイアのための XMPPによるサーバ監視方法を紹介します。

やることは単純で、サーバの動作を監視するデーモンスクリプトの中から、 問題が起こっていない場合に、XMPP経由でJabberクライアントに 「no problem」と、タイムスタンプつきで通知するだけです。

サーバ監視というと、たいていの場合、何か問題が起こった事を通知するように することが多いです。しかし、この方法では、何も起こっていないことを 定期的に通知させることで、サーバ監視プログラム自体に対する疑念 をはらう事が出来ます。

60秒に一回Gtalkにno problemであることを通知させるようにしています。 Twitterのお陰で、1分間に一度程度の通知はさほど気にならなくなったのと、 心配になったらLogを見ればどの時間まで「no problem」であるかを 確認できるので、便利です。

posted by Png genki on Sat 8 Mar 2008 at 15:50

度々見かけるけどあまり良く意味が分かってなかった。 書くことで記憶に残るので、記事にしてみます。

So far の意味は、今までのところ、ここまでは。

And so far, みたいな接続詞として使ったり、副詞的に使ったりする。

  • So far, so good. 今のところ万事順調
  • I am fine so far. 今のところ元気です
  • Are you with me so far? ここまではOK?

So far awayだと、とても遠いになる。farというと遠い感じがするけど、 3文字にエンコーディングされてるだけあって、 用法によって意味をたくさん持っている。

  • as far as I know. 私の知る限り

あとは、比較級・最上級の強調にも使われる。

  • far better 遥かに良い
  • It is the best by far. 断然良い
posted by Png genki on Sat 8 Mar 2008 at 11:33

実際負荷分散が必要なほどの負荷があるわけではないのですが、 冗長化の一環として blog.s21g.comに対して DNSラウンドロビン の設定をしてみました。

Railsの場合、リバースプロクシ、キャッシュサーバ、Webサーバ、APサーバに関しては、特に頭を悩ますことなく冗長構成をとることが出来ます。 cache_fuは最初から複数のmemcachedを使うことを想定していますし、 acts_as_searchableを修正して2つのHyperEstraierを使うようにするのも、 それほど難しい修正ではありません。

しかしながら、やはりDBの冗長構成は面倒ですね。 参照系に限定すれば、相互レプリケーションさせるだけで簡単なのですが。 MySQL 5.1が早くリリースされてくれると楽なんですけど。

See Also

posted by Png genki on Fri 7 Mar 2008 at 14:28 with 6 comments

RaPT については以前 「RaPT: Railsプラグイン管理ツール」 で紹介しましたが、 手短にRaPTを使ってRailsプラグインを使う方法をまとめておきます。

インストール

   1  # gem install rapt

プラグインをインストール

RAILS_ROOTで以下を実行。

   1  $ rapt install http://repo.pragprog.com/svn/Public/plugins/annotate_models

プラグインをアップデート

まさにこの為にRaptを使う価値があるという代物。

   1  $ rapt update annotate_models

便利です。

posted by Png genki on Thu 6 Mar 2008 at 14:57 with 2 comments

Rails-2.0から、FunctionalTest用のテストクラスの基底クラスは、 Test::Unit::TestCaseからActionController::TestCase に変わりました。 それに伴って、テストクラス内にsetupメソッドやteardown メソッドを書いても実行されなくなっています。

Rails 2.0.2のファンクショナルテスト機構が壊れている件・謝罪と訂正Comments

今日は久しぶりにRails 2.0.2を使い、久しぶりに付属のファンクショナルテスト機構を使っていたのですが、そこでひどいバグに遭遇しました。

FunctionalTestではsetupteardownを使う機会がなかったので 今まであまり気になってなかったですが、確かに使ってる人からすると 困る問題ですね。 バグだとして、パッチが採用されたら直るんだろうけど、 2ヶ月間放置されてる状況からすると、setupteardown を使わない方向が「Convention」になっていくという事なのかな。

See Also

posted by Png genki on Wed 5 Mar 2008 at 12:24

Ebbは以前にも紹介しましたが (ポストMongrel時代のWebサーバ参照)、 Thinより高速といわれている軽量・高速なWebサーバです。

Ebb aims to be a small and fast web server specifically for hosting web frameworks like Rails, Merb, and in the future Django.

こちらでも紹介されています。

Ebb: C-Powered Web Server That Uses Rack - Faster than Mongrel and Thin

非常に興味深いですね。 ということで、ちょっと使ってみました。 先日からgemインストールできるようになったので、 いつものように

   1  # gem install ebb

でインストールできます。 ただし、EbbはRuby拡張でglib2のヘッダファイルに依存しているため、 あらかじめそちらもインストールしておく必要があります。 以下はDebianの場合。

   1  # apt-get install libglib2.0-dev

インストールが完了したら、RAILS_ROOTで以下のようなMongrel ライクなコマンドを実行すると、Ebbが立ち上がります。

   1  % ebb_rails start 

また、ebb_railsコマンドのオプションは以下の通り

   1  Usage: ebb_rails [options] start|stop
   2  
   3  Server options:
   4    -p, --port PORT      use PORT (default: 3000)
   5    -e, --env ENV        Rails environment
   6                         (default: development)
   7    -c, --chdir PATH     Rails root dir
   8                         (default: current dir)
   9    -d, --daemonize      Daemonize
  10    -l, --log-file FILE  File to redirect output
  11    -P, --pid-file FILE  File to store PID
  12    -t, --timeout SEC    Request or command timeout in sec
  13                         (default: 60)
  14  
  15  Common options:
  16    -h, --help           Show this message
  17    -v, --version        Show version

とりあえず、単純なアプリケーションでテストした限りでは、 問題なく動いている模様です。 楽しみなプロジェクトですね。

See Also

posted by Png genki on Wed 5 Mar 2008 at 08:56
Contents
Safariでdisplay:noneなA要素をshow()すると・・・
タグや空白を無視して文字列がマッチする範囲を求めるJavaScript
数式を書けるようにしました
autotestがlib/以下のファイルの自動テストに対応
パラノイアの為のXMPPによるサーバ監視
英語の勉強メモ: So farとfar
PoundおよびAPサーバの冗長化・負荷分散を実施
手っ取り早くRaPTを使ってRailsプラグインを管理する
FunctionalTestのsetupの件
Thinよりさらに高速と謳われているEbbを使ってみる
Comments
瀧内元気: MacOS版は以下にあります * [genki/ViMouse](https://githu... '23-1
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ