2012年12月31日月曜日

gradlebについて

今年(2012年)最後のエントリーになります。

みけです。

Gradleをいつも推していますが、

build.gradleがいつも同じ事ばっかり書いている気がしたので、

gradle builder 略して、gradlebを書いてみました。

aliasにalias gradleb = 'groovy /path/to/gradleb.groovy'

設定しておいて、下のように叩くと、プロジェクト構造とbuild.gradleが生成されます。

$ gradleb  -g org.mikeneck.gradleb.sample -j 1.7 -p sample-web -v 0.1 -a jetty,groovy,idea -d groovy/org.codehaus.groovy:groovy-all:2.0.5,compile/org.jboss.spec.javax.servlet:jboss-servlet-api_3.0_spec:1.0.2.Final,compile/org.springframework:spring-core:3.1.2.RELEASE,testCompile/junit:junit:4.11

apply plugin : 'java'
apply plugin : 'jetty'
apply plugin : 'groovy'
apply plugin : 'idea'

group = 'org.mikeneck.gradleb.sample'
version = '0.1'
sourceCompatibility = '1.7'
targetCompatibility = '1.7'

repositories {
    mavenCentral ()
}
dependencies {
    groovy 'org.codehaus.groovy:groovy-all:2.0.5'
    compile 'org.jboss.spec.javax.servlet:jboss-servlet-api_3.0_spec:1.0.2.Final'
    compile 'org.springframework:spring-core:3.1.2.RELEASE'
    testCompile 'junit:junit:4.11'
}

スクリプトなので、荒削りな部分はありますが、

簡単にビルドスクリプトが書けます。



2012年12月29日土曜日

経済学って何やってんの?

みけ@ダークモードです。

まあ、最近貧困化が云々とか、

安倍政権が脱デフレとか言っているんだけど…


そもそもお金がないのにどうやってインフレさせんのよ。

正確にはお金が流通していないのに

どうやってインフレさせるのかという話。


僕は子供の頃から、

僕が僕であることを

不思議に思っていたので、

まあ、いわゆる「哲学」とかいうのに

はまってしまった厨二病的に人間なのですが、

そういうのを一蹴してくれたのが、

マルクスで彼の『資本論』なわけです。


マルクスの『資本論』というのは、

名前とは違って、どちらかというと思想書に

あたるわけですが、

よく読むと最近の経済状況と重なる部分があって、

ちゃんとした経済学の書籍であるとも

思えるようになりました。


第一巻の最初の方ですが、

  • 小資本家を何も持たない労働者の地位に落とす
  • 資本はより大きな資本になる

という記述があるわけですが、

まさにこれは今の日本に平等に起きている状況

貧困化

だと思うわけです。


だから僕は経済学というのが一体何をやっているのか

それがよくわからんのですよ。

マルクスに学ぶことはないはずなのに、

なんでマルクスに負けてんのwww

IntelliJ IDEAでプログラミングしよう - 初級編

こんばんわ。

みけです。


最近、「IntelliJ IDEAを購入したけど、全然使っていない」という

もったいないことをされている方が多いので、

IntelliJ IDEAの使い方講座を書こうと思います。

なお、対象バージョンはIntelliJ IDEA 12です。


インストール


IntelliJ IDEAのダウンロードページからダウンロードします。


Windowsの場合はインストール用のexeファイルが、

Macの場合はディスクマウントイメージがダウンロードされるので、

それぞれ開きます。


Windowsの場合はインストールディレクトリを入力して、

あとは良きにはからえという感じでインストールしてくれます。

僕はWindowsマシンには「C:¥IntelliJ」というディレクトリーに、

バージョンごとにディレクトリーを作成して、

そこにインストールしています。

例えば、12.0.1の場合は、

「C:¥IntelliJ¥12.0.1」というディレクトリーにインストールしています。


Macの場合は、ディスクをマウントして、

アプリケーションディレクトリーにドラッグ・アンド・ドロップするだけです。




初回起動時


初回起動時にはライセンスの入力を求められます。




個人でご購入された方は一番上のEnter License Dataというところに入力します。

入力する内容ですが、

みなさんのメールにJetBrainsから次のようなメールが届いていると思います。




こちらのメールを開き、次のような箇所を探します。




ここに記載されたUser NameとLicense Keyを先ほどの

