レコメンドエンジンのcicindelaを動かしてみる

cicindela
cicindela2 - a highly customizable recommendation engine written in perl + MySQL - Google Project Hosting

livedoorで作られたレコメンドエンジンのcicindelaを使ってみる。
mod_perl + apacheな環境で動かすチュートリアルがあったのでそれに従う。

なんだかんだperlに触るのが、学生時代以来で
めっちゃハマりまくったのでメモ残します。

環境

もくじ

  • perlのインストール
  • cpanmのインストール
  • apacheのインストール
  • mod_perlのビルド
  • cicindelaの環境構築

perlのインストール

最初はシステムPerl(5.10系) + yumcpanモジュール入れて構築してたけど
極力新しいバージョン使いたかったのでperlbrewでもうちょい新しいやつを入れます。

$ curl -L http://xrl.us/perlbrewinstall | bash

// perlbrewにパスを通す
$ vi ~/.bashrc 
source ~/perl5/perlbrew/etc/bashrc // 追記

// インストール可能なバージョンを表示
$ perlbrew available

// インストール
$ perlbrew -v install perl-5.18.4 -D ccflags=-fPIC // mod_perlのビルドのためにccflagsオプション必須

// バージョン切り替え
$ perlbrew list // インストール済みのバージョンを確認
$ perlbrew switch perl-5.18.4

// perlbrewで入れたPerlにパスを通す
export PATH=ホームディレクトリ/perl5/perlbrew/perls/perl-xxx/bin:$PATH

$ perl -v // バージョンが5.18.4ならOK

cpanmのインストール

perlbrewでcpanmもインストールできる

$ perlbrew install-cpanm

apacheのインストール

apacheは普通にyum

# yum install httpd httpd-devel

mod_perlのビルド

最初この手順すっ飛ばしてたので
apacheがぜんぜんperlbrewで入れたバージョンのperl読みにいってくれなくて悩んだ。

$ wget http://ftp.jaist.ac.jp/pub/apache/perl/mod_perl-2.0.8.tar.gz
$ tar -zxvf mod_perl-2.0.8.tar.gz
$ cd mod_perl-2.0.8
$ perl Makefile.PL USE_APXS=1 WITH_APXS=/usr/sbin/apxs EVERYTHING=1
$ make
$ make test
# make install

オプションで指定しているapxsについて何も知識がなかったので下記記事を参考にさせてもらいました。
apxsとは | For Want Of A Better Word
apxsコマンドでApacheにモジュールを追加 : ブログというか、メモ?(引っ越しました)

cicindelaの環境構築

// mysqlのインストール
# yum install mysql-community-devel mysql-community-server --enablerepo=mysql56-community
# service mysqld start

// 依存モジュールのインストール
$ cpanm --sudo DBI DBD::mysql Ima::DBI Time::Piece Log::Log4perl Module::Pluggable Class::Singleton

// cicindelaのチェックアウト
$ cd /home
# svn checkout http://cicindela2.googlecode.com/svn/trunk/ cicindela

// my.cnfとhttpd.confの修正
$ ln -s /home/cicindela/etc/mysql/my.cnf /usr/local/mysql/my.cnf
# vi /etc/httpd/conf/httpd.conf
Include /home/cicindela/etc/httpd/modperl.conf // 追記

// ハードコードされたperlのパスの変更
$ cd cicindela/misc
# perl substitute_project_paths.pl --perl_path=ホームディレクトリ/perl5/perlbrew/perls/perl-5.18.4/bin/perl

// デモデータのチェックアウト
# svn switch http://cicindela2.googlecode.com/svn/branches/demo_data/misc misc

// データベースの作成
$ cd /home/cicindela/misc
$ perl create_init_sql.pl --db_name=cicindela | /usr/local/mysql/bin/mysql -uroot

// ロードスクリプトに必要なモジュールのインストール
$ cpanm Text::CSV_XS

