Česky   |  Deutsch   |  English   |  Español   |  Français   |  Indonesia   |  日本語   |  한글   |  Polski   |  Português (BR)   |  Türkçe   |  中文   |  正體中文   |  Your Language  
PlanetNetbeans
プラネット NetBeans には、ブロゴスフィアの各所から集められた、NetBeans に関連する概念やアイデアがあります。
フィード
[RSS 1.0 Feed] [RSS 2.0 Feed]
[FOAF Subscriptions] [OPML Subscriptions]
NetBeansのブログを書いていますか? PlanetNetBeansにあなたのブログを登録してください!!
フィード登録
uyota 匠の一手 (feed)
“netbeans” の検索結果 – Happy My Life (feed)
Florian’s NewestDiary (feed)
HighLookの日記 (feed)
Kazzzの日記 (feed)
MineAPの(開発)日記 (feed)
bojovs blog (feed)
challenge Ruby on Rails (feed)
ぼそっと (feed)
チョッパーのほふく前進 (feed)
Sacrificed & Exploited (feed)
こくぼ@Everything is the experience. (feed)
不可逆な毎日 (feed)
ネットランダム改 (feed)
Scala で TAPLを勉強しつつ LLVM コンパイラを作る日記 (feed)
人工無脳が作りたかった (feed)
PHP,MySQL,Flex,JSな日々+イラストとか (feed)
ひたすらプログラミング日記 (feed)
henacho-coの日記 (feed)
Foo am I? (feed)
CROSSFIRE DBとコンパイラの日記 (feed)
イトウ アスカ blog (feed)
techlog (feed)
asa nisi masa (feed)
怒りのJava学習 (feed)
kaisehのブログ (feed)
?   ...!?   ...!!   from Kei-Miya... (feed)
へぼの壷 (feed)
紫水晶の和 (feed)
forest of netBeans (feed)
鎌倉でも手の平捕球!エースコーチの日記 (feed)
marsのメモ (feed)
mk18のプログラミング日記 (feed)
nidoの雑記 (feed)
きしだのはてな (feed)
忘備録1.0 (feed)
ryopeiの日記 (feed)
試行錯誤と創意工夫(S!アプリ開発日記+α) (feed)
しんさんの出張所 はてな編 (feed)
やさしいデスマーチ (feed)
ささくれ、深爪、口内炎。 (feed)
Tomute’s Notes (feed)
Servlet Garden @はてな (feed)
草木のにをいに誘われた (feed)
ねこび~ん (feed)
へびのぬけがら (feed)
Where's my Blog?!

Powered by:    Planet

Last updated:
August 29, 2016 10:08 AM
All times are UTC

Sponsored by
sponsored by Oracle

visit NetBeans website
きしだのはてな - February 28, 2016 05:14 AM
Javaをチラ見する

Javaを知らないからちょっとだけ見てみたい、みたいな人のために、ちょっとしたチュートリアルを書いてみました。


準備

まずはJDKをダウンロード・インストールしてください。

http://www.oracle.com/technetwork/java/javase/downloads/index.html

ダウンロードページでは「Accept License Agreement」にチェックして、自分の環境にあわせたインストーラをダウンロードします。

今だとu73とu74がありますが、初めてインストールするなら74でいいと思います。


インストールするものを選ぶダイアログで「開発ツール」「ソースコード」「パブリックJRE」が出ますが、パブリックJREは不要なので、左のアイコンをクリックして、×がついてる感じのを選ぶといいと思います。


あと、NetBeansもダウンロード・インストールします。

https://netbeans.org/downloads/

「Java EE」か、「すべて」にします。


途中「互換性のあるJDKインストールがみつかりませんでした」と出るので、先ほどインストールしたフォルダを指定します。「C:\Program Files\Java\JDK1.8.0_74」とか。


JDK+NetBeansでインストールすると楽かも。(未確認)

http://www.oracle.com/technetwork/java/javase/downloads/jdk-netbeans-jsp-142931.html


Javaのプログラムを動かしてみる

メニューで、「ファイル > 新規プロジェクト」を選んで、「Java」カテゴリの「Javaアプリケーション」を選んで「次へ」

f:id:nowokay:20160228144009p:image


こだわりがあるならプロジェクト名になにか入力して、「終了」を押します。


// TODO code application logic here

を消して、

System.out.println("Hello!");

と入力します。printlnはPRINTLNの小文字です。PRINTINではありません。

ctrl+space(macはcommand+\)を押すと補完候補がでるので、そこから選ぶと楽だしミスもないです。


エディタ内で右クリックして「ファイルの実行」を選びます。

「出力」に

run:
Hello
ビルド成功(合計時間: 0秒)

と出たら勝ち。

f:id:nowokay:20160228144504p:image


デスクトップアプリを作る

左側の「プロジェクト」のツリーで、「ソース・パッケージ」の下の「javaapplication」とかになってるところを右クリックして、メニューから「新規 > JFrameフォーム」を選びます。


「New JFrameフォーム」ダイアログの「クラス名」に「MyForm」とか入力して「終了」を押します。


右側の「パレット」から「Swingコントロール」内の「ボタン」をクリックします。

f:id:nowokay:20160228144011p:image

デザイン画面の中の適当な位置でクリックするとボタンが押されます。

f:id:nowokay:20160228144010p:image


同様に「テキスト領域」を適当なところに置いてください。これは大きさも適当に大きくするほうがいいです。


配置したボタンをダブルクリックすると、なんかコードが生成されるので

// TODO add your handling code here:

の部分に

jTextArea1.append("Hello!\n");

と入力します。


そしたら、さっきと同様に、エディタ上で右クリックして「ファイルを実行」します。

ウィンドウが開いて、ボタンを押したときに「Hello!」ってテキストエリアに出てきたら勝ち。

f:id:nowokay:20160228144012p:image


Webアプリケーション

「ファイル > 新規プロジェクト」を選んで「Java Web」カテゴリの「Webアプリケーション」を選んで「次へ」を押します。

f:id:nowokay:20160228144008p:image


こだわりがあれば「プロジェクト名」をなんか書き換えて、「次へ」を押します。

そこで「終了」ですよ。


プロジェクトツリーの「ソース・パッケージ」を右クリックして、メニューから「新規 > サーブレット」を選びます。

「クラス名」に「MyServlet」とか入れて、「パッケージ」に「servlet」とか入れて「終了」を押します。次にいかなくていい。


なんか、だばーっとソースが生成されるので、44行目あたり、<h1>の下の行に

out.println("today is " + java.time.LocalDate.now());

を追加します。


また同様にエディタ上で右クリックして、「ファイルを実行」します。


「サーブレット実行URIを設定」と出るので、そのまま「OK」と押します。

なんかいろいろ起動します。

ブラウザが開いて

Servlet MyServlet at /WebApplication2
today is 2016-02-28 

みたいなのが表示されたら勝ち

f:id:nowokay:20160228144014p:image


Windowsだとアクセスコントロール的なのが出るかもしれないけど、パブリックにチェックを*入れない*ようにして、おっけーします。


そしたら、さっきのjava.time.LocalDate.now()を、java.time.chrono.JapaneseDate.now()に書き換えて保存(ctrl+S)します。

そのままブラウザをリロードして

today is Japanese Heisei 28-02-28 

って出たら大勝利。

f:id:nowokay:20160228144013p:image


終了。

気に入らなかったらアンインストールしましょう。でもNetBeansはGit用GUIとしてとかRDBMSツールとかJavaScriptエディタとして結構優秀なので、そのまま使うのもいいよ!


きしだのはてな - October 28, 2015 08:37 PM
[javaone2015][javaone] JavaOne2015サンフランシスコ-一日目

今年もJavaOneの季節です!

f:id:nowokay:20151025135842j:image


今回は、China Airlineの台北経由で来たのだけど、2万円くらい多く払うとプレミアムエコノミーになって快適なので、来年からもそうしようかと思います。ANAだとプレミアムエコノミーにするのに15万円くらいかかって倍になるので。

台北で4時間くらいの待ちがあってヒマだけど。成田乗り換えだと両替とか出国手続きとかで時間がつぶれるけど、台北経由ならすでに出国してしまっててやることないし。

ただ、荷物の受け取りはカオスでした。ひっかかった荷物からバキバキという音が・・・

f:id:nowokay:20151024201848j:image


レジストレーション

ちょっと体調わるかったので、昼から。まずはレジストレーションにヒルトンまで来ます。

なんか、ヒルトンのロビーが改装中でした。

f:id:nowokay:20151026094601j:image


ビックリしてたら、レジストレーションはあっちだよーってサンフランシスコ弁で言われたので、そっちに移動。

f:id:nowokay:20151025141059j:image


特になにごともなく、スムーズにバッヂもらえました。

f:id:nowokay:20151025141108j:image


OracleOpenWrold/JavaOne期間中は、これをぶら下げている人が街中をたくさんうろうろすることになります。


Java Keynote [KEY8049]

キーノートはMoscone Centerであるので、移動します。

いつもどおり、ヨットがかざあってある。

f:id:nowokay:20151025142941j:image


そしてMosconeの前は道路を封鎖してくつろぎ会場に。

f:id:nowokay:20151025143122j:image


キーノート会場に降りていきます。

f:id:nowokay:20151025143224j:image


すげー寒い(物理)。

f:id:nowokay:20151025143748j:image


内容も・・・で外に出ていく人が多くて、さらに寒くなっていきました。

楽天の岩崎さんとArshallが登壇してたのが驚きだった!

f:id:nowokay:20151025153836j:image


スコットマクネリが出てきたのがサプライズだけど、会場の半分くらいは、だれこのオッサンとか思ってたんじゃなかろうか。


ということで、特に新しい情報はなく終了

f:id:nowokay:20151025155857j:image


GlassFish Performance Tuning: Tips from the Field [UGF11182]

GlassFishのパフォーマンスチューニングのセッション

f:id:nowokay:20151027152653j:image


ということだったけど、なんかプロファイラとかそういうツールの説明ばっかりしてた、ような気がする。

途中で寝落ちた。


Evolving Java EE [UGF10283]

JavaEEの歴史のセッション

f:id:nowokay:20151027141150j:image


EJBのLocalInterfaceとかHomeInterfaceの話から始まって、JavaEEがどう進化したかということを話してた、ような気がする。

途中で寝落ちた。


WildFly, Hadoop, JavaFX, and HTML5 in the Enterprise [UGF10306]

なんかHadoopの話ばかりしてた、ような気がする。

f:id:nowokay:20151027141151j:image

途中で退出


Building Nanoservices with Java EE and Java 8 [UGF10284]

隣の部屋にきたら、なんか寺田さんのような人がいるなーと思ったら、寺田さんだった。

f:id:nowokay:20151027141152j:image


すごく自信たっぷりに、日本語メッセージの動画を流していたので、全日本人に希望を与えた。

f:id:nowokay:20151027141153j:image


ということで終了

f:id:nowokay:20151027141154j:image


Oracle Appliciation Event

外に出ると、なんかイベントが始まってました。

f:id:nowokay:20151025192949j:image


ビールもあります。

f:id:nowokay:20151025193139j:image


けど、ここでは飲まずに移動。


GlassFish, NetBeans, Payara Party

今年もThirsty Bearでパーティーです。

f:id:nowokay:20151025195349j:image


ここで醸造したビールが飲めます。

f:id:nowokay:20151025201744j:image


たくさん人がいます。

f:id:nowokay:20151025223352j:image


寺田さんはいろいろ抱き付いて写真をとってもらってました。

f:id:nowokay:20151025225640j:image


そして連行。

f:id:nowokay:20151025231522j:image


おつかれさまでしたー


英語

英語は結局ぜんぜんわからないけど、何を言われるのかがわかっているので推測して反応するって感じでした。

ということでまた明日。


と思ったら、cero_tが近所の居酒屋に行くというのでうどん食ってきました。

f:id:nowokay:20151026004025j:image

Javaやってる人が2ブロック先に住んでて夜中にふらっとうどん食いに行くとか、日本じゃできませんね。JavaOneならでは。

f:id:nowokay:20151026002653j:image

しんさんの出張所 はてな編 - April 12, 2015 12:00 AM
[NetBeans][Java][ソフトウェア技術]JavaEE 8/MVC 1.0 RI Ozark + Handlebarsを試す

久々にだれでも気軽に使えそうなJavaEEのパーツが出てきたようなので、自分で動かしてみる。

まずJAX-RSを動かす

とりあえずMVC1.0のセットアップなどは以下を参照。

http://masatoshitada.hatenadiary.jp/entry/2015/03/31/220509


まずはベースとなるJAX-RS部分がちゃんと動くか動作確認する。

package com.shingames.mvc1.ozarchbs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("hellojaxrs")
public class HelloJaxrs {
    
    //通常のJAX-RS
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String jaxrs(){
        return "hello JAX-RS";
    }
}

これくらいが動けばよい。


Handlebarsを動かす

JSPもFreeMakerもVelocityもよくあるテンプレートでやっても面白くないのでHandlebarsを使う。

エクステンションがすでに用意されているので以下のように依存性部分に追加する。

https://shinsan.s3.amazonaws.com/diary/2015/0412-01.png

NetBeansだとプロジェクトツリーで依存性を右クリック、依存性を追加でこのダイアログを出せる。


リソースクラスを以下のように記述する。

package com.shingames.mvc1.ozarchbs;

import com.oracle.ozark.core.Models;
import com.oracle.ozark.ext.handlebars.HandlebarsViewEngine;
import javax.mvc.Controller;
import javax.mvc.Viewable;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("hellomvc")
public class HelloMvc {
    
    
    //MVC1.0 Controllerのアノテーションがあるだけ
    @Controller
    @GET
    public Viewable mvc(){
        Models models = new Models();
        models.put("message", "<b>MVC 1.0</b>");
        models.put("loop", new String[]{"1","2","3","4"});
        return new Viewable("hello.html", models, HandlebarsViewEngine.class);
    }
}

大体何を書いているかわかると思うが、ここで利用しているModelsはjavax.mvcパッケージのModelsではなくてozarkなのに注意する。javax.mvcのModelsはMAPインターフェースのみで実装がないため。またCDIのリクエストスコープが付いていて少しややこしいが、今回は無視で。

Viewableの引数が多いが、これはテンプレートエンジンを強制でHandlebarsを利用したいため。デフォルトでは拡張子をもとに判定するのと、拡張子をかえるとツールのサポートが失われるため変更したくないのでこうしてある。

テンプレートが固定の場合@Viewでテンプレート名を設定できるのだが、これはエンジン指定はできないため使えない。

この辺の柔軟性は正式版までには改善するだろうか。


テンプレートはWEB-INF直下にviewsディレクトリを作成してそこに突っ込む。

<!DOCTYPE html>

