ある文字列に近い文字列をデータベースから探してくるというような処理をしたいときに どうしようかなと思って調べていたときに見つけたのがこの記事。


第11回 Kansai.pm / スペルミス修正プログラムを作ろう

これは、スペルミスの例ですが、やりたいことは同じで「文字列間の類似性を調べて 類似度が高いものを抽出する」という処理です。

その方法の一つに「レーベンシュタイン距離」を使うというのがあったので調べてみました。

実装については、いろんな言語で関数がすでに作られていてライブラリ化されてたりするようです。 PHPに関して言えばそのまんまの levenshtein という関数がありました。

PHP: levenshtein - Manual

試してみたところ、UTF-8で使用した範囲ではきちんと動いているようです。

ただ、編集距離は求められるのですが、最終的にやりたいのは類似度の高いもの順にならべて 候補を示すという処理なので、PHPでデータベース内の文字列をなめて類似度を計算してソートする という処理をするのはしんどい感じです。

で、データベース側でなんとか処理できないかなと思って見つけたのがこれ。

Levenshtein Distance as a MySQL Stored Function

MySQLのストアド関数を作った人がいました。
これなら、
SELECT name, LEVENSHTEIN(name) AS distance FROM hoge 
  ORDER BY distance LIMIT 10;
みたいに書けますね。

これだと、文字列全部をなめて類似度を計算する部分は変わらないので、距離の計算に入る前にある程度ふるいにかけて候補を絞り込んだりした上で距離を計算するのがよいかと思いますが、とりあえずソートの部分をDBに任せられるので、ちょっと楽になりそうです。

上記のnaoyaさんのページには、絞り込みにN-Gramインデックスを使う方法や、編集距離にJaro-Winkler距離を使う方法などが書いてあるので、参考にしてみたいと思います。

久しぶりにIKEAに行ってきました。

IKEAはいろんな家具が格安で売っててすごく楽しいのですが、やっぱり配送料がネックになっていました。
が、行ってみたら配送料のシステムがかなり変わってだいぶ安くなってました。

SA3D0005.jpg



以前は、3つまででいくら(たしかうちの地域で5800円くらい)とかいう料金設定だったので、本棚1つ買って送るみたいな使い方はとても損だったのですが、変更後は 重さで値段が決まるようになっていて、かなり納得感のある料金設定になっていました。


配送業者も三菱電機ロジスティクスから、ヤマトホームコンビニエンスに変わってますね。
そもそもなんで三菱電機ロジスティクスとか使ってたんだろう。


というわけで、前から欲しかったPOÄNG(ポエング)という椅子を買ってきました。
これがまた、安いのにとっても座り心地がいいんです。

で、送料ですが、前のシステムだったら5,800円くらいかかっていたと思うんだけど、料金の変更で2,400円ですみました。


クロネコ様感謝です。


[参考]
公共交通機関を使ってIKEAに行く人のためのTips
IKEA港北 宅配サービス(料金表あり)

厚労省のへたくそな後出しジャンケンに後藤氏(ケンコーコムの社長)と三木谷氏(楽天)が激怒

でもドラッグストアでコーラックを買うときに薬剤師から手渡しされることでそれを防げるとも思えない。とってつけた理由すぎるだろ。 だいたいドラッグストアで白衣っぽいものを着ている人が実際に薬剤師資格を持っているのかどうかすら最近あやしいのは周知の事実だ。(笑)

実際に最近マツモトキヨシで薬を買おうとしたときに、薬の飲み合わせが気になったので白衣を来た年配の店員に質問したら、「薬剤師がいないのでわかりません」とか言われました。

白衣っぽいの着てたから薬剤師かと思ったんだけど。
困惑した表情をしたら、薬剤師がいる近くの薬局を紹介してくれました。親切なんだか、不親切なんだか。

ていうか、エプロンだけつけたバイト風の店員と、薬剤師風の格好をした店員の2種類を用意して客になんとなく薬剤師がいます的な印象を持たせてるところが実にいやらしい。

