SlideShare ist ein Scribd-Unternehmen logo
1 von 77
Downloaden Sie, um offline zu lesen
Androidエンジニアが振り返る
Google I/O
Sansan株式会社
Sansan事業部 プロダクト開発部 古川 真次
Sansan Tech Meetup
自己紹介
● 古川 真次(ふるしん)
● Sansan,Inc. Android Engineer
● 大阪府在住
● 趣味:勉強会の主催
○ GDG Osaka オーガナイザー
○ Kansai.kt オーガナイザー
@furusin_oriver
オンライン
名刺です
Androidエンジニアとしてピクッと反応した発表たち
● Android 12
● Jetpack
● Jetpack Compose
● Wear OS by Google
● Firebase
Agenda
Android 12
Splash API
Splash API
Splash API
Android 12 デベロッパー プレビュー 3 をリリースしました
https://android-developers-jp.googleblog.com/2021/04/android-12-developer-preview-3.html
Android 12 デベロッパー プレビュー 3 をリリースしました
https://android-developers-jp.googleblog.com/2021/04/android-12-developer-preview-3.html
Android 12 デベロッパー プレビュー 3 をリリースしました
https://android-developers-jp.googleblog.com/2021/04/android-12-developer-preview-3.html
Android 12 デベロッパー プレビュー 3 をリリースしました
https://android-developers-jp.googleblog.com/2021/04/android-12-developer-preview-3.html
Android 12 デベロッパー プレビュー 3 をリリースしました
https://android-developers-jp.googleblog.com/2021/04/android-12-developer-preview-3.html
Android 12 デベロッパー プレビュー 3 をリリースしました
https://android-developers-jp.googleblog.com/2021/04/android-12-developer-preview-3.html
試しに動かしてみよう
試しに動かしてみよう
● 何も実装しなくても勝手にスプラッシュ画面が出てる
● アプリが起動していない(Cold Start)もしくはActivityが生
成されていない場合にスプラッシュ画面が表示される
● https://developer.android.com/about/versions/12/features/splash-screen#customize-animation
● アプリが起動できるようになったら勝手にスプラッシュ画面
が閉じる
色々試してみよう
themes.xml
<item name="android:windowSplashScreenBackground">@color/blue</item>
検証1. スプラッシュの背景色を変えてみる
検証1. スプラッシュのアイコン画像を変えてみる
検証2. スプラッシュのアイコン画像を変えてみる
themes.xml
<item name="android:windowSplashScreenAnimatedIcon">@drawable/image</item>
検証3. ブランドアイコンを追加してみる
themes.xml
<item name="android:windowSplashScreenBrandingImage">@drawable/image</item>
// Set up an OnPreDrawListener to the root view.
val content: View = findViewById(android.R.id.content)
content.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
// Check if the initial data is ready.
return if (viewModel.isReady) {
// The content is ready; start drawing.
content.viewTreeObserver.removeOnPreDrawListener(this)
true
} else {
// The content is not ready; suspend.
false
}
}
}
)
}
このスプラッシュを使って色々実装できるらしい
// Set up an OnPreDrawListener to the root view.
val content: View = findViewById(android.R.id.content)
content.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
// Check if the initial data is ready.
return if (viewModel.isReady) {
// The content is ready; start drawing.
content.viewTreeObserver.removeOnPreDrawListener(this)
true
} else {
// The content is not ready; suspend.
false
}
}
}
)
}
このスプラッシュを使って色々実装できるらしい
スプラッシュの閉じ方のアニメーションも作れる
splashScreen.setOnExitAnimationListener { splashScreenView ->
lifecycleScope.launch {
// do something
delay(1000)
splashScreenView.remove()
}
}
← 自動で出てくるスプラッシュ
setOnExitAnimationListenerで
         Delayさせた→
