Rast ver. 0.2.0 リリース
Rastがアップデートされた。
ライセンス変更といくつかのバグフィックス。
OR検索時に検索結果が重複するバグも修正された模様。
何も珍しいことをせずにインストールできました。
Rast.pmもバージョン0.03で動きました。
とりあえず、このblogの検索デモをアップ。
« 2005年05月 | メイン | 2005年07月 »
Rastがアップデートされた。
ライセンス変更といくつかのバグフィックス。
OR検索時に検索結果が重複するバグも修正された模様。
何も珍しいことをせずにインストールできました。
Rast.pmもバージョン0.03で動きました。
とりあえず、このblogの検索デモをアップ。
otsuneの日記の 「企画マンの思いつきによる変化を嫌がる」のがプログラマ が、常日頃言いたいことをスパっと書いていて気分がいい。ただ、
技術系の人たちには常識だけど「変化を楽しむ」というプログラマはかなり少数派。
というあたりは条件によるかな。
変化というかプログラムを変えていくことを楽しめることもあると思われ。その条件は
1.変化のアイディアを出す人への信頼、自分なら面倒なことも確実にOK
2.アイディアとそれまでのプログラムの構造に矛盾がないこと
3.プログラムの構造が大体頭に入っていること。
1、2はいいとして、3は個人的に重要だと思っている。大抵の場合、作ったプログラムなんてすぐに忘れる。作っているときは頭の中をそれでいっぱいにして集中して作っているけど、作り終わればきれいさっぱり忘れてる。「変化を楽しむ」=「次々と変化させていく」ということでもある、何かを作ったあと期間を空けることなく連続して集中してプログラムを変化させていくことがループするけど変化を楽しむ条件ではないでしょうか。
完成したプログラム(機能)を2、3ヶ月もpendingしておくのは、こういったことを考えてもかなり最悪。
実名でのネット活用促す 総務省「悪の温床」化防止
「実名でのネット活用促す」ってタイトルが悪い。総務省発表資料が何もないのであれだが。
総務省は27日、自殺サイトなど「有害情報の温床」ともいわれるインターネットを健全に利用するために、ネットが持つ匿名性を排除し、実名でのネット利用を促す取り組みに着手する方針を固めた。匿名性が低いとされるブログ(日記風サイト)やSNS(ソーシャル・ネットワーキング・サイト)を小中学校の教育で活用するよう求め、文部科学省などと具体策を詰める。
やっぱり意味不明。この間の読売の記事で書かれた流行りのブログやSNSを教育に盛り込んでいこうっていう単にそれだけの話だと思うのだが。
その読売の「子どもはみなブログを持て」の反応が結構アレ。ブログを書かせるとますますインターネットにつまらない情報が流れて、ブログ嫌いが増えるなんていう意見が多いように見える。時代錯誤だろそれは。日記を書いて先生だけが見ていた(ヘタすると丸がついていたり)ところがクラス全員で読めるようになって、いろいろな反応も貰いやすい。テキストを書く能力は上がるだろうし、プレゼンテーション能力の開発にもなる。良いことだと思うんだけど。
Mac mini届いた。普通にTigerがインストールされてました。
まだマウスがベストポジションにこない。
さっそくiTunesに曲をいれる作業を開始。
CDが回ると結構Mac miniうるさい。ファンが高速回転するときもちょっとうるさい。
なにもしていないときはいいんだけど。