// ロードスクリプトに必要なファイルの生成
$  cd clip_data
# touch pages.txt clips.txt tags.txt
# chmod 766 *.txt

ここでチュートリアルではimporter.plを動かすんですが
僕の環境ではエラー吐いたので修正

if ($tags) {
     # utf8フラグをoff
    $tags = Encode::_utf8_off($tags);

    for my $tag (split(/\s+/, Encode::decode('utf8', $tags))) {
        my $tag_id = ($tag_hash->{$tag} or $tag_hash->{$tag} = ++$last_tag_id);
        print TAGS_OUT join("\t", $tag_id, $user_id, $page_id, $timestamp)."\n";
    }
}

つづき

// ロードスクリプトを実行
$ gzip -cd ldclip_demo_dataset.csv.gz | perl importer.pl --work_dir=`pwd` | mysql -uroot cicindela

// 設定の変更 DB名とユーザー名とパスワードを変更
# vi lib/Cicindela/Config/_common.pm

// レコメンド集計バッチ実行
# bin/batch.pl --track=1 // 2回実行。このパスで実行しないとエラーを吐く

動作確認

# service httpd start

ブラウザから
http://サーバーのIP/cicindela/recommend?op=for_item&set=clip_simple&item_id=39102
にアクセスするとレコメンド結果のitem_idが一覧で表示される。

おつかれさまでした。

ビーダマンが電子書籍になった

※2015/12/31追記 10月末に1~8巻がストアに復活。あわせて最終15巻まで公開されました!
※2016/02/02追記 まとめ買いがはじまったようです!

[asin:B018VCH2UO:detail]

僕の一番好きなマンガ
爆球連発!! スーパービーダマンが電子書籍になってkindleに登場しました。

マジでうれしい。
2015/01/29現在は8巻までしかストアにはありませんが、後日続きも出品される模様。

ビーダマンとにかく好きで、実家にまだ山ほどビーダマンのおもちゃある。
コンバットフェニックスにEXヘビーフレームつけてるくらい好き。(金属のやつ)
コンバットフェニックス+キャノンウイング+EXメタルフレームの3アイテムを揃えるのに死ぬほど苦労した記憶がある。お小遣い数カ月分。

しかもこれまた実家にコミックス3巻くらいから最終巻の分までのコロコロコミックが残っている。
前に数えたら100冊くらいあった。
なぜならビーダマンの単行本が手に入らなすぎて、全く捨てられなかったからです!!!!

今まで名古屋、京都、東京と引越してきて
いろんな場所に出かけ、古本屋を見つけるたびにビーダマンがないか5分くらいかけて探す生活を続けて
集められたのが1~9,11巻。

ここまで多分10年くらいかかってる。1~4巻とかはけっこうあるんだけど10巻超えるとマジで見つからない。
最終15巻とかはプレミアついててヤフオクとかでもけっこうすごい値段になってる。

なので今回の電子化はマジでうれしい。

最近今賀俊先生のTwitterみつけてずっと様子を追っていた。


この辺で何がきっかけか忘れたけど、電子化の話が進んでいることを知る。


マジかっっっ!!!!!!!てなる。


https://twitter.com/imaga3/status/557905735791964161
カラーページ!!!!!!!!!


一番好きな回。真似したくて床にガム貼りたかったけど、お母さんにアホほど怒られるのわかってたからできなかった。


いよいよ電子化が現実味を帯びてきて俄然テンションUP。この時は早くて3月とかかなぁと思ってた。


2月発売!?ずいぶん早い!!!


とか思ってたら1月発売でした。即買い。



なんというかとにかくうれしい。

マンションの友達とビーダマン握りしめて、ターゲット探しゲームやってる最中に
買ったばかりのライトイーグルの角をどこかで落として
半泣きで「ごめんなぁー。。。」って言いながら
友達に一緒に探してもらった記憶とかも蘇ってくる。

