Play your life !

趣味と実益メモ

JJUG CCC 2018 Spring に行ってきたメモ

JJUG CCC 2018 Spring

www.java-users.jp

Container技術が流行ってきた昨今の様々な現場の話を聞けて楽しかったです。 幅広い話を聞いてきました

聞いたセッションは下記。

  • JavaWebサービスを作り続けるための戦略と戦術
  • Concourse CI入門 ライブ環境構築&ビルド
  • 日本最大級の求人検索エンジン「スタンバイ」を支える技術
  • Java10まとめと、どうなるJava11
  • JavaエンジニアのためのDocker入門 〜 仮想開発・テスト環境構築 〜
  • Spring Boot on Kubernetes : Yahoo! ズバトク事例
  • DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話

ビズリーチの方の"JavaWebサービスを作り続けるための戦略と戦術"がかなり参考になりました。
また、ジャストシステムの方の"DDDとクリーンアーキテクチャ"も実践的な事例の話で刺激的でした。

いずれのセッションでも、貴重なノウハウを拝聴できて面白かったです。 登壇者の皆様、ありがとうございました!

以下聞いたセッションのメモ書き

JavaWebサービスを作り続けるための戦略と戦術

感想

スピーカーの方の熱意が伝わってきた。
開発の理想とそのために何をやってきたのか、という話。 手段としてDockerFileを学んでいくべきだというメッセージも強かった。

まとめ

  • 開発環境とは、本番用ではないものすべてのアプリケーションが動く環境を指す
    • エンジニアではない人も触れるもの
    • 動くソフトウェアを作るためのもの
      • 誰かのPCでは動かない、とかはNG
  • あるべき姿
    • setup.shでミドルウェアが全部入る
      • VitrtualBoxがあるかどうか判定→インストール というところから全部一括で行う
      • プロジェクトごとに作成する→複数プロジェクトに参画している人では動かせない、ではNG
    • 仮想OS on 仮想OS
      • docker on VitrtualBox on Mac
    • dockerはなぜ利用するか
      • 単純に早い
      • 未来像として、Container技術に集約されそうな未来がある。
        • dockerfileを作成するのはアプリ開発者である→学ぶべき
    • ツールの変更
      • maven→gradle
        • pom.xmlよりbuild.gradleのほうが読みやすい
        • groovyで何でもかけるからカスタムしやすい
      • jenkinsを2系に。
        • jenkins1系をjenkins 2に。→maven向けのjenkinsfile→mavenをgradleに→JenkinsFileをgradle向けに
    • 目指す先
      • PR一つに対してそれ専用の検証環境が一つ自動構築されるのが理想
      • 環境の空きを待つことなく、いつでも誰でも、確認したいものについて確認できるようにする
  • 老朽化した技術からの脱却
    • JasperReport
      • Java8だとデザインツールが事実上動かないので、独自に作り直した
    • JSessionID
      • セッションCookie名がJSESSIONIDだとドメイン、パス、名前で区別するので都合が悪い→今はもう別の名前で設定できる。
      • ticky-session-cookie の調整も一緒にやる。
    • 設定ファイル.xml
      • java configにまとめましょう
    • webapp
      • もう使わないでおk
    • その他情報たくさんだったけどペース早くてロスト・・・
  • フロントエンド
    • Swaggerすごい。
  • 手動・自動テスト
    • テストコードに価値はなく,その実行結果を見たあとの行動に価値がある
    • PRごとにjenkinsで自動テストが走る
    • MRも工夫。誰かがレビューコメントしないとMergeボタンが押せないようになっている
  • セキュリティ
    • AWSのシークレットOS環境に渡す
    • など。
  • バージョンアップ
    • こまめにバージョンアップするしか無い。
      • この脆弱性は関係ない、で対応してないとあとから強烈なバージョンアップを強いられる。
  • まとめ
    • 誰でも、いつでも、安定的に再現性高めにテストができる世界という理想を目指す

Concourse CI入門 ライブ環境構築&ビルド

資料

https://backpaper0.github.io/jjug-ccc-2018-spring-concourse/slide/index.html#1

感想

Concource使ってみなきゃ。
jenkinsと比べて書き方のコツさえ掴めばすべてコードベースで管理できて良さげ。 (あとあんま関係ないけどViewも鮮やか。)

