Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kyash Androidのイースターエッグ実装 / Kyash Android Easter...
Search
konifar
April 18, 2019
Programming
1.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kyash Androidのイースターエッグ実装 / Kyash Android Easter Eggs
konifar
April 18, 2019
More Decks by konifar
See All by konifar
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
8.8k
マネージャー版 "提案のレベル" を上げる
konifar
27
21k
AIで 浮いた時間で 何をする? 2026春 #devsumi
konifar
21
6.2k
登壇資料を作る時に意識していること #登壇資料_findy
konifar
7
3.2k
事業部のプロジェクト進行と開発チームの改善の “時間軸" のすり合わせ
konifar
12
4.5k
チーム開発の “地ならし"
konifar
8
18k
AIで 浮いた時間で 何をする? #プロヒス2025
konifar
27
17k
物語を動かす行動"量" #エンジニアニメ
konifar
19
7.4k
提案のレベルを上げる #QiitaConference
konifar
98
43k
Other Decks in Programming
See All in Programming
5分で問診!Composer セキュリティ健康診断
codmoninc
0
490
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
180
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
270
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
240
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.9k
自作OSでスライド発表する
uyuki234
1
3.9k
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
270
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
520
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
150
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
1.5k
Featured
See All Featured
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
470
Evolving SEO for Evolving Search Engines
ryanjones
0
240
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Context Engineering - Making Every Token Count
addyosmani
9
1k
30 Presentation Tips
portentint
PRO
1
350
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
How GitHub (no longer) Works
holman
316
150k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
550
Paper Plane (Part 1)
katiecoart
PRO
1
9.8k
Transcript
Kyash Android ͷ ΠʔελʔΤοά࣮ 2019/04/18 () Kyash Meetup #6 Kyash
Inc. @konifar
@konifar (Yusuke Konishi) • ೖࣾͯ͠14ϲ݄͘Β͍ http://konifar.hatenablog.com/entry/2019/03/22/222554 • AndroidΞϓϦ։ൃ͕ϝΠϯ • ೖ͙ࣾͯ͢͠ʹ39ΞχϝʔγϣϯΛ࣮
None
ΠʔελʔΤοά = ָ͓͠Έػೳ
ࡩΞχϝʔγϣϯ • ࡩͬΆ͍จࣈΛτϦΨʔ ʹͯ͠ɺࡩ͕͍ࢄΔʂ
http://konifar.hatenablog.com/entry/2018/06/14/173716 ࡩΞχϝʔγϣϯͷ͖͔͚ͬ
ࢭ·Βͳ͍ཉ
ࠓͨͿΜ 7छྨ͘Β͍͋Δ
ΠʔελʔΤοάͷ ίʔυ෦ͷΛ͠·͢
ੲͱࠓͷίʔυͷ
39Ξχϝʔγϣϯ͚ͩͷࠒ • ཤྺৄࡉը໘ͷViewModelͷҰ෦ʹͼ͜Δ is39() ϝιου • ࣌͜Μͳʹָ͠ΜͰΒ֦͑ͯு͍ͯ͘͠ͱࢥͬͯͳ͔ͬͨ
நԽ͢Δ
ΠʔελʔΤοάͷղ 1. ରͷॴʹ 2. ݅ʹԠͯ͡ 3. Կ͔Λදࣔ͢Δ
39Ξχϝʔγϣϯͷ߹ 1. ରͷॴʹʢૹۚྃը໘શମʹʣ 2. ݅ʹԠͯ͡ʢ39ԁͩͬͨ߹ʹʣ 3. Կ͔Λදࣔ͢ΔʢgifΛදࣔ͢Δʣ
ࡩΞχϝʔγϣϯͷ߹ 1. ରͷॴʹʢཤྺৄࡉը໘શମʹʣ 2. ݅ʹԠͯ͡ʢ࠷ޙͷϝοηʔδʹࡩͬΆ͍จࣈ͕ೖ͍ͬͯͨ߹ʹʣ 3. Կ͔Λදࣔ͢ΔʢՖͼΒͷը૾Λ߱ΒͤΔʣ
ࠓͷΞϯυϩΠυͷ࣮ 7JFX.PEFM 5JNFMJOF)FBEFS &BTUFS&HH'BDUPSZ &BTUFS&HH,FZXPSE .BUDIFS 5JNFMJOF)FBEFS &BTUFS&HH 5JNFMJOF)FBEFS &BTUFS&HH
5JNFMJOF)FBEFS &BTUFS&HH EasterEggΛදࣔ͢ΔViewModel͔Β Factoryܦ༝ͰEasterEggΦϒδΣΫτΛऔ Γग़͢ EasterEggΠϯλʔϑΣʔεΛ࣮ͯ͠ ʰදࣔ݅ʱͱʰදࣔ͢ΔϦιʔεʱΛࢦ ఆ͢Δ දࣔ݅ɺଞͷը໘ͷEasterEggΫϥε ͱڞ௨ͳͷͰɺMatcherΫϥεͱͯ͠Γ ग़͍ͯ͠Δ
|--keywords | |--EasterEggKeywordsMatcher.kt | |-—SakuraEasterEggKeywordsMatcher.kt | |…… |--timeline | |--NoTimelineHeaderEasterEgg.kt
| |--ThankYouReceiveTimelineHeaderEasterEgg.kt | |--TimelineHeaderEasterEgg.kt | |-—TimelineHeaderEasterEggFactory.kt | |…… |--transaction | |--NoTransactionEasterEgg.kt | |--ThankYouSendTransactionEasterEgg.kt | |--TransactionEasterEgg.kt | |--TransactionEasterEggFactory.kt | |…… • UIͷσΟϨΫτϦͷதʹeastereggsσΟϨΫτϦΛஔ͍͍ͯΔ
|--keywords | |--EasterEggKeywordsMatcher.kt | |-—SakuraEasterEggKeywordsMatcher.kt | |…… |--timeline | |--NoTimelineHeaderEasterEgg.kt
| |--ThankYouReceiveTimelineHeaderEasterEgg.kt | |--TimelineHeaderEasterEgg.kt | |-—TimelineHeaderEasterEggFactory.kt | |…… |--transaction | |--NoTransactionEasterEgg.kt | |--ThankYouSendTransactionEasterEgg.kt | |--TransactionEasterEgg.kt | |--TransactionEasterEggFactory.kt | |…… • ʮରͷॴʯ͝ͱʹEasterEggΫϥεͱFactoryΫϥεΛ࡞͍ͬͯΔ • timeline = ཤྺৄࡉը໘্෦ • transaction = ૹۚɾٻྃը໘શମ
interface TimelineHeaderEasterEgg { @DrawableRes fun getAnimationDrawableResId(): Int? fun shouldShow(): Boolean
} • λΠϜϥΠϯৄࡉͷ39ΞχϝʔγϣϯͷΠϯλʔϑΣʔε • Կදࣔ͠ͳ͍έʔεͷͨΊʹɺNullObjectύλʔϯͷΑ͏ͳܗͰ NoTransactionEasterEggΫϥε࡞͍ͬͯΔ class NoTransactionEasterEgg : TransactionEasterEgg { override fun getAnimationDrawableResId(): Int? = null override fun shouldShow() = false }
/** * डऔ࣌ͷ39Ξχϝʔγϣϯ */ class ThankYouReceiveTimelineHeaderEasterEgg( val amount: Long )
: TimelineHeaderEasterEgg { override fun getAnimationDrawableResId() = R.drawable.img_receive_39 override fun shouldShow() = amount == 39L } • 39ԁΛड͚औͬͨ߹ͷ࣮ • දࣔ݅ͱͳΔ shouldShow() ͷςετΛ͔ͬ͠Γॻ͍͍ͯΔ
class SakuraEasterEggKeywordsMatcher : EasterEggKeywordsMatcher { override fun getKeywords() = arrayListOf(
"͘͞Β", "αΫϥ", "ࡩ", "Ֆݟ", "ͳΈ", "ϋφϛ", "ԅ", String(byteArrayOf(-16, -97, -116, -72)) // ࡩͷemoji ) } • ͘͞ΒΞχϝʔγϣϯͷΩʔϫʔυΛఆٛ • JUnitͰParameterized TestΛॻ͘
@RunWith(Parameterized::class) class SakuraEasterEggKeywordsMatcherUnitTest( private val message: String, private val result:
Boolean ) { companion object { @JvmStatic @Parameterized.Parameters fun data(): List<Array<out Any?>> { return listOf( arrayOf("αΫϥ͕͘͞", true), arrayOf("", true), arrayOf("α Ϋϥ", false), …… ) } } @Test fun containsKeyword() { val subject = SakuraEasterEggKeywordsMatcher() assertEquals(result, subject.containsKeyword(message)) } }
class TimelineHeaderEasterEggFactory( val amount: Long, val message: String? ) {
// ద༻͞ΕΔॱʹϦετʹηοτ͍ͯ͠·͢ private val easterEggs = arrayListOf( … // ωλόϨʹͳΔͷͰφΠγϣ ThankYouReceiveTimelineHeaderEasterEgg(amount) ) fun createEasterEgg(): TimelineHeaderEasterEgg { easterEggs.forEach { if (it.shouldShow()) return it } return NoTimelineHeaderEasterEgg() } } • FactoryɺEasterEggͷϦετΛ࣋ͬͯɺ݅ʹԠͯ͡࠷ॳʹද ࣔ݅ʹ߹கͨ͠EasterEggΛฦ͢
val easterEgg = TimelineHeaderEasterEggFactory( amount, message ).createEasterEgg() …
@get:Bindable val headerEasterEggVisible: Boolean get() = easterEgg.shouldShow() @get:Bindable val headerEasterEggDrawable: Int? get() = easterEgg.getAnimationDrawableResId() • ViewModelͰEasterEggΛݩʹDataBindingͷΛܾΊͯBind • AnimationDrawableResIdgifͳͷͰɺGifDrawableΛbindͰ͖ ΔBindingAdapterΛ࡞͍ͬͯΔ https://github.com/koral--/android-gif-drawable
ࠓޙͷίʔυͷ
ʮͦͦαʔόʔαΠ υʹϩδοΫ͋Δ͖ ͡Όͳ͍ʁʯ
ʮͦ͏ͩͶʂʂʯ
ࠓޙͷ • Android/iOSʹϩδοΫ͕ࢄΒΒͳ͍Α͏ʹαʔ όʔαΠυʹϩδοΫΛدͤΔ = APIԽ • ΞχϝʔγϣϯϑΝΠϧΛΫϥΠΞϯτଆͰ࣋ͨͳ ͍Α͏ʹμϯϩʔυͷΈΛ༻ҙ͢Δ =
Ξϓ ϦαΠζͷݮ • ΫϥΠΞϯτͰͷநԽͰ༷͕ݻ·͖ͬͯͨࠓͳ Β͍͚ͬͯͦ͏
None
͍Ζ͍Ζࢼͯ͠܅͚ͩͷ ΠʔελʔΤοάΛ୳ͦ͏ʂ ※ ͪͳΈʹࣗͷkyash_id konifar ͩΑ
࠙ձͰฉ͍ͯΒ͑Ε Ͱ͖Δ͚ͩԿͰ͠·͢ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