まあ、ガシガシ品出しとかしてる若い白衣の店員とかを見ると、こいつ薬剤師なの?と違和感は感じていたんだけど、真っ正面から薬剤師はいませんとか告白されるとやっぱりびっくりしました。

最近ブログをさぼりぎみなんですが、たまたまアクセスログを見てみたら、
検索キーワードの大部分が、「ドクター中松ディフェンス」と「ぱいぱい」で占められていて笑えました。

なぜかYahooで検索すると、かなり上位に出るようです。
Yahooのページランクはどうなっているんだ! 謎すぎます。

IMG_0597.JPG
Amazonで先行予約をしていたやつがやっととどきました。

Wi-Fiを使ってカメラから直接PCに写真を取り込めて超便利! しかも自動。
これがあれば、わざわざUSBケーブルとかでつないだりとかしなくてすむ。

Flickr とかの写真共有サービスも設定しとけば自動でアップしてくれる。

便利すぎる。

でも、eye.fi のサーバーにサムネイルが勝手にアップされてるのは嫌な感じ。
どっか設定でやめられないのかな、これ。

Eye-Fi Share SD型ワイヤレスメモリカード 日本版(正規品)Eye-Fi Share SD型ワイヤレスメモリカード 日本版(正規品)

Eye-Fi Inc
売り上げランキング : 93
おすすめ平均

Amazonで詳しく見る
by G-Tools

エレクターとか安いんでつい買っちゃうんですけど、微妙に使い勝手が悪かったり部屋が無機質になったりしてよくない。
でも、捨てるのもめんどいんですよね。区の収集を呼んだり、ゴミ処理券買ったり。

そういったときは、アパートの前とかに「粗大ゴミ」って書いて
おもむろに置いておくと、夜中にパトロールしている小人さんが勝手に持って行ってくれるよ。

僕は律儀にごみ処理券張って出しておいたんだけど、回収が来る前になくなってた。
ちょっと存した気分だ。 次回はよろしくたのむよ。


