
AWS Lambdaãšé£æºããŠãªã³ã¯å ãã·ã³ãã«ã«è¡šç€ºããFigmaãŠã£ãžã§ãããäœã£ã
ãã®èšäºã¯ãFigma éçº Advent Calendar 2022 ã®12æ¥ç®ã®èšäºã§ãã
å æ¥ãSimple BookmarkãšããFigmaã»FigJamãŠã£ãžã§ãããäœæããŸãããURLãå ¥åãããšããã¡ãã³ã³ãšã¿ã€ãã«ã衚瀺ããã·ã³ãã«ãªãŠã£ãžã§ãããFigmaãFigJamã®ãã£ã³ãã¹ã«é 眮ããããšãã§ããŸãã

å
¬éããïŒé±éã»ã©çµã¡ãŸãã1,000人以äžã®ã®æ¹ã«è©ŠããŠããã ããŸããã
å®éã«è²ããªäººã«äœ¿ã£ãŠãããã®ãå¬ããã§ãããäœããèªåãæ¥åžžçã«äœ¿ãéå
·ãèªåèªèº«ã§äœãã®ã¯æ¥œãããã®ã§ãã
ãããªã·ã³ãã«ãªãŠã£ãžã§ããã§ããå®éã«äœã£ãŠã¿ããšè²ã
ãªè©Šè¡é¯èª€ããããŸããã
ãã®ããããæžããŠã¿ãŸãã
ãªãã€ãã£ãã®ãïŒ
Figmaã§ãã¶ã€ã³ããéãã°ã©ãã£ãã¯ã ãã§ã¯è¡šçŸã§ããªã现ããªä»æ§ãæ€èšäºé ãé¢é£è³æã®ãªã³ã¯ãèŠããããŸãšããããã«ä»¥äžã®ãããªããã¯ããŒã¯ã³ã³ããŒãã³ãã䜿çšããŠããŸãã

ãã®ã³ã³ããŒãã³ãã§ã¯ãã¿ã€ãã«ãšãªã³ã¯URLãå
¥åããã³ã³ããŒãã³ãã®ããªã¢ã³ãæ©èœã«ããã¢ã€ã³ã³ãèšå®ããŠããŸãã
ãªã³ã¯å
ãèŠèŠçã«ãããããã瀺ãããšãã§ããŠäŸ¿å©ã§ããããã£ãšæ¥œã«å
¥åã§ãããšè¯ãããã§ããããã§Figmaã»FigJamãŠã£ãžã§ãããäœæãããã®ã³ã³ããŒãã³ãã眮ãæããããšã«ããŸããã
å ¬åŒããã¥ã¡ã³ãã«èª¬æãããããã«ããŠã£ãžã§ããã¯ãã©ã°ã€ã³ãšç°ãªãã«ã³ãã¹äžã«ãªããžã§ã¯ããšããŠé 眮ã§ããç·šéæš©éãããã°èª°ã§ãå®è¡ã§ããŸãã
ãŸããé²èŠ§æš©éã®å Žåã¯ãŠã£ãžã§ãããšããŠã®åŠçã¯å®è¡ã§ããªããã®ã®ãã«ã³ãã¹äžã®ãªããžã§ã¯ããšããŠã¯è¡šç€ºå¯èœã§ãã
ã€ãŸããFigmaã»FigJamãŠã£ãžã§ããã¯âã«ã³ãã¹äžã®ãªããžã§ã¯ãã«ã€ã³ã¿ã©ã¯ãã£ããªæ©èœãä»äžã§ããä»çµã¿âãšæããããšãã§ããæ®æ®µäœ¿ã£ãŠãã䟿å©ã³ã³ããŒãã³ãããã£ãšäŸ¿å©ã«æ¡åŒµã§ããå¯èœæ§ãç§ããŠããŸãã
ã³ã³ã»ãã
FigJamã§ã®ãªã³ã¯ãã¬ãã¥ãŒããåçš®ã®ãŠã£ãžã§ããã¯ãã§ã«ååšããŠããŸããããããã€ãã®çç±ã«ããèªåã®ç®çãå åã«æºãããã®ã§ã¯ãããŸããã§ããã

og:image ã®æç¡ã«ããç°ãªããã©ãŒãããã§è¡šç€ºããèŠãç®ãæããªã
èªèšŒãå¿ èŠãªURLã§ã¯ã¿ã€ãã«ã衚瀺ãããªã
ãã®ãããããããæºãããããªã³ã³ã»ããã®å ã§ãŠã£ãžã§ãããäœãããšã«ããŸããã
ã·ã³ãã«ã§çµ±äžæã®ããèŠãç®
ã©ããªURLã§ããªããšãªãè¯ãæãã«ããŠããã
ã¿ã€ãã«ãããŸã衚瀺ãããªãå Žåã¯æåã§ä¿®æ£ã§ãã
1. ã·ã³ãã«ã§çµ±äžæã®ããèŠãç®
URLããããš â ãã¡ãã³ã³ãšã¿ã€ãã«ã衚瀺ããã
ãã®åŠçãæ¥µåã·ã³ãã«ãªUIã§å®çŸããããã«ãå
¥åã¢ãŒãã§ã¯URLã®å
¥åãšãªã¢ã®ã¿ã衚瀺ããã衚瀺ã¢ãŒãã§ã¯ãã¡ãã³ã³ãšã¿ã€ãã«ã®ã¿ã衚瀺ããããã«ããŸãã
ãã®ãŠã£ãžã§ããã«ã¯å
¥åãšè¡šç€ºã®ïŒã€ã®ã¢ãŒããèšããããšã«ããŸããã

