Archive for the 'Java' Category

はてブやLDCのコメントにトラックバックを打てるサービスを公開しました。

ネット実名論争やらはてブのネガティブコメント論争やらが起こったり沈静化したりする今日この頃ですが皆さまいかがお過ごしでしょうか。

さて、めそらぼでは、表題の通り、はてブやlivedoor Clipのコメントにトラックバックを打てるサービス「ぶっこめ!」を公開しました。
これによって、反論を受けないところから安全に暴言を吐いてくるからソーシャルブックマークサービスなんて嫌いだ!という池田信夫先生のような方々も反論をすることができるようになります。精神衛生上よろしいのではないかと思いますので、是非使ってみてください。

例えば、拙作サービスのランチオフったーへのブックマークコメントのページは
http://server.mesolabs.com/bukkome/url/http://server.mesolabs.com/lunchofftter/
になります。
また、このエントリ自身が、執筆時点での最新コメントである
http://server.mesolabs.com/bukkome/url/http://server.mesolabs.com/lunchofftter/#1203802507000
へトラックバックを打っています。どのように表示されているかご確認いただけると思います。

なお、まだまだ全くブラシュアップ出来てない状態での公開ですので、不具合/バグ等は沢山あると思います。実装されてない機能等もございます。
どうか、生暖かく見守ってやってください。

さて、今回もJavaのみで作成しました。Web層のフレームワークはもちろんApache Wicketを使いました。
また、ソーシャルブックマークサービスとの連携のクライアントとして、またトラックバックを受け付ける処理の窓口としてRestletも使ってみました。
さらに、今回はデータベースとして、オブジェクトデータベースであるNeoDatis ODBを使ってみました。
その辺の技術的な話に関してはまた改めてエントリを書きたいと思います。

なお、このサービスによって生じたいかなる不具合や不利益に関して一切の責は負いかねます。自己責任でお使いください。
また、問答無用で予告なくサービスを終了させたり、データベースを初期化したりすることもございます。ご了承ください。
不具合や要望等ありましたら、このエントリへのコメントやTwitter@mesoへお願いします。

(追記:3/17 10:10 現在、上記ランチオフったーへのブックマークコメントのページはエラーが表示されています。原因究明中…)
(追記:3/17 10:50 とりあえずエラー原因のデータを削除して復活させました。)
(追記:3/17 11:20 トラックバックURLにブラウザでアクセスする(GETでアクセスする)と発生する不具合だと判明。修正しました。)

昨今のJava向けのオープンソースなオブジェクトデータベース

