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
Engineering joy: Building the celebration syste...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
LINEヤフーTech (LY Corporation Tech)
PRO
July 01, 2025
Technology
40
0
Share
Engineering joy: Building the celebration system on the Home tab of the LINE app on Android
LINEのホームタブでの祝祭アニメーションの技術アーキテクチャを深く掘り下げ、Androidの核となる構成要素がいかにして日常の瞬間を大規模な魔法の祝祭に変えるかを探ります。
LINEヤフーTech (LY Corporation Tech)
PRO
July 01, 2025
More Decks by LINEヤフーTech (LY Corporation Tech)
See All by LINEヤフーTech (LY Corporation Tech)
現場の負担は本当に減る?LINEヤフーの事例で紐解く、問い合わせ自動化の全プロセス
lycorptech_jp
PRO
0
90
「AIエージェントで変わる開発プロセス―レビューボトルネックからの脱却」
lycorptech_jp
PRO
0
900
LINEヤフーにおけるAIOpsの現在地
lycorptech_jp
PRO
6
3.5k
PMとしての意思決定とAI活用状況について
lycorptech_jp
PRO
1
240
Yahoo!ショッピングのレコメンデーション・システムにおけるML実践の一例
lycorptech_jp
PRO
1
330
Rollback from KRaft mode to ZooKeeper mode
lycorptech_jp
PRO
1
150
When an innocent-looking ListOffsets Call Took Down Our Kafka Cluster
lycorptech_jp
PRO
0
180
類似画像検索モデルの開発ノウハウ
lycorptech_jp
PRO
6
1.3k
メタデータ同期に潜んでいた問題 〜 Cache Stampede 時の Cycle Wait を⾒つけた話
lycorptech_jp
PRO
0
220
Other Decks in Technology
See All in Technology
Standards et agents IA : un tour d’horizon de MCP, A2A, ADK et plus encore
glaforge
0
190
Amazon S3 Filesについて
yama3133
2
220
国内外の生成AIセキュリティの最新動向 & AIガードレール製品「chakoshi」のご紹介 / Latest Trends in Generative AI Security (Domestic & International) & Introduction to AI Guardrail Product "chakoshi"
nttcom
4
1.4k
目的ファーストのハーネス設計 ~ハーネスの変更容易性を高めるための優先順位~
gotalab555
8
2.3k
レビューしきれない?それは「全て人力でのレビュー」だからではないでしょうか
amixedcolor
0
340
クラウドネイティブな開発 ~ 認知負荷に立ち向かうためのコンテナ活用
literalice
0
150
Expiration of Secure Boot Certificates for vSphere Virtual Machines
mirie_sd
0
110
データ定義の混乱と戦う 〜 管理会計と財務会計 〜
wonohe
0
130
20年前の「OSS革命」に学ぶ AI時代の生存戦略
samakada
0
470
Do Vibe Coding ao LLM em Produção para Busca Agêntica - TDC 2026 - Summit IA - São Paulo
jpbonson
3
150
AgentCore×VPCでの設計パターンn選と勘所
har1101
3
300
No Types Needed, Just Callable Method Check
dak2
1
1.6k
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
120
Navigating Team Friction
lara
192
16k
Un-Boring Meetings
codingconduct
0
270
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
110
WENDY [Excerpt]
tessaabrams
10
37k
Automating Front-end Workflow
addyosmani
1370
200k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
120
Designing Powerful Visuals for Engaging Learning
tmiket
1
350
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.6k
Being A Developer After 40
akosma
91
590k
Transcript
&OHJOFFSJOH+PZ #VJMEJOH-*/&T"OESPJE$FMFCSBUJPO4ZTUFNBU4DBMF -:$PSQPSBUJPO -*/&"QQ%FW 5VBO 5VOB
"OESPJE4PGUXBSF&OHJOFFS 8PSLJOHPO-*/&T)PNFUBCGFBUVSFT 1BTTJPOBUFBCPVUCVJMEJOHEFMJHIUGVMVTFS FYQFSJFODFT "CPVUNF
4IPXDBTF 5IF$IBMMFOHF 4ZTUFN"SDIJUFDUVSF0WFSWJFX *NQMFNFOUBUJPO%FFQ%JWF #VJMEJOH#MPDLT4ZOFSHZ 3FTVMUT*NQBDU 2VFTUJPOT%JTDVTTJPO "HFOEB
#JSUIEBZ$ISJTUNBT $FMFCSBUJPOT -*/&"QQ)PNFUBCEVSJOH
5IF$IBMMFOHF 1SFDJTJPO5JNJOH &WFOUTNVTUUSJHHFSFYBDUMZXIFOJOUFOEFE TVSWJWJOHBQQSFTUBSUT 3FTPVSDF.BOBHFNFOU &GGJDJFOUIBOEMJOHPGDFMFCSBUJPOBTTFUTBDSPTTNJMMJPOTPGEFWJDFT &EHF$BTFT
/FUXPSLGBJMVSFT BQQUFSNJOBUJPOT NVMUJQMFDPODVSSFOU DFMFCSBUJPOT
0VS4PMVUJPO 3FMJBCMF.BHJD #VJMEJOH#MPDLT 1IBTF"SDIJUFDUVSF
4ZTUFN"SDIJUFDUVSF0WFSWJFX
#VJMEJOH#MPDLT'PVOEBUJPO 3PPN%BUBCBTF 3FMJBCMFMPDBMTUPSBHFXJUISFBDUJWFRVFSJFT 8PSL.BOBHFS 1SFDJTFTDIFEVMJOHBDSPTTBQQMJGFDZDMF ,PUMJO'MPX 3FBDUJWF6*VQEBUFTBOETUBUFNBOBHFNFOU
1IBTF+PVSOFZ &WFOU %JTDPWFSZ 3FTPVSDF "DRVJTJUJPO 4IPX5JNF $MFBO6Q 3FDFJWFFWFOU OPUJGJDBUJPO %PXOMPBEFWFOU
NFUBEBUB %PXOMPBEBOEWBMJEBUF SFTPVSDFT %JTQMBZFGGFDUTBU UIFEFTJHOBUFEUJNF $MFBOVQSFTPVSDFT 4DIFEVMFOFYU PDDVSSFODF .BJOUBJOSFBEJOFTT EVSJOHJEMFQFSJPET
,FZ%FTJHO1SJODJQMFT EBZQSFQBSBUJPOCVGGFSFOTVSFTSFMJBCMFEFMJWFSZ $MFBSTFQBSBUJPOPGDPODFSOTCFUXFFOQIBTFT *OEFQFOEFOUFSSPSIBOEMJOHJOFBDIDPNQPOFOU 6TFSDFOUSJDUJNJOHXJUIHSBDFQFSJPET
*NQMFNFOUBUJPO%FFQ%JWF +PVSOFZ5ISPVHI"MM'PVS1IBTFT
1IBTF&WFOU%JTDPWFSZ $MJFOU TJEF 4FSWFS QVTIFE scheduledTime = showTime - 5
days retryUntil = showTime + 1 day 8PSL.BOBHFS {showTime} .FUBEBUB%PXOMPBE8PSLFS {showTime}
1IBTF3FTPVSDF"DRVJTJUJPO .FUBEBUB 'FUDIJOH "TTFU %PXOMPBE retry retry %POF
3PCVTU*NQMFNFOUBUJPO // Metadata Download Worker: Fetch event configurations if (retryUntil
< now) { return failure() } val event = fetchEventMetadata(eventId) // error -> retry saveEventMetadata(event) // error -> retry scheduleAssetDownload(event) // success -> next step .FUBEBUB%PXOMPBE8PSLFS'FUDIFWFOUDPOGJHVSBUJPOT
3PCVTU*NQMFNFOUBUJPO // Asset Worker: Download and validate celebration assets if
(retryUntil < now) { return failure() } val asset = downloadAsset(event) // error -> retry validateAsset(asset, event.checksum) // error -> retry fileStorage.extractAndSave(eventId, asset) // error -> retry // success scheduleShowtime() scheduleCleanup() "TTFU8PSLFS%PXOMPBEBOEWBMJEBUFDFMFCSBUJPOBTTFUT
1IBTF3FTPVSDF"DRVJTJUJPO .FUBEBUB 'FUDIJOH "TTFU %PXOMPBE retry retry %POF 4DIFEVMJOH 4IPXUJNF
4DIFEVMJOH $MFBOVQ WorkManager 3PPN%#
1IBTF4IPX5JNF 1&/%*/( 3&"%: '6--@4$3&&/@ &''&$5@$0.1-&5& % "MM#VJMEJOH#MPDLT6OJUF
&MFHBOU4JNQMJDJUZ // WorkManager: One simple state change eventRepository.updateEventState(eventId, READY) //
Everything else happens automatically: // Room → Flow → UI updates seamlessly
1FSGFDU$PMMBCPSBUJPO 8PSL.BOBHFS5SJHHFSTUIFQSFDJTFNPNFOUXJUIPOFMJOFPG DPEF 3PPN3FBDUJWFEBUBCBTFJOTUBOUMZOPUJGJFTBMMPCTFSWFST 'MPX)BOEMFTDPNQMFYQSJPSJUZ UJNJOH BOE6*DPPSEJOBUJPO
BVUPNBUJDBMMZ
1IBTF$MFBO6Q EBZHSBDFQFSJPE QSFWFOUTJOUFSSVQUJPOGPSMBUFVTFST $PNQSFIFOTJWFSFNPWBM PGBTTFUTBOENFUBEBUB 3FDVSSJOHFWFOUT BVUPNBUJDBMMZSFTDIFEVMFOFYUPDDVSSFODF
&GGJDJFOU3FTPVSDF.BOBHFNFOU
1IBTFNBQ 1IBTF 1IBTF retry 1IBTF 1IBTF
#VJMEJOH#MPDLT4ZOFSHZ $PNQMFY4UBUF.BOBHFNFOU.BEF4JNQMF
5IF1PXFSPG*OUFHSBUJPO 8PSL.BOBHFSTDIFEVMFT 3PPNTUPSFTRVFSJFT 'MPXSFBDUT 6*VQEBUFT
3FBM*NQBDU$PNQMFY-PHJDJO4JNQMF$PEF // All three building blocks working together: val displayableEventFlow
= combine( homeEventEffectDao.getDisplayableEventsFlow(), // Room: reactive queries homeTabVisibilityFlow // Flow: UI state tracking ) { events, isHomeVisible -> events.takeIf { isHomeVisible } // Timing: only when visible ?.maxByOrNull { it.priority } // Priority: personal > cultural } // Worker updates Room → Room triggers Flow → Flow updates UI displayableEventFlow.collect { event -> showEffect(event) }
8IBU5IJT"DIJFWFT $PNQMFYDPPSEJOBUJPOCFDPNFTEFDMBSBUJWFQSPHSBNNJOH .VMUJQIBTFTUBUFUSBOTJUJPOTIBOEMFEBVUPNBUJDBMMZ &SSPSSFDPWFSZBDSPTTQIBTFT XJUITJOHMFSFUSZTUSBUFHZ 3FBDUJWF6*VQEBUFTFMJNJOBUF
NBOVBMTUBUFTZODISPOJ[BUJPO 3FTVMU$PNQMFYDFMFCSBUJPOPSDIFTUSBUJPO ˠ4JNQMFSFBDUJWFEFDMBSBUJPOT
3FTVMUT*NQBDU
1FSGPSNBODF"DIJFWFNFOUT DFMFCSBUJPOEFMJWFSZ 4VDDFTTSBUF JNQBDU "QQTUBSUVQ ;FSP EVSJOHJEMFQFSJPET 3FTPVSDFTGPPUQSJOU -PX
"VUPNBUJDSFDPWFSZ GSPNOFUXPSLGBJMVSFTBOEBQQDSBTIFTPSSFTUBSUT 5FDIOJDBM&YDFMMFODF PGCVJMEJOHCMPDLTGPSDPNQMFYTUBUFNBOBHFNFOU 4FBNMFTTJOUFHSBUJPO TJNQMJGJFTRVBMJUZBTTVSBODF *OEFQFOEFOUQIBTF UFTUJOH
1FSGFDUUJNJOH DSFBUFTHFOVJOFTVSQSJTFNPNFOUT 6TFS&YQFSJFODF FOTVSFTCJSUIEBZTBSFOUNJTTFECZIPMJEBZT 1FSTPOBMQSJPSJUZ FOIBODFFNPUJPOBMJNQBDU $VMUVSBMBXBSFOFTT FOIBODFFNPUJPOBMJNQBDU 4NPPUIBOJNBUJPOT
,FZ5BLFBXBZT
"SDIJUFDUVSF-FTTPOT 4USBUFHJDQSFQBSBUJPO EBZCVGGFS QSFWFOUTMBTUNJOVUF GBJMVSFT 1IBTFJTPMBUJPO FOBCMFTJOEFQFOEFOUFSSPSIBOEMJOHBOEUFTUJOH
#VJMEJOHCMPDLTZOFSHZ MFWFSBHFT"OESPJETTUSFOHUITFGGFDUJWFMZ 6TFSDFOUSJDEFTJHO USBOTGPSNTUFDIOJDBMDPOTUSBJOUTJOUP EFMJHIUGVMFYQFSJFODFT
*NQMFNFOUBUJPO*OTJHIUT &BSMZSFTPVSDFBDRVJTJUJPO FOTVSFTSFMJBCMFDFMFCSBUJPOEFMJWFSZ 3FBDUJWFTUBUFNBOBHFNFOU UISPVHI'MPXTJNQMJGJFTDPNQMFY6* DPPSEJOBUJPO 8PSL.BOBHFSTDIFEVMJOH
DPPSEJOBUFTQSFDJTFQIBTFUSBOTJUJPOT BOESFUSZMPHJD 3PPNTSFBDUJWFRVFSJFT QSPWJEFSFBMUJNFTZTUFNTUBUF BXBSFOFTT
5IBOL:PV
&OHJOFFSJOHKPZ#VJMEJOHUIFDFMFCSBUJPOTZTUFN POUIF)PNFUBCPGUIF-*/&BQQPO"OESPJE IUUQTUFDICMPHMZDPSQDPKQFOFOHJOFFSJOHKPZCVJMEJOHUIFDFMFCSBUJPOTZTUFNPOUIF IPNFUBCPGUIFMJOFBQQPOBOESPJE ,PUMJO'MPX%PDVNFOUBUJPO IUUQTLPUMJOMBOHPSHEPDTGMPXIUNM 3PPN%BUBCBTF%PDVNFOUBUJPO
IUUQTEFWFMPQFSBOESPJEDPNUSBJOJOHEBUBTUPSBHFSPPN 8PSL.BOBHFS%PDVNFOUBUJPO IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFXPSLNBOBHFS 3FGFSFODFT