2015 in Plan
2015年。新しい年が始まりました!!(((o(*゚▽゚*)o)))
去年を回顧し、今年の目標を立てたいと思います。
Keep
"変"
- 早起き
- ダイエット
"楽"
- コミュニティ活動
- 遊び
去年立てた目標の"変"については、それなりに上手くいったと思います。朝の活動やダイエットを通した体調管理については今年も継続したいと思います。また、やっぱり"楽すること"を考えて効率化する事は大事ですし、"楽しむこと"は人生の活力ですね!今年もたくさんの"楽"に恵まれるよう積極的に行動したいと思います!
Problem
"流"
- 勉強方法
"生活習慣"
- 睡眠時間
"流"についてはアウトプットを重視する意味で立てたのですが、インプットに偏っていました。これについては改善して行きたいと思います。
また、去年は早起きのせいで寝不足が多かったように思います。睡眠は健康の要です。早寝を心がけたいと思います。
Try
さて、今年の目標です。今年の目標は3つ。"計", "創", "外"。
計
『十分に終わりのことを考えよ。まず最初に終わりを考慮せよ。』(レオナルド・ダ・ヴィンチ)
計は計画・計測の意味です。去年は行き当たりばったりの行動が目立ちました。今年は目標を定めて計画立てて行動し、行動を計測していきたいと思います。また、そもそも見積もりやマネージメント能力が個人的に不足していると思います。今まで自分はマネージャーにはならないからと避けていたスキル分野ですが、マネージャになるならないはともかく、そういったスキルを勉強することは人生の糧になりますので、マネージメントスキルの向上も視野に入れて行動していきたいです。人生のWBSでも作るかなww
具体的には、
- 向上させたいスキルの選定と、それに伴う読書本の選出
- プロジェクトマネージャ試験の受験。できれば取得
- 個人プロジェクト(モノ作り)の計画
を計画して行動して行きたいと思います。
創
『私は自分に作れないものは、理解できない。』(リチャード・ファインマン)
去年はアウトプット駆動で頑張ろうと思いましたが達成出来ませんでした。今年は具体的に何かモノ作りをして行きたいと思います。作ることで自信も理解もついてくることは多いと思います。モノ作りを通して、もっとコードの読み書きを増やしたいですね。まだ具体的に何を作るかは決めていませんが、個人プロジェクトの立ち上げを頑張りたいですね!
外
『The limits of my language are the limits of my world.(あなたの言語の範囲はあなたの世界の範囲でもある。)』(Ludwig Wittgenstein)
はい、外国語です。具体的には英語です。英語の読み書きは今後の必須スキルですしね。。苦手とかは言ってられないので、継続的にやっていこうと思います。
具体的には、英検3級、そして2級を目指したいと思います。高校レベルの読み書き、ヒアリング能力を目指したいな〜
以上が2015 in Plan です。
がんばるぞい!
2014 in Action
2014年もあとわずか。思えばツラい事も楽しい事も多い一年でした。総じて見ると、とても濃い一年だったと思います。
今年のはじめに2014年の計画を立てました。
テーマとして、「流」「変」「楽」
それぞれどうなったかを振り返ってみたいと思います。
流
出来るだけアウトプットを多めにしたいと考えて行動したつもりでしたが、やはりインプットに偏った気がしています。その結果、書評の記事が多かったですね。
【献本駆動】「Play Framework2 徹底入門」を読んだよ! - シスアーキ in はてな
DevOps時代の必読本?「チーム開発実践入門」を読んだよ! - シスアーキ in はてな
アジャイルAPI設計時代の到来!?APIデザインの極意を読みました。 - シスアーキ in はてな
生まれ変わったJava !? 『Java SE 8 実践プログラミング』を読みました!! - シスアーキ in はてな
アウトプットとしてはスライドが多かったです。
来年は今年の反省を活かし、アウトプットをメインで心がけるようにしたいと思います。特に、コードを読む・書く、モノを作る、計画的な読書、などを心がけたいですね。
変
自分でどう感じるかはともかく、周りからは「変わった」とよく言われました。個人的には、朝の早起きとダイエット出来たのが良かったです。ただ、変わるのは良いことばかりではなく、悪いこともあると感じました。僕が変わると、周りの人間関係も変わりますしね。ただ、僕が変わらなくても時代は変わります。来年も今年と同じく変わって行きたいと思います。出来れば、良い方向に変わりたいものですね^^
楽
楽しかったかな〜?ww ツラい事も多かったですねw
でも、楽しい事、いっぱいありましたよ!
Scala Matsuri 2014に参加しました! - シスアーキ in はてな
hoge駆動忘年会 in Action - シスアーキ in はてな
あと、記事にはしていないけど夏のBBQも楽しかったし、みんなとの飲み会とか楽しかった!
個人的には離島とかしまなみ海道と行けなかったのが残念。来年は行きたいな。ドラクエXも全然やっていないやw
まとめ
いろんな人に支えられ、なんとかやって来れた一年でした。本当に僕によくしてくれた人達に感謝したいと思います。来年はもっと良い年にしたいし、大事な人達を幸せにしたいと思います。
みんなありがとうな!来年もよろしくお願いします〜
2014年、バイナリ〜( ´ ▽ ` )ノ
hoge駆動忘年会 in Action
hoge駆動忘年会に行ってきました!!!
今回は異例の大人数の忘年会でした。
お昼ご飯
お昼ご飯に鶴橋で焼肉食べたけど、上手かったです^^
うまーい!(((o(*゚▽゚*)o))) pic.twitter.com/N0Jp6qwpoL
— こざけ (@s_kozake) 2014, 12月 28
@Kuchitama pic.twitter.com/wEDxKhaC6Y
— クソリプ野郎 (@tan_go238) 2014, 12月 28
@plum_shiga @tan_go238 まだ飲んでる pic.twitter.com/ZuOzt42ILm
— だいくしー (@daiksy) 2014, 12月 28
ビール上手すぎて2杯飲んじゃったw
忘年会までの暇つぶし
夜の忘年会までちょっと早く集まってしまったので、暇つぶしに各自LTをしました!僕の発表資料はこちらです。
ゆるふわアーキを支える技術 #hogedriven http://t.co/aA6d1Sdaul @SlideShareさんから
叩かれまくった資料をアップしました!
#hogedriven
— こざけ (@s_kozake) 2014, 12月 28
暇つぶしのLTなのに、フルボッコされましたww。Groovy界隈怖い。この資料はJavaをやっている若い人向けに作りました。周辺技術を学ぶとレバレッジが効くし、勉強したほうが楽だし楽しいよ!って意味を込めて作りました。まあ、やっつけな感じがする資料ですけどねw
みなさん濃い発表が多かったですが、一番印象に残ったのは乙女部のみなさんですね。
俺は一体だれの紹介をされているんだ。。。#hogedriven
— こざけ (@s_kozake) 2014, 12月 28
この人達さっきから何を言ってるんだ… #hogedriven
— だいくしー (@daiksy) 2014, 12月 28
乙女部の自己紹介と聞くと身構えるようになった #hogedriven
— クソリプ野郎 (@tan_go238) 2014, 12月 28
あと、どうも会場にはたまたま 、里の者が多かったみたいです。
結果発表です #hogedriven pic.twitter.com/pcCluvN6PG
— こみ@おねーさま (@kkomikt) 2014, 12月 28
イマキクというサービスらしいですが、面白かったです。
忘年会
ふぐうま〜!!!!!
ふっふっふ( ̄▽ ̄) pic.twitter.com/9zcQ89XMbG
— こざけ (@s_kozake) 2014, 12月 28
ひれ酒だ〜(((o(*゚▽゚*)o)))
うまそー(≧∇≦) pic.twitter.com/ixoNqEh5BR
— こざけ (@s_kozake) 2014, 12月 28
きたー(((o(*゚▽゚*)o))) pic.twitter.com/BHG6dbIjaA
— こざけ (@s_kozake) 2014, 12月 28
ピクピクしてる!! pic.twitter.com/xZQAsOMqhE
— こざけ (@s_kozake) 2014, 12月 28
たろうさんと一緒やで! pic.twitter.com/W9ShA7oYi5
— こざけ (@s_kozake) 2014, 12月 28
忘年会2次会
雨も降っており、2次会の店探しに困っていたのですが、きのこさんの神対応でOsakan Space をお借りすることが出来ました!もう一人のきのこさんとも合流出来て、めちゃくちゃ楽しかったです!!
感想
今日は凄い楽しかった
僕は幸せだ*・゜゚・*:.。..。.:*・'(*゚▽゚*)'・*:.。. .。.:*・゜゚・*
皆さん本当にありがとうございます!!
楽しかったです!!
#hogedriven
— こざけ (@s_kozake) 2014, 12月 28
AndroidでJavaFXを動かしてみたよ!
この記事は JavaFX Advent Calendar 2014 23 日目の記事です。
JavaFX Advent Calendar 2014 - Adventar
JavaFXはSwingに代わるJavaの新たなクライアントサイド技術です。そして現在のクライアントサイドの主流端末はタブレットですね。
そこで、JavaFXをタブレット上で動かすことに挑戦しました!
JavaFXをAndroidで動かす為に使用した技術は『JavaFXPorts』です。
http://javafxports.org/page/home
『The true spirit of Write Once, Run Anywhere.』
とサイトに記載があるように、JavaFXをAndroidやiOSで動かせるようにするのが目標のようです。
JavaFXPortsの詳細は、「What is JavaFXPorts?」をご覧ください。
動作方法は、「Getting Started」に書かれています*1。
- JavaFXアプリケーションはjar にビルドされます。ビルドされたアプリケーションはJava7、もしくはJava6のクラスフォーマットである必要があります。
- 依存する全てのライブラリは同じディレクトリに配置する必要があり、Java 6/7クラスである必要があります。
- Android SDK が必要です。
http://developer.android.com/sdk/index.html#download - JavaFXPortsでは、Android Gradle pluginを使用します。APIバージョンは最新の21で、ビルドツールは21.1.1です*2。
- JavaFX Dalvik SDKをダウンロードしましょう。
https://bitbucket.org/javafxports/android/downloads
僕が検証に使用したのは、本日時点で最新の「dalvik-sdk-8u40-ea3.zip」です。
開発端末はMBPを用いました。
環境によりますが、動作するまでには色々なエラーを踏むと思います。まずは、ダウンロードしたdalvik-sdkにある、samplesのHelloWorldを動かすのを目標にしましょう。
ダウンロードしたDalvik JavaFX SDKとAndroid 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
./gradlew installDebug
タブレットで動かす事ができました!
ボタンを押すと、ラベルが変わります。
もし、ビルドでエラーが発生した場合は、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");
・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も表示できました!
・Binding
TextArea shipping = (TextArea) root.lookup("#shipping");
TextArea billing = (TextArea) root.lookup("#billing");
billing.textProperty().bindBidirectional(shipping.textProperty());
上と下のテキストエリアの入力がバインディングで機能することも確認できました!
無事、動きました!!!(((o(*゚▽゚*)o)))
まだまだ日本語入力まわりが弱かったり、動作ももっさりしています。
グラフで日本語を表示しようとしたらダメでした。Fontのロードに失敗しているみたい。
また、どうやって内部DB(SQLite)にアクセスするのかなども分かっていません。
ただ、現状でそこそこ動くみたいですし、将来的にどうなるかが楽しみですね。
検証に使ったソースはGithubに上げていますので、参考にしてください。
https://github.com/kozake/androidFX
明日は orekyuu さんの「JavaFXで夢のCanvasライフ」です!
『あの記事』をKotlinで書き直してみた!
この記事は Kotlin Advent Calendar 2014 18 日目の記事です。
Kotlin Advent Calendar 2014 - Adventar
最近、落ち込んでいます。。
というのもある記事 を書いたけど、当人の反応はイマイチだし、みんなからはダメだしされるし。
こざけさん……出だしがひどすぎる…w / 『しょぼちむにおごって僕が金欠になるかどうか』をプログラミングしてみた! - シスアーキ in はてな http://t.co/RKJ1fkaYrx
— だいくしー (@daiksy) December 4, 2014
なぜなのか 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を巡る」です!
*1:それじゃない
*2:この記事は Kotlin Advent Calendar の記事です。しょぼちむ Advent Calendar ではありません。
生まれ変わったJava !? 『Java SE 8 実践プログラミング』を読みました!!
みなさん!Javaで開発してますか〜!!
2014年3月に正式リリースされたJava 8 ではラムダやストリーム、平行処理の機能強化に加えて、JavaFXやNashorn JavaScriptエンジンなど、様々な興味深い機能が追加されました。昔からJavaに携わってきた人間としては、本当に幅広く実用的な言語になったな~と思います。僕の書斎のJava関連本も大分増えました!
今後はJava 8 を用いた開発プロジェクトも増えてくるでしょう*1。そこで、Java 8 関連の技術を習得すべく、『Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング』を読みました!
Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング
- 作者: Cay S. Horstmann,柴田芳樹
- 出版社/メーカー: インプレス
- 発売日: 2014/09/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
本書の特徴としては、まえがきに書かれているとおり、既にJavaを習得している技術者が手短にJava 8 の機能を網羅的かつ簡潔に学習することを主眼としています。
この本では、すでにJavaをよく知っているプログラマーに対して、Java 8の多くの新機能を簡潔に説明します。(p.xi)
この本は「短気な(impatient)」スタイルで書かれています。...手短に要点を説明したかったのです。(p.xi)
必要なときにいつでもすばやく参照できるように、小さな単位で技術情報を解説しました。(p.xi)
その為、
といった方に最適な書籍だと思います。
また、コードサンプルも豊富に用意されており、各章の章末には豊富な練習問題も用意されていますので、
- 開発時にリファレンスとして参照する
- 読書会・勉強会などで活用する
などの使用方法もいいかと思います。
第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に記載されている、
- ストリームの作成
- 中間操作の指定
- 終端操作の適用
の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)
また、本章では、ラムダ式を使った一通りのプログラミング手法に加え、
について記載されています。
とあるように、ラムダ式を活用するとジェネリック型を意識することが多いです。特に関数は、入力と出力を扱うという特性上、型変位(引数型には反変、戻り値には共変)を意識する必要があります。ジェネリック型について知識が曖昧な方は、この機会に復習しておいたほうがいいでしょう*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でスクリプトを書く事が多かったのですが*11、JavaScriptでスクリプトを書く選択肢が出来たのは非常に嬉しいです。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月に公式アップデートが終了されますし。
*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:はい、モノイドですね。
*12:個人的にはPathやFilesの追加は好きではありません。Fileに加えてPathという新たな概念が誕生し、操作がFilesに分かれているからです。後方互換の関係上、仕方ないことだとは思いますが。
『しょぼちむにおごって僕が金欠になるかどうか』をプログラミングしてみた!
この記事は しょぼちむ 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]