シスアーキ in はてな

シスアーキ(自称)の技術ブログ

AndroidでJavaFXを動かしてみたよ!

 << 22日目 24日目>>

この記事は JavaFX Advent Calendar 2014 23 日目の記事です。


JavaFX Advent Calendar 2014 - Adventar

 

JavaFXはSwingに代わるJavaの新たなクライアントサイド技術です。そして現在のクライアントサイドの主流端末はタブレットですね。

そこで、JavaFXタブレット上で動かすことに挑戦しました!

JavaFXAndroidで動かす為に使用した技術は『JavaFXPorts』です。

http://javafxports.org/page/home

 

『The true spirit of Write Once, Run Anywhere.』

とサイトに記載があるように、JavaFXAndroidiOSで動かせるようにするのが目標のようです。

JavaFXPortsの詳細は、「What is JavaFXPorts?」をご覧ください。

今回はAndroidタブレット上での動作に挑戦しました!

 

動作方法は、「Getting Started」に書かれています*1

 

僕が検証に使用したのは、本日時点で最新の「dalvik-sdk-8u40-ea3.zip」です。

開発端末はMBPを用いました。

環境によりますが、動作するまでには色々なエラーを踏むと思います。まずは、ダウンロードしたdalvik-sdkにある、samplesのHelloWorldを動かすのを目標にしましょう。

ダウンロードしたDalvik JavaFX SDKAndroid SDKのパスをlocal.propertiesに記述してあげれば、それで準備OKです。

(例)

sdk.dir=/Applications/adt-bundle-mac-x86_64-20140702/sdk
javafx.dir=/Users/s_kozake/dalvik-sdk/dalvik-sdk-8u40-ea3 

 

そして、Androidタブレットをコンピュータに接続して、

./gradlew installDebug

タブレットで動かす事ができました!

f:id:kozake:20141222122119p:plain

 

ボタンを押すと、ラベルが変わります。

f:id:kozake:20141222122129p:plain

 

もし、ビルドでエラーが発生した場合は、stacktraceオプションをつけてエラー内容を

参照して対処してください。

./gradlew installDebug --stacktrace

 

ビルドは成功して、タブレットにアプリケーションはインストールされたけど動作しない場合は、logcatでログを表示してエラー内容を確認できます。

{sdk.dir}/platform-tools/adb logcat


もちろん、ボタンを押せただけだと何も面白くありません!

JavaFXの色々な機能を簡単に試してみました!!


・WebView 

WebView browser = (WebView) root.lookup("#browser");
WebEngine engine = browser.getEngine();
engine.load("http://google.com");

twitterも見れました!*3

f:id:kozake:20141223072527p:plain


・Chart

ObservableList<PieChart.Data> pieChartData =
  FXCollections.observableArrayList(
    new PieChart.Data("No Money..(; ;)", 0.7110),
    new PieChart.Data("I have a lot of Money!!(((o(^ ^)o)))", 0.2790),
    new PieChart.Data("Etc", 0.01)
);

PieChart chart = (PieChart) root.lookup("#PieChart");
chart.setData(pieChartData);
chart.setTitle("No Money or a lot of Money");

 PieChartも表示できました!

f:id:kozake:20141222122147p:plain


・Binding

TextArea shipping = (TextArea) root.lookup("#shipping");
TextArea billing = (TextArea) root.lookup("#billing");
billing.textProperty().bindBidirectional(shipping.textProperty());

上と下のテキストエリアの入力がバインディングで機能することも確認できました!

f:id:kozake:20141222122156p:plain

 

無事、動きました!!!(((o(*゚▽゚*)o)))

 

まだまだ日本語入力まわりが弱かったり、動作ももっさりしています。

グラフで日本語を表示しようとしたらダメでした。Fontのロードに失敗しているみたい。
また、どうやって内部DB(SQLite)にアクセスするのかなども分かっていません。

ただ、現状でそこそこ動くみたいですし、将来的にどうなるかが楽しみですね。

検証に使ったソースはGithubに上げていますので、参考にしてください。

https://github.com/kozake/androidFX

 

明日は orekyuu さんの「JavaFXで夢のCanvasライフ」です!

*1:若干内容が古いかもです

*2:古いAPIバージョンでは動作しませんでした。最新にしましょう!

*3:昨日食べた白子画像。うまかった!! 

『あの記事』をKotlinで書き直してみた!

<< 17日目 19日目>>

この記事は Kotlin Advent Calendar 2014 18 日目の記事です。