2. ã©ããªURLã§ããªããšãªãè¯ãæãã«ããŠããã
ã©ããªURLã§ããã¡ããšã¿ã€ãã«ãšãã¡ãã³ã³ã衚瀺ãããã®ãçæ³ã§ãããçŸå®çã«ã¯é£ããã§ãã
èªèšŒãå¿ èŠãªURLã§ã¯ã¿ã€ãã«ååŸã§ããªã
htmlã¯æ£ããååŸã§ããŠããããã¿ã€ãã«éšåãããŸãå€å®ã§ããªã
éä¿¡ãã¿ã€ã ã¢ãŠãã«ãªã£ãŠããŸã
ãã®ãããã¿ã€ãã«ãååŸã§ããªãå Žåã¯URLã®ãã¹åã衚瀺ãããã¡ãã³ã³ãååŸã§ããªãå Žåã¯ä»£ããã«ããã©ã«ãã¢ã€ã³ã³ã衚瀺ããŸããèªåãããå©çšããURLã¯Githubãã©ã€ããŒããªããžããªãèªèšŒãå¿ èŠãªTrelloã®ã«ãŒãã®URLãªã©ã§ããã©ã¡ããã¿ã€ãã«ååŸã§ããªãããã以äžã®ããã«ãã¹åã衚瀺ããŠããŸãã

ãŸãGoogleãã©ã€ããGoogleã¹ãã¬ããã·ãŒããªã©ã®Google Appã¯èªèšŒç»é¢ã«ãªãã€ã¬ã¯ããããŠããŸããŸãã
èŠèã®çã§ãããURLã®ãã¹ãåãå€å®ããŠäŸå€ã±ãŒã¹ãšããŠãµãŒãã¹åãè¿ãããã«ããŸãã

3. ã¿ã€ãã«ãããŸã衚瀺ãããªãå Žåã¯æåã§ä¿®æ£ã§ãã
ããã§ãé§ç®ãªå Žåã¯æåã§ã¿ã€ãã«ä¿®æ£ãããããšããããŸãããã®ãããã©ã°ã€ã³ãŠã£ã³ããŠãå©çšããŠã¿ã€ãã«ã倿Žã§ããããã«ããŸããå©çšè ã«ãšã£ãŠã¯æéã§ãããæçµçã«ã¯æå³éãã«å€æŽããããšãã§ããŸãã

ãŠã£ãžã§ããã®åŠçã®æµã
以äžããŠã£ãžã§ããã®åŠçã®æµããšããŠãããŒå³ã«ãŸãšãããšããããªæãã«ãªããŸãã

éçº
ãŠã£ãžã§ããã®éçºã¯ïŒçš®é¡ã®ãã³ãã¬ãŒãããå§ããããšãã§ããŸããä»åã¯Network Requestãå©çšããããããWith iFrame & browser APIsããéžã³ãŸããããã®ãµã³ãã«ããšãŠãããã§ããŠããŠãïŒçš®é¡ã®ãã³ãã¬ãŒããè§Šãã ãã§ãŠã£ãžã§ãããšãã©ã°ã€ã³ã®ä»çµã¿ã倧ãŸãã«çè§£ããããšãã§ããŸããã

ãŠã£ãžã§ãããšãã©ã°ã€ã³ã¯TypeScriptã§èšè¿°ãJavaScriptãšããŠå®è¡ãããŸãããNetwork RequestãçŽæ¥è¡ãããšã¯ã§ããŸãããiframeãšããŠè¡šç€ºããããã©ã°ã€ã³ãŠã£ã³ããŠãä»ããŠè¡ããŸãã
ãããªæãã§å ¥åããURLããhtmlãååŸããåŠçãæžããŸãã

ããããå®è¡ããåŸã«ããã§ã¯ããŸãè¡ããªãããšã«æ°ã¥ããŸããã
ãã©ãŠã¶ã§å®è¡ãããJavascriptã§ã¯ãåŒã³åºãå
ãšåŒã³åºãå
ã®ãã¡ã€ã³ãç°ãªãå ŽåãhttpããããŒã®Access-Control-Allow-Originã§èš±å¯ããåŒã³åºãå
ããããèªãããšãã§ããŸããããã®ããConsoleã«ä»¥äžã®ãããªãšã©ãŒãåºåãããŸãã
Access to XMLHttpRequest at 'https://google.com/' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.ãµãŒããŒãµã€ãã§ã¯ãã®ãããªå¶éã¯ãªããããã¿ã€ãã«ååŸçšã®APIãå¥éäœæããŠãã®ãšã©ãŒãåé¿ããããšã«ããŸãã