<html>
    <head>
        <title>MVC 1.0</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <div>Hello {{message}}!</div>
        <div>Hello {{{message}}}!</div>
        {{#loop}}
            <div>{{this}}</div>
        {{/loop}}
    </body>
</html>

JAX-RSはNetBeans上では右クリックでブラウザ起動できるのでGETだけならこれで手軽に試せる。

https://shinsan.s3.amazonaws.com/diary/2015/0412-02.png

実行結果

https://shinsan.s3.amazonaws.com/diary/2015/0412-03.png

想定通り。


ModelsがCDIであることを確認する

リソースクラス。

package com.shingames.mvc1.ozarchbs;

import com.oracle.ozark.ext.handlebars.HandlebarsViewEngine;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.mvc.Controller;
import javax.mvc.Viewable;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("hellologic")
@RequestScoped
public class HelloLogic {
    @Inject
    Logic logic;
    
    @Controller
    @GET
    public Viewable logic(){
        logic.run();
        return new Viewable("hello.html",  HandlebarsViewEngine.class);
    }
}

ロジック

package com.shingames.mvc1.ozarchbs;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;

@RequestScoped
public class Logic {
    @Inject
    com.oracle.ozark.core.Models models;
    
    public void run(){
        
        models.put("message", "<b>MVC 1.0</b>");
        models.put("loop", new String[]{"A","B","C","D"});
    }
}

実行結果

https://shinsan.s3.amazonaws.com/diary/2015/0412-04.png

リソースクラスからはテンプレートに渡すModelsすら消えた。

Viewableの引数からも消えている。

このようにJAX-RS側は単純にパラメータやURLなどのマッピングやロジックの呼び出しのみ記述するというやり方もいいだろう。CDI経由で必要なリクエスト情報などが取得できる。

今回はわかりやすくなるように書いたがModelsが実装依存なのかそうでないのかパッケージは意識すること。

現状

まだアーリードラフトレビュー用ということで、たたき台程度のものでしかない。

そもそもJerseyMVC使っている人にとって新しさはどこにもないため面白くもない。ただ、標準化されることでやっとStruts1を捨てる圧力が強くなるといったところか。

MVCといいつつもJAX-RSにおけるVのみのプラグイン的なもの、それも自前でBodyWriter等かけばできる程度のものであるため本当に面白くはない。

テンプレートといえばスタンドアロンで動かしやすそうだが、CDIとサーブレットAPIに依存した実装のため、このままではスタンドアロンでは動かせない。

とはいえ、開発者はサーブレットAPIはさわらないし、ロジックは切り離ししやすいし単体テストはしやすいとは思う。


個人的にはCDI依存、サーブレットAPI依存部分をなくしてもらうのは大前提として、さらにできればどのJAX-RS実装の上でも動くようにしてもらいたいところではある。

しんさんの出張所 はてな編 - December 01, 2014 12:00 AM
[Java][ソフトウェア技術][NetBeans]Spring と JAX-RSを組み合わせる

キクタローさんから「Javaエンジニア養成読本」という本をいただきました。ありがとうございます。

というわけで、JavaEEがらみ、キクタローさんのエントリに乗っかる形の記事を書いてみました。


実はJavaEE方面のエントリを書くのは今年初めて、去年の夏以来だったりします。かなり間が空きましたね。時間がほしいです。誰か仕事手伝ってください。バイトとかいないかねー。


この間にリリースされたものにSpringFramework 4があります。もうすぐでてから1年で、そろそろ使っても問題ないころ合いだと思います。

また、政治面の問題でSpringを使わなければならないというところもかなり多いと思います。JavaEEの技術を使ってみたいと思ってもフルの機能に乗っかるわけにはいかない状況もあるでしょう。

しかし、JavaEEを構成する要素の中でも、もっとも人気の高いJAX-RSならば組み合わせて利用するのも問題は少ないでしょう。最初のバージョン1.0からかなり実用的でした。そしてSpringは本来のDIコンテナのみに集中してもらうのです。これならば社内のライブラリなどSpringベースの資産も問題なく組み込むことができます。


現在のサーバーサイドJavaではずばりベストの組み合わせは

Spring + JAX-RS

だと思います。政治方面、技術方面とあわせてのバランスが一番取れていて説得しやすい形だと思います。アプリケーションサーバーに左右されませんし、設定によっては軽い開発、スタンドアロンのテストなども可能です。


今回はせっかくなのでSpringBootを使います。JAX-RSの実装はRIのJerseyです。JerseyのスタンドアロンサーバーにSpringを組み込むという方法もあると思いますが、今回はこちらで。どちらにしろ、実際の運用はアプリケーションサーバー上になるでしょうから、開発しやすいものを探すとよいでしょう。


SpringBootのセットアップ

こちらを参照してください。

http://kikutaro777.hatenablog.com/entry/2014/11/20/010828

起動できたら終わり。キクタローさんありがとう(*´▽`*)ノ゛


Jerseyを組み込む

プロジェクトツリーから「依存性」を右クリック、「依存性を追加」を選択します。

以下のダイアログが表示されますので、jersey-spring-3のver2.13を探し、追加します。

http://shinsan.s3.amazonaws.com/diary/2014/1201-01.png


プログラムの構造

いよいよコードを書きます。

今回のプログラムは足し算です。http://localhost:8080/rest/add/12/34とうちこんだら、12+34という計算をするといったものになります。とりあえずレスポンスはtext/plainで。


先に構造書いた方がわかりやすいのでのせますが、すべてのソース構成は以下のようになります。

http://shinsan.s3.amazonaws.com/diary/2014/1201-02.png

上から順に解説します。


logicパッケージ

実際の足し算をするクラスが一つだけあります。足し算くらいならこんな分け方は必要ないのですが、実際はここがデータベースアクセスなどが来るものと思ってください。


restパッケージ

URLへのマッピング、リソース部分です。ここがJAX-RSの領域です。


JerseyConfigクラス

JAX-RSの実装であるJerseyの環境設定部分です。packagesはサブパッケージも検索します。


Mainクラス

SpringBootの設定、起動部分です。コンポーネントスキャンのパスを設定しています。Jerseyサーブレットをrestというパスにマッピングしています。CalcRest#addのパスと併せて「http://localhost:8080/rest/add/a/b」となるわけですね。


見てわかるとおり、全部Javaコードで、設定ファイルはありません。



ソース

CalcLogic.java
package com.mycompany.springboottest.logic;

import org.springframework.stereotype.Component;

@Component
public class CalcLogic {
    public int add(int a, int b){
        return a + b;
    }
}
CalcRest.java
package com.mycompany.springboottest.rest;

import com.mycompany.springboottest.logic.CalcLogic;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/")
public class CalcRest {
    @Inject
    CalcLogic calcLogic;
    
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("add/{a}/{b}")
    public int add(
            @PathParam("a") int a,
            @PathParam("b") int b){
        
        return calcLogic.add(a, b);
    }
}
JerseyConfig.java
package com.mycompany.springboottest;

import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.spring.scope.RequestContextFilter;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JerseyConfig extends ResourceConfig{

    public JerseyConfig() {
        register(RequestContextFilter.class);
        register(LoggingFilter.class);
        packages("com.mycompany.springboottest.rest");//リソースクラスの保存先
    }
}
Main.java
package com.mycompany.springboottest;

import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;

@EnableAutoConfiguration
@ComponentScan(basePackages = {
    "com.mycompany.springboottest.logic"}
)
public class Main {

    @Bean
    public ServletRegistrationBean jerseyServlet() {
        ServletRegistrationBean registration = new ServletRegistrationBean(
                new ServletContainer(),
                "/rest/*"); 
        
        registration.addInitParameter(
                ServletProperties.JAXRS_APPLICATION_CLASS,
                JerseyConfig.class.getName());
        
        return registration;
    }

    
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

JAX-RSのリソースクラスにはコンポーネントスキャン設定をしなくても見てくれているようなので、省いています。


実行

ブラウザを開き、アドレスバーに http://localhost:8080/rest/add/12/34 を入力します。

http://shinsan.s3.amazonaws.com/diary/2014/1201-03.png


実際にSpringBootで開発する場合ですが、差分デプロイの仕方がわからなかったため毎回起動しているとさすがに遅いです。5,6秒もかかってしまいます。これだとTomcatに普通にデプロイするほうがサクサク開発できそうという感じでした。

というわけで、SpringとJAX-RSの組み合わせのお話でした。さくさく楽々開発しましょう。

きしだのはてな - November 23, 2014 05:22 PM
[今週のニュース]JJUG CCCとか解散とか

一週間、ツイートしたURLをまとめる試み


技術

「FlashAirは、通信方式に無線LAN、プロトコルスタックはHTTPで、ドライバーとプロトコル処理は内蔵マイコン」

Wifi付SDを通信モジュールにする話。おもろい

タブレットで動かすクレーンゲーム、意外と簡単に作れます


「ストレージ・メモリー階層の概念が根本的に変わる」

データセンターでの独自性追求が、FPGAや新型不揮発性メモリーなどの台頭を誘発 - Social Device - 日経テクノロジーオンライン


「無農薬・低生菌の野菜を栽培する」

これでもなんだかんだ面白い理由で自然派の人が批判するんだろうなw

そこはまるで半導体工場でした - 設計・生産 - 日経テクノロジーオンライン


「1社をグローバル規模のデフォルト検索プロバイダーとするのではなく、国・地域で最適な検索サービスプロバイダーの採用を進める戦略に転換する」

Mozilla、04年から続いたGoogleとの検索提携を終了、米でYahooと5年契約


「訳書が出続けると, 英語を読まない人が減らない」という指摘」

訳書がなくても英語よむ人は増えないと思う。暖房があるから寒さに弱くなるみたいな精神論だろうな。リソースあるなら翻訳あったほうがいい

翻訳のススメ ? Elliptium


「全国銀行協会が2018年の稼働を目指している新たな決済システム」

日銀「世界の波に乗り遅れる」 銀行振り込み24時間化:朝日新聞デジタル


「パッケージ版は確定申告の経験がある人向け、クラウド版はまったくの初心者向け。現時点では非常に対照的なソフトとなっている」

こういう明確な方針分けはいいな。

弥生のクラウド会計は誰にオススメ? 既存品との連携は? - 岡本社長に聞く


「Gmailデザインチームのトップは、「あなた方は典型的ユーザーではない」と題するプレゼンを行った。」

基本的に開発者は典型的なユーザーから離れていくよね

GoogleがGmailとInboxを分けた理由 - TechCrunch


Java

「とりあえず「マキ」の本から再始動でw」

NetBeansでやってみた「はじめてのSpring Boot」 - Challenge Java EE !


「今回は469人と、前回よりも100人以上参加者が増えるという大盛況ぶり」

おつかれさまでしたー

JJUG CCC 2014 Fallをやってきた - 水まんじゅう


「OracleとJava標準の話題が中心で、いまいち現実感が乏しいJava One報告会」

JJUG CCC Fall 2014に行ってきました - zyake_mk2の日記


社会

高倉健さんが亡くなった


サンフランシスコか。11階からって、車がなかったら即死なんでは

ビル屋上から清掃員が転落、走行中の車に落ち重傷 米:朝日新聞デジタル


「サーバー」のイントネーション、気になる

1500人分のIDやパスワード 悪用か NHKニュース


「両社の担当者が9月頃、同時期に退職しており、その引き継ぎの過程において、必要な情報が伝達されなかったか、または誤った情報が伝達された可能性がある」

サウンドハウス、「楽天市場」怒りの撤退--「担当者退職」による伝達ミスが原因か


まじかー。というか、萩焼の土の上にバイクで模様つけたりしてたのは先代か。

萩焼作家の坂高麗左衛門さん死去 坂窯初の女性当主:朝日新聞デジタル

しかし、Wikipedia上で2回死んでる実在人物はめったにないだろう。

坂高麗左衛門 - Wikipedia


「40歳代に比べて身長が2センチ以上縮んだ高齢の女性」「気付かないうちに背骨が折れていることもある」

そんなんあるんか

身長2センチ縮むと……介護リスク、女性は2倍に:朝日新聞デジタル


「確定判決の根拠となる証言をした女性と目撃者が説明を一転。男性が事件に関与していないことを示す客観的証拠も見つかった」

目撃者がなんかグルやったってこと?

強姦事件の刑執行停止、男性釈放 「無罪の可能性高い」:朝日新聞デジタル


「富士山はさびしいぞ」

富士山のように絵になると言われての応え。健さんかっこええ

高倉健さんの「黄色いハンカチ」秘話 武田鉄矢さん語る:朝日新聞デジタル


「探索アプリなどを使って探すケースは20%」

スマホ紛失、トップは沖縄 なくしやすい人の特徴は? - ITmedia エンタープライズ


「オスカーは「ただの『皮膚病』だった可能性がある」」

衝撃スクープ!フォークで刺されたはずの盲導犬オスカー「実は刺されてなんか、いなかった」日本中が激怒した事件に意外な新証言が……  | 現代ビジネス 講談社


この記事、ネトウヨとかどうでもよくて、さらっとネットの人の住所特定する話がしてあって怖い

ネットでヘイトスピーチを垂れ流し続ける 中年ネトウヨ「ヨーゲン」(57歳)の哀しすぎる正体【後編】 | 現代ビジネス 講談社


「床から約95センチの高さの窓が開いており、その近くに台が置いてあった。」

4歳、マンションから転落して死亡 窓の近くに台:朝日新聞デジタル


政治

衆議院解散。あと小4サイト構築事件。


まだ話題にならないうちから記事にできるのも、「取材力」のたまものか

「どうして解散するんですか?」Twitter上で政府・メディア関係者ほか100万人に届けられた疑問の声(追記あり) | 現代ビジネス 講談社


なんか、各党「なんたら解散だ!(なんたらには安倍政権を揶揄する言葉が入る)」みたいな話してる中、小沢さんだけこれからどうするかって話してるように見える。

「誠実に愚直に国民に話していく」 生活・小沢代表:朝日新聞デジタル


「それぞれの政治生命を永らえることを考えてもらう。好きにしていい」

哀愁ある

小沢一郎氏「好きにしていい」 生活議員の離党を容認:朝日新聞デジタル


解散か。

政府 衆議院解散を閣議決定 NHKニュース


解党か。

みんなの党、解党決定 渡辺前代表「抹殺事件だ」と批判:朝日新聞デジタル


ネタ系

フリー素材の破壊力がすごかった。


万歳はここでやってくださいw

【衆議院解散!!】万歳のフライング発生 平成26年11月21日 - YouTube


カルミナブラーナって、結構出落ち感が強いんだけど、最後にもう一回もってくるのがずるいな。

カルミナ・ブラーナ - YouTube


記事はおもしろそうなんだけど、右上のフリー素材が気になって集中して読めない! 「Lambda にクラウドの夢を見る | Developers.IO」

Lambda にクラウドの夢を見る | Developers.IO


これは、この少年の写真をとってる人が黒幕やな。

ナショナル・ジオ・グラフィックもびっくり!世界を制した写真家は何と9歳の少年 | エンタメウス


「「せっかくならばとドリンクサーバーの機能を追加することにしたんです」(オリエント工業・広報)」

ちょっとwww(閲覧時背後注意)

男子究極の夢実現!「巨乳から酒が出る」美人給仕登場 | 日刊大衆-WEB版-


きしだとは、4点明らかに異なります。

×大学を卒業(卒業できてない)

×ある事情で会社をやめた(就職経験なし)

×仕事はとても早い

×納期もきちんと守る

「9時までに遅刻せず会社に来る」ということは、本当に重要な事なのだろうか


「流星よりは、はるかに遅いです」「目で確認してから、よけることも可能です」「注意!人工衛星は音より速く飛んでくるので音は聞こえません」

気をつけよう。

落下する人工衛星のよけかた - Yahoo!知恵袋


「うちは,警察としかつながっていない専用電話(警電)があって,一般電話では答えていませんでした」

そんなものがあったりするのか

警察からの問い合わせ電話にこたえるにあたって - davsの日記


「「やりたいこと」を言って、それが叶うことは殆どなかった、ということと、「とりあえず何の仕事でも、一生懸命やれば楽しかった」ということです」

中途採用面接で、志望動機を聞かれて「もっと給料が欲しかったからです」と回答した人がいた


すげー、動画で配信するんか。未来や。oculus捗りそうだ (職場閲覧注意:おっぱいでます)

DMMバーチャルリアリティ - 360°で見たい角度が見れる次世代のアダルト動画体験! - DMM R18


「タミヤF-117開発途中でも正確すぎて問題になったとかいう話があったがホントかね」「イタリアだったかのメーカーが架空機のプラモを発売したらF-117と似た部分があったので問題になった、という話の誤伝」

どこまで本当?タミヤ模型伝説


中国でお金持ちが息子を、自分たちの裕福さを実感させるために田舎に送ったって話、このあたりからの着想なんだろうな

「変形計ーエクスチェンジー」 中国の田舎の子供と都会の子供を一週間入れ替えるドキュメント番組 -Togetterまとめ

しんさんの出張所 はてな編 - October 09, 2014 12:00 AM
[Java][ソフトウェア技術][NetBeans]libGDXの基礎6 HTML出力を行う

今回はわかりやすくするためにNetBeansを利用した画面を多く載せています。

今まで以上にスクリーンショットが多く入っていて、一番力が入っているのがわかりますね。

http://qiita.com/shinsan68k/items/4dd74f17cab66b05e73d

libGDXではWindows/mac/Linux/Android/iOS/HTML出力ができる、といいつつWeb版だけは紹介してきませんでした。

せっかくなので、今回紹介してみました。まずはテトリスのようなミニゲームあたりをこれらのプラットフォームすべてに移植してみながら感覚をつかむとよいでしょう。ゲーム部分は100%同一コードでこれらのプラットフォームに出力できます。

きしだのはてな - October 01, 2014 09:53 PM
[javaone][javaone2014] JavaOne 2014 サンフランシスコ3日目

Java SE/ME系のセッションはHiltonです。セッションによって、HiltonとParc55を行ったり来たりするわけです。どちらの建物も、立体迷路になってて、すげー迷います。

Hiltonの駐車場の料金所はケーブルカーの形しててかわいい。

f:id:nowokay:20141001025616j:image


今日は結構さぼってしまったので、この5セッション

  • CON3162:Coding for the Future:The IDE (R)evolution for the Next Generation
  • CON3979:Going Native:Bringing FFI to the JVM
  • CON3353:The Future of MVC in JAX-RS
  • CON8320:Ask the JDK Architects, Part 1
  • BOF2990:Meet the JVM Team

CON3162:Coding for the Future:The IDE (R)evolution for the Next Generation

IDEはどうなるの?って話。ふんわりとしたNetBeansロードマップの話です。

f:id:nowokay:20141001034412j:image


2000年前後にNetBeans、Eclipse、IntelliJが出てきたよねって話とか、

ちなみに、IntelliJ IDEAはIDEAと略さないといけないはずなのだけど、プレゼンにはIntelliJって書いてて仙台方面から怒られそう。

NetBeansを使う人で、Javaを使うのは75%らしい。思いのほか少ない。PHPは35%

f:id:nowokay:20141001030849j:image


で、Web IDEの話になって、まあパフォーマンスも悪いし機能も少ないしオフラインモードの問題もあるし、一方で得られるものは何かって考えると、あまりいいアイデアじゃないと。

f:id:nowokay:20141001031530j:image


けど、たとえばGoogle App Engineみたいにローカルでエミュレートできないものもあるし、CIやらGitやらネット越しのサービスとかあるし、クラスのインデックス作りとかはまとめてやっちゃいたい。

IDEの設定や開発環境の整備もめんどくさい。で、クラウド上に置いたりするのが考えられる。

んで、NetBeansどうするかというと、とりあえずUIとロジックを分離して、サービスとして切り離せるようにしましょう、と。で、これをNetBeansをフォークせずにやりたいと。

f:id:nowokay:20141001034657j:image


これをOracle Developer Cloud Serviceでやるけど、ゆっくりやるよ、という話でした。

ランチ

JavaOneでは、評判のランチがあります。

f:id:nowokay:20141001040114j:image


ジュースもあります。

f:id:nowokay:20141001040225j:image


お茶とかコーヒーも。

f:id:nowokay:20141001040425j:image


味はともかく、でかいです。

f:id:nowokay:20141001041033j:image


ぜひ一度JavaOneに参加して、どういう評判なのか体験するといいと思います。


CON3979:Going Native:Bringing FFI to the JVM

「JNI知ってる人?」はーい

「それを愛してる人?」笑い

という質問からはじまった、JavaにJNIよりも便利なネイティブアクセスを導入しましょうという話。

JRubyのCharles Nutterさんです。

f:id:nowokay:20141001045754j:image

プロジェクタ前で写真をとってるのはさくらばさんです。なので、このセッションの資料を撮った写真のほぼすべてにさくらばさんの頭がいい感じに写りこんでますw


で、まあJNIより抽象度の高い、JNR(Java Native Runtime)を導入しましょう、という話です。

f:id:nowokay:20141001043832j:image


JNAというのがすでにあって、あれは便利なのですが、遅い。

JNRはJNAより10倍速い、と。

f:id:nowokay:20141001045432j:image


で、Project Panamaとして開発してて、JDK9に入れたいということなんですけど、そのためにはJSRにして取り入れてもらわないといけない。

なので、要望とか、うまくいったことや失敗したことを教えてほしい、んで隣の人に教えましょう、と。

f:id:nowokay:20141001050106j:image


あとは質疑応答が結構ありました。聞き間違えてるかも。

「メモリはコピーされるの?」

→「される」

「C++ Libraryは?」

→「テンプレートとかあるから難しいよね(客席にいたJohn Roseから)」

「ネイティブとJavaのメモリライフサイクルは?」

→「違うね。Java 9で一緒になるとうれしいね。」

「メモリのレイアウトとかは?」

→「そのうちやりたい。まずはJNRから」

「Panamaはいつ?」

→「JDK9に入れたい」


ゲームとか

Java EE関連のセッションの会場になってるParc55には、ゲームコーナーがあります。

f:id:nowokay:20141001053153j:image


あとビールも。

f:id:nowokay:20141001061216j:image


CON3353:The Future of MVC in JAX-RS

MVCの話とか。写真とってるのは寺田さん。

f:id:nowokay:20141001062236j:image


MVC仕様の話。これがラフなサンプル

f:id:nowokay:20141001065142j:image


で、JAX-RS実装であるJerseyのMVC機能の話。

f:id:nowokay:20141001070248j:image


なんかこうやって比べてたってことは、似たような仕様を立ち上げてどうするんだって話なのかなー。


CON8320:Ask the JDK Architects, Part 1

JDKのえらい人への質問コーナーです。

f:id:nowokay:20141001080350j:image


ブライアンはリラックスしてますね

f:id:nowokay:20141001080433j:image


Array2.0の話とか、PanamaとかSpecializationとか、シリアライズして透過的にオブジェクト扱うのはファンタジーだとか、immutableなコレクションだとか、いろいろ話してたのですけど、何の話題かわかるものの何をいってるかわからず・・・

英語力2.0が必要です。


そんなんなので、Part 2もとっていたのですが、そのまま帰りました。


ビール

まさたかさんがサンフランシスコにいたので、一緒にビール。

f:id:nowokay:20141001111737j:image


スポーツバーの窓際の席だったのだけど、なんかホームレスの人が窓から野球をみてて、すげーこっちみてるし写真とると背後霊みたいになるし、ウケました。


BOF2990:Meet the JVM Team

で、BOFに戻ります。

JVMチームへの質問コーナー。12〜3人くらいで、前のほうにかたまってました。

f:id:nowokay:20141001132545j:image


もう、マイクも使わないし、ほとんど客席同士で話してるし、まったく何を話してるかわからず。

たぶん、そこまで高度な内容は話してないと思うのだけど、英語わからんのでまるでだめ、ってなってますね。

英語力3.0が必要です。


悲報:JavaOneバッグもらえず

ところで、JavaOne参加者はJavaOneバッグもらえます。

なのだけど、今年はブロガーパスで参加させてもらってて、これはOracle Open Worldまで参加できるんだけど、このパスでバッグをもらいに行くと、JavaOneバッグではなくOOWバッグを渡されるのです。

交換できない?って聞いたんだけど、「ごめんなさいね、できないのよ、決まりだから」みたいなことを流暢なアメリカ弁で返されました。


ということで、奥が去年のJavaOneバッグ、手前が今年のOOWバッグ、左がブロガーパスです。

f:id:nowokay:20141002020004j:image

まあ、でも毎年改良されてて、なんかすげー使いやすくなってます。

きしだのはてな - October 01, 2014 09:53 PM
[javaone][javaone2014] JavaOne 2014 サンフランシスコ3日目

Java SE/ME系のセッションはHiltonです。セッションによって、HiltonとParc55を行ったり来たりするわけです。どちらの建物も、立体迷路になってて、すげー迷います。

Hiltonの駐車場の料金所はケーブルカーの形しててかわいい。

f:id:nowokay:20141001025616j:image


今日は結構さぼってしまったので、この5セッション

  • CON3162:Coding for the Future:The IDE (R)evolution for the Next Generation
  • CON3979:Going Native:Bringing FFI to the JVM
  • CON3353:The Future of MVC in JAX-RS
  • CON8320:Ask the JDK Architects, Part 1
  • BOF2990:Meet the JVM Team

CON3162:Coding for the Future:The IDE (R)evolution for the Next Generation

IDEはどうなるの?って話。ふんわりとしたNetBeansロードマップの話です。

f:id:nowokay:20141001034412j:image


2000年前後にNetBeans、Eclipse、IntelliJが出てきたよねって話とか、

ちなみに、IntelliJ IDEAはIDEAと略さないといけないはずなのだけど、プレゼンにはIntelliJって書いてて仙台方面から怒られそう。

NetBeansを使う人で、Javaを使うのは75%らしい。思いのほか少ない。PHPは35%

f:id:nowokay:20141001030849j:image


で、Web IDEの話になって、まあパフォーマンスも悪いし機能も少ないしオフラインモードの問題もあるし、一方で得られるものは何かって考えると、あまりいいアイデアじゃないと。

f:id:nowokay:20141001031530j:image


けど、たとえばGoogle App Engineみたいにローカルでエミュレートできないものもあるし、CIやらGitやらネット越しのサービスとかあるし、クラスのインデックス作りとかはまとめてやっちゃいたい。

IDEの設定や開発環境の整備もめんどくさい。で、クラウド上に置いたりするのが考えられる。

んで、NetBeansどうするかというと、とりあえずUIとロジックを分離して、サービスとして切り離せるようにしましょう、と。で、これをNetBeansをフォークせずにやりたいと。

f:id:nowokay:20141001034657j:image


これをOracle Developer Cloud Serviceでやるけど、ゆっくりやるよ、という話でした。

ランチ

JavaOneでは、評判のランチがあります。

f:id:nowokay:20141001040114j:image


ジュースもあります。

f:id:nowokay:20141001040225j:image


お茶とかコーヒーも。

f:id:nowokay:20141001040425j:image


味はともかく、でかいです。

f:id:nowokay:20141001041033j:image


ぜひ一度JavaOneに参加して、どういう評判なのか体験するといいと思います。


CON3979:Going Native:Bringing FFI to the JVM

「JNI知ってる人?」はーい

「それを愛してる人?」笑い

という質問からはじまった、JavaにJNIよりも便利なネイティブアクセスを導入しましょうという話。

JRubyのCharles Nutterさんです。

f:id:nowokay:20141001045754j:image

プロジェクタ前で写真をとってるのはさくらばさんです。なので、このセッションの資料を撮った写真のほぼすべてにさくらばさんの頭がいい感じに写りこんでますw


で、まあJNIより抽象度の高い、JNR(Java Native Runtime)を導入しましょう、という話です。

f:id:nowokay:20141001043832j:image


JNAというのがすでにあって、あれは便利なのですが、遅い。

JNRはJNAより10倍速い、と。

f:id:nowokay:20141001045432j:image


で、Project Panamaとして開発してて、JDK9に入れたいということなんですけど、そのためにはJSRにして取り入れてもらわないといけない。

なので、要望とか、うまくいったことや失敗したことを教えてほしい、んで隣の人に教えましょう、と。

f:id:nowokay:20141001050106j:image


あとは質疑応答が結構ありました。聞き間違えてるかも。

「メモリはコピーされるの?」

→「される」

「C++ Libraryは?」

→「テンプレートとかあるから難しいよね(客席にいたJohn Roseから)」

「ネイティブとJavaのメモリライフサイクルは?」

→「違うね。Java 9で一緒になるとうれしいね。」

「メモリのレイアウトとかは?」

→「そのうちやりたい。まずはJNRから」

「Panamaはいつ?」

→「JDK9に入れたい」


ゲームとか

Java EE関連のセッションの会場になってるParc55には、ゲームコーナーがあります。

f:id:nowokay:20141001053153j:image


あとビールも。

f:id:nowokay:20141001061216j:image


CON3353:The Future of MVC in JAX-RS

MVCの話とか。写真とってるのは寺田さん。

f:id:nowokay:20141001062236j:image


MVC仕様の話。これがラフなサンプル

f:id:nowokay:20141001065142j:image


で、JAX-RS実装であるJerseyのMVC機能の話。

f:id:nowokay:20141001070248j:image


なんかこうやって比べてたってことは、似たような仕様を立ち上げてどうするんだって話なのかなー。


CON8320:Ask the JDK Architects, Part 1

JDKのえらい人への質問コーナーです。

f:id:nowokay:20141001080350j:image


ブライアンはリラックスしてますね

f:id:nowokay:20141001080433j:image


Array2.0の話とか、PanamaとかSpecializationとか、シリアライズして透過的にオブジェクト扱うのはファンタジーだとか、immutableなコレクションだとか、いろいろ話してたのですけど、何の話題かわかるものの何をいってるかわからず・・・

英語力2.0が必要です。


そんなんなので、Part 2もとっていたのですが、そのまま帰りました。


ビール

まさたかさんがサンフランシスコにいたので、一緒にビール。

f:id:nowokay:20141001111737j:image


スポーツバーの窓際の席だったのだけど、なんかホームレスの人が窓から野球をみてて、すげーこっちみてるし写真とると背後霊みたいになるし、ウケました。


BOF2990:Meet the JVM Team

で、BOFに戻ります。

JVMチームへの質問コーナー。12〜3人くらいで、前のほうにかたまってました。

f:id:nowokay:20141001132545j:image


もう、マイクも使わないし、ほとんど客席同士で話してるし、まったく何を話してるかわからず。

たぶん、そこまで高度な内容は話してないと思うのだけど、英語わからんのでまるでだめ、ってなってますね。

英語力3.0が必要です。


悲報:JavaOneバッグもらえず

ところで、JavaOne参加者はJavaOneバッグもらえます。

なのだけど、今年はブロガーパスで参加させてもらってて、これはOracle Open Worldまで参加できるんだけど、このパスでバッグをもらいに行くと、JavaOneバッグではなくOOWバッグを渡されるのです。

交換できない?って聞いたんだけど、「ごめんなさいね、できないのよ、決まりだから」みたいなことを流暢なアメリカ弁で返されました。


ということで、奥が去年のJavaOneバッグ、手前が今年のOOWバッグ、左がブロガーパスです。

f:id:nowokay:20141002020004j:image

まあ、でも毎年改良されてて、なんかすげー使いやすくなってます。

きしだのはてな - September 30, 2014 01:33 AM
[javaone][javaone2014]JavaOne 2014 サンフランシスコ初日

JavaOneの季節です。

ということで、サンフランシスコにきました。

f:id:nowokay:20140928020549j:image


今回は、成田から同じ便の人が多かったです。

福岡からの便が遅れて、成田でwifiを受け取る時間がなかったのですけど、ANAのおねえさんが代わりにとってきてくれました。ありがたい。


レジストレーション

レジストレーションは、Hotel Hiltonで行います。

ロビーがJavaOneモードになっています。

f:id:nowokay:20140929012919j:image


まだ並ばずにいけますね。

f:id:nowokay:20140929013253j:image


今日のセッションは、ちょっと歩いてMosconeセンターに行きます。

Mosconeセンターでは主にOracle Open Worldをやってます。JavaOneもキーノートなど一部だけMosconeセンターでやります。

初日のセッションは、ユーザーグループフォーラムとなっていて、OpenJDKとかGlassFishとかNetBeansとかのセッションをやっています。

f:id:nowokay:20140929020115j:image


UGF9120:GlassFish Roadmap and Executive Panel

今回最初のセッションは、GlassFishのロードマップについてのセッションです。

とはいえ、資料もなくだらだら話す系だったので、何の話題についてしゃべってるかはわかるものの、何を言ってるかまったくわからない感じ。

「GlassFishとWebLogicとNetBeansは、Java EEの重要な3つのピースだ」と言っているのはわかりました。

かなり、WebLogicとの関係がどうなるか気になってる人が多かったみたいですね。

f:id:nowokay:20140929022658j:image


KEY10422:Java Strategy and Technical Keynotes

基調講演です。

で、最初にネタバレしておくと、今回のキーノートは回想回でした。

f:id:nowokay:20140929042757j:image


Java コミュニティ

最初はコミュニティ系の話。

Stephan Chinさんが出てきて、JavaOneに先行して行われたDevoxx4Kidsの紹介をします。LEGO Mindstormでなにか作ったそうです。

f:id:nowokay:20140929045122j:image


Java 8

Java 8の話

Georges Saabさんが、Java 8はWebでもバズって書籍もたくさん出ててすごいんだぜ見たいな話をします。

f:id:nowokay:20140929050111j:image


Donald RaabさんはJava 8はパフォーマンスあがってるんだぜという話。

f:id:nowokay:20140929051407j:image


まあ、Java 8の評価がいいって話はわかったからJava 9の話しろやーって思ってたらロードマップ

f:id:nowokay:20140929051923j:image

でも、Java 9の話はほとんどしてませんでした。JDK 9のEarly Accessがダウンロードできるようになったよ、くらい。


Java ME

そして、Java MEの話

CDCがなくなって、Java SE Embeddedに統合されるとか。でもこれ、去年も話したらしい。聞いてなかったけど。

f:id:nowokay:20140929052207j:image


そんで、デモ

なんか、車のダッシュボードっぽいものなんだけど、よくわかんない・・・

f:id:nowokay:20140929052938j:image


あとは、Java ME/Java SE Embededdのロードマップ

あわせてJava Embeddedっていうみたいですね。

f:id:nowokay:20140929054345j:image


Java EE

そして、Java EEです。

Java EE 7の話をしたあと、Java EE 8が満場一致でJSR採用されましたよ、と。

f:id:nowokay:20140929055442j:image

うっすらHTTP2.0/SPDYがServlet 4.0に入るとか書いてあるんですけど、このうっすらする前の写真はとりそこねました。こういった技術的な解説もほとんどなく。


そしてここでブラジルのJavaチャンピオンが出てきて、Red Hatやe-financeの人と一緒にTシャツ投げ。

f:id:nowokay:20140929061004j:image


最後にロードマップを紹介して終わり。

f:id:nowokay:20140929061159j:image


IBMのスポンサー枠

で、ここでIBMさんです。みんな帰り始めます。

f:id:nowokay:20140929061838j:image


なんか車うごかしてました。これもよくわかんなかったけど、Java Embeddedのデモよりは見てておもしろげでした。よくわかんなかったけど。

f:id:nowokay:20140929063447j:image


テクニカルキーノート

そしてここからテクニカルキーノート

Javaプラットフォームの一番えらい人、Mark Reinholdさんにバトンタッチです。

んで、なんか1995年からのJavaの歴史を語り始めます。

f:id:nowokay:20140929065219j:image


そして、Brian Goetzさん登場。

匿名クラスがラムダになってすっきり、とかいう話をします。

f:id:nowokay:20140929070109j:image


それから、もうひとりのBrian登場。Coherenceでキャッシュで並列化でみたいな話をしてたんだと思います。

f:id:nowokay:20140929070904j:image


そしてそして。

なんか、Point型の配列の話をしはじめて、お、これはPanamaの話か、とぼくの中では今回最高レベルの期待。というか、唯一の期待。

f:id:nowokay:20140929072114j:image


と思ったら、なんか時間が来たってことで、Valhalla/Panamaの資料とかすっとばされて終わりました。ひどいw

唯一、未来のJavaの話をするところがはしょられて、なんだかグダグダに終わりました。

ハイッタッチDukeの写真を撮って退散。

f:id:nowokay:20140929072812j:image


ビール

次のセッションに向かおうと思ったら、なんかビールを持ってる人たちがいる地帯にさしかかり、これはどっかでビール配ってるな、と思いながら探してみます。

モスコーニ南で配ってました。

f:id:nowokay:20140929074152j:image


UGF8873:Teaching Java with Free Java Tools

Free Java Toolsとありますが、NetBeansを使ったプログラミング教育というセッションです。

f:id:nowokay:20140929083322j:image


なんか、UMLプラグインの紹介してました。

https://java.net/projects/nb-uml-plugin

f:id:nowokay:20140929083312j:image


あとは、盲目の人むけの機能拡張の話とか。ブレークポイントで止まった行の内容を読み上げたりしてました。

f:id:nowokay:20140929083545j:image


それと、教えるときにMaven使うと、Jarをどっからダウンロードしてどこにいれるとかいう話が不要になっていいよとか、TomEEがちょうどいいとかいう話をしてました。

f:id:nowokay:20140929084827j:image


UGF8906:Lightning Talks:Even More Productivity with Free Java Tools

なんか、NetBeans Platformを使ったアプリケーションに関するLTをやってました。

よくわからないうちに終了・・・

f:id:nowokay:20140929100056j:image


これで今日のセッションは終了です。


移動

モスコーニ北と南の間は道路なんですが、封鎖されてOracle Plazaとして飲食会場になってます。

f:id:nowokay:20140929101627j:image


ということで一旦ホテルに帰ります。

なんか、サンフランシスコは適当に街をとると勝手にカッコイイ感じになるのでズルいと思う。

f:id:nowokay:20140929102714j:image


Java EE Community Appreciation Event

夜は、Moscone近くのThirsty BearでJava EE Community Appreciation Eventというイベントがあります。

Java EE関係のスペックリードとかがわらわらいる飲み会です。

f:id:nowokay:20140929123918j:image


で、まあビールを飲みます。

f:id:nowokay:20140929140244j:image


こんな感じで、フリーダムにビール飲んでます。聞こえるのは英語の会話ばっかりなんですが、だいたいJavaのなんだかについて話してるというのが、なんかおもしろい。

とはいえぼくは英語の会話できないので、日本から来てる人たちと飲んでました。

f:id:nowokay:20140929132513j:image


ちなみに、Thirsty Bearでは、このお店の中でビールを醸造してます。

f:id:nowokay:20140929144940j:image


ということで、初日は終了

きしだのはてな - July 08, 2014 04:55 PM
JAWS-UG三都物語で「そろそろJavaみなおしてもええんやで」というプレゼンしました

夏のJAWS-UG 三都物語 2014というイベントで「そろそろJavaみなおしてもええんやで」というプレゼンしてきました。

Javaのイベントではなかったので、Javaを使ってない人を想定したプレゼンでしたが、実際会場のほとんどがJavaメインではなかったようです。


for(int num : nums){
    if(num > 10) continue;
    sum += num * 2;
}

というコードが、NetBeansの「関数操作を使用」というリファクタリングで

sum = nums.stream().filter((num) -> !(num > 10)).map((num) -> num * 2).reduce(sum, Integer::sum);

になったところがハイライト。

ここまでできるとは思ってなかった。


※ 10:25 End of lifeの意図が誤解されそうなので、その1年後のTechnology Raderも追加しておきました

marsのメモ - June 23, 2014 01:41 PM
[Java] Java7から中黒(U+30FB ’・’ KATAKANA MIDDLE DOT)が識別子に使えない

「何を今さら」 と言うなかれ、ようやく仕事でJava7使えるようになったので、今ごろ気づいた。ちょうど日本語テストメソッド名で中黒(・)使ってたんで。:-)

Java6でビルドすれば平気なんだけど、NetBeans8やIntelliJ IDEA13はプロジェクトのターゲットJavaバージョンがJava6でも、エディタ上では中黒(・)を不正な識別子と見なす(ちなみに、エディタ上エラーになってるだけで、コンパイラはJava6なのでビルドは通るよ)。

f:id:masanobuimai:20140623223859p:image

Eclipse(4.3)はターゲットがJava6ならエディタ上でもエラーにしない(偉いw


それ(Java7から中黒がダメ)がホントかどうか知りたくて、言語仕様を探ってみたけど、それっぽいところを見つけられなかった。(´・ω・`)


頑張ってググってみたけど、唯一見つけられたのは、java.netのatomのfeed。その元になったjava.netの掲示板はもう無いみたい。(´・ω・`)


ps.

AppCodeもアカンらしい。これは手抜きっていうかAppCodeのバグなんでないか?


んでもって、JavaじゃなくてUnicodeのせいなんだそうな。

marsのメモ - June 22, 2014 02:17 PM
[IDEA][JavaEE] IntelliJ IDEA13でJavaEEプロジェクトを作る

「New Projectウィザード」で「Java Enterprise」を選んで、いろんなテクノロジを選択するんだけど「Application Server」にGlassfish4を選んでいると「Use library from 'GlassFish 4.0.0' installation」って項目が追加されて、大抵のライブラリをGlassfishから参照するようになる。

f:id:masanobuimai:20140622231407p:image

これはこれで便利なんだけど、なんでか一部のテクノロジ(たとえばJPA)はGlassfish内にある javax.persistence.jar を参照せずにわざわざダウンロードしてくる。それに小刻みに参照ライブラリを区切るので、あぶれるものが出てきたり(javax.interceptorパッケージが見当たらない、とか)と、手放しで喜ぶほどデキがよくない。(´・ω・`)

なにより、ローカルにあるGlassfish上のライブラリを参照するので、プロジェクトを共有するのに向かない。

f:id:masanobuimai:20140622231406p:image

だったら、New Projectでヘンに凝ったことせず、せいぜい「Web Application」か「JSF」それも「Set up library later」にして、プロジェクト作っておいて、

f:id:masanobuimai:20140622231405p:image


あとから「Project Structure」でMavenライブラリ(From Maven...)から「javax:javaee-api:7.0」をダウンロードしたほうが数倍マシ。Scopeは「Provided」でね(Web Profileだと「javax:javaee-web-api:7.0」と指定する)。

f:id:masanobuimai:20140622231404p:image

デプロイ先がGlassfish4だと、ほとんど揃っているので「javaee-api-7.0.jar」はProvidedで済むんだけど、他のAPサーバだと必要に応じてJSFの実装とかWARファイルにバンドルしないとダメなんじゃないかな?

f:id:masanobuimai:20140622231403p:image

というか、このjavaee-api-7.0.jar(または javaee-web-api-7.0.jar)、NetBeansには入っているのにGlassfishやJavaEE 7 SDKに入ってないってのは、どうゆう了見だ!と思わなくもない。

#単に自分の探し方が下手なだけ?

ps.

このヘンはNetBeansのほうがマイルドなんだろか...。

APIDesign - Blogs - June 02, 2014 07:49 AM
Podcast related to Japanese Translation

--JaroslavTulach 07:49, 2 June 2014 (UTC)

しんさんの出張所 はてな編 - May 21, 2014 12:00 AM
[NetBeans][Java][自作ソフト][ソフトウェア技術]JavaしかかけないおいらがiPhoneアプリをリリースするまで

今回の内容は前回よりだいぶましだぞ・・・。

の続きになります。

正直実装的にはmixiアプリ第2弾のエントリ(GWT+Flash+JavaSEとの互換レイヤでサクサク開発)が飛びぬけていると思いますが、それ以来くらいのインパクトはあると思います。


長文です。


iOS版を開発するぞ

マモノバスター2のAndroid版は無事だせました。読んでない人は上に並んでる過去のエントリを読んでみてください。

AndroidはJavaSEと同じJava言語ということで、JavaSEと互換のレイヤーを作成して、JavaSE上で開発、そのままアプリのソースは変えずにAndroid版を生成するというものでした。

やはり、Androidと並ぶプラットフォームであるiOS版もださないと片手落ちだろうと。ゲーム機と違ってAndroidとiPhoneを同時に所有している人は少ないはずです。ガラケー時代もそれが理由で遊べないゲームはたくさんありましたし。

問題は開発プラットフォーム選択だけでした。

ObjectiveCは短期的に習得できる状態ではなく、Unityは自分との相性は最悪です。cocos2d-xは触るならver3かなぁ、ver2は触りたくないなぁということで、なかなかいいのがありません。

そこで、思い出します。急激に成長をしているiOS向けの開発環境を。


RoboVM、君に決めた!

そう、RoboVMです。

http://www.robovm.org/

Javaで描いたコードがiOS向けに動きます。シミュレータ用にx86ももちろん出力できます。

パフォーマンスもかなり良好で、iPhone4s/iPod touch5(Apple A5搭載。初代miniもおそらく)でAndroidの現行のハイエンド並のなめらかさ。ただし、負荷が高い部分では差が出ますが、60fpsが安定して出たりします。

RoboVMのいいところはGWTと違い、ソースコードからのジェネレートではなく、コンパイルしたあとのclassファイルから生成されるという点です。したがってjarファイルの既存のライブラリをRoboVMに食わせるとそのまま動きます。びびるくらい動きます。

RoboVMのサンプルコードを書いてみましょう。iOSの開発者は多分、これが何をしているかすぐにわかると思います。

UIButton button = new UIButton(new CGRect(0, 0, 160, 50));

button.setTitle("ぼたん", UIControlState.Normal);
button.setBackgroundColor(UIColor.colorDarkGray());
button.addOnTouchUpInsideListener(new UIControl.OnTouchUpInsideListener() {
  @Override
  public void onTouchUpInside(UIControl uic, UIEvent uie) {
    System.out.println("くりっくした!");
  }
});
window.addSubview(button);

JavaのIDEは非常に優れているため、さくさく補完だけでホイホイ進んでいけますね。

また、サポートされている範囲はGWTの比ではなく、まず問題にならないレベルでサポートされています。恐らくびっくりすると思います。

生成されたipaにjarファイルがありますが、ここにクラスファイルは一切入っていません。たんなるリソース参照用にディレクトリなどがそのままの構造で彫ってあるみたいです。便利ですね。Androidもassets使わず、自動でやってくれるといいのにね。

ちなみにあの有名なJavaFX for iPadもRoboVMを利用しています。サンプルプロジェクトを作るとわかりますが。自分が見たやつはかなり古いバージョンだったと記憶しています。



libGDX、が勝利のカギだ!

RoboVMはいいのですが、JavaSEで実行できる開発環境がなくてはいけません。いちいちシミュレータとか実機起動などたるいことはやっていられないのです。そんな環境で開発している人はいないとは思いますが。

とはいえ、クロスプラットフォームの環境を今、しかも慣れない環境で作るには限界があります。

そこで、クロスプラットフォームで有名なプロダクトに手を出します。

みなさんご存じlibGDXですね。歴史もそこそこあります。最近ぽっと出てきたわけではありません。

http://libgdx.badlogicgames.com/

libGDXはもともとWindows/Mac/Linux/Android/HTMLに対応しています。

iOSも以前はXamarin経由で出力できていたのですが、お金が勿論かかりますし、パフォーマンスもよいとは言えませんでした。

それが去年の夏くらいからRoboVMに対応していきました。こちらも恐ろしいスピードで。昨年末には十分使い物になる感じでした。これでいきます。


libGDXはゲームエンジンや統合開発環境とかいった御大層なものではなく、ただのフレームワーク、ライブラリです。Jarファイル(や環境によってはsoファイル)を配備するだけで環境が整います。クロスプラットフォーム系でこれほど簡単に開発環境が整うのも珍しいと思います。JavaSE版はjarを4ついれるだけの超簡単なものですので試してみてもよいでしょう。AndroidやiOS版(RoboVM)もほんの少しのファイルをクラスパスに入れるだけです。


普段はこのようにJavaSEでそのまま動くので、コードを修正したら一瞬でアプリ起動でさくさく動作確認。

http://shinsan.s3.amazonaws.com/diary/2014/0520-01.png

トライアンドエラーがやりやすいので便利ですね。


HTML5出力というのはGWTを利用しているようです。細かく動かして確認したわけではないのですが、GWTはそれなりに長く追っていたので使い勝手はわかっているため、大体想像はできます。PC向けでWebで出したいのなら少しはありかもしれません。ただし、言語的にRoboVMやAndroidのように気軽にJavaSEという感覚で使えるほどサポートされていませんので、HTML5版を含めて完全にクロスで出力できるとは思わないほうがいいでしょう。


バージョンについて

RoboVM、libGDXともに活発なのでどんどんバージョンアップしていきます。

まずは安定バージョンで開発しました。

当時の安定板はlibGDXが0.9.9、RoboVMが0.0.9でした。Xcodeは5.0です。


ナイトリーでは便利な機能がどんどん追加されていくのがわかっていましたが、互換性も失うところもありました。そのため、リリース間近までこのまま開発していきます。

libGDXの次の正式版が出ました。しかし、ぎりぎりまでひっぱります。開発がほぼ終わった段階で移行しました。1.0.0です。それに合わせて対応しているRoboVMもあげました。0.0.11です。Xcodeは5.1です。

このバージョンに上げることによる変更点は自分はメソッド名が多少変更したという程度ですみました。が、OpenGL ESのデフォルトバージョンが1から2に変更になり、従来は設定で2がつかえたのが今は設定で3が使えるようになりました。OpenGLのコードをがりがり書いていた場合は致命傷でしたが、中/高レベルAPIを利用していたため助かりました。

RoboVMもバージョンが変わることによって大幅に変わっています。iOSへのアクセスするクラスのパッケージがごっそりかわっていました。ですが、このへんからObjectiveCのライブラリ呼び出すブリッジが非常に簡単に扱えるようになり、iOSのAPIサポートも加速していきます。

BROという仕組みなのですが、Javaのコードにアノテーションを付けることによってObjectiveCの呼び出しにマッピングします。ドキュメントが追い付いていないのでバインディングプロジェクトを参考にするとよいでしょう。


で、1.0.0に差し替えて動作を確認した翌日に1.0.1がでました。対応するRoboVMも0.0.12にあがっています。こちらも差し替えましたが、コードの修正はありませんでした。それなりに機能が増えているのも確認しました。




libGDXはプロジェクトをセットアップするツールがついているのが伝統ですが、0.0.9まではEclipseプロジェクトベース、1.0.0以降はGradleベースです。これらはRoboVMのセットアップもしてくれますので(特に後者)試してみたいと思った人はすぐに試すことができます。

NetBeansでJavaSE環境でのGradleはあまりよくないため(Mavenとかと同じ。JavaEEなどのコンテナ系だと気にならないが)、おそらく真面目に開発しようと思うならrobovmコマンドをたたいた方がわかりやすくはるかに幸せになれるかと思います。AndroidやJavaSE版もAntのほうがおそらくよいでしょう。


macのNetBeans上からビルド、シミュレータを起動可能。実機やIPA作成も。デフォルトのセットアッププログラムで生成したものをベースにGradle利用している例。

http://shinsan.s3.amazonaws.com/diary/2014/0520-02.png



ちなみに、Android版はすでにリリース済みのため、このRoboVM + libGDXではiOS版のみ出力しています。もちろん、開発はJavaSEで行っていますので、Windows/Mac/Linux上でもそのまま動きますし、出力しようと思えばAndroidもすぐにはだせます。


libGDXのバランスの良さ

アプリを書くのはlibGDXであって、RoboVMかどうかは全く意識しません。

libGDXは単なるライブラリのため、すきなように利用できるのもポイントです。

GLを取得してそのままガリガリ低レベルに書くこともできるし、高レベルの2Dのシーングラフ、ウィジェットAPIもあります。その一部の高レベルAPIであるノード部分の描画だけを低レベルなGL直で処理してもいいですし、中レベルAPI?(勝手に命名。ウィジェットとGL直の間)で描画することもできます。中レベルAPIはラッピングをしていて、GLを知らずに基本的な描画が可能です。たとえば中レベルAPIのTextureクラスもGLのテクスチャIDをダイレクトに取得可能にしてあるあたり、ボトルネックができたら逃げる道がある、という考え方なのでしょう。

こういった柔軟なことができるバランスの良さが広く支持されている理由だと思います。

あ、そういやなぜか日本だけ知名度ないですね。トレンドみるとcocos2d系は中国韓国(大きく離れてアジア)だけ突出しているっぽい(というか中国が多すぎてなんでも圧倒するけど)のに対して、libGDXはエリアが割とばらけていてアメリカやヨーロッパが多い感じですね。


個人的にはシーングラフを利用しつつ、高レベルコンポーネントの使用をほとんどしない、というのが一番良いと思っています。拡張はいくらでも可能なので、思い切って利用するActor(シーングラフのノードの基本単位)を大きく絞るとよいでしょう。

個人的なベストはベースとなるクラスのActorのほかは以下の3種類のみに絞ることだと思います。

  • Group系(Actorを載せる他のAPIでいうPanel系)
  • ScrollPane
  • Image(癖があると思うのでActorを継承して自前でテクスチャを描画したほうがわかりやすい可能性も大)

多言語化とかスタイルとか闇がありそうなそのへんに振り回されないもの、という意味で。ゲーム用途ならこれで十分でしょう。


とりあえず、8bit時代のBASICとか16bit時代のC言語とかでガリガリゲーム作れた、ソースコードを打ち込んだことがある、という人はlibGDXを利用すれば簡単に当時の感覚でゲームが作れますよ。それもiOS、Android、Mac、Windows、Linuxで60fpsでさくっと動かせるものが。基本的にOpenGLとかは知る必要はありません。


自分がどれだけlibGDXに惚れこんでいるかといえば、スマホ向けに出力する予定が全くない、PCでのみ動けばよいアプリを開発する場合もlibGDXを採用するだろう、といえばわかるでしょうか。


今回は移植という形でしたが(それでもロジック部分は同じJava言語のため6割はもってこれてる)、次からは最初からAndroidとiOSを同時にリリースするつもりで作っていきます。

へびのぬけがら - April 29, 2014 05:07 AM
libGDX のプレゼン資料

4月28日にイスタンブールで行われた Istanbul Tech Talk にて、 Mario Zechner が発表した libGDX についてのプレゼン資料です
また、資料中にある Live-Coding Session に使用したコードは GitHub 上にて公開されています
各実装フェーズ毎にタグが切ってあり、また script.txt にその簡単な解説があるため、 libGDX にてどのように実装を行うかを把握するにはよい資料だと思います
(全体を把握しやすくするため、実装はかなりコンパクトにまとまっています)

へびのぬけがら - April 26, 2014 03:00 AM
libGDX のプロジェクト構成と共通インターフェイスについて

libGDX はマルチプラットフォーム対応のため、(プラットフォーム共通の)ゲームロジックの実装と、各プラットフォームに依存する実装は分離されています
セットアップツールを使い、プロジェクトを作成すると以下のようなディレクトリ構造にてプロジェクトが作成されます
(セットアップツールの "suprojects" の設定にて、 "Desktop" 、 "Android" 、 "Ios" 、 "Html" の4つすべてを選択した場合になります)

"android"、 "desktop" 、 "html" 、 "ios" の各ディレクトリには、それぞれのプラットフォーム毎の実装、設定などを含みます
例えば、 "android" ディレクトリには "AndroidManifest.xml" ファイル、 "ios" ディレクトリには "Info.plist.xml" ファイルなどがあります


これらのプラットフォームの違いを吸収するため、 libGDX は次の5つのインターフェイスを用意しています
  • Application … ライフサイクル、ウィンドウ管理などのアプリケーションレベルイベントインターフェイス
  • Files … ファイルシステムインターフェイス
  • Input … マウス、キーボード、タッチイベントや加速度センサーなどの入力イベントインターフェイス
  • Net … HTTP(S) 、 Socket 通信などのネットワークインターフェイス
  • Audio … PCM 入出力などのオーディオインターフェイス
  • Graphics … OpenGL ES 2.0、3.0 インターフェイス
これらのインターフェイスを利用することで、開発者は個々のプラットフォームの差を意識することなく、実装を行うことができます
なお、プラットフォームによっては提供されていない機能や未実装の機能(2014年4月現在では iOS プラットフォームではコンパスが利用できないなど)が存在するため、すべての機能が共通して利用できるというわけではないので、ご注意ください

へびのぬけがら - April 25, 2014 07:28 AM
libGDX 1.0 リリース

libGDX 1.0 がリリースされました

今回のリリースにて、 Android のバージョンは 2.2 以上(OpenGL ES 1.x サポートが除外されたため)が対象となりました
またセットアップツール、ドキュメントの大幅な刷新が行われています
(現状では公式ドキュメント以外では、ほぼ旧セットアップツール(gdx-setup-ui.jar)を使用した解説がほとんどとなりますので、ご注意ください)
今まで Eclipse での開発を推奨してきていましたが、ビルドツールに Gradle を採用することで IntelliJ IDEA 、および NetBeans での開発が簡単に行えるようになりました

2010年3月から始まり、4年経った今も活発に開発が行われているプロジェクトです
1.0 はプロジェクトにとっては単なる区切りでしかなく、今後も新たな機能や改善が行われていくかと思います
拙作の Gradle プラグインが本プロジェクトに採用されたことがきっかけで、コミュニティに参加するようになりましたが、何もわかっていない初心者でも歓迎してくれる良いコミュニティだと思います

( Unity や(アジア圏に強い) Cocos2d-x と比較して)日本ではまだまだ知名度の低いゲームエンジンゲーム(2D / 3D)開発フレームワークではありますが、おもしろいプロダクトと思いますので、機会がありましたら、ぜひ使ってみて下さい
こちらのブログでも今後も情報提供できたらと思います

へびのぬけがら - April 22, 2014 03:35 PM
書評『Learning Libgdx Game Development』

Packt Publishing の "Learning Libgdx Game Development" のレビューです
本書は Java ゲーム開発フレームワークである libGDX  にについて解説した書籍となります
目次は下記のようになっています

  • Introduction to Libgdx and Project Setup
  • Cross-platform Development – Build Once, Deploy Anywhere
  • Configuring the Game
  • Gathering Resources
  • Making a Scene
  • Adding the Actors
  • Menus and Options
  • Special Effects
  • Screen Transitions
  • Managing Music and Sound Effects
  • Advanced Programming Techniques
  • Animations
ゲームロジックの実装はもちろん、テクスチャのパッキング、 UI 作成、パーティクルによるのエフェクト処理などゲーム開発に必要なことが網羅的に書かれた内容となっています
最初は小さなプログラムから開始し、徐々に機能を解説、追加していくことで libGDX が持つ多くの機能を段階的に学ぶことができます

本書にて対象とするプラットフォームは主にデスクトップと Android となり、 HTML 5 や iOS についてはサポートしている程度にしか記述されていません(特に iOS 対応に関しては、現在の RoboVM 採用前の Xamarin.iOS についての解説になっています)
開発そのものも大半をデスクトップでの動作前提に進められますが、それによりエミュレータの起動などの必要がなくなり、開発そのものに集中して作業が進められることができました
また、入力インターフェイスの調整以外はデスクトップと Android にてゲームロジックを変更することなく同様に動作させることが出来たため、デスクトップにて開発を進め、各モバイル端末で実際の動作確認と細かい調整という効率的な手法が選択できるかと思います(本書の対象外とはなりますが、 gradle を採用した最新のビルドツールによる、 iOS 上での動作も確認できています)

なお、 libGDX が今もなお活発に開発が進められているということもあり、書籍にある通りに記述しても最新のバージョンでは動作しない(※UI のセレクトボックスの仕様変更)というケースもありました

全体的には、 libGDX に関して必要な情報がまとまった良書だとおもいます
(2014年4月現在、 libGDX について書かれた唯一の書籍でもありますが…)
サンプル PDF もダウンロード可能ですので、興味があれば内容を確認してみてはいかがでしょうか

へびのぬけがら - April 22, 2014 03:30 PM
NetBeans で libGDX プロジェクトを作成する

NetBeans で libGDX プロジェクトを作成する方法を紹介します
libGDX は Java 用クロスプラットフォームゲーム開発フレームワークで、現在 Windows, Mac, Linux, Android, iOS, BlackBerry, HTML5 をサポートしています
今までは開発には Eclipse を推奨していたこともあり、他の IDE にて開発するのは少し手間が必要でした
今回新たにセットアップツールの刷新が行われ、ビルドツールとして gradle が採用されたことにより、 NetBeans をはじめ、 Eclipse 以外の IDE 、エディタによる開発が簡単に行うことができるようになりました
本エントリでは、この新しいセットアップツールと、 NetBeans での libGDX プロジェクトの作成方法を紹介したいと思います
なお、 libGDX は現在も活発に開発が進められているプロジェクトであるため、閲覧される時点では挙動が異なる可能性があることをご了承ください
今回使用した環境は以下の通りになります

OS: Mac OS X 10.9.2
JDK: 1.7.0_51
Xcode: 5.1
※ Xcode は iOS プラットフォーム利用時のみ必要となります
NetBeans 8.0(Build 201403101706)
Gradle Support Plugin 1.3.0

まず、セットアップツールをダウンロードします
適当な場所に保存後、下記コマンドにてセットアップツール起動します

$ java -jar gdx-setup.jar

起動後、上記のようなウィンドウが表示されるので、各項目に適当な値を入力します
(※4月23日最新版セットアップツールに更新)

Name … アプリケーション名
Package … 作成するプロジェクトのパッケージ名
Game class … プラットフォーム共通(core)のメインゲームクラス名
Destination … プロジェクト作成先ディレクトリ
Android SDK … Android SDK のパス(local.properties に設定されます)

"Sub Project"、"Extensions" については必要に応じ、チェックを行ってください
入力後、 "Generate" ボタンをクリックすると、プロジェクトが "Destination" フィールドに指定した場所に生成されます

次に作成したプロジェクトを NetBeans で開きます
「ファイル > プロジェクトを開く」にて、生成されたディレクトリまで移動します


プロジェクトを開くと、以下のようなツリー構造で NetBeans に開かれます


作成したプロジェクト(ルートプロジェクト)は、5つのサブプロジェクトで構成されます

android … Android 用プロジェクト
core … プラットフォーム共通プロジェクト
desktop … デスクトップ (Windows, Mac, Linux) 用プロジェクト
gwt … HTML5(GWT) 用プロジェクト
ios … iOS 用プロジェクト

各サブプロジェクトはダブルクリックすることで開くことができます
まず、ルートプロジェクトの設定を行います
(ルートプロジェクトに行った設定はすべてのサブプロジェクトに反映されます)
ルートプロジェクトを右クリックし、コンテキストメニューから "プロパティ" を選択すると以下のようなウィンドウが表示されます



"Gradle home" の "Inherit" チェックボックスをはずします
また、テキストボックスに値が入力されている場合は、それも削除し、空白の状態にします
お使いの環境が Mac で、 JDK に Java 8 を使用されている場合は "Platform for build scripts"、"Target platform"、"Source Level" にて Java 7 (1.7) を選択してください
(デスクトップ用プロジェクトに使用されている lwjgl が2014年3月29日時点で Java 8 に対応していないため)
上記設定が終わったら、"OK" ボタンをクリックし、設定を反映します

プロジェクトの設定が終わったので、各サブプロジェクトを実行してみます
最初はデスクトップ用アプリケーションを実行します
サブプロジェクト内の desktop をダブルクリックして開きます
開いたプロジェクトを右クリックし、表示されたコンテキスト内から「Tasks > run」と選択し、クリックします


ビルドが実行され、以下のようなウィンドウが表示されます

次に Android 用アプリケーションを起動します
実行するために事前に端末の接続、またはエミュレータの準備を事前に行っていてください
今回は Genymotion を実行環境として使用します
サブプロジェクト内の android をダブルクリックして開きます
開いたプロジェクトを右クリックし、表示されたコンテキスト内から「Tasks > installDebug」と選択し、クリックします
Android 用のタスクは量が多いため、表示できていない場合は「Custom Tasks > Custom Tasks」と選択し、表示された "Execute Custom Tasks" ウィンドウの "Tasks" フィールドに "installDebug" と入力し、 "Execute" ボタンをクリックすることで同様に実行することができます
("Save And Execute" ボタンをクリックすると、実行したタスクが保存されるため、2回目以降は入力の手間が省けます)


ビルドが実行され、接続していた端末、またはエミュレータにアプリケーションがインストールされます
実行すると以下のように表示されるかと思います


次は HTML5 (GWT) 用アプリケーションを起動します
サブプロジェクト内の android をダブルクリックして開きます
開いたプロジェクトを右クリックし、表示されたコンテキスト内から「Tasks > superDev」と選択し、クリックします
(リスト内に "gwtSuperDev" という似た名前のタスクがありますが、こちらでは正常に起動できませんので、間違えないようご注意ください)


次にブラウザを開き、 "http://localhost:9876/" へアクセスします
(制限はないのですが、 Google Chrome ブラウザの使用をおすすめします)
以下のような表示がされるので、"Dev Mode On"、"Dev Mode Off" をブックマークレットとしてブックマークバーに登録ください


次に "http://localhost:8080/gwt/" へアクセスします
最初に以下のようなダイアログが表示されますので、先ほど登録した "Dev Mode On" ブックマークレットを実行します


実行すると、以下のように表示されるので、 "Compile" ボタンをクリックします


コンパイル終了後、以下のように表示されます
(再度先ほどのダイアログが出る場合がありますが、ローディングが終わるまでお待ちください)


最後に iOS 用アプリケーションを起動します
サブプロジェクト内の ios をダブルクリックして開きます
開いたプロジェクトを右クリックし、表示されたコンテキスト内から「Build」を選択し、クリックします
ビルド終了後、再度プロジェクトを右クリックし、「Tasks > launchiPhoneSimulator」と選択し、クリックします
(今回は iPhone シミュレータでの実行を行いますが、 iPad シミュレータ、および実機での実行も可能です)


実行後、以下のように表示されます
(初回実行時はシミュレータ起動までかなり時間が掛かりますのでご注意ください)


以上が、サポートする各プラットフォームでの実行となります
新しいセットアップツールと gradle を使用することで、簡単に NetBeans 上にプロジェクト構築が出来ることをご理解頂けたかと思います

実際のゲーム開発は、サブプロジェクトにあった core (プラットフォーム共通)プロジェクトを中心に実装していくことになります
libGDX を使用したゲーム開発の詳細については、また別のエントリにて紹介できればと思います

へびのぬけがら - March 31, 2014 10:21 PM
libGDX について

libGDX は、デスクトップ(Windows, Mac OS X, Linux)、モバイル(Android, iOS, Blackberry)、 HTML5 というマルチプラットフォームをサポートした、オープンソース(Apache License 2.0) の Java ゲーム(2D / 3D)開発フレームワークになります
国内ではまだ有名とは言えない状況ですが、海外では Android ネイティブアプリケーションをはじめ、多くのゲーム開発にて採用されています

このフレームワークの最大の魅力は、ラピッドプロトタイピングと、それによりイテレーションを素早く実行できることにあります
実行、デバッグが容易なデスクトップ用アプリケーションとして開発を進め、その後各プラットフォームにて調整という流れで作業を行うことで開発時間の短縮がはかれます
(ただし、 HTML5 対応に限っては調整にかなりの時間を要するかと思います)

また他のゲーム開発用フレームワークと比較すると、 libGDX は OpenGL による描画や入出力処理などの低レベル API が中心として提供され、ゲーム開発によく使われるトランジションなどの高レベル API はあまり用意されていません
しかし、これにより他のライブラリ、フレームワークとの柔軟な組み合わせ(例えば、先述のトランジションに関しては Universal Tween Engine を使用するなど)を実現することができます

ドキュメントに関しても公式の Wiki 、フォーラムをはじめ、などが充実しています(残念ながら、日本語の資料は少ないです)

YouTube 上にも(公式のものではありませんが)チュートリアル動画がいくつかアップロードされています(以下はシリーズとしてまとまっているものを挙げています)
日本語の資料は少ないのですが、 @rnkv さんの「技情研ネット」内のページがとても実践的な内容にてまとまっています
以上、簡単な libGDX の紹介と資料のリンクまとめになります
(上記以外にもオススメのドキュメント等ありましたら教えてください)

へびのぬけがら - March 23, 2014 08:50 PM
Packt Publishing のキャンペーンのお知らせ

先日レビューを書いた "iPhone Game Blueprints" を出版した Packt Publishing 社が、出版タイトル 2000 到達ということで、電子書籍1タイトル購入でさらに1タイトル無料でもらえる キャンペーンを行っているようです。
(キャンペーンの詳細に関しては、リンク先を参照ください)
何か興味のあるタイトルがありましたら、ご利用してみてはいかがでしょうか?
(キャンペーン残り日数わずかですのでご注意ください)

へびのぬけがら - February 14, 2014 10:45 PM
iPhone Game Blueprints を読みました

Packt Publishing の "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 がサンプルとしてダウンロードできますので、確認してみてはいかがでしょうか

しんさんの出張所 はてな編 - January 27, 2014 12:00 AM
[NetBeans][ソフトウェア技術][ゲーム][自作ソフト]JavaしかかけないおいらがAndroidアプリをリリースするまで

の続き。

しかし、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回目のは破棄、いちからの作り直しです。


https://shinsan.s3.amazonaws.com/diary/2014/0127-01.png

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版と違いはありません。


https://shinsan.s3.amazonaws.com/diary/2014/0127-02.png

PC版。BGMも効果音もなる。おそらくMacやLinuxでもそのまま動く。


2回目までと違い、3回目の開発では描画もOpenGLにしてAndroidとPC(Java+JOGL)とで共通としました。

共通レイヤーを作って作るというのはmixiアプリ第2弾のPONPONと同様ですね。あちらはPC側はSwing+Java2D、Web側の描画&サウンドエンジンはFlash、ゲーム部分はGWTによる100%共通部分をJavascript化で、ロジックは一切Flashにもたないという変態アーキでしたのでアレに比べると難易度ははるかに低いと思います。



そのほか今回注意したのはバナー広告を間違ってタップしないようにすること。バナー広告やアイコン広告をメイン画面から離すようにしました。

また、縦持ちで、画面上のステータスエリアを常に表示するようにすること。フルスクリーンのほうが楽ではありますが、やはりながらプレイは時間や電池、お知らせの表示などをしたままのほうがいいと思いました。スマホのゲームは限りなく100%に近いくらいフルスクリーンでのプレイとなります。そのせいで現在の時間やバッテリなどを確認するためにホームボタンを押すというのはやはり使いにくいと常におもっていましたので。

利用できる画面は狭くなりますが、この考え方は基本変わらないでしょう。


ダウンロードはこちらから。

きしだのはてな - January 24, 2014 09:00 AM
台湾に行ってきた

明星和楽という、Nulabのhsmtさんたちが中心になってやってる福岡でやってるイベントが、今年は台湾であるというので行ってみました。

MYOJO WARAKU 2014 in TAIPEI – Jan 18, 2014

台湾に行ってみたかったのと、こういう海外イベントでは日本から行く人と仲良くなりやすいというのとで。


明星和楽

明星和楽は、西門紅楼というところでありました。

f:id:nowokay:20140118145514j:image


建物に入ると、ナストマくんのナスのほうの人が行儀よく店番してました。トマのほうの人はごはんに行ってた。NetBeansの人にはねこびーんで有名ですね。

合同会社CGFM - 福岡のWebデザイン・制作会社

f:id:nowokay:20140118130920j:image


広場のほうでは、長浜ナンバーワンが店を出していました。

f:id:nowokay:20140118133916j:image

麺はちょっと違う気がしたけど、スープなどは博多ラーメンだった。

f:id:nowokay:20140118140528j:image



広場のステージ前では、どっかのへんなおっさんが変な踊りをずっと踊っていて、異様な雰囲気を醸し出していました。

f:id:nowokay:20140118163537j:image


夜は、hsmtさんもなんかやってましたね。

f:id:nowokay:20140118205235j:image


屋内ではスタートアップの人がプレゼンやってたり、ステージがあったりしました。

f:id:nowokay:20140118131138j:image

アラタナの宮崎さんのプレゼンがおもしろかった。


侍BALLERSの人たちとHUMAN BEAT BOXER DAICHIのセッションは盛り上がりました。

f:id:nowokay:20140118185802j:image


DAICHIさんは、ひとり「あまちゃん」で話題になってましたね。

▶ Human Orchestra/口だけであまちゃんOPテーマ - YouTube

これを、ステージでライブサンプリングでやってました。すごい。


あと、千年にひとりとかで話題の、Rev. from DVLが来てました。

f:id:nowokay:20140118175506j:image

橋本環奈マジ天使!


西門

明星和楽の会場がある西門は、台湾の原宿といわれているらしいです。

f:id:nowokay:20140121020726j:image


土日は家族連れでいっぱい、月曜日は学校帰りの中高生でいっぱいと、そんな感じでした。

f:id:nowokay:20140118145542j:image

歩道のひとだかりは、侍BALLERSの人たちのストリートパフォーマンスです。


撮影してるところもいくつか見ました。写真撮ってたら、おねえさんがこっちに手をふってくれたのだけど、その瞬間は撮れてなくて残念。

f:id:nowokay:20140120123536j:image


通りに普通に刺青やさんがあって、ふつうに女の子が背中に入れてもらってたのがビックリでした。

f:id:nowokay:20140118150814j:image


そんなにぎやかな西門も、深夜2時くらいにはだれもいなくなって、静かになります。

f:id:nowokay:20140121021908j:image


明星和楽会場の西門紅楼もこんな感じ

f:id:nowokay:20140121021604j:image


台中

明星和楽翌日、台湾には日本の新幹線が走ってるということで乗ってみました。新幹線に乗ることが目的で、行き先はどこでもよかったのですが、台南までいくのもおおげさなので、台中まで。

f:id:nowokay:20140119121529j:image


中もそのまま新幹線

f:id:nowokay:20140119121614j:image


台中には美術館があるということで、そこに行ってみようかと。その前にパスタやさんによってみました。

f:id:nowokay:20140119162445j:image


チーズをその場で削ってくれる感じのがんばったお店でした。

f:id:nowokay:20140119141514j:image


そしたら、伝票に「外国人」とw

f:id:nowokay:20140119142532j:image


お店を出るときにも店員さんたちから結構珍しそうに見られていたのですけど、まあ外国から来た観光客がわざわざ台湾で美術館に来てパスタとか食いませんよね。

レジでお金を払うと、女の子が、ちょっとためらって、がんばった感じで「Did you enjoy?」みたいなことを聞いてきて、ものすごくかわいかった。高校に入ったときに元いた中学の部活に顔を出して「先輩高校の部活どうですか?」って聞かれるような感じの甘酸っぱさがありました。

はっきりいって、今回台湾が楽しかったというのの9割はあの女の子のしぐさによるものです。キュンキュン来た。


美術館では、ジョアン・ミロの展覧会をやってました。

f:id:nowokay:20140119144711j:image

こういった、高度に記号化された抽象絵画を100点以上、よくわからない台湾語で説明されながら(なんか団体客が説明うけてた)見てまわるのは、結構つらかったw


美術館から駅に戻るのが大変で、バス停がみつからない。Google Mapsを使ったら負けだと思ってたのですが、確認してみると行き過ぎていたようです。それらしいところはなかったのだけど。結局、もうひとつ先のバス停まで歩きました。

f:id:nowokay:20140119170539j:image


バスに乗って、まあ20元だよねとお金を出そうとすると、入れるなといわれてカードをもらいました。

f:id:nowokay:20140119171326j:image

あぁ、このカードを降りるときに渡してお金を払うのね、と思ったのだけど、降りるときもお金出そうとすると入れるなといわれました。いいんだろうか。


駅には、ダンボールでできたお店が。これかわいい。

f:id:nowokay:20140119174458j:image


ということで、この日は、新幹線にのってパスタ食って美術館、というぜんぜん台湾らしくない日曜日でした。パスタやさんの女の子がかわいかったことを除いて。


九份

さて、台湾といえば、「千と千尋の神隠し」のモデルになったと噂になった、九份です。実際は、たまたま似ているだけで、九份がモデルというのは否定されてるみたいですが。

まあ、それでもなかなか楽しいところでした。

台北からバスで行けるみたいですが、今回は電車+バスで行ってみました。

まず台北駅で瑞芳行きの切符を買います。窓口で買う必要があるのですが、「ルイフェン」って言えば買えます。みんな瑞芳に行きますからね。

f:id:nowokay:20140120133950j:image


電車に乗りに行こうと思ったら、こんなオブジェが。なんかズルい。

f:id:nowokay:20140120134606j:image


電車に乗ったら、なんか2人組の女の子の片方が隣にすわってて、あっちと替わってもらえませんか?って英語で言われたので(たぶん日本人)席を替わりました。そしたらそっちでも隣の女の子に後ろの人と替わってくれませんか?ってこんどは台湾語で言われて、どんどんずれていきました。なんか楽しい。

瑞芳で降りたら、バスに乗ります。「往九份」って書いてあるのに乗ればいいです。

f:id:nowokay:20140120153121j:image


ネットで調べると九份バス停ではなく降車バス停まで行って降りてきたほうがいいとあって、実際みんな降車バス停で降りてました。

f:id:nowokay:20140120154900j:image


で、九份

f:id:nowokay:20140120155521j:image


いい感じです。

f:id:nowokay:20140120160548j:image


ちょっと裏に入ると、住宅です。ナンパされましたが、言葉が通じず逃げられてしまいました。

f:id:nowokay:20140120161742j:image


変なおばちゃんから食いもんを買います。イモトとテレビに出たらしい。

f:id:nowokay:20140120162546j:image


いったん一番したまで降りたので、帰ろうと思ったけど、九份バス停ではすでにバスがいっぱいで乗れる気配がなかったので、また登って降車バス停から乗ることに。

そしたら、なんかネットで見た感じ。

f:id:nowokay:20140120171110j:image


よく見る風景が!

f:id:nowokay:20140120175206j:image


満足したので帰ります。

帰り、コインがなくてバス代が払いにくいので、なにか食べてお金を崩そうと思ってへんな饅頭のようなものを買いました。

そしたら、50元玉でおつりが返ってきたのだけど、10元玉が欲しかったので、「我要十元」と言ったら、なんとか通じたようで、10元玉5枚と替えてくれました。


しかし、バスはすごい行列。台北直通のバスはなかなか乗れないので、瑞芳行きに。電車で来ておいてよかった。

月曜日に来てこれだったので、土日だともっとすごかったのかも。


ドイツビール

台北に戻ったら、ドイツビールやさんに行ってみました。

f:id:nowokay:20140120211852j:image


なかなかおいしい。金額も日本と同じくらい。

f:id:nowokay:20140120212419j:image


飲んでたら、おっさんは帰ってしまって、店にひとり取り残されてしまいましたw

おばちゃんが外にいる、と。おばちゃんが戻ってきたので、もう一杯ビールを頼むと、「中国人から中国語を習ったの?それは中国の発音よ」という感じのことを英語で言われました。台湾語と北京語は違うらしい。


台湾たのしい

ということで、すごく台湾たのしかった。

書いたとおり、その9割はパスタやのレジの女の子にもっていかれていますが。いやー、いま思い出しても甘酸っぱい。

というのは別として、東京みたいに行儀よくしないといけない緊張感とかがぜんぜんなくて、だらだらと過ごせました。東京だとリュックを背中に背負ったまま混んだ電車にうっかり乗ってしまうと「おまえどっか行け」みたいなことをTwitterに書かれてたりするじゃないですか。そんな殺伐感がないです。

台湾の人はみんなおだやかだし、台北では日本語それなりにわかってもらえるし、初めて行く海外としてはとてもいいんじゃないかと。

また機会を作って行こうと思います。

f:id:nowokay:20140121151028j:image

へびのぬけがら - January 19, 2014 01:33 AM
NetBeans と RoboVM で iOS アプリ開発(Gradle 編)

前回に引き続き、 NetBeans と RoboVM で iOS アプリ開発を行う方法についてです
今回は Gradle を使用した開発を紹介します
Gradle プラグインは公式では提供されていませんので、拙作のプラグインを利用します
使用する環境は以下の通りです

OS: Mac OS X 10.9.1
Xcode: 5.0.2
NetBeans: 7.4 (Build 201310111528)

まず、使用する環境に Gradle をインストールします
以下の例では、 Homebrew を使用してインストールを行っています

$ brew install gradle


次に NetBeans に Gradle Support プラグインをインストールします


拙作のサンプルアプリケーションのリポジトリを clone します
このサンプルアプリケーションは、公式のサンプルアプリケーションを Gradle 対応に変更したプロジェクトになります


clone 後、 Gradle wrapper を利用するため、プロジェクトのプロパティを開き、以下のように「Gradle home」のフィールドを空白に設定します


設定後、実際に動かしてみます
Gradle プラグインのタスクは下記の通りになっています
  1. launchIPhoneSimulator … iPhone シミュレータにて実行
  2. launchIPadSimulator … iPad シミュレータにて実行
  3. launchIOSDevice … 実機にて実行(要プロビジョニング済)
  4. createIPA … ipa ファイル生成
今回は Maven プラグインのときと同様に iPhone シミュレータにて実行します
プロジェクトのコンテキストメニューから「Tasks」>「launchIPhoneSimulator」を実行します


初回実行時はビルドに時間が掛かりますが、完了後以下のように iPhone シミュレータが起動します


Maven 、 Gradle を利用した RoboVM による iOS アプリケーション開発ということで前回、今回と紹介してきました
今後、 RoboVM についてより詳しい紹介を行えたらと思います

へびのぬけがら - January 18, 2014 01:31 AM
NetBeans と RoboVM で iOS アプリ開発(Maven 編)

NetBeans と RoboVM で iOS アプリ開発を行う方法について紹介します

まず、 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カ所を修正します
<plugin>
  <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>

<dependency&gt
  <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 プラグインのゴールは下記の通りになっています
  1. robovm:iphone-sim … iPhone シミュレータにて実行
  2. robovm:ipad-sim … iPad シミュレータにて実行
  3. robovm:ios-device … 実機にて実行(要プロビジョニング済)
  4. robovm:create-ipa … ipa ファイル生成
今回は iPhone シミュレータにて実行します
コンテキストメニューより「カスタム」>「ゴール...」を選択します


表示されたウィンドウにて、"robovm:iphone-sim" を入力し、「OK」ボタンをクリックします


初回実行時はビルドに時間が掛かりますが、完了後以下のように iPhone シミュレータが起動します


RoboVM はまだ開発途上のプロダクトですが、ゲーム開発などパフォーマンスが要求されるような場面でも十分に使用できるレベルまでになっていると思います
Java + RoboVM + NetBeans にて iOS アプリケーション開発に挑戦してみてはいかがでしょうか

きしだのはてな - December 31, 2013 08:20 AM
2013年まとめ:今年はJava8の年だった

うっかり帰省しそびれて、ひとりだらだら年越しすることになったので、はてブがたくさん付いた記事を中心に月ごとのエントリをまとめてみます。


1月

この月に一番ぶくまついたのはこの記事。それでも33程度。

SIerが日本にしかいないという割には、デマルコとかの話が腑に落ちすぎたりするのが疑問で、ちょっと調べてみました。

たぶん、日本と同じようなSIerがいて同じような問題をかかえてる気がします。違うのは、日本と同じようなSIer以外もたくさんいそうなところですかね。

SIerは日本にしかいないのか - きしだのはてな


あとは、FPGAばっかりさわってました。

ぼくのかんがえたさいきょうのCPU - 命令表 - きしだのはてな

でもこの後、仕事が忙しくなって、CPUの実装進んでないです。


2月

FPGAに一番かぶれてたころ。

CPUはオワコン - きしだのはてな


3月

仕事が忙しくなってきた!

ソフトウェア工学は失敗している - きしだのはてな


4月

ちょっとスキを見てまとめた感じ。

FPGAのおすすめ教材 - きしだのはてな


あとは作業中に気づいた系のシブ目の小ネタが多かったです。

文字列でswitchするときはif-else switchイデオムを使うほうが安全 - きしだのはてな


5月

仕事がひとやま越えて、なんかネタを書いてますね。

Java大好き男に「どのIDEが好き?」と訊ねられたとき、女はどう答え - きしだのはてな


あとは、Java8の文法をまとめ始めています。

Java 8を関数型っぽく使うためのおまじない - きしだのはてな

Java8のStreamを使いこなす - きしだのはてな

Java8のStreamの目的と書きやすさや可読性、並行処理の効果について - きしだのはてな

Java8で体験するオブジェクトと関数の狭間 - きしだのはてな

Java8のlambda構文がどのようにクロージャーではないか - きしだのはてな

Java8で強化されたMapと、書きやすくなったメモ化再帰 - きしだのはてな

Java8でのプログラムの構造を変えるOptional、ただしモナドではない - きしだのはてな

Java8で最もインパクトのある構文拡張、デフォルトメソッド - きしだのはてな(6月)


6月

仕事の忙しさ再燃で、あんまり技術系まとめどころじゃなくなってた感じ。

小ネタ系。

TDDで「テストばかり書いて間に合うのか?」と質問されたときの正解 - きしだのはてな

Struts1職人の朝は早い - きしだのはてな


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 -1日目 - きしだのはてな

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歳定年説の正体」っていう下書きが公開されるところまで行かなかったのが、今年の後悔。


ということで、また来年もよろしくお願いします。

きしだのはてな - November 21, 2013 02:54 PM
[netbeans]NetBeans7.4でCordovaを使うときの注意

だいたいの手順は、こちらのYouTubeの通り。

D


インストールしないといけないものは

  • 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はこちら

http://nodejs.org/

普通にインストールすればいいですが、上記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のインストールが必要です。

http://git-scm.com/downloads

また、環境変数PATHにgitのインストール場所を追加する必要があります。


再起動

Cordovaやgitのパスを反映させるために、NetBeansを再起動させる必要があります。

だめだったら、Windows自体を再起動させてみてください。


いろいろ面倒

ということで、いろいろ面倒、かつ注意点がそれぞれにあるので、導入手順だけでかなりの分量が必要になるので、NetBeansが対応してるからついでにCordovaでも遊んでみようかってのはちょっと難しい感じ。

ここに書いた程度の手順で環境構築できて、Cordovaに興味がある人には、手軽に試せていいと思います。

uyota 匠の一手 - November 19, 2013 06:39 AM
FreeBSD で OpenJDK の日本語を設定

FreeBSD の Java は openjdk になっていた。現在のシステムは、8.4-RELEASE。インストールしたそのままでは日本語が使えない。いわゆる豆腐になる。

まずは、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 を読み込んで、表示してみたがコンソールにも日本語が正しく表示されている。

前々回前回

uyota 匠の一手 - November 18, 2013 04:15 AM
FreeBSD の Java は openjdk

久しぶりに NetBean で Java を使おうと思ったら、NetBean がインストールされていなかった。長いこと使っていなかったので消してしまっていたらしい。そして、Java もどの実装が現役なのだか。古いものだが四つ入っている。


% 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 ではプロジェクトが空っぽだった。

前回次回

きしだのはてな - November 08, 2013 03:41 AM
[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が楽ですよね。

なんでも書けちゃう。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-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コードで。


実行するとこんな感じです。

f:id:nowokay:20131108121958p:image


ロジックを分離したい

JSPだけでは、HTMLとJavaコードがまじってしまうし、やはりロジックは分離して、JSPには表示のことだけをやってもらったほうがいいですね。

ということで、こんなJavaクラスにロジックを書くことにします。

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@Named
@ApplicationScoped
public class CalcLogic {
    public int 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
@RequestScoped
public class DateLogic {
    @Getter
    private LocalDateTime now;
    
    @PostConstruct
    public void 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を書きます。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-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>

ロジックとビューが分離されました。

実行するとこうなります。

f:id:nowokay:20131108121959p:image


DateLogicのスコープを @RequestScopedにしているので、リロードするたびに時間がかわりますが、これを @SessionScopedにすればセッションで最初にアクセスした時間、 @ApplicationScopedにすればアプリケーションを起動して最初にアクセスした時間が表示されます。

CDIを使うと、オブジェクトの寿命管理が楽になるので便利です。


パラメータを受け取りたい

さてさて、WebアプリケーションではURLやその中のクエリパラメータ、POSTデータなど、いろいろな入力によって処理することも必要になります。

ということで、ちょっと結果表示用のクラスを用意します。

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@NoArgsConstructor
@AllArgsConstructor
@Getter @Setter
public class 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")
public class CalcService {
    
    @Inject
    CalcLogic logic;
    
    @Path("add")
    @GET
    public Result add(
            @QueryParam("left") int p1,
            @QueryParam("right") int p2)
    {
        int ans = logic.add(p1, p2);
        return new 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にくるんで返すという処理です。


そんではちょっとアクセスしてみましょう。

f:id:nowokay:20131108122000p:image

JSONだ!


JSONで表示されても、という人もいると思うので、ちょっとResultクラスに@XmlRootElementアノテーションをつけてみます。(import略)

@NoArgsConstructor
@AllArgsConstructor
@Getter @Setter
@XmlRootElement
public class Result {
    int left;
    int right;
    int ans;
}

ん?

f:id:nowokay:20131108122001p:image

ソースをみてみると・・・

<?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);
        return new Result(
            p1, p2, ans);
    }

これで、人間以外のお客さまに満足していただけるサイトができました!

でもぼくはもう少し見やすいほうがいいな。人間はわがままです。

ということで、こんなJSPを作ります。名前はwithrs.jspとします。

<%@page contentType="text/html" pageEncoding="MS932"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-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をつけてもいいけど、つけないのがいいですね。


アクセスしてみると、こうなります。

f:id:nowokay:20131108122002p:image

わあ、みやすい!


と、こんな感じで、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);
    }

f:id:nowokay:20131108122003p:image


JAX-RSはかなり強力かつ柔軟なので、入力をうけとって出力を返すというものには十分に使えるように思います。

もともとHTML出力は標準としては考えられてなかった感じがあって、まだ少し実装がこなれる必要がると思いますけど。


フォーム入力する

フォーム入力も、JAX-RSでPOSTを受け取るようにすればいいんですけど、ちょっとめんどうです。

ということでJSF。


まずは、画面を管理するクラスをつくります。

@Named
@SessionScoped
@Setter @Getter
public class CalcController implements Serializable{
    Integer left;
    Integer right;
    Integer ans;
    
    @Inject
    CalcLogic logic;
    
    public void add(){
        ans = logic.add(left, right);
    }
}

@SessionScopedにしてCDIに登録しています。もうすこし狭いスコープでもいいけど、今回はこれで。

あと、フィールドは未入力状態に対応できるよう、intではなくInteger型にしています。クラスに@Setter/@Getterアノテーションがついているので、すべてのフィールドにアクセッサが自動生成されます。

あとは、CalcLogicをもってくるようにして、addメソッドで計算してます。


で、こんなJSPつくります。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-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クラスの要素に結び付けてます。


適当に入力して「足す」ボタンを押すと、結果が表示されます。

f:id:nowokay:20131108122004p:image


requiredをtrueにしているので、入力がなければエラーになるし、Integerに結び付けてるので数値じゃなければエラーになります。

f:id:nowokay:20131108122005p:image


もっと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">
            <input type="text" label="左辺" jsf:value="#{calcController.left}" required="true"/><input type="text" label="右辺" jsf:value="#{calcController.right}" required="true"/>
            <input type="submit" value="足す" jsf:action="#{calcController.add()}"/>
            答え #{calcController.ans}
        </form>
        <div jsfc="h:messages"/>
    </body>
</html>

jsf:idとかjsf:valueとかjsfcとか、JSF独自の属性が入るものの普通っぽいHTMLになっています。


これで次のように動きます。

f:id:nowokay:20131108122006p:image


まちがっても、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}"/>
            <div id="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を指定しています。

&lt;span jsfc="f:ajax" render="ans msg" execute="left right"/&gt;

基本的に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")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<>();
        addRestResourceClasses(resources);
        resources.add(JspMvcFeature.class);
        return resources;
    }

    private void 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のものでも参考になります。


JAX-RSに関しては、これも前のバージョンのものですが、基本は変わっていないのでひととおり読むといいと思います。

JavaによるRESTfulシステム構築

JavaによるRESTfulシステム構築

きしだのはてな - October 18, 2013 05:35 AM
[netbeans]NetBeans7.4には最新lombokを

NetBeans7.4がリリースされましたが、lombokが動かなくなってました。

で、NetBeans7.4ではlombokは動かない!というエントリーを書こうと思って改めてフォーラムを見ると、なんだか新しいバージョンでは動くようなことが書かれてました!

最新の1.12.2をダウンロードして試してみると、Java8+NetBeans7.4でlombok動きました!

こんなコードが正常に動いてます。

@Setter @Getter
public class NewClass {
    private Optional<Integer> a;
    
    public static void 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

きしだのはてな - October 15, 2013 04:42 PM
[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

求む英語力。


昼ビール!

会場ヒルトンホテルの横の通りをふさいで、休憩スペースになっています。

ここでは、ビール飲み放題!

f:id:nowokay:20130923144348j:image


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のロードマップの話

f:id:nowokay:20130923162712j:image

前日にNetBeans DayがあってNetBeansの話はたくさん聞いた人が多かったためか、人はそれほど多くありませんでした。


ロードマップはこんな感じ。

f:id:nowokay:20130923164558j:image

ざっくりしてますね。

ここでも、まずはJava8対応が目先の目標で、それからの話はそれ以降という感じ。


要望として多いのが

  • Visual Web
  • UML
  • Android

ということを取り上げていました。


まるでBOFのようなゆるさだなと思ったら、このセッションからはBOFだったようです。


What’s New in Java Transaction Processing

トランザクションの話。

@Transactionalアノテーションをクラスやメソッドにつけることで、宣言的トランザクションが実行できるという話。

検査例外はロールバックせず非検査例外ではロールバックするというのはEJBと同じ挙動ですが、rollbackOn、dontRollbackOnという属性で例外を指定できるというのが便利そうです。

あとは、トランザクションごとにインスタンスが生成される @TransactionScoped というスコープの紹介がありました。あまり使うことはなさそうですけど。

これで通常のアプリケーションではEJBが不要になりましたね。

でも、ここでもやはりCDIって何?という場面がありました。


大阪うどん!

なんだか大阪うどんという店があったのでよってみました。

f:id:nowokay:20130923161349j:image

お店では、ふつうに日本人の店員さんで、ふつうの日本語が通じました。

味は、高速道路のサービスエリアで食べるうどんみたいな感じです。ちょっとダシが日本のとは違うかなーくらい。ただし、量は多い。うどんはこれでmini udonです。

f:id:nowokay:20130923184748j:image

写真でみると確かにminiですが、天丼がかなり大きいです。なので、うどんも結構大きい。おなかいっぱい。


Swing 2 JavaFX

SwingプログラマがJavaFXプログラマにどう移行するか、とかいう話ではなく、SwingとJavaFXの相互連携の話でした。

これまでSwingではJFXPanelを使うとJavaFXコンポーネントを使えていたのですが、JavaFXにSwingコンポーネントを載せるということができていませんでした。

それが、SwingNodeを使うとできますよ、という話。

SwingとJavaFXでは、イベントスレッドが別々なので、それをどう統合するかという話もありました。


NetBeans Platform BOF

もう完全に関係者ばかりのセッション。

f:id:nowokay:20130923205400j:image


「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)


ということで、この日はここで終了。おとなしくホテルに帰って寝ました。

きしだのはてな - October 14, 2013 02:04 PM
[javaone2013]JavaOne2013 0日目 キーノートとコミュニティデイ

(2013/10/14に書いています)

JavaOne前日です。

f:id:nowokay:20130922101953j:image


前日とはいえ、テクニカルキーノートや、コミュニティ系のセッションなどが行われています。

で、ホテルでネットが使えないので、まあ10時くらいからかなーと思いながらとりあえずヒルトンへ。

ロビーがJavaOneになっています。

f:id:nowokay:20130922103658j:image

でも、ここでネットにつないで、テクニカルキーノートはMosconeであるということがわかりました・・・


Mosconeに行くときにおなかがすきすぎていたので、ラーメン的なものを。

f:id:nowokay:20130922120719j:image

結構、普通にラーメンでした。

Mosconeでは、道路をふさいでイベント会場を設営していました。

f:id:nowokay:20130922122349j:image

JavaOneは、Oracle製品全体のイベントの一部として行われていて、Mosconeでは基本的に本体であるOracle Openwordが行われます。


ストラテジー・テクニカルキーノート

ということで、全体は聞けてないんですが・・・

f:id:nowokay:20130922140826j:image

印象に残ってるのは

・Java MEがJavaSEのサブセットになる、ということ

・WebSocketを使った対戦チェスゲームで、Web UI、Java FX 3D、そして3Dプリンタ出力した実物のコマを動かすロボットでのデモをみせていた

というところ。

あと、Raspberry Piと液晶タブレットを使ってJavaタブレットを作ったというのもありましたけど。

基本的には、特に新しい発表はありませんでした。


3Dプリンタ出力したチェスは、展示会場においてありました。これはかわいい。

f:id:nowokay:20130924112154j:image


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時くらいですが、この時間になると西への移動が結構きついです。太陽が正面すぎて。

f:id:nowokay:20130922180645j:image

で、ホテルの近くのパスタやによってみました。

味はまあ普通にとくにおいしくないパスタですが、量が多かった。あとで後悔することになります。

f:id:nowokay:20130922185606j:image


GlassFish Community Party

GlassFishのパーティー

会場はThirsty Bearsという、醸造所でもあるビールやさんです。ここで醸造したビールが飲めます。

地ビールとしてはそこそこの味ですが、できたてはおいしいです。

f:id:nowokay:20130922205221j:image

でも、夕方たべたパスタでビールが入らなくなっていました。不覚・・・

Javaチャンピオンっぽい人が来たり、ビリヤード楽しそうでしたが、結局日本の人とばかりしゃべってました。英会話力がほしい・・・けど、これ日本語が通じてもあまり話せなかった気がするな。


ということで、JavaOne前夜祭は終了

marsのメモ - October 13, 2013 01:25 PM
[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のメモ


またの名を「 @ 無双レビュー大会」。今年もTA(Teaching Assistant)枠で参加したんですが、普通に一般参加者としてペアプロしてました。実を言うと受講者枠で参加したのは今回が初めて、TAだったのキレイさっぱり忘れてTDDBCを楽しませて頂きました。


毎度の事ながら主催およびスタッフのみなさん、一般参加された方々、おつかれさまでした&ありがとうございました。


基調講演 in 杜王町

3年続けて同じ事言ってた。


ペアプロのデモ

@ と @ という鬼軍曹×新兵コンビによる @ 公開処刑劇場。leecomお疲れ様ッ!!

個人的には、Java+Eclipseのライブデモは定番過ぎるのでは、たまには他の言語やIDEのパターンも見てみたいなと。


ブートキャンプ実施

課題は「整数の区間」。今回TAやってないんでコードレビューんときの発表内容からの推測なんだけど、チーム訳と開発環境はこんな感じだった(去年に続きNetBeansはゼロ!)。

#1JavaEclipseJUnit4hamcrest使用
#2JavaEclipseJUnit4hamcrest使用
#3PythonPyChampytest 
#4Python 
#5GroovyEclipseSpockプロダクトコードはJava
#6GroovyIntelliJSpockプロダクトコードはGroovy→Kotlin
#7Objective-CXcode 
#8RubySublime Textrspec 
#9PHPvimphpunit途中までEC2で開発してたらしい
#10C#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でチーム開発する機会なんて滅多にないので、普通にこの辺を共有するどどんな感じなるのか体験させてもらいました(おかげで良いネタ仕込ませて頂きましたよ。


コードレビュー大会

これが全てを物語っとりますわ。


(追記)これでおわかりいただけだろうか。

\シアーハートアタック!!!/


所感

実際にコード書くとなおさら実感するんだけど、仕事で作るコードはJavaじゃないほうが良くないか?と改めて思った(特にJVM系)。Groovyは柔らか過ぎるけどテストコードだったら別にいいんじゃないかとか(SpockはGroovyと言って良いのか疑問は残るけどw)。Kotlinはマイナー過ぎるやろ、というならScalaだってあるし。


なにより、JavaもScalaもKotlinもGroovyもまぜこぜにしたってちゃんと開発できるんだから。

そうIntelliJならね。(・ω<)

きしだのはてな - July 30, 2013 03:09 AM
[java]JavaでIDEのアクセッサ生成よりlombokを使ったほうがいい理由

lombokは、JavaでのアクセッサやtoString、equalsなどボイラープレートなコードをコンパイル時に生成してくれるライブラリです。

ただ、こういったコードの生成は、IDEを使えば自動で行えるので、わざわざlombokを導入するまでもないと考えることもできますが、ぼくはlombokを導入するべきだと考えて、lombokを使うようにしました。

このとき「lombokを導入するべき」と考えた理由を書いておきます。


lombokとは

lombokは冒頭でも書いたように、Javaのアクセッサなどを生成してくれるライブラリです。

Project Lombok


import lombok.*;

@Setter @Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class LombokSample {
    private String foo;
    private int bar;
    
    public static void main(String[] args) {
        LombokSample ls = new LombokSample("ee", 12);
        System.out.println(ls.getFoo());
        System.out.println(ls);
    }
}

このように、アノテーションを付加すればアクセッサやコンストラクタ、toStringメソッドなどを生成してくれます。

f:id:nowokay:20130730105113p:image


NetBeansでの導入

Mavenプロジェクトの場合は、次のようなdependencyを付け加えれば、特になにもせずにlombok対応できます。

<dependency> 
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>0.12.0</version>
  <scope>provided</scope>
</dependency>

Antプロジェクトの場合は、ダウンロードサイトからダウンロードしたlombok.jarをライブラリに追加して、プロジェクトプロパティの「ビルド > コンパイル」カテゴリにある「エディタでの注釈処理を有効にする」のチェックをいれます。

f:id:nowokay:20130730105114p:image


実は、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のメモ - July 14, 2013 01:46 PM
[life][IDEA] レッツゴーデベロッパー変真に行ってこなかった

http://tohoku-dev.jp/modules/news/article.php?storyid=207


当日は予定が入っていたので前夜祭と打ち上げにだけ参加してきた。ヒゲの人イケメンさんが来仙するというので「すわ!JetBrainsの宣伝しないとッ!!」と片っ端から紹介していった。


自分自身が地元でなーんも宣伝してないので「お前が言うな」状態なんだけど、予想通りというか予想外というか、ほとんどの人がIntelliJもReSharperも知らなかった。JavaやAndroidについては予想通りEclipse無双。あと結構iOSデベロッパーもいらっしゃいましたがXcode無双だった。:-)


ヒゲメンイケメンさんや他の人と話して、普及のため(?)の要望が多いのは、つぎの2点だったように思う。どれもホントにやっても普及促進効果があるの?というと微妙なところが玉に瑕。

  1. 日本語化
    • よくあるけど、昔やって失敗した黒歴史もある。何より準備するリソースが膨大なので割に合うのかよーわからん。
    • 実際、今でも英語圏以外でも売れてるみたいだけど、ローカライズ版は出てない。
  2. 教育
    • デモやってくれとか、ハンズアウトセミナーやってくれとか。マンパワーかかるし、難しいよね。
  3. ヘルプデスク
    • ハンズアウトがダメでも日本語でサポート受けたいよねぇとか。マンパワーかかるし、難しいよね。

(NetBeansはともかく)Eclipseは最初の「日本語化」だけで、十分なシェアを獲得したからねぇ。何よりかにより「タダであること」が強みなんだろなと。ちなみに、.NET屋さんはVisual StudioのおかげかJava屋さんより開発環境に金を出すことに抵抗がないらしい。あとReSharperがVSのアドオンってのも、既存環境を変えない(VSのままで良い)とい点で抵抗が少ないそうな。


ps.

仙台に居る人はある程度まで私がサポートしてあげれるので、欲しいなと思った人はサムライズムにじゃんじゃん発注するといいよッ!

ねこび~ん - June 26, 2013 09:37 AM
グッズ売上げを義援金として寄付させていただきました

東北を応援しよう!

ねこび〜んグッズで売上げた利益を
そのまま義援金として寄付させていただきました。

東北デベロッパーズコミュニティ設立総会を機に生まれたねこび〜ん。
少しでも恩返しできれば...と思います。

しんさんの出張所 はてな編 - June 14, 2013 12:00 AM
[ソフトウェア技術][NetBeans][Java]JavaEE 7 超入門 8クリックでEE7Webアプリ?起動確認とか

なにが「超入門」かというとおいらにとって超入門。

まずはJavEE7なアプリを起動させることを今回の目標にする。

サンプルは過去の例を見ても大げさすぎて、でかすぎて把握しにくいので無視で。

適当にフィーリングで行き当たりばったりでいい。JavaEEとはそういう感じのゆるい誰でもお気楽極楽に触れるものですよ。肩ひじ張るようなものではない。

しかし、「NetBeansタグ」すげー久々だのう。


ダウンロード

ダウンロードはここから。

https://netbeans.org/downloads/

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-01.png

JavaEEをえらぶ。このへん。


インストール

ダブルクリックでインストーラ起動。適当に押していけばOK。Glassfish 4もついてくるのでチェックを外さないように。

別途ダウンロードする必要もないのでインストーラ版がおすすめ。ダウンロードもIDE上で完成するので別にいいけど。

とにかくすぐに確認ができるのでNetBeansを常用はするつもりはないけどどんなものか知りたい人はこちらで。


起動

インストールしたアイコンをダブルクリックで立ち上げよう。

起動時に旧バージョンのNetBeansがあると設定を引き継ぐが、その場合、Glassfish4が追加されていないため、お手軽に試したい場合は設定を引き継がないほうがいいかも。

たぶんNetBeans 7.3.1のバグ。速攻でバグを踏むのもお約束。


プロジェクト作成

プロジェクトを作成する。

アイコンは右上のこのへんにあるのでクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-02.png


ウィザードが立ち上がったら以下の順序でクリック。

  • 「カテゴリ」に「Java Web」
  • 「プロジェクト」に「Webアプリケーション」
  • 「次」ボタン

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-03.png


パスとプロジェクト名を入力して「次」ボタンクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-04.png


Glassfish 4 とJavaEE 7が設定されているのを確認して 「次」をクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-05.png


フレームワークは特別何も設定しないでよい。あとでも設定できるため。「終了」をクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-06.png

これでプロジェクトの新規作成はおわり。


実行

上にある緑色の再生ボタンをクリック。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-07.png


ブラウザが自動で立ち上がり、表示する。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-08.png

NetBeansを立ち上げてから8クリックだけで新規作成からGlassfish4上でのJavaEE稼働の確認までできたわけだ。


EE7なの?

たしかにログはGlassfishが立ち上がっていることはわかるが、表示しているのがHTMLでぜんぜんEE7って感じがしない。

実はGlassfish 3とかTomcatじゃないの?といわれても仕方がないレベル。

というわけで、index.htmlを消して以下のようにJSPを書いてみる。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-09.png

うん、ちゃんとラムダ式も補完きくね。

ちなみに「<c:」とうつとtaglib設定してくれるんでまぁ楽。

    <body>
        合計=<c:out value="${[4,3,1,2].stream().sum()}" />
    </body>

ブラウザのリロード。JSPの変更程度はもちろん再デプロイは必要ない。

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-10.png

JavaEE 7ではJavaSE 8より一足お先にラムダがかけるw


ここでネタに走ってStrutsでラムダを書く・・・とおもったけど、みんなやってると思うのでやめておく。

プロジェクトを右クリックして「プロパティ」を選んで、フレームワーク>追加>Strutsとやるとライブラリも設定ファイルも全部初期設定してくれるんで、やりたい人はそこから始めるとよいだろう。


いまいち定数を合計しても面白くないのでBeansを作ってそれをアクセスしてみるか。

package bean;

public class HogeArray {
    private int[] array = {2,1,4,3,5};

    public int[] getArray() {
        return array;
    }
}

とつくっておいて

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean id="hoge" scope="page" class="bean.HogeArray"/>
<!DOCTYPE html>
<html>
    <head>
        <meta http-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>

実行

https://s3-ap-northeast-1.amazonaws.com/shinsan/diary/2013/0613-11.png

ちゃんとソートもされてるね。


ラムダの例。フィルタで奇数のものだけ処理してる。

    <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>

まずはいろいろと遊んでみるといいかもですね。

きしだのはてな - June 13, 2013 12:35 AM
[java][javaee7]WebSocketをネタにJava EE 7正式版を試してみる

Java EE 7がリリースされて、それに対応したGlassFish 4もリリースされました。

ついでに、Java EE 7やGlassFish 4に対応したNetBeans 7.3.1もリリースされています。


ということで、NetBeansとGlassFishを使ってJava EE 7を試してみようと思います。

今回は、Java EE 7の中でも簡単なコードで動きの派手なWebSocket対応を試してみます。


ダウンロード

まずNetBeansをダウンロードします。

https://netbeans.org/downloads/


NetBeansは、ちょっと試すにしてもずっと使うにしても、インストーラーではなくzipで落とすほうが楽なので、ここでは「プラットフォーム」に「OSに依存しないZIP」を選択します。

「サポートテクノロジー」が「Java EE」か「すべて」のものをダウンロードしてください。


インストーラ版をダウンロードした場合にはバンドルされているので不要ですが、今回はGlassFishもダウンロードします。

https://glassfish.java.net/download.html


ここでは、「Full Java EE platform」で、「Zip」の「Multilingual」版をダウンロードします。

f:id:nowokay:20130613084740p:image

ダウンロードしたら適当なフォルダに解凍してください。


NetBeansの起動

JDKを複数インストールしている人は、NetBeansを起動する前に「/etc/netbeans.conf」の「netbeans_jdkhome」でJDKのフォルダを設定しておくほうがいいと思います。


/binフォルダにある、環境にあわせた実行ファイルを起動すると、NetBeansが起動します。

f:id:nowokay:20130613084741p:image


NetBeansの起動後の画面です。

f:id:nowokay:20130613084742p:image


「最新情報」でなんかネタが拾われててこっぱずかしいですね。

f:id:nowokay:20130613084743p:image

このブログは、「すべてのブログ」からたどれるPlanet NetBeansに登録されたものが表示されます。

http://planetnetbeans.org/ja/

NetBeansに関するブログを書く人は登録しておくといいと思います。


NetBeansへGlassFishの組み込み

インストーラ版でNetBeansを起動した場合にはすでにGlassFishが設定されているはずですが、ここでは先ほどダウンロードしたGlassFishを登録する必要があります。

メインメニューから「ウィンドウ > サービス」を選択します。

f:id:nowokay:20130613084744p:image


「サービス」ウィンドウが開くので、「サーバー」を右クリックしてメニューから「サーバーの追加」を選択します。

f:id:nowokay:20130613084745p:image


「サーバー・インスタンスの追加」ダイアログが開くので、サーバーで「GlassFish Server」を選択します。名前はそのままでもかまいませんが、ここでは「GlassFish Server 4.0」として「次へ」ボタンを押します。

f:id:nowokay:20130613084746p:image


NetBeansでは使わないプラグインは無効になっています。「Java WebおよびEE」の機能がここでアクティブ化します。

f:id:nowokay:20130613084747p:image


GlassFishを解凍したフォルダを「インストール場所」に入力します。GlassFishが検出されると、下部に検出メッセージが表示されるので、「次へ」ボタンを押します。

f:id:nowokay:20130613084749p:image


ドメインなどの設定ができますが、そのまま「終了」ボタンを押します。

f:id:nowokay:20130613084750p:image


サーバーとしてGlassFishが追加されました。ここからGlassFishを起動・停止することもできます。ここでは、確認だけ。

f:id:nowokay:20130613084751p:image


Webプロジェクトの作成

まずはWebアプリケーション用のプロジェクトを作成します。


メインメニューから「ファイル > 新規プロジェクト」を選択します。

f:id:nowokay:20130613084752p:image


「Java Web」カテゴリから「Webアプリケーション」を選んで「次へ」ボタンを押します。

f:id:nowokay:20130613084753p:image


プロジェクト名やプロジェクトの場所を選択します。ここではプロジェクト名に「WebApplicationEE7」として「次へ」ボタンを押します。

f:id:nowokay:20130613084754p:image


この画面ではサーバーやコンテキストパスの設定ができます。「Java EEバージョン」が「Java EE 7 Web」になっていますね。

f:id:nowokay:20130613084755p:image

そのまま「次へ」ボタンを押します。


JSFなどのフレームワークを選ぶことができますが、ここではそのまま「終了」ボタンを押します。

f:id:nowokay:20130613084756p:image


WebSocketエントリポイントの作成

Java EE 7でWebSocketと通信するためのWebSocketエントリポイントを作成します。

「プロジェクト」ウィンドウの「ソース・パッケージ」で右クリックして、メニューから「新規 > その他」を選択します。

f:id:nowokay:20130613084757p:image


「Web」カテゴりから、「ファイル・タイプ」として「WebSocketエンドポイント」を選択して「次へ」ボタンを押します

f:id:nowokay:20130613084758p:image


ここでは、「クラス名」や「WebSocket URI」などはそのまま、パッケージ名だけ設定しておきます。

f:id:nowokay:20130613084759p:image

「終了」ボタンを押すと、WebSocketエンドポイントとなるクラスが生成されます。


処理を加えて、次のように編集します。

package wsock;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/**
 *
 * @author naoki
 */
@ServerEndpoint("/endpoint")
public class NewWSEndpoint {

    static Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
    
    @OnMessage
    public void onMessage(String message) {
        for(Session s : sessions){
            s.getAsyncRemote().sendText(message);
        }
    }
    
    @OnOpen
    public void open(Session sess){
        sessions.add(sess);
    }
    @OnClose
    public void close(Session sess){
        sessions.remove(sess);
    }
}

表示ページの作成

表示ページを作ります。

ここでは、プロジェクト作成時に同時に生成されたindex.htmlファイルをそのまま編集します。

URLは、プロジェクト作成時に指定したコンテキストパスにあわせて修正してください。

<!DOCTYPE html>
<html>
    <head>
        <title>WebSocketテスト</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
        <script type="text/javascript">
            var socket;
            $(document).ready(function(){
                var host="ws://localhost:8080/WebApplicationEE7/endpoint";
                socket = new WebSocket(host);
                
                socket.onmessage = function(message){
                    $('#log').append(message.data + "<br/>");
                }

                $('#send').click(function(){
                    var text = $('#msg').val();
                    socket.send(text);
                    $('#msg').val('');
                })
    
            });
        </script>        
    </head>
    <body>
        <h1>WebSocketテスト</h1>
        <div id="log">
        </div>
        <input id="msg" type="text"/>
        <button id="send">送信</button>
    </body>
</html>

実行

それでは実行してみましょう。

プロジェクトを右クリックしてメニューから「実行」を選択します。

f:id:nowokay:20130613084800p:image


GlassFishが起動して、プロジェクトが配備されます。

f:id:nowokay:20130613084801p:image


テキストボックスになにか入力して「送信」ボタンを押すと、その文字列が表示されます。

f:id:nowokay:20130613084802p:image

複数のブラウザを開いておくと、すべてのブラウザで文字列が表示されます。

WebSocketがちゃんと動いてますね。


これで、簡単にチャットなどを作ることができそうです。

きしだのはてな - May 18, 2013 11:18 PM
[java][java8]Java8で体験するオブジェクトと関数の狭間

Java8でlambda構文が導入されることで、Java言語も関数型のような性質をもつことになりました。

関数型の性質として大事なことのひとつに、関数を戻り値として返せるということがあります。lambda構文によって、Javaでも表記上は関数を戻り値として返すことが可能になったわけです。

で、関数を戻り値として返せるとどうなるかというと、関数をオブジェクトのように使えるようになります。まあ、Javaでは関数といっても普通のオブジェクトとして扱われるので、関数としてオブジェクトのようなものが記述できる、ということになります。


では実際に、オブジェクトのようなものを関数として記述してみます。

    public static Function<String, Object> myFunc(String name, String address, LocalDate birthday){
        return prop -> {
            switch(prop){
                case "name": return name;
                case "address": return address;
                case "birthday": return birthday;
                case "introduce": return (Runnable)() -> {
                    System.out.printf("わたしは%s。%sに住んでて%tY年%<tm月%<td日生まれ%n", 
                            name, address, birthday);
                }
                case "age": return (Function<LocalDate, Integer>)d ->
                        birthday.periodUntil(d).getYears();
            }
            return null;
        }
    }

ここでは、文字列でname、address、日付でbirthdayを受け取ると、「文字列をうけとってオブジェクトを返す関数」を返すような関数を定義しています。

ちなみに、NetBeansのデイリービルド201305152300版では、コンパイルエラーと表示されます。

※ returnのあとのセミコロンがなくてもb88でコンパイル通るというのが原因ぽい。これは仕様?

※2 b89だとコンパイルエラーになるらしい。残念。セミコロン追加してください。


このmyFuncをこんな感じで呼び出しますね。

Function<String, Object> func = myFunc("きしだ", "ふくおか", LocalDate.of(2007, 5, 26));
System.out.println(func.apply("name"));
System.out.println(func.apply("address"));
System.out.println(func.apply("birthday"));

表示はこうなります。

きしだ

ふくおか

2007-05-26


もどってきた「関数」が、name・address・birthdayといった属性をもっているようにふるまっています。myFuncはコンストラクタのような役割になっていますね。

定義では、文字列「name」を受け取ったらmyFuncの第一引数を返すといった「関数」をlambda構文で記述していて、クラスやオブジェクトを定義・生成するような構文は使っていません。


メソッドはどうでしょう?「introduce」という引数で「関数」を呼び出すと、Runnableオブジェクトが返ってきます。これは引数をもたず戻り値もない処理をあらわします。

Runnable introduceProc = (Runnable)func.apply("introduce");
introduceProc.run();

これを呼び出すと、次のように表示されます。

わたしはきしだ。ふくおかに住んでて2007年05月26日生まれ

ちゃんと、myFuncに渡した値が使われていますね。


引数をもつメソッドも定義できています。日付を渡すと、その時点での年齢を返してくれます。

Function<LocalDate, Integer> ageFunc = (Function<LocalDate, Integer>)func.apply("age");
System.out.println(ageFunc.apply(LocalDate.now()) + "歳");

次のように、正しく表示されますね。

5歳


このように、myFuncを呼び出して返ってきた「関数」が、オブジェクトのように使えることがわかりました。


このような、関数をオブジェクトのように扱う記述は、関数を値として扱えるような言語では比較的自然に記述することができるのですが、Javaではlambda構文で関数の記述はできるようになったものの値としてはオブジェクトとして扱われるので、非常にイビツな記述になっています。

コードの説明も、やはりちょっと苦しいです。


ただ、これが、なんだかオブジェクトと関数の狭間に迷い込んだことをあらわしていて非常に面白いなと思いました。

ちなみに、2007年5月26日は、Twitterをはじめた日なので、誕生日として扱っても間違いないです。


全体は次のようになります。

import java.time.LocalDate;
import java.util.function.Function;

public class FuncObj {
    public static void main(String... args){
        Function<String, Object> func = myFunc("きしだ", "ふくおか", LocalDate.of(2007, 5, 26));
        System.out.println(func.apply("name"));
        System.out.println(func.apply("address"));
        System.out.println(func.apply("birthday"));
        
        Runnable introduceFunc = (Runnable)func.apply("introduce");
        (introduceFunc).run();
        
        Function<LocalDate, Integer> ageFunc = (Function<LocalDate, Integer>)func.apply("age");
        System.out.println(ageFunc.apply(LocalDate.now()) + "歳");
    }
    public static Function<String, Object> myFunc(String name, String address, LocalDate birthday){
        return prop -> {
            switch(prop){
                case "name": return name;
                case "address": return address;
                case "birthday": return birthday;
                case "introduce": return (Runnable)() -> {
                    System.out.printf("わたしは%s。%sに住んでて%tY年%<tm月%<td日生まれ%n", 
                            name, address, birthday);
                }
                case "age": return (Function<LocalDate, Integer>)d ->
                        birthday.periodUntil(d).getYears();
            }
            return null;
        }
    }
}

marsのメモ - May 17, 2013 01:39 PM
[IDEA][life] Java Day Tokyo 2013でIDEバトルやってきました

https://oj-events.jp/public/application/add/64


血で血を洗う勝者なき闘い!!...なんてことはなく,和気藹々とやりましたよ。

こんな面白い企画に誘って頂き関係者の皆さん(&出張扱いにしてくれた弊社)には感謝です。こんな場所で話せるほどIntelliJがメジャーになったと思うと感慨深いものがありますね。


みんな気付いているけど,これが真実だよね。

そんでもご贔屓のツールについて語るのも聴くのも楽しいんだからしょうがない。:-)


当日モデレータとグルになった広報活動では伝えきれなかった点について若干補足しときます。IntelliJの特徴で伝え損ねたのですが,これの最大の特徴は,これだと思ってます。

基本的なコンセプトは,使う人が 『いろいろ』 知ってる前提でサポートするIDEで、
やりたいことが,よく知らなくても何とかしてくれる系ではないです

EclipseのCtrl+2みたいな「これだけ知ってれば何とかなる」みたいな機能は少なめですし,NetBeansのように「細けぇ事は気にするな」的なお手軽さはありません。「なんでもしてやるから指示しな」「ダメだったら文句言ってやる」となかなかスパルタンなところがあります。(´・ω・`)

裏を返すと,やりたいことがハッキリしてれば,その手順を邪魔しないし,絶妙なアシストをしてくれます。そんなIDEですが,クセが強いのであわない人はあわないだろうな...。


テキストエディタと異なるIDEのメリットについては,きしださんがキレイにまとめてくれました。


FindBugsやCheckstyleあたりをうまいこと使えばテキストエディタでも似たような事はできますが,シームレスさに置いてはIDEに軍配があがると思います。テキストエディタより動作が重くなる理由のひとつでもあるんだから,そこは認めとこう。

この手のお節介機能については,IntelliJも負けてないんだけど,頑張りすぎて項目が膨大になり互いに矛盾するものもあって,使いこなすのは結構ちょっと大変。IntelliJ(Hectorおじさん)に指摘されたことを盲目的に信じずに「これは直す」「これはいいや」と取捨選択できないとうっとうしいだけだろな。

24日目 Inspections & Intentions - marsのメモ


ps.

今までほとんどIntelliJユーザに遭遇したことがなかったので行くまで「IntelliJが流行ってるとかガセ」と思ってたら違ってた。東京すごい。

あとtwitterでしかあったことがない皆さま方も実在してた。現実すごい。


(゜Д゜)ハッ!! これが「深淵をのぞく時、深淵もまたこちらをのぞいているのだ。」と言うことか...。

きしだのはてな - May 16, 2013 02:54 AM
Java大好き男に「どのIDEが好き?」と訊ねられたとき、女はどう答えたらいいの?

あ、まず前提として、

貴女がJava大好き男を夢中にさせることが、

はたして貴女を幸福にするかどうか、それはまた別問題だけれど。

とはいえ、Java大好き男たちは玉石混交ながら、

大手SI系の給料高い男なども多く、

したがって、釣り師たる女たちにとっては、

なかなかあなどれない釣り場です。


では、Java大好き男に「どのIDEが好き?」と訊ねられたとき、

貴女は、どう答えれば理想的でしょう?

まず最初に、その男がAndroidのようなタイプの携帯アプリと

あとはJavaScript、そして(アプリ公開するほどではないけれど)iPhoneアプリが大好きな、

そんなタイプの場合は、

貴女はかれの目を見て、微笑みとともに質問など無視して、こう言いましょう、

「わたしが、いいIDEを作ってあげる♪」

これこそまさに必殺の答えです。

そこでJava大好き男が、えへへ、とやにさがったならば、

貴女は、ひそかに、「IntelliJベースのAndroid開発ツール」あたりを

ひそかに開発しておきましょう。これで成功まちがいなしです。


しかし、ここでは、もう少しハイブロウな(?)いわゆるOracle Java好きの男の

落とし方をお伝えしましょう。

この場合、貴女は、こう答えましょう、

「わたしは、NetBeansが好き。

zipでよく落とすの、、

最初から日本語化されてるのも、大好き♪」

もしも貴女がそう答えたならば、

その瞬間、Oracle Java大好き男の目はきらりと輝き、

かれの貴女への恋心は、

20%増量になるでしょう。


では、参考までに、危険な回答を挙げておきましょう。

Oracle Java大好き男に「どのIDEが好き?」と訊ねられたとき、

貴女がこう答えたとしましょう、

「OracleのJDeveloperが好き♪ 毎年1案件は大手案件で使うの。」

その瞬間、Java大好き男の貴女への恋心は消えます、

なるほどJDeveloperは、Oracle製のJava IDE、

エディタは平凡ながら、ま、無難にまとめてあるものの、

しかし、「ADFコンポーネントはなんと30種類以上!」とかなんとか無意味な自慢を吹聴し、

Javaプログラム開発についての謬見を撒き散らした罪がありますから、Java大好き男にとっては天敵なんです。

また、もしも貴女が「JBuilderが大好き♪ あたしインストールしたBorlandツールたくさんあるよ♪」

と答えたとしても、同様の効果をもたらすでしょう、

なぜって、JBuilderは、1990年代にはJava屈指の名IDEだったものの、

しかし2000年代そうそうから、いやはやなんともなEclipseプラグインに転落し、

いまや、あの機能ではNetBeansの魅力に遥かに及びません。


またもしもたとえあなたがJavaが大好きで、

「わたし、IntelliJのIDEAが好き、無料でも使えるけど、

最高に好きなのはUltimate Edition♪ Scalaプラグインもすっごく使いやすいの。」

と、答えたとしたらどうでしょう?

なるほど、貴女の趣味は高く、

たしかにIntelliJ IDEAは、外装が chick であるのみならず、

機能も最高に使いやすいんですけれど、

しかし、貴女の答えを聞いて、Java大好き男はきっとおもうでしょう、

(なんだよ、お高くとまった女だな、カネかかりそう)って。


貴女が、Javaが大好きで、IDEの名を挙げるにしても、

たとえば、Eclipseならば安心でしょう、

なぜならば、Eclipseは、ふつうのサラリーマンにもマニアにもともに愛されるめずらしいIDEで、

貴女がそのIDEを挙げても必ずしも、あなたがJavaおた宣言をしているとは受け取られないでしょう。

しかし、たとえば、vimにせよSublime Text 2にせよ、

そういうエディタの名前をいきなり挙げるのは、ちょっぴり微妙。

ましてや貴女が、「Emacsが大好き♪ わたし、もうほとんど全ソース、読んじゃった♪」

と答えたならば、どうでしょう?

これはかなり博打な答え方で、

なるほど、Emacsは、Unix系OSの超絶名エディタゆえ、

あなたがそう答えた瞬間、Java大好き男がいきなり超笑顔になって、

鼻の下がだら〜んと伸びちゃう可能性もあるにはありますが、

しかし、逆に、(なんだよ、この女、エディタおたくかよ)とおもわれて、どん引きされる可能性もまた大です、

なぜって、必ずしもJava大好き男がエディタ大好き女を好きになるとは、限らないですから。

しかも、この答えには、もうひとつ問題があって、

男たちは、女を導き高みへ引き上げてあげることが大好きゆえ、

もしも貴女が、「Emacsのマクロが大好き♪」なんて言ってしまうと、

そこにはもはや、男が貴女をプログラマ教育する余地がまったく残されていません、

したがって貴女のその答えは、

Java大好き男の貴女への夢を潰してしまうことに他なりません。


ま、ざっとそんな感じです、貴女の目には男たちはバカでスケベで鈍感に見えるでしょうが、

しかし、ああ見せて、男は男で繊細で、傷つきやすく、IDEに夢を持っています、

貴女の答え方ひとつで、男の貴女への夢は大きくふくらみもすれば、

一瞬で、しぼんでしまいもするでしょう。


では、スキットを繰り返しましょう。


「わたしは、NetBeansが好き。

zipでよく落とすの、、

最初から日本語化されてるのも、大好き♪」

そして、その瞬間、Java大好き男の目がらんらんと輝いたなら、

貴女はこう重ねましょう、

「それからね、いま、わたしが使ってみたい機能は、

Java8のLambda、素敵な文法って噂を聞いたから。

あなたのお暇なときがあったら、わたしをJava8へ連れてって♪」

これでもう完璧です。


そうなったらこっちのもの、

デートの日には、アイメイクをばっちり決めて、かわいい下着をつけて、

Java Oneか、デュークの可愛いTシャツを着てゆきましょう。

その日から、Java大好き男は貴女の虜になるでしょう。

では、釣り師としての貴女の、愛の幸運と幸福をお祈りします!


参考

インド料理大好き男に「どこの店が好き?」と訊ねられたとき、女はどう答えたらいいの? : グルガオン GURGAON 食べログ

marsのメモ - April 21, 2013 08:47 AM
[IDEA][mac] Dash LauncherプラグインをIntelliJにインストールする

APIリファレンス&スニペットブラウザのDashなんですが、設定見るとAppCodeと連携できるようです(NetBeansはありませんね...。|ω・`)チラッチラッ

f:id:masanobuimai:20130421173741p:image

Mac App Store へ接続中です。


調べてみると、AppCodeのプラグインとして提供しているようだったので、ものは試しとIntelliJに入れてみたらアッサリ動いた。やったことと言えば、"Tools->Search in Dash"の割り当てキーが「ctrl+SHIFT+D」で既存のキーマップと競合していたので、こっちを優先してあげたくらい。

f:id:masanobuimai:20130421173038p:image


たぶん、これIntelliJ以外のJetBrains系IDEでも動くよね。DashのAppCode用プラグインは、Githubのプロジェクト内にある(Dash.jar)ので、それを取ってきてインストールするだけでよい。

Page not found · GitHub


docset指定したり、もうちょっと使いやすくする余地はありそうなんだけど、それよりもDashのWindows版が欲しいです。:-)

