May - 27th

Microsoftからの刺客、その名もWIMP

Posted at 3:09 pm | Filed Under Apache, Linux, PHP, Windows

LAMPに対抗して、MicrosoftがIIS上でPHPを動かす環境を宣伝している。MSSQLではなくMySQLやPostgreSQLを宣伝するというのも愉快ではあるが。

それより何より、やはり気になるのは

Linux + Apache + MySQL + Perl(PHP, Python…) = LAMP

に対抗したキャンペーンの略称が、

Windows + IIS + MySQL + PHP = WIMP

になってしまっていることだろうか。

英辞郎より

wimp
【名】

弱虫、作話症{さくわしょう}、意気地なし、怖がり、勇気のないやつ、すぐあきらめるやつ
・You’re such a wimp. : 気が小さいね。
・That tequilla shot has been sitting there an hour, are you too much of a wimp to drink it?

さすが世界のMicrosoftはユーモアを忘れていない。

Read More>

May - 24th

携帯端末の404 Not found対策

Posted at 10:24 pm | Filed Under Apache, mobile

携帯端末の場合、サーバからステータスコード404が返ると、サーバ側のエラー画面を表示するのではなく処理を中断してしまうことがある(少なくともauではそうなった)ので、.htaccessでの制御で工夫しなければいけない。

普通、ステータスコード別に表示するHTMLドキュメントを指定する場合は

ErrorDocument 404 /error.html

のようにErrorDocumentディレクティブを利用する。しかし、ここで指定するのがローカルファイルへのパスの場合、ステータスコードはそのまま404を返してしまうため、携帯端末だとページを表示する前に処理が中断され、指定したドキュメントを表示させることができない。

解決方法は簡単で、

ErrorDocument 404 http://selfkleptomaniac.org/error.html

のようにリモートのURLを指定すると、この場合は404ではなくリダイレクトの302が返るため、携帯でも問題なく表示することができる。Apacheのマニュアルでは

リモート URL (例えば、頭に http と付与した方法) を ErrorDocument に指定するとき、 たとえ文書が同じサーバにあろうとも、ドキュメントがどこにあるかを通知するために、 Apache はリダイレクトをクライアントに送出するということに、注意してください。 これにはいろいろと関連して起こる問題があります。 中でも最も重要なのは、クライアントは元々のエラーステータスコードを受け取らず、 代わりにリダイレクトのステータスコードを受け取るということです。 これにより、ステータスコードを使って URL が有効であるかどうかを決定しようとする ウェブロボットやその他クライアントを、混乱させるかもしれません。 さらに、ErrorDocument 401 にリモートの URL を指定すると、 クライアントは 401 というステータスコードを受け取らないため、 パスワードをユーザーに入力要求しなければならないことがわかりません。 従って、ErrorDocument 401 というディレクティブを使う場合は、 必ずローカルな文書を参照しなければなりません。

とのこと。

Read More>

May - 22nd

Yahoo JapanのAPI、まめな病人

Posted at 1:04 pm | Filed Under Apache, PHP, Web Services

ブスコバンのアレルギーらしく、健康診断が終わってからずっとひどい頭痛だ。今日はちょっと家で休んでいる。

Yahoo JapanのAPI用に既存のPEARパッケージを拡張したServices_Yahoo_JPがある(作者サイト)。面白そうなのでさっそく使ってみた。

テキスト解析はこんな風に使える。例えばテキストの読みがなを取得する。

<?php
require_once 'Services/Yahoo/JP/MA.php';

$keyword = 'これは日本語です。';
$app_id = 'Your APP ID';

try{
        $yahoo = Services_Yahoo_JP_MA::factory('parse');
        $yahoo->withAppID($app_id);
        $yahoo->setSentence($keyword);
        $result = $yahoo->submit();

} catch(Services_Yahoo_Exception $e){
        $error = 'すいません、YahooJapanに接続できませんでした。';
}

if($result){
        $xml =& $result->xml->ma_result->word_list->word;
        foreach($xml as $key => $val){
            print($val->reading . "\n");
        }
}
?>

なるほど。で、何か面白いことでもできないかと考えたが、Yahooから戻ってくる読みがなをさらにローマ字に変換して、Mac OS Xに付属のsayコマンドで読み上げてみるのはどうだろう。

$ say -o 出力ファイル "読み上げるテキスト"

上の書式で変換できるので、フロントエンドのPHPと連携してみれば簡単だ。

そこでふと思いついた。sayコマンドは声の指定も可能なのだが、プリセットされたデータには歌いながらしゃべるパターンもあったはずだ。それを指定すれば、入力したテキストを歌うこともできるじゃないか。

$ say -o 出力ファイル -v "声のパターン名" "読み上げるテキスト"

