Slide 1

Slide 1 text

AndroidΞϓϦ։ൃʹ ͓͚Δٕज़ސ໰ͱͯ͠ ͷ໾ׂ DroidKaigi 2018 @cutmail

Slide 2

Slide 2 text

͢Δ࿩ • ٕज़ސ໰ͱͯ͠νʔϜΛͲ͏ཱͯ௚͔ͨ͠ • ٕज़ސ໰ͱͯ͠ձࣾʹͲ͏ߩݙ͢Δ͔ • ௚ۙͷϓϩδΣΫτͰԿΛ࠾༻͔ͨ͠

Slide 3

Slide 3 text

͠ͳ͍࿩ • MVVMɺMVP….ͳͲͷઃܭͷ࿩

Slide 4

Slide 4 text

ࣗݾ঺հ

Slide 5

Slide 5 text

ࣗݾ঺հ • @cutmail • ߥҪ ୡ࠸ • ϐοΫΞοϓגࣜձࣾ ٕज़ސ໰ • Android / iOS / GAE / Go

Slide 6

Slide 6 text

ΞδΣϯμ • ٕज़ސ໰ͱ͸ • ٕज़ސ໰ͱͯ͠΍͍ͬͯΔ͜ͱ • ٕज़ސ໰ͱͯ͠AndroidΞϓϦ։ൃͰ΍͍ͬͯ Δ͜ͱ • ·ͱΊ

Slide 7

Slide 7 text

ٕज़ސ໰ͱ͸

Slide 8

Slide 8 text

ٕज़ސ໰ͱ͸ • ٕज़ऀͷ໾৬Ͱٕज़ࢦಋऀ • ٕज़ͷಛఆྖҬͷΞυόΠβʔ • ૊৫ʹର͢ΔΞυόΠβʔ

Slide 9

Slide 9 text

ٕज़ސ໰ͱͯ͠ ΍͍ͬͯΔ͜ͱ

Slide 10

Slide 10 text

ٕज़ސ໰ͷ࢓ࣄ • ։ൃମ੍ͷཱͯ௚͠ • ٕज़޿ใ • ࠾༻ • ࣾ಺ͷ੍౓࡞Γ • ٕज़ͷબఆ

Slide 11

Slide 11 text

։ൃମ੍ͷཱͯ௚͠

Slide 12

Slide 12 text

%..άϧʔϓ ϐοΫΞοϓ ωΫετΧϨϯγʔ ͦͷଞ
 άϧʔϓձࣾ

Slide 13

Slide 13 text

CHIPS

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

։ൃνʔϜମ੍ • PM 1ਓ • σβΠφʔ 1ਓ • αʔόʔ 2ਓ • iOS 2ਓ • Android 1ਓ

Slide 16

Slide 16 text

ϓϥοτϑΥʔϜ • iOS • AndroidʢະϦϦʔεʣ • Ұ෦Web

Slide 17

Slide 17 text

ॳ೔

Slide 18

Slide 18 text

ϓϩδΣΫτʹ
 ೖͬͯΈͨΒ

Slide 19

Slide 19 text

૑ۀظͷΑ͏ͳ։ൃ͕
 ߦΘΕ͍ͯͨ

Slide 20

Slide 20 text

ޱ಄Ͱͷ΍ΓͱΓ

Slide 21

Slide 21 text

୭΋೺Ѳ͍ͯ͠ͳ͍
 ։ൃεέδϡʔϧ

Slide 22

Slide 22 text

ಉ͡ํ޲Λ
 ޲͍͍ͯͳ͍

Slide 23

Slide 23 text

࣋ଓੑͷͳ͍։ൃ

Slide 24

Slide 24 text

ϚΠϧετʔϯ͕ͳ͍

Slide 25

Slide 25 text

ʮઓ৔͔ͳʁʯ

Slide 26

Slide 26 text

Ͳ͏͔ͨ͠

Slide 27

Slide 27 text

νʔϜϏϧσΟϯά

Slide 28

Slide 28 text

߹॓ͷ࣮ࢪ

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

߹॓ͷ࣮ࢪ • ΦϑΟεͱ͸͋͑ͯԕ͍৔ॴʹ͋͑ͯंͰ • ਺άϧʔϓʹΘ͔ΕͯंͰҠಈ • υϥοΧʔ෩ΤΫααΠζΛத৺ͱͨ͠ϫʔ Ϋγϣοϓ

Slide 32

Slide 32 text