ちょっと気づいた
● 背景色とか色々変えられそう
● ドキュメントを読む限りだと「そもそもOFFにする」みたいなものは無さ
そう(今後生えるかも?)
● 既存で作ってるスプラッシュ画面からの置き換えが必要そう
○ ただし既存のSplachActivity的なのは残してよさそう
Splash API軽くまとめ
Easier burs, color filters,
and other effects
Easier blurs, color filters, and other effects
50f,50f, Shader.TileMode.MIRROR
0f,500f, Shader.TileMode.REPEAT
View.setRenderEffect(RenderEffect)
imageView.setRenderEffect(RenderEffect.createBlurEffect(0f,0f, Shader.TileMode))
Easier burs, color filters, and other effects
https://www.youtube.com/watch?v=D2cU_itNDAI&list=PLOU2XLYxmsIJhsF3up2ueu2pRealr9raD&index=12
Jetpack
DataStore
● SharedPreferencesに代わる新たなデータ保存の機構
● Coroutine Flowで保存・読み込み
● Preferences DataStore と Proto DataStoreの2種類がある
SharedPreferences vs DataStore
https://android-developers.googleblog.com/2020/09/prefer-storing-data-with-jetpa
ck.html
Macrobenchmark
● アプリの起動にどれくらい時間がかかってるかがわかる
● スクロールやアニメーションフレームのパフォーマンスのベンチマークを測定で
きる
Macrobenchmark
https://www.youtube.com/watch?v=0adLO2VRJtc
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
https://www.youtube.com/watch?v=0adLO2VRJtc
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
https://www.youtube.com/watch?v=0adLO2VRJtc
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun startup() = benchmarkRule.measureRepeated(
packageName = "mypackage.myapp",
metrics = listOf(StartupTimingMetric()),
iterations = 5,
startupMode = StartupMode.COLD
) { // this = MacrobenchmarkScope
pressHome()
val intent = Intent()
intent.setPackage("mypackage.myapp")
intent.setAction("mypackage.myapp.myaction")
startActivityAndWait(intent)
}
Macrobenchmark
https://www.youtube.com/watch?v=0adLO2VRJtc
Macrobenchmark
https://www.youtube.com/watch?v=0adLO2VRJtc
Macrobenchmark
https://www.youtube.com/watch?v=0adLO2VRJtc
● アプリ起動くらいならサクッとテスト追加できそう
● 「なんかカクつくなぁ」の調査がやりやすそう
● CIでMacrobenchmarkのテストを常に回すこともできるらしい
● もしかしてFirebase Performancesと組み合わせたら最強では?
Macrobenchmarkまとめ
● 5/18にStableになりました 🎉
○ 詳しくは前にやったイベントでZOZO Technologiesの堀江さんが
喋ってくれた資料を御覧ください
○ https://sansan.connpass.com/event/197084/
Dagger Hilt
● 3.0がStableになりました
○ 以前「2.0だとつらい事が多いからPaging Library使うの辞めたけど3.0なら解決で
きるかも」って話をした
○ https://sansan.connpass.com/event/197084/
Paging Library
Jetpack Compose
Jetpack Compose
● ConstraintLayout Available
「What's new in Jetpack Compose | Session」
https://youtu.be/7Mf2175h3RQ
Jetpack Compose
● Interactive Preview
○ プレビューする際にボタンのアニメーションも見れる
「What's new in Jetpack Compose | Session」
https://youtu.be/7Mf2175h3RQ
● Deploy to device
Jetpack Compose
「What's new in Jetpack Compose | Session」
https://youtu.be/7Mf2175h3RQ
● XMLとの共存
Jetpack Compose
「What's new in Jetpack Compose | Session」
https://youtu.be/7Mf2175h3RQ
Wear OS by Google
● 画面を作るためのAPIが増えた
○ 最新の天気予報を確認したり、タイマーを開始したりすることが可能
● システム UI の一部
○ Activityや XML レイアウトなど、おなじみの Android プログラミングのコンセプトに
はアクセスできません
○ ????? ↑ちゃんと見てみる
● Codelab あります
○ https://developer.android.com/codelabs/wear-tiles#0
Tiles
「Create your first Tile in Wear OS」
https://developer.android.com/codelabs/wear-tiles#0
● TileProviderService
○ onTileRequest(requestParams: TileRequest?) : ListenableFuture<Tile>
○ onResourcesRequest(requestParams: ResourcesRequest?):
ListenableFuture<Resources>
■ onTileRequestで返されるTileに必要な画像を返却
Tiles
● Hello Worldを表示
Tiles
override fun onTileRequest(requestParams: TileRequest) = serviceScope.future {
Tile.builder()
.setResourcesVersion(RESOURCES_VERSION)
.setTimeline(
Timeline.builder().addTimelineEntry(
TimelineEntry.builder().setLayout(
Layout.builder().setRoot(
Text.builder().setText("hello world!")
)
)
)
).build()
}
override fun onResourcesRequest(requestParams: ResourcesRequest) = serviceScope.future {
Resources.builder()
.setVersion(RESOURCES_VERSION)
.build()
}
● Hello Worldを表示
Tiles
override fun onTileRequest(requestParams: TileRequest) = serviceScope.future {
Tile.builder()
.setResourcesVersion(RESOURCES_VERSION)
.setTimeline(
Timeline.builder().addTimelineEntry(
TimelineEntry.builder().setLayout(
Layout.builder().setRoot(
Text.builder().setText("hello world!")
)
)
)
).build()
}
override fun onResourcesRequest(requestParams: ResourcesRequest) = serviceScope.future {
Resources.builder()
.setVersion(RESOURCES_VERSION)
.build()
}
● Hello Worldを表示
Tiles
override fun onTileRequest(requestParams: TileRequest) = serviceScope.future {
Tile.builder()
.setResourcesVersion(RESOURCES_VERSION)
.setTimeline(
Timeline.builder().addTimelineEntry(
TimelineEntry.builder().setLayout(
Layout.builder().setRoot(
Text.builder().setText("hello world!")
)
)
)
).build()
}
override fun onResourcesRequest(requestParams: ResourcesRequest) = serviceScope.future {
Resources.builder()
.setVersion(RESOURCES_VERSION)
.build()
}
● Hello Worldを表示
Tiles
override fun onTileRequest(requestParams: TileRequest) = serviceScope.future {
Tile.builder()
.setResourcesVersion(RESOURCES_VERSION)
.setTimeline(
Timeline.builder().addTimelineEntry(
TimelineEntry.builder().setLayout(
Layout.builder().setRoot(
Text.builder().setText("hello world!")
)
)
)
).build()
}
override fun onResourcesRequest(requestParams: ResourcesRequest) = serviceScope.future {
Resources.builder()
.setVersion(RESOURCES_VERSION)
.build()
}
Tiles
https://developer.android.com/codelabs/wear-tiles#2
● 簡単にテキストを表示することもできる
● 表示するフォントスタイルも用意されている
Tiles
● 表示するフォントスタイルも用意されている
Tiles
FontStyles.display2
● 表示するフォントスタイルも用意されている
Tiles
FontStyles.display2
FontStyles.title3
● LayoutElementBuilders.FontStyles
○ body1, 2
○ title1, 2, 3
○ caption1, 2
○ display1, 2, 3
○ button
Tiles
● 画像をセットすることもできます
Tiles
● 画像をセットすることもできます
Tiles
.addContent(
Image.builder()
.setWidth(BUTTON_SIZE)
.setHeight(BUTTON_SIZE)
.setResourceId(ID_IMAGE_START_RUN)
.setModifiers(
Modifiers.builder()
.setPadding(
Padding.builder()
.setStart(BUTTON_PADDING)
.setEnd(BUTTON_PADDING)
.setTop(BUTTON_PADDING)
.setBottom(BUTTON_PADDING)
)
.setBackground(
Background.builder()
.setCorner(Corner.builder().setRadius(BUTTON_RADIUS))
.setColor(
argb(
ContextCompat.getColor(
this,
R.color.primaryDark
)
)
)
)
)
.build()
)
● 画像をセットすることもできます
Tiles
.addContent(
Image.builder()
.setWidth(BUTTON_SIZE)
.setHeight(BUTTON_SIZE)
.setResourceId(ID_IMAGE_START_RUN)
.setModifiers(
Modifiers.builder()
.setPadding(
Padding.builder()
.setStart(BUTTON_PADDING)
.setEnd(BUTTON_PADDING)
.setTop(BUTTON_PADDING)
.setBottom(BUTTON_PADDING)
)
.setBackground(
Background.builder()
.setCorner(Corner.builder().setRadius(BUTTON_RADIUS))
.setColor(
argb(
ContextCompat.getColor(
this,
R.color.primaryDark
)
)
)
)
)
.build()
)
override fun onResourcesRequest(requestParams: ResourcesRequest) = serviceScope.future {
Resources.builder()
.setVersion(RESOURCES_VERSION)
.addIdToImageMapping(
ID_IMAGE_START_RUN,
ImageResource.builder()
.setAndroidResourceByResId(
AndroidImageResourceByResId.builder()
.setResourceId(R.drawable.ic_run)
)
)
.build()
}
● ClickListenerもセットできる
○ Modifierにセットする
Tiles
Image.builder()
.setWidth(BUTTON_SIZE)
.setHeight(BUTTON_SIZE)
.setResourceId(ID_IMAGE_START_RUN)
.setModifiers(
Modifiers.builder()
.setClickable(
Clickable.builder()
.setId(ID_CLICK_START_RUN)
.setOnClick(ActionBuilders.LoadAction.builder())
)
)
.build()
● 結構簡単に画面を作ることが可能
● ハマりどころが結構多い
● Builderパターンのオンパレード
Wear OS by GoogleのTilesまとめ
Firebase
Firebase
「What's new in Firebase | Keynote」
https://youtu.be/fKZqT-S6wuo
Firebase
「What's new in Firebase | Keynote」
https://youtu.be/fKZqT-S6wuo
おまけ
おまけ
「What's new in Android | Keynote」
https://youtu.be/D2cU_itNDAI
Google I/O 2021 Recap

