Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Engineering joy: Building the celebration syste...
Search
LINEヤフーTech (LY Corporation Tech)
PRO
July 01, 2025
Technology
0
23
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
Tweet
Share
More Decks by LINEヤフーTech (LY Corporation Tech)
See All by LINEヤフーTech (LY Corporation Tech)
ガイドラインを軸にしたウェブアクセシビリティ改善
lycorptech_jp
PRO
1
62
ML PM Talk #1 - ML PMの分類に関する考察
lycorptech_jp
PRO
1
540
Yahoo! JAPANトップページ〜アクセシビリティのせかいをつなぐ〜
lycorptech_jp
PRO
0
13
AI活用によるPRレビュー改善の歩み ― 社内全体に広がる学びと実践
lycorptech_jp
PRO
0
87
JSConf JP 2025 LINEヤフーのセッション紹介&アンケート 結果発表
lycorptech_jp
PRO
0
50
LINEヤフー バックエンド組織・体制の紹介
lycorptech_jp
PRO
0
890
Service Monitoring Platformについて
lycorptech_jp
PRO
0
430
LINEギフト・LINEコマース領域の開発
lycorptech_jp
PRO
0
480
LINEスキマニ/LINEバイトにおけるバックエンド開発
lycorptech_jp
PRO
0
490
Other Decks in Technology
See All in Technology
法人支出管理領域におけるソフトウェアアーキテクチャに基づいたテスト戦略の実践
ogugu9
1
130
Symfony AI in Action
el_stoffel
2
370
こがヘンだよ!Snowflake?サービス名称へのこだわり
tarotaro0129
0
110
20251127 BigQueryリモート関数で作る、お手軽AIバッチ実行環境
daimatz
0
430
ページの可視領域を算出する方法について整理する
yamatai1212
0
160
モバイルゲーム開発におけるエージェント技術活用への試行錯誤 ~開発効率化へのアプローチの紹介と未来に向けた展望~
qualiarts
0
290
プロダクトマネジメントの分業が生む「デリバリーの渋滞」を解消するTPMの越境
recruitengineers
PRO
3
440
生成AI・AIエージェント時代、データサイエンティストは何をする人なのか?そして、今学生であるあなたは何を学ぶべきか?
kuri8ive
2
1.8k
21st ACRi Webinar - AMD Presentation Slide (Nao Sumikawa)
nao_sumikawa
0
200
Ryzen NPUにおけるAI Engineプログラミング
anjn
0
220
世界最速級 memcached 互換サーバー作った
yasukata
0
110
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
9.9k
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
140
7.2k
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.2k
Context Engineering - Making Every Token Count
addyosmani
9
460
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
Become a Pro
speakerdeck
PRO
30
5.7k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
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