SlideShare a Scribd company logo
1 of 53
Download to read offline
新しいデータ永続化の方法!
Jetpack DataStoreの紹介
自己紹介
古川 真次(ふるしん)
 @furusin_oriver
Sansan,Inc. Android Engineer
大阪府在住
趣味:勉強会の主催
GDG Osaka オーガナイザー
Kansai.kt オーガナイザー
夢:オンラインイベントでOk, Googleを叫ぶ
Jetpack
DataStore
概要
Jetpack DataStoreとは
● 2020年 9月 2日に1.0.0-alpha01として発表
● SharedPreferences に代わるものとして提案された、新しいデータの永続化方法
● 動作はKotlin CoroutinesのFlow
● DataStoreには2種類
○ Preferences DataStore: Key-Value ペアを保存します
○ Proto DataStore: 型付きオブジェクトを保存できます( Protocol Buffer)
■ TypeSafe
https://developer.android.com/jetpack/androidx/releases/datastore
※CoroutinesのFlowを知りたい方は
5分でわかるKotlin Coroutines Flow
https://speakerdeck.com/sys1yagi/5fen-tewakarukotlin-coroutines-flow
スタートダッシュAndroid
〜アプリエンジニアの必須ノウハウをサクっと押さえる
https://amzn.to/2FF5say
Preferences
DataStore
Preferences Datastore
● SharedPreferencesに限りなく近い
● 格納できる型はInt, Long, Boolean, Float, String, Setのみ
Preferences DataStoreの使い方
build.gradle編
1. build.gradleに `datastore-preferences` を追加
dependencies {
// Preferences DataStore
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
}
Preferences DataStoreの使い方
インスタンス生成編
2. DataStoreのインスタンスを生成
import androidx.datastore.preferences.createDataStore
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dataStore = createDataStore(name = "preferences")
}
}
2. DataStoreのインスタンスを生成
import androidx.datastore.preferences.createDataStore
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dataStore = createDataStore(name = "preferences")
}
}
DataStoreの
インスタンスを生成
Preferences DataStoreの使い方
インスタンス生成編
2. DataStoreのインスタンスを生成
import androidx.datastore.preferences.createDataStore
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dataStore = createDataStore(name = "preferences")
}
}
androidx.datastore.preferencesの
createDataStore
Preferences DataStoreの使い方
インスタンス生成編
3. editメソッドを使ってデータを格納
Preferences DataStoreの使い方
データ格納編
import androidx.datastore.preferences.edit
import androidx.datastore.preferences.preferencesKey
override fun onCreate(savedInstanceState: Bundle?) {
GlobalScope.launch {
saveName()
}
}
private suspend fun saveName() {
dataStore.edit { prefernces: MutablePreferences ->
prefernces[PreferencesKeys.KEY_NAME] = "furusin"
}
}
private object PreferencesKeys {
val KEY_NAME = preferencesKey<String>("KEY_NAME")
}
import androidx.datastore.preferences.edit
import androidx.datastore.preferences.preferencesKey
override fun onCreate(savedInstanceState: Bundle?) {
GlobalScope.launch {
saveName()
}
}
private suspend fun saveName() {
dataStore.edit { prefernces: MutablePreferences ->
prefernces[PreferencesKeys.KEY_NAME] = "furusin"
}
}
private object PreferencesKeys {
val KEY_NAME = preferencesKey<String>("KEY_NAME")
}
3. editメソッドを使ってデータを格納
Preferences DataStoreの使い方
データ格納編
suspend fun DataStore<Preferences>.edit(
transform: suspend (MutablePreferences) -> Unit
): Preferences {
return this.updateData {
// It's safe to return MutablePreferences since we make a defensive copy in
// PreferencesDataStore.updateData()
it.toMutablePreferences().apply { transform(this) }
}
}
import androidx.datastore.preferences.edit
import androidx.datastore.preferences.preferencesKey
override fun onCreate(savedInstanceState: Bundle?) {
GlobalScope.launch {
saveName()
}
}
private suspend fun saveName() {
dataStore.edit { prefernces: MutablePreferences ->
prefernces[PreferencesKeys.KEY_NAME] = "furusin"
}
}
private object PreferencesKeys {
val KEY_NAME = preferencesKey<String>("KEY_NAME")
}
3. editメソッドを使ってデータを格納
Preferences DataStoreの使い方
データ格納編
import androidx.datastore.preferences.edit
import androidx.datastore.preferences.preferencesKey
override fun onCreate(savedInstanceState: Bundle?) {
GlobalScope.launch {
saveName()
}
}
private suspend fun saveName() {
dataStore.edit { prefernces: MutablePreferences ->
prefernces[PreferencesKeys.KEY_NAME] = "furusin"
}
}
private object PreferencesKeys {
val KEY_NAME = preferencesKey<String>("KEY_NAME")
}
3. editメソッドを使ってデータを格納
Preferences DataStoreの使い方
データ格納編
/**
* Get a preference Key of type T. Type T must be one of: Int, Long, Boolean, Float, String.
* Use the [preferencesSetKey] function to create a preference key for Set<String>. No
* other types are supported.
* …
*/
inline fun <reified T : Any> preferencesKey(name: String): Preferences.Key<T>
import androidx.datastore.preferences.edit
import androidx.datastore.preferences.preferencesKey
override fun onCreate(savedInstanceState: Bundle?) {
GlobalScope.launch {
saveName()
}
}
private suspend fun saveName() {
dataStore.edit { prefernces: MutablePreferences ->
prefernces[PreferencesKeys.KEY_NAME] = "furusin"
}
}
private object PreferencesKeys {
val KEY_NAME = preferencesKey<String>("KEY_NAME")
}
3. editメソッドを使ってデータを格納
Preferences DataStoreの使い方
データ格納編
inline fun <reified T : Any> preferencesKey(name: String): Preferences.Key<T> {
return when (T::class) {
Int::class -> {
Preferences.Key<T>(name)
}
String::class -> {
Preferences.Key<T>(name)
}
Boolean::class -> {
Preferences.Key<T>(name)
}
Float::class -> {
Preferences.Key<T>(name)
}
Long::class -> {
Preferences.Key<T>(name)
}
Set::class -> {
throw IllegalArgumentException("Use `preferencesSetKey` to create keys for Sets.")
}
else -> {
throw IllegalArgumentException("Type not supported: ${T::class.java}")
}
}
}
import androidx.datastore.preferences.edit
import androidx.datastore.preferences.preferencesKey
override fun onCreate(savedInstanceState: Bundle?) {
GlobalScope.launch {
saveName()
}
}
private suspend fun saveName() {
dataStore.edit { prefernces: MutablePreferences ->
// prefernces[PreferencesKeys.KEY_NAME] = "furusin"
prefernces.set(PreferencesKeys.KEY_NAME, "furusin")
}
}
private object PreferencesKeys {
val KEY_NAME = preferencesKey<String>("KEY_NAME")
}
3. editメソッドを使ってデータを格納
Preferences DataStoreの使い方
データ格納編
operator fun <T> set(key: Key<T>, value: T) {
setUnchecked(key, value)
}
4. Coroutines Flowのcollectを使って呼び出し
Preferences DataStoreの使い方
データ呼び出し編
override fun onCreate(savedInstanceState: Bundle?) {
findViewById<Button>(R.id.loadButton).setOnClickListener {
GlobalScope.launch {
getName().collect {
Log.d("test", "name = $it")
}
}
}
}
private fun getName(): Flow<String> =
dataStore.data.map { preferences ->
preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME"
}
4. Coroutines Flowのcollectを使って呼び出し
Preferences DataStoreの使い方
データ呼び出し編
override fun onCreate(savedInstanceState: Bundle?) {
findViewById<Button>(R.id.loadButton).setOnClickListener {
GlobalScope.launch {
getName().collect {
Log.d("test", "name = $it")
}
}
}
}
private fun getName(): Flow<String> =
dataStore.data.map { preferences ->
preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME"
}
interface DataStore<T> {
val data: Flow<T>
suspend fun updateData(transform: suspend (t: T) -> T): T
}
4. Coroutines Flowのcollectを使って呼び出し
Preferences DataStoreの使い方
データ呼び出し編
override fun onCreate(savedInstanceState: Bundle?) {
findViewById<Button>(R.id.loadButton).setOnClickListener {
GlobalScope.launch {
getName().collect {
Log.d("test", "name = $it")
}
}
}
}
private fun getName(): Flow<String> =
dataStore.data.map { preferences ->
preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME"
}
4. Coroutines Flowのcollectを使って呼び出し
Preferences DataStoreの使い方
データ呼び出し編
override fun onCreate(savedInstanceState: Bundle?) {
findViewById<Button>(R.id.loadButton).setOnClickListener {
GlobalScope.launch {
getName().collect {
Log.d("test", "name = $it")
}
}
}
}
private fun getName(): Flow<String> =
dataStore.data.map { preferences ->
// preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME"
preferences.get(PreferencesKeys.KEY_NAME) ?: "NO NAME"
}
abstract operator fun <T> get(key: Key<T>): T?
4. Coroutines Flowのcollectを使って呼び出し
Preferences DataStoreの使い方
データ呼び出し編
override fun onCreate(savedInstanceState: Bundle?) {
GlobalScope.launch {
getName().collect {
Log.d("test", "name = $it")
}
}
}
private fun getName(): Flow<String> =
dataStore.data.map { preferences ->
preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME"
}
1. build.gradleに追加
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
2. DataStoreのインスタンスを生成
val dataStore = createDataStore(name = "preferences")
3. DataStoreのeditメソッドでデータを格納
GlobalScope.launch {
dataStore.edit { prefernces: MutablePreferences -> prefernces[PreferencesKeys.KEY_NAME] = "furusin" }
}
4. DataStoreのdataからCoroutines Flowのcollectを使ってデータを取得
GlobalScope.launch {
dataStore.data.map { preferences -> preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME" }
.collect { Log.d("test", "name = $it") }
}
Preferences DataStoreの使い方
まとめ編
1. build.gradleに追加
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
2. DataStoreのインスタンスを生成
val dataStore = createDataStore(name = "preferences")
3. DataStoreのeditメソッドでデータを格納
GlobalScope.launch {
dataStore.edit { prefernces: MutablePreferences -> prefernces[PreferencesKeys.KEY_NAME] = "furusin" }
}
4. DataStoreのdataからCoroutines Flowのcollectを使ってデータを取得
GlobalScope.launch {
dataStore.data.map { preferences -> preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME" }
.collect { Log.d("test", "name = $it") }
}
Preferences DataStoreの使い方
まとめ編
1. build.gradleに追加
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
2. DataStoreのインスタンスを生成
val dataStore = createDataStore(name = "preferences")
3. DataStoreのeditメソッドでデータを格納
GlobalScope.launch {
dataStore.edit { prefernces: MutablePreferences -> prefernces[PreferencesKeys.KEY_NAME] = "furusin" }
}
4. DataStoreのdataからCoroutines Flowのcollectを使ってデータを取得
GlobalScope.launch {
dataStore.data.map { preferences -> preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME" }
.collect { Log.d("test", "name = $it") }
}
Preferences DataStoreの使い方
まとめ編
1. build.gradleに追加
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
2. DataStoreのインスタンスを生成
val dataStore = createDataStore(name = "preferences")
3. DataStoreのeditメソッドでデータを格納
GlobalScope.launch {
dataStore.edit { prefernces: MutablePreferences -> prefernces[PreferencesKeys.KEY_NAME] = "furusin" }
}
4. DataStoreのdataからCoroutines Flowのcollectを使ってデータを取得
GlobalScope.launch {
dataStore.data.map { preferences -> preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME" }
.collect { Log.d("test", "name = $it") }
}
Preferences DataStoreの使い方
まとめ編
1. build.gradleに追加
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
2. DataStoreのインスタンスを生成
val dataStore = createDataStore(name = "preferences")
3. DataStoreのeditメソッドでデータを格納
GlobalScope.launch {
dataStore.edit { prefernces: MutablePreferences -> prefernces[PreferencesKeys.KEY_NAME] = "furusin" }
}
4. DataStoreのdataからCoroutines Flowのcollectを使ってデータを取得
GlobalScope.launch {
dataStore.data.map { preferences -> preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME" }
.collect { Log.d("test", "name = $it") }
}
Preferences DataStoreの使い方
まとめ編
1. build.gradleに追加
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
2. DataStoreのインスタンスを生成
val dataStore = createDataStore(name = "preferences")
3. DataStoreのeditメソッドでデータを格納
GlobalScope.launch {
dataStore.edit { prefernces: MutablePreferences -> prefernces[PreferencesKeys.KEY_NAME] = "furusin" }
}
4. DataStoreのdataからCoroutines Flowのcollectを使ってデータを取得
GlobalScope.launch {
dataStore.data.map { preferences -> preferences[PreferencesKeys.KEY_NAME] ?: "NO NAME" }
.collect { Log.d("test", "name = $it") }
}
Preferences DataStoreの使い方
まとめ編
Proto
DataStore
Proto Datastore
● Protocol Bufferを使用
● どんな型でも格納できる
Proto Datastoreの使い方
準備編
1. Protocol Bufferを使えるようにする
a. トップレベルのbuild.gradleに情報を追加
buildscript {
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.13'
}
}
Proto Datastoreの使い方
準備編
1. Protocol Bufferを使えるようにする
a. app/build.gradleに追加
apply plugin: 'com.google.protobuf'
dependencies {
implementation 'com.google.protobuf:protobuf-lite:3.0.1'
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
javalite {
artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0"
}
}
generateProtoTasks {
all().each { task ->
task.plugins {
javalite {}
}
}
}
}
Proto Datastoreの使い方
build.gradle編
1. Protocol Bufferを使えるようにする
a. app/build.gradleに追加
dependencies {
// Proto DataStore
implementation "androidx.datastore:datastore-core:1.0.0-alpha01"
implementation 'com.google.protobuf:protobuf-lite:3.0.1'
}
Proto Datastoreの使い方
データの型編
1. DataStoreで格納したい型を宣言
syntax = "proto3";
option java_package = "net.furusin.www.jetpackdatastoresample";
option java_multiple_files = true;
message User {
int32 age = 1;
string name = 2;
}
Proto Datastoreの使い方
Serializerを用意編
1. Serializerを継承したObjectを準備
object UserSerializer : Serializer<User> {
override fun readFrom(input: InputStream): User {
try {
return User.parseFrom(input)
} catch (exception: InvalidProtocolBufferException) {
throw CorruptionException("Cannot read proto.", exception)
}
}
override fun writeTo(t: User, output: OutputStream) {
t.writeTo(output)
}
}
interface Serializer<T> {
fun readFrom(input: InputStream): T
fun writeTo(t: T, output: OutputStream)
}
Proto Datastoreの使い方
Serializerを用意編
1. Serializerを継承したObjectを準備
object UserSerializer : Serializer<User> {
override fun readFrom(input: InputStream): User {
try {
return User.parseFrom(input)
} catch (exception: InvalidProtocolBufferException) {
throw CorruptionException("Cannot read proto.", exception)
}
}
override fun writeTo(t: User, output: OutputStream) {
t.writeTo(output)
}
}
TODO(b/151635324):
consider changing InputStream to File.
Proto Datastoreの使い方
インスタンス生成編
2. createDataStoreメソッドを使ってインスタンスを生成
import androidx.datastore.createDataStore
class MainActivity : AppCompatActivity() {
lateinit var dataStore: DataStore<User>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dataStore = createDataStore(fileName = "preferences", serializer = UserSerializer)
}
}
Proto Datastoreの使い方
インスタンス生成編
2. createDataStoreメソッドを使ってインスタンスを生成
import androidx.datastore.createDataStore
class MainActivity : AppCompatActivity() {
lateinit var dataStore: DataStore<User>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dataStore = createDataStore(fileName = "preferences", serializer = UserSerializer)
}
}
androidx.datastoreの
createDataStore
Proto Datastoreの使い方
データ格納編
2. upDateDataメソッドを使ってデータを更新
private suspend fun setUserAge(age: Int) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setAge(age)
.build()
}
}
private suspend fun setUserName(name: String) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setName(name)
.build()
}
}
Proto Datastoreの使い方
データ格納編
2. upDateDataメソッドを使ってデータを更新
private suspend fun setUserAge(age: Int) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setAge(age)
.build()
}
}
private suspend fun setUserName(name: String) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setName(name)
.build()
}
}
/**
* Updates the data transactionally in an atomic read-modify-write operation.
* …
*/
suspend fun updateData(transform: suspend (t: T) -> T): T
Proto Datastoreの使い方
データ格納編
2. upDateDataメソッドを使ってデータを更新
private suspend fun setUserAge(age: Int) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setAge(age)
.build()
}
}
private suspend fun setUserName(name: String) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setName(name)
.build()
}
}
Proto Datastoreの使い方
データ格納編
2. upDateDataメソッドを使ってデータを更新
private suspend fun setUserAge(age: Int) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setAge(age)
.build()
}
}
private suspend fun setUserName(name: String) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setName(name)
.build()
}
}
Proto Datastoreの使い方
データ格納編
2. upDateDataメソッドを使ってデータを更新
private suspend fun setUserAge(age: Int) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setAge(age)
.build()
}
}
private suspend fun setUserName(name: String) {
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setName(name)
.build()
}
}
Proto Datastoreの使い方
データ呼び出し編
2. upDateDataメソッドを使ってデータを更新
findViewById<Button>(R.id.loadButton).setOnClickListener {
GlobalScope.launch {
getStoredUser().collect {
Log.d("test", "age = ${it.age}, name = ${it.name}")
}
}
}
private fun getStoredUser(): Flow<User> = dataStore.data
1. protocol Bufferを使えるようにする
2. 保存したいデータを .protoファイルとして定義する
message User { }
3. Serializerを作る
object UserSerializer : Serializer<User> { }
4. データを更新(保存)する
dataStore.updateData { currentUser: User ->
currentUser.toBuilder()
.setAge(age)
.build()
}
5. データを取得する
dataStore.data.collect { Log.d("test", "age = ${it.age}, name = ${it.name}") }
Proto DataStoreの使い方
まとめ編
Jetpack Datastoreの特徴
https://android-developers.googleblog.com/2020/09/prefer-storing-data-with-jetpack.html
SharedPreferencesから
DataStoreに移行する方法
package androidx.datastore.migrations
class SharedPreferencesMigration<T>
@JvmOverloads // Generate constructors for default params for java users.
constructor(
private val context: Context,
private val sharedPreferencesName: String,
keysToMigrate: Set<String>? = MIGRATE_ALL_KEYS,
private val deleteEmptyPreferences: Boolean = true,
private val shouldRunMigration: suspend (T) -> Boolean = { true },
private val migrate: suspend (SharedPreferencesView, T) -> T
) : DataMigration<T>
SharedPreferencesから
DataStoreに移行する方法
package androidx.datastore.migrations
class SharedPreferencesMigration<T>
@JvmOverloads // Generate constructors for default params for java users.
constructor(
private val context: Context,
private val sharedPreferencesName: String,
keysToMigrate: Set<String>? = MIGRATE_ALL_KEYS,
private val deleteEmptyPreferences: Boolean = true,
private val shouldRunMigration: suspend (T) -> Boolean = { true },
private val migrate: suspend (SharedPreferencesView, T) -> T
) : DataMigration<T>
SharedPreferencesから
DataStoreに移行する方法
package androidx.datastore.migrations
class SharedPreferencesMigration<T>
@JvmOverloads // Generate constructors for default params for java users.
constructor(
private val context: Context,
private val sharedPreferencesName: String,
keysToMigrate: Set<String>? = MIGRATE_ALL_KEYS,
private val deleteEmptyPreferences: Boolean = true,
private val shouldRunMigration: suspend (T) -> Boolean = { true },
private val migrate: suspend (SharedPreferencesView, T) -> T
) : DataMigration<T>
/**
* DataMigration from SharedPreferences to DataStore.
*
* Example usage:
*
* val sharedPrefsMigration = SharedPreferencesMigration(
* context,
* mySharedPreferencesName
* ) { prefs: SharedPreferencesView, myData: MyData ->
* myData.toBuilder().setCounter(prefs.getCounter(COUNTER_KEY, default = 0)).build()
* }
*…
*/
SharedPreferencesから
DataStoreに移行する方法
package androidx.datastore.migrations
class SharedPreferencesMigration<T>
@JvmOverloads // Generate constructors for default params for java users.
constructor(
private val context: Context,
private val sharedPreferencesName: String,
keysToMigrate: Set<String>? = MIGRATE_ALL_KEYS,
private val deleteEmptyPreferences: Boolean = true,
private val shouldRunMigration: suspend (T) -> Boolean = { true },
private val migrate: suspend (SharedPreferencesView, T) -> T
) : DataMigration<T>
Room vs DataStore
● 以下のような場合はRoom
○ 大規模 or 複雑なデータを保存したい
○ データを部分的に更新したい
● 以下のような場合はDataStore
○ 小さなデータを保存したい
○ 部分的な更新は必要ない
○ 今まで「SharedPreferencesを使おうかな」と思い浮かぶ所
参考文献
● 公式ドキュメント
○ https://developer.android.com/topic/libraries/architecture/datastore
● 公式ブログ
○ https://android-developers.googleblog.com/2020/09/prefer-storing-data-with-jetpack.
html
● Codelabs
○ https://codelabs.developers.google.com/codelabs/android-preferences-d
atastore/index.html
○ https://codelabs.developers.google.com/codelabs/android-proto-datasto
re/index.html
● サンプルプログラム
○ https://github.com/furusin/JetpackDataStoreSample
■ try_preferences_datastore
■ try_proto_datastore
ご清聴ありがとうございました
Ask the Speakerはこちら
https://meet.google.com/vdu-oryz-kcj