Kotlin Advent Calendar 2014 - Adventar

 

最近、落ち込んでいます。。

というのもある記事 を書いたけど、当人の反応はイマイチだし、みんなからはダメだしされるし。

なぜなのか  orz

さっぱり検討がつかない。。

 

うん、あれ?この記事、

Javaで書いてね?

そうか!しょぼちむはKotlinアイドルだった!

Javaなんかで書いてんじゃねえよ!

Kotlin以外で書いたからしょぼちむは怒ってたんだ! 

そww れww だww!!!!wwwww*1

なんて俺はバカなんだ。。 

ということで、Kotlinで書き直してみました!*2

 

まずは、

import kotlin.math.*

kotlin.mathパッケージをインポートすることにより、『演算子オーバロード』の機能を使って、BigDecimalリテラル値と同じく四則演算で表現できるようになります!

これで、Javaで書いていた以下の記述は、

new BigDecimal("0.3").multiply(確率)

                   ↓

new BigDecimal("0.3") * 確率 

となります。

また、

inline val String.bd : BigDecimal get() = BigDecimal(this)

と『拡張プロパティ』を用いることで、

new BigDecimal("0.3") * 確率 

                   ↓

"0.3".bd * 確率 

のように、より簡潔にかけるようにしました!

 

可能性のクラスは『データクラス』を用いることでより簡潔に!

data class 可能性<T> (val 選択肢 : T, val 確率 : BigDecimal)

 

データクラス』を用いることで、可能性の中の値を『多重宣言』で取得することも簡単になりました!

val (選択肢, 確率) = しょぼちむの正体

 

staticメソッドもKotlin M9から使える『platformStatic』で定義しました!*3

class object {
  fun とは() : List<可能性<しょぼちむ>> =
    listOf(
        可能性(バイトの女の子, "0.6".bd ),
        可能性(ようおっさん, "0.2".bd ),
        可能性(二年目女子SE, "0.1".bd ),
        可能性(おまえ誰だ, "0.09".bd ),
        可能性(まじレッドキング, "0.01".bd )
    )
}

 

醜いswitch分は値を返すことが出来る『when式』でスッキリ!

return when(選択肢) {
  しょぼちむ.バイトの女の子 ->
    // かわいい!!
    listOf(可能性(おごるよ, "0.9".bd * 確率), 可能性(割り勘, "0.1".bd * 確率))

        :
  else ->
    // お前誰だ?
    listOf(可能性(割り勘, "1.0".bd * 確率))

}

 

Kotlinのリストは、『拡張関数』でflatMapやgroupByなどのJavaのリストにないメソッドも使えます!

  val l = しょぼちむ.とは()
    .flatMap { 正体 -> 支払い.どうする(正体) }
    .flatMap { おごり -> おこづかい.のこるの(おごり) }
    .groupBy { t -> t.選択肢 }
    .map { e ->
        e.key to (e.value.fold ( BigDecimal.ZERO, { (a, n) -> a + n.確率 } )) }

 

なんということでしょう〜!

あれほど醜くかったJavaソースが見違えるように簡潔な記述になりました。

 

全体のソースはこちらです。

Kotlin Advent Calendar 2014 のソース(Main)

 

これでしょぼちむも喜んで見てくれるはずです。

 

しょぼちむ見てる〜〜?(((o(*゚▽゚*)o)))

 

なお、結果はやっぱり金欠でした。

[(金欠だ~ヽ(;▽;)ノ, 0.7110), (金ならあるんだ!!(((o(*゚▽゚*)o))), 0.2790)] 

 

明日は plum_shiga さんの「世界のKotlinを巡る」です!

生まれ変わったJava !? 『Java SE 8 実践プログラミング』を読みました!!

みなさん!Javaで開発してますか〜!! 

2014年3月に正式リリースされたJava 8 ではラムダやストリーム、平行処理の機能強化に加えて、JavaFXやNashorn JavaScriptエンジンなど、様々な興味深い機能が追加されました。昔からJavaに携わってきた人間としては、本当に幅広く実用的な言語になったな~と思います。僕の書斎のJava関連本も大分増えました!

f:id:kozake:20141206143512p:plain

今後はJava 8 を用いた開発プロジェクトも増えてくるでしょう*1。そこで、Java 8 関連の技術を習得すべく、『Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング』を読みました!

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

 

本書の特徴としては、まえがきに書かれているとおり、既にJavaを習得している技術者が手短にJava 8 の機能を網羅的かつ簡潔に学習することを主眼としています。

