Solr勉強会行ってきた。

21日にECナビさんで開催されたSolr(そーら)勉強会に参加してきました。
http://atnd.org/events/937
Luceneを1、2年前ぐらいに触っていて、そのときSolrも調査したことがあったので、その頃からどのように変わったのか楽しみにしていきました。
以下発表内容のまとめです。

Solrとは?(ロンウィット関口さん)

  • 全文検索ライブラリのLucene
    • JavaAPIを使うので、開発期間の短くなっている昨今では導入の敷居が高い
  • SolrはLuceneを使った検索サーバ実装
    • HTTPベースのAPIが提供されている→言語を選ばない
    • 検索アプリが非常に楽に作成可能→時代に合っている
  • Solrとのデータやりとり
    • XMLで登録データを作成(CSVでも可)→HTTPでPOSTすると登録が完了
    • 検索結果もXMLでGETする
    • 検索アプリでは、XMLで返ってきた結果を加工してHTMLに変換して表示する
  • 多彩なナビゲーション機能
    • ハイライト機能、ファセット機能など
    • ファセットを使うと検索結果からジャンルなどで絞込み可能なナビゲーションを実現可能
  • キャッシュ機能
    • documentCache … ドキュメントをキャッシュしてIOなしで結果を返す
    • filterCache … ファセット利用のためのキャッシュ
    • queryResultCache … クエリ結果をキャッシュしてIOなしで結果を返す
    • Luceneでは難しいキャッシュのウォームアップを実現→インデックス更新時に遅くならない
  • インデックスレプリケーション
  • 分散検索
    • インデックスを分散して配置して横断的に検索可能
  • ApacheライセンスのOSSLuceneもSolrも機能拡張を前提としたインターフェース(API)+ 活発なコミュニティ

関口宏司のLuceneブログ」の方です。
質疑応答でSolrの次バージョンである1.4リリース日について質問がありました。Lucene 2.9のリリースが先なので、9月ぐらいに出るといいなあ、とのことでした。
その他、CJKAnalyzerやHilighterのバグについての質問がありました。

事例紹介

商品検索でのSolrの利用(ECナビ春山さん)
  • ECナビでの利用
    • 商品検索、Buzzurlなど
    • 去年の7月ぐらいから使い始めた
  • ECナビ商品検索での利用状況
    • 登録件数2300万件
    • クエリ数最大100万/日
    • 元のデータサイズ10G
    • インデックスサイズ18G
  • 利用しているSolrの機能
    • DistributedSearch(分散検索)
    • rsyncでのレプリケーション
    • ファセット
    • 独自Tokenizer
    • 元データはMySQLに格納
    • インデックス作成用SolrにMySQLからCSVでインデクシング
    • 検索用マシンにrsyncでレプリケート(一日一回)
    • 2台ずつの検索用マシンでユーザ用とロボット用に
    • 3分の1に分割して一台の中で分散検索
  • スペック
    • インデックス用 … メモリ4G、RAIDなし
    • 検索用メモリ … メモリ18G、RAID0+1
  • バージョン
  • ECNaviTokenizer
    • つのだ☆ひろのように星があってもなくても同じトークンを
    • ハイフンの表記ゆれに対応(cyber-shot→cyber shot cybersyot)
    • 半角カナを全角カナに正規化

質疑応答でインデックスを3つに分割して分散検索していることについて質問がありました。試験的にやってみたが微妙で、まだベストプラクティスを模索中とのことです。
プロキシを使ってインデックス更新中は軽いほうに処理が向くようにしているらしいです。
Solr+SSDについてもLTする予定でしたが、マシントラブルで聞けなかったので次回に期待です。

Solr導入事例@リクルート(リクルート植野さん)
  • 社内事業を横断してSolrでの開発支援を仕事に
  • 某事例でのSolr利用状況
    • 25〜280 QPS(5台運用)
    • ドキュメント数250万件
    • 10分間隔で差分更新
    • ファセットも一部で利用
  • 信頼性の担保
    • 冗長化で5台以上
    • ロードバランシング
    • 更新は全台同時投入
    • 小規模な場合は相乗りも
  • 誰でも使えるように
    • 自社Solrクライアント、スキーマ定義にワークシート、DynamicField活用
    • Solrサーバ上での作業を極力0に
    • S2JDBCのJDBCManagerに習ってSolrManagerを→流れるようなインターフェースを実現
    • Solrの学習コスト低減、実装方法の統一、冗長化実装の隠蔽
  • Solrの拡張
    • mecabN-gram
    • 拡張はpluginとして展開→solr.warに手を加えずpluginとしてjarに
  • 今後の展開
    • SolrのUIライブラリの展開→利用者にわかりやすいSolrの伝え方
    • ほぼリアルタイムな検索
    • ×それSolrでできるよ。→○Solrじゃないと大変だよ?

質疑応答での、Solrクライアントを用意したことで全くSolrを意識せずにDBと同じように使うようになって、結果としてSolr利用のナレッジが蓄積されないという話が印象的でした。
Solrの拡張性をうまく生かして利用されているように思いました。
冗長化した事例は初めて聞いたので興味深かったです。