ライセンス入力画面に入力します。

これで晴れて正式なIntelliJ ユーザーになれました。

おめでとうございます∩(・ω・)∩バンジャーイ


Hello Worldを作る


ではさっそくハローワークじゃなかった、Hello Worldを作りましょう。

Quick Startというところから、「Create New Project」を選択します。




つぎにアプリケーションの情報を入力します。






  • 作成するアプリケーションのタイプを選択します。
    • ここでは「Java Module」を選択します。
  • プロジェクト名を設定します。
    • ここでは「start-idea」とします。
  • ファイルツリーをどこにするか設定します。2.に合わせて自動修正されます。
    • ここはデフォルトのままにします。
  • Javaのバージョンを指定します。
    • ここでは「1.7」にします。
  • プロジェクトファイルの形式を選択します。
    • ここでは「.ipr (File based)」にします。
  • ソースディレクトリを自動で作成するか決めます。
    • ここでは自動で作成することにして、そのディレクトリーをGradleのデフォルトっぽく「src/main/java」にします。


そして、Nextをクリックすると次のような画面が表示されます。

利用するモジュールとそのバージョン・詳細などを決定できます。




ここではGroovyを使いたいのをぐっと我慢して、Finishをクリックします。

これでプロジェクトの作成完了です。




プログラムを書く


左側の説明

では画面の簡単な紹介です。

まず、左側にはファイルツリーが表示されます。



ここでは、主にファイルの操作を行います。

  • クラスの作成・削除
  • パッケージの作成・削除
  • ディレクトリの作成・削除
  • ファイルの作成・削除


パッケージを作る

さっそくパッケージを作りたいと思います。

ソースディレクトリの「src/main/java」を選択した状態で、


  • Windows : alt + Insrt
  • Mac : ctrl + n


を入力し、出てきたメニューから「package」を選択します。




ダイアログが出るのでパッケージ名を入力します。




そうするとパッケージが出来上がります。




クラスを作る

では次にクラスを作ります。

先ほど作ったパッケージにカーソルがある状態で、


  • Windows : alt + Insrt→Enter
  • Mac : ctrl + n→Enter


を入力します。

するとクラス名を入力するダイアログが出てきます。




クラス名を入力して、「Enter」を入力すれば、

クラスが出来上がります。




簡単に出来ますね。

多分クラスを作成する手順は某eというIDEよりも

少ないはずです。


エディター部分

まあ、これについてはとかく説明することはないですね…

エディター部分です。

好きに書いて下さい。





というわけで、public static void main (String... args)

と入力してきましょう。


で、puと入力すると…




いきなり補完が出てくれます。

これ、すごい便利です。

某eというIDEだとctrl + spaceを押さないとやってくれませんからね…

最近、某nというIDEはIntelliJのこの機能を取り込んでいるみたいですね。




では、引き続きSystemと入力します。




アウッ




プ…




とにかく、するするっという感じで補完されていきます。


無駄にctrl + spaceを入力する必要などありません。


よく、某eは気分が爽快になると言われていますが(※)、
(※要引用元)

多分、ctrl + spaceを無駄に叩いて

「ッターン」している自分に酔っているだけじゃないかな

と思います。


あの「ッターン」はやっている人は気分爽快かもしれませんが、

周囲にいる人にはすごい迷惑なんですよね。

耳障りというか…

自分は爽快だけど、他人に不快な思いをさせるIDEって

どうなのかな…
(使う人のアレによる)


で、特に静かなオフィスでみんながあれをやっていると、

オフィスがスゴイ不機嫌な感じになるんですね。

みんながイライラしているっぽくって、

周囲に流されやすい僕もなんだか不機嫌になってしまいます。


さて、話が横にそれましたね。

もとに戻して、あとは「Hello, World!」と入力するだけです。




プログラムを実行する


実行するときのコマンドは次のとおりです。

  • Windows : alt + shift + F10
  • Mac : alt(option) + shift + F10




下の部分の説明




まあ、ほとんどアイコンで何が何を意味しているかわかると思うので、

説明は必要無いですかね。

  • 再実行したい場合は左上の矢印アイコンを押します。
  • 実行途中で終了する場合は左中の四角アイコンを押します。
  • …あとはあまり使ったことないっす


と、まあとりあえず、普通の使い方について説明してきました。

