My Favorite Things - Coding or die.

とある技術者の経験記録、的な。

JJUG CCC 2017 Fall に参加してきた(いまさらまとめ)

さて、JJUG CCC 2017 Fallに参加してきました。

f:id:yu_dotnet2004:20171226223647p:plain

はい、2017/11/18に開催されたもので、すでに参加から1ヶ月以上が経っています。しかし、年内にやり残していたこととして記憶していたので軽くまとめたいと思います。

今回はKotlinの話を聞きたいと思ったのがキッカケで、Springなどの話も面白そうだと思ったので参加を決めました。懇親会も参加する予定だったのですが、体調を崩してしまって参加できなかったのは少し残念です。

ところでCCCって何の略かと思ったら「Cross Community Conference」の略みたいですね。なんだかカッコいいです。

10年前のレガシーシステムをサーバサイドKotlinでフルリニューアルした話

speakerdeck.com

  • 自己紹介
  • API部分をやった
    • Kotlin x SpringBoot x (Vue.js)
  • エンジニア3人で
  • どうやって経営層を通したか?
    • 最優先のIssueを見極めた
    • 可能な限り数値化
    • 複数案(メリット・デメリット)
      • 自分でも客観的に見られるようになる
  • プロトタイプで不確実性をコントロール
    • 自分でも自身がつく
    • 説得力につながる
  • 技術選定
    • API
      • 重複ロジック・DBの一元化
      • 型をしっかりしたい
    • DBアクセス
      • DOMA2
        • SQL外出できる
      • ElasticSearch
  • なぜKotlin?
  • 技術スタック
    • Rails 5.1
      • Vue.jsやAngularの開発が楽
    • Vue.js
    • Element
      • Vue.jsのフレームワーク
      • 管理画面に最適(Bootstrapみたいな印象)
      • スター数も多い
    • Kotlinの学習コストは問題にならなかった
      • SprintBootの学習コストのほうが
    • API部分はSwaggerで生成して、Railsから叩く
  • Spring
    • SPRING INITIALIZERを使うと楽
    • アノテーションなど問題なし
    • kotlin-springプラグイン
      • デフォルトでopenになってくれる(継承可)
    • jackson-module-kotlin
  • DOMA2
    • 公式サポートはされていなかった
    • Doma層はJavaで書くという選択をした
  • swagger-codegen
    • SpringFox
      • 定義ファイルを生成してくれる
  • どこでもKotlin
    • 勉強会的な
  • 他社事例
    • Retty
    • CA

上層部に提案する際の進め方として「複数案を用意する」「実際に動くプロトタイプを作る」というのはやはり重要だと思いました。

JavaとKotlinの共存という面では、変化の少ないDBアクセス層部分はJavaで書くという選択は素晴らしいと思いました。あと、kotlin-springプラグインを利用することで、デフォルトでopenにしてくれるという話を聞き、Kotlinにはそんな機能もあるのだと思いました。

swagger-codegenは使ったことが無いのですが、いろいろな勉強会でよく聞きますし、個人開発で使ってみたいと思いました。(こういうのって最初に始めるところが壁があるのですよね・・・便利だとは分かっていても)

ちなみにベルセルクは読んだことがないのですが、ちょっと興味がわきました。

Pivotal認定講師が徹底解説! Spring Bootの本当の理解ポイント

