
- TOP
- ã¿ã°äžèЧ
- JavaScript
JavaScript
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
ã¯ããã« ããã«ã¡ã¯ããããã£ã®å¡åŽã»äœè€ã§ãã 5/22, 23ã®2æ¥éã«ããã£ãŠéå¬ããã TSKaigi 2026 ã«åããŠåå ããŠããŸããã TSKaigiãšã¯ïŒ TSKaigiã¯ãæ¥æ¬æå€§çŽã®TypeScriptãããŒããšããããã¯ã«ã³ãã¡ã¬ã³ã¹ã§ããæ¯å¹Žã5æé ã«éå¬ãããŠããããã§ãä»å¹Žã¯çŸå°åå è
ãçŽ800åã§ãªã³ã©ã€ã³åå è
ãçŽ900åãšåãããŠ1700åèŠæš¡ã®å€§ããªã€ãã³ããšãªããŸããããŸãä»å¹Žã®äŒå Žã¯ãã«ãµãŒã«çŸœç°ç©ºæž¯ãšããå Žæã§éå¬ãããŸããã ãªãåå ããããšæã£ãã å¡åŽ å
ã
ãããã³ããšã³ãéçºãTypeScriptã奜ãã ã£ããšããã®ãšãæ¥åã§ãé »ç¹ã«TypeScriptã䜿ãããä»ååå ããããšã«ããŠã¿ãŸãããTSKaigièªäœã¯æšå¹Žããªã³ã©ã€ã³ã§åå ããŠããã®ã§ãããä»å¹Žã¯åæã®äœè€ããã®èªããããçŸå°åå ãããŠã¿ãŸããããªãã©ã€ã³ã€ãã³ããžã®åå çµéšãã»ãŒãªãã£ãã®ã§ãåçŽãªèå³ãšããã®ãçç±ãšããŠãããŸããã äœè€ æ®æ®µã¯å人éçºã§ææ°ã®ã©ã€ãã©ãªã詊ããŠã¿ãããæ¯æ¥ã®ç¿æ
£ã§æè¡ããã°ãèªã¿æŒã£ããããŠããŸããçŸåšæå±ããŠããããŒã ã®éçºã§ã¯å²åãšããŠã¯ãŸã äœãã§ãããTypeScriptãæ¡çšããæ©äŒã¯å¢ããŠããŠãããAPIã®å·æ°ã§ã¯Honoãªã©ãæ¡çšããŸãããçŸåšé²è¡äžã®æ°èŠéçºã§ããåŒãç¶ãTypeScriptãæ¡çšããäºå®ã§ãã å®åã§ã®çµéšãç©ãã«ã€ããŠãä»ç€Ÿãšã³ãžãã¢ã®TypeScriptæŽ»çšæ¹æ³ã«èå³ãæ¹§ããŠããŸãããããã§ãæ®æ®µããTypeScriptã®è©±ã§çãäžããåæã®å¡åŽãèªããä»åã®ã€ãã³ããžã®åå ãæ±ºããŸããã å¡åŽã®ã¿ã€ã ããŒãã« å¡åŽã®ã¿ã€ã ããŒãã« å¡åŽã®ã¿ã€ã ããŒãã« äœè€ã®ã¿ã€ã ããŒãã« äœè€ã®ã¿ã€ã ããŒãã« äœè€ã®ã¿ã€ã ããŒãã« å°è±¡ã«æ®ã£ãã»ãã·ã§ã³ å¡åŽ æ°ããã»ãã·ã§ã³ã®äžã§ããç¹ã«å°è±¡ã«æ®ã£ãã®ãKazuya Serizawaããã«ãããã¢ã³ããã¿ãŒã³ãé¿ããåé§åReactæé©åãã§ãã https://2026.tskaigi.org/talks/17 ãã¡ãã®ã»ãã·ã§ã³ã¯ãReact 19ããæ£åŒã«ç»å ŽããReact Compilerã«ãã£ãŠã³ã³ããŒãã³ãã®æé©åãè¡ããšããå
容ã§ããReact Compilerãæé©åã§ããã®ã¯çŽç²ãªã³ã³ããŒãã³ãã ãã§ãã®ã§ãã³ã³ããŒãã³ãã®çŽç²æ§ãããã«ããŠåãšLintã§æ
ä¿ãããããšããåé§åã®ã¢ãããŒãã玹ä»ããŠããŸããããŸããã³ã³ããŒãã³ããçŽç²ã«ä¿ã€ããšã¯ãæé©åã®ããã ãã§ã¯ãªããèªã¿ãããã¡ã³ãããããã³ãŒãã«ãç¹ãããšèª¬æãããŠããã®ãå°è±¡çã§ããã æé©åãã§ããªãäŸãšããŠã以äžã®4ã€ã玹ä»ãããŠããŸããã å¯äœçšã®æ··å
¥ ïŒrenderäžã®Date.now() / ãã°åºå / ä¹±æ°çæ ãã¥ãŒã¿ãã«æäœ ïŒletã®å代å
¥ãpush / sortãªã©ã®ç Žå£çæäœ åç
§äžå®å® ïŒæ¯åæ°èŠçæã®ãªããžã§ã¯ãã颿°ãåã«æž¡ã éæ±ºå®çãªäŸå ïŒã¢ãžã¥ãŒã«ã¹ã³ãŒãã®å¯å€å€æ°ãrenderããè§Šã ããã«ã€ããŠã¯ã以äžã®ãããªåå®çŸ©ã§å¯ŸçãããŠããŸããã type Props = { items: ReadonlyArray<Item>; user: Readonly<User>; }; function List({ items }: Props) { items.push(...) // ã³ã³ãã€ã«ãšã©ãŒ const next = [...items, x]; // OK } Reactã§ã¯Propsã«å¯ŸããŠãã¥ãŒã¿ãã«æäœãããŠã¯ãããªãã®ã§ããããããReadonlyArrayãReadonlyã䜿ã£ãŠå¯ŸçããŠããŸãããåã§å®çŸ©ããããããæžããªãããã«ãããšããã®ã¯ãTypeScriptã®è¯ããæå€§é掻ãããèšèšã ãªãšæããŸãããåå®çŸ©ã§ããã°éšåçã«ãå°å
¥ãããããã§ãã®ã§ãçŸåšæ
åœããŠãããããžã§ã¯ãã«ãé©çšããŠã¿ããããšèããŠããŸãããŸããçºå±åœ¢ãšããŠãBranded Typeã䜿ã£ãå¯äœçšã®ãªã颿°ããåãä»ããªãææ³ã玹ä»ãããŠããŸãããBranded Typeã«ã€ããŠã¯å®åã§äœ¿ã£ãçµéšããªãåããŠç¥ã£ãææ³ã ã£ãã®ã§ãããå°ã調ã¹ãŠã¿ãããšæããŸããä»ã«ãåå®çŸ©ã ãã§ãªããBiomeãOxcãªã©ã®Linterã«ãŒã«ã§é²æ¢ãããšããå€å±€çãªã¢ãããŒããåãããŠããŸãããåå®çŸ©ã ãã§ã¯é²ããªãæäœãLinterã§é²ããšããææ³ã§ãåå®çŸ©ãšLinterã§ããå
ç¢ãªReactã¢ããªã±ãŒã·ã§ã³ãäœãããšå®æã§ããã»ãã·ã§ã³ã§éåžžã«ããããã®åŠã³ãåŸãããŸããã äœè€ å°è±¡ã«æ®ã£ãŠããã»ãã·ã§ã³ã¯ tscããtsgoãž ââ Denoã®TypeScriptåºç€ã¯ã©ãå€ãã£ããïŒmaguroïŒ æ¥åã«æ®ãããããããªãåãã§èãããTypeScriptã®é£ãããïŒSajiïŒ ã®2ã€ã§ãã åè
ã¯ãåãã§ãã¯ïŒ deno check ïŒãã¯ãããã³ãŒãã®è§£éãå®è¡ãæ¯ããä»çµã¿ãã©ãå€ãã£ãŠãããããã©ãå
容ã§ããããã®äžå¿ã«ããã®ããJavaScriptã§æžãããå
¬åŒã®TypeScriptã³ã³ãã€ã© tsc ãšããããGoã§åå®è£
ãã tsgo ã§ããã¿ã€ãã«ã®ãtscããtsgoãžãã瀺ãéããDenoãæš¡çŽ¢ããŠããæ©ã¿ã玹ä»ãããŸããã jsr: ã npm: ãDenoç¬èªAPIãšãã£ãæŠå¿µãTypeScriptãèªãã圢ã«ã翻蚳ãããä»çµã¿ãã tsc ãæ±ã蟌ãç¶æ
ãã tsgo ããããŠå
¬åŒTypeScriptãžãšã次ã®3段éã§å€åŽãžç§»ã£ãŠããããã§ãã Phase 1ïŒembedded tsc â ããããåœãŠãtscãV8 isolateå
ã§å®è¡ãæåã¯å®å®ããäžæ¹ã巚倧ãã³ãã«ãäžæµãžã®è¿œéã³ã¹ãã課é¡ã Phase 2ïŒforked tsgo â Go補ã®tsgoããµãããã»ã¹ã§èµ·åã deno check ãé«éåïŒç°¡æãã³ãã§çŽ2.6åïŒããã ãforkç¶æãLSP察å¿ã®ã³ã¹ããéãã Phase 3ïŒå
¬åŒnpmããã±ãŒãžãž â forkãæšãŠãDenoç¬èªã®äŸåãããŒã«ã«ã«materializeããŠå
¬åŒTypeScriptãèªããåœ¢ã«æ©æž¡ãããæ¹åãžã ç§èªèº«Denoã䜿ã£ãããšã¯ãªãã®ã§ããã deno ã®è£åŽã§ããã»ã©å€§ããªå€é·ãèµ·ããŠãããšã¯ç¥ãããããŒã«ã®å
éšä»æ§ã詳ããç¥ãããšãã§ããŠã話ãèããŠããŠãšãŠãé¢çœãã£ãã§ãããforkãåå®è£
ãé¿ããããå¶çŽã®äžã§ãæ®æ®µã¯æèããªãå
éšã®ä»çµã¿ãŸã§èžã¿èŸŒãã§ç¥ãããšã§ãå
éšã¢ãŒããã¯ãã£ã«å¯Ÿããçè§£ãäžæ®µãšæ·±ãŸã£ããšæããŠããŸãã åŸè
ã¯ãSajiãããå®éã®æ¥åã³ãŒãã«æ®ã£ããè¯ããªãåãïŒ as ã @ts-ignore ãªã©ïŒãåéã»åé¡ããããããTypeScriptã®é£ãããéçãããŒã ã§ã®åãåãæ¹ãèãããšããå
容ã§ãããæ®æ®µã¯çްããåãŸã§æèããã«æžããŠããŸãããšãå€ããããåãšã®åãåãæ¹ãæ¹ããŠèŠçŽãè¯ãæ©äŒã«ãªããŸãããAIé§åéçºã«ãèŠçŽãšããŠæŽ»çšã§ãããã§ãã ã€ãã³ãã«åå ããŠã¿ãŠ å¡åŽ TypeScriptã®é«åºŠãªåå®çŸ©ã«ã€ããŠåŠã³ãåŸãããã®ã¯å€§ããªåç©«ã§ããã ä»ã«ãTanStack StartãOxlintã®ãããªææ°ã®ãã¬ãŒã ã¯ãŒã¯ã»ããŒã«ã«é¢ããã»ãã·ã§ã³ãããã€ããããæè¡éžå®ãããŒã«ãã§ãŒã³ã®èŠçŽãã®éã®åèã«ããªã£ãããªãšæããŸãã AIåšãã«ã€ããŠãç¥èŠãæ·±ããããŸãããç¹ã«AI掻çšãåœããåã«ãªã£ãçŸåšã§ããã«ããŠå質ãæ
ä¿ããããšããèŠç¹ã§ã®åŠã³ã¯å€§ããªãã®ã§ããã ä»åã®ã€ãã³ãã«åå ããŠã¿ãŠãå匷ã®ã¢ãããŒã·ã§ã³ãåäžããã®ã§ä»åŸãTypeScriptã«ã€ããŠå匷ããŠããããšæããŸãã äœè€ ç»å£è
ãåå è
ã®æ¹ã
ã®ç¥èã®æ·±ãã«è§Šããèªåã®TypeScriptçè§£ã®æµ
ããçæããŸããã ã»ãã·ã§ã³ä»¥å€ã§ããå瀟ãã¹ãã³ãµãŒãã§ããŒã¹ãäŒç»ã«è¶£åãåãããŠãããå€ãã®åŠã³ããããŸãããç¹ã«ãåŠçæ¯æŽå¶åºŠã®ããã€ãã³ãã¯åå è
å±€ãåºããäŒå Žå
šäœã掻æ°ã«ããµããŠããŸãããåå ããŠè¯ãã£ããªãšæããŸãã é«ãŸã£ãã¢ãããŒã·ã§ã³ããã®ãŸãŸã«ãåž°å®
åŸã¯ãã£ããèªåã®ããŒããã©ãªãªãµã€ãã®æ¹ä¿®ã«åãããããŸãããåŒãç¶ãTypeScriptã«ã€ããŠå匷ããŠããããšæããŸãã ãããã« äŸå¹Žéãã§ããã°ãYouTubeã«ã¢ãŒã«ã€ãåç»ãæ²èŒããããšæããŸãããŸããç»å£ãããæ¹ã
ãçºè¡šã¹ã©ã€ããå
¬éããŠããã®ã§ãèå³ãæã£ãæ¹ã¯ãã²èŠããŠã¿ãŠãã ããã æ¥å¹Žã¯ç€Ÿå
ã®ã¡ã³ããŒãæ°äººèªã£ãŠãäžç·ã«åå ã§ããã°ãšæããŸãïŒ æ¬èšäºãæ¥å¹Žä»¥éã«TSKaigiãžã®åå ãèããŠããæ¹ã®åèã«ãªãã°å¹žãã§ãã åèèšäº https://2026.tskaigi.org/
ããã«ã¡ã¯ãã¡ã«ãã€ã®ããã³ããšã³ããšã³ãžãã¢ã® @mattsuu ã§ãããã®èšäºã¯ã Merpay & Mercoin Tech Openness Month 2026 ãã® 2 æ¥ç®ã§ãã ç§ãã¡ã®ããŒã ã¯ãããŒã±ã¿ãŒã PM åãã®ç€Ÿå
ããŒã«çŸ€ Engagement Platform (EGP) ãéçºããŠããŸããã©ã³ãã£ã³ã°ããŒãž (LP) ã®äœæã»å
¬éããã®äžæ©èœã§ãéå»ã« WYSIWYG ã³ã³ããŒãã³ããšãã£ã¿ EGP Pages ã«ã€ããŠåãããŒã ãã玹ä»èšäºãåºããŠããŸãã ä»åã¯ãã®åŸç¶ãšããŠãŒãããäœãçŽãã EGP Code ã玹ä»ããŸããAI ãšãŒãžã§ã³ããšå¯Ÿè©±ããªãã LP ãäœãããã®ãHTML ããŒã¹ã®ç€Ÿå
åã LP ãšãã£ã¿ã§ããèŠãç®ãçæããã ãã§ãªããæ¬çªéçšã«å¿
èŠãªãšãããŸã§èžã¿èŸŒãã§åãç·šéäœéšã®äžã«çµã¿èŸŒãã§ããã®ãç¹åŸŽã§ããã§ã« 10 件以äžã®æ¬çª LP ããã®ä»çµã¿ã§äœãããŠããŸãã v0ãGemini CanvasãClaude DesignãFigma Make ãªã©ãAI ã§ UI ãäœããããŒã«ã¯ãã§ã«æ°å€ããããŸãããèŠãç®ã¯äœããŠãæ¬çª LP ãšããŠéçšããã«ã¯ãAPI 飿ºã»å質ä¿èšŒã»Native 飿ºãšãã£ã瀟å
åºæã®èª²é¡ãæ®ããŸããEGP Code ã¯ããã®ã®ã£ãããåããããã«å
補ããŸããã EGP Pages ãš AI ç·šéã«ãããèª²é¡ EGP Pages ã¯ããããã¯ãéžãã§çµã¿åãããããŒã³ãŒãã® WYSIWYG ã³ã³ããŒãã³ããšãã£ã¿ã§ãããã©ãã°&ããããã§ Layout ã Text ãšãã£ã 40 çš®é¡ä»¥äžã®ã³ã³ããŒãã³ããããããŒãžãçµã¿ç«ãŠãŸããããŒã±ã¿ãŒããšã³ãžãã¢ã®æãåããã« LP ãäœãããšããç®çã«å¯ŸããŠéåžžã«ããæ©èœããŠãããããŸãå€ãã® LP ã EGP Pages ã§äœãããŠããŸãã 転æ©ã«ãªã£ãã®ã¯ãAI ã§ããŒãžãç·šéããããšããããŒãºãåºãŠããããšã§ããEGP Pages ã¯äººããã©ãã°&ããããã§çµã¿ç«ãŠãåæã§èšèšãããŠãããAI ãæ±ãéã«ããŒã¿æ§é ãåé¡ã«ãªããŸããäŸãã°ããã¿ã³ãæŒããšæ°åãå¢ããããŒãžã® JSON ããªãŒã¯æ¬¡ã®ããã«ãªããŸãã { "components": [{ "id": "root", "elements": [ { "id": "1", "tagName": "Context", "props": { "value": [ { "name": "count", "type": "code", "value": "0" }, { "name": "increment", "type": "code", "value": "(count) => count + 1" } ]}}, { "id": "2", "tagName": "Layout", "props": { "children": [":=element.3", ":=element.4"] }}, { "id": "3", "tagName": "Text", "props": { "value": "Count: ${context.count}" }}, { "id": "4", "tagName": "Action", "props": { "label": "+1", "onTriggerAction": [{ "type": "SET_CONTEXT", "payload": { "count": "${context.increment(context.count)}" }}]}} ] }] } 人ããšãã£ã¿è¶ãã«è§Šãåã«ã¯ããã®æ§é ã§ãåé¡ãããŸããããLLM ã«çŽæ¥ç·šéãä»»ããããšãããšèª²é¡ãèŠããŠããŸãã ããªãŒæ§é ãç¬èª : ":=element.3" ã®ãããªç¬èªèšæ³ã AI ã«éœåºŠæããå¿
èŠããããããã³ãããé·ããªããŸãã ããžãã¯ã忣 : ç¶æ
ã»æ¡ä»¶ã»åäœã»è¡šç€ºã Context / When / Action / Text ã«æ£ãã°ããæåã®ææ¡ã«ããªãŒå
šäœã蟿ãå¿
èŠããããŸãã JSON æååã®äžã« JavaScript ãåãŸã£ãŠãã : ãã³ãã¬ãŒããªãã©ã«ã eval ãããåŒããæç»ã³ã³ããŒãã³ã次第ã§ãæ£ããè§£éãé£ãããªããŸãã ããã«ãã® JSON ããªãŒã¯ç䟡㪠HTML ã®ããã 2 åã®ããŒã¯ã³ãæ¶è²»ããç·šéã®ãã³ã« API ã³ã¹ããšã³ã³ããã¹ãæ¶è²»ãèšãã¿ãŸããå ããŠãã¹ãåºç€ããªããAI ã®ç·šéçµæãå
¬éåã«æ©æ¢°çã«æ€èšŒããææ®µããããŸããã§ããããã㯠EGP Pages ã®èšèšãæªãã£ãããã§ã¯ãªããããŒã³ãŒãæä»£ã«æé©åãããæ£ããèšèšã§ããããã AI ã«ç·šéããããšããåæãå ãã£ãããšã§èšèšãåãçŽãå¿
èŠãåºãŠããã®ã§ãã HTML ããŒã¹ã§äœãçŽã éžæè¢ã¯2ã€ãããŸãããæ¢åã® JSON 衚çŸã AI åãã«æ¹åããããAI åæã§ãŒãããäœãçŽããã§ããç§ãã¡ã¯åŸè
ãéžã³ãããŒãžã®è¡šçŸã HTML ããŒã¹ã«ããŸãããHTML ã¯äººã«ã LLM ã«ã銎æã¿ããããç¬èªã® JSON ããªãŒãåç
§èšæ³ãæ¯åããã³ããã§æããå¿
èŠããªãããã§ãã å
ã»ã©ã®ã«ãŠã³ã¿ãŒããŒãžã¯ãEGP Code ã§ã¯æ¬¡ã«ããã«ãªããŸãã <body> <egp-script timing="page-loaded"> rx.count = 0; </egp-script> <egp-script> rx.increment = () => { rx.count = (rx.count ?? 0) + 1; }; </egp-script> <p><egp-text>Count: {{rx.count}}</egp-text></p> <egp-button :onclick="rx.increment">+1</egp-button> </body> æ©èœã¯åãã§ãããã³ãŒãéãããŒã¯ã³æ¶è²»ãããããååã§ãããã ããçŽ ã® HTML ã ãã§ã¯ãç¶æ
管çãæ¡ä»¶åå²ãšãã£ãåçãªæ¯ãèãã¯è¡šçŸã§ããŸãããããšãã£ãŠ <script> ã§èªç±ã« JavaScript ãæžããããšãããŒãžã®æåã远ãã¥ãããªããŸãã ããã§ãç¶æ
管çã»æ¡ä»¶åå²ã»ç¹°ãè¿ããšãã£ãåçãªéšåã ãããå°æ°ã® Web Components ( <egp-*> ) ã«éã蟌ããŸããããéçãªéšåã¯æ®éã® HTMLãåçãªéšåã ã Web Componentsããšããåãåãã«ãã£ãŠãEGP Pages ã®ããã«ç¶æ
ã»æ¡ä»¶ã»åäœãæ£ãã°ããªãæ§é ã«ãªã£ãŠããŸãã èŠãç®ã®ã¹ã¿ã€ãªã³ã°ã«ã¯ Tailwind CSS ãæ¡çšããŠããŸããWeb éçºè
ã«éŠŽæã¿ã®ããæžãæ¹ã«å¯ããããšã§ã人ã AI ãç¬èªã®äœæ³ãèŠããã«æžã¿ãŸãããŸãã坿¬¡çãªå¹æãšããŠãå€éšã©ã€ãã©ãªãžã®äŸåãæå°éã«ãªããLP ããšã«ç¬èªããã±ãŒãžãæ··ãããŸãããã©ã³ã¿ã€ã ã¯äžå€®ã§ç®¡çããå°æ°ã®ãã®ã ãã§åããããnpm ããã±ãŒãžèµ·å ã®ãµãã©ã€ãã§ãŒã³ãªã¹ã¯ãåé¡ã«ãªãäžã§ãå®å
šé¢ã§å©ç¹ããããŸãã äœ¿ãæ¹ EGP Code ã§ã¯ãã»ãšãã©ã®æäœã AI ãšãŒãžã§ã³ããšã®ãã£ããã§é²ããŸãããLP ãäœããããã®ããã«èŠä»¶ãåºãŸã£ãŠããªãäŸé Œã§ã¯ããšãŒãžã§ã³ãã¯ãããªãäœãå§ããã®ã§ã¯ãªããæèã«å¿ãã質åãè¿ããŠãããŸãã察象ããã€ã¹ãã«ã©ãŒããŒããå
¥ãããã»ã¯ã·ã§ã³ãšãã£ãé
ç®ãéžæè¢ããçããŠãããŸãã åçãéããšããšãŒãžã§ã³ãã HTML ããã¹ãããŸãšããŠçæãããããå°ãšãªã LP ãã§ãããããŸãã 倧ãŸããªèŠãç®ãã§ãããããã¿ã³ãããã¹ããªã©ã®èŠçŽ ãçŽæ¥éžãã§ä»äžããŸãã察象ãã¯ãªãã¯ããŠãæåãµã€ãºã倧ããããŠããæèšããã«å€ããŠãã®ããã«é Œãã°ãäœçœ®ã説æããªããŠããšãŒãžã§ã³ããçŽãç®æãæ£ç¢ºã«ææ¡ããŸããè€æ°ç®æã«ãŸãšããŠã³ã¡ã³ããä»ããããåèã«ãããç»åã貌ã£ãŠæž¡ãããšãå¯èœã§ãã å®éçšã«å¿
èŠãª 3 ã€ã®ä»çµã¿ LP ãšèããšãæç« ãšç»åã䞊ãã éçãªããŒãžãæãæµ®ãã¹ããããããŸããããå®éã«ã¯ããšã³ããªãŒç¶æ³ã§ CTA ãã¿ã³ãåãæ¿ããããã客ããŸã®å±æ§ã§èŠãæ¹ãå€ãã£ãããšåãã䌎ã LP ãå°ãªããããŸããã ãã®ãããèŠãç®ã ããæŽã£ãŠããã°ååãšããããã§ã¯ãªãã瀟å
API ãšã®é£æºãã¿ããæã®åæãã°éåºãå
¬éåã«è¡šç€ºãæåãæ€èšŒããä»çµã¿ãã¢ããªãš Web ã®é·ç§»å·®ãåžåããä»çµã¿ãªã©ãåšèŸºã®ä»çµã¿ãããããŠå¿
èŠã«ãªããŸãã EGP Code ã§ã¯ãããããä»çµã¿ãç·šéäœéšã®äžã«çµã¿èŸŒãã§ããŸãã以éã§ã¯ããã® 3 ã€ã®ä»çµã¿ãé ã«ç޹ä»ããŸãã 瀟å
API 飿ºãš Logging LP ããã¯ãååäžèЧã®ååŸããšã³ããªãŒç¶æ³ã®ç¢ºèªãšãã£ã瀟å
API ãžã®åŒã³åºããé »ç¹ã«çºçããŸãããããã瀟å
API 㯠AI ããŒã«ã®åŠç¿ããŒã¿ã«å«ãŸããŠããŸãããEGP Code ã§ã¯ããã®ã®ã£ããããäœ¿ãæ¹ããã®å Žã§ AI ã«æãããä»çµã¿ã§åããŠããŸãã äŸãã°ãååäžèЧãåºã API ã¯ïŒããšèããšããšãŒãžã§ã³ãã¯åè£ã®ç€Ÿå
API ãçšéã€ãã§æããŠãããŸãã ãã®ããåãã®è£åŽã§ã¯ããšãŒãžã§ã³ãããé¢é£ãã API ãæ¢ã â äœ¿ãæ¹ãçè§£ãã â åä»ãã§å®è£
ããããšããæµãã§åããŠããŸãã ãã®æµããå®çŸããããã«ãããã€ãã®å·¥å€«ãããŠããŸãããŸãã瀟å
API ã®äœ¿ãæ¹ããAPI ããšã« Markdown ãã¡ã€ã«ã«èšèŒããŠããŸããå®éã«ã¯ã次ã®ãããªãã¡ã€ã«ã䞊ãã§ããŸãã api-searchExampleItems.md api-postExampleEntry.md api-getExampleSegment.md api-getExampleRecommendations.md runtime-event-log.md ... ãã¹ãŠã® API ã®èª¬æãããã³ããã«ä¹ããŠããŸããšäžèŠã«ããŒã¯ã³ãæ¶è²»ããŠããŸããŸããããã§åããã¥ã¡ã³ãã®ã¿ã€ãã«ãšçšéã ããæž¡ããŠãããAI ãå¿
èŠãšå€æãããšãã«ã ããã®æ¬æãèªã¿èŸŒãŸãã圢ã«ããŠããŸãã æ¬¡ã«ã瀟å
API ã¯åä»ãã®èãã©ãããŒé¢æ°è¶ãã«åŒã³åºããŸããLP ããèŠããã®ã¯é¢æ°åŒã³åºãã ãã§ãèªèšŒãããã»ãµãŒãã¹åå²ã»ãã¹ã®éãã¯ã©ãããŒãåžåããŸãã誀ã£ãäœ¿ãæ¹ãããã° Lint ãæ€ç¥ããŸãã åæãã°ã®éåºãåãããã¥ã¡ã³ãåç
§ã®ããã¿ã§æ±ã£ãŠããŸãã ãã°ãå¿
èŠã«ãªã£ãã¿ã€ãã³ã°ã§ããšãŒãžã§ã³ãã察å¿ããããã¥ã¡ã³ããèªã¿èŸŒã¿ãAPI åŒã³åºããšåãæµãã§ãã°çšã®ã³ãŒããçæããŸãããã®ããã¿ã«ãã£ãŠãAI ã«ãååäžèЧãåºããŠããšé Œãã ãã§ã瀟å
API ãæ£ããåŒãã åç㪠LP ãçµã¿äžãããŸãã ãšãã£ã¿å
ã§å®çµãããã¹ããšå質ä¿èšŒ AI ãçæãã API åŒã³åºããæ£ããåããŠãããããã¿ã³ãæåŸ
ã©ããã«åå¿ããããã倿Žã®ãã³ã«äººãç®èŠã§ç¢ºèªããã®ã¯çŸå®çã§ã¯ãããŸãããããã§ EGP Code ã¯ããšãã£ã¿å
ã«ãã¹ãã®ä»çµã¿ãå
èµããŠããŸãã ãšã³ãžãã¢ä»¥å€ã«ãšã£ãŠãã¹ãã¯éŠŽæã¿ããªããèªåã§äœæããã®ã¯ããŒãã«ã®é«ãäœæ¥ã§ããããã§ããã¹ããçŽæ¥æžã代ããã«ãå®çŸãããæ¯ãèããèªç¶ãªèšèã§æžãã Spec ã¿ããçšæããŠããŸããããã«ãLP ã®ä»æ§ãæžãæ®ããŠãããŸãã ããšã¯ AI ãšã®ãã£ããã§ã@SPEC.md ãå
ã«ãã¹ããæžããŠããšé Œããšãæèã«å¿ããŠãã¹ããèªåã§çæãããŸãããã¹ãã¯ãšãã£ã¿åãã«èªäœãã Jest 颚㮠API ã§æžããŠãããå
èµã®ã¢ãã¯ãµãŒãã§ fetch ãå·®ãæ¿ããããã®ã§ãæ¬çª API ããªããŠãåçããŒãžã®æåããšãã£ã¿å
ã§åçŸã§ããŸãã // ãã©ãŠã¶äžã§ãã®ãŸãŸå®è¡ããã test('ãšã³ããªãŒãã¿ã³ã§ API ãåŒã°ãã', async () => { render(html); await userEvent.click(screen.getByText('ãšã³ããªãŒ')); expect(mockEntry).toHaveBeenCalledWith({ campaign: 'X' }); }); ãã¹ãã倱æãããšããã®çµæã¯ AI ã«ãã£ãŒãããã¯ãããAI ãèªå·±ä¿®æ£ããŸãã 仿§ãæžã â AI ãå®è£
ãšãã¹ããçæãã â ãã©ãŠã¶ã§æåã確ããã ãšããæµãããšãã£ã¿å
ã§å®çµãããããéç㪠LP ãã API ã䜿ã£ãåç㪠LP ãŸã§ãåãä»çµã¿ã§å質ãæ
ä¿ããªããäœãããšãå¯èœã§ãã ã¢ããªãš Web ã®å·®ãåžåãã Native 飿º ãã£ã³ããŒã³ããŒãžãªã©ã® LP ã¯ãWeb ãã©ãŠã¶ã ãã§ãªããã¡ã«ã«ãªã¢ããªå
ã® WebView ã§ãéãããŸãããã®ãšãéåžžã®ãªã³ã¯ã®ãŸãŸã ãšãã¢ããªå
ã§ã¯å€éšãã©ãŠã¶ãéããŠããŸããã¢ããªã®ãã€ãã£ãç»é¢ãžé·ç§»ã§ããŸãããããã LP ããšã« userAgent å€å®ã Native bridge ã®åŒã³åºãã§æžãã®ã¯çŸå®çã§ã¯ãããŸãããããã§ããã®å·®ããã©ãããã©ãŒã åŽã§åžåããLP ãäœãåŽã¯å°çšã® Web Components ã䜿ãã ãã§æžãããã«ããŸããã <egp-link href="https://jp.mercari.com/search?keyword=camera"> ã«ã¡ã©ãæ¢ã </egp-link> ãã®ãªã³ã¯ãã¯ãªãã¯ãããšç°å¢ãèªåã§å€å®ããŠãã¢ããªå
ãªã Native bridge çµç±ã§ãã€ãã£ãç»é¢ãžãWeb ãªãéåžžã®ãªã³ã¯ãšããŠéããŸãã ãŸãšã ããŸããŸãª AI ããŒã«ã«ãã£ãŠ UI ãäœãããããªã£ãŠããŸãããå®éçšã® LP ã«ä¹ããã«ã¯ãAPI 飿ºã»å質ä¿èšŒã»Native 飿ºãšãã£ãäœã蟌ã¿ãå¿
èŠã«ãªããŸããEGP Code ã¯ãããããã©ãããã©ãŒã åŽã«çµã¿èŸŒãããšã§ãUI ã¥ããããéçšãŸã§ãåãç·šéäœéšã®äžã§ã€ãªããããšããŠããŸãã å®éã«æ¬¡ã®ãããªæ°ããé²ãæ¹ãåºãŠããŠããŸãã PM ãšããã³ããšã³ããšã³ãžãã¢ã ãã§ã仿§çå®ããå®è£
ã»ãªãªãŒã¹ãŸã§ãå®é ããã¯ãšã³ããšã³ãžãã¢ã API ãã LP ãŸã§ 1 äººã§æ§ç¯ ããŒã±ã¿ãŒãéç㪠LP ã 1 人ã§å¶äœ ãã¹ãã API 飿ºãå«ãåç㪠LP ã¯ããŸã éãšã³ãžãã¢ã ãã§å®çµãããã«ã¯é£ããéšåãæ®ã£ãŠããŸããããã§ãã誰ãã©ããŸã§æ
ãããã®å¢çã¯å°ããã€åããŠããŠããããã¯ããããåç㪠LP ãéãšã³ãžãã¢ã ãã§äœããããã«ãªããšèããŠããŸãã æ¬¡ã®èšäºã¯ @sinmetalããã®ãMySQLããSpannerã«ç§»è¡ããæã®Queryãã¥ãŒãã³ã°ãã§ããåŒãç¶ããæ¥œãã¿ãã ããã
ããã«ã¡ã¯ãFindy FreelanceéçºããŒã ã®ä¹
æšç°ã§ãã ä»åã¯ã瀟å
ã§éçšããŠããæ¯ææçްæžPDFã®çæåºç€ããLambda + Puppeteerãã @react-pdf/renderer ãžå
šé¢çã«ç§»è¡ããè©±ãæžããŸããæçµçã«åŠçæéã¯P50ïŒäžå€®å€ïŒã§çŽ27åéããªããã¡ã¢ãªæ¶è²»ã宿ž¬ã§çŽ1/4ãŸã§èœãšããŸããã ãããŸã§ã®PDFçæåºç€ãšèª²é¡ 察ççæ³ã§ãã®ãã æé æ ¹æ¬å¯Ÿå¿ã決ãã3ã€ã®èæ¯ æè¡éžå®: æ»ããé ã«è©Šã ç§»è¡ã§æŒãããŠããããå®è£
ãã€ã³ã èšèšãšå®è£
ã®ã㢠ãã³ãã¬ãŒãæ§é esbuildã§æ©æž¡ã ã©ãå€ãã£ãã åŠã³ ãããŸã§ã®PDFçæåºç€ãšèª²é¡ çŸåšãã·ã¹ãã ããçºè¡ããŠããPDFã¯ããã€ããããŸãããæ¬èšäºã§ã¯äžäŸãšããŠæ¯ææçްæžPDFã«çµã£ãŠç޹ä»ããŸãããã¡ã€ã³ãã£ããããªãŒã©ã³ã¹ãšã³ãžãã¢ãžã®æ¯ææçްãšããŠææ¬¡ã§äžæ¬çºè¡ããŠããPDFã§ãã æ¯ææçްæžPDFã¯1ä»¶ããã1ããŒãžã§ãæ¯æå
ãæ¯æè
ãæçŽ°è¡šãç¹èšäºé
ããã¡ã€ã³ãã£ã®ç€Ÿå°ãé
眮ããæ§æã§ããæ
å ±éãšããŠã¯å°èŠæš¡ã§ãããææ¬¡ã§ããªãŒã©ã³ã¹ãšã³ãžãã¢å
šå¡åãäžæ¬çºè¡ããå¿
èŠãããã1åã®ãããã§æ°çŸä»¶èŠæš¡ã®PDFã䞊åçæããŠããŸãããRailsåŽããParallelã©ã€ãã©ãªã§äžŠåã«LambdaãåŒã³åºãæ§æã§ãã ãã®PDFã¯ãAWS Lambdaäžã§Puppeteerãèµ·åããEJSãã³ãã¬ãŒãããçµã¿äžããHTMLããããã¬ã¹ã®Chromiumã§ã¬ã³ããªã³ã°ããŠPDFåããæ§æã§åããŠããŸãããããã³ããšã³ãåãã®HTML/CSSããã®ãŸãŸæµçšã§ããããåæå®è£
ã¯éãã£ãã®ã§ãããéçšãé²ãã«ã€ã次ã®èª²é¡ãé¡åšåããŸããã ã³ãŒã«ãã¹ã¿ãŒããéããChromiumãã€ããªã®èµ·åã ãã§5ç§ååŸãæ¶è²»ããŠãã 倧éçæã§ /tmp ãæ¯æžããäžæ¬åŠçã§è€æ°ã®ã¬ã³ããªã³ã°ã䞊走ããããšããšãã§ã¡ã©ã«ã¹ãã¬ãŒãžãå
ã«å°œããŠãšã©ãŒçµäºãã ã¿ã€ã ã¢ãŠãããšã©ãŒãæåžžåããæ°çŸä»¶èŠæš¡ã®äžæ¬åºåã¯éäžã§åæ¢ããŠåå®è¡ãå¿
èŠã«ãªã ããã«ããã¯ã¯Chromiumã®äžå®å®ãã§ãããChromiumèµ·åã®ãã³ã«ãããã¡ã€ã«ã»ãã£ãã·ã¥ã»ãœã±ãããã¡ã€ã«ã /tmp é
äžã«çæããã browser.close() åŸããã£ã¹ã¯äžã«æ®åããŸããããã«ãã¬ã³ããªã³ã°äžã«Chromiumããã³ã°ããå Žåã¯ãäžæãã¡ã€ã«ãä¿æãããŸãŸããã»ã¹ã忢ããŸãããã®éã«ãæ°èŠãªã¯ãšã¹ãã§Lambdaãèµ·åããããããŠã©ãŒã ã¹ã¿ãŒãã§äœ¿ãåãããã€ã³ã¹ã¿ã³ã¹ã§ã¯ /tmp ã®æ®åãã¡ã€ã«ãèç©ããäžå®éãè¶
ããæç¹ã§å
šäœã忢ããŠããŸãæåã«ãªã£ãŠããŸããã ãã®èç©ã«åããŠãã¡ã¢ãªãš /tmp ã¯åžžã«ãããã¡ãå«ããŠå€ãã«å²ãåœãŠãå¿
èŠãããã1Lambdaããã2-3GBçžåœã®ç¢ºä¿ãç¶ç¶ããŠããŸãããããã§ããã³ã°ãšäžŠå床ã®ããŒã¯ãéãªãå±é¢ã§ã¯è©°ãŸããããèšå®å€ãåŒãäžããŠã¯å¥ã®éŸå€ã§è©°ãŸããšããç¶æ
ãç¶ããŠããŸããã äžæ¬åºåã¯ä»åŸæ°åã«å¢å ããèŠèŸŒã¿ã§ãããçŸç¶ã®æ§æã®ãŸãŸç¶ç¶ããããšã¯çŸå®çã§ã¯ãããŸããã§ããã 察ççæ³ã§ãã®ãã æé 課é¡ãèžãŸããåŸã
ã«å¯Ÿçãæœãããšã«ããŸãããLambdaã®ã¡ã¢ãªå²ãåœãŠå¢ãã¿ã€ã ã¢ãŠãå»¶é·ããšãã§ã¡ã©ã«ã¹ãã¬ãŒãžã®æ¡åŒµã䞊å床ã®èª¿æŽãªã©ãèšå®å€ã§åžåã§ããããªå¯Ÿçã¯äžéãããŸãããçæçãªæ¹åã«ã¯ãªã£ããã®ã®ãæ ¹æ¬ã«ããã®ã¯ChromiumããµãŒããŒã¬ã¹ç°å¢ã§åããããšèªäœã®ã³ã¹ããšæç»ã³ã¹ããå
¥åèŠæš¡ã«æ¯äŸããŠäŒžã³ãæ§é ã§ããèšå®ã®ç©ã¿å¢ãã§ã¯ã¬ã€ãã³ã·ãŒããšã©ãŒçãæãããã«æ¹åããŸããã§ããã æ ¹æ¬å¯Ÿå¿ã決ãã3ã€ã®èæ¯ æ ¹æ¬å¯Ÿå¿ã«èžã¿åã倿ã¯ã次ã®3ç¹ãåæã«æã£ãæç¹ã§äžããŸããã çŸç¶ã®èª²é¡: ã¬ã€ãã³ã·ãŒãæªååŸåããšã©ãŒãæ¥æ¬¡ã§èŠ³æž¬ããã å°æ¥ã®æªåèŠèŸŒã¿: äžæ¬åŠçã®ä»¶æ°ã¯ä»åŸããã«å¢ããèšç»ãããã察ççæ³ã®äœå°ãããæ®ã£ãŠããªã 察ççæ³ã®éç: èšå®å€ã®èª¿æŽã§ã¯ã¬ã€ãã³ã·ãŒããšã©ãŒçã®æ¹åãé æã¡ã§ããããã®æã¡æã广ãèããŠãã 課é¡ã倧ãããªã£ãããã察çãæœããŸãããéã«èšãã°ãã©ãã1ã€ã§ãæ¬ ããŠããããããå°ã察ççæ³ãç¶ããŠãããšæããŸãã æè¡éžå®: æ»ããé ã«è©Šã æ ¹æ¬å¯Ÿå¿ã®æ¹éãšããŠã倧ãã2æ¡ãæ¯èŒããŸããã Aæ¡: Lambdaãç¶æãã @react-pdf/renderer ã§Programmaticã«PDFãçµã¿ç«ãŠã Bæ¡: LambdaããECSãªã©å¥ã®ã©ã³ã¿ã€ã ãžç§»è¡ãã Aæ¡ã¯ãããŸã®Lambdaæ§æãä¿ã£ããŸãŸPDFçææ¹åŒã ããå·®ãæ¿ããæ¡ã§ãã @react-pdf/renderer ã¯JSXãæžãæèŠã§PDFãçµã¿ç«ãŠãã©ã€ãã©ãªã§ãChromiumã®ãããã¬ã¹ãã©ãŠã¶ã¯å©çšããŸããã react-pdf.org ãããã @react-pdf/renderer ãåè£ã«æãã£ãã®ã¯ããããã¬ã¹ãã©ãŠã¶ä»¥å€ã§PDFãçæããæ¹æ³ã調ã¹ãŠããããã§ããç¶ç¶çãªå©çšæéãçºçããå€éšãµãŒãã¹ã䜿ãéžæè¢ã¯å€ããOSSã®ããã°ã©ããã£ãã¯çæã©ã€ãã©ãªã®äžã§ãReactãšåãJSXã§æžãã @react-pdf/renderer ãéžã³ãŸãããReactã¯ãã¡ã€ã³ãã£ã®ä»ãããã¯ãã§ãåºã䜿ãããŠããã銎æã¿ããã£ãç¹ã決ãæã«ãªããŸããã Bæ¡ã¯ã¡ã¢ãªãã¹ãã¬ãŒãžã®å¶çŽã«ã¯åŒ·ããªããŸãããã³ã¹ãæ§é ãå€ãããæ€èšŒã®ç«ã¡äžãã«ãå·¥æ°ãããããŸããLambdaã®ã¿ã€ã ã¢ãŠãã«åãŸããªãåŠçããChromiumã®è¡šçŸåïŒè€éãªCSSã»JavaScriptæç»ãªã©ïŒãã©ãããŠãæ®ãããã±ãŒã¹ã§ã¯Bæ¡ãåè£ã§ãããä»åã®PDFçæã¯ãã®ã©ã¡ãã«ãåœãŠã¯ãŸããŸããã§ããã ãã®ãããæçµçã«ã¯æ¬¡ã®3ã€ã®çç±ããAæ¡ãéžã³ãŸããã æ»ãã: Lambdaæ§æã®ãŸãŸPDFçææ¹åŒã ããå·®ãæ¿ããã®ã§ãåé¡ãåºãŠãPuppeteerçã«æ»ãããšã容æ ãã¹ãå¯èœ: PDFçæããžãã¯ãJSXã§æžãããããåäœãã¹ããåºåå·®åãã¹ããæžãããã AIã§ç§»è¡ã³ã¹ããçŸå®çã«ãªã£ã: EJSãã³ãã¬ãŒãããJSXãžã®å€æã¯ãçæAIã«ä»»ããããã¬ãã«ãŸã§æ¥ãŠãã Bæ¡ã¯Aæ¡ã倱æããå Žåã®ä»£æ¿æ¡ãšããŠæ®ãããŸãã¯æ»ããAæ¡ã詊ãããšã«ããŸããã ç§»è¡ã§æŒãããŠããããå®è£
ãã€ã³ã EJSããJSXãžã®æžãæãèªäœã¯çæAIã§äžæ°ã«é²ããããŸãããã @react-pdf/renderer ã®å®è£
ã¹ã¿ã€ã«ã«åãããããã«äºåã«æŒãããŠããããç¹ãããã€ããããŸããã @react-pdf/renderer v4ã¯ESM-onlyã§ãtscã®CommonJSåºåããã¯èªã¿èŸŒããªããããesbuildãå
¥ããŠESMãCJSã«ãã³ãã«ãã æ¥æ¬èªãã©ã³ã㯠Font.register() ã§æç€ºçã«ç»é²ããªããšæååããã Puppeteerã® scale: 0.8 çžåœãç¡ãããããã©ã³ããµã€ãºãäœçœãæã§åèšç®ãã HTMLã® <a> èªåå±éã¯åçŸããããURLéšåã ã <Link> åããå°ããªã³ã³ããŒãã³ããèªäœãã HTMLãšã¹ã±ãŒãã¯èªååãããŠããŠãæ§å®è£
ã®ãšã¹ã±ãŒãåŠçãäžèŠã«ãªã£ãïŒå¯ç£ç©ïŒ ç¹ã«å€§å€ã ã£ãã®ãJSXã®ç©ºæååã®æ±ãã§ãã {stringValue && (...)} ãšæžããšã空æååãchildãšããŠãã®ãŸãŸæµã蟌ã¿ã WARN Invalid '' string child outside <Text> component ã倧éã«åºãŸããReactã®ææ³ãšããŠã¯æ£ããã®ã§ããã @react-pdf/renderer ã® <View> / <Page> é
äžã§ã¯ {!!stringValue && (...)} ãšæç€ºçã«booleanåããæžãæ¹ã«æããå¿
èŠããããŸããããŸããŸãªããŒã¿ã§PDFãäœæããŠããéçšã§èŠåãã°ãåºãŠããããšã«æ°ä»ãã該åœç®æããŸãšããŠä¿®æ£ããŸããã èšèšãšå®è£
ã®ã㢠ããããã¯ã @react-pdf/renderer ãLambdaã«èŒããŠãããšãã«èããèšèšé¢ã®ãã€ã³ãã2ã€ã«åããŠãŸãšããŸãã ãã³ãã¬ãŒãæ§é PDFãã®ãã®ã1ã€ã®Reactã³ã³ããŒãã³ããšããŠçµã¿ç«ãŠãæ§æã«ããŸããããªã³ã¯ã®èªåå±éã®ããã«å
±éã§å¿
èŠãªèŠçŽ ã¯ãå°çšã®å°ããªã³ã³ããŒãã³ããšããŠåãåºããŠåå©çšããŠããŸãã EJSæä»£ã¯éšåãã³ãã¬ãŒããincludeã§çµã¿åãããäœãã§ããããJSXã«ç§»ã£ãŠããã¯ã³ã³ããŒãã³ãã®çµã¿åãããšããŠèªç¶ã«åæ§æã§ããŸããã esbuildã§æ©æž¡ã @react-pdf/renderer v4ã¯ESM-onlyã§ãããLambdaåŽã¯CommonJSã§åãããŠããŸããtscã®åºåã§ã¯çŽæ¥èªã¿èŸŒããªãã£ããããesbuildã§ESMâCJSã®ãã³ãã«ãäœã£ãŠLambdaã«ãããã€ããæ§æã«ããŸããã // esbuild.config.jsïŒæç²ïŒ { entryPoints: ['src/index.ts'], bundle: true, platform: 'node', format: 'cjs', } èšå®ãšããŠã¯ã·ã³ãã«ã§ããããããéããªããšäŸåé¢ä¿ã®è§£æ±ºã§ã€ãŸããããšã«ãªãããæ³šæãå¿
èŠã§ãã ã©ãå€ãã£ãã æ¯ææçްæžPDFã®äžæ¬äœæåŠçã«ã€ããŠãç§»è¡ååŸãCloudWatchã¡ããªã¯ã¹ã§æ¯èŒãã宿ž¬å€ã次ã®éãã§ãã衚ã®P50 / P95 / P99ã¯ãå®è¡æéãæé ã«äžŠã¹ããšãã®äžå€®å€ / 95ããŒã»ã³ã¿ã€ã« / 99ããŒã»ã³ã¿ã€ã«ã衚ããŸãã ææš Before After åç å®è¡æé P50 çŽ3,963 ms çŽ145 ms çŽ27åé«é å®è¡æé P95 çŽ4,707 ms çŽ212 ms çŽ22åé«é å®è¡æé P99 çŽ5,249 ms çŽ458 ms çŽ11åé«é å¹³åã¡ã¢ãª çŽ912 MB çŽ222 MB çŽ1/4 æå€§ã¡ã¢ãª çŽ1,589 MB çŽ239 MB çŽ1/7 ç¹ã«æ¹åå¹
ã倧ããã®ã¯P50ã§ããæ§æ§æã§ã¯å®è¡æéãã®ãã®ã®é
ãã«å ããPuppeteer/Chromiumç±æ¥ã®ãšã©ãŒïŒãã©ãŠã¶ã®æ¥ç¶åãããã³ã°ãªã©ïŒãèµ·ãããšãäžæ¬åŠçã®äžã§åå¥ã®PDFçæãLambdaã®ã¿ã€ã ã¢ãŠãã«å°éãããªãã©ã€ããŠãæåŸãŸã§å®æãããšã©ãŒãšããŠæ®ãã±ãŒã¹ããããŸããã衚ã®P99ã®å€§ããã«ãããçŸããŠããŸããç§»è¡åŸã¯ãããã®ãšã©ãŒããšãã§ã¡ã©ã«ã¹ãã¬ãŒãžã®éŒè¿«ãã³ãŒã«ãã¹ã¿ãŒãã«ããé
å»¶ãããããè§£æ¶ãããLambdaäžã§ã®å®è¡ãæèããå¿
èŠã®ãªãæ§æã«ãªã£ãŠããŸãã åŠã³ ä»åã®ç§»è¡ã§ç¹ã«æå¹ã ã£ãã®ã¯ãå€æè»žãšããŠçœ®ãããæ»ããé ã«è©Šããã§ããLambdaæ§æãç¶æãããŸãŸPDFçææ¹åŒã ããå·®ãæ¿ããAæ¡ã¯ãããè¡ãè©°ãŸã£ãŠãæ§çã®Lambdaã«åãæ»ãéžæè¢ãæ®ããŸãããã©ã³ã¿ã€ã ããšèŒãæ¿ããBæ¡ãæåã«éžãã§ããããæ€èšŒã®ããã«æ±ãããªã¹ã¯ã¯ã¯ããã«å€§ãããªã£ãŠããã¯ãã§ãã ããã²ãšã€ã¯ãçæAIã®æŽ»çšã§æè¡éžå®ã®åææ¡ä»¶ãå€ãã£ãããšã§ããAæ¡ã¯EJSãã³ãã¬ãŒãã®JSXãžã®å
šä»¶æžãæãã䌎ããŸããAIãªãã§å·¥æ°ãèŠç©ãããšãèŠæš¡ã ãã§Aæ¡ã¯æ¡çšåè£ããå€ããŠããŸãããæžãæãã ãã§ãªããæ§PDFãšæ°PDFã®ã¬ã€ã¢ãŠãå·®åã®ç¹å®ãšä¿®æ£æ¡ã®çæãŸã§AIã«ä»»ãããããããAæ¡ã®å·¥æ°ã¯åœåã®æ³å®ããäœãåãŸããŸããã æåŸã«ã @react-pdf/renderer ã䜿ã£ãææããŸãšããŸãã ã¡ãªãããšããŠå€§ããã£ãã®ã¯ãLambdaã®å²ãåœãŠã¡ã¢ãªã倧å¹
ã«æžãããããšãšããããã¬ã¹ãã©ãŠã¶ã䜿ã£ãŠãããããããã¹ããæ Œæ®µã«æžãããããªã£ãããšã§ããPDFããããã¡ã®ãŸãŸåãåã£ãŠäžèº«ãæ€èšŒã§ããã®ã§ããã©ãŠã¶ãèµ·åããªã軜éãªçµ±åãã¹ããCIäžã§ãçµããããã«ãªããŸããã äžæ¹ã§ãHTML/CSSã§ã¯ãªã <View> <Text> ãšãã£ãPDFå°çšã®ããªããã£ããFlexboxã§çµã¿ç«ãŠããReact Nativeå¯ãã®ã³ã³ããŒãã³ãã¢ãã«ã§ããHTML/CSSããçµéšãç¡ãå Žåã¯ãæåã¯æžãæ¹ã«æžæãå Žé¢ããããšæããŸãã ãã¡ã€ã³ãã£ã§ã¯äžç·ã«äŒç€ŸãçãäžããŠãããã¡ã³ããŒãåéäžã§ããèå³ãæã£ãŠããã ããæ¹ã¯ãã¡ãã®ããŒãžãããå¿åãé¡ãããŸãã herp.careers




