Weitere ähnliche Inhalte

Was ist angesagt?

Android dev toolbox
Android dev toolboxAndroid dev toolbox
Android dev toolboxShem Magnezi
 
Clean code with google guava jee conf
Clean code with google guava jee confClean code with google guava jee conf
Clean code with google guava jee confIgor Anishchenko
 
Android Developer Toolbox 2017
Android Developer Toolbox 2017Android Developer Toolbox 2017
Android Developer Toolbox 2017Shem Magnezi
 
Google guava overview
Google guava overviewGoogle guava overview
Google guava overviewSteve Min
 
FITC Web Unleashed 2017 - Introduction to the World of Testing for Front-End ...
FITC Web Unleashed 2017 - Introduction to the World of Testing for Front-End ...FITC Web Unleashed 2017 - Introduction to the World of Testing for Front-End ...
FITC Web Unleashed 2017 - Introduction to the World of Testing for Front-End ...Haris Mahmood
 
An Introduction to the World of Testing for Front-End Developers
An Introduction to the World of Testing for Front-End DevelopersAn Introduction to the World of Testing for Front-End Developers
An Introduction to the World of Testing for Front-End DevelopersFITC
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackNelson Glauber Leal
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using RoomNelson Glauber Leal
 
Android Bootstrap
Android BootstrapAndroid Bootstrap
Android Bootstrapdonnfelker
 