www.slideshare.net

  • SpringBoot
    • まずはSpringを理解せよ
  • Spring
    • CoCではない
      • 設定ファイルはJavaコードで記述する
      • 開発を始めるのが面倒
      • Spring Bootは設定の塊
      • 設定=Bean定義
    • DIコンテナ
      • 1つ目
        • ただの「Bean」と呼ぶ
        • Bean定義=このクラスのインスタンスをBeanとしてね
        • コンポーネントスキャン(Configurationクラス)
          • どこからコンポーネントを探してくるか
          • パッケージを指定(サブパッケージも探してくれる)
        • コンテナ初期化時にConfigurationクラスを指定する
        • @Autowired
          • コンストラクタが単一だったら省略可
          • なのであんまり使わない
      • 2つめ
        • @Bean
          • 他のBeanを引数で受け取れる
      • @Componentと@Beanは併用できる
    • Spring MVC
      • DispatcherServlet
        • 唯一のサーブレット
        • ルーティングして、別のコントローラを呼び出す
        • コントローラからViewの論理名を返す
        • ViewResolverでビューの物理名を取得
        • これがコンテナを持ってる
      • 特徴
        • カスタマイズしやすい
        • コンポーネントがインターフェース化されてる
          • 実装クラスはコンテナから取得される
      • ViewResolver
      • @EnableWebMvc
        • @Beanで毎回定義するのは面倒くさい、ので導入された仕組み
        • @Import
        • Java Configを合体させるアノテーション
      • @Controller
  • Spring Boot
    • Beanの種類
      • FWが利用するもの
      • アプリケーションロジック(自分たちで書くもの)
    • Spring Bootがやっていること
      • FWが利用するBeanを事前に定義しておくだけ
      • JavaConfigのかたまり
        • AutoConfigurationクラスが大量にある
      • アプリケーションロジックのBeanには何もない
      • Springの知識が必須
      • Springをかんたんに使えるようにしたのがSpringBoot
    • application.properties
      • FWのBeanの各設定値
    • @ConfigurationProperties
      • application.propertiesの設定値をBeanに反映するもの
    • 起動するプロセス
    • 定義するBeanの選別
      • spring-boot-autoconfigure.jar
        • すべてのBeanが定義されている
      • 無駄なBeanをコンテナに登録しないようにする仕組みがある
        • @ConditionalOnXxx
          • 条件に合致した場合にそのBeanが定義される
  • カスタマイズ方法(トラブル回避)
    • @ConditionalOnXxx による芋づる式のトラブル
    • @EnableXxxをあまり使わないほうが良い
      • Spring Cloudとかでは使う必要もある
    • 安全な方法
      • application.properties
      • BeanをDIで取得して設定変更(コンストラクタInjection)
    • 補助的なBeanを定義する
      • ThymeleafなどのBeanに拡張の仕組みが用意されている
      • Dialectという形で用意
  • Springの本
    • Beanの丸写しはしないように(SpringBootの場合)

私は以前Seasar2を用いた開発を行ったことがあり、SpringもDIコンテナなんだなくらいにしか知らなかったのですが、この発表を聞いてSpringBootとSpringの関係がようやく理解できたような気がします。

SpringがCoCでなく設定を大量に記述する必要があること、そしてその負担を軽減するための設定ファイルの塊を生成してくれるのがSpringBootであるという理解で落ち着きました。

普段はSpringを使う機会がないのですが、今度Kotlinで触ってみようかと思っているので、その際にこの資料を見ながらSpringの基礎を固めたいなと思いました。

Spring Security にできること・できないこと

qiita.com

  • どこが守られるのか、どこが守られないのか
  • 使った実装 vs 使ってない実装
  • Servletのフィルターを利用した実装
  • セッション管理の不備(セッションID)
    • 推測
      • 連番とか
      • 推測できないランダム値を生成する
      • Servletの話になるので管轄外
    • 盗用
      • セッションIDをクエリパラメータに載せる
        • リファラーに載ってしまう
        • 対策:cookieにのせる
        • ServletではCookieをサポートしてないClientもサポートする仕様
        • SpringSecurity
          • URLリライティングが行われていた場合に止める
      • http通信でcookieを載せる
        • Cookieはヘッダに載るので、暗号化していないとNG
        • secure属性をつけることで、http通信では送信されなくなる
        • これもServletの話なので、SpringSecurity関係ない
    • セッションIDの固定化
      • ログイン前後でセッションIDが変更されていない場合に起こる
      • セッションIDを対象者にセットしておくことで、そのセッションIDでログインできる
      • 対策:ログインしたらセッションIDを変える
        • Spring SecurityはFormログインしていれば、自動的にやってくれる
  • XSS
  • CSRF
    • 関係ないサイトからのリクエストが正規のユーザとして処理される問題
    • 意図しない投稿をSNSにしたり
    • 対策:
      • 2つのリクエストを区別する必要がある
      • セッションIDとは別にトークンを発行して、それをリクエストに載せるようにする
        • それが乗っていれば正規のリクエス
      • Spring Securityは自動でやってくれる
        • GET, HEAD, TRACE, OPTIONS 以外がチェックされる
          • これらはHTTPの仕様上、読み取り専用の操作なので
  • HTTP ヘッダーインジェクション
    • ユーザの入力値をレスポンスヘッダに利用する場合
    • HTTPヘッダにおいて改行は意味をもつので、任意のヘッダを偽装可能
    • 空行を入れれば、bodyも改ざんできてしまう
    • 対策:
      • Servletなどが用意しているAPIを利用すべき
      • Servletの仕様としては定められていない
      • Spring Securityでは、改行コードがあった場合にエラーとなる
        • IllegalArgumentException(500)
  • Clickジャッキング
    • 見えないiframeを表示する
    • 対策:
      • X-Frame-Options
      • 主要なブラウザはサポートしている
      • Spring Security もサポート
  • 権限
    • ルーティングごとの適切なアクセス制御を設定する