まとめ

日本最大級の求人検索エンジン「スタンバイ」を支える技術

資料

https://speakerdeck.com/marevol/ri-ben-zui-da-ji-falseqiu-ren-jian-suo-enzin-sutanbai-wozhi-eruji-shu

感想

Elastic SearchのPluginすごい。

やりたいことや運用を楽にするためにどういう構成にするのか、どんなPluginを利用するのか、選択肢が豊富。

まとめ

検索周りの話を中心に。

  • スタンバイ:800万件以上の求人情報を収集して、検索できるしくmi
    • クローリングなどから収集したデータをElasticSearchに格納
    • 利用者はそこから検索する
      • 検索のサジェストはログから生成
  • Elastic Search
  • インデックスのしかけ
  • 検索周りのしかけ
    • フレーズマッチングとtitleなどマッチ箇所に応じた重み付け
    • ワード単体のマッチングによる検索結果の補完
  • Elastic SearchのPlugin
    • Javaで書くことができる
      • 拡張したいプラグインを継承して、追加したい機能を追加することが可能(例えばAPIであれば応答するパスなどで拡張できる。
    • ES自体のバージョンへの依存が激しい
  • 全体の仕掛けを運用する際の課題と解決
    • インデックスのバックアップや辞書の配布などの課題

Java10まとめと、どうなるJava11

(このあたりから私の体力が尽きてくる

資料

https://www.slideshare.net/nowokay/java10-and-11

感想

リリースモデルの復習と新規機能について。
Raw Stringの話とStringの新API、Single-Fileでのjava実行、HEISEI問題が興味をそそられる話でした。
対応していかなきゃ。

まとめ

気になったものベースで

  • 新リリースモデル
    • 機能のリリースは春分秋分目安
    • 8
      • 個人ユーザーについては2020/12まで
      • お仕事で使う場合は2019/1
  • JDK 10
  • JDK 11
    • ソースファイルが一個だけならコンパイルしなくても実行できるようになる→つまりjava Hello.javaでHelloWorldとか。
    • Raw String Literals
      • バッククォートで書ける
    • String API
      • repeat, strip など。→Raw Stringのための対応?
    • ArrayIndexOutofBoundsExceptionのメッセージが親切に。
      • 地味に嬉しい
  • about java support
    • End of HEISEI問題
      • NewEraという対応の仕方をする模様
        • 2019/4には入るかも
        • 現在議論中なので積極的に参加していきましょうとのこと

JavaエンジニアのためのDocker入門 〜 仮想開発・テスト環境構築 〜

感想

そもそもコンテナとはどういう存在なのか、というところから。
docker経験ありnot基礎知識みたいな感じの身なので、参考になった。

まとめ

  • Dockerコンテナ
    • あたかもサーバのように動いているもの
    • コンテナ上には。OSは入っていない。ミドルとアプリだけが入っている
      • 追記:ホストのKernelやベースOSの機能を共有しているっぽい
  • Docker hubリポジトリ
    • イチから書くのは面倒。なのでdocker imageを共有する仕組みがある
    • ただし、玉石混交なので信頼できない個人のイメージよりは、公式か、自分で書いて作ったほうが良い。
  • 注意すべきこと
    • コンテナは基本使い捨て。永続化したい情報とかは乗っけない方が良い。
    • bashで入ってなにか作業して整えた→ちゃんとその変更分もdockerFileに記述してやることで、冪等性を確保する。
  • Java10のDocker対応
    • JVMがDockerで動いていると認識していなかったのが治った
      • 今まではホストの設定しかみていなかったっぽい?

Spring Boot on Kubernetes : Yahoo! ズバトク事例

感想

めっちゃくちゃ濃かった。
貴重なノウハウを共有していただけてありがたいです。

まとめ

結構情報が抜け落ちているのであとで資料を見たい

  • yahoo!ズバトク
    • くじやキャンペーンを掲載するためのプラットフォーム
    • 需要のUPに対して運用や改修のコストがかかりすぎていて辛かった
      • 現行システムでは限界だったので、k8sを利用して作り直した
  • kubernetes
    • コンテナのオーケストレーションプラットフォーム
      • fail overの管理や異常検知、スケーリング、リクエストの負荷分散など課題の解決に有効そう
  • システム移行
    • jenkins→concource
    • PHPでモノリシック→javaでマイクロサービス
      • DDDで機能分割、全体で40サービスほどに。
  • k8sを有効活用するためにtwelve-factor appに沿うように改善。
    • ヘルスチェック
      • actuatorを利用
    • Graceful Shutdown
      • Jettyの機能だけではうまく実現できなかった→自前で実装して実現
    • ログ出力
      • Spring Cloud Sleuth→依存を追加するだけでリクエストで一意なIDを出力。
      • 40サービスあるので、こういった仕掛けがないと厳しい。
  • 開発フローの改善
    • Git上でオペレーションが簡潔するフロー
    • PRがトリガーになって運用が走る構造
      • 実働10分程度でデプロイ完了できるように。(もともと数時間
  • 大変だったこと
    • 社内の連携や考え方のスイッチなど。
  • まだ改善の余地あり。

DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話

感想

実践的!DDDやクリーンアーキテクチャをどう組んでいったのか、プラクティスの話は新鮮だったので参考にできればいいなと。

まとめ

  • 長いことやってるPJ
    • スクラップ&ビルドしている
    • コンセプトはあり、仕様の概要は決まっている
  • 諸々の問題
    • サーバから全データをダウンロード
    • コンポーネントがDBと接続
      • DBの変更に対してのWEBサーバ影響がでかい
  • 解決策としてのDDD
  • 設計段階
    • まずは力をつける
      • 本を読む。特にDDDの二冊と増田さんの本
    • 上司説明
      • 世の中に出ていくものはなんなのか、エレベーターピッチする
      • 利用シナリオを定義
    • ロバストネス分析
      • ユースケースシナリオを作った。どういう機能があったらよいか?
      • 各要素の定義
        • バウンダリ→画面、クーロン
        • エンティティ→DB,情報、テーブル
        • コントロール→処理。ユーザー認証とか -ノートに手書き→二人で書いては消しを繰り返し、良さそうな方を採用
    • コンテキストマップ
      • ロバストネス図をもとに、似たものを集めて、"境界づけられたコンテキスト"を規定した
      • 書いて→直して→書いて→直して
        • コンテキスト間の関係について、慎重に判断した。
      • 分割
      • 分割したドメイン間の関係を、パートナーシップ、顧客/供給者、順応者の類型に分ける
    • ユビキタス言語
      • 開発の中での用語を統一、gitlabのwikiに記載して徹底した
      • プログラム中での呼び方まで定義→かなり高評価
  • 実装前の準備
    • ルールを定義
      • packageの定義
      • オラクルベースのコーディング規約
      • 各構造の話(資料見なおすべき。)
        • translatorは利用者の言葉を自分たちの言葉にする
        • コントローラで受けたものを、domain層の要素を使って業務ロジックに落とし込む
        • ビジネスロジックに関与しないものはlibraryに集める
        • domain,gateway, repositoryの考え方
  • 実装してみてわかったこと
    • translatorがかなり頑張る必要がある
      • (現実のドメインと物理データの境界をつなぐものなので、確かにとは思った。
    • ルール以外のことはバラバラ
      • APIとか。リトライの実装方式などがバラバラに。
    • null チェック
      • nullチェックは適材適所→おk
    • その他も本当にバラバラ
  • やってみてよかったこととわるかったこと
    • モノリスからの開放
    • RDB/キャッシュ分離で責任範囲が明確
      • 他のコンテキストの実装者が触れられないので汚れることがない
    • 新技術への挑戦
      • Docker
      • AWS ECS
      • GitLab CI
        • 挑戦しやすい環境があるのはいいこと
    • 改善の余地あり
      • ルールの徹底
        • ATOKが覚えるほどの同じ指摘
      • ルール内容にも課題があるのかもしれない

Java Day Tokyo 2018 に行ってきた話

Oracle Java Day Tokyo 2018

OracleJavaイベントに参加してきました。
昨年も参加したイベントですが、コンテナを導入していくぜって雰囲気の昨年と比べると、コンテナを実践していくぜ、JVMを改良していくぜといった雰囲気の話が多かった印象です。
私は主にリリースモデルやコンテナ周りのセッションを聞いてました。

概要はこちら

本記事は私のメモ書きと感想です。

keynote

所感

リリースサイクルの話と11に向けて各パラレルで動いているProjectの話が大半だった
昨年との比較としては、昨年はコンテナに注力していくぜ!だったのがコンテナはもう当たり前に使うものだ、みたいな潮流になっていた。
コンテナやサーバーレスといったアーキテクチャの新しい選択肢について、具体的なメリットの説明が加えられるようになっていたので、これからもその流れなんだろうなと。

GCとかフライトレコーダーとかの開発・改善も徐々にオープン化したりして進めているっぽい。 率先してオープンにしていっているのは良い変化なんだろうなと。
フライトレコーダーのデモはeclipseにembedされてた感じのものだったけど、分析結果が明瞭で利用価値がありそうだった。

サーバーレスとかコンテナをサポートするよ!っていうところが強調されてた。特にjava ee
process上にdocker浮かべてってのも紹介されていたけど、処理を分散、パラレルで実行、は良さそう。
検索部分だけでもこういう仕組み仕込むと面白いかもしれない。

[TEC-2] Container Nativeアプリケーション開発とアーキテクチャの勘所

MicroServicesにおける課題を解決するためのContainer、みたいな筋が明確で、一番参考になったかもしれない。

資料

http://otndnld.oracle.co.jp/ondemand/javaday2018/TEC-2

まとめると

  • MicroServicesには課題がいっぱい
    • アーキテクチャ
      • 障害対応、スケール、全体的にかかるオーバーヘッド
    • 運用
      • 横断的な監視、デバッグの困難さ、セキュリティ
    • 開発プロセス
      • 複数サービスの組み合わせテスト
      • CI/CD
      • カナリーデプロイメントやグリーン・ブルーデプロイメント
  • 課題を解決する一つの手段がConainerとそのオーケストレーションツールを利用した方法。Kubernatesがその実装の一つ。
    • 活かせない例
      • 一つのコンテナに多くの機能を詰め込みすぎるケース
      • Container自体の品質が悪いケース
    • 活かせる例
      • 低レイヤーの共通処理は別コンテナに切り出す
      • initContainerパターン
    • 様々なデザインパターン
  • Oracle Cloudのツールを使うと比較的容易に実践できる。
      - [Oracle COnteiner Pipelines Werker[(http://www.wercker.com/)
    

[TEC-3] Running Java applications on Docker: practical tips and valuable insights

dockerでjavaを動かす際のメモリやCPU周りについてのTIPSについて。

資料

http://otndnld.oracle.co.jp/ondemand/javaday2018/TEC-3

まとめ

  • 3つの問題
    • アプリから実際に使えるメモリが見えない
    • アプリから実際に使えるCPUが見えない
    • docker上だとエントロピーに基づくランダム数を出すことが出来ない
  • 解決策
    • 実行時の変数でメモリ指定
    • ライブラリの中に明確にCPUを指定できるものがあるのでその該当する環境変数をオーバライドする
    • エントロピーを引き渡せるように設定を変更する
  • デバッグとインテグレーションテスト
    • 基本的にはmavenを活用すれば大丈夫そう。
  • サンプル

[JSE-3] JDKの新しいリリースモデル

OpenJDKとOracle JDKのリリースモデルについて。
独特なサイクルになるので注意すべきって話と、11LTSになるといろいろ話が変わるという話。

資料

http://otndnld.oracle.co.jp/ondemand/javaday2018/JSE-3

まとめ

  • 機能か、リリースか
    • 大規模な更新を待つとどうしてもリリースが不定期になる
    • 小規模な機能開発でもリリースしていきたい
  • クラウド環境に適応しているか
    • マイクロサービスを意識したモデルに変更したい
    • コンテナイメージも配布を始めた。
  • フィーチャーリリース
    • 年6回のリリースで、3月9月に機能リリース
    • SE 8 の商用機能の利用が可能に
  • LTSリリース
    • 3年ごとのフィーチャーリリースのバージョンに設定
  • 利用可能になる商用機能
    • ZGC
    • Flight Recorder
    • 他。
  • JDKに含まれなくなるものも一部ある
  • Java Plugin から移行のお願い
    • 切実な雰囲気。
  • JRE
    • 基本的には配布するアプリケーションベンダー側でアップデートしてほしい雰囲気
  • リリースに対する要望
    • より速く計画的に完成した機能をリリースする
    • よりシンプルかつ再配布可能なバイナリのライセンス体系
  • Oracleのバイナリ配布サイクル
    • 9,10は移行期間
      • 11移行は安定して半年ごとのアップとLTSになる。
      • 12~15について長期サポートされない。=結局次のLTSまで待ったほうが良い、
      • 無償版の脆弱性対策→機能追加のところでそういう対応はしない、今までのサイクルどおりで脆弱性対応はしていく
  • これからの開発について
    • 利用しない新機能よりも、非推奨APIなど、使えなくなる機能について対応することが優先
    • セキュリティロードマップを注意しておくこと。
    • Java SE Javaとしての振る舞いをチューニングしていく
      • Graal 多言語対応

[JSE-5] Java SE 10、そしてJava SE 11への移行ガイド

現場目線での移行のポイント解説

資料

http://otndnld.oracle.co.jp/ondemand/javaday2018/JSE-5

まとめ

  • CHECK1 Deprecated
    • Deprecated;forRemovalなもの 絶対消えるので修正しないといけない
    • NO MORE Applet No More Java Web Star
  • CHECK2 Prohibit Access to JDK Internal APIs
    • sun~,com.sun~など・・・ -
    • 一応、command lineからは --add-exportしてあげると公開できるので、普通に動かせるようにはなる。
  • CHECK3 Reflection
    • illegal rflctive access operation has occuredと出る
    • --add-opens すると一応実行できる
  • CHECK4 Remove Java EE Module
    • packageを複数のモジュールに紐付けられなくなるので、ちゃんとjava eeの方の本流の方に戻していかないと使えなくなってしまう
    • JAXBとかJAXWS → 11では使えない
    • --add-modulesで追加してあげると、一応動く。追加でモジュールを使えるようにする。
      • つまり標準のモジュールパスを拡張してあげればよい
        • ただし11では完全になくなる
  • CHECK5 Module Defines* Dependency Disclosure scope
    • jarファイルのメタ情報としてモジュールの情報を付与できる
    • この辺ちょっとうろ覚え...
  • CHECK6 Module path class path
    • Class Pathの世界とModule Pathの世界を両立させる必要がある
      • ライブラリの依存関係的に、モジュールパスだけではうまくいかない
      • 一方で、class pathというのだけではうまくいかない
        • 直接アクセスするか、間接的にアクセスするのか、でmodule,non moduleを分けて考える
        • --add-moduleds ALL-MODULE-PATHといった呪文で解決してやる。
  • CHECK7 JavaFXがない
  • CHECK8 Incubator Module
    • 名前が変わる場合がある。
      • 例えばIncubator 配下のモジュールがリネームされることがある。
      • ModuleInfo とかで注意しとかないとまずい

[BN-3] 50分で最新技術学習の基礎を身に付ける

爆速で技術用語を総ざらいする感じ。

資料

http://otndnld.oracle.co.jp/ondemand/javaday2018/BN-3

まとめ

  • マイクロサービスについてそれっぽいことが言えるようになる。
    • 大体資料の通り。お見事。

総括的な感想

ざっくり言えば、Containerを利用してマイクロサービスを実践していく流れと、それによって要請されるJavaの方向性との両方に気を配っていくべきだと感じた。
dockerやkubernatesなどサポートする環境が整ってきたこともあり、そろそろ自分でも触ってみることが大事かなと。

書籍やセッションを聞くと、わかった気にはなるし、[BN-3]セッションの内容のように、それっぽいことは言えるようにはなる。
ただその一方で、それを形にしてどう?と言えないと現場で使えるとは言えないんだろうなと。

そんな感じ!!

このブログについて

私について

javaエンジニアです。  

趣味はエレキギター宅録です。また、アニメや同人といったサブカルも好きなのでそのあたりの記事も書く・・・かも。

 

何を書くか

基本的にはエレキギター宅録に関連した記事と、IT技術に関連した記事の二毛作で投稿していく予定です。よろしくお願いいたします。

 

ひとまず投稿数目標

最低週1記事、合計15投稿を目標の目安として、ゆるく続け・・・たい。  

継続は力。