そうと決まれば話は早い。というわけでデモを作成した。(Proof of conceptということで無茶なことはしないでくださいね)

テキストが入力されると、バックエンドのMacBookにHTTPで通信してプロシージャを呼び出し、MacBook側はテキストを元に音声ファイルを作成してMP3に変換、最終的に作られたファイルをDocmentRoot以下に設置してファイルのパスを返す。フロントエンドのウェブサーバにリバースプロキシでMacBookのローカルファイルにアクセス可能にしてあげていっちょあがり。文字で書くとややこしいが、図にするといたって単純。

Sing System-1
追記:Yahoo JapanのAPI側で数字の読み方は返してくれないみたいだ。

Read More>

Nov - 18th

Leopard雑感

Posted at 11:49 am | Filed Under Apache, Apple, PHP, pgpool

Leopardにして困ったこと。

Apache

 apachectlの「ULIMIT_MAX_FILES=”ulimit -S -n `ulimit -H -n`”」の行でエラー。ulimitの引数が「unlimited」になるとエラーらしい。とりあえず動くし手元のテスト環境なので無視。

pgpool-II

 起動したら「could not create shared memory segment: Cannot allocate memory」で死ぬ。どうにもわからんのでpgpoolに戻した。

PHP

 PHP-5.2.5はiconv関連のエラーでビルドできない。ext/iconv/iconv.cを開いて:%s/iconv_open/libiconv_open/gと:%s/iconv_close/libiconv_close/gすればビルドできるようになる。Leopard対応できてない。

kinput2-macim

 Leopard対応していない、と怒られてインストールできない。対策なし。

Read More>

Nov - 2nd

Apache落ちてました

Posted at 9:54 am | Filed Under Apache

目が覚めたらアラートメールが大量に届いていた。Apacheが落ちていたらしい。logrotateの失敗が原因だった。

RedHat系のOSだとlogrotateのスクリプトがkill -HUPするようになっているので、

/bin/kill -USR1 `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true

これに変更しておいた。

Read More>

Sep - 22nd

サーバ落ちてました

Posted at 11:37 am | Filed Under Apache

目が覚めたらサーバがぶんぶんうなっていました。httpdが上がってこないので再起動したら復旧。

Read More>

Jul - 9th

Zend_Search_Lucene

Posted at 3:30 am | Filed Under Apache, PHP

Apache LuceneのPHPへのポート、Zend_Search_Luceneの記事

基本的にデータベースやPHPの拡張無しでLucene1.4以上のデータとバイナリ互換性のある全文検索インデックスを扱える。だから、Apache Lucene互換のプログラムから作成した検索インデックスがあればそれを検索することが可能で、その反対にZend_Search_Luceneで作成したインデックスを他のプログラムから利用することもでできる。

サンプルプログラムでは検索インデックスを作成して、そこから検索を実行するまでのデモになっている。数字の混ざった語を扱う場合は設定に注意が必要。

ざっと見た限りではUTF-8に対応はしていないみたいだが…

Read More>

Feb - 24th

GETとHEAD

Posted at 4:38 am | Filed Under Apache, PHP

CPANからLWPをインストールしたら大文字と小文字を区別しないHFS+のせいでheadが上書きされてしまったMacユーザの話題を最近読んだが、今このHEADでちょっと困っている。

Apacheの子プロセスがSegmentation faultで落ちてしまうので原因を調べたら、HEADでアクセスしてくるクローラの処理で起きていることがわかった。HEADでUser-Agentを同じにしてそのアクセスを試してみたら100%再現できる。でも、同じことをGETでやっても発生しない。HEADとGETでウェブアプリの挙動が違うなんて、一体どうしてだろう。最初は、このクローラのUser-Agentの処理が間違っているのかと思ったが、メソッドをGETにするだけで発生しなくなるのだから、おそらく違うのだろう。バッファリング処理があやしいのかも、などなど予想はしているのだが、まだ全然確証がない。

少なくともうちで開発しているフレームワークが入っていない環境では再現しないので、自分たちのコードが問題なのは明らかだ。困ったものだ。

#追記:サードパーティーのApacheモジュールが原因だった…

Read More>

Feb - 23rd

Linuxでロードバランサ

Posted at 2:22 pm | Filed Under Apache, Linux, Tuit

Linuxでロードバランサと題された記事が面白い。去年の夏に連載された記事が、雑誌に掲載された際にVMWareでマシン1台でシステムを組んで実験ができるパッケージが配布されるようになっていた。

いつもロードバランサとして使っているPoundを活用した場合と比較してみたいんだけど、時間が取れないので誰かやってくれないものだろうか。ログを取らないと割り切ってネットワークブートで構築するLVSのシステムは魅力的だ。

Read More>