JJUG CCC 2013 FallでJSFの話をしてきた

11月9日(土)に日本Javaユーザーグループ主催のクロスコミュニティカンファレンス 2013 Fall(JJUG CCC 2013 Fall)が開催されました。


今回も前回に引き続き、Call for Papersが実施されていたので、
JSFの内容で応募したら採用されたので登壇してきました。


思っていたよりも多くの方に来ていただき
JSFに少なからず興味を持ち始めてきた方も増えてきたんだなと思いました。
JSF普及活動の成果でしょうか。


登壇で使用したスライドです。


○スライドの補足
私が試した時はweb.xml記載しなくても動いた気がするんだけど
きしださんからやってみたら駄目だったといわれた。


idに「:」があるのでjQueryと相性悪いと書いたけど、キクタローさんが解決策書いてくれた。
http://kikutaro777.hatenablog.com/entry/2013/11/10/000606


JSFは用途を選べばかなり力を発揮するのですが、
昔のイメージが強くアンチユーザも多いので
その辺が払拭できたら良いなと思います。


以下、会場で頂いた質問への回答。


・JSF2.2で導入されたステートレスモードでパフォーマンスは改善するのか。


私が試した限りではステートレスモードのONとOFFで
ほとんどレスポンス速度は変わりませんでした。


JavaScriptゴリゴリ使いたいって人やステートフルが嫌いな人とかがいますがその場合JSFでどのように対応できますか


JavaScriptについては制限される部分もありますが、制限されない部分もあります。
JSFコンポーネントという仕組みがあるので
JavaScrip+JAX-RSで作ったゴリゴリ動的なコンポーネント
使う人はJavaScript知らなくても埋め込めば使えるみたいなこともできるので、
使い方次第ではおもしろいことができると思います。


ステートレスが好きな人への対応はなかなか難しくて(生理的に無理的なところがあり)
ステートレスモードはありますがそれにも限界があります。
JSFではステートフルだから劇的に作りやすいという部分もあってトレードオフだと思っています。
ステートレスで問題になるのは負荷分散があるからであって
複数サーバがある場合は問題になりますが、
サーバ1台しかないのにステートレスがっていうのはちょっと違うかなと思います。
昔は私もステートレス好きだったのでJSFの簡単さを知れば
心変わりすることもあるかもしれません。


JSFJavaScriptを使用していますか


実際JSFを使ってみるとわかりますが、ヘッダーでjsf.jsというファイルがロードされていてJSFで使用されるJavaScriptが記載されています。プレゼン資料でも触れていますが、一部仕様として提供されているJavaScriptのインターフェースもあるので、気になる方はソースなど読んでみると良いと思います。


だいぶJSF悪くないよというのも浸透してきたところだし、
そろそろJSF以外の話もしていこうかなと思います。

かんたんかんたんJSF

先日登壇したセミナー参加者のアンケートでは、皆さんJSFにあまり興味が無い感じでした。発表的にはJSFの内部的な話のつもりだったのでJSFを知らない人にはちょっとわかりにくかったかなと思います。


そこで、初心者がJSFって簡単にアプリ開発が出来るんだなってわかりやすいようなスライドを作ってみました。



JSFStrutsやSpring MVC等のアクションベースの開発ではなくコンポーネントベースの開発になるので、URLやHTTPの事をほとんど考えずに、シンプルに画面とロジックの事を考えた開発が可能です。


JSF2.0からはXMLもほとんど不要でこのように開発が出来るので、JavaでWEBアプリケーションを開発する選択肢としてJSFに少しでも興味を持ってもらえればと思います。

今から始めるJava EE 7解説セミナーでJSFの話ししてきた

若干飛び入りな感じでしたが、今日は機会を頂いて
今から始めるJava EE 7解説セミナー
でJSF2.2 & CDI & ELの話をしてきました。


f:id:den2sn:20130822130041j:plain


このセミナーは夏の二大Javaセミナーということで
技術者向けのセミナーとマネージャ向けのセミナーが
平行して開催されるというちょっと面白い開催方法のセミナーでした。


私はもちろん技術者向けの方でお話させて頂いたのですが
170名の応募枠が満員になるほどの盛況でとても緊張しました。


セッションの資料や中身についてはOracleさんの公開範囲におまかせして
今回は特にこういったセミナーで登壇するということのメリットについて
とても感じる事があったのでそのことについて書いてみようかと思います。

登壇する事の意義


こういったセミナーなんかで前で話す事で
もちろん今回だと170名以上の方に私の事を知ってもらえるという
メリットがあるんだと思います。


でもそのメリットって直近では実際そんなに実感出来てはいないんですよね。


じゃあ今回どんな直接的なメリットを感じる事が出来たかというと
やっぱり他の登壇者と交流できるというのがとても大きいんだなと思いました。