この本では、すでにJavaをよく知っているプログラマーに対して、Java 8の多くの新機能を簡潔に説明します。(p.xi)

この本は「短気な(impatient)」スタイルで書かれています。...手短に要点を説明したかったのです。(p.xi)

必要なときにいつでもすばやく参照できるように、小さな単位で技術情報を解説しました。(p.xi)

その為、

  • 業務でJava 8 を使うことになったから、Java 8 の新機能を抑えたい
  • 今後の為に、とりあえず一通りJava 8 の機能に触れてみたい

といった方に最適な書籍だと思います。

また、コードサンプルも豊富に用意されており、各章の章末には豊富な練習問題も用意されていますので、

  • 開発時にリファレンスとして参照する
  • 読書会・勉強会などで活用する

などの使用方法もいいかと思います。

 

第1章ではラムダ式、第2章ではストリームAPI、第3章ではラムダ式を使ったプログラミング、そして第6章ではラムダ式と関連の深い並行処理の機能強化について記載されています。 まず、ラムダ式周りの機能を習得したい方は、第1〜3章と、第6章を読めばいいでしょう。

第5章では日付と時刻の新たなAPI、第8章ではその他のJava 8 機能について記載されています。Java 8 を用いた開発を行う場合は、こちらも読んでおいたほうがいいと思います。

第4章にはSwingに変わる新しいGUIとしてJavaFX、第7章はRhinoに代わる新しいJavaScriptエンジンのNashornについて記載されています。この章は興味に応じて読めばいいかと思います。

また、Java 7 で追加された機能の復習が、第9章に記載されています。Java 7 で機能拡張された内容を記載している書籍は少ないので嬉しいですね。

以下、 各章の内容を僕の感想交えて紹介します。

 

第1章 ラムダ式とは

第1章では、ラムダ式とインタフェースのデフォルト実装について記載されています。ラムダ式は、関数型インタフェース*2の無名実装の簡易構文(シンタックスシュガー)と考えると分かりやすいですが、実際のそれとは微妙に異なります。例えば、

ラムダ式の本体は、ネストしたブロックと同じスコープを持ちます。(p.17)

その為、ラムダ式とインタフェースの無名実装ではthisの扱いが異なります。また、Java 8 ではインタフェースにデフォルト実装を持つことが出来ます*3*4。これにより、

デフォルトメソッドは、CollectionとAbstractCollecction、あるいは、WindowsListenerとWindowsAdapterといった、インタフェースとそのインタフェースのほとんどすべてのメソッドを実装している抽象クラスを提供するという古典的なパターンに終止符を打つことになります。(p.19)

とあるように、既存の(慣れ親しんだ)API設計手法が変わります。古いJavaしか知らない方については、まずは第1章に目を通すだけでも、Javaに対する認識が大分変わってくるのではないかと思います。

 

第2章 ストリームAPIの使い方

第2章では、ストリームAPIの使い方が説明されています。

ストリームは、Java 8で導入された重要な抽象化概念です。(p.27)

とあるとおり、Java 8 を使いこなすには、ストリームの考え方をしっかり理解することが重要です。ストリームついては、p.29に記載されている、

  1. ストリームの作成
  2. 中間操作の指定
  3. 終端操作の適用

の3段階の操作でパイプラインを設定するという説明が分かり易かったです。

ストリームは最近の流行である、関数型プログラミングの概念を取り入れられて設計されています。本書では、

ストリーム以外のクラスにもflatMapメソッドがあるのを発見するかもしれません。それは、コンピュータサイエンスにおける一般的な概念です。...flatMapを使用して、最初にfを適用し、それからgを適用します。これは、モナド(monads)理論の重要な考えです。しかし、心配する必要はありません。モナドについて何も知らなくてもflatMapは使えますから。(p.33)

 とあるように、関数型プログラミングに対して深くは言及していません。

また、Optional型についてもこの章に記載されています。Optional型は値をnull安全に扱う為の重要なプログラミング技法です*5。今後のJavaフレームワークやライブラリでは、値がない可能性があるものは、nullではなくOptional型として取り扱われていくことになるでしょう。また、APIデザインを自分で設計する際には、そのように設計することが重要となります。

そもそもなぜOptional型がストリームAPIの章に記載されているかというと、Optiona型はストリームとして捉えることが出来るからです。

オプション値を大きさ0か1のストリームだと単純に想像してください。その結果は、大きさが0か1であり、1の場合に関数が適用されています。(p.38)

