Hatena::ブログ(Diary)

public static void main

誰かが困って検索したときに助けになる話題を書いていければと思っています。

2009-07-22

[][]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ライセンスのOSS + Luceneも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におけるジオコーダの実装の紹介(ヤフー西岡さん)
  • Solrのではなくジオコーダについて
  • 前処理
    • 同義語クエリーの書き換え
    • 表記ゆれ
      • 住所・地名の揺らぎ、異体字など
    • バーストワード対応
      • ある場所に関係する流行のキーワードで検索して対応する場所を出す対応
      • 例:ガンダムなど
    • ローマ字問題(sibuya→渋谷)
  • 形態素解析 OR N-gramの利用→0マッチを避ける
  • ソート
    • CTRを優先
    • タイトルより業種に一致を優先
    • 完全一致>形態素>N-gram
  • Yahooでは独自形態素解析を利用

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


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

PIAXno titleを初めて知ったのですが、使うとなかなか面白そうなものが作れそうです。時間があるときに是非試してみたいと思いました。

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:名前をメモってませんでした・・・。

2009-05-17

[][]集合知イン・アクション

本書は2008年10月に発売された「Collective Intelligence in Action」の邦訳されたものです。

集合知とはどういうものなのかから始まり、Javaを用いて実際に集合知を扱うアプリケーションの作り方まで広い内容が書いてあります。

データマイニングのような話題ばかりではなく、既存のブログ検索から情報を取得してきたり、検索の仕組みの作り方やタグクラウドの実現方法、クローリングについてなど集合知の収集方法についても言及がなされています。


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

集合知を扱った本としては「集合知プログラミング」が有名だと思います。

集合知プログラミングは各手法について解説と実際にコーディングを行うことでその動きを知ることで理解を進めていくという形になっていました。

集合知イン・アクションは、実際に使うことを意識してスキーマやクラスの設計から考えている点と、簡単な解説はありますが自分でアルゴリズムを実装しているところもありますがどちらかといえばLuceneやWekaのようなライブラリを用いることが多い点が大きな違いではないかと思いました。また、全般的に検索に関する話が多かったというのも違いといえます。

PythonとJavaという言語の違いもあるのかもしれませんが、集合知プログラミングのほうはPythonを知らなくても結構読めたのですが、こちらはJavaを知らないとソースコード部分に関しては厳しいかもしれません。


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

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


日本語の扱いについて

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


個人的に興味深かった点

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

3.4で触れられているのですが、タグ付けのアーキテクチャとして3つ紹介されています。

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

クローリング

インテリジェントなクローラについて6章に載っています。

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


全体的な感想

500ページ近くある非常に厚い本ですので、全部読むというよりは自分の興味のあるところだけを拾い読みする形で読んでいます。

スケーラビリティについて言及してあったりちょっとしたテクニックが載っていたりと、あまり興味がない部分でも個々の詳細を見ていると参考になるところが見つかります。

Javaをやっていない人だとコード部分を読むのはきついと思いますが、アーキテクチャの話などは参考になるのではないかと思いました。

2009-04-09

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

最近、高橋メソッドを使ったプレゼンをする機会があったのですが、そのときにその発表をいたく気に入ってくれた方がいました。

その人いわく、「2chニコニコ動画みたいで見ててワクワク感があった。」とのことでした。おそらく2chというのは2chまとめサイトのことだと思います。

その言葉を聞くまでそんな風に考えたことはなかったのですが、考えてみると結構腑に落ちます。

高橋メソッドの特徴をあげると、

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

などがあげられますが、2chまとめやニコニコ動画と結構重なっているところがあります。

こういう表現をすると視聴者としては集中してみることができるし、メリハリがあって面白いのかもしれません。

去年、いろいろな意味で話題になった「あたし彼女」も簡潔な表現の繰り返しですが、高橋メソッド風に見てみると結構楽しんで見ることができました。


