2011年8月21日

IntelliJ IDEA 10.5 CE + Scala Plugin on Mac OSX Lion

Javaの開発環境になんとなくIntelij IDEAを入れて使ってみているのだけど、ちょっと興味があってScala Plug in をインストールしてみました。
でもなぜか標準のライブラリが参照できない雰囲気のエラーが出ていて、ビルドしてもfacetまず指定しろみたいなことをいわれてなんのことかさっぱり。
一応解決したので手順を備忘のためにメモしておきます。

まずScalaがインストールされており、IntelliJ の Scala plugin がインストールされていることが前提です。

1. メニューから file > project structure を選択してダイアログを表示させます。
2. 一番左の一覧からModulesを選ぶと、右側にPlojectが表示されます。プロジェクトをScalaを使用するオプションを入れて作成されていればそこのツリーにScalaの項目があると思います。これをクリックするとScalaの設定が表示されます。ここでCompiler libraryをみると、赤くなっていますが、特に変更できません。
3. で、一番左の一覧からLibrarisを選んで、右ペインに先ほど表示されていたものと同じライブラリが表示されていると思うので、そのライブラリを一度削除してArrach Jar DirectoriesかなんかでインストールしたScalaのlibフォルダを指定してやります。
4. 再度Modulesの画面でLibrariesの画面で指定したライブラリを選び直してApplyをおせばおっけーになるはず。

とりあえずこれで使えるようになったっぽいです。なんでこんなことになってんだろう?ネットで検索したら同じ症状の人はいなかったっぽいので、多分特殊な事情なんでしょうが…

自分の生産性

最近のWebサービス系の開発をやっている人たちはものすごくサービスリリースのテンポが速いなあ、と思う。
震災のときも、地震発生から4時間後にはsinsai.infoがあがっていたそうだ。調べてみると、それはUshahidiというオープンソースのプロダクトをベースにして、震災支援向けにカスタマイズして公開したものらしいのだけど。それを別にしても翌日〜数日のレベルでいろいろなサービスが公開されたようだ。ツイッターでハッシュタグを使っていろいろ情報共有もされていたから、多分そうやって新たなサービスが公開されてもちゃんとそういうサービスがあることを共有できるんだろう。公開から実際の利用者が増えていくまでのスピードはすごく早かったのかなあ、と思う。

SI業界で10年過ごしてきた(しかもその大半は開発に携わっていた)けれども、正直同じようなことができるかといわれるとできる気がしない。なぜだろう?
まぁ、そもそもそんな短期間でものを作ってしまおうという試みすらしたことがない。個人的にはSIのご多分に漏れず主戦場はJavaなんだけど、Javaで何かしらのサービスを公開しようと思うとどうなるんだろう?
Javaってエンタープライズ領域では使われることは多いのだけど、サービスホスティングになると条件が悪いことが多かった。しかしそれも特にここ1、2年で状況は変わりつつあるような気がする。いまならJavaでもサービス公開の障壁は下がっていると思う。
実際に公開するにしても、開発環境から運用環境へのデプロイや何やはサポートしてくれるツールはいくらでもあるから、一度運用のための環境を構築してしまえば、漸進的な開発と公開も難しくない様に思える。そうすると、問題としては以下の二つにあると思う。
・構築、運用のトラブルシューティング
・開発のスピード
前者はSIで培われてきたものが多数あるはずなんだけど、正直自信がない。基本的には開発・設計が主で、リリース後は関わらないことが多かった(あっても、バグに対する調査・改修になる)からだ。パフォーマンスチューニングとかやれといわれてもボトルネックを調べるためのノウハウすらおぼつかない気がする。
後者については、結局のところJava vs LLみたいな部分の所のような気がするけれど、数日レベルで使い物になるWebアプリケーションを実装できるだろうか。JavaEE6とか、それに準ずる最近のフレームワークが手になじんでいれば相応の開発スピードを出せることが見込めるけれど、正直開発の各レイヤにおいてそれらを生かしきる自信がない。JavaEEの環境や各フレームワークの実現する「生産性の高さ」が、自分の中では点のようになっていて、それらの点と点とをうまく結びつけて、最高の生産性で開発を行える自信がない。それがあれば数日レベルのリリースが可能になるのだろうか?まぁできていない自分にはそれもわからない。
結局JavaEEなりフレームワークなりにしても、自分の必要な範囲でしか使ってこなかったし、顧客によって選びかえたりしているので、自分のプラットフォームになっていないのだろうな。

