Quantcast
Viewing all 134 articles
Browse latest View live

Java Day Tokyo 2015でJSFについてお話させて頂きました #javadaytokyo

昨日、有楽町の国際フォーラムで開催された「Java Day Tokyo 2015」に参加しました。

ブログをほじくりかえしてみたら、今年で3回目の参加(^^;時間の流れがはやいなぁ。kikutaro777.hatenablog.com
kikutaro777.hatenablog.com

今回のイベントでは、なんと…セッションでスピーカーを担当させて頂く機会を頂きました(^^;汗汗汗

今年はJavaが誕生して20周年という記念すべき年で、そんな年に自分なんぞが発表させて頂いていいものか、悩みもあったのですが…せっかくの機会ですし、前向きに考えて挑戦させて頂くことになりました。

発表は「Java EE 開発における JSF の活用について」でした。

普段仕事で使っているJSFに関して、(少し大げさですが)自分の持てる知識を全て出した感じです(^^;;

なお、資料に出てくるコードは全てではないですがGitHubのほうにもあげました。あまり準備時間がとれず、少し雑なコードだったりするのですが…今後少しずつ整備・追加していくかもしれません(特にスコープの所とか)github.com

Togetterもまとめて頂いてましたm(_ _)mtogetter.com

あとは感想などをつらつらと…。

発表準備

お話を受けたものの、開発の佳境やら何やら色々な仕事が重なってしまい……

調整能力が必要だなぁ、と痛感する日々でした。

後悔はしたくない、と出来る限りの時間を割きましたが、発表練習がほとんどできず、当日の喋りは微妙だったかと思います(-_-;少し悔しい感じです。

来週納品です。

他のセッション

基調講演の途中時間で接続確認やリハがあったので、基調講演をあまりちゃんと聞けませんでした(*´Д`)

その他のセッションも、自分の発表に向けた緊張がすごくて、スピーカー控室で練習してたり、ほとんど聞けずじまいでした(*´Д`)

自分の発表が終わったあとは気が楽になったので、楽天の岩崎さんのセッションを聞きにいきました。

岩崎さんのお話は力があって、いつも聞いていて楽しいです。私はStrutsや昔のJ2EEを全く知らないのですが、その辺りをよくご存じの上で比較しつつお話されるため、Java EEってホント進化してきてるんだなぁと改めて。

楽天さんがJSFのエキスパートグループに参加されてるのもすごいですね(^^)今後も色々と楽しみです。

おまつり

最後は大山さんと寺田さん司会の元、Javaのクイズ&LTがありました。

Javaはコミュニティが大事、ということで、名刺3枚を回りと交換という所から始まるという(^^;

めっちゃ楽しい時間でした。大山さんが楽しそうにJavaのあれこれを語るのは、みてるだけで楽しいですね。

そしてツッコミ所があるとすかさずツッコミを入れるJavaチャンピオンの櫻庭さん(^^;

こうした方々がずっと昔からJavaコミュニティを支えてて今に至るんだろうなぁー、20年ってすごいなぁと。

LTも1つ1つがとても印象的で良かったです。

勉強会やコミュニティに参加して、色々変わった、というのは私自身も同じなので、@syobochimさんやJava女子部の方、@zephiransasさん、@irofさんのお話は、それぞれとても共感するものでした。

懇親会

最後は東京駅近くのお店へ移動して、懇親会に参加させて頂きました。

ロジ子さんとお会いできて感動(^^)

Dukeケーキ!

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150408212615j:plain

寺田さん櫻庭さんによるケーキ入刀でこんな姿にw

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150408213503j:plain

大盛り上がりでした(^^)

じゃんけんでDukeキーホルダーゲットしました!そして、懇親会のお土産としてチロルチョコも!

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150409141300j:plain

発表疲れもありましたが、吹っ飛ぶくらいに楽しかったです(^^)

これからもがんばろー。


JJUG CCC 2015 Springに行ってきました

昨日、ベルサール新宿グランドで行われたJJUG CCC 2015 Springに行ってきました。

JJUG CCC 2015 Spring(4月11日開催) | 日本Javaユーザーグループ

今や色んな方が参加レポとか書いてるからいいかなーと思ったのですが、振り返ってみると過去に参加した回で全て書いてたので…軽めですが書いておこう(^^!

  1. JJUG CCC 2012 Fall参加 - Challenge Java EE !
  2. JJUG CCC 2013 Springに参加しました~! - Challenge Java EE !
  3. JJUG CCC 2013 Fallに行ってきましたー - Challenge Java EE !
  4. #JJUG_CCC Spring 2014で「初めての Java EE 開発から学んだこと」というタイトルで発表させて頂きました! - Challenge Java EE !
  5. JJUG CCC 2014 Fallで感じたJavaの熱気 - Challenge Java EE !

セッションの発表資料などはこちらのブログでまとめられていました(>_<)はやい。後々、JJUG CCC 2015 Springのサイトにもあがる…かな。d.hatena.ne.jp
初参加から数えて今回で6回目でした。申し込みが1000人を超えていたとのことで、確かに今まで参加した中でも一番人が多かったです。

日本Javaユーザーグループ総会

JJUG会長の鈴木雄介さんから1年の活動報告がありました。
最初、いきなりの「Java!」連呼の挨拶にびっくり(^^;;

毎月行われるナイトセミナーや地方派のイベントなどなど、ホント活発な活動されているなぁと改めて。

CCCの参加者も初参加、という方の多さにびっくり。

新任幹事さんの紹介もありました(^^)

日本のJUG、益々大きくなっていきそうですね(^^)

Java 20年史

基調講演で、JJUG副会長をされている河村さんからお話がありました。

今年20歳となったJavaを振り返るもので、私自身はここ数年での関わりだったので、改めてまだまだ知らないことがあるなぁーと思って聞いてました。

紹介されていたAlan KayさんのThe best way to predict the future is to invent itという言葉が刺さりました(^^;

Java with Raspberry Pi

基調講演の2つ目はOracleのStephen Chinさんによるものでした。

参加者を楽しませるプレゼンのストーリーの流れ、魅せるデモ。ホントすごかったです。

おいしいコーヒーをJavaによって作ったり、ラインの上を正確に走るおもちゃの車をJavaで動かしたり、JavaのCADで3Dプリンタ使ってモノを作ったり…短い時間でJavaの可能性や魅力をたくさん紹介されていました。

冒頭Raspberry Piは持ってる?と質問されていて、私の場合は以下だったのですが…(^^;


また買います!

F-1 だれも教えてくれないJavaの世界。あと、ぼくが会社員になったわけ。

午後イチはきしださんのセッションへ。前半はJavaエンジニア養成読本Image may be NSFW.
Clik here to view.
で書かれていた話+αという感じで、丸レクとか知らなかったお話も聞けました(^^)後半はフリーランスから会社員になられた背景や経緯をお話されていて、なるほど…と非常に興味深かったです。

AB-2 Web開発における最新テスト手法

会場が超満員でした。やはりWeb開発でのテストって皆が気になるテーマなんだなぁと。テストの観点とかやり方など色々参考になりました。
AssertJとか知らなかったので触ってみたい。

AB-3 大規模な負荷でもドキドキしない為のJava EE

個人的に今回一番盛り上がったセッションでした。そもそもB to CなシステムでJPAを利用されてる時点で「すげー」って高まる感じが(^^;
前半は負荷テストのお話で、後半はJPAによるスケールアウトのお話。

自分も負荷テストではJMeterを利用していますが、独立したツールとしてずっと使ってたので、Mavenと統合したり、CIに組み込んだりのお話がすごく勉強になりました。

JPAのほうもEclipseLink使ってますが、そんなことできるんだ!的なことばかり(^^;どうやって調べられているんだろう。すごい。

スライドも綺麗だし、使われる写真も内容や言葉にあうもので、プレゼン自体も勉強になりました。

G-4 なたとAndroid!? 今すぐダウンロード!〜Android開発で変わる SIerのJava技術事情について〜

こざけさんの発表が聞きたくて参加しました。「XXってあれやろ、オレのXXみせつけてやるわー」で各所始まるのが面白くて最高でした。

笑いポイントだけでなく、発表内容自体もすごく面白くて、自分はAndroid開発やったことないのですが、やってみたくなりました。

とりあえず今度、趣味でAndroid Studio触ってみたいと思います!

G-5 Grails 第3章 進化したSpring-bootベースフレームワーク

どれ聞くか迷ったのですが、Grailsのセッションへ行きました。
そもそもGroovyを触ったことないので、色々知らなくてついていけない所が多かったですが、お話が面白くて楽しかったです。
下位互換性とか大変そうに感じたのですが…今から使うならいいのかな(^^;あまりあちこと手を広げられないので、Grailsはまたかなー。

参加したセッションは以上で、今回はここで引き揚げて懇親会も参加せず、でした。

初参加の方も多かったとのことで、懇親会行けば良かったなぁ…という気持ちもありつつ、最近堀北さん以来にどハマりしている乃木坂46の期間限定カフェの参加チケットが当たったので、そちらにいっていました(^^;

JJUGナイトセミナ 「Javaのプログラムはどうやって動いているの?」に行ってきました

今回のJJUGナイトセミナ、会社の後輩と一緒に参加させて頂きました。会場着いたら他の部の後輩も来ていたりして、社内でも参加する若い人が徐々に増えてきて良い感じ(^^)

jjug.doorkeeper.jp

既に参加レポも。はやい(^^;

shzero5.hatenablog.com

mike-neck.hatenadiary.com

ツイートはOracle ACEの@yamadamnさんにてTogetterへまとめられています。ご本人はお仕事で参加しておられないのに…本当ありがたやありがたやm(_ _;m

そして早くも当日の動画も@yusukeさんよりYouTubeにアップされています。はやい(^^;;

スライドも公開されてます!

www.slideshare.net
www.slideshare.net

既にこれだけ揃っているので、内容にはあまり触れる必要がない、、、(^^;;ので以下感想を。

まだまだ知らないことだらけ

今日JVMやGCの話を聞いていて、まだまだ知らないことだらけだなぁと改めて刺激を受けました。

Javaを始めてから今までを振り返ると、Javaの文法やライブラリ、Java EEを使ったWebアプリ開発に関しては、仕事を通じてある程度は学んできたと思います。

でも、今日のように「Hello World」レベルのコード(プレゼンでの実際の例はmainメソッドが足し算するメソッド呼び出すもの)を例にしても、それがどのような過程を踏んで、内部的にどんな順序で何が実行されるのか?自分ではあんなレベルでちゃんとは説明できないなぁ、と(>_<;

JVMやGCに関しては、以前に以下の連載記事

gihyo.jp

を読んで、解説がわかりやすいな~と概念や言葉はある程度把握していましたが、今日改めてアニメーションによる解説などをみて「あー、なるほど」となった部分も多々(^^;;要するにちゃんとわかっていなかったのだとわかりました(記事の問題ではなく自分の問題です)。

仕事では暫くJava使うでしょうし、もっとJavaのこと深く知りたいなぁと思いました。

来週あたりチームメンバ集めて、NetBeans使わずにコマンドラインからコンパイルしたり、javap使ってみたり、色々やってみようかなー。

プレゼンについて学ぶ所が多い

個人的にですが、今日の発表は「頭にイメージが残る」内容だったなー、とすごく感動しました(@skrbさんのプレゼンは毎回感動するのですが(^^;)

帰りに後輩とも話していたのですが、バイトコードの解説の中にあったスタックのイメージであったり、GCの挙動など、非常にわかりやすいアニメーション(+効果音までw)で頭にイメージとして残りました。

スライドの背景も、意味を連想するような写真が1枚1枚選ばれていて(スタックではマカロンやジェンガとか、GCではゴミ捨て場みたいなのとか)、、、あのスライド画像を揃えるだけでどれくらい時間がかかるのだろう (;゚Д゚)と思ったり。ジェンガに数字つけたりとかホント細かい心遣いが(^^;

発表の流れとか含めて学ぶ所が多くて、刺激になります。刺激受けてばかりで、自分で上手く実践できるようにならないと…なのだけど(^^;;

女子部

最後に紹介がありましたが、Java女子部も色々活発に活動されているとのこと!

Java女子部 | Doorkeeper

自分の今のチームにいる女性エンジニア2名(今日ナイトセミナ一緒に参加した後輩も)も初回のお悩み会や10月に女子部のラムダ行ったり、その後もテーマによって参加してて、楽しそうです。



色々がんばろうー

Windows Server 2012 R2でGlassFish 4.1のサービス登録に失敗した

Windows Server 2012 R2にGlassFish 4.1をサービス登録しようとして

asadmin create-service

と管理者権限で行ったのですが、以下エラーになりました(domain1の指定有無でも同じ)。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150427180344j:plain

Error while trying to install GlassFish as a Windows Service.
The return value was: -2146232576.
STDERR:
STDOUT:
Command create-service failed.

前にWindows Server 2008 R2とGlassFish 3.1.2.2ではなかった気が…と思いながらぐぐってみたら以下.NETがいるよ、的な情報が。ただ、以下はGlassFish 3.1の話なのと、入れようとした環境では.NET Framework 4.5はインストール済みなのだけど。。。

[GLASSFISH-14057] .Net is a prerequisite for create-service - Java.net JIRA

と、試しに.NET 3.5を入れました。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150427181010j:plain

で、再度コマンド入力したら、サービス登録成功しました。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150427181059j:plain

上記終わってからたどり着いたのですが、日本語の情報もありました。

sakaisusie.hatenablog.com

上記サイトでは「WindowsXPなら.NET Framework 3.5」もインストールしておく。」とありますが、サーバOSでも入ってなければ必要っぽいですね。

JSFのURLをきれいにするPrettyFaces

GW中、久しぶりにCore JavaServer FacesImage may be NSFW.
Clik here to view.
の本を改めて読み返していたのですが、RESTful Navigation and Bookmarkable URLsの章で「pretty URLs」という表現があることに気づきました。

かわいいurlって何?と思ったのですが、Alcで調べると、prettyには「きれいにする」という意味があるようです。eow.alc.co.jp

本の文脈的にもこれっぽい。。。で、本の中には

Currently, JSF does not have a standard mechanism for producing or consuming "pretty URLs", but since JSF 2.0, there is support for GET requests.

と記述があって、Bookmarkableな仕組みの話につないでいました。

で、そういえばPrettyFacesというライブラリがあったなぁと。

PrettyFaces

前にPrettyFacesを知ったときは、PrimeFacesやIceFacesのようなリッチコンポ―ネントの1つなのかなー?ぐらいの感じでスルーしてました(^^;; が、上記の意味を知って、改めてみてみたらJSFにおけるURLを色々と使いやすくするものでした。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150507223224j:plain

サイトTopページに

PrettyFaces is an OpenSource URL-rewriting library with enhanced support for JavaServer Faces – JSF 1.1, 1.2 and 2.0 – enabling creation of bookmark-able, pretty URLs. PrettyFaces solves the “RESTful URL” problem elegantly, including features such as: page-load actions, seamless integration with faces navigation, dynamic view-id assignment, managed parameter parsing, and configuration-free compatibility with other web frameworks.

とあります。JSFで"RESTful URL"…!?

気になったので、ちょっと触ってみました。

mavenのpom.xmlで以下追加しました。

<dependency><groupId>org.ocpsoft.rewrite</groupId><artifactId>rewrite-servlet</artifactId><version>3.0.0.Alpha6</version></dependency><dependency><groupId>org.ocpsoft.rewrite</groupId><artifactId>rewrite-config-prettyfaces</artifactId><version>3.0.0.Alpha6</version></dependency>

WEB-INF配下に「pretty-config.xml」というxmlを追加します。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150507223528j:plain

今回はxmlを利用しましたが、アノテーションベースでも書けるようです(試してないです)

URLのマッピング

JSFでベタにWebアプリを作成すると、以下のようなURLになります(facesはservlet-mappingで変更可能+ここの例ではxhtmlを利用を前提としてます)

http://localhost:8080/PrettyFaces/faces/login.xhtml

PrettyFacesでは、これを

http://localhost:8080/PrettyFaces/login

と以下定義によってマッピングできます。

pretty-config.xmlの定義

<url-mapping id="login"><pattern value="/login" /><view-id value="/faces/login.xhtml" /></url-mapping>

Path Parameters

PrettyFacesのDocumentationでは「3.2. Add Path-parameters to your mapped URL (REST)」のタイトルにあるようにRESTとして紹介しています。

http://localhost:8080/PrettyFaces/faces/product/order.xhtml

http://localhost:8080/PrettyFaces/product/ここにパラメータ

のようにマッピング。JSFのViewParamで取れるとのことで

<h:body><h:form><f:metadata><f:viewParam name="id"value="#{orderBean.id}" /></f:metadata><h:outputText value="#{orderBean.id}" /></h:form></h:body>

のように記述。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150507230638j:plain

サンプルそのまま書いてしまった(^^;けど動きました。ためしに「book」というパラメータにすると

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150507230734j:plain

pretty-config.xmlは以下です。

<url-mapping id="order"><pattern value="/product/#{id}" /><view-id value="/faces/product/order.xhtml" /></url-mapping>

なお、直接EL式でバインドも可能なようで、次のような設定でも動きました。

<url-mapping id="user"><pattern value="/#{userBean.user}" /><view-id value="/faces/user/user.xhtml" /></url-mapping>

他にも色々と機能あるようなので、もう少しみてみようかなぁ。

JSFではServletやJAX-RSを比べて、URLを意識した設計をすることはあまりないと思いますが、その辺を結び付けたいときには使えるのかも。相性が良いかは置いておいて。

また、今回はお試しレベルにすぎず、実戦投入してるわけではないので、ご注意を(^^;

ガッツリJava EEで作られたZEEF.COM

少し前にJava EE 8に関する情報が色々まとまっていて、ウォッチするのにいいなぁと思ったページがありました。

javaee8.zeef.com

それで「ZEEF」って単語を何となく覚えていたのですが昨日Twitterで

というのをみて「え!WildFlyで動いてるの!?」とびっくりしました。で、さらにびっくりしたのは、なんとこのサイト、フロントがJSFで作られているっていう。

トップ画面の上段にオートコンプリート付きのテキストボックスあるんですけど
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150515225008j:plain

この辺はPrimeFaces使ってるっぽいです!
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150515225038j:plain

昔、@aoetkさんが

aoe-tk.hatenablog.com

で色々紹介されていたように、オープンなサイトをJSFで、というのはあるにはあるのですが…(^^;

で、このzeef.comのアーキテクチャについてAdam Bienさんがブログでインタビュー回答みたいな形式で書かれていて非常に興味深いです。

A Java EE Startup: Filtering Information with zeef.com : Adam Bien's Weblog

Java SE 8、Java EE 7の組合せでアプリケーションサーバはWildFly 8.2。そしてアプリはWARじゃなくてEAR形式とのこと。そういえば自分、EARで固めたことないなぁ(^^;

先ほども書きましたが、フロントはJSFで、CDI管理BeanやBean Validationや一部JSFのバリデータを利用してるとのこと。

EJB(Stateless以外にEJBTimerなんかも使ってるようです)やJPA,JAX-RSも使って、ガチなJava EE構成っぽいです。セキュリティはJASPIC(Java Authentication Service Provider Interface for Containers)、ただしJASPIC自身はlow-levelなので、higher levelなのは作る手間もあったようで、それがモチベーションとなってJava EE 8 securityのExpert Groupに参加されてるそうです。って、書くとさらっとしてるけど、すごいなぁ(^^;;

で、JSF周辺ですが

OmniFacesやPrimeFaces、PrettyTimeなどを使っているそうです。

PrettyTimeって初めて知りました(^^;これPrettyFaces作ってるのと同じ所ですね。

www.ocpsoft.org

自分もOmniFaces使ってたり

kikutaro777.hatenablog.com

PrimeFacesもガッツリなので

kikutaro777.hatenablog.com

なんか日本では浮いてる感じなのかなぁ…(そもそもJSFとかね)みたいに結構ネガティブだったのですが、あながち間違った選択してないんじゃー、的な気持ちになって嬉しかったです(^^)

その他、Markdownの処理にはPegDown、HTMLのパーサにJSoup、RSS/AtomはROME、画像周辺はImage4JmgscalrBatik、他にもGoogle API client libraryやキャッシュやJPA以外のエンティティにInfinispanHibernate Searchも使っているようです。

Java技術てんこ盛り!使ったことないライブラリも多々あるので少しずつ触ってみたいなぁ。

パフォーマンスどうなの?って辺りには

Java EE is incredible fast. The website itself is now doing over 120k views a month and as mentioned above is running on a single server basically, which is not even that powerful.

とのことで

ですね。サーバのスペックまでは書かれてないですが、それほどパワフルではないとのこと。

で、JSFにも触れてます。

You occasionally hear that JSF is supposedly not suited for public web sites, since it would be slow and using a lot of memory. We found however that this is absolutely not the case.

これは自分がJSFやり始めた頃にもよく聞いて、「JSFは速度やメモリ的にオープンなサイトにはあんまり向かない」と教えられて育ったので結構衝撃的な一文でした(^^;

あわせてJSF関連のベンチマークも紹介されてたので、読みたいところです。

他にも色々細かい説明書かれているので、Java EEな方々には参考になるのではないでしょうか。英語で細かいニュアンスいまいちわからない所もありますが、めっちゃ面白かったです。

軽量でモダンなコンポーネントライブラリ ButterFaces

少し前にJSFのSpec LeadでもあるEd Burnsさんが以下つぶやいていました。

JSFって下火な面もあって(盛り上がったことないだろ、というツッコミは置いておいて…)、さらにリッチコンポーネントライブラリに関しては、PrimeFacesが一人勝ちという状態なので、新しいコンポーネントライブラリが出てたことにびっくりしました。

www.butterfaces.org

2014年くらいからあるっぽいです。

デザイン的にはTwitter Bootstrapをベースとして、jQueryやHTML5の利点を取り入れたライブラリのようです。

ということで、少し触ってみました。

PrimeFacesになさそうなコンポをいくつか使ってみました。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150603220244g:plain

ビューは次のような定義です。

<h:form><b:textlabel="ラベルー"value="#{butterFacesBean.value}" placeholder="hoge" /><b:commandLink value="送信" styleClass="btn btn-primary"action="#{butterFacesBean.commandLinkBtnAction()}"/><b:tags value="#{butterFacesBean.tagsValue}" /><b:modalPanel id="mdl" cancelButtonText="cancel"><b:textvalue="hoge" /></b:modalPanel><spanonclick="butter.modal.open('mdl')">dialog</span><b:textArea value="#{butterFacesBean.textArea}" expandable="true" /></h:form>

前々からPinterestの検索テキストみたいなの欲しかったんで、tagsコンポはいいなーと。
textAreaもexpandableみたいな属性があって面白いです。

依存性は1つでmavenのpom.xmlでは次の定義をするだけです。

<dependency><groupId>de.larmic.butterfaces</groupId><artifactId>components-mojarra</artifactId><version>1.8.1</version></dependency>

サイトのほうみるとcomponentsというartifactId(下の定義)が先に紹介されてますが、これだけだとテキストやボタンといった基本コンポーネントが使えませんでした。

<dependency><groupId>de.larmic.butterfaces</groupId><artifactId>components</artifactId><version>1.8.1</version></dependency>

よくみるとコンポーネント紹介のところに「only mojarra version」とあります。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150603214759j:plain

基本コンポが使えないので、components-mojarraバージョンを使うのが普通じゃないのかな…と。

あと、HTML5はパススルーじゃなくて、普通に属性として定義されていました。

Showcaseでは属性を変えて色々試せるので、何ができるか、PrimeFacesのShowcaseよりちょっと良いかも。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150603221616g:plain

あ、ちなみにタイトルはサイトの英語から持ってきていますので、軽量でモダンかどうかは実際もっと使ってみないとホントかわからんです。

JPAのCDI Entity Listenersを試してみた

久しぶりにJPAネタです。

Java EE 7のJPA 2.1からEntity ListenerでCDIが利用できるようになりました。

EclipseLinkの例だと@EJBで書かれてます。
EclipseLink/Release/2.5/JPA21 - Eclipsepedia

この例だと、うーんロガーをわざわざEJBでかぁ…(^^;という感じが個人的にしたので、前にきしださんが書いていたプロデューサー使う方法でやってみました。d.hatena.ne.jp

LoggerProducerはそのまんまお借りして

@Named@Dependentpublicclass LoggerPoducer {

    @Producespublic Logger getLogger(InjectionPoint ip){
        return Logger.getLogger(ip.getMember().getDeclaringClass().getName());
    }
}

EclipseLinkの例にあったLoggerEntityLisetenerの@EJBを@Injectへ

publicclass LoggerEntityListener {
   @Inject//ProducerでInjectされるprivate Logger logger;
    
   @PrePersistpublicvoid prePersist(Object object) {
       logger.info("prePersist");
   }
   
   @PostPersistpublicvoid postPersist(Object object){
       logger.info("postPersist");
   }
   
   @PreDestroypublicvoid preDestroy(){
       logger.info("preDestroy");
   }
   
   @PostConstructpublicvoid postConstruct(){
       logger.info("postConstruct");
   }
}

そして、対象のEntityクラスに@EntityListenersでLoggerEntityListenerを指定しました。

@Entity@EntityListeners({LoggerEntityListener.class})

EclipseLinkは2.5.2、APサーバはGlassFish 4.1で試したのですが…なぜかloggerがnullで上手くインジェクトされませんでした。

色々調べていたら以下に辿り着き

github.com

上記に以下リンクがありますが、GF4.1の問題っぽい?現象としてはこれと全く同じでした。
[GLASSFISH-21195] CDI Injection in Entity Listener - NullPointerException - Java.net JIRA

さらに読むとEclipseLink2.5.2の問題じゃないかみたいな。
Bug 438105 – Logic bug in EntityListenerInjectionManagerImpl

で、最終的には、最新のPayaraにはEclipseLink2.6が入って、それで動くよとのこと。

ということで、初めてPayaraをダウンロードしました。中はホント完全にGlassFishなんですね(^^;
Pre-Release Builds

利用したのは「Payara-web 4.1.153 (Web Profile)」です。

そして実行すると…動きました!

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150618225652j:plain

GlassFishをPayaraに変えるのは全く手間がなさそうです。普通に動くし、今回のようにPayaraのほうが対応が早いケースがあるのを知ると、ちょっと真面目にPayara追っていかないとなーと。

前から既に追っているはすぬまさんのブログで勉強していかねば!

www.coppermine.jp

既にめっちゃPayaraについて書かれている(*´Д`)さすがすぎる

はすぬまさんのブログで「Payara」のタグがついている記事の検索結果
Programming Studio - 検索結果

CDI Entity Listenersについての日本語参考情報は以下。

etc9.hatenablog.com

qiita.com


SendGrid-Javaライブラリを使ってみた

2年前くらいにSendGridでJava使ってメールを送るサンプル作った時、JavaMailを使うかsendgrid4jを使っていました↓

kikutaro777.hatenablog.com

久々にSendGrid触ってみようと思ったら、ログイン後のダッシュボードとかカッコいい感じに変わってて焦ったり(^^;
この辺は既にまとめられていました。ありがたや。

blog.shibayan.jp

で、いつの間にかSendGrid公式で「sendgrid-java」なるライブラリがでていました。
MavenのCentralみると今年の5月くらいなのかなぁ。

github.com

MavenやGradleで依存性定義すればOKなので、1分くらいでサンプル作れます。

以下はNetBeans&Mavenを使った流れですが、こんな感じ。

Mavenプロジェクト作成

NetBeansの「ファイル」→「新規プロジェクト」から「Maven」の「Javaアプリケーション」を選択
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150713233731j:plain

プロジェクト名などを入力して「終了」
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150713233642j:plain

pom.xml

依存性としてpom.xmlに以下を追加します。

<dependencies><dependency><groupId>com.sendgrid</groupId><artifactId>sendgrid-java</artifactId><version>2.2.2</version></dependency></dependencies>

ビルドしてjarが依存性に入ればOK

コード

とりあえずGitHubにあるサンプルコードをコピペレベルで書いてみます。

package jp.co.kke.sendgridsample;

import com.sendgrid.SendGrid;
import com.sendgrid.SendGridException;

/** * sendgrid-javaを利用したメール送信サンプル * @author kikuta */publicclass Main {

    publicstaticvoid main(String[] args) {
        SendGrid sendgrid = new SendGrid("ここにアカウント", "ここにパスワード");

        SendGrid.Email email = new SendGrid.Email();
        email.addTo("宛先のメールアドレス");
        email.setFrom("送信元のメールアドレス");
        email.setSubject("こんにちは");
        email.setText("このメールはキクタローがSendGridから送ったよ。");

        try {
          SendGrid.Response response = sendgrid.send(email);
          System.out.println(response.getMessage());
        }
        catch (SendGridException e) {
          System.err.println(e);
        }
    }
    
}

実行

ビルドして実行すると、ResponseがJSONで返ってきています。成功すればmessageとしてsuccessが返ります。下図のような感じ。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150713234120j:plain

メール確認

あっさりと届いてる!

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150713234319j:plain

このsendgrid-javaライブラリ、色々できそうなので、試していこう~

HTTPクライアントライブラリ Unirest for Java

JavaのHTTPクライアントはHttpClientやJersey Client等、いつも何を使うか迷います。
google-http-java-clientなんかも良さそうだし。この辺は同じような迷いの中、色々と紹介されています。

d.hatena.ne.jp

vividcode.hatenablog.com

で、英語でググっていたらUnirestというのがありました。

Unirest for Java - Simplified, lightweight HTTP Request Library

色々な言語に対応しているようで、Java以外にRuby,PHP,.NET,Python,Objective-C,Nodeとあるようです。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150719031049j:plain

Windows 8っていう箱が.NETと何が違うのかちょっと謎ですが…(^^;

で、このライブラリはmashape.comというAPIのマーケットプレース的なサービスを提供している企業が開発してる模様。
ライブラリ自体のライセンスはMIT licenseです。

www.mashape.com

jp.techcrunch.com

とりあえず、ライブドアさんのお天気REST APIで次のURLをコールするものを

http://weather.livedoor.com/forecast/webservice/json/v1?city=130010

Unirestで書いてみると

HttpResponse<JsonNode> ret 
    = Unirest.get("http://weather.livedoor.com/forecast/webservice/json/v1")
             .queryString("city", "130010")
             .asJson();

こんな感じ。

サイトにあるFeaturesを読むと、色々なことがシンプルにできそうです。

本当はHttpClientやJersey Client等の他のライブラリとの機能比較表みたいなのがわかると良いのですが…(^^;

今は仕事じゃなく遊びのプログラムなので、お試しでこのUnirest for Javaを使ってみようー。

若干残念なのはググラビリティが少し低く、「Unirest」と他のキーワードで調べると「Unit test」(REST APIのユニットテスト)の間違いではありませんか?と推論されてしまったり(^^;

SendGrid Web API V3をUnirest for Javaでコールする -認証-

SendGrid Web API V3では認証方法が増えて、ベーシック認証やAPIキーを利用することができるみたいです。

API v3 Overview - SendGrid Documentation | SendGrid

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150720193244j:plain

先日使ってみたHTTPクライアントライブラリのUnirest for Javaは、元々このAPI叩くために触ってました(^^;
全然利用例を書いていないのにはてブのったりして焦りました…。kikutaro777.hatenablog.com

Basic認証

SendGridで登録したユーザとパスワードをコロンでつなげてBase64で変換します。
例えば、ユーザが「Aladdin」でパスワードが「open sesame」の場合は「Aladdin:open sesame」をBase64で変換します。

今回は次のWebサイト使って変換しました。

www.base64encode.org
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150720231241j:plain

ちなみにAladdinとopen sesameはUSのWikipediaのBasic認証の解説ページからでした(^^;
Basic access authentication - Wikipedia, the free encyclopedia

ここまで準備できたら、あとは次のように呼び出すだけ。

HttpResponse<JsonNode> ret = Unirest.get("https://api.sendgrid.com/v3/templates")
                .header("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==")
                .asJson();
System.out.println(ret.getBody());

SendGridではメールのひな形(テンプレート)を作れるのですが、それを取得するものです。
結果はJSONで次のような情報が返ってきます。

{"templates": [{"id": "8832dabe-3515-47ac-a06d-f8852970556a", 
            "name": "kikutaro_template", 
            "versions": [{"active": 1, 
                    "id": "37268f35-0ed2-4c55-bf1a-593a677b7f43", 
                    "name": "kikutaro_template Version 1", 
                    "subject": "<%subject%>", 
                    "template_id": "8832dabe-3515-47ac-a06d-f8852970556a", 
                    "updated_at": "2015-07-18 10:23:53"}]}]}

今回はテンプレートを全て取得するものでしたが、基本的にREST形式となっていて

  • 全てのテンプレートを取得
  • テンプレートIDを指定して一本引き
  • テンプレートの作成(POST)
  • テンプレートの編集(PATCH)
  • テンプレートの削除(DELETE)

などの操作がAPIからできます。この辺はまた別途使っていきたい。

なお、UnirestではBASIC認証に対応していて、次のように書くこともできます。

HttpResponse<JsonNode> ret = Unirest.get("https://api.sendgrid.com/v3/templates")
                .basicAuth("Aladdin", "open sesame")
                .asJson();
System.out.println(ret.getBody());

APIキーによる認証

APIキーについてはKKEのブログに日本語で詳しく解説されてますので、ここでは解説を飛ばします。

APIキー認証でセキュリティを強化しよう | ブログ | SendGrid

次のように書けます。

HttpResponse<JsonNode> ret = Unirest.get("https://api.sendgrid.com/v3/templates")
                .header("Authorization", "Bearer SG.xxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyyyyyyy")
                .asJson();
System.out.println(ret.getBody());

認証ができてしまえば、色々API叩けるので遊べそうです。

SendGrid LabsのThreadsを利用したイベントドリブンな自動メール送信

最近クラウドメールサービスのSendGridで色々と遊んだりしているのですが、色々調べていたら「Threads」なるサービスを見つけました。

threads.io

これはSendGrid Labs(SendGridの中で先端的な取り組みしてるチーム?ですかね?)が提供しているサービスの1つです。

labs.sendgrid.com

トップページで「AUTOMATED BEHAVIOR-DRIVEN EMAIL」とありますが、何かのイベントを契機にSendGrid経由でメール送信するのを簡単にしてくれるサービスです。
2015/8/1現在ではまだベータ版で、無償で使えます。なのでSendGridアカウント持ってる人は色々遊べるのではないかなーと。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801022107j:plain

イベントは大きく分けて、次の2つの方法によって起こせます

  1. 直接JavaScriptでThreadsを呼ぶ
  2. Segment.comというサービスからThreadsと連携する

両方とも試して簡単にできたので、まず今回は1の方法についてまとめてみます。

設定の流れ

Threadsにユーザ登録して、ログインすると以下のようなDashboardが表示されています。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801022728j:plain

手順がわかりやすい図になってる形ですね。

  1. イベントの送信(Send events)
  2. SendGridとの接続設定(Connect SendGrid)
  3. 送信元メールの設定(Add Sender)
  4. 送信メールテンプレートの設定(Create Template)
  5. ワークフロー(発火条件)の設定(Create Workflow)

です。

イベントの送信(Send events)

ここでは前述した2つのイベント送信の方法の説明があります。
Segment.comを利用する際にはEvent Keyが必要なのですが、その情報も表示されています(左下)。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801023941j:plain

で、この右側にある「Live Log」ですが、イベント送信するとここがリアルタイムで更新されていきます。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801024508j:plain

英語の説明にもあるように、表示されているJavaScriptをコピペするだけでいいです(^^;簡単
今回は自分のローカルに立ってるWebサーバのHTMLに埋め込みました。

<!DOCTYPE html><html><head><title>Start Page</title><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"></head><body><h1>Threadsで遊んでみる!</h1><scripttype="text/javascript"><!-- Threads画面でCopyしたJSを張り付けるだけ --></script></body></html>

表示してみます。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801024814j:plain

で、Live Logみてみると

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801024831j:plain

出てきた!

クリックすると、もう少し詳細な属性情報が確認できます。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801024959j:plain

sourceで「threads」となってますが、例えばこれがsegment.com利用すると下図のように「segment」とでます。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801025257j:plain

これだけでも何か楽しい(^^;

この後の設定は、このLive Logで出るイベントが契機としてSendGrid経由でメール送信できるようにするものです。

SendGridとの接続設定(Connect SendGrid)

SendGridのアカウントがあれば「connect」を押します。(なければ作成が必要です)

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801025522j:plain

SendGrid側への各種操作のパーミッションが求められるので許可します。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801025736j:plain

これだけ。設定が完了するとDashboardで「Completed」に変わるので、どこまで設定完了してるか、わかりやすいです。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801025756j:plain

送信元メールの設定(Add Sender)

メールの送信元情報を設定します。From emailは一応Verifyの確認メールがそこに飛ぶので許可する必要があります。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801030020j:plain

Verifyが完了すると一覧で「Verified」とStatusが変わるので、これで準備OKです。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801030238j:plain

送信メールテンプレートの設定(Create Template)

続けて送信するメールのテンプレートを設定します。
この辺、SendGridのテンプレートとか引っ張ってくれると楽なんだけどなぁ、と思いつつ、ちょっと見当たらなかった。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801030539j:plain

Senderの所はプルダウン式に、先ほど登録したSender情報がでてくるので選ぶだけです。
テンプレートはHTMLとPlain-text、それぞれで書けます。

あとは保存するだけ。

  1. ワークフロー(発火条件)の設定(Create Workflow)

最後に、イベントをベースにどういう条件で発火させるのか、をワークフローで設定します。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801031401j:plain

とりあえず試したのは、該当URLのWebページが開かれたら、ある特定のメールアドレスにメールを飛ばすというものです。
Conditionで「Page View」を選んで、Single Actionで「Send email」を選択してます。

ちなみにConditionとSingle Actionの他メニューとしては次のようなものがあります。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801031625j:plain

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801031901j:plain

User Trait辺りはまだよくわかってないです(´・ω・`)

特定のメールアドレスはSpecific emailを選ぶと、メアドが打てます。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801032041j:plain

これで全て「Completed」になり準備万端です。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801032314j:plain

Identifyの追加

で、再び最初のLive Logで確認しながらイベントを起こしたのですが、メールが送信されない orz

な、なぜ、と調べたらIdentifyをつけないといけないとのことです。support.threads.io

最初にコピペしたJavaScriptにidentifyの呼び出しを追加

threads.load("igVCDv"),threads.page()}}(window,document);
threads.identify('userId', { email: 'userId@xxxx.co.jp'});

Live LogみるとIdentifyも識別されて、無事メールが飛びました!
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801032900j:plain

受信したメール

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801033013j:plain

ちゃんとトリガーかかるとWorkflowsのStatsで「X times triggered」のところに回数がでるので、発火したかどうか確認できます。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150801033151j:plain

細かく書いたので、長く感じますが、既にアカウントとか持ってたりすれば5~10分くらいでできちゃうかと。

時間取れれば次にSegment.comから使ったほうも書きたい。そちらだとJavaからも遊べるんかな。

堀北真希さんご結婚おめでとうございます(´;ω;`)ブワッ

堀北真希さんファンクラブ会員番号11番を持ってるキクタローです。

堀北さん結婚おめでとうございます!堀北さんがご自身が幸せであれば、ファンとしても何よりです(>_<;

このブログは仕事で使ってるJavaを中心に書いてるブログなのですが…今までも技術に絡めて「堀北真希さん」が多々登場していました。

多分一番多いのはサンプルコードですが、JavaFXやTwitter4Jなどと絡めて色々遊んでもきました。

せっかくなので、思い出がてら掘り起こして、タグに「堀北真希」さんを作成しました。

kikutaro777.hatenablog.com

kikutaro777.hatenablog.com

kikutaro777.hatenablog.com

kikutaro777.hatenablog.com

kikutaro777.hatenablog.com

kikutaro777.hatenablog.com
これで実際に作成してみたbotは以下です(^^;少し前にとまっちゃってますが。

twitter.com

kikutaro777.hatenablog.com

本当におめでとうございます(´;ω;`)ブワッ

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150822215331j:plain

Image may be NSFW.
Clik here to view.
堀北真希

Image may be NSFW.
Clik here to view.
堀北真希とは
編集

PayaraMicro on Heroku !

I'm newbie both Payara and Heroku. Though I tried to play with these for preparing my presentation in Japanese GlassFish User Group event.

glassfish.doorkeeper.jp

About one month ago, I participated Japanese Salesforce event. It was called "Salesforce Summer".eventjp.salesforce.com

At the event, I saw Heroku demonstration. This is the reason why I started to use Heroku.After the event, I checked Heroku site and found good Java tutorial. In the tutorial, the sample Java web application used Spark.

I thought that ... if I use Payara Micro, is it possible to deploy Java EE application to Heroku ?

Finally, it could. Here is procedures.

Getting Started with Java on Heroku

Firstly, I started "Getting Started with Java on Heroku". The tutorial is very polite, so it's easy to do.
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150914011127j:plain

  • Installing Toolbelt (for Windows on my environment)
  • heroku login

After that, I cloned "java-getting-started" from github.

git clone https://github.com/heroku/java-getting-started.git

And changed directory.

cd java-getting-started

Next

heroku create
git push heroku master
heroku ps:scale web=1
heroku open

Finally I confirmed the deployed page.

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150915233153j:plain

These procedures are same as the tutorial.

PayaraMicro on Heroku

I used the same project, it means I used "java-getting-started" project cloned from GitHub.
It's kind of cheat I think. Normally, it had better create as new project.

Firstly, I changed pom.xml.

<dependency><groupId>fish.payara.extras</groupId><artifactId>payara-micro</artifactId><version>4.1.153</version><type>jar</type></dependency>

Also, I edited the code like this.

import fish.payara.micro.BootstrapException;
import fish.payara.micro.PayaraMicro;

publicclass Main {
  publicstaticvoid main(String[] args) throws BootstrapException {
      PayaraMicro.getInstance()
                .setHttpPort(Integer.parseInt(System.getenv("PORT")))
                .addDeployment("DeployTarget.war")
                .bootStrap();
  }
}

It's very important to call "setHttpPort(Integer.parseInt(System.getenv("PORT")))", because the port of HTTP on Heroku is binded random.

If that helps, I used NetBeans IDE.

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150914012105j:plain

After changing code, I copied from WAR file which is target of deploy to this project.
The War was created by Java EE 7, but I used only JSF and CDI.

Finally, I committed the code and "git push heroku master". Everything was done.

Here is my deployed Java EE app with PayaraMicro on Heroku :)
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20150915233036j:plain

Enjoy!

GlassFish Users Group Japan勉強会で発表させて頂きました #glassfish_jp

6月に@khasunumaさんから「GlassFish勉強会で発表しませんか?」とお声かけを頂いてから早3カ月あまり。

昨日、青山の日本オラクルさんで行われた

glassfish.doorkeeper.jp

にて発表させて頂きました!m(_ _)m

イベントレポは既に@mike_neckさんがまとめられています!ありがとうございます。

mike-neck.hatenadiary.com

というわけで、私は感想だけ(^^;ちなみにスライドは以下にアップしています。

堀北真希さん結婚後、はじめての社外発表だったため、自己紹介が長めでしたm(_ _)m無事アイスブレイクになったかどうか。

PaaSと絡めてJava EEも結構カジュアルに使えるんですよー、という気持ちも込めた発表を目指した感じでした。

Payara含め、色々遊ぶ方が増えれば幸いです。

……

今回のイベントで初めて、会場準備や受付を少しお手伝いさせて頂きました。わかってはいたものの、あらためてJJUGさんとかその他勉強会での運営の方々の大変さや手際の良さとかを感じました…。

そしてOracle Aceな山田さんにメッチャ色々手伝ってもらってしまって(^^;;感謝感謝です。
手伝ってもらいながらもTogetterまとめされてて、ホントすごい(>_<;

togetter.com


受け付けやってて@suke_masaさんや@n_agetsuさんの発表が聞けず残念(^^;連休でスライド拝見せねば!

www.slideshare.net

www.slideshare.net

www.slideshare.net

懇親会では、以前JJUGイベントで知り合った方々含めて、色んな方とお話できて良かったです。

今日は特にTwitter上でよくお世話になっていた@shimashima35さんとお会いできて良かったなーと(^^)

ファーストコンタクトは受付でしたw

あと帰り道、てんてんさん(@tenten0213)やしょぼちむさん(@syobochim)とお話できて良かった(>_<;;

うらがみさんも大阪からわざわざいらしていたり、GlassFishすげー。

またGlassFishイベントで色々お手伝いできたらいいなーと思います!


SalesforceのSOAP APIをJavaから呼び出す

現在参画しているPrjでは、Salesforceと連携するシステムを作っているのですが、、、なぜか連携担当に任命されました orz 一番タフな所な気が…。

SalesforceのAPI、調べてみると色々な種類があるんですね。Salesforceのヘルプページに一覧が↓

どの API を使用すべきですか?

大きな分類では、REST APIかSOAP APIとあって、最近の流行りとしてはRESTだからなーとREST APIを調べていました。

が、RESTAPIだと外側からトランザクションの制御ができなさそう。SOAP APIだとAllOrNoneHeaderなるものがあってロールバックできました。

連携内容にもよりますが、今回の連携ではSalesforceの明細オブジェクトみたいなものを1トランザクションで複数insertする、みたいなのがあってロールバックは必須でした。
ということで、SOAP APIの採用へ。

今どきSOAPかぁ…とか思ったのですが、SOAP APIを実際に使ってみると使い勝手が良いです。Javaコード内でも普通のクラスと同様にSalesforceのオブジェクトを扱えて、ことSalesforce APIでいえば、RESTより楽なのでは…と思ったり。

ということで、SalesforceのSOAP API設定メモ。

1.Force.com Web Service Connector(WSC)の取得

SalesforceのSOAP APIをコールするクライアント実装としてForce.com Web Service Connector(WSC)なるものを使います。

github.com

とりあえずクローンして、手元でビルドしました。自分の場合、NetBeans使ってやりました。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151106214808j:plain

force-wsc-35.2.0.jarとforce-wsc-35.2.0-uber.jarの明確な違いがよくわからないのですが…(ちなみに解凍してdiffとってもイマイチ。。)
GitHubのサンプルみるとforce-wsc-35.2.0-uber.jarのほうを使ってました。

2.Salesforce WSDL

Salesforceの環境からWSDLがダウンロードできるようになってます。

設定から「アプリケーションの設定」「開発」「API」を選びます。
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151107100027j:plain

今回はEnterprise WSDLを使いました。
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151107100119j:plain

前に何かで入れたアプリがでてますが、そのまま「Generate」を押します。
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151107100637j:plain

ブラウザでWSDLのxmlが表示されるので保存します。
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151107100647j:plain

3.SOAP API用のjarファイル生成

force-wsc-35.2.0-uber.jarをコマンドラインで叩いてSOAP API用のjarを生成します。
最初JDK8で試したら以下エラーとなりました。tools.jarないもんな…。

java -classpath force-wsc-35.2.0-uber.jar com.sforce.ws.tools.wsdlc wsdl.xml sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generating Java files from schema ...
[WSC][wsdlc.main:71]Generated 633 java files.
java.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_60\lib\tools.jar (
指定されたファイルが見つかりません。)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at com.sforce.ws.codegen.ToolsJarClassLoader.<init>(ToolsJarClassLoader.
java:52)
        at com.sforce.ws.codegen.Compiler.findCompilerInToolsJar(Compiler.java:6
9)
        at com.sforce.ws.codegen.Compiler.<init>(Compiler.java:57)
        at com.sforce.ws.codegen.Generator.compileTypes(Generator.java:132)
        at com.sforce.ws.tools.wsdlc.run(wsdlc.java:117)
        at com.sforce.ws.tools.wsdlc.run(wsdlc.java:149)
        at com.sforce.ws.tools.wsdlc.main(wsdlc.java:71)
Error: Unable to find compiler. Make sure that tools.jar is in your classpath: j
ava.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_60\lib\tools.jar (
指定されたファイルが見つかりません。)

ということで、JDK7で実行しました。

java -classpath force-wsc-35.2.0-uber.jar com.sforce.ws.tools.wsdlc wsdl.xml sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generating Java files from schema ...
[WSC][wsdlc.main:71]Generated 633 java files.
[WSC][wsdlc.main:71]Compiling to target 1.6...
警告:[options] ブートストラップ・クラスパスが-source 1.6と一緒に設定されていませ
ん
警告1個
[WSC][wsdlc.main:71]Compiled 636 java files.
[WSC][wsdlc.main:71]Generating jar file ... sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generated jar file sfdc-enterprise-lib.jar

Javaのコードから取引先を作成

jarができてしまえば、あとはコード書くだけです。
生成したjarだけじゃなく、force-wsc-35.2.0-uber.jarの参照も必要でした。

で、コードは

import com.sforce.soap.enterprise.Connector;
import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.soap.enterprise.SaveResult;
import com.sforce.soap.enterprise.sobject.Account;
import com.sforce.soap.enterprise.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

publicclass SfdcSoapApiSample {

    publicstaticvoid main(String[] args) throws ConnectionException {
        ConnectorConfig config = new ConnectorConfig();
        config.setUsername("username"); //実際にはsandboxのログインアカウントを指定
        config.setPassword("password"); //実際にはsandboxのログインパスワードを指定

        EnterpriseConnection connection = Connector.newConnection(config);
        Account account = new Account();
        account.setName("20151106テスト取引先");
        SaveResult[] ret = connection.create(new SObject[]{account});
        //retから情報取得したり
    }
    
}

Salesforce上に取引先ができてればOK。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151107115325j:plain

ちなみに会社の後輩にはSOAP APIのドキュメントみながらやってもらったところ、wscのバージョンが23とかなってたっぽい(^^;けど動いたらしいのであまり変わらないのかも。

開発かなりタイトなのだけど、がんばろう(*´Д`)

JavaOne 2015 報告会へ行ってきました(^^)

今日は青山の日本オラクルさんで行われたJavaOne 2015報告会へ行ってきました(^^)

jjug.doorkeeper.jp

毎年、同じこと書いてる気がしますが…2012年のJavaOne報告会へ参加したことがきっかけで、その後コミュニティの勉強会などに参加するようになりました。
あれに参加してなかったら、会社という狭い狭い世界でのみ生きるエンジニアになってた気がします。

kikutaro777.hatenablog.com

今年のJavaOneはJava生誕20周年のお祝いで、そういった面では盛り上がったようですが、技術的な面ではあまり驚くものはなかった印象でした(^^;

個人的には@sugarlifeさんのJigsawの話が一番興味深く、具体的な例が多かったので勉強になりました。モジュールかぁ。

あ、jshellも面白そうでした。Java SEは9が来年出る予定なだけに、色々楽しそうでした。

Java EEは…少し前に上妻さんにお会いしたときに雰囲気を聞いていたので…(^^;;先が長そう…。

あと報告会からJavaFXの枠がなくなったのも地味にショックだったり(^^;2012年のJavaOne報告会でもさくらばさんのプレゼンは衝撃だったし、今回も見たかったなーと。話すことがないくらい情報がなかったということなのかな…。

ME枠では、大山さんの鉄板プレゼンでたくさん笑わせてもらいました。

JavaOneスピーカーへの道、的なパネルも面白かったです。OracleのJavaエバンジェリストMicrosoftの寺田さんを初めてみたような(^^;

パネルの中で印象的だった言葉は谷本さんの「仕事頑張れ」でした。仕事で頑張って、その成果を話す。聞く側もそれが一番だよなーと。失敗談であっても得るもの多いですしね。

今回の発表スライド、現時点でみつけたのは以下です。

www.slideshare.net

www.slideshare.net

www.slideshare.net

www.slideshare.net

そして毎回ありがたやの@yamadamnさんによるTogetter!togetter.com

最後は懇親会に参加して、LTやさくらばさん&大山さんによるJavaOneやサンフランシスコの写真を楽しみました(^^)

グッズ系はじゃんけん大会かなーと思ったら、時間の都合で欲しい人~みたいな流れに(^^;まごまごしてるうちになくなってましたw この辺の前に出れないメンタルをもう少し鍛えないとなーと思ったり。

そういえば商品にさくらばさんの書籍があったのですが、書店だとAmazonより早いらしい(>_<;マジか。Amazonで2冊予約してるのですが、明日買いにいこうかな(^^;部でJavaやってる人には全員配る予定。

櫻庭 祐一
技術評論社
売り上げランキング: 8,660

また行きたいなーJavaOne、と思う1日でした。

JJUG CCC 2015 Fallに参加してきました(^^) #jjug_ccc

今日はベルサール新宿グランドで行われたJJUG CCC 2015 Fallに参加してきました(^^)
参加登録が1100名を超えていて、すごい熱気でした!

Timetable / JJUG CCC 2015 Fall(11月28日開催) | 日本Javaユーザーグループ

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151128232110j:plain

タイムテーブル、どのセッションを聞くか本当に悩ましくて、部屋入るギリギリまで迷うこともありました。

発表資料は既にまとめられている方が!ありがたすぎる(>_<;d.hatena.ne.jp

自分が参加したセッション一覧です。

  • 基調講演1 : Javaは守りに入らない、これが今のJavaだ
  • 基調講演2:Java EE 8 – Work in Progress
  • 苦手克服!例外スタックトレースから読み解くバグ
  • How to speed up your application using JCache
  • Payara Microをはじめよう
  • タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
  • サーバサイドのビュー処理エンジンForneusの開発秘話
  • Garbage First Garbage Collector (G1 GC)
  • てらだよしおの赤裸々タイム
基調講演1 : Javaは守りに入らない、これが今のJavaだ

JJUG幹事、谷本さん(@cero_tさん)による基調講演でした。

個人的にはすごく印象に残る講演で、Java界隈の盛り上がりや今後のJava、そしてCCCのセッションをとても良いバランスでうまく話されていて、構成がうまいなぁと。それでなくても迷っていたセッション参加が改めて悩ましくなる講演でした(^^;

Java 20周年の今年、日本のJavaレベルを示すような話として、OpenJDK 日本人コミッタ2名やJavaOne 2015の日本人Speakerが10名などあげられていました。
OpenJDKコミッタのお2人は日本OSS奨励賞も受賞して、しかも吉田さん(@bitter_fox)は学生さん…(^^;ホントすごい。

gihyo.jp

そろそろJava以外も、と離れかけたけど「これがあるから」と戻られたものとしてSpring Boot / Spring Cloudを挙げられていました。
自分はずっとJava EEできてますが、やっぱりSpringは気になって、こういう話を聞くと改めてホントに気になります(^^;

基調講演2:Java EE 8 – Work in Progress

OracleでJava EEのエバンジェリストをされているDavid Delabasseeさんによる講演でした。

Java EE 8の現状、といった形で主にWeb層(JSON BindingやJSON-P、SSEやMVC,HTTP2等)とEoD関連でCDIやJava EE Securityなど触れられていました。ちょっと資料の字が小さすぎて辛かったですね…コードは全くみえなかった…(^^;;

正直な所、これJava EEやってない人とか楽しめるのかなぁ…とも思ってしまったり(^^;

でも、海外から遠路はるばる日本へいらっしゃって、こうした情報を教えてくださることは本当にありがたいことだなと。

自分自身、Java EEをやっていながら、EE 8については全然キャッチできていないので、少しずつ調べていきたいなと思いました。

苦手克服!例外スタックトレースから読み解くバグ

午後イチはどのセッションにするか、ギリギリまで悩みました(^^;

最終的には、@yusukeさんのセッションに行きました。苦手克服、かつ、色々な勘所を知りたく。

@yusukeさんといえばサムライズム、IntelliJ IDEA、そしてTwitter4J!

セッションと関係ない話ですが、自分のこのブログはJava EEメインなのですが、常にアクセストップの記事が以下Twitter4Jの記事です(^^;Twitter4Jの人気というか、集客力すごいなーと。

kikutaro777.hatenablog.com

脱線してしまいましたが、セッションは基本的な説明から丁寧にされていて、とても勉強になるものでした。
例外とランタイム例外、例外とエラーの違い、など、これ自分の口でちゃんと若い人とかに説明できるかな(^^;とか
スタックトレースの追い方、スレッドダンプの取り方など、役立つ情報たくさんでした。スレッドダンプを可視化する侍も@yusukeさんが開発されたもので、名前は過去JJUGの勉強会などで聞いたことあったのですが、具体的にみたのは今日が初めてだったので興味深かったです。

侍 - ログ , スレッドダンプ解析ツール

How to speed up your application using JCache

JSR 107 JCacheでCO-SPEC LeadをされているGreg Luckさんによるお話でした。JCache自体は実は全然中身を知らないのですが、Spec Leadで、かつHazelcastのCEOされてる方の話をきけるなんて貴重な機会だよなぁと、勢いで参加しました。

The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 107

なぜCacheが必要なのか?という基礎的な話から始まりつつ

「キャッシュを使ってない人がいるなら使うべき、既に使ってる人はさらに改善を考える」

といった感じのことをおっしゃられていて、なんか「おお」って思いました。

やっぱり業務系のシステムって、パフォーマンスとか速度がホントに重要になる事が多くて、これは知っておかないと、という感じになりました。

いつキャッシュを使うか、とか、Cache Efficiency、MapとCacheの違いなど、勘所や指針になる話が多く、とても良かったです。資料は公開されるとのことで要チェックです。

うわー、時間が足りない!といった感じで、もっともっと聞いてみたかったなーと思いました。

ちなみに、JCacheの話を聞いて興味が出てきたのでググったら、かずひらさん(‏@kazuhira_rさん)のブログが!

d.hatena.ne.jp

そういえばPayaraにJCacheはいったときも速攻で触られてましたね(^^;すごいなー

d.hatena.ne.jp

まずは日本語記事を拝見しながら触ってみようと思いました。

Payara Microをはじめよう

続けて、はすぬまさんのPayara Microの話を聴きに行きました。この時間枠もどのセッションにするか悩みに悩んだのですが(^^;…やっぱりGlassFish・Payaraに関する情報を少しでも得たいなと。そういう意味ではGlassFish User Groupの会長であるはすぬまさんの話を聴くのが一番だなーと(^^)

ちなみに既にスライドがあがっています。

www.slideshare.net

スライド発表のあと、ライブデモとして、実際にPayara Microを使ったjava -jarによるデプロイ実行やクラスタリング構築をされていました。デモみると改めて手軽だなーと。PayaraにはJBatchやJCacheもあるし、本格的にPayara検討しても良い気が個人的に強まりました。

社内でお客様向けではない(将来的にはそうなるかもだけど)プロダクトというかセミパッケージのプロジェクトがあって、そこに是非Payara検討突っ込みたいなーと。。。個人的野望に火が。

なお、以前はすぬまさんにお声かけ頂いてGlassFish User Groupで私も簡単にですがPayara Microの話をして、Herokuへのデプロイなど紹介していました。
もしご興味あれば。

Java EE on Heroku with Payara Micro! // Speaker Deck

ちなみにopengl-8080さんが1プロジェクト構成、かつGradleという洗練した形で記事を書かれていますので、こちらも是非。

qiita.com

Payaraも盛り上がるといいなー。

タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-

タイトルのタイムマシンって何だろ??というのに加えて、Java EEやクラウド、Dockerと気になるキーワード続きだったので参加しました。

発表で説明がありましたが、なるほど、孫さんがタイムマシン経営という言葉を使っていて、そこからなんですねー。つかタイムマシン経営って単語を知らなかった。

d.hatena.ne.jp

日本にはWeb系とSI系で大きく2つに分かれていて、Web系で実績でたものがSI系にも徐々に、という(そこがタイムマシン経営でいうUS->日本的な)話の流れが興味深かったです。

クライアントMVC、JavaScriptのフレームワークの群雄割拠という所はとても共感するところで、私もそろそろJSFから移らないといけないのではないかと思って模索してますが、、、中々踏ん切りがつかない感じです。

サーバサイドのバックエンドは息の長いものとして、フロントエンド・クライアントUIは使い捨て、というスライドがありましたが、業務系SysのUIってお客さんのこだわりも強いので、SI系でそこまで割り切って導入してるならすごいなぁと思ったり(^^;

あと、うちとかだとJSのフロントできる人間がいなさすぎるっていう、、、

Java EEの話ではIBMのWAS(WebSphere Application Server)、Liberty Profileなどの話もあって、触ったことないので少し興味がでました。

システム構築の自動化も共感が多かったです。楽できる所はうまく楽をしないと、ホント属人的になってしまって。自分のところだと、そういう環境構築とかは「若い人がやる」みたいな風潮があって、実際、環境構築とか何もしない、何もできない、何も手伝わない(えない)オジサマ方がいたりして、作業過多になった若手が抜けていく、みたいな現実あるので。

自分としてはSI系だけど、このセッションにあるように現場から声をあげたりして変えていく、という期待をまだ持っているので、頑張りたいと改めて思いました。そういう気持ちを再認識できた良いセッションでした。

サーバサイドのビュー処理エンジンForneusの開発秘話

井上さんのセッションへ参加しました。

恥ずかしながらJava EEやってからJSFばかりだったので、自分はほとんどテンプレートエンジン(ビューエンジン)を利用したことありません(^^;

じゃあなんで聴きにいったのかというと、色々テンプレートエンジンがある中、なんで井上さんのような方が改めて開発されるんだろうーという興味があったためです。

セッションの発表では、井上さん自身が「私がそちらの席にいたら」といった表現を何回も使われていて、聴衆目線で気になってるところを説明されていて面白かったです。

サーバサイドはREST、クライアントサイドはJSでとても協業がうまくいった開発を経て、このときはこの方法がベストだと思われたとのこと。その後、クライアントサイドで苦戦されたPrjもあって、ケースバイケースというか、あらためてサーバサイドでのビュー生成に着目した、という話がリアルでそそられました。

で、他のテンプレートエンジンがある中、とにかくスピードを意識したテンプレートエンジンを、とForneusを作られたそうです。

それにしてもホント色んなテンプレートエンジンがあるんですね…

設計思想から徹底的にスピードを意識されていて、こだわりがすごいなーと。結果、ベンチマークでもかなり良い結果となっていました。すげー。

Forneusそのものへの興味が高まると同時に、しっかりとした設計思想とか、想いを持って開発することの大切さを感じるセッションでした。

あと、井上さんが解禁されていたのですが来年の春頃に「パーフェクトJava EE」という書籍がでます。

なんとも凄まじいメンバの中、私なんかがいていいのか…と悩みながらも、自分なりに頑張って書いています(まだ、書きました、ではない…苦笑)
本が実際の形として出たら、また改めて色々裏話とか想いを書ければと思います。

Garbage First Garbage Collector (G1 GC)

やんくさんのセッション聞きたいし、ひしだまさんを生で見てみたいし、ここも悩みが強かった枠なのですが…(^^;

先日のJavaOne報告会で久保田さん(@sugarlifeさん)によるJava SE報告を聞いて、スライドの解説がとてもわかりやすかったのが印象的で、G1GCもあんな感じだったら聞きたい!と、このセッションにしました。

そしてやっぱりスライドが丁寧で良かったです(^^)!

とはいえ、この辺りのJava内部寄りの話は自分の前提知識や経験が足りなさすぎるので、もっと学ばないと。

って、こういう想いは過去に以下

gihyo.jp

www.slideshare.net

辺りを拝見したときも同じ気持ち持ったけど、あまり成長できてないので改めて(^^;

それにしても久保田さんすごすぎる…なんかもう詳しさの次元が違い過ぎて。。。質問への回答も「すげー…」って感じでした。

てらだよしおの赤裸々タイム

最後はこれですw

運営の司会の方がマサカリもってたのがウケましたw

最初の15~20分くらいで寺田さんがなぜ某赤い会社を離れてMSに入ったか、その想いなどを語られました。

個人的な感想としては、とても前向きで、チャレンジングだなと思いました。タイミング的にもJava 20周年で1つの区切りだったり、MSの変化がちょうど大きくあったり、ホントに良いタイミングだったんだろうなと。

てらださん自身がMSへのイメージが変わった話の1つとしてMicrosoftが今年のはじめに行った「Go Azure」イベントでのご自身の発表をあげられていました。
MSからAzureでのJavaに関して発表依頼があったとき、WindowsやVisual Studio知らないですよ、といったら、普段通りにLinuxやNetBeans使っていいですよ、と言われて、Azure触ってみたら普通に使えて驚いたとのこと。

ちょうど私もそのイベントに参加して、てらださんの発表も聞いていました。MSとOracleのコラボってすごいなーとイチ聴衆としてもなんか興奮したのを覚えています。

kikutaro777.hatenablog.com

そういった色んな想いを語られたあとだったので、その後の質問であまり厳しいものはなかったように感じました。

基調講演で谷本さんが聞いていた「今だと.NETとJava EEどっちがいいって思うんですか?」っていうのが一番だったような…(^^;あの答えも気になるw

ということで、わりと平和に終わったセッションでした。

私自身は、てらださんがいらっしゃらなかったらJava EEをやっていなかっただろうし、こんなブログを書いていなかったと思います。ホント感謝の気持ちでいっぱいです。

現場で使える[最新]Java SE 7/8 速攻入門へサインもらった!

懇親会に参加する前、さくらばさんをお見かけたので、いきおいでサインもらいました(>_<)!

マジックペン用意してて厚かましくも、サイン頂く気満々だったのですがw

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151129022930j:plain

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151129022936j:plain

やったー!ってか、めっちゃかわいい絵(^^)/

この1冊は会社の部門に飾りたいと思います(^^)

そしてJavaやってる若手には1冊ずつ、必読書として全員に配ります!

櫻庭 祐一
技術評論社
売り上げランキング: 20,894

まだ私も完全に読み込めていないので、読んでブログ書きたいです。

懇親会

懇親会はスポンサーの方々のおかげで何と参加無料に!

そういうのもあってか、今まで参加した中でも最大の人数だったのでは?というくらい多かったように感じました。

人見知りな自分ですが、顔見知りとなった方々と話したり、Twitter上で認識してるけど対面でお会いしたことなかった方々と出会えたり、楽しかったです(^^)

自分がJJUGではじめて懇親会に参加したときは、知り合いの方もいなくて、終始緊張してた記憶があるので、実は未だに懇親会参加って緊張するのですが(笑

でもLTをみてるだけでも楽しかったり、何度も顔を出しているうちにTwitterやブログなどを通じて知り合いの方ができてきたり、勇気を出して参加するのも大事だよなぁと自身を振り返りながら思います。

ちなみに今回は、一緒に開発してて、Java女子部とかにも顔出してる後輩も参加してくれて、何名かの方々へ紹介できたりしました。こうして社内からも外に出る人を増やしたりして、もっと楽しく学んでいく後輩が増えるといいなーと思います。

そしてそして、今回のじゃんけん大会、まさかの勝ち抜きをして、JavaOneリュックをゲットしました!!!!やったーー!

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151129024256j:plain

先日のJavaOne報告会では何もゲットできなかったので嬉しい(^^)

こういう楽しみもあるので、今回参加できなかった方など次回は是非!

今回はわりと色んな方とお話させて頂いていて、あまりLTがちゃんと聞けなかったのですが…Java EE本の紹介がありましたね!この豪華メンバ…!!これは必読だ(>_<)ってか本家やん。

寺田 佳央 猪瀬 淳 加藤田 益嗣 羽生田 恒永 梶浦 美咲
翔泳社
売り上げランキング: 2,032
さいごに

朝10時開始で、懇親会終わったのが22時。なんと12時間!

さすがに疲れたなーと思いつつ、よく考えると、運営の方々は朝もっと早くにきていて、各セッションでも司会やサポートをこなし、懇親会準備から、きっと片付けで22時過ぎまで…。

疲れたなーとか言ってられない(>_<;;

運営の方々あってこそ、この充実した時間を過ごせたのだと思います。

直接のお礼でなく、ブログを通じての言葉ではありますが、本当にありがとうございます。感謝感謝です。

明後日からまた現実社会ですが、学んだことを少しでも活かしつつ、仕事がんばりたいと思います!

Java EEでMicroserviceを実現するKumuluzEE #javaee #Qiita

トピック「アドベントカレンダー」について

この記事はJava EE Advent Calendar 2015 - Qiitaの1日目のエントリーです。
明日は@empressiaさんです。

今年のAdvent Calendar、ネタがないなぁ…と思っていた所、以下ツイートを拝見しました。

きっと寺田さんご自身はJava EEとMicrosoft Azureに関連するネタを書かれるだろうと(勝手に)思って、このKumuluzEEをネタとして利用させて頂きますm(_ _)m

KumuluzEEとは?

KumuluzEEはJava EEでマイクロサービスを実現するためのフレームワークです。

読み方は…なんですかね(^^;;

KumuluzEE
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151130190207j:plain

毎年JavaOneで発表されるDuke's Choice Awardという名誉ある賞(KumuluzEEのサイトではJavaのオスカー賞的な表現してますね)を今年受賞したプロダクトで、Java ChampionのMatjaz Bさんが中心に進めているものです。

KumuluzEEとはなにか?をすごくざっくり言えば…

アプリケーションサーバによって一枚岩に提供されるJava EEの仕様群をバラして、自分が利用したい仕様のみを依存させることができるフレームワーク

といった感じでしょうか。つまり、使いたい仕様だけを取り込んだモジュールを作り、それ自身をマイクロサービスにできるものです。
以下のページにある図で、わかりやすくイメージが書かれています。

ee.kumuluz.com

思想的にはSpring BootやWildFly Swarmなどと同じなのかなと。既に似たようなプロダクトがある中、Duke's Choice Awardに選ばれた1つの理由として挙げられていたのは、コミュニティベースに作られたフレームワークという点でした。Java EEのアプリケーションサーバを提供しているベンダではない、という。確かに、WildFly SwarmならRedHatさん、Payara MicroならPayaraさんといった所が力を入れています。

KumuluzEEの使い方に関する詳細はあとで書きますが、例えば簡単にJAX-RSのコードを書いて

@Path("/rest")
publicclass RestResource {
    @GET@Produces(value = MediaType.APPLICATION_JSON)
    public Response getResources() {

        Map<String, String> json = new HashMap<>();
        json.put("nogizaka46", "mai shiraishi");

        return Response.ok(json).build();
    }
}

ビルドして、以下コマンドで実行します。KumuluzEEではフレームワーク側でMain関数を持ってるので、自分でMain含んだクラス定義も不要になっています。

java -cp target\classes;target\dependency\* com.kumuluz.ee.EeApplication

実行するとjettyが起動して

2015-12-01 16:26:59.197:INFO:oejs.Server:main: Started @1335ms
12 01, 2015 4:26:59 午後 com.kumuluz.ee.jetty.JettyServletServer startServer
情報: Jetty started
12 01, 2015 4:26:59 午後 com.kumuluz.ee.EeApplication initialize
情報: KumuluzEE started successfully

URLにアクセスすると

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201162842j:plain

こんな感じに非常にお手軽です。ここではJAX-RSを例にしましたが、以下

  • Servlet 3.1 (Jetty)
  • JSP 2.3 (RI JSP)
  • EL 3.0 (RI UEL)
  • CDI 1.2 (RI Weld)
  • JPA 2.1 (RI EclipseLink, Hibernate)
  • JAX-RS 2.0 (RI Jersey, RESTEasy)
  • JAX-WS 2.2 (RI Metro)
  • JSF 2.2 (RI Mojarra)
  • Bean Validation 1.1 (RI Hibernate validator)
  • JSON-P 1.0 (RI JSONP)

に対応しているとのことです。なお、コードなどは以下に。

github.com

Microservice

今年、勉強会やカンファレンスなどへ行くたびに「Microservice」という単語を耳にしていた気がします。

(Java系での)狭義な言い方では、java -jar XxxxService.jarみたいに起動できるもの、という説明から、SOAなど歴史的な背景を含めたアーキテクチャ論まで、幅広く話があったかと。

自分がMicroserviceという単語を聞いたのは多分、昨年Spring Bootを知った辺りです。Spring Bootに関してはこんな感想も。

自分はJava EEを選びながらも、やっぱりあちこちで評判なSpring Bootはホント気になります(^^;;;

  • Spring Boot

Spring Bootに興味ある方は以下書籍からですかね!

Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.

Java EEにおけるMircoserviceのプロダクトとしては

  • WildFly Swarm

WildFly Swarm · WildFly

  • Payara Micro

Introducing Payara Micro

などが出てきています。あとTomEE Shadesなんてのがあるん…ですかね?ちょっと調べられませんでしたが。

KumuluzEEの設定

私はNetBeansで試したので、一応メモ書き程度に手順を書いておきます。

ここでは、冒頭に例で示したJAX-RSを動かすコードを作る手順を示しますが、ServletやJPAでは依存性の定義を変えるくらいで、手順はほぼ同じだと思います。

「ファイル」->「新規プロジェクト」を選択

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201183801j:plain

カテゴリ「Maven」で「Javaアプリケーション」を選択

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201183901j:plain

プロジェクト名などは適当に

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201183915j:plain

pom.xmlにタグを追加

依存性で定義するライブラリのバージョンが一式合っていないと駄目らしいので、プロパティに以下追加が推奨されてます。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201184103j:plain

<kumuluzee.version>1.0.0</kumuluzee.version>
pom.xmlに依存性を定義

JAX-RSを動かすため、依存性は以下を追加します。

<dependencies><dependency><groupId>com.kumuluz.ee</groupId><artifactId>kumuluzee-core</artifactId><version>${kumuluzee.version}</version></dependency><dependency><groupId>com.kumuluz.ee</groupId><artifactId>kumuluzee-servlet-jetty</artifactId><version>${kumuluzee.version}</version></dependency><dependency><groupId>com.kumuluz.ee</groupId><artifactId>kumuluzee-jax-rs</artifactId><version>${kumuluzee.version}</version></dependency></dependencies>

また、コマンドから実行するとき用に、以下pluginを追加します。

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.10</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals></execution></executions></plugin></plugins></build>
JAX-RSのコードを追加

デフォルトで作成されたパッケージに以下コードを追加します。

RestResource.java

package advent.kumuluzsample;

import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/rest")
publicclass RestResource {
    @GET@Produces(value = MediaType.APPLICATION_JSON)
    public Response getResources() {

        Map<String, String> json = new HashMap<>();
        json.put("nogizaka46", "mai shiraishi");

        return Response.ok(json).build();
    }
}

RestApplication.java

package advent.kumuluzsample;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/")
publicclass RestApplication extends Application {
}

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201185809j:plain

プロジェクトファイルとしてはこれで準備は終わりなのですが、resources/webappフォルダを用意しないと実行時に以下エラーがでてしまうので作ります。

Exception in thread "main" java.lang.IllegalStateException: No 'webapp' director
y found in the projects resources folder. Please add it to your resources even i
f it will be empty so that the servlet server can bind to it. If you have added
it and still see this error please make sure you have at least one file/class in
your projects as some IDEs don't build the project if its empty
at com.kumuluz.ee.EeApplication.checkRequirements(EeApplication.java:75)

at com.kumuluz.ee.EeApplication.initialize(EeApplication.java:48)
at com.kumuluz.ee.EeApplication.(EeApplication.java:27)
at com.kumuluz.ee.EeApplication.main(EeApplication.java:39)

空のフォルダだけでも、とあるのですが、自分の手元では何かファイルがないとコピーしてくれなかったので、とりあえず適当にhtmlだけ置いてました。
Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201185816j:plain

で、あとはコマンドで実行できます。

java -cp target\classes;target\dependency\* com.kumuluz.ee.EeApplication

NetBeansで普通に実行すると…Mainクラスがないと

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201190347j:plain

実際には依存性に入っているkumuluzee-core-1.0.0.jarのEeApplicationクラスがMainメソッドをもっています。
NetBeansでこれをキックってできないんだろうか…

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151201190423j:plain

ということで、1日目は以上です。明日は@empressiaさんよろしくおねがいします!

Salesforce Driver by JavaFX

この記事は、JavaFX Advent Calendar 201524日目の記事です。

昨日は id:kozake (@s_kozake) さんの 「続・AndroidでJavaFXを動かしてみたよ!」 でした。
明日は id:skrb (@skrb) さんがトリを飾られます(^^)!!


今年1年を振り返ってみると、技術的に新しいものを探したり・触ったりする余裕がない1年でした。逆に言えば真面目に仕事をしていたというか(^^;

そんなわけで、残念ながらJavaFXに関してもあまり新しいネタはありません。(すみません…

ということで、今日は実際の仕事でJavaFXをこんな風に使ってみた、というネタにしたいと思います。

現場 x JavaFX

ちょうど昨日のJavaFX Adventでこざけさんが「JavaFXは僕の好きな技術ですが、イマイチ現場で使われている感がありません。」と書かれていました(^^;

皆さんの現場ではどうでしょう(^^;?

ちなみに自分の所(部門)では、デスクトップアプリを作る際はWindows FormやWPFといった.NET技術を使っています(C#)

JavaFXは存在は知っているものの(多分…)、最終的には使い慣れた技術のほうが実案件で選ばれるのは仕方がない…という所でしょうか(^^;

元々Windows系が多いので、あえてJavaFXを選択するラインがないです。

また、会社全体でみると、同様に.NET系が多いようですが、Javaの場合だと、やっぱりSwingが主力みたいなところは普通にあるようです。

仮配属にきた新人さんへJavaFXを少し触ってもらったのですが、本配属先ではSwingでした、というのが今年はありました。

テストドライバ x JavaFX

実案件は難しいけど、脇で使ったり、直接お客さんが触るものでない所でJavaFXを…と思って1年くらい経つのですが、少し前にちょうどいい感じの仕事が出てきました。

その仕事は、Salesforceと連携して使う、とあるWebシステム構築案件です。

Salesforceをご存じの方はわかると思いますが、Salesforceは非常にカスタマイズ性が高く、Apexという言語で画面作ったり、ボタンで複雑な処理を呼び出したり、色々なことができます。

うちは導入ベンダなどではないので、Salesforce部分は専門ベンダさんが構築で、うちが作るWebと連携する形です。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151224185907p:plain

当初連携ではSalesforceのRESTを使おうとしてましたが、最終的にはSOAPを使っています(詳細は以下エントリ)

kikutaro777.hatenablog.com

実際やってみるとSOAP使った連携は楽だよなぁと。SFDCのWSDLからクラス自動生成できますし。

さて、本題です。

今回のシステムでは、Salesforce側でうちのWeb画面を呼び出す前に色々とオブジェクトを操作する流れがあります。その後、うちのシステム側に情報が来て、加工して、SOAP APIで更新する、みたいな。更新するには先にSaleforceのロジックでオブジェクトが作成されていないといけない、などですね。

連携とかの開発ではよくある話だと思いますが、両社の開発過程では、まだ色々出揃ってないのでドライバやスタブなどが必要となります。

ドライバやスタブがわからない場合は情報処理試験の本以下ページにある図などがイメージしやすいかと。

What is the difference between stubs and drivers in software testing? - Quora

実際Salesforce上のApexなどでドライバが作れれば最高なわけですが、今回は期間的にもドライバを相手方に作ってもらう時間や、うちがApexを習得して自前でドライバを作る余裕はありませんでした。

なので、Javaで普通にSOAP APIを叩いて、Salesforce上で何かの操作をした後のオブジェクト構造とかを作り出すドライバを作りました。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151224190748p:plain

せっかくなので、JavaFXで作って、ドライバで作ったデータをすぐ確認できるように、WebViewもつけてます。以下のような感じ。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151224191326j:plain

ドライバでテストデータを作って、ブラウザ使わずともWebViewでみれたり。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151224191340j:plain

現場への導入第一歩としては良い感じではないかなーと(^^;

JavaFX使うと何がどこまでできるのか、とかも徐々にナレッジが溜まりそうですし。

書いてるコード

このプロジェクトで作ってるドライバは、非常に簡単なコードの集まりです(^^;

以下に、明日トリを飾る@skrbさんが以前JJUGでハンズオンをされたときの資料がありますが、これを1回やれば普通にできるレベルです。

上記ハンズオン資料は非常に細かく手順も書かれているので、新人さんでも普通にこなせます。
実際、プログラミング経験がほとんどない新人さんにやってもらったりもしてるので。

NetBeansでunpackingが遅い

ドライバ作ってるときにちょっと出会ったネタを最後に1つだけ。

自分はNetBeansでMavenを利用してJavaFXアプリを作っています。画面はSceneBuilderで。

で、今回のドライバはSalesforceのライブラリを使ったり、その他、諸々と依存性があったのですが

ビルドが超遅い(^^;

コンソールみると

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151224192542j:plain

unpackingをすごいしています。調べると、java -jarで実行可能なjarファイルを作ってくれてて、そのために依存ライブラリをいれてるっぽい。

で、以下に同じ話がありました。

stackoverflow.com

上記StackOverflowにあった解決案としてprofileを作成するというのがあって、自分はそうしました。

NetBeans(ちなみに8.0.2) & Mavenで自動作成されたpom.xmlには

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>1.2.1</version><executions><execution><id>unpack-dependencies</id><phase>package</phase><goals><goal>exec</goal></goals><configuration><executable>${java.home}/../bin/javafxpackager</executable><arguments><argument>-createjar</argument><argument>-nocss2bin</argument><argument>-appclass</argument><argument>${mainClass}</argument><argument>-srcdir</argument><argument>${project.build.directory}/classes</argument><argument>-outdir</argument><argument>${project.build.directory}</argument><argument>-outfile</argument><argument>${project.build.finalName}.jar</argument></arguments></configuration></execution><execution><id>default-cli</id><goals><goal>exec</goal></goals><configuration><executable>${java.home}/bin/java</executable><commandlineArgs>${runfx.args}</commandlineArgs></configuration></execution></executions></plugin>

のような定義があるので、これを

<profiles><profile><id>executable</id><build><plugins><plugin><!-- <groupId>以降をここへ移動 --></plugin></plugins></build></profile></profiles>

これで、通常ビルドではunpackingせずに、実行可能なjarを作成したいときは以下プロファイルを指定してビルドすればいいような形になりました。

Image may be NSFW.
Clik here to view.
f:id:kikutaro777:20151224193022j:plain

明日は@skrbさんがトリを飾られます(^^)!!!

Viewing all 134 articles
Browse latest View live