υϥοΧʔ෩ΤΫααΠζ • 3ͭͷ࣭໰Ͱ͓ޓ͍ͷ͜ͱΛ஌Γɺظ଴஋Λ͢Γ ߹ΘͤΔ • ࣗ෼ͷಘҙͳ͜ͱ • νʔϜϝϯόʔ͕ࣗ෼ʹظ଴͍ͯ͠Δͱࢥ͏͜ ͱ • ଞͷϝϯόʔʹظ଴͢Δ͜ͱ

Slide 33

Slide 33 text

݁Ռ

Slide 34

Slide 34 text

͓ޓ͍ͷظ଴஋Λ͢Γ͋Θͤ Δ͜ͱͰ

Slide 35

Slide 35 text

νʔϜϝϯόʔͷ૬ޓཧղ͕
 ਐΜͩ

Slide 36

Slide 36 text

νʔϜͷ݁ଋྗ͕ߴ·ͬͨ

Slide 37

Slide 37 text

։ൃମ੍ͷ੔උ

Slide 38

Slide 38 text

։ൃମ੍ͷ੔උ • 2िؒͷεϓϦϯτ • ελϯυΞοϓϛʔςΟϯά • ϓϩμΫτόοΫϩά • ίʔυϨϏϡʔͷಋೖ

Slide 39

Slide 39 text

֤ʑ͕͍࣋ͬͯΔλεΫͷ ݟ͑ΔԽ

Slide 40

Slide 40 text

λεΫͷՄࢹԽ • TrelloΛಋೖ • EleganttͰΨϯτνϟʔτΛݟΕΔΑ͏ʹ

Slide 41

Slide 41 text

ZenHubಋೖ • issue΍ϚΠϧετʔϯΛGitHub಺Ͱ׬݁Ͱ͖ ΔΑ͏ʹ • ͜ΕΛݟͳ͕ΒελϯυΞοϓMTGΛ࣮ࢪ

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

ίʔυϨϏϡʔͷಋೖ

Slide 45

Slide 45 text

ίʔυϨϏϡʔ࣌ʹϥϕϧΛ͚ͭΔ • [nits] : খ͍͞ࢦఠɻΠϯσϯτ΍typo • [IMO] : In My Opinion ࢲ͸͜͏ࢥ͏͚Ͳผʹ௚͢͜ͱ͸ඞ ਢͰ͸ͳ͍ • [COULD] : Ͱ͖Ε͹௚ͨ͠΄͏͕ྑ͍ • [MUST] : ௚ͦ͏ • [Q] : ࣭໰

Slide 46

Slide 46 text

ίʔυϨϏϡʔͷ؍఺ • ͦ΋ͦ΋࢓༷Λຬ͍ͨͯ͠Δ͔ • iOS / AndroidͰۃ୺ʹ࢓༷͕ҧ͍ͬͯͳ͍͔ • ໋໊͕ద੾͔ • ςετ͕ॻ͔Ε͍ͯΔ͔ • ίϝϯτ͕ͳͯ͘΋ཧղͰ͖Δ͔ • ࣮ࡍʹಈ͔ͯ͠Έͯҧ࿨ײ͕ͳ͍͔

Slide 47

Slide 47 text

ϦϦʔε಺༰Λ࢒͢ • GitHubͷϦϦʔεػೳΛ࢖ͬͯɺͦͷόʔ δϣϯʹԿΛϦϦʔε͔ͨ͠࢒͢ • Slack͔Βgit-pr-releaseΛ͚ͨͨΔΑ͏ʹͯ͠ ͍Δ • ։ൃҎ֎ͷϝϯόʔʹ͸ϦϦʔεϖʔδΛݟͯ มߋ఺Λ೺Ѳͯ͠΋Β͏

Slide 48

Slide 48 text

ٕज़޿ใ

Slide 49

Slide 49 text

ٕज़޿ใ • ࣾ಺Ͱ࢖͍ͬͯΔٕज़΍τϐοΫΛ֎ʹൃ৴ ͢Δ • ςοΫϒϩά • Πϕϯτ΁ͷڠࢍɺग़ల

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

%..άϧʔϓ ϐοΫΞοϓ ωΫετΧϨϯγʔ ͦͷଞ
 άϧʔϓձࣾ

Slide 52

Slide 52 text

GAE/Go • TELLER શࠃCM์ө࣌΋GAEͷΦʔτεέʔ ϧͰ༨༟ • ύϑΥʔϚϯε͕མͪΔ͜ͱ΋ͳ͍ • ϩʔϧόοΫ΋όʔδϣϯΛ໭͚ͩ͢

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