これからは何か一つ自分のプラットフォームにできるようにがんばってみよう。

2011年8月17日

ORMに関して考える事

最近急にJPAをいじりだして、どうにもうまく使えなくてORMの行く末をぼんやりと考えているのだけれども。
なんでそんなにもSQLを隠蔽しようとしたがるのだろうか?
もちろん、JPA環境でSQLが使えない訳ではない。訳ではないけど、下手すると結果がオブジェクト型の2次元配列で受け取らなければならない。これでいいのだろうか。あとSQLについてはJavaの世界で単なる文字列として扱うため堅牢な型システムのあるJavaにあってよけいな不安要素を多分に持ち込む要因であるし、IDEの支援をこれでもかというほど受けられるJava環境にあって結局はただの文字列でしかないSQLを業務ロジックに応じてくっつけたり切り離したりして、最終的に実行してみたらDBMS依存の記法の誤りとかであっさりHTTP 500みたいな、まぁ結構厄介なものではある。でもSQL自体がそれほど難しいかと言えばそうではないし、既存のテーブル設計ベースでマッピングするフレームワークでは結局テーブルの情報をそのままの形のBeanのような形にしかマッピングできない(・・・厳密には違うが、そこに確固たるプログラミングモデルが存在しているように見えない。そういう使い方にも対応できるようになっているよ、というか)。

結局ORMってなにをやりたいんだろう?極端な理想を言ってしまえば、メモリが無限で不揮発でかつ十分高速ならば、ストアする必要もORMなんかが発明される必要も無かったのだろうけど、実際にはメモリは高速だけど要領の制限が強くて揮発性だ。その辺をアプリケーションからなるべく意識せずロード/ストアで切るようにいろいろ頑張っているんだけど、そう考えると結局重要なのは全体のオブジェクトグラフのうち、とりあえずメモリの容量分しかメモリにはのせられ無い訳だから、全体のオブジェクトグラフから「ここだけ」という範囲を指定して持ってくる事になる。これはテーブル的にこのテーブルとこのテーブルと・・・という範囲のしぼり方が必要だし、この行からこの行までといった絞り方も必要だ。JPAはこれに対してレイトバインディングで挑む格好なんだけど、それをONにするかOFFにするかしかできない。アプリケーションの各ビジネスロジックが処理を行う際に、自分の必要な範囲のオブジェクトを条件にして引っ張れればいいのだが、これはビジネスロジック個別で異なるものなので、全体でONとかOFFとかで対応できるもんじゃないかな。その点に付いてJPAの設計者はどう考えているのだろうなあ。あとなんかちまちま特定のオブジェクト構造を作り上げていくだけのコードを結構書いている気がするのだけどこれはこれでいいのですかね。よくわからない。

2010年7月20日

Objective-Cのnil

諸事情あってiPhoneの開発に手を付けることになりました。四苦八苦しながらObjective-Cを触っているのですが、いかんせんいままでJavaばかりやっていたものでどうにも勝手が悪い。
基本的にCにインタプリタ的なオブジェクトシステムが付与されたランタイム環境で実行される雰囲気ですね。ガベージコレクタなんかも実装されているらしいのだけど、少なくともiPhone環境では使えないらしい。なのでオブジェクトの確保/解放なんかは基本的に自分で面倒をみてやる必要があるのですね。(ある程度補助してくれる機能もついてますが、まぁ根本的にわかってないと使えないので)

で、面白いのが表題にあるnilで基本いわゆるnullオブジェクトのことなのですが、JavaなどではNullオブジェクトにメッセージを送ろうとする(Java言語圏ではメソッドを呼び出す、といいますね)と、基本NullPointerExceptionでありプログラムでしっかりNullチェックをしておく必要がある訳です。ところがこのnilの場合は特に問題なくメッセージを受け付けてしまいます。戻り値のあるセレクタ(Java言語圏ではメソッドにあたる)の場合は結果としてnilを返します。で、プログラム自体は特にエラーになることもなく、何事もなかったように進行します。

メソッドの呼び出しをつなげてメソッドチェーン式でコードを記述するような場面ではJavaの場合途中Nullがかえらないように注意する必要があります。あるいは逐一Nullチェックが必要ですね。これがnilであれば途中でnilになっていても例外などにはならないので、メソッドチェーンの最後でnilになっていないか確認すればよい訳です。