他に類似のものがないかと思いましたが、短文といえばTwitterのようなミニブログがあります。その周辺サービスのふぁぼったーTwitter名言がこの特徴に近い気がします。どちらも見ていて非常に飽きずに見ることができます*1

まあそんなわけで、テキストを使うようなUIを考えるときにこういう特徴を取り入れていくとワクワク感のあるものに仕上がるかもしれないですね。

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

2009-03-22

[][]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が入っているときに発生するエラーで、どのTomcatのWindowsサービスの名前も「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'?>

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


参考

2009-03-12

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

第二回Wicket勉強会で発表してきました。

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

以下発表内容と感想と宣伝です。

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

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

f:id:Kishi:20090312151124j:image

  • Wicketでの開発で頻繁に遭遇するPage Expired
    • サーバ上からPageのインスタンスが消えてしまった後にアクセスすると発生
    • デフォルトではWicketの標準のPageExpiredErrorPageが表示される
  • 自前でExpredPageクラスを作る
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
  • Wicketがステートフルであることの弊害
  • robots.txtを置く
    • クローラにアクセスしてほしくないページを定義するもの
    • ドメイン直下に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のとで違いますがどっちが正しいんでしょうかね。

現在実家に帰っている最中なので本を読むのは当分先になりそうです。

2009-02-28

Maven2のロゴ

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

先日、後輩向けに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を使い始めたのは結構最近です。というのも、EclipseやNetBeansのようなIDEを使っているとビルドやテストやパッケージ化などもサポートしてくれるためあまりMavenのよさがわからなかったことやpom.xmlを書くのが面倒くさかったりしたからです。しかし、ライブラリ管理やIDEを起動しなくてもビルドやテストを行うことができるなど多くのメリットがあることが実際に使ってみるとわかると思います。

ちなみにm2eclipseのデフォルトのローカルレポジトリは「C:\Documents and Settings\ユーザ名\.m2」になります。



2. m2eclipseのインストール

1. Eclipseを起動して、「ヘルプ」>「ソフトウェア更新」を選ぶ

2. 「使用可能なソフトウェア」タブを開く

3. 「サイトの追加」ボタンを押して、「http://m2eclipse.sonatype.org/update」を入力してOKを押す

4. 下記のようにインストールするものにチェックを入れた後に、「インストール」ボタンを押す

f:id:Kishi:20090228154917j:image

5. 後はウィザードに従って進めていくとインストール開始

6. インストール終了すると再起動を求めるダイアログが出てくるので、「はい」を選んで再起動する

これでm2eclipseのインストール作業は終了です。

再起動をすると以下の図のようにインデックスの更新が行われますが、ダウンロードを伴うので少し時間がかかります。インデックス更新の途中で中止したりして失敗するとこれから紹介するm2eclipseの機能が一部うまく動かないことがありますが、その場合はEclipseを再起動してインデックスの更新を再度行えばうまくいくかもしれません。

f:id:Kishi:20090228160252j:image


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

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

f:id:Kishi:20090228161341j:image

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」のウィザードを開始してください。

f:id:Kishi:20090228163107j:image

今回はアーキタイプを使わずにプロジェクトを作成するので、一枚目のウィザードで「シンプルなプロジェクトの作成」にチェックを入れてください。

次のウィザードの必須部分である「グループ 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/javaJavaのソースコード
src/main/testJavaのテストコード

特に重要なのは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」>「依存関係の追加」を選択してください。

f:id:Kishi:20090228170028j:image

ダイアログの入力フォームに「commons-lang」と入力すると、インデックスの作成がうまくいっていれば、インクリメンタルにセントラルレポジトリに追加されているライブラリを検索できます。

ライブラリはデフォルトではもっとも最新のバージョンのものが選択されていますが、Commons Langは変わった名前のバージョンのものがひとつあるのでツリーを開いて以下のように2.4を選択してOKを押して下さい。

f:id:Kishi:20090228170628j:image

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つのアーキタイプに絞り込まれると思います。

f:id:Kishi:20090228174928j:image

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

f:id:Kishi:20090228175210j:image

