いっぽんの猟銃のむこうに (DAIZOじいさんとGun)

ヌルめの技術メモとか。フリーランスやってます (http://acez.jp/)

Solr4.4で日本語検索する場合のschema.xmlフィールド設定メモ

毎回データ型っぽいやつを忘れるので。基本的にexampleのschema.xmlをベースに。

 <fields>
   <!-- 主キー -->
   <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <!-- 完全一致 -->
   <field name="category" type="string" indexed="true" stored="true" required="true" multiValued="false" />
   <!-- Kuromojiによる形態素解析 -->
   <field name="title" type="text_ja" indexed="true" stored="true" />
   <!-- bigram(2-gram)による分かち書き -->
   <field name="caption" type="text_cjk" indexed="true" stored="true" />
   <!-- unigram(1-gram)による分かち書き (追加拡張) -->
   <field name="author" type="text_cjk_uni" indexed="true" stored="true" />
   <!-- 日付 -->
   <field name="regdt" type="date" indexed="true" stored="true" />
   <!-- タグ検索(完全一致、複数項目格納) -->
   <field name="tags" type="string" indexed="true" stored="true" multiValued="true" />
   <!-- コピーフィールド、全検索用のフィールド(unigram) -->
   <field name="text" type="text_cjk_uni" indexed="true" stored="false" multiValued="true"/>
   <!-- お約束  -->
   <field name="_version_" type="long" indexed="true" stored="true"/>
 </fields>

 <!-- UNIQ KEY(PK) -->
 <uniqueKey>id</uniqueKey>

  <!-- copyField -->
   <copyField source="title" dest="text"/>
   <copyField source="category" dest="text"/>
   <copyField source="caption" dest="text"/>
   <copyField source="author" dest="text"/>
   <copyField source="tags" dest="text"/>

(略)

    <!-- CJK bigram (see text_ja for a Japanese configuration using morphological analysis) -->
    <fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100">
          .....
    </fieldType>

    <!-- text_cjk unigram版(outputUnigrams="true") -->
    <fieldType name="text_cjk_uni" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.CJKBigramFilterFactory" outputUnigrams="true"/>
      </analyzer>
    </fieldType>

(略)

こんな感じでスキーマ定義して、それぞれこんなデータを入れて検索してみます。

内容に意味はないです。

[
{
        "id" : "1",
                "title" : "きんいろモザイク",
                "category" : "アニメ",
                "caption" : "今季最高のクソかわアニメーション",
                "author" : "原悠衣" ,
                "regdt" : "2013-09-27T23:59:59Z",
                "tags" : ["金髪","アリス・カータレット","良さ", "まんがタイムきららMAX"]
}
,
{
        "id" : "2",
                "title" : "ご注文はうさぎですか?",
                "category" : "4コマ漫画",
                "caption" : "来世紀最高のクソかわコミックス",
                "author" : "Koi" ,
                "regdt" : "2012-02-27T23:59:59Z",
                "tags" : ["喫茶店","ティッピー","良さ", "まんがタイムKRコミックス"]
}
]

これを検索してみると、

  • "title"は形態素解析(Kuromoji)されてインデックスが作られる。
    • 「うさぎか?」と検索しても「ご注文はうさぎですか?」がヒットする
    • 「きんモザ」で検索して「きんいろモザイク」がヒットする(※1)
    • 「うさ」など、単語途中での検索はヒットしない。
  • "category"、"tags"は完全一致。
    • "category:漫画"とか"tags:まんがタイム"とか"tags:良い"はヒットしない。
    • "tags:良さ" で検索すると2件ともヒットする。
  • "caption"はbigram(2-gram)でインデックスが作られる。
    • "caption:高の" のように文章の途中でもヒットする。
    • 2-gramなので"caption:高"のように1文字だけでの検索はヒットしない。
  • "author"はunigram(1-gram)でインデックスが作られる。
    • "author:原"など1文字での検索もヒットする。
  • "text"は"title", "category", "caption", "author", "tags"を連結したインデックスが作られる
    • solrconfig.xmlのSearchHandlerでdefaultがtextと指定されているので、フィールド名を指定しない場合自動的にここから検索される。(前はschema.xmlのdefaultSchemaとかそんな感じで定義してた奴)
    • text_cjk_uni(1-gram)指定で作ってあるので、titleとかcategory, captionでは引っかからない条件でも拾える。
    • ただしインデックスサイズは最大になる。

とまあ、こんな感じ。

※1 tokenizerで"solr.JapaneseTokenizerFactory" mode="extended"を指定した場合。未知語とかに強くなるらしい。こんな略称検索がヒットするとは思わなかった。

Kuromojiの形態素解析とbigram, unigramあたりは一長一短なので、用途で使い分けるんですかね。


あとtomcatの場合

  • schema.xmlを更新したらtomcatは再起動してインデックス再作成(データ再投入)

を忘れずに。

やっつけでCentOS6.4のTomcat6でSolr4.4を動かす

4.3からまたなんか微妙に色々変わってた気配なので。

以下、最低限でexampleサンプルを動かしてみた手順です。

Tomcatをyumで入れる

・めんどくさいので標準のtomcat6を使う(OpenJDK1.7も一緒に入る)
# yum -y install tomcat6
(javacとかは入らないので必要なら別途java-1.7.0-openjdk-develとか入れる)

■Solr4.4を配置(/usr/local/src/)

・適当なディレクトリに移動
# cd /usr/local/src/

・http://lucene.apache.org/solr/downloads.html から最新版取得、解凍
# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/lucene/solr/4.4.0/solr-4.4.0.tgz
# tar xzvf solr-4.4.0.tgz

・シンボリックリンクを貼る(/opt/solr/でアクセスできるようにする)
# ln -s /usr/local/src/solr-4.4.0/ /opt/solr
# ls /opt/solr/
CHANGES.txt  NOTICE.txt  SYSTEM_REQUIREMENTS.txt  dist  example
LICENSE.txt  README.txt  contrib                  docs  licenses

Tomcatの設定

・tomcatユーザのアクセス権限を与える
# chown -R tomcat:tomcat /opt/solr/

・Webアプリケーションコンテキストの設定(http://localhost:8080/solr/でアクセス可能に)
# cd /usr/share/tomcat6/conf/Catalina/localhost/
# vi solr.xml
----
<Context docBase="/opt/solr/dist/solr-4.4.0.war" debug="0" crossContext="true">
   <Environment name="solr/home" type="java.lang.String" value="/opt/solr/example/solr" override="true" />
</Context>
----

・logging用のjarファイルをコピー(tomcatで動かす場合は必須)
# cp /opt/solr/example/lib/ext/* /usr/share/tomcat6/lib/

Tomcat起動(お好みで自動起動設定)

# service tomcat6 start
# chkconfig tomcat6 on

あとはWebGUIにアクセス
http://localhost:8080/solr/

f:id:tkizm:20130913154110p:plain

テスト用に適当なデータを格納

f:id:tkizm:20130913154154p:plain

日本語の形態素解析とかできるのを確認(なぜかこれやらないとqueryが出なかった。手でcommitとかしてないから?)

f:id:tkizm:20130913154224p:plain

検索クエリを投げてヒットするのを確認。

f:id:tkizm:20130913154312p:plain


ざっくりとこんな感じです。

ログはそのままのlog4j.propertiesでも出ますが、もしかしたらサンプルのをコピーした方がいいかも。

# cp /opt/solr/example/resources/log4j.properties /usr/share/tomcat6/conf/log4j.properties

確認は以下のコマンドで。なんかうまく動いてないときはチェックしてみてください。

# tail -f /usr/share/tomcat6/logs/catalina.out

ちなみに以下のようなエラーがでる場合、たぶんlogging用のjarとかがtomcatのlibディレクトリに放り込まれてないのが原因。

Sep 11, 2013 1:41:32 PM org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
Sep 11, 2013 1:41:32 PM org.apache.catalina.core.StandardContext start
SEVERE: Context [/solr] startup failed due to previous errors

sl4jとかlog4jはwarファイルに含めるとかできなかったんですかね……

Debian Wheezy(7.1)へVagrantをさっくり入れる

最初は

$ wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -

$ sudo apt-get update

$ sudo apt-get install vagrant

$ vagrant -v

Vagrant version 1.0.3

でまあ古いけどこれでいいかなー楽だし、と思ってたら、 やっぱりVagrant本体が古すぎるのかvagrant boxイメージの方がうまくうごかなかった。 手を抜かずきちんと新しめなのを入れていかないといけないっぽい。

virtualboxを入れる(https://www.virtualbox.org/wiki/Linux_Downloads)

$ wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -

$ sudo apt-get update

$ sudo apt-get install virtualbox

最新版vagrantを入れる(http://downloads.vagrantup.com/)

$ wget http://files.vagrantup.com/packages/7ec0ee1d00a916f80b109a298bab08e391945243/vagrant_1.2.7_x86_64.deb

$ sudo dpkg -i vagrant_1.2.7_x86_64.deb

$ vagrant -v

Vagrant version 1.2.7

最新版のvagrant boxを拾ってくる(http://www.vagrantbox.es/)

$ vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box

$ vagrant box list

centos64 (virtualbox)

起動/SSH/停止

$ mkdir VagrantTest

$ cd VagrantTest/

$ vagrant init centos64

$ vagrant up

$ vagrant ssh

$ vagrant halt

にしてもboxを拾ってくるとこ、やたら時間かかりますね……300k/sとか辛いな……

ちなみになんか上手くうごかなかった(vagrant upで起動しないまま止まった)のは、VirtualBox側が64bitOS使うときにBIOSのVTがOffになってたせいみたいでした。GUIとかで表示させるとわかりやすかったみたい。でもGNOME3とかわざわざ入れるのもちょっと……

なのでもしかしたら最初のでもきちんと動いたのかもしれないですが、Vagrantfileの書き方とか変わってるし、やっぱり新しいの使ったほうがよさそうな感じでした。

AWS無料枠を使って『艦これ』をモバイルデバイスから遊ぶ 前編

はじめになのです!

すごい人気ですよねー。『艦これ』

僕も今ではすっかり提督として鎮守府に着任していまして、お陰様で帝国海軍のフネとか大分詳しくなりました。今まではフネ系は正直さっぱりだったんですけど、やっぱゲーミフィケーション効果ってすんごいですね。

ちなみに僕のお気に入りは古鷹さん。重巡洋艦のいいところ(ゲーム中では今のところ残念ながらあんまりない)、手とり足取り教えてほしいです。

まあ前置きはそんなところで本題ですが、ぶっちゃけ、

『AWS無料枠を使って東京リージョンt1.microのWindowsServerインスタンスを立ち上げ、その上でPCブラウザから艦これにログインして、スマホでRDP経由して操作する』

これだけです。この説明で理解できた人は、あとは読まなくても大丈夫です。

ご注意なのです!

ここで記述した手順は2013/08/06時点で「最低限の」設定による疎通確認、および簡単なゲームの動作確認を行っただけです。(遠征・補給のみ)

以下の手順は、インターネット上にWindowsサーバーを公開することになります。本来はWindowsサーバー管理者相当の理解や知識が必要な作業ですので、試される場合はくれぐれも『自己責任』でお願い致します。

また、Windowsサーバーのセキュリティ設定や、不要サービス停止、管理者ユーザ無効化など、サーバ堅牢化の手順はまったく含まれておりません。実際にEC2インスタンスを長時間起動させて運用する場合は必要に応じ、適切なセキュリティ対策を施すようにしてください。

ここに書かれた内容で何らかの不利益を被ったとしても、当方では責任は負い兼ねます。At Your Own Riskの精神で、何卒、宜しくお願い申し上げます。

用意するものなのです!

  1. AWSアカウント(サインアップには要クレジットカード、電話番号)
  2. RDP(リモートデスクトップ)接続可能なPC(Win, Mac, etc..)
  3. スマホ、タブレット等のモバイルデバイス(Android/iPhone等。RDP接続可能なもの)

特に難しいものはないと思います。

1.のAWSアカウント作成にクレジットカードが必要なのが若干ハードル高いかもしれませんが、艦これの場合「18歳以下はプレイできない」という規約になってますので、まあ問題ないでしょう。高校生だからクレカ作れない!ってわめいてるボウヤは愛宕のパイオツでも吸ってろ!!って感じで。

AWSの登録自体は特に難しいこともないですし、いくらでも紹介されているので省略。登録完了後ブラウザからログインして、AWS Management Consoleを開いておいてください。

EC2インスタンス立ち上げなのです!

まずはManagement Consoleから「EC2」を選択し、右上のリージョン選択から「Tokyo」リージョンを選択。デフォルトでは「US. West」(米西海岸)とかになってるかと思いますが、艦これというかDMM.comが海外からのIP接続を弾くらしいので、忘れずに「Tokyo」にしておいてください。「Launch Instance」を押して次に進みます。

f:id:tkizm:20130806145138p:plain

とりあえず「Classic Wizard」を選び、用意されてる中から「Microsoft Windows Server 2008 Base 32bit」を選択。(2012の方が良いのかもしれませんが今回はできるだけ軽そうな奴に。ですが実際はかなり重いです)

f:id:tkizm:20130806145214p:plain

「t1.micro」が選択されてるのを確認し、次へ。(t1.microだとFlash再生がかなりカツカツなので、お金に余裕があれば上位インスタンスを選ぶのもアリかも…)

f:id:tkizm:20130806145230p:plain

Advanced Optionは今回特に設定せず。

f:id:tkizm:20130806145246p:plain

StorageもEBSのデフォルト設定で。

f:id:tkizm:20130806145542p:plain

Tagはお好みで。

f:id:tkizm:20130806145553p:plain

Key Pairは既存のものを使ってもよいですが、今回は新しく作りましょう。「Create & Download your Key Pair」をクリックしてKey Pairを作成、ダウンロードしておいてください。後ほど使います(ここではkankorekey.pemになります)

f:id:tkizm:20130806145606p:plain

Security GroupではRDP用のポート(TCP 3389)を開けておきます。モバイルデバイスからのアクセスを想定して、IP制限はしていません。

f:id:tkizm:20130806145615p:plain

最終的にはこんな感じ。「Launch」押下で指定したEC2インスタンスが起動します。

f:id:tkizm:20130806145644p:plain

「Your instance are now launchig.」と緑の文字が表示されたら「Close」を押してEC2 Dashboardに移りましょう。

起動が終わるまでには時間がかかるので、ぜかましchangをおっおっ!と鳴かせたり、300/300/600/600レシピで錬成された那珂ちゃんだよー!を燃2弾4鋼11に解体したりして、のんびり待ちましょう。

だいたい10分くらいでしょうか。以下のようにStatus Checksにチェックマークが表示されれば無事起動完了です。

f:id:tkizm:20130806145730p:plain

→後編

AWS無料枠を使って『艦これ』をモバイルデバイスから遊ぶ 後編

←前編

PCからRDP接続なのです!

EC2インスタンスの起動が完了したら、RDP接続に使うAdministratorユーザのパスワードを取得します。作成したEC2インスタンスを選択し、「Actions」→「Get Windows Admin Password」を選択。

f:id:tkizm:20130806152428p:plain

「ファイルを選択」からインスタンス作成時に生成したKey Pairの秘密鍵ファイルを選択し、「Decrypt Password」ボタンを押下します。

f:id:tkizm:20130806151448p:plain

復号化されたAdministratorのパスワードが表示されればOKです。以下の「Computer:」 「User:」 「Decrypted Password:」の3つの文字列はRDP接続時に利用するので、テキストファイル等にコピーしておくと便利です。

f:id:tkizm:20130806151459p:plain

次に、PCからEC2インスタンスに接続情報を利用してRDP接続します。Windowsの場合は普通にリモートデスクトップを使いましょう。Macの場合は色々あると思いますが、ここではRemote Desktop Connection.appを利用しています。

「Computer:」のアドレスをそのままコピー&ペーストで入力。

f:id:tkizm:20130806151531p:plain

「ユーザ名」「パスワード」も同様にコピー&ペーストで。楽ちんですね。

f:id:tkizm:20130806151542p:plain

あとは接続ボタンを押してしばらく待てば、以下のような画面が表示されるはずです。

f:id:tkizm:20130806151600p:plain

タスクバーが表示されていない場合、EC2インスタンスの画面解像度が1024x768なので、リモートデスクトップのウィンドウを大きくするとよいかもしれません。

最低限のOS設定と接続確認なのです!

本来はこのあと一般ユーザを作成したり、環境を日本語化したり、不要なサービスを停止したりと色々すべきことはあるのですが、今回は省略して、艦これをプレイするにあたり必要最低限な設定だけを行います。

IEのセキュリティポリシーが邪魔をしてファイルのダウンロードができないので、スタートメニューの一番上の「Server Manager」を起動、「Configure IE ESC」の設定をOffにします。

あとは普通にIEを起動し、好きなブラウザ(ここではFirefox)とAdobe Flash Playerをダウンロードしてインストール。DMM.comにアクセスしてログインし、鎮守府に着任ができれば無事、任務完了なのです!

f:id:tkizm:20130806151729p:plain

モバイルデバイスからのRDP接続なのです!

ここまでできれば、あとは艦これにログインしているAWSのEC2インスタンスに、モバイルデバイスからRDPを使ってリモート接続するだけです。

例として手元のiPhone 4S(@3G回線)で説明しますが、Androidや他のモバイスデバイスの場合は適当に読み替えてください。RDP接続がきちんと出来るクライアントアプリなら問題ないと思います。

iPhoneの場合は、RDP接続が可能なアプリはいくつかあるようですが、ここでは無料のiRdesktopを利用しました。お世辞にも快適な操作感とは言えませんが、とりあえず遠征回しくらいはなんとかできる感じです。他にもRDP接続用ソフトは色々出てるみたいなので、興味がある方は色々と試してみてください。

インストールして起動後、PCからの接続設定と同様に設定していきます。

f:id:tkizm:20130806151916p:plain

入力が完了したらタップして接続。

このように、PC98を彷彿とさせるナウい素敵なグラフィックが表示されればOKです。

f:id:tkizm:20130806151948p:plain

色がおかしいので文字とかは判別しにくいところもあるかもしれませんが、まあ遊びこんでいる提督なら問題ないでしょう。ピンチイン・アウトで拡大縮小ができるので、特に補給のチェックを入れるところで活用してください。

f:id:tkizm:20130806152009p:plain

注意点は、EC2の画面サイズが1024x768なので、RDPクライアント側もそれに合わせることでしょうか。そうしないとブラウザ画面が切れてしまって操作ができなくなってしまう場合があります。

色設定とかもAWS側の画面設定を含め、色々試せばおそらくもっと綺麗に表示されると思いますが、今回は遠征だけできればいいやという感じだったので気にしないことに。こんな感じで補給と遠征が無事できます。

f:id:tkizm:20130806152113p:plain

描画のモタつきは3G回線だからというだけではなく、EC2側の処理能力も足りてないのかなと思います。あまりにも我慢できない、という方は改善の余地はたっぷりあると思うので、色々と試してみて下さい。リモート接続はRDPじゃなくてVPCにしたりするといいのかもしれませんね。

最後に、なのです!

やってみて今更なんですが、DMM.comがクレジットカード情報とか握っているので、公開サーバにそのアカウントでログインしっぱなしにすることになり、正直あまり心臓に良くありません。僕は常用はできないなあと思いました。

あと、DMMのオンラインゲーム規約を読んだのですが、AWS経由でのアクセスが「(8)不正な方法(特殊なプログラムを介しての)でのアクセスを試みる行為」に相当すると判断される可能性が、まったくないとは言い切れません。(ネットカフェからの接続と何が違うんだって話ですが……)

そんなわけで、また動作のもっさり感も正直半端ないので、快適かつ安心にプレイしたいという方は、素直にSurfaceとか買ったほうが楽だと思います。金額的にはAWSの無料枠に収まるっぽいので、そこだけが利点でしょうか。

ただ、遠征回しだけでもモバイル端末からやれるようになれば、ピーク帯のサーバ過負荷が、多少なりとも改善されるんじゃないのかなあ……なんて思います。

まとめ

艦これとても楽しいです。

ですが、中の人のデスマっぷりを見てると本当に、胃が痛くなります。

くれぐれも玉砕だけは……玉砕だけは……しないでくださいね……

皆さんの戦果Resultが上がることを祈って。

バーニング、ラーブ!!!!

(追記) ぶコメ

WinServer2012の方が軽い

ほほー。試してみるといいかもですねー。FlashPlayerのインストールになんかめんどくさい手順がいるという噂なので、その辺予め調べておくとTo Loveらなくて済むかも。

Linux+VNCでやれ

艦これ動作環境にLinux含まれてないんや……と思ったらWinServerも含まれてなかった(慢心) たしかにきちんと運用するならLinuxでやった方が楽かも。まあ今回は「AWSの東京リージョンt1.microからのアクセスで艦これが動くかどうか」を試してみただけなので、環境はお好みに合わせて色々試してもらえると。軽いのが一番ですよねー

AWS古参だからAWS無料利用枠ない(憤怒)

提督は甘えんぼさんなのですねー ぱんぱかぱーん(課金)しましょう よーそろー↑

ブログ引っ越ししました

いい加減放置しっぱなしだったので、はてなダイアリーからはてなBlogに移行しました。

最近はAWSをポチポチしたりして遊んでます。

9月か10月くらいから、新しくAWS使ったお仕事とか始めたいなー。

SJC-P 1.4を更新すべくUpgrade to Java SE 7 Programmer(1Z0-805)取得したら凄く大変だった件

新人時代に取らされたSJC-P 1.4が、Upgrade Exam受ければアップグレードできると聞き、資格本も出てたので軽い気持ちで受けてみたら、なんか大変なことになりました。


試験自体は合格ライン60%ですし、やらしい感じの問題とか、もやっとくる問題も多いですが、資格本を二回くらい通して読めば十分に合格できるんじゃないかと思います。そのまんまな問題も出ましたし。


ただ、Javaも1.4系 から 7系となると、やっぱ色々変わってますよね。try-with-resource構文とか、まあ知ってると便利なんだろうなあとか思いました。実務では多分使わないけど。

レベル感としてはSJC-P持ってて普段Javaの仕事してれば、普通に受かる感じじゃないかと。僕の場合勉強時間は5時間くらいですかね。正直3万円は高いと思いますが、まあ名刺代わりですね。


で、本当に大変だったのは合格した後。これからが本当の地獄だ。

SJC-P受けたのが2005年、当時はSunがプロメトリックの会場で受験する形式だったんですが、その後Oracle試験はピアソンVUEになって、そんでSunが買収されて、Javaの試験もピアソンVUEになったんですよね。めんどくさい。

で、どうもその辺の経緯にともない、資格保持情報とかID引き継ぎとか、なんかあんまうまくできてないっぽい。


まずOracleに問い合わせたら「プロメトリックの資格情報はピアソンVUEで」と言われ、ピアソンVUEに問い合わせたら「プロメトリックから資格情報が取得できない」と言われ、プロメトリックに聞いたら「そもそも資格情報は各試験ベンダーが保持しててうちでは管理してない」とか言われる。

なにこのたらい回し関数。


結局Oracleに「お前んとこがSun時代の資格情報きちんと管理してるはずだろゴラァ、確認しろやオラァ」ってメールして確認とってもらってあれやこれややってもらって、結局一ヶ月くらいかかってなんとか資格取得となりました。はーつら。


わかったことは、「資格証明の紙とか受験の紙とかは、きちんととっておいたほうがいい。捨てるな。」ということでしょうか。
IT系資格試験なのにデータ管理とか糞なのとかどうなの?死ぬの?とか思いますが、マジで当てになりません。

あと資格ビジネス関係の会社。メールしても返信なしとか、コールセンター外国人とか勘弁してください。ベンダ資格とか安くないんで、それくらいはきちんとやってほしいです。本当に。


今後はなんとなくで資格とるのはやめようかなーとか思いました。