14:00 ~
さきに感想
- java再勉強中なのもあって、結構話がわかる感じがあってうれしかった
- 怖くない
- タイミング合えば今度はLTしてみたいかなぁと思った
お品書き
セッション枠(20分)
- k.hasunuma 「Date and Time APIのTemporalAdjuster活用法」
- nabedge 「あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと」
- 休憩10分
通常枠(10分)
- emaggame 「Droolsについて」
- lino 「Jenkins実践入門第二版What's New」
- n_agetsu 「Tomcat実装から学ぶClassLoaderLeak」
- 休憩10分
- masakkuma 「SonarQubeについて」
- komiya_atsushi
- jflute 「Java8 stream() にススメ (わりと入門)」
- kawachi「最小Hello World!チャレンジ」
恒例自己紹介
@khasunuma 「Date and Time APIのTemporalAdjuster活用法」
- 佐世保の提督
- Package java.time.*
- Temporal object
- Temporal インターフェースの実装
- Temporal Adjuster
- たとえば今日を基準に、、、
- firstDayOfMonth
- lastDayOfMonth
- next(MONDAY)
- Strategy パターン(デザパタ)
- @FunctionalInterfaceなのでラムダで置き換える
- 使い方の話
- LocalDate のwith()に、adjuster.firstDayOfYear()とかを渡す
- 年初とか、いろんな例
- ☆nextOrSame()
- next()とprevious()
- 成人の日を求めたいの例
- 現在は、月の第二月曜日 ← これもdayOfWeekInMonth()とかで簡単に求められる
- たとえば今日を基準に、、、
- Temporal Adjuster つくるの、結構大変
- たとえば営業日とか振替休日
- 出来合いののAdjusterはすべて日付に関するもの、時刻に対するものが必要な場合は自作する必要あり
営業日の計算例
- nextBusinessDay()
まとめ
- よくつかうやつはすでにあるよー
- low-level API で自作できるけど、すでにあるやつは簡単に使える
nabedge 「あなたのプロジェクトが気軽にjavaをバージョンアップするために必要なこと」
- ビズリーチの人
- Javaのバージョンは何使ってるか?(質問)
- なぜ古いバージョンを使うのか
- なにかあったらいやだから
- elasticsearchのコンパイラがバグってた例
- ↑珍しいからニュースになる
- インフラ担当者がいやな顔する
- がんばってjava8に上げても、、、数年後には新しいのがでてる。。。
- そうじゃなくて、上げやすくしておくことが重要
- なにかあったらいやだから
JDKとJRE
- なんか全部にJDKが入っている
- 本番では要らないよね?
- ↑これがバージョンアップ難しい原因では?
- JDKの切り替え簡単
- 開発環境や、Jenkinsとか、切り替えられるように設計されている
- JREの切り替えは?
- マイナーバージョンアップも含めて切り替え、とか、なんかあったときの元に戻し方は?
- JJUG去年のやつ(スライド)
- TwelveFactorApp
- 第2章「依存関係」の最後の段落
- アプリケーションがシステムツールを必要とするならば、そのツールをアプリケーションに組み込むべきではない
- アプリにJREを組み込む!
- JREにアプリに組み込む!
- $JAVA_HOME/lib/ext の配下は自分で作ったjarをおいてもいい
- そこは自動的にクラスパスに含まれる!
- なんか全部にJDKが入っている
Tomcatはインストール型ではなく、ライブラリ型=組み込み型 を使おう
ビルド方法!(Tomcatの例)とリリース&実行方法
- JREの配布tarを解凍して、その中にアプリを突っ込む
JREのバージョンup/down方法
- Jenkinsでのビルド時に、jreのバージョンを切り替えるだけ!
まとめ
- JDKとJREはちゃんと区別する
- APサーバは組み込み
- JREもろともリリースする!
質問
- ImageMagickとかCurlとかは、Docker、AMIとかでパッケージングにするってのはどうかんがえる?
- それは考え方一つ。パッケージングをどう考えるか
- ImageMagickとかCurlとかは、Docker、AMIとかでパッケージングにするってのはどうかんがえる?
休憩 10分
emaggame 「Droolsについて」
BRMS とは
- ビジネスロジックをルールとしてそとに追い出す
- DSLで書いたり
- BRMSは↑のランタイム
Drools
- RedHatのOSS BRMS実装
デモ
- 自動車保険の例
- デシジョンテーブル(ルールを記載してあるスプレッドシート)
デモ2
- TwitterCBR
- Twitterのサンプルストリームから条件に合致するツイートの抽出
- ☆CEP(Complex Event Processing)
- (.drlってのがDSL記述ファイルかな)
- 会話を抽出 1段階目の抽出に対して2段階目の条件を設定
- (1段階目と2段階目のは効率はどうなんだろう?)
所感
- デシジョンテーブル直感的
- DSLは覚えること多いけど、まあ表現しやすい
@lino_s 「Jenkins実践入門第二版What's New」
- Jenkins 10万インストレーション!
- 2011/11/11 Jenkins実践入門発売
- 4刷 → 改訂の流れ
- ビルドツールの一新 AntからMavenへ。Gradleも
- パッケージリポジトリも
- ツールの最新化
- Selenium WebDriverへ
- 高度なビルド
- ビルドパイプライン
- ビルドの昇格
- その他いろいろ
- デザインかわったのでスクショ全部とりなおし、、、
- 2015年5月か6月に発売予定
n_agetsu 「Tomcat実装から学ぶClassLoaderLeak」
SIerさん
- ClassLoaderLeak とは
- ホットデプロイ時に古いクラスローダがGCされない
- Jenkinsとかでホットデプロイ時に↑に遭遇率が高い
- 主な原因
- アンデプロイ済みAPへの参照が残ること!
- ThreadLocal.remove実行漏れ
- アンデプロイ時にスレッドプールのチェック
- JDBCドライバの参照が残る
- postgresのドライバの例。DriverManagerに登録される
- JDBCドライバを.warに入れない
- deregisterDriver実行
- Tomcat8ではデフォルトで見地・解放が有効
- 解析方法は?
- HeapDumpとる
- Eclipse Memory Analyzer
- Duplicate classes
- ☆path to GC Roots で原因を特定(どこに参照が残っているか)
- 伝統的なライブラリでのclassloaderleak
- 最新版ではだいたい直ってる
- Tomcatだけじゃない
- まとめ
- CIでの(ホットデプロイ)での顕在化
- ヒープダンプ見ると原因わかるー
休憩10分
masakkuma 「SonarQubeについて」
(スライド見つからなかった。。。)
- 株式会社エムティーアイ
オフショア管理をしてる
SonerQubeの紹介
- OSSのソースコード静的解析ツール
自動化をやる
- コストの面から、静的解析だけ。
Javaの静的解析。CheckStyle, FindBugs, Jenkins
オフショアの品質比較したい
☆SonerQube Runner
コメントは抜いた行数をだしてくれる
コードの重複率
コードの複雑度
技術的負債
- (どうやって判定している?)
- 技術的負債の全体に対する割合
問題箇所のドリルダウン
dashboardのカスタマイズ
Tips
- メモリ不足(最低1GB、DiskIOも高速である必要あり)
- 文字コードが指定外のものがあるとこける
- 指標は組み合わせてみる
見える化が大事
上司受けがよかった(定量的に見えるから)
おまけで playbookあるよー
komiya_atsushi「あなたと乱数生成とJava」
- SmartNews の人
広告と機械学習 をjavaで(スマートニュース)
乱数生成
- はまりどころ多い
- ☆ThreadLocalRandum
- ☆SecureRandum
commons-math3
- MersenneTwister(乱数生成器)
- Well44497a
- 乱数の周期がものすごいでかい!
- ISAACRandom
- 暗号論的にセキュア?ほんとに?
- ☆RandomDataGenerator
比較(性能、速度について)
- ThreadLocalRandom、Random 並列実行
- ThreadLocalRandomの方が性能劣化しない
- commons-math3の比較(2億回生成)
- ThreadLocalRandomめっちゃ速い
- (2億回をシリアルで実行したの?平均レイテンシ?)
- ThreadLocalRandom、Random 並列実行
どれを使うべきか
- commons-math3は並列実行は避ける(スレッドセーフじゃないので)
jflute 「Java8 stream() にススメ (わりと入門)」
- とりあえず実装を
- 会員テーブルの全件取得
- filter()の例
map()の例
- 今までの書き方と考え方が逆
- (入れ物を用意してから突っ込む → 入れ物は最後に用意するようなイメージ?)
今までのjavaやってた人はstreamやっぱり壁っぽい
なにがちがうのか?
- 「目的レベルがあがった」
- いままでは目的を達成するための手段レベル
- 新しいのは目的を達成するための目的レベルで書く
- 「目的レベルがあがった」
Streamの考え方が重要。
- 手続きから目的へ
kawachi「最小Hello World!チャレンジ」
pLucky 社
javaは10年前くらい
.classファイルを小さくするがお題
まずはJavaで
- 408 byte
javap -c で見る
- コンストラクタは要らないなぁ。。。。
☆Jasminでトライ
- JVM byte code 用アセンブラ
- 303 byte
バイナリで見てみる
- わからん
.class ファイルの読み方
- 「4. The class File Format」
- バイナリが読めるようになってきた
☆constant pool が9割
- SourceFile 属性。なくても動く
- 自クラス名
- 継承元クラスを変更 親クラス
バイナリエディタで修正
- 250 byte !
まとめ
- バイナリいじると普段見れないエラーが見れる
- class読めると、javapの出力に親しみがわく
宣伝タイム
おつかれさまでしたー!