The core libraries you always wanted - Google Guava
The core libraries you always wanted - Google GuavaThe core libraries you always wanted - Google Guava
The core libraries you always wanted - Google GuavaMite Mitreski
 
JavaScript Classes and Inheritance
JavaScript Classes and InheritanceJavaScript Classes and Inheritance
JavaScript Classes and Inheritancemarcheiligers
 
Hello click click boom
Hello click click boomHello click click boom
Hello click click boomsymbian_mgl
 
Zabbix LLD from a C Module by Jan-Piet Mens
Zabbix LLD from a C Module by Jan-Piet MensZabbix LLD from a C Module by Jan-Piet Mens
Zabbix LLD from a C Module by Jan-Piet MensNETWAYS
 
Java设置环境变量
Java设置环境变量Java设置环境变量
Java设置环境变量Zianed Hou
 
Understanding Source Code Differences by Separating Refactoring Effects
Understanding Source Code Differences by Separating Refactoring EffectsUnderstanding Source Code Differences by Separating Refactoring Effects
Understanding Source Code Differences by Separating Refactoring EffectsShinpei Hayashi
 
Stubる - Mockingjayを使ったHTTPクライアントのテスト -
Stubる - Mockingjayを使ったHTTPクライアントのテスト -Stubる - Mockingjayを使ったHTTPクライアントのテスト -
Stubる - Mockingjayを使ったHTTPクライアントのテスト -Kenji Tanaka
 