最後のウィザードは「グループ 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」の上でダブルクリックを押すと新規構成を追加することができます。

f:id:Kishi:20090228180728j:image

「名前」を「Jettyで実行」に変更してください。

次に「基底ディレクトリ」を、「ワークスペースの参照」で先ほどの「first-wicket」プロジェクトを選択してください。

「ゴール」を、「選択」を押して上部のフォームに「jetty」と入力してフィルタを実行してから「jetty - org.morbay.jetty:maven-jetty-plugin」の「run」を選択してください。

f:id:Kishi:20090228181158j:image

「実行」ボタンを押すと必要なプラグインのダウンロードが開始します。

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

f:id:Kishi:20090228181726j:image



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>

2009-02-19

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

日本語で読める予測市場に関連がありそうな書籍をまとめました。

予測市場とは仮想市場を使って人々の意見を集約・抽出する仕組みのことです。

予測市場 - Wikipedia

予測市場に限らず集合知に関心のある方は読んでみると、集合知の成功事例やどのようにして群集が個人に勝るのかといったことがなんとなくわかるようになると思います。


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

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


駒澤大学グローバル・メディア・スタディーズ学部准教授の山口浩氏が執筆した本で、今年の一月に発売されました。

自身のブログの「H-Yamaguchi.net」で書いた文章をベースにしているそうですが、体系づけられていろいろと書き足したり書き下ろしたりしたところも多いようなので、氏のブログを読んでいる人も読む価値はあると思います。

実際に予測市場について触れているのは、5章の「市場で予測する」の中でです。

予測市場について非常にわかりやすく説明されています。予測市場の特色、使うことのメリット、制約など予測市場のエッセンスがちゃんとまとまっていました。「予測市場って何だろう」という人にはぜひ最初に読んでもらいたい内容です。

いくつか事例も紹介しており、その中ではてなアイデア総選挙はてなについても触れられています。総選挙はてなの時に話題になった予測市場は公職選挙法に違反しないのかについても解説されていました。

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

リスクについて新しい観点が得られる一読の価値がある本だと思います。



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

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


翻訳前のタイトルは「Wisdom of Crowds(群集の英知)」で、集合知に興味のある人なら一度は読まれたのではないかと思います。

群集が賢くなるときと賢くなくなるときの事例を紹介しているのがこの本です。ただ、事例を取り上げているだけで、なぜ群集が個人に勝るのかについての理論的なアプローチは弱いです。

具体的に予測市場に触れているのは第1章ですが、11章の市場に関する内容も参考になります。

集合知について知るための最初の一歩に読むべき本です。



参考


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

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


今年の1月に邦訳されて出版された本です。

「みんなの意見は案外正しい」に対して、モデルを用いて理論的に多様性が個人に勝ることを説明しています。なので「みんなの意見は案外正しい」を読んだ後に一緒に読むのがよいと思います。

具体的に予測市場について触れられているのは13章ですが、8章の「多様性と予測」という章も参考になると思います。

500ページ近くあって、モデルを用いた説明が少し回りくどく感じることもありましたが、集合知が有効に働くための条件や多様性の重要性を知ることができます。



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

フューチャー・オブ・ワーク (Harvard business school press)
トマス・W. マローン
ランダムハウス講談社
売り上げランキング: 99298


これまでは情報の集中化が行われてきましたが、インターネットの発達により情報の伝達コストの低下したため、今後は分散化した新しいマネジメントが重要になっていく、ということを論じた本です。

予測市場について触れているのは第7章の「組織内のマーケット」で、企業内の予測市場の活用について紹介しています。

残念ながらAmazonではもう購入できないようですが、組織マネジメントに関わる人が読むと面白い本だと思います。



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

ウェブ進化論 本当の大変化はこれから始まる (ちくま新書)
梅田 望夫
筑摩書房
売り上げランキング: 1223


id:umedamochioこと梅田望夫氏が2006年に書いた本です。当時のWeb2.0ブームが起こったときの中心にありました。