そういえば、前のエントリでオブジェクトデータベースについて書くと宣言してから、気づけば一ヶ月半以上経っていました。
そろそろ書いとかないと、イケメンタップダンサー兼プログラマのNAGASEYASUHiTOに怒られるので、書きます。
基本的にJava向けの実装があるものしか知らないし(PythonとかSchemeにもあるよね)、オブジェクトデータベースのプロでもなんでもないんで、間違いがあるかもしれません。
オブジェクトデータベースに関する情報を見つけたら、僕はlivedoor クリップにTag: ODBMSでクリップしてるので、オブジェクトデータベースに興味のある人はここを購読するといいかもしれません。

  • Java向けのオープンソースなオブジェクトデータベースにはどんなものがあるのか
  • 表を作ると

    名前 ライセンス 標準準拠とか 活発度 その他の言語
    db4o GPL/オープンソースプロジェクト用/商用 JDOとは繋がるらしいよ 活発っぽい .NETとか
    MyOODB GPL/LGPL 標準なんて関係ねえ 1人なのにめっちゃ活発。2008/02/08に最新リリース。 Jython/JavaScript/C++(予定)
    EyeDB LGPL ODMG 3 2006/10/06以降リリースなし なし
    ozone GPL/LGPL ODMG 3 2005/11/26以降リリースなし なし
    Perst GPL/商用 ODMG 3 2006/10/06以降リリースなし C#
    Orient ODBMS Apache 2.0 ODMG 3/JDO 1.0 製作者がJDOのExpertGroupのメンバだったりするんだけど、その人がRomaってフレームワークに注力してて、結果2004/08/06以降リリースなし C++
    JDOInstruments LGPL JDO 2006/12/08以降リリースなし なし
    NeoDatis ODB LGPL 標準なんて無視 活発。2008/02/12に最新リリース。 .NET(予定)
    Ener-J GPL ODMG 3/JDO 2.0 まだリリースなし。最終コミットが2007/07/25 なし
  • どれがイケてる?
  • 表見てのとおりなんだけど、まずライセンス的に厳しいのが多い。
    恐らく一番名前が売れていて、実績があって、機能も豊富で、性能もよくて、扱いやすいのがdb4oなんだけど、db4oは商用で使うには金が掛かる。
    オープンソースプロジェクト向けの新しいライセンスとか作ってるけど、あんまり意味ないっぽい。
    ScalaによるWebアプリケーションフレームワークであるLiftが、MLでdb4oをそのライセンスで組み込もうかとか相談してたけど、なんか色々制約あるっぽいってことでやめてたな。
    MySQLみたいなリレーショナルデータベースは、GPLであっても直接そのAPIを叩くわけじゃないから商用でも使えるという解釈っぽいけど、オブジェクトデータベースは直接そのデータベースのAPIを叩くので、使う方もGPLにしなきゃいけないらしい。
    というわけで、上表でGPLのやつは軒並みアウト。GPL/LGPLなものは、ソースコードに手を入れた場合はGPL適用だけど使うだけならLGPL適用だから商用もいいよって感じ。

    次に、開発の活発さがまた問題。
    オブジェクトデータベース自体が長いこと冬の時代を送っていたこともあってか、活発だといえるのはdb4o, MyOODB, NeoDatis ODBぐらい。

    最後に、標準準拠について。
    ODMG 3とか、誰も知らないよね。ってかむしろ準拠してると設定ファイルとか必要になったりでめんどいだけ。
    JDO準拠はいいかもしれんけど、最高のJDO実装であるJPOXでさえ最近JPAにも準拠しちゃったぐらいだし、JDOであることのメリットってもうないかも。ってか、JPOXすごいな。
    まあ、そういうわけで標準準拠とか気にしなくてよし。

    となるとね、残るのってMyOODBとNeoDatis ODBだけなのよ。
    というわけでこの両者について紹介します。

  • MyOODBの特徴
  • このオブジェクトデータベースは、すごい。
    何がすごいって、開発者が一人だけなのにカバーしてる機能が多く、言語も多いこと。
    上表にもあるとおり、JavaだけじゃなくてJythonやJavaScriptからもオブジェクトデータベースを扱える。
    JavaScriptから直接だよ?もちろんAjaxみたいに非同期にもクエリできる。
    さらにそのうちC++から扱えるようになる予定。
    機能も半端ない。
    オブジェクトデータベースにしては珍しく組み込みモードがなくてクライアント/サーバモードだけなんだけど、その通信もHTTPだけじゃなくてHTTPSはもちろんTCP/TCPSプロトコルでもいける(って書いてあるけどレイヤーが違うような)。
    MyOODBが管理するオブジェクトはサーバにしか存在せず、クライアントが操作するのはその参照(Proxy)にすぎないため、複数同時のネストしたトランザクションなんてのも扱える。
    DBの自己回復機能や汚染分離機能などもある。
    自称だけど最速のオブジェクトデータベースらしい。検証データはない。
    もちろん欠点もある。
    まず、ドキュメントがまったくない。「ドキュメント?サンプル嫁」が基本スタンス。
    さらに、少なくとも僕の環境ではそのサンプルもそのままじゃ動かせず、バッチファイルにクラスパスを追加してやる必要とかがあった。
    さらに、使うにしても、まずモデルをJavaクラスとして定義し、そのクラスを引数にJythonスクリプトを実行して、MyOODB用のクラス(Proxyクラスとか)を2つ作ってやる必要がある。
    あ、Javaのときの話ね。JythonとかJavaScriptから使うときにどうするかは知らない。
    まとめると、玄人好みの渋い奴って感じ。

  • NeoDatis ODBの特徴
  • こちらは、実はしばらく開発中断してたんだけど、2007年後半ぐらいから活発に活動再開したんだよね。
    MyOODBとは違いこちらは会社が中心となって開発してる模様。
    現在はJavaだけだけどそのうちC#.NETからも扱えるようになる予定。
    NeoDatis ODBのいいとこは、とにかく扱いやすいこと。
    格納するオブジェクトは特に何かのインタフェースを実装する必要も何かのクラスを継承する必要もないただのPOJOでいい。
    さらにドキュメントもPDFで丁寧なのがついてくる。英語だけど読みやすいよ。
    jarファイル一個入れるだけってのもお手軽でいい。
    さらに、データベースブラウザツールまでついてくる。ただし日本語だとところどころ文字化けするけど。
    パフォーマンスもそこそこみたい。
    検証データもあって、オブジェクト数が多すぎないうちはdb4oとパフォーマンスがほとんど変わらない。
    オブジェクト数が多くなったときのパフォーマンスの低下の仕方がちょっと気になるけど。
    クエリに関しても、db4oで言うとこのNativeQueryって奴が使える。
    どういうことかというと今流行の流れるようなインタフェースみたいな感じ。

    odb = ODBFactory.open(ODB_NAME);
    IQuery query = new SimpleNativeQuery() {
        public boolean match(Player player) {
            return player
                        .getFavoriteSport()
                        .getName()
                        .toLowerCase()
                        .startsWith("volley");
        }
    };
    Objects players = odb.getObjects(query);
    

    いわゆる流れるようなインタフェースによるクエリだと、どうしてもフィールド名を文字列で書く必要があるみたいだけど、こちらは、そのままそのクラスのgetterメソッドを呼べばいい。
    これがオブジェクトデータベースのいいとこだよね(ただしこういうクエリが出来るのはdb4oとNeoDatis ODB以外知らない)。
    こちらは、MyOODBとは違い、組み込みモードも対応してる。また、HTTPによるクライアント/サーバも対応。
    ただし、ネストしたトランザクションとかそういうことは出来ない。
    Index張ったりとかもできるけど試しにやってみたことがある程度なので効果がどれぐらいかはしらない。
    あーちなみに、MyOODBもNeoDatis ODBも両方ともDBの中身をXML形式でimport/exportすることができる。
    まとめると、初心者でも安心の可愛い奴って感じ。

  • というわけで
  • 是非、オブジェクトデータベースも試してやってくださいな。
    試すなら、NeoDatis ODBとMyOODBがお勧め。
    とくにJavaScriptからMyOODB使うのを試すなんてかっこいいよね。Jythonから使うの試すとか猛者だよね。
    まあ、そこまでしなくても、NeoDatis ODBなら手軽に試せるから是非どうぞ。