Was ist angesagt? (20)

Google Guava
Google GuavaGoogle Guava
Google Guava
 
Android dev toolbox
Android dev toolboxAndroid dev toolbox
Android dev toolbox
 
Clean code with google guava jee conf
Clean code with google guava jee confClean code with google guava jee conf
Clean code with google guava jee conf
 
Android Developer Toolbox 2017
Android Developer Toolbox 2017Android Developer Toolbox 2017
Android Developer Toolbox 2017
 
Google guava overview
Google guava overviewGoogle guava overview
Google guava overview
 
FITC Web Unleashed 2017 - Introduction to the World of Testing for Front-End ...
FITC Web Unleashed 2017 - Introduction to the World of Testing for Front-End ...FITC Web Unleashed 2017 - Introduction to the World of Testing for Front-End ...
FITC Web Unleashed 2017 - Introduction to the World of Testing for Front-End ...
 
An Introduction to the World of Testing for Front-End Developers
An Introduction to the World of Testing for Front-End DevelopersAn Introduction to the World of Testing for Front-End Developers
An Introduction to the World of Testing for Front-End Developers
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com Jetpack
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using Room
 
Android Bootstrap
Android BootstrapAndroid Bootstrap
Android Bootstrap
 
The core libraries you always wanted - Google Guava
The core libraries you always wanted - Google GuavaThe core libraries you always wanted - Google Guava
The core libraries you always wanted - Google Guava
 
Nantes Jug - Java 7
Nantes Jug - Java 7Nantes Jug - Java 7
Nantes Jug - Java 7
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
JavaScript Classes and Inheritance
JavaScript Classes and InheritanceJavaScript Classes and Inheritance
JavaScript Classes and Inheritance
 
Hello click click boom
Hello click click boomHello click click boom
Hello click click boom
 
Expression Language 3.0
Expression Language 3.0Expression Language 3.0
Expression Language 3.0
 
Zabbix LLD from a C Module by Jan-Piet Mens
Zabbix LLD from a C Module by Jan-Piet MensZabbix LLD from a C Module by Jan-Piet Mens
Zabbix LLD from a C Module by Jan-Piet Mens
 
Java设置环境变量
Java设置环境变量Java设置环境变量
Java设置环境变量
 
Understanding Source Code Differences by Separating Refactoring Effects
Understanding Source Code Differences by Separating Refactoring EffectsUnderstanding Source Code Differences by Separating Refactoring Effects
Understanding Source Code Differences by Separating Refactoring Effects
 
Stubる - Mockingjayを使ったHTTPクライアントのテスト -
Stubる - Mockingjayを使ったHTTPクライアントのテスト -Stubる - Mockingjayを使ったHTTPクライアントのテスト -
Stubる - Mockingjayを使ったHTTPクライアントのテスト -
 

Ähnlich wie Google I/O 2021 Recap

Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e bigAndy Peterson
 
Dropwizard and Friends
Dropwizard and FriendsDropwizard and Friends
Dropwizard and FriendsYun Zhi Lin
 
Modular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJSModular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJSGunnar Hillert
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Eliran Eliassy
 
Testing your application on Google App Engine
Testing your application on Google App EngineTesting your application on Google App Engine
Testing your application on Google App EngineInphina Technologies
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App EngineIndicThreads
 
Mobile App Development: Primi passi con NativeScript e Angular 2
Mobile App Development: Primi passi con NativeScript e Angular 2Mobile App Development: Primi passi con NativeScript e Angular 2
Mobile App Development: Primi passi con NativeScript e Angular 2Filippo Matteo Riggio
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture IntroductionHaiqi Chen
 
Scripting Oracle Develop 2007
Scripting Oracle Develop 2007Scripting Oracle Develop 2007
Scripting Oracle Develop 2007Tugdual Grall
 
Android Intermediatte IAK full
Android Intermediatte IAK fullAndroid Intermediatte IAK full
Android Intermediatte IAK fullAhmad Arif Faizin
 
[2C2]PredictionIO
[2C2]PredictionIO[2C2]PredictionIO
[2C2]PredictionIONAVER D2
 
