CentOS用textsearch_jaのRPMを作ってみた。

CentOS用にtextsearch_jaRPMを作ったので、思ったところを書いておきます。

下準備

textsearch_jaMeCabに依存しているのでとりあえずインストールします。MeCabCentOSrpmの作り方はMeCabをyumでインストール@CentOS - yokkunsの日記がわかりやすいです。

本題

ざっと探したところSPECファイルが見当たらなかったので適当に用意しました。

Name:   textsearch_ja
Summary: Integrated Full-Text-Search for Japanese language using morphological analyze.
Summary(ja): PostgreSQL用の形態素解析を用いた日本語全文検索拡張
Version:        9.0.0
Release:        1%{?_dist_release}
Source0:        http://pgfoundry.org/frs/download.php/2943/textsearch_ja-%{version}.tar.gz
License:        BSD
Group:          application/database
BuildRequires: postgresql-devel >= 8.3
BuildRequires: mecab-devel >= 0.97
BuildRequires: sed
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root
Requires: postgresql-server >= 8.3
Requires: mecab >= 0.97
Requires: mecab-ipadic >= 2.7.0

%description
Integrated Full-Text-Search for Japanese language using morphological analyze for PostgreSQL.

%description -l ja
日本語テキストの全文検索を行います。 PostgreSQL 8.3 で追加された組み込みテキスト検索を拡張するため、英語文書の検索と同様の方法で、日本語文書を検索することができます。検索は形態素解析を利用した単語単位で行われます。形態素解析には MeCab を使用しています。
利点として、GIN または GiST インデックスをベースにしているため、全文検索用のインデックスがリカバリ可能であることが挙げられます。また、既に tsearch2 に対応している欧米言語を対象とした製品を大きく改変することなく、日本語対応できる強みがあります。
非自立語を除外してキーワードを抽出するため、インデックスのサイズを小さく押さえられます。以下の例では「すもも」と「もも」のみ単語として扱っています。単語ごとではなく文字ごとの検索が必要な場合には、代わりに textsearch_senna を使用してください。

%prep
%setup -q
sed -ie '1s/^\xef\xbb\xbf//' *.c

%build
make 

%install
make install DESTDIR=$RPM_BUILD_ROOT

%clean
rm -rf $RPM_BUILD_ROOT

%files
/usr/lib/pgsql/textsearch_ja.so
/usr/share/pgsql/contrib/textsearch_ja.sql
/usr/share/pgsql/contrib/uninstall_textsearch_ja.sql

%changelog
* Mon Aug 29 2011 TANAKA Koichi 
- initial build

日本語descriptionはhttp://textsearch-ja.projects.postgresql.org/textsearch_ja.html#abstractをの文章を引用しました。
注意すべき点は%setupセクションにあるsedです。textsearch_ja-9.0.0のソースファイルはBOM付のUTF-8であるためCentOS 4,CentOS 5のGCCではコンパイル時に下記のエラーが出てしまいました。このためsedでBOMを取り除いています。

textsearch_ja.c:1: error: stray '\239' in program
textsearch_ja.c:1: error: stray '\187' in program
textsearch_ja.c:1: error: stray '\191' in program

また、make installではインストール先をDESTDIRで指定しています。PREFIXではないので注意してください。

間違っている点や改善すべき点がありましたらご指摘お願いします。

アップル嫌いですがMacBook Airを買いました

私はアップルが嫌いです。何年もそういい続けてきました。ちょっとしたトラブルがあったんですよ過去に。
けれど、昨日MacBook Airを買ってしまいました。

