kako.dev

開発、自作アプリのこと

KotlinFest2019に参加しました

8月24日(土)に行われたKotlinFest2019に参加してきました。

f:id:h3-birth:20190825145712j:plain

KotlinFestとは

Kotlinに関する知見の共有と、Kotlinファンの交流の場を提供する技術カンファレンスです。

f:id:h3-birth:20190826003616j:plain
テーマは「Kotlinを愛でる」

kotlin.connpass.com

今年はMPPのセッション多め

MPPそのものであったり、Kotlin/Native、Kotlin/JSなどのMPPの一部にあたるセッションが多めな印象でした。

逆にAndroid関係は少なめ。

私は普段Androidの開発しかして無いですが、マルチプラットフォーム、特にKotlin/JS触ってみようかなという気になりました。

会場の雰囲気

  • 参加者にはトートバッグが配られ、このトートバッグがすごい可愛い。Kotlin可愛い。

f:id:h3-birth:20190826021433j:plain

  • 軽食の提供があり、時間帯によって出ているものが代わり、ホワイエに出てコミュニケーションが活発になるような気遣い?などを感じた。

  • 企業ブースも複数出ており、セッションの合間のホワイエはいつも人でいっぱいだった。

  • スタッフの方の気配りや盛り上げで何もストレスなく気持ちよく参加できた。

  • 懇親会のパックマンルールは今年も提唱されてた。 (懇親会未参加でしたが、オープニングで案内がありました。いいルールですよね。)

見たセッション

基調講演

Svetlana Isakovaさんによる基調講演がありました。めちゃ貴重。

What's new in Kotlin?

speakerdeck.com

  • 200万人以上がKotlinを使用
  • 2010年にKotlinプロジェクトに参加したが、想像以上に大きくなった。
  • Androidによって公式に採用されたことが大きい
Kotlinの歴史

1.1 Couroutine導入大きな変革 -> 1.3 でstableに 1.2 MPP

KEEP

KEEP = Kotlin Evolution and Enhancement Process

  • keeping the language modenrn
  • comfortable updates
  • feedback loop

今のコードを壊さず進化をするバランスが大事

Experimental features
  • 現時点で試せるKotlinの機能
  • 実際に使った人からのフィードバックを得る
Inline Classes
  • 何かのラッパークラスを使うとき、オーバーヘッドやヒープをクラスを呼ぶたびに使ってしまいパフォーマンスに影響がある。
  • その問題を解決するためのInlin Class
  • allocationを不要に増やすことないメリット
  • val propertyを1つのみ定義可能
  • 上手に使いたい
Contracts
  • isNullOrEmptyで1.3からContract導入
  • nullチェックしてもスマートキャストされなかったのがさるように
Immutable Collections
  • 完全に変更不可能なListを追加した
  • builder()でCollectionのImmutableを生成
  • いずれ標準になる
Flows
  • asPublisher
  • asFlow

良さそうだけど、あんまり使いすぎてもごちゃつきそうなので、rxJavaやめてCoroutineに移行するのが良さそう。 移行できないほどの時などに使う感じかなという印象。

MPP
  • アプリケーション全体を共有することは目指していない 一部のみビジネスロジックのみを共有などを目指している

  • expect

  • actual

  • 現在ですでに利用されている事例

    • Ktor
    • coroutines
    • serialization

More about Kotlin

  • 今、Javaデベロッパー向けでない人向けに書いている(待ち遠しい......!!!)
  • Coursera
  • hands-on lab

Kotlin コルーチンを理解しよう 2019

speakerdeck.com

  • コルーチンとは何か

    • 中断と再開を通常の関数に導入する
    • コルーチン同士で協調的に動作する
    • 今は、非対称コルーチン
    • 親コルーチン。子コルーチン。
  • 何が嬉しいのか

    • 継続状況を表現しやすい
    • スレットより軽量
  • Kotlinのコルーチンの仕組み

    • suspend
    • 普通の関数からsuspend関数は呼べない
    • 最初どうやって呼ぶ
    • supend() -> Unit
  • コルーチンライブラリ

    • キャンセル
    • 実行
  • 基本

    • コルーチンスコープ
    • launch 結果を返さない
    • async 結果を返す
  • runBlocking ブロッキングでコルーチンを実行

    • runBlokingのScopeでlaunchすれば実行を待ってくれる
    • job.cancel()
  • 実行コンテキスト

    • withContext CoroutineDispathcerを引数に渡す
    • suspend try{}catch{}
  • スコープと構造化された並行性

    • 並列化するには、CoroutineScopeでくくる
    • コルーチンと設計
  • コルーチンスコープとアプリケーションライフサイクル

    • スコープライブラリで、使うスコープを間違えない
    • メインスレッドじゃないsuspend作るとき、メインスレッドから呼び出しても問題ならないようにする