From Idea to App (or “How we roll at Small Town Heroes”)
From Idea to App (or “How we roll at Small Town Heroes”)From Idea to App (or “How we roll at Small Town Heroes”)
From Idea to App (or “How we roll at Small Town Heroes”)Bramus Van Damme
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Matt Raible
 
Introduce to PredictionIO
Introduce to PredictionIOIntroduce to PredictionIO
Introduce to PredictionIOWei-Yuan Chang
 
Django deployment with PaaS
Django deployment with PaaSDjango deployment with PaaS
Django deployment with PaaSAppsembler
 

Ähnlich wie Google I/O 2021 Recap (20)

Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Dropwizard and Friends
Dropwizard and FriendsDropwizard and Friends
Dropwizard and Friends
 
Modular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJSModular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJS
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
 
React django
React djangoReact django
React django
 
Testing your application on Google App Engine
Testing your application on Google App EngineTesting your application on Google App Engine
Testing your application on Google App Engine
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App Engine
 
Mobile App Development: Primi passi con NativeScript e Angular 2
Mobile App Development: Primi passi con NativeScript e Angular 2Mobile App Development: Primi passi con NativeScript e Angular 2
Mobile App Development: Primi passi con NativeScript e Angular 2
 
lecture5
lecture5lecture5
lecture5
 
lecture5
lecture5lecture5
lecture5
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture Introduction
 
Scripting Oracle Develop 2007
Scripting Oracle Develop 2007Scripting Oracle Develop 2007
Scripting Oracle Develop 2007
 
Android intermediatte Full
Android intermediatte FullAndroid intermediatte Full
Android intermediatte Full
 
Android Intermediatte IAK full
Android Intermediatte IAK fullAndroid Intermediatte IAK full
Android Intermediatte IAK full
 
[2C2]PredictionIO
[2C2]PredictionIO[2C2]PredictionIO
[2C2]PredictionIO
 
From Idea to App (or “How we roll at Small Town Heroes”)
From Idea to App (or “How we roll at Small Town Heroes”)From Idea to App (or “How we roll at Small Town Heroes”)
From Idea to App (or “How we roll at Small Town Heroes”)
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
 
Introduce to PredictionIO
Introduce to PredictionIOIntroduce to PredictionIO
Introduce to PredictionIO
 
Seti 09
Seti 09Seti 09
Seti 09
 
Django deployment with PaaS
Django deployment with PaaSDjango deployment with PaaS
Django deployment with PaaS
 

Mehr von furusin

Difficulty of managing iOS Engineers as an Android Engineer.pdf
Difficulty of managing iOS Engineers as an Android Engineer.pdfDifficulty of managing iOS Engineers as an Android Engineer.pdf
Difficulty of managing iOS Engineers as an Android Engineer.pdffurusin
 
Google Play In-App Review API 改めて調べてみた
Google Play In-App Review API 改めて調べてみたGoogle Play In-App Review API 改めて調べてみた
Google Play In-App Review API 改めて調べてみたfurusin
 
Google I_O 2022 Sign-in関連
Google I_O 2022 Sign-in関連Google I_O 2022 Sign-in関連
Google I_O 2022 Sign-in関連furusin
 
Sansan androidチームが取り組む コードレビューを早くまわす工夫
Sansan androidチームが取り組む コードレビューを早くまわす工夫Sansan androidチームが取り組む コードレビューを早くまわす工夫
Sansan androidチームが取り組む コードレビューを早くまわす工夫furusin
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明furusin
 
Jetpack datastore入門
Jetpack datastore入門Jetpack datastore入門
Jetpack datastore入門furusin
 
コロナ禍でコミュニティ運営はこう変わった
コロナ禍でコミュニティ運営はこう変わったコロナ禍でコミュニティ運営はこう変わった
コロナ禍でコミュニティ運営はこう変わったfurusin
 
Android dev summit 2019 recap
Android dev summit 2019 recapAndroid dev summit 2019 recap
Android dev summit 2019 recapfurusin
 
Android billing library 2.0 recap
Android billing library 2.0 recapAndroid billing library 2.0 recap
Android billing library 2.0 recapfurusin
 
