Monthly Archives: 12月 2011

GWTでJavaプログラミングをはじめよう!

Java アドベントカレンダー2011 31日目です。

みんな大晦日だよ!僕が子供の頃は青いネコ型ロボットが出るアニメが特番をやるのが楽しみでした。「こんなことできたらいいな」と思って「叶えてくれる」と言ったら、「はい、Java言語」ということで子供たちの夢を叶えるプログラミングを今Javaで入門したらどうなるのかを試みてみようと思います。

Javaを使ったプログラミングってどんなことが一般的に行われているでしょうか?

  • JavaEEベースのWebアプリ
  • Androidアプリ
  • 黒画面でHelloWorld
  • Applet(……忘れましょう)

Webアプリ開発は現時点で大変実用的な分野ではありますが、これを最低限でもこなすためには「HTML」「HTTP」「JavaScript」「CSS」「JSP」「XML」やら各種フレームワークやら、覚えることがたくさんありすぎて、大変であることが経験上わかりました。

Androidアプリは僕はよくわからないので、今回はスルーします(ぉぃ)

黒い画面でHelloWorldとかソートをひたすら作っていくのは王道ですよね?遅かれ早かれこうした環境で勉強するのは必要だと僕も思っています。が、いきなりそこから入って多くの挫折した人々を見ていますし、昔DelphiやVBのようなものから入った軟弱者としては、最初から「びじゅある」な夢を見させてもらってもいいじゃないかと思います。

さて、作ったものを人に配布できないとモチベーションがぐっと下がります。そんなわけで、スタンドアロンアプリケーションでは不利です。やはりWeb関連が便利です。Google App Engineのようなプラットフォームにデプロイするだけでいきなり全世界に配信できる楽さは利用しない手はないでしょう。GAEにデプロイするならEclipseにGoogleプラグインを入れると手っ取り早いです。

