GS Collections 道場[ハンズオン]に参加してきました!
小酒です。
昨日、GS Collections 道場[ハンズオン]に参加してきました!
久しぶりの勉強会のような気がします^^
今年4月に開催された Java Day Tokyo 2015で発表を聞いてその存在は知っていたのですが、実際に触れたのは今回が初めてでした。
GS Collectionsはゴールドマン・サックスが開発し、2012年にGitHubに公開したオープンソースJavaコレクションフレームワークです。Apache License Version 2.0で提供されており、Java 7以前でも使用できます*1!JavaのStream APIよりもより簡潔に書けることや、mutableやimmutableなコレクションインタフェースが用意されているのが好ましいと感じています。
GS Collections の説明や資料についてはconnpassのイベントページに詳しく纏まっております。興味のあるかたは、以下URLの下部にあるリンクを参照してください。
GS Collections 道場[ハンズオン][OSS コレクションフレームワーク] - connpass
ハンズオンでは、「GS Collections Kata」というゴールドマン・サックスの社内研修でも使われているトレーニングキットを用いて行いました。
Fail状態のJUnitテストを研修の中でひとつひとつパスしていきます。
仕事現場において、プロジェクトに途中参加するメンバへの各種教育はいつも悩みの種ですが、このようにゲーム感覚で楽しく学べるトレーニングキットが用意されているのは素晴らしいと感じました。
今回のハンズオンでは、インストラクターの方が壇上でライブコードしながらそのコードの説明をし、参加者がそれを写経する流れとなりました。時間の関係からの短縮手法でしたが、それでもかなりの勉強効果があるように感じました。実際に手を動かすとやはり理解の進みが違いますね!
GS Collections の楽しさや魅了を感じるには、資料を読んで実際のKata をやってみることをお勧めします。そのハンズオンの中で、僕が一番興味の湧いたコードを一つ紹介してみたいと思います。
次のコードは、いくつかの商品を保持するサプライヤーが存在する状況で、商品名をキーにその商品を保持するサプライヤーの一覧を保持するMapを作成します。
仕様が分からない状況で、上のコードを読むのは少々骨が折れると思います。これをGS Collectionsを用いると、次のコードとなります。
mapOfItemsToSuppliersByGSCollections
groupByEachメソッドを用いることで、シンプルに書けます。一度このメソッドがどのような操作を提供するかを知れば、次からは同じようなロジックを簡潔に表現できるようになります!このようにアルゴリズムの再利用がより促進されるのが、Java8 ラムダがJavaにもたらした福音だと個人的に考えています。
なお、上のコードをStream APIで書いてみると次のとおりとなります。
Tupleは自作しました。SupplierのStreamをflatMapで商品名をFirstとするTuple<String, Supplier>のStreamに変換して、collectでgroupingBy。その中でTuple<String, Supplier>のリストをSupplierのリストに変換する。。
う〜ん、ややこしい^^;
これならStream APIを使わずに書いた方が可読性がいいと判断してしまうかもしれません。
この一例からも分かるように、GS CollectionsにはStream APIにはない様々な機能が備わっております。今後Javaのバージョンが上がるにつれ、このような機能がStream APIにも備わってくるでしょう。
いち早くStream APIの未来に触れたみたいで、とても充実した一日でした!
インストラクターの伊藤さんとチューターの佐野さんをはじめ、関係各位のみなさん、本当ありがとうございました(((o(*゚▽゚*)o)))!!
その後は懇親会でビールを飲んで、二次会でもガンガン飲んで、めちゃくちゃ楽しかったです!!今日は昼間までくたばってましたがww
(追記)
このブログを公開した後、@backpaper0 さんからコメント頂きました!
@s_kozake Stream APIを使う例、考えてみました https://t.co/Phex9pSMuG
— うらがみ (@backpaper0) 2015, 6月 14
Stream APIは便利なCollector生成メソッドを作るのがキモっぽい。
— うらがみ (@backpaper0) 2015, 6月 14
https://gist.github.com/backpaper0/59bf51b8c1d8804c3611
このように、独自でCollectorを実装すると、Stream APIでも簡潔に処理を記述できますね!
ただ、その後、@bitter_fox さんとのやりとり
@backpaper0 @s_kozake 細かい話ですがCollector.ofの3つ目引数よくないですね・・・多分,並列で実行した場合一部のデータが欠落しちゃう可能性があります.
— bitter_fox (@bitter_fox) 2015, 6月 14
@backpaper0 @s_kozake (基本的にはMap<K, List<V>>同士の結合は重たいので,並列向けには一つのj.u.cのMapに突っ込むという形がベストですが・・・)
— bitter_fox (@bitter_fox) 2015, 6月 14
Collectorクラスには独自のCollectorクラスを作成するofメソッドが用意されています。
- 第一引数に新たなインスタンスを作成するサプライヤー(ここではHashMapのコンストラクタ)
- 第二引数にオブジェクトに要素を追加するアキュムレータ
- 第三引数に2つのオブジェクトを1つのオブジェクトへとマージするコンバイナ
を指定します*2
ここでの例では、コンバイナにputAllを使っているので、同じキー同士の場合にリストの結合が必要な処理が抜けているというのが@bitter_fox さんの指摘だと思います。
本来であれば、Map<String, List>の結合は重いので、1つのConcurrentHashMapで全て出来ればいいのだけどって話も続いていますが、Collectorがそのような考えでは作られていないのかもです。せめて、リストの追加は処理の重いArrayListよりLinkedListを用いたほうがいいかもとか、そのようなことを考えました。
Collectorを生成する場合は、並列動作について問題なく動作する仕組みを考える必要があります。まあ、そのようなコードは総じて難度が高くてミスを犯しやすいので、やっぱり標準メソッドで用意してくれたらな〜^^; って考えちゃったり。
まあ、パラレルストリームなんて業務で使わry)
*2:更なる情報はJava SE8 実践プログラミングのp.42に詳しく書かれています。
Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング
- 作者: Cay S. Horstmann,柴田芳樹
- 出版社/メーカー: インプレス
- 発売日: 2014/09/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (8件) を見る
Sping Boot キャンプに入隊してきました!!
【脱初心者】Spring Bootキャンプ【ハンズオン】 - connpass
入隊してきました^^
ハンズオン資料はこちらに公開されています。
Spring Bootキャンプ ハンズオン資料 — Spring Bootキャンプ ハンズオン資料 1.0.0-SNAPSHOT ドキュメント
とても面白い内容かつ丁寧に書かれているので、Sping 初心者でも十分楽しめると思います。かくいう私もSpring 初心者でしたが、なんとかなりました!
お約束的な「Hello World」から始まり、OpenCVの用意、JMSを用いた非同期処理にWebSocket、最後はWebRTCを用いたカメラとの連携と、作る楽しさを久しぶりに感じたように思います。
個人的には、OpenCVで遊んでる時が一番楽しかったようなww
「僕は酔ってない!ww」などと容疑者は意味不明の言動を繰り返しており
#kanjava_sbc pic.twitter.com/z7RVMQgmhv
— こざけ (@s_kozake) 2015, 3月 7
7章のSTOMP over WebSocketのところは資料だけでは分かりづらかったのですが、説明を聞いて理解出来ました。やっぱり説明があるとないとでは全然違いますね。
当日は9章までしか進めなかったので、どこかで10章、11章を進めてDockerで遊んでみたいと思います。
懇親会も面白かったです。懇親会では@making さんが作っている「terasoluna.org」の存在を知れたことが大きな収穫でした!この資料は本当に凄い!
懇親会ではLTやるって話を2日前に聞いたので、前日にあわててLT資料を作成して発表しました。ほとんど誰も作ってなかったしwww
まあ、内容はフルボッコでしたよ^^;
本当に楽しかったし、まわりの皆の実力にまたまた凹む勉強会でしたw
またやりたいです!
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 ではありません。