Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
server-engineer-android-introduction
Search
sutetotanuki
October 12, 2018
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
server-engineer-android-introduction
sutetotanuki
October 12, 2018
More Decks by sutetotanuki
See All by sutetotanuki
【登壇資料】AIエージェントに買い物をさせる ― Universal Commerce Protocol(UCP)の紹介」というタイトルで DevelopersIO 2026 Osaka Day 2
sutetotanuki
0
410
数案件を同時に進行するためのコンテキスト整理術
sutetotanuki
2
510
高速開発のためのコード整理術
sutetotanuki
1
1.1k
Next.js 16の新機能 Cache Components について
sutetotanuki
0
770
Vercel AI SDK を使って Next.js で AIアプリケーションを 作成する方法のご紹介
sutetotanuki
0
2k
WEBエンジニア向けAI活用入門
sutetotanuki
0
1.1k
ブラウザ上で実行され、 AIアシスタント付きデータベース postgres.new を触ってみた
sutetotanuki
0
650
今時のCookie事情
sutetotanuki
0
800
高速案件立ち上げで使われるマッハテンプレートのフロントエンド技術選定
sutetotanuki
2
2.2k
Other Decks in Programming
See All in Programming
Performance Optimization With LLMs
xleitix
0
210
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.8k
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
200
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.2k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
240
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
590
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
120
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
200
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
120
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
1.9k
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
120
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.8k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
320
New Earth Scene 8
popppiees
4
2.7k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
490
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
The untapped power of vector embeddings
frankvandijk
2
2k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
640
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
460
Transcript
αʔόʔαΠυΤϯδχΞ͕ "OESPJEೖͨ͠
ϞόΠϧΞϓϦαʔϏε෦ ୲ϞόΠϧΞϓϦͷόοΫΤϯυ"1* "84ڥߏஙɺӡ༻
ࠓ͢͜ͱ w ͳͥαʔόʔαΠυͷਓ͕"OESPJE w ษڧํ๏ w ࣄͰΘΕ͍ͯΔίʔυͱͷࠩ w σόοΫʹ͑Δπʔϧ
ͳͥαʔόʔαΠυͷ ਓ͕"OESPJE
ओͳཧ༝ w Ͱ͖Δ͜ͱΛ૿ͯ͠௵͕͖͘͠Α͏ʹͨ͠ ͍ɹ w Ұ؏ͯ͠ཧղ͓͖͍ͯͨ͠
N#BBT αʔόʔ N#BBTͷొ ೝূ Ӭଓ 1VTI ͦͷଞ αʔόʔ ೝূ Ӭଓ
1VTI ͦͷଞ ؆୯ͰҰൠతͳϢʔεέʔεͳΒ N#BBTͷΈͰ݁ͯ͠͠·͏͜ͱ ొલ ొޙ
(&5OFXT (&5OPUJpDBUJPO ҰൃͰͱΕΔΑ͏ ʹͯ͘͠Εͳ͍͔ ͳɻɻɻ (&5JOGP Ұ؏ͯ͠Ѳ͓͖͍ͯͨ͠ ࣗͰମݧ͠ͳ͍ͱΘ͔Βͳ͍͜ͱ͕͋Δ
ษڧํ๏
ษڧํ๏ w ·ͣࢿ w ॻ੶ w άάͬͯࣸܦ
ͱΓ͋͑ͣങͬͨ ສ
࠷ॳʹങͬͨຊ
࣍ʹങͬͨຊ
ॻ੶ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ // ToastΛදࣔ } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // ը໘ͷΩϟϓγϣϯΛมߋ } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // μΠΞϩάΛදࣔ }
άάͬͯࣸܦ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ // μΠΞϩάΛදࣔ } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // μΠΞϩάΛදࣔ } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // μΠΞϩάΛදࣔ }
override fun onCreate(savedInstanceState: Bundle?) { // ॲཧ1.. // ॲཧ2.. //
ॲཧ3.. // ॲཧ4.. // ॲཧ5.. PO$SFBUFʹू·Δॲཧ ͍͍͠Ε͵ෆ҆
͔ͪ͘ʹ͍͍ݟຊ͕͋ͬͨ
ࣄͰΘΕ͍ͯΔ ίʔυͱͷࠩ
ࠩ w ΞʔΩςΫνϟ w ඇಉظ w ӬଓԽ w %FCVH5PPMT
ΞʔΩςΫνϟ
දతͳΞʔΩςΫνϟ w .71 w .77.
.71 .PEFM7JFX1SFTFOUFS
.71 .PEFM7JFX1SFTFOUFS 1SFTFOUFS ͕7JFXͷࢀর Λͭ
.77. .PEFM7JFX7JFX.PEFM
.77. .PEFM7JFX7JFX.PEFM ํͷ%"5" #*/%*/(
දతͳΞʔΩςΫνϟ w .71 w J04ͱΞʔΩςΫνϟΛ߹Θ͍ͤ͢ w .77. w %BUB#JOEJOH͋ΔͷͰΑΓ؆ܿʹॻ͚Δ͕ίʔ υ͕ࣗಈੜ͞ΕΔͷͰͱ͖ͬͭʹ͍͘͜ͱ͋
Δ
දతͳΞʔΩςΫνϟ w .71 w .77. ࠓճͬͪ͜
.77. .PEFM7JFX7JFX.PEFM
.77.ͰΘΕΔ ެࣜϥΠϒϥϦ w 7JFX.PEFM w %BUB#JOEJOH w -JWF%BUB
7JFX.PEFM
7JFX.PEFM viewModel = ViewModelProviders.of(this).get(ViewModel::class.java) viewModel = ViewModelProviders.of(activity!!).get(ViewModel::class.java) .BJO"DUJWJUZLU .BJO'SBHNFOULU "DUJWJUZ
'SBHNFOU 7JFX .PEFM "DUJWJUZͷϥΠϑαΠΫϧͷ7JFX.PEFMΛ 'SBHNFOUͰڞ༗Ͱ͖Δ
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> </layout> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
%BUB#JOEJOH <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
-JWF%BUB 7JFX 7JFX.PEFM -JWF%BUB 3FQPTJUPSZ 4PNF 1SPDFTT ʹมߋ͕͋Ε௨Λड͚ 7JFXΛมߋ Ϣʔβʔͷૢ࡞Ͱ
มߋ͕͋Εઃఆ Ληοτ มߋ͕͋Ε௨
-JWF%BUB <layout> <data> <variable name="viewModel" type="com.example.ui.main.ViewModel/" /> </data> <EditText android:text="@={viewModel.body}"
/> <Button android:onClick="@{(view)->viewModel.submit()}" /> class ViewModel() { val body = MutableLiveData<String>() fun submit() { // ॲཧ } }
-JWF%BUB viewModel.allWords.observe(this, Observer<String> { txt -> // มߋ௨࣌ͷॲཧ })
.77.ಋೖޮՌ w pOE7JFX#Z*Eͷ໓ w WJFXΛૢ࡞͢Δίʔυͷ໓ w PO$SFBUF͔ΒϩδοΫΛΓͤͨ
Ӭଓॲཧ
Ӭଓॲཧ w ϝϞϦʹ࣋ͬͯΔ͚ͩͩͱͳΜ͔͠ΒͷλΠ ϛϯάͰ͙͢ফ͑Δ વ w ඪ४ͷ42-JUFͷૢ࡞ϥΠϒϥϦ͕͋Δ͚Ͳ
3PPN @Entity(tableName = "word_table") data class Word( @PrimaryKey @NonNull @ColumnInfo(name
= "word") var mWord: String )
3PPN @Dao interface WordDao { @Insert fun insert(word: Word) @Query("DELETE
FROM word_table") fun deleteAll() @Query("SELECT * FROM word_table ORDER BY word ASC") fun allWords(): LiveData<List<Word>> }
ҙ w LPUMJOͩͱLBQUΛΘͳ͍ͱ࣮ߦ࣌Τϥʔ ͳΔ w .BJO5ISFBE 6*5ISFBE Ͱ࣮ߦ͢Δͱ ΤϥʔʹͳΔ
ඇಉظॲཧ
ඇಉظॲཧ w .BJO 6* 5ISFBEΛࢭΊͳ͍ͨΊʹ ඇಉظʹॲཧ͢Δඞཁ͕͋Δ w ओʹωοτϫʔΫɺσΟεΫΞΫηε͕ൃ ੜ͢Δॲཧ͕ର
ओͳखஈ w 3Y+BWB w ,PUMJODPSPVUJOFT
3Y+BWB w 3YܥͷϥΠϒϥϦͳͷͰɺͳΕͯΔਓͱͬ ͖͍ͭ͢ w ࠓͷͱ͜Ζͷఆ൪
"OESPJEͰͷ༻ྫ fun done(task: Task) = repository.doneTask(task) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ //
ޭ࣌ͷॲཧ }, { // ࣦഊ࣌ͷॲཧ }) override fun doneTask(task: Task): Completable = Completable.create { try { task.status = Task.Status.DONE db.taskDao().updateTask(task) it.onComplete() } catch (e: Exception) { it.onError(e) } } ॲཧࣗମผεϨουʹͯ͠ ݁ՌΛϝΠϯεϨουͰड͚औΔ
,PUMJODPVSPVUJOFT
,PUMJODPVSPVUJOFT w ·ͩ&YQFSJNFOUBM w ܰྔεϨου
,PUMJODPSPVUJOFT w %JTQBUDIFS ࣮ߦ͢ΔεϨου w +PC DPSPVUJOFΛΩϟϯηϧͰ͖Δ w
$PSPVUJOF$POUFYU ओʹ%JTQBUDIFSͱ+PCͷ Έ߹Θͤ w 4DPQF είʔϓͰ࣮ߦ͞ΕͨDPSPVUJOFࢠ DPSPVUJOFʹͳΔ
είʔϓ ࢠ ࢠ ࢠ +PC $BODFM ͷείʔϓͰ࡞ΒΕͨ $PSPVUJOFࢠ$PSPVUJOFʹͳΔ ͷ+PCΛΩϟϯηϧ͢Δͱ
࠶ؼతʹࢠΛ$BODFM͢Δ
class WordViewModel(application: Application) : AndroidViewModel(application) { private var parentJob =
Job() private val coroutineContext: CoroutineContext get() = parentJob + Dispatchers.Main private val scope = CoroutineScope(coroutineContext) override fun onCleared() { super.onCleared() parentJob.cancel() } } viewModel.scope.launch(Dispatchers.IO) { // ඇಉظʹ͍ͨ͠ॲཧ } "OESPJEͰͷ༻ྫ "DUJWJUZͷഁغ࣌ʹίϧʔνϯΛDBODFM͠ͳ͍ͱ ϝϞϦϦʔΫ͢ΔՄೳੑ͕͋Δ
σόοΫʹ͑Δπʔϧ
%FCVH5PPMT w TUFUIP w IZQFSJPO
TUFUIP w $ISPNFͰ%FW5PPMTͱಉ͡ૢ࡞ੑͰ "OESPJEͷঢ়ଶ͕ΈΕΔ
None
DISPNFJOTQFDUEFWJDFT ʹΞΫηε
ඪ४Ͱ42-JUF 4IBSFE1SFGFSFODFͳͲ͕ݟΕΔ
ϓϥάΠϯΛ͑ωοτϫʔΫ௨৴ΈΕΔ
IZQFSJPO w ΞϓϦͰΞϓϦͷσόοά͕Ͱ͖Δ
None
ࢀߟʹͨ͠ιʔε w %SPJE,BJHJͷެࣜΞϓϦ w (PPHMFެࣜͷ"OESPJE"SDIJUFDUVSF ͷιʔεɻϦϙδτϦͰΞʔΩςΫνϟΛϒ ϥϯνͰΓସ͑ΒΕΔ
͍͞͝ʹ w ͕ಠֶͰษڧͯ͠Δ͚ͩͰͨͲΓ͖ͭʹ ͍͘෦Λ·ͱΊ·ͨ͠ w ॳֶऀͷʹܦ͍ͯͰ͢
͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