第2章を理解するだけで、Java 8 のストリームを十分使えるレベルになると思います。ただ、僕個人としては、関数型プログラミングは別途違う書籍で勉強したほうがいいと思います。というのも、最近の言語は関数型プログラミングのエッセンスを取り入れていますし、それを勉強することでストリームの理解がより深まると思うからです。

 

 第3章 ラムダ式を使ったプログラミング

 第3章ではラムダ式と関数型インタフェースを活用したプログラミング手法について記載されています。出てくる用語として、「遅延実行」「関数のパラメータ」「関数を返す」「合成」と、より関数型プログラミング色が強い章となっています。

 関数型プログラミング言語では、関数はファーストクラス・シティズン(first-class citizen)です。つまり、メソッドに数値を渡したり、数値を生成するメソッドを持つことができるように、引数や戻り値を関数にできるということです。これは、抽象的に聞こえますが、実際には非常に役立ちます。ある意味、Java関数型プログラミング言語ではありません。なぜなら、関数型インタフェースを使用するからです。しかし、原則は同じです。(p.65)

ラムダ式を使ったプログラミングでは、差分プログラミングが主流となると思います。つまり従来の手続き型言語とは異なり、制御の反転(Inversion of Control)の中で、「どのように処理するか」ではなく「何がしたいか」の差分をラムダ式で記述する機会が多くなるでしょう。

関数型インタフェースとして操作を表現する場合には、呼び出し側は、処理の詳細を制御することをあきらめます。(p.70)  

また、本章では、ラムダ式を使った一通りのプログラミング手法に加え、

 について記載されています。

一般に、ラムダ式は、ジェネリック型と相性がよいです。(p.74)

 とあるように、ラムダ式を活用するとジェネリック型を意識することが多いです。特に関数は、入力と出力を扱うという特性上、型変位(引数型には反変、戻り値には共変)を意識する必要があります。ジェネリック型について知識が曖昧な方は、この機会に復習しておいたほうがいいでしょう*6

 

第4章 JavaFXによるGUIプログラミング

本章ではJavaFXによるGUIプログラミングを一通り説明しています。

JavaFXだけでおそらく1冊の本が出来てしまうので、本章で全てを学ぶのは難しいと思います。ただ、触りとしては十分な内容でしょう。特にバインディングはMVVMを用いた設計では重要な技術となりますので、知らない方はバインディングの楽しさに触れてみるのがいいかと思います。

また、JavaFXに関しては、開発ツールのScene Builderがとても優れているので、一度ダウンロードして試してみるといいかと思います*7

 

第5章 日付と時刻の新たなAPI

時刻は絶対基準のある値(ある特定の時間からどれくらい経過したか)でありながら、歴史、宗教、機械の制限、地球の揺れによる誤差やロケーションの違いなどから、正しく扱うのがとても難しいデータとなっています。

Java ではこれまで、Date、Calendarクラスで時刻を現していましたが、閏年サマータイムなどの問題を取り扱うことが出来ませんでした。そこで、Java 8では新たなAPIが用意されました。この章では、そのAPIの詳しい説明がされています。

  • ある時点を現すInstant
  • 二つの時間の差を現すDuration
  • タイムゾーン情報を持たないLocalDateTimeと持つZonedDateTime
  • SimpleDateFormatに代わる日付フォーマットクラスのDateTimeFormatter

などなど。

また、古いコードとの相互運用についても「5.7 古いコードとの相互運用」に記載されておりますので、リファレンスとして用いやすい章となってます。2000年問題に携わった人間としては、このようにAPIがあの時あればな〜と想いを馳せます。

 

第6章 並行処理の機能強化

Java 8 はラムダ式ばかり取り上げられることが多いように思いますが、そもそもラムダ式が導入された背景には、「マルチコアに対応して、効率よく平行プログラミングできるように」という目的があります*8。本章では、平行処理の機能強化について記載されています。

この章を読むには、スレッドや並行処理の基本が分かっていないと辛いでしょう。本章では、ラムダ式を用いたサーチ(search)や畳み込み(reduce)の話が出てきます。例えば、畳み込みでは順序に左右されない累積関数の重要性などが記載されています。

一般に、操作は、結合的(associative)であり、可換(commutative)です。すなわち、最終結果は、中間の値が組み合わされる順序に依存していないということです。(p.142) 

デフォルト値は、累積での中立要素*9でなければなりません。(p.149) 