Java-jaのMaven2の勉強会みたいなもの

に参加してきました。19日のことだから、もう、ちょっと前のことになるけど。

Maven2は、自分がプロジェクト仕切るなら間違いなく導入するんだけど、今はそういう立場にないから業務では使えず個人でいじって遊んでる段階。Maven2もそうだけど、WicketとかSeamとか、Ruby on Railsとかも含めた新しい技術の社内勉強会とかもやっていかないとなー。

んでまあ、19日の話。詳しくは矢野さんのBlogエントリ見ていただくとして、今回は結構勉強になったなー。
Maven2のプラグインを自作するのって、敷居高いのかなーって思ってたけど、tfunatoさんのプレゼン見たら全然簡単っぽいって思った。Twitterに発言ってのはあれだけど、IRCとかにビルド完了報告をしてくれるプラグインとかは普通に有用だよなー。
あと、cactusmanさんのプレゼンのHudsonもCIツールとしてはいい感じだなー。初期導入の敷居が低いってのはやっぱりかなりの利点。Maven2のログがCometでブラウザ上にずらずら流れていくのとかインパクトあったなー。NetBeansの開発とかでも使われてるから実績も十分だし、これも導入してみたいなー。

いつものことながら、会場をお貸ししてくださったATL Systems様には心より御礼申し上げます。