これでコロコロ捨てられるかーと思ったけど、よくよく考えたら
駆けろ!大空
超者ライディーン
ミニ四駆
グランダー武蔵
超速スピナー
K-1 ダイナマイト
ZOIDS(バンとジークの方)
弾丸レーサー
が載ってるコロコロ捨てられるわけなかった。なつかしー!!!!!

ジャンプがドラゴンボール、幽白、スラダンなら
コロコロはビーダマン、超速スピナーZOIDS

AWS CloudWatch APIをPHPから叩いてEC2のモニタリングをする

AWSのマネージドサービス使ってGUIでEC2インスタンスの各種リソース監視ができる。
一定のしきい値を設定し、アラートメールを投げたりすることもできるけど
もう少し複雑な条件で通知をしてほしかったので、CloudWatchのAPI叩いて自前で通知する仕組みを作ることにした。
今回はCloudWatchのAPI叩いて値を取得するところまでのメモ。

やること

  • AWS SDK for PHPのインストール
  • IAMで監視用ユーザーを作成
  • PHPからリクエストを飛ばす

AWS SDK for PHPのインストール

PHPからAWSの各サービスAPIを利用するためのSDKが公開されている。
AWS SDK for PHP — AWS SDK for PHP 2.7.16 documentation


今回はCloudWatchClientを利用するのでComposerを使ってインストールする。
Installation — AWS SDK for PHP 2.7.16 documentation

// Composerをインストールする
$ brew install compsoer

// composer.jsonを作成
{
    "require": {
        "aws/aws-sdk-php": "2.*"
    }
}

// インストール
$ composer install

IAMで監視用ユーザーを作成

CloudWatch APIを利用するにはアクセスキーとシークレットキーが必要。

AWSアカウントを持っている時点で全権限が付与されたキーは発行可能なものの
不必要な権限まで与えてしまうため、アンチパターンっぽい。

ちゃんと権限を絞ったユーザーを作成するIAMというサービスが提供されているため
そちらで監視用ユーザーを作成し、アクセスキーとシークレットキーを発行する。

AWS Management Console -> Services -> Administration & Security > IAM
で管理画面にアクセス可能。

ユーザー作成後にAttach User PolicyからCloudWatch Read Only Access権限を付与。
アクセスキーとシークレットキーを取得する。

PHPからリクエストを飛ばす

こちらの記事を参考にコードを書いた。

MetricNameに指定できるパラメータは以下のドキュメント参照。

CloudWatchClientのドキュメント
Class Aws\CloudWatch\CloudWatchClient | AWS SDK for PHP

の変更に柔軟に対応したいので
汎用的なバッチどうやって作ろうか検討中。

PHPのAPCとOPcache試してみた

ちょっと仕事でPHPのパフォーマンス改善の必要があったので
勉強がてらPHPAPCとOPcache試してみた。

APCのインストール

環境は

$ pecl install apc
Fatal error: Call to a member function getFilelist() on a non-object in /usr/local/Cellar/php55/5.5.10/lib/php/PEAR/Command/Install.php on line 742

インストールで怒られてこける

issueになってた
Can not install extension with pecl · Issue #1039 · Homebrew/homebrew-php · GitHub

$ touch $(brew --prefix php54)/lib/php/.lock && chmod 0644 $(brew --prefix php54)/lib/php/.lock

再度インストール

$ pecl install apc
$ php -m | grep apc
apc

どれくらい早くなるのか確認する
/etc/hostsを書き換えて
phpinfoを出力してみる

// 10並列で100リクエスト
$ ab -n 100 -c 10 http://apc.localhost/php_info.php

// apcなし
Time per request:       8.322 [ms] (mean)
Time per request:       0.832 [ms] (mean, across all concurrent requests)

// apcあり
Time per request:       8.026 [ms] (mean)
Time per request:       0.803 [ms] (mean, across all concurrent requests)

そこまで劇的に早くはならない。

OPcacheのインストール

ついでにPHP55に上げる。
PHP55からはデフォルトでOPcacheが入る。
APCは使わない流れっぽい。