Webセキュリティの復習になったような気がします。

そしてSpring Securityというものも初めて聞いて、Springは随分と巨大なFW群になったのだと感じました。ServletのFilter機能を利用している、なのでHTTPリクエスト前後で出来ることしか行えない、ということが重要であると思いました。

発表はデモを多く使用されていたので、普段イメージしにくい攻撃が理解しやすくてとても良かったです。

オレオレJVM言語を作ってみる(四則演算するだけだけど)

www.slideshare.net

  • 構成
  • ANTLR
    • アントラー
    • パーサジェネレータ
    • 文法を渡すことでコードが生成される
    • EBNF
      • :の左側が名前
      • のコメントがJavaのクラス名

    • antlr4 Math.g4
      • ANTLRのJARにあるクラスを実行してるだけ
    • javac -cp antlr-.jar Math.*
    • grun Math prog -guiコマンドでテストできる
    • Truffleで処理するために変換する必要がある
      • ツリーの変換処理が必要になる
    • tree walk
      • 深さ優先で探索していく処理
      • リスナーを実装する
  • Truffle(トラフル)
  • Eclipse OMR
  • Graal & Truffle
    • Graalは具体的な言語実装を知らない

ハッキリ言ってとても難しかったです・・・。

なんとなくぼんやりと全体のイメージが出来たような気がしますが、それも怪しいです。

新しいプログラミング言語の学び方 ~ HTTPサーバーを作って学ぶJava, Scala, Clojure ~

speakerdeck.com

  • 新しい言語を学ぶときはHTTPサーバを作ると良いよ、という話
  • なぜ?
    • よくあるやり方
      • HelloWorld、書籍、TODOアプリ
    • WebでTODOアプリ
      • DBが必要になり
      • MySQLWorkBench
      • 画面表示は?
    • HTTPサーバなら必要ない
  • HTTPサーバのやってること
    • リクエストの待受
    • パース
    • 結果を返す
  • Scala
    • 省略可能な構文
    • 強力な標準ライブラリ
    • 新しい制御構文も作れる
    • オブジェクト指向+関数型の強さ
      • マーチンオダスキーさんが言ってる
      • case class
        • oopでは値オブジェクト
        • 関数型では代数的データ型
  • Clojure
  • 作り始めるコツ
    • 難しく考えなくても良いかも
    • n年後にもう一度作り直すと成長を実感できる
  • HTTP
    • Socket=(IP+ポート)
    • 流れ
      • ServerSocketの初期化
      • while
      • accept
      • input/output stream を取得
      • inputからread、outputにwrite
  • 正規表現
    • リクエストラインの抽出
    • Java7から正規表現に名前付きグループが使えるようになった
    • Scala
      • パターンマッチ("".r
    • Clojure
      • re-find #"xxxx"
      • restHaskellでいうところのtail
      • zipmap
        • method, path, version をキーにして入る
    • Javaでは名前付きグループ
    • Scalaではパターンマッチ
    • Clojureではre-find+強力なコレクションライブラリ
  • リソースの開放
    • Java
      • try-with-resource
    • Scala
      • Loan Pattern
      • 「借りたら返す」を確実に行う
      • DSLとして提供してる(メソッド)
      • 関数の引数が1つの場合は、{}で関数を渡せる
    • Clojure
      • with-open
  • 並行処理
  • 文字列連結
    • Java
      • StringBUilder
        • javap -cで分析
    • Scala
      • String Interporation
      • Multi String Literarl
    • Clojure
      • str
      • s式が好きになってくる
  • まとめ
    • すでに知っているものとdiffを取ってみる

話の流れがスムーズで分かりやすく、聞いていて面白いセッションでした。

私も新しい言語を学ぶ時に、最近だとConsListは書くようにしているのですが、どうも物足りなく感じていたのでHTTPサーバを作ってみようかなとこのセッションを聞いて思いました。

Clojureは以前Lisp系の言語を学ぼうと思って2日間くらい勉強したのですが、それきりだったので今度また勉強してみようと思いました。

作り始める際に最初からがんばりすぎない(その言語の機能をフルに活用しようとしない)というのは、モチベーションというかやり方として大切だなと思いました。

感想

JJUGは初参加だったのですが、かなりの人数が参加されていてとても驚きました。

それゆえ、満員で参加できないセッションもあったのが残念ですが、まぁそれは仕方がないでしょう。

有益な発表がいろいろ聞けて、発表者および運営者の方には大変感謝です。 f:id:yu_dotnet2004:20171226223740p:plain