ࣾ಺Ͱ࢖ΘΕ͍ͯΔ
 ٕज़ελοΫΛ၆ᛌͯ͠
 هࣄԽ

Slide 56

Slide 56 text

֎෦΁ͷΞ΢τϓοτΛ
 ૿΍͢࢓૊ΈΛ࡞Δ

Slide 57

Slide 57 text

Πϕϯτͷڠࢍ • ձࣾͷٕज़ελοΫʹ͋͏Πϕϯτʹڠࢍ͢Δ • ڠࢍۚͷ֬อ • ڠࢍ͢Δ͚ͩͰͳ͘ɺొஃ΋ґཔ͢Δ

Slide 58

Slide 58 text

ΤϯδχΞ࠾༻ͷαϙʔτ

Slide 59

Slide 59 text

ΤϯδχΞ࠾༻ͷαϙʔτ • ٕज़ϒϥϯσΟϯά • ଍Γ͍ͯͳ͍ਓࡐͷ੔ཧ/ൃ۷

Slide 60

Slide 60 text

ٕज़ϒϥϯσΟϯά • ٕज़ϒϥϯσΟϯά͸࠾༻ϒϥϯσΟϯά • ֎͔Βͷݟ͑ํΛ౿·͑ͯ಺෦Λվળ͍ͯ͘͠ • ॏཁͳͷ͸ද໘͚ͩͰ͸ͳ͘ɺ݁Ռతʹ
 αʔϏε͕ྑ͘ͳΔ͜ͱ

Slide 61

Slide 61 text

଍Γ͍ͯͳ͍ਓࡐΛ໌֬Խ • ֤νʔϜ͕ࠓͲͷ৬छΛืू͍ͯ͠Δͷ͔ • Ϧιʔεঢ়گ͸ʁ • ืूཁ߲Λ࡞੒͢Δ • Ͳ͏͍͏εϖοΫͷਓ͕ඞཁͳͷ͔

Slide 62

Slide 62 text

੍౓࡞Γ

Slide 63

Slide 63 text

੍౓࡞Γ • 50%ϑϦʔϧʔϧ • ηϛφʔࢀՃ੍౓ • ϑϨϯυγοϓαϙʔτ • ͓ࢼ͠ब৬੍౓

Slide 64

Slide 64 text

50%ϑϦʔϧʔϧ • ۀ຿࣌ؒͷ50%ΛҎԼͷ׆ಈʹ͋ͯͯྑ੍͍౓ • OSS΁ͷߩݙ • ຊͷࣥච • Πϕϯτొஃɺͦͷ४උ • ࠾༻ʹؔΘΔ׆ಈશൠ

Slide 65

Slide 65 text

ΧϯϑΝϨϯεࢀՃ੍౓ • ༗ྉͷ֎෦ηϛφʔ΍ΧϯϑΝϨϯεʹࢀՃ Ͱ͖Δ • DroidKaigiɺtry! Swift • ௚ۙͩͱGopherConɺKotlinConfʹϝϯόʔ ͕ࢀՃ༧ఆ

Slide 66

Slide 66 text

ϑϨϯυγοϓαϙʔτ • ༏लͳ༑ਓͱͷ͝൧ͷඅ༻Λձ͕ࣾෛ୲ • 1ճʹ͖ͭ1ਓ1ສԁ·Ͱิॿ • ༏लͳϝϯόʔ͸༏लͳ༑ਓΛ஌͍ͬͯΔ͸ ͣ

Slide 67

Slide 67 text

͓ࢼ͠ब৬੍౓ • ҆৺ͯ͠ೲಘͯ͠ೖࣾͯ͠΋Β͏ͨΊʹɺస ৬લʹ࣮ࡍʹҰॹʹಇ͚Δ • 1೔~1िؒఔ౓ • ΋ͪΖΜใु΋͓ࢧ෷͍

Slide 68

Slide 68 text

ࣾ಺Πϕϯτͷ։࠵ • ϞόΠϧڞ༗ձ • Goձ • ʮΈΜͳͷGoݴޠʯྠಡձ • ϐοΫΞοϓφΠτ

Slide 69

Slide 69 text

ϞόΠϧڞ༗ձ • ϞόΠϧΞϓϦΤϯδχΞ͕ू·ͬͯίʔυΛ ಡΜͩΓɺ࠷ۙͷ։ൃτϐοΫʹ͍ͭͯ࿩͢ ৔ • DroidKaigiΞϓϦͷιʔείʔυϦʔσΟϯ άΛͨ͠Γ