こういうセミナーだと複数人の方が登壇される事が多いですが
やっぱり登壇者同士というのは登壇者と参加者という立場より
格段にコミュニケーションをとりやすいんです。


例えば、今回だとNTTコムウェアの上妻さんと
時間がなかったのでコンビニに行って買ったサンドイッチを
一緒に食べながら技術の話が出来たりとか、


セミナー後にお誘い頂いてJavaエバンジェリストの寺田さんや
アリエル・ネットワークの井上さんとお話を頂く機会を得る事が出来たりとか


そういうすごい人たちとお話しさせて頂いていろんなことを
吸収出来る機会が得られるんです。


登壇って私でも出来るくらいなので頑張ればなんとかできるもんなんだと思います。
私とかだとJSFずっと使っているので1/100人くらいの知識を
1つの分野でも頑張って身につければなんとかできる。


でも登壇する人の中には何百ページのJavaの本を書いちゃうような
1/1000人とか1/10000人とか下手すると1/1億みたいなすごい人も
いるわけですよ。


そういった人たちにちょっとでも近づけるというのが
こういったセミナーで登壇する意義というかメリットなんだと思いました。


寺田さんもセミナー内でもこういった場で話してみたい人がいれば言って下さいとおっしゃられていましたが、
みんなもっと勇気出して積極的に前に出て話してすごい人達と話していろんなものを吸収すれば良いんだと思います。

登壇内容の記事

登壇内容が記事になったみたいです。

Java EE 7は何がどう新しくなったのか? 習得の近道は?──先行者からのアドバイス - builder by ZDNet Japan
http://builder.japan.zdnet.com/sp_oracle/weblogic_2013/35037372/

Java EE 7でさらに使いやすく、便利になったJSF 2.2、CDI 1.1、EL 3.0の主な強化ポイント - builder by ZDNet Japan
http://builder.japan.zdnet.com/sp_oracle/weblogic_2013/35037740/

・発表スライド
http://www.oracle.com/technetwork/jp/ondemand/java/whatsnewjsf22-cdi-el-2014283-ja.pdf

Javaのライブラリを作成してからMavenセントラルリポジトリに登録するまで

Cacoo4JというJavaのライブラリを作成したので、オープンソースとして公開してMavenセントラルリポジトリに登録するまで一通りの作業をやってみました。
そこで備忘録的にJavaのライブラリを開発してからMavenセントラルリポジトリに登録するまでに私がやった作業の流れを残しておきたいと思います。

作業の流れ

ライブラリの作成

これをやらないと話が始まりません。私はCacooというサービスのAPIを簡単に呼び出せるJavaのライブラリを作成しました。たしかJava Day Tokyo 2013当たりのツイートでCacoo4J無いよねってのを見たのと、昔CacooのOpenSocialガジェットを作った事があってCacooのAPIの知識があったので簡単に作れるんじゃないかなと思ったのがきっかけです。


作ったライブラリは最終的にMavenのセントラルリポジトリで公開したいのでNetBeansMavenプロジェクトとして作成しました。

ライセンスやコメントの記載

自分で使う分にどんなソースでも良いのですが、オープンソースとしてライブラリを公開するにはライセンスやコメントの整理を行わないといけません。私はオープンソースで公開する時はだいたいMITライセンスを選択するのですが、今回はTwitter4Jに合わせてApache License 2.0.にする事にしました。プロジェクトフォルダにLICENSE.txtを配置してソース全部のヘッダにライセンスの表記を追記しました。


あと本当はJavaDocのコメントとか丁寧に書くんですが、日本語で書くのもあれだなとか英語苦手だなと思っていたら結局何も書いてません。すみません。使い方そんなに難しくないので勘弁して下さい。

GitHubに公開

オープンソースであればほぼ制限無いGitHub素敵ですよね。アカウントは既に持っていたのでcacoo4jのリポジトリを作成してソースをpushして公開完了。


https://github.com/den2sn/cacoo4j

ドメインの購入

ドメインの購入は必須では無いですがライブラリ用のサイトを作成したかったのと、MavenのgroupIdにドメイン名を使いたかったので、ドメイン「cacoo4j.org」を購入する事にしました。お名前.comでドメイン購入。1年間で980円なのでまあ安い買い物です。

GitHub Pagesでサイト作成

GitHubにはGitHub Pagesというものがあって開発者のサイトやリポジトリのサイトのホスティングもやってくれるんですね。素敵すぎます。GitHub PagesのAutomatic Page GeneratorでREADME.mdをまるっとサイト化して購入したcacoo4j.orgドメインを設定しました。


http://cacoo4j.org/

Mavenセントラルリポジトリに登録

ソースも公開してサイトも作成したので最後にMavenセントラルリポジトリへの登録です。Mavenセントラルリポジトリへの登録はいろいろと手順やルールがあってややめんどくさかったですが大まかには以下のような流れで作業しました。