かなり昔から使っていたThinkPad X31のバッテリの寿命が、1年半ほど前に尽きてしまいコンセントつないでないとすぐバッテリ切れを起こすようになっていました。なのでここ数週間、新しいノートを買おうと思って主にWindows機を検討していました。本当はLinuxの入った奴が良かったんですが、一時期見かけたUbuntuのプリインストールされたノートパソコンはめっきり姿を消してしまいました。
WindowsLinuxがいいと言っても、話題のMacBook Airのスペックもついでに調べてみたわけです。衝撃を受けました。どう見ても同じ価格帯のWindows機よりも格段にいいんです。Core i5積んでメモリ4G積んでSSD(FLASH STORAGE)128G積んでディスプレイ11inchで10万円強。こんなスペックのWindows機なんてまずないです。
それでも、アップル嫌いなので性能差に愕然としながらも納得できるWindows機を探していたわけです。「絶対にMacBook Airなんて買うものか」と自分に言い聞かせていたわけです。
それが、昨日、事件が起きました。事件というか間違いが起きました。
昨日は@kanreisa,@yudoufuとともにPHPカンファレンスのウェブサイト構築のためのもくもく会を行ったのです。もくもく会。ノートPC必須ですよね。仕方ないのでThinkPadを持って行きました。
会場(といってもルノアールですが)について、電源を確保しPowerOnしました。電源つないでればスペックこそ低いですが、まぁ問題ないです。
……なぜかBIOS画面が出てきました。焦りました。「えっ。ちょっ。まっ。」です。
気を取り直して再起動してみます。今度は画面を凝視してました。すると、"Error"とか出ています。ふむふむ時計が設定されていないらしいです。時計……マザーボードの電池切れ? でも、とりあえず時刻設定してみたら、何とか起動できました。
もくもく会は順調に行きました。が、ずっと新しいマシンを買うことが頭から離れず、話題にも上り、
@kanreisaがこの後一緒に買いに行こうと言い出したわけです。
で、@kanreisaと一緒に買いました。

ほぼ勢いでした。どうしょうもなく勢いだけでした。人生そんなものです。
さて、帰宅して開封しいろいろと触ってみて1日たちました。

アップル嫌いでした。でも触ってみるとイノベーションでした。もう、どうしょうもなくイノベーションでした。ジョブズすげぇよ。アップルすげぇよ。と。iPhone,iPadで育んだものを生かしてます。
そして、なんでmemcachedまで入ってるの。Apache,PHPは百歩譲るけど。memcachedって。
完全に負けました。

追記:
ケースどうしようか迷ってます。とりあえず、Amazonメール便の封筒に突っ込んでみたけど、ちょっとはみ出るんですよね。

VirtualBoxを使って開発するときに知っておくと便利なこと

バックグラウンドで起動する

VirtualBoxで開発用サーバーを起動する場合にはバーチャルコンソールやらマネージャウインドウやらは不要ですよね。コンソールはputtyやらpoderosaやらからつないだ方がクリップボードとか便利ですし。
そこで便利なのがVBoxHeadlessTrayです。これを使うとマネージャーのウインドウやらバーチャルコンソールやらを排除してサーバーの起動・停止・状態の保存・復帰が行えます。

ホストオンリーネットワークでIP固定

複数台のサーバーをホストオンリーネットワークで立ち上げている場合、IPアドレスDHCPで自動設定させていると起動ごとに変わってしまって面倒です。なので、DHCPではなくて固定IPを設定します。
ホストオンリーネットワークのDHCPの設定はマネージャーのメニュー→ファイル→環境設定→ネットワークから行えます。こちらを確認するとデフォルトでは192.168.56.101から192.168.56.254がDHCPの貸し出しIPアドレスとなっています。また、ホストのIPアドレスは192.168.56.1,DHCPサーバが192.168.56.100です。
固定IPを設定する場合はこれら以外つまり192.168.56.2-192.168.56.99を使用するようにします。

CentOS6をVirtualBoxの仮想環境にインストールしてみた

やっとリリースされたCentOS6をVirtualBoxの仮想環境にインストールしたので流れを残しておきます。

CentOS6のダウンロード

今回はCentOS-6.0-x86_64-bin-DVDをBitTorrentでダウンロードしました。
CentOS-6.0-x86_64-bin-DVD1.iso,CentOS-6.0-x86_64-bin-DVD2.isoが含まれています。