Slide 70

Slide 70 text

ϞόΠϧڞ༗ձ • ଞνʔϜͷαʔϏεͷίʔυΛಡΜͰɺઃܭ ʹ͍ͭͯ͋Ε͜Ε • ΞʔΩςΫνϟʹ͍ͭͯͷٞ࿦

Slide 71

Slide 71 text

Goձ • αʔόʔΤϯδχΞ͕ू·Γɺ֤ϓϩδΣΫ τͷίʔυΛಡΜͩΓɺࠔ͍ͬͯΔ͜ͱ΍ɺ ϗοτͳτϐοΫ΍ઃܭʹ͍ͭͯ࿩͢৔ • ΞϓϦΤϯδχΞ΋ࢀՃOK

Slide 72

Slide 72 text

ʮΈΜͳͷGoݴޠʯྠಡձ • 1ষͮͭ࣋ͪճΓͰղઆ • ΞϓϦΤϯδχΞ΋ࢀՃ • αʔόʔͷؾ࣋ͪΛཧղͯ͠
 ΋Β͏

Slide 73

Slide 73 text

ϐοΫΞοϓφΠτ • ࣾ಺LTձ • ࢿྉ͸جຊతʹͳ͠Ͱ • ௕ͯ͘5෼ • ٕज़Ҏ֎ͷτʔΫ΋Welcome

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

Ϟνϕʔγϣϯ • ୯७ʹؾ͍ͮͨ͜ͱΛ൸࿐͍ͨ͠ • খωλΛൃදͰ͖ΔػձΛఏڙ͢Δ • νʔϜؒͰ࿩͢৔Λ࡞Δ • ·ͣ͸ࣾ಺Ͱ࿩͢ͷʹ׳Ε͔ͯΒ֎෦Ͱొஃ ͢Δಓےʹͯ͠΋Β͏

Slide 76

Slide 76 text

ٕज़ސ໰ͱͯ͠ AndroidΞϓϦ։ൃͰ΍ͬͯ ͍Δ͜ͱ

Slide 77

Slide 77 text

ٕज़ͷબఆ

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

CHIPSͰͷϥΠϒϥϦ • Kotlin • RxJava2 • Dagger2 • Android Architecture Component • Lifecycle • Room • Paging

Slide 80

Slide 80 text

Handling Lifecycles • Activity΍FragmentͳͲͷίϯϙʔωϯτʹ ؔ͢Δ৘ใΛอ࣋͠ɺΦϒδΣΫτ͕؍ଌͰ ͖ΔΑ͏ʹ͢Δ

Slide 81

Slide 81 text

Handling Lifecycles • CHIPSͰ͸Lifecycleͷมߋ࣌ʹExoPlayerͷڍ ಈΛม͑ͨΓ͢Δͷʹ࢖͍ͬͯͨΓ͢Δ

Slide 82

Slide 82 text

Room • SQLiteʹΞΫηε͢Δந৅ԽϨΠϠʔΛఏڙ

Slide 83

Slide 83 text

@Entity data class Task( @PrimaryKey val id: String, val name: String) { } @Dao interface TaskDao { @Query("DELETE FROM task") fun deleteAll() } Room

Slide 84

Slide 84 text

Paging • RoomͳͲͷίϯϙʔωϯτͱγʔϜϨεʹ࿈ ܞͰ͖ΔϖʔδϯάϥΠϒϥϦ

Slide 85

Slide 85 text

Paging • PositionalDataSource • RoomΛ࣮૷͍ͯ͠Ε͹ɺ˓͔Β˓݅औಘΈ ͍ͨͳΠϯλϑΣʔεΛࣗಈతʹੜ੒ͯ͘͠ ΕΔ https://developer.android.com/topic/libraries/architecture/paging.html

Slide 86

Slide 86 text

جຊతʹGoogle΍ίϛϡχςΟ ओྲྀͷٕज़Λ࠾༻͍ͯ͘͠

Slide 87

Slide 87 text

ͦͷଞϥΠϒϥϦ • Firebase Authentication • Firebase Performance • Retrofit2 • ExoPlayer • Glide

Slide 88

Slide 88 text

CI؀ڥͷ੔උ • Bitrise • Danger • Android Lint • ktlint • Fabric betaͰࣾ಺഑෍ • ৗʹ࠷৽൛͕QAͰ͖Δମ੍ʹ

Slide 89

Slide 89 text