次回(あるかどうかは不明)はもう少し進んだ使い方を説明したいと思います。

2012年12月28日金曜日

Spockで例外のテスト

年末ということで広島に来ているみけです。

Spockとは


まあ、ググってください。


例外のテストがうまくいかなんだ…


したがってSpockはJUnitで@RunWith (Theories.class)でやるようなテストを


非常に見やすい形で、かつ型安全に実行できるわけです。


そこで、例外のテストを今度は書いてみることにしました。



テストを実行すると…




落ちたよ(´・ω・`)

Spockは例外を扱うようなテスト書けないのか…残念無念orz


しかたがないので@RunWith (Theories.class)使ったよ…


というわけで、Spockを諦めてJUnitへ…

なんか、@RunWith (Theories.class)使うと、

@DataPointsでデータを指定できるのですが、

なんか配列を強制されてるっぽいので

個人的にはイケてない気がする…
(まあ、便利ですけど、それとも僕の書き方が悪いのか…)
(求むツッコミ!)




で、テスト実行、テストクリア!




ということで結論…




と、そこでいろふさん登場。



ふむ、thrown!そんなシンタックスがあるのか!

というわけで、Spockのページを読むと、確かにあった





Spockで例外のテスト


Spockのページを参考にテストを書きなおしてみると、

こんなんなった。





そこでテスト実行。




通った!通ったよー!


結論


出来上がったソースを見てみると、

境界値テストとかのデータパターンを書いてテストするのに

条件と期待値が一覧形式で読むことができるので、

Spockはかなりいいですね。


Spockのサンプルに載っているようなテスト





実は僕、これの何が嬉しいのかわからなかったんですよ。


だけど、@RunWith (Theories.class)を書いた後に、


Spockで書きなおしてみると、Spockのありがたさが非常によくわかります。


真の結論











ということなので、いろふさん早くSpockについてブログ書いて下さい。








2012年12月25日火曜日

ドラクエ10 レベル50からのレベル上げ #dqx #dq10

ドラクエ10のレベル上げのことでちょこっとメモ



レベル50からのレベル上げがマゾすぎて辛いですね。

効率の良い方法をメモしておきたいと思います。







レンジャー レベル50以上のレベル上げ


というわけで、なかなかレベルを上げるのが効率よくいかないのですが、

レンジャーについては「手なづける」とオノレンジャー(ふぶきのオノ)を利用した

浜辺の洞窟でのゴルバ・ガルバ狩り

効率が良いようです。


ガルバを手なづけると、

仲間を呼ぶという動作か、

仲間を攻撃するという動作しかしなくなります。


ガルバに呼ばれてくるのが、

ガルバかゴルバです。


ゴルバは氷が弱点属性なので、

普通の攻撃で攻撃します。


ガルバは炎が弱点属性なので、武器の装備を変えます。

バージョン1.2からはふぶきのオノで特技をはなった場合は氷属性が残ってしまいます。

氷属性のまま攻撃すると、通常時の75%になります。

  • ふぶきのオノ + 蒼天魔斬 → 通常攻撃の 1.3 倍 の 75% → 0.975倍



したがって、武器をカイザーアックスあるいはデストロイヤーに変更しておくと良いでしょう。

またはエクリプスアックスで混乱を誘発するのも良いかもしれません。


これはサポートでやるのは難しいので、

人肉パーティが望まれます。

どっかのスレで募集がかかっているので、

そこを張っておくとよいでしょう。


(画像の著作権は、株式会社スクウェア・エニックスに帰属します)


基本職 (僧侶、旅芸人、武闘家) レベル50以上のレベル上げ


棍を装備できるこれらの3つの職業は、

「にちりんの棍」という反則なくらい強い武器があるので、

それを装備しているサポートを雇って(ただし、HP+100のパッシブと棍スキル88以上は必須)、

ゾンビを狩る方法が効率良いようです。


また、旅芸人の場合はリューイーソーを狩るという方法もあります。

こうすると金策的にもよいです。




ちなみにリューイーソーを狩る時に、

猿じゃなかった、シルバーデビルが呼んでもないのに

近づいてくることがありますが、

こいつも光が弱点属性なので、

好き嫌いせず倒しましょう。


この猿は賢いのか、

ギガデインを使ってきますが、

ギガデインを使ってきたらとりあえずメンバーから離れましょう。

そうすることでダメージを受ける人数を減らすことができます。







基本職 (戦士) レベル50以上のレベル上げ


MPパッシブが高めかつ、斧スキル88以上なら、

ゴルバ・ガルバ狩りに参加させてもらうのがよいかもしれません。


MPパッシブがなくて両手剣だよーという人は、

  • 「斬夜の太刀」を装備して
    • メギストリス領のリューイーソー
    • グレン領東のトロル
    • サグバン丘陵のドラゴンゾンビ
    • ブーナー熱帯雨林のテラノライナー
    • 賢者の隠れ家の
      • ダークナイト
      • しにがみきぞく
  • 「デーモンバスター」と「大獄剣」の装備を切り替えて
    • ゴルバ・ガルバ

と、いろいろとレベル上げできる場所があります。


実はこの部分をまとめていて、

何気に両手剣というのはすごい使い勝手の良い武器

だと思っている次第です。

バトルマスターがおそらく両手剣装備できると思われるので、

僕個人的には両手剣の時代が来ると思っています。


片手剣だよーという人は…
  • 「ほのおの剣」を装備してゴルバ・ガルバ
  • 「ゾンビキラー」を装備してゾンビ狩り
といったところでしょう。


まあ、どの手段で行くにしても、

HPパッシブは+100にしておかないとキツイですね。


基本職 (魔法使い) レベル50以上のレベル上げ


正直言って、ドラクエ10では魔法使いが一番無双です。

リューイーソーやゾンビに対しては光属性の攻撃魔法イオで。

ゴルバ・ガルバにはそれぞれヒャドとメラで。

比較的経験値の多いウドラーにはメラ+マホトラで。

ポイントは雷、土、闇、風が弱点属性のモンスターと戦わないのがみそです。


基本職 (盗賊) レベル50以上のレベル上げ


この職業に関してはわからない。

効率良くレベル上げしないほうがいいと思う。







パラディン レベル50以上のレベル上げ


レベル50以上のパラディンを検索かけると、

大抵の人がレベル50になると、

攻撃力を重要視して、

「オセアーノススピア」か「デーモンスピア」を装備するんだが、

これは間違いで、「雷神の槍」を装備するのが正しい。


そしてパラディン3人と僧侶1人でオークキングをツンツンするのが最も効率が良いように私には感じられる。


というのも、オークキングの弱点属性は雷でかつけもの系なので、

槍であり雷属性の武器となると「いかずちの槍」か「らいじんの槍」の二択に絞られて、

攻撃力から言って「らいじんの槍」になる。


ちなみに「らいじんの槍」の通常攻撃はオークキングに対して、

攻撃力245で平均110、攻撃力198で平均70くらいである。


一方、「オセアーノススピア」の通常攻撃はオークキングに対して、

攻撃力260で平均100、「けもの突き(消費MP1)」で120くらいなので、

MPを消費させない方法を考えると、

「らいじんの槍」で通常攻撃の一択になる。


なお、オークキングが複数体出てくる + ベホマスライムがいない、

という点からオークキングはアズラン地方にいるやつを倒します。


で、たまに主であるギガントヒルズが出てくるわけだが、

こいつに対しては、

「らいじんの槍」で攻撃力245だと平均105なのに対して、

「オセアーノススピア」で攻撃力260だと平均75になってしまうので、

やはり「らいじんの槍」の通常攻撃一択になる。


というわけで、パラディンがレベル50になったら、

「オセアーノススピア」でも「デーモンスピア」でもなく、

「らいじんの槍」を装備するのが良いでしょう。





なお、僕が試してみたときは元気玉なしで10万の経験値を約4時間で獲得できたので、

元気玉を4個使えば2時間で行けるかもしれない。


ちなみにサポートの作戦は状況に応じて変更する必要がある。

変更例は次のような感じ。(2匹出た場合)

メンバー 1匹目が黄色になるまで 1匹目が黄色~倒れるまで 2匹目討伐中
自分(パラディン) 通常攻撃 通常攻撃 通常攻撃
サポート1(パラディン) MP使うな MP使うな MP使うな
サポート2(パラディン) MP使うな MP使うな MP使うな
サポート(僧侶 : スティック装備) いのち大事に MP使うな いのち大事に

大体一匹目が黄色になるまでには3ターンかかるので、

自分が二回攻撃した後は、

「さくせん」→「さくせん変更」→僧侶の前で「MP使うな」の状態で待機して、

僧侶がスクルトの二回目をしたら、即「MP使うな」設定に変更。

こうすることで、サポート僧侶がロストアタックをするのを防げます。


オークキングは黄色・オレンジでそれぞれ怒りモードになるので、

僧侶のロストアタックはMP(4 x 2 = 8)の無駄遣いです。


なので、この間はMPを使わせません。

こうすることで、僧侶のMP切れを心配することなく、

4~5時間宿に戻らなくてもずっと狩り続けられます。


なお、守備力が300あれば、スクルト二回で

相手の通常モードの攻撃はほぼノーダメ、怒りモードでの攻撃は30くらいになります。







本音


「らいじんの槍」を装備したパラディンが全然いねーんだよ!

おまいら、もう少し、属性と武器と敵の相性を研究しろよ!

「らいじんの槍」装備したHP+100パッシブ持っている♀キャラ探すのに

1時間以上かかったぞコラ!

今更だけど、Javaの勉強方法まとめてみた #jjug

これは『Java Advent Calendar 2012』の25日目のエントリーになります。

なんだか、もうあっという間に年末ですね…

昨日は@irofさんの「Date and Time APIを触ってみた」でした。

明日は@monzouさんの「」になります。


今更だけど…


皆さんはどうやってJavaの勉強をしていますか?

返ってくる答えのパターンとしては、

  • 書籍を読む
  • 書籍の内容を写経して実際に動かしてみる

なんていうのがあげられるかなと思います。

僕も大抵上記の方法でやったりしています。

ただ、まあ、この方法の弱点は

お金とお金とお金と近くの書籍販売店のリテラシーに依存してしまうことがあります。
(たとえば、JavaのコーナーにJavascriptの本が置いてある本屋など…苦笑(´・ω・`))