つまり、累積関数funcは、

  • func( 中立要素, x ) の結果は、 x と等しい
  • func( x, 中立要素 ) の結果は、 x と等しい
  • func( func(x, y), z ) の結果は、 func( x, func(y, z) ) と等しい

ことを満たす必要があります*10。 

ストリームを並列化しても、それが正常な結果を返すかどうかはプログラマーの責任となります。僕は本章を読んだだけですが、どこかのタイミングで実際に大量データを用いた並行処理の実験をしてみたいと思いました。

また、完了可能フューチャーを用いた非同期操作やその合成方法についても記載されています。CPUを効率よく活用して、大量トランザクションを処理するには、フューチャーを用いたプログラミング技法もますます必要性を帯びていると思います。

 

第7章 Nashorn JavaScriptエンジンの活用

Java 8ではRhinoに代わりNashorn JavaScriptエンジンが提供されました。

知りませんでしたが、Java 8にはjjsと呼ばれるコマンドラインツールが含まれているらしいです。

$ jjs

jjs > 'Hello, World'

Hello, World 

Hello, World!'.length

13

 REPL環境として、便利ですね!JavaのREPLも早く提供して欲しいです。また、

jjs -scripting

として起動することで、バッククォート内にシェルコマンドを含めることでシェルコマンドを実行することが出来るらしいです。

`ls -la`

業務ではWindows Serverを扱うことが多く、Groovyでスクリプトを書く事が多かったのですが*11JavaScriptスクリプトを書く選択肢が出来たのは非常に嬉しいです。JavaScriptから、Javaオブジェクトを簡単に扱えるのもいいですね!

一通りのNashorn JavaScriptエンジンの使い方が記載されているので、フロントサイドでも活躍するJavaエンジニアには、本章はとても楽しい内容ではないかと思います。

 

 第8章 その他のJava 8 機能を理解する

本章では、微妙に嬉しいその他のJava 8 機能を紹介しています。純粋にString.join メソッドは嬉しいですね。その他にも微妙に役立つ変更が紹介されておりますので、一通り目を通すのがいいと思います。

 

第9章 Java 7 の機能を復習する

Java 7 は、Java 8 に比べるとかなり地味なバージョンアップですので、見落としがちな便利な機能がいくつかあります。本章では、そういった機能の為の復習が用意されており、Java 7 機能を理解したい場合は、本章だけを読むというのもありだと思います。

僕が一番嬉しい機能としては、Java 7 ではFileを簡単に扱う方法が提供されました!

JavaではGroovyのようなスクリプト言語と比べて、ファイルを扱うにはとても増長な記述が必要な言語でした。Java 7 では、以下のように簡潔に書く事が可能なようになります。

for (String s : Files.readAllLines(Paths.get("/tmp", "hello.txt"))) {
    System.out.println(s);
}

 まあ、Groovyならもっと直感的に書けますが、、

println(new File("/tmp/hello.txt").text)

書籍『APIデザインの極意』にもありましたが、簡単な事を簡単に扱えるAPIを提供することは重要です。そういう機能が提供されただけでも喜ばしいです*12

また、 try-with-resources 文などは地味に便利な機能なので、知らない方はしっかり押さえておくのがいいと思います。

 

まとめ

 Javaは、Java 8 で生まれ変わりました。ラムダ式を筆頭に、Coolな拡張がされています。ラムダ式ばかりが取りざたされている印象がありますが、細部にわたって良い改善がされています。

Java 8 のバージョンアップを通じて、Javaはこれからも変わっていく、変わりつづけていけるとのメッセージを受け取ったように感じました。古いJava で知識が止まっている方、いまだJava 1.4 で消耗している方は、一度この本の1章だけでも目を通して見ればいいのではないでしょうか!

*1:Java 7は2015年4月に公式アップデートが終了されますし。

*2:単一の抽象メソッドをもつインタフェース

*3:インタフェースにデフォルト実装をもたせた理由は、既存資産への後方互換性をサポートするためです。書籍『APIデザインの極意』の6.6に発展の視点から既存のインタフェースへのメソッド追加は困難である旨が記載されています。それに対する解決策として、Javaにデフォルト実装という機能が追加されました。

*4:p.21に記載されていますが、スーパークラスメソッドとインタフェースのデフォルメソッドが衝突した際、「クラスが優先」となります。これはJava 7 とのソース互換・機能互換維持のためです。ここからも、Java後方互換を如何に大事にしているのが分かりますね。

*5:NullPointerExceptionはJavaで一番有名な例外ですからね!