Πϕϯτܭଌ؀ڥͷ੔උ • Firebase Analytics →BigQuery → CHATIO • ͲͷϓϩμΫτ΋͜ͷߏ੒ʹ

Slide 90

Slide 90 text

No content

Slide 91

Slide 91 text

No content

Slide 92

Slide 92 text

௚ۙͷࣄྫ

Slide 93

Slide 93 text

ೝূΛஔ͖׵͑ͨ࿩

Slide 94

Slide 94 text

ಠࣗೝূ͔Β
 Firebase Authentication΁ • ॳճىಈ࣌ʹήετϢʔβʔΛ࡞੒ • ݩʑ͸ಠࣗͷϩδοΫͰϢʔβʔ࡞੒ɺೝূ • ಠࣗOAuth࣮૷

Slide 95

Slide 95 text

ಠࣗೝূ͔ΒFirebase Auth΁ firebaseAuthInstance.signInAnonymously() .addOnCompleteListener { task -> if (task.isSuccessful) { observer.onSuccess(task.result.user) } else { val cause = task.exception.toOption() .fold({ RuntimeException("unknown firebase auth error") }, { th -> th }) observer.onError(cause) } } ΞϓϦ͸FirebaseͷtokenΛαʔόʔʹ౤͛Δ͚ͩ

Slide 96

Slide 96 text

ೝূ͸Firebase Auth ೝՄ͸ࣗαʔόʔͰ

Slide 97

Slide 97 text

ೝূํ๏Λ૿΍͢৔߹͸ Firebase AuthenticationͰ
 ಠࣗೝূΛ࣮૷͢Δ https://firebase.google.com/docs/auth/web/custom-auth?hl=ja
 https://developers-jp.googleblog.com/2016/10/authenticate-your- firebase-users-with.html

Slide 98

Slide 98 text

ӡ༻Λָʹ͢Δ ΞʔΩςΫνϟΛબ୒͢Δ

Slide 99

Slide 99 text

ӡ༻ΑΓ΋αʔϏε։ൃʹ
 ूத͠Α͏

Slide 100

Slide 100 text

αʔϏεͷίΞͳՁ஋ఏڙʹ
 ஫ྗ͢Δ

Slide 101

Slide 101 text

͜Ε͔Β΍Γ͍ͨ͜ͱ

Slide 102

Slide 102 text

API Documentͷࣗಈੜ੒ • ιʔείʔυ͔Βࣗಈੜ੒ • ৽͍͠ΫϥΠΞϯτΞϓϦͳͲΛ࡞Δ࣌ʹඞ ਢ

Slide 103

Slide 103 text

GAE/GoɺFirebaseΛ࢖ͬͨ αʔϏεج൫ͷ։ൃ • ϘΠϥʔςϯϓϨʔτ • ೝূ΍ϩάͳͲͷجຊతͳίϯϙʔωϯτΛ ໢ཏͨ͠αʔϏεج൫ • αʔϏεͷ্ཱͪ͛Λૣ͘Ͱ͖ΔΑ͏ʹ • ӡ༻΋ָʹ

Slide 104

Slide 104 text

• iOS, AndroidͰڞ௨ͷίϯϙʔωϯτͱͯ͠ ੾Γग़ͤΔ΋ͷΛReact NativeԽ

Slide 105

Slide 105 text

No content

Slide 106

Slide 106 text

·ͱΊ

Slide 107

Slide 107 text

ٕज़ސ໰ͷ࢓ࣄͱ͸ • ֎෦ɺ಺෦ଟذʹΘͨΔ • αʔϏε੒௕ͷͨΊʹɺ௕ظతͳ໨ઢͰٕज़Λ બఆ͢Δ • ࣾ಺Ͱ࢖ΘΕ͍ͯΔٕज़ελοΫΛັྗʹม͑ Δ • ձࣾͷΧϧνϟʔ࡞ΓʹӨڹ͢Δ

Slide 108

Slide 108 text

࠷ޙʹ

Slide 109

Slide 109 text

ٕज़ސ໰͔ΒίʔϙϨʔτΤϯ δχΞϦϯά΁ • ΑΓ૊৫ͷ಺෦Λվળ͍ͯͨ͘͠Ίɺ
 ίʔϙϨʔτΤϯδχΞϦϯάࣨΛઃཱ • αʔϏεڞ௨ͷج൫ɺ؅ཧγεςϜɺશࣾʹ ඥͮ͘։ൃΛਐΊΔ

Slide 110

Slide 110 text

͝੩ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