ちょくちょくこの辺の記述で引っかかった経験があるので、これはよいなと思った反面、もちろんnilを想定していないところにnilが入ってきてもエラーになる訳でもなく、想定外の動作をしているのに気づけないといった面もあります。
これが多分、戻り値として結果を返すメソッドだったら結構すぐわかるんじゃないかな、と思うんですよね。作ってる途中に、どこか(画面やファイルなど)に出てくる値になる可能性が高いと思うので。最終的に出てきた値がnilになってて、処理のどこで nilにされたのか追いかける必要はあるかもしれませんが、そのくらいならたいした苦労じゃない気がします。問題は戻り値がないセレクタでしょうね。戻り値がないということは呼び出し側にはわからない状態変化を起こす可能性が高いと思うのですが、nilに対してメッセージを送っていた場合、その結果をどうにかして確認するか、事前にnilチェックを怠らないようにしなければならないということになります。

となると、基本戻り値なしのメソッドは使わない方がいいのかなーという気がします。

オブジェクト指向プログラミングの利点というのは基本的にオブジェクト同士のメッセージのやり取りという基本インフラと、カプセル化(情報へのアクセス権の管理)を行うことで、機能の責務の分断が明確に記述できる点であると思っているのですが、nilが存在することで関連するオブジェクトがその内部状態に配慮しなければならないようであるなら、オブジェクトシステムの利点を阻害しているような気もします。

2009年11月30日

GlassFishでEJB3

世の中的にはもうEJB3.1に注目しているとこなのでしょうね。
個人的には、実際の案件でEJBを使用したのはまだJavaEEなんてろくに知らない時期に右も左もわからないままベテランさんについて右へ習え状態でいくつか「書いたことがある」程度。それもEJB3よりまえの、なんだかよくわからないものを沢山書かなくてはならないやつでですね。EJB3になってDIやらAOPやらで一つのパラダイムシフトであったのだろうと思うのですが、その辺はあまり実務でも使うことがなくてここまで来てしまいました。
と言うわけで、まずはいくつか手習いをやって感覚をつかんでおきますか、とばかりに簡単にやってみました。

環境はNetbeans6.7.1で、Glassfish2.1でやっています。まずは有りがちな足し算のEJBを用意して、クライアントアプリケーションから呼び出してみる感じにしてみたのですけど、プロジェクトを新規作成して、いろいろウィザードに沿ってやっていけば大体ひな型はできてしまうし、その後もIDEがいろいろサポートをしてくれるので特に躓くところは有りませんでした。

その後、EJB Timerサービスを使うサンプルを書いてみたのですが、これがどうもうまくいきません。Glassfishの起動中のログにはTimerクラスが見つからないといった旨のエラーが出力されているのですが、正直そんなこと言われても…という感じで。
いろいろ調べていると、Timerに関連するクラスを自動生成する過程でExceptionが発生しているのではないかというような記事を見つけました。その過程でテーブルへの依存があり、データソースとして特定のテーブルにアクセスできる必要があるようなのですが、そのあたりを手動でこなして行ったら起動に成功したというような内容でした。変な話です。めんどくさいなーと思いながら管理コンソールを眺めていたら、EJB TimerServiceの設定項目の中にデータソースの設定があることに気づきました。デフォルトでは空になっています。一方でJDBIデータソースを調べるとTimerServiceと名のつくデータソースがあります。これでいいのかさっぱりわかりませんが、このJNDI名をEJB TimerServiceの設定欄に書いてやるとGlassfishの起動時のログにはTimerServiceの起動に成功したような旨のログを出力されるようになりました。

ただ肝心の私が書いたサンプルのほうはまだどうも動いているような雰囲気ではありません。アプリケーションクライアントから実行された10秒後に標準出力にメッセージを出力するような内容なのですが、アプリケーションクライアントが問題なく実行完了しているのに、メッセージは出力されていないようです。ただTimerの標準出力がどこに出るものかよくわかっていないので、特定のFileに出力するように直してまた試してみようと思います。

2009年11月29日

javamailでGmailにIMAPのINBOXにアクセス

やってみたんだけど。
Hmmmm....
  1. Gmail上のラベルはフォルダとして見える。受信トレイはINBOXだけど。
  2. ユーザフラグ(多分重要度フラッグとかで使う奴)は、比較的なんでもつけられるみたい。でもGmailの画面上では見えない。
疑問。
  1. Archiveに行っちゃったメールはどうなるの?(使わないから別にいいんだけど)
ソースコードは続きにて