仮想マシンの作成

仮想マシンを作成します。

CentOSRHEL系なのでオペレーティングシステムLinux、バージョンはRedHat64bitとしました。
また、メモリを1024Mに設定します。デフォルトの512Mではメモリ不足でGUIインストーラーが利用できませんでした。

インストール

とりあえずMinimalでインストールしました。インストール自体はすんなりいきました。

ネットワーク設定

インストール後再起動してログインしてみると、eth0が立ち上がっていませんでした。

そこで、/etc/sysconfig/network-scripts/ifcfg-eth0 を編集して次の二行を変更・追加します。

ONBOOT="yes"
BOOTPROTO="dhcp"

編集後次のコマンドを実行するとeth0が立ち上がります。

$ service network restart
または
$ ifup eth0

こんな感じで、ネットワーク以外は5.xと変わらずインストールできました。

携帯向けAgavi拡張の設計

社内では携帯向けAgavi拡張(KtaiAgavi/非公開)を作って利用しているけども、どうも使いにくいので設計を見直してみたい。折角なので公の場で開発しようかと思う。

キャリア判定

KtaiAgaviではキャリア判定をRequest初期化時にUserAgentを元に行っている。けれどこれは幾つか問題がある。

  1. Requestクラスを拡張するため、他のRequestクラスを拡張するライブラリなどと相性が悪い
  2. UserAgentは偽装可能なのでキャリア判定には不適切

後者については、IPアドレスからキャリアを判定するグローバルフィルタを併用することで対応している。しかし、本質としては、IPアドレスからの判定を基本として、端末情報については別途取り扱うべきである。
キャリア判定のタイミングとしてはRouting処理の前が良いが、このタイミングで処理するにはコアクラスの拡張が必須となってしまう。そこで、RoutingCallbackを用いた実装を検討したい。

キャリア情報・端末情報の格納場所

KtaiAgaviでは上記のように拡張したRequestクラスでキャリア判定を行った後、メンバ変数にこれらの情報を格納している。
しかし、agaviでの開発をしているこの実装は不便であることに気がついた。
agaviではRequestやAction,Viewと言ったものはAgaviAttributeHolderクラスを継承しており、実行時データを格納する方法を提供している。そして、多くの場面、たとえばアクションキャッシュのグループ分けなどで、attributeを利用することが想定されている。
したがって、agavi的にはキャリア情報や端末情報についてもRequestのattributeに保存するようにすべきである。

絵文字変換

入力はValidatorとして実装するのが良い。出力についてはFormPopulationFilterとの兼ね合いでグローバルフィルターとして実装せざるを得ない。*1ここはKtaiAgaviと同様になる。

画像変換

KtaiAgaviではModelとして実装しているが、やることは変わらないのでモジュールとして実装するとよさげ。

*1:パース時に絵文字が文字コードエラーを引き起こす

HTML5対応:意味と機能をマークアップ

HTML5が迫ってきました。そんな中「HTML5対応:divで乗り切れ: 万象酔歩」というエントリがあると聞き閲覧してみたところとても黙ってはいられずこのエントリを書き始めました。釣りなんじゃないかという疑念もありますが。まぁ釣られてみます。

それはHTML3.2だ。古すぎる。

まず、目についたのは「HTML5対処法メモ」のなかに現れる「CENTERが無くなる」「FONTが無くなる」「 Bがボールドでなくなる 」「Aがアンカーでなくなる 」といった文言です。これらはすべてHTML4の時点で非推奨となっていたり代替手段が提供されているもので、とっくに用済みとなっているべきものたちで、HTML4が後方互換のために残さざるを得なかったHTML3.2の負の遺産にすぎません。そもそも"HTML5対処法"以前にHTML4にすらまともに対応していなかったことになります。

まずはHTML4を知るべし。

