Welcome Rakuten Technology Conference 2015 (Fukuoka Location)

New seats where added and tickets registration is available. Please, register as soon as possible before is too late. 

ご盛況により当初想定よりお申し込みが多くなっていました。
新たに増席し、現在、申し込みが可能となっています。
ご興味がある方は、ぜひお早めにお申し込みください!

We are very proud to inform that this year Fukuoka Technology Conference has a lot of interesting presentations about the current trend on e-business from Rakuten Ichiba, Rakuten Travel and Rakuten Card in Fukuoka.

If you want to hear how our business are implementing the current technology, come to see our conference. We will be very happy in explain our services.

Also, come to talk with our employees in our Happy Hour. This is a place that you can enjoy food & drinks and talk with us. Please, feel free to have a nice conversation with us.

今年も福岡でやります!! 楽天テクノロジーカンファレンス2015です。

今年は、楽天市場、楽天トラベル、楽天カードなど、実際にドライブ中の最新トレンドについて、(東京からのサテライト込み込みですが) 福岡からも発信します! Web技術を中心として、主にJava EEやエンタープライズ系開発について、結構ディープにやっちゃいます。

また軽食・お飲物提供タイムも用意しました。現場で開発している社員も参加します。色々聞いてみて下さい。お気軽にご参加下さいませ。

2015110213312220151102133131

presentationBDF7C1B4-0509-407E-B8D0-5B9D49623535.jpg

FukuokaRTC

Date / 日時

Nov. 21st, 2015, Start 10:00

2015年11月21日(土)10:00〜:受付開始

Place/ 開催場所

Fukuoka Center Building 12F,
2-2-1 Hakataekimae, Hakata-ku, Fukuoka City,
Fukuoka, Japan

福岡県福岡市博多区博多駅前2丁目2番1号
福岡センタービル12F

http://tech.rakuten.co.jp/access.html#access-fukuoka

Registration / お申込み

https://www.eventbrite.com/e/rakuten-technology-conference-2015-tickets-18950765249

Procedure / お申込み手順

1. Push “REGISTER” button. / みどり色の「REGISTER」ボタンを押して・・・
2. Apply from “(Satellites) Fukuoka”. /「(Satellites) Fukuoka 福岡サテライト」からどうぞ!

20151102145410

 

Time Table /タイムテーブル

Time Location A
(Conference)
Location B
(Cafeteria)
11:00 Java EE Applications for Transaction Services by Kota Fujita [Track A]
Talk by Yutaka Matsuo by Yutaka Matsuo
12:00 [Track A]
Fun Research in Computer Vision : from robots, sports, face to medicine by Takeo Kanade
Lunch
13:00 [Track A]
Keynote by CEO by Hiroshi Mikitani
[Track A]
Keynote by CEO by Hiroshi Mikitani
14:00 Better working framework for smart device service by Shimizu Yosuke [Track B]
Rakuten Ichiba by Yoshihisa Onoue
15:00 About JavaEE and DevOPS by Nakada Hiroaki [Track E]
Rakuten Travel by Kazuhisa Naoi and Shinoda Takeshi
16:00 [Track B]
Rakuten Card by Hirofumi Iwasaki and Ameen Arshal
[Track B]
Rakuten Card by Hirofumi Iwasaki and Ameen Arshal
17:00 Closing
17:30 Lightning Talk & Happy Hour

 

Sessions in Fukuoka / 発表内容(福岡)

 

Java EE Applications for Transaction Services by Kota Fujita.

11:00〜    at Location A (Conference) in Fukuoka

Today’s e-businesses are changing very fast introducing new standards and new technologies every year. This session will explain why we selected Java EE as our platform and How we are implementing it to allow agile and safe transaction system.

 

Better working framework for smart device service by Yosuke Shimizu.

14:00〜    at Location A (Conference) in Fukuoka

We believe that promoting excellent synergy between business, development and operation; creating a working environment that support each area demands; and building multinational team; It is possible to have rapid and reliable development contributing for better user satisfaction and more revenue. Some of key concepts is to have 100% in house development on both the Client and Server side and to have high qualified engineers capable to do planning, development and operation. As a result, we could optimize our working framework providing better products with high quality and very good customer satisfaction.

 

About JavaEE and DevOPS by Hiroaki Nakada.

15:00〜    at Location A (Conference) in Fukuoka

Our system is continuing to grow and introducing new technologies is becoming our normal operation flow. This session will explain over view of our development and operation.

 

 

お申込みは、こちらから!

https://www.eventbrite.com/e/rakuten-technology-conference-2015-tickets-18950765249

How to Install GCC 4.8 with NetBeans in OS X 10.9

Screen Shot 2014-02-15 at 11.39.21 PM

I tried to update GCC environment in my OS X 10.9 with NetBeans 8 beta environment to use C++11 new features, including shared pointer. There’s some useful information to update using MacPorts, and this article is just my memo.

1. Install Command Line Tools for Xcode

MacPorts’ policies of supporting GCC is as follows, and it must be installed separately from apple site. If this tools not installed, you’ll be failed in the compile operations with some header missing messages.

MacPorts migration policies
http://trac.macports.org/wiki/Migration

Download command line tools for Xcode
https://developer.apple.com/downloads/

2. Install MacPorts and GCC 4.8

Next, install MacPorts normally, and self update to refresh latest package information to your local repository of MacPorts.


$ cd /opt/local/bin
$ sudo ./port self update
$ sudo ./port sync
$ sudo ./port install gcc48
$ sudo ./port install gmake
$ sudo ./port install gcc_select

3. Set the Environment Variables

Set the GCC standard to 4.8 as follows.