グーグル先生に聞く


まあ、書籍でダメならということで、インターネッツ!

グーグル先生は優秀なので、

ある程度キーワードを入れれば、

なにかしらのサイトを教えてくれます。

僕はGroovyなどはこの方法で勉強していたりします。

まあ、でも、英語が苦手な人とかだときつかったりしますね。


IDEに教えてもらう


IDEは、身近な頼れる先生です。

今使っているクラスにどのようなメソッドがあるか

一覧表示してくれるし、

なんかマズイ書き方をしていたら警告が出てきたりしますね。

メソッドの抽出や変数名の決め方もいろいろアドバイスしてくれるので、

至れり尽くせりな先生です。

逆にIDEなしでプログラムを書ける人は、

別の意味で尊敬してしまいます。
(悪い意味ではありません。)


なお、僕は新入社員だった頃は、JavaのIDEの存在を知らなくて、

秀丸でプログラムを書いていました…

この方法の弱点はIDEを使いこなせるようになることが

前段階で必要ということですね。


Javadocを読む


僕が秀丸でプログラムを書いていたときは、

何を読んでいたかというと、Javadocです。


当時所属していたプロジェクトでXMLパーサー(のラッパー)があまりに遅くて、

ムカついて、ラッパーを改造しようとして

Javadocをとにかく読んでいました。