More Related Content

What's hot

トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAkihiro Kuwano
 
20191001 AWS Black Belt Online Seminar AWS Lake Formation
20191001 AWS Black Belt Online Seminar AWS Lake Formation 20191001 AWS Black Belt Online Seminar AWS Lake Formation
20191001 AWS Black Belt Online Seminar AWS Lake Formation Amazon Web Services Japan
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座Samir Hammoudi
 
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
20191016 AWS Black Belt Online Seminar Amazon Route 53 ResolverAmazon Web Services Japan
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
PHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知するPHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知するTomoki Hasegawa
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るGo Miyasaka
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門Hisashi HATAKEYAMA
 
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)Amazon Web Services Japan
 
AWS Black Belt Online Seminar 2016 Amazon EC2 Container Service
AWS Black Belt Online Seminar 2016 Amazon EC2 Container ServiceAWS Black Belt Online Seminar 2016 Amazon EC2 Container Service
AWS Black Belt Online Seminar 2016 Amazon EC2 Container ServiceAmazon Web Services Japan
 
Amazon ECS AWS Fargate あるとき~ ないとき~ (トレノケ雲の会 mod2)
Amazon ECS AWS Fargate あるとき~ ないとき~ (トレノケ雲の会 mod2)Amazon ECS AWS Fargate あるとき~ ないとき~ (トレノケ雲の会 mod2)
Amazon ECS AWS Fargate あるとき~ ないとき~ (トレノケ雲の会 mod2)Trainocate Japan, Ltd.
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?kwatch
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめMitsutoshi Kiuchi
 