MapionにおけるSolr状況(マピオン*1
  • 利用方法
    • フリーワード検索
    • ファセット検索(ジャンル)
    • 地図から緯度経度からの検索
  • Solr導入経緯
    • マピオン電話帳で当初MySQL5.0 + Sennaを利用
    • データ数900万件でチューニングしても負荷が高い
    • Solr1.3リリース→1ヶ月調査→導入
  • 利用状況
    • 1日約100万クエリ
    • 範囲検索30%、キーワード検索70%
  • データ件数
    • 電話帳900万件(Shard 30)
    • ランドマーク40万件(Shard 4)
  • データ更新
    • 電話帳は差分更新で1日2回
    • そのほかは更新頻度に応じて全件更新
  • サーバ構成
    • インデックス作成用サーバ1台
    • 検索サーバ8台
    • Shards用3台(検索結果をマージするサーバ?)
    • 元データはRDBMS
    • Shardsと検索用Solrサーバの間でロードバランシング
  • 緯度経度検索
    • 拡張コンポーネントとして実装
    • 距離計算をして出すのに負荷が高いので8台使用
  • 検索の拡張
    • 2Box検索(q=キーワード&near=場所)
    • 1Box検索(キーワード 場所)
    • どちらも場所をジオコーディングして内部的に拡張コンポーネントに検索方法を切り替え
  • 1ホストあたりの最大コネクション数を修正してJavaの起動オプションで制御可能に

検索での地名の判定について質問がありました。裏側でマピオン独自の住所エンジンで位置的なクエリかどうか判別して緯度経度を付与しているそうです。
先ほどのリクルートでもジオコーディングのコンポーネントを作っていたので、Solrがそういう検索に利用されているというのは意外でした。

LT

Yahoo!Japanにおけるジオコーダの実装の紹介(ヤフー西岡さん)

某全裸のアイドルが逮捕された公園をバーストワード対応を行ったらCTRが90%言ったという話が非常に興味深かったです。

EC2とOpenSocialちょっぴりAndoroid(GMOインターネット新里さん)

PIAXhttp://overlayweaver.sourceforge.net/index-j.htmlを初めて知ったのですが、使うとなかなか面白そうなものが作れそうです。時間があるときに是非試してみたいと思いました。

Solr@twitter検索(@penguinana
  • 発表資料
  • Twitter検索(yats)
    • 3億以上の呟きを収集
    • 日本語ユーザ5500万が検索対象
    • つぶやいて平均60秒ぐらいで検索可能に
    • 50万/月PV
    • 270万リクエスト/月
  • Twitter検索の特徴
    • 更新頻度高い
    • 文章短いが件数多い
    • 日付でソート
  • インデックス更新の高速化
    • 一日分のデータしか持たない追加専用のSolrを作成し、100秒間隔更新(数秒で更新終了)
    • 1ヶ月分を12時間間隔で更新(数十秒で更新終了)
    • 全体を1ヶ月に一回しか更新(数時間で更新終了)
  • キャッシュ
    • キャッシュをオンにして更新
    • ヒット率:五時間後64%→1週間後77%
  • 遅いクエリをはじく
    • ページングの後のほう、複雑な条件式、ヒット数が多いものなど
    • 時間がかかるとApacheのプロセスが溜まって落ちる
    • 5秒で返ってこなかったらタイムアウト
  • SSDの利用

具体的な施策の話が主だったので、個人的には一番参考になりました。
Solrに限らず、結構なデータ数がある検索システムを作る場合でも参考になるのではないかと思います。

全体的な感想

自分の想像していたよりもSolrが一般的になってきている印象を受けました。気に入っているプロダクトなので、今後利用実績や資料がもっと増えることを期待しています。
元データをRDBMSで持っているというパターンが多かったです。個人的にもSolrだけにデータを持たせるのは若干不安を感じますが、2重に持つのは冗長な気もしました。
CJKAnalyzerを使うとN-gramになるのでインデックスサイズがかなり大きくなるというデメリットがあるのですが、結構気にせずに使っている方が多いように思いました。検索漏れのほうが困るので使っている場合もあるかもしれませんが、Java形態素解析ライブラリのSenの更新が止まっているのも原因のひとつかも、と思って検索していたらcmecab-javaというライブラリを発見。Solrを使う機会があったら試してみたいです。

*1:名前をメモってませんでした・・・。

集合知イン・アクション

本書は2008年10月に発売された「Collective Intelligence in Action」の邦訳されたものです。
集合知とはどういうものなのかから始まり、Javaを用いて実際に集合知を扱うアプリケーションの作り方まで広い内容が書いてあります。
データマイニングのような話題ばかりではなく、既存のブログ検索から情報を取得してきたり、検索の仕組みの作り方やタグクラウドの実現方法、クローリングについてなど集合知の収集方法についても言及がなされています。

集合知プログラミングとの違い

集合知を扱った本としては「集合知プログラミング」が有名だと思います。
集合知プログラミングは各手法について解説と実際にコーディングを行うことでその動きを知ることで理解を進めていくという形になっていました。
集合知イン・アクションは、実際に使うことを意識してスキーマやクラスの設計から考えている点と、簡単な解説はありますが自分でアルゴリズムを実装しているところもありますがどちらかといえばLuceneやWekaのようなライブラリを用いることが多い点が大きな違いではないかと思いました。また、全般的に検索に関する話が多かったというのも違いといえます。
PythonJavaという言語の違いもあるのかもしれませんが、集合知プログラミングのほうはPythonを知らなくても結構読めたのですが、こちらはJavaを知らないとソースコード部分に関しては厳しいかもしれません。

LuceneやWekaなどの使い方を知る本として

Java全文検索エンジンであるLuceneデータマイニングツールであるWekaやJDM(Java Data Mining)APIといった、名前は聞いたことがあるけど日本語の情報がなかなかないJavaのライブラリなどのコードが載っているので、これらを使ってみようと思っている人にとって参考になるかもしれません。

日本語の扱いについて

本文では元が英語で書かれていたため日本語で発生するような問題については言及されていないのですが、付録として形態素解析はてなを使った日本語対応のコードも載っています。

個人的に興味深かった点

タグづけのアーキテクチャ

3.4で触れられているのですが、タグ付けのアーキテクチャとして3つ紹介されています。
最近のWebアプリケーションだとタグはよく実装される機能の1つだと思いますが、パフォーマンスやスケーラビリティを意識するとどのように実装するのがいいのか少し悩むところでもありますので、ここで触れられているスキーマ設計を参考にしてみるのもいいのではないでしょうか。

クローリング

インテリジェントなクローラについて6章に載っています。
クローラを作るときに意識しておくことや拡張する上で考えるべきことを決定するのヒントになるのではないかと思いました。

全体的な感想

500ページ近くある非常に厚い本ですので、全部読むというよりは自分の興味のあるところだけを拾い読みする形で読んでいます。
スケーラビリティについて言及してあったりちょっとしたテクニックが載っていたりと、あまり興味がない部分でも個々の詳細を見ていると参考になるところが見つかります。
Javaをやっていない人だとコード部分を読むのはきついと思いますが、アーキテクチャの話などは参考になるのではないかと思いました。

高橋メソッドのような表現の見る側にとっての心地よさ

最近、高橋メソッドを使ったプレゼンをする機会があったのですが、そのときにその発表をいたく気に入ってくれた方がいました。
その人いわく、「2chニコニコ動画みたいで見ててワクワク感があった。」とのことでした。おそらく2chというのは2chまとめサイトのことだと思います。
その言葉を聞くまでそんな風に考えたことはなかったのですが、考えてみると結構腑に落ちます。
高橋メソッドの特徴をあげると、

  • 字がでかい
  • 表現が簡潔
  • 説明の順番が明示化される→ストーリーがある
  • たまに大きくなったり色が変わったりして強調

などがあげられますが、2chまとめやニコニコ動画と結構重なっているところがあります。
こういう表現をすると視聴者としては集中してみることができるし、メリハリがあって面白いのかもしれません。
去年、いろいろな意味で話題になった「あたし彼女」も簡潔な表現の繰り返しですが、高橋メソッド風に見てみると結構楽しんで見ることができました。


他に類似のものがないかと思いましたが、短文といえばTwitterのようなミニブログがあります。その周辺サービスのふぁぼったーTwitter名言がこの特徴に近い気がします。どちらも見ていて非常に飽きずに見ることができます*1
まあそんなわけで、テキストを使うようなUIを考えるときにこういう特徴を取り入れていくとワクワク感のあるものに仕上がるかもしれないですね。

*1:内容が面白いということもあるかもしれませんが

Tomcat6のインストールとEclipse3.4のWTPで使用する時に詰まったことメモ

OSはWindows XPTomcatのバージョンは6.0.18です。

追記:

GoogleからTomcat5.5+Eclipse3.4でアクセスしてくる方が多いのですが、おそらくEclipse3.4のWTPで作ったプロジェクトがTomcat5.5にデプロイできない(ターゲットランタイムで選べない)ことについてではないかと思ったので一言。
Tomcat5.5にデプロイできるプロジェクトを作るには、動的Webプロジェクトを作成する際に動的Webモジュールバージョンを2.2に変更すればOKです(デフォルトでは2.5)。

Tomcat5.5とTomcat6の並存

Windows環境でインストール用のexeを使ってTomcat6のインストールを仕様としたら以下のようなエラーが発生。

Failed to install Tomcat6 service.
Check your settings and permissions
Ignore and continue anyway (not recommended)?

別のバージョンのTomcatが入っているときに発生するエラーで、どのTomcatWindowsサービスの名前も「Apache Tomcat」となっているため、サービスを登録するときにエラーになるようです。
Eclipseからだけ使う分にはサービスとして使う必要はないので無理やりインストールを続行してしまってもよいのですが、並存させたい場合はサービス名を変更してやる必要があります。
Tomcat6をインストールする前にコマンドプロンプトを開いて以下のコマンドを実行します。

sc config tomcat5 DisplayName= "Apache Tomcat 5.5"

これで元の「Apache Tomcat」から「Apache Tomcat 5.5」と言う名前に変更できたので、Tomcat6のインストーラを実行すればエラーなくインストールができます。
名前に統一感を持たせたい人はtomcat6のサービス名のほうもリネームしてください。
ちなみにDisplayName=の後のスペースは必須です。

Eclipseでサーバを定義(あるいは起動)

WTPで開発する際にはサーバ(Servers)を定義するのですが、その際にTomcat6が選択肢に出てくるのですが選択しても「選択されたタイプを使用してサーバーを作成できません」と表示されてウィザードを進めることができませんでした。
普通のTomcatサーバを起動しようとしてもjava.io.UnsupportedEncodingExceptionが発生して動かないようです。
これは、「TOMCAT_HOME\conf」以下のtomcat-users.xmlの一行目が以下のようになっているからです。

<?xml version='1.0' encoding='cp932'?>

このxmlファイルの実際のエンコーディングUTF-8なので、以下のように修正します。

<?xml version='1.0' encoding='utf-8'?>

これで上記のどちらの問題も解決しました。

第二回Wicket勉強会で発表してきた『Wicketアプリケーションを Webで公開する前にやっておく 3つのこと』

第二回Wicket勉強会で発表してきました。
内容はそのままpptをあげようかと思ったのですが、ソースコードの部分が少しあってその辺が見づらかったので記事に書き直しました。pptでの発表だとどうしてもソースコードを見せるのが難しいので、何か対策を考えたいですね。
以下発表内容と感想と宣伝です。

Wicketアプリケーションを Webで公開する前にやっておく 3つのこと

WicketでWebに公開する
  • Wicketは面白いフレームワーク
  • でも、ステートフルなために公開する際にやっておいたほうがよいことがいくつかある
  • 実際にサイトを公開して見てやっておいたほうがよさそうと思ったことを3つ紹介
  • 今回の使用するバージョンはWicket1.3.5
1. エラーページを変更する

  • Wicketでの開発で頻繁に遭遇するPage Expired
    • サーバ上からPageのインスタンスが消えてしまった後にアクセスすると発生
    • デフォルトではWicketの標準のPageExpiredErrorPageが表示される
  • 自前でExpredPageクラスを作る
    • 方法1.PageExpiredErrorPageを継承したクラスを作ってhtmlを変更する
    • 方法2. 自分でWebPageクラスを継承したPageクラスを作って、コンストラクタでステータスコードを設定
public class MyExpiredErrorPage extends WebPage {
	public MyExpiredErrorPage(){
		((WebResponse)getResponse()).getHttpServletResponse().setStatus(400);
	}
}
  • 表示されるExpiredPageクラスの変更
    • WebApplicationクラスを継承したクラスのinitメソッド内で変更
@Override
protected void init() {
	getApplicationSettings().setPageExpiredErrorPage(MyExpiredErrorPage.class);
}
    • ちなみにInternalErrorPageの場合
@Override
protected void init() {
	getApplicationSettings().setInternalErrorPage(MyInternalErrorPage.class);
}
2. robots.txt
User-Agent: *
Allow: /
Disallow: /?wicket*
    • こうすることで一時生成されるWicketのURLであるhttp:localhost:8080/?wicket〜のページをクローラがインデックスしなくなる
  • robots.txt問題点
    • robots.txtはあくまで紳士協定→無視するクローラも存在する
    • 正確な記述方法が規定されていない→解釈が各社で異なる
    • 今回の書き方は多くのクローラでうまく解釈してくれている
  • 個人的には
public class WicketApplication extends WebApplication{
	@Override
	protected void init() {
		mount(new HybridUrlCodingStrategy("/login", LoginPage.class));
	}
}
3. jsessionid対策
  • Wicketアプリの初回アクセス時
  • 対策1 getClientInfoメソッド
    • Wicket-jaのメーリングリストで似たような質問があったとき、getClientInfoメソッドを使えばよいという回答
    • WebSessionを継承したクラスのコンストラクタなどで使うとよさそう
    • これを使うと利用者のブラウザの情報を取得するのに初回アクセス時にページの再読み込みが発生し、JSESSIONIDが消える
  • 対策1の問題点
    • デフォルトで表示されるBrowserInfoPageクラスがrefleshを使っているが、クローラは解釈できない
    • クローラがページにアクセスできない = GoogleやYahooにインデックスされない
  • 対策2 自前のLinkクラスを作る
public class MyLink extends BookmarkablePageLink{
	//コンストラクタも適当に書いてください
	@Override
	protected CharSequence getURL() {
		String url = super.getURL().toString()
			.replaceAll(";jsessionid=[^\\?]+", "");
		return url;
	}
}
    • Linkを使うときには常にこのクラスを使う
  • 対策2の問題点
    • CookieをサポートしていないDoCoMoのブラウザなどでログインできなくなる
終わりに
  • 今回話した内容が参考になれば幸いです。

今回の勉強会の感想

今回はメモを取っていないので大雑把な感想を。
80人の参加者の勉強会で参加率も高かったので部屋がいっぱいでした。
前回もLTをやりましたが、これだけ人数が多いと少し緊張しますねw自分の今回の話は反応がいまいちだったので次回話す機会があったら内容の路線を変更しようかと思っています。
第一回目はWicketの運用の話が多かったですが、今回はJavaScriptに関する話が多かったです。発表内でも触れられていましたが、クライアント側で動的に変化する需要が増えているようですので、その辺もカバーしているところがWicketが注目されている理由のひとつかもしれません。とはいえ指摘があったように、結局JavaでJSを薄くラッピングしているだけなのでちゃんとやろうと思ったらJavaScriptの知識が必要になるのですが。
id:NAGASEYASUHiTOさんのComponentInstantiationListenerを使う話が個人的には一番参考になりました。自分では使ったことがないのですが、いろいろとできることの幅が広がりそうです。
あとグリーパネェと書くのが礼儀らしいので書いておきますね。会場を貸していただいてありがとうございました。


懇親会の感想

かなり人数がいたので場所の確保や参加者の把握がすごく大変だったと思うのですが、id:Yamashiro0217さんの幹事力が光りましたね。
Wicketの話もいろいろできてよかったのですが、ORMの話やLuceneの話もできてよかったです。ORMにiBatisを使っている方が何人かいらっしゃったのですが、皆さん基本的なSQLは自動生成してらっしゃるそうで、自分だけじゃなくて安心しましたwこういう場でLuceneの話ができたのも初めてなので新鮮でした。
id:bose999さんにJBossをプッシュされたので、早速手元の開発で5.0.1.GAを試してみています(といっても今のところ普通にTomcatを使うのと違いない使い方ですが)。
途中で眠気が限界が来たので始発で帰ったのですが、二次会では濃い話が聞けて面白かったです。


【宣伝】Wicket本発売日決定

ページで告知されていますが、明日3月13日にid:t_yanoさんの書いたWicket本が発売されるようです。初のWicketを扱った和書ですので、これでもっと国内でWicketが盛り上がるとよいですね。

タイトルが告知されているものとAmazonのとで違いますがどっちが正しいんでしょうかね。
現在実家に帰っている最中なので本を読むのは当分先になりそうです。

Eclipse 3.4.2とm2eclipseでMavenを使ったJavaのライブラリ管理

Maven2のロゴ

先日、後輩向けにJavaの事始からWicketのあたりまでざっと話をしたのですが、その中で触れたm2eclipseのインストールと使い方についてまとめておきます。
今回の記事ではライブラリ管理についてのみ言及しています。
Eclipseのバージョンは3.4.2でWTPが最初から入っている「Eclipse IDE for Java EE Developers」を使っていますが、3.4.x系なら同じようにできると思います。Pleiadesを使って日本語化していますので、デフォルトの英語のままの方は適当に読み替えてください。
全体的にWebからダウンロードする作業が多いので結構時間がかかりますが、2回目以降はもっと早くなります。
まだ使い始めたばかりの拙い知識で書いているので、間違いやもっとよい方法がある場合はぜひぜひご指摘ください。

1. Mavenとは

MavenとはApache Software Foundationで開発されているJavaのソフトウェアプロジェクト管理ツールです。
Maven は Project Object Model (POM) という考え方に基づき、プロジェクトのビルド、テスト、ドキュメンテーション、成果物の配備など、プロジェクトのライフサイクル全体を管理します。プロジェクトのビルドツールである Ant とは異なり、Maven はプロジェクト管理ツールとして、プロジェクトに関する色々な情報を POM に集約し、POM の情報に基づきプロジェクト全体を管理します。

1. Maven とは | TECHSCORE(テックスコア)

最近のJavaの開発ではデファクトスタンダードになりつつあるようです。
私自身Mavenを使い始めたのは結構最近です。というのも、EclipseNetBeansのようなIDEを使っているとビルドやテストやパッケージ化などもサポートしてくれるためあまりMavenのよさがわからなかったことやpom.xmlを書くのが面倒くさかったりしたからです。しかし、ライブラリ管理やIDEを起動しなくてもビルドやテストを行うことができるなど多くのメリットがあることが実際に使ってみるとわかると思います。
ちなみにm2eclipseのデフォルトのローカルレポジトリは「C:\Documents and Settings\ユーザ名\.m2」になります。


2. m2eclipseのインストール

1. Eclipseを起動して、「ヘルプ」>「ソフトウェア更新」を選ぶ
2. 「使用可能なソフトウェア」タブを開く
3. 「サイトの追加」ボタンを押して、「http://m2eclipse.sonatype.org/update」を入力してOKを押す
4. 下記のようにインストールするものにチェックを入れた後に、「インストール」ボタンを押す

5. 後はウィザードに従って進めていくとインストール開始
6. インストール終了すると再起動を求めるダイアログが出てくるので、「はい」を選んで再起動する
これでm2eclipseのインストール作業は終了です。
再起動をすると以下の図のようにインデックスの更新が行われますが、ダウンロードを伴うので少し時間がかかります。インデックス更新の途中で中止したりして失敗するとこれから紹介するm2eclipseの機能が一部うまく動かないことがありますが、その場合はEclipseを再起動してインデックスの更新を再度行えばうまくいくかもしれません。


Mavenコンソールが表示されない場合、コンソールの右上の「コンソールを開く」を押して「Maven Console」を選択してください。

以下のような警告が出た場合、

eclipse.iniの一行目に

-vm
C:\Program Files\Java\jdk1.6.0_11\bin\javaw.exe

を追加してください。JVMの位置は自分の環境に合わせて変更してください。今回の紹介する内容ではこの作業は行わなくてもよいです。


ちなみにEclipseを起動するたびにインデックスの更新が行われます。初回よりも速くなりますが、インデックスの更新が行われるのがわずらわしい人は以下のように設定すると起動時に更新が行われなくなります。
1. 「ウィンドウ」>「設定」を選ぶ
2. 「Maven」を選択して、「始動時にレポジトリー・インデックス更新をダウンロード」のチェックを外して「OK」ボタンを押す
手動で更新を行う場合は、「設定」の「Maven」>「インストール」を開いて「ローカル・レポジトリー索引再作成」ボタンを押してください。


3. Mavenプロジェクトを作成

「ファイル」>「その他」を選択して、以下のように「Maven Project」のウィザードを開始してください。

今回はアーキタイプを使わずにプロジェクトを作成するので、一枚目のウィザードで「シンプルなプロジェクトの作成」にチェックを入れてください。
次のウィザードの必須部分である「グループ Id」に「test」、「アーティファクト Id」に「first-maven」と入力して「完了」ボタンを押すとプロジェクトが作成されます。
グループ Id(groupId)はプロジェクトを一意に識別する名前で、プロジェクトのルートパッケージ名を指定するのが一般的です。
アーティファクト Id(artifactId)はプロジェクトの成果物の名前です。JARやWARにつける名前を指定してください。
作られたフォルダ構成がMavenプロジェクトの一般的なフォルダ構成です。別のフォルダ構成でもMavenを使うことができるようですが、特別な理由がない限りはこの構成に従ったほうがよいです。

first-maven
├  pom.xml
├  target
└─src
    ├─main
    │  ├─java
    │  └─resource
    └─test
        ├─java
        └─resource
名前 役割
pom.xml プロジェクトの情報を持つファイル
target 成果物を置くフォルダ
src/main/java Javaソースコード
src/main/test Javaのテストコード

特に重要なのはpom.xmlで、テキストエディタで開いてみると以下のような情報が現在書いてあります。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>first-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
</project>

ここにプロジェクトの依存ライブラリやビルドの情報などを追記していくのがMavenプロジェクトの特徴です。


4. ライブラリの追加と削除

m2eclipseを使うとセントラルレポジトリに登録されているライブラリを簡単に追加することができます。
今回はCommons Langを追加してみます。
以下の図のようにプロジェクトの上で右クリックをして「Maven」>「依存関係の追加」を選択してください。

ダイアログの入力フォームに「commons-lang」と入力すると、インデックスの作成がうまくいっていれば、インクリメンタルにセントラルレポジトリに追加されているライブラリを検索できます。
ライブラリはデフォルトではもっとも最新のバージョンのものが選択されていますが、Commons Langは変わった名前のバージョンのものがひとつあるのでツリーを開いて以下のように2.4を選択してOKを押して下さい。

OKを押すとライブラリと依存ライブラリのダウンロードを開始します。ローカル・レポジトリーにすでにある場合は高速にライブラリの追加を行うことができます。
pom.xmlを開くと以下のようにdependencies要素が追加されていることがわかります。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>first-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  	<dependency>
  		<groupId>commons-lang</groupId>
  		<artifactId>commons-lang</artifactId>
  		<version>2.4</version>
  	</dependency>
  </dependencies>
</project>

Mavenではこのようにdependencies要素の中にdependency要素を追加していくことで依存ライブラリの管理を行います。
今回はフォームから検索して追加しましたが、pom.xmlに手動でdependency要素を追加しても依存ライブラリが自動的に追加されます。
依存ライブラリを削除する場合はpom.xmlテキストエディタで開いてそのdependency要素の部分を消して保存するとOKです。
実際に作業をしてもらうとわかると思うのですが、これだけ簡単にライブラリの管理ができるのは画期的です。PerlCPANなどとは異なり、新しいライブラリを追加してもその影響範囲はプロジェクトに限定されるのもいいところだと思います。


5. アーキタイプWicketの開発を始める

アーキタイプ(archetype)とは原型という意味で、Mavenではこれを使うことでフレームワークなどを利用したアプリケーションを作る際の最低限の構成を持ったプロジェクトを作成でき、開発の開始の時間的なコストを大幅に削減することができます。
「ファイル」>「新規」で「Maven Project」を選択してください。
「ファイル」>「その他」を選択して、以下のように「Maven Project」のウィザードを開始してください。
今回は一枚目のウィザードの「シンプルなプロジェクトの作成」にチェックを入れないでください
二枚目のウィザードで「カタログ」に「Nexus Indexer」を選択してフィルターに「wicket」と入力すると1つのアーキタイプに絞り込まれると思います。

「Show the last version of Archetype only」のチェックを外すと最新のライブラリのバージョン以外のアーキタイプを選択することができます。今回はバージョン1.3.5をのアーキタイプを選択して「次へ」を押してください。

最後のウィザードは「グループ Id」には「test.wicket」、「アーティファクト Id」には「first-wicket」、「パッケージ」には「test.wicket」を入力して「完了」ボタンを押してください。
これでWicketの最小限の設定とライブラリを持つプロジェクトが作成されました。
Javaコンパイラのバージョンが1.4になっている場合があるので、そのときはプロジェクトの上で右クリックして「プロパティ」を選択して、「Javaコンパイラー」のコンパイラ準拠レベルを変更してください。

m2eclipseでアーキタイプを使うことのデメリット

今回のwicket-quick-startの場合だとプロジェクト・ファセットの動的Webプロジェクトのバージョンが2.4で作られてしまいます。
Tomcatだと6以降のバージョンでないとこれに対応していないため、デプロイを行うことができません。開発環境によってはこの設定だと困るという人もいると思いますが、後から変更することもできないようです。コメントにて変更方法のご指摘がありました。

6. jettyをサーバとして起動

先ほど作成したwicket-quick-startのアーキタイプを利用したプロジェクトは動的ウェブプロジェクトとして作られているので、WTPで扱うことができます。Tomcatなどのサーバにプロジェクトを追加することができますが、Mavenでは自分でインストールする必要なしにJettyプラグインを用いることでサーバを利用することができますので、今回はこれを利用してみます。
メニューの「実行」>「実行の構成」を選択します。
左側の一覧の中から「Maven Build」の上でダブルクリックを押すと新規構成を追加することができます。

「名前」を「Jettyで実行」に変更してください。
次に「基底ディレクトリ」を、「ワークスペースの参照」で先ほどの「first-wicket」プロジェクトを選択してください。
「ゴール」を、「選択」を押して上部のフォームに「jetty」と入力してフィルタを実行してから「jetty - org.morbay.jetty:maven-jetty-plugin」の「run」を選択してください。

「実行」ボタンを押すと必要なプラグインのダウンロードが開始します。
ダウンロードが終了してJettyサーバが起動したら、ブラウザからhttp://localhost:8080/first-wicket/ にアクセスすると以下のようなWicketで生成されたページを見ることができます。


7. 結びに

今回はライブラリ管理についてしか触れていませんが、この点だけでもMavenを導入するメリットが十分あることがわかっていただけたのではないかと思いますのでぜひMavenを試してみてください。
ちなみにMaven2を扱った日本語の本では、2年前なので若干内容が古いかもしれませんが以下の本が入門書としてよいと思います。

Apache Maven 2.0入門 Java・オープンソース・ビルドツール
野瀬 直樹 横田 健彦
技術評論社
売り上げランキング: 48734


おまけ:セントラルレポジトリにないライブラリを追加する方法

ActiveObjectsの場合

ActiveObjectsはdev.java.netで公開されていますが、ここの場合ですとMavenの公開方式にしたがっているレポジトリのため以下のようにrepositories要素を追加することですることでライブラリを追加することができます。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>first-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <repositories>
      <repository>
        <id>maven2-repository.dev.java.net</id>
        <name>Java.net Repository for Maven</name>
        <url>http://download.java.net/maven/2/</url>
        <layout>default</layout>
      </repository>
  </repositories>
  <dependencies>
    <dependency>
      <groupId>net.java.dev.activeobjects</groupId>
      <artifactId>activeobjects</artifactId>
	  <version>0.8.2</version>
    </dependency>
  </dependencies>
</project>
Butterfly Persistenceの場合

Butterfly PersistenceはMaven形式のレポジトリを提供していません。こういうライブラリをMavenで扱う場合、ローカルレポジトリに手動でライブラリを追加することで対処します。
Mavenをインストールした状態で、Betterfly PersitenceのJARをダウンロードしてからコマンドプロンプトで以下のコマンドを実行してください。

mvn install:install-file -Dfile="C:/java/lib/jenkov-butterfly-persistence-5.0.0.jar(JARのパス)" -DgroupId=com.jenkov.butterfly -DartifactId=butterfly-persistence -Dversion=5.0.0 -Dpackaging=jar

ローカルレポジトリに登録した後は以下のようなdepencency要素をpom.xmlに追加すると依存ライブラリを追加できるようになります。

<dependency>
  <groupId>com.jenkov.butterfly</groupId>
  <artifactId>butterfly-persistence</artifactId>
  <version>5.0.0</version>
</dependency>

予測市場について知りたい人が読んでおくとよい本5冊

日本語で読める予測市場に関連がありそうな書籍をまとめました。
予測市場とは仮想市場を使って人々の意見を集約・抽出する仕組みのことです。
予測市場 - Wikipedia
予測市場に限らず集合知に関心のある方は読んでみると、集合知の成功事例やどのようにして群集が個人に勝るのかといったことがなんとなくわかるようになると思います。

リスクの正体!-賢いリスクとのつきあい方

リスクの正体!-賢いリスクとのつきあい方 (木星叢書)
山口浩
バジリコ
売り上げランキング: 12656


駒澤大学グローバル・メディア・スタディーズ学部准教授の山口浩氏が執筆した本で、今年の一月に発売されました。
自身のブログの「H-Yamaguchi.net」で書いた文章をベースにしているそうですが、体系づけられていろいろと書き足したり書き下ろしたりしたところも多いようなので、氏のブログを読んでいる人も読む価値はあると思います。

実際に予測市場について触れているのは、5章の「市場で予測する」の中でです。
予測市場について非常にわかりやすく説明されています。予測市場の特色、使うことのメリット、制約など予測市場のエッセンスがちゃんとまとまっていました。「予測市場って何だろう」という人にはぜひ最初に読んでもらいたい内容です。
いくつか事例も紹介しており、その中ではてなアイデア総選挙はてなについても触れられています。総選挙はてなの時に話題になった予測市場公職選挙法に違反しないのかについても解説されていました。

リスクと予測の話の流れで予測市場が取り上げられていますが、某政治家のリスクに関する無知な発言、ライブドア事件での投資会社の話、リアルオプションの考え方、教育の就業に対するリスクなどなど予測市場に限らず個人的にも興味を惹かれる話が盛りだくさんでした。
リスクについて新しい観点が得られる一読の価値がある本だと思います。


「みんなの意見」は案外正しい

「みんなの意見」は案外正しい
ジェームズ・スロウィッキー 小高 尚子
角川書店
売り上げランキング: 9930


翻訳前のタイトルは「Wisdom of Crowds(群集の英知)」で、集合知に興味のある人なら一度は読まれたのではないかと思います。
群集が賢くなるときと賢くなくなるときの事例を紹介しているのがこの本です。ただ、事例を取り上げているだけで、なぜ群集が個人に勝るのかについての理論的なアプローチは弱いです。
具体的に予測市場に触れているのは第1章ですが、11章の市場に関する内容も参考になります。
集合知について知るための最初の一歩に読むべき本です。


「多様な意見」はなぜ正しいのか 衆愚が集合知に変わるとき

「多様な意見」はなぜ正しいのか 衆愚が集合知に変わるとき
スコット・ペイジ
日経BP
売り上げランキング: 11386


今年の1月に邦訳されて出版された本です。
「みんなの意見は案外正しい」に対して、モデルを用いて理論的に多様性が個人に勝ることを説明しています。なので「みんなの意見は案外正しい」を読んだ後に一緒に読むのがよいと思います。
具体的に予測市場について触れられているのは13章ですが、8章の「多様性と予測」という章も参考になると思います。
500ページ近くあって、モデルを用いた説明が少し回りくどく感じることもありましたが、集合知が有効に働くための条件や多様性の重要性を知ることができます。


フューチャー・オブ・ワーク


これまでは情報の集中化が行われてきましたが、インターネットの発達により情報の伝達コストの低下したため、今後は分散化した新しいマネジメントが重要になっていく、ということを論じた本です。
予測市場について触れているのは第7章の「組織内のマーケット」で、企業内の予測市場の活用について紹介しています。
残念ながらAmazonではもう購入できないようですが、組織マネジメントに関わる人が読むと面白い本だと思います。


ウェブ進化論 本当の大変化はこれから始まる


id:umedamochioこと梅田望夫氏が2006年に書いた本です。当時のWeb2.0ブームが起こったときの中心にありました。
ベストセラーになりましたので、Webに関する仕事についてる人でなくとも読んだことがある人は多いかもしれません。
第五章のオーブンソースとマス・コラボレーションの中で予測市場について触れられています。Webという視点から、「個」が「全体」にもたらす価値の創出を論じているので面白いです。
まだ読んだことがない人は同著者の「ウェブ時代をゆく ─いかに働き、いかに学ぶか 」もあわせてぜひ読んでもらいたいです。



どの本でも予測市場集合知を活用するための一つの形として紹介されているだけですので、1冊丸ごと予測市場を扱った本が出たらいいなあと思います。そのためにはやはり日本での予測市場の注目を高めていかないとだめですね。
現在運用している予測市場サイトの「こうなる。」もブレイクするというには程遠いので、日本でもっと予測市場が認知されるように努力していきたいです。