その後、飲み会への移動の途中にやっと会えた矢野さんと挨拶できましたー。飲み会の席でも色んな人と色んな話が出来て楽しかった。
来年も積極的に参加させていただきたいと思います。

そういえば、飲み会の席でNAGASEYASUHiTOさんに言われたんでそのうちオープンソースのオブジェクトデータベースについてエントリ書きます(←自分へのプレッシャー)。

WicketとGuiceとActiveObjectsで作ったTwitterを使ったMashUpアプリを公開するよ

Twitterをコミュニケーションインフラとして使うMashUpを、Wicket-Guice-ActiveObjectsで作りました。

ランチオフったー
http://server.mesolabs.com/lunchofftter/

プロトタイプとして作った上、使ってるライブラリも安定版じゃなくテストも不十分なので、まったく安定してないと思いますが、ぜひ使ってみてくださいな。

Twitterをコミュニケーションインフラとして使うことで、こちらとしては個人情報を預かるというリスクを避けることができ、ユーザも個人情報を預けるというリスクを避けることができます。
また、結果をオープンに知らせることで、さらにランチオフの輪を広げることができるんじゃないかなとも思ってTwitterを使うことに決めました。

ソースコードはオープンにする予定ですが、ちょっと人様に見せられるように修正するまでお待ちください。

感想・意見・疑問・苦情・要望・非難等は、このブログかTwitterにお願いします。

Wicket in Action予約開始!

Wicket in ActionがAmazonで予約開始です。Java-jaのWicket勉強会らしきものに参加した人はみんな買う方向で!

ついでに、マスタリングJavaEE5 (CD-ROM付) (Programmer’sSELECTION)とかも見つけちゃったので買ってみた。

java-jaのWicket勉強会みたいなもの

第一回チキチキ そろそろ Wicket について一言いっとくか」に参加してきました。

実はこういう勉強会とかイベントとかに参加するのって初めて。

人数が多い上に面子がまた凄くて圧倒されました。

詳細はyone098さんのエントリとかeveresさんのエントリとかIsoparametricさんのエントリとかnekopさんのエントリとかrokujyouhitomaさんのエントリとか見てください。

残念だったのは矢野さん急なトラブルで参加できなかったことと、Yoshioriさんよういちろうさんとあまり絡めなかったことかなー。
サイボウズラボやGoogleより敷居が高くて絶望しちゃう会社Abbyの名刺欲しかった。

っていうか、今回の勉強会に参加する決め手になったのは、よういちろうさんがこのエントリで周知をされて、それを僕がブックマークしてコメントで「仕事あるから無理かもなー。飲み会だけでもいいなら」って書いたら、そのコメント見てくださってエントリに追記してくださったことなんです。
さらにonkさんにも「いつもブックマークが被るから絶対一度会ってみたかったんだ」と言われ、ブログ自体はそんなに更新頻度も高くないし知名度もないのに、ブックマークだけで認知される時代になったんだなーってのがちょっと感慨深かった。

またこういったイベントあったら積極的に参加してみたいなって思いました。

おわり。

Wicket-Guiceに合うORMは?

Wicket-Guiceが出来ましたね。

まあ、詳しくは矢野さんの記事読んでください。

ここのまとめでも書かれているように、GuiceはWicketのようにJavaの利点を最大限に活用したDIコンテナなので、Wicketとの相性はとてもいいはずです。

ってことで、標準ガチガチ準拠のWebアプリを作成しなければいけない場合以外は、もう、Wicket-Guiceで僕の中では確定です。
言語がJavaである場合は、ですが(笑)