AWS Lambdaã§ã®ãµãŒããŒãµã€ãéçº
ãµãŒããŒãµã€ãã®ç°å¢ãšããŠAWS Lambdaã䜿çšããŸããããµãŒããŒãµã€ãéçºã®ã»ãŒæªçµéšã§ãããAWS Lambdaã¯æ°å¹Žåã«Alexaã¹ãã«ãè§Šã£ãéã«å©çšããããšããããŸããã
Lambda 颿°ã®äœæã«ã€ããŠã¯ãã¡ããåèã«ãªããŸããã
ãŸãã¯Node.jsã§htmlãèªã¿èŸŒãåŠçãæžããŸãã
const https = require('https')
https.get(url, (resp) => {
let data = ''
resp.on('data', (chunk) => {
data += chunk
})
resp.on('end', () => {
console.log('èªã¿èŸŒã¿å®äº')
})
}).on("error", (err) => {
console.log("Error: " + err.message)
})åèïŒ
ååŸããhtmlããæ£èŠè¡šçŸã§ã¿ã€ãã«ãååŸããŸãã
const re_title = RegExp("(?<=<title.*>).*(?=</title>)")
let title = ''
try {
title = re_title.exec(html)[0]
} catch(error) {
}åèïŒ
Faviconã®ååŸã«ã¯Icon Horseãå©çšããŸãããææãã©ã³ããããŸãããäžå®ã®ãªã¯ãšã¹ãæ°ãŸã§ç¡æã§å©çšããããšãã§ããŸãã
Lambdaã®ãã¹ãæ©èœã䜿çšããŠãè€æ°ã®URLã§é¢æ°ãåé¡ãªãåäœããããšã確èªããŸãã
Lambda颿°ã®APIå
Lambdaã§äœæãã颿°ãAPIãšããŠå©çšããæ¹æ³ã¯ïŒã€ãããŸãã
API Gatewayãèšå®
Lambdaã®é¢æ°URLãèšå®
ä»åã¯èšå®é
ç®ãå°ãªãç°¡æçãªåŸè
ãéžæããŸããã
Lambda颿°ã®ãèšå®ãããã颿° URLããéžæãããšã现ããªèšå®é
ç®ã衚瀺ãããŸãã
CORSã®å¶éãªãAPIãå®è¡ã§ããããã«ä»¥äžã®ããã«èšå®ããŸãã
èªèšŒã¿ã€ããNONEã«
ãªãªãžã³éãªãœãŒã¹å ±æ (CORS) ãèšå® ãéžæ
èš±å¯ãªãªãžã³ïŒ*
èš±å¯ããããŒïŒcontent-type
èš±å¯ã¡ãœããïŒPOST

åèïŒ
宿ã»ãã©ãã·ã¥ã¢ãã
宿ããAPIããŠã£ãžã§ããã®ãã©ã°ã€ã³ãŠã£ã³ããŠïŒui.htmlïŒããåŒã³åºããçµæããŠã£ãžã§ããæ¬äœïŒcode.tsxïŒã«æž¡ããŸãã
let request = new XMLHttpRequest();
let json = JSON.stringify({
url:params.url
})
request.open('POST', apiUrl)
request.setRequestHeader('Content-Type','application/json');
request.responseType = 'text'
request.onload = async() => {
let res = JSON.parse(request.response)
parent.postMessage({
pluginMessage: {
type: "responseReceived",
success: true,
title: res.title,
favicon: res.favicon
}
}, "*");
}
request.onerror = (event) => {
parent.postMessage({
pluginMessage: {
type: "responseReceived",
success: false,
statusCode: request.status,
message: "Failed to retrieve title."
}
}, "*");
}
request.send(json);ãããªæãã§åããŠã®Figmaã»FigJamãŠã£ãžã§ããã宿ããŸããã
å®éã«äœã£ãŠã¿ããšãä»ã«ãæ§ã
ãªèª²é¡ãžã®å¯Ÿå¿ã®å¿
èŠã«æ°ã¥ããã®ã§ã
ãªãªãŒã¹åŸãäœåºŠãä¿®æ£ãããŠããŸãã
Titleã¿ã°ã ãã§ãªããog:titleãtwitter:titleãããã¿ã€ãã«ãååŸ
ã¿ã€ãã«å ã®æ¹è¡ããšã¹ã±ãŒãæåã®å¯Ÿå¿
é·éããã¿ã€ãã«ãçç¥
html容éã倧ããããå Žåã®åŠç
äžäŸ¿ãªç¹ããªã¯ãšã¹ããªã©ãããŸããããæ°è»œã«ã³ã¡ã³ãããã ãããšå¬ããã§ãïŒ