カテゴリー「perl」の8件の記事

2009.01.29

cicindelaの簡単な使い方

ハマッたので、メモがてら情報共有。

オフィシャルサイトを含めいろんなサイトでデモを利用することの記事は多いんだけど、じゃあ、実際に自分のデータを料理したい場合はどうするの?って情報が少ない。

ステップ1)環境構築

これは、オフィシャルサイトにあるとおりにやればOK。 Install - cicindela2 - セットアップ方法 / How to setup - Google Code 一カ所ハマッた時のメモ。 Cicindelaインストールしようとしたらdaemontoolsがインストールできない


ステップ2)設定


少しだけハマッた。オフィシャルにまとまった解説がない。
まず、プロジェクト名を決める。例えば「blog」。
で、↓のデモサイトの通りにやれば良い。
Demos - cicindela2 - デモ用データセットを用いたクイックスタート / quick start with demo datasets - Google Code
cd /home/cicindela/misc
perl create_init_sql.pl --db_name=cicindela_clip_db | /usr/local/mysql/bin/mysql -uroot

「cicindela_clip_db」のところをプロジェクト名にする。例えば今回ならば「cicindela_blog_db」。


設定ファイルもはデモサイトの通りだとだめ。

lib/Cicindela/Config/_common.pm

を開いて↓のコメントアウトを解除する。
# 'clip_simple' => {
# datasource => [ 'dbi:mysql:cicindela_clip_db;host=localhost', 'cicindela', 'japana' ],
# filters => [
# [ 'PicksExtractor', { interval => '20 year' } ],
# 'InverseUserFrequency',
# 'ItemSimilarities',
# ],
# recommender => 'ItemSimilarities',
# calculation_track => 1,
# refresh_interval => 1,
# },

で、「datasource」の箇所を自分のローカルにあるデータベースの設定に変更する。「cicindela_clip_db」はさっき自分で作ったDB名ね。今回ならば「cicindela_blog_db」。
あと、「clip_simple」の箇所を自分のプロジェクト名に変更する。今回なら「blog」。

ステップ3)ログデータを記録する

セットアップしてApacheを起動するともう大丈夫。 で、↓みたいなURLをたたくとログが記録されるんだけど、httpのステータスコードが204だから一瞬とまどう。200じゃないんだね。 http://(ベースURL)/cicindela/record?set=(セット名)&op=insert_pick&user_id=1&item_id=2 http://localhost/cicindela/record?set=blog&op=insert_pick&user_id=1&item_id=2 ここでいう「セット名」ってのが初めて登場するんだけど、ようは自分が決めたプロジェクト名。今回で言うと「blog」。設定ファイルに記述したものと一緒にする。


ステップ4)ログが記録されているかの確認方法


上記http通信でちゃんとログが記録されているかの確認方法が公式ドキュメントでは見あたらない。実際は「picks_buffer」のテーブルにいる。


ステップ5)バッチを実行する


ログを記録すると、すぐにでも↓のようなURLをたたいてみたくなるけど、グッと我慢してバッチを2つ実行する必要がある。じゃないと、関連情報は出てこない。
http://localhost/cicindela/recommend?op=for_item&set=blog&item_id=1

実際は↓の2つのバッチを実行する必要がある。

./bin/flush_buffers.pl
./bin/batch.pl

これのうち、「./bin/flush_buffers.pl」がハマル。超ハマル。ちなみに僕は3時間くらいハマッた。
何故かというと、クリップのデモ解説だと
clip_simple 集計セットの手動起動
bin/batch.pl --track=1
を叩くと,設定ファイル中, "calculation_track => 1" となっている集計セット (この例では,' clip_simple' という名前の集計セット) が処理されます。

という風に書いてあるから。
これを見ると「batch.pl」だけ実行すればいいように思っちゃう。
でも、batch.plを実行する前にflush_buffers.plが必要。

ちなみに僕は「flush_buffers.pl」を実行する必要があるってことを↓のページで見つけた。
http://cicindela2.googlecode.com/svn/wiki/FilterChain.wiki