$ sudo ./port select --list gcc
Available versions for gcc:
mp-gcc48
none (active)
$ sudo ./port select --set gcc mp-gcc48
Selecting 'mp-gcc48' for 'gcc' succeeded. 'mp-gcc48' is now active.

And set the environment variables to use as the standard gcc as below.


export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MANPATH=/opt/local/man:$MANPATH

4. Change the NetBeans Settings

Finally stars the NetBeans and open the preferences > C++ > Build Tools, Add GNU_MacPorts and set each compiler path to /opt/local/bin/*.

After finished the global settings, make a new C++ project and open its properties > Build > C++ Compiler > C++ Standard to “C++11”, and compile & run with easy samples.

It seems the NetBeans environment is fine in OS X Mavericks for C++ general programming usage rather than Xcode 5. Of course, it can also use with nice Java EE environment.

WebLogicをGlassFishの商用版として使う方法

※ WebLogicだけ書いておくのも何なので、その他の商用Java EEサーバーもこちらでまとめてみました(2013/12/08 22:20)
http://www.mushagaeshi.com/2013/12/08/from-glassfish-to-other-commercial/
※ GlassFish2系・3系のサポート継続について言葉が足りなかったので、念のため補足を入れました(2013/12/09 14:46)

こんにちは。Advent Calendarな時期になりましたね。この記事はJava EE Advent Calendar 2013の12/7の担当回です。12/6の回はwaritohutsuさんの http://d.hatena.ne.jp/waritohutsu/20131206 になります。

Java EE Advent Calendar 2013
http://www.adventar.org/calendars/152

ところで、先日Java EE界隈でプチ騒動が起きました。何とGlassFishの商用サポートが切られてしまったのです。大変残念な話です。

Java EE and GlassFish Server Roadmap Update (打ち切りの話が出てます)
https://blogs.oracle.com/theaquarium/entry/java_ee_and_glassfish_server

何故残念なのか? どうすればいいのか? そういった話を以下つらつらと続けてみます。Java EEは企業用途であり、商売が直接絡む話でもあって、こういった話はソフトウェア発売元もしづらいと思います。一方、困ってる所も結構多いと思いますので、ベンダー各社と全く無関係な筆者が私見をまとめてみました。

何故GlassFish商用版が必要だったのか?

この辺りに詳しくない方に一応説明だけしておきましょう。GlassFishは過去2.x系より「商用サポート」というSunおよびその買収会社であるOracleによって提供されてきた「パッチ」が存在します。Community Editionという一般公開版が3.1, 3.1.1, 3.1.2, 3.1.2.2, 4.0とバージョンを重ねてきましたが、この「商用サポート」には、何と、例えば3.1.2.2と4.0の間のバージョン、および4.0公開後に修正された一般未公開のバージョンが存在するのです。

これまでは、これを購入する場合にはOracleの営業さんに話をして、商用サポート権を購入していた訳ですね。知ってた人は知ってた話ですが、あんまり知らない人は全然知らないという系の話でしょう。

この辺りを見れば掲載されています。3系の最新版(最終版?)は何と3.1.2.6なんですね。
https://blogs.oracle.com/GlassFishForBusiness/

※念のため補足しますと、2.x系および3.x系のサポートについては、まだ一応継続しています。あくまで、将来のバージョンのサポートが無くなるという話になります。

商用サポートは何故必要だったのでしょうか? 特定の機能がちゃんと動かないとか、緊急の脆弱性が発見された場合に、その一般未公開バージョンがリリースされ、契約者はそれを適用して動作させていたのです。Java EEを利用するメインターゲットはEnterprise Editionの名前の通りEnterprise (企業)であり、何が何でも安定運用することが使命付けられたサイトやシステムに使われる事が大前提となっているから、ですね。

例えば、脆弱性があるからって放置してたり、バグで落ちまくる有名サイトがあったら利用者は困るでしょ? 金融系だと、さらに厳しくて、サービスによっては監督省庁に報告せねばならなかったりします。お金のやりとりが止まったら困りますよね? だから、企業はお金を払って、バグ修正版をもらう権利を買っていたわけです。

自分で修正すればいいじゃないかって? まあ、それはそうですが、修正したことで他の正常に動いていた機能が動かなくなったらヤバいですよね。どうやって修正が正しいことを証明するのか? それと、その次の修正版が出た場合、自分で修正した内容と異なる対処がされていたらどうでしょう? 延々と新しいバージョンが出るたびに、自分が修正した差分を適用していく必要が出てきてしまいます。ここらへんはGitやSubversionのbranchの関係を考えてもらえれば良いでしょう。つまり、公式の修正版を買った方が安い・早い・安全なのです。

ここらへんはEnterprise Systemの独特な所なので責めないで下さいね。世界中どこでも、大規模サイト、特に金融系など落ちたら大変なことになる所は、同じ事をやっています。オープンソースだからと自前で改変して独自バージョンをひたすらメンテナンスしているところは、現実の世界では実は多くはありません。

GlassFishが使えなければ、WebLogicがあるじゃないか

さて、話を元に戻しましょう。GlassFishが商用サポートの未来が無くなってしまったということは、別の商用サポートされているJava EE準拠アプリケーションサーバーを選択する必要が出てくるでしょう。幸いJava EEはMicrosoftの.NET Frameworkとは異なり、多数のベンダーが多数のアプリケーションサーバーとその商用サポートを提供しています。

そしてGlassFishの開発元であるOracleは、商用版Java EE準拠サーバーとして、WebLogic (ウェブロジック)を販売し続けています。古くからJ2EEを触ってきた人にはご存じのサーバーであり、Java EEサーバーの世界シェアNo.1、デファクトスタンダードと言われているものです。

一応言い訳をしておくと、筆者はJ2EE仕様準拠前よりWebLogicを使い続けているので、最も詳しいということがあるので、この記事ではWebLogicとしているだけです。勿論、他にもWebSphere、JBoss、Interstage、Cosminexus、WebOTX等、商用サポートが提供されているJava EE 6準拠サーバーはありますので、よりどりみどりです。

※こちらにWebLogic以外のサーバーを補足しました。
http://www.mushagaeshi.com/2013/12/08/from-glassfish-to-other-commercial/

が、最近GlassFishからJava EE世代になって入ってきた人にとってJava EEはさておき、その元ネタであるWebLogicは馴染みが薄いと思いますので、こちらも簡単に説明しておきましょう。

WebLogicの過去・未来

WebLogicは1997年頃に誕生した、元々WebLogic Inc.という会社が開発していたJava上で動くアプリケーションサーバーでした。当時はアプリケーションサーバーという名前もあるのかないのか、微妙な時代でした。名前も一時期Tengah (テンガー)というものでした。勿論、J2EE仕様なんてものもありませんでしたし、その前の暫定仕様であるProject JPE (Java Professional Edition)よりもさらに前の話です。

WebLogicはT3というプロトコルを持ち、それを土台としたEJBという独自仕様を持っていました。これはCORBAのモデルを忠実に移植したものであり、現在のEJBとほぼ同じものでした。CORBAは当時、特に金融系のデファクト・スタンダードとして、Object Brokerと呼ばれる製品と一緒に利用されていました。有名なところとしてはTuxedoやOpenJP1などがあります。トランザクション処理が可能なリモート通信を既に実現していたんですね。

これを買収した会社がTuxedoをも買収していたBEA(ビー・イー・エー)というところで、BEA WebLogic Serverという名前になり、トランザクション処理が更に強化されていきました。もはや知らない人も多いかも知れないので、読み方も補足しておきます(笑)

その後、Sunが1998年のProject JPEを経て1999年末にJ2EE仕様の初版(1.2)を出し、そこにWebLogicからEJBが持ち込まれたという経緯があります。つまり、WebLogicはJ2EEよりも古い、恐らくJavaで現存する最古の歴史を持つアプリケーションサーバーとなります。勿論、Apahce Jakarta Tomcatの登場よりもずっと前です。まだApache JServとか別の名前でした。

その後2000年代にWebLogicが一世を風靡した後、J2EE仕様が普及するにつれ圧倒的な優位性を失い、2008年頃にOracleに買収され、現在Oracle WebLogic Serverとして販売されている現状となります。

2013年末現在、このWebLogicの最新版は12c R2 (12.1.2)であり、これはJava EE 6準拠となります。残念ながらJava EE 7には現状未対応です。筆者の予測としては、来年辺りにはJava EE 7対応をしてくるのでは、と見立ててますが、残念ながら私はOracleの人ではないため、あくまで単なる推測になります。気になる方はOracleの営業さん辺りに聞いてみましょう。

GlassFish 2系・3系からWebLogicへ移行する

さて、またもや話が逸れてしまったので元に戻り、実際にWebLogicへGlassFishから移行するパターンを考えてみましょう。

まず、Java EEの対応バージョンです。WebLogicの最新版はEE 6対応なので、動作可能なアプリケーション仕様はEE 6, EE 5, J2EE 1.4の三つです。GlassFishはEE 5以降の仕様に準拠しているので、これは問題ありません。

次に、開発環境です。Java EEを開発する場合にはEclipseではなく是非NetBeansを使って頂きたいと日頃から言い続けている筆者ですが、NetBeansは幸いWebLogicにも当然ながら対応しています。サーバーのタブからWebLogicを追加すれば、GlassFishと全く同じように開発ができます。

更に有り難い話としては、WebLogicにはFaceletだけではなく、Backing BeanやEJBなどが、再配備せずとも自動的に画面に反映してくれる「Fast Swap」があります。例えば画面を書き換える場合、JSF Faceletを書き換えて、Backing Beanやその他Javaのファイルも書き換えると思うんですが、GlassFishの場合、Facelet以外を反映するためには再配備が必要になります。ところが、WebLogicのFast Swapはこれが必要ないんですね。NetBeansで書き換えて保存して再実行したら即時反映してくれます。実際の開発作業はこれが無いと結構やってられないので、現実の近代的なエンタープライズ開発現場には必須の機能です。GlassFishには残念ながらこういうプロ仕様の機能は無いので、ここはさすがに商用製品になります。

じゃあ開発にもコストがかかるか、というと、何と先日WebLogicの開発作業のためのライセンス費用が無料になりました。つまり、GlassFishと同じように、誰でもいつでもじゃんじゃん使えるわけです。但し、商用サポート締結時に入手可能な膨大なるパッチの入手はできませんので、まあそういう風に割り切って、ですね。

[WLS] WebLogic Application Server: free for developers!
http://orablogs-jp.blogspot.jp/2012/10/weblogic-application-server-free-for.html

勿論、入手はWebから普通にダウンロードできます。

http://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html?ssSourceSiteId=ocomen

スクリーンショット 2013-11-17 21.30.55

インストーラーは、ダウンロードしたJARファイルを「java -jar wls_121200.jar」と実行するだけです。下記のようなビジュアルなインストーラーが出てきますので、これを進めるだけです(多少面倒なところあり)。無論、CUI版でもOKですので、Xが起動できない現実の本番サーバーでも普通に作業可能です。

スクリーンショット 2013-11-17 21.52.01

開発環境は是非NetBeansを使いましょう。GlassFishと同じく、サービスタブから追加します。

スクリーンショット 2013-11-17 22.10.41

サーバーを追加したら、プロジェクトでWebLogic Serverに指定を切り替えます。

Screen Shot 2013-12-06 at 10.25.36 PM

あとは普通通りアプリケーションを「実行」すると、WebLogicが起動してWeb画面が表示されます。

何だ、環境的にはほぼGlassFishと同じじゃん!!!

プログラムの修正は必要か?

基本的にWebLogicは、特に最近のものは、内部のコンポーネントがオープンソース主体にどんどんシフトしてきています。GlassFishと比較しても、特に新しい仕様であるJSF2は同じMojarraが使われていますし、JPAもEclipseLinkです。設定ファイルもJava EE仕様のweb.xmlなどの標準がそのまま動きますので、WARを作成して配備して終わり、だったりします。

では非互換面はあるのか、と問われると、残念ながら、はい、あります。同じにしてよ!! と言いたいところですが・・・

設定ファイルとしては、Web系の設定ファイルがGlsssFish側は「WEB-INF/glassfish-web.xml」、WebLogic側は「WEB-INF/weblogic.xml」、EJB系がGlassFishが「META-INF/glassfish-ejb-jar.xml」でWebLogicが「META-INF/weblogic-ejb-jar.xml」とファイル名も中身の構成も全く違います。元々の出自が違うのでしょうがない面もありますね。

※一応最新版でどっちでも動くようになってますが、そもそも設定できる項目自体が色々違うので、あくまで暫定利用目的と思った方が良いです。

挙動的な非互換面としては、古い系のものがあります。特に違うのが、EJB周りです。WebLogicのEJB周りの仕様は2001年-2004年辺りで実装されたものが延々と使われ続けている経緯があり、初期化タイミングからリモートインタフェースの挙動、あとはWebLogic独自の(WebLogicのWebLogicたる所以でもある)T3プロトコル周りまで含めて、結構GlassFishと異なります。なので、この辺りをGlassFishの挙動をアテにしていたら、結構裏切られることが多く、最悪プログラムの修正も必要でしょう。

サーバー内部の実装もOSGI準拠の近代的な後発のGlassFishと比較して、WebLogicはいかにも重厚で巨大であり、何とも古くさい感じがします。現バージョン12cのオリジナルが2001年初頭頃登場(だったと思う)のWebLogic 6.0であり、そこからディレクトリー構成、設定ファイルを含めあんまり変わってない所も、イケてないところとよく非難される所ではあります。

まあ、とはいえアプリを作る側からすると、ちゃんと動いてくれればぶっちゃけどっちでもいい話でもあるかもしれません。

ただ、これらはかなり細かい面でもあるので、「だいたいそのまま動くよ、但し追加の独自設定ファイル(weblogic.xmlやweblogic-ejb-jar.xml)が必要だよ(特に本番目的だと)」と憶えておいてもらえればと思います。

運用にあたっての違い

GlassFishの運用も結構細かい知識が必要ですが、WebLogicの運用知識はGlassFishのものとはかなり異なります。最も違う特徴的な面は、Production Redeploymentという、古いアプリを動かしながら新しいバージョンのアプリを再配備するという、アクロバティックな機能です。これは24時間ノンストップ運用のために必須でありますが、結構きわい挙動もたまにあり、常に安定して動作させるためには現場の知見の蓄積が必要です。無視すればまあ、GlassFishのようにも使えます(笑)

またWebLogicにはかなり多くのパッチが提供されており、定期的にマイナーアップデートも出ます。商用サポートに入っていれば専用サイトで提供されていますので、それらを定期的に適用していく作業も必要になります。つまり、専任の技術者を育てる必要があります。まあ、GlassFishについても本番運用する場合は同じ話ではありますが、WebLogicの方がより多くの(数倍の)項目を設定できるため、そこは注意が必要でしょう。

なので、まあ内部実装の古くささ等もまるっと含めて、オープンソースでドラスティックに改良を続けるMySQL・Maria DB辺りに対する、商用の王道・互換性命のOracle Databaseの関係みたいなもんだと思ってもらえれば良いかなと思います。WebLogicも最初から徹頭徹尾、商用製品なんですよね。

GlassFish 4系からWebLogicに移行する

さて、GlassFish 3系以前からの移行については上記の通り、やることをやればだいたい問題ないと思います。では4系はどうか? 前述の通りですが、残念ながらWebLogic 12cのEE 7対応待ちになります。いつ出るのか? 繰り返しになりますが、オラクルの営業さんに聞いて下さい(笑)。私も残念ながら正確なところは知りません。

では他社の場合どうか? 残念ながらEE 7対応の商用アプリケーションサーバーはどこからも出てません。つまり、移行先はこの2013年度末時点で、無いのです。2014年は? 出るといいなぁ。出してね!!

まとめ

凄く面白くないまとめになってしまいますが、当たり前のことはそれはそれで重要なので、まとめておきます。

  • GlssFish 3系の移行先は、Java EE 6対応アプリケーションサーバーになります。
  • Oracle社の場合、商用版Java EE 6対応アプリケーションサーバーはWebLogic Serverになります。(今はFusion Middlewareという分類になっているようです)
  • Java EE 6に準拠していれば、(当たり前ですが)基本的なところは互換性があり、動きます。
  • 但し互換性のないところもあり、特にEJB周りと設定ファイル周りは注意が必要です。
  • 更に本番運用に際しては便利な機能も多い判面、パッチ適用も含め注意の必要な箇所も多いため、専門の技術者を揃える方が賢明でしょう。
  • GlassFish 4系の移行先は、2013年末時点では、ありません

さてJava EE Advent Calendarの次回(明日)はNorito Agetsumaさんの回です。宜しくお願いします!

JSFのConversation Scopedを改めて試してみた

Java EE 7+JSF 2.2に行きたい所は山々なのだが、現在EE 5やら6から逃れられない全国のエンプラ開発現場の方々お疲れ様です。

さてJSF 2.2からはCDIにFlow Scopedという便利なものが付き、開始・終了が自動になったのであるが、現在EE 6の場合、そんなもの使えないのである。しょうがないので、どうしても類似のことがやりたければ、JSF 2.1でも動作するCDI+Conversation Scopedで誤魔化すしか無いのである。

Conversation Scopedは会話(Conversation)の開始・終了を明示的に行わないといけないので、結構めんどくさいということと、どうやれば綺麗に開始・終了できるのかイマイチ成功例がわからなかったのであるが、やっぱり避けられなくなったので改めて何パターンか試してみた。これが一番綺麗かな? というのが見つかったので、メモ代わりに紹介しておく。これが使いこなせれば、継承とアノテーションを駆使してCDI上でViewScopedと似たことがJSF 2.1でも実現できるかも知れない。いやーさすがにこれは無駄な努力かなぁ・・・

※ちなみに本例ではFaceletをJSF 2.2仕様で書いているが、2.1仕様であればjsfc=”h:inputText”とかで書き換える必要がある。

※JSFの基本的な作り方については、先週発表のスライドにまとめてあるので、そっちば参照してはいよ。
http://www.slideshare.net/iwasakihirofumi/java-ee-7-jsf-22

とりあえず、ポイントは一体どこで会話をスタートさせるのか、だ。JSFの場合、Phase Listenerで制御が一応できるので、Pre Render Viewで引っかけて強引に呼ぶ例をWebで見つけた。他にもGetterメソッドを作ってFaceletの先頭で表示させるついでに#{bean.property}で強引に呼び出す方法もあるが、こっちの方がスマートかも知れないし、タイミングは早いから安全ではある。f:eventを書くのめんどくさいけど。

注意点としては、開始と終了の書き方はほとんど固定で、下記のように書くしかなさそう、という点だ。また、間違って2回conversation.start()が呼ばれると、前に格納されていた値は全消去されてしまうので、あくまで最初に1回だけ呼んでやる必要がある。ここを間違えると「?」な挙動になるので注意するべしである。

遷移画面(3画面)

index.xhtml –> confirm.xhtml –> completed.xhtml

Backing Bean (CDI)

package com.mushagaeshi.jsftest;

import java.io.Serializable;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@ConversationScoped
public class ConversationBean implements Serializable {

    private static final long serialVersionUID = 5792114893614101597L;

    // 会話制御のためのオブジェクトを挿入する
    @Inject
    private Conversation conversation;

    private String id;

    private String password;

    // 会話の開始メソッド。1頁目の先頭でf:eventにて強制的に呼び出す。
    public void initConversation() {
        // ポストバックでなくて、且つ、会話が開始されてなかったら開始する。
        if (!FacesContext.getCurrentInstance().isPostback()
                && this.conversation.isTransient()) {
            this.conversation.begin();
        }
    }

    /**
     * Creates a new instance of ConversationBean
     */
    public ConversationBean() {
    }

    // 1画面目でボタンが押された際のメソッド。書かなくても行けるけど念のため。
    public String clickNext() {
        return "confirm?faces-redirect=true";
    }

    // 2画面目でボタンが押された際のメソッド。書かなくても行けるけど念のため。
    public String clickConfirm() {
        return "completed?faces-redirect=true";
    }

    // 3画面目でボタンが押された際のメソッド。会話を完了させて遷移する。これで状態が消える。
    public String clickCompleted() {
        // 会話が開始されてたら終了する。
        if (!this.conversation.isTransient()) {
            this.conversation.end();
        }
        return "index?faces-redirect=true";
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

1画面目 (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:jsf="http://xmlns.jcp.org/jsf"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <!-- 強制的に会話開始をここで呼び出す -->
    <f:event type="preRenderView" listener="#{conversationBean.initConversation()}"/>
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Hello from Facelets
        <form jsf:id="form">
            <input type="text" jsf:value="#{conversationBean.id}"/>
            <input type="password" jsf:value="#{conversationBean.password}"/>
            <input type="submit" jsf:action="#{conversationBean.clickNext()}" valuie="submit"/>
        </form>
    </h:body>
</html>

2画面目 (confirm.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:jsf="http://xmlns.jcp.org/jsf"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h1>Confirm</h1>
        <p>#{conversationBean.id}</p>
        <p>#{conversationBean.password}</p>
        <form jsf:id="form">
            <input type="submit" jsf:action="#{conversationBean.clickConfirm()}" value="confirm"/>
        </form>
    </h:body>
</html>

3画面目 (completed.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:jsf="http://xmlns.jcp.org/jsf"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h1>Completed</h1>
        <p>Thank you, #{conversationBean.id}!</p>
        <form jsf:id="form">
            <input type="submit" jsf:action="#{conversationBean.clickCompleted()}" value="completed"/>
        </form>
    </h:body>
</html>

実行結果

1画面目。入力してみる。
Screen Shot 2013-11-18 at 10.54.04 PM

2画面目。確認画面。ちゃんと入力された値が表示されている。
Screen Shot 2013-11-18 at 10.54.15 PM

3画面目。完了画面。まだ入力された値は生き残ってる。下のボタンを押すと会話が完了し値が消え、1画面目に戻る。
Screen Shot 2013-11-18 at 10.54.26 PM

戻った1画面目。Conversationが再度startされているので、値は消えて再度状態が開始されている(つまり空っぽ)。
Screen Shot 2013-11-18 at 10.54.36 PM

こんな感じですね。これであればBacking BeanJava EE 6でも動くし、EE 7が出てもそのまま持って行ける。ただ、繰り返しになるがHTML friendly style tagsだけは違うので、やっぱりEE 7への移行の際には画面に影響があるのである。返す返すも無念である。

Java SE 8 Lambda式をNetBeansでちょっとだけ試してみた

昨日夜にあったJavaOne報告会福岡できしださんがJavaのLambdaをやたら詳しく説明してくれて頭がぐるぐるになってきた。

で、そういえば最近のJava SE 8のビルドで試してなかったなと言うのと、NetBeansの最新版がようやくSE 8に対応したと聞いていたので、最新のを落として試してみた。

スクリーンショット 2013-11-16 17.46.21

とりあえず、やってみるのはSE 8から拡張されるCollection Frameworkのlambda式対応拡張表現である。

package lambdatest;

import java.util.Arrays;
import java.util.List;

/**
 *
 * @author hirofumi
 */
public class LambdaTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        // Target
        List<string> list = Arrays.asList(new String[]{"a", "b", "c", "d", "e"});

        // Normal
        System.out.println("Normal expression:");
        for (String x : list) {
            System.out.println(x);
        }

        //lambda
        System.out.println("Lambda expression:");
        list.forEach(x -> System.out.println(x));

        //lambda with parallel stream
        System.out.println("Lambda expression with parallel stream:");
        list.parallelStream().forEachOrdered(x -> System.out.println(x));

        // parallelStream().forEach()すると順序がバラバラになるので
        // 特にJava EEではforEachOrdered()を使いましょう。約束だよ!!
    }
}

NetBeansの補完機能で、上記の「Normal」の部分に対して提案が出ていて、ポチるとLambda式に変換してくれるようになりました。んーいいんかな・・・

スクリーンショット 2013-11-16 17.58.52

これが

スクリーンショット 2013-11-16 18.00.03

こうなるのだ。下と大体一緒なので、賢いと言えるだろう。

実行結果はこれ。

run:
Normal expression:
a
b
c
d
e
Lambda expression:
a
b
c
d
e
Lambda expression with parallel stream:
a
b
c
d
e
ビルド成功(合計時間: 0秒)

さて、どうしても視点がEEになるのだが、これ実際に使えるかなぁ、というのが本音である。こんな感じで置換される機能がIDE側に付いちゃうと、使わざるを得ないのだろうけど、JavaのLambda式だけ見ると、単なるSyntax Sugarの否定のようにも見えて微妙なんだよなぁと思う次第である。C#のようにdelegate式が簡易に使えるわけでも無し。

Java SE、特にGUI系だと、C#やObjective-Cのように、method delegationが可能な言語だと書きやすいし、間違い無くよく使うのであるが、Java EEで使う所が果たしてあるのだろうか・・・と考えると、何となく微妙である。そもそも、匿名クラス表現をあんまり使わないというのもあるのだ。綺麗に書いた方がメンテナンス性は上だしね。「こんな複雑なコード書けた俺格好いい」系の自己中表現なんかは、エンタープライズ系開発では最も忌諱されるものなのである。そもそも。

だから、パッと思いつくのって、今回の例のように、Collection Frameworkの処理位なのかなと思ったりする次第である。しかも、parallelStream()使ったら、順序がバラバラになっちゃうので、早いけど困る事が多いから、多分使わない 順序守れます※。他にも何かあるのかな。EE 8が出てJPA辺りが完全対応したら、また面白い世界が待っているのだろう。どうなるかな。

※桜庭さんに「順序守れるよ!」って教えてもらったので上のプログラムと一緒に修正しました。(2013/11/16 20:15)

エンタープライズ系開発って何か変? いや、それはいま流行の方向と文化が違うと思って貰った方が良いかなと。これはこれで楽しいよ!

ところで、lambda式の中でアロー演算子(->)が使われてるのは微妙なのである。だってC++とかPHPのmethod callと一緒じゃんと。これはC++11に合わせたんだろうけど、そこだけは良いかなと思う。思うけど、Javaのlambda表現の本家ぽいC++がそもそもそういう表現を取り入れているというのもどうかなぁと思う次第である。C++14で変わる事は無さそうだし、暫くこんな感じなのでしょう。まあいいか。

JavaOne 2013 報告会 at 福岡 技術編

今頃書くな、という話ではあるのですが、JavaOne 2013報告会の2回目を福岡でやってます。丁度いまやってるので、事後報告ではあります(´д`)

JavaOne 2013 報告会 at 福岡 技術編
http://atnd.org/events/45326

スクリーンショット 2013-11-15 19.10.45

数日前に日本Oracle本社で喋らせて頂いたのですが、今年の5月、去年同じ場所で喋らせてもらった時と比較して考えても、現場の熱がだいぶ上がってきたなぁという感じがしています。

いろんな方から伺うのは、いまJava EEが凄いですね、という話です。延々やってきた身としては、ああ、そうなんだ、という感じではあります。が、感じとして似ているのは、J2EE 1.3が出た頃辺りかなと。

要するに、これから盛り上がりますよー、という前兆が見える状況にようやく至ったと考えるわけです。

いつもどっちかというと煽る側に立つ身としては、使えるものじゃないと煽ってもしょうがないよね、というのもあります。が、そもそも使えないものを煽るって酷いよね、という事もあり、J2EE 1.4やJEE 5は放置してきた経緯があります。

で、Java EE 6で超まともに育ったこの仕様の最新版ということで、EE 7のローンチ前よりEE 6っていいよ、と言い続けてきた甲斐があったものというものです。

そんでもって、いろんな方と今回会話させて貰う機会が多くあり、そこで何となく理解したのは、Java EE仕様の部分部分の情報はある程度みなさん共有できているものの、こうやったら上手く作れる、という知見については、やはり日本語書籍がほぼゼロという状況もあり、これからという非常に悲しい状況ではあります。

そのため、この会議では、特に誰もが弄ることが多いJSF 2.2について、NetBeansを使ってウルトラ超簡単な作り方のコツを1ステップずつやってみるものを作ってみました。

資料は先ほどできたばっかりで、これから発表(オラクルの寺田さんが現在発表中)なのですが、後ほどSlide Shareに掲載しようかと思ってますので、興味のある方は後ほどご覧下さいませ。

※追記 21:18
Slide Shareに上げました。

Java EE座談会に出ます

すっかりBlog更新するのを億劫がって放置してしまったのであるが、明日東京のOracleに呼ばれ、Java EE 6の座談会に出ることになった。これで3回目である。福岡より飛行機で行きます。

最新のJavaを3時間で知る!Java解説セミナー (受付終了)
http://www.oracle.com/webapps/events/ns/EventsDetail.jsp?p_eventId=170343&src=7863984&src=7863984&Act=31

この座談会のセミナーは既に受け付け終了してしまっているのだが、講演の様子は後日記事になるらしく、そこで參照していただければと。私も告知を知らなかったので案内出來ませんでしたことよ(×_×)

ちなみに前回・前々回のものは既にWeb記事になっているので、そちらを参照して頂きたい。

「Java EE 6導入を推進するうえでのポイントと導入効果」(前回のもの)
http://builder.japan.zdnet.com/sp_oracle/weblogic_2013/35036674/

なお今回はJavaOne 2013に参加した事や、Java EE 7ネタを入れたので前回と少し違う方向性になるのではと思う。思うだけなのでどうなるかは不明であるのだが、大筋はあまり変わらない予定である。

GlassFishの商用サポートが打ち切られるという衝撃的な発表が先日行われたが、その後に控えている多くのJava EE商用製品のEE 7対応版がいよいよ来年より登場してくると考えている。そろそろ手を付けても罰は当たらない(投資が無駄にならない)頃かなと思っているのだが、どうだろうか。大量なので一朝一夕に追いかけられないため、徐々にキャッチアップしていくのが賢い戦略であろう、と思う次第である。

祝! Java EE 7リリース

Java EE 7が遂に出た。実に目出度い話である。

EEとはEnterprise Editionである。つまり「企業版」である。企業システムに携わらない方にはなんのこっちゃら分からん話の可能性大である。

Screen Shot 2013-06-12 at 21.33.18

Java EEの歴史は混乱の歴史でもあるが、出てもう13年にもなるのでさすがに記憶が曖昧になってきた。忘れないうちに憶えている分だけメモっておきたい。

EE以前はWeb側がApache JServのServletとかNetscape Application Server (NAS)、サーバーサイドはWebLogic のEJB (一時期Tengahって名前だった)が主流ぽいけど、結局なんかよくわからん仕様がゴロゴロ出てきて、MicrosoftもIISでJava動かす荒技(もはや名前すら覚えていない)とかまあ、今のNoSQLみたいな状況であった。移植性? ゼロに決まってるじゃん、という。これはさすがに嫌だった。正直嫌だった。

最初のJava EE、当時はリリース直前に”Java 2 Platform”とかトチ狂った事を言い始めたどこぞのSunという会社がそれの企業版、ということで”Java 2 Platform, Enterprise Edition”つまりJ2EEという、Core 2 Duoみたいな醜い名前で登場した。しかもバージョン1.2。Java 2の2じゃないのかよ、という突っ込みは至る所で誰もが言っていた。このちょい前にJ2EEがProjectナンチャラって名前の頃、呉越同舟の同盟関係だったはずのMicrosoftを訴訟で追い出すというアホな事もしでかして、ついでに100% Pure Javaとかオレンジジュースみたいな宣伝までやってた、今思うと、自分自身の反省も含めて滑稽だなと思う次第である。

(その後MicrosoftはJavaのコピーをC#として出すことになるのだが、まあお互いコピーしまくってるからそれはそれってことで)

さて当時だが、J2EEの実行環境がSunのWebサイト(JavaSoftではもう無くなってた)で1999年の12月だったかに出た。当時としてはえらくサイズがでかかったのでよく憶えている。ダウンロードはしたものの、さてどうやって作ればいいのかさっぱり分からんという悲しい状況であったことは良い想い出である。程なくして、それはWebLogicと同類のものである、と判明するわけであるが、その統一規格であると見切るまでは暫く時間が必要だった。なんせ日本語の情報がほぼゼロだったからである。あったのかもしれんが、少なくともペーペーの私の所には届かなかった。

それからすぐ、今は亡きDBマガジンという雑誌に、たぶん国内初のJ2EE特集記事を書く千載一遇のチャンスが訪れ、その後にJavaOneに參加して生ジョブズをMac OS XのJava Swing対応のプレゼンテーションを見たり、Sunの本社とAppleの本社とをハシゴする等々、なかなかゴージャスな経験をさせてもらいながら、J2EEが実は企業アプリケーションの統一規格であることを体験しながら理解していかせてもらったりしていた。

そこで理解したのは「統一規格、いいじゃん!!」なのである。移植性担保ってかなり重要なのだ。ISO/IEC 12207 Software Lifecycle Processに非機能要件として入ってるでしょ、と。なので、それ以降今に至るまで、私のEEに対する理解は「統一規格」がベースなのである。

ちなみに、であるが、当時からCORBA分散モデルを忠実に移植しただけのEJB Entity Beanはゴミ扱いなので、まともな技術者は誰ひとり使っていなかった。これは事実である。私を含め、みんなオリジナルのDAOを作って使っていた。それを知らない連中が真面目にEntity Beanを使って「裏切られた!!」と吠えまくるのであるが、ご愁傷様、としか言い様がないのである。

その後、やはり今は亡き「JavaWorld」に寄稿しつつ、その間に登場する事になるJ2EE 1.3、1.4とおつきあいすることになるのだが・・・ちなみに私はEntity Bean=ゴミ理論当時からJavaWorldの連載で散々書いていた記憶があるので、贖罪の意識はない。

J2EE 1.3の目玉はJSPがやっとまともに使えるようになった(JSTLが追加された)、とかMessage-Driven Beanが使えるようになった(初期はEvent-Driven Beanとか言っていた)とか、あんまり良い想い出がないというか、1.2とあんまり変わらんのである。

J2EE 1.4は、これまたあんまり変わらんが、JAXPが付いたとかJAX-RPCが付いたとかあるけど、でかいのがゴミのようなJSFが突っ込まれて大ブーイングを喰らった記念すべきバージョンである。ここで分かったような分かってないような連中がやれSpringだ何だと大騒ぎしてグチャグチャになる訳であるのだが、いま思い返せば只の「第二のJ2EE」を作り出しただけであり、今や作り替えるにも難易度が高すぎる壮大なレガシー(≒死に逝く旧システム)そのものになっていることは、見知らぬ後輩のためにも記しておかねばなるまい。

さて、私はここでJ2EEに見切りを付け、さっさと.NET Frameworkのプロモーション等に携わったりと、まあ要するに1.0、1.1、2.0辺りとC#およびVB.NETを駆使していろいろ作っていた。何故なら、J2EEは暫くダメだろうと直感したからである。Javaプログラマーの単価がナイアガラのように急降下したのもこの辺だ。昔はJavaできるってだけで引っ張りだこだったのだが・・・

お陰で食いっぱぐれることもなく今に至れるのであるが、その代償として、この時期のJ2EEが良くわからんのである。SpringもStruts 2も真面目にシステムを作ったことがない。そんなもん使うより、ASP.NETとADO.NETを駆使してエレガントにVisual Studio使った方が100倍マシだと思っていた。今でも思う。

Visual Studioが出てきたので記しておきたいが、JavaのIDE(昔はRADと言っていた)は長らく定番が無く、非常に困り果てた歴史でもある。私自身もViVi -> WinCafe -> JBuilder 1.0 -> Visual J++ -> ForteForJava -> VisualAge for Java -> JBuilder 3.5~6.0 -> Eclipse 1.0~2.0 -> NetBeans(今)という流浪の歴史である。細かいところは忘れた。なんかWebLogicとかOracleのもあったような気がする。今はNetBeansで満足しているため、他に移るつもりは今のところ無い。

対してVisual Studioは選択肢がこれしかないし、出来も恐ろしく良いので考える必要がない。Javaメインだった頃は実に羨ましかった。実際やってみて、納得した。良い。

さて、そろそろJavaに話を戻そう。そして現職になりコンサルティングする立場からコンサルティングを受ける立場になり、そしてJavaが戻ってきた。いや、戻したというのが正しいかもしれない。それは頭が割れそうになるくらい散々考えた末である。

そして戻ってきたときにはJ2EEはいつの間にかJava EEになっていた。5である。1.が抜けた。5だよ5。そしてテストとしていろいろ作ってみた。特にJSF -> EJB -> JPAの流れであれやこれや頑張ったのであるが、結論としては「これは厳しい」である。それまで使い込んできた.NETに比べて、圧倒的な力不足感と、半端ない「考えてなさ」感。JSFはだいぶマトモになった。が、ベースがJSPであることの恐ろしい制約がもうダメだと思った次第である。

そしてその5の末期であった。ダメだと思ったとたん、Java EE 6が出た。GlassFish 3.0も一緒に。

そのときの直感は「やっと標準機能だけで作れるようになったか!!」だ。

長らくEE仕様は1.2から1.3、1.4、5に至るまで、どれひとつとして標準機能だけでは満足にシステムを作れなかった。Web系フレームワークではStrutsが必須であった。他のでも良かったが、みんなStrutsを使っていた。あとはApache Jakarta Commons。今となっては無用な制約でしかなく狂ったような依存関係になる元凶としか見なせない対象だったりもするが、当時は救世主でもあった。

が、EE 6ではJSFのベースがFaceletになり、JAX-WSも付き、EJBにCDIが入り、JPAも良くなった。何より良かったのがNetBeansである。こいつとGlassFish 3とMavenとの連携はまさにVisual Studioに匹敵するか、もしくは部分的に凌駕しているものであった。いや過去形ではなく現在形である。

で、EE 6から本格的に復活した。昔のようにアホみたいに作りまくる生活に戻ったのである。違うのは、余所様のを作るのか、自社システムを作るのか、だけ。大きな違いではある。JavaOneにも10年振りに復帰した。今年も行く予定である。

ここでEE 7の登場である。中身を見ると、JSFの改善が著しい。というか最初からこれを出しておいてよ!! と絶叫しそうなくらい、改善が凄い。案の定文献が無い状況であるが、最初のJ2EE 1.2も同じ状況であったので、毎度の話である。むしろ現地JavaOneで昨年、事前に情報が得られただけ10倍マシである。Batch Frameworkとか謎仕様がてんこ盛りであるが、実際の企業システム構築で使えるようになるまで暫く時間があるため、その間に樣々試そうと思う次第である。

さて、NetBeans 7.3.1と一緒にダウンロードすることにしよう。プロジェクト作成の時には「Mavenプロジェクト > WAR」の一択であるため、そこだけ間違えなければ素敵なEE 7ライフが待っているはずである。

※画像のリンクがGlassFishになってなかったので修正しました。けど、NetBeansをダウンロードしたら一緒にインストールできるので、開発用途としてはまずNetBeansをダウンロードする方が賢いと思いますよ。