11月18日にJJUG CCCに行ってきたので、
その内容をメモメモ
まずは、前半(表題の件は、最後のほう
「JavaSE9の紹介:モジュール・システムを中心に」で記述)
■サンプルアプリケーションで学ぶ
Apache Cassandraを使ったJavaアプリケーションの作り方
・コード Github スライドslideshareにあがっているよ
・Cassandraなにか知ってること前提
・自己紹介
・今日の目標
→サンプルアプリケーションがあるというところを持って帰ってください
・アプリケーションの変遷
モバイル、IoT:ユーザー増えてきた
→スケールするアプリケーションを支える
データベースもスケールしないと
・Cassandra:スケールしてもパフォーマンスを落とさない
・サンプルになるソース あります
http://killrvideo.com
→https://killrvideo..github.io/
→これを、持って帰ってください
・KillrVideo
スケーラブルなマイクロサービスアーキテクチャ
アーキテクチャ
スケーラブルにできるように想定
Javaでも環境
https://github.com/killervideo/killrvideo-java
デモ:起動してみる
・Web層
node.jsで実装(フロントエンド)
React,Rcore
セッション管理にCassandra利用:CassandraSession
ユーザー認証はマイクロサービス利用
→Javaだろ、spring-session,apache shiro
・マイクロサービス
gRPCを利用
プログラミング言語非依存
プロセスを分けるならKafka連携とか
・gRPCとは
Googleの内部RPC(Stubby)をもとにオープンソース
ProtocolBuffer v3を利用、HTTP/2、双方向ストリーミング
gRPCサービスの定義
スタブの自動生成:mavenプラグインで
基本はStreamObserverを利用した非同期呼び出し、
非同期実行、同期実行
Springから呼び出し、
・Cassandraに接続
ドライバ作っているよ(やりとりは、こみにてぃで議論)
クラスタービルダーを作って、接続するIPアドレス、認証情報などを設定
クラスター作る
生成
セッション:コネクションプーリングを管理
・Cassandraのデータモデリング
データモデリングの原則
データを知る
クエリを知る
非正規化
データをネストする
データを重複してもつ
→Joinの機能がない
なぜ:クエリがスキーマのデザインを決める
→クエリの変更はスキーマの変更を伴う
→特異なアクセスパターンは限られている
Xテーブルスキャン、複数テーブル
詳しくは
RDB開発者のための・・・ スライドシェアでみてね!
・ドライバーの利用
バッチ登録
クエリービルダーの利用:ステートメントの組み立て
ページング:取得件数の指定とページング resultsetで
オフセットページング(いきなり5ページに飛ぶとか)は実装されてない
実行結果の取得:resultsetの中に、自動ページング機能→裏側で自動フェッチ
データマッパー:エンティティクラスの準備、マッパーの準備
・まとめ
https://killrvideo..github.io/
マイクロサービスを利用したスケーラブルなアプリケーションを作るときの参考に
アーキテクチャ
フレームワーク・ドライバー
データモデリング
■サーバーサイドkotlin
・書けば普通に動く
・日本語の響き:かわいい→そこがネック
・まえおき
kotlinはそれほどとがった言語ではない
・結論
サーバーサイドでも問題なくkotlinは使えます
・今日喋ること
なぜkotlinメインに
・自己紹介
・作ってるもの、秘密(Webアプリ)
AWS、バックエンドPostgres,認証cogniteに任せてる
思い処理はらむだに
webアプリケーションサーバー、らむだ、でkotlin使う
→クライアント側は書いていない
・なぜkotlinを採用したか
Javaの言語について:20年以上たっている。冗長
classのなかにメソッドを書くのはめんどくさい
検査例外:kotlinはない(上に投げられる)
Lombok:冗長性をある程度解放
Javaでもある程度ハッピー
関数がオブジェクトでない
荒ぶるlombok
不満があっても、JVM自体は悪くない
python2→3の互換性に比べて
Javaの豊富なライブラリ
JVM言語でBetter Java→学習コストが低いこと
・Scalaは悪くない、でも、難しい…
型合わせゲーム
・そこでkotlin
Javaの不満をある程度解消、scalaほど複雑でない
Androidの正式開発言語
Javaとの相互運用性
・開発環境・フレームワーク・ライブラリ
IDE:Eclipse,IntelliJAndroid Studio
フレームワーク:
kotlin製 kter、から、わさび
Java製:Spring Boot
ORマッパー
Exposed:バgつが多い
ビルド
基本的にgradle(こだわりない)
finalを外した状態で
・使ってみて
kotlinのstream的なもの
ベンチマークのテストやってみた
kotlinおそい→asシーケンスで早くなる
annotationの違い
デフォルト引数とDI
・不満なところ
ぱいぷらいんがほしい
()は省略したい
・けつろん。もんだいないだいじょうぶだ。
■JavaSE9の紹介:モジュール・システムを中心に
・自己紹介
・あらまし
JavaSE9:モジュールシステム
地味なアップデートも外観
・そもそもJavaSEって?
JavaSE 処理系の規格(すたんだーど えでぃしょん)
JavaEE エンタープライズえでぃしょん サーブレット、JMX,EJBなど
JavaSEタイムライン
2004 JavaSE5 じぇねりくす、マルチスレッド
2014 JavaSE8 ラムダ式、ストリームAPI
2017 JavaSE9 モジュールシステム じぐぞー
→字面は比較的地味、基盤はおおきい
・目的
心の準備ができること
・CCC_E4のハッシュタグにリンク貼ってある
そのスライドで「高度」な話観てね
・背景
Jave8までの課題
JAR地獄
内部パッケージ
Java8内部向けパッケージ
・モジュールシステムの基本
JARファイルを配置の単位に
モジュール単位で依存関係を整理
内部向けパッケージを使えないようにする
パッケージ衝突の検知
モジュール名を付ける
module-info.java
exports命令で公開パッケージを指定できる
→自分自身が使うモジュールをrequires命令で指定する
require先がないと、コンパイルエラーになる
標準ライブラリもモジュールに
java.baseはrequireされている
・リフレクション
こまるときDI
パッケージをexportしたくない、publicしたくないけど、リフレクションしたい
→opens命令
→リフレクションは魔法の杖ではない
・コンパイルと実行
モジュールパスという配置方法
クラスパスとは別
実行:初期モジュール(mainモジュール)から推移位的に参照されるモジュール
だけが実行モジュールに入る
・経過措置
無名モジュール:クラスパスのクラスは、無名モジュールに入る
自動モジュール:モジュールパス上にありながらmodule-infoにない
オートマチックモジュールネームまたはjarファイル名から
・移行
ライブラリ:今すぐモジュール化
プラグイン
APサーバー上のアプリケーション
・ライブラリのモジュール化
jarファイル名ベースの自動モジュールをrequiresしてはいけない!
8以前のサポート
・テスト
2種類のテスト
ブラックボックステスト
ホワイトボックステスト
JUnitなんかにどうやって入れる?
方法
正攻法:一時的に書き換える
次善の策:クラスパスに入れる
Java9モジュラりてぃ おらいりー
・他のUPDATE
コレクションのファクトリ
try-with-resources
インターフェースのprivateメソッド
匿名クラスにダイヤモンド演算子
リソースバンドル:いままでlatin1だったが、UTF-8でOKになった
(プロパティはlatin1のまま)
Reactive Streamsサポート
プロセスAPIの強化
その内容をメモメモ
まずは、前半(表題の件は、最後のほう
「JavaSE9の紹介:モジュール・システムを中心に」で記述)
■サンプルアプリケーションで学ぶ
Apache Cassandraを使ったJavaアプリケーションの作り方
・コード Github スライドslideshareにあがっているよ
・Cassandraなにか知ってること前提
・自己紹介
・今日の目標
→サンプルアプリケーションがあるというところを持って帰ってください
・アプリケーションの変遷
モバイル、IoT:ユーザー増えてきた
→スケールするアプリケーションを支える
データベースもスケールしないと
・Cassandra:スケールしてもパフォーマンスを落とさない
・サンプルになるソース あります
http://killrvideo.com
→https://killrvideo..github.io/
→これを、持って帰ってください
・KillrVideo
スケーラブルなマイクロサービスアーキテクチャ
アーキテクチャ
スケーラブルにできるように想定
Javaでも環境
https://github.com/killervideo/killrvideo-java
デモ:起動してみる
・Web層
node.jsで実装(フロントエンド)
React,Rcore
セッション管理にCassandra利用:CassandraSession
ユーザー認証はマイクロサービス利用
→Javaだろ、spring-session,apache shiro
・マイクロサービス
gRPCを利用
プログラミング言語非依存
プロセスを分けるならKafka連携とか
・gRPCとは
Googleの内部RPC(Stubby)をもとにオープンソース
ProtocolBuffer v3を利用、HTTP/2、双方向ストリーミング
gRPCサービスの定義
スタブの自動生成:mavenプラグインで
基本はStreamObserverを利用した非同期呼び出し、
非同期実行、同期実行
Springから呼び出し、
・Cassandraに接続
ドライバ作っているよ(やりとりは、こみにてぃで議論)
クラスタービルダーを作って、接続するIPアドレス、認証情報などを設定
クラスター作る
生成
セッション:コネクションプーリングを管理
・Cassandraのデータモデリング
データモデリングの原則
データを知る
クエリを知る
非正規化
データをネストする
データを重複してもつ
→Joinの機能がない
なぜ:クエリがスキーマのデザインを決める
→クエリの変更はスキーマの変更を伴う
→特異なアクセスパターンは限られている
Xテーブルスキャン、複数テーブル
詳しくは
RDB開発者のための・・・ スライドシェアでみてね!
・ドライバーの利用
バッチ登録
クエリービルダーの利用:ステートメントの組み立て
ページング:取得件数の指定とページング resultsetで
オフセットページング(いきなり5ページに飛ぶとか)は実装されてない
実行結果の取得:resultsetの中に、自動ページング機能→裏側で自動フェッチ
データマッパー:エンティティクラスの準備、マッパーの準備
・まとめ
https://killrvideo..github.io/
マイクロサービスを利用したスケーラブルなアプリケーションを作るときの参考に
アーキテクチャ
フレームワーク・ドライバー
データモデリング
■サーバーサイドkotlin
・書けば普通に動く
・日本語の響き:かわいい→そこがネック
・まえおき
kotlinはそれほどとがった言語ではない
・結論
サーバーサイドでも問題なくkotlinは使えます
・今日喋ること
なぜkotlinメインに
・自己紹介
・作ってるもの、秘密(Webアプリ)
AWS、バックエンドPostgres,認証cogniteに任せてる
思い処理はらむだに
webアプリケーションサーバー、らむだ、でkotlin使う
→クライアント側は書いていない
・なぜkotlinを採用したか
Javaの言語について:20年以上たっている。冗長
classのなかにメソッドを書くのはめんどくさい
検査例外:kotlinはない(上に投げられる)
Lombok:冗長性をある程度解放
Javaでもある程度ハッピー
関数がオブジェクトでない
荒ぶるlombok
不満があっても、JVM自体は悪くない
python2→3の互換性に比べて
Javaの豊富なライブラリ
JVM言語でBetter Java→学習コストが低いこと
・Scalaは悪くない、でも、難しい…
型合わせゲーム
・そこでkotlin
Javaの不満をある程度解消、scalaほど複雑でない
Androidの正式開発言語
Javaとの相互運用性
・開発環境・フレームワーク・ライブラリ
IDE:Eclipse,IntelliJAndroid Studio
フレームワーク:
kotlin製 kter、から、わさび
Java製:Spring Boot
ORマッパー
Exposed:バgつが多い
ビルド
基本的にgradle(こだわりない)
finalを外した状態で
・使ってみて
kotlinのstream的なもの
ベンチマークのテストやってみた
kotlinおそい→asシーケンスで早くなる
annotationの違い
デフォルト引数とDI
・不満なところ
ぱいぷらいんがほしい
()は省略したい
・けつろん。もんだいないだいじょうぶだ。
■JavaSE9の紹介:モジュール・システムを中心に
・自己紹介
・あらまし
JavaSE9:モジュールシステム
地味なアップデートも外観
・そもそもJavaSEって?
JavaSE 処理系の規格(すたんだーど えでぃしょん)
JavaEE エンタープライズえでぃしょん サーブレット、JMX,EJBなど
JavaSEタイムライン
2004 JavaSE5 じぇねりくす、マルチスレッド
2014 JavaSE8 ラムダ式、ストリームAPI
2017 JavaSE9 モジュールシステム じぐぞー
→字面は比較的地味、基盤はおおきい
・目的
心の準備ができること
・CCC_E4のハッシュタグにリンク貼ってある
そのスライドで「高度」な話観てね
・背景
Jave8までの課題
JAR地獄
内部パッケージ
Java8内部向けパッケージ
・モジュールシステムの基本
JARファイルを配置の単位に
モジュール単位で依存関係を整理
内部向けパッケージを使えないようにする
パッケージ衝突の検知
モジュール名を付ける
module-info.java
exports命令で公開パッケージを指定できる
→自分自身が使うモジュールをrequires命令で指定する
require先がないと、コンパイルエラーになる
標準ライブラリもモジュールに
java.baseはrequireされている
・リフレクション
こまるときDI
パッケージをexportしたくない、publicしたくないけど、リフレクションしたい
→opens命令
→リフレクションは魔法の杖ではない
・コンパイルと実行
モジュールパスという配置方法
クラスパスとは別
実行:初期モジュール(mainモジュール)から推移位的に参照されるモジュール
だけが実行モジュールに入る
・経過措置
無名モジュール:クラスパスのクラスは、無名モジュールに入る
自動モジュール:モジュールパス上にありながらmodule-infoにない
オートマチックモジュールネームまたはjarファイル名から
・移行
ライブラリ:今すぐモジュール化
プラグイン
APサーバー上のアプリケーション
・ライブラリのモジュール化
jarファイル名ベースの自動モジュールをrequiresしてはいけない!
8以前のサポート
・テスト
2種類のテスト
ブラックボックステスト
ホワイトボックステスト
JUnitなんかにどうやって入れる?
方法
正攻法:一時的に書き換える
次善の策:クラスパスに入れる
Java9モジュラりてぃ おらいりー
・他のUPDATE
コレクションのファクトリ
try-with-resources
インターフェースのprivateメソッド
匿名クラスにダイヤモンド演算子
リソースバンドル:いままでlatin1だったが、UTF-8でOKになった
(プロパティはlatin1のまま)
Reactive Streamsサポート
プロセスAPIの強化