ベストセラーになりましたので、Webに関する仕事についてる人でなくとも読んだことがある人は多いかもしれません。

第五章のオーブンソースとマス・コラボレーションの中で予測市場について触れられています。Webという視点から、「個」が「全体」にもたらす価値の創出を論じているので面白いです。

まだ読んだことがない人は同著者の「ウェブ時代をゆく ─いかに働き、いかに学ぶか 」もあわせてぜひ読んでもらいたいです。



どの本でも予測市場は集合知を活用するための一つの形として紹介されているだけですので、1冊丸ごと予測市場を扱った本が出たらいいなあと思います。そのためにはやはり日本での予測市場の注目を高めていかないとだめですね。

現在運用している予測市場サイトの「こうなる。」もブレイクするというには程遠いので、日本でもっと予測市場が認知されるように努力していきたいです。

2009-01-23

[]Amazon EC2/S3クラウド入門

Amazon EC2/S3クラウド入門
学びing
秀和システム
売り上げランキング: 862

去年ぐらいからクラウドと言うキーワードが注目されるようになって来ています。

この本は題名どおり、クラウドコンピューティングを紹介する記事でよく事例として紹介されるAmazon EC2/S3というサービスについて扱った本です。

学びing株式会社が「けんてーごっこ」というWebサービスの提供にEC2/S3を使った経験を元に書いた本ですので、導入に当たって検討したことや実際のサービスに導入してからの話も書かれており、抽象論から始まるいわゆる入門本とは違って具体的な話から入っているところが特徴だと思います。そのため、非常に読み始めやすいです。


内容

1章がEC2/S3の体験記、2章がEC2/S3の使い方について、3章が運用上の注意、4・5章ではクラウドとはどういったものかという解説と具体例の紹介、6章がクラウドを利用する上でのメリットの解説、7章がクラウドの今後という内容になっています。


どういう人向けの本か

この本では、2章ではEC2/S3の登録方法から使い方まで写真入りで解説してあるので、これから始めてみようと言う人は参考になると思います。EC2/S3の周辺ツールも紹介されているのもよいです。

クラウドって何なの?って人は4〜6章辺りを読めば大体把握できます。

この内容であれば1500円ならば結構お徳かもと思いました。



個人的に面白かった部分

特に面白かったのは、1章と3章です。

学びingではスタートアップで専用サーバ1台を使っていたそうなのですが、アクセスが増えるにつれて専用サーバの台数を増やしていき、検討した結果Amazon EC2/S3にサーバの引越しをすることを決めました。

どういう構成でサイトを運営しているのかという話から、専用サーバを借りたら初期コストと運用コストはいくらぐらいかかるのか、EC2/S3に移ってからはどのくらいのコストで回るようになったのかと言うことが具体的に数値でも書いてあったので自分自身での導入のイメージもしやすいのです。

本番環境と同じ構成のグローバルIPアドレスを持ったサーバをすぐに立ち上げができるということは開発において非常に助けになると思います。

1章もそうですが3章の運用の注意事項は少しEC2/S3を触った人では書けない話だと思うので、非常に参考になります。


Amazon EC2/S3を導入すべきか

EC2/S3には、サーバの物理的な位置の関係上転送速度が遅い、運用方法に癖がある、といったようなデメリットもいくつかありますが、それを補って余りあるメリットがあります。

この本の内容を元に、どういう人・会社がAmazon EC2/S3を導入したほうがよいのかを考えてみました。

EC2で1台を1月起動しっぱなしだと大体7000円ぐらい*1になるそうです。なので、単純に値段だけ見れば専用サーバに比べると安いといえます。

しかし、いわゆるレンタルサーバや専用サーバを使う場合と違い、Webから簡単にサーバ管理ができるツールなどは用意されていません。つまり、サーバをある程度運用する知識のある人がいなければEC2/S3を導入はできないと思います。運用知識がある人がおらず、ある程度のサポートが欲しい場合はレンタルサーバか専用サーバを洗濯するほうが良いと思います。

