長野に行ってきた

友人がUSに行くことになって長野に集合した。長野な理由はさておき、蕎麦をとにかく食べた。到着して1枚、昼には2軒行って1枚と1枚、次の日の昼に1枚、新幹線に乗る前に1枚。蕎麦湯がおいしくて良い感じだった。
蕎麦とは関係ない(友人のUS話とはもっと関係がない)けれど、長野の山で撮れた虹を2枚ほど。

日の丸検索エンジンにやって欲しくないこと

「日の丸」検索エンジン、グーグルに対抗 厳しい指摘も
「日の丸検索エンジン」開発に意欲 NTTコム社長
日の丸検索エンジンって何がやりたいのだろうか。GoogleとかYahoo!とかよりも良質の検索エンジンを作るという話なのか、日本人用の検索エンジンを作るという話なのか。そもそも何で日の丸検索エンジンを作るのかといった政治的な話は無視してなんだけど、純粋にプロジェクトとして気がかり。Googleは日本語的にも賢いと思うけどなぁ。
まぁ作るのは勝手(開発費の一部を経産省が助成とかあるので勝手なことはないんだけど)なのでいいけれど、以下のような事はやって欲しくないなと思う。

  1. インターネットに繋がる環境にある人から受信料を徴収(NHKは堂々とやってる)
  2. RFCとかECMAとか一般的なWWWのルールを無視したオレオレ設計
  3. ブラウザ指定(IEのみとか)
  4. クエリ送信がGETでなくてPOST(クエリ付きのURLをブクマさせてね)

1とか2とかは真面目に心配だ。

[追記]
あと、文字コードがShift-JISとかも。まぁ流石にUTFにするか。

Google Code Searchを使ってみた

Google Code Search
素晴らしい。Googleは化け物か。早速、unDonutの検索窓に追加した。

[Search-List]
01=Google Code Search
[Google Code Search]
Group=0
FrontURL=http://www.google.com/codesearch?q=
BackURL=
Encode=3

凄いのが正規表現が使えて、

package:tomcat void\s+main.+String

とかでそれっぽい検索が出来たりする。あと、マルチバイトもちゃんと使えて、萌えとかでも検索結果が出る。とにかく、しばらく遊んでみる。

JavaScriptのtry-catchはどこでも書ける?

try-catchの中にfunctionとかが出てきても平気なようだ。

try {
function outer() {
inner();
function inner() {
alert("Hello World");
}
}
outer();
} catch(e) {
alert(e.number + ": " + e.description);
}

みたいなことをしてもパースエラーにならない。これって、JavaでThrowableをcatchするようなことが出来るのではと思った。JavaScriptのコードの最初と最後をtry-catchで囲んでおくだけで、誰にもcatchされなかった居残りエラーを最終的に捕まえることが出来るみたいな。
でも、何か実用的な感じがしないのは、catchのエラーオブジェクトに詳しい情報が入っていないせいかもしれない。

Ask.jpの一発検索が超便利な件

Ask.jpのWeb検索はインデックス数の少なさから、どうしてもGoogleYahoo!に比べると非力だ。正直、Web系の仕事をしている人とかだと、まず主力検索エンジンとしては使えないだろうと思う。でも、Ask.jpの検索には、非常に便利な側面もある。それが一発検索だ。
以下の検索例の検索ワードにリンクを貼っているので、クリックして検索結果の表示を確認すると良く解かるかと。

  • 今日の天気を調べる

東京 天気」で検索すると、検索結果の一番上に東京の天気が表示される。応用もできて、「東京 天気 週間」で検索すると、週間予報が表示される。ざっくり全国の天気を確認したいときは、「天気」と一言で検索するだけで良い。

  • 終電が何時か調べる

秋葉原 新宿 終電」と検索するだけで表示される。今から行くと?という時には「秋葉原 新宿」で検索すれば良い。

  • ○○ドルって何円?を調べる