まだ雑然としている机の上。AIBOとちょっと似合う。
mixiのよつばとコミュによると、ドラマ化するらしい。まじっすか?
http://www2.ezbbs.net/24/techside/img/1119539897_1.jpg
ネタでなければ、
風香に石原さとみ
とーちゃんに江口洋介
ジャンボに阿部寛
これ以上ないかもしれない配役。
関連は非常に薄いが同時にAmazonで注文。
パノラマ・スティール・オーケストラはマジお薦め。
こっちは単純におもしろそうだと思ったのでクリック。
Firefoxのgmail notifierが使えない。login Failedしてしまう。
なんか仕様がかわったのかしら。。
関係ありそうなextensionのソース部分
var data = "service=mail&Email=" + encodeURIComponent(this.username)
+ "&Passwd=" + encodeURIComponent(this.password) +
"&null=Sign%20in&continue=http://gmail.google.com/gmail";
this.start("https://www.google.com/accounts/ServiceLoginBoxAuth", data, null,
"https://www.google.com/", this.callback);
Mac mini注文しますた。
製品名: Mac mini 1.4GHz - Japan
オプション:
1GB DDR333 SDRAM - 1 DIMM
80GB Ultra ATA HDD
コンボドライブ
AirMac Extreme カード
56K V.92 モデム
アクセサリキット
Mac OS X - 日本語
●Think Secretが、Appleは来週にもMac OS X 10.4.2を公開し、会わせてパケージ版もMac OS X 10.4.2に変更するようだと伝えていました。また、Mac miniはしばらくアップデートは行われないかもしれないとも伝えていました。(翻訳)
これみて、決めました。
先日ぽどが始めたぱどMOなるサイトがあるのだが、これはサイトの説明によると
ぱどモバイル版(通称:ぱどMO)は、〜中略〜「ぱど」でおなじみのお店を紹介する、モバイルサイトです。いつでも、どこでも、その場、その時々でお店が探せる便利なサイトです。
常に持ち歩ける電話帳+地図帳+クーポン帳としてご活用ください。
なサイト。(株)ぱどのIRでは、
「ぱどMO」は基本情報として全国約900 万件の法人の電話帳情報を既に集録しており、「ぱどMO」
に店舗情報を掲載していただくことによって、モバイル用簡易ホームページを作成することができ、
地図を含んだ店舗詳細情報(画像を含む)が掲載可能となります。さらに「ぱどタウンマガジン」と
連動し、メディアミックスで強力にお店をサポートいたします。
と紹介されている。全国約900 万件の法人の電話帳情報を既に集録というのがすでに微妙に納得のいかない部分ではあるのだが、その900万件の法人の中になぜ、うちの実家(父親はサラリーマン)が載っているのですか?しかも削除依頼フォーム等はありません。
ぱどMOのシステムを作成しているのは、日本ソフト販売という会社で、この会社はそもそも電話帳を専門としている。年賀状ソフトなどにも採用されているらしい。データの元はハローページ。ハローページに載っている電話番号であれば個人情報の問題はある程度クリアされると思うだが、それ自体ネットがなかった牧歌的な時代のものであるし、用途が勝手に広がるのは気分悪い。振り込め詐欺の道具にもなっていないだろうかと心配する。Yahoo電話帳やら9199.jpあたりを調べるとこちらは、タウンページを元にしてるので個人宅はでてこない。ま、こちらが当然だろう。
日経の記事「中国、外国アニメ午後5—9時放映禁止へ・香港紙報道」より
中国では、米国のディズニーアニメのほか、日本の「キャプテン翼」、「ちびまる子ちゃん」、「超魔神英雄伝ワタル」なども人気だ。
うわっ、なつかし!「超」がついているってことは魔神英雄伝ワタルとか、その2も人気ってことですか?
HTML::Template::Pro
HTML::TemplateのXS版。HTML::Templateと比べて、10倍〜25倍早いらしい。mod_perlでも効果あるようだ。
HTML::Template::Pro loads, parse and outputs template on fly,
when you call $tmpl->output(), in one pass. The corresponding code is
written in C and glued to Perl using Perl+XS. As a result,
comparing to HTML::Template in ordinary calls, it runs
10-25 times faster. Comparing to HTML::Template with all caching enabled
under mod_perl, it still 1-3 times faster.
ベンチマーク結果。スクリプトは追記に
$ perl htmltmplpro_bench.pl Benchmark: timing 1000 iterations of HTML::Template, HTML::Template::Pro... HTML::Template: 10 wallclock secs ( 9.43 usr + 0.01 sys = 9.44 CPU) @ 105.93/s (n=1000) HTML::Template::Pro: 1 wallclock secs ( 1.02 usr + 0.09 sys = 1.11 CPU) @ 900.90/s (n=1000)
確かに10倍弱ぐらいは早い。
#!/usr/bin/perl
use strict;
use HTML::Template;
use HTML::Template::Pro;
use Benchmark;
my $html = <<EOF;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>test</title>
</head>
<body>
<TMPL_LOOP NAME=list><TMPL_IF NAME=key><TMPL_VAR NAME=key>,<TMPL_VAR NAME=value><br></TMPL_IF>
</TMPL_LOOP></body>
</html>
EOF
my @list;
for(my $i=0;$i<30;$i++){
push(@list,{
key=>$i,
value=>rand($i)
});
}
Benchmark::timethese(1000, {
'HTML::Template' =>?&htmltmpl,
'HTML::Template::Pro' => ?&htmltmplpro,
});
sub htmltmpl{
my $tmpl = HTML::Template->new(
scalarref => ?$html,
die_on_bad_params=>0
);
$tmpl->param('list',?@list);
$tmpl->output;
}
sub htmltmplpro{
my $tmpl = HTML::Template::Pro->new(
scalarref => ?$html,
die_on_bad_params=>0
);
$tmpl->param('list',?@list);
$tmpl->output;
}
HTML::TemplateってPure-Perlなので、ポータビリティが高いところがいいのだが、mod_perlが使えなくて、シビアな動作条件がでていて、運良くPure-Perlでないモジュールが使える場合に使えるかな。
最速インターフェース研究会さんの(?)Ajaxって結局何なのさにウケタ。
僕のイメージでは、「通信付きのJavaScriptだよ」に近いかな。
Asynchronoustっていうのが、JavaScriptの実行に非同期なのではなくて、HTMLの読み込みに非同期(便利に使えればいいや派)。でその肝はXMLHttpRequest における非同期通信機能。っていうの理解はだめっすかね。
1番乗りは気持ちいいね。快勝だし、7時に帰ってきた甲斐がありました。
さて、次はコンフェデでボロ負けしないように。
Data::PageをActionScript2.0に移植しました。
元のバージョンは1.03、「$」を「this.」に変えて、メソッドの後ろに「()」を付けただけ。これでものぐさできます。
class Data.Page {
var TOTAL_ENTRIES:Number;
var ENTRIES_PER_PAGE:Number;
var CURRENT_PAGE:Number;
function Page(total_entries:Number, entries_per_page:Number, current_page:Number) {
this.TOTAL_ENTRIES = total_entries;
this.ENTRIES_PER_PAGE = entries_per_page;
this.CURRENT_PAGE = current_page;
}
/* total_entries */
function total_entries():Number {
return this.TOTAL_ENTRIES;
}
/* entries_per_page */
function entries_per_page():Number {
return this.ENTRIES_PER_PAGE;
}
/* entries_on_this_page */
function entries_on_this_page():Number {
if (this.total_entries() == 0) {
return 0;
} else {
return this.last()-this.first()+1;
}
}
/* current_page */
function current_page():Number {
return this.CURRENT_PAGE;
}
/* first_page */
function first_page():Number {
return 1;
}
/* last_page */
function last_page():Number {
var page:Number = this.total_entries()/this.entries_per_page();
if (page == Math.floor(page)) {
return page;
} else {
return 1+Math.floor(page);
}
}
/* first */
function first():Number {
if (this.total_entries() == 0) {
return 0;
} else {
return ((this.current_page()-1)*this.entries_per_page())+1;
}
}
/* last */
function last():Number {
if (this.current_page() == this.last_page()) {
return this.total_entries();
} else {
return (this.current_page()*this.entries_per_page());
}
}
/* previous_page */
function previous_page():Number {
if (this.current_page()>1) {
return this.current_page()-1;
} else {
return null;
}
}
/* next_page */
function next_page():Number {
if (this.current_page()<this.last_page()) {
return this.current_page()+1;
} else {
return null;
}
}
/* skipped */
function skipped():Number {
return this.first()-1;
}
/* splice */
function splice(array:Array):Array {
return array.slice(this.skipped(), this.last());
}
}
</pre>
5分前の昨日、誕生日でした。27になりました。
鈴木隆行とおなじ誕生日です。
さきのエントリーでSennaは「N-gramインデックスを備え」と書いたが、N-gramにも対応しているというのが正しいかも。SennaをMySQLと連携させて使うときはSennaに付属のPatchを使うわけだけど、そのPatchではN-gramなインデックスをつくるようになっていません。mecabを利用した形態素解析がされています。せっかくなので、N-gramに対応させてみた。
Senna付属のPatchを当てた後のMySQLのソースコードをちょっと変更します。
「myisam/mi_open.c」の280行目(?)ぐらい
share->keyinfo[i].senna = sen_index_create(buf, sizeof(my_off_t), SEN_INDEX_NORMALIZE, 0, sen_enc_default);
これを
share->keyinfo[i].senna = sen_index_create(buf, sizeof(my_off_t), SEN_INDEX_NORMALIZE|SEN_INDEX_SPLIT_ALPHA|SEN_INDEX_SPLIT_DIGIT|SEN_INDE X_SPLIT_SYMBOL|SEN_INDEX_NGRAM, 0, sen_enc_default);
にします。
そして、
# make clean # ./configure # make;make install
とすればOK。インデックスは一度破棄して再作成する必要があります。
SennaのAPIの解説はこちらです。SEN_INDEX_*オブションはそれぞれ
SEN_INDEX_NORMALIZE
英文字の大文字/小文字、全角文字/半角文字を正規化してインデックスに登録する
SEN_INDEX_SPLIT_ALPHA
英文字列を文字要素に分割する
SEN_INDEX_SPLIT_DIGIT
数字文字列を文字要素に分割する
SEN_INDEX_SPLIT_SYMBOL
記号文字列を文字要素に分割する
SEN_INDEX_NGRAM
(形態素解析ではなく)n-gramを用いる
となっています。
ためしにぱどタウンのまち探検ナビのデータから5000件を登録するテストを行ってみましたが、なかなか快適に動きます。まち探検のナビキーワード検索をSennaに置き換えることを提案しています。
Rastにつづいて、Sennaを試してみる。
Sennaは、組み込み型の全文検索エンジンで、データベースなどと一緒に使えて、しかもN-gramインデックスを備えてます。インストールは開発者やPatchの作成者のおかげで思ったより楽でした。
OSは今回はCentOS4.0。何も使ってないマシンにいれました。
MySQLが動いているマシンだとさすがに怖い。
MecabにPatchをあててインストール
# wget http://dev.razil.jp/archive/mecab-0.81.mte.patch.20050423 # tar zxf mecab-0.81.tar.gz # cp ipadic-2.5.1.tar.gz mecab-0.81/dic/ # cd mecab-0.81/dic/ # tar zxf ipadic-2.5.1.tar.gz # cd .. # patch -p1 < ../mecab-0.81.mte.patch.20050423 # ./configure --enable-mutex --prefix=/usr # make # make install
Sennaのコンパイルとインストール。
今回は、デイリースナップショットから入れました。
# wget http://dev.razil.jp/archive/senna/senna-20050601-svn.tar.gz # tar zxf senna-20050601-svn.tar.gz # ./configure --prefix=/usr # make # make install
MySQLのインストール。
コンパイルオプションは、MySQLのドキュメントや、rpmのSPECS、MLのこちらのメッセージを参考にしました。
# /usr/sbin/groupadd -g 27 mysql # /usr/sbin/useradd -g mysql -u 27 -d /var/lib/mysql mysql # wget http://dev.mysql.com/get/Downloads/MySQL-4.0/mysql-4.0.24.tar.gz/from/ftp://ftp.u-aizu.ac.jp/ftp/pub/dbms/mysql/mysql.com/ # tar zxf mysql-4.0.24.tar.gz # cd mysql-4.0.24 # patch -p1 < ../senna/bindings/mysql/mysql-4.0.24.senna.diff # autoconf # CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ? ./configure ? --prefix=/usr ? --with-extra-charsets=complex ? --with-charset=ujis ? --enable-thread-safe-client ? --enable-local-infile ? --enable-assembler ? --with-client-ldflags=-all-static ? --with-mysqld-ldflags=-all-static ? --with-mysqld-user=mysql ? --localstatedir=/var/lib/mysql ? --with-unix-socket-path=/var/lib/mysql/mysql.sock # touch ./Docs/Images/cluster-components-1.txt # touch ./Docs/Images/multi-comp-1.txt # touch ./Docs/errmsg-table.texi # touch ./Docs/cl-errmsg-table.texi # make # make install # ./scripts/mysql_install_db # chown -R mysql.mysql /var/lib/mysql # chmod 755 /var/lib/mysql # cp support-files/my-medium.cnf /etc/my.cnf
mysqld_safeとして起動で、起動後にパスワードの設定を忘れないように。
テストはこんな感じで。
まず。データベースとテーブルを作ります。
mysql> create database sennatest; mysql> use sennatest mysql> create table articles( -> id int unsigned not null auto_increment primary key, -> body text, -> fulltext(body) ->); Query OK, 0 rows affected (0.01 sec)
データを入力。はてなブックマークの人気サイトのタイトルだけ持ってきてみました。
mysql> insert into articles values -> (null,"郵貯民営化は重要な問題だと思う "), -> (null,"スローライフを志向するiPodの強み - CNET Japan"), -> (null,"HTML, CSS, Photoshopを同時に学べるサンプル付きデザイン記事:Goodpic"), -> (null,"jazzanovaの日記 - 現在顧問弁護士に相談中であり、対応についても検討中"), -> (null,"mixi非公式ニュースサイト - mixiの問題人物Kusakabe氏、強制退会に?"), -> (null,"むだづかいにっき♂:ネット上で議論を仕掛ける事について"), -> (null,"はてな perl ハッカーの方々にお聞きします。近頃ますます良い感じなperlですが、どのような開発環境で開発していますでしょうか。"), -> (null,"シナトラ千代子 - 投げ銭が飛び交うなかでダイアリーに立てこもる、という意味。"), -> (null,"Going My Way: Skypeの会話をPodcast用に録音する場合の設定方法"), -> (null,"Kusakabeさんがmixiの一部?を賑わしている。彼にmixi強制退会が言い渡されたのだ。"), -> (null,"Ringo's Weblog: googleと競合しない方法2 "), -> (null,"Moleskin Diary - 投げ銭よりたれ銭"), -> (null,"第38回 海外メディアが伝えた小泉・郵政解散劇の評判 - nikkeibp.jp - 立花隆の「メディア ソシオ-ポリティクス」"), -> (null,"ほその日記 - フォームが変更された事を知る"), -> (null,"総選挙はてなと公職選挙法:北海道に住む国家公務員日記 "), -> (null,"はてな、政党を株式に見立てて総選挙結果を予測 - CNET Japan"); Query OK, 16 rows affected (0.06 sec) Records: 16 Duplicates: 0 Warnings: 0
検索をしてみます。日本語で検索ができていれば以下の検索結果になると思います。
mysql> select * from articles where match (body) against ('はてな');
+----+----------------------------------------------+
| id | body |
+----+----------------------------------------------+
| 7 | はてな perl ハッカーの方々にお聞きします〜
| 15 | 総選挙はてなと公職選挙法:北海道に住む国家公務員日記
| 16 | はてな、政党を株式に見立てて総選挙結果を予測〜
+----+----------------------------------------------+
3 rows in set (0.01 sec)