個人でちょっとしたWebアプリケーションを公開するぐらいの負荷であれば、さくらインターネットXREAのような格安のレンタルサーバで十分です。

個人やスタートアップの企業であればサーバを1台買って運用するほうが安く上がるように思われると思います。しかし、最初に買うコストも結構かかりますし、サーバを起動しっぱなしにすると電気代が結構馬鹿になりません。台数が増えてくるとネットワークの管理やサーバを置く場所をどうやって管理するのかと言う問題もあります。個人の場合だと部屋においておくと夏場は暑くて死ねます。こういった物理的な問題をクリアできる環境であればEC2/S3を導入する必要はないかもしれません。

急成長が見込まれるサービスや一時的にアクセスが増えることがわかっているときなどにはEC2は有効だと思います。物理的な導入には時間がかかりますし、そのサーバ台数が一時的に必要なだけであればあとからサーバが無駄になってしまいます。EC2の動的に台数を増減できることがこういう状況にマッチしています。

同様に、大学の研究室などで一時的に大量の計算機が必要になったときにも有効ではないかと思いました。


id:amachangがちょっと前のGoogle Adsenseの件で

ウェブはスピードが命だ、腰が重いことが命取りになることが多い。

即行動できることが、技術よりも重要なことが多い。

12 月までの自分だったら、広告を出すという選択肢を選ぶのに 1 日かかったかもしれない。

今の自分なら 10 分で広告を出せる

Google Adsense の件について - IT戦記

と言っていましたが、今回のEC2/S3についても同じことが言えるのではないかと思います。近いうちに自分で試してみようと思っています。

*1:今は円高なのでもっと安いかも

2009-01-14

[][]個人で運用するWebサービスの限界を考える

個人が作成したWebサービスの数はここ数年で爆発的に増えています。

サーバ自体の導入コストも低下してきており、レンタルサーバでもPHPのようなスクリプト言語が使えるものが珍しくなくなり、Ruby on Railsのような開発速度を向上させるフレームワークも登場してきて、今後も個人が運用するWebサービスは増加をしていくでしょう。


個人Webサービスの寿命

今回考えたいのは、そういった個人で運用するWebサービスの終了するときについてです。

Webサービスは作ってからが本当のスタートで、開発者は開発にかかったコスト以上に運用するために時間的・金銭的・精神的にコストを負担していくことになります。なので、自分の払うコストに見合わないと思ったらサービスの終了を考えるのは当然だと思います。

つまり作った人一人がやる気をなくしてしまえばどんなにいいサービスでも一瞬で消えてしまうということです。

最近上場したGREEですが、当初個人で運営していたときに「管理人さんが死んだらサービスはどうなるんですか?困ります!」的なコメントをユーザからいただいたと言う話を聞いたことがあります。極端な話になりますが、作った個人が事故や病気で亡くなったりしてしまってもそのサービスは終了してしまいます。

開発者である個人が自分のサービスへ関われなくなったそのときがWebサービスの寿命となっていしまうということ。これが個人で運用するWebサービスの限界なのではないかと考えます。


止めるのは作った人の自由?

個人で作ったものなのだから好きなときに止めてもよいではないかという意見もあると思います。

ちょっとした検索サイトやジェネレータやマッシュアップのようなサービスであれば人気があれば代替となる似たサービスはあると思いますので、それもありだと思います。そもそも、そういう系のサービスだとサーバさえ確保できればメンテナンスはほとんどいらない場合もありますのでただ放置しておくという選択肢もあるかもしれません。

ただ、CGM的な要素やコミュニティ要素を持ったサービスにおいては、それまでサービス内でユーザが作ったものやそのコミュニティは立派な財産だと思うので、作った人の一存で終了させてしまう前に、どうにか延命の方法を考えて欲しいと個人的には思います。

ひろゆきが2ちゃんねるを譲渡したって話も今回書いたようなことを考えて決定したのかもしれないなと思ったり。とはいえ、2ちゃんねるの場合は複数人が運用に関わっているのでどうとでもなりそうですが。

