でじくる。

主にプログラムの話題などを扱うブログです。

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コマンドラインのスクリプトを書いていて

はまってしまったというのが今日の話題。

 

コマンドライン引数を取得する場合、

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はそれ単体でも面白そうで夢が膨らみます。