最初は何が書かれているかよくわかりませんでしたが、

まあ次第に何が書かれているかなんとなくわかったような気になりました…

ドキュメント重要ですね…


ソースコードを読む


ドキュメント重要ですけど、最終的にはソースコードを読むことになります。


書籍やJavadocなどで、「こういう動きをします」と言われて、

「ふ~ん、なるほど」という感じで覚えた後に、

該当部分のソースコードを読むとすごい納得することがあります。


また、この方法の利点は、無償で読むことができるという点にあります。
(ただし、ソースが公開されているものに限る)

Oracleから公開されているJDKだと、JAVA_HOMEの直下にsrc.zipというファイルがあります。

それを解凍すれば大量のソースコードを読むことができます。


ソースコードの読み方については

都元ダイスケ IT-PRESS - ■[Java]オブジェクト指向のソースを読むのが難しい理由

が詳しいです。


なお、当たり前といえば当たり前ですが、

使わなくなったコードをコメントアウトしてなどという

アレなコードは今のところ見たことがありません。

職場で使わなくなったのにコメントアウトされたソースコードを読んで、

ソウルジェムが濁ってしまった方は、

ぜひJDKのソースコードを読んでソウルジェムを綺麗にしましょう。


まとめると…


  • 書籍を読む
  • ググる
  • ドキュメント読む
  • コードを読む

