SlideShare a Scribd company logo
1 of 226
Download to read offline
JJUG CCC 2015 fall @yy_yank
#ccc_ab6
【こっそり始める】
Javaプログラマコーディング
マイグレーション
#ccc_ab6 #jjug_ccc
でつぶやいてください
ハッシュタグ
自己紹介
ヤンク(@yy_yank)
        こいつです
        ・JJUG、JKUGに出没
        ・vi好き
        ・でもサクラエディタicon
        ・ゆるふわSIer
        ・JavaとKotlinが好き
よーし、
JJUG CfP応募やで
www
数日後・・・
あ、メールきたで
まぁ、
「残念ながら…」的
なやつやろ
?????
それはさておき
現場のコード
どうですか?
2015年の
Javaですか?
多くは
Old Java
もしくは
カオスJava
マイグレーション
チャーンス!!
ゴゴゴゴゴゴゴゴゴゴ・・・・・・
しかし
人は争うもの
なんで変えないと
ダメなの???
…デスヨネー
よくわからん
エラい人
平和にこっそりやりたい
JJUG CCC 2015 fall @yy_yank
#ccc_ab6
【こっそり始める】
Javaプログラマコーディング
マイグレーション
・移動、移行という意味(Wikipediaより)
今回は2つのマイグレーション(移動、移行)
1.新しいJavaのコーディングスタイルへの移行
2.プログラマ自身の知識、意識の移行
マイグレーションとは
・移動、移行という意味(Wikipediaより)
今回は2つのマイグレーション(移動、移行)
1.新しいJavaのコーディングスタイルへの移行
2.プログラマ自身の知識、意識の移行
マイグレーションとは
これを「こっそり」や
る!!
・Javaの初級~中級PGとかSEとか
・プロジェクトを変えていきたいなぁって人
・Javaのスゴくない人
想定聴講者
・Java自体のversion up
(例えば、Java SE 6 -> Java SE 8など)
は完了しているものとする
・またはプロジェクトでversion upの同意
がとれているものとする
前提
・Java自体のversion up
(例えば、Java SE 6 -> Java SE 8など)
は完了しているものとする
・またはプロジェクトでversion upの同意
がとれているものとする
そこが大変なんですけどね
前提
Java SE 6 likeなもの
Java SE 7 likeなもの
Java SE 8 likeなもの
Javaマイグレーションマイルストーン
Java SE 6 likeなもの
Java SE 7 likeなもの
Java SE 8 likeなもの
今回ここまでです
Javaマイグレーションマイルストーン
Java SE 8 likeなもの
Java SE 9 likeなもの
ここまで見据えていればすばらしい
Java SE 9は来年らしいですね
Javaマイグレーションマイルストーン
うちのプロジェクト
J2SE 1.4(Java SE 4)
なんだけど…
http://builder.japan.zdnet.com/sp_oracle/weblogic/35059108/より引用
対象Javaバージョン
http://builder.japan.zdnet.com/sp_oracle/weblogic/35059108/より引用
対象Javaバージョン
2017年9月?に延長されたらしい!!
http://www.oracle.
com/technetwork/jp/java/eol-135779.html
Java SE 8以外終わってますね
対象Javaバージョン
2017年9月?に延長されたらしい!!
http://www.oracle.
com/technetwork/jp/java/eol-135779.html
・ソース互換、バイナリ互換性を保ちなが
らバージョンアップしている
・非互換については公式ドキュメント確認
の上、回帰テストしつつバージョンあげて
行けばいいんだけどなぁ
(個人の感想です)
Javaは強い後方互換性を持っている
・むしろサポート切れのもの使ってる方が
危ない気がするんだけどなぁ
・有償サポートとかどうしてますか?ええ、
なにそれ?ってなったら素直にバージョン
アップした方が良い気が
(個人の感想です)
Javaは強い後方互換性を持っている
とはいっても、
色々事情があるのは
分かります
・互換性故にオールドタイプなコーディング
が許容される
・言語の進歩に技術者がついていってな
いことがあったりする
・昔の書き方はもう出来ません!
という言語ではない
Javaの強い後方互換性ゆえに
・互換性故にオールドタイプなコーディング
が許容される
・言語の進歩に技術者がついていってな
いことがあったりする
・昔の書き方はもう出来ません!
という言語ではない
Javaの強い後方互換性ゆえに
これをなんとかしたい!
という発表です
1.現場コードを診る
2.チームメンバーのコードを診る
3.人を選ぶ
4.口コミ的に伝える
5.JUnitで示す
6.実践
アジェンダ
1.現場コードを診る->事前準備
2.チームメンバーのコードを診る->事前準備
3.人を選ぶ->マイグレーション戦略
4.口コミ的に伝える->ハウツー的なもの
5.JUnitで示す->デモ
6.実践->1〜5をやってみる
アジェンダ
1.現場コードを診る
2.チームメンバーのコードを診る
3.人を選ぶ
4.口コミ的に伝える
5.JUnitで示す
6.実践
アジェンダ
注目すべきところ
・依存ライブラリ
・アーキテクチャ
・コミットコメント
・ソース中のコメント
1.現場のコードを診る
注目すべきところ
・依存ライブラリ
・アーキテクチャ
・コミットコメント
・ソース中のコメント
1.現場のコードを診る
依存ライブラリを調べれば、大体やろうと
している事が分かる
Mavenならpom.xml
Gradleならbuild.gradle
をみて全体を俯瞰
IDE依存ならそれを見て…
1.現場のコードを診る 〜依存ライブラリ〜
pom.xmlに関してはdependencies見るだ
けで大体OK
1.現場のコードを診る 〜依存ライブラリ〜
1.現場のコードを診る 〜依存ライブラリ〜
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
build.gradleに関してもdependencies見
るだけで大体OK
1.現場のコードを診る 〜依存ライブラリ〜
dependencies {
compile 'org.apache.commons:commons-lang3:
3.3.2'
testCompile('junit:junit:4.11') {
transitive = false
}
1.現場のコードを診る 〜依存ライブラリ〜
依存ライブラリに存在するのに
直接利用する機会が無い
=共通処理などで吸収している(内部で利
用している)と推測出来る
1.現場のコードを診る 〜依存ライブラリ〜
注目すべきところ
・依存ライブラリ
・アーキテクチャ
・コミットコメント
・ソース中のコメント
1.現場のコードを診る
1.現場のコードを診る 〜アーキテクチャ〜
全体を眺める上で
・ドキュメントの確認
・エントリポイントの探索
・ライフサイクル
・使用されているフレームワーク
の確認は重要
1.現場のコードを診る 〜アーキテクチャ〜
全体を眺める上で
・ドキュメントの確認
・エントリポイントの探索
・ライフサイクル
・使用されているフレームワーク
の確認は重要
逆に言うと、
アーキテクトはこ
こを用意してい
てほしい
・原始的にpublic static void mainを探す
・スタックトレースを出してみる
1.現場のコードを診る 〜アーキテクチャ〜
エントリポイントの探索
・原始的にpublic static void mainを探す
・スタックトレースを出してみる
new Exception().printstacktrace();
※あくまでデバッグ用
1.現場のコードを診る 〜アーキテクチャ〜
エントリポイントの探索
1.現場のコードを診る 〜アーキテクチャ〜
使用されているフレームワーク
Java EEなら
・EJB、JSF、CDI
その他
Spring系(Spring MVC、Spring Web etc..)
など
1.現場のコードを診る 〜アーキテクチャ〜
使用されているフレームワーク
Java EEなら
・EJB、JSF、CDI
その他
Spring系(Spring AOP、Spring Web etc..)
など
知っていなくても、
アノテーションかクラス名で
検索すればなんとなくは分か
るはず。
事前知識としてある程度知っ
ておきたい
1.現場のコードを診る 〜アーキテクチャ〜
大体どこのプロジェクトにもあるもの
・ベースとなるフレームワーク
・ベースをラッピングしたフレームワーク
・ORM(0/Rマッパー)
・推奨されるデザインパターン
ベースとなるフレームワーク
public class ActionServlet extends
HttpServlet {
public void doGet(HttpServletRequest
request, HttpServletResponse response) {
process(request, response);
}
・・・(略)・・・
}
ベースをラッピングしたフレームワーク
public class SyanaiFrameworkServlet
extends ActionServlet {
public void doGet(HttpServletRequest
request, HttpServletResponse response) {
super.doGet(request, response);
syanaiLogic.execute();
}
・・・(略)・・・
SyanaiFrameWorkServlet
SyanaiFrameWorkAction
SyanaiFrameWorkActionForm
SyanaiFrameWorkRequestProcessor
SyanaiFrameWorkBeanUtils
ベースをラッピングしたフレームワーク
ベースをラッピングしたフレームワーク
SyanaiFrameWorkServlet
SyanaiFrameWorkAction
SyanaiFrameWorkActionForm
SyanaiFrameWorkRequestProcessor
SyanaiFrameWorkBeanUtils
※まれによくある
ベースをラッピングしたフレームワーク
SyanaiFrameWorkServlet
SyanaiFrameWorkAction
SyanaiFrameWorkActionForm
SyanaiFrameWorkRequestProcessor
SyanaiFrameWorkBeanUtils
※ここらへんのマイグレーションは
ある程度妥協、出来てプルリク。
ベースをラッピングしたフレームワーク
・社内技術の蓄積とオレオレフレームワークは表裏一
体。良くもあり、悪くもある
・オレオレフレームワークは神聖不可侵みたいな扱い
をされている事が多い
・アーキテクチャに従えという支配的な傾向が強かった
りする
ベースをラッピングしたフレームワーク
・社内技術の蓄積とオレオレフレームワークは表裏一
体。良くもあり、悪くもある
・オレオレフレームワークは神聖不可侵みたいな扱い
をされている事が多い
・アーキテクチャに従えという支配的な傾向が強かった
りする
だからこそ、ここを改善していくのは
難易度が高い
注目すべきところ
・依存ライブラリ
・アーキテクチャ
・コミットコメント
・ソース中のコメント
1.現場のコードを診る
1.現場のコードを診る〜コミットコメント〜
・コメントというより、ヒストリー
・眺めて行くと思想や文化、修正・改修の
背景が見えてくる
・実装に関してのステークホルダーとかも
分かる
注目すべきところ
・依存ライブラリ
・アーキテクチャ
・コミットコメント
・ソース中のコメント
1.現場のコードを診る
1.現場のコードを診る 〜ソースコメント〜
・TODOコメント
・FIXMEコメント
・その他ソース中のコメント
このあたりを見ると潜在的に抱えている問
題が分かる
1.現場のコードを診る 〜ソースコメント〜
// TODO 文言変更
String message = “不正なエラー”;
// FIXME 不具合があるため一旦コメントアウト
// HogeUtil.executeSomething();
1.現場のコードを診る 〜ソースコメント〜
switch(hoge) {
case A:
a();
break;
case B:
b();
break;
default:
// ここに来るはずは無い
break;
1.現場のコードを診る 〜ソースコメント〜
・社内フレームワークに相当する部分、
その他既存業務コードなどは真似される事が多い
・結果的に同じようなソースコメントが増える
・他人指向型のやり方を見抜くヒントになる
1.現場のコードを診る 〜なぜ診るか〜
・なぜ、わざわざ「現場のコードを診る」の?
・色んな人に質問して回答してもらったり、ソース
コードの改善を提案すれば良いんじゃないです
か?
Question!!
Answer
なにかしら障壁があるから
なんかエラい上司
・・・・
うーん・・
なんかエラい上司
それやって
工数削減出来る
の?
なんかエラい上司
ソースを綺麗にす
るよりも
A画面の実装の方
が優先だよね
キェェェェェェェェェ
ェwww
・こういう展開はよくあるので、
水面下でこっそり始める
・「診る」は時間がかかるように思えるが
対人コストは低い
・交渉をする必要が無い方法である
・ただし、やはりスケジュール感は
あるので、時間との戦い
1.現場のコードを診る 〜なぜ診るか〜
1.現場コードを診る
2.チームメンバーのコードを診る
3.人を選ぶ
4.口コミ的に伝える
5.JUnitで示す
6.実践
アジェンダ
・基本的なJavaコーディングセオリー
・どのver.のJavaコーディングか
・どういう性格か
・メソッドや変数命名のクセ
・DRY、SOLID
2.チームメンバーのコードを診る
・基本的なJavaコーディングセオリー
・どのver.のJavaコーディングか
・どういう性格か
・メソッドや変数命名のクセ
・DRY、SOLID
2.チームメンバーのコードを診る
・基本的なJavaコーディングセオリー
・どのver.のJavaコーディングか
・どういう性格か
・メソッドや変数命名のクセ
・DRY、SOLID
2.チームメンバーのコードを診る
勝手に作ったセオリー
(出典なし)
・変数とメソッドはキャメルケース
・クラスはパスカルケース
・for(int i = 0; i < hoge.length; i++)
・拡張for文
・変数は呼び出す直前で定義
・Java Beans
2.チームメンバーのコードを診る
〜Javaコーディングセオリー〜入門レベル(必須)
public class hogeHoge {
String user_id;
String UserId;
public void GetHoge()
public void get_hoge()
}
2.チームメンバーのコードを診る
〜Javaコーディングセオリー〜
boolean deleteFlag = false;
・・・・長い処理・・・
for(...){
・・・・長い処理・・・
if(...) {
if(...) {
else if(...){
}
・・・・長い処理・・・
deleteFlag = true;
}
}
2.チームメンバーのコードを診る
〜Javaコーディングセオリー〜
2.チームメンバーのコードを診る
〜Javaコーディングセオリー〜
・methodスコープの意識
・文字連結にはStringBuilder
・大きい桁数のデータ、小数演算にはBigDecimal
・ジェネリクスの適切利用(型安全)
・hashCodeとequals
かけだしレベル
(意識しててほしいやつ)
・たまに入門レベルを満たしてないプログ
ラマがいる
・そういう場合はマイグレーション以前に
Java教えるところから
※レベルの内容は勝手に
僕が思いつきで書いただけです
2.チームメンバーのコードを診る
〜Javaコーディングセオリー〜
・基本的なJavaコーディングセオリー
・どのver.のJavaコーディングか
・どういう性格か
・メソッドや変数命名のクセ
・DRY、SOLID
2.チームメンバーのコードを診る
・try、catch、finallyを見れば大体分かる
・例外処理は一番コーディングスキルが測
れると言っても過言ではない
主には後述するtry-with-resources
マルチキャッチなど
2.チームメンバーのコードを診る
〜どのverのJavaコーディングか〜
・Java SE 8知ってたらStream API使い
たがると思うのでそこも見分けるのは簡単
2.チームメンバーのコードを診る
〜どのverのJavaコーディングか〜
Java SE 6の時代が
長過ぎた
(2006〜2011年)
2.チームメンバーのコードを診る
・基本的なJavaコーディングセオリー
・どのver.のJavaコーディングか
・どういう性格か
・メソッドや変数命名のクセ
・DRY、SOLID
・やたらフラグ使いたがる人
→自分の世界にいる(唯我独尊)
・やたらJavaBeansのコンバートが多い人→
オレオレ実装が好き(やりたがり)
・コメントを多く残す人
→几帳面か保守的
2.チームメンバーのコードを診る
〜どういう性格か〜
・1メソッドがやたら長い人
→設計書のその通りに作るタイプ
アバウトな例ですがこんな感じ。
コードと普段の会話でなんとなく
見えてくるものが…?
2.チームメンバーのコードを診る
〜どういう性格か〜
・コードは正直
・直接的に伝え合う情報も重要だが
普段気づくにくいところに本質的な部分が
ある気がする
2.チームメンバーのコードを診る
〜どういう性格か〜
・コードは正直
・直接的に伝え合う情報も重要だが
普段気づくにくいところに本質的な部分が
ある気がする
コード性格占い結構当たる
2.チームメンバーのコードを診る
〜どういう性格か〜
2.チームメンバーのコードを診る
・基本的なJavaコーディングセオリー
・どのver.のJavaコーディングか
・どういう性格か
・メソッドや変数命名のクセ
・DRY、SOLID
制約の無い部分(実装者に一任されてい
る部分)の命名は個人のクセが出やす
い。
その人の言語経験(Cから始めて今は
Javaとか、VBから始めて今はJavaとか)
が見えてくるはず…?
2.チームメンバーのコードを診る
〜メソッド名や変数命名のクセ〜
2.チームメンバーのコードを診る
・基本的なJavaコーディングセオリー
・どのver.のJavaコーディングか
・どういう性格か
・メソッドや変数命名のクセ
・DRY、SOLID
・DRY(Don’t Repeat Yourself)
呪文のように反芻するべきと思う言葉
・繰り返しを無意識にやっている人は多い
→マイグレーション以前で
改善しておきたい部分
2.チームメンバーのコードを診る
〜DRY, SOLID〜
・SOLID
State Dependency Principle
Open-Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle
2.チームメンバーのコードを診る
〜DRY, SOLID〜
・オブジェクト指向の設計原則
クラスの責任は1つだけ
拡張しやすく、修正で影響出ない
継承先でクラスの意味変わっちゃだめ
必要ないところまで意識させない
親も子も独立しているべき
2.チームメンバーのコードを診る
〜DRY, SOLID〜
・SOLIDを意識した実装は理想的
・アンチパターンを見抜く手だてになる(原
則に反するか、という指標値)
・原則は絶対厳守のものではないが
背景知識として持っていて損は無い
2.チームメンバーのコードを診る
〜DRY, SOLID〜
1.現場コードを診る
2.チームメンバーのコードを診る
3.人を選ぶ
4.口コミ的に伝える
5.JUnitで示す
6.実践
アジェンダ
・人選びは大事。変化を起こすとき
☆提案を受け入れてくれる人
☆半信半疑だが着いてきてくれる人
☆何が何でも反対する人があらわれる。
受け入れてくれる人 + 半信半疑の人に
協力してもらえるように努力する
(ピープルウェアの受け売り)
3.人を選ぶ
・現場のコード、メンバーのコードを踏まえ
て
マイグレーションを推進していく
3.人を選ぶ
・指摘を受け入れる人か
・こだわりが強いか
3.人を選ぶ
・指摘を受け入れる人か
->丁寧にアドバイスしていく
・こだわりが強いか
->こだわりを受け入れつつ、アイデアを提
示する、提案する。
3.人を選ぶ
・処理スピードを重視するか
3.人を選ぶ
・処理スピードを重視するか
-> ベンチマークを示す。
「こちらの方が速いから」
みたいなやりとりするよりも
実際の数値見て会話する方が生産的
3.人を選ぶ
・怠惰か
3.人を選ぶ
・怠惰か
->「楽な方法があるよ」
「気持ちがスーっとするよ」などと
新しい技術を進めてみる
3.人を選ぶ
・色んなタイプがいるが、自分にとって攻
略しやすい人を1人見つけてきっかけとす
る
・どんなタイプに対しても
動機(モチベーション)を探して
それに働きかける
3.人を選ぶ
3.人を選ぶ
プロジェクトとメンバーの利害を
上手く一致させる必要がある
・色んなタイプの人がいる中で
どう対話をするか考える
・重要なのは人間は
Controllableではないということ
3.人を選ぶ
・色んなタイプの人がいる中で
どう対話をするか考える
・重要なのは人間は
Controllableではないということ
・情報を自分で止めないこと
対話をやめないこと
3.人を選ぶ
1.現場コードを診る
2.チームメンバーのコードを診る
3.人を選ぶ
4.口コミ的に伝える
5.JUnitで示す
6.実践
アジェンダ
・例えばダイヤモンドオペレータを使え!と
いうのではなく
「こんなんありますけど?」と伝えてみる
4.口コミ的に伝える
あ、ここのソースなんです
けど
なんか、ダイヤモンドオペ
レーターっていうのがある
らしいですよ
えっ、何ですかそれ
単純にジェネリクスが
キュッとなってシンプルに
なるんすよ
まぁ省略されるだけなんで
どっちでも良いと言えば良
いんですけどねw
でも、シンプルな方が後々
楽ですよねー
たぶん
そうっすねー
使ってみますよ
・このぐらいのスタンス
・争わない。消耗して時間消費するのも精
神衛生と工数管理上良くない
・本質的に話し合わなければ
いけない部分は議論する
4.口コミ的に伝える
・かといって、実装者でバラバラにならない
ように上手く誘導する必要があったり無
かったり
・チームとしての統一感は最低限必要
4.口コミ的に伝える
1.現場コードを診る
2.チームメンバーのコードを診る
3.人を選ぶ
4.口コミ的に伝える
5.JUnitで示す
6.実践
アジェンダ
伝える事
・実装サンプル
・期待値(アサーション)
・実際にTestを走らせる
・オールグリーンを見せる
5.JUnitで示す
口コミ戦法を踏まえて
こんな感じで…
うーん、Listの絞り込みし
たいんだけどfor文が複雑
になっちゃうなぁ
あー…。Stream APIって言
うの知ってますか?
??
聞いた事無いですねぇ。
なんかJavaのハチから
入ったらしいんですけど便
利っぽいですよー
例えば、ここのロジックだっ
たらこんな感じで…
@Test
public void リストを偶数だけにする() {
// 1〜100のデータ
// setup(1〜100を持つリストを作る)
List<Integer> result = create1To100();
5.JUnitで示す
// exercise
List<Integer> evenList = result.stream()
.filter(n -> n % 2 == 0) // 偶数でフィルタ
.collect(Collectors.toList()); // リスト化
5.JUnitで示す
// verify
assertThat(evenList.size(), is(50));
assertThat(evenList.get(0), is(2));
assertThat(evenList.get(1), is(4));
assertThat(evenList.get(2), is(6));
assertThat(evenList.get(3), is(8));
assertThat(evenList.get(4), is(10));
5.JUnitで示す
@Test public void リストを偶数だけにする() {
List<Integer> result = create1To100(); // 1〜100のデータ
List<Integer> evenList = result.stream() //
.filter(n -> n % 2 == 0) // 偶数でフィルタ
.collect(Collectors.toList()); // リスト化
assertThat(evenList.size(), is(50));
assertThat(evenList.get(0), is(2));
assertThat(evenList.get(1), is(4));
assertThat(evenList.get(2), is(6));
assertThat(evenList.get(3), is(8));
assertThat(evenList.get(4), is(10));
5.JUnitで示す
実装サンプル
@Test public void リストを偶数だけにする() {
List<Integer> result = create1To100(); // 1〜100のデータ
List<Integer> evenList = result.stream() //
.filter(n -> n % 2 == 0) // 偶数でフィルタ
.collect(Collectors.toList()); // リスト化
assertThat(evenList.size(), is(50));
assertThat(evenList.get(0), is(2));
assertThat(evenList.get(1), is(4));
assertThat(evenList.get(2), is(6));
assertThat(evenList.get(3), is(8));
assertThat(evenList.get(4), is(10));
5.JUnitで示す
期待値
(アサーション)
※分かりやすさ重視
@Test public void リストを偶数だけにする() {
List<Integer> result = create1To100(); // 1〜100のデータ
List<Integer> evenList = result.stream() //
.filter(n -> n % 2 == 0) // 偶数でフィルタ
.collect(Collectors.toList()); // リスト化
assertThat(evenList.size(), is(50));
assertThat(evenList.get(0), is(2));
assertThat(evenList.get(1), is(4));
assertThat(evenList.get(2), is(6));
assertThat(evenList.get(3), is(8));
assertThat(evenList.get(4), is(10));
5.JUnitで示す
このときに
パフォーマンスも測定し
て伝えると効果的
ッッッッターーーン!
(Enterキー叩く音)
4.JUnitで示す
OK!!!!!
こんな感じでデモすれば
こういう感じに
うまくいくはず!!
JUnit以外のオススメ
・JavaのREPL(jshell)
https://jdk9.java.net/download/
5.JUnitで示す
JUnit以外のオススメ
・JavaのREPL(jshell)
https://jdk9.java.net/download/
デモやコミュニケーションは
瞬発力勝負。
軽い動作確認を円滑にしてくれる
5.JUnitで示す
1.現場コードを診る
2.チームメンバーのコードを診る
3.人を選ぶ
4.口コミ的に伝える
5.JUnitで示す
6.実践
アジェンダ
・1〜5を踏まえて実践していく
マイグレーションの具体的内容は
次スライドから
※ズラーっとJavaコードを
羅列してます
6.実践
Thread
VS
Concurrency Utilities
Thread t = new Thread(new Runnable(){
public void run() {
doSomething();
}
});
t.start();
Thread VS Concurrency Utilities
ExecutorService service = Executors.
newSingleThreadExecutor();
service.execute(new Runnable(){
public void run(){ doSomething(); }
});
service.shutdown();
Thread VS Concurrency Utilities
ExecutorService service = Executors.
newSingleThreadExecutor();
service.execute(() -> doSomething());
service.shutdown();
Java SE 8 ならこんな感じ
Thread VS Concurrency Utilities
・スレッド管理が簡単になった
(※ここまでJava SE 6 で出来る)
・あと、色々もっと並列処理やろうとしたら色んなも
のが選択肢にあがってくる…おそらく
だけど、あえてバッサリカットします
Thread VS Concurrency Utilities
・業務での利用シーンは限られているし、
レイテンシを気にする人が自然に行き着くはず
・まずはThreadをnewしちゃうところから卒業を
Thread VS Concurrency Utilities
詳しくは
・Java並行処理プログラミング
―その「基盤」と「最新API」を究める
※ただし絶版
・Java言語で学ぶデザインパターン入門
マルチスレッド編
Thread VS Concurrency Utilities
Thread VS Concurrency Utilities
ありがちなfinally句
VS
try-with-resources
byte[] fileData = ….
OutputStream os = null;
try {
os = new FileOutputStream(“hoge.txt”);
os.write(fileData);
}
finally VS try-with-resources
catch(IOException e) { ….
} finally {
if(os != null) {
try {
os.close();
} catch(IOException ..) {...}
…….
finally VS try-with-resources
finally VS try-with-resources
byte[] fileData = ….
OutputStream os = null;
try {
os = new FileOutputStream(new File(“hoge.txt”));
os.write(fileData);
} catch(IOException e) { ….
} finally {
if(os != null) {
try {
os.close();
} catch(IOException ..) {...}
…….
長いわ!!!!
byte[] fileData = ….
try(OutputStream os = Files.newOutputStream
(Paths.get(“hoge.txt”))) {
os.write(fileData);
} catch(IOException e) {
….
}
finally VS try-with-resources
Old File Operation
VS
NIO2
・実はさっきさりげなく使っていた
Old File Operation VS NIO2
byte[] fileData = ….
try(OutputStream os = Files.newOutputStream
(Paths.get(“hoge.txt”))) {
os.write(fileData);
} catch(IOException e) {
….
}
Old File Operation VS NIO2
・FilesとPaths使っておけばそれっぽくな
る!
・今までFileクラスでファイルパス作った
り、野暮ったかったのがシンプルに
Old File Operation VS NIO2
・ファイル操作とファイルパス操作が明確
に分離されるようになった
・ファイル操作が簡単になった
copy、move、権限操作、zipなど
Old File Operation VS NIO2
古くさいGenerics
VS
Diamond Operator
List<String> stringList = new
ArrayList<String>();
Old Generics VS Diamond
List<String> stringList = new
ArrayList<>();
Old Generics VS Diamond
List<String> stringList = new
ArrayList<>();
これは割とみんなすんなり受け入れてくれ
る感じがしている
Old Generics VS Diamond
多すぎるcatch節
VS
Multi Catch
too many catch VS multi catch
try {
….
} catch(IOException ioe) {
throw HogeException(e);
} catch(SQLException se) {
throw HogeException(e);
} catch(InterruptedException e) {
throw HogeException(e);
too many catch VS multi catch
try {
….
} catch(IOException | SQLException |
InterruptedException e) {
throw HogeException(e);
}
これもすんなり受け入れてくれそう
リフレクション
チェック例外地獄
VS
ReflectiveOperation
Old Ex VS ReflectiveOperationEx
try {
Class clazz = Class.forName(“...”);
clazz.newInstance();
} catch(ClassNotFoundException cex) { … }
catch(InstatitationException iex) { … }
catch(IllegalAccessException iaex) { … }
try {
Class clazz = Class.forName(“...”);
clazz.newInstance();
} catch(ReflectiveOperationException e) {
……
}
Old Ex VS ReflectiveOperationEx
気ままなコレクション操作
VS
Collections
Selfish Implement VS Collections
return new ArrayList<>();
return new HashMap<>();
return new HashSet<>();
return Collections.emptyList();
return Collections.emptyMap();
return Collections.emptySet();
※単に空のインスタンスを返したいときは
有効
J2SE 5.0 から使えます
Selfish Implement VS Collections
List<String> list = new ArrayList<>(1);
list.add(“hoge”);
Set<String> set = new HashSet<>(1);
set.add(“hoge”);
Map<String, String> map = new HashMap<>(1);
map.add(“hoge”, “hoge”);
Selfish Implement VS Collections
Selfish Implement VS Collections
Collections.singletonList(“hoge”);
Collections.singleton(“hoge”);
Collections.singletonMap(“hoge”, “hoge”);
J2SE 1.3から使えます
Selfish Implement VS Collections
結論
CollectionsクラスはCollections.sortやるときだけ
利用するクラスではない
Selfish Implement VS Collections
結論
CollectionsクラスはCollections.sortやるときだけ
利用するクラスではない
コレクションの操作を簡潔化し、オブジェクトの寿命
を明確にする
複雑な操作を簡易に行える
Selfish Implement VS Collections
結論
CollectionsクラスはCollections.sortやるときだけ
利用するクラスではない
コレクションの操作を簡潔化し、オブジェクトの寿命
を明確にする
複雑な操作を簡易に行える
ただし、全く同じ操作
(add、removeなど)が
出来るわけではない
用法用量を守って
正しくお使いください
オレオレUtil
VS
Objects
Selfish Implement VS Objects
if(hoge == null) {
throw new NullPointerException
(“hoge is null”);
}
Selfish Implement VS Objects
Objects.requireNonNull(hoge, “hoge
is null”);
Selfish Implement VS Objects
if(hoge != null) {
return hoge.toString();
} else {
“”;
}
Selfish Implement VS Objects
Objects.toString(hoge, “”);
Selfish Implement VS Objects
・変なオレオレStringUtilとか作る前に
Objectsを見てみよう
・しかしこの辺りはプロジェクト秘伝のUtil
と対象領域が重なってしまう可能性が高く
難易度高い
ここまでは
Java SE 7で
実現出来ます
ここから
Java SE 8
気ままなfor文実装
VS
Stream API
for(Integer value : list) {
if(value == ...) { continue; }
if(value == ...) { continue; }
return value;
}
return null; // guilty
Selfish for-loop VS Stream
return list.stream()
.filter(s -> isHoge(s))
.findFirst();
Selfish for-loop VS Stream
for(Fuga fuga : fugaList) {
Hoge hoge = new Hoge();
hoge.setHoge(fuga.getFuga());
hogeList.add(hoge);
}
return hogeList;
Selfish for-loop VS Stream
return fugaList.stream()
.map(fuga -> convertToHoge(fuga))
.collect(Collectors.toList());
Selfish for-loop VS Stream
StringBuilder
VS
StringJoiner
StringBuilder sb = new StringBuilder();
sb.append(“[a”);
sb.append(“,”);
sb.append(“b”);
sb.append(“,”);
sb.append(“c]”);
sb.toString(); // =>[a,b,c]
StringBuilder VS StringJoiner
StringJoiner joiner = new StringJoiner(“,” “[”, “]”);
joiner.add(“a”);
joiner.add(“b”);
joiner.add(“c”);
joiner.toString(); // =>[a,b,c]
StringBuilder VS StringJoiner
// String.joinも結構便利
String.join(“,”, “a”, “b”, “c”); //=> a, b, c
StringBuilder VS StringJoiner
・ただ、処理速度は
StringBuilderの方が速いみたい
きしださんのブログ
http://d.hatena.ne.
jp/nowokay/20140409
試しに動かしてみたがあまり当時と変わらず
StringBuilder VS StringJoiner
IOException
VS
UncheckedIOException
IOE VS UncheckedIOE
public hogehoge() throws IOException {
InputStream is = …..;
is.read();
そしてthrows….throws…..throws….
IOE VS UncheckedIOE
try(InputStream is = …..){
is.read();
} catch(IOException e) {
throw new UncheckedIOException(e);
}
IOE VS UncheckedIOE
try(InputStream is = …..){
is.read();
} catch(IOException e) {
throw new UncheckedIOException(e);
}
※エラーハンドリングは計画的に
愚かなnull返し
VS
Optional
Stupid null return VS Optional
public String findHoge() {
for(Hoge hoge : hogeList ){
if(hoge.isFuga()) {
return hoge.getAsString();
}
}
return null;
}
Stupid null return VS Optional
public Optional<String> findHoge() {
for(Hoge hoge : hogeList ){
if(hoge.isFuga()) {
return Optional.of(hoge.getAsString());
}
}
return Optional.empty();
}
Stupid null return VS Optional
public Optional<String> findHoge() {
return hogeList.stream()
.filter(hoge -> hoge.isFuga())
.map(hoge -> hoge.getAsString())
.findFirst();
}
Stupid null return VS Optional
// 安全にいろんな受け取り方が出来る
Optional<String> hoge = findHoge();
hoge.ifPresent(hoge -> System.out.println(hoge.
length));
String hogehoge = hoge.orElse(“値なし”);
hoge.orElseThrow(() ->
new RuntimeException(“値無いの許さん”));
Stupid null return VS Optional
・と言いつつ、Optionalは扱いが難しい
・安易にnull使うよりは良いが、むやみに使うと大
変
・OptionalはSerializableではないし、
メンバ変数とかでいるような奴でもない
・「戻り値はOptionalにしましょう」
とかそういうところから
Date, Calendar
VS
Date and Time
Date,Calendar VS Date and Time
// 一ヶ月後の日付取得
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, 1);
// yyyy-MM を出力
System.out.println(cal.get(Calendar.YEAR) +
“-” + (cal.get(Calendar.MONTH) + 1));
// 一ヶ月後の日付取得
YearMonth nowYearMonth = YearMonth.now();
YearMonth nextYearMonth = nowYearMonth.plus(1,
ChronoUnit.MONTHS);
// yyyy-MM を出力
System.out.println(nextYearMonth.getYear() + “-” +
nextYearMonth.getMonthValue());
Date,Calendar VS Date and Time
// 一ヶ月後の日付取得
YearMonth nowYearMonth = YearMonth.now();
YearMonth nextYearMonth = nowYearMonth.plus(1,
ChronoUnit.MONTHS);
// yyyy-MM を出力
System.out.println(nextYearMonth.getYear() + “-” +
nextYearMonth.getMonthValue());
Date,Calendar VS Date and Time
System.out.println(nextYearMonth);
で良いんだけどね
Date,Calendar VS Date and Time
// 文字列からDateを作る
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern(“yyyy/MM/dd”);
Date date = sdf.parse(“2015/11/28”);
// 文字列からDateを作る
DateTimeFormatter formatter = DateTimeFormatter.
ofPattern(“yyyy/MM/dd”);
LocalDate date = LocalDate.parse(“2015/11/28”,
formatter);
※といってもjava.util.DateとLocalDateは全く別もの。。。
Date,Calendar VS Date and Time
・Optional同様、しっかり知識を持った上で広めなけ
ればいけない
・IS0-8601
・JDBCとの互換性
・国際時間の問題(LocalDateTime,
ZonedDateTime)
・DateやCalendarとの互換性の問題
Date,Calendar VS Date and Time
詳細については
・櫻庭さん著「現場で使える[最新]Java SE 7/8速攻
入門」を買えば間違いなしです!
(全力で他力本願)
http://www.amazon.co.jp/dp/4774177385/
詳細については
・あとJavaエンジニア養成読本読むと
良いです!!
(全力で他力本願)
http://gihyo.jp/book/2014/978-4-7741-6931-6
コードのマイグレーションのためには
・コードの健康チェック
・性格把握
・コミュニケーション方法の検討
・JUnitでのデモ、口コミ的な
情報提示
まとめ
・一人で戦える範囲としては
ボーイスカウトルールが限界
・プロジェクト全体のコードマイグレーショ
ンをはかるためには
プログラマ一人一人の意識のマイグレー
ションが必要
まとめ
・自分なりに実践する中で、素振りの重要
性が分かってきた
※素振り(事前に知識をinputする、コード
としてoutputする)
・基本相手を納得するには瞬発力が
必要。そのための素振り
まとめ
・Javaのコードは寛容です、色んな書き方が出来
る互換性を持っています
・プロジェクトの成功と並行してJavaコーディングの
マイグレーションは少し優先順位が下がってしまい
がちです
・しかしジワジワと効果が出てくる
キャンペーンだと言えます
まとめ
・自分だけでなく、他の人が
(例えば)Stream APIを普通に利用してい
るのは嬉しい事ですし
布教活動のやりがいもあります
まとめ
あなたから
modern Java
を始めましょう
ご静聴
ありがとうござい
ました

More Related Content

What's hot

プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例sohta
 
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめTDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめKei Sawada
 
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なことY Watanabe
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行Yoshitaka Kawashima
 
Node塾 講義その6 テスト駆動java script 読書会 1回目
Node塾 講義その6 テスト駆動java script 読書会 1回目Node塾 講義その6 テスト駆動java script 読書会 1回目
Node塾 講義その6 テスト駆動java script 読書会 1回目Nomo Kiyoshi
 
2013 08-19 jjug
2013 08-19 jjug2013 08-19 jjug
2013 08-19 jjugsk44_
 
開発現場で使えるかもしれないGroovy
開発現場で使えるかもしれないGroovy開発現場で使えるかもしれないGroovy
開発現場で使えるかもしれないGroovyzgmf_mbfp03
 
Java web application testing
Java web application testingJava web application testing
Java web application testingTokuhiro Matsuno
 
Tddのすゝめ
TddのすゝめTddのすゝめ
Tddのすゝめ将 高野
 
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所Y Watanabe
 
iPhoneアプリを Javaで書くよ?
iPhoneアプリを Javaで書くよ?iPhoneアプリを Javaで書くよ?
iPhoneアプリを Javaで書くよ?Toshio Ehara
 
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料Y Watanabe
 
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSFJavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSFMasuji Katoda
 
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみたJavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみたSatoshi Takami
 
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分松田 千尋
 
3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJBTsunenaga Hanyuda
 
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩Y Watanabe
 

What's hot (20)

プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
 
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめTDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
 
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行
 
Node塾 講義その6 テスト駆動java script 読書会 1回目
Node塾 講義その6 テスト駆動java script 読書会 1回目Node塾 講義その6 テスト駆動java script 読書会 1回目
Node塾 講義その6 テスト駆動java script 読書会 1回目
 
2013 08-19 jjug
2013 08-19 jjug2013 08-19 jjug
2013 08-19 jjug
 
開発現場で使えるかもしれないGroovy
開発現場で使えるかもしれないGroovy開発現場で使えるかもしれないGroovy
開発現場で使えるかもしれないGroovy
 
Java web application testing
Java web application testingJava web application testing
Java web application testing
 
Tddのすゝめ
TddのすゝめTddのすゝめ
Tddのすゝめ
 
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
 
iPhoneアプリを Javaで書くよ?
iPhoneアプリを Javaで書くよ?iPhoneアプリを Javaで書くよ?
iPhoneアプリを Javaで書くよ?
 
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
 
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSFJavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
 
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみたJavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
 
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
 
3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB
 
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 

Viewers also liked

Real world machine learning with Java for Fumankaitori.com
Real world machine learning with Java for Fumankaitori.comReal world machine learning with Java for Fumankaitori.com
Real world machine learning with Java for Fumankaitori.comMathieu Dumoulin
 
Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介khisano
 
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点hishidama
 
プログラム初心者がWebサービスをリリースして運営するまで
プログラム初心者がWebサービスをリリースして運営するまでプログラム初心者がWebサービスをリリースして運営するまで
プログラム初心者がWebサービスをリリースして運営するまでTomoaki Iwasaki
 
日本 Java ユーザーグループ JJUG CCC 2015 Fall by ソラコム 片山
日本 Java ユーザーグループ JJUG CCC 2015 Fall  by ソラコム 片山 日本 Java ユーザーグループ JJUG CCC 2015 Fall  by ソラコム 片山
日本 Java ユーザーグループ JJUG CCC 2015 Fall by ソラコム 片山 SORACOM,INC
 
デバッガのしくみ(JDI)を学んでみよう
デバッガのしくみ(JDI)を学んでみようデバッガのしくみ(JDI)を学んでみよう
デバッガのしくみ(JDI)を学んでみようfukai_yas
 
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3Toshiaki Maki
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallMasatoshi Tada
 
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景にマイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景にYusuke Suzuki
 
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-Takakiyo Tanaka
 
Getting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafGetting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafMasatoshi Tada
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to missAndres Almiray
 
2017spring jjug ccc_f2
2017spring jjug ccc_f22017spring jjug ccc_f2
2017spring jjug ccc_f2Kazuhiro Wada
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Kosuke Kida
 
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求hajime funaki
 
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Hiroyuki Ohnaka
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.JustSystems Corporation
 
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Logico
 
Introduction of Project Jigsaw
Introduction of Project JigsawIntroduction of Project Jigsaw
Introduction of Project JigsawYuichi Sakuraba
 

Viewers also liked (20)

Real world machine learning with Java for Fumankaitori.com
Real world machine learning with Java for Fumankaitori.comReal world machine learning with Java for Fumankaitori.com
Real world machine learning with Java for Fumankaitori.com
 
Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介
 
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
 
プログラム初心者がWebサービスをリリースして運営するまで
プログラム初心者がWebサービスをリリースして運営するまでプログラム初心者がWebサービスをリリースして運営するまで
プログラム初心者がWebサービスをリリースして運営するまで
 
日本 Java ユーザーグループ JJUG CCC 2015 Fall by ソラコム 片山
日本 Java ユーザーグループ JJUG CCC 2015 Fall  by ソラコム 片山 日本 Java ユーザーグループ JJUG CCC 2015 Fall  by ソラコム 片山
日本 Java ユーザーグループ JJUG CCC 2015 Fall by ソラコム 片山
 
デバッガのしくみ(JDI)を学んでみよう
デバッガのしくみ(JDI)を学んでみようデバッガのしくみ(JDI)を学んでみよう
デバッガのしくみ(JDI)を学んでみよう
 
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
 
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景にマイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
マイクロサービスアーキテクチャ - アーキテクチャ設計の歴史を背景に
 
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
 
Getting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafGetting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with Thymeleaf
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to miss
 
2017spring jjug ccc_f2
2017spring jjug ccc_f22017spring jjug ccc_f2
2017spring jjug ccc_f2
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1
 
Jjug ccc
Jjug cccJjug ccc
Jjug ccc
 
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求U-NEXT学生インターン、過激なJavaの学び方と過激な要求
U-NEXT学生インターン、過激なJavaの学び方と過激な要求
 
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
Java8移行は怖くない~エンタープライズ案件でのJava8移行事例~
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
 
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)
 
Introduction of Project Jigsaw
Introduction of Project JigsawIntroduction of Project Jigsaw
Introduction of Project Jigsaw
 

Similar to 【こっそり始める】Javaプログラマコーディングマイグレーション

Java event impression
Java event impressionJava event impression
Java event impressionOgataAyaka
 
20171110 fun-tech #5 g1 gc
20171110 fun-tech #5 g1 gc20171110 fun-tech #5 g1 gc
20171110 fun-tech #5 g1 gcYu Kitajima
 
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているJJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているKoichi Sakata
 
関西 Java エンジニアの会 2012年6月度 JavaOne 報告会!
関西 Java エンジニアの会 2012年6月度 JavaOne 報告会!関西 Java エンジニアの会 2012年6月度 JavaOne 報告会!
関西 Java エンジニアの会 2012年6月度 JavaOne 報告会!Kazkuki Oakamoto
 
Groovyスクリプト"再"入門 起動編
Groovyスクリプト"再"入門 起動編Groovyスクリプト"再"入門 起動編
Groovyスクリプト"再"入門 起動編Yasuharu Hayami
 

Similar to 【こっそり始める】Javaプログラマコーディングマイグレーション (6)

JAWS-UG Kyoto #02 LT
JAWS-UG Kyoto #02 LTJAWS-UG Kyoto #02 LT
JAWS-UG Kyoto #02 LT
 
Java event impression
Java event impressionJava event impression
Java event impression
 
20171110 fun-tech #5 g1 gc
20171110 fun-tech #5 g1 gc20171110 fun-tech #5 g1 gc
20171110 fun-tech #5 g1 gc
 
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているJJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
 
関西 Java エンジニアの会 2012年6月度 JavaOne 報告会!
関西 Java エンジニアの会 2012年6月度 JavaOne 報告会!関西 Java エンジニアの会 2012年6月度 JavaOne 報告会!
関西 Java エンジニアの会 2012年6月度 JavaOne 報告会!
 
Groovyスクリプト"再"入門 起動編
Groovyスクリプト"再"入門 起動編Groovyスクリプト"再"入門 起動編
Groovyスクリプト"再"入門 起動編
 

More from yy yank

Javaプログラマのための頑張らないGo入門
Javaプログラマのための頑張らないGo入門Javaプログラマのための頑張らないGo入門
Javaプログラマのための頑張らないGo入門yy yank
 
Kotlinソースコード探訪
Kotlinソースコード探訪Kotlinソースコード探訪
Kotlinソースコード探訪yy yank
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzzyy yank
 
KuromojiをKotlinで動かす
KuromojiをKotlinで動かすKuromojiをKotlinで動かす
KuromojiをKotlinで動かすyy yank
 
Doma2 with Kotlin
Doma2 with KotlinDoma2 with Kotlin
Doma2 with Kotlinyy yank
 
絶対にぬるぽを出さない
絶対にぬるぽを出さない絶対にぬるぽを出さない
絶対にぬるぽを出さないyy yank
 
Kotlinこんなん出ましたけど
Kotlinこんなん出ましたけどKotlinこんなん出ましたけど
Kotlinこんなん出ましたけどyy yank
 
Kotlinあるある言いたい
Kotlinあるある言いたいKotlinあるある言いたい
Kotlinあるある言いたいyy yank
 
Kotlinメジャーver リリースを前に
Kotlinメジャーver リリースを前にKotlinメジャーver リリースを前に
Kotlinメジャーver リリースを前にyy yank
 
Server Side Kotlin
Server Side KotlinServer Side Kotlin
Server Side Kotlinyy yank
 

More from yy yank (10)

Javaプログラマのための頑張らないGo入門
Javaプログラマのための頑張らないGo入門Javaプログラマのための頑張らないGo入門
Javaプログラマのための頑張らないGo入門
 
Kotlinソースコード探訪
Kotlinソースコード探訪Kotlinソースコード探訪
Kotlinソースコード探訪
 
Javaで最強のfizz buzz
Javaで最強のfizz buzzJavaで最強のfizz buzz
Javaで最強のfizz buzz
 
KuromojiをKotlinで動かす
KuromojiをKotlinで動かすKuromojiをKotlinで動かす
KuromojiをKotlinで動かす
 
Doma2 with Kotlin
Doma2 with KotlinDoma2 with Kotlin
Doma2 with Kotlin
 
絶対にぬるぽを出さない
絶対にぬるぽを出さない絶対にぬるぽを出さない
絶対にぬるぽを出さない
 
Kotlinこんなん出ましたけど
Kotlinこんなん出ましたけどKotlinこんなん出ましたけど
Kotlinこんなん出ましたけど
 
Kotlinあるある言いたい
Kotlinあるある言いたいKotlinあるある言いたい
Kotlinあるある言いたい
 
Kotlinメジャーver リリースを前に
Kotlinメジャーver リリースを前にKotlinメジャーver リリースを前に
Kotlinメジャーver リリースを前に
 
Server Side Kotlin
Server Side KotlinServer Side Kotlin
Server Side Kotlin
 

【こっそり始める】Javaプログラマコーディングマイグレーション