で、こうなると、パーシステンス層をどうしましょ?ってことになりますよね。

S2Wicket-Seasar2ならばS2Daoで確定でいいし、Wicket-SpringならSpringとの連携がしやすいもの(例えばHibernate)でいいでしょうし、Wicket-javaeeならJPA準拠のORMならなんでもいいでしょう。

しかし、せっかくWicketとGuiceというXMLがまったく要らない構成できたんだから、パーシステンス層もXMLなしのものにしたくないですか?

というわけでいくつか選択肢を。

これらは、全てXMLによる設定ファイルが必要ありません。
っていうか、BeanKeeper、pBeansに至ってはDB設計すら必要ありませんし、NeoDatis ODBはRDBではなくOODB(オブジェクトデータベース)なので、DB設計という概念すらありません。

4つともに言えることが、使い方がとても簡単であること。

ただし、簡単であるが故に犠牲にしている部分もあって、BeanKeeperとかpBeansは自動で生成されたテーブルにこちらが意図しないORMが内部的に使うカラムが作成されちゃって見苦しいし、恐らくパフォーマンス的にも他のORMに比べて見劣りするのではないかと想像します(パフォーマンスを売り文句にしてないので)。
NeoDatis ODBは培ってきたRDBの知識が活かせません。ってか導入するよう上司(or顧客)を説得できるとは思えません・・・。

そこでMr.Persisterですよ。
こいつは知名度はいまいちですが、更新系でHibernateよりも圧倒的に優れたパフォーマンスをはじき出しています。DB設計をしなくてはいけないというのは、逆に言うとテーブルやカラムの構成を自分の思うとおりにできるということだし、なんといっても検索系をチューニングしたいときに、素のSQLが使えます。HibernateのHQLに腹を立てる毎日とはもうおさらばです。

というわけで僕的には、Mr.Persisterが一押しです。
現在、次の安定版である4.0.0の前の最後のβ版である3.9.9が出てる状態です。

WicketもApache Incubatorを卒業することが決定したのでWicket1.3が出るのももうすぐでしょう。

というわけで、Mr.Persister4.0.0とWicket1.3が出たら、Wicket-Guice-Mr.PersisterというXMLを(web.xml以外)一切使わない構成でまた何か作ってみようと思います。

wicket-contrib-javaee

前回のエントリでご紹介したWicketとJavaEEを統合するためのライブラリ、wicket-contrib-javaeeを使ってみました。
このライブラリ、Wicket2.0からはwicket-springのようにWicketStuffから卒業しWicketプロジェクトに昇格するようです。

さて、環境としてはNetBeans 5.5およびEnterprise Pack 5.5にバンドルされてるSun Java System Application Server Platform Edition 9.0UR1を使い、データベースはPostgreSQL 8.2を使いました。

まず、wicket-contrib-javaeeでWicketとJavaEEを統合する際には、EntityManagerFactoryをDIする方法とセッションBeanをDIする方法があります。
EntityManagerFactoryをDIするには@PersistenceUnitを、セッションBeanをDIする際には@EJBを使います。

1.@PersistenceUnit
 この場合、NetBeansのプロジェクトとしてはWebアプリケーションプロジェクトを作成します。
 手順としては、DBテーブル作成→データベースからエンティティクラス自動生成→Web層の作成なのですが、ポイントがいくつかあります。

  • PostgreSQLのJDBCドライバをSun Java System Application Serverのlibディレクトリに入れる。
  • wicket-springのwicket-spring.jarが必要。
  • PostgreSQLを使う場合、Sun Java System Application Server Platform Edition 9.0UR1に同封されているTopLinkライブラリにはバグがあるので、GlassFishV2系のTopLinkライブラリをコピーして上書きする。
  • テーブル作成時に、PostgreSQLの場合主キーをSERIALにする。そうするとシーケンスが一つ作成されるので、そのシーケンス名(users_id_seqとする)を、自動生成されたエンティティクラスの@Idがついてるとこに、@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=”users_id_seq”)を指定する。
  • 持続性ユニットの編集(persistence.xml)で、含めるエンティティークラスに自動生成されたクラスを加える。
  • Pageクラス内で、HeaderContributor.forCss()を使ってCSSを指定しても反映されることとされないことがある(原因不明)。