・Sonatypeのアカウントを作成する
・jarファイル署名用にpgpで鍵を作成(pgpMacPortsでインストールしました)
・SonatypeにIssueを作成する(このチケットでリポジトリ作成のやりとりをする)
・Sonatypeにモジュールのデプロイ
・Issueに完了報告
・問題無ければMavenリポジトリに反映される


以下のサイトを参考に試行錯誤しました。


http://samuraism.jp/diary/2012/05/03/1336047480000.html
https://sites.google.com/site/yasuda/maven/appendex-mavensentoraruripojitorini-gong-kaisuru


一番問題になるところはpom.xmlにいろいろと情報や設定を書く必要があるのでその点が苦労するのかなと思います。
私はJavaDocやソースのjarもリリースする必要がある事に気づかずにそのままモジュールだけリリースしそうになりました。maven-source-pluginやmaven-javadoc-pluginを追加してJavaDocとソースもリリースすする必要があります。

参考までにcacoo4jのpom.xml


https://github.com/den2sn/cacoo4j/blob/master/pom.xml


Issueのチケットは


https://issues.sonatype.org/browse/OSSRH-6861


です。

ということで

一度は一通り流れとしてやっておきたかったのでちょうど良い機会になりました。

Cacoo4jをMavenセントラルリポジトリに登録しました

Cacoo4jをMavenセントラルリポジトリに登録しました。
これでMavenを利用しているアプリケーションから簡単にCacoo4jが利用出来るようになりました。
pom.xmlに以下を追加して下さい。


pom.xml

<dependency>
    <groupId>org.cacoo4j</groupId>
    <artifactId>cacoo4j</artifactId>
    <version>1.0.0</version>
</dependency>


JavaからCacooのAPIが簡単に呼び出せるのでCacooのサービスを利用していて興味がある方は使ってみて下さい。


Cacoo4j
http://cacoo4j.org/


Cacoo
https://cacoo.com/

ここがイイヨ!! Java EE 講座でインタビューして頂きました

会社員になってからほとんどJavaの開発をやっている私ですが、ここ1,2年は特にJavaの情報発信やセミナーへ参加するように心がけています。
その活動のおかげでOracle様よりお声掛けいただいてJava EE 講座というWebの特集記事でインタビューをして頂きました。


ここがイイヨ!! Java EE 講座
第3回:アイエックス・ナレッジ株式会社の加藤田益嗣氏に聞くJava EE のおススメ!!
http://www.oracle.com/technetwork/jp/articles/java/ja-topics/java-articles-1981229-ja.html

なかなか自分がいままでやってきたことを振り返る機会は無いのでとても良い機会になりました。


仕事ではJavaに限らず他の言語も使用した開発も行っていますが、一番長くやってきただけにJavaには一段と思い入れがあります。


今後もJavaがさらに良いものになるように、わずかながらでも協力できればと思っています。

JSF2.2のステートレスビュー

JSF2.2のビックチケットの1つとしてステートレスビューという機能が導入されています。
これは今まで常識だったJSFはステートフルという概念を覆す機能です。


今までJSFでは初回リクエストから次のリクエストまでの間に
画面のコンポーネントツリーをセッションスコープもしくは
クライアントのhiddenに保持する必要がありました。


しかし今回導入されたステートレスビューでは
サーバに再リクエストが来た際にコンポーネントツリーを再作成するという方法で
コンポーネントツリーを保有する必要がなくなっています。
そのためサーバメモリーをまったく使用せずにJSFを利用することができるようになりました。


ステートレスビューを有効にするには画面全体を
transient="true"属性を付けたf:viewタグで囲むだけです。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <f:view transient="true">
        <h:head>
            <title>title</title>
        </h:head>
        <h:body>
            <h1>JSF Stateless mode</h1>
        </h:body>
    </f:view>
</html>


生成されるHTML内のViewState値には「stateless」という固定の文言が出力されるようになります。

<input type="hidden" name="javax.faces.ViewState" value="stateless" />


マネージドビーンをステートフルに設計してしまうと結局
サーバのセッションを使用してしまう事になるので、
完全にサーバをステートフルに保つということは難しいかもしれませんが、
コンポーネントツリーだけでもステートレスになる意味は少なくないかと思います。


今までJSFはステートフルが必須だったために
サーバをステートレスに保ちたい人たちに嫌われる傾向がありましたが
この機能の導入によりそれが解消されていくかもしれません。


パフォーマンスの面からみても向上するような結果が出ているようです。


・Stateless JSF ? high performance, zero per request memory overhead
http://www.industrieit.com/blog/2011/11/stateless-jsf-high-performance-zero-per-request-memory-overhead/


ただし注意点として、ステートを保有するようなコンポーネントが使用できなくなってしまったり
マネージドビーンの@ViewScopedが使用できなくなってしまうという弊害があるようなので
利用には十分注意が必要です。