という感じになりましたが、

いたって普通というか突飛なものがありませんね。

2012年12月21日金曜日

えっ!いろふさんならさっきテストコードで見かけたよ! #irof_history

これはいろふAdvent Calendar 2012の21日目の記事です。

昨日は@tan_go238さんの『irofコマンドをbrewでインストールしてみる 』でした。

明日は@zer0_uさんの『ぬくもりろふ #irof_history』になります。


いろふさんはいろんなところにいる所で有名ですが…


本人のブログを見ると、結構テストにいることが多いみたいです。

で、僕も先ほどテストで見たんですよ。





実装は単純です。


単に比べているものがequalsで等しいか、

nullでないかだけで結果を返しています。





TODO


このライブラリーしょぼいので以下の実装を予定しています。

  • いろふさんのツイートが二時間ない場合はfailになる
  • @Irofアノテーションを付与すると、すべてのクラスにirofメソッドが作成される(Groovyのみ)
  • Twitterと連携して落ちたテストについてツイートする

以下は開発中の画面です。

2012年12月20日木曜日

IPA 平成24年度 システムアーキテクト試験 午後2 問1 解答例 with TDD

このエントリーは『TDD Advent Calendar 2012』の19日目のエントリーになります。

18日は@haru01さんの「TDD の素振りをしよう – haru01のめも」でした。


予告だと…


コマンドプロンプトとか言ってたな。

アレは、僕が冬眠中でネタを仕込むのに時間がかかるので、

やめたわ…


テーマ


TDDに特に思い入れがないので(失礼)、

なんか現場でこういうふうに導入しようという考えをいろいろと書いてみましたが、

まとまりにかけて、これも没にしました。


そこで


IPAの情報処理技術者試験のシステムアーキテクト試験午後2の問1の模範解答を

TDDをテーマに書いてみることにしました。

ちなみに、まだ途中までしか書いていません…


問題はこんな感じです。


業務の変化を見込んだソフトウェア構造の設計について

 企業を取り巻く環境の変化に応じて、業務も変化する。情報システムには、業務の変化に対応して容易に機能を変更できるような、ソフトウェア構造の柔軟性が求められる。
このため、システムアーキテクトは、システム要件定義の段階から、業務の変化が起こり得るケースを想定し、変化の方向性やシステムに与える影響を予測する。ソフトウェア構造の設計では、その予測に基づいて、業務が変化してもシステム全体を大きく作り直す必要がないように考慮しなければならない。
例えば、次のようにソフトウェア構造の設計を行う。

  • 業務フローの制御部分と業務ロジック部分を分離する。
  • 業務ロジックが互いに疎結合となるように分割する。
  • データアクセスコンポーネントを共通化する。

 その際、そのような設計を行うことによって引換えに生じた課題に対応するための工夫を行うことが重要である。例えば、処理時間が長くならないように複数のプロセスを並行して処理したり、処理同士の整合性を確保するために排他制御の仕組みを用意したりする。
あなたの経験と考えに基づいて、設問ア~ウに従って論述せよ。


設問ア あなたがソフトウェア構造の設計に携わったシステムにおける、対象業務の概要及び特徴について、800字以内で述べよ。

設問イ 設問アで述べたシステムについて、どのような業務の変化を想定したか。また、業務が変化してもシステム全体を大きく作り直す必要がないように、どのようなソフトウェア構造を設計したか。800字以上1,600字以内で具体的に述べよ。

設問ウ 設問イで述べたソフトウェア構造の設計において、生じた課題とそれに対応するために重要と考えて工夫した内容、及び設計したソフトウェア構造に対するシステムアーキテクトとしての評価について、600字以上1,200字以内で具体的に述べよ。

(IPA 独立行政法人 情報処理推進機構より引用)


僕が書いた模範回答