marsのメモ - March 26, 2013 02:10 PM
[memo] JDKのバージョンアップポリシーについて

長いだけでオチは無いよ。


「Java6がサポート切れた」だの「秋にはJava8が出る」だのとJavaのバージョンアップキャンペーンっぽい話題をちらほら聞きますよね。実際、保守しているシステムも、やれハードウェアの老朽化だ、OSやミドルウェアの保守切れだ、とかいう理由で否応なしにJVMのバージョンアップをするハメになりますよね。でもコンパイラ(JDK)のバージョンアップってどうしてるんですかね?


JVMはそれを必要とするミドルウェア(大抵はAPサーバですわな)がサポートしてないって大義名分があるので、Java5だJava6だと定期的にバージョンアップしてくんだけど、その上で動いているシステム(まあ業務アプリだわな)のコンパイラ(JDK)まで気にしてるって話は意外なほど聞かないのよね。


んで、どうしてるかというと、何もしない。いわゆるSI業界では、ソフトウェアは「やわらかいモノ」ではなく「モロいモノ」という扱いなので「寝た子は起こすな」が鉄則なので、要らんことはしない。したがって、JDK1.4が主流だった時に作成したシステムは2013年になった今でもJDK1.4でコンパイルしているのが普通...なんだと思うのデスよ。

