Save 37% off PRO during our Black Friday Sale! »

How Unext took in Eclipse Collections in FW

How Unext took in Eclipse Collections in FW

for JJUG CCC 2018.
Eclipse Collections, LastaFlute, Gson, Hibernate Validator

169756d3a309bc4e77d6801a61b7b094?s=128

jflute

May 26, 2018
Tweet

Transcript

  1. Eclipse Collectionsを 現場に浸透させるための フレームワーク対応 U-NEXT 技術顧問 久保 雅彦 ( jflute

    ) 2018.5.26 JJUG CCC 2018 Spring
  2. まずは自己紹介 久保 雅彦 ( jflute ) OSS開発 LastaFlute : WEB

    Framework DBFlute : DB管理支援ツール & O/R Mapper U-NEXTでは、サーバーサイド技術顧問として 現場フォローを行っている Twitter : @jflute Blog : http://d.hatena.ne.jp/jflute/
  3. Eclipse Collectionsのちょこっと紹介

  4. Eclipse Collectionsのちょこっと紹介 さっそくライヴコーディング jflute が Eclipse で Eclipse Collections 書くよ、バババッ

  5. Eclipse Collectionsのちょこっと紹介 Eclipse Collections自体の詳しい話は、 前回JJUGで発表された、 U-NEXT ながほりさんのスライドを! http://slides.com/nashcft/jjug_ccc_2017_fall/#/

  6. Eclipse Collectionsのちょこっと紹介 ずばりジレンマ 「Java組み込みじゃないので、 フレームワークが対応してない」

  7. Eclipse Collectionsのちょこっと紹介 java.util.List と ImmutableList の往復修行

  8. Eclipse Collectionsのちょこっと紹介 Eclipse Collections便利だけれど... 最後は結局 java.util.List 最初は結局 java.util.List

  9. Gson で ImmutableList 対応

  10. Gsonで ImmutableList 対応 JSONクラスのプロパティの型でも ImmutableList 使いたいよぉ from 現場

  11. Gsonで ImmutableList 対応 (> <

  12. Gsonで ImmutableList 対応 まあ、確かに..... Now Live Coding

  13. Gsonで ImmutableList 対応 さあ、Gsonさんを拡張するぞー

  14. Gsonで ImmutableList 対応 LastaFlute 経由で、できるようになった! Now Live Coding

  15. Gsonで ImmutableList 対応 独自のコレクション型を設定できるように Now Live Coding

  16. Gsonで ImmutableList 対応 実は、思ったより大変だったぞぅ(><

  17. Gsonで ImmutableList 対応 さあ、何が大変だったか? どう実現しているか? Let's ソースコードリーディング !

  18. Gsonで ImmutableList 対応 GsonBuilder の registerTypeAdapterFactory() に到着 Now Reading Source

    Code
  19. Gsonで ImmutableList 対応 TypeAdapterFactory を継承したクラスを作って登録 Now Reading Source Code

  20. Gsonで ImmutableList 対応 LaYourCollectionTypeAdapterFactory… La は、LastaFlute の La だよね? でも、パッケージが

    com.google.gson.internal.bind だぞぅ。 なぜなぜ? Now Reading Source Code
  21. Gsonで ImmutableList 対応 TypeAdapterRuntimeTypeWrapper が package スコープでした(>< 呼べない.... けど、中で利用したいクラスだし、 重要そうな処理なので、あまり自作したくないので呼びたい。

    Now Reading Source Code
  22. Gsonで ImmutableList 対応 そもそも組み込みの CollectionTypeAdapterFactory を継承して... とか考えたけど、final 付いてるし private も多いので

    参考するだけ。 それなりに Gson 内部実装を まんま自分でも実装しないといけなかった ! Now Reading Source Code
  23. Gsonで ImmutableList 対応 でもまあ、できたはできた!(^^ Now Live Coding

  24. Hibernate Validator で ImmutableList 対応

  25. Hibernate Validator が ImmutableList で効かないときがあるよぉ from 現場 Hibernate Validatorで ImmutableList

    対応
  26. (> < Hibernate Validatorで ImmutableList 対応

  27. Hibernate Validatorで ImmutableList 対応 実はわりとそのまま使えるのもある List 関係ないアノテーションなど

  28. NotEmpty, Length, Size などだと... Hibernate Validatorで ImmutableList 対応

  29. でも、LastaFlute 提供の Required は効く...おや!?なぜ? Hibernate Validatorで ImmutableList 対応

  30. おおぉ、instanceof 先生...んっ? ImmutableList も Collection のインスタンス? Hibernate Validatorで ImmutableList 対応

    Now Reading Source Code
  31. いま一度継承関係をおさらい ImmutableList (implements Iterable) ┗ AbstractImmutableList (implements List) ┗ ImmutableArrayList

    Hibernate Validatorで ImmutableList 対応 Now Reading Source Code
  32. ImmutableList のインスタンスは java.util.List である! なので、instanceof で判定してるものは動く Hibernate Validatorで ImmutableList 対応

  33. ただ、組み込みのアノテーションは、 (恐らく) 大抵宣言されている型で判断してるっぽいので... とりあえず現場から要求のあった Size を対応 (Required があったので、NotEmpty はあまり必要とされず) Hibernate

    Validatorで ImmutableList 対応
  34. LastaFluteで、このようにすると対応できる1 Hibernate Validatorで ImmutableList 対応 Now Reading Source Code

  35. LastaFluteで、このようにすると対応できる2 Hibernate Validatorで ImmutableList 対応 Now Reading Source Code

  36. LastaFluteで、このようにすると対応できる3 Hibernate Validatorで ImmutableList 対応 Now Reading Source Code

  37. つまり、Hibernate Validator の... ImmutableListのSize対応のConstraintValidatorを作って、 DefaultConstraintMappingで定義して、そしてそれを、 HibernateValidatorConfiguration@addMapping() で、登録する。 Hibernate Validatorで ImmutableList

    対応
  38. まったく同じ要領で、 NotEmpty や Length も対応できるはず (必要になってないので、まだやってないけど... ) Hibernate Validatorで ImmutableList

    対応
  39. めでたしめで... Hibernate Validatorで ImmutableList 対応

  40. まだ冒険あります。 Hibernate Validator を 5.x から 6.x にアップグレードしたら、 ImmutableList の要素のクラスの

    バリデーションのエラーメッセージが出なくなった。 (若干記憶が曖昧ですが、確かそのような現象だったような) Hibernate Validatorで ImmutableList 対応
  41. Hibernate Validator から戻ってくるパス文字列が、 5.x: sea[2].mystic 6.x: sea[].mystic … 消えてる! というか、もともとなんで動いてた?

    Hibernate Validatorで ImmutableList 対応
  42. 深く追えてないのですが、恐らく... ImmutableList (implements Iterable) ┗ AbstractImmutableList (implements List) ┗ ImmutableArrayList

    インスタンスの型で、たまたま「動いちゃってた」って 感じなのかもしれない。そこに頼らないほうがいいかも!? Hibernate Validatorで ImmutableList 対応
  43. まあ、とにかく LastaFlute でこのようにして対応1 [App]ActionAdjustmentProvider : Hibernate Validatorで ImmutableList 対応 Now

    Reading Source Code
  44. まあ、とにかく LastaFlute でこのようにして対応2 [App]ActionAdjustmentProvider : Hibernate Validatorで ImmutableList 対応 Now

    Reading Source Code
  45. つまり、Hibernate Validator の... ImmutableList専用の ValueExtractor クラスを作成して HibernateValidatorConfiguration@addValueExtractor()で、登録する。 Hibernate Validatorで ImmutableList

    対応
  46. ふぅ Hibernate Validatorで ImmutableList 対応

  47. Formの受け取り で ImmutableList 対応

  48. 普通のHTMLリクエスト受け取る FormのプロパティでImmu… わかったわかった、もうわかった from 現場 Form の受け取りで ImmutableList 対応 from

    jflute
  49. セッション残り時間があったら、 コードを読みます! Form の受け取りで ImmutableList 対応

  50. これは完全に LastaFlute だけの話で、 該当箇所は ActionFormMapper クラス。 [App]ActionAdjustmentProvider で、 ImmutableList 情報を登録します。

    (要領は今までのとほぼ同じ) Form の受け取りで ImmutableList 対応
  51. とにかく感想は... ImmutableList を使う方はImmutableで嬉しいけど、 ImmutableList に値をマッピングするフレームワークの方は、 「追加でっきーーん」 ...ってまあ、しょうがないしょうがない(^^) とりあえず対応できたのでよし! Form の受け取りで

    ImmutableList 対応
  52. あれ、DBFluteは?

  53. (> < DBFluteで ImmutableList 対応

  54. 難易度桁違い...断念いや冒険半ば ということで、DB側では手動変換はまだ発生 ※ただ、手動変換も少し楽になる施策も DBFluteで ImmutableList 対応

  55. (DBFlute関係ないけど) static import 補完を前提とした toImmutable() これは現場の方が自ら作成して促進 (Good Job!) ※案外、これでまあまあ楽に。検索したらすぐ toImmutable()

    ! DBFluteで ImmutableList 対応
  56. stream()と混ざるのどうする?

  57. あーあ、まじめな話になっちゃった Stream() と混ざるのどうする?

  58. ジレンマ どっちでもいいようにする? 混ざると後から読む人つらくない? そもそも存在を知らないで書いちゃう人いるかも? Stream() と混ざるのどうする?

  59. ひとまず、やはり Eclipse Collections に寄せることに 日々成長するサービスなので、積み上げ式の開発。 他の人のコードを読んで実装が日常茶飯事。 そもそも Java8 経験者も少ないのでこれから学べば良い。 Stream()

    と混ざるのどうする?
  60. それならそれで、割り切ってちゃんと促進しよう。 投げっぱなしはダメ 「それができないのなら、きっと誰も使わなくなる」 Stream() と混ざるのどうする?

  61. stream()を自動検知するチェックプログラム java.util.Listのプロパティ検出するとUnitTest落ちる ...List.stream() を検出するとUnitTest落ちる (UTFlute の PoliceStory を活用) ※ただ、ちょっと検出タイミングが遅いのが難点... Stream()

    と混ざるのどうする?
  62. 成長真っ只中、五月雨に人が増える開発現場だと... 「えっ、Eclipse Collections を使うって 知らずに stream() で書いちゃった」 「そもそも、Eclipse Collections 知らない」

    Stream() と混ざるのどうする?
  63. 入社時のオリエンテーションで アーキテクチャ講義 (後述) ☆ なんだかんだこれが一番 Stream() と混ざるのどうする?

  64. 習得するための研修制度

  65. サーバーサイドチームに配属されたら、 オリエンテーションと約二週間の研修! 習得するための研修制度

  66. オリエンテーションでは、 現場のアーキテクチャやそのコンセプト、 開発の歴史などを、1on1でしっかり伝える。 (基本的に、jfluteが講師やっています) 習得するための研修制度

  67. 約2週間 DFluteハンズオン をやりつつ、 その中で Eclipse Collections にも慣れてもらう。 ちなみに AssertJ も同様。

    (基本的に、jfluteが猛烈レビューやっています) 習得するための研修制度
  68. 「中途やパートナーでも、いきなりチケットを振るのではなく、 じっくり研修されて配属されるので、受け入れる方もすごく楽」 (現場の方の声、頂きました!) 習得するための研修制度

  69. その結果

  70. 現場のコードは、いたるところに Eclipse Collections !!! その結果

  71. U-NEXT のオープンソース貢献

  72. 「オープンソースは使いながら鍛えていく」 という思想を持つ素敵な方々ばかり。 ( 現場の積極的なフィードバックでフレームワークも成長!) U-NEXT のオープンソース貢献

  73. 社内で作った汎用クラスはどんどん オープンソースにコントリビュート! 「他でも使えるんじゃない?」が合言葉 U-NEXT のオープンソース貢献

  74. U-NEXT のオープンソース貢献 KVSFlute, SolrFlute, Lasta RemoteApi などに加え、 一クラス単位でも汎用的な使えそうなものは、 Exampleコードとして寄与 (ありがとうございます!)

    U-NEXTさんからSolrFlute,KVSFluteコントリビュート頂きました U-NEXTさんから Lasta RemoteApi をコントリビュート頂きました
  75. ところで.......

  76. ってご存知ですか?

  77. という訳でちょっとだけ宣伝

  78. 定額制動画配信サービス 実は動画配信における 10年の実績 実は日本の定額制動画配信市場 において シェア3位 (金額ベース・2017年・GEM Partners株式会社調べ) 配信動画本数 120,000本

    以上
  79. U-NEXT では サーバサイドエンジニアを 募集しています。 今注目されている動画配信市場で 一緒にサービスを作ってみませんか? 採用ページ : https://inside.unext.jp/ エンジニア募集中

    開発環境 エンジニアが働きやすい環境が整っています。 定期的に開催される勉強会 フロントやビジネスなど別チームを 超えた勉強会を開催、自由に参加しています。
  80. 定期的に開催される勉強会 例えば.... DBFlute, LastaFlute (by jflute) 暗号化の仕組み, JWT Docker, Kurbernetes

    GraphQL React, Redux 映像著作権 働きやすい開発環境 例えば.... フレックスタイム制 希望のPC貸与 (例:MacBookPro メモリ16GB) 快適なイス 大きなモニターとセカンドモニター利用可 ガジェット、ソフトウェア、 書籍、セミナー等 費用全額会社補助 スーツ着用不要 フリースナック、フリードリンクあり エンジニア同士の360度評価 (年2回)
  81. 突貫でスライドを作ってくれた、 U-NEXT なかのさん、ありがとう! (前日深夜、見た目の調整してくれた、いのうえさん、ありがとう)

  82. 本日、利用したJavaプロジェクトは、 Githubで公開されています。 https://github.com/lastaflute/lastaflute-test-fortress

  83. ご静聴ありがとうございました。