(global-set-key "\C-h" 'backward-delete-char)
(global-set-key "\C-l" 'dabbrev-expand)

;; ビープ音消す
(setq visible-bell t)

;; ニョロ(~)ファイルを作らない
(setq make-backup-files nil)

;; タブ
(setq-default indent-tabs-mode nil)

;; PHP
(custom-set-variables
 '(php-mode-force-pear t))

いろいろ設定してる割に、見直すと使ってる機能少なっ!

初心に返って dinoのスタートアップ研修見て勉強しないと。
http://startup.dino.co.jp/category/liberal/emacs/

ていうか、いいねー、dino! 研修内容を公開とか、なかなかできないよね。

すばらしい!

PHP開発基盤「Zend Framework 1.5」が公開,GoogleやYouTubeのAPIに対応:ITpro
http://itpro.nikkeibp.co.jp/article/NEWS/20080318/296448/

いつのまにか Zend Framework が1.5 になってた。

GData OpenID YoutubeなどのAPIに対応したライブラリが充実してきて、ほんとライブラリ集って感じなんだけどフレームワークとしてはどうなのよ?
あんまり使ってるって話は聞かないんだけど。

で、見てたら地味にZend_Pdf で日本語が使えるようになったらしい。
(てか今まで日本語使えないのにセミナーとかやってたんか)

ちょっとためしてみた。

<?php
require_once 'Zend/Pdf.php';

$pdf = new Zend_Pdf();


// ページの作成
$page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4);


// フォントのセット (IPAフォントをセットしてみた)
// http://ossipedia.ipa.go.jp/ipafont/download.php
$font_file  = dirname(__FILE__) . '/IPAfont00203/ipagp.ttf';

$font = Zend_Pdf_Font::fontWithPath($font_file);

$page->setFont($font, 36);

// テキスト
$text = "はーひふーへほー";
$page->drawText($text, 70, 450, 'UTF-8');

// ページの追加
$pdf->pages[] = $page;

// 保存
$file = "sample.pdf";
$pdf->save($file);
んー、とりあえず日本語でたぞ。

zend_pdf.png
phpからMTをごにょごにょしたかったので、PEARのServices_Blogging
MovableTypeドライバを書いた。 (PHP5専用)

ソースはcodereposに。

$ svn co http://svn.coderepos.org/share/lang/php/Services_Blogging

でゲッツできます
(ブラウザで見るにはこちら)

とりあえず、

  • 記事の一覧の取得
  • 記事の取得
  • 記事の投稿
  • カテゴリー一覧の取得
  • タグ一覧の取得
  • ファイルのアップロード

などができたりできなかったりします。


簡単な使い方 ..

エントリーの投稿

<?php
require_once 'Services/Blogging.php';

define('DRIVER', 'MovableType');
define('USER', '****');
define('PASS', '****');
define('HOST', 'example.com');
define('URL', '/mt/mt-xmlrpc.cgi');

$client = Services_Blogging::factory(DRIVER, USER, PASS, HOST, URL);

$client->setBlogId(1);

$post = $client->createNewPost();

$post->title             = "これはテスト!";
$post->content           = "これは
¥n¥n¥n テスト!"; $post->mt_allow_comments = 0; $post->mt_allow_pings = 0; $post->mt_convert_breaks = 1; $post->mt_text_more = "続きを嫁!"; $post->mt_excerpt = ""; $post->mt_keywords = "キーワード1, キーワード2"; $post->publish = 1; $post->mt_tags = "タグ1, タグ2"; $res = $client->savePost($post); var_dump($post->id);

最近のエントリーを取得

$posts = $client->getRecentPosts();
print_r($posts);

ファイルのアップロード

$media = new Services_Blogging_MediaObject();

$media->name     = date("Y/md/His").".jpg";
$media->filename = realpath(dirname(__FILE__))."/test.jpg";

$res = $client->newMediaObject($media);
var_dump($res);

カテゴリーのセット

$categories = array(1, 2); // カテゴリーIDの配列
$res = $client->mtSetPostCategories($postid, $categories);
var_dump($res);
カテゴリーIDでしかセットできないのがイマイチ。


coderepos に上げとくと飽きちゃってもムダにならないので安心でいいね!

前々から思ってたんだけど、もっとアプリケーションにはメモ欄があってもいいと思う。

確かメールソフトのBeckey!には、自由に書けるスペースがあって、
そこに忘れそうなことをちょこっと書いておけて便利だった。

クライアントアプリケーションだけでなく、最近はWEBアプリケーションを使って仕事することも多くなってきたけど、やっぱりWEBアプリケーションにもメモ欄をつけてほしいと思うときがよくある。
たとえば、ブログ書いてて「こういう装飾をつけたいときは、このclassを指定する」みたいなしょうもない情報とか。
絶対すぐわすれるから。

メモというと僕は howm でメモを取ってるんだけど、それはemacsでプログラム書いているときにはとても便利で、「あ、あれわすた」って時には howmモードにして検索したりしてる。

でも、メール書いたり、今みたいにブログ書いたりしてるときにはhowmはめんどくさい。
今使ってるこの画面に情報がほしい。

あと、忘れがちなことのメモ以外にも、そのアプリケーションを使うときの心がけみたいなのも書いておきたい。

たとえば以下のような感じ。

■ メール画面

送信するまえに以下を確認する
 「この文章できちんと相手に伝わるか」
 「余計な一言を書いていないか」


■ 株取引の画面

 「ナンピン買いはしない」
 「コツコツ負けて大きく勝つ」

■ RSSリーダーの画面

 「無駄に時間を浪費しないように」

などなど。
ちょっとしたこころがけ、ポリシーみたいなのをちょろっと見えるところに明記しておけるといい。

と、今書いてて思ったんだけど、実装してほしいって言ってるよりも、自分でグリースモンキーかなんかで特定のページを表示しているときには特定のメモを出すみたいなの作ればいいんじゃん。

つか、そんな感じのがもうあるに違いない!


Photos

  • SA3D0005.jpg
  • SA3D0004.jpg
  • IMG_0597.JPG
  • zend_pdf.png
  • geek.png
  • mt_error.jpg