え?そんな古いJDKどっから手に入れるかって?抜け目の無いプロジェクトは、保守に必要な環境をインストーラごと保管しているので、そんな心配はご無用さ。:-)

システムを構築した業態・業界にもよると思うんですが、業務システムって想像以上に長生きで、2000年あたりに新規構築したシステムが今でも現役なんて珍しくないですよね(と誰とは無く。


「JDKは据え置き」が果たしていいのか?というと悪いとも思うし、良いとも思う。つまるところ、そのプロジェクトなり会社なりのバージョンアップポリシー如何なんだけど、実際は前述の通り「何かあったら怖いから現状のままにしてる」が多数派なんじゃなかろうかと。なんで「ウチはこれこれ、こうゆう理由で、こんな対応してるよ」って事例があったら、それによろこんで倣うと思うんですよね。それがある程度の権威がある事例だったらなおさら。:-P


そうは言っても、選択肢は多くは無くて、やる事と言ったら

  1. JDKのバージョンは塩漬けのまま変えない
  2. JDKもバージョンアップするJVMと同じバージョンにあわせる

くらいかと。後者(JDKもバージョンアップ)を選ぶ理由のわかりやすい例は「JDKだってサポートプラットフォームがあるんだぞ」ってヤツ。今でもWindowsXPで開発してるところはあるけど、だいたいWindows7使ってるところもあるよね。で、仮にJDK1.4を使うとして、それがWindows7をサポートしてるか?っていったら、そんなワケないですよね。

正直、JDKのサポートプラットフォームなんて「細けぇこたぁどうでも良いんだ」と思うのだけど寝た子を起こすな哲学は長いものに巻かれろ哲学と互換性があるので、何かあっても文句言えるところを確保するってのも立派な理由のひとつですわな。


じゃあ、JDKもいっしょにバージョンアップするとした場合、どんなパターンが考えられるか。


JDKだけバージョンアップしてコンパイルする

大抵、これでしょうね。多少、警告が出ると思うけど見なかったことにして、ほとんど何もしないで完了する。運が悪いと、次の理由でコードを修正することになるけどね。

  • 変数名とかが新しいJDKで採用された予約語と被った
    • assertが被るって事はそうそう無いけど、enumはありそう。:-)
  • JDKのAPIを独自拡張してるクラスが、JDK側のAPIの追加・非推奨化の影響を受けた
    • 継承したり委譲してたりしてたJDKのAPIが増えた・減った場合ですね。これはフレームワークとかユーティリティを自作してると直面しそうですね。