*6:僕も反変と共変の知識が怪しかったので、『Java 2 Standard Edition 5.0 Tiger―拡張された言語仕様について』で復習しました。

*7:僕はInteliJ IDEAとのScene Builderの組み合わせで使ってみましたが、とてもいい感じです。

*8:訳者まえがきの最後に「マルチコア時代へ向けた新たな道具を獲得することに、この翻訳本を役立てていただければ」という記載もありますしね。

*9:数値なら0、文字列なら空文字、リストから0サイズのリストなど。

*10:はい、モノイドですね。

*11:DOSバッチを書きたくないので。。

*12:個人的にはPathやFilesの追加は好きではありません。Fileに加えてPathという新たな概念が誕生し、操作がFilesに分かれているからです。後方互換の関係上、仕方ないことだとは思いますが。

『しょぼちむにおごって僕が金欠になるかどうか』をプログラミングしてみた!

<< 4日目  6日目>>

この記事は しょぼちむ Advent Calendar 2014 5 日目の記事です。


しょぼちむ Advent Calendar 2014 - Adventar

 昨日は なかけん さんの しょぼちむを使ったお手軽WebGL体験|猫まっしぐら でした!

 

しょぼちむとは確か2回ほど会ったことがあります!可憐でかわいい女の子でしたよ^^しょぼちむとは年末の忘年会でも会う予定だから、今から楽しみだ!

普段から「かわいい女の子には奢っちゃうぞ///」宣言しているから、この状況でおねだりされるとおじさん、金欠がデッドラインになっちゃうな~ww。

 

・・・

あいつ本物か?

というのも、実はネカマのおっさんで僕が会ったのはバイトの女子大生という噂も絶えません。ツイッターを見てても、可憐な女子の発言とはとうてい思えない!

お、おっさんには絶対に奢らないからな!!

やばい、結局金欠になるのか、ならんのか分からなくなってきた。

 

ということで、『しょぼちむにおごって僕が金欠になるかどうか』をプログラミングして求めたいと思います。

 

まずは可能性をあらわすクラスを用意します。世の中は選択肢で溢れています。 選択肢の型はジェネリック型にして、様々な選択型を扱えるようにします。また、選択には確率がありますので、確率を小数点*1で現します。

しょぼちむ Advent Calendar 2014 のソース(可能性)

 

 次にしょぼちむの正体とその可能性を考えます。

僕が会っていたしょぼちむはバイトの女子大生の可能性が高いです。ということは、今度の忘年会にもその子が来る可能性が高いでしょう。ってことで、確率を60%として0.6で現します。もしかすると忘年会ということで、ネカマのおっさんがくるかもしれません!ようおっさん!はたまた、実は本当は普通の二年目女子SEかもしれません。全く知らん人かも、、おまえ誰だ?

まじレッドキングだったらどうしよう。。

しょぼちむの正体の可能性をStreamで現すことにします。Streamとは遅延評価可能な値の集まり、つまりリストです。そしてリストとは非決定性を持った値の集合、つまり可能性ある値の集合なのです。

しょぼちむ Advent Calendar 2014 のソース(しょぼちむ)

 

次に支払いの可能性を考えます。支払いは「おごり」と「ごち」と「割り勘」が考えられます。バイトの子がきたらおじさん奢っちゃうかも///。おっさんがきたら、謝罪と賠償を求めます。レッドキングだったら、まじどうしよう。。

それぞれの確率にしょぼちむの正体の確率をかけることで、入力の確率に対しての割合を加味して返します。

しょぼちむ Advent Calendar 2014 のソース(支払い)

 

最後に、支払いの結果、おこづかいのダメージ具合を考えます。奢ったからといって、即金欠になるかどうかは分からないからな! (その逆もしかり)

しょぼちむ Advent Calendar 2014 のソース(おこづかい)

 

 可能性の条件は揃いました!

flatMapで処理を連結してcollectで確率を求めます。flatMapを用いることで、「ある値に対して考えうる可能性を返す関数」を連結出来るんです!*2

しょぼちむ Advent Calendar 2014 のソース(Main)

 

そして実行結果

{金欠だ~ヽ(;▽;)ノ=70.0, 金ならあるんだ!!(((o(*゚▽゚*)o)))=29.0}

 

 やばい、70%の確率で金欠やで~~。。

 

人生は選択の連続であり、選択の結果が人生です。若いというのは可能性の宝庫です。これから様々な選択をしていくことになると思います。慎重にかつアグレッシブな選択をしていき、自分が楽しいと思える人生を選択していってくださいね^^

 