What's hot (20)

トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
20191001 AWS Black Belt Online Seminar AWS Lake Formation
20191001 AWS Black Belt Online Seminar AWS Lake Formation 20191001 AWS Black Belt Online Seminar AWS Lake Formation
20191001 AWS Black Belt Online Seminar AWS Lake Formation
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
 
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
PHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知するPHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知する
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)
 
AWS Black Belt Online Seminar 2016 Amazon EC2 Container Service
AWS Black Belt Online Seminar 2016 Amazon EC2 Container ServiceAWS Black Belt Online Seminar 2016 Amazon EC2 Container Service
AWS Black Belt Online Seminar 2016 Amazon EC2 Container Service
 
Amazon ECS AWS Fargate あるとき~ ないとき~ (トレノケ雲の会 mod2)
Amazon ECS AWS Fargate あるとき~ ないとき~ (トレノケ雲の会 mod2)Amazon ECS AWS Fargate あるとき~ ないとき~ (トレノケ雲の会 mod2)
Amazon ECS AWS Fargate あるとき~ ないとき~ (トレノケ雲の会 mod2)
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
 
(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
 

Similar to Jetpack datastore入門

[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applicationstotty jp
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギMasaki Yamakawa
 
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会Jumpei Ogawa
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣Yuji Takayama
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a NutshellTsuyoshi Miyake
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンYoichiro Tanaka
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfKosuke Saigusa
 
System3 search
System3 searchSystem3 search
System3 searchJun Chiba
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -Yuji Takayama
 

Similar to Jetpack datastore入門 (20)

[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
Teclab3
Teclab3Teclab3
Teclab3
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
Boost tour 1_44_0
Boost tour 1_44_0Boost tour 1_44_0
Boost tour 1_44_0
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applications
 
20071030
2007103020071030
20071030
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギ
 
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Client Side Cache
Client Side CacheClient Side Cache
Client Side Cache
 
Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a Nutshell
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdf
 
System3 search
System3 searchSystem3 search
System3 search
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 

More from 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
 
Google I/O 2021 Recap
Google I/O 2021 RecapGoogle I/O 2021 Recap
Google I/O 2021 Recapfurusin
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明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
 

More from 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チームが取り組む コードレビューを早くまわす工夫
 
Google I/O 2021 Recap
Google I/O 2021 RecapGoogle I/O 2021 Recap
Google I/O 2021 Recap
 
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
 
コロナ禍でコミュニティ運営はこう変わった
コロナ禍でコミュニティ運営はこう変わったコロナ禍でコミュニティ運営はこう変わった
コロナ禍でコミュニティ運営はこう変わった
 
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をやってみた
 
個人開発アプリの紹介と実装内容の概要
個人開発アプリの紹介と実装内容の概要個人開発アプリの紹介と実装内容の概要
個人開発アプリの紹介と実装内容の概要
 

Recently uploaded

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Recently uploaded (8)

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

Jetpack datastore入門