APCより20%ほど早くなることもあるらしい。
PHP5.5 のコードキャッシュは APC から Zend OPcache へ - Shin x blog

$ brew install php55 --with-fpm
$ brew unlink php54
$ brew link php55

$ vi /usr/local/etc/php/5.5/php.ini
// 追記
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20121212/opcache.so

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

fpmを再起動してOPcacheが読み込まれてるか確認

$ php -v

PHP 5.5.20 (cli) (built: Jan 11 2015 23:52:35) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

ベンチマークとってみる

$ ab -n 100 -c 10 http://apc.localhost/php_info.php

Time per request:       5.825 [ms] (mean)
Time per request:       0.582 [ms] (mean, across all concurrent requests)

25%くらい早くなってる。

今回はphpinfoを出力しただけだったけど
php55とopcacheでけっこう早くなった。

これがwebアプリでフレームワークとか使ってると
ルーティングとかの共通処理が入ってるのでもっと早くなりそう。

合わせてAPCuも試してみたい。

2014年お買い物ランキング

2014年のお買い物でよかったものベスト5くらい書きます。

5位 ナタデココ

近所のスーパーより安く買える
以前買ったヨーグルトメーカーでヨーグルト量産して
近所のスーパーで買った業務用サイズのフルーツ缶と混ぜて食うと最高。

個人的にヨーグルト風邪予防説は信じていて、今年もヨーグルト毎日食いまくってたら
1回も風邪ひかずにすんだので、今後も信じていきます。


4位 ホワイトボードのノート

会社で使ってる。
開発中のタスクリストをサクッと作って、1つずつチェックしていったり
仕様とか、実装方針を図に書いて説明したい時に重宝する。あと落書きして遊ぶ。
付属のほっそーいペンは一瞬でなくなるので、100均の細ペン大量に買っとくとよい。

CANSAY NUboard A4判

CANSAY NUboard A4判


3位 SHフィギュアーツ 仮面ライダー斬月

会社の誕生日プレゼントでいただきました。ガチでうれしかったです。
斬月は鎧武放送開始前から「こいつ絶対強い」って確信していて
その期待値を裏切らぬ11話での無双っぷりで完全に好きになった。
主任が斬撃入れるときの「ハッ!」の声もかっこよくていい。
こうなるとプレバン限定の斬月・真も欲しくなるけどプレミアついてて迷う。


2位 新宿ミラノ座 LAST SHOW マトリックス

新宿ミラノ座閉館に合わせてのイベント
たしかマトリックスは小3か小4の時に公開されて
当時ストーリーなんて理解できないまま、ただただアクションのかっこよさに惹かれてた。
24になって見なおしてもやっぱりアクションがむっちゃよかった。

ミラノ座は古い映画館っていう認識で、初めて行ったら
シアター入り口のドアから音漏れしまくってて
遮音性とか無視してとりあえず爆音で映画流すっていう根性がとても気に入りました。
特にビルの1階で金属探知機通り抜けたあとの銃撃戦は
映画館ならではの大画面&爆音で、最高にクールそして迫力MAXなシーンでした。
映画館で見られてよかった。
http://www.tokyucinemas.net/news/last-show/


1位 神保町シアター ゴジラ映画総進撃

東京に引越してきた直後から始まったイベント
特に良かったのは

の3作で、1984は近所のTSUTAYAに置いてなくてやっと見られたのがよかった。

平成ゴジラ平成ガメラをビデオが擦り切れるくらい見て育った自分にとってはたまらないイベントでした。
メカゴジラとスペースゴジラは家のテレビで見るのと全然違って迫力あったのが最高でした。
メカゴジラが殴られてコックピットが揺れてるシーンで、震度2か3くらいの地震がきて
映画館も揺れたのが4D感あってとてもよかった。スペースゴジラはもっと評価されていいと思う。
向かいの餃子の定食屋がうまかったです。



