Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
LAN内のマシンでapacheを動かそうとしたらこんなエラーが。
httpd.confでmod_rewriteを使って
RewriteEngine on
RewriteRule !\.(html|txt|xml|js|ico|gif|jpg|png|css|gz)$ index.php
としている部分がリダイレクト無限ループに陥る原因になっているらしい。
あれこれ変更していたら直った。
<Directory />
としていたのがまずかったらしい。
<Directory "/var/www/html">
と絶対パスに直したらエラーは消えた。環境の違うマシンに迂闊なコピペは危険。
zuzara : Dynamic Programming による類似文字列マッチの実装例 in PHP
昨日の記事でコメントをいただいた情報を参考にすると、
<?php
echo levenshtein($argv[1], $argv[2]) . "\\n";
これで同じ結果が得られるか、と思いきやちょっとアルゴリズムが違うようです。
% php dynamicprogramming.php abcd dabc # 昨日の
score: 1
php levenshtein.php abcd dabc # 上記コード
2
と違う結果が返ってきた。
levenshtein関数はext/standard/levenshtein.cで定義されていて、PHPに直すと
<?php
$key = $argv[1];
$text = $argv[2];
$p1 = array();
$p2 = array();
$l1 = strlen($text);
$l2 = strlen($key);
for ($i2 = 0; $i2 <= $l2; $i2++) {
$p1[$i2] = $i2;
}
for ($i1 = 0; $i1 < $l1; $i1++) {
$p2[0] = $p1[0] + 1;
for ($i2 = 0; $i2 < $l2; $i2++) {
$c0 = $p1[$i2] + (($key[$i1] == $text[$i2]) ? 0 : 1);
$c1 = $p1[$i2+1] + 1;
$c2 = $p2[$i2] + 1;
$p2[$i2+1] = min($c0, $c1, $c2);
}
$tmp = $p1;
$p1 = $p2;
$p2 = $tmp;
}
$c0 = $p1[$l2];
echo "score: $c0\\n";
こんな感じ。PHP5.2.0から拝借。ソースのコメントにはonly optimized for memory usage, not speedと書いてある。$tmpで$p1と$p2を入れ替えるとうまくいく、というのは不思議。
あとコメントでいただいたunno氏の話はここでもちょっと出ました。
zuzara : 「日本語スペルチェック」、「表記のゆれ」:API化して欲しい!
[を] Dynamic Programming による類似文字列マッチの実装例
でPerlのコードがあったのでPHPで書いてみた。途中まで。keyとtextを配列ではなくて文字列にしている点がちょっと違う。Perlのコードを読むことは滅多にないので新鮮。
<?php
$key = ' ' . $argv[1];
$text = ' ' . $argv[2];
$C = array();
$t_len = strlen($text);
$k_len = strlen($key);
for ($j = 0; $j < $t_len; $j++) {
$C[0][$j] = 0;
}
for ($i = 0; $i < $k_len; $i++) {
$C[$i][0] = $i;
}
for ($i = 1; $i < $k_len; $i++) {
for ($j = 1; $j < $t_len; $j++) {
$u = $C[$i-1][$j];
$l = $C[$i][$j-1];
$d = $C[$i-1][$j-1];
if ($key[$i] == $text[$j]) {
$C[$i][$j] = $d;
} else {
$C[$i][$j] = 1 + min($u, $l, $d);
}
}
}
echo "score: ".$C[$k_len-1][$t_len-1]."\\n";
GoogleやYahoo!の「もしかして~」はどんなアルゴリズムで出しているんだ?と友人と何度か議論したことがありますが、こういうアルゴリズムも使ってるんでしょーか。
4travelの写真検索APIを使ってアルファベットのビットマップフォントをつくってしまうAPIです。
カカクコムのAPIコンテストに出してみます。
デモは以下のリンクを押してみてください。
レイヤーが出てきますが閉じるボタンはないので消すときはリロードで。
phont (現在停止中)
ブックマークレットになっています。適当なページを開いたあとアドレス欄にスクリプトをコピペしてEnterを押しても動くと思います。動作確認はFirefox2.0.1とIE7。