500ドル」で検索すると表示される。調べる頻度は少ないかもしれないけれど、どこぞの通貨の検索ページを探してなんかするよりは、よっぽど楽だろう。

  • 首都を調べる

これも簡単で、「ドイツ 首都」のように検索すると表示される。ただ、結果の表示が判りにくいので、見落としている人が多いかもしれない。

  • テレビ番組表を調べる

個人的にほとんどテレビを観ないので使わないのだけど、「東京 テレビ」で検索すると、番組表が表示される。単純に「テレビ」と検索すると全国から選択していくこともできる。

  • 占う

好きな人には面白いかもしれない。「占い ふたご座」とかで運勢が表示される。

他にも、地図やら新車やらもあるのだけど、個人的にはお天気情報と路線情報がお勧め。特に天気は結構頻繁に使う。「東京 天気」のクエリ結果自体をお気に入りに登録してしまうと、それこそ一発検索なのでかなり便利。最近はCGMな時代かもしれないけれど、なんでAsk.jpは一発検索をもっと前面に売り込まないのだろうと思ってしまう。

JavaScriptの配列を数値でソートする

JavaScriptのArrayオブジェクトには組み込みで、sortメソッドが用意されている。でも、sortメソッドは文字列としてソートしてしまうので、要素が全て数字で数字順に並び替えるときには使えない。
例えば、

var test = new Array(10,0,5);
test.sort();
alert(test);

の結果は「0,10,5」となってしまう。
対応策は、人力検索の質問に回答があって、並び順を指定する関数を渡せば良いとのこと。

var test = new Array(10,0,5);
test.sort(function(a, b) {
return (parseInt(a) > parseInt(b)) ? 1 : -1;
});
alert(test);

これで結果が「0,5,10」となる。
Arrayオブジェクトのプロトタイプに追加してしまうとこんな感じか。

Array.prototype.sortByNumber = function() {
this.sort(function(a, b) {
return (parseInt(a) > parseInt(b)) ? 1 : -1;
});
}

これで全然問題ないのだけど、最近まともにプログラム書いてないので、リハビリがてらに数値ソートを自作してみた。

Array.prototype.sortByNumber = function() {
var ori = this;
var res = new Array();
for (var i = 0; i < ori.length; i++) {
var x = ori[i];
if (typeof x != "number") {
return false;
}
// Array.length == 0.
if (res.length == 0) {
res[0] = x;
// Array.length == 1.
} else if (res.length == 1) {
if (x > res[0]) {
res[1] = x;
} else {
var tmp = res[0];
res[0] = x;
res[1] = tmp;
}
// Array.length > 2.
} else {
var buf = new Array();
// Min
if (x <= res[0]) {
buf[0] = x;
for (var rk = 0; rk < res.length; rk++) {
buf[buf.length] = res[rk];
}
res = buf;
// Max
} else if (x >= res[res.length - 1]) {
res[res.length] = x;
// Between
} else {
var index;
for (var rk = 0; rk < res.length; rk++) {
var here = res[rk];
var next = res[rk + 1];
if (x >= here && x <= next) {
index = rk + 1;
}
}
for (var rk = 0; rk < index; rk++) {
buf[buf.length] = res[rk];
}
buf[buf.length] = x;
for (var rk = index; rk < res.length; rk++) {
buf[buf.length] = res[rk];
}
res = buf;
}
}
}
return res;
}
// Test code.
var test = new Array(
20,1,-1,4,10,3,12,11,2,100,11.124,22,43,-50,3.5
);
alert(test.sortByNumber());

ちなみに、ベンチを取ると明らかに組み込みのsortを使ったほうが速いので、リハビリコードは使わないようにしましょう。

邪魅の雫を買った

邪魅の雫 (講談社ノベルス)

邪魅の雫 (講談社ノベルス)