設問ア
私は都内のシステムインテグレーター(以下A社と省略する)に勤務するアプリケーションエンジニアである。A社の顧客に大手製造業のZ社がある。Z社は国内および海外に製造・販売の拠点を持つグローバル企業である。本論文ではA社が昨年請け負ったZ社の生産支援システム(以下、生産システムと省略する)について述べていく。
Z社はかねてより海外展開している企業であった。しかし、20 08年以降日本国内での流通量が激減しており、勃興するアジア市場でいかに売上を伸ばしていくかが課題となっていた。Z社で従来から旧生産システムを用いていたが、システム保守にかかる時間が長期化しており、変化が激しいアジア市場に対応するには厳しかった。そのため、Z社では激しい市場の変化に柔軟に対応できる新生産システムを企画し、A社が受注することになった。







2012年12月16日日曜日

Trying Groovy's @Vetoable bindings in JavaFX Application #javafx-ja #JavaFX

Hello, these day's Advent Calendar rush is making me much confusion.

I'm mike_neck.

This post is written as 16th day's post in JavaFX Advent Calendar 2012.

This post is a translated version of my 13th day's post in JavaFX Advent Calendar 2012, titled
JavaFXでGroovyのVetoableが機能するか試してみた #javafx-ja
.

Yesterday we read @tarchan's great post titled
JavaFXで電子書籍リーダーを作ってみた
.



What's the Groovy Vetoable


Groovy's Vetoable is a one of AST transformations which is useful to GUI(thus means a Swing) developers.

When creating Swing UIs, you're often interested in monitoring the changes of value of certain UI elements. For this purpose, the usual approach is to use JavaBeans PropertyChangeListeners to be notified when the value of a class field changes. You then end up writing this very common boiler-plate code in your Java beans:





and then the result of the main method will be like as follows.





But with Groovy's @Vetoable annotation, we can add PropertyChangeListener much easily.

  • Add @Vetoable annotation to properties which requires being scanned its change.
  • Get instance.
  • Add PropertyChangeListener as Closure.





and then result of this script will be like as follows.





(For more detail, please refer Bindable and Vetoable transformation)


Applying @Vetoable to JavaFX


I want to apply this @Vetoable's interesting feature to JavaFX UI.

So we are going to make a simple application with a text field and labels whose text is affected by inputs of the text field.


Features

There are a text field and two labels.




If we input "mike" into the text field

  • the left label shows the contents of the text field (i.e. "mike").
  • the right label shows message from "mike" (here "Hello mike").




Designing View and Controller

With Scene Builder we are going to design the view and controller for the application.

1. Add Controller to AnchorPane.




2. Add an event method to a onKeyReleased event of the text field.




3. Add fx:ids to the text field and the labels.




4. Save it as fxml file.


Reading fxml file and @FXML annotation

JavaFX injects some objects and events into some fields and methods annotated with @FXML annotation in a Controller class, when reading fxml file created with Scene Builder.





And the model class is here.





About Controller class

JavaFX executes the method initialize after reading fxml file.

In this sample, initialize methods create an instance of the Person class with @Vetoable annotation, and then gave its vetoableChange an Closure which changes message field of the instance after the name fields is changed.

The method named keyReleased, which is called after user releases his key, changes the name field. And it changes the text of two labels from the Person instance.


Execute it!

Here we run this application.




Too simple view.

Let's input Japanese character "みけ".






Labels are changed successfully as the contents of text field are input.


What is an advantage to use Groovy @Vetoable annotation?


It is much testable with Groovy's @Vetoable annotation than without it.

Please look at the initialize method shown before.

This method provides ...

  • creates an instance of Person class
  • gave vetoableChange

But become more simple.

These code should be in Person class.





Then the controller class becomes more simple.





We can test its behavior without starting any JavaFX application.









We were bothered by the Thread of JavaFX, when we had thought of testing application.

But making JavaFX application with Groovy takes us more simplistic way to test JavaFX Application.


Conclusion


Let's use Groovy into JavaFX application!

Tomorrow we will read @rewtheblow's post.

よく使うGroovyのスニペット

はいはい、12月ですね。

12月といえば、Advent Calendarということで、

今回のエントリーは「G* Advent Calendar」の16日目です。

昨日は@orange_cloverさんのエントリーでした。

さすが、オレンジさんです。

本題



すごいことやっちゃったぜーっていうエントリーは

きっと#なごやこわい のきょんくんがやってくれているので、

僕はすごくないことをやります。


ランダム発生




これはもともと@fumokmmが書いていた