東京は映画系のイベントが多いので
今年は映画の印象が強い。
来年は映画とかの受動的に鑑賞するものではなく
もっと能動的に体験できることにお金使ってみたい。

井の頭公園に行った

今日は休日出勤の代休をもらったので吉祥寺に行っていた。

駅前はイメージしてたのより街中な感じでマルイやPARCOがあって驚いた。

なんかグーグルマップを見てると公園が近くにあったので寄ってみると井の頭公園だった。
名前だけ聞いたことあるなーと思いながら少し散策してた。

でっかい池を中心に林がぐるっと囲んでいて、その林の中を散歩できる。

池のそば特有の若干モヤというか霧がかかった感じで
そこに木漏れ日が差し込んできれいだった。

そばには動物園もあって、けっこう楽しい。
僕は水生昆虫を見てひとりキャッキャしていた。昔タガメを飼っていたことがあるのだ。


普段六本木にいると人とビルしかない無機質な街に慣れてしまっていて
なかなか散歩してても気が休まることがない。

今日行った井の頭公園は、都会とは打って変わって時間がゆっくり流れている感じで
滞在時間は数時間なのだが、丸一日いたような感覚がしている。


なんとなく鴨川でダラダラしていた時もこんな感じだったなぁと今になって思い出した。


三鷹の森ジブリ美術館まで600m
みたいな看板がたくさんあるのもよかった。2回目いつ行こうか迷っている。
できれば、めいとこねこバスの上映期間に行ってみたい。

近所にはいい感じのランチが出てくるお店もあったので
また休みの日に行って散策したい。押忍。

グアムでゴジラ見てきた

途中からネタバレあり。


社員旅行でグアムに連れて行っていただけたので
これはチャンス!と
日本では7/25まで見られないゴジラを一足早く見てきた。

f:id:takanamito:20140602155955j:plain

そもそも初海外だったので
めっちゃびびりながらチケット買った。
しかし3Dなのに8ドルで見れたのはマジでよいと思った。

せっかくなのでアメリカンサイズのポップコーン頼むかって感じになって
Big Popcorn & Big Juice
みたいなメニュー頼もうとしたら

バケツくらいのサイズのポップコーンと
僕の肘から先くらいあるコーラが出てくるとわかって
慌ててSmallに切り替えたりと
なかなかアメリカンな体験が楽しめてよかった。

※ちなみにSmallでも、日本のLargeくらいあって
余裕で半分以上残った。3.5ドル。

f:id:takanamito:20140602160353j:plain

めっちゃ人気とか聞いてたけど
客席は超ガラガラで、自由席だったけどいい席座れた。

アメリカも日本と同じく
本編が始まる前に予告編を延々と見せられる形式は一緒で
だいたい10分くらい予告編見せられた。


当たり前の話だけど
英語音声 + 字幕なし
なので、英語学習がセンター試験で止まっている僕は
けっこう必死でついていかないといけない。

まあでも見たかったのは怪獣プロレスなので、正直聞き取れなくてもいけた。
それにそんなにストーリー複雑じゃないので、だいたい内容もわかった。





こっからネタバレ

肝心の内容はめっちゃ渋くて
どっかで書かれてたけど、ちょっと平成ガメラ一作目っぽさを感じた。

とにかくゴジラ登場までが長い。

でも空港で飛行機連鎖爆発ドンドンドンからの
カメラ横に振ったら、ゴジラの足がズンってくるとこはすんげーテンション上がる感じだった。

戦闘描写はもっとたっぷり見せて欲しかった感じある。
主にゴジラ劣勢な場面が多くて、なんかあんま怪獣王な印象なかった。

ただ何よりのサプライズはしっかり熱線撃ってくれたところ。
日本では背びれだけが光る感じだったけど、今回は尻尾の方からどんどん光ってて
かっこよさが今っぽくなってた。


あと、渡辺謙がちゃんと「ゴジラ」って発音してたのがめっちゃよかった。

とりあえずまた日本で公開されたらIMAXで見ることになりそうです。