2.@EJB
 この場合、NetBeansのプロジェクトとしてはエンタープライズアプリケーションプロジェクトを作成します。
 ポイントは@PersistenceUnitのときとほぼ同じなのですが、作成するセッションBeanについて

  • Localじゃないとだめ?
  • Localインタフェースはインナークラスじゃだめ?

 という制約があるかもしれません。

あとは、HPのサイプルを見れば出来るでしょう。

一応、前回同様作成したNetBeansプロジェクトをDLできるようにしております。
WicketEJB.zip(4.22MB)
WicketEJB2.zip(4.18MB)

DLして展開し、NetBeansでプロジェクトとして開き、WicketEJBというライブラリを
 Wicket-1.2.4.jar
 wicket-extensions-1.2.4.jar
 wicket-contrib-javaee-1.0.jar
 wicket-spring-1.2.4.jar
 commons-logging-1.0.4.jar
 cglib-nodep-1.2_3.jar
を含めて作ればOKです。

前回同様Public Domainなのでご自由にどうぞ。

WicketとSeasar 2とEJB 3.0

矢野さんと同じく、トラバいただいて知りました。
Wicketを始めるときに、大変お世話になったBlog「天使やカイザーと呼ばれて」のよういちろうさんが、WicketとSeasar 2を統合するライブラリを作成し、公開されています。

このエントリを見て、僕の選択肢を広げるために作ってくださったようなので(勘違い)、ぜひ試してみようと思います。

これで、WicketはSpring、Seasar 2の日本におけるメジャーな2大DIコンテナとの統合手段を手に入れることができましたね。
矢野さんがおっしゃってるように、非常にシンプルで扱いやすいDIコンテナであるPicoContainerとの統合もできれば、さらにWicketらしい気持ちのよい開発ができるとは思いますが、まあとりあえずこれで十分かな?

あ、いや、忘れてた。標準であるEJB 3.0との統合も欲しいよな。

って思ったら、なんと出来てました。
Wicketユーザー必読のBlogである「A Wicket Diary」で紹介されています

EJB 3.0と統合できるってことは、NetBeans5.5でかなりハッピーなことになるので、こちらも試してみマース。

WicketとSpringとJPAを使ったAjaxなCRUDサンプルのソースとか

を、公開します。

ソースとかっていうか、EclipseのプロジェクトをそのままZipしただけなんで、
展開すればそのままEclipseにImportできます。
ただし、WTP使ってるんで、WTPプラグインは入れてるEclipseがいいでしょう。
APサーバは、僕はJettyを使いましたが、別に他のAPサーバでも大丈夫(なはず)です。
Jettyを使う方はWTPのJettyプラグインを入れ、それ以外のAPサーバを使う方は各自ご自由に設定ください。

また、現状では、PostgreSQL8.xを使うようになってます。
おそらく他のRDBでも大丈夫ですが、その場合は適宜JDBCドライバライブラリを入れてください。
misc/sql/createTable.sqlを流してもらうと、今回使うテーブルを作成します。

ソースの解説とかは、JavaDoc見れば分かるレベルだと思うので特にするつもりもないです。
不明点とかあれば、コメントくださいませ。

あー、あと配布物の中の僕自身のオリジナルのコード等はPublic Domainってことにします。
つまり、著作権は主張しませんのでお好きいじって使ってください。

ダウンロードはこちらから(9.0Mぐらい)。

#ってか、下で公開してたサンプルに、「ひがやすお」というエントリがあったんだけど、
#ご本人なのだろうか・・・。

次のページ »