出勤中の朝8:45に書店に立ち寄って購入。今、会社の机に堂々と置いている。金色の帯が眩しい。
京極堂シリーズは全て読んでいるので、続編を楽しみにしてはいたけれど、小説を発売日に買うのは多分初めて。

mod_rubyインストール

Rubyは綺麗なシンタックスだから遊びでは色々書いていたのだけど、そろそろちゃんと書いてみるかと思って、やっとこさmod_rubyを入れてみた。今更かよって感じがするけれど、まぁいいや。

Apache 2.0.59 インストール

$ cd ~/download
$ wget http://www.apache.org/dist/httpd/httpd-2.0.59.tar.gz
$ cp ./httpd-2.0.59.tar.gz /usr/local/src/
$ cd /usr/local/src/
$ tar zxvf ./httpd-2.0.59.tar.gz
$ cd ./httpd-2.0.59
$ ./configure \
--enable-so \
--enable-shared=yes
$ make
$ sudo make install

Ruby 1.8.5 インストール

$ cd ~/download
$ wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.5.tar.gz
$ cp ruby-1.8.5.tar.gz /usr/local/src/
$ cd /usr/local/src/
$ tar zxvf ruby-1.8.5.tar.gz
$ cd ruby-1.8.5
$ ./configure
$ make
$ sudo make install
$ sudo ln -s /usr/local/bin/ruby /bin/ruby

mod_ruby 1.2.6 インストール

$ cd ~/download
$ wget http://www.modruby.net/archive/mod_ruby-1.2.6.tar.gz
$ cp ./mod_ruby-1.2.6.tar.gz /usr/local/src/
$ cd /usr/local/src/
$ tar zxvf ./mod_ruby-1.2.6.tar.gz
$ cd mod_ruby-1.2.6
$ ./configure.rb \
--enable-eruby \
--with-apxs=/usr/local/apache2/bin/apxs
$ make
$ sudo make install
$ sudo vim /usr/local/apache2/conf/httpd.conf
# add start
LoadModule ruby_module /usr/local/apache2/modules/mod_ruby.so
<IfModule mod_ruby.c>
RubyRequire apache/ruby-run
<Files *.rbx>
SetHandler ruby-object
RubyHandler Apache::RubyRun.instance
</Files>
</IfModule>
# add end
<Directory "/usr/local/apache2/htdocs">
# add start
options +ExecCGI
# add end
$ sudo /usr/local/apache2/bin/apachectl start

テスト

$ sudo vim /usr/local/apache2/htdocs/test.rbx
print "Hello World!"
$ sudo chmod 755 /usr/local/apache2/htdocs/test.rbx
$ links http://localhost/test.rbx

なんか、最近インストール系のことばっかりブログに書いてるなぁ。少しはプログラミングについて書けよってね。

[追記]
VMwareRubyGemsの最新を入れたので、それも追記しとく。前に入れたときのログをそのまま使ったから、0.9でも同じやり方でいいのかは知らないけれど、とりあえず入ったみたい。

RubyGems 0.9.0 インストール

$ cd ~/download/
$ wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz
$ cp ./rubygems-0.9.0.tgz /usr/local/src/
$ cd /usr/local/src/
$ tar zxvf rubygems-0.9.0.tgz
$ su -
$ cd /usr/local/src/rubygems-0.9.0
$ mkdir /opt/rubygems
$ export GEM_HOME=/opt/rubygems/
$ ruby setup.rb config --prefix=/opt/
$ ruby setup.rb setup
$ ruby setup.rb install
$ export RUBYLIB=/opt/lib/ruby/site_ruby/1.8/
$ /opt/bin/gem help
$ exit
$ vim ~/.zshrc
# add
export RUBYLIB=/opt/lib/ruby/site_ruby/1.8/
export GEM_HOME=/opt/rubygems/
export PATH=/opt/bin:/opt/rubygems/bin:$PATH

[追記の追記]
sudoで環境変数が上手くいってなかったっぽいので、潔くsuでインストールするように変更。