ページ内の適当な文字列を、APIに送って結果をそのままどーんと貼ってます。写真は4travelの写真検索APIにランダムでカメラのモデルを入力して取得。
REST APIの仕様:
- URL
- http://zuzara.dyndns.org/api/phont
- 入力
-
| parameter |
value |
description |
| q |
文字列(必須) |
4travelフォントで表示させたい文字列 |
| size |
整数(デフォルト: 20) |
1つ1つの写真の大きさ(単位はpx) |
| callback |
文字列 |
JSONPのfunction名を指定、空のときは自動的にJSONになる |
- 出力
- JSON/JSONP(Content-Type: application/json)
例)
callback({"test":"<table><tr>\\n<td>\\n<table>\\n<tr><td> <\\/td>
<td> <\\/td><td> <\\/td><td> <\\/td><td> <\\/td>
<td> <\\/td><td> <\\/td><td> <\\/td><td> <\\/td>
<\\/tr>\\n<tr><td> <\\/td>
<td><a href='http:\\/\\/4travel.jp\\/traveler\\/kamosan\\/pict\\/10568417\\/'>
<img border='0' src='http:\\/\\/img.4travel.jp\\/img\\/tcs\\/t\\/pict\\/sml\\/10\\/56\\/84\\/sml_10568417.jpg?20060807153948' width='20px' height='20px' alt='' \\/><\\/a>
...中略..."})
- エラー
- 特になし
例によってAPIは無保証ですが、どうぞご利用ください。(注意点等はこちらに準じます)
コンテストに出そう、ということでいろんな人とブレストしてネタを考えたのですが、昨日ふと思いついたこの一発ネタにしてしまいました。すいません、エネルギー不足でした(^^;
名前は4travelとかけて4ontにしようか、ちょっと迷いました。APIを使うコンテストにAPIを出品してみる、とマニアックにひねったつもりですがどーでしょうか。
なおビットマップフォントの元データはこちら。thanks!
Grixel Kyrou 7 Wide Font | dafont.com
はてブへのリンクを張るだけだと見てくれない気がしたので、リストにしてみました。blog.zuzara.comの人気エントリー by はてなブックマーク。各記事のページ下部に表示しています。
RSSを読み込んでリストにする、という関数が何気にWordPressには用意されていました。wp-include/rss-functions.phpのget_rssです。でも後述しますがバグあり(^^;
function get_rss ($uri, $num = 5)
中身はMagpie RSS(PHP RSS Parser)で、キャッシュもしてくれます。theme内のファイルから呼び出すときはこんな感じ?
define('MAGPIE_CACHE_DIR', ABSPATH . 'wp-content/cache');
define('MAGPIE_CACHE_AGE', 60*60*24); // one day
require_once (ABSPATH . WPINC . '/rss-functions.php');
get_rss('http://b.hatena.ne.jp/entrylist?mode=rss&url=http%3A%2F%2Fblog.zuzara.com&sort=count&threshold=5', 8 ); ?>
この関数、WordPress内では使われていないのでなぜあるのか謎です。
で、このget_rssを使おうと思ったらバグが。。
バグレポートの仕方がよくわからなかったのですが、ユーザ登録してtracにticket発行してみました。(WordPressの2.0.6がつい先ほどリリースされたようですが、マイナー過ぎるバグなせいか直ってません)
#3527 (wp-include/rss-functions.php function get_rss has a bug) – WordPress Trac – Trac
単純な変数名の記述ミスです。あと日本語の場合、htmlentitiesを使うと化けるのでそこも修正する必要あり。というわけで、get_rssの中で呼び出しているfetch_rssを直接使った方がいいような気がします。。
fetch_rssはwp-admin/index.phpのDashboardで使われており、ドキュメントもあります。
Function Reference/fetch rss « WordPress Codex
PHPのマニュアルに対してgrep検索(実装上ではUNIXコマンドのgrepは使っていませんがgrepと同じ全文をなめるタイプの検索)を行うAPIをつくってみました。php.netの検索やNamazuの検索だと記号が含まれた検索語のときに漏れがあってちょっと不満があったので。
APIで返ってくる結果を並べたアプリが以下。比較的さくさく検索できると思います。
http://z.fukaoi.com/phpsearch/#mb_convert_encoding
#以降のlocation.hashを書き換えてパーマリンクにしているので、Firefoxのクイックサーチと併用するとよさげです。
参考:ITmedia Biz.ID:Firefoxのブックマーク・キーワード活用法
http://z.fukaoi.com/phpsearch/#%s
未実装な点:
- Google CodeSearchなどとマッシュアップ
- PHP特化型検索エンジンで実装したネイティブ関数の自動補完機能をつける(zsh形式の補完がいいなぁ)
- ページャがない(10件目以降が表示できなぃ、キーボードのj/kでさくさくやりたい)
- Firefox2.0.0.1とIE7以外のブラウザでの動作は未確認
REST APIの仕様:
- URL
- http://zuzara.dyndns.org/api/phpsearch
- 入力
| parameter |
value |
description |
| q |
文字列(必須) |
検索したい文字列、ただし複数語には未対応 |
| start |
整数(デフォルト: 0) |
出力結果の先頭位置(10件ずつ出力、トータルの件数は表示されない) |
| callback |
文字列(デフォルト: phpsearch) |
JSONPのfunction名を指定 |
- 出力
- JSONP(Content-Type: application/json)
- エラー
- 特になし
未実装な点:
- AND検索など複数語の検索に未対応
- ソーティングのアルゴリズムがない(現状ではマニュアルに出てくる順)
- クリック履歴をソーティングに反映する仕組み
- PHPのマニュアル以外も対応したい(PostgreSQL/MySQL、JavaScript、C++とか)
未実装が多過ぎてお正月クオリティです。。でもどうせなのでお蔵入りする前にリリース。検索結果の最初の10件だけでいいや、などとかなりいい加減ですが自分では使う予定。不満が募ってきたらアップデートするかもしれません。
例によってAPIは無保証ですが、どうぞご利用ください。(注意点等はこちらに準じます)