エントリーにあったものをパクったのですが、

ランダムを指定範囲以内で生成できるので非常に重宝しています。


collect



Integerにはtimesというメソッドがあって、それでもって、

リストを作成したりできるんですが、

なんか函数型的に望ましくないので、

collectを追加しました。





これは副作用プログラミングがないので、

結構重宝しています。



結び


こんなのもいいよというのがあったら、

ぜひ皆さんGistとTwitterで紹介して下さい。


明日は、硬派で、パフォーマンスに詳しい@nagai_masatoさんです。


とても楽しみですね☆

2012年12月13日木曜日

JavaFXでGroovyのVetoableが機能するか試してみた #javafx-ja

Advent Calendarたくさん書きすぎて、

何のAdvent Calendarを書いているかわからなくなってきている

ミケです。

これは『JavaFX Advent Calendar』の第13日目のエントリーになります。

昨日はtaizさんの「JavaFX Media playerのちょっと面白い機能」でした。



GroovyのBindable and Vetoable transformation


JavaFXなのにGroovyのことを少し説明しておきます。

Bindable and Vetoable transformationというのは、

Groovy Beans(Java Beansとまあほぼ同等)に関する値変化を検知して、

何かしらの処理を挟み込むGroovyの機能です。


Vetoable


ちょっと言葉だけで説明したのでは

わかりづらいと思いますので、

実例を書きます。




クラス Personageというフィールドに@Vetoableアノテーションを付与しました。

これによって、値変化を検出することができるようになります。

その後の部分、person.vetoableChange = {//do something}の部分で処理を記述します。

ちょっと前に書いてある部分の

Person.metaClass.define {// define something}

誕生日メソッドを追加しているだけです。


で、実行結果が次のとおりです。



見事、ageの値変化によって、処理を実行させることができました。

なお、もっと興味のある方はこちらを御覧ください。


JavaFXでこれ使えないかな…


というわけで、値変化に応じて処理を実行させてUIの表示を変えられないか、

そんなことを考えてみました。


とりあえず、テキストフィールドに値を入力して、

ラベルが変更されるような簡単なアプリケーションを

作ってみたいと思います。


とりあえず、Scene Builderで、

テキストフィールドとラベルがあるような

画面を作ります。




で、作りたいのは、テキストフィールドに入力すると

左下のラベルには同じ文字列、

右下のラベルには挨拶文がでるようなアプリケーションです。




さて、AnchorPaneにコントロールを貼り付けたら、

AnchorPaneにコントローラーを割り当てます。




次に、テキストフィールドにイベントメソッドを割り当てます。




それから、使うテキストフィールドやらラベルやらにfx:idを割り当てておきます。



こうして、Scene Builderでfxmlを作成すると、

@FXMLアノテーションによって

コントローラークラスに自動的にインジェクションされます。





で、モデルになっているクラスはこちら。





コードの概要



コントローラークラスのメソッドinitializeメソッドは、

fxmlファイルを読み込んだ時点で実行されるメソッドです。

そのメソッドにおいて、

@Vetoableを割り当てたPersonクラスを

インスタンス化して、さらにvetoableChangeを割り当てます。


また、テキストフィールドでキーがリリースされた後に呼び出される

keyReleasedメソッドにおいてPersonインスタンスの

Vetoableなフィールドnameの値を変更します。

そして、その結果を左下のラベルに、

vetoableChangeで実行された結果を右下のラベルに

それぞれ反映します。


実行結果



では、こいつを実行してみましょう。




なんか、かわいげのない画面です。

テキストフィールドに文字を入力してみます。






いい感じにラベルに文字列が反映されていますね。


これ何がうれしいの?



先ほどのinitializeメソッドでは

  • Personをインスタンス化
  • personの値変化を付与

という処理をしていますが、

言ってしまえばこれらの処理は、全部Personにさせるべきなんです。





そうすると、コントローラーはより単純な記述になります。





そして、この振る舞いについて、テストを書くことができます。





テスト実行






テストしづらいと思っていたJavaFXのテストが少し容易になった気がします。


こんな感じでJavaFXにGroovyを利用することで、

テストしやすくなるかもしれません。


おしまい


そんなわけで、皆さんもGroovyでJavaFXをやってみてはいかがでしょうか。

明日は2巡目の@skrbさんです。よろしくおねがいします。