ソースコード読んでいて「extracted_picks」ってのを使っているなと思って検索したらヒットした感じ。
↑のページの「== 解析のながれ ==」ってのがすごくわかりやすい。
これ、公式ドキュメントの一番わかりやすいところに書いておいて欲しいと思った。

ステップ6)Apacheのログを食わせる

実際に自分のプロダクトでcicindelaを使おうと思ったら、Apacheのログを食わせるのが楽だと思う。 で、オフィシャルドキュメントには
別サーバ上の apache ログをスキャンして、おすすめページを計算する [あとで書く]
って書いてあるだけ。。

本当ならばsession_idをuser_idと見立てるのが良いんだろうけど、手元にそんなログはないので、IPアドレスをuser_idとしてみた。
IPアドレスをuser_idとする場合は、IPアドレスは文字列だから、cicindelaに特別な設定が必要。それは公式ドキュメントにもある通り、以下の通りにする。

セッティングに
'some_setting' => {
...
use_user_char_id => 1,
use_item_char_id => 1,
...
と書いておくと,整数値以外の user id, item id が利用できるようになります。

item_idはURLのPATH、ディレクトリ名、ファイル名とかそういうので良いと思う。
ちなみに僕のプロダクトはURLにidが含まれているからそれを抽出した。↓みたいな感じ。

egrep '"GET /[^\/]+/[0-9]+/' ./log/access_log.1 | awk '{print $1","$7}' | ruby -ne 'a=$_.split(",");puts a.first+","+a[1].split("/")[2];' > ./log/log4cicindela.txt

で、上記コマンドで生成したlog4cicindela.txtを↓見たいなrubyスクリプトでcicindelaに入れた。

#!/usr/local/bin/ruby

require 'net/http'

ARGF.each{|line|
user_id, item_id = line.chomp.split(",")
Net::HTTP.new('localhost', 80).start{|http|
http.get("/cicindela/record?set=oshiete&op=insert_pick&user_id=#{user_id}&item_id=#{item_id}")
}
}

で、ログを食わせたら、さっきも書いたとおり、下の2つのバッチを忘れずに。


参考サイト


Rails + Cicindelaでレコメンデーション付ウェブサイトの構築(1) - aikeの日記
レコメンドエンジン『Cicindela』を試す:第1回|ALBERTではたらくモバイルエンジニアのブログ


↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (0) | トラックバック (0)

Cicindelaインストールしようとしたらdaemontoolsがインストールできない

ライブドアのレコメンデーションエンジン Cicindela | livedoor labs EDGE

(どうでもいいけど、↑のページにcicindelaっていうテキスト(文字)がなくて、コピペできなくて困った。)


cicindelaがdaemontoolsを要求するのでインストールしようとしたら


/lib/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [envdir] Error 1
Copying commands into ./command...
cp: cannot stat `compile/svscan': No such file or directory

と、エラー。


CentOS 4.4 に daemontools をインスコ : おまえのログ

を見て解決。

http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch

とか。

あと、忘却防止のためにこの記事にもメモ。

---
diff -ur daemontools-0.76.old/src/error.h daemontools-0.76/src/error.h
--- daemontools-0.76.old/src/error.h 2001-07-12 11:49:49.000000000 -0500
+++ daemontools-0.76/src/error.h 2003-01-09 21:52:01.000000000 -0600
@@ -3,7 +3,7 @@
#ifndef ERROR_H
#define ERROR_H

-extern int errno;
+#include

extern int error_intr;
extern int error_nomem;

↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (0) | トラックバック (0)

2006.03.27

LacoocanでperlからSQLiteに接続する(2)

perlでDBに接続するだけならばDBIを使ってガリガリとコネクション処理とSQL文を書いていけばいいのだけれども、やっぱりここではO/Rマッパーを使っていきたい。
perlでO/RマッパーといったらClass::DBIなんだけれども、ここはLacoocan。telnetできないから、モジュールのインストールが激しくめんどくさい。Class::DBIは色々と依存関係が強いモジュール群だからさらにめんどくさい。楽したくてO/Rマッパーを使うのだから、やっぱりめんどくさいことはしたくない。
それに、LacoocanでClass::DBIがうまく動くかどうか謎だし。。
ってことで、Class::DBI以外で何か良いperlのO/Rマッパーはないかなぁ、、と思って探していたらBenjamin Trott / Data-ObjectDriver-0.02 - search.cpan.orgというのを発見。制作者は、Benjamin Trottってことで、そう、Movable TypeでつかわれているSixApartが作っているO/RマッパーをCPANで一般向けに公開したものだ。
うおー、MTのO/Rマッパー使いたいけどライセンス的にNGだよなぁって思って残念がっていたところなんだよねー。SixApart最高〜、ってことで、早速使わせて貰うことにする。
と思ったけど、まったくドキュメントが書いていねぇ…。ちょっとMTのソースコードを参考にしてみるかと思ってみたんだけど、なんか微妙に使い方が違う気がする??
ってことで、ソース読んで調べても良いけど、時間短縮のためにGoogleで調べてみる。
発見。
MT::Neko::kak 500 Internal Server Error:Data::ObjectDriverを遊んでみる
(↑、暴想ブックマークで「obj」って検索したら出てきた!便利だ(自己満足)。)

んで、まあ、このサイトの人の通りに書いてみようと思ったんだけど、いくつか疑問点が。
・SQLiteのdsnの設定ってどうやって書けばいいの?
  → dsn => 'dbi:SQLite:/homepage/projects/bookmark/bookmark.db'って書けばよかった。*.dbのファイルパスを書けば良いみたい。

・SQLiteの接続ユーザーIDとパスワードって何!?
 → これは結構焦った。一度も設定した覚えがないからだ。空にして設定したら普通に接続できた。具体的には以下の通り。
username => '',
password => '',

あとは、普通にやって普通にできた。
モジュールの依存関係は2つだけあって、Class::TriggerとClass::Data::Inheritableを追加にインストールした。

んで、早速サンプルアプリケーションとサンプルデータベースを用意してアップロードした。
http://weblog.news.coocan.jp/projects/bookmark/app/db_test.cgi
これは、DBに接続して保存して読み込みしている。

ここまでできればあとの応用はいくらでもきくし、アイデア次第といったところだ。
まあ、所詮Lacoocanなのでスケーラビリティとかスピードとかは限界がミエミエなので、個人専用のツールとしてアイデア勝負で色々とかゆいところにきくアプリケーションを作っていくのが似合っているのだと思う。

↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (0) | トラックバック (0)

2006.03.25

LacoocanでperlからSQLiteに接続する(1)

暴想ブックマークをこれ以上バージョンアップさせようとすると、データベースとの連携が欲しくなる。
まあ、凄く頑張ってテキストベースですすめても良いのかもしれないけれども、やっぱりDBと連携させた方が楽だしわかりやすい。
しかし、我らがラクーカンではSQLliteしかないうえに、telnet接続できない。
これは結構大変な話だ。
まず第一に僕はSQLiteを生まれて一度も使ったことがない。
ということで、お勉強開始だ。
SQLiteはとても楽ちんでライトなデータベースとして有名だ。
1つのデータベースは1つのファイルでしかない。
だから、お気軽に作成できるし、お気軽にコピーできる。
基本的な使い方はこのページを参考にした。
sqlite: SQLite データベースと会話するプログラム

で、とりあえず触ってみないとお話にならない。
幸いなことに、僕が使っているMac OS X TigerにはSQLiteが最初からインストールされているから超楽ちんだ。
/usr/bin/sqlite3 ./bookmark.db
ってやれば、bookmark.dbができあがる。
凄い!
あとは、create tableとかやればOK。
楽ちんですな。

でもって、SQLiteの一番凄いところとして、ファイルをコピーするだけでDBの移動ができるって事。
僕はラクーカンでMTを使っているのだけれども、そのMTはSQLiteで動いている。
ということで、/mt/mt.dbというファイルをFTP接続でローカルに持ってくる。
んでもって、
/usr/bin/sqlite3 mt.db
ってMacのターミナルからコマンドを打つと、mt.dbに接続できる。
試しに、
SELECT * FROM mt_entry;
とかやれば、ちゃんと応答が返ってくる。
素晴らしい。

逆に、さっき作った、bookmark.dbもFTPでラクーカンに持って行けば、ちゃんと動く。
楽ちんだ。

次は、perlから実際にデータベースに接続する方法だ。

↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (1) | トラックバック (0)

2006.03.18

暴想ブックマーク - ver 0.3

ということで、バージョンアップしました。
段々まともになってきた。
変更点は以下の通り。
・日付情報の追加
・日付を検索対象にした
・リンクURLも検索対象にした
・空白のブックマークができないようにもう一回対処
・例外処理、エラー処理をちょっと追加

日付情報は滅茶苦茶重要なメタ情報だ。
そして、重要なメタ情報は検索できなくてはいけない。
例えば、昨日(3月16日)にブックマークしたアレを探したいという時には、検索窓に「-03-16」と入力すればいい。
こんな感じで、日付を文字列型の検索ボックスに入力して検索するスタイルは結構珍しいのではないかと思うけど、どうだろう?
でも、使ってみるとその便利さは一目瞭然だ。
よくあるプルダウン型の日付の絞り込みは不便すぎる。
今年を検索する場合は「2006-」と検索すればいい。
今月は「-03-」や「2006-03」だ。

次に、URLを検索。
ブックマークツールを作っていて気がついたのだけれども、URLというのはとても貴重なメタ情報だ。
例えば、昨日インプレスの記事で見たページをもう一回見たいなぁ、、でもタイトルとか忘れちゃった…ってときは「impress.co.jp」とかで検索すれば、インプレスの記事がダダダと出てくる。
凄く便利。
これって、結構良いのではないかと思ってはてなブックマークで実験してみたら同じ事ができた、、残念。
しかーし、この暴想ブックマークツールの検索はもっと便利だ。
それは、URL検索と記事タイトル検索が同時にできると言うこと。
例えば、インプレスで書かれたヨドバシに関する記事を読み直したいと思って検索するとする。ヨドバシ関連の記事は沢山ブックマークしてあって、その中からインプレスの記事だけを探したいのだ。
その場合、「impress.co.jp ヨドバシ」と検索すればいい。ちゃんと表示される。
例えば、ココログで書かれた記事でjavascriptに関するものがあったなぁ、どこだっけ、ブックマークした記憶だけはあるんだけど…、って場合は「cocolog-nifty.com javascript」って検索すればいい。
今実験したらはてなブックマークではできなかった。

ちなみに、これらの検索と同時にさっき紹介した日付検索も同時に使うことができる。
つまり、今月インプレスで書かれた任天堂(って言葉がタイトルや概要に含まれた)の記事を探したいっていう時は「2006-03 impress.co.jp 任天堂」とかって検索すればOK。
超便利。
全てのメタ情報を一つの検索窓から串刺し検索できるっていうわけだ。

というわけで、いつものようにご自由におためし下さい。

登録用ブックマークレットはこちら。
暴想ブックマーク ver0.3


結果の表示画面はここにあります。
ブックマークの結果ページ(ver 0.3)


↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (0) | トラックバック (1)

2006.03.15

暴想ブックマーク - ver 0.2

というわけで、俺様ブックマークツールをバージョンアップした。
んで、ツールにちゃんと名前がないと何かと不便だよなぁと言うことで、単純に暴想ブックマークと命名してみた。
うーむ、もっと言い名前はないかな。
名前重要。

で、今回の変更点は以下の通り
・マウスで文字列を選択した状態でブックマークレットを実行すると、そのテキスト部分がメタ情報として一緒に登録されるようにした
・上記メタ情報も同時に検索されるようにした
・表示をul, liタグを利用して描画するようにした(ずいぶんと見やすくなった)
・空白のブックマークが作られないように修正

ブラウザ上でマウスを使って一緒に保存しておきたいなぁと思ったテキスト情報を選択しておくだけで、ブックマークレット実行時に自動的にブックマークツールに登録されます。
これは便利!

例えばこのサイトを見て下さい。
大河原克行の「パソコン業界、東奔西走」
このサイトの記事が面白いと感じてブックマークしようとしても従来のバージョンだと、“大河原克行の「パソコン業界、東奔西走」”としか登録されなくてまったく意味がわかりません。
ところが、この記事の副題である“ヨドバシ、ビックと真っ向勝負を挑むヤマダ電機”ってのを一緒に登録しておくととってもわかりやすくなる!

もちろん、タイトルだけでいいやって場合は従来通り何も考えずにブックマークレットを実行するだけでいい。

必要な時だけ、引用して保存しておきたいテキスト情報をマウスで選択するだけ。
シンプルだ。
ポップアップ画面とか出てこないし、コピペする必要もない。
適当でオッケー。
ということで、従来のコンセプトを一切崩すことなくメタ情報を追加することができた。

ということで、前回と同様自由に試してみて構わないので、色々と遊んでみて下さい。

登録用ブックマークレットはこちら。
暴想ブックマーク(なおゆき、読め)


結果の表示画面はここにあります。
ブックマークの結果ページ


#追記
まだ、空白ブックマークができることがあったので修正
http://以外で始まるURLは弾くように修正

↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (5) | トラックバック (1)

2006.03.11

こんなブックマークツールはいかがでしょうか?

del.icio.usとかはてなブックマーク - ソーシャルブックマークとかが気になりつつもどうも使う気になれなかった。

なんかしっくりこない。
なんかめんどくさそう。

ってことで、だったら自分が一番欲しいと思うブックマークツールを作ってみようと思って作ってみている。

自分が欲しいものってどんなのだろうかと考えてみると

・できるだけ簡単にブックマークできる
・できるだけ余計なことを考えずにブックマークできる
・Webの閲覧リズムを阻害することなくブックマークできる
・できるだけ簡単に、高速に検索できる
・シンプル
・別にソーシャルじゃなくていい

という感じだ。
でもって、僕はタグ(タギング)については以下のように考えている。
暴想: タグ、タギングについての私見

ようは、自分でタグとか入力しなくていいし、させないインタフェースがもっとも素晴らしい。
メタ情報はツールが勝手に取得、生成してくれればいいし、それが正しい。


これらのことを全てまとめて第一弾のデモを作ってみた。

自分が気になったページをブックマークするには、以下のBookMarkletを利用する。
BookMark(なおゆき、読め)


使って貰えればすぐにわかるけど、ブックマークレットを実行しても何も起きない。
クリックしたらそれで終わりだ。

でもって、自分がブックマークした結果はこのページに表示される。
ブックマーク

シンプルだ。
検索ボックスがあって、あとはブックマークのリストが新着順に表示される。

まあ、いくら何でもシンプルすぎるし、これに付け加えたい機能は山ほどあるけれども、とりあえず僕が目指しているコアはこれにつきると思う。

ってなわけで、このデータベースというか、この実験ブックマークレットはお試しなので、気になった方はご自由に使ってみてください。
ってか、作りがいい加減なので簡単に破綻しちゃったり、壊れたりするかもだけど…。

意見、感想募集中です。

#ってか、今思ったんだけど、これが文字通り本当のソーシャルブックマークじゃね?

↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (2) | トラックバック (1)

2005.10.28

CPANのロゴが10周年になっている!

CPANのロゴがケーキですよ。
search.cpan.org: The CPAN Search Site

10年なんですねぇ。
僕が使い始めてから1年くらいですが…。。

↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (0) | トラックバック (0)