Apache Solr 3.6からはKuromojiという形態素解析が初期の状態で含まれる
しばらく前に
Apache Solrで形態素解析をしたいときはlucene-gosenを使うという話
http://digiclu.hatenablog.com/entry/2012/03/25/201724
という記事を書きましたが、
先月リリースされた3.6では
Kuromojiという日本語形態素解析が初期の状態から
含まれるようになっています。
Lucene/Solr 3.6.0リリース / 「Apache Solr入門」のサンプルのKuromojiとlucene-gosen対応(1章)
http://johtani.jugem.jp/?eid=76
あと、3.6をそのまま動かした場合にエラーが出たんですが、
その件については、
solr3.6の起動時のエラー:org.apache.solr.common.SolrException: undefined field text
http://d.hatena.ne.jp/treeapps/20120504/p1
を参照すればおkでした。
rightscaleのCentOS6.0をsmall instanceにしようとしたらkernel panicになった件
EC2でインスタンスを立ち上げる場合、
だいたいはオフィシャルか3rd Partyの作成した
OSイメージを使用すると思います。
その中で、rightscale社の作成したOSイメージは
比較的プレーンでサーバに使いやすいCentOSのOSイメージ
ということでそこそこ使われているのではないでしょうか。
国内のEC2紹介記事でもrightimageを使用したものはよく見ます。
私も最近プライベートでrightimageのCentOS6.0を使っていました。
最初はmicro instanceを使っていたのですが、
時間のかかる処理が割とあるのでsmall instanceに変えようとしたときに事件は起こりました。
それが表題の件、kernel panicになって立ち上がらなかったのですね。
検索するとそれっぽい記事が見つかりました。
centos6 kernel panic on boot (--block-device-mapping '/dev/sdx=snap-abc:50'
https://forums.aws.amazon.com/thread.jspa?threadID=75911
手順は以下の通り
1./dev/xvda3を削除する
2.fdisk /dev/xvdaして/dev/xvda3のパーティションを削除して保存
3.small instanceに変更
xvda3はswapなので削除しても問題ないらしいです。
実際やってみても、問題はありませんでした。
$argvはスーパーグローバルではない
PHPは主にWebアプリを作成するための言語ですが、
当然のごとくコマンドラインで動くスクリプトを作成することもできます。
一般的にどの程度PHPがコマンドラインで使われているかは知りませんが、
私はあまりPHPでコマンドラインのスクリプトを書いたりしません。
ごくまれに簡単なものを作るぐらいです。
はまってしまったというのが今日の話題。
コマンドライン引数を取得する場合、
PHPでは$argvという配列から取得することができます。
引数を渡した場合、データの入った$argvという配列が
勝手に作られる、と。
で、私は$_POSTや$_GETみたいに
$argvもスーパーグローバルな変数なんじゃね、と
思い込んでしまったというか、早合点してしまったのです。
実際の$argvはスーパーグローバルではないので、
クラスや関数の中から使用する場合は
引数などの形で渡してやる必要があります。
Apacheでmod_remoteipを使うときに気をつけておいた方がよいこと
前twitterか何かに書いた気もしますが、
先日公開されたApache 2.4.1からmod_remoteipという
モジュールが追加されています。
httpdがロードバランサの後ろとかにいると
アクセスログにはロードバランサのipが記録されてしまうので
困るよね、というのを解決できるモジュールです。
Apache Module mod_remoteip
http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html
ロードバランサがX-Forwarded-Forで
元のIPアドレスを返してくれる、というよくある状況だと、
httpd.confには
RemoteIPHeader X-Forwarded-For
とか書いておけばOK。
ただ、一つ気をつけることがあって、
置き換えられるのはリモートipであって
リモートホストではないみたいなのです。
なので、アクセスログをデフォルトのままっぽくしておくと
相変わらずロードバランサのipアドレスが記録されます。
アクセスログにX-Forwarded-Forを記録するようにした場合は
何も記録されない、と。
どうすればいいかというと、
簡単な話でリモートipを記録するようにすればいいわけですね。
デフォルトだと%hになっているところを%aに変えればOK。
名前解決したい場合はご愁傷様。
微妙にめんどくさいので、もっといい方法も
あるんじゃないかという気もします。
PHPからApache SolrにJSONでデータをポストする
ApacheSolrにデータを投入する場合、
一般的にはxmlのファイルを読み込んだり
MySQLなどからDataImportHandlerで読み込むと便利です。
ただ、クライアントサイドから頻繁にアップデートをする場合など、
PHPとかプログラムからデータを送りつけることができます。
以前使ったときは普通にxmlでポストしたのですが、
公式サイトを見たところJSONでもOKみたいだったので、
少し試してみることにしました。
Updating a Solr Index with JSON
http://wiki.apache.org/solr/UpdateJSON
PHPからJSONでデータを送る場合、
注意するべきことが二つあります。
というか、私が無駄にハマったことが二つあったわけですね。
一つ目は、Content-typeをapplication/jsonにする必要があると言うこと。
これはまあ、ちゃんとサンプルを読みましょうね、という話ではあります。
二つ目は、PHPで配列をjson_encodeしたものをそのまま送りつけても駄目、ということ。
PHPの配列をそのままjson_encodeすると
{"hoge":"huga", "hogehoge":"hugahuga"}
みたいになりますが、Solrは
[{"hoge":"huga", "hogehoge":"hugahuga"}]
としないと受け付けてくれません。
PHPMDで既存のルールセットからカスタムルールを作るときに気をつけること
PHPMDというツールがあります。
PHP Mess Detectorということで、
PHPで書かれたコードのいまいちいけていないところを指摘してくれるツールです。
未使用の変数を指摘してくれたりなかなか便利なのですが、
二文字の変数を使いたいから一部の条件を外したい、とかあるわけです。
そういうことをしたい場合は、カスタムのルールを作ります。
作り方は公式を参照。
Howto create a custom rule set
http://phpmd.org/documentation/creating-a-ruleset.html
で、ここからが今日の話題。
普通、phpmdをコマンドラインから実行するときは
phpmd hoge/ xml codesize,naming --reportfile phpmd.xml
みたいに書きます。
で、カスタムのルールを作成したときは
phpmd hoge/ xml codesize,naming,custom_rule.xml --reportfile phpmd.xml
と書く。ルールを並べているところにカスタムルールを書いたxmlを並べればよし。
超楽ちんです。
完全に新しいルールを作った場合は上記の例でよいのですが、
既存のルール、たとえばnamingルールから一部の条件を外す設定をした
ルールセットのxmlを作成した場合、巧く動きません。
namingルールの指定が重複しているからなのでしょうが、
カスタムルールで指定した設定が反映されない。
ならばどうするのか、というのは簡単で、
namingをはずしてやればよし。
phpmd hoge/ xml codesize,custom_rule.xml --reportfile phpmd.xml
これでちゃんと動きます。
どうせならルールセットは全部xmlに書いてしまうのがよいですかね。
JavaScript+QUnit+PhantomJS+JenkinsでCI
適当にはてブを見ていたら、
JavaScriptでUnit Testをする記事が出ていました。
javascriptのテストのはなし:QUnit
http://dev.classmethod.jp/etc/javascript_testing_framework_qunit/
へー、とか感心しつつ、
結局ブラウザで動かさないといけないんじゃめんどくさいよね、
と思っていました。
どうにかならないもんかな、と思いつつググってみたら
PhantomJSというのがあるんですね。
コマンドラインでJavaScriptを走らせるWebKitベースのツール。
PhantomJS: 「最小限なheadlessのWebKitベースのJavaScriptツール」
http://d.hatena.ne.jp/karasuyamatengu/20110126/1296066287
んで、それとJenkinsを連携させてCIできる、と。
Setup JavaScript unit testing using QUnit, PhantomJS and Jenkins on Amazon EC2
http://www.readmore.ch/post/18940470535
私の方ではまだ試していないのですが、
PhantomJSはそれ単体でも面白そうで夢が膨らみます。