Not Good

ViewModelScope.launch(Dispatchers,IO)

Good

ViewModelScope.launch {}
  • テスト
    • まだこうするべきというアプローチはない
    • suspend関数のテスト
    • runblocking
    • Main以外のDispathreを書き換えられるようにしておく
    • Roomの場合
      • setQueryExecutor

改めて学ぶContracts

speakerdeck.com

  • Constractって?

    • コンパイラに一部条件を加える
    • アプリケーションが動くRunTime時と異なりコンパイル時に実行
    • 関数のみに適応
    • 関数ブロック内のみ
    • DSLで契約
    • 標準ライブラリにContract使われている
    • 1.3.50では26メソッドで使われている
  • なんでできたのか

  • annotationでルールを加える

    • ;で区切り条件を複数指定できる
  • 課題

    • if/whenに対応してない
    • try{}catchも対応していない
  • 今後のサポート

    • 変更あるかもしれない
    • 1.4ではDeprecatedにはならなさそう
    • KotlinConf2019で発表があるかも
    • stableになるかどうかはわからない
  • Checked exceptions

    • 一部の機能に対して例外を投げる
  • Transactions
  • sage builders

Kolin Multiplatform Project入門

speakerdeck.com

  • Napier
    • Timber likeなLtlin Mppプロジェクト
  • MPP

    • UI部分は提供せずにロジック部分を共通化
    • 全てのコードを共通化するのには向かない
  • Kotlin/Natiec ≠ Multiplatform Project 🙅‍♂️

  • Kotlin/Natiec ⊂ Multiplatform Project 🙆‍♂️

  • Kolin/JVM

  • Android,Server
  • 普段のKotilnのイメージに近い

  • Kotlin/Native

    • LLVM Toolchainで動作
    • VM環境が不要
    • iOS対応
    • suspendなど互換性なし
    • inlineクラスは使えない
    • FreezeされていないObejectは別スレッドで操作できない
  • Kotlin/JS

    • Kotlin→JavaScript
    • DOMの操作もできる
    • 動的型付け→静的型付けなので型情報は失われる
    • TypeScriptは将来的にするかも
    • dynamic型
    • Any?
  • MPPのメリット・デメリット

  • メリット

    • あえてUIの共通化は行なっていない
    • ネイティブと同じ言語(=Androidからみて)
    • 全てのプラットフォームを共通化
    • Domain Objectを共通化できる
    • お互いのすり合わせが不要になる。
    • nullが帰ってきて落ちるみたいなことない(これまじわかる)
    • ログ送信基盤の共通化
    • キーの値が合わないなどのミス回避など
    • 広義の意味でのUtilityを共通化
    • iOS - 1分 で Android - 60秒って帰ってくるけどどっちが正しいの?的なこと回避
  • デメリット

    • Javaの資産が使えない
    • iOSでCoroutineがメインスレッドしか使えない
    • frameworkを1つしか読み込めない
    • iOSやWebのエンジニアの理解が必要
  • 仕組み

    • Commonモジュール作成
    • Grafleのライブラリモジュール
    • expect, actual
    • abstract overrideと考えるとわかるかも
    • MVPが推奨されている

フロントエンドもKotlinで描きたい

speakerdeck.com

  • JSコードに変換のうなKotlin標準ライブラリ
  • Gradleプラグイン
  • Kotlin1.1

    • frontend-plugin は古い情報なので注意
  • 最終的な成果物

    • JSファイル、Webpackのバンドルファイル
  • 実際のサイト(小鳥さんの自習室 

https://github.com/subroh0508/otonashi-kotlin.dev

  • Kotlin/JSでReact
    • create-react-kotlin-app
    • GradleでWebpack書く
    • 依存関係
    • cssもKotlinでかける
      • styledButtonにしてcssを記述していく
    • Gradleやnpmで依存関係を描く
    • アノテーションを使いKotlinにインポート
    • 型定義、メソッド定義
    • dynamic型
    • JSのオブジェクトをそのまま表現 js関数
    • よくわからないときはjs関数書いて少しずつKotlin化していく (Kotlinの意味ないやんとツッコミ)
  • extarnal修飾子

まとめ

  • MPP楽しそう。特にKotlin/JSは興味惹かれる。
  • MPPの目指すところがビジネスロジックなど一部を共通化するだけという点が好印象
  • Coroutineちゃんとやらなきゃという気持ちになる。
  • この日の前日にKotlinのバージョンアップされてその対応の話などライブ感味わえるの会場だけ。

Kotlin可愛い。