ちょっと必要になったので、 タグや空白を無視して、ある文字列の中から、 指定した文字列がマッチする範囲を計算する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

簿記も経理も初心者ですが、合同会社の経理をしてみて、実際に簿記の勉強内容が役に立つのかどうかについて書きたいと思います(簿記の資格そのものは役立つと思います)。 結論から言うと、それほど役には立たないように思います。 仕訳や帳簿の書き方、勘定科目、損益計算書等の書き方などは経理でも使いますが、そう難しいものでもないですし、改めて簿記の勉強をしなければわからないものではないと思います。 簿記は株式会社を基準にしているので、合同会社とは相容れない部分も多いです。 もちろん、勉強そのものは役立つと思いますが、それが必ずしも経理に直結することはない部分もあります。 ただ、会社が大きくなって、株式会社化すれば役に立つことも多くなると思います。 合同会社の時点ではあまり必要なくとも、株式会社に転身する予定があるのであれば、早めに簿記の勉強もしておいた方が良いと思います。 会社設立後に経理初心者のための資料をもらえたりもしますし、簿記を学ばないと経理はできないということはないかと思います。

posted by Png mari on Sun 9 Mar 2008 at 08:40

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

Matz might have a plan to introduce the method that calculates a cartesian product of two ranges into future Ruby. It is very interesting.

CS 11: Python track: python idioms

He has been thinking a good name for the method. I wish that there could be more set operators in future Ruby.

posted by Png takiuchi on Fri 7 Mar 2008 at 22:24

実際負荷分散が必要なほどの負荷があるわけではないのですが、 冗長化の一環として 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

Submitting new Issues via API would be so cool and meet the needs of the times. They have been issues about a year..., lame :(
Please please consider seriously!

posted by Png hibi on Fri 7 Mar 2008 at 12:26

下記の日本語ページに説明がありますが、svnのコミットメッセージにIssueIDを入れることでcloseしたり関連付けたりすることができます。

http://redmine.jp/tech_note/subversion/

   1  $ svn commit -m '○○○機能を利用時の△△△な問題を修正。 refs 123'

しかし、実際には英語ページにあるように#123などのように#がないとRedmineに認識されません。
3/12 (追記) #がなくても(#をつけても、どちらでも)ちゃんと関連付け/closeされます。前田@Redmine.JPさんに指摘いただきました。ありがとうございまっす。

http://www.redmine.org/wiki/1/RedmineSettings

   1  This commit refs #1, #2 and fixes #3

ちなみにDefaultのキーワードは下記。+IssueIDは空白、カンマ、&で分割されます。

  • for referencing issues: refs, references, IssueID
  • for fixing issues: fixes, closes

After a keyword issue IDs can be separated with a space, a comma or &.

posted by Png satoko on Fri 7 Mar 2008 at 11:28 with 2 comments