若いっていいな~ *・゜゚・*:.。..。.:*・'(*゚▽゚*)'・*:.。. .。.:*・゜゚・*

 

ではこの辺で!バイナリ〜( ´ ▽ ` )ノ

 

明日は mike_neck さんの syobochim/gistにプルリクを送った結果wwwwwwwwwwwww です!

 

 

*1:金額の計算をBigDecimalで![http://togetter.com/li/738592]

*2:え、リストモナド?なにそれ、怖い、うけるww

関西Kotlin勉強会に参加したよ

関西Kotlin勉強会に参加してきました!!


関西Kotlin勉強会 on Zusaar

 

様子はここら辺をみれば分かります!


関西Kotlin勉強会やった #kotlin — 裏紙

 

関西Kotlin勉強会で発表してきたよ〜 - 算譜王におれはなる!!!!

 

KotlinでJAX-RS + おまけ

http://backpaper0.github.io/ghosts/kotlin-jaxrs.html#/

 うらがみさんの発表はKotlinでJAX-RSをやるってお話でした。

テーマを決めてその技術を検証するってのは、本当にその言語の「出来る/出来ない」がはっきりしてきていいな〜と思いました。あとうらがみさん、Kotlin詳しすぎで凄い!!

一日前にKotlin初めて触って、資料作る所だけ学んだ僕とは姿勢から違いました。。

見習いたいと思います!

JAX-RSの話が一通り終わると、Kotlinが出力するバイトコードの検証からモナドをKotlinで実装する話と、一気に参加者を置いてきぼりモードに。。うらがみさん、怖い。

別件ですが、JAX-RSのブログの更改してくれるみたいです。期待しています!!(俺得なので)

Nullなのはいけないと思います!

Nullなのはいけないと思います!

 

僕の発表です。この勉強会の前にScalaMatsuriでたろうさんと初めてお会いして、そこでLTやる宣言したので作りました。Kotlin知らないのにw

Kotlinに関しては、Nullを安全に扱える仕組みがある言語ってのは知っていて、そこが言語機能としてすごく好きだったので、そこに絞って資料作りました。

ただ、もう少しきちんと整理してお話出来るようになりたいですね。

勉強がNullなのはいけないと思います!

たろうさんの発表

たろうさんの発表。今までの資料からKotlinの面白い所の話をたくさんしてくれました!

僕は既存オブジェクトを拡張できる拡張メソッドが好きでしたね^^

また、AndroidをKotlinで実装するライブコーディングも見させて貰えましたし、大満足です。Kotlinはモダンな言語機能を備えてて、とてもいい言語だと思いました。

あと、自分のコードみて悩んでいるたろうさん、かわいかったです、本当。

懇親会

神戸で飲んで、大阪で飲んでとかなりの時間飲んでましたww

本当に楽しい時間でした!ありがとうございました!!

 

Scala Matsuri 2014に参加しました!

Scala Matsuri 2014に参加しました!

Enjoy.scala ! 日本最大級の Scala のカンファレンス - ScalaMatsuri

 

ちょっと忙しくてブログ書くのが遅れました。楽しかったです^^

今回の参加は勉強目的ではなく、Scala界隈のトップレベルの人達が集まるイベントに参加したかった、その空気を感じたかったという完全に個人的な趣向です。去年、参加出来なかったのが悔やまれたので、今年は参加出来て本当によかったです。

 Scala Matsuriの内容はニコ生で中継されていましたし、資料も公開されています。ScalaMatsuri で検索すれば、色々な記事が出てくると思うので、僕は感想だけ。この記事読んでも得るものありませんよ!!

1日目

S-1 、S-2、B-1、B-2、A-3、B-4、B-5、B-6、B-7、B-8あたりに顔を出しました。

個人的には、B-1のGitBucketとA-3のPlay vs Node.js の話が一番印象に残っています。

普段、ツイッターで絡んでいる東京勢の方とお会い出来て嬉しかったです。

GitBucketはちょっと使いたいな〜と思っていたので、ローカル環境で立ち上げてちょこちょこ触っているから余計に印象に残ったのでしょうね。また、竹添さんの話し方がとても面白かったのと、GitBucketで使っている技術とかが興味深くてよかったです。

Play vs Node.jsについては、LinkedInの中の人が色々なフレームワークを検討しているって話が面白かったです。その中でもPlayはいいフレームワークってことなのでしょう。

懇親会ではOdersky先生にサイン貰えて、写真までご一緒させて頂きました!!

とても嬉しいです。

 また、梅澤さんにPlayステッカー貰えたのが嬉しかったです!

ScalaMatsuriでは色んなステッカー貰えましたが、当分はこのステッカーのみでいこうかと思います^^

2日目

アンカンファレンスではぶらぶらしていました。

 

Skinny Frameworkのハンズオンでは、そもそも「skinny new」 が失敗して動かないw

結局は、nodeのバージョン0.11が入っていたことが悪さをしていたみたい。0.10にしたら動きました。う〜ん、なんでこんなん入ってたんだろう。

あとは、Playの翻訳作業を眺めたり、GitBucket 会議にでたり。

まとめ

ま〜、ひどい内容のブログですが、本当に今回はお祭り気分の参加でした。勉強に燃えてって訳でもなく、そもそもScala力もそんなにありませんからね。本当に勉強したいなら、家でコップ本と逆引きを読んでいたでしょうし。

雰囲気を感じたかったのですが、色々と言語化できない刺激を受けました。

とりあえず来年があるなら、もっと有意義な参加になるようScalaの勉強と英語頑張ろうと思いましたw

今回のイベントは値段を考えても信じられないくらい豪勢なイベントでした!

スタッフの皆さんは本当に大変だったと思います!

ありがとうございました!!

 

関西WildFly 8(旧JBoss AS)勉強会に参加してきました。

関西WildFly 8(旧JBoss AS)勉強会に参加してきました。

nekop さんの発表

詳細はこちら

関西WildFly 8(旧JBoss AS)勉強会でしゃべってきた - nekop's blog

 

nekopさんとは初めてお会いしたが、噂通りの背の高いイケメンな方。しゃべりも上手で天は二物を与えてずるいのである。ちょっと仕事の関係でOSSまわりのWeb Application Serverを選定中だったのだが、スライドの中でJBossの市場シェアの話などが出てきてとても参考になった。Tomcat、Jetty、WildFlyGlassFishあたりが選定対象にあがると思うが、最近のJava界隈のOSS事情を考えると、ある程度企業サポートのあるOSS製品が今後も生き残ると考えている。組織として選択結果は技術投資になるので、投資が無駄にならない製品を選びたい。ちょっとGlassFishの立ち位置がいまいちなので、そうなるとWildFlyかな〜と考えていた。当日にWildFlyを使ったデモも拝見させて頂いたが、未だ重量級なイメージのあるJavaEEサーバーとは思えないほど軽くて良さげ。また、Web Application Serverはクラスローダーまわりで毎回ハマるのだが、WildFlyではモジュールクラスローディングを採用しているので心配ないとのこと。ちょっとモジュールクラスローディングについては推移的依存関係のバージョン違いのバッティングの解決方法など、そこら辺が詳しく分からなかったが、面白そうである。文献をあさって調べていきたい。 

 backpaper0 さんの発表

詳細はこちら

関西WildFly勉強会をやった #wildflykansai — 裏紙

 

Arquilian を使ったテストの話。僕も仕事まわりでJAX-RSを検討しているので参考になった。テストに関してはどうしても後回しになってしまうが、保守・運用フェーズになるとテストがないと困ることが非常に多い。今回の開発ではそこらへんの反省を踏まえて、テスト設計もしっかりしていきたいと思う。Arquilian は使えるかもしれない。

 

おだ さんの発表

詳細はこちら

関西WildFly 8(旧JBoss AS)勉強会 でお話しさせてもらいました - お だ のスペース

 

GlassFishからWildFly8に乗り換えたお話。大変参考になる。また、実際に使ってみてほとんど問題がないというのも心強い話である。ところで、帰りに@haljik さんとも話したのだが、おださんはどういうシステムを開発しているのだろうか?WASを変更したり、バージョンUPを気軽にするとか、なかなかSI案件では難しいのだが。。謎である。

その後

勉強会に参加出来て本当によかった。みなさん、ありがとうございます!当日は家庭の事情で懇親会に参加出来なかったのが本当に残念だった。

WildFlyについては、その後も色々といじっている。WebLogicで動いている社内プロダクトをWildFlyで動かしてみたり、Jenkinsのせてみたり。特に問題は発生していない。GradleのCargo Pluginを使ってビルド&起動してうま〜ってのも出来たいので、どっかで公開したい。本当、今のところ全く問題なく使えているので、このまま問題なければWildFlyで行きたいと思う。