HTML3.2の考え方が抜けきっていないのであればHTML5を知る前にHTML4を知るべきです。HTML3.2からHTML4への重要な変化は「html文書から見た目に関する事柄を排除すること」につきます。つまり、HTML3.2にあるCENTER,FONT,Bと言った見た目のための要素は無くし見た目はCSSなどののスタイル定義に任せようということです。こうすることで"見た目を変えるためにマークアップをし直す"というようなことが起こらなくなります。簡潔にスタイル定義さえ書き換えれば良いのです。
さて、このことについて件のエントリには下記のような興味深い記述があります。

また、これまでは文の定義そのものとその表示形式指定はかなり分離されていましたが、 HTML5では文の定義に形式を持たせる形になります。

文章中にcenter要素やb要素などが入っているのが「表示形式指定はかなり分離されていた」と主張するのは道理に合いません。そのうえ、根拠として示して次のような説明をしています。

例えば、文とは別レベルであった<center>などが廃止され代わりに文の定義<table>などで style="margin-left:auto;margin-right:auto;text-align:center"などというとんでもない寿限無指定するのが標準となります。

確かにstyle属性によってスタイル定義を行うことは出来ますが本当に標準なのでしょうか?HTML4の仕様書*1を見てみると、次のようにあります。

スタイルシートを別ファイルにすることで、容易に再利用できるようになる。一方、文書の始めの部分にレンダリング命令をまとめておいたり、本文の各要素の属性として記しておくなどして、文書にスタイルシートを含めることが便利な場合もある。サイト単位でのスタイル管理が容易にできるよう、本仕様では、文書に適用するスタイルシート情報をHTTPヘッダで設定する方法を説明する。

Style Sheets in HTML documents (ja)

多くの場合、著者はひとまとまりの文書には共通のスタイルシートを利用する。この場合、スタイルルールを文書内部に分配することは、1つの外部スタイルシートにリンクすることよりも実際に効率が低下する。なぜなら外部スタイルシートにリンクした場合、大部分の文書にとっては、ローカルのキャッシュにスタイルシートが既に存在するからである。優れたスタイルシートが公有されることで、この効果は増大するだろう。

Style Sheets in HTML documents (ja)

つまり多くの場合は共通の外部スタイルシートを使うけれど、利便性のために属性指定もできるようにしてあるということです。なので属性による記述は"標準"などではありません。また、多くの場合使うとされている外部スタイルシートでは"容易に再利用ができる"という利点まで明記されています。
つまり、根拠も主張もHTML5以前にHTML4の仕様書すら読んでいないと思えるほどの内容です。このあたりの斜め上な説明を見てると釣りなのではという疑問がわいてくるわけです。
また、次の項でもとりあげるclassの指定についてもHTML4の仕様を理解していない記述がありました。

classは多重派生させることはできませんので、中央寄せのこの色、左寄せのこの色といった具合に無数のclass定義をすることになりかねません。

このように書かれていますが、仕様書を見てみるとclass属性には複数の値持たせることができると書いてあります。

class = cdata-list [CS]
この属性は、ある要素に1つのクラス名を割り当てるか、または複数のクラス名を設定する。幾つの要素に対してでも、同じクラス名あるいはクラス名群が割り当てできる。複数のクラス名については、空白文字によって区切らねばならない。

http://www.asahi-net.or.jp/~SD5A-UCD/rec-html401j/struct/global.html#adef-class

また、CSS2にも複数指定されたクラスを選択するセレクタが存在します。詳しくはSelectors(邦訳)をご覧ください。

class,idの使い方。

これもやはりHTML4の話につきるわけですが、件のエントリで頻繁に登場する"divで乗り切れ"の項でのclassやidの使い方がとても正しいとは言えないものです。

たとえばfont要素の代替手段として次の例が示されています。

.red{color:red}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<p>XHTMLは<span class=red>機械向け仕様</span>であって人間向けではありません

