torutkの日記: [NetBeans]JDK 9 EA上でNetBeans IDE JDK9 Branchを動かす(未だ動かない)
torutkの日記: [Java]Javaでテキストをしゃべらせる
しんさんの出張所 はてな編: [ソフトウェア技術][NetBeans][Java]JavaEE 7 超入門 8クリックでEE7Webアプリ?起動確認とか
なにが「超入門」かというとおいらにとって超入門。
まずはJavEE7なアプリを起動させることを今回の目標にする。
サンプルは過去の例を見ても大げさすぎて、でかすぎて把握しにくいので無視で。
適当にフィーリングで行き当たりばったりでいい。JavaEEとはそういう感じのゆるい誰でもお気楽極楽に触れるものですよ。肩ひじ張るようなものではない。
しかし、「NetBeansタグ」すげー久々だのう。
ダウンロード
ダウンロードはここから。
https://netbeans.org/downloads/
JavaEEをえらぶ。このへん。
インストール
ダブルクリックでインストーラ起動。適当に押していけばOK。Glassfish 4もついてくるのでチェックを外さないように。
別途ダウンロードする必要もないのでインストーラ版がおすすめ。ダウンロードもIDE上で完成するので別にいいけど。
とにかくすぐに確認ができるのでNetBeansを常用はするつもりはないけどどんなものか知りたい人はこちらで。
起動
インストールしたアイコンをダブルクリックで立ち上げよう。
起動時に旧バージョンのNetBeansがあると設定を引き継ぐが、その場合、Glassfish4が追加されていないため、お手軽に試したい場合は設定を引き継がないほうがいいかも。
たぶんNetBeans 7.3.1のバグ。速攻でバグを踏むのもお約束。
プロジェクト作成
プロジェクトを作成する。
アイコンは右上のこのへんにあるのでクリック。
ウィザードが立ち上がったら以下の順序でクリック。
- 「カテゴリ」に「Java Web」
- 「プロジェクト」に「Webアプリケーション」
- 「次」ボタン
パスとプロジェクト名を入力して「次」ボタンクリック。
Glassfish 4 とJavaEE 7が設定されているのを確認して 「次」をクリック。
フレームワークは特別何も設定しないでよい。あとでも設定できるため。「終了」をクリック。
これでプロジェクトの新規作成はおわり。
実行
上にある緑色の再生ボタンをクリック。
ブラウザが自動で立ち上がり、表示する。
NetBeansを立ち上げてから8クリックだけで新規作成からGlassfish4上でのJavaEE稼働の確認までできたわけだ。
EE7なの?
たしかにログはGlassfishが立ち上がっていることはわかるが、表示しているのがHTMLでぜんぜんEE7って感じがしない。
実はGlassfish 3とかTomcatじゃないの?といわれても仕方がないレベル。
というわけで、index.htmlを消して以下のようにJSPを書いてみる。
うん、ちゃんとラムダ式も補完きくね。
ちなみに「<c:」とうつとtaglib設定してくれるんでまぁ楽。
<body>合計=<c:out value="${[4,3,1,2].stream().sum()}" /></body>
ブラウザのリロード。JSPの変更程度はもちろん再デプロイは必要ない。
JavaEE 7ではJavaSE 8より一足お先にラムダがかけるw
ここでネタに走ってStrutsでラムダを書く・・・とおもったけど、みんなやってると思うのでやめておく。
プロジェクトを右クリックして「プロパティ」を選んで、フレームワーク>追加>Strutsとやるとライブラリも設定ファイルも全部初期設定してくれるんで、やりたい人はそこから始めるとよいだろう。
いまいち定数を合計しても面白くないのでBeansを作ってそれをアクセスしてみるか。
package bean; publicclass HogeArray { privateint[] array = {2,1,4,3,5}; publicint[] getArray() { return array; } }
とつくっておいて
<%@ taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core" %><%@pagecontentType="text/html" pageEncoding="UTF-8"%><jsp:useBean id="hoge"scope="page"class="bean.HogeArray"/><!DOCTYPE html><html><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>JSP Page</title></head><body>合計=<c:out value="${hoge.array.stream().sum()}" /></body></html>
これでJavaコードから配列をもらってEL側で合計されているのがわかる。
もちろんソートもできる。
<body>合計=<c:out value="${hoge.array.stream().sum()}" /><hr><c:forEach items="${hoge.array.stream().sorted().iterator()}" var="row"><div><c:out value="${row}"/></div></c:forEach></body>
実行
ちゃんとソートもされてるね。
ラムダの例。フィルタで奇数のものだけ処理してる。
<body>合計=<c:out value="${hoge.array.stream().filter((num)->num%2==1).sum()}" /><hr><c:forEach items="${hoge.array.stream().filter((num)->num%2==1).sorted().iterator()}" var="row"><div><c:out value="${row}"/></div></c:forEach></body>
まずはいろいろと遊んでみるといいかもですね。
ねこび~ん: グッズ売上げを義援金として寄付させていただきました
ねこび〜んグッズで売上げた利益を
そのまま義援金として寄付させていただきました。
東北デベロッパーズコミュニティ設立総会を機に生まれたねこび〜ん。
少しでも恩返しできれば...と思います。
marsのメモ: [life][IDEA] レッツゴーデベロッパー変真に行ってこなかった
http://tohoku-dev.jp/modules/news/article.php?storyid=207
当日は予定が入っていたので前夜祭と打ち上げにだけ参加してきた。ヒゲの人イケメンさんが来仙するというので「すわ!JetBrainsの宣伝しないとッ!!」と片っ端から紹介していった。
自分自身が地元でなーんも宣伝してないので「お前が言うな」状態なんだけど、予想通りというか予想外というか、ほとんどの人がIntelliJもReSharperも知らなかった。JavaやAndroidについては予想通りEclipse無双。あと結構iOSデベロッパーもいらっしゃいましたがXcode無双だった。:-)
ヒゲメンイケメンさんや他の人と話して、普及のため(?)の要望が多いのは、つぎの2点だったように思う。どれもホントにやっても普及促進効果があるの?というと微妙なところが玉に瑕。
- 日本語化
- よくあるけど、昔やって失敗した黒歴史もある。何より準備するリソースが膨大なので割に合うのかよーわからん。
- 実際、今でも英語圏以外でも売れてるみたいだけど、ローカライズ版は出てない。
- 教育
- デモやってくれとか、ハンズアウトセミナーやってくれとか。マンパワーかかるし、難しいよね。
- ヘルプデスク
- ハンズアウトがダメでも日本語でサポート受けたいよねぇとか。マンパワーかかるし、難しいよね。
(NetBeansはともかく)Eclipseは最初の「日本語化」だけで、十分なシェアを獲得したからねぇ。何よりかにより「タダであること」が強みなんだろなと。ちなみに、.NET屋さんはVisual StudioのおかげかJava屋さんより開発環境に金を出すことに抵抗がないらしい。あとReSharperがVSのアドオンってのも、既存環境を変えない(VSのままで良い)とい点で抵抗が少ないそうな。
ps.
仙台に居る人はある程度まで私がサポートしてあげれるので、欲しいなと思った人はサムライズムにじゃんじゃん発注するといいよッ!
きしだのはてな: [java]JavaでIDEのアクセッサ生成よりlombokを使ったほうがいい理由
lombokは、JavaでのアクセッサやtoString、equalsなどボイラープレートなコードをコンパイル時に生成してくれるライブラリです。
ただ、こういったコードの生成は、IDEを使えば自動で行えるので、わざわざlombokを導入するまでもないと考えることもできますが、ぼくはlombokを導入するべきだと考えて、lombokを使うようにしました。
このとき「lombokを導入するべき」と考えた理由を書いておきます。
lombokとは
lombokは冒頭でも書いたように、Javaのアクセッサなどを生成してくれるライブラリです。
import lombok.*; @Setter@Getter@AllArgsConstructor@NoArgsConstructor@ToStringpublicclass LombokSample { private String foo; privateint bar; publicstaticvoid main(String[] args) { LombokSample ls = new LombokSample("ee", 12); System.out.println(ls.getFoo()); System.out.println(ls); } }
このように、アノテーションを付加すればアクセッサやコンストラクタ、toStringメソッドなどを生成してくれます。
NetBeansでの導入
Mavenプロジェクトの場合は、次のようなdependencyを付け加えれば、特になにもせずにlombok対応できます。
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>0.12.0</version><scope>provided</scope></dependency>
Antプロジェクトの場合は、ダウンロードサイトからダウンロードしたlombok.jarをライブラリに追加して、プロジェクトプロパティの「ビルド >コンパイル」カテゴリにある「エディタでの注釈処理を有効にする」のチェックをいれます。
実は、lombokの存在はもっと前から知っていたのですが、エディタ対応しているとは知らず「エディタ上でエラーになるんじゃ意味ないよな」と避けていたのです。いくらコンパイル時にとおっても、エディタ上でエラーになっていては作業できないですから。ということで、エディタ対応しているとわかって即導入しました。
lombokを使ったほうがいい理由
では、lombokを使ったほうがいい理由ですが、一言でいえば「ミスがなくなる」です。
ぼくはアクセッサがらみのミスを2度経験して、lombok導入を決めました。
どのようなミスかということになりますが、まずミスとして「作成時ミス」「変更時ミス」「削除時ミス」という分類ができます。このうちの「作成時ミス」はIDEでの生成でもなくすことができますが、「変更時ミス」「削除時ミス」はなかなかなくすことができません。
それぞれのミスについてみてみます。
変更時ミスの回避
生成したフィールド、アクセッサの名前を変更するとき、フィールドをアクセッサを別々にリファクタリング機能で変更したとき、名前を打ち間違えてエラーが発生するということがありました。Javaコード内では動作として問題がなかったのですが、JSFでの式言語での動きで気づきにくい不具合が発生していました。
まあ、これはフィールド、アクセッサをセットで名前変更するリファクタリング機能を使えばよかっただけなのですが、だれか他の人が同じミスをすることも考えれるので、lombokを導入するきっかけになりました。
アクセッサ以外にもtoStringやequalsなど変更時に手が回らないことが考えられる部分はあります。このようなところでもフィールドの同期が自動的にとれるlombokを使うとミスが減らせます。
削除時ミスの回避
2人でコードを書いていたあるとき、少しロジックの入ったgetterが単純なgetterに変更されてしまうことがありました。共同作業者に聞いてみると、フィールドを複数追加してアクセッサを作るとき、アクセッサの並び順がフィールド記述順にしたいため、一度すべてのアクセッサを消して生成しなおしたということでした。そのときにロジックが入っているものを一緒に消してしまった、と。
たしかに、このロジックを自分で書いていなければ、やりがちです。
Javaのアクセッサの難点は、特別なロジックの入っているアクセッサが単純なアクセッサの森に隠されてしまうことです。一緒に削除したというのも、結局アクセッサの森にロジックがまぎれてしまっているためです。lombokによって不要な森が消えることで、作業性があがります。
適正なカバレッジ
これは副作用だったのですが、アクセッサコードがなくなることで、テストカバレッジの数字が実態に近づきました。
それまでカバレッジの分母にアクセッサが含まれていたため、テスト中で使われないアクセッサの分だけカバレッジがさがり、また逆にアクセッサを多く使っているだけで実ロジックはあまり通ってないテストを書くことでカバレッジがあがるような、あまり実態に即しない数字が出ていました。
lombokでアクセッサコードがなくなることで、実際のロジックコードをベースとしたカバレッジデータに近づきました。
@ToStringでの循環参照に注意する
lombokを使ったことで実行時不具合が出るということが、少なくともひとつ考えられます。
toStringの循環参照の問題です。
データベースのマッピングでは、次のように明細データをもつクラス構成をとることがあります。
@ToString class Foo{ List<FooDetail> details; } @ToString class FooDetail{ Foo parent; }
このとき、toStringで文字列化が行われると、toStringが循環的に呼び出されてスタックオーバーフローします。
次のように@ToStringアノテーションにexclude属性を指定して、循環参照を切っておく必要があります。
@ToString(exclude = "parent") class FooDetail{ Foo parent; }
これが問題なのは、自動生成するようなtoStringが呼び出されるのは正常系コードではなく例外系コードであるということです。それも、自分で書いたコードで呼び出すのではなく、例外メッセージの中で使われることが多くあります。
そうすると、テストしにくく、なんらか別の問題が出たときに顕在化するという、ちょっとやっかいな問題になります。
フィールド名変更が少し面倒
実のところ、lombokを導入すると、アクセッサ付フィールドの名前変更が面倒になります。
というのは、フィールド名を変更すると自動的にアクセッサも名前がかわるのですが、自動生成されたアクセッサを利用している部分までリファクタリング機能が及ばないからです。
IDEの対応の問題なので、NetBeans以外では問題ないかもしれませんが。IntelliJはプラグインの説明に「adds support for most features.」とあるので、対応しているのかも。
で、現状どうしているかというと、名前変更するフィールドのアクセッサをIDEでの生成でわざわざ作って、その上でフィールド名をリファクタリング機能で変更し、その後でアクセッサを消す、というちょっとナンセンスなことをやっています。
それでもlombokは有効
まあ、いくつか難点がありますが、lombokはJavaのボイラープレートコードを減らし、作業量や潜在的なミスを減らしてくれる、よいツールです。
特に理由がなければ導入したほうがいいのではないかと思います。
marsのメモ: [life] TDDBC(TDD Boot Camp)仙台03に参加してきた
→ TDD Boot Camp(TDDBC) - TDDBC仙台03/課題
→ TDD Boot Camp(TDDBC) - TDDBC仙台03/課題用語集
→ TDDBC 仙台 the 3rd #tddbc のまとめ - Togetterまとめ
去年の感想はこちら。→ TDDBC(TDD Boot Camp)仙台02に参加してきた - marsのメモ
またの名を「 @i_takehiro無双レビュー大会」。今年もTA(Teaching Assistant)枠で参加したんですが、普通に一般参加者としてペアプロしてました。実を言うと受講者枠で参加したのは今回が初めて、TAだったのキレイさっぱり忘れてTDDBCを楽しませて頂きました。
毎度の事ながら主催およびスタッフのみなさん、一般参加された方々、おつかれさまでした&ありがとうございました。
基調講演 in 杜王町
3年続けて同じ事言ってた。
あの星はジョースター家の星だな。 #tddbc
あの星はジョースター家の証! #tddbc
ちなみにさっきの「キレイ」で「動く」コードの星はジョースター家の星ってのは豆な。|qω・`)チラッ #tddbc
ペアプロのデモ
@i_takehiroと @leecomという鬼軍曹×新兵コンビによる @leecom公開処刑劇場。leecomお疲れ様ッ!!
個人的には、Java+Eclipseのライブデモは定番過ぎるのでは、たまには他の言語やIDEのパターンも見てみたいなと。
ブートキャンプ実施
課題は「整数の区間」。今回TAやってないんでコードレビューんときの発表内容からの推測なんだけど、チーム訳と開発環境はこんな感じだった(去年に続きNetBeansはゼロ!)。
#1 | Java | Eclipse | JUnit4 | hamcrest使用 |
#2 | Java | Eclipse | JUnit4 | hamcrest使用 |
#3 | Python | PyCham | pytest | |
#4 | Python | ? | ? | |
#5 | Groovy | Eclipse | Spock | プロダクトコードはJava |
#6 | Groovy | IntelliJ | Spock | プロダクトコードはGroovy→Kotlin |
#7 | Objective-C | Xcode | ? | |
#8 | Ruby | Sublime Text | rspec | |
#9 | PHP | vim | phpunit | 途中までEC2で開発してたらしい |
#10 | C# | Visual Studio | ? |
去年は6組で半分はJava+Eclipse組だった事を思うと、今年の組み合わせは多彩だなぁと。あとMacBook率が高かった印象ある。この1年でなにがあったんだ?と思うほどの変化で隔世の感がありますなぁ。
ちなみに私は #6 のGroovyペアで参加してました。開発環境どうしようかってペアの方と話をしていたら「実はIntelliJ興味あるんです」とおっしゃっていたので『じゃあ、Community版でいいのでダウンロードしといてください』と。普段からGrailsやSpock使っているようで「正直TA要らないな」というレベルの方でしたので「IntelliJ接待モード」でどっちか言うとIntelliJの使い方をナビゲートしてました。:-)
#こちらはこちらでSpockの使い方教えてもらって大変ありがたかったです。
1回目のコードレビューで一段落した頃に、今度は「ちょっとKotlin使ってみたいんですよ」とおっしゃるので『じゃあ、プラグイン入れますか』と。Kotlinのテスティングフレームワークに心当たりが無かったので、テストコードはSpockのままプロダクトコードをGroovyからKotlinに差し替えてました。
みんなが課題を進める中、なぜかウチのペアは「言語をより良い(?)ものに変える」という大胆なリファクタリングを行っていたわけです。Kotlinの流儀はよくわかってないけど、ちょっとでもKotlinかじってたおかげて挫折すること無く、基本の課題はすべてクリアすることができました。
他のペアでも見かけましたが、ウチのペアは課題開始時点からGithubにプロジェクトを作り、PCを共有してペアを交代するのではなく、ペア交代のたびにcommit & push, pull & mergeをしてコードを共有してました。去年、TAやってたとき、みんなバージョニングしないでどんどん課題を進めていくのがスゴく気になっていただけに、今回半分くらいはGithubを使ってたみたいで、またしても隔世の感をひとり噛みしめたのでありました。
Githubのプロジェクトはこちらです。→ GitHub - masanobuimai/groovy_spock
二人ともIntelliJを使っていたので、ビルドスクリプトなどは作らずIntelliJのプロジェクト管理情報ごと共有してました。実はそこに密かな企みがあって、IntelliJでチーム開発する機会なんて滅多にないので、普通にこの辺を共有するどどんな感じなるのか体験させてもらいました(おかげで良いネタ仕込ませて頂きましたよ。
コードレビュー大会
これが全てを物語っとりますわ。
今日知った事。井上イヤーはSSDでもアクセス音からコンパイルエラーが起きたことに気づく。井上アイはRetinaディスプレイに表示した4×4dotsフォントのソースコードからバグを見つける。 #tddbc
井上TAが背中に立った時、コードに「バグがあるかも」なんて思わねえ。井上TAが近づいた時にはすでにバグっているからだッ!『バグった』なら使っていいッ!! #tddbc #奇妙なTDD
(追記)これでおわかりいただけだろうか。
ギャー(´Д`;) RT @i_takehiro: isConnectedTo のテスト、2|9|1|10|true だとredにナリマスネ #遅延コードレビュー RT @masanobuimai: ブログった。 #tddbcURL
\シアーハートアタック!!!/
所感
KPTの問題点「女の子ゼロ」。・゜・(ノД`)・゜・。 #tddbc
実際にコード書くとなおさら実感するんだけど、仕事で作るコードはJavaじゃないほうが良くないか?と改めて思った(特にJVM系)。Groovyは柔らか過ぎるけどテストコードだったら別にいいんじゃないかとか(SpockはGroovyと言って良いのか疑問は残るけどw)。Kotlinはマイナー過ぎるやろ、というならScalaだってあるし。
なにより、JavaもScalaもKotlinもGroovyもまぜこぜにしたってちゃんと開発できるんだから。
そうIntelliJならね。(・ω<)
何気にJetBrains改宗の会と化してる。( -言- )ククク・・ #tddbc
きしだのはてな: [javaone2013]JavaOne2013 0日目 キーノートとコミュニティデイ
(2013/10/14に書いています)
JavaOne前日です。
前日とはいえ、テクニカルキーノートや、コミュニティ系のセッションなどが行われています。
で、ホテルでネットが使えないので、まあ10時くらいからかなーと思いながらとりあえずヒルトンへ。
ロビーがJavaOneになっています。
でも、ここでネットにつないで、テクニカルキーノートはMosconeであるということがわかりました・・・
Mosconeに行くときにおなかがすきすぎていたので、ラーメン的なものを。
結構、普通にラーメンでした。
Mosconeでは、道路をふさいでイベント会場を設営していました。
JavaOneは、Oracle製品全体のイベントの一部として行われていて、Mosconeでは基本的に本体であるOracle Openwordが行われます。
ストラテジー・テクニカルキーノート
ということで、全体は聞けてないんですが・・・
印象に残ってるのは
・Java MEがJavaSEのサブセットになる、ということ
・WebSocketを使った対戦チェスゲームで、Web UI、Java FX 3D、そして3Dプリンタ出力した実物のコマを動かすロボットでのデモをみせていた
というところ。
あと、Raspberry Piと液晶タブレットを使ってJavaタブレットを作ったというのもありましたけど。
基本的には、特に新しい発表はありませんでした。
3Dプリンタ出力したチェスは、展示会場においてありました。これはかわいい。
UGF10369 Cool NetBeans Tips and Tricks for Java EE 7 Development
コミュニティセッションの中で「NetBeans Day」をやっていて、NetBeansのセッションがたくさんありました。でも聞けたのはこれだけ・・・
字が小さいし、声も小さいし、今回最初のセッションだしで、よく聞き取れてません・・・
目の前では、日本人の女の人が必死に睡魔と戦っていました。というか、負けてましたね。
プロファイラの話をしていて、「Swingなどのクライアントとサーバーサイドを同時にプロファイルするには?」という質問に、「それは別々にプロファイルして」というようなことを答えていました。
セッション中でも、わからないことはその場で質問します。そのとき、だまって手をあげて、気づいてもらったら話すというスタイルでした。なんかクール。
その後、PrimeFacesのデモ。
やはり声が小さくて「Can you speak louder?」という掛け声のあと、マイクを使うようになりました。マイクあったんじゃん・・・
PrimeFacesの新機能では、クライアントサイドバリデーションと、HTML5ファイルアップロードは使うかなーと思いました。
詳しいことは明日のセッション、と。
「ドラッグドロップでHTML5が作れるのはないの?」という質問に「VisualJSFってのがあったんだけど・・・」と苦笑い。それは聞いてはいけない質問やw
空き時間
16時くらいですが、この時間になると西への移動が結構きついです。太陽が正面すぎて。
で、ホテルの近くのパスタやによってみました。
味はまあ普通にとくにおいしくないパスタですが、量が多かった。あとで後悔することになります。
GlassFish Community Party
GlassFishのパーティー
会場はThirsty Bearsという、醸造所でもあるビールやさんです。ここで醸造したビールが飲めます。
地ビールとしてはそこそこの味ですが、できたてはおいしいです。
でも、夕方たべたパスタでビールが入らなくなっていました。不覚・・・
Javaチャンピオンっぽい人が来たり、ビリヤード楽しそうでしたが、結局日本の人とばかりしゃべってました。英会話力がほしい・・・けど、これ日本語が通じてもあまり話せなかった気がするな。
ということで、JavaOne前夜祭は終了
きしだのはてな: [javaone2013]JavaOne2013 1日目 セッション漬け
(2013/10/15に書いてます)
さて、JavaOne初日です。
JavaOneが本気だしてきたので、たくさんのセッションがあります。
8:30から21:30くらいまで、一日中セッション漬けでした。そんな朝からほんとに出てたの?という疑問があるかもしれませんが、時差ぼけのせいか、サンフランシスコでは毎日7時に起きて23時に寝るという規則正しい生活をしていました。
セッションは、次のとおりです。
CON3638 10 Tips for Java EE 7 with PrimeFaces
CON2176“Use the Force, Luke” or Tips and Tricks for Using the Capabilities of JavaFX
CON6617 Java EE 7: What’s New in the Java EE Platform
CON6064 Introducing the Java Time API in JDK 8
CON8165 Type Inference in Java SE 8
BOF3473 The NetBeans Roadmap for Cutting-Edge Tooling for Cutting-Edge Java
BOF3433 What’s New in Java Transaction Processing
BOF4244 Swing 2 JavaFX
BOF4040 NetBeans Platform BOF
10 Tips for Java EE 7 with PrimeFaces
Java EE 7対応のPrimeFacesの話。
PrimeFacesというのは、jQueryベースのJSFコンポーネントセットです。
10のチップスということですけど、印象に残ったのは次の点。
- Bean Validation
- 新しいコンポーネント
- Pushフレームワーク
- Faces Flows
- File Upload
全体的に、Bean Validationはいろいろなところで使われるようになっていて、影で支える印象です。
あと、JSFは基本的に処理をJava側で行うのですが、やはりそれでは通信ラグがあるので、クライアント側でのバリデーションも実装されたようです。
新しいコンポーネントとしては
- オートコンプリート
- TreeでのD&D
- ダイアログフレームワーク
- 固定のテーブルヘッダー
- スクロールできるタブ
のようなものが取り上げられていました。
いままでPrimeFacesのダイアログは子ダイアログまでで、孫ダイアログを出すことができなかったのですが、これが自由に出せるようになるならとてもいいですね。
Pushフレームワークは、WebSocketやロングポーリング、JSON-Pなどを統一的に扱えるフレームワークなんだと思います。POJOをやりとりできるのでプログラムしやすそう。
Faces Flowsは、 @FlowScoped/@FlowDefinitionで一連のページ遷移でのスコープを定義するものです。
あと、FileUploadは、JSF2.2で導入された標準のFileUploadに対応したほか、HTML5を利用したコンポーネントになっているという話。
JSF2.2本体とあわせて、正常進化という感じですね。
“Use the Force, Luke” or Tips and Tricks for Using the Capabilities of JavaFX
JavaFXのセッションでも聞いておくかーということで取ってみたセッション。
CSSとSVG使いましょうって話でした。
まあ、スターウォーズ人気なんだな、という感想。
Java EE 7: What’s New in the Java EE Platform
JavaEEスペックリードのリンダ・デミケルのセッション。
次のように盛りだくさんの内容。
- JSON Processing 1.0
- WebSocket
- JAX-RS 2.0
- CDI
- Pruning
- JMS 2.0
- Concurrency Utilities
- Batch
- JPA 2.1
とりたてて新しいことを話したわけではないので、技術的詳細は省きます。
CDIはいろいろなところで当たり前に出ていたのですが、会場から「CDIって何?」という質問が出て、リンダが「Contexts and Dependency Injection」とキレ気味に答えたのが今回のハイライトです。
と、このとき冗談気味にTwitterに書いたのですが、Java EE 7全体として、これは象徴的なできごとだったのかもしれません。
Java EE 5までは、EJBがその中心的位置づけになっていました。でも、Java EE 7では明確にCDIが中心的な役割になっています。EJBが結果として単にプロモーション的な「位置づけ」だったのに対して、CDIは実際にJava EE 7での屋台骨となっています。
そして、Java EE 7の提供側では、すでにCDIが前提になっているのにかかわらず、まだ利用者にはそこまで浸透していない、ということを表す出来事でした。
あと、視力検査かってくらい文字が小さく見にくいので、会場から挙手があったにもかかわらず、華麗に無視してプレゼンを続けるリンダが印象的でした。
Introducing the Java Time API in JDK 8
JDK8で導入された、新しい日付時刻APIについて、スペックリードのStephen Colebourneのセッション。
これも特に新しい内容があったわけではないので、APIの詳細は以前のエントリなどを参考にしてください。
http://d.hatena.ne.jp/nowokay/20130917#1379376320
ステファンさんは、終始にこやかにプレゼンしていました。おだやかなガンコものという印象です。
ZonedDateTimeについて会場から、zoneIdを省略したものが欲しいという要望が出ていました。ステファンさんの答えは、LocalDateTimeを使えばいいよ、ってことでした。
あと、地域の事情で暦に変更があった場合は、JDKのアップデートで対応していく、ということでした。
セッションが終わって、上記エントリが盛り上がったときにTwitterでステファンの名前が流れまくったことについて、ぼくのブログが原因でしたごめんね、と謝っておきました。ついでに、ぼくもzoneIdを省略したものが欲しいというと、それは日本の固有の事情があるのか?と聞かれましたが、それ以上のやりとりを続ける英語力がなかったため、続きはTwitterで!と言って逃げましたw
求む英語力。
昼ビール!
会場ヒルトンホテルの横の通りをふさいで、休憩スペースになっています。
ここでは、ビール飲み放題!
Type Inference in Java SE 8
Javaの型推論の話。
Javaには型推論ないんじゃね?と思う人もいるかもしれませんが、地味に型推論はありました。
それを利用したのがJava SE 7のダイヤモンド演算子だったりします。
ただ、今までの型推論は貧弱だったので、メソッド呼び出しの引数にダイヤモンド演算子が使えないとか、同じく引数でジェネリックメソッドの呼び出しを書いたときに型推論が効かず、いちいち記述が必要とかありました。
List<String> strs = new ArrayList<>();
はできるのに
some.hoge(new ArrayList<>());
はできないので、
some.hoge(new ArrayList<String>());
と書く必要があったとか。
あと、JUnitでテストを書くときに
assertThat(myList, hasItem(Matchers.<Foo>hasProperty("hoge", is("aa"))));
とか書く必要があったのですが、ちゃんと型を省略して次のように書けるようになります。
assertThat(myList, hasItem(hasProperty("hoge", is("aa"))));
このときの型推論がJava7からJava8にどう変わったのかという話をしていたのですが、型推論の解説部分が資料の下部にあったので、ぜんぜん見えませんでした・・・
ヒルトンの会場では、資料の下のほうがぜんぜんみえません・・・
ダウンロードした資料を見直すと、「some.hoge(new ArrayList<>());」の例では、最初からnew ArrayList<Object>()を仮定して推論を始めてしまうために推論ミスになってしまうということだったようです。これをnew ArrayList<t1>()のように型変数をあてはめて推論することで最終的に正しい型にたどりつけると。
まとめとして
- ダイヤモンド演算子がどこでも使える
- 三項演算子も怖くない
- ジェネリックメソッドも気にしなくていい
- より洗練されたAPIが定義できる
- 匿名クラスいらない
というのをあげていました。
The NetBeans Roadmap for Cutting-Edge Tooling for Cutting-Edge Java
NetBeansのロードマップの話
前日にNetBeans DayがあってNetBeansの話はたくさん聞いた人が多かったためか、人はそれほど多くありませんでした。
ロードマップはこんな感じ。
ざっくりしてますね。
ここでも、まずはJava8対応が目先の目標で、それからの話はそれ以降という感じ。
要望として多いのが
- Visual Web
- UML
- Android
ということを取り上げていました。
まるでBOFのようなゆるさだなと思ったら、このセッションからはBOFだったようです。
What’s New in Java Transaction Processing
トランザクションの話。
@Transactionalアノテーションをクラスやメソッドにつけることで、宣言的トランザクションが実行できるという話。
検査例外はロールバックせず非検査例外ではロールバックするというのはEJBと同じ挙動ですが、rollbackOn、dontRollbackOnという属性で例外を指定できるというのが便利そうです。
あとは、トランザクションごとにインスタンスが生成される @TransactionScoped というスコープの紹介がありました。あまり使うことはなさそうですけど。
これで通常のアプリケーションではEJBが不要になりましたね。
でも、ここでもやはりCDIって何?という場面がありました。
大阪うどん!
なんだか大阪うどんという店があったのでよってみました。
お店では、ふつうに日本人の店員さんで、ふつうの日本語が通じました。
味は、高速道路のサービスエリアで食べるうどんみたいな感じです。ちょっとダシが日本のとは違うかなーくらい。ただし、量は多い。うどんはこれでmini udonです。
写真でみると確かにminiですが、天丼がかなり大きいです。なので、うどんも結構大きい。おなかいっぱい。
Swing 2 JavaFX
SwingプログラマがJavaFXプログラマにどう移行するか、とかいう話ではなく、SwingとJavaFXの相互連携の話でした。
これまでSwingではJFXPanelを使うとJavaFXコンポーネントを使えていたのですが、JavaFXにSwingコンポーネントを載せるということができていませんでした。
それが、SwingNodeを使うとできますよ、という話。
SwingとJavaFXでは、イベントスレッドが別々なので、それをどう統合するかという話もありました。
NetBeans Platform BOF
もう完全に関係者ばかりのセッション。
「Javaの未来はNetBeansの未来だし、NetBeansの未来はJavaの未来だ」とか豪語してましたね。
やるな。
壇上から写真とってたり、みんなリラックスしてました。
あとは、JavaFXをNetBeansに載せていくって話。
このあたりは、Geeertjanのブログを見ると実際に動き出してる感じがあります。
Thanks JavaFX: WYSIWYG HTML Editor for NetBeans IDE (Geertjan’s Blog)
Improve Office Productivity with JavaFX and the NetBeans Platform (Geertjan’s Blog)
ということで、この日はここで終了。おとなしくホテルに帰って寝ました。
きしだのはてな: [netbeans]NetBeans7.4には最新lombokを
NetBeans7.4がリリースされましたが、lombokが動かなくなってました。
で、NetBeans7.4ではlombokは動かない!というエントリーを書こうと思って改めてフォーラムを見ると、なんだか新しいバージョンでは動くようなことが書かれてました!
最新の1.12.2をダウンロードして試してみると、Java8+NetBeans7.4でlombok動きました!
こんなコードが正常に動いてます。
@Setter@Getterpublicclass NewClass { private Optional<Integer> a; publicstaticvoid main(String... ar){ NewClass nc = new NewClass(); nc.setA(Optional.of(123)); nc.getA().ifPresent(System.out::println); } }
でも、NetBeans7.3.1で1.12.2を使うのはおすすめしないって書いてあります。
Issue 451 - projectlombok - Java 8 not supported - Spice up your java! - Google Project Hosting
きしだのはてな: [java]今どきのJava Webフレームワークってどうなってるの?
昨日のSeasar2のエントリについたコメントなどで、「とはいえ代わりに何つかうの?」みたいな話が出てたので、とりあえずJava EEのWebフレームワークについて簡単にまとめてみます。
Java SE 8+Java EE 7+lombokで書いていますが、基本的なところはJava SE 7+Java EE 6でも大丈夫です。
なので、今どきとは書いてますが、基本的には2009年12月のJava EE 6ということで、実はすでに4年近くたってます。
何も考えてない
なんも難しいこと考えないなら、やっぱJSPが楽ですよね。
なんでも書けちゃう。
<%@pagecontentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>JSP Page</title></head><body><h1>Hello JSP!</h1><%!int add(int left, int right){ return left + right; } %><%int res = add(2, 3); out.println("2と3を足すと" + res); %></body></html>
addメソッドを定義して、呼び出して表示しています。Javaコードで。
実行するとこんな感じです。
ロジックを分離したい
JSPだけでは、HTMLとJavaコードがまじってしまうし、やはりロジックは分離して、JSPには表示のことだけをやってもらったほうがいいですね。
ということで、こんなJavaクラスにロジックを書くことにします。
import javax.enterprise.context.ApplicationScoped; import javax.inject.Named; @Named@ApplicationScopedpublicclass CalcLogic { publicint add(int left, int right){ return left + right; } }
@NamedアノテーションをつけてCDI管理して、オブジェクトの寿命を @ApplicationScopedとしてアプリケーション起動中ずっと有効にしています。ステートレスなロジックはアプリケーションスコープにしてオブジェクトを使いまわすことが多いですよね。
ここでは単に足し算してるだけですが、まあもっと長いロジックがあると思ってください。
ついでにこんなクラスも作っておきます。
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.TemporalAdjusters; import javax.annotation.PostConstruct; import javax.enterprise.context.RequestScoped; import javax.inject.Named; import lombok.Getter; @Named@RequestScopedpublicclass DateLogic { @Getterprivate LocalDateTime now; @PostConstructpublicvoid init(){ now = LocalDateTime.now(); } public LocalDate getLastDay(){ return now.toLocalDate() .with(TemporalAdjusters.lastDayOfMonth()); } }
これもCDIに登録しますけど、今回は@RequestScopedにしてリクエストのたびにオブジェクトが生成されるようにしています。あと、コンストラクタではなくて @PostConstructアノテーションをつけたinitメソッドで初期化を行うようにしてます。
getter書くのめんどくさいので、nowフィールドにはlombokの @Getterアノテーションつけてます。
あとはgetLastDayとして、月の最終日を返しています。
Java 8のDate Time APIですね。ただ、残念ながら、GlassFish4は現状でJava 8のlambda構文には対応していません。
そしたら、こんなJSPを書きます。
<%@pagecontentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>JSP Page</title></head><body><h1>Hello World!</h1> 2と3を足すと${calcLogic.add(2, 3)}<br/>今は${dateLogic.now}<br/>月末は${dateLogic.lastDay}<br/></body></html>
ロジックとビューが分離されました。
実行するとこうなります。
DateLogicのスコープを @RequestScopedにしているので、リロードするたびに時間がかわりますが、これを @SessionScopedにすればセッションで最初にアクセスした時間、 @ApplicationScopedにすればアプリケーションを起動して最初にアクセスした時間が表示されます。
CDIを使うと、オブジェクトの寿命管理が楽になるので便利です。
パラメータを受け取りたい
さてさて、WebアプリケーションではURLやその中のクエリパラメータ、POSTデータなど、いろいろな入力によって処理することも必要になります。
ということで、ちょっと結果表示用のクラスを用意します。
import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @NoArgsConstructor@AllArgsConstructor@Getter@Setterpublicclass Result { int left; int right; int ans; }
アノテーションたくさんですが、基本的にはint型のフィールドが3つあるだけです。ここにlombokでセッターゲッター、デフォルトコンストラクタ、フィールドを初期化するためのコンストラクタを追加してます。
そして、リクエストを受け取るためのクラスを用意します。
import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.inject.Named; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; @Named@ApplicationScoped@Path("/calc") publicclass CalcService { @Inject CalcLogic logic; @Path("add") @GETpublic Result add( @QueryParam("left") int p1, @QueryParam("right") int p2) { int ans = logic.add(p1, p2); returnnew Result( p1, p2, ans); } }
@NamedでCDIに登録して、@ApplicationScopedとしています。
@Pathアノテーションで、このクラスは/calcというパスを処理するように指定しています。
で、logicフィールドに@Injectアノテーションつけて、さっきの計算ロジックをもってきます。
あとは、実際にリクエストを処理するaddメソッドの用意。
ここでは、@Pathアノテーションでaddというパスを処理するように指定して、@GETアノテーションでHTTPのGETメソッドを処理するようにしています。
あと、addメソッドの引数に @QueryParamアノテーションをつけて、この引数にURL中のleft=xxxやright=xxxの値が入るようにしています。
JAX-RSの仕様をしらなくても、ここを見るだけでどのようなリクエストを処理するかなんとなく把握できると思います。
処理的には、受け取ったパラメータをlogicに渡して、Resultにくるんで返すという処理です。
そんではちょっとアクセスしてみましょう。
JSONだ!
JSONで表示されても、という人もいると思うので、ちょっとResultクラスに@XmlRootElementアノテーションをつけてみます。(import略)
@NoArgsConstructor@AllArgsConstructor@Getter@Setter@XmlRootElementpublicclass Result { int left; int right; int ans; }
ん?
ソースをみてみると・・・
<?xml version="1.0" encoding="UTF-8"?><result><ans>8</ans><left>3</left><right>5</right></result>
XMLだ!
NetBeansのブラウザはXMLをいい感じには表示してくれませんでした。
実際には@Producesアノテーションでmimeタイプを指定しておいたほうがいいでしょう。複数のmimeタイプを指定すると、ブラウザからのAcceptヘッダにしたがって適切な出力をしてくれます。
@Path("add") @GET@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public Result add( @QueryParam("left") int p1, @QueryParam("right") int p2) { int ans = logic.add(p1, p2); returnnew Result( p1, p2, ans); }
これで、人間以外のお客さまに満足していただけるサイトができました!
でもぼくはもう少し見やすいほうがいいな。人間はわがままです。
ということで、こんなJSPを作ります。名前はwithrs.jspとします。
<%@pagecontentType="text/html" pageEncoding="MS932"%><!DOCTYPE html><html><head><metahttp-equiv="Content-Type"content="text/html; charset=MS932"><title>JSP Page</title></head><body><h1>Hello JAX-RS</h1> ${it.left}と${it.right}を足すと${it.ans}です </body></html>
itというオブジェクトを使ってるところがミソです。
あと、エンコーディングをMS932にしてるのは、現状ではエンコーディングをちゃんと指定できなくてシステムデフォルトのエンコーディングで表示されてしまうからです。Macなどではutf-8のほうがいいかもしれません。いまのところはGlassFishの起動オプションでエンコーディングを指定しておくほうがいいです。
で、まあさっきのaddメソッドでmimeタイプをHTMLにして、@Templateアノテーションを追加しておきます。
@Path("add") @GET @Produces(MediaType.TEXT_HTML) @Template(name="/withrs") public Result add( @QueryParam("left") int p1, @QueryParam("right") int p2) { int ans = logic.add(p1, p2); return new Result( p1, p2, ans); }
テンプレート名には拡張子jspをつけてもいいけど、つけないのがいいですね。
アクセスしてみると、こうなります。
わあ、みやすい!
と、こんな感じで、JAX-RSを使うと基本的なJavaコードをもとにアノテーションでさまざまな入力・出力に対応できます。
ただ、残念ながら、この@Templateに関してはjerseyの独自拡張ということになっていて、JAX-RS標準ではありません。次版で標準化されることを期待しています。
ついでに、次のような@Pathアノテーションの指定と@PathParamアノテーションを使うと、URLの分解もできます。
@Path("add/{left}/{right}") @GET@Produces(MediaType.TEXT_HTML) @Template(name="/withrs") public Result addPath( @PathParam("left") int p1, @PathParam("right") int p2) { return add(p1, p2); }
JAX-RSはかなり強力かつ柔軟なので、入力をうけとって出力を返すというものには十分に使えるように思います。
もともとHTML出力は標準としては考えられてなかった感じがあって、まだ少し実装がこなれる必要がると思いますけど。
フォーム入力する
フォーム入力も、JAX-RSでPOSTを受け取るようにすればいいんですけど、ちょっとめんどうです。
ということでJSF。
まずは、画面を管理するクラスをつくります。
@Named@SessionScoped@Setter@Getterpublicclass CalcController implements Serializable{ Integer left; Integer right; Integer ans; @Inject CalcLogic logic; publicvoid add(){ ans = logic.add(left, right); } }
@SessionScopedにしてCDIに登録しています。もうすこし狭いスコープでもいいけど、今回はこれで。
あと、フィールドは未入力状態に対応できるよう、intではなくInteger型にしています。クラスに@Setter/@Getterアノテーションがついているので、すべてのフィールドにアクセッサが自動生成されます。
あとは、CalcLogicをもってくるようにして、addメソッドで計算してます。
で、こんなJSPつくります。
<%@pagecontentType="text/html" pageEncoding="UTF-8"%><%@ taglibprefix="h"uri="http://java.sun.com/jsf/html" %><%@ taglibprefix="f"uri="http://java.sun.com/jsf/core" %><!DOCTYPE html><html><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>JSP Page</title></head><body><h1>Hello JSF!</h1><f:view><h:form><h:inputText label="左辺"value="#{calcController.left}" required="true"/>と <h:inputText label="右辺"value="#{calcController.right}" required="true"/><h:commandButton value="足す"action="#{calcController.add()}"/>答え<h:outputText value="#{calcController.ans}"/></h:form><h:messages/></f:view></body></html>
inputTextコンポーネントで入力、outputTextコンポーネントで出力、commandButtonでボタンを置いて、それぞれCalcControllerクラスの要素に結び付けてます。
適当に入力して「足す」ボタンを押すと、結果が表示されます。
requiredをtrueにしているので、入力がなければエラーになるし、Integerに結び付けてるので数値じゃなければエラーになります。
もっとHTMLっぽく書きたいという人は、Faceletsを使うのがいいと思います。
<?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:jsf="http://xmlns.jcp.org/jsf"><head><title>Facelet Title</title></head><body jsf:id="body"><h1>Hello from Facelets</h1><form jsf:id="form"><inputtype="text"label="左辺" jsf:value="#{calcController.left}" required="true"/>と <inputtype="text"label="右辺" jsf:value="#{calcController.right}" required="true"/><inputtype="submit"value="足す" jsf:action="#{calcController.add()}"/>答え #{calcController.ans} </form><div jsfc="h:messages"/></body></html>
jsf:idとかjsf:valueとかjsfcとか、JSF独自の属性が入るものの普通っぽいHTMLになっています。
これで次のように動きます。
まちがっても、JSFでWeb全部まかなおうとしてはダメですが、管理系や業務アプリ、登録フォームなどフォーム主体の画面にはとてもよいです。
Ajax対応もされていて、JavaScriptを記述せずにかなりの処理ができるので、たいしたことないAjaxを持った画面が大量にあるという場合には、かなりいい気がします。
2013/11/9追記
Ajaxへの対応も書いておきます。
JSFのフォームをAjax対応するには、基本はf:ajaxタグを追加するだけです。
<?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:f="http://xmlns.jcp.org/jsf/core" xmlns:jsf="http://xmlns.jcp.org/jsf"><head jsf:id="head"><title>Facelet Title</title></head><body jsf:id="body"><h1>Hello from Facelets</h1><form jsf:id="form"><input jsf:id="left"type="text"label="左辺" jsf:value="#{calcController.left}" required="true"/>と <input jsf:id="right"type="text"label="右辺" jsf:value="#{calcController.right}" required="true"/><input jsf:id="btn"type="submit"value="足す" jsf:action="#{calcController.add()}"><span jsfc="f:ajax" render="ans msg" execute="left right"/></input>答え <span jsfc="h:outputText"id="ans"value="#{calcController.ans}"/><divid="msg" jsfc="h:messages"/></form></body></html>
変更点としては、Ajax呼び出しで送信するデータをもったコンポーネントや受信して更新するコンポーネントを指定する必要があるため、inputタグやdivタグにidをつけています。また、裸のEL式ではid指定できないため、「答え」のところもh:outputTextコンポーネントにしています。
また、JavaScriptが生成されるheadも指定できる必要があるため、headにもidをつけています。
これは、実際につくるときにはajaxじゃないときにも対応しておいたほうがいいです。もちろん、formごと指定すれば個別のidを指定できる必要はありません。
その上で、次のようなf:ajaxタグを追加して、executeで送信するコンポーネントのID、renderで表示更新するコンポーネントのIDを指定しています。
<span jsfc="f:ajax" render="ans msg" execute="left right"/>
基本的にJavaScriptをさわらずAjaxを基本にした画面が構築できるので、Java技術者しかいない、JavaScriptが使える人がいたとしても、ソースをJavaScriptとJavaに対応するのが大変というときにはおすすめです。
ただ、FaceletsでのHTML親和性の高い記述というのは、デザイナとの協業があるってとき以外は面倒なだけなので、おとなしくh:outputTextタグとか書いておいたほうがいいですね。
追記ここまで。
設定
設定はだいたいNetBeansが勝手にやってくれるのであまり気にしないのですが、とりあえず設定ファイルものせておきます。
web.xmlには、JSF関連の設定が必要です。
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.1"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"><context-param><param-name>javax.faces.PROJECT_STAGE</param-name><param-value>Development</param-value></context-param><servlet><servlet-name>Faces Servlet</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>Faces Servlet</servlet-name><url-pattern>*.xhtml</url-pattern><url-pattern>/faces/*</url-pattern></servlet-mapping><session-config><session-timeout> 30 </session-timeout></session-config><welcome-file-list><welcome-file>faces/index.xhtml</welcome-file></welcome-file-list></web-app>
JAX-RSでは、設定クラスが必要になります。ここでルートパスなどを決めます。また、サービスクラスはここで登録しておく必要があります。NetBeansを使う上では、勝手に管理してくれるので気にする必要はあまりないですが。
@Templateを使うときにJspMvcFeatureの登録は自力で行う必要があります。
import java.util.Set; import javax.ws.rs.core.Application; import org.glassfish.jersey.server.mvc.jsp.JspMvcFeature; @javax.ws.rs.ApplicationPath("ws") publicclass ApplicationConfig extends Application { @Overridepublic Set<Class<?>> getClasses() { Set<Class<?>> resources = new java.util.HashSet<>(); addRestResourceClasses(resources); resources.add(JspMvcFeature.class); return resources; } privatevoid addRestResourceClasses(Set<Class<?>> resources) { resources.add(sample.recentweb.CalcService.class); } }
CDIのbeans.xmlやJSFのfaces-config.xmlは、今回ファイルを作成していません。
こんな感じなので、設定まわりもまあ許容範囲かなと思います。
ついでに、pom.xmlのdependencyだけ書いておきます。
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.12.2</version></dependency><dependency><groupId>org.glassfish.jersey.ext</groupId><artifactId>jersey-mvc-jsp</artifactId><version>2.0</version><scope>provided</scope></dependency><dependency><groupId>javax</groupId><artifactId>javaee-web-api</artifactId><version>7.0</version><scope>provided</scope></dependency></dependencies>
まとめ
リクエストを受け取ってレスポンスを返す、という場合には、レスポンスがHTMLであれXMLであれ、JAX-RSが便利です。
また、フォーム形式での入力にはJSFがいいです。Ajax対応もしているし、PrimeFacesなどコンポーネントも充実しています。
テンプレートに関しては、JSFの場合はFaceletsがいい感じになってきましたが、JAX-RSからのテンプレートには使えません。JAX-RS用テンプレートとしてはThymeleafなどJava EE標準ではないテンプレートを使うことが多いと思います。このとき、Faceletsとレイアウトを共有するといったことが難しく、結構こまります。
ということで、それを解決しようとするとJSFに対応したJavaEE外のテンプレートを使うことになるんではないでしょうか。JSFは、管理画面や購入シーケンスなど、ある程度は通常Webと分離したところで使うことになるので、テンプレートを共有しないという解決方法もありますが。
今回、全般において、Java EE独自の特別なオブジェクトは使っていません。基本的にアノテーションでの対応です。
なので、ユニットテストを書くときにWebフレームワークを気にする必要があまりありません。JSFまわりでは独自オブジェクトを結構つかうことになっていまいますが。
で、なんにせよ、オブジェクトの管理はCDIがだいぶ育ってきました。
DIコンテナは変数に勝手にインジェクションしてくれることに注目されがちですが、一番の目的はオブジェクトのライフサイクル管理です。CDIはとても便利です。@Transactional みたいなアノテーションも導入されてトランザクション管理もできるようになったので、通常の範囲だとEJBがいらない子になりました。
今すぐ使えるかといわれると、実行環境の問題などもあって、まだJava EE 6の範囲でしか使えないものもありますが、それでも結構使い物になってきていると思います。
書籍
Java EE 7対応の書籍はまだ日本語では出ていませんが、Java EE 6のものでも参考になります。
Beginning Java EE 6~GlassFish 3で始めるエンタープライズJava (Programmer's SELECTION)
- 作者:Antonio Goncalves,日本オラクル株式会社,株式会社プロシステムエルオーシー
- 出版社/メーカー:翔泳社
- 発売日: 2012/03/09
- メディア:大型本
- 購入: 5人 クリック: 147回
- この商品を含むブログ (29件) を見る
JAX-RSに関しては、これも前のバージョンのものですが、基本は変わっていないのでひととおり読むといいと思います。
- 作者:Bill Burke,arton,菅野良二
- 出版社/メーカー:オライリージャパン
- 発売日: 2010/08/23
- メディア:大型本
- 購入: 28人 クリック: 804回
- この商品を含むブログ (41件) を見る
uyota 匠の一手: FreeBSD の Java は openjdk
% ls -d /usr/local/*jdk*
/usr/local/diablo-jdk1.5.0 /usr/local/jdk1.5.0
/usr/local/diablo-jdk1.6.0 /usr/local/jdk1.6.0
さて、make install で引っ張られてくるのは openjdk だった。FreeBSD Java Project: How To Installによると、OpenJDK が現在の公式の Java サポートみたいだ。
OpenJDK は以前の Java の様に自分でダウンロードをしておかなくても良いみたいだ。文句を言われてから取りに行こうと思って、おもむろに make install を叩いたが、そのまま無事に終了してしまった。
もう一つ。8.4 RELEASE 時の ports を使っているが、「Enable Legacy Debugging Support」を使って i386 上ではコンパイルエラーが発生した。これを無効にしてコンパイルを再度始めたところ、今度は問題なく終了できた。メモリが 4GB あると tmpfs を使って、OpenJDK をメモリ上だけでコンパイルとインストールできる。IO が省けて速くなる。
NetBeans 7.3 がデフォルトで、 NetBeans 6.1 の ports もあった。どちらともインストールするだけで動いた。ワークスペースの情報が引き継がれないみたいで、7.3 ではプロジェクトが空っぽだった。
uyota 匠の一手: FreeBSD で OpenJDK の日本語を設定
まずは、FreeBSD 上の Java で日本語が文字化けで行った fallback を試してみた。しかし、□のまま。そこで、fontconfig を用いた設定を試みる。以前の手順の fontconfig を試したが、相変わらずうまくいかない。もう少し調べると、どうもファイル名が違うのと、フォントのパスが違うのが原因のようだ。
まずは、fontconfig.properties には、アーキテクチャの名前が入るみたいだ。FreeBSD では openjdk6 が /usr/local に入る。その中の jre/lib 内で fontconfig.FreeBSD.properties を設定する。
$ cp /usr/local/openjdk6/jre/lib/fontconfig.properties.src /usr/local/openjdk6/jre/lib/fontconfig.FreeBSD.properties
$ diff -u fontconfig.properties.src fontconfig.FreeBSD.properties
--- fontconfig.properties.src 2013-11-16 23:19:06.000000000 -0500
+++ fontconfig.FreeBSD.properties 2013-11-19 01:34:04.000000000 -0500
@@ -180,8 +180,8 @@
filename.DejaVu_Serif_Oblique=/usr/local/lib/X11/fonts/dejavu/DejaVuSerif-Oblique.ttf
filename.DejaVu_Serif_Bold_Oblique=/usr/local/lib/X11/fonts/dejavu/DejaVuSerif-BoldOblique.ttf
-filename.Sazanami_Gothic=/usr/local/lib/X11/fonts/TTF/sazanami-gothic.ttf
-filename.Sazanami_Mincho=/usr/local/lib/X11/fonts/TTF/sazanami-mincho.ttf
+filename.Sazanami_Gothic=/usr/local/lib/X11/fonts/OTF/ipag.otf
+filename.Sazanami_Mincho=/usr/local/lib/X11/fonts/OTF/ipam.otf
filename.AR_PL_UMing=/usr/local/lib/X11/fonts/TrueType/uming.ttc
filename.AR_PL_UKai=/usr/local/lib/X11/fonts/TrueType/ukai.ttc
filename.UnDotum=/usr/local/lib/X11/fonts/unfonts-core/UnDotum.ttf
そして、Sazanami と設定されているフォントだが、現在の FreeBSD では入れられないようだ。これを japanese/font-ipa に設定する。
これで、NetBeans は日本語で起動した。NetBeans で utf8 の XML を読み込んで、表示してみたがコンソールにも日本語が正しく表示されている。
きしだのはてな: [netbeans]NetBeans7.4でCordovaを使うときの注意
だいたいの手順は、こちらのYouTubeの通り。
インストールしないといけないものは
- Android SDK
- node.js
- cordova
- git
です。
Android SDK
Android SDKはこちらから。
http://developer.android.com/sdk/index.html
ここで注意する点は、Cordovaを使うためにはAPI 17(Android 4.2)が必要ということです。なので、SDK ManagerからAPI 17を追加しておく必要があります。
Node.js
Node.jsはこちら
普通にインストールすればいいですが、上記GeertjanのYouTubeで、面倒なことにならないように「Program files」以外の場所にインストールすること、と注意されてました。
Cordova
Cordovaは、Node.jsのパッケージ管理ツールでインストールします。
このとき、現時点で最新の3.1.0-0.2.0ではうまくプロジェクト作成などができないので、バージョンをちゃんと指定してインストールする必要があります。
> C:\nodejs\npm install -g cordova@3.1.0-0.1.0
追記(2013/11/26): patch 1で3.1.0-0.2.0に対応したようです。
Git
NetBeansでは外部コマンドがなくてもgitが使えるので、gitをわざわざインストールする必要がないのですが、cordovaがgitコマンドを利用するので、gitのインストールが必要です。
また、環境変数PATHにgitのインストール場所を追加する必要があります。
再起動
Cordovaやgitのパスを反映させるために、NetBeansを再起動させる必要があります。
だめだったら、Windows自体を再起動させてみてください。
いろいろ面倒
ということで、いろいろ面倒、かつ注意点がそれぞれにあるので、導入手順だけでかなりの分量が必要になるので、NetBeansが対応してるからついでにCordovaでも遊んでみようかってのはちょっと難しい感じ。
ここに書いた程度の手順で環境構築できて、Cordovaに興味がある人には、手軽に試せていいと思います。
きしだのはてな: 2013年まとめ:今年はJava8の年だった
うっかり帰省しそびれて、ひとりだらだら年越しすることになったので、はてブがたくさん付いた記事を中心に月ごとのエントリをまとめてみます。
1月
この月に一番ぶくまついたのはこの記事。それでも33程度。
SIerが日本にしかいないという割には、デマルコとかの話が腑に落ちすぎたりするのが疑問で、ちょっと調べてみました。
たぶん、日本と同じようなSIerがいて同じような問題をかかえてる気がします。違うのは、日本と同じようなSIer以外もたくさんいそうなところですかね。
あとは、FPGAばっかりさわってました。
ぼくのかんがえたさいきょうのCPU - 命令表 - きしだのはてな
でもこの後、仕事が忙しくなって、CPUの実装進んでないです。
2月
FPGAに一番かぶれてたころ。
3月
仕事が忙しくなってきた!
4月
ちょっとスキを見てまとめた感じ。
あとは作業中に気づいた系のシブ目の小ネタが多かったです。
文字列でswitchするときはif-else switchイデオムを使うほうが安全 - きしだのはてな
5月
仕事がひとやま越えて、なんかネタを書いてますね。
Java大好き男に「どのIDEが好き?」と訊ねられたとき、女はどう答え - きしだのはてな
あとは、Java8の文法をまとめ始めています。
Java 8を関数型っぽく使うためのおまじない - きしだのはてな
Java8のStreamの目的と書きやすさや可読性、並行処理の効果について - きしだのはてな
Java8で体験するオブジェクトと関数の狭間 - きしだのはてな
Java8のlambda構文がどのようにクロージャーではないか - きしだのはてな
Java8で強化されたMapと、書きやすくなったメモ化再帰 - きしだのはてな
Java8でのプログラムの構造を変えるOptional、ただしモナドではない - きしだのはてな
Java8で最もインパクトのある構文拡張、デフォルトメソッド - きしだのはてな(6月)
6月
仕事の忙しさ再燃で、あんまり技術系まとめどころじゃなくなってた感じ。
小ネタ系。
TDDで「テストばかり書いて間に合うのか?」と質問されたときの正解 - きしだのはてな
7月
仕事でLombokが気に入った。
JavaでIDEのアクセッサ生成よりlombokを使ったほうがいい理由 - きしだのはてな
8月
仕事おちついて、またJava8についてまとめだした。
Java8のOptionalがモナドになったよ! - きしだのはてな
関数を扱えることはどのようにプログラミング言語の能力をあげるか - きしだのはてな
Java8 Lambdaの文法拡張まとめ - きしだのはてな
9月
JavaOne前に、まとめておこうという感じ
Java8日付時刻APIの使いづらさと凄さ - きしだのはてな
そしてJavaOne。JavaOneまとめは、あとでやるのは難しいので、次回からは中途半端でもその日のうちにまとめてしまおうと思います。はい。
JavaOne参加は、Java SE 8/Java EE 7への理解や勉強のモチベーションとしてものすごくよかったです。
JavaOne2013 0日目 キーノートとコミュニティデイ - きしだのはてな
JavaOne2013 1日目 セッション漬け - きしだのはてな
10月
なんか体調悪くて寝てた。
9時出勤の仕事が体質にあわなかったようだ。
これだけ。
NetBeans7.4には最新lombokを - きしだのはてな
ちなみに、9時出勤の仕事は8月から始めてて、初日だけ9時にまにあった。それでも9月までは午前中には着いてたのだけど、JavaOneから帰ってきて以降、午前中に出れた日がなかった。で、体調悪くしつつダメスパイラルに突入。
11月
突然のSeasar!邪推禁止。
Seasar2を新規案件に採用するのはそろそろやめたほうがいい - きしだのはてな
あと、Seasarダメならどうするのってことで、Java EE 7についてまとめておくかってなって、今年一番ぶくま付いたエントリ。Java EE 7は、もう一息なところなんだけど、かなりいい感じになってると思う。
Java8ラムダとあわせて、来年からのJavaは別物になりそう。勉強してないSIerはどんどん取り残されると思われる。
今どきのJava Webフレームワークってどうなってるの? - きしだのはてな
で、勉強してないSIerというか、コミュニティに参加してない人と、コミュニティに参加してる人とで、意識差がものすごいことになってるという話。
「勉強会×勉強会」という枠での話なので、「勉強会〜」としてるのだけど、実際は「コミュニティに参加しないと〜」という話です。なので、「勉強会は勉強にならない」というのは勉強会に参加しない理由にならなかったりします。
あとは、Java8ラムダについてのまとめ。これは深いところにはつっこんでないけど、ラムダ話の集大成的になってます。
Java SE 8 lambdaで変わるプログラミングスタイル - きしだのはてな
12月
Java8の型推論がどこまでできるか試してみたエントリ。釣り風味。
やっぱ、ターゲット型推論の限界が低いのは、ちょっと困る。
Java8には型推論があるので型指定不要で変数が使えますよ - きしだのはてな
まとめ
振り返れば、一年かけてJava8への理解を深めていったという感じですね。実用コードを書いてるのだけど、今までのJavaとは全く違うコードが書けるようになったという一方で、限界が低く足りないものも多く記述性もそこまでよくなくて「Scalaでやれ」感がでまくる印象。
ソフトウェアの構築ということや業界について考え直す一年でもありました。「35歳定年説の正体」っていう下書きが公開されるところまで行かなかったのが、今年の後悔。
ということで、また来年もよろしくお願いします。
へびのぬけがら: NetBeans と RoboVM で iOS アプリ開発(Maven 編)
まず、 RoboVM についてですが、 Java にて iOS 用ネイティブアプリケーションを作成することができるコンパイラ、およびライブラリとなります
(詳細は公式ページ等を参照ください)
RoboVM コミュニティでは上述のコンパイラ、ライブラリに加え、 Maven 用プラグイン、 Eclipse 用プラグインが配布されていますが、残念ながらNetBeans 用プラグインはありません
NetBeans にて RoboVM を利用するにはいくつか方法がありますが、 Maven プラグインを使用する方法が最も簡単かと思います
Maven プラグインの使い方を、サンプルアプリケーションを使って解説します
使用する環境は以下の通りです
OS: Mac OS X 10.9.1
Xcode: 5.0.2
NetBeans: 7.4 (Build 201310111528)
まず、 github にある RoboVM サンプルアプリケーションのリポジトリを cloneします
clone 後、最新の RoboVM 、 Maven プラグインを利用するために pom.xml を編集します
2014年1月18日現在、最新の RoboVM のバージョンは "0.0.8"、 Maven プラグインのバージョンは "0.0.8.1"になるので、以下の2カ所を修正します
<groupId>org.robovm</groupId>
<artifactId>robovm-maven-plugin</artifactId>
<version>0.0.8.1</version>
<configuration>
<config>
<mainClass>org.robovm.sample.ios.RoboVMSampleIOSApp</mainClass>
<os>ios</os>
<arch>x86</arch>
</config>
</configuration>
</plugin>
<groupId>org.robovm</groupId>
<artifactId>robovm-rt</artifactId>
<version>0.0.8</version>
</dependency>
<dependency>
<groupId>org.robovm</groupId>
<artifactId>robovm-cocoatouch</artifactId>
<version>0.0.8</version>
</dependency>
設定後、実際に動かしてみます
Maven プラグインのゴールは下記の通りになっています
- robovm:iphone-sim … iPhone シミュレータにて実行
- robovm:ipad-sim … iPad シミュレータにて実行
- robovm:ios-device … 実機にて実行(要プロビジョニング済)
- robovm:create-ipa … ipa ファイル生成
へびのぬけがら: NetBeans と RoboVM で iOS アプリ開発(Gradle 編)
今回は Gradleを使用した開発を紹介します
Gradle プラグインは公式では提供されていませんので、拙作のプラグインを利用します
使用する環境は以下の通りです
OS: Mac OS X 10.9.1
Xcode: 5.0.2
NetBeans: 7.4 (Build 201310111528)
まず、使用する環境に Gradle をインストールします
以下の例では、 Homebrewを使用してインストールを行っています
次に NetBeans に Gradle Support プラグインをインストールします
拙作のサンプルアプリケーションのリポジトリを clone します
このサンプルアプリケーションは、公式のサンプルアプリケーションを Gradle 対応に変更したプロジェクトになります
clone 後、 Gradle wrapper を利用するため、プロジェクトのプロパティを開き、以下のように「Gradle home」のフィールドを空白に設定します
設定後、実際に動かしてみます
Gradle プラグインのタスクは下記の通りになっています
- launchIPhoneSimulator … iPhone シミュレータにて実行
- launchIPadSimulator … iPad シミュレータにて実行
- launchIOSDevice … 実機にて実行(要プロビジョニング済)
- createIPA … ipa ファイル生成
きしだのはてな: 台湾に行ってきた
明星和楽という、Nulabのhsmtさんたちが中心になってやってる福岡でやってるイベントが、今年は台湾であるというので行ってみました。
MYOJO WARAKU 2014 in TAIPEI – Jan 18, 2014
台湾に行ってみたかったのと、こういう海外イベントでは日本から行く人と仲良くなりやすいというのとで。
明星和楽
明星和楽は、西門紅楼というところでありました。
建物に入ると、ナストマくんのナスのほうの人が行儀よく店番してました。トマのほうの人はごはんに行ってた。NetBeansの人にはねこびーんで有名ですね。
広場のほうでは、長浜ナンバーワンが店を出していました。
麺はちょっと違う気がしたけど、スープなどは博多ラーメンだった。
広場のステージ前では、どっかのへんなおっさんが変な踊りをずっと踊っていて、異様な雰囲気を醸し出していました。
夜は、hsmtさんもなんかやってましたね。
屋内ではスタートアップの人がプレゼンやってたり、ステージがあったりしました。
アラタナの宮崎さんのプレゼンがおもしろかった。
侍BALLERSの人たちとHUMAN BEAT BOXER DAICHIのセッションは盛り上がりました。
DAICHIさんは、ひとり「あまちゃん」で話題になってましたね。
▶ Human Orchestra/口だけであまちゃんOPテーマ - YouTube
これを、ステージでライブサンプリングでやってました。すごい。
あと、千年にひとりとかで話題の、Rev. from DVLが来てました。
橋本環奈マジ天使!
西門
明星和楽の会場がある西門は、台湾の原宿といわれているらしいです。
土日は家族連れでいっぱい、月曜日は学校帰りの中高生でいっぱいと、そんな感じでした。
歩道のひとだかりは、侍BALLERSの人たちのストリートパフォーマンスです。
撮影してるところもいくつか見ました。写真撮ってたら、おねえさんがこっちに手をふってくれたのだけど、その瞬間は撮れてなくて残念。
通りに普通に刺青やさんがあって、ふつうに女の子が背中に入れてもらってたのがビックリでした。
そんなにぎやかな西門も、深夜2時くらいにはだれもいなくなって、静かになります。
明星和楽会場の西門紅楼もこんな感じ
台中
明星和楽翌日、台湾には日本の新幹線が走ってるということで乗ってみました。新幹線に乗ることが目的で、行き先はどこでもよかったのですが、台南までいくのもおおげさなので、台中まで。
中もそのまま新幹線
台中には美術館があるということで、そこに行ってみようかと。その前にパスタやさんによってみました。
チーズをその場で削ってくれる感じのがんばったお店でした。
そしたら、伝票に「外国人」とw
お店を出るときにも店員さんたちから結構珍しそうに見られていたのですけど、まあ外国から来た観光客がわざわざ台湾で美術館に来てパスタとか食いませんよね。
レジでお金を払うと、女の子が、ちょっとためらって、がんばった感じで「Did you enjoy?」みたいなことを聞いてきて、ものすごくかわいかった。高校に入ったときに元いた中学の部活に顔を出して「先輩高校の部活どうですか?」って聞かれるような感じの甘酸っぱさがありました。
はっきりいって、今回台湾が楽しかったというのの9割はあの女の子のしぐさによるものです。キュンキュン来た。
美術館では、ジョアン・ミロの展覧会をやってました。
こういった、高度に記号化された抽象絵画を100点以上、よくわからない台湾語で説明されながら(なんか団体客が説明うけてた)見てまわるのは、結構つらかったw
美術館から駅に戻るのが大変で、バス停がみつからない。Google Mapsを使ったら負けだと思ってたのですが、確認してみると行き過ぎていたようです。それらしいところはなかったのだけど。結局、もうひとつ先のバス停まで歩きました。
バスに乗って、まあ20元だよねとお金を出そうとすると、入れるなといわれてカードをもらいました。
あぁ、このカードを降りるときに渡してお金を払うのね、と思ったのだけど、降りるときもお金出そうとすると入れるなといわれました。いいんだろうか。
駅には、ダンボールでできたお店が。これかわいい。
ということで、この日は、新幹線にのってパスタ食って美術館、というぜんぜん台湾らしくない日曜日でした。パスタやさんの女の子がかわいかったことを除いて。
九份
さて、台湾といえば、「千と千尋の神隠し」のモデルになったと噂になった、九份です。実際は、たまたま似ているだけで、九份がモデルというのは否定されてるみたいですが。
まあ、それでもなかなか楽しいところでした。
台北からバスで行けるみたいですが、今回は電車+バスで行ってみました。
まず台北駅で瑞芳行きの切符を買います。窓口で買う必要があるのですが、「ルイフェン」って言えば買えます。みんな瑞芳に行きますからね。
電車に乗りに行こうと思ったら、こんなオブジェが。なんかズルい。
電車に乗ったら、なんか2人組の女の子の片方が隣にすわってて、あっちと替わってもらえませんか?って英語で言われたので(たぶん日本人)席を替わりました。そしたらそっちでも隣の女の子に後ろの人と替わってくれませんか?ってこんどは台湾語で言われて、どんどんずれていきました。なんか楽しい。
瑞芳で降りたら、バスに乗ります。「往九份」って書いてあるのに乗ればいいです。
ネットで調べると九份バス停ではなく降車バス停まで行って降りてきたほうがいいとあって、実際みんな降車バス停で降りてました。
で、九份
いい感じです。
ちょっと裏に入ると、住宅です。ナンパされましたが、言葉が通じず逃げられてしまいました。
変なおばちゃんから食いもんを買います。イモトとテレビに出たらしい。
いったん一番したまで降りたので、帰ろうと思ったけど、九份バス停ではすでにバスがいっぱいで乗れる気配がなかったので、また登って降車バス停から乗ることに。
そしたら、なんかネットで見た感じ。
よく見る風景が!
満足したので帰ります。
帰り、コインがなくてバス代が払いにくいので、なにか食べてお金を崩そうと思ってへんな饅頭のようなものを買いました。
そしたら、50元玉でおつりが返ってきたのだけど、10元玉が欲しかったので、「我要十元」と言ったら、なんとか通じたようで、10元玉5枚と替えてくれました。
しかし、バスはすごい行列。台北直通のバスはなかなか乗れないので、瑞芳行きに。電車で来ておいてよかった。
月曜日に来てこれだったので、土日だともっとすごかったのかも。
ドイツビール
台北に戻ったら、ドイツビールやさんに行ってみました。
なかなかおいしい。金額も日本と同じくらい。
飲んでたら、おっさんは帰ってしまって、店にひとり取り残されてしまいましたw
おばちゃんが外にいる、と。おばちゃんが戻ってきたので、もう一杯ビールを頼むと、「中国人から中国語を習ったの?それは中国の発音よ」という感じのことを英語で言われました。台湾語と北京語は違うらしい。
台湾たのしい
ということで、すごく台湾たのしかった。
書いたとおり、その9割はパスタやのレジの女の子にもっていかれていますが。いやー、いま思い出しても甘酸っぱい。
というのは別として、東京みたいに行儀よくしないといけない緊張感とかがぜんぜんなくて、だらだらと過ごせました。東京だとリュックを背中に背負ったまま混んだ電車にうっかり乗ってしまうと「おまえどっか行け」みたいなことをTwitterに書かれてたりするじゃないですか。そんな殺伐感がないです。
台湾の人はみんなおだやかだし、台北では日本語それなりにわかってもらえるし、初めて行く海外としてはとてもいいんじゃないかと。
また機会を作って行こうと思います。
しんさんの出張所 はてな編: [NetBeans][ソフトウェア技術][ゲーム][自作ソフト]JavaしかかけないおいらがAndroidアプリをリリースするまで
- 業務系Java屋がMixiアプリをリリースするまで
- Javaしかかけないおいらがmixiアプリ第2弾をリリースするまで
- mixiアプリ第3弾「コレオススメ!」リリースするまで
- Javaしかかけないおいらがmixiアプリ第4弾をリリースするまで
の続き。
しかし、Androidの場合、VMはJavaではないものの、言語だけはJava系なのでインパクトがないタイトルだなw
空いた時間にちょくちょく稼げるRPG、マモノバスター2はこちらから落とせます。
今作の開発開始時期そのものはかなり前となります。
ちょうど1年前、mixiアプリ版マモノバスターが配信停止しました。
原因はmixiのアドプログラムの価格改定です。これにより、広告料は1/10以下とかになりました。
mixiで無料で配信するにはアドプログラムしかありませんのでこの金額ではサーバー代が維持できません。そこで泣く泣く停止しました。
次につくるアプリはプラットフォームの広告に依存しないものを、という選択からスタートすることになります。
そうなると、広告が元気なプラットフォームは限られます。ぶっちゃけるとスマホです。
さらに言うとスマホといってもAndroidとiOSです。リワード広告などはAndroidのほうが自由度があるためか数が多いようです。
オンラインのアプリ市場がなぜこの2つに絞られるかというと、その他のプラットフォームでは広告がないからですね。
で、AndroidとiOSとどちらが開発が楽かと聞かれると、Java言語が触れる分圧倒的にAndroidです。iOSは開発が大変なのは目に見えています。
というわけで、プラットフォームはAndroidに決まりでした。
・・・となったのは去年の夏です。
1回目の開発
それまではどうなっていたかというと、WebViewを利用してPC,Android、iOSとクロスプラットフォームで配信しようとしていました。前作がWebアプリだったので当たり前ですね。
ただし、Webアプリでは配信は自由度がありますが、サーバー維持費が出せません。
ここまでが去年の5月ごろまでの話です。
もちろん、Webアプリとしてクロスプラットフォームで作成していました。また、移動するマップもありました。
やはりサーバー代が捻出できないと厳しいなということで止めます。
そこで
サーバー代がかからなければよい
↓
スタンドアロンで出せばよい
↓
Androidでだせばよい
という感じになりました。
1回目のは破棄、いちからの作り直しです。
1回目の時。マウスでの操作ならこれでいいけど、タッチは大幅に構成を変えないといけないという。
2回目の開発
気を取り直しての開発。
どうせスタンドアロンなら戦略性の高いパーティープレイがいいだろう、そう思って開発しました。
かわりにマップ機能を削除、ダンジョンの進捗率を表示する前作と同じものにしました。
・・・しかし、しっくりきません。
パーティーバトルということは攻撃にしろ、魔法にしろ、だれを対象にするのかという選択が入ります。十字キー+決定ボタンだと気にならないのですが、タッチ操作をしているとこれがすごく手間です。
特に意識はしてなかったのですが、前作の1対1での戦いはこの辺のバランスが良かったのではないかと思うようになりました。
また、連携的なものもパーティーの場合誰を基準にすればよいのかあいまいです。
ということで、2回目の開発もストップすることになりました。
2回目の作り直しです。
2回目の開発で実装したもので3回目に受け継がれたものとしてマモノのHPやMP表示があります。前作では途中から数値をダイレクトに表示していました。ドラゴンスレイヤー英雄伝説のように。それを今回はメーター制にしました。世界樹の迷宮のように。
3回目の開発
まず、基本的な流れは前作同様にする、1対1の戦いにするなど細かいところを盆の帰省中に練りまくりました。プラットフォームをmixiアプリからAndroidにするというだけで十分チャレンジングなのだから、基本的な流れはそのままで、システムで楽しませるという方向にチェンジします。
システムで楽しませるというのは、たとえば転職です。今作には職業があり、その職業ごとに連携が違います。それだけならば前作の勇者タイプ(ステータスによって決まる)と同じですが、今回は職業によってそれぞれのステータスの成長率と覚えることができるスキルがかわります。転職を繰り返すことでステータスやスキルを調整していく楽しさが生まれました。開発規模は抑えながら。
また、連携用のキャラクターを酒場で登録できるのですが(前作はmixiの友達のプレイヤーが自動で表示された)、キャラのステータスの詳細も見ることができます。バージョンアップを繰り返して少しずつ詳細なステータスは見れるようにしていましたが、今回は持っているお金やスキル、もっている薬草の数など何でも見れます。このひとは薬草かいまくってすすめてるなーとかがわかります。
やりたいことが明確になった後は早いもので、盆明けから開発をスタートして3か月程度でほぼ動くところまで完成しました。平日の夜少しと週末のみの開発です。この時点で100時間程度だったでしょうか。
このあと広告などの組み込みや調整をぎりぎりまで行いました。結果的に150時間程度まで膨れ上がったと思います。毎日8時間開発できたら一か月で開発できることになりますか。
前作は80時間で最初にリリースしましたが、出来上がっていったシステムはその後のバージョンアップによるものが多く、ダンジョンの数も最初は5つだけでした。今作はダンジョンの数は7つありますので、システムとあわせて妥当な線でしょうか。規模は抑えたと思います。
技術的なこと
開発は1回目、2回目、3回目ともにIDEはNetBeansのみです。
1回目はNetBeans+GWT4NBプラグインで開発していました。いつも通りのmixiアプリと同じですね。
2回目、3回目はNetBeans+NBAndroidプラグインで開発しました。
サーバー側はいつも通りJAX-RS、Jersey2で実装です。
運用側はAWSのBeanstalk+DynamoDB+S3です。男らしく3年ヘビーリザーブです。
Androidの開発を常にエミュや実機で開発となると工数が大幅にかかります。そこで共通の描画やサウンド、タッチイベントなどのレイヤーを作り、そこでゲーム自体のコードは100%共通としました。1行たりともPC版とAndroid版と違いはありません。
PC版。BGMも効果音もなる。おそらくMacやLinuxでもそのまま動く。
2回目までと違い、3回目の開発では描画もOpenGLにしてAndroidとPC(Java+JOGL)とで共通としました。
共通レイヤーを作って作るというのはmixiアプリ第2弾のPONPONと同様ですね。あちらはPC側はSwing+Java2D、Web側の描画&サウンドエンジンはFlash、ゲーム部分はGWTによる100%共通部分をJavascript化で、ロジックは一切Flashにもたないという変態アーキでしたのでアレに比べると難易度ははるかに低いと思います。
そのほか今回注意したのはバナー広告を間違ってタップしないようにすること。バナー広告やアイコン広告をメイン画面から離すようにしました。
また、縦持ちで、画面上のステータスエリアを常に表示するようにすること。フルスクリーンのほうが楽ではありますが、やはりながらプレイは時間や電池、お知らせの表示などをしたままのほうがいいと思いました。スマホのゲームは限りなく100%に近いくらいフルスクリーンでのプレイとなります。そのせいで現在の時間やバッテリなどを確認するためにホームボタンを押すというのはやはり使いにくいと常におもっていましたので。
利用できる画面は狭くなりますが、この考え方は基本変わらないでしょう。
ダウンロードはこちらから。
へびのぬけがら: iPhone Game Blueprints を読みました
本書は iPhone ゲームを開発する上でのゲームデザインと App Store での売り出し方について解説した書籍です
目次は下記のようになっています
- Preface
- Chapter 1: Starting the Game
- Chapter 2: Ergonomics
- Chapter 3: Gesture Games
- Chapter 4: Card and Board Games
- Chapter 5: Puzzles
- Chapter 6: Platformer
- Chapter 7: Adventure
- Chapter 8: Action Games
- Chapter 9: Games with Reality
前半はゲームをつくる前段階として注意すべき点について記述されています
ここで取り扱われている内容は iPhone ゲーム開発に限らず、他のプラットフォームでも役立つ内容だと思います
(iPhone 固有の注意点もしっかり書かれています)
ただ、扱っている範囲が広いため、やや物足りないものもあり、それらについては別の書籍にて補完していく必要があるかと思います
後半は、前半にて取り扱ったポイントをさらにゲームのジャンルごとに掘り下げています
各ジャンルにて、基本なアイディア(技術的なベース)を説明し、そこからどのように魅力的なゲームとなるようアイディアを広げるかを、いくつかのサンプルとなるアイディアをベースに解説しています
読んだ感想としては、アイディア出しから App Store へのリリースまでの長い行程を網羅的に書かれた良書でした
一点注意いただきたいのは、本書では実装(プログラミング)については扱われていないということです
そういった内容を期待される場合は別のゲーム開発に関する書籍(日本語の書籍も数多く存在します)を参考にされるのがいいかと思います
反対に、いくつかの書籍、チュートリアルを終えたが、いざゼロからゲーム開発を行おうとした際に何から手を付けていいのか詰まっている方の強力な後押しになるものと思います
ページ数はやや多いものの、イラストや画面イメージが多用されていることもあり、詰まることなく読み進めることができました
興味を持たれた方は、上記サイトから Chapter 04 がサンプルとしてダウンロードできますので、確認してみてはいかがでしょうか