たくさんのユーザがいるサービスを止めてしまうと、ユーザはサービスを使えなくなると言う不利益をこうむりますし、開発者としてもこれまで成長させるのにかけたコストがもったいないと思います。


サービスを延命する

個人が運用を止めようと思ったときにサービスを延命するために選択可能な方法で、私がぱっと思いついたものは3つあります。

一つ目は、先ほど話したGREEのように起業すること。ビジネスとして成立しうるサービスまで成長させられるのであればこの選択肢もありだと思います。でもそこまで収益性の見込めるサービスは大量には生まれてこないし、起業することを面倒に思う人も少なくないでしょう。

二つ目は、カヤックでは作ったサービスの売却ページを作ったりしていますが、こんな感じでサービスの売却を考えるのも一つの手だと思います。数年前だとライブドアなどに買収されるのがサービス開発者としての一つのゴールのように思っていましたが、現在は個人が作ったものを買ってくれる企業はあまり見かけなくなった気がしますね。

三つ目は、誰かにサービスの管理を譲ること。熱心なユーザであればボランティアでもいいのでサービスを手伝いたいと思ってくれるかもしれません。

どの方法でも言えることは、一人でやることには限界があるので誰か他の人を巻き込もうとすることがサービスの寿命を伸ばすことにつながるということです。

OSSの隆盛により、ソースコードのレベルでは他の人とコストを分かち合うことが一般的になってきましたが、サービスのレベルで他の人とコストを分かち合うことが今後一般的に見られるのかどうかが気になるところです。

2008-12-16

[]MySQLMyISAM形式のテーブルで「Incorrect information in file: *.frm」エラーが出たときの修復方法

先日ファイルシステムを復旧した際に、MySQLのあるテーブルでSELECT文などを実行すると以下のようなエラーが出るようになりました。

ERROR 1033 (HY000): Incorrect information in file: *.frm

今回の対象のテーブル形式はMyISAMだったのですが、エラーメッセージでググって見てもInnoDBの場合の記事ばかりで参考にならなくて困りました。偶然MySQLリファレンスのテーブルの修復方法で該当しそうな項目を発見し、うまく修復をすることができました。

滅多にない話のようですが、エラーメッセージと修復方法を結びつける記事がないので、後々に誰かの参考になるかもしれないので記事にしておきます。

MySQLのバージョンは5.0です。


frmファイルとは何か?

MySQLは一つのデータベースを一つのディレクトリとして扱います。

テーブルを作成すると、データベースのディレクトリ以下にテーブル名 + MYD、MYI、frmという拡張子を持つ3つのテーブルを構成するファイルが生成されます。

MYDデータ本体
MYIインデックス
frmテーブルの構造

frmファイルの修復

frmがテーブルの構造を持つファイルだとわかったので、同じテーブル構造を持つfrmファイルで上書きしてやれば修復ができそうなことが推測できます。

バックアップがある場合は、そこのfrmファイルをコピーして修復したいfrmファイルに上書きすればOKです。

バックアップがない場合、以下のような手順で行います。

  1. 別のデータベースで同じ構造を持つテーブルのCREATE文を実行する
  2. MySQLサーバを停止する
  3. 別のデータベースのディレクトリ以下にあるfrmファイルを、直したいデータベースのディレクトリへ移動して上書きする*1

上記の手順を終えた後に、MySQLを起動して該当テーブルでSELECT文を実行するとエラーを出さずに実行できるはずです。frmのコピー元のテーブルはもう必要ないのでDROPしてください。

うまく動かないときは、frmファイルのパーミッションが適切でない場合があるので変更してみてください。

frmファイルを上書きするだけでうまくいくと思いますが、MYIファイルのコピーも必要な場合があるようです。その場合はREPAIR TABLEでインデックスを再生成してください。


参考

*1Windowsの場合は"C:\Program Files\MySQL\MySQL Server 5.0\data"以下、Linuxの場合は"/var/lib/mysql"以下にデータベースのディレクトリがあります