Android Qにおける Gestural Navigation and Dark Theme
Android Qにおける Gestural Navigation and Dark ThemeAndroid Qにおける Gestural Navigation and Dark Theme
Android Qにおける Gestural Navigation and Dark Themefurusin
 
社内システムにおける 「使いやすさ」の重要性
社内システムにおける 「使いやすさ」の重要性社内システムにおける 「使いやすさ」の重要性
社内システムにおける 「使いやすさ」の重要性furusin
 
デザインフローについて考え直す
デザインフローについて考え直すデザインフローについて考え直す
デザインフローについて考え直すfurusin
 
Build your first wear app
Build your first wear appBuild your first wear app
Build your first wear appfurusin
 
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみたネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみたfurusin
 
Pray for hokkaido from osaka
Pray for hokkaido from osakaPray for hokkaido from osaka
Pray for hokkaido from osakafurusin
 
Google Codelabsをやってみた
Google CodelabsをやってみたGoogle Codelabsをやってみた
Google Codelabsをやってみたfurusin
 
個人開発アプリの紹介と実装内容の概要
個人開発アプリの紹介と実装内容の概要個人開発アプリの紹介と実装内容の概要
個人開発アプリの紹介と実装内容の概要furusin
 

Mehr von furusin (17)

Difficulty of managing iOS Engineers as an Android Engineer.pdf
Difficulty of managing iOS Engineers as an Android Engineer.pdfDifficulty of managing iOS Engineers as an Android Engineer.pdf
Difficulty of managing iOS Engineers as an Android Engineer.pdf
 
Google Play In-App Review API 改めて調べてみた
Google Play In-App Review API 改めて調べてみたGoogle Play In-App Review API 改めて調べてみた
Google Play In-App Review API 改めて調べてみた
 
Google I_O 2022 Sign-in関連
Google I_O 2022 Sign-in関連Google I_O 2022 Sign-in関連
Google I_O 2022 Sign-in関連
 
Sansan androidチームが取り組む コードレビューを早くまわす工夫
Sansan androidチームが取り組む コードレビューを早くまわす工夫Sansan androidチームが取り組む コードレビューを早くまわす工夫
Sansan androidチームが取り組む コードレビューを早くまわす工夫
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
 
Jetpack datastore入門
Jetpack datastore入門Jetpack datastore入門
Jetpack datastore入門
 
コロナ禍でコミュニティ運営はこう変わった
コロナ禍でコミュニティ運営はこう変わったコロナ禍でコミュニティ運営はこう変わった
コロナ禍でコミュニティ運営はこう変わった
 
Android dev summit 2019 recap
Android dev summit 2019 recapAndroid dev summit 2019 recap
Android dev summit 2019 recap
 
Android billing library 2.0 recap
Android billing library 2.0 recapAndroid billing library 2.0 recap
Android billing library 2.0 recap
 
Android Qにおける Gestural Navigation and Dark Theme
Android Qにおける Gestural Navigation and Dark ThemeAndroid Qにおける Gestural Navigation and Dark Theme
Android Qにおける Gestural Navigation and Dark Theme
 
社内システムにおける 「使いやすさ」の重要性
社内システムにおける 「使いやすさ」の重要性社内システムにおける 「使いやすさ」の重要性
社内システムにおける 「使いやすさ」の重要性
 
デザインフローについて考え直す
デザインフローについて考え直すデザインフローについて考え直す
デザインフローについて考え直す
 
Build your first wear app
Build your first wear appBuild your first wear app
Build your first wear app
 
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみたネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
ネイティブAndroidエンジニアがVueNativeでiOSアプリを作ってみた
 
Pray for hokkaido from osaka
Pray for hokkaido from osakaPray for hokkaido from osaka
Pray for hokkaido from osaka
 
Google Codelabsをやってみた
Google CodelabsをやってみたGoogle Codelabsをやってみた
Google Codelabsをやってみた
 
個人開発アプリの紹介と実装内容の概要
個人開発アプリの紹介と実装内容の概要個人開発アプリの紹介と実装内容の概要
個人開発アプリの紹介と実装内容の概要
 

Kürzlich hochgeladen

Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024The Digital Insurer
 

Kürzlich hochgeladen (20)

Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 

Google I/O 2021 Recap