Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

次期Java EE 7による開発へ向けて

ここ最近、何かと忙しくてブログが全然書けなかったのですが、少し時間ができてきたので、またコツコツ書いていきたいなぁと思います。

現状まだ色々と未確定ですが、次の案件ではJava EE 6ではなくてJava EE 7を利用したいと考えてます。

今回のPrjでは珍しく、上流のフェーズからプロトタイプを開発してます。プロトを利用して、細かい画面イメージや挙動などをすり合わせながら打合せをしているのですが…実はその環境がJava SE 8 + Java EE 7(^^;;;

実はあまりちゃんと上長とは環境の擦り合わせしてなかったのですが(^^;;;

さすがに本開発に向けて、ちゃんと考えていることを伝えないと…。
というわけで、その準備を進めています。こういうネゴは大事…。

今の所、次の一覧のように変えていく予定です。

今の環境 次期開発 備考
Java SE 7 8 まずは皆で要Java 8勉強
Java EE 6 7 GlassFish 4.1
IDE NetBeans 7.3/7.4 NetBeans 8.0.1
ビルド Maven 同左 Gradleは今回諦め…
テスト JUnit/Arqullian 同左
CI Jenkins 同左 -
ソース管理 Subversion Git
チケット Trac Backlog
静的解析 - FindBugs 検討中

Java SE 8やGitは、一緒に開発するチームメンバの皆と勉強しながらって感じですね。

GlassFish 4.1に伴ってJSFは2.2,JPAは2.1など上がります。

一番の垣根はJava SE 8かなぁと。
GlassFish 4.1にてJava SE 8が正式対応となりましたが、細かい所でちゃんと動くんだろうか…と不安も。

ラムダやStreamはサンプルレベルではわかるものの、実際にプロト開発にて自分で書いてみると、二重ループの処理とか…うーん、と思う場面も多々。
この辺はチームメンバ皆でコードレビューするぐらいの感じでやっていきたいなぁと。

一緒に開発する予定の女子メンバ2人はJava女子部のJava SE 8勉強会に参加予定!!
日本で唯一のJavaチャンピオン、櫻庭さんが直々に講師されるということもあって、きっとモチベーションも高まるはず!

Java EE 7 EssentialsとBeginning Java EE 7

最近、金魚本のJava EE 7版であるBeginning Java EE 7を細かめに読んでいるのですが
f:id:kikutaro777:20140621220510j:plain

先日Twitterでのやりとりで、Java EE 7 Essentialsがおススメされてたので、早速買ってみました(^^)

以前のJava EE 6 Pocket Guideと比べると書籍のサイズが大きくなってた(>_<)!

f:id:kikutaro777:20140621220502j:plain

ちなみに自分は写真のようにペーパーバックで購入しましたが、価格的には以下のようにKindle版のほうがお得です(^^;;


Beginning Java EE 7

まだ読み途中ですが、Oracleの寺田さんが以下言われていたようにJava EE 7で入ったjBatchの記述が確かにありません(>_<;

というか、WebSocketとConcurrency Utilitiesもないんですよね…(^^;目玉機能なのに…。
JSON Processingは入ってます。

個人的にこの本がいいのは、日本語の金魚本を読んでいれば、そこからの差分(7で変わった所)がわかる所かなぁと。
特にCDI(Context and Dependency Injection)とBean Validationは先頭の章で入っていて、それなりにボリュームもあります。

でもJSFのアップデート概要はあるのですが、肝心の説明が全然ないんですよね…(^^;
Faces Flowぐらいは詳細あってもいい気がするのですが。

Java EE 7 Essentials

まだ細かくは読めていませんが、こちらの本は全体がしっかり網羅されている感じです。

Java EE 7での目玉機能であるWebSocket、Concurrency Utilities、Batch、JSON Processing、そしてJSFではHTML5-Friendly Markup、Faces Flow、Resource Library Contracts。もちろんCDIやBean Validationもあります。

確かにこっちのほうがおススメだなぁと。

書籍の厚さ的にはBeginning~の半分くらいなので、内容的には要所をギュッとまとめた感じのようです。
概要やポイントを知るには良い感じかなと。

……

とはいえ、自分がJava EEをやる前を思い出すと、どちらも英語だしかなりキツイよなぁと。

今からJava EEを始める!という方は、まず金魚本を読んで、色々触りつつ、Java EE 7 Essentialsを読む感じがいいのかなぁ。

日本語のJava EE 7本が望まれる(´・ω・`)

#JavaDayTokyo 2014に参加して熱気を感じてきました!

今日は仕事仲間に申し訳ないと思いつつも、品川プリンスホテルで行われたJava Day Tokyo 2014に参加してきました(^^)

f:id:kikutaro777:20140522153758j:plain

去年は秋葉原のUDXで開催されましたが、コミュニティからの意見・要望をフィードバックに(主に椅子の座り心地が悪かった…等らしいですが…笑)会場を品プリにされたそうです(^^)ということで、椅子の座り心地は確かに凄く良かったです!

熱気

去年生まれて初めて本場のJavaOneに参加して、サンフランシスコにとんでもない数のJavaエンジニアが世界中から集まる熱気を肌で感じたのですが、さすがにそれとは規模が全然違うものの、今日のJava Day Tokyo 2014もかなり熱気があったように感じました。

歩留りはわからないですが、事前申し込みで2000人超えてるとおっしゃられていたような。

基調講演の会場は横に広く、大きなスクリーンが5つくらい並んでて、本場JavaOneに似たような雰囲気があったように思います。

セッション

参加したのは以下でした。

事前の申し込みでは、わりとLambdaやJavaFXを中心としていたのですが、行ってみたら事前登録してなくても(最悪立ち見で良ければ)参加できる方式になっていたので、結局Java EEを中心に参加しました(^^;

基調講演自体はわりと去年のJavaOneに等しい内容だったかと思います。なので、以下で櫻庭さんがレポートされていた

を読んで頂くと内容が分かる気がします。

チェスは3Dデモの他、ロボットアーム付きのチェス台も披露されていて、本当にJavaOneのようでした。DukePadも実物でした(^^)

もちろん違う部分もあるのですが、JavaOneになかった中で一番インパクトがあったのは、LEGO MindstormsによるDuke、名付けてLego Duke Segwayでした(^^)

すごいかわいかった(>_<;そして、Segwayみたいな車輪がついていて、何もせず置くと倒れてしまうのですが、電源入れてジャイロでバランスとるようなプログラムによって動くという!

デモではsshでDukeにログインしてたり、いろんな意味で面白かった(^^;

後半は、中身の解説をするために、胴体と頭を分断されて無残な姿になってしまい…結構せつなかったです(^^;

基調講演ではその他、何社かの日本企業によるJava活用事例が紹介された他、JJUG(Japan Java User Group)会長の鈴木さんが登壇されました。去年も登壇されていたと思いますが、改めて、JavaコミュニティとOracleの関係が強いのだなぁという印象を受け、JJUGや他のJUGが日々色々と盛り上げてる結果がこうした大きなイベントに繋がって熱気を生んでいるんだろうなぁ、と思いました。

「皆様、是非JJUGにご参加を」

とのことで、会員はメーリングリストに登録するだけで、以下JJUGのサイト右上の「入会案内」を辿って登録できます。

http://www.java-users.jp/

f:id:kikutaro777:20140523060308j:plain

その他Twitterは@JJUG、Facebookはjapanjugで、勉強会やイベントの情報が得られます。

おっと、基調講演の冒頭にあって忘れてはいけないのが、Java SE 8のJavaDoc日本語化!!わーわー

http://docs.oracle.com/javase/jp/8/api/index.html
f:id:kikutaro777:20140523012437j:plain

かなり力が入ってますね(^^)さっそくPublicKeyでも記事に!

Java EEに関して

1つ1つ細かく書けないので、参加した話の中から幾つか印象に残ったものをまとめます。

Java EE 8のRoadmap

JSR Submissions 2014 Q2
Early Draft Review 2015 Q1
Public Review 2015 Q3
Proposed Final Draft 2015 Q4
Final Release 2016 Q3 あわせて Java EE 8 RI/SDK

JAX-RS action based MVC

Java EE 8のfeature候補の中にJAX-RS action based MVCという文字がありました。

さよならJSF…?

訂正
上記書いてましたが、以下コメントの通り、JSFがなくなるという話ではないので訂正しますm(_ _;m 私自身、日々JSFを利用しており、あまりに世間で叩かれるのでちょっとネガティブな書き方になってしまいました(^^;

Java SE 8 & Java EE 7

現時点でJava EE 7対応しているAPサーバはGlassFishとWildFlyのみで、かつJava SE 8もサポートしてるものはWildFly(これも完全サポートかわからないですが)のみ。従って、各種APサーバの対応を待つ必要があるとのこと。

寺田さんがされていたデモは非常に有用そうだったので、はやく対応版が出て、ああいうことに使いたいですね(^^;

なおGlassFishは

と、日本GlassFishユーザグループの副会長様より教えて頂きました。

GlassFish 4.0.1

現在GlassFishは4.0.1b5ですが、4.0.1は今年のJavaOneまでには…という感じで頑張っているようです。期待!

GlassFishは死んでないのでは?

今日最後にあったJava Day Tech Nightでは、Ask the Expertということで、オラクル本社から来日されたエキスパートの方々へ質問するセッションがあったのですが、そこでJava EEのエバンジェリストをされてるReza Rahmanさんが

  • GlassFishはかなり品質を大切にしている
  • 中途半端なものは出したくない
  • 近々、GlassFishのチームからロードマップなども公開する予定

といった発言をされていて、まだまだGlassFish、大丈夫そうじゃないか!思ったりしました。WildFlyをウォッチしつつも、やはり自分はGlassFishをしばらく中心に触っていきたいと思います。

Togetter

#javadaytokyoや各セッションごとのハッシュタグ含めて、Oracle ACEの@yamadamnさんがTogetterでまとめられていました(>_<;はやいっ

すごいボリューム!!読むだけでも何となく雰囲気が伝わったり、情報が得られるのではないかと思います。

戦利品

入場200名までらしいDukeのノベルティ(写真左)とアンケート回答でもらったノベルティ(写真右)
f:id:kikutaro777:20140522221831j:plain

ボトル買ってしまった…(^^;会社でどっかオフサイトとか行くとき持っていこうw
f:id:kikutaro777:20140522232731j:plain

あと入場の際に配られたパンフなんですが…あれ目が(つд⊂)ゴシゴシ

f:id:kikutaro777:20140522221929j:plain

なんじゃこりゃああああ(;゚ロ゚)

f:id:kikutaro777:20140522221759j:plain

ということで、以前インタビューして頂いた記事が、なぜか人気記事No.2という位置づけに入れて頂いてるようですm(_ _;)m汗汗汗

この記事はJava EE 7による開発ではなくJava EE 6での開発ですが、もし今日のJava Day Tokyo 2014を通じてJava EEに興味を持った方がいらっしゃったら、採用や開発の際、少しでも何かの参考になれば幸いです…m(_ _;)m

以下リンクから上記パンフのリンクは辿れます。

Java SE 8の存在が大きい気がしますが、なんだかんだでJava自体すごい盛り上がってる感じもある中、こうしたイベントで熱気を感じて、ホント楽しい一日を過ごせました(>_<)!

また、Java EEのセッションを通じて、かなり注目されてるんじゃないかな?と感じました。これもひとえにずっとJava EEを宣伝されてる寺田さんを中心としたOracleさんやコミュニティの方々の力によるものなんだろうなと改めて感じました。

まさに

みたいな(^^;

追記

書き忘れてしまったのですが、去年のJava Day Tokyo 2013でミニ四駆LTで聴衆をすごい笑いと緊張・不安(オィオィこのままJava一切触れずにミニ四駆だけで終わるんか、という)に包み込んだ方が、Java Day Tech NightのAsk the Expertの最初の質問者として選ばれ、ミニ四駆ネタを絡めたQAされてました(^^;;ムチャぶりすぎる気がしてちょっと気の毒な気もしましたが…(^^;

Expertが「この場の趣旨わかってる?それは机の端で2人で話せばいいんじゃ?」みたいなエキスパートな回答してて笑いましたが…でもその後真面目な回答もされてました(^^)こういう緩さも好きです。

#JJUG_CCC Spring 2014で「初めての Java EE 開発から学んだこと」というタイトルで発表させて頂きました!

昨日、ベルサール西新宿で開催されたJJUG CCC Spring 2014でJava EEに関する発表をさせて頂きましたm(_ _)m

セッションに参加して頂いた方々、本当にありがとうございました!!

また、先月、日本オラクルさんのJavaセミナーで講演させて頂いたときのレポートも公開されましたm(_ _)m

1年半前にボスからJavaでのWeb開発を求められて「今さらジャバ!?」と半分やさぐれつつ、右も左もわからない中、Java EEで開発をしてきたのですが…その頃はまさかJJUG CCCのような舞台やOracleさんで発表する機会を頂けるなんて正直思ってもみませんでした(^^;;

日々の開発をメモ書き半分に書き続けてた本ブログを通じて、Javaコミュニティの方々には本当にお世話になりっぱなしでしたので、今回の発表で少しでも何かの恩返し等になればうれしいなと思います。

スライドの最後にも書いてますが、今ではなんだかんだJava楽しんでます(^^;

JJUG CCC発表での緊張…

私は何かと不安症なので(スライドの内容みてもわかると思いますが…)資料準備は結構力を入れたつもりですが、それでも集まる方々がホント多岐に渡るので、発表が何となく恐くて恐くて(^^;すごく緊張しました。

しかもホールという大きな場を与えて頂き…冷汗

ホール発表で並んでる方々の名前をみても、明らかにおかしいんですよね、自分がいるの…と思いつつ;

そして発表登壇の際、司会者の方がいきなりJava EE?おっと、これは…マサカリセッションですかねー的な案内をされて血の気が引いた上に、最前列にOracle ACEな方やGlassFish UserGroupの副会長さんなどなど…名だたるエキスパート陣が「マサカリワッショイ」みたいなこと言いながらワイワイ座られててホントに笑えなかったです(-_-;

でもこうした凄い方々が今まで様々な情報を発信されていたからこそ、自分も恩恵を得ながら学べたわけで…泣きながら発表頑張りました(´;ω;`)ブワッ

質疑に関して

無事発表を終えて、質疑を頂きました。

Microsoft Azureのイベントでもお世話になった割と普通(@normalian)さん(AzureのMVPの方でJava系も超詳しいというここにもエキスパートががが)から

「JSFにおいて、JMeterで負荷試験するのはViewStateの関係もあって大変では?」

と頂きました。私も初めてやったとき、まさにViewStateの関係で上手くJMeterによるテストができず、あれ?JSFって無理なの??となってたのですが、海外情報をもとに、JMeterでも少し工夫することで解決できることがわかり、それでやっていました。以下過去ブログです。

また

「JSFでのリクエスト回数などが顧客の性能検査・報告などで問題にならないか?」

といった辺りの質問も頂きましたが、幸い私が関わっているPrjではそこまでの細かいレポートなどを求められることがないので、とりあえずないのですが、そういったことがある場合は、細かくチェックしてみないと厳しいかも…ですね(^^;ちょっと曖昧な回答で申し訳なかったです。

また、他の方から

「JUnitやArqullianのようなテストがあったが、画面系ではどうしてる?」

と頂きました。

スライドではアイコンしか入れてなくて触れてなかったのですが、Web画面のテストではSeleniumを導入…試みましたが、正直なところ結構断念しています(^^;
というのも、業務系の画面テストはピンからキリまであまりにも幅広く、Seleniumで色々とカバーするのは非現実的かなと。

現在のところ、本当に最低限ここだけはっ、という部分で使うぐらいで、ほとんど活用できていないです(^^;

Twitterで頂いた補足

発表後半でJSFのパフォーマンス周辺で、聴いてる方にはちょっとマイナスなイメージが残る感じになってしまったかもしれませんが、気を付け所があります、ぐらいのメッセージのつもりでした(^^;すみません。

その辺りで楽天の岩崎さんが以下つぶやかれてました(^^)頼もしい

また、Arqullianに関して@nekopさん(RedHatの中の方…?)が

とつぶやかれていました。Arqullian Persistence、私はXMLでしか使っていなかったのですが、他も試してみたいです!
これをもっともっと活用したら、Java EEでのDB周辺のリグレッションテストはすごい楽になると思います。

また、スライドでも触れていますが、私がJava EEを始めたころ、とても参考にさせて頂いた「達人プログラマを目指して」を書かれている@ryoasai74さんから声をかけて頂き、私自身が当時ホントに色々と勇気をもらったブログだったので、お会いできて感動でした(>_<)

以下AOPに関してなどコメント頂きました。

これは是非買ってみようと思っています。

AspectJ in Action: Enterprise AOP With Spring
Ramnivas Laddad
Manning Pubns Co
売り上げランキング: 159,298

JavaのWeb開発に関して

自分の発表だけでなく、今日は色々なセッションに参加しましたが、個人的には@monzouさんが発表されていた

Modern Java Web / SPA Development
https://speakerdeck.com/monzou/spa-development

が印象的でした。

@monzouさんはJava開発は経験されてるようですが、Web開発が初めて、とのことで「おお、ちょっと自分と境遇が似てる」と思って聞いていたのですが、全くアプローチが異なる、というか、とても熱いポリシー(Keep it simple等)を色々持たれていて、それを貫くために取捨選択・工夫されており、すげーーーと(^^;

というのも私はわりと逆な感じで、「とりあえず標準なら安心」みたいな感じで無難な方向の流れにのってJava EEだったので(^^;

足りない部分や使いにくい所は自分達でライブラリ作ったりされていて、すごいなぁと純粋に思いました(^^;

私はJava EEという枠の中で、色々取捨選択をしてきましたが、@monzouさんのように枠にとらわれない感じをベースに自分達でしっかりアーキテクチャ検討する方向性というのは色々な可能性を秘めていそうだし、魅力的に感じました。

Java SE8とJava EE7について

楽天の岩崎さんの発表も印象的で、Java SE 8とJava EE 6,7の関係はとても参考になりました。

懇親会でお話させて頂いたのですが、既にJava EE 7での開発も…って感じですごい先をいかれてるなーと(^^)良い刺激になりました。

また、発表の中で、「日本はJava EE使わないですよね」的な話があって(^^;
「海外ではJava EE利用がさかんなのに、、、」とおっしゃっていて、これは私も海外の情報とかみて、そう感じてたので、日本の中では間違った方向性とされ…てるかもしれないけど、世界的な流れには一応乗れてるのかな(^^;なんてよくわからない安心感を改めて得たりしました。

JPAと同時実行制御

@suke_masaさんのJPAに関しての発表ですが、私自身、JPAで楽観ロックを使ったときなど、結構細かく挙動を確認したりしてたので、発表の中で色々されていたことを通じて「事前にちゃんと細かく確認しましょうね!!」ということを伝えたい想いがあるんだろうなーと思いながら聞いていました。

内容的には、え、マジすか…?的なものもあって、少し怖かったりも…(^^;;JPAむずいw

ちなみに自分が楽観ロック等を確認したときは、NetBeansの以下デバッグ方法で、複数アクセスの状態を作りながら、それぞれのアクセスを切り替えてステップ実行して…みたいな感じでやってました(^^;


その他のセッション

午前は総会、基調講演、午後は上記の外に上妻さん、山本さんのセッションに参加させて頂いてましたが、発表前は緊張で、発表後は緊張の解放による疲労で話半分になってしまってました(^^;;;資料をあらためて拝見して勉強したいと思います。

懇親会

懇親会では、普段Twitterでのみお話させて頂いてた方々とお会いできたり、ご挨拶できて良かったです(^^)人見知りな私ですが、こういう場は本当に貴重だなぁと改めて思いました。

LT…も全て聞きました!まとめると長そうなので…ここでは割愛;

これから

今年になって

3月はGlobal Windows Azure Boot Camp 2014で

「Windows Azureを利用したDevOps入門」というタイトルでGlobal Windows Azure Boot Camp 2014 in Japanで発表させて頂きました!

4月はOracleさんのセミナーで

そして5月は昨日のJJUG CCC

とアウトプットが続き、平日は仕事から帰ったあとに色々調べたり、土日はスライド作ってたり…。実は結構しんどかったです(^^;

そして今、全部だしきって完全に空っぽになった感じがします。

ということで、しばらくの間、仕事への集中と、その他インプットを中心にまた勉強していきたいと思っています~。

Java EEに興味を持った方は是非、金魚本からどうぞ(^^)
(blogサムネイルがAspectJになってしまってたので、金魚本追加w)

CloudBeesのPaaSでJava EEアプリをクラウドへ簡単に展開!

現在ではCloudBeesではPaaS環境の提供がなくなっているため本記事は古いものとなります。itpro.nikkeibp.co.jp

無償でJava EE系APがのるPaaSとしてはOpenShiftなどがあります。kikutaro777.hatenablog.com

Java 8が無事にリリースされて、Javaの世界が盛り上がってる気がします(^^)

今日はこれから「JJUGイベント 「祝☆Java 8 Launch」」に参加予定です。
http://jjug.doorkeeper.jp/events/9344

この勢いでJava EE 7も盛り上がると面白そうだなーと思っているのですが(笑)

……

3月の初めにTechCrunch Japanで「Java PaaSのCloudBeesが早くもシリーズCで$11.2Mを調達」という記事になっていたCloudBeesを触ってみたところ、なんじゃこりゃーー、ズコーッ、ってくらい簡単にJava EEが使えるクラウドサービスでした。

意外にも日本語で画面キャプチャ付の情報とか少なかったので、まとめてみました。

Herokuや他のクラウドサービスを全て確認したわけではないのですが、GlassFish4やWildFly8まで含めて提供されてるクラウドサービスが他にあるのかなぁ?と(^^;知りたいです。

CloudBeesとは?

主にJavaを中心としたPaaS基盤を提供していて、ソースコード管理からJenkinsを利用したビルドやデプロイまでトータルに含んだサービスとなっています。

英語のWikipediaはこちら
http://en.wikipedia.org/wiki/CloudBees

http://www.cloudbees.com/

f:id:kikutaro777:20140320191329j:plain

自分がCloudBeesの存在を知ったのは、JJUGでよくJenkins開発者である川口耕介さんの名前を聞くのと、Jenkins勉強会に過去何回か参加していたためですが、実際に使ったのは今回が初めてです。

そういえば今年のはじめ、CloudBees社のCTOに川口さんがなられて話題になっていました。
海外で日本の方がCTOって…しびれるなぁ。

まずは登録(Sign Up)

サイトにある「Try it for Free!」または右上の「Sing Up」から登録をします。

GitHubやGoogleのアカウントを利用することもできるので、簡単に登録するならそちらが良いかと思います。

f:id:kikutaro777:20140321002917j:plain

無料枠は当然ながら色々制約があるのですが、詳しくは以下Pricingの表にあります。
http://www.cloudbees.com/platform/pricing/devcloud.cb

ユーザ数が3、Jenkinsのビルド時間トータルが月100分、その他に容量やサポートなどありますが、登録時にクレジットカード情報などは不要で、ちょっと試しに使ってみるには、とてもお手軽な感じです。

豊富なメニュー

Sing Up後、以下のような画面が表示されます。

f:id:kikutaro777:20140321003521j:plain

左上の「Click Start」を押すと、アプリケーションの選択肢メニューが出るのですが、これがすごい豊富。
一通りキャプチャしてみました。

f:id:kikutaro777:20140321003604j:plain

f:id:kikutaro777:20140321003622j:plain

f:id:kikutaro777:20140321003627j:plain

f:id:kikutaro777:20140321003632j:plain

f:id:kikutaro777:20140321003638j:plain

f:id:kikutaro777:20140321003644j:plain

Java系ではTomcatをはじめ、Jetty、GlassFish3、GlassFish4、JBoss71、Wildfly8などが選べますし、Play Framework2もあります。GroobyのGrailsやScalaのLift、Node.jsやVert.x、GoやCloujure、Erlang、Rubyなどもあったり。Senchaなんかも。

GlassFish4以外は試せてないのですが、なんかすごい(^^;

あと個人的には「PrimeFaces Showcase」があるのと「with SendGrid」系があって面白かったです。どんなのか、是非試してみなければ。

GlassFish4 Appを選択してみる

とりあえず今回はGlassFish4 Appを選んでみました。
Full PlatformとWeb Profileがちゃんと選べるのですが、とりあえずWeb Profileで。

f:id:kikutaro777:20140321004848j:plain

メニュー選択後、自分の場合は以下Jenkinsのprovisionedの画面が出てきて、少し待つ必要がありました。5分程度でしたが。

f:id:kikutaro777:20140321004934j:plain

f:id:kikutaro777:20140321004944j:plain

で、メニュー選択後、アプリケーションの名前を入れます。

f:id:kikutaro777:20140321005104j:plain

名前を入れて進むと、ソースのリポジトリ、Jenkins、アプリケーション、DBの準備が開始されます。

f:id:kikutaro777:20140321005151j:plain

f:id:kikutaro777:20140321005310j:plain

完了したので、ダイアログを閉じます。

f:id:kikutaro777:20140321005506j:plain

ホーム画面をみると、それぞれできてます。

f:id:kikutaro777:20140321005651j:plain

アプリケーションをみてみると、以下のように表示されます。

f:id:kikutaro777:20140321005842j:plain

URL叩くと、テンプレート的に作成されたアプリケーションが表示されます。

f:id:kikutaro777:20140321005920j:plain

これだけでもうGlassFish4の上にデプロイされたアプリケーションが使える状態です。なんて簡単なんだ!!!

個人的にはすごい感動したのですが(^^;

でも、さらにすごいのはこれから。

コードの取得

ここまででテンプレができていて、Gitのリポジトリも生成されてるので、コードを取得してみます。

メニューの「repos」をみると、GitのURLが確認できます。

f:id:kikutaro777:20140321010412j:plain

普通にコマンドでgit cloneとかしていってもいいのですが、とりあえず自分はNetBeansを使いました。(ちなみにNetBeans 8)

f:id:kikutaro777:20140321010615j:plain

メニューでコピーしたURLと認証情報を入れて、淡々と進めていきます。

f:id:kikutaro777:20140321010713j:plain

f:id:kikutaro777:20140321010758j:plain

f:id:kikutaro777:20140321010804j:plain

f:id:kikutaro777:20140321010812j:plain

cloneされたプロジェクトが表示されます。以下のような感じ。

f:id:kikutaro777:20140321010852j:plain

JSF書いてみた

取得したコードは一旦消して、JSFの簡単なサンプル作ってみました。

プロジェクトのプロパティでGlassFish4を選んでおいて

f:id:kikutaro777:20140321011017j:plain

フレームワークからJSFを選択します。ここではついでにPrimeFacesもつけときました。

f:id:kikutaro777:20140321011109j:plain

f:id:kikutaro777:20140321011116j:plain

f:id:kikutaro777:20140321011123j:plain

で、index.xhtmlを以下のように定義して

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>My First app on CloudBees</title>
    </h:head>
    <h:body>
        <h:form>
            <p:panel header="PrimeFaces Panel Header">
                <p:calendar />
            </p:panel>
        </h:form>
    </h:body>
</html>

ローカルで実行するとこんな感じ。しょぼしょぼですが(^^;

f:id:kikutaro777:20140321011234j:plain

プロジェクトはこんな風に変わってます。

f:id:kikutaro777:20140321011304j:plain

で、コミットしてプッシュします。

f:id:kikutaro777:20140321011437j:plain

f:id:kikutaro777:20140321011445j:plain

f:id:kikutaro777:20140321011453j:plain

f:id:kikutaro777:20140321011535j:plain

f:id:kikutaro777:20140321011542j:plain

f:id:kikutaro777:20140321011602j:plain

これで終了すると…なんと、CloudBees側でJenkinsがプッシュトリガーに自動ビルドを開始して、そのままデプロイしてくれます。マジすか。

自動ビルド&自動デプロイ

上記の操作後にCloudBeesのJenkinsをみるとタスクがピコピコしててビルドしてました(^^;

f:id:kikutaro777:20140321011753j:plain

で、成功すると、そのままデプロイまでしてくれて、さっきローカルで動かしたのと同じアプリケーションがあがってるーーーーー

f:id:kikutaro777:20140321011855j:plain

すごい!

GlassFishやWildFlyをクラウドで利用したい場合って、今の段階だと多くが、仮想マシンを一旦立てて、インストールして…という流れだと思いますが、CloudBeesならAzureのWebサイトみたいな感覚でお手軽に使えてしまうのが嬉しいですね。

Java EEを利用したオフラインWebシステム構築にChallenge! ~その2~

昨日の続きです。

f:id:kikutaro777:20140207202741p:plain

Java EEを利用したオフラインWebシステム構築にChallenge! ~その1~

上記のような仕組みでJava EEで構築したシステムをオフライン化してるのですが、昨日も書いたようにオンラインとオフラインで異なるデータベースを利用しています(^^;

ここが本当に気になって気になって、誰でも同じ心配をすると思うのですが

f:id:kikutaro777:20140208184410p:plain

という疑問が。

実際DDLとかの記述では違いもあって、自動採番で1ずつインクリメントするカラムなど

MS SQLだと IDENTITY(1,1)

ですが

Derby だと IDENTITY(START WITH 1,INCREMENT BY 1)

だったり(^^;

元々存在しているオンラインのシステムがどんなテーブル定義をしているか、それらをオフライン側のデータベースで使えるのか、はベタにコツコツ調査するしかないかなと。

今回特に注意してたのは

  • ストアドやトリガー、その他ベンダ依存の機能利用があるかないか
  • どんなデータ型を利用しているか、お互いで互換がありそうかどうか

辺りでした。幸い今回オフライン対象となったシステムでは前者で該当するものがないシンプルな作りだったので、後者をメインに調査。

MS SQL ServerもApache Derbyも各々ドキュメントは豊富なのでありがたいですが、どう調べて検証すればいいのか…よくわからず、以下のように行いました。

とりあえずMicrosoft SQL Serverを利用する際、JDBCドライバを介するので、そこのドキュメントを確認。
http://technet.microsoft.com/ja-jp/library/ms378599.aspx

基本型のマッピング表が以下のようにあります。
http://technet.microsoft.com/ja-jp/library/ms378878.aspx

まずはここから対象システムで利用しているSQLの型とJDBCのマッピングを抜粋しました。

SQL Server型 JDBC型
bit BIT
int INTEGER
nvarchar VARCHAR
NVARCHAR
datetime TIMESTAMP

などなど。他にも色々あるのですが、ここでは一部抜粋でこんな感じに。

Derbyのドキュメントでもデータ型に関する場所があります。
Data typesという章の部分。
http://db.apache.org/derby/docs/10.10/ref/
※利用バージョンごとにちゃんとドキュメントは分かれています

ここでデータ型をみてみると、JDBCでの型が確認できます。例えばINTEGERの部分をみると以下のような感じです。

f:id:kikutaro777:20140208192731j:plain

で、ここからJDBC型からDerbyでの型を拾っていくことで

SQL Server型 JDBC型 Derby型
bit BIT 該当なし
int INTEGER INTEGER
nvarchar VARCHAR VARCHAR
NVARCHAR VARCHAR
datetime TIMESTAMP TIMESTAMP

みたいな。JDBCを介してSQL ServerとDerbyの型マッピングができるかなと。
BITのようにピンポイントで該当するものがない場合は、CHAR FOR BIT DATAやBOOLEANで代替可能か?を実際に確認しました。

で、確認・検証方法ですが、実際にデータベース、テーブルを準備して行いました。

気にしているのは、オンライン時にMS SQL Serverで保存されたデータがオフライン環境のApache Derbyへ格納されたり、その逆があったり、というのをJPAを介して問題なくできるか、という所です。
なので、実際Sync(同期)するときに利用するJAX-RSで各々で作成したデータをJSONで比較しあうことで検証しました。

というのも、同期はJSONでJava Entityオブジェクトベースに行うので、JSONが同じであれば、利用してるプログラムは同じなので、同じEntityになるはず、と。

f:id:kikutaro777:20140208193109p:plain

こういう検証の仕方で適切なのか、わからないのですが、実際にシステムを介して作成したデータ同士を比較できるので安心感はあるかなと。

Java EEを利用したオフラインWebシステム構築にChallenge! ~その1~

少し前に「オフラインのWebシステム構築」を調査・検証・プロト作成することになりました(^^;

実際に動くモノがだいぶ形になったので、少しずつ書いていこうかなと。

まずは、そもそもなんでそんなことをすることになったか…の背景から整理してみます。

オフライン機能への需要

お客さんからよく聞く要望

自分の所属組織では日頃、案件管理や販売管理のシステムを主に受託開発しています。

昔はWindows Formなどで開発するのがメインでしたが、最近だとイントラでの利用であってもWebシステムを求められることが多くなり、直近で開発したものはほとんどWebシステムでした。

で、案件管理とか販売管理システムは、実際の利用者(エンドユーザ)の方が営業担当者であったりするため

「出先でネットにつながらない場合もあるので、オフラインでシステムを利用したい。」

と言った話をよく聞きます。

また、私は実際に触ったことはないのですが、Salesforce CRMにもそういった機能があるので、よくある話なのかなと。

どんな状況下でも仕事ができるようにならねばならないとは大変だなぁと思いつつ(^^;

自分達でも欲しいケース

一方で、自分達でも欲しいときがあります(^^;

それはオフラインというよりは、手軽に起動できるWebシステム、なのかもしれませんが。

例えば、営業さんのサポートでWebシステムをデモする場合など、自分がデモする際にはノートPCに環境整ってるし特に困ることはないです。

ただ、営業の方が突如「単独でデモしたいんだけど!!」となった場合

  • 操作動画でデモしてもらう
  • VPNでつないでもらう
  • デモ対象のWebシステムを公開サーバに置く
  • その人のノートPCに環境を構築する

などなど選択肢は色々ありますが、最後の選択肢を求める人が多い気がします。

で、それなりの時間をかけて

環境準備して…

DB入れて…

APサーバ立てて…

と、環境構築するだけでそれなりに手間がかかりますし

「マシン変えた」…「他の営業にも同じ構築を」…「お客さんに貸し出す」…

などなど。手順書渡したりしても失敗したり、インストーラ作っても環境によって失敗しちゃったり。

究極的には「コピペすれば動く」くらいにもっていけると…と思ったり(^^;

組込系を上手く使うことで、この辺りも実現できるかと。

実現方法は?

オフラインと聞いて、自分がまず思い浮かぶのはhtml5を利用して…Web Storageを利用して…といったイメージです。

去年参加したhtml5j conferenceで、まさにそういう内容の話を聞きました。
http://events.html5j.org/conference/2013/11/sessions

セッションの動画が公開されてました!↓

ただ、私のいる環境ではまだhtml5でシステム提供をした経験がないし、詳しい人もいない…。

そうなると、完全にクライアント専用のGUIを新たに構築する…といった選択肢?
元々クライアントがWindows Formなどで、Webサービスと通信、みたいなクラサバで作っていれば、少し頑張ればいける気がしますが(^^;

でもそもそも提供したのがWebシステムだったりすると、エンドユーザさんとしては日頃見慣れたブラウザでの画面で操作できるのが良いわけで…。

で、去年からJava EEをメインに開発しているので、それ前提にした場合、どのように構築できるか?を模索してきました。

そこで

  • Embedded GlassFish
  • 組込みデータベース

を利用しつつ、いくつかの条件が揃えば実現できるのでは?ということで、実際にJava EE6で構築した運用システムのオフライン化を検証していきました。

現在作ってるもの

最終的には以下のような構成図の仕組みです。

f:id:kikutaro777:20140207202741p:plain

わりと素直な構成だと思うのですが、一番の問題点はオンラインとオフラインで異なるベンダのデータベースとなっている点です。

今回オフライン構築対象のWebシステムでは、もともとMicrosoft SQL Server 2012がDBとして使われていました。

であればオフラインでは、SQL Server 2012のLocalDBとかを選択するのが素直なのですが、まだ対応したJDBCドライバがないっていう…(-_-;
まあLocalDBは開発用って感じで実際に運用で使えるかどうか、その辺りも見えないのですが;

ちなみに今後JDBCドライバを設ける予定はありそうな感じの情報も。
http://connect.microsoft.com/SQLServer/feedback/details/771612/jdbc-support-for-localdb

この「異なるベンダのデータベース」と聞いて思い出すのは、よくオラクルさんのJava EEセミナーなどでちょこちょこ聞く「JPAを使うことでデータベースの差異を吸収」「JPQLを使うことでクエリ変更も不要」という売りです(^^;

思想は理解しつつも、実際は大変だろうなぁ、ってかそもそも1つのシステム内で異なるDBを複数使うことはあまりないよなー、と聞き流していたのですが、まさか使うシチュエーションになるとはっ(^^;

でも実際に上記構築をしてみて、JPQLを利用してて良かった…と思いました。
1箇所だけNative Queryで書かれた部分があったのですが、幸いそこはJPQLに書き換え可能だったので書き換えることで問題なくいけました。

ただ、この辺に関しては色々条件がそろわないと駄目(利用してる型とかストアドがないとか)で、そこらへんはまた別途まとめようかなと思います。

Mavenのpom.xmlにあるプロジェクト情報をJSFで表示する

Java EE6で開発中のシステム(APサーバはGlassFish 3.1.2.2)で、後輩から

「pom.xmlに定義しているversionを取得して表示したいが、上手くいかない」

と相談されて調べてみました。

StackOverflowみると、わんさか出てきます(^^;

ベストプラクティスがわからない(^^;そもそもこれだけ同じテーマが乱立する時点で悩ましい気が。

自分の場合は前に書いた「Subversionのリビジョンを画面に表示したいと言われたら…」で使ったmavenのfilterを利用した方法がシンプルで好きだったりします。上記StackOverflowでも結構勧めてる人が多いですし。

NetBeansで新規にJava EE6プロジェクトを作って、手順をまとめてみました。

まずは「ファイル」メニューの「新規プロジェクト」からMavenでWebアプリケーションを作成します。

f:id:kikutaro777:20140131223008j:plain

先に進めてプロジェクト名(今回はMavenProjectInfoとしました)などを入れて、GlassFish 3.1.2.2とJava EE6を選べばOKです。

f:id:kikutaro777:20140131223138j:plain

上記の「ファイル」タブを選んでプロジェクト内のフォルダを展開していき

f:id:kikutaro777:20140131222857j:plain

src/mainで右クリックしてフォルダを新規追加します。名前はresourcesです。

f:id:kikutaro777:20140131223330j:plain

続けて、resourcesフォルダの中にプロパティ・ファイルを作成します。

f:id:kikutaro777:20140131223358j:plain

ファイル名は自由ですが、ここでは「version」としました。

f:id:kikutaro777:20140131223429j:plain

で、こんな感じに

f:id:kikutaro777:20140131223456j:plain

プロパティファイルの中身に

version = ${project.version}

と定義してみます。Mavenのpom.xmlのprojectで定義されたversionを取ってね、という定義です。

あとは管理対象Beanで例えば

package jp.co.hoge.mavenprojectinfo;

import java.io.IOException;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import lombok.Getter;

@Named
@RequestScoped
public class IndexBean {
    
    @Getter
    private String version;

    @PostConstruct
    public void init() throws IOException{
        Properties prop = new Properties();
        prop.load(this.getClass().getResourceAsStream("/version.properties"));
        version = prop.getProperty("version");
    }
}

みたいにしてJSFのビューで(bodyタグのみ抜粋)

<h:body>
    <h:outputText value="#{indexBean.version}" />
</h:body>

のようにすれば

f:id:kikutaro777:20140131223949j:plain

ちゃんと取れます。pom.xmlは以下です。

f:id:kikutaro777:20140131223938j:plain

さらにartifactIdなんかも、先に作ったプロパティファイルで

version = ${project.artifactId}${project.version}

とか定義すれば

f:id:kikutaro777:20140131224052j:plain

こんな感じです。

ちなみに

相談にきた後輩はStackOverflowにあるMETA-INFフォルダにMANIFEST.MFを吐かせてImplementation-Versionを取得する流れで試してうまくいかなかったとのこと。

自分も以下のように試してみました。

上記で作ったMavenプロジェクトのwarにあるMETA-INFをみると

f:id:kikutaro777:20140131230908j:plain

※古いJDK使っててごめんなさいごめんなさい…

こんな感じでした。で、StackOverflowにあるようにmaven-war-pluginで以下のように定義し、warのmanifest.mfに情報を出力するように設定しました。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
                
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <!-- ここからお試し追加 -->
        <archive>                   
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
        </archive>
        <archiveClasses>true</archiveClasses>
    </configuration>
</plugin>

ビルド後に先ほどと同じMETA-INFをみると

f:id:kikutaro777:20140131231225j:plain

確かに増えてます。あとはこれを管理対象Beanなどからみればいい、と思ったのですが

例えばStackOverflowにもある

this.getClass().getPackage().getImplementationVersion();

みたいな書き方すると、管理対象Beanクラスのパッケージのものをみようとしてnullになります。

他にもgetClass()からgetResourceAsStream()などで読み込むサンプルなどもありますが、うまくいかず。

あと、NetBeansでGlassFishをデバッグモード起動してブレイクポイントおいてるのですが、止まらずに空白ページが起動するとか、よくわからない動きも…。

そもそもGlassFishにデプロイするwarでMETA-INFって…?
今までWEB-INFしか意識してないや…(^^;あれ、あれ、みたいな。

現状の自分はJavaに関してまだまだ全然知識的が足りないのですが、その中でも特にJavaのクラスローダの辺りやGlassFishではそれがどうなっているか、jarやwarの構成と動き、などなど、この辺りの理解が乏しい気がしています。だから、今回のも「こうすればできる」というのが見えていない感じ。

精進あるのみだなぁ…。

追記

@kazuhira_rさんがブログでMANIFEST.MFからの読み込み方法について書いて下さりました(^^)!!!

WARファイルの中にある、MANIFEST.MFファイルの内容を読む

ServletContextを利用、とのこと。

自分はJSF使っているので、ServletContext使えるのかな…と調べたら使えるらしい(^^;

How To Get ServletContext In JSF 2

ということで、まずは以下のように通常のMANIFEST.MFが読めるか確認してみました。

package jp.co.hoge.mavenprojectinfo;

import java.io.IOException;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletContext;
import lombok.Getter;

@Named
@RequestScoped
public class IndexBean {
    
    @Getter
    private String manifestVer;

    @PostConstruct
    public void init() throws IOException{     
        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        Properties manifestProp = new Properties();
        manifestProp.load(servletContext.getResourceAsStream("/META-INF/MANIFEST.MF"));
        manifestVer = manifestProp.getProperty("Manifest-Version");
    }
}

結果的には、GlassFishでは駄目でした。
servletContext.getResourceAsStream("/META-INF/MANIFEST.MF")でnullが返ってきます。

試しにJBossAS 7.1.1で確認したところ、ちゃんと動きました(^^;

f:id:kikutaro777:20140202071741j:plain

この辺はアプリケーションサーバのベンダごとに少し差異があるんですかね(^^;

JBossで動きそうなのでpom.xmlにImplementationVersionを出力するように設定したら、APは起動するけどページが上手く表示されず…うーむ、NetBeansからの実行が駄目なのか?ここは手元で確認できずちょっと残念。

とはいえ方法を教えて下さった@kazuhira_rさん、ありがとうございました!!

さらに追記

@kazuhira_rさんと同じようにServletから取得してみたのですが、動きませんでした(^^;なぜ…@kazuhira_rさんがわざわざGlassFishでも試してくださり、Twitterで会話する限り、違いがあるのはNetBeansを介してデプロイしてるか、普通にデプロイしてるかの差ぐらいしかなく、そんなので差がでることないよなぁ、と思って試したのですが

f:id:kikutaro777:20140202225435j:plain

普通にデプロイしたら出た!!な、なぜ。

この辺は難しい(^^;とりあえずServletを使えば取れることがわかったので、よしとしようかな。と。

Java EEを使って10分で作れる「いろふさんを探せ!」ゲーム #irof_history

この記事はいろふ Advent Calendar 2013の11日目の記事です。
昨日は@pocketberserkerさんの「いろふさんとの遭遇記」 でした。
明日は@akuraruさんです。
http://atnd.org/events/44814

「いろふさんを探せ!」ゲーム

こんなゲーム(?といえるのか)を10分くらいで作りました。細かい解説は後ほど。


そもそも@irofさんって何なん…

去年Javaを触り始めて、一番理解が難しかったのが「いろふさん」の存在でした。
でも今年の春にJJUG CCCで実物を見て、おぉ、実際に存在する方だったのか…と理解(^^;
そのときの参加ブログ↓
JJUG CCC 2013 Springに参加しました~!

いろふAdvent Calendarとは…

謎でした。書いてる今も謎です…w

数日前まで参加する気も全然なかったのですが、以下、鬼のような行為によって参加に至ります…。

@bitter_foxさんが「動くirofさんに会いたい!!」を書いていて、面白いなぁと何気なく、以下つぶやきました。

そこから





既に登録されてました…鬼に出会いました orz

いろふさんを探せ!解説編

気を取り直して、私のネタは、NetBeansJava EEが入っていればすぐ作れる簡単なゲーム紹介です。
ウォーリーを探せ!のいろふさん版的な。。。

本当はNetBeans7.4とGlassFish4.0のJava EE7でやる予定でしたが、かくかくしかじかで、NetBeans7.3.1、GlassFish3.1.2.2のJava EE6で作りました(^^;

先に流れから

まずは、Webアプリを起動すると以下画面が表示されます。
f:id:kikutaro777:20131211191131j:plain

デスクトップに、いろふさんがいます。
f:id:kikutaro777:20131211191205j:plain

ドラッグ&ドロップしましょう。(ちなみに召喚ボタン押すとファイル選択ダイアログ)
f:id:kikutaro777:20131211191227j:plain

召喚されました。
f:id:kikutaro777:20131211191453j:plain

ゲームの世界に連れ込みます(単なるアップロードボタン)
成功すると、消え去ります。
f:id:kikutaro777:20131211191517j:plain

ゲーム画面へボタンで次のページにいきます。
こんな画面です。
f:id:kikutaro777:20131211191549j:plain

召喚されたいろふさんを触ると、スライドしていろふさんが出てきます。
f:id:kikutaro777:20131211191654j:plain
f:id:kikutaro777:20131211191646j:plain

画像からマウスポイントを離すと崩れ去ります。
f:id:kikutaro777:20131211191718j:plain

これが本物のいろふさんです。

では次に、増殖ボタンを押します。すると、偽物のいろふさんをいくらでも発生することができます。
f:id:kikutaro777:20131211191746j:plain

本物のいろふさんも、偽物のいろふさんもドラッグで自由に移動できるので、ごちゃまぜにして準備完了です。

いろふさんを愛するプレイヤーに、どこに本当のいろふさんがいるか探してもらいましょう!

みつけると
f:id:kikutaro777:20131211191839j:plain

いいことあるかも!

コード

ドラッグ&ドロップとか、画像にマウスオーバーしてエフェクト(画像がスライドイン、コラスプしたり)、画像を移動したり…10分はうそでしょ!と思われるかもしれませんが、JSFのPrimeFacesというコンポーネントを使っていて、簡単に実現しています。

  • ドラッグ&ドロップのアップロードやアップ画像のサムネイル表示はFileUploadコンポーネント

http://www.primefaces.org/showcase/ui/tooltip.jsf

http://www.primefaces.org/showcase/ui/draggableBasic.jsf

を使ってます。

なので、ほとんどビュー定義のみで

最初のアップロードするページビューはこんな感じ。

<h:body>
    <h:form>
        <p:fileUpload mode="advanced" 
                  label="召喚する"
                  uploadLabel="ゲームの世界に連れ込む"
                  cancelLabel="現実世界に戻してあげる"
                  fileUploadListener="#{irofSanUploadBean.handleFileUpload}" />
        <p:commandButton value="ゲーム画面へ" ajax="false" action="irofSanCooking.xhtml" />
    </h:form>
</h:body>

次のゲームページはこんな感じ。

<h:body>
    <h:form id="frm">
        <p:commandButton value="増殖" actionListener="#{irofSanCookingBean.incrementIrofSan()}" update="@form"/>
        <p:graphicImage id="irofSan" url="/images/irof.jpeg" />
        <p:draggable for="frm:irofSan" />
        <p:tooltip for="frm:irofSan" showEffect="slide" hideEffect="explode">
            <p:graphicImage id="tooltipIrofSan1" url="/images/irof.jpeg" />
        </p:tooltip>
    </h:form>
</h:body>

コンポーネント置いてID指定するだけ…(^^;

増殖ボタンでコンポーネントが増える部分はプログラム側でコンポーネントを生成しています。

package jp.co.hoge.irofsanwebapp;

import java.io.Serializable;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.context.FacesContext;
import org.primefaces.component.dnd.Draggable;
import org.primefaces.component.graphicimage.GraphicImage;

@Named
@SessionScoped
public class IrofSanCookingBean implements Serializable{
    
    private int cnt;
    
    public void incrementIrofSan(){
        cnt++;

        //プログラムでコンポーネントを追加
        UIForm form = (UIForm) findComponent(":frm");
        GraphicImage img = new GraphicImage();
        img.setId("irofSan" + cnt);
        img.setUrl("/images/irof.jpeg");
        img.setStyle(randomPosition());
        form.getChildren().add(img);
        
        Draggable dra = new Draggable();
        dra.setFor(img.getId());
        form.getChildren().add(dra);
    }
    
    private String randomPosition(){
        StringBuilder posStr = new StringBuilder();
        posStr.append("position:absolute;left:");
        posStr.append(Math.round(Math.random() * 1280));
        posStr.append("px;top:");
        posStr.append(Math.round(Math.random() * 640));
        posStr.append("px;");
        return posStr.toString();
    }
    
    private UIComponent findComponent(String componentId){
        return FacesContext.getCurrentInstance().getViewRoot().findComponent(componentId);
    }
}

ちなみに昨日の時点では、アップロードした画像をImageCropperコンポーネントでバラバラにするという残酷なネタだったのですが、ImageCropperが動かなくて、デバッグしてもわからなかったので断念しました(^^;
http://www.primefaces.org/showcase/ui/imageCropper.jsf
うーん、なぜ動かない。。。

今更ながらJPAの楽観ロックを確認してみました

色んなところで既に書かれてるので、今日のは完全に自分向けのメモ(^^;

JPAの楽観ロック、知識としては知っていたのですが試したことなくて、ちょうどやる必要が出たので、まずは簡単なサンプルで確認してみました。

プログラムは営業系のシステムをイメージして、商談データがあって、2人の人が同じデータを取得して変更して更新してしまった、という流れです。

環境

環境はWindows 7上のNetBeans 7.3でJava EE 6 & JDK7、GlassFish3.1.2でEclipseLink2.3.2です。データベースはMicrosoft SQL Server 2008 R2。

テーブルは超簡易で以下のようなものです。

商談ID 商談名 Version 作成日 更新日
0 商談1だよ 0 2013-10-10 19:51:55.793 2013-10-10 19:51:56.060

Versionカラムは楽観ロック用に設けたものです。

動作

まず結果から。

サンプルアプリをデプロイして、ブラウザを2つ起動してアクセスします。

f:id:kikutaro777:20131010204737j:plain

f:id:kikutaro777:20131010204743j:plain

1つ目のテキストにDBにある商談ID「0」を指定して「読込」ボタンを押します。
DBから読み込んで商談名が表示されます。

f:id:kikutaro777:20131010204836j:plain

f:id:kikutaro777:20131010204840j:plain

IEのブラウザは「商談2なんです」と名称を書き換えます。
もう1つのFirefoxでは「商談3なんだよ!」と名称を書き換えます。

f:id:kikutaro777:20131010205017j:plain

f:id:kikutaro777:20131010205021j:plain

で、各々で「保存」ボタンを押下!

NetBeansではブレイクポイントで複数のスレッドが止まると以下のような歯車マークになります。
f:id:kikutaro777:20131010205241j:plain

NetBeansのマルチスレッドデバッグは過去に書いてました。
NetBeansでマルチスレッドデバッグ

oppFacade.edit(myOpp)という所でEJB側でDB保存処理されます。
成功したのでDBを確認します。

f:id:kikutaro777:20131010205402j:plain

保存されてますね。そしてVersionカラムの値が「1」とカウントアップされてます(^^)
ここに関しては後程。

ではもう1つのFirefoxから来たほうのスレッドに切り替えて

f:id:kikutaro777:20131010205504j:plain

保存処理を実行してみます。

f:id:kikutaro777:20131010205511j:plain

するとエラーに!

GlassFishをみると

f:id:kikutaro777:20131010205626j:plain

OptimisticLockExceptionとなっています(^^)取得した時点でVersionが0で、書き込もうとしたらVersionが既に1となっていたため、「誰かが書き込んだやろ」と判定した流れかと。

EJB使うとBean側ではjavax.ejb.EJBExceptionに成り代わってしまうのが悲しいですが、EJB側でちゃんとcatchすればいける…のかな多分(^^;未確認

@Versionアノテーション

やったことは単純で、2つだけです。

  • テーブルのカラムにintの「Version」を設ける
  • Entityの上記カラムに該当する項目に@Versionのアノテーションを付与する
@Column(name = "Version")
@Version
private int version;

だけです。すんなり思い通りに動いたので良かった(^^)

ちなみにEclipseLinkの楽観ロックに関する記述は以下でした。
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Locking#Optimistic_Locking
最後の1文に「java.sql.Timestamp型も使えるけど、numeric typeをおススメします」と書いてあるのが気になる(^^;

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村