何を隠そう、Google App Engineがリリースされたばかりの日、僕もGAEを触ってみようとしてアカウントを取得しましたが、Eclipseプラグインをインストールしてアプリケーションを作り始めて「すげーww簡単じゃん」と感激して作っていたのはGAE関係なく、単なるGWTのアプリケーションでした(^^;

ということで、今回は、これからプログラミングを覚える人に、GWTを勧めたらどうなるでしょうか?まずは自分が入門者になったつもりでアプリを作ってみます!

開発環境を整える

まずは開発環境を整えなければいけません。Snow Leopard以前のMacなら最初からJava入ってるよねーで済んだのですが、いまだとえっと、ここに詳しく書いてあるみたいです。

「JDKをMacOSX Lionにインストール」- 三十路SE(みそじシステムエンジニア)日記

Windowsの人はOracleの公式サイトからインストーラをダウンロードできるので、そこからインストールするといいでしょう。
http://www.java.com/ja/download/help/download_options.xml

次にEclipseのインストールと、GAEのアカウント作成がありますが、人の記事に助けていただきます。

「Google App Engine (for Java) の開発環境構築」 - Tech Booster

さらに、GAE for Javaでの開発はとりあえず、Slim3を使ったほうが便利です。このページを真似してみましょう。

「開発環境の構築‎ > ‎Slim3 Plugin for Eclipse」- Slim3room

さて、他人のふんどしを履いて光速で開発環境が整ったということで、早速最初のプログラムを作ってみようと思います。

画像を表示してみよう

まずはSlim3プロジェクトを作成します。この時Use Google Web Toolkitというのを選びます。

せっかくなら、HelloWorldではなくて、画像を表示しましょう。まず絵を書いて、Eclipseのここにドラッグアンドドロップします。

そして、Main.javaというコードをこのようなコードを書き変えましょう。

Main.java

package com.example.nekogata.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.RootPanel;
public class Main implements EntryPoint {
    public void onModuleLoad() {
        Image image = new Image("nekogata.png");
        RootPanel.get().add(image);
    }
}

そうしたら実行の右三角ボタンを押せば早速プログラムを動かすことができます。

と、ここまで書いて挫折しました。さらりと書いていますが、ChromeのGWTプラグインが不安定だったり、プラグインのインストールで手こずったり、コンパイルで手こずったりするうちにざっと2時間も経過してしまいました。年の瀬で忙しいので嫁に呼ばれてしまったので、ここから先は年内はあきらめます。年明けに気が向いたら続きを書きます。

ちなみに、本当はボタンを押したら画像がON/OFFしたりはしようとしました。

結論

GWTでプログラミング入門はまだ無謀かもorz
開発環境ががが…………

追記 (12/31 22:00)

このままではあんまりなので、カウントダウン時計を作ってみました。ちゃんと動くのかはわかりませんが……

package com.example.nekogata.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

public class Main implements EntryPoint {

    public void onModuleLoad() {
    final long newYearTime = DateTimeFormat
        .getFormat("yyyy/MM/dd")
        .parse("2012/01/01")
        .getTime();
    final Image image = new Image("nekogata.png");
    final Image image2 = new Image("nekogata2.png");
    final Label label = new Label();
    RootPanel.get().add(label);
    RootPanel.get().add(image);
    RootPanel.get().add(image2);
    image2.setVisible(false);
    Timer timer = new Timer() {
        @Override
        public void run() {
        long now = System.currentTimeMillis();
        long rest = newYearTime - now;
        if (rest > 0) {
            label.setText("新年まであと" + rest / 1000 + "秒");
        } else {
            label.setText("A Happy New Year !!");
            image.setVisible(!image.isVisible());
            image2.setVisible(!image2.isVisible());
        }
        }
    };
    timer.scheduleRepeating(100);
    }
}

http://gwtnewyear2012.appspot.com/

きっと、ちゃんと動くよ!うん、GWT簡単ですね!コーディングが直感的で気持ちいいよ!><

さらに追記 (12/31 22:30)

調子に乗ってこんなボタンを作ってみた。
http://2.gwtnewyear2012.appspot.com/
やっぱりGWT面白いよ!!いいよ!

それでは皆さん良いお年を〜

何者にもなれないエンジニアが、技術を磨くためのただ3つの方法

エンジニアの生存戦略として、よく「アウトプット大事」と言われます。

「勉強会でお客さんになっていては上達しない。発表者にならなければ!」とか「本を読むだけでなく、OSSにコミットしよう」とかは、確かにその通りだと思います。言うまでもなく、人に教えるには教わる側の数倍の知識が必要とされます。技術は実践しないと身につかないですよね。

とはいえ、会社で雇われ、平均的に働き、平凡な能力しかない大勢のエンジニアにとって、OSSにコミットしたり、勉強会でLTすることは結構敷居が高いことです。そもそも、使う価値があるからOSSは使われ、聞く価値があるから発表は聞かれるのです。世の中実力勝負です!昔よりは裾野が広がったとは言え、それでもオリジナリティって難しいのです。

そこで今日は、僕自身一平凡なエンジニアとしての視点から、普通のエンジニアが上を目指すために取るべき戦略を提案してみたいと思います。

ローカルグループ活動

○○ユーザ会主催などのガチの勉強会でいきなりLTするのはちょっと怖い高いですよね。一流の人達に混じってガクガクブルブル………しかし、一流じゃなくてもあなたの話を聞きたい人は居ます。地域や会社、友達、IT以外の趣味を持つグループなどの仲間です。そんな仲間内で、お互いに勉強しあう会を定期的に行うのはどうでしょうか?

このような近しい人の輪では、発表の内容自体よりも「○○さんは何をやっているのだろう」ということに参加者は興味を持っています。それでも発表するという行為は変わりません。この要求度に限って言えば、本当のIT勉強会となんら変わらないのです。従って、発表のやり方とかスライドの作り方が自ずと鍛えられるようになります。

ただし、このような会での発表のあり方は、ガチの勉強会と異なって、参加者が発表者の発表内容を聞きたくて来ているわけでは(必ずしも)ないところがあります。そのため、自分の専門分野外の人に専門分野のことを説明するための工夫が必要です。仕事をしているとその分野についてとても深い所で気づかず、うっかり専門用語を使ってしまいます。そういう発表をすると、とたんに寝る人が出たりします。それを防ぐためには敢えて自分の専門分野外の一般受しそうな話を持ってきたり、専門分野外のことも広く浅く(なぜなら参加者の中では例えば一番「パソコンに詳しい」と思われている)知っておくなどの準備が必要です。そういうのを好むか好まないかは人それぞれとは思いますが、エンジニアはユーザあってのエンジニアですし、意外とこういう場から世の中のニーズが見えてきたりします。

コミュニティー奉仕

「この人すごい!尊敬する!でも雲の上のような存在でなかなか声をかけられない」そんな人っていますよね?
ところで、昨今勉強会がたくさん行われていて、大抵の勉強会は受付や会場設営などのスタッフやボランティアを募集していたりします。いつもお世話になっている勉強会に「客」ではなく「スタッフ」として参加すると、あこがれのあの人と話す機会に思わず恵まれるかもしれません。

「優秀な人の輪に入る」ということは自分戦略として重要です!

タダ働き

「知り合いにPC関係のことであれやってあげたのに、さも当然のようにされて、礼も言われなかった」
という話をよく耳にします。僕自身、何度かそのような経験があります(笑)。しかし、今となってはそんなことはどうでも良いと思っています。
プログラマーが余暇を利用してコーディングというのは、なかなかできるものではありません。「日々の仕事で疲れているし、もう液晶ディスプレイなんか見たくもない!!そんな心境で、休日はつい午後まで寝て過ごしてしまったと」いう話がピンと来る方は結構いらっしゃるのではないでしょうか?

しかし、自分の技術を使って人に喜んでもらうことができるとしたら、モチベーションもグッと上がりませんか?(`・ω・´)

その際、対価は受け取らないという手法を提案します。対価を受け取ってしまうと「仕事」になってしまって途端に窮屈な感じがします。なにより、お金を取るんだから自分が完全に理解している手堅い技術を使いたくなります。そこからは成長は見込めません。プロらしくないかもしれませんが、対価を受け取らないんだから責任も軽減されます。一方で、お金を取らないのだから当然費用が発生する方法は使えません。必然的にOSS、フリーミアムのあるプラットフォームなどを利用する方向に行くと思います。最近ホットなScalaとか、GoogleAppEngineなどを使うチャンスです!そして、小さなプログラムでも、れっきとした事例です。これであなたもモテエンジニアへ一歩踏み出せます!(*´∀`)

JVM用のJavaScriptエンジンをまとめてみる

JVM上で動くJavaScriptについて調べたので、メモしておきます。

これまでの状況

まずは、Rhinoが有名です。「ライノ」と呼びます。RingoJSMayaaなど、すでに広く使われています。Java6から標準でJDKにバンドルされています。(ただし、バンドルされたものは若干バージョンが古いです。)
Rhinoの他には Apache Aptana Jaxerというサーバサイドでscriptタグを解釈するフレームワークがあります。こちらは、C言語で書かれたSpider Monkeyを利用しています(JNIでしょうか?)。
Spider MonkeyとRhinoはともに、Mozilla傘下で開発がされている姉妹関係にあります。Firefoxで使用されているのはSpider Monkeyの方で、現在のFirefoxでは、TraceMonkey, JagerMonkeyのようにパフォーマンス改善が施されています。

サーバサイドJSといえば、Node.jsが有名ですが、JVM上では、RingoJSというフレームワークがあります。これはRhinoをベースにしています。

その他、Java上でChromeOSで使われているV8エンジンを使おうという試みもあります。
http://rbackhouse.blogspot.com/2011/03/using-google-v8-javascript-engine-in.html

これからの動き?

Java7から、invokeDynamic機能が搭載されました。これによって状況が変わりました。なぜかというと、invokeDynamicを使用すると、JVM上で動くスクリプト言語のパフォーマンスを向上できるからです。Rhinoはパフォーマンスのために、ソースコードが職人芸になってしまい、読みづらいと言われています。
OracleはJava8で、新しいJVM上でのJavaScript実装 Nashorn をRhinoの置き換えとしてリリースするとアナウンスしました。Nashornとは、ドイツ語で「サイ」を意味する(中性)名詞です。「ナズホーン」と呼びます。ちなみにRhinoは英語で「サイ」という意味です。ソースが公開されるのかについての言及はないので、商用製品としてリリースされる可能性があります。
他にDyn.jsというプロジェクトがApache2.0ライセンスで開発が進められています。これは、Dynalinkantlr3という、同じApache2.0ライセンスのライブラリをうまく利用して、ソースを読んで見ましたが非常に綺麗な印象を受けました。
Rhinoも開発が続けられていて、invokeDynamic対応が進められています。

今後どうなるのか?

2011年12月3日時点zipでダウンロード出来るバージョンのDyn.jsをダウンロードして実行したところ、次のコードが誤って実行されていました。

(funcion(x){print(x)})(1)

x

これはバグです。Rhinoで同じコードを書くと

1

と出力されます。最新版ソースからビルドしたものを使えば直っているかもしれませんが、やはりまだまだ開発途中という印象があります。ドキュメントが充実していないので、例えば、Javaオブジェクトとの連携方法がよくわかりません。RhinoではPackages.パッケージ.クラス名でアクセスできますが、この記法で統一されるのでしょうか?

Java8のリリースは2013年と言われているのでまだ時間があります。Rhino自体はパフォーマンスに問題がないため、今後も使われていくでしょう。NashornはOracleの力で、もしかしたら今後普及するかもしれません。Dyn.jsはソースが非常に美しいので、頑張って欲しいと思います。

HTML5ブラウザを内包するアプリケーションをJavaで作る場合は、V8エンジン+JNIを検討するのも選択肢として良いかもしれません。

Javaやが知るべき5つのJSエンジン

という釣りタイトルで以下のエンジンを列記した際は当エントリへ、今時流行らないトラックバックでもくださいw

  • Rhino
  • SpiderMonkey
  • V8
  • Nashorn
  • Dyn.js

5人揃ったので

赤ライノ、青スパイダー、緑ブイ、ピンクナズホン、イエローディーン、5人揃ってJSエンジャー

追記

2011/12/03 22:33 Aptana JaxerをApacheと記入してしまっていたので修正しました。やや言い回しやレイアウトなど修正しました。

この記事は以前多くのブックマーク・コメントを頂きました。

これからブックマークされる方はこちら↓