JDKのバージョンアップに伴い、ソースコードもそのJDKの特徴にあわせて修正する

たとえばJDK1.4からJDK5以上にしたから、ついでにソースコードにも手を加えて、拡張forやオートボクシング、ジェネリクスといった特徴を取り込もうってヤツです。普通の発想だったらまずやりませんよね、こんなことw

個人的には、この手(ミドルウェアの更新みたいな)バージョンアップは4〜5年に1回の割合でしか起きないので、これくらいの無難な変更を全体に行うことで保守要員の育成にもなるんじゃないかなって思うんですよね。なんですかね、伊勢神宮方式とでも言いますかね。

ただ現実問題、

  • そんな広範囲に手を加えるためのコストが捻出できない
  • 無難な修正といってもデグレードを起こす可能性はある

などの理由で、これが採用されることはないだろうなと思ってます(そんな話を聞いた試しもない。:-P


そんわけで、JDKは据え置き/運が良くてJVMと同じバージョンのJDKを使うけどソースコードは必要最低限しか弄らないのどっちかだろなと。ただ後者(JDKもバージョンアップ)を選択した場合、その後の保守でソースコードに手を加えるときはどうすんだ?って疑問が残るのですよ。


つまり「元はJDK1.4で作ったソースコードだけど、今はJDK7でコンパイルしてる」なーんて状況で、何かしらの仕様変更を行うとき、そのソースコードはJDK7の特徴を存分に使っていいのかどうかって事ですわ。放っておくと、eclipseさんやNetBeansさんといったIDEが気を利かせて、最新のJDKの特徴を駆使したテンプレートを展開したり、何古くさいコード書いてんだって警告してくれるので、否応なしに新しいコードになってきますよね。で、古い書き方のコードと新しい書き方のコードがパッチワークみたいに混在しちゃうわけだ。


「それでいいのか!?」って思うけど、それもプロジェクト事のポリシーに寄るんだよね。当然、パッチワークになるのを嫌えば新しい書き方禁止!で、カビが生えたプロジェクト固有のコーディングルールを守るわけだ。これって特に若手にとって不幸な事だと思うのよね。だって書籍だの研修だので覚えるJavaはいわゆる近代のJavaだと思うんだ、なのに仕事で書くのは習ったことも無い古典Javaなーんて話が笑い話じゃ無く起きてる。


Java5、Java6、Java7でもって今度はJava8でそれなりにJavaも便利な書き方ができるようになってるんだけど、すぐに新しい特徴を取り込める状況にあるかというと、そうでも無いどころか、取り込むのを禁止したいと思う状況だったりするので、悩みは尽きないのですよ(でオチも無いw


ps.

ちなみに、JDK1.2からJDK7.0までの間にJDKの互換性がらみで困ったことは、この2つくらいしかないんですよ。

  • enumが予約語になった(JDK5.0から)
  • JDK1.4までのBigDecimal.toString()がJDK5.0からBigDecimal.toPlainString()になった
    • 他にもJDBCまわりでAPIの増減はあったけど、それで困るケースってそうなかった

それ以外については、JDK1.2でコンパイルしたクラスファイルであろうと元気に最新のJVMで動くので、Javaの上位互換性はスゴいなって正直思う(それ故にBigDecimalの件はイラっと来たけど)。


ふむふむ。

へびのぬけがら - March 15, 2013 11:10 PM
NetBeans IDE 7.3 リリース

ずいぶん、時間が経過していしまいましたが、 NetBeans IDE 7.3 がリリースされています
恒例のスプラッシュです

今回のリリースで最も目玉となる新機能はやはり HTML5 サポートかと思います
その他にも多くの新機能が追加されていますので、ぜひお試しください
何かお気づきの点がありましたら、 ML 等へご連絡お願い致します

marsのメモ - March 10, 2013 05:54 AM
[IDEA][eclipse][NetBeans][IdeaVIM] jVi, Vrapper, IdeaVIMの比較

ちょいと前にマジメに比較してみて、そのまま死蔵してた資料が出てきたので供養のつもりで公開してみる。知らない人に簡単に説明すると、jVi, Vrapper, IdeaVIMはそれぞれNetBeans, eclipse, IntelliJ IDEAのvi/vimプラグイン。世の中のvi/vimユーザの怨念たるや凄まじく、IDEなんてモードレスエディタが当たり前なのに、無理矢理vi/vimモードを実装した猛者がいるのです。


どれも一定水準以上のすばらしい出来なんだけど、vi/vim(特にvim)に対する拘りも人それぞれで、満足する人、それでも不満が残る人がちらほら。でも、どうがんばってもこれらプラグインがvimに追いつくことは叶わぬ夢なので、どの辺で妥協できるかが、これらを受け入れられるかどうかのポイントになるかと。

それと想像に難しくないけど、どれもvimscriptはサポートしてないよ。


jVi, Vrapper, IdeaVIM以外のvi/vimプラグインについては、この辺を参照のこと。

各種IDEのvi/vimプラグイン - marsのメモ

VsVim - 猫とC#について書くmatarilloの雑記


jVi 1.4.5 : NetBeans用vimプラグイン

http://jvi.sourceforge.net/

古くはJBuilderのviプラグインでNetBeansに移植された。もともと"vi"プラグインだったので、vimの機能が不足してたんだけど、この前調べたらそんなことなかった。

気になった点をいくつか。

  • Ctrl-[ でエディットモードに復帰できないけど、オプションで指定できるようになる。
  オプション -&gt; jVi Config -&gt; Ctrl-Key Bindings で "Ctrl-[ the "real" &lt;ESC&gt;"をチェックする。
  • :コマンドにNetBeans固有のコマンドがある。
  :fiximports    ... import文の最適化
  :make          ... ビルド実行(引数にターゲット名を指定できる)
  :grep          ... 「使用状況を検索」ダイアログを表示する。検索対象はカーソル位置から決定。
  :tselect       ... 「型に移動」ダイアログを表示する。
  :e#            ... #で現在開いているファイルの一覧が表示される。
  • ウィンドウ分割機能あり。わりとしっかりしている。
  Ctrl-W, h j k l   で分割ウィンドウ間の移動が可能。
  Ctrl-W, H J K L   で分割ウィンドウ間の位置移動が可能。
  • ワード移動は日本語(全角)と英語(半角)を区別しない
  • ある程度のオプションはNetBeansよりjViが優先される。たとえば、行番号,不可視文字の表示,ワードラップ...なんかはNetBeansのオプション指定が効かない。

Vrapper 0.24.0 : Eclipse用vimプラグイン

http://vrapper.sourceforge.net/home/

eclipse最古参のvimプラグインはviPlugin(http://www.viplugin.com/viplugin.htm)だったと思うけど、今はこっちのほうが有名なんでは?

こいつの一番の売りは mapコマンドでeclipseのコマンドをvimにアサインできることだと思う。

Eclipseのキーバインドをvim風にできるVrapperが素晴らしすぎる件について - ( ???) ゆるよろ日記


あと surround.vim(相当?)を独自実装してるみたい。

ワード移動は日本語(全角)と英語(半角)を区別しないどころか、特定の区切り子だけをみてるだけっぽかった。


IdeaVIM 0.23.93 : IntelliJ IDEAのvimプラグイン

https://github.com/JetBrains/ideavim

これもだいぶ古くからあるプラグイン。一番使い込んでて、不満があったらパッチ当てちゃうので公正な評価ができない。:-P

[IdeaVIM] - marsのメモ


元々はRick Maddyさんが個人的に公開してたプラグインなんだけど、彼がメンテできなくなったのでメンテナに @ さんが名乗りをあげて、このあたりからJetBrains公式プラグインになったみたい。ちなみに現在のメンテナである @ さんはとても意欲的で twitter で "IdeaVIM" ってつぶやくと、どの言語でつぶやいたかに関わりなく「バグだったらYouTrackにファイルしてね?」ってmention送ってくる。

ちなみに、IdeaVIMのワード移動はvim互換でちゃんと日本語と英語を区別するよ。


機能比較表

一式もろもろを比較したのがこちら。思ってみればクリップボード操作も拘りもってる人居そう。あたしは、vimでもCtrl+X,C,Vにremapしてるから全然気にしてないけど。:-)

あと設定できるオプションもプラグインによって異なるのでご注意を。

きしだのはてな - February 26, 2013 01:14 AM
[Java][NetBeans]Jacoco+NetBeansでカバレッジを取ってJenkinsで記録

カバレッジをとるのに、Jacocoを使ってみました。

設定などのメモ。


Mavenの設定

project > build > pluginsタグに次のようなプラグインを追加します。

          <plugin>
              <groupId>org.jacoco</groupId>
              <artifactId>jacoco-maven-plugin</artifactId>
              <version>0.6.2.201302030002</version>
              <executions>
                  <execution>
                      <goals>
                          <goal>prepare-agent</goal>
                      </goals>
                  </execution>
                  <execution>
                      <id>report</id>
                      <phase>prepare-package</phase>
                      <goals>
                          <goal>report</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>

NetBeansのカバレッジまわりの機能

NetBeansは、特に設定をしなくてもpomにカバレッジの設定があるとカバレッジ関係の機能が使えるようになります。


プロジェクトメニューにカバレッジのメニューが追加されているので、「レポートの表示」とするとカバレッジレポートが表示されます。

f:id:nowokay:20130226100947p:image


レポート画面で「すべてのテストの実行」とするとテストが実行されてカバレッジが計測されます。

f:id:nowokay:20130226100946p:image


そのとき、エディタ画面ではテストされた行とされてない行が色分けされます。「完了」を押せば、カバレッジ表示されなくなります。

f:id:nowokay:20130226100945p:image


Jenkinsでのカバレッジ記録

JenkinsにJacoco pluginを導入すると、「ビルド後の処理」として「JaCoCoカバレッジレポートを記録」が選べるようになるので追加します。

そうすると、カバレッジが記録されます。

f:id:nowokay:20130226100943p:image

marsのメモ - February 24, 2013 01:09 AM
[life] Java One 2012 フィードバック!( #てらだよしおまつり )に参加してきた

http://tohoku-dev.jp/modules/news/article.php?storyid=182


約半年ぶりに寺田さん(@)が来仙するってんで参加してきました。内容はJava One 2012 SF中心でJavaEE7とかJava8とかといったかなり未来の話。:-)


いろいろ考えさせられたが、それ故に消化するまで時間がかかりそうなので、主立ったメモだけ残すよ。


はじまった。


JCPはよりオープンになったって話。Specification LeadsやExpert Groupに属して無くても意見があったらガンガン言えるようになった(むろん英語で)。Java8のλに関しても日本の大学生がガンガン意見言ってたという事例があるそうな。

そう思うと日本初のJSRが一つくらいあってもいいんじゃないかと。例えば2Way-SQLなんかJSR化してもいいくらいの良い考え方だと思うけどなー、とか思ってみたり。


「社外のコミュニティに積極的に参加してる人とそうでない人で情報格差が広まっている」とのこと。まあ、そうかも。こうゆう場に集まる人たちはアンテナ高いけど、それを職場にフィードバック出来てないのは不徳の致すところでございます。


JSF2.2やWebSocketのAPIとか見てて思わず「ラッパー組んじゃる」って考えるのは悪いクセ。いちいち帯に短したすきに長しと思わないで、黙って出来合いのAPIを使ってみようという境地に至りたい。


番外編:

スライドにあったIDEの紹介にeclipseやNetBeansだけでなくIntelliJ IDEAもあったのは評価するが、相変わらず動的言語でgroovyを飛ばす(なんか恨みでもあるのかw

JavaScript無双をどこまで信じていいものか...。(´・ω・`)


おまけ:

まだJava6すら使ってない我々にとっては未来過ぎる話でしたね。:-)


ps.

寺田さん、最新情報をありがとうございました。テム・レイ化しないようコツコツ素振りします。それと運営の村上さん(@)おつかれさまでした。ノシ

きしだのはてな - January 10, 2013 11:43 PM
[java][netbeans][glassfish]GlassFishのカスタムリソースに日本語で説明を入れるとNetBeansが認識しなくなる

JavaでWebアプリを開発するとき、開発環境と本番環境で違うような値はカスタムリソースとして持たせたりすると思うのだけど、その説明に日本語を入れるとNetBeansがGlassFishを認識できなくなってしまった。

f:id:nowokay:20130111022307p:image


説明を英語にすると認識できるようになった。

これ、NetBeansの動きがおかしいけど、問題はGlassFishの設定ファイルであるdomain.xmlに、<?xml 〜?>で文字コードとかを指定していないことにあるんじゃないかなー。

ちなみに、<?xml 〜?>を手書きで追加しても、GlassFish起動時に消されてしまいました。

forest of netBeans - January 04, 2013 08:07 PM
あけまして おめでとうございます。2013

去年は何かすべてにおいて行き詰っていて、NetBeansを使っていませんでした。

そんな中、年末に片貝さんのセッションや自分の周りのNetBenasユーザーの

使用状況を聞いて刺激をうけたので、自分も今年はNetBeansを使っていきた

いとおもいます。

それにしても、久しぶりNetBeans使ってみたら立ち上がり軽くなったなあ!

marsのメモ - December 24, 2012 03:18 PM
[IDEA] 25日目 IntelliJ IDEA Advent Calendar 2012 インデックス

やっと終わったわ。:-(


IntelliJが出来ることはもっといろいろありますし、正直びみょーなところや「これって他(Eclipse/NetBeans/etc)のほうがマシじゃね?」って点も多々ありますので、おのおのそれなりなつきあい方を模索してみてください。


信者になれば毎年の年貢や不意のセールで心が揺らぐこともなくなるでしょう(ンな分けない。:-P

marsのメモ - December 23, 2012 03:08 PM
[IDEA][advent] 24日目 Inspections & Intentions

私に「Javaでいいや」どころか下手すると「Javaが良い」と思わせるIntelliJの超絶変態機能。Inspectionsはコードの検査で,いわゆる「Checkstyle&Findbugsの強力バージョン」。Intentionsは意図というか気づき?EclipseでいうQuick Assistっぽい感じ。


Inspectionsは検査なので,エラーや警告,プロジェクト固有の規約違反などを指摘する(指摘項目によっては,その解決もしてくれる)。Intentionsは「こうも書けるよ」的なアドバイス。どっちも実行キーは,ALT+Enter(macだとopt+Enter)で実行可能な箇所にカーソルを置くと電球アイコンが表示される。


ALT+Enterについては、はるか昔に解説してた。

31日間ReSharper一周 ... それIDEAでもできるよ(その8)


Eclipse知ってる人には「Ctrl+1のようなもの」と言えばピンとくるかも(Ctrl+2っぽいのは無い)。NetBeansはまんま同じキーで同じことできるから分かるでしょ。


Inspectionsはエラーや警告の類いなので、エディタの右側にマーカーバーとして指摘箇所を表示してくれる。マーカーバーの説明も昔書いてた。

31日間ReSharper一周 ... それIDEAでもできるよ


ファイルを開くたびに検査を実行するので、有効になってるInspectionsが多いほど検査に時間がかかります。検査中はエディタ右上端のコンパイルステータス(compile status)が目玉マークの間は検査中ということを示してます。

f:id:masanobuimai:20121216105926p:image


このコンパイルステータスを緑に保つのが良いことなのですが、検査項目をうまいこと調整しないと緑にするのは至難の業です。2007年に紹介したときは630項目くらいだったのですが、IDEA12のデフォルト*1であらためて数えなおしたところ1,600項目近くありました。中には互いを打ち消し合う検査項目もあるので未調整でステータスを緑にするのは今や不可能ですね。:-P


うまいとこ手綱を握らないと鬱陶しいことこの上ないInspectionsですが、普段だったらうっかり見落とすような事まで指摘してくれるので、とても頼りになるパートナーとペアプロしてると錯覚することもままあります。ここまで徹底して指摘できるのも、型でガチガチに縛ってるJavaだからなんだよなぁと思うと「(IntelliJ使うんなら)Javaも悪くないな」と思うわけです。むろん、RubyやJavaScriptなどの他言語用のInspectionsもありますが、数や精度ではJavaのソレに及ばないです。


Inspectionsはひとつひとつ警告レベルを指定でき、モノによっては専用のオプションもあるので、一度じっくり項目をながめてみることをオススメします。過去に紹介したInspections系のエントリにも、いくつかオススメが載ってますので、ご参考まで。

「正しいソースの書き方養成ギプス」をIDEAでもやってみる。

behind the times: 10 Best IDEA Inspections You’re Not Using

Usages of API documented as @since 1.5


Inspectionsの調整は、まず項目ごとの警告レベルの設定ができます。デフォルトの警告レベルは「As typo/As server problem/As weak warning/As info/As warning/As Error」の6種類。

f:id:masanobuimai:20121222220641p:image


"As server problem"はJetBrainsのCIサーバであるTeamCityを使ってなければ設定する必要すらありません。通常は"As warning"なんですが「ウザいけどOFFにするのはどうも」ってのは"As weak warning"か"As info"にしとくといいです。

一応、デフォルト以外の警告レベルも追加できるのですが、そこまでするのはやり過ぎかなと思います。

f:id:masanobuimai:20121222220642p:image


それと先ほども言いましたが、Inspectorによっては独自のオプションを持っているものもあります。正直、プロジェクトごとにいちいち設定するのは大変ですので、その辺はうまいこと使い分けしましょう。

f:id:masanobuimai:20121222220643p:image


ちなみに、Inspectionsの設定は、Settings->Inspectionsで行います。この設定画面にはステータスバーに居るHectorおじさん経由でもたどり着けます(おじさんをクリックして"Configure Inspections"をクリック。

f:id:masanobuimai:20121222222246p:image


それ以外にも、警告箇所でALT+Enterを押し、該当する検査項目からInspectionsの設定画面に飛ぶこともできます(下図の場合、"Flip comparison(Constant on right side of comparison)"が検査項目で、そこから展開したメニューにある"Edit inspection profile setting"で設定画面に飛べます)。

f:id:masanobuimai:20121222222250p:image


Inspectionsの設定項目が多すぎるので、とりあえず全設定ONにして実コードの検査度合いをみつつ、上記方法で個別に警告レベルの調整をしたりしてます(それでも調整はくたびれます)。このサブメニューを見てもわかるように、検査項目の設定に飛ぶだけでは無く、検査項目そのものを無効(Disable inspection)にしたり、ここでだけ検査を無効(Suppress ...)することも可能です。ただし、"Disable inspection"を選択した場合、その検査項目は二度と登場してきませんので、復帰させるには1,600もあるInspectorsから探し出さないといけません(これもかなりくたびれる作業です。:-(


ちなみに、上記スクリーンショットの"Flip comparison"の下にある鉛筆アイコンの項目3つがIntentionsになります。こちらは検査項目ではないのでマーカーバーには影響ありません。


Hectorおじさんについて補足すると、検査レベル(Highlighting Level)を「Inspections/Syntax/None」に変えるたび、おじさんがそっぽを向いていくという細かい芸があります。

f:id:masanobuimai:20121222222247p:image

f:id:masanobuimai:20121222222248p:image


なんとなく想像が付くかと思いますが、このInspectoinsは結構CPUパワーを食います(つまり動作が重くなる)。そのため検査レベルを下げていけばいくほどIntelliJが軽くなります。その分、IntelliJを使っている良さも減っていきますが...。とはいえ非力なマシンでIntelliJを使うと、ホントに泣きたくなるほど遅くなるので、背に腹は代えられないときは、この辺から調整してみることをオススメします。


それとIDEA9あたりから"Power Save Mode"というのがつきました。Helpを読んでも要用を得なかったのですが、名称からしてCPUにやさしいモードなのだと思います。その証拠(?)に、このモードにするとHectorおじさんが完全に沈黙します。

f:id:masanobuimai:20121222222249p:image


いずれにしろ、明らかに余計だと思えるInsepctionsは無効にしておいたほうがPCにも、利用者の気持ちにもやさしいと思います。:-)


あと、その気になれば自分でもInspectionsやIntentionsを作れます。

独自Inspectorを作ってみる

QuickFixの作り方

この前,独自Inspectorで試したことを,他の方法で実現してみんとす


やめりゃ良かったと作り始めてから思ったのですが、IDEA12でデフォルトのプラグインをすべて有効にしたときのInspectionsとIntentionsの一覧を作りました。気になる&使っている順にコメントも付けてます。まだ完成してませんが、気長にこつこつやってこうと思います("+"付いてるのが、個人的オススメ。それらをError, Warinig, Infoのどれにするかは各自が決めて。

IntelliJ IDEA : inspections&intentions




当然ながら、RubyやPHP、Python、Scala、Kotlinなどの言語系プラグインを入れると、それ用のInsepctionsやIntentionsが増えます。:-P

*1:IDEA12の標準プラグインを全て有効にした状態

marsのメモ - December 20, 2012 02:26 PM
[IDEA][advent] 20日目 artifactの設定(ついでにProject Structure )

Settingsの話は3回もやりましたが,Project Structureの話をしてませんでしたね。正直,面倒なので,昔に書いたエントリーやIntelliJ本体のヘルプを参照してください(だんだんやる気がなくなってる。

初めてIntelliJに触れる人へ − プロジェクトの設定とかテスト実行の話


IntelliJのバージョンがあがるたびに設定画面もびみょうに変わってますが,まあ何とか読み替えられると思います。ちょっと補足すると,ライブラリの設定(File->Project Structure->Modules->Dependencies)にあるスコープ(Scope)は,Mavenを知らないと意味がわからないと思います。

f:id:masanobuimai:20121121213704p:image


設定可能な値と意味は以下の通りです。

  • Compile
    • 普通はこれです。コンパイルや実行時に参照されます。
  • Test
    • テストコードのコンパイルとテストの実行時に参照されます。
    • junit.jarとかがここに属します。
  • Runtime
    • 実行時にだけ参照されます。コンパイル時には参照されませんので,コード補完の対象になりません。
    • 強いて言えばJDBCドライバなどが,ここに属します。
  • Provided
    • 実行環境にあらかじめ用意されているライブラリを指定します。コンパイル時に参照されますが,実行時には参照されません(実行環境に相当品があるので)。
    • 具体的に言うと,J2EEのAPI(javaee.jar)とかが,ここに属します。

NetBeansにも同様の考え方があるので,NetBeansからの移行組はすんなり理解できると思いますが,eclipseにはどうゆうわけか伝統的にこの考えが無いので,はじめは戸惑うかと思います。でも,これを知ってしまうとスコープが無い世界には戻れないと思いますヨ。:-)


あと,ライブラリはMaven Repositoryから直接ダウンロードできます。

IntelliJ IDEA 10のEAPが登場したよ


Artifactsの指定

ちょっと脱線が長引いたのでセクション分けて本題に戻ります。IDEA9あたりからプロジェクトごとに成果物を定義できるArtifactsという機能がついきました。設定箇所は,File->Project Structure->Artifacts。

何ができるって「成果物を定義できる」んですが「成果物ってなによ?」と言うと,要するにJarファイルとかWARファイルとかEARファイルとかってアレです。

f:id:masanobuimai:20121121214919p:image


使い方は,昔書いたこのあたりが参考になると思います。

IntelliJ CE用Winstoneプラグイン公開しました



これの良いところは,自分のニーズに応じていくつもの成果物を定義できることです。これで,zipファイルも作れれば,実行モジュールだけではなく,リリースモジュールも作れそうなので,ちょっと残念ではあります(だったら自分でプラグイン作ったら?という話でもありますが。:-P


ps.

チーム開発する場合など,ライブラリや成果物の生成はIDEではなくAntやMavenといったビルドツールに任せるのが望ましいのです。ただ,個人の実験や趣味で作るちょっとしたプロジェクトなどは,IDEで完結できることが多いととても楽なのです。

marsのメモ - December 17, 2012 03:09 PM
[IDEA][advent] 18日目 Databaseプラグイン

地味に便利な Databaseプラグインについてです。IDEからDBを操作する機能ですが、NetBeansにも似たような機能があるし、今やさほど珍しい機能ではないですね。


そんな中でIntelliJっぽいなぁという機能について紹介します。


DDL 文からDBの定義を再現

この手の機能はDBに接続すると相場が決まっているのですが、IntelliJの場合、DDLが定義されたファイルだけでも、この機能を利用できます。


使い方は、Databaseウィンドウを開き「+」ボタンを押して "DDL Data Source"を選択。以下のようなダイアログが表示されるので,"DDL Files"の「+」ボタンを押して,任意のDDLファイルを指定します。

f:id:masanobuimai:20121121215845p:image


DB が別のネットワークにあるなどの理由で参照できないときでも、構造を可視化できて意外と助かる事が多いです。


スキーマの比較

DB専用ツールだと、そんなの出来のがあったと思いますが、実はIntelliJでも出来ました。

Databaseウィンドウで比較したいスキーマを2つ選んで、ツールバーの「Compare」を押す。

f:id:masanobuimai:20121121220250p:image


オンラインとDDLの比較なんてのもできるので,まあまあ便利です。普通のDiffと異なるのは,DDLの記述順に囚われずテーブルの比較をしてくれるので,DDLファイル同士のdiffを取るよりは,親切な結果が得られます。

f:id:masanobuimai:20121121220405p:image



Language Injection でプログラム中でもコード補完

Data Sourceが設定されている状態で,JDBC API(StatementやPrepareStatementクラスなど)にSQL文をタイプすると(うまくすると)コード補完が効きます。「うまくいくと」というのは,何か知らないけど上手く行かない事もままあるためです。


それと,JDBCではなく別のAPI(オレオレAPIだったりするかもしれません)で,SQL文の補完を有効にしたい場合は,Intension(ALT+Enter)メニューの"Language Injections Settings"から追加で設定することができます。

f:id:masanobuimai:20121121221506p:image


すると、こうなります。結構うれしい。:-)

f:id:masanobuimai:20121121221505p:image


特定のAPIだけではなく、String型のローカル変数に対してもLanguage Injectionをかけることが出来るのですが、その場合、次のようにIntelliJ固有のアノテーションを付けなければならないのが難しいところです。:-(

f:id:masanobuimai:20121121222424p:image


アノテーション付けなくても何とかする方法もあったと思ったのですが、ちょっとその設定を特定できてません...。が、IDEA12だとアノテーションやコメントアノテーションを使わなくてもLanguage Injectionができるようです。

f:id:masanobuimai:20121122231548p:image


(追記)しおしおさんが追加調査してくれました。:-)

しおしおの雑記帳



JPAについて

一応、JPAエンティティを作る機能を持っていますが、あまり洗練されてるように思えないし、正直使いづらかったです。生成されるエンティティもアノテーションごてごてで見づらかった記憶が...。このへんについてはNetBeansのほうが扱いやすいと思います。


一応、画面の紹介だけしておきます。

f:id:masanobuimai:20121121223241p:image


(おまけ)DBの起動

NetBeansの組み込みJavaDBがうらやましくて、Derbyを起動・停止するだけのプラグインを作ったこともありますが、よーく考えてみると外部ツールに登録すれば済む話だったのはナイショです。:-)

Derbyプラグインできたよ


ps.

本家ブログでIDEA12のDatabaseプラグインの説明が出ましたね。

Manage Your Database Schema in IntelliJ IDEA 12 | JetBrains IntelliJ IDEA Blog

きしだのはてな - December 13, 2012 09:21 AM
[sencha][netbeans]Sencha Touchでの開発にNetBeans7.3が便利だったり微妙だったり

Sencha Advent Calendarの13日目の記事です。

「Sencha Advent Calendar 2012」

http://www.adventar.org/calendars/23


Sencha Touchでの開発をするときの、NetBeansの便利なところと便利なはずなのに微妙なところを書いてみます。


NetBeans7.3 beta2のセットアップ

とりあえず、NetBeansのセットアップについて。

NetBeansはJavaで動くので、JDKのインストールが必要です。Sencha Cmdでも必要なので、Sencha Touchでの開発にはどっちにしろ必要ですね。

http://www.oracle.com/technetwork/java/javase/downloads/index.html


また、NetBeansは7.3からHTMLまわりが充実してきているので、正式版がでている7.2ではなく、beta2の7.3を使います。

http://download.netbeans.org/netbeans/7.3/beta2/


サポートテクノロジーは、一番簡素な「Java SE」版で大丈夫です。また、プラットフォームは「OSに依存しないZIP」にすれば解凍するだけで動かせるので、ちょっと試すのにインストーラはなーって人にも安心です。その場合はbinフォルダの実行ファイルを起動します。

etcフォルダのnetbeans.confファイルに、netbeans_jdkhomeの設定をしてJDKをインストールしたパスを指定しておくほうがいいかもしれません。


Sencha Touch用プロジェクトの作成

まずはSencha Cmdでプロジェクトを生成します。senchaライブラリのフォルダで、次のようなコマンドで生成します。

> sencha app generate Advent ..\advent

f:id:nowokay:20121213173708p:image


生成したSencha TouchプロジェクトをNetBeansのプロジェクトとして取り込みます。

NetBeans7.3から、HTML用のプロジェクトが用意されているので、これを使います。新規プロジェクトで「HTML5 Application with Existing Sources」を選択して「次へ」ボタンを押します。正式リリースされて日本語訳されると「既存のソースを利用するHTML5アプリケーション」になるんじゃないかと思います。

f:id:nowokay:20121213173706p:image


そしたら、「Site Root」に先ほど作成したSencha Touchプロジェクトのパスを指定します。「Project Name」は適当なものをつけてください。

「Project Directory」は「Site Root」と同じものが埋め込まれます。ここで指定したパスにnbprojectというフォルダが作成されるのですが、ここにフォルダが生成されるのがイヤなときは、別のフォルダを選びます。nbprojectフォルダは、Sencha Cmdでのパッケージングのときには除外されるので、あまり気にしなくてもいいと思います。

f:id:nowokay:20121213173705p:image


Sencha Touchアプリケーションの実行

Sencha Cmdで生成したSencha Touchアプリケーションの実行には、Webサーバーが必要になります。

NetBeans7.3では、HTMLプロジェクトを実行すると内蔵のWebサーバーが起動するので、別にWebサーバーを用意する必要がなくて楽です。・・・と思ったら。

f:id:nowokay:20121213173659p:image

なんか、「touch/event/publisher/Dom.js」などのファイルがないといってエラーになって、ピコピコ画面がずっと表示されちゃいました >_<

もちろん、単体でDom.jsファイルを指定するとちゃんと表示されるのですけど。


ということで、NetBeans外部のWebサーバーを使うことにします。これはnginxなどを準備しておいてください。

そしたら、NetBeansからプロジェクトのプロパティを開いて、「Run」カテゴリの「Web Server」に「External」を指定して、「Project URL」にプロジェクトを開くことができるURLを指定します。

f:id:nowokay:20121213180318p:image


また、このとき「Browser」として「Embedded WebKit Browser」を選択すると、JavaFXのブラウザを使って表示されます。

これは、WebKitをJavaでラップしたブラウザで、結構ちゃんとSencha Touchも動きます。ただ、ちょっとタブのアイコン表示がおかしいですけど。

このブラウザのいいところは、画面サイズを指定できることです。スマートフォンっぽいアイコンを指定すると、スマートフォンっぽい縦横比で表示されます。

f:id:nowokay:20121213173704p:image

ChromeにNetBeans用プラグインを導入することでも同様のことができるので、安定性などを求める場合はそっちを使うほうがいいと思います。


宣伝

Sencha Touchの本を書いてます。基本的な使い方について全般的に書きました。


ただ、刊行直前にSencha Touchがバージョンアップして、対応できてない点が多いので、こちらも参考にしてください。

「Sencha Touchの2.1バージョンアップでの書籍の記述からの変更点」

http://d.hatena.ne.jp/nowokay/20121116#1353052434

marsのメモ - December 12, 2012 01:49 PM
[IDEA][advent] 12日目 IDEの設定(IDE Settings:後編)

設定編の後編です。


Keymap

  f:id:masanobuimai:20121118225556p:image

ショートカットキーの設定を行います。Keymapsにはプリセットでいくつかのキーマップが登録してあるので,好みが合えばそちらを使うのも良いでしょう。「この手のはなるべくデフォルトを覚えたい」というならば,"Default"や"Mac OS X 10.5+"を選ぶと良いかと。

個人的には,IntelliJのデフォルトキーマップは分かりやすいと思ってないので,がしがしカスタマイズしてしまい,今となってはデフォルトキーマップでは使えない体になってしまいました(それにIdeaVIMも必須w


他のIDEやエディタからの乗り換え組向けに"Eclipse", "NetBeans 6.5", "VisualStudio", "Emacs"なんてのもありますが,その出来については未評価です。IntelliJのエディタはいわゆるモードレスエディタなので,お決まりのように"Emacs"キーマップがありますが,この手のEmacs風キーマップが生粋のEmacs使いを満足させた試しは無いので,それなりに見てあげると落胆も少ないかと思います。


Keymapsの別の使い道として,IntelliJで提供している全コマンドを俯瞰することができます。"Main menu"はメニューバーの項目なので,なにもここで確認しなくても分かりますが,"Editor Actions"や"Other"などを覗いてみると面白い発見があると思います。


また「プラグインを入れたけど,そのプラグインがどんな機能を提供しているのかわからない」ときは,ここの"Plug-ins"を見ると,プラグインが提供しているコマンドを見つけることができます。

IntelliJのショートカットを素早く知る方法+α


それはそうと,WindowsでもMacでもIntelliJを使う場合,キーマップをどうしようか非常に悩みます。わたしは面倒なのでMacでもWindowsのキーマップを使っているので,コピー&ペーストは Ctrl+C, Ctrl+V です。



Live Templates

  f:id:masanobuimai:20121118225622p:image

スニペットというかキーワード展開を行うLive Templatesを設定します。プリセットされているテンプレートも非常に多いのですが,この手の機能は他のIDEにも実装されているので,特に取り上げるほどの機能ではありません。むしろ,キーワード展開がコード補完とは別のキーになっていたり*1,キーワード展開例がプレビューできないなど,EclipseやNetBeansのソレと比べて劣っている気もします。

31日間ReSharper一周 ... それIDEAでもできるよ(その7)



Menu and Toolbars

  f:id:masanobuimai:20121118225646p:image

メニューバーやツールバー,ナビバー,それにProjectウィンドウやエディタなどのコンテキストメニューの項目を設定します。



Notifications

  f:id:masanobuimai:20121118225701p:image

コンパイル結果,テスト結果など,IntelliJからのレスポンスの通知方法を設定します。



Passwords

主にバージョン管理システムとの連係で入力するパスワードをどこまで記憶していくかを設定します。



Path Variables

  f:id:masanobuimai:20121118225743p:image

いわゆる環境変数を設定します。が,あまり使った事はありません。Mavenプロジェクトを利用したときに「M2_HOMEはどこ?」と聞かれたくらいしか記憶がありません。



Plugins

  f:id:masanobuimai:20121118225723p:image

プラグインマネージャです。"Browse repositories"で公式プラグインサイトに登録してあるプラグインの一覧から任意のプラグインをインストールできます。一覧で"Bundle"とあるのは,IntelliJ付属のプラグインで削除することはできません(無効化まで)。


プラグインは非常にたくさんありますが,なんだかんだでIntelliJ標準のままか,JetBrains公式プラグインくらいしか使わなくなります。:-)


それと,プラグインのインストールやアンインストール,有効・無効化にはIntelliJの再起動が必要になります。



Quick Lists

  f:id:masanobuimai:20121118225803p:image

お好みのコマンドを集約したQuickリストを登録します。Quickリストは,よく使うけど,ひとつひとつのショートカットキーを覚えられない,なんて場合に便利です。

31日間ReSharper一周 ... それIDEAでもできるよ(その4)



TODO

TODOウィンドウに表示する,TODOコメントのパターンを定義します。



Updates

自動アップデートの設定をします。アップデートモジュールは,必ずしもパッチ方式で提供されるわけではないようです(場合によっては,ダウンロードページにジャンプするだけもある。



Usage Statistics

IntelliJの使用統計情報をJetBrainsに送信する頻度を設定します。使っているIntelliJの統計情報は,Help->Productivity Guideで確認できます。


Web Browsers

IntelliJから起動できるWebブラウザを登録します。エディタでHTMLなどを編集していると,右上にブラウザアイコンが浮かんできますが,それのことです。


"Default Web Browser"は,View->Open in Browserで起動するWebブラウザの事です。



XPath Viewer

XPathに関する設定です。XPathに関するコマンドは,

  • Edit->Find->Evaluate XPath (ツールバーのヘルプアイコンの隣にもある)
  • Edit->Find->Find in XPath
  • View->Unique XPath

の3つです。"Find in XPath"以外の2つは,XMLを編集しているエディタのコンテキストメニュー最下部も表示されます。



XSLT

XMLに関連付けしたXSLファイルをProjectウィンドウに表示するかどうか(Show Associated Files in Project View)の設定がありますが,XSLT使ってないのでどうなるかは分かってません。:-)

*1:隠しオプションで変更可能ですが...。

marsのメモ - December 09, 2012 04:46 PM
[IDEA][advent] 10日目 IDEの設定(Project Settings)

File->SettingsのProject Settings編です。Project Structureとの明確な違いを言い表せませんが、長い歴史の名残りだと思って下さい。


全部みたわけじゃないんですが、どうもこの「Project Settings」はIntelliJにしか無いみたいです。WebStormやRubyMineは「Settings(Preferences)」しかないです。たぶん、PhpStormやPyCharm, AppCodeも同じなんじゃないかな。


Code Style

  f:id:masanobuimai:20121118222431p:image

コードフォーマッターで整形するルールを設定します。言語別に設定項目があり,正直うんざりします。設定を保存するSchemeのうち「Default」は変更不可なので,別のSchemeを作って独自の設定をしましょう。


JavaのImportの設定がちょっと分かりづらいですが,Java->Importsを以下のように設定するのを好んでいます。

  • Use single class import を ON にして,import hoge.* にしない(それ以外はすべてOFF)
  • Names count to use static import with '*' に 1 を設定して static import は速攻で * を使う

それとJavadoc系の設定(Java->JavaDoc)は,日本語の処理がイマイチなので全体的に無効(Enable JavaDoc formattingをOFF)にしておくと良いです。


そうそう,言語ごとにタブサイズの設定がありますが,どうゆうわけかHTMLにはその項目がありません。じゃあ,HTMLのタブサイズはどこで設定するかというと一般(General)のタブサイズが適用されますので,ご注意を。

#IDEA12だとHTMLの設定にタブサイズ指定ができてました(よかったよかった。


また、以前説明したように改行コードの指定(Line separator (for new files))も、ここでおこないます。

IntelliJでファイルの改行コードを指定する



Compiler

  f:id:masanobuimai:20121115230226p:image

コンパイラの設定をします。Project Structure のSDKと分かれてるのが、正直不満です。

ここでは、javacに渡すオプション(Compiler->Java Compiler)とか、コンパイル時にビルドディレクトリにコピーするリリースファイルのパターン(Resource patterns)などを設定します。


最近流行りのAnnotation Processorの設定(Compiler->Annotation Processors)もここで行います。



Copyright

IntelliJのおもしろプラグイン、Copyrightの設定を行います。詳しくは他のエントリーで書きます。



Coverage

  f:id:masanobuimai:20121118223717p:image

カバレッジの結果の収集方法に関する設定です。サーバサイドJavaでもカバレッジ取れるようになったので、もうClover要らないw



Deployment

IntelliJのおもしろプラグイン、Remote Hostの設定を行います。こちらも詳しくは他のエントリーで書きます。



File Colors

  f:id:masanobuimai:20121118223747p:image

ファイルのパターンを指定して、その表示色を設定します。設定した色はProject ウィンドウやエディタのタブに反映されます。巨大なプロジェクトでファイルを視覚的に区分けしたい時など、便利と言えば便利な機能です。

More Colors with Maia



File Encodings

  f:id:masanobuimai:20121118223816p:image

その名の通り、ファイルのエンコードを設定します。ディレクトリやファイル単位に細かく指定できるのでかなり便利です(残念なことに拡張子別には指定できませんが...。


ひとつ落とし穴がありまして,Project Settingsに属しながらも,ここの「IDE Encoding」はプロジェクト固有の設定ではなく,IDE共通の設定になります。さらにこのエンコードはコンパイラに渡されますので「IDE EncodingはUTF-8だけど,たまにWindows-31Jで作成したプロジェクトを開く」といったシチュエーションのとき大変困ります。


IDE Encodingとプロジェクトのソースのエンコードが異なる場合は,Compiler->Java Compiler->Additional command line parametersに以下のような設定をしておく必要があります。

-encoding Windows-31J

初めてIntelliJに触れる人へ − Javadocの日本語化


あと申し訳ついでにプロパティファイルに関する設定もここにあります。画面下のほうにひっそりあるので,よく見落とします。設定項目は以下の2つです。

  • プロパティファイルのエンコードを指定する(Default encoding for properties files)
  • 自動的に native2ascii を行うかを設定する(Transparent nattive-to-ascii conversion)


Gant/Gradle

Groovy のビルドツール、GantとGradleの設定です。といってもツールのパスを指定するだけです。

Gantは正直オワコンですよね。



GUI Designer

GUI デザイナっで作った画面をソースに展開するか、バイナリのままにするかを指定します(Generate GUI into)。

バイナリのままだど、そのプログラムの実行環境にIntelliJのランタイムライブラリが必要になります。


何よりGUI デザイナ自体、IntelliJのプラグインでGUI使うときくらいしか使いません。GUI デザイナはNetBeansのほうが万人向けだと思います。



Inspections

  f:id:masanobuimai:20121118223855p:image

Hectorおじさんの指摘項目を設定します。要するにFindBugsとCheckstyleのIntelliJ版です。気が遠くなるほど設定項目がありますが,ヒマなときに全部眺めてみると意外な発見があると思います。結構,いろいろやってます。

ちょっと面白いInsectorがありまして、General->Structural Search Inspectionでは、IntelliJのStructural SearchやReplace(Edit->Find->Search/Replace Structurally)の検索・置換パターンを登録してそれをリアルタイムに検査することができます。Replaceの場合、置換結果を修正候補に出せます。

  f:id:masanobuimai:20121124004815p:image

以前、@さんが紹介していたStructural Searchを登録しておくなんてことができます。

IntelliJのStructural Searchでfail文のない異常系テストコードを抽出 - しおしおの雑記帳


JavaScript

  f:id:masanobuimai:20121118223917p:image

JavaScriptの言語レベルの指定(JavaScript language version)や使用するライブラリ(JavaSciprt->Libraries),コード検査(JavaSciprt->Code Quality Tools)の設定を行います。



Language Injections

  f:id:masanobuimai:20121118224117p:image

IntelliJのヘンタイ機能のLanguage Injectionsの設定を行います。「Language Injectionsって何?」という方は,こちらを参照してください。

Language Injectionオモロイ


おもしろい機能ではあるのですが、実際のところJDBCのStatementなど該当するAPIに直接文字列をハードコードすることは希で、普通はStringなりStringBuilder/StringBufferなどの変数や定数に、お目当ての文字列代入しとく事が多いので、本当に役に立つかはわかりません。:-P



Maven

  f:id:masanobuimai:20121118224508p:image

Mavenの設定です。Gant/Gradleで暗に言ってますが,IntelliJにはこの手のよく使うであろうビルドツールバンドルしてません。Mavenそのものを別途インストールしておき,そのパスを指定します。ただし、どうゆうワケかAntだけはIntelliJにバンドルされています。Project Settingsに項目はありませんが,Antの設定はAnt Buildウィンドウで行います。ようするに、IntelliJ当初からAntをサポートしており、そのときはビルドツールなんてAntくらいしか無かったのでバンドルしてただけ、というのが続いているだけなんだと思います。


IntelliJはMavenのpomをそのままプロジェクトとして読み込めますが,その関連をどうするか(Maven->Importing)やMavenのリポジトリの設定(Maven->Repositories)などを行います。わたし自身が,Mavenそのものをあまり使ってないので,細かいところまではわかりません。><



Schemas and DTDs

  f:id:masanobuimai:20121118224541p:image

XMLを編集するときに参照するXMLスキーマやDTDなどを登録します(External Schemas and DTDs),もしくは無視させる(Ignored Schemas and DTDs)。あと,ここに置くしか無かったのでしょうか?HTMLの言語レベルの指定(Default HTML language level)もここにあります。


Scopes

Projectウィンドウや先ほどのFile Colorsや検索などで,ある条件でプロジェクトの対象を絞り込むスコープ(Scope)の設定を行います。ピンとこない方は,こちらを参照してください。

特定のファイルのみを表示するようにスコープ設定してみた


これもある程度大きなプロジェクトを扱っていると便利な機能です。独自のスコープを設定し,「ああ,IntelliJ使っててよかった」とほくそ笑むと良いでしょう。



Spelling

スペルチェックで使う単語(Accepted Words)や辞書(Dictionaries)を設定します。「スペルチェックそのものがうざい」場合は,「Configure 'Spelling' inspection」のリンクから,スペルチェックそのものを無効にしてしまいましょう。


SQL Dialects

SQLファイルの中身がOracle用なのかDB2用なのかといった方言(SQL Dialect)を指定します。


Tasks

  f:id:masanobuimai:20121118224720p:image

BTS/ITSと連係するTasksの設定を行います。eclipseで言うところのMylynみたいなものです(乱暴な説明だなw)。連係するサーバ(Tasks->Servers)は数多くあります(JIRA, YouTrack, Lighthouse, PivotalTracker, GitHub, Redmine, Trac, Bitbucket)。おそらく連係可能なサーバはプラグインで追加できるのだと思いますが,JetBrains純正のプラグインでしか,この項目が追加されるプラグインを見たことがありません。たとえば,Backlogと連係したい場合は,誰かがガンバらないと叶わないでしょう(チラッ


私自身,手近にあるBTS/ITSがTrac/Redmine/GitHubくらいなのですが,どうゆうわけかTrac連係だけうまく行きませんでした。:-(



Template Data Languages

ファイルの言語タイプを設定します。本来は拡張子によってファイルタイプが決まるのですが,なんらかの理由でファイルタイプを変更したいときに指定するのでしょうか?(使ったこと無い)。実際試してみましたが,拡張子のほうが強かったです(何に使うんだろう...)。


Version Control

  f:id:masanobuimai:20121118224748p:image

Subversion, Git, Mercurialといったバージョン管理システムとの連係方法を設定します。設定上,同一のプロジェクトで複数のバージョン管理システムと連係できるみたいですが,同じディレクトリに異なるバージョン管理システムを指定すると,IntelliJが混乱するようです。


特定のバージョン管理システムに依存しない無視するファイルの指定(Version Control->Ignored Files)もできます。設定をみると「FileInfo.iws」と「.idea/workspace.xml」がデフォルト値なってますが,これ以外のIntelliJの管理ファイルを登録しても大丈夫なのかは,正直自身がありません(IntelliJでチーム開発したことがないので...)。


Tasksではなく,ここにこの設定があるのも微妙なのですが,コミットログに含まれるBTS/ITSのチケット番号と,それに対応するBTS/ITSのリンクも設定できます(Version Control->Issue Navigation)。


Web Contexts

Webコンテキストを設定します。プロジェクトがJavaでWebファセット(要するにWebアプリケーションプロジェクト)がついている場合,同様の設定はProject Structureでできるのに,なぜ似たような設定がここにあるのかが不思議でなりません。一瞬「Webモジュール用かな?」と思いましたが,Webモジュールの場合,ここに設定可能な情報が出てきませんでした。ますますもって謎です。


そんなこともあって,この項目は気にしたことがありません。:-P


XSLT File Associations

XSLTを設定するようです。というのもの,XSLT自体もう何年も扱ったことが無いので,ここをいじる用事もなく,なにができるのかもよくわかってません。:-)

marsのメモ - December 05, 2012 10:07 PM
[IDEA][advent] 06日目 IDEA12とIDEA11の比較

(このエントリーは11月23日に書きました)そろそろIDEA12のリリースが近づいてきたので記念にIDEA11との違いを探してみます。比較に使ったのはEAP123.4なので正式リリース版と変わってる可能性はあります。このエントリーを公開するときには正式リリースしてるんだろうか?

→ 正式版がリリースされたので、このエントリも公開しました。


トップページのデザインが変わった

Public Privewの時にトップページからメニューバーとプラグインの一覧がなくなったのでがっかりしてましたが、EAP123.4でまた、ちょっとデザインが変わりました。

プラグインの一覧は相変わらずありませんが、Settingsを開けるので、そこからプラグインマネージャにたどり着けます。一手間増えて面倒ですけど...。


Quick Start欄が、一部スライドメニューになっていて、何か変えたがってる雰囲気がうかがえます。

f:id:masanobuimai:20121123193814p:image



アイコンがのっぺりした

パステル調とでもいうのか,ちょっと不思議なアイコンになりました。見た目は世の中の流行り廃りもあるので,一概にどうとは言えませんが,伝統的にJetBrainsのUIデザイン(主に見た目)の評判はよくありません(暗に悪いって言ってるw

UIデザインがガマンできる範疇かは利用者の主観によるので,受け付けない人は縁が無かったと思うほかありませんね。

f:id:masanobuimai:20121123193815p:image


IDEA12のアイコンが気に入らない人向けに,IDEA11のアイコンに戻すプラグインがあります。:-)

IDEA12 EAP Build 122.519 からアイコンが変わった



ダークテーマ:Darcula

エディタのカラースキームでSolarized Darkのようにダーク基調のものが流行っているせいか,UI全体をダーク基調にする「Darcula」というテーマが追加されました。設定は,File->Settings->Appearance->Theme*1から「Darcula」を選びます。ご丁寧にエディタのカラースキーム(File->Settings->Editor->Colors & Fonts)も「Darcula」に設定されます。


正直...かっこ悪いです...。:-P



Problemsウィンドウ

NetBeansやEclipseにある,コンパイルエラーを随時表示しているアレです。インクリメンタルビルドを持たないIntelliJは,いままでずーっと明示的にビルドしないと,コンパイルエラーを知ることができなかったのですが,IDEA12でついにProblemsウィンドウができました。


File->Settings->Compilerに「Make project automatically」という項目が増えており、これを有効にしないとダメなようです。

f:id:masanobuimai:20121123193816p:image


この項目を有効にすると,編集しているファイルを保存するタイミングで,Problemsウィンドウにエラーが表示されるようになりました。ちょっと使ってみた感じでは、そんな便利には思えませんでした。

f:id:masanobuimai:20121123193817p:image



コード補完(Code->Completion)からクラス名補完(Class Name)が無くなった

どうやら,ベーシック(Basic)に統合されたようです。まあ,普段から使う補完種別ではなかったので,良い事です。



View->Show Byte Codeでバイトコードが見れる

ほほう。これはこれは。:-)

f:id:masanobuimai:20121123193818p:image

プロジェクト作成方法がちょっと変わった

New Projectウィザードの最初の画面がこんな風に変わってました。

f:id:masanobuimai:20121123193819p:image


Public Previewで無くなってしまった「Import project from external model」「Create project from existing sources」はEAP123.4で復活してましたね。



Settingsまわりの違い

Project Structureはあまり違いを見つけられませんでしたので割愛します。


Code Style->HTMLにタブサイズの設定がついた

よかった。よかった。:-)

f:id:masanobuimai:20121123193820p:image



Code Style->JavaにArrange項目がついた

Rearrangerプラグインが統合されたようです。くわしくはこちら。

Arrange Your Code Automatically with IntelliJ IDEA 12 | JetBrains IntelliJ IDEA Blog

f:id:masanobuimai:20121123193821p:image



Compilerのオプションが若干変更してる

Compilerにヒープサイズの指定(Compiler process heap size(Mbytes))やVMオプションの指定(Additional compiler process VM options)が増えてます。その代わり(?),Compiler->Java CompilerにバイトコードのターゲットVMが指定できるようになりました(Project bytecode version (leave blank for jdk default))。IDEA12からバイトコードビューアがつくと言ってましたので,それにちなんだ設定なのだと思います。

f:id:masanobuimai:20121123193822p:image



プラグイン

見たこと無いプラグインがいくつか増えてますね。

  • Android Designer
  • Application Servers View
  • Base Cucumber
  • Byte Code Viewer
  • Cloud Foundry integration
  • CloudBees integration
  • Cucumber for Groovy
  • Cucumber for Java
  • JBoss jBPM
  • Maven Integration Extension
  • Playframework Support
  • Remote Run
  • Spring Batch
  • Vaadin Support

*1:IDEA11までは"Look and feel"だった。

marsのメモ - December 04, 2012 03:04 PM
[IDEA][advent] 05日目 Eclipseとの違い

多くの人は,なにかしらeclipseにガッカリしてIntelliJに手を出すと思いますが,IntelliJとeclipseは操作体系からずいぶん違いがあります。eclipseに慣れてからIntelliJに手を出すと,逆にガッカリする事請け合いだと思うので,主だった違いを列挙しとこうと思います。


インクリメンタルビルド

インクリメンタルビルドはeclipseの目玉機能のひとつだと思いますが,残念ながらIntelliJにはありません(IDEA12にそれっぽい設定項目*1がありましたが,はたしてあれはインクリメンタルビルドなんだろうか...*2)。

これに連動した話で,eclipseのProblemsビューのように現在のエラー状況を一覧表示するウィンドウもありません*3


じゃあ,どうするかというとビルドはビルドボタン(もしくは相当のショートカットキー)を押さない限り実行されません(クリーンビルドなどは Build メニューから行います)。

f:id:masanobuimai:20121114212856p:image


ビルドを実行すると,その結果が Messagesウィンドウに表示されますので,結果としてコンパイルエラーになったファイルの一覧がそこに表示されます。

f:id:masanobuimai:20121114213254p:image


この操作系になれちゃっているので,実のところインクリメンタルビルドの便利さを分かってませんw IDEA12でコンパイラ周りが改善されるようなので,次のバージョンではちょっとはマシになってるかも知れませんね。

Brand New Compiler Mode in IntelliJ IDEA 12 Leda | JetBrains IntelliJ IDEA Blog


ワークスペースやプロジェクトの考え方

そもそもワークスペースという考え方が無いです。強いて言えば,IntelliJのプロジェクトがeclipseのワークスペースに相当します。eclipseのプロジェクトが,IntelliJのモジュールに相当します。

その辺は,このドキュメントが詳しいです。ありがたいことに日本語に訳してくれた方がいます。

Eclipse FAQ - IntelliJ-Wiki

Eclipseユーザの為のIntelliJ IDEA Q&A - 砂漠の音楽


設定まわり

だいたい,こんな対比になります。

 eclipseIntelliJ
IDEの設定Window->PreferencesFile->Settings
プロジェクトの設定(Projectを選んで) PropertiesFile->Project Structure

Ctrl+1とかCtrl+2とか

eclipseの空気読み機能であるCtrl+1(Quick fix),Ctrl+2(Quick Assist)ですが,これに相当する機能はIntelliJにはありません。辛うじてAlt+Enter(Show Intention Action)が近いですが,Ctrl+1ほど何でもアリな機能ではないです。


eclipseとの発想の違いだと思いますが,「何か分かんないけど,良い方法を教えて」に答えてくれるeclipseに対して,IntelliJは「こんな事やりたいから手伝って」的なアプローチを取っています。よって,そもそもやりたいことを指示してこそ,IntelliJが輝くとも言えます。

そうは言ってもずっと受け身なわけではなく「おいおい,ここヘンじゃね?」的な指摘は都度してくれます。


コード補完でも同じで「Ctrl+Spaceの一族」で書いたように,補完目的(ノーマル,スマート,クラス名*4,テンプレート展開)に応じてキーを使い分けないとイケない。ちなみに,テンプレート展開(Live Template)については,隠しオプションを有効にすることで通常補完でも使えるようになります。

IntelliJの隠しオプション一覧


早いか遅いか

よくTwitterのタイムラインとかで「eclipseは遅い」と聞きますが,IntelliJも十分遅いと思います。特に立ち上げ時のインデックス作成なんてのは顕著ですね(それでもNetBeansのよりは早いかも)。インデックス作り終わってからは,それなりにサクサク動きますが,この辺はモロに主観の問題ですし,なんだかんだでマシンスペックが支配的なので,どっちがどうとは言えないかと思います。


UIがカッコいいか悪いか

SWTでプラットフォームネイティブっぽいUIのeclipseと,いかにもJavaでございなIntelliJ(NetBeansも似たり寄ったり)と比べてどっちがカッコ良いかってのも難しい問題だなーと思います。これもまた好みの問題で,時代背景もある程度影響しますので,どっちが気に入るかは,その人次第ってことで。:-)

IntelliJの見た目の歴史

*1:File -> Settings -> Compiler -> Make project automatically

*2:どうもIDEA12のそれは、インクリメンタルビルドに近い機能っぽいです。

*3:一応、ProjectツールウィンドウにProblemsというビューはありますが、eclipseのそれとは趣旨が異なるかなと...

*4:クラス名補完はIDEA12からは無くなったようです。