このようにclassにredという見た目に関する名前を付けてしまうとよろしくありません。この辺はHTMLの仕様の裏側まで読み解く必要があり詳しく説明するのも一苦労なので、細かいことは神崎氏の「ごく簡単なHTMLの説明」をご覧ください。

「HTML6に望むこと 」のはずがCSSに望んでる

ここまでHTML5について全く触れていないんですが、HTML6に望む事があるというので見てみると、中身はほとんどCSSについてです。CSSはHTMLとは独立した仕様であって、また仕様上HTMLから利用できるスタイルシートCSSだけではありません。
HTMLに関することがらである「HTML記述のincludeが欲しい。 」についてもHTML4から仕様としてはobjectでhtmlを読み込んだり出来ますし、XHTMLではxincludeを併用することでも実現できます。

結論

HTML5の話題ではなく、まるでHTML4が出てきたときに批判した文章をsed -i s/HTML4/HTML5/g に通したような内容でした。HTML5の新規機能には全く触れてませんし…
HTML5を前にしてHTML4を復習する教材としては面白いかもしれませんね。

HTML5への自動変換(2010-06-01 20:54 追記)

触れるのを忘れていましたが、件のエントリにはHTML5への自動変換のためのbuild.xmlが掲載されています。この変換ではdoctypeも指定していないようですし変換後にHTML5な要素が出てこないようですのでまぁよくてできの悪いHTML4にしかなりません。そもそも意味論的なマークアップをしていないHTML3をHTML4や5に自動変換するのはナンセンスだと個人的には思います。
ただ、そんなことは実はどうでもよくて、そもそも現在使われている一般的なブラウザは既存のHTML3な文書についてもそれなりに解してレンダリングしてくれるし、この先も特別な事情でもない限りこの互換性は当分の間保たれると思います。となると、無理して質の悪いHTML4や5に変換しなくてもそのままHTML3でいいんじゃないでしょうか。

*1:ここでは日本語を使う人のため日本語訳を参照します。正確性を求める場合は原文をお確かめください。

アイアンマン2試写会行ってきました

Oracle提供のアイアンマン2試写会に行ってきました。
ラクルとアイアンマン2は今回タイアップしていて、UNIVERSAL-FRAGMENTSというサイトを立ち上げてるそうです。このサイトの左っかわにあるVisit Oracle at Stark Expoから見れるコンテンツは、アイアンマンの劇中で開催されているスタークインダストリー主催の博覧会スタークエキスポに出展されている、オラクルパビリオンの出し物という設定だとか。この、オラクルのパビリオンは映画の中でも重要なシーンの舞台となります。でも、今回の試写会がオラクルの主催だという意識がなかったら気がつかなかったかも知れません。ほんの一瞬、ORACLEのACLEあたりが見えるだけなのでw あと、サイト内で見られるキンミライなアトラクションではなかったですね、あの端末はエントランス辺りにあるんだろうか。
前作は天才社長が肉体的だったり社内政治的だったりの窮地から脱出する物語でしたが、今回は外的が襲ってきます。予告ムービーとかでグフみたいなムチ振ってるオッサンです。こいつも天才だったりするんですよ。頭良いわ体力あるわの二人がぶつかる訳です。うらやましい限りです。でも、アイアンマンことスタークは体に異変が。。。てな感じですよ。
近頃ハマってる勧善懲悪じゃないアメコミ映画。人間味溢れてちょっと考えさせられた後に、ド派手はアクションシーン。空中戦とマシンガン乱射がありますよ。マシンガン乱射。そして爆発。重低音大事。
あと、OracleのCEOラリー・エリソンも本人役?でカメオ出演しています。ラリーといえば前説でオラクルの方が「うちの会長とスタークは共通点が多く似ている」というようなことを言っていました。でも、それ前提で見ていたらスタークが作中でヒーローらしからぬ行動を・・・・・・

そういえば会場にはアイアンマンも登場して大盛り上がりでしたよ!写真もとったけど携帯だったのでぶれぶれでみられたもんじゃありませんでした><