Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2021年のKotlin入門
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yuta Tomiyama
August 22, 2021
Programming
0
220
2021年のKotlin入門
2021/08/22 Zli x SGG 学生合同LT大会 にて発表
Yuta Tomiyama
August 22, 2021
Tweet
Share
More Decks by Yuta Tomiyama
See All by Yuta Tomiyama
ビルドプロセスをデバッグしよう!
yt8492
1
400
モバイルアプリ開発を始めよう!
yt8492
0
89
Git勉強会
yt8492
0
190
なんでもやってみる勇気
yt8492
0
120
Android Autoが思ったよりしんどい話
yt8492
0
230
apollo-kotlinにcontributeした話
yt8492
0
170
DMM TVのSDカードダウンロード機能を実装した話
yt8492
1
930
今だからこそ知りたいKotlin Multiplatform
yt8492
0
320
State management and API calls in Jetpack Compose: Learning Apollo + Jetpack Compose through React Hooks
yt8492
0
1.3k
Other Decks in Programming
See All in Programming
「やめとこ」がなくなった — 1月にZennを始めて22本書いた AI共創開発のリアル
atani14
0
360
Windows on Ryzen and I
seosoft
0
210
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
230
LangChain4jとは一味違うLangChain4j-CDI
kazumura
1
160
AI主導でFastAPIのWebサービスを作るときに 人間が構造化すべき境界線
okajun35
0
620
TipKitTips
ktcryomm
0
160
Unity6.3 AudioUpdate
cova8bitdots
0
110
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
170
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
400
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
480
Go 1.26でのsliceのメモリアロケーション最適化 / Go 1.26 リリースパーティ #go126party
mazrean
1
360
AIに任せる範囲を安全に広げるためにやっていること
fukucheee
0
120
Featured
See All Featured
From π to Pie charts
rasagy
0
150
Ethics towards AI in product and experience design
skipperchong
2
220
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
How to train your dragon (web standard)
notwaldorf
97
6.5k
Why Our Code Smells
bkeepers
PRO
340
58k
Crafting Experiences
bethany
1
81
Mind Mapping
helmedeiros
PRO
1
110
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
900
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
30 Presentation Tips
portentint
PRO
1
250
Fireside Chat
paigeccino
42
3.8k
The SEO Collaboration Effect
kristinabergwall1
0
380
Transcript
2021年のKotlin入門 Zli x SGG 学生合同LT大会
自己紹介 HN: マヤミト ID: yt8492 会津大学 学部4年 去年までZliの代表やってました GitHub: https://github.com/yt8492
趣味: Kotlin, Twitter, ウマ娘 今月既にウマ娘に8万を溶かしています Twitter: yt8492
今回はKotlin布教回です
Kotlinを知ってる人 何ができる言語か知っていますか?
今回のLT(セッション?)では2021年現在Kotlin でどんなことができるか紹介したいと 思います
思いついたやつとりあえず列挙してみた - Androidアプリ - iOSアプリ - デスクトップアプリ - サーバーサイド -
Webフロント - CLIツール - ゲーム
Androidアプリ開発 - おそらくKotlinと聞いて大多数の人が思い浮かべるのがこれ - 2019年、GoogleがKotlinをAndroidアプリ開発の推奨言語にすると発表 - 今新規アプリをJavaで書いてる企業はヤバい - 従来のJavaで書かれたAndroid SDKやライブラリをKotlinからそのまま使えるだ
けでなく、KotlinのコードもJava側から簡単に呼び出せる - Jetpack Composeでモダンな宣言的UIの手法で開発ができるように(後述)
サーバーサイド開発 - Spring BootやSparkなどのJavaのフレームワークがほぼそのまま使える - KtorというKotlin製のフレームワークもある - 最近だとサーバーサイドにKotlinを採用している企業も増えてきている
なぜKotlinはJavaと相互運用が可能なのか? - KotlinのコードがコンパイルされるとJavaのバイトコードになる - IntelliJ IDEA / Android Studio の機能でJavaにデコンパイルすることも可能
- 最終的なランタイムはJVM - サーバーもJARファイルにしてしまえば Kotlinの環境がなくてもJavaのランタイムさえあれば動かせ る - Androidも最終的にはapkになる
Kotlinの特殊なランタイムがない →Javaのバイトコード以外も吐き出せるようにすれ ば任意のものが作れるのでは?
正解
Kotlin/JS - KotlinのコードをJavaScriptにトランスパイルする技術 - targetにbrowserとnodejsがある - Gradle経由でWebpackを使い、JavaScriptのファイルを生成する - Gradle経由でnpmを使うことができ、JavaScriptのライブラリなどをKotlin側から 使うことも可能
- kotlin-react というKotlin/JS向けのReactラッパーライブラリがJetBrainsの GitHubのリポジトリでOSSとして開発されている
Kotlin/Native - Kotlin/Nativeにはいくつか種類(target)がある - iOS - Windows - MacOS -
Linux - wasm - targetによっても何を生成するかが変わる - iOSはObjective-Cとxcodeproj - Windows, MacOS, Linuxでは実行可能なバイナリ - wasmはwasm
Kotlin Multiplatform - Kotlin/JVM, Kotlin/JS, Kotlin/Nativeから必要なtargetを指定し、共通のKotlin のコードから各プラットフォーム向けにコンパイル(トランスパイル)する - expect /
actual という仕組みがあり、型定義だけを共通のcommon srcに置きプ ラットフォーム依存のコードはプラットフォームごとのsrcに書くことで、プラットフォー ム依存のコードも共通の処理に組み込むことができる - 特定のプラットフォームに依存しない共通のビジネスロジックなどを書くのに commonモジュールをKotlin Multiplatformで作ると便利
ここからは実例を紹介します
自作ブログ JSファイルがクソデカ(約3MB)なのでWi-Fi環境でのアクセスをオススメします😇 https://blog.yt8492.com
プロジェクトの構成 - 4つのGradleのモジュールから構成されている - common - JVM, JS, MacOSをtargetにしたKotlin Multiplatformモジュール
- ユーザーや記事などのモデルの型定義 - このモジュールをserver, webfront, cliの3つのモジュールから読みこむ - server - Kotlin/JVMのモジュール - Ktor - webfront - targetをbrowserにしたKotlin/JSのモジュール - kotlin-react, Ktor Client - cli - targetをMacOSにしたKotlin Multiplatformのモジュール - Kotlin/Native, kotlinx-cli, platform libraries, Ktor Client
プロジェクトの構成 server Kotlin/MPP common - モデルの型定義 - JSONの型定義 webfront cli
POSIX
common build.gradle.ktsのkotlinセクション
common 各プラットフォームから呼び出す共通の型定義
webfront - kotlin-wrappersというリポジトリにある各種ラッパーライブラリを使用 - kotlin-react - kotlin-react-dom - kotlin-react-router-dom -
kotlin-styled - kotlin-css - ラッパーが提供されていないライブラリも使いたい - 自分で書く😇 - react-markdown - remark-gfm - react-syntax-highlighter
JSライブラリのラッパーの作り方 1. ライブラリをimplementationする react-markdownの場合 implementation(npm("react-markdown", "5.0.3"))
JSライブラリのラッパーの作り方 2. ライブラリのコードを読む(TSの型定義があると楽)
JSライブラリのラッパーの作り方 3. 読んだコードをもとにラッパーを書く 関数名などはJS側の定義に合わせる必要がある(変える場合は@JsNameで元の名前 を渡す)
ReactをKotlinで書く - JSXではなくKotlinのDSLで書く
server - 普通のKotlin/JVMとKtorでサーバーを書いてる - build.gradle.ktsでビルド時に生成したjsファイルを成果物に含めるスクリプトを書 いてる
OGP対応 - ページのHTMLのヘッダーにOGPの情報を含める必要がある - SPAで記事ごとにOGP出すのしんどい😇 - NginxなどでHTMLファイルを配信するやり方ではしんどそう 🤔 - Ktorでkotlinx.htmlを使い、HTMLだけサーバー側で動的に生成することに
- OGPの生成はJavaのAWTで動的に頑張ってます😇 - もっといい方法あったら教えて下さい……
OGP対応
cli - macosX64をtargetにしたKotlin/Nativeのプロジェクト - 管理ユーザーログイン、記事の投稿・編集・削除の機能を実装 - ビルドすると実行可能なバイナリになる
各種コマンドの実装 - kotlinx-cliを使用 - コマンドライン引数などを簡単に扱うことができる - これのSubcommandを継承したクラスを実装し、 main関数から読み込んで使う
ファイル操作など - platform librariesを使う(実質C言語😇) - file pointerなどをゴリゴリに使うので便利関数で隠蔽するのがおすすめです
マルチプラットフォームはいいけど、 クロスプラットフォームはできないの?
(がんばれば)できます💪
Jetpack Compose - Android のネイティブ UI を構築するための最新のツールキット(公式より) https://developer.android.com/jetpack/compose - Kotlinと宣言的UIでAndroidのネイティブ開発ができる
- stableリリースされた - 最近Android界隈で流行っているので調べると記事が結構出てくると思います
Compose for 〇〇 の登場 - 去年11月、Compose for Desktopが登場 - Kotlin/JVMで動く
- Swing上でSkiaを動かしている - 今年5月、Compose for Webの登場 - Kotlin/JSで動く - DOMベース - Android, Desktop, WebでUIのコード共有が可能に(ココ重要)
UIコード共有の例
UIコード共有の例 common android desktop web
問題点 - ルーティングをどうするか - Androidにはnavigation-composeがある - AndroidのNavigationの仕組みに依存している - DesktopとWebどうする🤔 -
ルーターがないとキツイ - 既存のライブラリのラッパーを書く? - 自分で実装するのはしんどい
Decompose - Kotlin/MPP向けの、プラットフォームに依存しないlifecycle-awareなビジネスロ ジックコンポーネント+ルーターを提供するライブラリ - https://github.com/arkivanov/Decompose - 豊富な対応target - Android
- JVM - iosX64, iosArm64 - macosX64 - tvosX64, tvosArm64 - watchosArm32, watchosArm64, watchosX86, watchosX64 - JavaScript
Decomposeでルーティングを実装する - ルーティングを表す型を定義する - 直和型を使うと便利 - ルーティングに引数をもたせたい場合はここで定義する - ルーティングごとのビジネスロジックコンポーネントを定義する -
ViewModelみたいな役割にするとよさそう? - ルートのコンポーネントでルーティングの型からコンポーネントへのマッピングをす る - ルートのComposable関数でコンポーネントからページごとのComposable関数 へのマッピングをする
TODOアプリを実装してみよう
ルーティングを表す型を定義する
ルーティングごとのコンポーネントを定義する
ルーティングの型からコンポーネントへマッピングをする
コンポーネントからComposable関数へのマッピング
各プラットフォームから参照する
サンプルリポジトリ - https://github.com/yt8492/todoCompose - 公式のサンプルよりシンプルに作っています - もろもろ雑だけどゆるして……
まとめ - KotlinはAndroidアプリ開発のためだけの言語じゃない - サーバーもWebフロントもCLIもできる - 超頑張ればクロスプラットフォームなアプリ開発もできる
みなさんもKotlinを始めたくなりましたよね?^^