ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพใฎใƒ–ใƒญใ‚ฐ - TECH PLAY

TECH PLAY

ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพ

ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพ ใฎๆŠ€่ก“ใƒ–ใƒญใ‚ฐ

ๅ…จ530ไปถ

ใฏใ˜ใ‚ใซ ใ“ใ‚“ใซใกใฏใ€‚ใ‚คใƒณใƒ•ใƒฉใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ—ใฎๅ‘จใงใ™ใ€‚็คพๅ†…ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใ€ใ‚ตใƒผใƒใฎ่จญ่จˆใƒป้‹็”จใ‚’ๆ‹…ๅฝ“ใ—ใฆใ„ใพใ™ใ€‚ๆœ€่ฟ‘ใ‚ณใƒผใƒซใ‚ปใƒณใ‚ฟใƒผ็”จใƒใƒƒใƒˆใƒฏใƒผใ‚ฏๆฉŸๅ™จใƒป้–ข้€ฃใ‚ตใƒผใƒใฎ็›ฃ่ฆ–ใ‚’ใ™ใ‚‹ใŸใ‚ใ€Zabbixใ‚ตใƒผใƒใฎ้‹็”จใ‚’ๅง‹ใ‚ใพใ—ใŸใ€‚ไปŠๅ›žใฏZabbixใƒใƒผใ‚ธใƒงใƒณ5.0ใงใฎใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใƒซใƒผใƒซ่จญๅฎšใซใคใ„ใฆใ€็ดนไป‹ใ—ใŸใ„ใจๆ€ใ„ใพใ™ใ€‚ Zabbixใจใฏ Zabbix็คพใŒ้–‹็™บใ—ใฆใ„ใ‚‹ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใฎ็ตฑๅˆ็›ฃ่ฆ–ใ‚ฝใƒ•ใƒˆใ‚ฆใ‚จใ‚ขใงใ™ใ€‚ ็›ฃ่ฆ–ๅฏพ่ฑกใฎNWๆฉŸๅ™จใซใฏSNMPใ‚’่จญๅฎšใ€็›ฃ่ฆ–ๅฏพ่ฑกใฎใ‚ตใƒผใƒใซใฏZabbixใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ™ใ‚Œใฐใ€ๆญปๆดป็›ฃ่ฆ–ใ€ใƒˆใƒฉใƒƒใƒ—็›ฃ่ฆ–ใ€WEBใ‚ตใƒผใƒ“ใ‚น็›ฃ่ฆ–ใชใฉ่‰ฒใ€…ๅฏพๅฟœๅฏ่ƒฝใจใชใ‚Šใพใ™ใ€‚ ็›ฃ่ฆ–ใ‚ฟใ‚คใƒ— ่ชฌๆ˜Ž ็›ฃ่ฆ–้ …็›ฎ Zabbixใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ Zabbixใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใซใ‚ˆใ‚‹็›ฃ่ฆ–ใ‚’ใ™ใ‚‹ ใƒชใ‚ฝใƒผใ‚น็›ฃ่ฆ–๏ผˆCPU/ใƒกใƒขใƒช/ใƒ‡ใ‚ฃใ‚นใ‚ฏใชใฉใฎไฝฟ็”จ็އ๏ผ‰ใ€ใƒญใ‚ฐ็›ฃ่ฆ–๏ผˆใ‚ญใƒผใƒฏใƒผใƒ‰ใชใฉ๏ผ‰ SNMPใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ SNMPใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใซใ‚ˆใ‚‹็›ฃ่ฆ–ใ‚’ใ™ใ‚‹ ping็›ฃ่ฆ–ใ€trap็›ฃ่ฆ–ใ€ใƒใƒผใƒชใƒณใ‚ฐ็›ฃ่ฆ– SSH/TELNETใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ SSH/TELNET็ตŒ็”ฑใงใ‚ณใƒžใƒณใƒ‰ๅฎŸ่กŒใ—ใŸ็ตๆžœใ‚’ๅ–ๅพ—ใ—ใฆ็›ฃ่ฆ–ใ‚’ใ™ใ‚‹ NWๆฉŸๅ™จใฎใ‚นใƒ†ใƒผใ‚ฟใ‚นๅค‰ๅŒ–็›ฃ่ฆ–๏ผˆใƒซใƒผใƒ†ใ‚ฃใƒณใ‚ฐใƒ†ใƒผใƒ–ใƒซใฎBGP็ตŒ่ทฏๅค‰ๆ›ด็™บ็”Ÿใชใฉ๏ผ‰ โ€ปไป–ใฎ็›ฃ่ฆ–ใ‚ฟใ‚คใƒ—ใ‚‚ใ‚ใ‚Šใ€็”จ้€”ใซๅฟœใ˜ใฆ็ดฐใ‹ใ„็›ฃ่ฆ–่จญๅฎšใŒๅฏ่ƒฝใงใ™ใ€‚ ใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒช่จญๅฎšๆดป็”จ Zabbixใซใฏใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใจใ„ใ†ไพฟๅˆฉใชๆฉŸ่ƒฝใŒใ‚ใ‚Šใพใ™ใ€‚ใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใƒซใƒผใƒซใงๆŒ‡ๅฎšใ—ใŸIPใ‚ขใƒ‰ใƒฌใ‚นใจใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใฎ่จญๅฎšใซใ‚ˆใ‚Šใ€ๆ–ฐ่ฆใƒ›ใ‚นใƒˆ๏ผˆ็›ฃ่ฆ–ๅฏพ่ฑก๏ผ‰ใฎ็™ป้ŒฒใŠใ‚ˆใณ้–ข้€ฃใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆ๏ผˆใ‚ขใ‚คใƒ†ใƒ ใ€ใƒˆใƒชใ‚ฌใƒผใ€ใ‚ฐใƒฉใƒ•ไฝœๆˆ๏ผ‰ใฎ็ดใฅใ‘ใ‚’่‡ชๅ‹•็š„ใซ่กŒใ„ใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Š็›ฃ่ฆ–ๅฏพ่ฑกใƒ›ใ‚นใƒˆๆ•ฐใŒๅข—ใˆใฆใ‚‚ใ€ไธ€ๅฐใšใค่จญๅฎšใ™ใ‚‹ใ“ใจใŒไธ่ฆใจใชใ‚Šใ€่จญๅฎšใฎ่‡ชๅ‹•ๅŒ–ใŒๅฎŸ็พใ•ใ‚Œใพใ™ใ€‚ ใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใƒซใƒผใƒซไป•็ต„ใฟ ใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใƒซใƒผใƒซใฎๅฎŸๆ–ฝ้ ปๅบฆใฏใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใง24ๆ™‚้–“ใซ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™ใ€‚ๆ–ฐ่ฆใ‚ตใƒผใƒ/NWๆฉŸๅ™จ่ฟฝๅŠ ใชใฉใซใ™ใๆ›ดๆ–ฐใ—ใŸใ„ๅ ดๅˆใฏใ€Œ่จญๅฎš>ใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใƒซใƒผใƒซ>”ๅฏพ่ฑกใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใƒซใƒผใƒซ”ใ€ใฎใ€Œ็›ฃ่ฆ–้–“้š”ใ€้ …็›ฎใงๆ™‚้–“ใ‚’ๅค‰ๆ›ดใ™ใ‚‹ใ“ใจใงๆ›ดๆ–ฐ้–“้š”ใ‚’็Ÿญ็ธฎใงใใพใ™ใ€‚ ใ‚ตใƒผใƒๆฉŸๅ™จ๏ผˆLinux๏ผ‰ ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏๆฉŸๅ™จ๏ผˆCISCO๏ผ‰ ็ต‚ใ‚ใ‚Šใซ Zabbixใฎใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชๆฉŸ่ƒฝใฏ็ตๆง‹ๅคใ„ใƒใƒผใ‚ธใƒงใƒณใ‹ใ‚‰ใƒชใƒชใƒผใ‚นใ•ใ‚ŒใฆใŠใ‚Šใพใ™ใ€‚ใ‚ตใƒผใƒใ€NWไปฎๆƒณๅŒ–ใซไผดใ„ใ€็›ฃ่ฆ–ๅฏพ่ฑกใฎๅข—ๆธ›ใŒๆฟ€ใฃใฆใ„ใ‚‹ๅ ดๅˆใ‚‚ใ€ใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชๆฉŸ่ƒฝใ‚’ๆดป็”จใ™ใ‚Œใฐ้‹็”จใŒๆฅฝใซใชใ‚‹ใฎใงใ€ใพใ ๅˆฉ็”จใ•ใ‚Œใฆใ„ใชใ„ๆ–นใฏใ€ใœใฒ่ฉฆใ—ใฆใฟใฆใใ ใ•ใ„ใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event โ€“ NIFTY engineering
ใฏใ˜ใ‚ใซ ไผšๅ“กใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ— N1!Machine Learning Product Engineerใฎไธญๆ‘ใงใ™ใ€‚ 2023ๅนด2ๆœˆ9ๆ—ฅใซๅ›ฝๅ†…ๆœ€ๅคง็ดšใฎใƒ‡ใƒ™ใƒญใƒƒใƒ‘ใƒผใ‚ซใƒณใƒ•ใ‚กใƒฌใƒณใ‚นใงใ‚ใ‚‹Developers Summit 2023ใซ็™ปๅฃ‡ใ—ใพใ—ใŸใ€‚ https://event.shoeisha.jp/devsumi/20230209/session/4151/ ใ“ใฎ่จ˜ไบ‹ใงใฏใ“ใฎ็™ปๅฃ‡ใซ่‡ณใ‚‹ใพใงใฎ็ตŒ็ทฏใ‚„ๅ†…ๅฎนใซใคใ„ใฆใŠ่ฉฑใ—ใฆใ„ใใพใ™ใ€‚ ใชใœ็™ปๅฃ‡ใ—ใŸใฎใ‹๏ผŸ ใƒ‹ใƒ•ใƒ†ใ‚ฃใซใฏN1!ใจใ„ใ†ใ‚นใƒšใ‚ทใƒฃใƒชใ‚นใƒˆๅˆถๅบฆใŒใ‚ใ‚Šใพใ™ใ€‚ ใ“ใฎๅˆถๅบฆใฏ็คพๅ†…ใงใ‚นใƒšใ‚ทใƒฃใƒชใ‚นใƒˆใŒๆดป่บใ™ใ‚‹ใŸใ‚ใฎๅˆถๅบฆใงใ€ไบˆ็ฎ—ใŒ100ไธ‡ๅ††ๅ€‹ไบบใซไธŽใˆใ‚‰ใ‚Œใ‚‹ใชใฉใฎๆจฉ้™ใŒใ‚ใ‚‹ใฎใงใ™ใŒใ€ ่‡ชๅˆ†ใฏๆฉŸๆขฐๅญฆ็ฟ’ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใจใ—ใฆๆดปๅ‹•ใ—ใฆใ„ใพใ™ใ€‚ ใ“ใฎๆดปๅ‹•ใฎ็ตๆžœใƒ‹ใƒ•ใƒ†ใ‚ฃใƒ‹ใƒฅใƒผใ‚นใซใƒ‹ใƒฅใƒผใ‚น่จ˜ไบ‹่ฆ็ด„ใ‚’ๅฎŸ่ฃ…ใ—ใŸใฎใงใ€ใ“ใ‚Œใ‚’็คพๅค–ใซ็™บไฟกใ—ใŸใ„ใจใ„ใ†ใƒขใƒใƒ™ใƒผใ‚ทใƒงใƒณใงใ™ใ€‚ ใจใ„ใ†ๅปบๅ‰ใงใ™ใŒ ๅฎŸ้š›ใฏ่จ˜ๅฟตๅ—้จ“ใ—ใฆใฟใŸใ‚‰ๅ—ใ‹ใฃใฆใ—ใพใฃใŸใจใ„ใ†ใฎใŒๅคงใใ„ใงใ™ใ€‚ ่‡ชๅˆ†ใฏ่ง’่ฐทใ•ใ‚“ใฎใ€ŒAgile Manifest Decade Resurrectionใ€ใจใ„ใ†็™บ่กจใ‚นใƒฉใ‚คใƒ‰ใŒใ™ใ”ใๅฅฝใใงใ€LTๅคงไผšใชใฉใงใ‚‚ใ‚ˆใไผผใŸใ‚ˆใ†ใชใƒ†ใ‚คใ‚นใƒˆใฎ็™บ่กจใ‚นใƒฉใ‚คใƒ‰ใง็™บ่กจใ—ใฆใ„ใพใ—ใŸใ€‚ ใใ—ใฆใ€ใ“ใฎใ‚นใƒฉใ‚คใƒ‰ใฏใƒ‡ใƒ–ใ‚ตใƒŸ2022ใฎ็™บ่กจใ‚นใƒฉใ‚คใƒ‰ใงใ™ใ€‚ ใใฎใŸใ‚่‡ชๅˆ†ใฎไธญใงใฏใƒ‡ใƒ–ใ‚ตใƒŸใจใ„ใ†ใฎใฏใ‹ใชใ‚Šๅคงใใชใ‚คใƒ™ใƒณใƒˆใงใ€ใ€Œ็™ปๅฃ‡ใงใใ‚‹ๆฐ—ใฏใ—ใชใ„ใ‘ใฉๅ…ฌๅ‹Ÿใ ใ‘ๅ‡บใ—ใฆใฟใ‚ˆใ€œใ€ใจใ‚„ใฃใฆใฟใŸใ‚‰ใ€ใพใ•ใ‹ใฎๅฝ“้ธใ—ใฆใ—ใพใ„ใพใ—ใŸใ€‚ ๅŒใ˜ๆ™‚้–“ใฎๅ…ฌๅ‹Ÿๆž ใฏใ‚„ใฏใ‚Šๆœ‰ๅใ ใฃใŸใ‚Šๅฝน่ทใ‚ฏใƒฉใ‚นใฎ้ซ˜ใ„ไบบใŒๅคšใใ€ๆˆฆใ€…ๆใ€…ใ—ใชใŒใ‚‰ๅฝ“ๆ—ฅใ‚’่ฟŽใˆใพใ—ใŸใ€‚ ไฝ•ใ‚’่ฉฑใ—ใŸใฎใ‹๏ผŸ ๅฎŸใฏ็™บ่กจใฎ2้€ฑ้–“ๅ‰ใพใง่ฉฑใ™ใ“ใจใ‚’ใšใฃใจๆ‚ฉใ‚“ใงใ„ใพใ—ใŸใ€‚ ใจใ„ใ†ใฎใ‚‚ๆทฑๅฑคๅญฆ็ฟ’ใซใ‚ˆใ‚‹ใƒ‹ใƒฅใƒผใ‚น่จ˜ไบ‹่ฆ็ด„ใฎใƒ—ใƒญใƒ€ใ‚ฏใƒˆๅฎŸ่ฃ…ใซใคใ„ใฆใฏใ€ไธญ่บซใฏๆทฑๅฑคๅญฆ็ฟ’ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‹ใ‚‰ใ™ใ‚‹ใจใใ“ใพใง่ค‡้›‘ใชใ‚‚ใฎใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ใจใชใ‚‹ใจใ€ๆทฑๅฑคๅญฆ็ฟ’ใฎไป•็ต„ใฟใ‚„ๆ‰‹ๆณ•ใ‚’่ชฌๆ˜Žใ™ใ‚‹ใ‚ˆใ‚Šใ‚‚ใ€่‡ชๅˆ†ใŒใใ‚Œใ‚’ใƒ—ใƒญใƒ€ใ‚ฏใƒˆใซๅฎŸ่ฃ…ใ™ใ‚‹ใพใงใฎ้€ฒใ‚ๆ–นใ‚„ไบบ้–“้–ขไฟ‚ใ‚นใ‚ญใƒซใซ็„ฆ็‚นใ‚’ๅฝ“ใฆใŸๆ–นใŒใ„ใ„ใฎใงใฏ๏ผŸใจ่€ƒใˆใฆใ„ใŸใ‹ใ‚‰ใงใ™ใ€‚ ๏ผˆ่‡ชๅˆ†่‡ช่บซใฏใ‚นใ‚ฏใƒฉใƒ ใƒžใ‚นใ‚ฟใƒผใ‚‚ๅ…ผๅ‹™ใ—ใฆใ„ใ‚‹ใฎใงใ™ใŒใ€ใƒ•ใ‚กใ‚ทใƒชใƒ†ใƒผใ‚ทใƒงใƒณใ‚„ๆŠ˜่กใชใฉใง่ค’ใ‚ใฆใ‚‚ใ‚‰ใ†ใ“ใจใŒๅคšใ„ใงใ™ใ€‚๏ผ‰ ใ—ใ‹ใ—ใ€ไบบ้–“้–ขไฟ‚ใฎใ‚นใ‚ญใƒซใจใชใ‚‹ใจใ€Œใ“ใ‚Œใง็ตถๅฏพใซไธŠๆ‰‹ใใ„ใ๏ผใ€ใจใ„ใ†ใ“ใจใ‚‚่จ€ใ„ใฅใ‚‰ใใ€ใšใฃใจๆœฌใ‚’่ชญใฟใชใŒใ‚‰ไฝ•ใ‚’่ฉฑใใ†ใ‹ใพใจใ‚ใฆใ„ใใพใ—ใŸใ€‚ ไปฅไธ‹ใฎใ‚ˆใ†ใซใ€ไฝœใฃใŸ็ตๆžœใ€็ตๅฑ€ใ‚นใƒฉใ‚คใƒ‰ๅ†…ใง่จ€ๅŠใ—ใชใ‹ใฃใŸ่ณ‡ๆ–™ใ‚‚ใŸใใ•ใ‚“ใ‚ใ‚Šใพใ™ใ€‚๏ผˆใ„ใคใ‹ใฉใ“ใ‹ใง็™บ่กจใงใใŸใ‚‰่‰ฏใ„ใช๏ผ‰ ็ตๅฑ€ใฉใ†ใ—ใŸใฎใ‹๏ผŸ ๆ‚ฉใฟใซๆ‚ฉใ‚“ใ ็ตๆžœใ€ๅ†…ๅฎนใ‚’3็‚นใซใพใจใ‚ใพใ—ใŸใ€‚ ็จฎใ‚’่’”ใ ๆŠ€่ก“ใ‚’้–‹่Šฑใ•ใ›ใ‚‹ ไบบ้–“้–ขไฟ‚ใฎใ‚นใ‚ญใƒซ ใ€Œ็จฎใ‚’่’”ใใ€ใงใฏ็คพๅ†…ใงๆ–ฐใ—ใ„ใ“ใจใ‚’ใ‚„ใ‚‹ใŸใ‚ใฎใƒ•ใ‚ฉใƒญใƒฏใƒผใ‚’็ฒๅพ—ใ—ใฆใ„ใ้Ž็จ‹ใซใคใ„ใฆ ใ€ŒๆŠ€่ก“ใ‚’้–‹่Šฑใ•ใ›ใ‚‹ใ€ใงใฏๆŠ€่ก“็š„ใซใ‚„ใ‚„่ธใฟ่พผใ‚“ใ ๅ†…ๅฎนใงไฝ•ใ‚’่กŒใฃใŸใฎใ‹๏ผˆ่ฉณ็ดฐใชๅ†…ๅฎนใซใคใ„ใฆใฏใ€ ่‡ช็คพใ‚คใƒ™ใƒณใƒˆใง่ฌ›ๆผ” ใ—ใฆใ„ใพใ™ใฎใงใ€ใใกใ‚‰ใ‚’ๅพก่ฆงใใ ใ•ใ„๏ผ‰ ใ€Œไบบ้–“้–ขไฟ‚ใฎใ‚นใ‚ญใƒซใ€ใงใฏไบบ้–“้–ขไฟ‚ใ‚’ไธŠๆ‰‹ใใ‚„ใฃใฆใ„ใๆ–นๆณ•ใซใคใ„ใฆ่ชžใ‚Šใพใ—ใŸใ€‚ ็ตๅฑ€ใ€ไธŠๆ‰‹ใไฝ“็ณปๅŒ–ใŒใงใใŸ้ƒจๅˆ†ใฏๅคšใใชใ‹ใฃใŸใฎใงใ™ใŒใ€่žใ„ใฆใ„ใ‚‹ไบบใŒใ€Œๅ‹‡ๆฐ—ใ€ใ‚’ๆŒใฆใ‚‹่ฌ›ๆผ”ใซใ—ใŸใ„ใจๆ€ใฃใฆใ„ใพใ—ใŸใ€‚ ็ตๆžœ็š„ใซTwitterใงใ‚‚ใ€Œๅ‹‡ๆฐ—ใ‚’ใ‚‚ใ‚‰ใฃใŸใ€ใ€Œใ‚จใƒขใ„่ฉฑใง่‰ฏใ‹ใฃใŸใ€ใจใ„ใ†ๅฃฐใŒใ‚ใ‚Šใ€่ฌ›ๆผ”ใ‚’่กŒใฃใŸๆ„ๅ‘ณใŒใ‚ใฃใŸใชใจๆ€ใ„ใพใ—ใŸใ€‚ (C ใฎใ‚นใƒ”ใƒผใ‚ซใƒผใ•ใ‚“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ€ๆทฑๅฑคๅญฆ็ฟ’ใ ใ‘ใงใชใๅค‰้ฉใฎ่ตทใ“ใ—ๆ–นใงๅฅฝใ) #devsumi #devsumiC pic.twitter.com/JXbmId9z6D โ€” ็ฏ ็”ฐ ๅฐ†ๅฝฆ / CIใƒปCD, DevOps, TDD (@Shinoda_IT) February 9, 2023 ่ชฌๆ˜Žใ™ใ”ใ่žใใ‚„ใ™ใ‹ใฃใŸใงใ™ใ€‚ ไปŠใจใฆใ‚‚ๆ„่ญ˜้ซ˜ใ„ๆฐ—ๆŒใกใซใชใฃใฆใ„ใ‚‹ใ‘ใ‚Œใฉๆ˜Žๆ—ฅใฎๆœใ‚‚็ถญๆŒใงใใฆใ„ใ‚‹ๆ–นๆณ•ใŒ็Ÿฅใ‚ŠใŸใ„(เน‘หƒฬตแด—ห‚ฬต) ๅพŒใงใ‚‚ใ†ไธ€ๅบฆ่ฆ‹่ฟ”ใ—ใŸใ„๏ผ๏ผ #ใƒ‡ใƒ–ใ‚ตใƒŸ #devsumi #devsumiC https://t.co/IQMdFU5nna โ€” ๆ˜Ÿโ˜†๏ผˆnishikigoi๏ผ‰ (@of_nishikigoi) February 9, 2023 ใ€Œๆ–‡ๅŒ–ใŒๅ…ˆใ€็ต„็น”ใฏๅพŒใ€ ใคใ„ไผš็คพใŒ๏ฝžใ€็ต„็น”ใŒ๏ฝžใจใ„ใ†ใ‘ใฉใ€ๆ–‡ๅŒ–ใฅใใ‚ŠใŒๅคงไบ‹ใชใ‚“ใ ใจๅฐ่ฑก็š„ใชใƒฏใƒผใƒ‰ใงใ—ใŸใ€‚ ใ‚„ใฃใฆใฟใฆใ€ใ—ใ‚“ใฉใ‹ใฃใŸใ‚‰ใ‚„ใ‚ใ‚‹ ใจๆ€ใฃใฆใŠใใ“ใจใงใ€่กŒๅ‹•ใซใƒ–ใƒฌใƒผใ‚ญใ‚’ใ‹ใ‘ใชใ„ใ‚ˆใ†ใซใ™ใ‚‹ใฎใŒๅคงไบ‹ #devsumi #devsumiC pic.twitter.com/epLQbS9jKl โ€” ใƒคใƒžใ‚ฟใ‚ฑ-ๆฅญๅ‹™่‡ชๅ‹•ๅŒ–ใจSEOใ‚’ๆฅตใ‚ไธญ (@gas_seo) February 9, 2023 ไปŠๅ›žใฎไธญๆ‘ไผŠๅนใ•ใ‚“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฏๅ‡„ใ„ๅŠ›ใซใชใฃใŸ ใ‚‚ใฃใจใŸใใ•ใ‚“ใฎไบบใซ่žใ„ใฆใปใ—ใ„ๅ†…ๅฎนใงใ—ใŸ #devsumiC pic.twitter.com/pM2xdsgUJP โ€” KiyamaYellow (@kiyama_yellow) February 9, 2023 ็ต‚ใ‚ใ‚Šใซ ๆŠ€่ก“ใ‚คใƒ™ใƒณใƒˆใฎ็™ปๅฃ‡ๅ‰ๅพŒใฎๅฟƒๅขƒใ‚’่กจใ—ใŸTwitterใฎ็”ปๅƒใŒใ‚ใ‚Šใพใ™ใ€‚ ๅ‹‰ๅผทไผšใงใฎ็™ปๅฃ‡ใซใคใ„ใฆใ€ใ„ใคใ‚‚ๆ„Ÿใ˜ใฆใ„ใ‚‹ๆญฃ็›ดใชๆฐ—ๆŒใกใ‚’ๆ›ธใใพใ—ใŸใ€‚ pic.twitter.com/Ip5Mvuve0h โ€” ้นฟ้‡Ž ๅฃฎ Takeshi Kano (@tonkotsuboy_com) October 24, 2022 ๅฎŒๅ…จใซใ“ใ‚Œใซใชใ‚Šใพใ—ใŸใ€‚ ไฝœใ‚Œใฐไฝœใ‚‹ใปใฉใ“ใฎใ‚นใƒฉใ‚คใƒ‰ใฎ่ซ–็†ใฏ้€šใฃใฆใ‚‹ใ‚“ใ ใ‚ใ†ใ‹๏ผŸใจ่€ƒใˆใ‚‹ใ‚ˆใ†ใซใชใ‚Šใ€ไฝ•ๅบฆใ‚‚ๆ–นๅ‘่ปขๆ›ใ‚’ใ—ใฆๅคงๅค‰ใชไฝœๆฅญใงใ—ใŸใ€‚ ใŸใ ใ€็ตๆžœ็š„ใซใฏไฝ•ๅ†Šใ‚‚ใฎๆœฌใ‚’่ชญใฟใ€ใฉใ†ใ„ใ†้ขจใซ่ฉฑใ—ใŸใ‚Šใ™ใ‚Œใฐใ„ใ„ใ‚“ใ ใ‚ใ†๏ผŸใจ่€ƒใˆใ€่‡ชๅˆ†ใฎใƒฌใƒ™ใƒซใ‚ขใƒƒใƒ—ใซ็น‹ใŒใ‚Šใพใ—ใŸใ€‚ ใƒ‡ใƒ–ใ‚ตใƒŸใฏใ‹ใชใ‚Šๅคงใใชใ‚คใƒ™ใƒณใƒˆใงๅคงๅค‰ใชใ“ใจใŒๅคšใ‹ใฃใŸใงใ™ใŒใ€ใ‚‚ใฃใจๅค–้ƒจ็™ปๅฃ‡ใ—ใฆใ„ใใŸใ„ใชใจใ„ใ†ๆฐ—ๆŒใกใซใชใ‚Œใพใ—ใŸใ€‚ ใ“ใ‚Œใ‹ใ‚‰ใ‚‚็™ปๅฃ‡ๆฉŸไผšใŒใ‚ใ‚Œใฐ็™ปๅฃ‡ใ—ใฆใ„ใ“ใ†ใจๆ€ใ„ใพใ™ใฎใงใ€ใพใŸๆฌกใฎใ‚คใƒ™ใƒณใƒˆ็™ปๅฃ‡ใซใ”ๆœŸๅพ…ใใ ใ•ใ„๏ผ ๏ผˆใ‚ขใƒผใ‚ซใ‚คใƒ–ๅ‹•็”ปๅ…ฌ้–‹ใ•ใ‚Œใ‚‹ใจใ„ใ„ใช๏ผ‰ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใฏใ˜ใ‚ใซ ใ“ใ‚“ใซใกใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพ ใ‚คใƒณใƒ•ใƒฉใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ— ไฝ่—คใงใ™ใ€‚ ๆ™ฎๆฎตใฎๆฅญๅ‹™ใงใฏ็คพๅ†…ใฎใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ้‹็”จใชใฉใ‚’ๆ‹…ๅฝ“ใ—ใฆใ„ใพใ™ใ€‚ ็พๅœจใ€็คพๅ†…ใฎ็„ก็ทšใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใฎ้›ปๆณข็Šถๆณๆ”นๅ–„ใฎใŸใ‚ใ€็„ก็ทšLANใ‚ตใ‚คใƒˆใ‚ตใƒผใƒ™ใ‚คใŒใงใใ‚‹ใƒ„ใƒผใƒซใฎๅฐŽๅ…ฅใ‚’ๆคœ่จŽใ—ใฆใŠใ‚Šใ€NetSpotใจใ„ใ†ใƒ„ใƒผใƒซใ‚’ใƒˆใƒฉใ‚คใ‚ขใƒซใงๅˆฉ็”จใ—ใฆใฟใŸใฎใงใ”็ดนไป‹ใ—ใพใ™ใ€‚ NetSpotใจใฏ NetSpotใฏ็„ก็ทšLANใ‚ตใ‚คใƒˆใ‚ตใƒผใƒ™ใ‚คใ‚„WiFiๅˆ†ๆžใŒ่กŒใˆใ‚‹ใƒ„ใƒผใƒซใงใ™ใ€‚ MacOSใ‚„Windowsใงๅˆฉ็”จใŒใงใใ€ๅฟ…่ฆใช่ฆไปถใซๅฟœใ˜ใฆ็„กๆ–™็‰ˆใ‚„ใƒ—ใƒญ็‰ˆใ€ใ‚จใƒณใ‚ฟใƒผใƒ—ใƒฉใ‚คใ‚บ็‰ˆใŒใ‚ใ‚Šใพใ™ใ€‚ ไปŠๅ›žใฏ็„ก็ทšLANใ‚ตใ‚คใƒˆใ‚ตใƒผใƒ™ใ‚คใŒใงใใ‚‹ใƒ—ใƒญ็‰ˆใ‚’ใƒˆใƒฉใ‚คใ‚ขใƒซใงๅˆฉ็”จใ—ใฆใฟใพใ—ใŸใ€‚ NetSpotใงใ‚„ใ‚ŠใŸใ„ใ“ใจ ็„ก็ทšไธ่ชฟใฎๅŽŸๅ› ใงใ‚ˆใใ‚ใ‚‹ใฎใŒ้›ปๆณขๅนฒๆธ‰ใงใ™ใŒใ€ๅนฒๆธ‰ๆบใจใชใฃใฆใ„ใ‚‹็„ก็ทšใƒซใƒผใ‚ฟใ‚’ๆŽขใ™ใฎใซ่‹ฆๅŠดใ™ใ‚‹ใ“ใจใŒใ‚ˆใใ‚ใ‚Šใพใ™ใ€‚NetSpotใ‚’ไฝฟใฃใฆ่‡ชๅˆ†ใŸใกใง็ฎก็†ใ—ใฆใ„ใชใ„็„ก็ทšใƒซใƒผใ‚ฟใƒผใฎๅ ดๆ‰€ใ‚’็‰นๅฎšใ—ใŸใ„ใจๆ€ใฃใฆใ„ใพใ™ใ€‚ NetSpotใฎไฝฟใ„ๆ–น NetSpotใ‚’่ตทๅ‹•ใ™ใ‚‹ใจไธ‹่จ˜็”ป้ขใŒ่กจ็คบใ•ใ‚Œใ‚‹ใฎใงๆ–ฐใ—ใ„ใ€Œ่ชฟๆŸปใ‚’ใ™ใ‚‹ใ€ใ‚’้ธๆŠžใ—ใพใ™ใ€‚ ็”ป้ขใŒ้ท็งปใ™ใ‚‹ใฎใงไธ‹่จ˜ใฎ้ …็›ฎใ‚’ๅ…ฅๅŠ›ใ—ใพใ™ใ€‚ ใƒปๆ–ฐใ—ใ„ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฎๅๅ‰๏ผšใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฎๅๅ‰ ใƒป็ฌฌ1ใ‚พใƒผใƒณๅ๏ผšๅ ดๆ‰€ใ‚„ๅปบ็‰ฉๅ็ญ‰ ใƒปใ‚พใƒผใƒณใ‚จใƒชใ‚ขใ‚ฟใ‚คใƒ—๏ผšใƒ—ใƒซใƒ€ใ‚ฆใƒณๅฝขๅผใชใฎใง่ฉฒๅฝ“ใ™ใ‚‹ใ‚‚ใฎใ‚’้ธๆŠž ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰ใƒญใƒผใƒ‰ใ‚’้ธๆŠžใ—ใฆใƒ•ใƒญใ‚ขๅ›ณใ‚’ใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใพใ™ใ€‚ ใƒ•ใƒญใ‚ขๅ›ณใŒ่กจ็คบใ•ใ‚Œใ‚‹ใฎใง2ใ‹ๆ‰€้ธๆŠžใ—ใฆใ€2็‚น้–“ใฎ่ท้›ขใ‚’ๅ…ฅๅŠ›ใ—ใพใ™ใ€‚ ่ชฟๆŸปใซๅซใฟใŸใใชใ„SSIDใŒใ‚ใ‚Œใฐๅ…ฅๅŠ›ใ—ใพใ™(ไปŠๅ›žใฏไฝ•ใ‚‚ๆŒ‡ๅฎšใ—ใพใ›ใ‚“ใงใ—ใŸ) ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใ‚นใ‚ญใƒฃใƒณ(้€šไฟก้€Ÿๅบฆๆธฌๅฎš็ญ‰ใŒใงใใ‚‹)ใฎๅฎŸๆ–ฝ็ขบ่ชใŒใ‚ใ‚‹ใฎใงๅฎŸๆ–ฝใ™ใ‚‹ๅ ดๅˆใฏSSIDใ‚’ๅ…ฅๅŠ›ใ—ใพใ™(ไปŠๅ›žใฏๆœชๅฎŸๆ–ฝใงใ™) ใƒ•ใƒญใ‚ขๅ›ณใŒ่กจ็คบใ•ใ‚Œใ‚‹ใฎใง็พๅœจๅœฐใ‚’้ธๆŠžใ—ใฆ็„ก็ทš้€šไฟกใ‚’ใ‚นใ‚ญใƒฃใƒณใ‚’้–‹ๅง‹ใ—ใพใ™ ใ‚นใ‚ญใƒฃใƒณใŒๅฎŒไบ†ใ—ใŸใ‚‰ใ‚นใ‚ญใƒฃใƒณใงใใŸ็ฏ„ๅ›ฒใŒ็ท‘ไธธใง่กจ็คบใ•ใ‚Œใพใ™ ไธ€้€šใ‚Šใ‚นใ‚ญใƒฃใƒณใ—ใŸๅพŒใซใ‚นใ‚ญใƒฃใƒณไธญๆญขใ‚’้ธๆŠžใ™ใ‚Œใฐใ‚นใ‚ญใƒฃใƒณ็ตๆžœใŒ่กจ็คบใ•ใ‚Œใพใ™ใ€‚ ใ‚นใ‚ญใƒฃใƒณใ—ใŸ็ฏ„ๅ›ฒๅ†…ใซใ‚ใ‚‹็„ก็ทšๆฉŸๅ™จใŒใƒ•ใƒญใ‚ขๅ›ณใซ่กจ็คบใ•ใ‚Œใพใ—ใŸใ€‚ NetSpotไฝฟใฃใฆใฟใŸๆ„Ÿๆƒณ ็„กไบ‹ใซ็„ก็ทšใƒซใƒผใ‚ฟใฎไฝ็ฝฎใŒๆคœๅ‡บใŒใงใใพใ—ใŸใ€‚ไธ€้ƒจ้•ใ†้ƒจๅฑ‹ใฎ็„ก็ทšใƒซใƒผใ‚ฟใ‚‚่กจ็คบใ•ใ‚Œใฆใ—ใพใ„ใพใ—ใŸใŒใ€ๆคœ็Ÿฅไฝ็ฝฎใฎ็ฒพๅบฆใ‚‚ๅๅˆ†ใซ้ซ˜ใ็คพๅ†…ใฎ่ชฟๆŸปใงใ‚‚ไฝฟใˆใใ†ใงใ—ใŸใ€‚็‰นๅฎšใฎ็„ก็ทšใƒซใƒผใ‚ฟใฎ้›ปๆณขๅผทๅบฆใ‚‚ๆธฌๅฎšใงใใ‚‹ใฎใงใ€็คพๅ†…ใฎ็„ก็ทš็’ฐๅขƒๆ”นๅ–„ใฎไธ€็’ฐใจใ—ใฆๅผ•ใ็ถšใๅฐŽๅ…ฅใ‚’ๆคœ่จŽใ—ใŸใ„ใจๆ€ใ„ใพใ™ใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event โ€“ NIFTY engineering
NIFTY Tech Talkใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพใฎ็คพๅ“กใŒไธปๅ‚ฌใ™ใ‚‹ใƒˆใƒผใ‚ฏใ‚คใƒ™ใƒณใƒˆใงใ™ใ€‚ ๆœฌใ‚คใƒ™ใƒณใƒˆใงใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ—ใฎ็คพๅ“กใŒๆฅญๅ‹™ใ‚’้€šใ˜ใฆๅญฆใ‚“ใ ใ“ใจใ‚’็™บไฟกใ—ใฆใ„ใพใ™๏ผ ใƒ†ใƒผใƒž ็ฌฌ9ๅ›ž็›ฎใฎใƒ†ใƒผใƒžใฏใ€ŒSvelteKit, Next.jsใฎๅฐŽๅ…ฅไบ‹ไพ‹็ดนไป‹ใชใฉ ใ€œใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ใฎไปŠใจใ“ใ‚Œใ‹ใ‚‰ใ€œใ€ใงใ™ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰้–‹็™บใซ้–ขใ‚ใ‚‹ใƒกใƒณใƒใƒผใ‹ใ‚‰ใ€ๆฅญๅ‹™ใงๅŸนใ‚ใ‚ŒใŸใƒŽใ‚ฆใƒใ‚ฆใ‚„ใ€ไปŠๅพŒใฎใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ๆŠ€่ก“ใซใคใ„ใฆไบ‹ไพ‹็ดนไป‹ใชใฉLTๅฝขๅผใง็™บ่กจใ—ใพใ™ใ€‚ ๆฆ‚่ฆ ๆ—ฅ็จ‹๏ผš02ๆœˆ21ๆ—ฅ๏ผˆ็ซ๏ผ‰12:00ใ€œ13:00 ้…ไฟกๆ–นๆณ•๏ผšYouTube Live ่ฆ–่ด็’ฐๅขƒ๏ผšใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆๆŽฅ็ถšใŒๅฏ่ƒฝใชPC/ใ‚นใƒžใƒผใƒˆใƒ•ใ‚ฉใƒณ ๅ‚ๅŠ ๆ–นๆณ• YouTube Liveใซใฆ้…ไฟกใ„ใŸใ—ใพใ™ใ€‚ connpass ใซใฆ็™ป้Œฒใ‚’ใŠ้ก˜ใ„ใ„ใŸใ—ใพใ™ใ€‚ YouTube LiveใฎURLใฏๆฑบๅฎšๅพŒใ€connpassๅ†…ใฎๅ‚ๅŠ ่€…ใธใฎๆƒ…ๅ ฑๆฌ„ใซ่จ˜่ผ‰ใ„ใŸใ—ใพใ™ใ€‚ ใ“ใ‚“ใชๆ–นใซใŠใ™ใ™ใ‚ SvelteKit, Next.jsใ€่‡ช็คพๅˆถไฝœใ€ใ‚ขใ‚ฏใ‚ปใ‚ทใƒ“ใƒชใƒ†ใ‚ฃใซ่ˆˆๅ‘ณใŒใ‚ใ‚‹ๆ–น ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎๅˆถไฝœ็พๅ ดใ€ๆ–ฐ่ฆใ‚ตใƒผใƒ“ใ‚น้–‹็™บใฎๆŠ€่ก“้ธๅฎšใซใคใ„ใฆ่ˆˆๅ‘ณใŒใ‚ใ‚‹ๆ–น ใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใ‚จใƒณใ‚ธใƒณใฎ็งป่กŒใซ่ˆˆๅ‘ณใŒใ‚ใ‚‹ๆ–น ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎๆŠ€่ก“ใ‚„้ขจๅœŸใซ่ˆˆๅ‘ณใŒใ‚ใ‚‹ๆ–น ใ‚ฟใ‚คใƒ ใƒ†ใƒผใƒ–ใƒซ ๆ™‚้–“ ใ‚ณใƒณใƒ†ใƒณใƒ„ 12:00 – 12:05 ใ‚ชใƒผใƒ—ใƒ‹ใƒณใ‚ฐ๏ผ‹ไผš็คพ็ดนไป‹ 12:06 – 12:15 ใƒ‹ใƒ•ใƒ†ใ‚ฃใƒˆใƒƒใƒ—ใฎNext.jsใงใฎใ‚ญใƒฃใƒƒใ‚ทใƒฅๆˆฆ็•ฅใ‚’่€ƒใˆใŸ่ฉฑ (ไฝใ€…ๆœจ ๅ„ช) 12:16 – 12:25 ่‡ช็คพ่ฃฝCMSใฎใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใ‚จใƒณใ‚ธใƒณใ‹ใ‚‰Next.jsใซ็ฝฎใๆ›ใˆใ‚‹ (ๅฎฎๆœฌ ้”็Ÿข) 12:26 – 12:35 ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎWEBใ‚ตใ‚คใƒˆๅˆถไฝœใฎๆตใ‚Œ๏ฝž็คพๅ†…ๅˆถไฝœใฎใƒกใƒชใƒƒใƒˆใƒ‡ใƒกใƒชใƒƒใƒˆ (ๆ–ฐ็”ฐ ไธ‡ๆ™บ) 12:36 – 12:45 ๆ–ฐใ‚ตใƒผใƒ“ใ‚นใซSvelteKitใ‚’ๅฐŽๅ…ฅใ—ใฆใฟใŸ๏ผ (ใŸใ‘ใ‚ใ„ใฉ) 12:46 – 12:55 ็คพๅ†…ใซใ‚ขใ‚ฏใ‚ปใ‚ทใƒ“ใƒชใƒ†ใ‚ฃใ‚’ๅ–ใ‚Šๅ…ฅใ‚Œใฆใ„ใใŸใ„ใชใใจๆ€ใฃใฆใ„ใ‚‹่ฉฑ (้–ข ๆญฉๆญฆ) 12:56 – 13:00 ใพใจใ‚๏ผ‹ใ‚ฏใƒญใƒผใ‚ธใƒณใ‚ฐ ็™ปๅฃ‡่€…ใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซ ็ญ‘ๆœจ ไฟกๆˆ ๏ผˆใƒ•ใ‚กใ‚ทใƒชใƒ†ใƒผใ‚ฟ๏ผ‰ ๆŠ€่ก“ใ‚คใƒ™ใƒณใƒˆใฎไผ็”ปใ‚„ใ‚ญใƒฃใƒชใ‚ขๆŽก็”จใ‚’ๆ‹…ๅฝ“ใ—ใฆใ„ใพใ™ใ€‚ ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ใฎ็Ÿฅ่ญ˜ใ‚’ๆทฑใ‚ใŸใใ€็คพๅ†…ใง่กŒใ‚ใ‚Œใฆใ„ใ‚‹ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ๅ‹‰ๅผทไผšใซๅ‚ๅŠ ใ—ใฆใ„ใพใ™ใ€‚ ไปŠๅ›žใฏใƒ•ใ‚กใ‚ทใƒชใƒ†ใƒผใ‚ฟใƒผใจใ—ใฆๅ‚ๅŠ ใ—ใพใ™๏ผ ไฝใ€…ๆœจ ๅ„ช ๏ผˆ็™ปๅฃ‡่€…๏ผ‰ @niftyใƒˆใƒƒใƒ—ใƒšใƒผใ‚ธใงไธปใซ้–‹็™บใƒป้‹็”จใ‚’ๆ‹…ๅฝ“ใ—ใฆใ„ใพใ™ใ€‚ ๆœ€่ฟ‘ใฏใ‚ตใƒผใƒ“ใ‚นใฎใ‚คใƒณใƒ•ใƒฉใ‚ณใ‚นใƒˆใ‚’ๅ‰Šๆธ›ใงใใชใ„ใ‹ใ€ใƒขใƒ€ใƒณๆŠ€่ก“ใ‚’ๅ–ใ‚Šๅ…ฅใ‚Œใ‚‰ใ‚Œใชใ„ใ‹ใ‚’ๅญฆใณใชใŒใ‚‰ๅฎŸ่ทตใ—ใฆใ„ใพใ™ใ€‚ ๅฎฎๆœฌ ้”็Ÿข ๏ผˆ็™ปๅฃ‡่€…๏ผ‰ @niftyใƒˆใƒƒใƒ—ใƒšใƒผใ‚ธใฎ้–‹็™บใƒป้‹็”จๆ‹…ๅฝ“ใ€‚ ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ใซ้™ใ‚‰ใšใ€ใƒใƒƒใ‚ฏใ‚จใƒณใƒ‰ใ‚„ใ‚คใƒณใƒ•ใƒฉใ‚‚่งฆใฃใฆใ„ใพใ™ใ€‚ๆœ€่ฟ‘ใฏใƒ‡ใ‚ถใ‚คใƒณๅ‘จใ‚Šใ‚’ๅ‹‰ๅผทไธญใงใ™ใ€‚ ๆ–ฐ็”ฐ ไธ‡ๆ™บ ๏ผˆ็™ปๅฃ‡่€…๏ผ‰ ไธปใซWEBๅˆถไฝœใƒ‡ใ‚ฃใƒฌใ‚ฏใ‚ฟใƒผใ‚’ใ—ใฆใ„ใพใ™ใ€‚ ๆœ€่ฟ‘ใฏใ‚ขใƒ—ใƒชใฎUI่จญ่จˆใ‚„ๅ‹•็”ปใ‚ณใƒณใƒ†ใƒณใƒ„ไผ็”ป๏ฝž็ทจ้›†ใชใฉใ‚‚่กŒใฃใฆใ„ใพใ™ใ€‚ ใƒ‡ใ‚ถใ‚คใƒณใ‚„ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ๅ‘จใ‚Šใ€ๅˆๅฟƒ่€…ใ‚นใ‚ฟใƒผใƒˆใ ใฃใŸใฎใงไปŠใ‚‚็ตถ่ณ›ๅ‹‰ๅผทไธญใงใ™๏ผใ‚ˆใ‚ใ—ใใŠ้ก˜ใ„ใ—ใพใ™๏ผ ใŸใ‘ใ‚ใ„ใฉ ๏ผˆ็™ปๅฃ‡่€…๏ผ‰ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚ชใƒ—ใ‚ทใƒงใƒณใ‚ตใƒผใƒ“ใ‚นใฎ้–‹็™บใƒป้‹็”จๆ‹…ๅฝ“ใ‚’ใ—ใฆใ„ใพใ™ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰้–‹็™บใ‚’ใ•ใ‚‰ใซๆฅฝใ—ใใ™ใ‚‹ใŸใ‚ใซๆ—ฅใ€…้‚้€ฒใ—ใฆใ„ใพใ™๏ผ ้–ข ๆญฉๆญฆ ๏ผˆ็™ปๅฃ‡่€…๏ผ‰ ใƒ‹ใƒ•ใƒ†ใ‚ฃใƒใ‚คใƒณใƒˆใ‚ฏใƒฉใƒ–ใฎ้–‹็™บใƒป้‹็”จๆ‹…ๅฝ“ใ‚’ใ—ใฆใ„ใพใ™ใ€‚ ๆฅญๅ‹™ใงใฏใƒใƒƒใ‚ฏใ‚จใƒณใƒ‰็ณปใ‚’่กŒใฃใฆใ„ใพใ™ใŒใ€ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ๆŠ€่ก“ใ‚„ใ‚ขใ‚ฏใ‚ปใ‚ทใƒ“ใƒชใƒ†ใ‚ฃใซ่ˆˆๅ‘ณใŒใ‚ใ‚Šๅ‹‰ๅผทไธญใงใ™! ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ—ใงใฏไธ€็ท’ใซๅƒใไปฒ้–“ใ‚’ๅ‹Ÿ้›†ไธญใงใ™ ๆ–ฐๅ’ๆŽก็”จใ€ใ‚ญใƒฃใƒชใ‚ขๆŽก็”จใ‚’ๅฎŸๆ–ฝใ—ใฆใ„ใพใ™ใ€‚ใœใฒ ใƒชใ‚ฏใƒซใƒผใƒˆใ‚ตใ‚คใƒˆ ใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใŒๆฅญๅ‹™ใงๅญฆใ‚“ใ ใ“ใจใ‚„ใ‚คใƒ™ใƒณใƒˆๆƒ…ๅ ฑใ‚’ ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใƒ–ใƒญใ‚ฐ ใซใฆ็™บไฟกใ—ใฆใ„ใพใ™๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฎTwitterใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ไฝœใ‚Šใพใ—ใŸ NIFTY Tech Talkใฎใ“ใจใ‚„ใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฎๆดปๅ‹•ใ‚’็™บไฟกใ—ใฆใ„ใใพใ™ใ€‚ Tweets by NIFTYDevelopers ใ€ŒNIFTY Tech Day 2022ใ€ใ‚’้–‹ๅ‚ฌใ—ใพใ—ใŸ ๆŠ€่ก“ใ‚คใƒ™ใƒณใƒˆใ€ŒNIFTY Tech Day 2022ใ€ใฎใ‚ขใƒผใ‚ซใ‚คใƒ–ใฏใ“ใกใ‚‰ NIFTY Tech Day 2022 ใ‚ขใƒณใƒใƒใƒฉใ‚นใƒกใƒณใƒˆใƒใƒชใ‚ทใƒผ ็งใŸใกใฏไธ‹่จ˜ใฎใ‚ˆใ†ใชไบ‹ๆŸ„ใซ้–ขใ‚ใ‚‰ใšใ™ในใฆใฎๅ‚ๅŠ ่€…ใซใจใฃใฆๅฎ‰ๅ…จใงๆญ“่ฟŽใ•ใ‚Œใ‚‹ใ‚ˆใ†ใชๅ ดใ‚’ไฝœใ‚‹ใ“ใจใซๅŠชใ‚ใพใ™ใ€‚ ็คพไผš็š„ใ‚ใ‚‹ใ„ใฏๆณ•็š„ใชๆ€งใ€ๆ€ง่‡ช่ชใ€ๆ€ง่กจ็พ๏ผˆๅค–่ฆ‹ใฎๆ€ง๏ผ‰ใ€ๆ€งๆŒ‡ๅ‘ ๅนด้ฝขใ€้šœใŒใ„ใ€ๅฎนๅงฟใ€ไฝ“ๆ ผ ไบบ็จฎใ€ๆฐ‘ๆ—ใ€ๅฎ—ๆ•™๏ผˆ็„กๅฎ—ๆ•™ใ‚’ๅซใ‚€๏ผ‰ ๆŠ€่ก“ใฎ้ธๆŠž ใใ—ใฆไธ‹่จ˜ใฎใ‚ˆใ†ใชใƒใƒฉใ‚นใƒกใƒณใƒˆ่กŒ็‚บใ‚’ใ„ใ‹ใชใ‚‹ๅฝขใงใ‚ใฃใฆใ‚‚ๆฑบใ—ใฆ่จฑๅฎนใ—ใพใ›ใ‚“ใ€‚ ไธ้ฉๅˆ‡ใช็”ปๅƒใ€ๅ‹•็”ปใ€้Œฒ้Ÿณใฎๅ†็”Ÿ๏ผˆๆ€ง็š„ใช็”ปๅƒใชใฉ๏ผ‰ ็™บ่กจใ‚„ไป–ใฎใ‚คใƒ™ใƒณใƒˆใซๅฏพใ™ใ‚‹ๅฆจๅฎณ่กŒ็‚บ ใ“ใ‚Œใ‚‰ใซ้™ใ‚‰ใชใ„ๆ€ง็š„ๅซŒใŒใ‚‰ใ› ็™ปๅฃ‡่€…ใ€ไธปๅ‚ฌใ‚นใ‚ฟใƒƒใƒ•ใ‚‚ใ“ใฎใƒใƒชใ‚ทใƒผใฎๅฏพ่ฑกใจใชใ‚Šใพใ™ใ€‚ ใƒใƒฉใ‚นใƒกใƒณใƒˆ่กŒ็‚บใ‚’ใ‚„ใ‚ใ‚‹ใ‚ˆใ†ใซๆŒ‡็คบใ•ใ‚ŒใŸๅ ดๅˆใ€็›ดใกใซๅพ“ใ†ใ“ใจใŒๆฑ‚ใ‚ใ‚‰ใ‚Œใพใ™ใ€‚ใƒซใƒผใƒซใ‚’ๅฎˆใ‚‰ใชใ„ๅ‚ๅŠ ่€…ใฏใ€ไธปๅ‚ฌ่€…ใฎๅˆคๆ–ญใซใ‚ˆใ‚Šใ€้€€ๅ ดๅ‡ฆๅˆ†ใ‚„ไปŠๅพŒใฎใ‚คใƒ™ใƒณใƒˆใซ่ด่ฌ›่€…ใ€็™ปๅฃ‡่€…ใ€ใ‚นใ‚ฟใƒƒใƒ•ใจใ—ใฆ้–ขใ‚ใ‚‹ใ“ใจใ‚’็ฆๆญขใ—ใพใ™ใ€‚ ใ‚‚ใ—ใƒใƒฉใ‚นใƒกใƒณใƒˆใ‚’ๅ—ใ‘ใฆใ„ใ‚‹ใจๆ„Ÿใ˜ใŸใ‚Šใ€ไป–ใฎ่ชฐใ‹ใŒใƒใƒฉใ‚นใƒกใƒณใƒˆใ•ใ‚Œใฆใ„ใ‚‹ใ“ใจใซๆฐ—ใŒใคใ„ใŸๅ ดๅˆใ€ใพใŸใฏไป–ใซไฝ•ใ‹ใŠๅ›ฐใ‚Šใฎใ“ใจใŒใ‚ใ‚Œใฐใ€ใ™ใใซใ”้€ฃ็ตกใใ ใ•ใ„ใ€‚ โ€ปๆœฌๆ–‡็ซ ใฏKotlinFest Code of Conductใจใ—ใฆๅ…ฌ้–‹ใ•ใ‚ŒใŸๆ–‡็ซ ( https://github.com/KotlinFest/KotlinFest2018/blob/master/CODE-OF-CONDUCT.md )ใ‚’ๅ…ƒใซๆดพ็”Ÿใ—ใฆใ„ใพใ™ใ€‚ โ€ปๆœฌๆ–‡็ซ ใฏCreative Commons Zero ใƒฉใ‚คใ‚ปใƒณใ‚น( https://creativecommons.org/publicdomain/zero/1.0/ ) ใงๅ…ฌ้–‹ใ•ใ‚Œใฆใ„ใพใ™ใ€‚
ใฏใ˜ใ‚ใซ ใ“ใ‚“ใซใกใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพ ๅŸบๅนนใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ—ใฎ็Ÿณๅ‚ใงใ™ใ€‚ๆ™ฎๆฎตใฎๆฅญๅ‹™ใงใฏ่ชฒ้‡‘็ณปใ‚ทใ‚นใƒ†ใƒ ใฎ้–‹็™บ้‹็”จใ‚’ใ—ใฆใ„ใพใ™ใ€‚ ไปŠๅ›žใฏใ€็คพๅ†…ใฎใ‚ตใƒผใƒใƒผใ‚’็›ฃ่ฆ–ใ™ใ‚‹ใŸใ‚ใซPrometheusใ‚’่งฆใฃใฆใฟใพใ—ใŸใฎใงใ€ๅ…ฑๆœ‰ใ—ใŸใ„ใจๆ€ใ„ใพใ™ใ€‚ Prometheusใจใฏ PrometheusใฏOSSใฎใƒชใ‚ฝใƒผใ‚น็›ฃ่ฆ–ใ‚ทใ‚นใƒ†ใƒ ใงใ™ใ€‚ ็›ฃ่ฆ–ๅฏพ่ฑกใซ็›ฃ่ฆ–ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ๏ผˆExporter๏ผ‰ใ‚’ๅ…ฅใ‚Œใ‚‹ใ“ใจใงHTTP็ตŒ็”ฑใงใƒกใƒˆใƒชใ‚ฏใ‚นๅŽ้›†ใ‚’่กŒใ„ใพใ™ใ€‚Exporterใซใฏๆง˜ใ€…ใช็จฎ้กžใŒใ‚ใ‚Šใพใ™ใŒใ€ไปŠๅ›žใฏใƒญใ‚ฐ็›ฃ่ฆ–ใซ็”จใ„ใ‚‹grok-exporterใ‚’ไฝฟใฃใฆใฟใพใ™ใ€‚ ใพใŸใ€PrometheusใซใฏๅŽ้›†ใ—ใŸใƒ‡ใƒผใ‚ฟใ‚’ใ‚ฐใƒฉใƒ•่กจ็คบใ™ใ‚‹ๆฉŸ่ƒฝใŒใ‚ใ‚Šใพใ™ใŒใ€Prometheusๅ˜ไฝ“ใ ใจๆฉŸ่ƒฝใŒๅ……ๅฎŸใ—ใฆใ„ใพใ›ใ‚“ใ€‚ใใฎใŸใ‚ใ€ใƒ‡ใƒผใ‚ฟๅฏ่ฆ–ๅŒ–ใƒ„ใƒผใƒซใงใ‚ใ‚‹Grafanaใจ็ต„ใฟๅˆใ‚ใ›ใฆไฝฟใ‚ใ‚Œใ‚‹ใ“ใจใŒๅคšใ„ใ‚ˆใ†ใงใ™ใ€‚ ๅฎŸ้š›ใซใƒญใ‚ฐ็›ฃ่ฆ–ใ—ใฆใฟใ‚‹ Prometheusใฏdockerใ‚คใƒกใƒผใ‚ธใŒๆไพ›ใ•ใ‚Œใฆใ„ใ‚‹ใŸใ‚ใ€ใƒญใƒผใ‚ซใƒซใง็ฐกๅ˜ใซ่ฉฆใ™ใ“ใจใŒใงใใพใ™ใ€‚ไปŠๅ›žใฏPrometheusใ€Grafanaใ€็›ฃ่ฆ–ๅฏพ่ฑกใจใ—ใฆCentOSใฎใ‚ณใƒณใƒ†ใƒŠใ‚’docker-composeใ‚’็”จใ„ใฆ่ตทๅ‹•ใ—ใพใ™ใ€‚ docker-compose.yml ็›ฃ่ฆ–ๅฏพ่ฑกใฎใ‚ตใƒผใƒใƒผใ‚’ใ€Œtarget-serverใ€ใจใ—ใฆใ„ใพใ™ใ€‚ version: '3' services: prometheus: image: prom/prometheus:v2.41.0 container_name: prometheus volumes: - ./:/etc/prometheus/ - ./prometheus-data:/prometheus ports: - 9090:9090 network_mode: dockernet grafana: image: grafana/grafana:8.5.2 container_name: grafana volumes: - ./grafana-data:/var/lib/grafana ports: - 3000:3000 network_mode: dockernet target-server: image: centos:centos7 tty: true container_name: target-server ports: - 9144:9144 network_mode: dockernet prometheus.yml Prometheusใฎ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใงใ™ใ€‚็›ฃ่ฆ–ๅฏพ่ฑกใฎใ‚ตใƒผใƒใƒผใ‚’ใ“ใ“ใซ่จ˜่ผ‰ใ—ใฆใŠใใพใ™ใ€‚ global: scrape_interval: 15s external_labels: monitor: 'codelab-monitor' scrape_configs: - job_name: 'prometheus-test' static_configs: - targets: ['target-server:9144'] ใใ‚ŒใงใฏๅฎŸ้š›ใซ่ตทๅ‹•ใ—ใฆใ„ใใพใ™ใ€‚ docker compose up -d ็›ฃ่ฆ–ๅฏพ่ฑกใ‚ตใƒผใƒใƒผใซๅ…ฅใฃใฆgrok_exporterใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใพใ™ใ€‚ docker exec -it -u 0 target-server bash [root@9deda05f745d /]# yum install -y wget [root@9deda05f745d /]# cd usr/local/src/ [root@9deda05f745d src]# wget https://github.com/fstab/grok_exporter/releases/download/v1.0.0.RC5/grok_exporter-1.0.0.RC5.linux-amd64.zip [root@9deda05f745d src]# yum install -y unzip [root@9deda05f745d src]# unzip grok_exporter-1.0.0.RC5.linux-amd64.zip [root@9deda05f745d src]# mv grok_exporter-1.0.0.RC5.linux-amd64 ../grok_exporter [root@9deda05f745d src]# ไปฅไธ‹ใŒไปŠๅ›žใƒญใ‚ฐ็›ฃ่ฆ–ใ—ใŸใ„ใ‚ตใƒณใƒ—ใƒซใƒญใ‚ฐใƒ•ใ‚กใ‚คใƒซใจใชใ‚Šใพใ™ใ€‚ [root@9deda05f745d src]# cd ../grok_exporter [root@9deda05f745d grok_exporter]# head -5 example/exim-rejected-RCPT-examples.log 2016-04-18 09:33:27 H=(โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹) [โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹] F=<z2007tw@โ—‹โ—‹โ—‹.com.tw> rejected RCPT <alan.a168@โ—‹โ—‹โ—‹.net>: relay not permitted 2016-04-18 12:28:04 H=(โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹) [โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹] F=<z2007tw@โ—‹โ—‹โ—‹.com.tw> rejected RCPT <alan.a168@โ—‹โ—‹โ—‹.net>: relay not permitted 2016-04-18 19:16:30 H=(โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹) [โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹] F=<z2007tw@โ—‹โ—‹โ—‹.com.tw> rejected RCPT <alan.a168@โ—‹โ—‹โ—‹.net>: relay not permitted 2016-04-18 19:26:22 H=(โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹) [โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹] F=<z2007tw@โ—‹โ—‹โ—‹.com.tw> rejected RCPT <alan.a168@โ—‹โ—‹โ—‹.net>: relay not permitted 2016-04-26 04:41:25 H=(โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹) [โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹.โ—‹โ—‹โ—‹] F=<z2007tw@โ—‹โ—‹โ—‹.com.tw> rejected RCPT <alan.a168@โ—‹โ—‹โ—‹.net>: relay not permitted [root@9deda05f745d grok_exporter]# ไปฅไธ‹ใฎ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใซ็›ฃ่ฆ–่จญๅฎšใ‚’่จ˜่ผ‰ใ—ใพใ™ใ€‚ metricsใฎtypeใง็›ฃ่ฆ–ๅฏพ่ฑกใƒญใ‚ฐใ‹ใ‚‰ๅ–ๅพ—ใ™ใ‚‹ๅ€คใฎ็จฎ้กžใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ใ‚ตใƒณใƒ—ใƒซใงใฏใ€typeใ‚’ใ€Œcounterใ€ใจใ—ใฆใ€ใ‚จใƒฉใƒผใƒญใ‚ฐใฎไปถๆ•ฐใ‚’ๅ–ๅพ—ใ™ใ‚‹่จญๅฎšใŒ่จ˜่ผ‰ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ typeใซใฏไป–ใซใ‚‚gaugeใ‚„histogramใ€summaryใชใฉใŒใ‚ใ‚Šใ€ไพ‹ใˆใฐgaugeใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใจใ€ไธ€่‡ดใ™ใ‚‹ๅ„ใƒญใ‚ฐ่กŒใง่จ˜้Œฒใ•ใ‚Œใ‚‹ๆ•ฐๅ€คใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ [root@9deda05f745d grok_exporter]# cat example/config.yml global: config_version: 3 input: type: file path: ./example/exim-rejected-RCPT-examples.log readall: true # Read from the beginning of the file? False means we start at the end of the file and read only new lines. imports: - type: grok_patterns dir: ./patterns grok_patterns: - 'EXIM_MESSAGE [a-zA-Z ]*' metrics: - type: counter name: exim_rejected_rcpt_total help: Total number of rejected recipients, partitioned by error message. match: '%{EXIM_DATE} %{EXIM_REMOTE_HOST} F=<%{EMAILADDRESS}> rejected RCPT <%{EMAILADDRESS}>: %{EXIM_MESSAGE:message}' labels: error_message: '{{.message}}' logfile: '{{base .logfile}}' server: protocol: http port: 9144 [root@9deda05f745d grok_exporter]# ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใ‚’ๆŒ‡ๅฎšใ—ใฆgrok_exporterใ‚’่ตทๅ‹•ใ—ใพใ™ใ€‚ [root@9deda05f745d grok_exporter]# /usr/local/grok_exporter/grok_exporter --config=/usr/local/grok_exporter/example/config.yml & Grafanaใซใƒญใ‚ฐใ‚คใƒณใ—ใพใ™ใ€‚๏ผˆusername: admin / password: admin๏ผ‰ http://localhost:3000/login ใƒ‡ใƒผใ‚ฟใ‚ฝใƒผใ‚นใจใ—ใฆPrometheusใ‚’่จญๅฎšใ—ใพใ™ใ€‚ ่จญๅฎšโ†’Configurationโ†’Add data sourceใ‹ใ‚‰ใ€Prometheusใ‚’้ธๆŠžใ—ใฆ็”ปๅƒใฎใ‚ˆใ†ใซURLใ‚’่จญๅฎšใ€‚Save&testใ‚’ๆŠผไธ‹ใ—ใŸใ‚‰็ดไป˜ใ‘ๅฎŒไบ†ใงใ™ใ€‚ ใ‚ใจใฏDashboardใ‹ใ‚‰Panelใ‚’่ฟฝๅŠ ใ—ใฆใ€ๅฏ่ฆ–ๅŒ–ใ—ใŸใ„ใƒกใƒˆใƒชใ‚ฏใ‚นใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใงใ‚ฐใƒฉใƒ•ใ‚’่กจ็คบใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ไปฅไธ‹ใฎ็”ปๅƒใฏใ€ŒUnrouteable addressใ€ใฎใ‚ตใƒณใƒ—ใƒซใ‚จใƒฉใƒผใƒญใ‚ฐใŒไฝ•ไปถ็™บ็”Ÿใ—ใฆใ‚‹ใ‹ใ‚’่กจ็คบใ—ใฆใ„ใพใ™ใ€‚ ใŠใ‚ใ‚Šใซ Prometheusใ‚„GrafanaใฏไปŠใ‚‚้ ป็นใซใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใ•ใ‚ŒใฆใŠใ‚Šใ€UIใ‚„ไป•ๆง˜ๅค‰ๆ›ดใŒๅคšใ„ใŸใ‚ใ€ๅ‚่€ƒใซใงใใ‚‹ใƒŠใƒฌใƒƒใ‚ธใŒๅฐ‘ใชใ„ๅฐ่ฑกใงใ—ใŸใ€‚ ใงใ™ใŒใ€ไปŠๅ›ždockerใง่ฉฆใ—ใฆใฟใŸใ‚ˆใ†ใซๅ‹•ไฝœ็ขบ่ชใ™ใ‚‹ใ“ใจใฏๆฏ”่ผƒ็š„ใ‚„ใ‚Šใ‚„ใ™ใ„ใฎใงใ€่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไธ€ๅบฆ่งฆใฃใฆใฟใ‚‹ใจ้ข็™ฝใ„ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใฏใ˜ใ‚ใซ ใ“ใ‚“ใซใกใฏ๏ผๆ–ฐๅ’ๅ…ฅ็คพ4ๅนด็›ฎใฎๆพไธ‹ใงใ™ใ€‚็ฎก็†ไผš่จˆใƒปใƒ‡ใƒผใ‚ฟๅˆ†ๆžใƒฆใƒ‹ใƒƒใƒˆใง่ณผ่ฒทใƒ‡ใƒผใ‚ฟใ‚„ใŠๅฎขๆง˜ใฎๅฃฐใฎใƒ‡ใƒผใ‚ฟๅˆ†ๆžใ‚’ใ—ใฆใ„ใพใ™ใ€‚ ๅ…ˆๆ—ฅใ€ŒNIFTY Tech Talk #8 ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟๅˆ†ๆžใ€ใจใ„ใ†ใ‚คใƒ™ใƒณใƒˆใ‚’้–‹ๅ‚ฌใ—ใพใ—ใŸใ€‚ใใฎๆง˜ๅญใ‚’ใ”็ดนไป‹ใ—ใพใ™ใ€‚ ใ‚คใƒ™ใƒณใƒˆๆฆ‚่ฆ NIFTY Tech Talk ใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพใฎ็คพๅ“กใŒไธปๅ‚ฌใ™ใ‚‹ใƒˆใƒผใ‚ฏใ‚คใƒ™ใƒณใƒˆใงใ™ใ€‚ ๆœฌใ‚คใƒ™ใƒณใƒˆใงใฏใƒ‹ใƒ•ใƒ†ใ‚ฃ็คพๅ“กใŒๆฅญๅ‹™ใ‚’้€šใ˜ใฆๅญฆใ‚“ใ ใ“ใจใ‚’็™บไฟกใ—ใฆใ„ใพใ™ใ€‚ ไปŠๅ›žใฏใ€็ฌฌ8ๅ›ž็›ฎใจใชใ‚‹ใ€Œใƒ‡ใƒผใ‚ฟๅˆ†ๆžใ€ใซ้–ขใ™ใ‚‹ใƒ†ใƒผใƒžใง้–‹ๅ‚ฌใ—ใพใ—ใŸใ€‚ใƒ‡ใƒผใ‚ฟๅˆ†ๆžใซใฏๆง˜ใ€…ใช่ฆ–็‚นใŒใ‚ใ‚Šใพใ™ใŒใ€ไปŠๅ›žใฏ3ใคใฎ่ฆ–็‚นใ‹ใ‚‰ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟๅˆ†ๆžใซใคใ„ใฆ่ฉฑใ‚’ใ—ใพใ—ใŸใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟๅŸบ็›คใฎ่ฉฑ ใƒ‡ใƒผใ‚ฟใ‚จใƒณใ‚ธใƒ‹ใ‚ข่ฆ–็‚น Tableauใ€TableauServerใฎ็คพๅ†…ใฎๆดป็”จไบ‹ไพ‹ ใƒ‡ใƒผใ‚ฟใ‚ขใƒŠใƒชใ‚นใƒˆ่ฆ–็‚น ChatGPTใง่ณ‘ใ‚ใ†่‡ช็„ถ่จ€่ชžๅ‡ฆ็†ๆŠ€่ก“ใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟใ‚ตใ‚คใ‚จใƒณใ‚นใซใคใ„ใฆ ใƒ‡ใƒผใ‚ฟใ‚ตใ‚คใ‚จใƒณใƒ†ใ‚ฃใ‚นใƒˆ่ฆ–็‚น ไปŠๅ›žใฎ Tech Talk ใฎใ‚ขใƒผใ‚ซใ‚คใƒ–ใ‚’ YouTube ใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใฆใŠใ‚Šใพใ™ใ€‚ใœใฒใ”่ฆงใใ ใ•ใ„ใ€‚ ๅ†…ๅฎนใƒฌใƒใƒผใƒˆ ๅ„ใ‚ปใƒƒใ‚ทใƒงใƒณใ‹ใ‚‰ไธ€้ƒจๆŠœ็ฒ‹ใ—ใฆใ€ใฉใฎใ‚ˆใ†ใชๅ†…ๅฎนใ ใฃใŸใ‹ใ”็ดนไป‹ใ—ใŸใ„ใจๆ€ใ„ใพใ™ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟๅŸบ็›คใฎ่ฉฑ -ใƒ‡ใƒผใ‚ฟใ‚จใƒณใ‚ธใƒ‹ใ‚ข่ฆ–็‚นใ‹ใ‚‰ ไผšๅ“กใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ—ใฎN1!ใƒ‡ใƒผใ‚ฟใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒˆใฎ้ป’็พฝใ•ใ‚“ใŒใ€ๅฎŸ้š›ใซ็คพๅ†…ใงใƒ‡ใƒผใ‚ฟๅŸบ็›คใ‚’ไฝœใฃใŸๆ™‚ใฎ็ตŒ้จ“ใ‹ใ‚‰ใ€ใƒ‡ใƒผใ‚ฟๅŸบ็›คใฏใฉใฎใ‚ˆใ†ใช่€ƒใˆใงไฝœใฃใฆใ„ใ‘ใฐใ‚ˆใ„ใฎใ‹ใ‚’่งฃ่ชฌใ—ใพใ—ใŸใ€‚ ใ“ใ“ใซ่กŒใ็€ใ„ใŸ็†็”ฑใจใ—ใฆๆœ€ๅˆใฏ็คพๅ†…ใฎใƒ‡ใƒผใ‚ฟใ‚’้›†ใ‚ใ‚‹ใ“ใจใ‚’็›ฎ็š„ใจใ—ใฆใƒ‡ใƒผใ‚ฟๅŸบ็›คใ‚’ไฝœใฃใฆใ„ใŸใฎใงใ™ใŒๆง˜ใ€…ใชไธ้ƒฝๅˆใŒใงใฆใใŸใ€ใจใ„ใ†ใจใ“ใ‚ใ‹ใ‚‰ใงใ—ใŸใ€‚ ็ต‚ใ‚ใ‚‰ใชใ„ใƒ‡ใƒผใ‚ฟๅŽ้›† ใ‚ใฃใŸใ‚‰ไฝฟใ†ใ€ไพฟๅˆฉใ‹ใ‚‚ใจใ„ใ†ใƒ‡ใƒผใ‚ฟใ‚’้›†ใ‚ใ‚‹ใŒไฝฟใ‚ใชใ„ ๆดป็”จใฏ้€ฒใพใšใ€ๆ™‚้–“ใ‚‚ๆบถใ‘ใ‚‹ ใใ“ใง่€ƒใˆใ‚’ๆ–ฐใŸใซใ—ใ€ใƒ‡ใƒผใ‚ฟๅˆ†ๆžใจใ‚ปใƒƒใƒˆใงใƒ‡ใƒผใ‚ฟๅŸบ็›คใ‚’่€ƒใˆใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใจใ†ใพใๅ›žใ‚Šๅง‹ใ‚ใพใ—ใŸใ€‚ ใพใŸใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟๅŸบ็›คใฎๅค‰้ทใ‚‚็ดนไป‹ใ—ใฆใ„ใพใ™ใ€‚ ไปŠใฏdbtใชใฉใฎๅ‘จ่พบๆŠ€่ก“ใ€ใƒ„ใƒผใƒซ้กžใŒ้€ฒๆญฉใ—ใฆใ„ใ‚‹ใ“ใจใงใƒ‡ใƒผใ‚ฟใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’ๅง‹ใ‚ใ‚‹้š›ใซไธ‹้ง„ใŒๅฑฅใใ‚„ใ™ใ„๏ผˆๅง‹ใ‚ใ‚„ใ™ใ„๏ผ‰็’ฐๅขƒใซใชใฃใฆใ„ใ‚‹ใ“ใจใ‚‚่ชฌๆ˜Žใ„ใŸใ ใใพใ—ใŸใ€‚ Tableauใ€TableauServerใฎ็คพๅ†…ใฎๆดป็”จไบ‹ไพ‹ -ใƒ‡ใƒผใ‚ฟใ‚ขใƒŠใƒชใ‚นใƒˆ่ฆ–็‚นใ‹ใ‚‰ ไบ‹ๆฅญๆŽจ้€ฒใ‚ฐใƒซใƒผใƒ—ใ€N1!Data Ninjaใฎๆ‰“็Ÿขใ•ใ‚“ใ‚ˆใ‚Šใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏBIใƒ„ใƒผใƒซใงใ‚ใ‚‹Tableauใ‚’ใฉใฎใ‚ˆใ†ใซไฝฟใฃใฆใ„ใ‚‹ใฎใ‹ใ‚’่งฃ่ชฌใ„ใŸใ ใใพใ—ใŸใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏBIใƒ„ใƒผใƒซใจใ—ใฆTableauใ‚’ๅˆฉ็”จใ—ใฆใ„ใพใ™ใŒใ€Tableauใ‚’้ธๅฎšใ—ใŸ็†็”ฑใจใ—ใฆๅคงใใ3ใคใ‚ใ’ใฆใ„ใพใ™ใ€‚ ๆŽข็ดข็š„ใชๅˆ†ๆžใŒใ—ใ‚„ใ™ใ„ใ“ใจ ๆง˜ใ€…ใช็จฎ้กžใฎใƒ‡ใƒผใ‚ฟใ‚ฝใƒผใ‚นใฎใƒ‡ใƒผใ‚ฟใ‚’็ตๅˆใ—ใฆไฝฟใˆใ‚‹ใ“ใจ ใ‚นใ‚ฑใƒผใƒซใซๅˆใ‚ใ›ใŸ่ฆๆจกใƒปใ‚ณใ‚นใƒˆใงๅฐŽๅ…ฅใŒใงใใ‚‹ใ“ใจ Tableauใ‚’ไฝฟใ†ใ“ใจใงๅฎšๆœŸ็š„ใซๆœ€ๆ–ฐใฎ็Šถๆ…‹ใซใƒ•ใ‚ฉใƒผใ‚ซใ‚นใ•ใ‚ŒใŸ็Šถๆ…‹ใง้‡่ฆใชๆ•ฐๅ€คใ‚’่ฆ‹ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ใพใŸใ€ๆŽข็ดขใŒใ—ใ‚„ใ™ใ„ๆง‹้€ ใซใชใฃใฆใ„ใ‚‹ใŸใ‚ใ‚นใƒ”ใƒผใƒ‰ๆ„Ÿใ‚’ๆŒใฃใŸๅฏพๅฟœใ‚’่กŒใ†ใ“ใจใŒใงใใพใ™ใ€‚ ใใ—ใฆใ€ๆณจๅŠ›่ชฒ้กŒใซๅฏพใ™ใ‚‹ๆŒ‡ๆจ™ใฎๅ…จ็คพๅ…ฑๆœ‰ใจใ—ใฆใ‚‚TableauServerใ‚’ไฝฟใ†ใ“ใจใง็ฐกๅ˜ใซๅ…ฑๆœ‰ใ‚’่กŒใ†ใ“ใจใŒใงใใฆใ„ใพใ™ใ€‚ ChatGPTใง่ณ‘ใ‚ใ†่‡ช็„ถ่จ€่ชžๅ‡ฆ็†ๆŠ€่ก“ใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟใ‚ตใ‚คใ‚จใƒณใ‚นใซใคใ„ใฆ -ใƒ‡ใƒผใ‚ฟใ‚ตใ‚คใ‚จใƒณใƒ†ใ‚ฃใ‚นใƒˆ่ฆ–็‚น ๆœ€ๅพŒใซไบ‹ๆฅญๆŽจ้€ฒใ‚ฐใƒซใƒผใƒ—ใ€N1!ใƒ‡ใƒผใ‚ฟใ‚ตใ‚คใ‚จใƒณใƒ†ใ‚ฃใ‚นใƒˆใฎ็€ฌๅทใ•ใ‚“ใ‹ใ‚‰ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟใ‚ตใ‚คใ‚จใƒณใ‚นใซใคใ„ใฆใฉใฎใ‚ˆใ†ใชใ“ใจใ‚’ใ‚„ใฃใฆใ„ใ‚‹ใฎใ‹่งฃ่ชฌใ„ใŸใ ใใพใ—ใŸใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใ‚‚ใƒ‡ใƒผใ‚ฟใ‚ตใ‚คใ‚จใƒณใ‚นใฎๆŠ€่ก“ใ‚’็”จใ„ใฆใŠใ‚Šใƒ‹ใƒ•ใƒ†ใ‚ฃใƒ‹ใƒฅใƒผใ‚นใงใฎๆดป็”จไบ‹ไพ‹ใ‚„ใŠๅฎขๆง˜ใ‚ขใƒณใ‚ฑใƒผใƒˆใฎ่ฆๆœ›ๆŠฝๅ‡บใซไฝฟ็”จใ—ใฆใ„ใพใ™ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟๆดป็”จใฏใ€ŒใŠๅฎขๆง˜็†่งฃใ€ใฎใŸใ‚ใซ่กŒใฃใฆใ„ใ‚‹ใจใ„ใ†ใจใ“ใ‚ใ‚’ใƒ™ใƒผใ‚นใซใ—ใฆใ„ใพใ™ใ€‚ ใพใŸใ€ใƒ‡ใƒผใ‚ฟใ‚ตใ‚คใ‚จใƒณใƒ†ใ‚ฃใ‚นใƒˆใจใ„ใ†็ซ‹ๅ ดใง้ข็™ฝใ„ใจใ“ใ‚ใ€้‡่ฆใชใจใ“ใ‚’ใ‚’่ชฌๆ˜Žใ—ใฆใ„ใŸใ ใใพใ—ใŸใ€‚ ใพใจใ‚ ไปŠๅ›žใฎ Tech Talk ใงใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ‡ใƒผใ‚ฟๅˆ†ๆžใซใคใ„ใฆ3ใคใฎ่ฆ–็‚นใ‹ใ‚‰็ดนไป‹ใ—ใพใ—ใŸใ€‚ 1 ๆ™‚้–“ใจใ„ใ†็Ÿญใ„ๆž ใ ใฃใŸใฎใงใ€ไปŠๅ›ž่ฉฑใ—ใใ‚Œใชใ‹ใฃใŸใ‚‚ใฎใ‚‚ใ‚ใ‚Šใพใ™ใŒใ€ๅ‚่€ƒใซใงใใ‚‹ใ‚‚ใฎใŒใ‚ใ‚Œใฐๅนธใ„ใงใ™ใ€‚ ไปŠๅพŒใ‚‚ NIFTY Tech Talk ใฏ็ถ™็ถšใ—ใฆๅฎŸๆ–ฝใ—ใฆใ„ใใพใ™ใฎใงใ€ใœใฒใ”ๅ‚ๅŠ ใใ ใ•ใ„ใ€‚ ใพใŸใ‚ปใƒƒใ‚ทใƒงใƒณใฎไธญใงใ‚‚็ดนไป‹ใ—ใพใ—ใŸใŒใ€ใ“ใฎๅบฆ2023ๅนด2ๆœˆใซ้–‹ๅ‚ฌไบˆๅฎšใฎDevelopers Summit๏ผˆใƒ‡ใƒ–ใ‚ตใƒŸ๏ผ‰ใซใ‚‚ไธญๆ‘ใŒ ใŸใฃใŸ1ไบบใ‹ใ‚‰ๅง‹ใ‚ใฆๆทฑๅฑคๅญฆ็ฟ’ใซใ‚ˆใ‚‹ใƒ‹ใƒฅใƒผใ‚น่ฆ็ด„ใ‚’ใƒ—ใƒญใƒ€ใ‚ฏใƒˆใซๅฎŸ่ฃ…ใ—ใŸๆ–นๆณ•๏ฝžใƒ•ใ‚กใƒผใ‚นใƒˆใƒšใƒณใ‚ฎใƒณใงใ‚„ใ‚Šใใ‚‹ๅŠ›๏ฝž ใจใ—ใฆใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’่กŒใ†ไบˆๅฎšใงใ™ใ€‚่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏใœใฒ่ฆ–่ดใ‚’ใŠใญใŒใ„ใ—ใพใ™๏ผ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใ‚คใƒ™ใƒณใƒˆๆฆ‚่ฆ NIFTY Tech Talkใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพใฎ็คพๅ“กใŒไธปๅ‚ฌใ™ใ‚‹ใƒˆใƒผใ‚ฏใ‚คใƒ™ใƒณใƒˆใงใ™ใ€‚ ๆœฌใ‚คใƒ™ใƒณใƒˆใงใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ—ใฎ็คพๅ“กใŒๆฅญๅ‹™ใ‚’้€šใ˜ใฆๅญฆใ‚“ใ ใ“ใจใ‚’็™บไฟกใ—ใฆใ„ใพใ™๏ผ 2023ๅนดๆœ€ๅˆใฎใƒ†ใƒผใƒžใฏใ€ŒLTๅคงไผšใ€ใงใ™ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏ้•ทๅนดๅฎšๆœŸ็š„ใซ็คพๅ†…LTๅคงไผšใ‚’ๅฎŸๆ–ฝใ—ใฆใŠใ‚Šใ€ใƒใƒฉใ‚จใƒ†ใ‚ฃใซ้ฃ›ใ‚“ใ ็™บ่กจใŒใชใ•ใ‚Œใฆใ„ใพใ™ใ€‚ ไปŠๅ›žใฏใใ‚“ใชLTๅคงไผšใฎ้›ฐๅ›ฒๆฐ—ใ‚’ๆ„Ÿใ˜ๅ–ใ‚Œใ‚‹็™บ่กจใ‚’้ธใ‚Šใ™ใใฃใฆใŠไผใˆใ—ใพใ™ใ€‚ ๆฆ‚่ฆ ๆ—ฅ็จ‹๏ผš1ๆœˆ27ๆ—ฅ๏ผˆ้‡‘๏ผ‰18:00ใ€œ20:00 ้…ไฟกๆ–นๆณ•๏ผšRemo ่ฆ–่ด็’ฐๅขƒ๏ผšใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆๆŽฅ็ถšใŒๅฏ่ƒฝใชPC๏ผˆใƒ–ใƒฉใ‚ฆใ‚ถใฏChromeใ€EdgeๆŽจๅฅจ๏ผ‰ ๅ‚ๅŠ ๆ–นๆณ• RemoใซใฆๅฎŸๆ–ฝใ„ใŸใ—ใพใ™ใ€‚ RemoใฎURLใฏๆฑบๅฎšๅพŒใ€ๅ‚ๅŠ ่€…ใธใฎๆƒ…ๅ ฑๆฌ„ใซ่จ˜่ผ‰ใ„ใŸใ—ใพใ™ใ€‚ ใ“ใ‚“ใชๆ–นใซใŠใ™ใ™ใ‚ ไป–็คพใฎLTๅคงไผšใฎ้›ฐๅ›ฒๆฐ—ใ‚’็Ÿฅใ‚ŠใŸใ„ๆ–น ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎๆŠ€่ก“ใ‚„้ขจๅœŸใซ่ˆˆๅ‘ณใŒใ‚ใ‚‹ๆ–น ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚จใƒณใ‚ธใƒ‹ใ‚ขใจ่ฉฑใ—ใฆใฟใŸใ„ๆ–น ใ‚ฟใ‚คใƒ ใƒ†ใƒผใƒ–ใƒซ ๆ™‚้–“ ใ‚ณใƒณใƒ†ใƒณใƒ„ 18:00 – 18:05 ใ‚ชใƒผใƒ—ใƒ‹ใƒณใ‚ฐ๏ผ‹ไผš็คพ็ดนไป‹ 18:05 – 18:15 ใƒ‹ใƒ•ใƒ†ใ‚ฃLTๅคงไผšใซใคใ„ใฆ 18:15 – 18:22 LT1 ๅŠน็އๅŒ–ๅฐใƒใ‚ฟ้›† 18:22 – 18:29 LT2 ๆ–ฐไบบใฎใ™ใ‚ใ‚ 18:29 – 18:36 LT3 AI็”ปๅƒ็”Ÿๆˆใง็ฅž็ตตๅธซใซใชใ‚Œใ‚‹ไป•็ต„ใฟใ‚’ใ‚„ใ•ใ—ใ่ชฌๆ˜Žใ™ใ‚‹ 18:36 – 18:43 ใ‚ฒใ‚นใƒˆๆž 1 18:43 – 18:50 ใ‚ฒใ‚นใƒˆๆž 2 18:50 – 18:55 ใพใจใ‚๏ผ‹ๆ‡‡่ฆชไผšใฎใ”ๆกˆๅ†… 18:55 – 20:00 ๆ‡‡่ฆชไผš โ€ป ๅ„LTใฏ7ๅˆ†ใจใ—ใพใ™ โ€ป ใ‚ฒใ‚นใƒˆ็™ปๅฃ‡่€…ใŒใ„ใชใ„ๅ ดๅˆใซใฏไปฅ้™ใฎไบˆๅฎšใ‚’็นฐใ‚ŠไธŠใ’ใพใ™ ใƒ†ใƒผใƒž ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎ็คพๅ†…LTๅคงไผšใงๅ„ช็ง€็™บ่กจ่ณžใ‚’ๅ—่ณžใ—ใŸ่‹ฅๆ‰‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใŒ็™ปๅฃ‡ใ„ใŸใ—ใพใ™ใ€‚ ใƒใƒฉใ‚จใƒ†ใ‚ฃ่ฑŠใ‹ใชLTใ‹ใ‚‰ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎ้›ฐๅ›ฒๆฐ—ใ‚’ๆ„Ÿใ˜ๅ–ใฃใฆใ„ใŸใ ใ‘ใ‚Œใฐๅนธใ„ใงใ™ใ€‚ ็™ปๅฃ‡่€…ใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซ ๅฐๆตฆ ็”ฑไฝณ๏ผˆ็™ปๅฃ‡่€…๏ผ‰ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพ ใ‚คใƒณใƒ•ใƒฉใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ— ็คพๅ†…ๆƒ…ๅ ฑใ‚ทใ‚นใƒ†ใƒ ใƒใƒผใƒ  ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎLTๅคงไผšใฎไผ็”ปใ€้‹ๅ–ถใ‚’ใ‚„ใฃใฆใ„ใ‚‹ไบบใงใ™ใ€‚ ๆ™ฎๆฎตใฎๆฅญๅ‹™ใฏๆƒ…ใ‚ทใ‚นใงใ€ใ‚นใ‚ฏใƒฉใƒ ใƒใƒผใƒ ใฎใ‚นใ‚ฏใƒฉใƒ ใƒžใ‚นใ‚ฟใƒผใ‚’ใ‚„ใฃใŸใ‚Šใ—ใฆใ„ใพใ™ใ€‚ ๅ—ๅท ๅคงๆจน๏ผˆLT๏ผ‰ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพใ€€ๅŸบๅนนใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ—ใ€€ใ‚ตใƒผใƒ“ใ‚นใ‚คใƒณใƒ•ใƒฉใƒใƒผใƒ  ๆ–ฐๅ’ๅ…ฅ็คพ3ๅนด็›ฎใ€‚ใ‚ทใƒณใ‚ฐใƒซใ‚ตใ‚คใƒณใ‚ชใƒณใ‚„ใƒฆใƒผใ‚ถใƒผใ‚ตใ‚คใƒณใ‚ขใƒƒใƒ—ใชใฉใฎ้–‹็™บใ‚„้‹็”จใ‚’ๆ‹…ๅฝ“ใ€‚ๅŠน็އๅŒ–ใ€่‡ชๅ‹•ๅŒ–ใŒๅฅฝใใ€‚ ๆนŠ่ฐท ใฎใžใฟ ๏ผˆLT๏ผ‰ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพใ€€ๅŸบๅนนใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ—ใ€€ใ‚ตใƒผใƒ“ใ‚นใ‚คใƒณใƒ•ใƒฉใƒใƒผใƒ  ๆ–ฐๅ’ๅ…ฅ็คพ3ๅนด็›ฎใ€‚ไธปใซ้กงๅฎขๆƒ…ๅ ฑ็ฎก็†ใ‚ทใ‚นใƒ†ใƒ ใ‚„ใ‚ทใƒณใ‚ฐใƒซใ‚ตใ‚คใƒณใ‚ชใƒณใชใฉใฎ้–‹็™บใ‚„้‹็”จใ‚’ๆ‹…ๅฝ“ใ€‚็‰นๆŠ€ใฏ่ตทๅบŠใงใ™ใ€‚ ไธญๆ‘ ไผŠๅน๏ผˆLT๏ผ‰ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพ ไผšๅ“กใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ— ็ฌฌไบŒ้–‹็™บใƒใƒผใƒ  ๆ–ฐๅ’ๅ…ฅ็คพ4ๅนด็›ฎใ€‚ใƒ‹ใƒ•ใƒ†ใ‚ฃใƒ‹ใƒฅใƒผใ‚นใฎ้–‹็™บใƒป้‹็”จใ‚’ๆ‹…ๅฝ“ใ—ใ€ๆœ€่ฟ‘ใฏใƒขใƒ€ใƒณใชใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰้–‹็™บใ‚’ๅญฆ็ฟ’ไธญใ€‚็”ทๅฅณๆททๆˆใƒใ‚ขใƒชใƒผใƒ‡ใ‚ฃใƒณใ‚ฐๅ…ƒๆ—ฅๆœฌไปฃ่กจใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ—ใงใฏไธ€็ท’ใซๅƒใไปฒ้–“ใ‚’ๅ‹Ÿ้›†ไธญใงใ™ ๆ–ฐๅ’ๆŽก็”จใ€ใ‚ญใƒฃใƒชใ‚ขๆŽก็”จใ‚’ๅฎŸๆ–ฝใ—ใฆใ„ใพใ™ใ€‚ใœใฒ ใƒชใ‚ฏใƒซใƒผใƒˆใ‚ตใ‚คใƒˆ ใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใŒๆฅญๅ‹™ใงๅญฆใ‚“ใ ใ“ใจใ‚„ใ‚คใƒ™ใƒณใƒˆๆƒ…ๅ ฑใ‚’ ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใƒ–ใƒญใ‚ฐ ใซใฆ็™บไฟกใ—ใฆใ„ใพใ™๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฎTwitterใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ไฝœใ‚Šใพใ—ใŸ NIFTY Tech Talkใฎใ“ใจใ‚„ใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฎๆดปๅ‹•ใ‚’็™บไฟกใ—ใฆใ„ใใพใ™ใ€‚ Tweets by NIFTYDevelopers ใ€ŒNIFTY Tech Day 2022ใ€ใ‚’้–‹ๅ‚ฌใ—ใพใ—ใŸ ๆŠ€่ก“ใ‚คใƒ™ใƒณใƒˆใ€ŒNIFTY Tech Day 2022ใ€ใฎใ‚ขใƒผใ‚ซใ‚คใƒ–ใฏใ“ใกใ‚‰ NIFTY Tech Day 2022 ใ‚ขใƒณใƒใƒใƒฉใ‚นใƒกใƒณใƒˆใƒใƒชใ‚ทใƒผ ็งใŸใกใฏไธ‹่จ˜ใฎใ‚ˆใ†ใชไบ‹ๆŸ„ใซ้–ขใ‚ใ‚‰ใšใ™ในใฆใฎๅ‚ๅŠ ่€…ใซใจใฃใฆๅฎ‰ๅ…จใงๆญ“่ฟŽใ•ใ‚Œใ‚‹ใ‚ˆใ†ใชๅ ดใ‚’ไฝœใ‚‹ใ“ใจใซๅŠชใ‚ใพใ™ใ€‚ ็คพไผš็š„ใ‚ใ‚‹ใ„ใฏๆณ•็š„ใชๆ€งใ€ๆ€ง่‡ช่ชใ€ๆ€ง่กจ็พ๏ผˆๅค–่ฆ‹ใฎๆ€ง๏ผ‰ใ€ๆ€งๆŒ‡ๅ‘ ๅนด้ฝขใ€้šœใŒใ„ใ€ๅฎนๅงฟใ€ไฝ“ๆ ผ ไบบ็จฎใ€ๆฐ‘ๆ—ใ€ๅฎ—ๆ•™๏ผˆ็„กๅฎ—ๆ•™ใ‚’ๅซใ‚€๏ผ‰ ๆŠ€่ก“ใฎ้ธๆŠž ใใ—ใฆไธ‹่จ˜ใฎใ‚ˆใ†ใชใƒใƒฉใ‚นใƒกใƒณใƒˆ่กŒ็‚บใ‚’ใ„ใ‹ใชใ‚‹ๅฝขใงใ‚ใฃใฆใ‚‚ๆฑบใ—ใฆ่จฑๅฎนใ—ใพใ›ใ‚“ใ€‚ ไธ้ฉๅˆ‡ใช็”ปๅƒใ€ๅ‹•็”ปใ€้Œฒ้Ÿณใฎๅ†็”Ÿ๏ผˆๆ€ง็š„ใช็”ปๅƒใชใฉ๏ผ‰ ็™บ่กจใ‚„ไป–ใฎใ‚คใƒ™ใƒณใƒˆใซๅฏพใ™ใ‚‹ๅฆจๅฎณ่กŒ็‚บ ใ“ใ‚Œใ‚‰ใซ้™ใ‚‰ใชใ„ๆ€ง็š„ๅซŒใŒใ‚‰ใ› ็™ปๅฃ‡่€…ใ€ไธปๅ‚ฌใ‚นใ‚ฟใƒƒใƒ•ใ‚‚ใ“ใฎใƒใƒชใ‚ทใƒผใฎๅฏพ่ฑกใจใชใ‚Šใพใ™ใ€‚ ใƒใƒฉใ‚นใƒกใƒณใƒˆ่กŒ็‚บใ‚’ใ‚„ใ‚ใ‚‹ใ‚ˆใ†ใซๆŒ‡็คบใ•ใ‚ŒใŸๅ ดๅˆใ€็›ดใกใซๅพ“ใ†ใ“ใจใŒๆฑ‚ใ‚ใ‚‰ใ‚Œใพใ™ใ€‚ใƒซใƒผใƒซใ‚’ๅฎˆใ‚‰ใชใ„ๅ‚ๅŠ ่€…ใฏใ€ไธปๅ‚ฌ่€…ใฎๅˆคๆ–ญใซใ‚ˆใ‚Šใ€้€€ๅ ดๅ‡ฆๅˆ†ใ‚„ไปŠๅพŒใฎใ‚คใƒ™ใƒณใƒˆใซ่ด่ฌ›่€…ใ€็™ปๅฃ‡่€…ใ€ใ‚นใ‚ฟใƒƒใƒ•ใจใ—ใฆ้–ขใ‚ใ‚‹ใ“ใจใ‚’็ฆๆญขใ—ใพใ™ใ€‚ ใ‚‚ใ—ใƒใƒฉใ‚นใƒกใƒณใƒˆใ‚’ๅ—ใ‘ใฆใ„ใ‚‹ใจๆ„Ÿใ˜ใŸใ‚Šใ€ไป–ใฎ่ชฐใ‹ใŒใƒใƒฉใ‚นใƒกใƒณใƒˆใ•ใ‚Œใฆใ„ใ‚‹ใ“ใจใซๆฐ—ใŒใคใ„ใŸๅ ดๅˆใ€ใพใŸใฏไป–ใซไฝ•ใ‹ใŠๅ›ฐใ‚Šใฎใ“ใจใŒใ‚ใ‚Œใฐใ€ใ™ใใซใ”้€ฃ็ตกใใ ใ•ใ„ใ€‚ โ€ปๆœฌๆ–‡็ซ ใฏKotlinFest Code of Conductใจใ—ใฆๅ…ฌ้–‹ใ•ใ‚ŒใŸๆ–‡็ซ ( https://github.com/KotlinFest/KotlinFest2018/blob/master/CODE-OF-CONDUCT.md )ใ‚’ๅ…ƒใซๆดพ็”Ÿใ—ใฆใ„ใพใ™ใ€‚ โ€ปๆœฌๆ–‡็ซ ใฏCreative Commons Zero ใƒฉใ‚คใ‚ปใƒณใ‚น( https://creativecommons.org/publicdomain/zero/1.0/ ) ใงๅ…ฌ้–‹ใ•ใ‚Œใฆใ„ใพใ™ใ€‚
ใฏใ˜ใ‚ใซ ใ“ใ‚“ใซใกใฏใ€‚ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒใƒผใƒ ใฎๆทป้‡Ž้šผ็Ÿขใจ็”ณใ—ใพใ™ใ€‚ ไปŠๅ›žใ€ๅ†ฌๅญฃใฎใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—๏ผˆ12/09 ้–‹ๅ‚ฌ๏ผ‰ใซ่ฌ›ๅธซใจใ—ใฆๅ‚ๅŠ ใ—ใพใ—ใŸใ€‚ ใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใซใคใ„ใฆ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏๆ–ฐๅ’ๆŽก็”จๆดปๅ‹•ใฎไธ€็’ฐใจใ—ใฆใ€ใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใ‚’้–‹ๅ‚ฌใ—ใฆใ„ใพใ™ใ€‚ ็พๅœจใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏไธ‹่จ˜ใฎใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใ‚’ๅฎŸๆ–ฝใ—ใฆใ„ใพใ™ใ€‚ ใ‚นใ‚ฏใƒฉใƒ ไฝ“้จ“ๆผ”็ฟ’ใ‚ณใƒผใ‚น ใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒๅฏพๅฟœๆผ”็ฟ’ใ‚ณใƒผใ‚น ใ‚ทใ‚นใƒ†ใƒ ้šœๅฎณๅฏพๅฟœๆผ”็ฟ’ใ‚ณใƒผใ‚น ใ‚ตใƒผใƒ“ใ‚นไผ็”ปใ‚ณใƒผใ‚น ่ฉณใ—ใใฏใ€ ใ“ใกใ‚‰ ใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚ ๆœฌ่จ˜ไบ‹ใงใฏใ€ใใฎ4ใคใฎใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใฎไธญใงๅ…ˆๆ—ฅ้–‹ๅ‚ฌใ—ใŸใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒๅฏพๅฟœๆผ”็ฟ’ใ‚ณใƒผใ‚นใซใคใ„ใฆ็ดนไป‹ใ•ใ›ใฆใ„ใŸใ ใใพใ™ใ€‚ ๆœฌใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใฎใŠใ™ใ™ใ‚ใƒใ‚คใƒณใƒˆ๏ผ 1dayใงๆ‰‹่ปฝใซๅฎŸ้š›ใฎใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒใธใฎๅฏพๅฟœใ‚’ไฝ“้จ“ใงใใ€ISPใซใคใ„ใฆใ‚‚็Ÿฅใ‚‹ใ“ใจใŒใงใใ€ใชใŠใ‹ใคใƒ‹ใƒ•ใƒ†ใ‚ฃใฎ้›ฐๅ›ฒๆฐ—ใ‚‚ๆ„Ÿใ˜ใ‚‰ใ‚Œใ‚‹ใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใงใ™ใ€‚๏ผˆๅฟ…่ฆใช็‰ฉใฏใ€PCใฎใฟใงใ™ใ€‚๏ผ‰ ใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒๅฏพๅฟœๆผ”็ฟ’ใ‚ณใƒผใ‚นๆฆ‚่ฆ ใ‚คใƒณใ‚ฟใƒผใƒณๆœŸ้–“ 1day๏ผˆๅˆๅพŒใฎใฟ๏ผ‰ ้–‹ๅ‚ฌๆ—ฅ็จ‹๏ผˆ2022ๅนดๅบฆใฎๅ ดๅˆ๏ผ‰ ๅค2ๅ›ž๏ผˆ2022/08/26ใ€2022/09/02๏ผ‰ ๅ†ฌ2ๅ›ž๏ผˆ2022/12/02ใ€2022/12/09๏ผ‰ ้–‹ๅ‚ฌๅฝขๅผ Zoom๏ผ‹Slackใซใ‚ˆใ‚‹ใ‚ชใƒณใƒฉใ‚คใƒณๅฎŸๆ–ฝ ใ‚ฟใ‚คใƒ ใ‚นใ‚ฑใ‚ธใƒฅใƒผใƒซ ใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ๅ†…ๅฎน็ดนไป‹ ๆœฌใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใงใฏๆœ€ๅˆใซๅบงๅญฆใ‚’่กŒใ„ใ€ๅพŒๅŠใฏใ‚ฐใƒซใƒผใƒ—ใซๅˆ†ใ‹ใ‚Œใฆใ‚ฐใƒซใƒผใƒ—ๆผ”็ฟ’ใ‚’่กŒใ„ใพใ™ใ€‚ ๅบงๅญฆใซใคใ„ใฆ ๅบงๅญฆใงใฏใ€ไปฅไธ‹ใฎๅ†…ๅฎนใซใคใ„ใฆใฎ่ฌ›็พฉใ‚’ใ—ใพใ™ใ€‚ ISPใƒปใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ ๆ˜จไปŠใฎ็คพไผšๆƒ…ๅ‹ขใ‚„ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใฎๅŸบ็คŽ็š„ใช็Ÿฅ่ญ˜ใซใคใ„ใฆ ่ณชๅ•็ญ‰ใ‚‚็”จๆ„ใ•ใ‚Œใฆใ„ใฆใ€ใฟใ‚“ใชใงๆฅฝใ—ใฟใคใคๅญฆในใพใ™ใ€‚ ex) ไปŠๅนดๆœ€ๅคงใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆใƒˆใƒฉใƒ•ใ‚ฃใƒƒใ‚ฏใ‚’่จ˜้Œฒใ—ใŸใ‚คใƒ™ใƒณใƒˆใฏไฝ•ใ‹๏ผŸใพใŸใใฎใƒˆใƒฉใƒ•ใ‚ฃใƒƒใ‚ฏ้‡ใฏใฉใ‚Œใใ‚‰ใ„ใ‹๏ผŸ็ญ‰ ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ ๆ˜จไปŠใฎใ‚ตใ‚คใƒใƒผใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃไบ‹ๆƒ…ใซใคใ„ใฆ ๆผ”็ฟ’ใซใคใ„ใฆ 1ใ‚ฐใƒซใƒผใƒ—5~6ไบบใฎใ‚ฐใƒซใƒผใƒ—ใซๅˆ†ใ‹ใ‚Œใฆใ‚‚ใ‚‰ใ„ใ€Zoomใฎใƒ–ใƒฌใ‚คใ‚ฏใ‚ขใ‚ฆใƒˆใƒซใƒผใƒ ๆฉŸ่ƒฝใจSlackใ‚’็”จใ„ใฆใ‚ฐใƒซใƒผใƒ—ใƒฏใƒผใ‚ฏใ‚’ใ—ใฆใ‚‚ใ‚‰ใ„ใพใ™ใ€‚ Slackใซๆ‹…ๅฝ“็คพๅ“กใ‹ใ‚‰ใ‚ใ‚‹็ŠถๆณใŒไธŽใˆใ‚‰ใ‚Œใ€ใใฎไธŽใˆใ‚‰ใ‚ŒใŸ็Šถๆณใซๅฏพใ—ใฆใฎๅฏพ็ญ–ใฎ่ญฐ่ซ–ใ‚’ใ—ใฆใ‚‚ใ‚‰ใ„ใพใ™ใ€‚ ๆผ”็ฟ’ใฎๅ†…ๅฎนใจใ—ใฆใฏใ€ๅฎŸ้š›ใฎใ‚ทใ‚นใƒ†ใƒ ใฎๆ‹…ๅฝ“่€…ๅฝนใจใ—ใฆใ€ใ‚ใ‚‹้šœๅฎณไบ‹ไพ‹ใ‚’ใ‚‚ใจใซใ—ใŸๆœบไธŠใฎๆฅญๅ‹™ไฝ“้จ“ใจใชใ‚Šใพใ™ใ€‚ ๅฎŸ้š›ใฎใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒใงใฏใ€ๆ”ปๆ’ƒ่€…ใฏๆ”ปๆ’ƒใฎๆ‰‹ใฏๆญขใ‚ใฆใใ‚Œใพใ›ใ‚“ใ€‚ ๆผ”็ฟ’ใงใ‚‚ใ€่ญฐ่ซ–ไธญใซๆ–ฐใ—ใ„ใ‚คใƒ™ใƒณใƒˆใŒ่ตทใ“ใ‚Š็ถšใ‘ใ‚‹ใฎใงใ€ใใฎๆ–ฐใ—ใ„ใ‚คใƒ™ใƒณใƒˆใซๅฏพใ—ใฆใ‚‚่ญฐ่ซ–ใ‚’ใ—ใฆใ‚‚ใ‚‰ใ„ใพใ™ใ€‚ ใพใŸๅ„ใ‚ฐใƒซใƒผใƒ—ใซใฏใ€็พๅ ด็คพๅ“ก1ๅใŒใƒกใƒณใ‚ฟใƒผใจใ—ใฆไป˜ใใ€ๅญฆ็”Ÿใฎใฟใชใ•ใ‚“ใฎๆผ”็ฟ’ใฎใ‚ตใƒใƒผใƒˆใ‚’ใ•ใ›ใฆใ„ใŸใ ใใพใ™ใ€‚ ๆผ”็ฟ’็ต‚ไบ†ๅพŒใ€ใ‚ฐใƒซใƒผใƒ—ๅ†…ใงๆœ€ๅˆใฎๆŒฏใ‚Š่ฟ”ใ‚Šใ‚’ใ—ใฆใ‚‚ใ‚‰ใ„ใ€ใใฎๆŒฏใ‚Š่ฟ”ใ‚Šใ‚’ๅ…จไฝ“ใง็™บ่กจใ—ใฆใ‚‚ใ‚‰ใ„ใพใ™ใ€‚ ๆŒฏใ‚Š่ฟ”ใ‚Š็™บ่กจๅพŒใ€ใ‚ทใƒŠใƒชใ‚ชใฎ็จฎๆ˜Žใ‹ใ—ใŒใ‚ใ‚‹ใฎใงใ€ใใฎ็จฎๆ˜Žใ‹ใ—ใ‚’่ธใพใˆใ€ใƒใƒผใƒ ใงไป–ใซใฉใ‚“ใชใ“ใจใŒใงใใŸใ ใ‚ใ†ใ‹ใจๅ†ๅบฆๆŒฏใ‚Š่ฟ”ใ‚ŠใŒใงใใพใ™ใ€‚ ใพใŸๅ†ๅบฆใฎๆŒฏใ‚Š่ฟ”ใ‚Šใงใฏใ€ใƒกใƒณใ‚ฟใƒผใซใ‚ˆใ‚‹ใƒ•ใ‚ฃใƒผใƒ‰ใƒใƒƒใ‚ฏใ‚‚ใ•ใ›ใฆใ„ใŸใ ใใพใ™ใ€‚ ๆ‡‡่ฆชไผšใซใคใ„ใฆ ใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ๅฎŸๆ–ฝๅพŒใซใฏใ€็พๅ ด็คพๅ“กใจๅฐฑๆดปใซใคใ„ใฆใ‚„็คพๅ†…ใฎ้›ฐๅ›ฒๆฐ—ใซใคใ„ใฆ่ฉฑใ›ใ‚‹ๅ ดใจใ—ใฆๆ‡‡่ฆชไผšใฎๆ™‚้–“ใ‚’่จญใ‘ใฆใ„ใพใ™ใ€‚ ๅ‚ๅŠ ่€…ใฎๆ„Ÿๆƒณ ใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใซๅ‚ๅŠ ใ—ใŸๅญฆ็”Ÿใฎใฟใชใ•ใ‚“ใ‹ใ‚‰ใฎๆ„Ÿๆƒณใ‚’ใ„ใใคใ‹ใ”็ดนไป‹ใ—ใพใ™ใ€‚ ๅฎŸ้š›ใซใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒใ‚’ๅ—ใ‘ใŸ้š›ใฎๅฏพ็ญ–ใ‚„่€ƒใˆๆ–นใ‚’ๅฎŸๆˆฆๅฝขๅผใงไฝ“้จ“ใ™ใ‚‹ใ“ใจใŒใงใใŸใŸใ‚ใ€ๅบงๅญฆใ‚ˆใ‚Šๆทฑใ็†่งฃใ™ใ‚‹ใ“ใจใŒใงใใŸใ€‚ ใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒใฎใƒขใƒ‡ใƒซใ‚ฑใƒผใ‚นใซใคใ„ใฆใ€ๅฎŸ้š›ใซๆ”ปๆ’ƒใ•ใ‚ŒใŸใ‚ทใ‚นใƒ†ใƒ ใฎๆ‹…ๅฝ“่€…ๅฝนใจใ—ใฆไฝ•ใ‚’ใ™ในใใ‹่€ƒใˆใ‚‹ใ“ใจใงใ€ๅคš่ง’็š„ใช่ฆ–็‚นใ‹ใ‚‰ใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒใฎๅฏพๅ‡ฆๆณ•ใ‚’่€ƒใˆใ‚‹ๅŠ›ใŒ่บซใซใคใ„ใŸใ€‚ ๆˆๆžœใจใ—ใฆใฏISPๆฅญ็•Œใจใ„ใ†ไปŠใพใงๆ›–ๆ˜งใ ใฃใŸ้ ˜ๅŸŸใซ้–ขใ—ใฆ็Ÿฅ่ฆ‹ใ‚’ๅพ—ใŸไบ‹ใงใ™ใ€‚้€šไฟกไบ‹ๆฅญ่€…ใ‚„ใƒ—ใƒญใƒใ‚คใƒ€ใชใฉๅ‘จ่พบ็š„ใช็Ÿฅ่ญ˜ใ‚’ๆต…ใ็Ÿฅใฃใฆใ„ใŸ็‚นใŒๅคšใ‹ใฃใŸใฎใงใ€ไปŠๅ›žใฎใ‚คใƒ™ใƒณใƒˆใงๆทฑใ็†่งฃใงใใŸ็‚นใฏ่‰ฏใ‹ใฃใŸใงใ™ใ€‚ ใพใŸไปฅไธ‹ใฎใ‚ˆใ†ใชๆƒณๅฎšๅค–ใฎๆˆๆžœใ‚’ๅพ—ใ‚‹ใ“ใจใŒใงใใŸใจใ„ใ†ๆ„Ÿๆƒณใ‚‚ใ„ใŸใ ใใพใ—ใŸใ€‚ ่‡ชๅˆ†่‡ช่บซๆ˜”ใ‹ใ‚‰่ญฐ่ซ–ใซ้–ขใ—ใฆ่‹ฆๆ‰‹ใช้ƒจๅˆ†ใŒใ‚ใ‚Šใพใ—ใŸใŒใ€ไปŠๅ›žใฎ่ญฐ่ซ–ใงใฏ่‡ช่บซใฎ่€ƒใˆใ‚’ใ†ใพใ็™บไฟกใ™ใ‚‹ใ“ใจใŒใงใใŸใ“ใจใŒ่‡ชๅˆ†่‡ช่บซ้ฉšใ„ใฆใŠใ‚Šใพใ™ใ€‚ ใƒฉใƒ•ใชๆ‡‡่ฆชไผšใงใ€ใƒกใƒณใ‚ฟใƒผ็คพๅ“กใ•ใ‚“ใจๆฐ—่ปฝใซไผš่ฉฑใ€็คพๅ†…ใฎ้›ฐๅ›ฒๆฐ—ใ‚’่žใใ“ใจใŒใงใใŸใ€‚ ๅ€‹ไบบ็š„ใซใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใจใ„ใ†ใจๆŠ€่ก“็š„ใช้ขใซ็›ฎใŒ่กŒใใŒใกใงใ‚ใฃใŸใŸใ‚ใ€ใŠๅฎขๆง˜ใธใฎๅฏพๅฟœใ‚„ไป–้ƒจ็ฝฒใ‚„ไป–็คพใจใฎ้–ขใ‚ใ‚ŠใชใฉใŒๅฟ…่ฆไธๅฏๆฌ ใงใ‚ใ‚‹ใ“ใจใŒๆ„ๅค–ใงใ‚ใฃใŸใ€‚ ็ต‚ใ‚ใ‚Šใซ ๅญฆ็”Ÿใฎๆ–นใจใŠ่ฉฑใ‚’ใ—ใŸ้š›ใ€ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚„ใ‚คใƒณใƒ•ใƒฉใ‚จใƒณใ‚ธใƒ‹ใ‚ขใซ่ˆˆๅ‘ณใ‚ใ‚Šใคใคใ‚‚ใ€ๆ™ฎๆฎตใฉใ‚“ใชๆฅญๅ‹™ใ‚’ใ—ใฆใ„ใ‚‹ใฎใ‹ใŒๅˆ†ใ‹ใ‚‰ใชใ„ใจใ„ใ†ๅญฆ็”Ÿใฎๆ–นใŒๅคšใใ„ใ‚‰ใฃใ—ใ‚ƒใ„ใพใ—ใŸใ€‚ใใฎใ‚ˆใ†ใชๅญฆ็”Ÿใฎๆ–นใซใจใฃใฆใ‚‚ๆœฌใ‚คใƒณใ‚ฟใƒผใƒณใฏๅฝน็ซ‹ใคใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใ ใจๆ€ใ„ใพใ™ใ€‚ ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚„ใ‚คใƒณใƒ•ใƒฉใ‚จใƒณใ‚ธใƒ‹ใ‚ขใซใ”่ˆˆๅ‘ณใ‚ใ‚‹ๆ–นใ€ใ”ๅฟœๅ‹Ÿใ‚’ใŠๅพ…ใกใ—ใฆใ„ใพใ™ใ€‚ใพใŸๆœ€ๅˆใงใ”็ดนไป‹ใ—ใŸใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒๅฏพๅฟœๆผ”็ฟ’ใ‚ณใƒผใ‚นไปฅๅค–ใฎใ‚คใƒณใ‚ฟใƒผใƒณใ‚ทใƒƒใƒ—ใธใฎใ”ๅฟœๅ‹Ÿใ‚‚ใŠๅพ…ใกใ—ใฆใ„ใพใ™ใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใฏใ˜ใ‚ใพใ—ใฆ๏ผๆ–ฐๅ’3ๅนด็›ฎใฎๆนŠ่ฐทใงใ™ใ€‚ ใฏใ˜ใ‚ใซ ็ช็„ถใงใ™ใŒใ€็š†ใ•ใ‚“ใ€Œไบ‹ๅ‰็ขบ่ชใ€ใ‚’ใ™ใ‚‹ๆฉŸไผšใฃใฆใ‚ใ‚Šใพใ™ใ‹๏ผŸ ๆ™ฎๆฎต็งใฏไธปใซใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใŠๅฎขๆง˜ใฎๆƒ…ๅ ฑใ‚’็ฎก็†ใ™ใ‚‹ใ‚ทใ‚นใƒ†ใƒ ใฎ้–‹็™บใƒป้‹็”จใ‚’่กŒใฃใฆใ„ใพใ™ใ€‚ ใใฎๆ€ง่ณชไธŠใ€ใ€Œ้กงๅฎขๆƒ…ๅ ฑใ‚’ๅ–ๅพ—ใ™ใ‚‹APIใ‚’ๅˆฉ็”จใ—ใŸใ„ใ€ใ€Œๅ‹•ไฝœ็ขบ่ช็”จใฎใƒ†ใ‚นใƒˆIDใ‚’็™บ่กŒใ—ใฆใปใ—ใ„ใ€ใจใ„ใฃใŸไพ้ ผใ‚’ใ‚ˆใใ„ใŸใ ใใพใ™ใ€‚ ้กงๅฎขๆƒ…ๅ ฑใ‚’ๆ‰ฑใ†ๆฅญๅ‹™ใฎ้ƒฝๅˆไธŠใ€ไพ้ ผใฎๆญฃๅฝ“ๆ€งใ‚’ไบ‹ๅ‰็ขบ่ชใ™ใ‚‹ใƒซใƒผใƒซใจใชใฃใฆใŠใ‚Šใ€Slack ใงๅ—ไป˜่ชฟๆ•ดใ‚’ใŠ้ก˜ใ„ใ—ใฆใ„ใ‚‹ใฎใงใ™ใŒโ€ฆ ใ„ใ‚„ใ‚ใ€ใ‚ใ‚“ใฉใใ•ใ„ใชใ‚โ€ฆใ€‚ ใƒ•ใƒชใƒผใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆใงใฎๅ—ไป˜่ชฟๆ•ดใฏไพ้ ผใ™ใ‚‹ๅดใ‚‚ไบ‹ๅ‰็ขบ่ชใ™ใ‚‹ๅดใ‚‚ๅคงๅค‰ใงใ™ใ€‚ ใ“ใ‚Œใ‚’ใฉใ†ใซใ‹ๆ”นๅ–„ใ—ใฆใ„ใใŸใ„ใจๆ€ใ„ใพใ™ใ€‚ Slack ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’ไฝฟใฃใฆๆ–‡ๅญ—ๅ…ฅๅŠ›ใ‚’ๆฅตๅŠ›ใชใใใ†๏ผ ใพใšใฏSlackใฎใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผๆฉŸ่ƒฝใ‚’ไฝฟใฃใฆใฟใพใ™ใ€‚ ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใจใฏใ€่ค‡ๆ•ฐใฎใ‚นใƒ†ใƒƒใƒ—ใงๆง‹ๆˆใ•ใ‚Œใ‚‹่‡ชๅ‹•ๅŒ–ใ•ใ‚ŒใŸใ‚ฟใ‚นใ‚ฏใพใŸใฏใƒ—ใƒญใ‚ปใ‚นใงใ™ใ€‚ใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใฎๅฟ…่ฆใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใฏ่‡ชๅˆ†ใฎ Slack ใƒฏใƒผใ‚ฏใ‚นใƒšใƒผใ‚นใง้–‹ๅง‹ใ•ใ‚Œใพใ™ใ€‚Slack ใง็›ดๆŽฅๅฎŸ่กŒใ™ใ‚‹ใ“ใจใ‚‚ใ€ไป–ใฎใƒ„ใƒผใƒซใ‚„ใ‚ตใƒผใƒ“ใ‚นใจ้€ฃๆบใ•ใ›ใ‚‹ใ“ใจใ‚‚ใงใใพใ™ใ€‚ https://slack.com/intl/ja-jp/help/articles/360053571454-Slack-%E3%81%A7%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’ไฝฟใฃใฆไบ‹ๅ‰็ขบ่ชใฎๆ–‡็ซ ใ‚’้€ไฟกใงใใ‚‹ใ‚ˆใ†ใซใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚ ใ“ใฎใ‚ˆใ†ใชใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’ไฝœๆˆใ—ใพใ—ใŸใ€‚ ไพ้ ผๅดใŒ่จ˜ๅ…ฅใ™ใ‚‹ใƒ•ใ‚ฉใƒผใƒ  ใƒ•ใ‚ฉใƒผใƒ ใฎๅ†…ๅฎนใ‚’ๅŸบใซใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’้–‹ๅง‹ใ—ใŸใƒใƒฃใƒณใƒใƒซใธใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ไฟกใ™ใ‚‹ ใ€Œๆ‰ฟ่ชใƒœใ‚ฟใƒณใ€ใ‚’ๆŠผใ™ใจ็ขบ่ชใ—ใŸใจใ„ใ†ๆ–‡็ซ ใŒใ‚นใƒฌใƒƒใƒ‰ใซ่ฟ”ไฟกใ•ใ‚Œใ‚‹ ใ“ใ†ใ™ใ‚‹ใ“ใจใงใ€ไพ้ ผๅดใฏ่จ˜ๅ…ฅใ™ใ‚‹ใ“ใจใŒๅฐ‘ใชใใชใ‚Šใ€็ขบ่ชๅดใฏใƒœใ‚ฟใƒณไธ€ใคใงๆ‰ฟ่ชใ—ใ€ๅฟ…่ฆใชๆƒ…ๅ ฑใ‚’ไผใˆใ‚‹ใ“ใจใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚ ใงใ™ใŒโ€ฆๅ…จใฆใฎ็”ณ่ซ‹ใฎใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’ไฝœๆˆใ—ใ‚ˆใ†ใจใ™ใ‚‹ใจใ€ๅฐ‘ใ—ไพ้ ผๅดใซไธ่ฆชๅˆ‡ใชใคใใ‚Šใซใชใ‚Šใใ†ใงใ™ใ€‚ ไบ‹ๅ‰็ขบ่ชใฎไป–ใซใ‚‚ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใฏใŸใใ•ใ‚“ไฝœใฃใฆใ„ใ‚‹ใฎใงใ™ใŒใ€ใ“ใ‚Œใ ใ‘ใง่กจ็คบใ‚’ๅŸ‹ใ‚ๅฐฝใใ—ใฆใ—ใพใ„ใพใ™ใ€‚ไธ€ๆฐ—ใซใฐใƒผใฃใจ่กจ็คบใ•ใ‚Œใ‚‹ใฎใ‚‚ๅˆ†ใ‹ใ‚Šใฅใ‚‰ใ„ใงใ™ใ€‚ ใใ“ใงใ€ใ€Œ็”ณ่ซ‹ๅ‰ใฎไบ‹ๅ‰็ขบ่ช็”จใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ€ใ‚’ไธ€ใคใฎใฟไฝœๆˆใ—ใ€ใใ“ใง้ธๆŠžใ•ใ‚ŒใŸๅ†…ๅฎนใซใ‚ˆใฃใฆๅ›ž็ญ”ใ‚’ๅค‰ๆ›ดใ™ใ‚‹ไป•็ต„ใฟใ‚’ไฝœใ‚ŠใŸใ„ใจๆ€ใ„ใพใ™ใ€‚ Slack Bolt for Javascriptใ‚’ไฝฟใฃใฆbotใ‚’ไฝœๆˆใ—ใ‚ˆใ†๏ผ Bolt ใฏ Slack API ใ‚’ไฝฟใ„ใ‚„ใ™ใใ™ใ‚‹ใŸใ‚ใฎ Node.js ใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใงใ™ใ€‚ ไธ€ใ‹ใ‚‰ API ใ‚’ไฝฟใฃใฆใ‚ขใƒ—ใƒชใ‚’้–‹็™บใ—ใฆใ„ใใ“ใจใจๆฏ”ในใ‚‹ใจใ€ใ“ใฎใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใ‚’ไฝฟใ†ใจใ‚‚ใฃใจใ‚ตใ‚ฏใฃใจไฝœใฃใฆใ„ใใ“ใจใŒใงใใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ https://api.slack.com/lang/ja-jp/hello-world-bolt ใ“ใฎBoltใ‚’ไฝฟ็”จใ—ใฆใ€ใƒใƒฃใƒณใƒใƒซใซๆŠ•็จฟใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅ—ใ‘ๅ–ใ‚Šใ€ใใฎใƒกใƒƒใ‚ปใƒผใ‚ธใซใ‚ˆใฃใฆ่ฟ”ไบ‹ใ‚’ๅค‰ๅŒ–ใ•ใ›ใ‚‹Botใ‚’ไฝœๆˆใ—ใฆใฟใ‚ˆใ†ใจๆ€ใ„ใพใ™ใ€‚ Slackใ‚ขใƒ—ใƒชใฎๆง‹็ฏ‰ใฎไป•ๆ–นใซใคใ„ใฆใฏใ€ไธŠ่จ˜ใฎใƒชใƒณใ‚ฏใ‚„ Bolt ๅ…ฅ้–€ใ‚ฌใ‚คใƒ‰ ใซ่ฉณ็ดฐใŒใ‚ใ‚‹ใŸใ‚็œ็•ฅใ•ใ›ใฆใ„ใŸใ ใใพใ™ใ€‚ ใพใšใฏใ€ๆ”นใ‚ใฆใ€Œ็”ณ่ซ‹ๅ‰ใฎไบ‹ๅ‰็ขบ่ช็”จใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ€ใ‚’ไฝœๆˆใ—ใพใ™ใ€‚ ไพ้ ผๅดใŒ่จ˜ๅ…ฅใ™ใ‚‹ใƒ•ใ‚ฉใƒผใƒ  ใƒ•ใ‚ฉใƒผใƒ ใฎๅ†…ๅฎนใ‚’ๅŸบใซใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’้–‹ๅง‹ใ—ใŸใƒใƒฃใƒณใƒใƒซใธใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ไฟกใ™ใ‚‹ ไปŠใฎใพใพใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’้€ไฟกใ™ใ‚‹ใจใ“ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ ใ€Œโ– ็”ณ่ซ‹้ …็›ฎใ€ใฎไธญ่บซใซใ‚ˆใฃใฆใ€ใฉใฎใ‚ˆใ†ใช่ฟ”ไบ‹ใ‚’่ฟ”ใ™ใฎใ‹ใ‚’ๆฑบใ‚ใฆใ„ใใพใ™ใ€‚ ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’ๅฐ‘ใ—็ทจ้›†ใ—ใพใ—ใ‚‡ใ†ใ€‚ ไฝœๆˆใ—ใŸSlackใ‚ขใƒ—ใƒชใซๅฏพใ—ใฆใƒกใƒณใ‚ทใƒงใƒณใ‚’้€ใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ ใ“ใ†ใ™ใ‚‹ใ“ใจใงใ€Œใ‚ขใƒ—ใƒชใซๅฏพใ—ใฆใƒกใƒณใ‚ทใƒงใƒณใŒ้€ใ‚‰ใ‚Œใ€ใ‹ใค็‰นๅฎšใฎๅ˜่ชžใŒๆŠ•็จฟใ•ใ‚ŒใŸๆ™‚ใซๅๅฟœใ™ใ‚‹ใ€ๅฎŸ่ฃ…ใŒๅฏ่ƒฝใจใชใ‚Šใพใ™ใ€‚ // ใ‚ขใƒ—ใƒชใซใƒกใƒณใ‚ทใƒงใƒณใŒใคใ‘ใ‚‰ใ‚ŒใŸๆ™‚ใซๅๅฟœใ™ใ‚‹ app.event('app_mention', async ({ body, say }) => { // ๆŠ•็จฟใ•ใ‚ŒใŸๆ–‡็ซ ใ‚’ๅ–ๅพ—ใ™ใ‚‹ const message = body.event.text; // ๆ–‡็ซ ใฎไธญใซใ€Œใƒ†ใ‚นใƒˆID็™บ่กŒใ€ใŒใ‚ใฃใŸๅ ดๅˆ if (message.includes('ใƒ†ใ‚นใƒˆID็™บ่กŒ')) { // ๆ–‡็ซ ใฎไธญใ‹ใ‚‰ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผ้€ไฟก่€…ใฎIDใ‚’ๅ–ๅพ—ใ™ใ‚‹ const userId = message.match(/(?<=<@)(.)*(?=>ใ•ใ‚“)/)[0]; // const userId = getUserIdAddress(message); // ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใซ่ฟ”ไฟกใ™ใ‚‹ๆœฌๆ–‡ใ‚’ไฝœๆˆ const text = `<@${userId}>\nไบ‹ๅ‰็ขบ่ชใ‚’ๅ—ใ‘ไป˜ใ‘ใพใ—ใŸใ€‚\n<ไปปๆ„ใฎใƒกใƒณใ‚ทใƒงใƒณ> ๅ†…ๅฎนใ‚’็ขบ่ชใฎไธŠใ€ๆ‰ฟ่ชใ—ใฆใใ ใ•ใ„ใ€‚`; // ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ไฟก await say({ // ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใฎๆŠ•็จฟใฎใ‚นใƒฌใƒƒใƒ‰ใซ่ฟ”ไฟก thread_ts: body.event.ts, attachments: [ { // ้€š็Ÿฅๆฌ„ใซ่กจ็คบใ™ใ‚‹ๆ–‡็ซ ใ‚’ๆŒ‡ๅฎš fallback: text, color: '#ffa500', blocks: [ { type: 'section', text: { type: 'mrkdwn', text: text, }, }, // ใ€Œๆ‰ฟ่ชใ€ใƒœใ‚ฟใƒณใ‚’ไฝœๆˆ { type: 'actions', elements: [ { type: 'button', text: { type: 'plain_text', text: 'ๆ‰ฟ่ช', }, // ใ€Œใƒ†ใ‚นใƒˆID็™บ่กŒใ€ใŒ้€ไฟกใ•ใ‚ŒใŸๆ™‚ใฎๆ‰ฟ่ชใƒœใ‚ฟใƒณใฎIDใ‚’่จญๅฎš action_id: 'testid_button_click', }, ], }, ], }, ], }); } }); ใ“ใฎ็Šถๆ…‹ใงใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’้€ไฟกใ™ใ‚‹ใจไปฅไธ‹ใฎๆง˜ใซใชใ‚Šใพใ™ใ€‚ ใƒกใƒƒใ‚ปใƒผใ‚ธใซๅฏพใ—ใฆ่‡ชๅˆ†ใฎๅฅฝใใช่‰ฒใ‚’ใคใ‘ใŸใ‚Šใชใฉ่ฃ…้ฃพใŒใงใใ‚‹ใฎใ‚‚่‰ฏใ„ใงใ™ใญใ€‚ ๆฌกใซใ€ๆ‰ฟ่ชใƒœใ‚ฟใƒณใŒๆŠผใ•ใ‚ŒใŸๆ™‚ใฎๅฎŸ่ฃ…ใ‚’ใ—ใฆใ„ใใพใ—ใ‚‡ใ†ใ€‚ // action_id: 'api_button_click'ใฎใƒœใ‚ฟใƒณใŒๆŠผใ•ใ‚ŒใŸๆ™‚ใซๅๅฟœใ™ใ‚‹ app.action( { type: 'block_actions', action_id: 'testid_button_click' }, async ({ body, say }) => { // ๆ–‡็ซ ใฎไธญใ‹ใ‚‰ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใ‚’้€ไฟกใ—ใŸไบบใฎIDใ‚’ๅ–ๅพ—ใ™ใ‚‹ const userIid = body.message.attachments[0].fallback.split('\n')[0]; const text = `${userIid}\n<@${body.user.id}>ใŒ็ขบ่ชใ—ใพใ—ใŸใ€‚โ–ณโ–ณโ–ณใƒ•ใ‚ฉใƒผใƒ ใ‹ใ‚‰็”ณ่ซ‹ใ‚’ใŠ้ก˜ใ„ใ—ใพใ™ใ€‚`; await say({ text: text, // ใ‚นใƒฌใƒƒใƒ‰ใซ่ฟ”ไฟกใ™ใ‚‹ thread_ts: body.container.message_ts, }); }, ); ใ“ใ‚Œใงๆ‰ฟ่ชใƒœใ‚ฟใƒณใ‚’ๆŠผใ™ใจ่ฟ”ไฟกใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸ๏ผ ใ‚ใจใฏใ€็”ณ่ซ‹้ …็›ฎใฎๆ•ฐใ ใ‘ไฝœใ‚Šใพใ—ใ‚‡ใ†ใ€‚IDใฎๅ–ๅพ—ใ‚„ใ€sayใงๆŠ•็จฟใ™ใ‚‹ไธญ่บซใฏๅˆฅใฎใƒ•ใ‚กใ‚คใƒซใซๅˆ‡ใ‚Šๅ‡บใ™ใจใ€ใ‚ˆใ‚Šใ‚นใƒƒใ‚ญใƒชใจๆ›ธใ‘ใใ†ใงใ™ใญใ€‚ ๆœ€ๅพŒใซ Slackใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผ+Boltใ‚’ไฝฟใฃใฆไฝœๆˆใ—ใŸBotใ‚ขใƒ—ใƒชใ‚’็ต„ใฟๅˆใ‚ใ›ใŸๆดป็”จไพ‹ใ‚’็ดนไป‹ใ—ใพใ—ใŸใ€‚ ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใฏใ‚ณใƒผใƒ‰ใ‚’ๆ›ธใ‹ใชใใฆใ‚‚ใงใใ‚‹ใ“ใจใŒใจใฆใ‚‚ใŸใใ•ใ‚“ใ‚ใ‚Šใพใ™ใ€‚ ใใ“ใซใ‚ขใƒ—ใƒชใ‚’็ต„ใฟๅˆใ‚ใ›ใ‚‹ใ“ใจใงใ€็ดฐใ‹ใ„ๅฎŸ่ฃ…ใ‚’ๅฎŸ็พใงใใ‚‹ใ‹ใชใจๆ€ใ„ใพใ™ใ€‚ไป–ใซใ‚‚็‰นๅฎšใฎๅ˜่ชžใŒๆŠ•็จฟใ•ใ‚ŒใŸใ“ใจใซๅๅฟœใ—ใฆใ€ใ€ŒNotionใซๆ–ฐ่ฆใƒšใƒผใ‚ธใ‚’ไฝœๆˆใ™ใ‚‹ใ€ใ€ŒJiraใƒปGithubใซใƒใ‚ฑใƒƒใƒˆใ‚’ไฝœๆˆใ™ใ‚‹ใ€ใจใ„ใฃใŸไป•็ต„ใฟใ‚‚ไฝœใฃใฆใ„ใพใ™ใ€‚ ใฟใชใ•ใ‚“ใ‚‚ๆ˜ฏ้žSlackใฎๆง˜ใ€…ใชๆฉŸ่ƒฝใ‚’ๆดป็”จใ—ใฆใ„ใใพใ—ใ‚‡ใ†๏ผ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใฏใ˜ใ‚ใซ ใ“ใ‚“ใซใกใฏใ€‚ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพใฎไธฆๆœจใงใ™ใ€‚ 2022ๅนด4ๆœˆ17ๆ—ฅ๏ผˆๆ—ฅ๏ผ‰ใจ2022ๅนด10ๆœˆ9ๆ—ฅ๏ผˆๆ—ฅ๏ผ‰ใซๅฟœ็”จๆƒ…ๅ ฑๆŠ€่ก“่€…่ฉฆ้จ“ใ‚’ๅ—ใ‘ใฆใใพใ—ใŸใ€‚ 2ๅ›žๅ—้จ“ใ—ใฆใ„ใ‚‹ใจใ„ใ†ใ“ใจใงใ€ใ™ใงใซใŠๅฏŸใ—ใ‹ใจๆ€ใ„ใพใ™ใŒ1ๅ›ž็›ฎใฏไธๅˆๆ ผใงใ—ใŸใ€‚๏ผˆ2ๅ›ž็›ฎใง็„กไบ‹ใซๅˆๆ ผใ—ใพใ—ใŸ๏ผ‰ ไปŠๅ›žใฏใ€ๅ‹‰ๅผทๆ–นๆณ•ใ‚„ๅฎŸ้š›ใซๅ—้จ“ใ—ใŸๆ™‚ใซๆ„Ÿใ˜ใŸใ“ใจใชใฉใ‚’ๆŒฏใ‚Š่ฟ”ใ‚Šใ€1ๅ›ž็›ฎใฎ่ฉฆ้จ“ใŒไธๅˆๆ ผใจใชใฃใŸๅŽŸๅ› ใซใคใ„ใฆ่€ƒใˆใฆใฟใพใ—ใŸใ€‚ ใ“ใ‚Œใ‹ใ‚‰ๅ—้จ“ใ•ใ‚Œใ‚‹ๆ–นใฎๅ‚่€ƒใซใชใ‚Œใฐๅนธใ„ใงใ™ใ€‚ ๅฟœ็”จๆƒ…ๅ ฑๆŠ€่ก“่€…่ฉฆ้จ“ใจใฏ IPA๏ผˆ็‹ฌ็ซ‹่กŒๆ”ฟๆณ•ไบบ ๆƒ…ๅ ฑๅ‡ฆ็†ๆŽจ้€ฒๆฉŸๆง‹๏ผ‰ใŒๅฎŸๆ–ฝใ—ใฆใ„ใ‚‹ๅ›ฝๅฎถ่ฉฆ้จ“ใฎ1ใค ่ฉณ็ดฐ๏ผš https://www.jitec.ipa.go.jp/1_11seido/ap.html ๅˆๅ‰่ฉฆ้จ“ ่ฉฆ้จ“ๆ™‚้–“๏ผš9:30๏ฝž12:00๏ผˆ150ๅˆ†๏ผ‰ ๅ•้กŒๆ•ฐ๏ผš80ๅ• ๅฝขๅผ๏ผšใƒžใƒผใ‚ฏใ‚ทใƒผใƒˆ๏ผˆๅ››่‚ขๆŠžไธ€๏ผ‰ ๅˆๅพŒ่ฉฆ้จ“ ่ฉฆ้จ“ๆ™‚้–“๏ผš13:00๏ฝž15:30๏ผˆ150ๅˆ†๏ผ‰ ๅ•้กŒๆ•ฐ๏ผš11ๅ•ใ‹ใ‚‰5ๅ•้ธๆŠž๏ผˆ่งฃใๅˆ†้‡Žใ‚’้ธๆŠžใ™ใ‚‹ใ“ใจใŒใงใใ‚‹๏ผ‰ ๅฝขๅผ๏ผš่จ˜่ฟฐๅผ ๅ—้จ“ๅฏพ็ญ–ใซใคใ„ใฆ โ‘ ๅ‚่€ƒๆ›ธใ‚’่ชญใ‚€ 1ๅ†Šใฎใฟ่ณผๅ…ฅ 4ๆœˆใฎ่ฉฆ้จ“ใซๅ‘ใ‘ใฆใ€10ๆœˆใ‹ใ‚‰่ชญใฟๅง‹ใ‚ใŸใ€‚ไธ€้€šใ‚Š่ชญใฟ็ต‚ใ‚ใฃใŸใฎใฏ2ๆœˆๆœซ ไธ€้€šใ‚Š่ชญใฟ็ต‚ใ‚ใฃใŸๅพŒใฏใ€้ŽๅŽปๅ•ใ‚’่งฃใ„ใŸๆ™‚ใซๅˆ†ใ‹ใ‚‰ใชใ‹ใฃใŸใจใ“ใ‚ใ‚’ใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ—ใฆ่ชญใ‚“ใงใ„ใŸ โ‘กๅˆๅ‰ๅฏพ็ญ– 11ๆœˆใ‹ใ‚‰4ๆœˆใฎ่ฉฆ้จ“ๅฝ“ๆ—ฅใพใงใปใผๆฏŽๆ—ฅใ€ใฒใŸใ™ใ‚‰้ŽๅŽปๅ•ใ‚’่งฃใ„ใŸ 1ๆ—ฅใ‚ใŸใ‚Š10๏ฝž20ๅ•็จ‹ๅบฆใ€‚ๆ™‚ใ€…ใ€ใ„ใฃใบใ‚“ใซ1ๅ›žๅˆ†ๅ…จ้ƒจ๏ผˆ80ๅ•๏ผ‰่งฃใ„ใฆใฟใŸใ‚Šใ‚‚ใ—ใŸ 5ๅนดๅˆ†๏ผˆ10ๅ›žๅˆ†๏ผ‰ใฎๅ•้กŒใ‚’่งฃใ„ใŸใ€‚็›ด่ฟ‘2ๅ›žๅˆ†ใฎ้ŽๅŽปๅ•ใฏใ‚ใพใ‚Šๅ‡บ้กŒใ•ใ‚Œใชใ„ใจใ„ใ†ๅ™‚ใ‚’่žใ„ใŸใฎใงใใ“ใฏๅค–ใ—ใŸ โ‘ขๅˆๅพŒๅฏพ็ญ– ๅˆๅพŒใฎ้ŽๅŽปๅ•ใจ่งฃ่ชฌใŒ่ผ‰ใฃใฆใ„ใ‚‹ๅ•้กŒ้›†ใ‚’1ๅ†Š่ณผๅ…ฅ 4ๆœˆใฎ่ฉฆ้จ“ใซๅ‘ใ‘ใฆใ€12ๆœˆๆœซใ‹ใ‚‰่งฃใๅง‹ใ‚ใŸใ€‚3ๆœˆๆœซใซๅ…จๅ•่งฃใ็ต‚ใ‚ใ‚‹ ๅ…จๅ•่งฃใ็ต‚ใ‚ใฃใŸๅพŒใ€ใใฎ็ตๆžœใ‚’ใ‚‚ใจใซใ—ใฆใฉใฎๅˆ†้‡Žใ‚’่งฃใใ‹ๆฑบใ‚ใŸ๏ผˆๅˆๅพŒ่ฉฆ้จ“ใฏใ€่งฃใๅˆ†้‡Žใ‚’้ธๆŠžใ™ใ‚‹ใ“ใจใŒใงใใ‚‹๏ผ‰ ๅˆ†้‡Ž ่งฃใใ‹ใฉใ†ใ‹ ใ€€โ€ข โ—Ž๏ผš็ตถๅฏพ่งฃใ ใ€€โ€ข โ—‹๏ผš่งฃใใคใ‚‚ใ‚Š ใ€€โ€ข โ–ณ๏ผšโ†‘ใŒใƒ€ใƒกใชๅ ดๅˆใฎไฟ้™บ ใ€€โ€ข ร—๏ผš่งฃใ‹ใชใ„ ็†็”ฑใชใฉ ๅ•1 ๆƒ…ๅ ฑใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ โ—Ž ๅ•1ใฏๅฟ…้ ˆ๏ผˆๅ•2๏ฝžๅ•11ใฎไธญใ‹ใ‚‰4ๅ•้ธๆŠž๏ผ‰ ๅ•2 ็ตŒๅ–ถๆˆฆ็•ฅ โ—‹๏ผˆ่จˆ็ฎ—ๅ•้กŒใŒใชใ‘ใ‚Œใฐ่งฃใ๏ผ‰ ่จˆ็ฎ—ๅ•้กŒใŒ่‹ฆๆ‰‹ใ€‚ใใ‚Œไปฅๅค–ใฏ่งฃใ‘ใใ† ๅ•3 ใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐ ร— ้ŽๅŽปๅ•ใ‚’่งฃใ„ใŸ็ตๆžœใ€่งฃใใฎใซๆ™‚้–“ใŒใ‹ใ‹ใฃใŸใŸใ‚ ๅ•4 ใ‚ทใ‚นใƒ†ใƒ ใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃ ร— ้ŽๅŽปๅ•ใ‚’่งฃใ„ใŸ็ตๆžœใ€่งฃใใฎใซๆ™‚้–“ใŒใ‹ใ‹ใฃใŸใŸใ‚ ๅ•5 ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ โ–ณ ๅ•6 ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚น โ—Ž ้ŽๅŽปๅ•ใ‚’่งฃใ„ใŸ็ตๆžœใ€ใงใใŒ่‰ฏใ„ๆ–นใ ใฃใŸ ๅ•7 ็ต„่พผใฟใ‚ทใ‚นใƒ†ใƒ ้–‹็™บ โ—‹๏ผˆ่จˆ็ฎ—ๅ•้กŒใŒใชใ‘ใ‚Œใฐ่งฃใ๏ผ‰ ่จˆ็ฎ—ๅ•้กŒ๏ผˆใ‚ฏใƒญใƒƒใ‚ฏๅ‘จๆณขๆ•ฐ๏ผ‰ใŒ่‹ฆๆ‰‹ใ€‚ใใ‚Œไปฅๅค–ใฏ่งฃใ‘ใใ† ๅ•8 ๆƒ…ๅ ฑใ‚ทใ‚นใƒ†ใƒ ้–‹็™บ โ—Ž ้ŽๅŽปๅ•ใ‚’่งฃใ„ใŸ็ตๆžœใ€ใงใใŒ่‰ฏใ„ๆ–นใ ใฃใŸ ๅ•9 ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใƒžใƒใ‚ธใƒกใƒณใƒˆ โ–ณ ๅ•10 ITใ‚ตใƒผใƒ“ใ‚นใƒžใƒใ‚ธใƒกใƒณใƒˆ โ–ณ ๅ•11 ใ‚ทใ‚นใƒ†ใƒ ็›ฃๆŸป โ–ณ ๅ—้จ“ใ—ใŸๆ„Ÿๆƒณ ไธŠๆ‰‹ใใ„ใฃใŸใ“ใจ ๆ™‚่จˆใ‚’ๆŒๅ‚ใ—ใŸ ไผšๅ ดใŒใƒ›ใƒ†ใƒซใฎๅฎดไผšๅ ดใฟใŸใ„ใชใจใ“ใ‚ใงใ€ๆ™‚่จˆใŒ็„กใ‹ใฃใŸใฎใงๆŒใฃใฆใใฆ่‰ฏใ‹ใฃใŸ ใŠๆ˜ผใ”้ฃฏใ‚’ๆŒๅ‚ใ—ใŸ ไผ‘ใฟๆ™‚้–“ใŒ1ๆ™‚้–“๏ผˆๆบ–ๅ‚™ๆ™‚้–“ใชใฉใŒใ‚ใ‚‹ใฎใงๅฎŸ่ณช40ๅˆ†ใใ‚‰ใ„๏ผ‰ใ—ใ‹ใชใ„ใฎใงใ€่ฒทใ„ใซ่กŒใๆ™‚้–“ใŒใชใ„ ใกใชใฟใซใ€ๅˆๅ‰่ฉฆ้จ“ใ‚’้€”ไธญ้€€ๅ‡บใ—ใฆใ„ใ‚‹ไบบใ‚‚็ตๆง‹ใ„ใŸๆฐ—ใŒใ™ใ‚‹ใ€‚้€”ไธญ้€€ๅ‡บใ™ใ‚Œใฐใ‚‚ใ†ๅฐ‘ใ—ๆ™‚้–“ใ‚’ๆปๅ‡บใงใใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใชใ„๏ผˆ็งใฏ้€”ไธญ้€€ๅ‡บใ—ใชใ‹ใฃใŸ๏ผ‰ ๅˆๅ‰ๅ•้กŒใฏ่ฆ‹่ฆšใˆใฎใ‚ใ‚‹ๅ•้กŒใŒใŸใใ•ใ‚“ๅ‡บใฆใใŸ ใ€Œ้ŽๅŽปๅ•5ๅนดๅˆ†่งฃใ„ใฆใŠใ‘ใฐๅคงไธˆๅคซใ€ใจใ„ใ†ๅ™‚ใ‚’่žใ„ใŸใŒใ€ใใฎ้€šใ‚Šใ‹ใ‚‚ใ—ใ‚Œใชใ„ ๅคฑๆ•—ใ—ใŸใ“ใจ ๅˆๅพŒๅ•้กŒใฎๆ™‚้–“้…ๅˆ†ใƒŸใ‚น ไบ‹ๅ‰ใซ็ซ‹ใฆใŸ่จˆ็”ป ๆ™‚ๅˆป ๆ™‚้–“ ใ‚„ใ‚‹ใ“ใจ 13:00๏ฝž13:10 10ๅˆ† ใฉใฎๅˆ†้‡Žใ‚’่งฃใใ‹ๆฑบใ‚ใ‚‹ 13:10๏ฝž13:35 25ๅˆ† ๅ•1๏ผšใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ 13:35๏ฝž14:00 25ๅˆ† ๅ•6๏ผšใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚น 14:00๏ฝž14:25 25ๅˆ† ๅ•8๏ผšๆƒ…ๅ ฑใ‚ทใ‚นใƒ†ใƒ ้–‹็™บ 14:25๏ฝž14:50 25ๅˆ† ๅ•2ใ‹ๅ•7๏ผˆ้›ฃใ—ใ„ๅ ดๅˆใฏๅ•5ใ‹ๅ•9๏ฝž11๏ผ‰ 14:50๏ฝž15:15 25ๅˆ† ๅ•2ใ‹ๅ•7๏ผˆ้›ฃใ—ใ„ๅ ดๅˆใฏๅ•5ใ‹ๅ•9๏ฝž11๏ผ‰ 15:15๏ฝž15:30 15ๅˆ† ่ฆ‹็›ดใ— ็พๅฎŸ ๆ™‚ๅˆป ๆ™‚้–“ ใ‚„ใฃใŸใ“ใจ ๆ€ใฃใŸใ“ใจ 13:00๏ฝž13:10 10ๅˆ† ใฉใฎๅˆ†้‡Žใ‚’่งฃใใ‹ๆฑบใ‚ใ‚‹ ใƒป10ๅˆ†ใ‹ใ‘ใฆๅ•้กŒใ‚’่ฆ‹ใŸใŒใ€่ฟทใฃใฆใ„ใ‚‹ใ†ใกใซๆ™‚้–“ใŒ้ŽใŽใŸใ€‚็ตๅฑ€ใ“ใฎ10ๅˆ†ใงใฏใฉใฎๅˆ†้‡Žใ‚’่งฃใใ‹ๆฑบใ‚ใใ‚Œใชใ‹ใฃใŸ ใƒปใ“ใฎๆ™‚้–“ใ‚’ใ‚‚ใฃใจ็Ÿญใใ—ใฆๅ•้กŒใ‚’่งฃใๆ™‚้–“ใซใ‚ใฆใ‚Œใฐ่‰ฏใ‹ใฃใŸ 13:10๏ฝž13:35 25ๅˆ† ๅ•1๏ผšใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ ใƒป25ๅˆ†้–“ใ€็›ฎไธ€ๆฏๆ™‚้–“ใ‚’ไฝฟใฃใฆใ—ใพใฃใŸใŒใ€ใ“ใ‚ŒไปฅไธŠ็ญ”ใˆใŒๅŸ‹ใพใ‚‰ใชใ„ใจๆ€ใฃใŸๆ™‚็‚นใงๆ—ฉใ‚ใซๅˆ‡ใ‚ŠไธŠใ’ใฆไป–ใฎๅ•้กŒใ‚’่งฃใในใใ ใฃใŸ ใƒป1ๅ•ใ‚ใŸใ‚Š25ๅˆ†้–“ไฝฟใ†ใจๆฑบใ‚ใฆใ„ใŸใฎใŒไป‡ใจใชใฃใŸ 13:35๏ฝž14:15 40ๅˆ† ๅ•6๏ผšใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚น ใƒปๅ•้กŒใ‚’่ชญใ‚€ใฎใซๆ™‚้–“ใŒใ‹ใ‹ใฃใฆใ—ใพใฃใŸ ใƒป25ๅˆ†ใง่งฃใ“ใ†ใจๆฐ—ใ‚’ไป˜ใ‘ใฆใฏใ„ใŸใŒใ€ใ“ใ“ใงไธญ้€”ๅŠ็ซฏใซใ‚„ใ‚ใ‚‹ใ‚ˆใ‚Šใฏ่งฃใใใฃใŸๆ–นใŒ่‰ฏใ„ใฎใงใฏโ€ฆ๏ผŸใจๆ€ใ„ใ€็ตๅฑ€15ๅˆ†ใใ‚‰ใ„ใ‚ชใƒผใƒใƒผ 14:15๏ฝž14:40 25ๅˆ† ๅ•8๏ผšๆƒ…ๅ ฑใ‚ทใ‚นใƒ†ใƒ ้–‹็™บ ใƒปใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใจๆƒ…ๅ ฑใ‚ทใ‚นใƒ†ใƒ ้–‹็™บใฏ็ตถๅฏพใซ่งฃใใจๆฑบใ‚ใฆใ„ใŸใŒใ€ๆ–‡็ซ ้‡ใŒๅคšใใฆ่‹ฆๅŠดใ—ใŸ ใƒปๅ•้กŒใ‚’่ชญใ‚“ใงใ„ใฆใ‚‚ใชใ‹ใชใ‹้ ญใซๅ…ฅใฃใฆใ“ใชใใฆใ‚ญใƒ„ใ‹ใฃใŸใฎใงใ€25ๅˆ†็ตŒใฃใŸใจใ“ใ‚ใงไธ€ๆ—ฆใ‚„ใ‚ใฆๅพŒๅ›žใ—ใซใ—ใŸ 14:40๏ฝž15:05 25ๅˆ† ๅ•7๏ผš็ต„่พผใฟใ‚ทใ‚นใƒ†ใƒ ้–‹็™บ 15:05๏ฝž15:25 20ๅˆ† ๅ•11๏ผšใ‚ทใ‚นใƒ†ใƒ ็›ฃๆŸป ใƒปๆฎ‹ใ‚Š1ๅ•ใฉใ‚Œ่งฃใใ‹่ฟทใฃใŸใŒใ€1็•ชๆ–‡็ซ ้‡ใŒๅฐ‘ใชใใ†ใซ่ฆ‹ใˆใŸ็›ฃๆŸปใซใ—ใŸ 15:25๏ฝž15:30 5ๅˆ† ๅ•8๏ผšๆƒ…ๅ ฑใ‚ทใ‚นใƒ†ใƒ ้–‹็™บ ใƒปใฉใ†ใ—ใ‚ˆใ†ใ‚‚ใชใ„ใฎใง้ฉๅฝ“ใซๅŸ‹ใ‚ใŸ ใฉใฎๅ•้กŒใ‚’่งฃใใ‹ๆฑบใ‚ใ‚‹ใ‹10ๅˆ†ใ‚‚ใ‹ใ‘ใฆๆ‚ฉใ‚“ใงใ—ใพใฃใŸ ใฉใฎๅ•้กŒใŒ่งฃใ‘ใใ†ใ‹ใ€็ด ๆ—ฉใ่ฆ‹ๆฅตใ‚ใ‚‰ใ‚Œใ‚‹ๅŠ›ใŒๅฟ…่ฆ ๆ™‚้–“ใŒ่ถณใ‚Šใš็„ฆใฃใฆใ—ใพใ„ใ€ๅ•้กŒๆ–‡ใŒ้ ญใซๅ…ฅใฃใฆใ“ใชใ‹ใฃใŸ ่ฉฆ้จ“ไธญใซใ€Œๅ•8๏ผšๆƒ…ๅ ฑใ‚ทใ‚นใƒ†ใƒ ้–‹็™บใ€ใฎๅ•้กŒๆ–‡ใ‚’่ชญใ‚“ใ ๆ™‚ใฏใชใ‹ใชใ‹็†่งฃใงใใชใ‹ใฃใŸใŒใ€ๅพŒใง่ฝใก็€ใ„ใฆๅ•้กŒใ‚’่ชญใ‚“ใงใฟใŸใ‚‰ใ€่งฃใ‘ใชใ„ๅ•้กŒใงใฏใชใ‹ใฃใŸ ๅฎŸ้š›ใซ่ฉฆ้จ“ใ‚’ๅ—ใ‘ใ‚‹ๅ‰ใซใ€ๆ™‚้–“ใ‚’่จˆใฃใฆๆจกๆ“ฌ่ฉฆ้จ“ใ‚’ใ‚„ใ‚Œใฐ่‰ฏใ‹ใฃใŸ ใ“ใ‚“ใชใซๆ™‚้–“ใŒ่ถณใ‚Šใชใใชใฃใฆ็„ฆใ‚‹ใจๆ€ใ‚ใชใ‹ใฃใŸ ็ตๆžœ ใฉใกใ‚‰ใ‚‚60็‚นไปฅไธŠใงๅˆๆ ผใงใ™ใ€‚ ๅˆๅ‰๏ผš73.75็‚น๏ผˆๅˆๆ ผ๏ผ‰ ๅˆๅพŒ๏ผš58.00็‚น๏ผˆ2็‚น่ถณใ‚Šใšไธๅˆๆ ผ๏ผ‰ ๅˆๅพŒใฏๆ‰‹ใ”ใŸใˆ็š„ใซใฏๅ…จ็„ถใงใใฆใ„ใชใ„ใ‚ˆใ†ใชๆ„Ÿใ˜ใŒใ—ใŸใฎใงใ™ใŒใ€ๆ€ใฃใŸใ‚ˆใ‚Šใ‚‚็‚นๆ•ฐใŒๅ–ใ‚Œใฆใ„ใพใ—ใŸใ€‚ ๆ™‚้–“้…ๅˆ†ใ•ใˆใƒŸใ‚นใ—ใชใ‘ใ‚Œใฐใ€ใ‚‚ใ—ใ‹ใ—ใŸใ‚‰ๅ—ใ‹ใฃใฆใ„ใŸใฎใงใฏ…ใจๆ€ใ†ใจๆ‚”ใ—ใ„ใงใ™ใŒใ€ไธŠ่จ˜ใฎๅคฑๆ•—ใ‚’็ณงใซใ€10ๆœˆใฎ่ฉฆ้จ“ใฏ็„กไบ‹ใซๅˆๆ ผใ™ใ‚‹ใ“ใจใŒใงใใŸใฎใงใ‚ˆใ—ใจใ—ใพใ™ใ€‚ ่ฉฆ้จ“ๅ‹‰ๅผทใ‚’ใ™ใ‚‹ใ“ใจใซๅŠ ใˆใฆใ€ๅฎŸ้š›ใฎ่ฉฆ้จ“ใงใฉใ†่กŒๅ‹•ใ™ใ‚‹ใ‹๏ผˆใฉใฎๅ•้กŒใ‚’่งฃใใ‹ใ€ๆ™‚้–“้…ๅˆ†ใฏใฉใ†ใ™ใ‚‹ใ‹๏ผ‰ใ‚’ๅฟตๅ…ฅใ‚Šใซใ‚ทใƒŸใƒฅใƒฌใƒผใ‚ทใƒงใƒณใ—ใฆใŠใใ“ใจใŒใ€ๅˆๆ ผใฎ้ตใจใชใ‚‹ใฎใงใฏใชใ„ใ‹ใจๆ„Ÿใ˜ใพใ—ใŸใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใ“ใฎ่จ˜ไบ‹ใฏใ€ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022 24ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚ ใฏใ˜ใ‚ใซ ๆ˜จๆ—ฅใซๅผ•ใ็ถšใใ€ไผšๅ“กใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ—ใฎๅฑฑ็”ฐใงใ™ใ€‚ ๅ‰ๅ›žใฏJetpack Composeใฎใ‚ˆใ‹ใฃใŸ็‚นใซใคใ„ใฆใงใ—ใŸใŒใ€ไปŠๅ›žใฏใ‚คใƒžใ‚คใƒใ ใฃใŸ็‚นใซใชใ‚Šใพใ™ใ€‚ ใ‚คใƒžใ‚คใƒใ ใฃใŸ็‚น ๅ‰ๅ›žๅŒๆง˜ใ€่จ˜่ผ‰ใ™ใ‚‹ใ‚ณใƒผใƒ‰ใฏ็ฐก็•ฅๅŒ–ใฎ้ƒฝๅˆไธŠใ€ไธ€้ƒจใฎๅฑžๆ€งๅ€คใชใฉใ‚’็œ็•ฅใ—ใฆใ„ใพใ™ใ€‚ Navigation ComposeใŒใคใ‚‰ใ„ Jetpack Composeใง็”ป้ข้ท็งปใ‚’ๅฎŸ่ฃ…ใ—ใ‚ˆใ†ใจใ™ใ‚‹ๅ ดๅˆใ€ๆ‰‹ๆฎตใฏๅคงใใ2้€šใ‚Šใ‚ใ‚Šใพใ™ใ€‚ FragmentใงComposeใ‚’ๆ็”ปใ—ใ€ActivityไธŠใงFragmentใ‚’ๅˆ‡ใ‚Šๆ›ฟใˆใ‚‹ใ“ใจใซใ‚ˆใ‚Š็”ป้ข้ท็งปใ™ใ‚‹ fragmentTransactionใ‚’ไฝฟใ†ใ‹ใ€ Navigation Component ใ‚’ๅˆฉ็”จใ™ใ‚‹ Fragmentใ‚’ไฝฟใ‚ใšใ€ActivityไธŠใงๆ็”ปใ™ใ‚‹Compose้–ขๆ•ฐใ‚’ๅˆ‡ใ‚Šๆ›ฟใˆใ‚‹ ๅพŒ่€…ใ‚’ๅฎŸ็พใ™ใ‚‹ใŸใ‚ใฎใƒฉใ‚คใƒ–ใƒฉใƒชใŒ Navigation Compose ใงใ™ใ€‚ใ“ใ‚ŒใฏNavigation ComponentใฎJetpack Compose็‰ˆใชใฎใงใ™ใŒใ€ไฝฟใ„ๅ‹ๆ‰‹ใŒๅคงใใ็•ฐใชใฃใฆใ„ใพใ™ใ€‚ ๅฎš็พฉใฎ้•ใ„ Navigation Componentใงใฏใ€็”ป้ข้ท็งปใฎๅฎš็พฉใฏไปฅไธ‹ใฎใ‚ˆใ†ใซXMLใง่กŒใฃใฆใ„ใพใ—ใŸใ€‚ <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_graph" app:startDestination="@id/fragment1"> <fragment android:id="@+id/fragment1" android:name="com.example.navigationsample.Page1Fragment"> <action android:id="@+id/action_fragment1_to_fragment2" app:destination="@id/fragment2" /> </fragment> <fragment android:id="@+id/fragment2" android:name="com.example.navigationsample.Page2Fragment" android:label="Fragment2" tools:layout="@layout/fragment_page2"/> </navigation> <navigation>ใฎไธญใซๅ„็”ป้ขใ‚’<fragment>ใจใ—ใฆ่จญ็ฝฎใ—ใ€IDใ‚„Fragmentใฎใ‚ฏใƒฉใ‚นใชใฉใ‚’ๆŒ‡ๅฎš ๆœ€ๅˆใซ่กจ็คบใ•ใ‚Œใ‚‹็”ป้ขใฏstartDestinationๅฑžๆ€งใงๆŒ‡ๅฎš ็”ป้ข้–“ใฎ้ท็งปใฏ<action>ใจใ—ใฆๆŒ‡ๅฎš ไธ€ๆ–นใ€Navigation Composeใงใฏไปฅไธ‹ใฎใ‚ˆใ†ใซๆŒ‡ๅฎšใ—ใพใ™ใ€‚ @Composable fun Router() { val navController = rememberAnimatedNavController() NavHost( navController = navController, startDestination = "page1", ) { composable("page1") { Page1(navController) } composable("page2") { Page2(navController) } } } NavHost้–ขๆ•ฐใฎไธญใซๅ„็”ป้ขใ‚’composableใจใ—ใฆ่จญ็ฝฎใ—ใ€ๅ‘ผใณๅ‡บใ™Composable้–ขๆ•ฐใ‚’ๆŒ‡ๅฎš ๆœ€ๅˆใซ่กจ็คบใ•ใ‚Œใ‚‹็”ป้ขใฏๅผ•ๆ•ฐใฎstartDestinationใงๆŒ‡ๅฎš ็”ป้ข้–“ใฎ้ท็งปใฎๅฎš็พฉใฏๅญ˜ๅœจใ—ใชใ„ actionใฎๅฎš็พฉใŒใชใ„ไปฅๅค–ใฏNavigation ComponentใจใปใผๅŒใ˜ใ‚ˆใ†ใช่จ˜่ฟฐใงใ™ใŒใ€ไฝฟใฃใฆใฟใ‚‹ใจ่พ›ใ•ใŒ่กจใ‚Œใฆใใพใ™ใ€‚ ็”ป้ข้ท็งปใŒๅž‹ๅฎ‰ๅ…จใงใชใ„ Navigation ComponentใงใฏSafe Argsใจใ„ใ†ๆฉŸ่ƒฝใŒใ‚ใ‚Šใ€XMLใฎๅฎš็พฉใ‹ใ‚‰ใ‚ฏใƒฉใ‚นใ‚’่‡ชๅ‹•็”Ÿๆˆใ—ใฆใใ‚Œใพใ™ใ€‚ใ“ใ‚Œใ‚’ๅˆฉ็”จใ—ใฆ็”ป้ข้ท็งปใŒไปฅไธ‹ใฎใ‚ˆใ†ใซ่กŒใˆใพใ—ใŸใ€‚ val action = Page1FragmentDirections .actionFragment1ToFragment2() findNavController().navigate(action) Page1FragmentDirectionsใŒ่‡ชๅ‹•็”Ÿๆˆใ•ใ‚ŒใŸใ‚ฏใƒฉใ‚นใงใ€ใ“ใ‚ŒใฏXMLใซ่จ˜่ผ‰ใ•ใ‚ŒใŸactionใฎๅฎš็พฉใ‹ใ‚‰ไฝœใ‚‰ใ‚Œใฆใ„ใพใ™ใ€‚ใ“ใฎใŸใ‚ใ€XMLใซ่จ˜่ผ‰ใ•ใ‚Œใฆใ„ใชใ„้ท็งปใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใ‚’้˜ฒๆญขใงใใฆใ„ใพใ—ใŸใ€‚ ไธ€ๆ–นใ€Navigation Composeใงใฏไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ navController.navigate("page2") ็”ป้ข้ท็งปใฏ้ท็งปๅ…ˆใฎ็”ป้ขใ‚’ๆ–‡ๅญ—ๅˆ—ใงๆŒ‡ๅฎšใ—ใพใ™ใ€‚่ชคใฃใŸๆ–‡ๅญ—ๅˆ—ใ‚’ไธŽใˆใฆใ—ใพใ†ใ“ใจใ‚‚่ตทใ“ใ‚Šๅพ—ใพใ™ใ—ใ€ใƒชใƒ•ใ‚กใ‚ฏใ‚ฟใƒชใƒณใ‚ฐใงๅๅ‰ใ‚’ๅค‰ใˆใŸใจใ—ใฆใ‚‚่ฟฝๅพ“ใงใใพใ›ใ‚“ใ€‚ ็”ป้ข้–“ใฎๅผ•ๆ•ฐๆธกใ—ใŒใคใ‚‰ใ„ ็”ป้ข้ท็งปๆ™‚ใซ็”ป้ข้–“ใงใƒ‡ใƒผใ‚ฟใฎๅ—ใ‘ๆธกใ—ใ‚’่กŒใŠใ†ใจใ™ใ‚‹ใจใ‚ˆใ‚Š่พ›ใใชใ‚Šใพใ™ใ€‚ Navigation Componentใงใฏactionใซๅผ•ๆ•ฐใ‚’่จญๅฎšใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ <action android:id="@+id/action_fragment1_to_fragment2" app:destination="@id/fragment2"> <argument android:name="text" app:argType="string" android:defaultValue="hoge" /> </action> ใ“ใ†ใ—ใฆ่จญๅฎšใ•ใ‚ŒใŸๅผ•ๆ•ฐใ‚„ๅผ•ๆ•ฐใฎๅž‹ใฏ่‡ชๅ‹•็”Ÿๆˆใ‚ฏใƒฉใ‚นใซใ‚‚ๅๆ˜ ใ•ใ‚Œใ‚‹ใฎใงใ€ไปฅไธ‹ใฎใ‚ˆใ†ใซๅž‹ๅฎ‰ๅ…จใซๅˆฉ็”จใงใใพใ™ใ€‚ val action = Page1FragmentDirections .actionFragment1ToFragment2("hoge") findNavController().navigate(action) ๅ†…้ƒจใงใฏBundleใŒๅˆฉ็”จใ•ใ‚ŒใฆใŠใ‚Šใ€ๅผ•ๆ•ฐใŒBundleใซ่ฉฐใ‚ใ‚‰ใ‚Œใฆ้ท็งปๅ…ˆFragmentใซๆธกใ•ใ‚Œใ‚‹ใ“ใจใซใชใ‚Šใพใ™ใ€‚ ไธ€ๆ–นใงNavigation Composeใงใฏไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ composable( "page2/{text}", arguments = listOf( navArgument("text") { type = NavType.StringType } ) ) { backStackEntry -> val text = backStackEntry.arguments?.getString("text") Page2(navController, text) } ็”ป้ข้–“ใฎใƒ‡ใƒผใ‚ฟๆธกใ—ใฏURLๅฝขๅผใฎๆ–‡ๅญ—ๅˆ—ใซใ‚ˆใ‚Š่กŒใ‚ใ‚Œใพใ™ใ€‚ๅฟ…้ ˆๅผ•ๆ•ฐใฏใƒ‘ใ‚นใƒ‘ใƒฉใƒกใƒผใ‚ฟใ€้žๅฟ…้ ˆใƒ‘ใƒฉใƒกใƒผใ‚ฟใฏใ‚ฏใ‚จใƒชใƒ‘ใƒฉใƒกใƒผใ‚ฟใฎๅฝขใง่จ˜่ฟฐใ—ใพใ™ใ€‚ ้ท็งปใฎๅ‘ผใณๅ‡บใ—ๅดใฏไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ navController.navigate("page2/hoge") ใ“ใ“ใงใ‚‚ๅž‹ๅฎ‰ๅ…จๆ€งใŒๅคฑใ‚ใ‚Œใฆใ„ใพใ™ใ€‚ๆ–‡ๅญ—ๅˆ—ใจใ—ใฆใฏใชใ‚“ใงใ‚‚ๆธกใ™ใ“ใจใŒใงใใฆใ—ใพใ†ใŸใ‚ใ€ใƒ“ใƒซใƒ‰ๆ™‚ใซ่ชคใ‚Šใซๆฐ—ใฅใใ“ใจใฏไธๅฏ่ƒฝใงใ™ใ€‚ ๅŠ ใˆใฆURLๅฝขๅผๆ–‡ๅญ—ๅˆ—ใงใ‚ใ‚‹ใ“ใจใ‚‚ใƒใƒƒใ‚ฏใงใ€ ๅผ•ๆ•ฐใซใ‚นใƒฉใƒƒใ‚ทใƒฅใชใฉใŒๅซใพใ‚Œใ‚‹ ๅผ•ๆ•ฐใŒใƒใ‚คใƒˆๅˆ—ใงใ‚ใ‚‹ ใชใฉใฎๅ ดๅˆใฏใ‚จใ‚นใ‚ฑใƒผใƒ—ใ‚„BASE64ใ‚จใƒณใ‚ณใƒผใƒ‰ใ‚’่‡ชๅˆ†ใง่กŒใ†ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ๅฝ“็„ถใ€ๅ—ใ‘ๅ–ใ‚‹ๅดใฏ้€†ใฎๅ‡ฆ็†ใŒๅฟ…่ฆใซใชใ‚Šใพใ™ใ€‚ ใ“ใ‚Œใ‚‰ใ‚’ใชใ‚‹ในใๅฎ‰ๅ…จใซๆ‰ฑใˆใ‚‹ใ‚ˆใ†ใซใ€ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏsealed classใซใ‚ˆใ‚‹้ท็งปๅ…ˆ็ฎก็†ใ‚’่กŒใฃใฆใ„ใพใ™ใ€‚Googleใฎๅ…ฌๅผใ‚ตใƒณใƒ—ใƒซใงใฏๅฎšๆ•ฐๅ€คใ‚„enumใชใฉใง็ฎก็†ใ‚’่กŒใฃใฆใ„ใ‚‹ใ‚ˆใ†ใงใ™ใ€‚ sealed class MainRoute(val route: string) { object Page1 : MainRoute("page1") object Page2 : MainRoute("page2/{text}") { fun createRoute(text: string) { return "page2/${text}" } } } ้ท็งปใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใฎไธๅ…ทๅˆ Navigation Componentใงใฏ็”ป้ข้ท็งปๆ™‚ใฎใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใŒ่จญๅฎšใงใใŸใฎใงใ™ใŒใ€Navigation ComposeใซใฏใใฎๆฉŸ่ƒฝใŒ(2022ๅนด12ๆœˆ็พๅœจ)ๅญ˜ๅœจใ—ใพใ›ใ‚“ใ€‚ ๅพ“ๆฅใ‚ใฃใŸๆฉŸ่ƒฝใงJetpack ComposeใซๆœชๅฎŸ่ฃ…ใชๆฉŸ่ƒฝใ‚’่ฃœๅฎŒใ™ใ‚‹ใ‚‚ใฎใจใ—ใฆใ€ Accompanist ใƒฉใ‚คใƒ–ใƒฉใƒชใŒๅญ˜ๅœจใ—ใฆใ„ใพใ™ใ€‚ไบ‹ๅฎŸไธŠใฎๅŠๅ…ฌๅผใƒฉใ‚คใƒ–ใƒฉใƒชใงใ€ใ“ใ“ใซNavigation Animationใจใ„ใ†ใ‚‚ใฎใŒๅญ˜ๅœจใ™ใ‚‹ใฎใงใ“ใกใ‚‰ใ‚’ไฝต็”จใ™ใ‚‹ใ“ใจใซใชใ‚‹ใฎใงใ™ใŒใ€ใ“ใ‚Œใ‚’ๅˆฉ็”จใ—ใŸใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใซไธๅ…ทๅˆใŒใ‚ใ‚Šใพใ™ใ€‚ ใพใšใฏNavigation ComponentใงๅฎŸ่ฃ…ใ—ใŸใ‚‚ใฎใงใ™ใ€‚ 1ใค็›ฎใฎ็”ป้ขใฎไธŠใซ2ใค็›ฎใฎ็”ป้ขใŒใ‚นใƒฉใ‚คใƒ‰ใ‚คใƒณใ—ใ€ๆˆปใ‚‹ๆ“ไฝœใงใ‚นใƒฉใ‚คใƒ‰ใ‚ขใ‚ฆใƒˆใ—ใพใ™ใ€‚ ไธ€ๆ–นใงNavigation ComposeใงใฎๅฎŸ่ฃ…ใงใ™ใ€‚ ใ‚นใƒฉใ‚คใƒ‰ใ‚คใƒณใฏๆญฃๅธธใซ่กŒใ‚ใ‚Œใ‚‹ใฎใงใ™ใŒใ€ใ‚นใƒฉใ‚คใƒ‰ใ‚ขใ‚ฆใƒˆใŒใŠใ‹ใ—ใใชใฃใฆใ„ใพใ™ใ€‚ ็พ็ŠถใฎAccompanistใฎๅฎŸ่ฃ…ใงใฏ็”ป้ขใฎใ‚นใ‚ฟใƒƒใ‚ฏ็Šถๆ…‹ใ‚’่€ƒๆ…ฎใ—ใฆใŠใ‚‰ใšใ€ๅธธใซ้ท็งปๅ…ˆใฎ็”ป้ขใŒไธŠใซๆ็”ปใ•ใ‚Œใพใ™ใ€‚ใ“ใฎใŸใ‚ใ€ๆˆปใ‚‹ๆ“ไฝœใ‚’่กŒใ†ใจๆ็”ป้ †ใŒ้€†่ปขใ—ใฆใ—ใพใ„ใ€ใ“ใฎใ‚ˆใ†ใช็ตๆžœใซใชใ‚Šใพใ™ใ€‚ ใƒžใ‚คใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ“ใ‚Œใ‚’่งฃๆถˆใงใใชใ‹ใฃใŸใŸใ‚ใ€้ท็งปๆ™‚ใซ็”ป้ขๅŒๅฃซใŒ้‡ใชใ‚‰ใชใ„ใ‚ˆใ†ใชใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใฎใฟใ‚’ๅˆฉ็”จใ™ใ‚‹ใ“ใจใงๅ›ž้ฟใ—ใฆใ„ใพใ™ใ€‚ ๅ…ˆๆœˆๅ…ฌ้–‹ใ•ใ‚ŒใŸAccompanist 0.27.1ใง z-orderใฎๅค‰ๆ›ดใŒๅ…ฅใฃใŸ ใŸใ‚ใ€็พๅœจใงใฏใ“ใฎไธๅ…ทๅˆใฏไฟฎๆญฃใ•ใ‚Œใฆใ„ใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚ AppBarใ‚’ๆ“ไฝœใงใใชใ„ ๅพ“ๆฅใฎActivityใจFragmentใซใ‚ˆใ‚‹ๅฎŸ่ฃ…ใฎๅ ดๅˆใ€็”ป้ข้–“ใงๅ…ฑ้€šใ—ใฆๅˆฉ็”จใ™ใ‚‹AppBarใ‚„BottomAppBarใฎใ‚ˆใ†ใชใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฏActivityใงๅฎŸ่ฃ…ใ—ใ€ๅˆ‡ใ‚Šๆ›ฟใ‚ใ‚‹็”ป้ขใฎใฟใ‚’FragmentใงๅฎŸ่ฃ…ใ™ใ‚‹ใ“ใจใŒๅคšใ‹ใฃใŸใ‹ใจๆ€ใ„ใพใ™ใ€‚ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚’ๅพ“ๆฅใฎๆ–นๆณ•ใงๅฎŸ่ฃ…ใ™ใ‚‹ใชใ‚‰ไปฅไธ‹ใฎใ‚ˆใ†ใซๅˆ†ๅ‰ฒใ—ใŸใงใ—ใ‚‡ใ†ใ€‚ ๅ…ฑ้€šๅˆฉ็”จใจใฏ่จ€ใ„ใคใคใ€AppBarใฎ่กจ็คบๅ†…ๅฎนใฏ็”ป้ขใซใ‚ˆใฃใฆ็•ฐใชใ‚‹ใ“ใจใŒๅคšใ„ใ‹ใจๆ€ใ„ใพใ™ใ€‚AppBarใฎ้ ˜ๅŸŸใฏFragmentใฎ็ฎก็†ๅค–ใซใชใ‚‹ใฏใšใงใ™ใŒใ€FragmentใฎonCreateMenu()ใ‚’ๅˆฉ็”จใ™ใ‚‹ใ“ใจใงไพ‹ๅค–็š„ใซๆ›ธใๆ›ใˆใŒๅฏ่ƒฝใงใ—ใŸใ€‚ Navigation ComposeใงใฏFragmentใ‚’ๅˆฉ็”จใ—ใชใ„ใŸใ‚ใ€ใ“ใฎใ‚ˆใ†ใชๆ›ธใๆ›ใˆใŒไธๅฏ่ƒฝใงใ™ใ€‚ ็”ป้ขๅˆฅใซๅ‡บใ—ๅˆ†ใ‘ใ‚’่กŒใ†ใซใฏใ€ไธŠไฝใฎ็พๅœจใฎ็”ป้ข็Šถๆ…‹ใ‚’StateใซๆŒใฃใฆ TopAppBar( title = { if (currentScreen == "page1") { Text("Page1") } else { ... } } ) ใฎใ‚ˆใ†ใชๅˆ†ๅฒๅ‡ฆ็†ใ‚’ๅ…ฅใ‚Œใ–ใ‚‹ใ‚’ๅพ—ใšใ€็”ป้ขๆ•ฐใŒๅข—ใˆใ‚‹ใปใฉๅˆ†ๅฒใŒๅข—ใˆใ‚‹ๅฅฝใพใ—ใใชใ„ๅฎŸ่ฃ…ใซใชใฃใฆใ—ใพใ„ใพใ™ใ€‚ ้žๅŠน็އใซใฏใชใฃใฆใ—ใพใ„ใพใ™ใŒใ€ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏๅ…ฑ้€š้ƒจๅˆ†ใ‚’ไฝœใ‚‰ใšใ€ๅ„็”ป้ขใงๅˆฅใ€…ใซAppBarใ‚’ๆŒใŸใ›ใ‚‹ๅฎŸ่ฃ…ใจใ—ใฆใ„ใพใ™ใ€‚ ๅพ“ๆฅใฎViewใจใฎ้€ฃๆบ Jetpack ComposeใŒใƒชใƒชใƒผใ‚นใ•ใ‚ŒใŸใจใฏใ„ใˆใ€ใ™ในใฆใฎๆฉŸ่ƒฝใŒJetpack Composeใง่จ˜่ฟฐใงใใ‚‹ใ‚ˆใ†ใซใชใฃใŸใ‚ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚WebViewใ‚’ใฏใ˜ใ‚ใจใ—ใฆใ€ๆ—งๆฅใฎไป•็ต„ใฟ(View)ใงใ—ใ‹่จ˜่ฟฐใงใใชใ„ใ‚‚ใฎใฏๆฎ‹ใฃใฆใ„ใพใ™ใ€‚ Viewใจใฎๆททๅœจใฏๆƒณๅฎšใ•ใ‚Œใฆใ„ใฆใ€ไพ‹ใˆใฐComposeใฎไธญใงWebViewใ‚’ไฝฟใ„ใŸใ‘ใ‚ŒใฐAndroidViewใจใ„ใ†ใ‚‚ใฎใŒใ‚ใ‚Šใพใ™ใ€‚ๅ˜็ด”ใชๅฎŸ่ฃ…ใงใฏใ“ใ‚Œใงๅๅˆ†ใงใ—ใ‚‡ใ†ใ€‚ @Composable fun ComposeWebView(url: string) { AndroidView( factory = { context -> WebView(context) }, update = { view -> view.loadUrl(url) } ) } ใ—ใ‹ใ—ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎๅ ดๅˆใฏPull to RefreshใฎๆฉŸ่ƒฝใŒๅญ˜ๅœจใ—ใฆใŠใ‚Šใ€ๅฎŸ่ฃ…ๅฝ“ๅˆใฏ Pull to Refreshใ‚’Jetpack ComposeใงๅฎŸ่ฃ… WebViewใ‚’AndroidViewใงใƒฉใƒƒใƒ—ใ—ใฆๅฎŸ่ฃ… ใจใ„ใ†็Šถๆ…‹ใงใ—ใŸใ€‚Pull to RefreshใจWebViewใฏใฉใกใ‚‰ใ‚‚ใ‚นใ‚ฏใƒญใƒผใƒซใฎๆฉŸ่ƒฝใ‚’ๆŒใคใŸใ‚ใ€Nested Scrollใ‚’ๅˆฉ็”จใ—ใฆใ‚นใ‚ฏใƒญใƒผใƒซใ‚’ๅˆถๅพกใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใฎใงใ™ใŒใ€ใ“ใ‚ŒใŒJetpack ComposeใจViewใฎ้–“ใงไผๆ’ญใ›ใšใ€ใฉใกใ‚‰ใ‹ใฎใ‚นใ‚ฏใƒญใƒผใƒซใŒๆฉŸ่ƒฝใ—ใชใ„็Šถๆ…‹ใจใชใฃใฆใ„ใพใ—ใŸใ€‚ ใ“ใฎใŸใ‚ใ€ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏPull to RefreshๆฉŸ่ƒฝใ”ใจViewๅดใงๅฎŸ่ฃ…ใ—ใฆใ„ใ‚‹ใฎใงใ™ใŒใ€ใ“ใฎๅผŠๅฎณใจใ—ใฆWebViewๅˆฉ็”จ้ƒจๅˆ†ใฎใƒ—ใƒฌใƒ“ใƒฅใƒผใŒ่กŒใˆใชใ„ใจใ„ใ†็Šถๆ…‹ใซใชใฃใฆใ„ใพใ™ใ€‚ ไธ€้ƒจ็ซฏๆœซใงใฎไธๅ…ทๅˆ ไธ€้ƒจใฎ็ซฏๆœซใงไบˆๆœŸใ—ใชใ„ๅ‹•ไฝœใ‚’ใ™ใ‚‹ใ“ใจใŒใ‚ใ‚Šใพใ—ใŸใ€‚ไพ‹ใˆใฐXiaomiใฎMIUI 13ใ‚’ๆญ่ผ‰ใ—ใŸ็ซฏๆœซใซใŠใ„ใฆใ€ไฝœๆˆใ—ใฆใ„ใชใ„็œŸใฃ็™ฝใฎ็”ป้ขใŒๆŒฟๅ…ฅใ•ใ‚Œใ‚‹ๅ•้กŒใ‚’็ขบ่ชใ—ใฆใŠใ‚Šใ€ issue ใซไธŠใ’ใฆใ„ใพใ™ใ€‚ ใปใจใ‚“ใฉใฎ็ซฏๆœซใงใฏๅ•้กŒใชใๅ‹•ไฝœใ™ใ‚‹ใฎใงใ™ใŒใ€็‰นใซOSใซๅฏพใ™ใ‚‹ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บใŒๅคšใ„ใƒกใƒผใ‚ซใƒผใฎ็ซฏๆœซใงใฏๆณจๆ„ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใใ†ใงใ™ใ€‚ ใŠใ‚ใ‚Šใซ Jetpack Composeใฎใ‚คใƒžใ‚คใƒใช้ƒจๅˆ†ใซใคใ„ใฆใ”็ดนไป‹ใ—ใพใ—ใŸใ€‚ ่ฆ‹ใฆใ„ใŸใ ใ‘ใ‚Œใฐๅˆ†ใ‹ใ‚‹ใจใŠใ‚Šใ€ใปใจใ‚“ใฉใฎๅ•้กŒใฏNavigation Composeใซใ‚ˆใ‚‹ใ‚‚ใฎใงใ—ใŸใ€‚ ใ“ใ“ใ ใ‘ใฏๅพ“ๆฅใฎๆ–นๆณ•ใจๆฏ”ในใฆๆฉŸ่ƒฝ็š„ใชใƒ‡ใ‚ฐใƒฌใƒผใƒ‰ใŒๅคงใใใ€ๆ˜Ž็ขบใซไฝฟใ„ใฅใ‚‰ใ„ใจ่จ€ใˆใ‚‹้ƒจๅˆ†ใงใ™ใ€‚็”ป้ข้ท็งปใ‚’ๅผ•ใ็ถšใFragmentใง่กŒใ†ใ‚ˆใ†ใชๅฎŸ่ฃ…ใ‚‚ๅฏ่ƒฝใชใฎใงใ€ใ™ในใฆJetpack Composeใงๆ›ธใใ“ใจใ‚’่ซฆใ‚ใ‚‹ใจใ„ใ†ใ“ใจใ‚‚ๅๅˆ†้ธๆŠž่‚ขใซๅ…ฅใ‚‹ใฎใงใฏใชใ„ใ‹ใชใจๆ€ใ„ใพใ™ใ€‚ ็ทๅˆ็š„ใซใฏJetpack ComposeๅฐŽๅ…ฅใฎๅˆฉ็‚นใฎๆ–นใŒๅคงใใใ€ไปŠๅพŒใฏใ“ใกใ‚‰ใŒไธปๆตใซใชใฃใฆใ„ใใจๆ€ใ‚ใ‚Œใพใ™ใฎใงใ€ใพใ ๅฐŽๅ…ฅใ•ใ‚Œใฆใ„ใชใ„็š†ๆง˜ใ‚‚ใœใฒๅฐŽๅ…ฅใ‚’ๆคœ่จŽใ—ใฆใฟใฆใใ ใ•ใ„ใ€‚ ๆ˜Žๆ—ฅใฏใŸใ‘ใ‚ใ„ใฉใ•ใ‚“ใซใ‚ˆใ‚‹ใ€Œใ‚ตใƒผใƒ“ใ‚น้–‹็™บใซSvelteKitใ‚’ๅฐŽๅ…ฅใ™ใ‚‹ใŸใ‚ใซ่กŒใชใฃใŸใ‚ขใƒ—ใƒญใƒผใƒใ€ใงใ™ใ€‚ใŠๆฅฝใ—ใฟใซใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event โ€“ NIFTY engineering
ใ“ใฎ่จ˜ไบ‹ใฏใ€ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022 23ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚ ใฏใ˜ใ‚ใซ ไผšๅ“กใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ—ใฎๅฑฑ็”ฐใงใ™ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏๆ˜จๅนด12ๆœˆ(iOS)ใจไปŠๅนด3ๆœˆ(Android)ใซใ€ไผšๅ“กๆง˜ๅ‘ใ‘ใ‚ขใƒ—ใƒชใจใ—ใฆ ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃ ใ‚’ใƒชใƒชใƒผใ‚นใ—ใพใ—ใŸใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใจใ—ใฆใฏไน…ใ—ใถใ‚Šใฎๆ–ฐ่ฆใ‚ขใƒ—ใƒช้–‹็™บใจใชใ‚Šใ€ๆ—ขๅญ˜ใ‚ขใƒ—ใƒชใฎใƒฌใ‚ฌใ‚ทใƒผๅŒ–ใ‚‚้€ฒใ‚“ใงใ„ใŸใ“ใจใ‹ใ‚‰ใ€ๆœฌใ‚ขใƒ—ใƒชใฎ้–‹็™บใงใฏใ‚ผใƒญใƒ™ใƒผใ‚นใงๆŠ€่ก“ใ‚นใ‚ฟใƒƒใ‚ฏใ‚’่ฆ‹็›ดใ—ใ€็พๅœจใฎใ‚ขใƒ—ใƒช้–‹็™บใซใŠใ„ใฆๆจ™ๆบ–็š„ใชๆŠ€่ก“ใซๆƒใˆใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ ใใฎไธญใงAndroidใซใŠใ„ใฆใฏUIๆง‹็ฏ‰ใซJetpack Composeใ‚’้ธๅฎšใ—ใŸใฎใงใ€ใใฎ็ตๆžœใฉใ†ใ ใฃใŸใ‹ใ€ใจใ„ใ†ใ“ใจใซใคใ„ใฆใŠ่ฉฑใ—ใ—ใพใ™ใ€‚ Jetpack Composeใจใฏ 2021ๅนดใซใƒใƒผใ‚ธใƒงใƒณ1.0.0ใŒๅ…ฌ้–‹ใ•ใ‚ŒใŸใ€Android็”จใฎๆ–ฐใ—ใ„ๅ…ฌๅผUIใƒ„ใƒผใƒซใ‚ญใƒƒใƒˆใงใ™ใ€‚ Androidใงใฏใใฎ็™ปๅ ดไปฅๆฅใ€XMLใงUIใ‚’่จ˜่ฟฐใ—ใ€Java/Kotlinใงๆ“ไฝœใ™ใ‚‹ใจใ„ใ†ใ‚นใ‚ฟใ‚คใƒซใงUIใฎๆง‹็ฏ‰ใŒ่กŒใ‚ใ‚Œใฆใใพใ—ใŸใ€‚Databindingใ‚„View Bindingใชใฉใฎ่ฃœๅฎŒๆŠ€่ก“ใŒ็™ปๅ ดใ—ใฆใ‚‚ใ€ใ“ใฎๅŸบๆœฌใฏๅค‰ใ‚ใ‚‰ใšไธ€่ฒซใ—ใฆใ„ใพใ—ใŸใ€‚ Jetpack Composeใฏใ“ใ‚Œใ‚’่ฆ†ใ™่ปขๆ›็‚นใจใชใ‚‹ใƒ„ใƒผใƒซใ‚ญใƒƒใƒˆใงใ™ใ€‚ไธปใซไปฅไธ‹ใฎใ‚ˆใ†ใช็‰นๅพดใ‚’ๆŒใกใพใ™ใ€‚ UIใ‚’ใ™ในใฆKotlinใฎ้–ขๆ•ฐใซใ‚ˆใ‚Š่จ˜่ฟฐใ™ใ‚‹ ๅฎฃ่จ€็š„UIใฎๆŽก็”จ ็‰นใซReactใงไธ€ๅคงใƒ ใƒผใƒ–ใƒกใƒณใƒˆใ‚’ๅทปใ่ตทใ“ใ—ใŸๅฎฃ่จ€็š„UIใฎๆŽก็”จใŒ็‰นๅพด็š„ใงใ€ไปŠใพใงใฎใ€ŒXMLใซๆ›ธใ„ใŸใ‚‚ใฎใ‚’ใ‚ณใƒผใƒ‰ใ‹ใ‚‰ๅค‰ๅŒ–ใ•ใ›ใ‚‹ใ€ใ‚นใ‚ฟใ‚คใƒซใ‹ใ‚‰ใ€ŒUIใ‚’ใ‚’ไบˆใ‚ใ™ในใฆๅฎš็พฉใ—ใฆใŠใ„ใฆใ€ใƒ‡ใƒผใ‚ฟ็Šถๆ…‹ใซๅฟœใ˜ใฆ่‡ชๅ‹•็š„ใซๅค‰ๅŒ–ใ™ใ‚‹ใ€ใ‚นใ‚ฟใ‚คใƒซใซไธ€ๅค‰ใ—ใฆใ„ใพใ™ใ€‚ ่ฉณ็ดฐใซใคใ„ใฆใฏAndroid Developersใซ ๅ…ฌๅผใฎ่งฃ่ชฌ ใŒใ‚ใ‚Šใพใ™ใฎใงใ€ใใกใ‚‰ใ‚‚ใ”ๅ‚่€ƒใใ ใ•ใ„ใ€‚ ใ‚ˆใ‹ใฃใŸใ“ใจ ่จ˜่ผ‰ใ™ใ‚‹ใ‚ณใƒผใƒ‰ใฏ็ฐก็•ฅๅŒ–ใฎใŸใ‚ใ€ไธ€้ƒจใฎๅฑžๆ€งๅ€คใชใฉใ‚’็œ็•ฅใ—ใฆใ„ใพใ™ใ€‚ ่จ˜่ฟฐใŒใ‚ทใƒณใƒ—ใƒซใซใชใ‚‹ UIใŒ้žๅธธใซใ‚ทใƒณใƒ—ใƒซใซๆ›ธใ‘ใ‚‹ใ‚ˆใ†ใซใชใ‚Šใ€UI่จ˜่ฟฐใซใ‹ใ‹ใ‚‹ๆ™‚้–“ใ‚’ๅคงๅน…ใซๅ‰Šๆธ›ใ™ใ‚‹ใ“ใจใŒใงใใฆใ„ใพใ™ใ€‚ ็‰นใซไปฅไธ‹ใฎ็‚นใŒๅŠนใ„ใฆใ„ใพใ™ใ€‚ ใƒฌใ‚คใ‚ขใ‚ฆใƒˆใฎใƒใ‚นใƒˆใ‚’ๆฐ—ใซใ™ใ‚‹ๅฟ…่ฆใŒใชใ„ ไธŠใฎใ‚ˆใ†ใชใƒฌใ‚คใ‚ขใ‚ฆใƒˆใ‚’็ต„ใ‚‚ใ†ใจใ—ใŸๅ ดๅˆใ€ๅพ“ๆฅใฎๆ–นๆณ•ใงใ‚ทใƒณใƒ—ใƒซใซๆ›ธใใจไปฅไธ‹ใฎใ‚ˆใ†ใชๆง‹้€ ใซใชใ‚Šใพใ™ใ€‚ <LinearLayout android:orientation="horizontal"> <ImageView /> <LinearLayout android:orientation="vertical"> <TextView /> <TextView /> </LinearLayout> </LinearLayout> ใ—ใ‹ใ—ใ“ใ‚Œใฏใ‚ˆใใชใ„ใจใ•ใ‚Œใ‚‹่จ˜่ฟฐใงใ™ใ€‚ ๅพ“ๆฅใฎAndroidใฎใƒฌใ‚คใ‚ขใ‚ฆใƒˆใงใฏใƒใ‚นใƒˆใŒๆทฑใ‘ใ‚Œใฐๆทฑใ„ใปใฉใ€ๅŠ ้€Ÿๅบฆ็š„ใซใƒฌใƒณใƒ€ใƒชใƒณใ‚ฐๆ™‚้–“ใŒๅข—ๅŠ ใ™ใ‚‹ใจใ„ใ†ๅ•้กŒใŒๅญ˜ๅœจใ—ใพใ™ใ€‚ใ—ใŸใŒใฃใฆใ“ใฎใ‚ˆใ†ใช่จ˜่ฟฐใฏ้ฟใ‘ใ€ConstraintLayoutใ‚’ใฏใ˜ใ‚ใจใ™ใ‚‹่ค‡้›‘ใชใƒฌใ‚คใ‚ขใ‚ฆใƒˆๆ–นๆณ•ใ‚’ใจใ‚Šใ€ใชใ‚‹ในใใƒ•ใƒฉใƒƒใƒˆใซ่จ˜่ฟฐใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ—ใŸใ€‚ใ“ใ‚Œใฏๅญฆ็ฟ’่ฒ ่ทใŒ้ซ˜ใใ€ใพใŸใ‚ตใƒƒใจ็ต„ใ‚€ใซใฏๆ™‚้–“ใฎใ‹ใ‹ใ‚‹ๆ–นๆณ•ใงใ™ใ€‚ Jetpack Composeใงใฏใƒใ‚นใƒˆใฎๅ•้กŒใŒ่งฃๆฑบใ•ใ‚Œใฆใ„ใ‚‹ใŸใ‚ใ€ใ“ใฎใ‚ˆใ†ใช่€ƒๆ…ฎใŒไธ่ฆใงใ™ใ€‚ @Composable fun ArticleRow(article: Article) { Row { AsyncImage(model = article.imageUrl) Column { Text(article.title) Text(article.body) } } } Jetpack Composeใงใฏใ‚ขใƒŽใƒ†ใƒผใ‚ทใƒงใƒณใ‚’ไป˜ใ‘ใŸ้–ขๆ•ฐ(Composable้–ขๆ•ฐ)ใงUIใ‚’่จ˜่ฟฐใ—ใพใ™ใ€‚ใ“ใฎไธญใงRowใจColumnใŒๅพ“ๆฅใฎLinearLayoutใซๅฏพๅฟœใ—ใฆใ„ใพใ™ใ€‚ ใ“ใฎใ‚ˆใ†ใซ่ฆ‹ใŸ็›ฎ้€šใ‚Šใฎๆง‹้€ ใ‚’่จ˜่ฟฐใ—ใฆใ‚‚ใ€ใƒฌใƒณใƒ€ใƒชใƒณใ‚ฐ้€ŸๅบฆใŒๅคงใใ่ฝใกใ‚‹ใ“ใจใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ใƒชใ‚นใƒˆใ‚‚ใ‚ทใƒณใƒ—ใƒซใซๆ›ธใ‘ใ‚‹ ๅพ“ๆฅใ€ใƒชใ‚นใƒˆๅฝขๅผใฎUIใ‚’ไฝœๆˆใ™ใ‚‹ๅ ดๅˆใฏRecyclerViewใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใŒๅคšใ‹ใฃใŸใจๆ€ใ„ใพใ™ใ€‚ RecyclerViewใ‚’ไฝฟใ†ใŸใ‚ใซใฏ้ขๅ€’ใชๆบ–ๅ‚™ใŒๅฟ…่ฆใงใ€ DiffUtilใ‚’ไฝฟใฃใฆใƒ‡ใƒผใ‚ฟใฎๅŒไธ€ๆ€งๅˆคๅฎšใ‚’ๅฎš็พฉ RecyclerView.ViewHolderใ‚’็ถ™ๆ‰ฟใ—ใฆViewไฟๆŒใ‚ฏใƒฉใ‚นใ‚’ๅฎš็พฉ RecyclerView.Adapterใ‚’็ถ™ๆ‰ฟใ—ใฆใƒ‡ใƒผใ‚ฟใจใฎใƒใ‚คใƒณใƒ‡ใ‚ฃใƒณใ‚ฐใ‚’ๅฎš็พฉ ใจใ„ใ†ๆ‰‹้ †ใ‚’่ธใ‚“ใงใ‚ˆใ†ใ‚„ใไฝฟใˆใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ Jetpack ComposeใงใฏLazyColumnใ‚’ไฝฟใˆใฐใ‚ˆใใ€ @Composable fun ArticleList(articles: List<Article>) { LazyColumn { items( items = articles, key = { article -> article.id } ) { article -> ArticleRow(article) } } } ใ“ใฎใ‚ˆใ†ใซ็ฐกๅ˜ใช่จ˜่ฟฐใงใƒชใ‚นใƒˆใŒ่จ˜่ฟฐใงใใพใ™ใ€‚ ใƒ—ใƒฌใƒ“ใƒฅใƒผใŒๅฎนๆ˜“ ๅพ“ๆฅใฎXMLใงใ‚‚ใƒ—ใƒฌใƒ“ใƒฅใƒผใฏใงใใ‚‹ใฎใงใ™ใŒใ€ใ‚ณใƒผใƒ‰ใ‹ใ‚‰ๅ‹•็š„ใซๆ›ธใๆ›ใˆใ‚‰ใ‚Œใ‚‹้ƒจๅˆ†ใฎใƒ—ใƒฌใƒ“ใƒฅใƒผใŒ้›ฃใ—ใ„ใจใ„ใ†ๅ•้กŒใŒใ‚ใ‚Šใพใ—ใŸใ€‚ใพใŸใƒฌใ‚คใ‚ขใ‚ฆใƒˆใฎใƒใ‚นใƒˆใ‚’ๆทฑใใงใใชใ„ใจใ„ใ†ๅˆถ็ด„ไธŠใ€UIใ‚’็ดฐใ‹ใ„ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใซๅˆ†ๅ‰ฒใ—ใฆใƒ—ใƒฌใƒ“ใƒฅใƒผใ™ใ‚‹ใ“ใจใ‚‚ใชใ‹ใชใ‹้›ฃใ—ใ„ใจใ„ใ†ใ“ใจใ‚‚่ชฒ้กŒใงใ—ใŸใ€‚ Jetpack Composeใฎใƒ—ใƒฌใƒ“ใƒฅใƒผใฏ้žๅธธใซ็ฐกๅ˜ใงใ™ใ€‚UIใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใŒๅ…จใฆ้–ขๆ•ฐใง่จ˜่ฟฐใ•ใ‚Œใ‚‹ใฎใงใ€ใƒ—ใƒฌใƒ“ใƒฅใƒผ็”จใฎใƒ‡ใƒผใ‚ฟใ‚’ๅผ•ๆ•ฐใซไธŽใˆใ‚‹ใ ใ‘ใงใƒฌใƒณใƒ€ใƒชใƒณใ‚ฐๅฏ่ƒฝใช็Šถๆ…‹ใซใชใ‚Šใพใ™ใ€‚ใ‚ใจใฏ@Previewใ‚ขใƒŽใƒ†ใƒผใ‚ทใƒงใƒณใ‚’ไป˜ไธŽใ—ใŸ้–ขๆ•ฐใงใƒฉใƒƒใƒ—ใ™ใ‚Œใฐใƒ—ใƒฌใƒ“ใƒฅใƒผใฎๅฎŒๆˆใงใ™ใ€‚ @Preview @Composable fun ArticleRowPreview() { MyTheme { ArticleRow( Article( id = "xxx", title = "ใ‚ฟใ‚คใƒˆใƒซ", body = "ๆœฌๆ–‡", imageUrl = "https://example.com/image.png" ) ) } } ่ค‡ๆ•ฐใƒ‘ใ‚ฟใƒผใƒณใ‚’่ฉฆใ—ใŸใ‘ใ‚Œใฐๅผ•ๆ•ฐใ‚’ๅค‰ใˆใŸใ‚‚ใฎใ‚’ๅˆฅ้€”็”จๆ„ใ™ใ‚‹ใ ใ‘ใงๆธˆใฟใพใ™ใ€‚็ดฐใ‹ใ„้–ขๆ•ฐใซๅˆ†ใ‘ใฆใ„ใ‘ใฐใใฎๅ˜ไฝใงใƒ—ใƒฌใƒ“ใƒฅใƒผใŒๅฏ่ƒฝใชใฎใงใ€ReactใชใฉใซใŠใ‘ใ‚‹Storybookใฎใ‚ˆใ†ใชใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ‚ซใ‚ฟใƒญใ‚ฐใจใ—ใฆใฎๅˆฉ็”จใŒๅฏ่ƒฝใงใ™ใ€‚ React Hooksใซ่ฟ‘ใ„ Jetpack ComposeใฏReactใฎHooks APIใซ่ฟ‘ใ„ๆฆ‚ๅฟตใ‚„ๆ–‡ๆณ•ใ‚’ๆŒใกใพใ™ใ€‚ UIใ‚’้–ขๆ•ฐใง่จ˜่ฟฐใ™ใ‚‹ใจใ„ใ†ๅŸบๆœฌๆ–‡ๆณ•ใ‚‚ใใ†ใงใ™ใ—ใ€็Šถๆ…‹ใ‚„ๅ‰ฏไฝœ็”จๅ‡ฆ็†ใซ้–ขใ—ใฆใ‚‚ const [state, setState] = useState(0); useEffect(() => { ... }, [state]) val state = remember { mutableStateOf(0) } LaunchedEffect(state) { ... } ใ“ใฎใ‚ˆใ†ใซๅคงใพใ‹ใชๅฏพๅฟœใŒๅ–ใ‚Œใพใ™ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏๆ–ฐไบบๆ•™่‚ฒใฎไธญใงReactใ‚’ๅ–ใ‚Šๅ…ฅใ‚Œใฆใ„ใ‚‹ใŸใ‚ใ€ใ‚ขใƒ—ใƒช้–‹็™บใซใ‚ธใƒงใ‚คใƒณใ™ใ‚‹้š›ใฎๅญฆ็ฟ’ใ‚ณใ‚นใƒˆใ‚’ๆŠ‘ใˆใ‚‹ใ“ใจใŒใงใใฆใ„ใพใ™ใ€‚ ็Šถๆ…‹็ฎก็†ใจๅผทไพๅญ˜ใ—ใชใ„ Jetpack Composeใฏๅฐ‚็”จใซ็”จๆ„ใ•ใ‚ŒใŸStateใฎไป•็ต„ใฟใซใ‚ˆใฃใฆ็Šถๆ…‹ใ‚’็ฎก็†ใ—ใพใ™ใ€‚ใงใฏๅ…จใฆใฎ็Šถๆ…‹ใ‚’Stateใง็ฎก็†ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใฎใ‹ใจใ„ใ†ใจใใ†ใงใฏใชใใ€RxJavaใ‚„LiveDataใ€Flowใจใ„ใฃใŸๅพ“ๆฅใฎ็Šถๆ…‹็ฎก็†ใฎไป•็ต„ใฟใจ้€ฃๆบใ™ใ‚‹ใ“ใจใŒๅฏ่ƒฝใงใ™ใ€‚ ไพ‹ใˆใฐViewModelใซไฟๅญ˜ใ•ใ‚ŒใŸFlowๅž‹ๅค‰ๆ•ฐใ‚’ใ€ไปฅไธ‹ใฎใ‚ˆใ†ใซStateๅž‹ใซๅค‰ๆ›ใงใใพใ™ใ€‚ val state = viewModel.flow.collectAsState() ๅค‰ๆ›ใŒ็”จๆ„ใ•ใ‚Œใฆใ„ใ‚‹ใŸใ‚ใ€UIใฏJetpack Composeใงๆ›ธใใคใคใ€็Šถๆ…‹็ฎก็†ใ‚„ใƒ‡ใƒผใ‚ฟใ‚ขใ‚ฏใ‚ปใ‚นใฏๅพ“ๆฅ้€šใ‚Šใ€Jetpack Composeใซไพๅญ˜ใ—ใชใ„ๅฝขใง่จ˜่ฟฐใ™ใ‚‹ใ“ใจใŒๅฏ่ƒฝใงใ™ใ€‚ใ“ใฎใŸใ‚ใ€UIไปฅๅค–ใฎใƒฌใ‚คใƒคใƒผใฏๅพ“ๆฅใจๅŒๆง˜ใฎ่จญ่จˆใ‚’่กŒใˆใฐใ‚ˆใ„ใ“ใจใซใชใ‚Šใพใ™ใ€‚ ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใƒขใƒ€ใƒณๅŒ–ใ‚’่กŒใฃใŸๅˆ†ใ€ๆ–ฐ่ฆใซๆŽก็”จใ™ใ‚‹ใƒฉใ‚คใƒ–ใƒฉใƒชใ‚‚ๅคšใใ€็ตŒ้จ“ใฎๅฐ‘ใชใ•ใŒใƒใ‚ฐใ‚„ๅทฅๆ•ฐๅข—ๅคงใฎใƒชใ‚นใ‚ฏใซใชใ‚Šๅพ—ใพใ—ใŸใ€‚ใใฎ็‚นใ€ไธญๆ ธใจใชใ‚‹่จญ่จˆใซๅพ“ๆฅใฎ็Ÿฅ่ฆ‹ใ‚’ไฝฟใˆใ‚‹ใ“ใจใฏใƒชใ‚นใ‚ฏใ‚’ไฝŽใไฟใคใ“ใจใซๅคงใใ่ฒข็Œฎใ—ใพใ—ใŸใ€‚ ๆœ€ๆ–ฐใฎAndroidใŒๅฟ…่ฆใชใ„ ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏiOS็‰ˆใงใ‚‚ๅŒๆง˜ใซๆŠ€่ก“ใ‚นใ‚ฟใƒƒใ‚ฏใฎ่ฆ‹็›ดใ—ใ‚’่กŒใฃใŸใฎใงใ™ใŒใ€SwiftUIใฎๆŽก็”จใซใฏ่‡ณใ‚Šใพใ›ใ‚“ใงใ—ใŸใ€‚ใ“ใ‚Œใฏ้–‹็™บๅˆๆœŸใฎๆ™‚็‚นใงiOS 10ใ‚’ๆœ€ไฝŽใƒใƒผใ‚ธใƒงใƒณใจใ—ใฆใŠใ‚Šใ€SwiftUIใซ้žๅฏพๅฟœใงใ‚ใฃใŸใŸใ‚ใงใ™ใ€‚ไพฟๅˆฉใชๆฉŸ่ƒฝใงใ‚ใฃใฆใ‚‚ใใ‚ŒใŒOSใซๅฏพใ—ใฆๅฎŸ่ฃ…ใ•ใ‚Œใ‚‹ๅ ดๅˆใ€ๆŽก็”จๅฏ่ƒฝใซใชใ‚‹ใพใงใฏๆ•ฐๅนด้–“ๅพ…ใคๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ Jetpack ComposeใฏAndroidXใจๅ‘ผใฐใ‚Œใ‚‹ๅ…ฌๅผ่ฃœๅŠฉใƒฉใ‚คใƒ–ใƒฉใƒชใฎไธ€้ƒจใจใ—ใฆ้–‹็™บใ•ใ‚ŒใฆใŠใ‚Šใ€Androidๆœฌไฝ“ใจใฏ็‹ฌ็ซ‹ใ—ใฆใ„ใพใ™ใ€‚Jetpack Compose 1.0.0ใฎๆ™‚็‚นใงAPI 21(Android 5.0)ไปฅไธŠใซๅฏพๅฟœใ—ใฆใ„ใ‚‹ใŸใ‚ใ€ๅ•้กŒใชใๆŽก็”จใงใใพใ—ใŸใ€‚ ใŠใ‚ใ‚Šใซ ใƒžใ‚ค ใƒ‹ใƒ•ใƒ†ใ‚ฃใงJetpack Composeใ‚’ๆŽก็”จใ—ใฆใ‚ˆใ‹ใฃใŸ็‚นใ‚’่ฆ‹ใฆใใพใ—ใŸใ€‚็‰นใซ่จ˜่ฟฐใฎใ‚ทใƒณใƒ—ใƒซใ•ใฏ่ฟฝๅŠ ้–‹็™บใ‚„ๆ–ฐไบบใฎใ‚ธใƒงใ‚คใƒณๆ™‚ใซใ‚‚ๅคงใใ่ฒข็Œฎใ—ใฆใŠใ‚Šใ€็คพๅ†…ใฎใ‚ขใƒ—ใƒชใฎไธญใงใ‚‚้ ปๅบฆใฎ้ซ˜ใ„ใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใ‚’่กŒใ†ใ“ใจใŒใงใใฆใ„ใพใ™ใ€‚ ไธ€ๆ–นใง้–‹็™บใ—ใฆใ„ใไธญใงใ‚คใƒžใ‚คใƒใ ใจๆ„Ÿใ˜ใ‚‹็‚นใ‚‚ใ‚ใ‚Šใพใ—ใŸใ€‚ๆฌกๅ›žใฏใใกใ‚‰ใซใคใ„ใฆใ”็ดนไป‹ใ™ใ‚‹ไบˆๅฎšใงใ™ใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event โ€“ NIFTY engineering
ใ“ใฎ่จ˜ไบ‹ใฏใ€ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022 (ใ‚ซใƒฌใƒณใƒ€ใƒผ1) 25ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚ ใ“ใ‚“ใซใกใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใงAWS/GCPใ‚„้–‹็™บๅฏ„ใ‚ŠใฎSaaS็ฎก็†ใชใฉใ—ใฆใ„ใ‚‹็Ÿณๅทใงใ™ใ€‚ ๅนดๆœซใงใ™ใญใ€ๅคงๆŽƒ้™คใฎใ‚ทใƒผใ‚บใƒณใงใ™ใ€‚ ใ‚ชใƒ•ใ‚ฃใ‚นใ‚„ใ‚ญใƒฃใƒ“ใƒใƒƒใƒˆใฎๆŽƒ้™คใฏใ—ใฆใฆใ‚‚็คพๅ†…ๆƒ…ๅ ฑใฎๆŽƒ้™คใฏใฟใชใ•ใ‚“ใ—ใฆใ„ใ‚‹ใงใ—ใ‚‡ใ†ใ‹ใ€‚ ๆœฌๆ—ฅใฏ Notionๆง˜ใฎไบ‹ไพ‹็ดนไป‹ใจใ—ใฆ่ผ‰ใ›ใ•ใ›ใฆใ„ใŸใ ใ„ใŸๅ†…ๅฎน ใฎ่ฉณ็ดฐ็‰ˆใจใ—ใฆใ€Confluenceใ‚’Notionใซ็งป่กŒใ™ใ‚‹ๅ‰ใซ่กŒใฃใŸๅคงๆŽƒ้™คใจNotionไธŠใงใฎๆƒ…ๅ ฑใฎ้…็ฝฎใฎ่ฉฑใ‚’ใ—ใ‚ˆใ†ใจๆ€ใ„ใพใ™ใ€‚ ๆœฌ่จ˜ไบ‹ใฎไปฅไธ‹ใฎๆตใ‚Œใง่ชฌๆ˜Žใ—ใฆใ„ใใพใ™ใ€‚ ๅ‰Š้™คใจๅ–ๆจ้ธๆŠž ๅˆ†้กžๅˆ†ใ‘ ๅ†้…็ฝฎ Confluence ServerใฎๅคงๆŽƒ้™ค ใพใšใฏ็งป่กŒๅ‰ใซ่บซ่ปฝใซใ—ใฆใŠใใŸใ„ใฎใงๅคงๆŽƒ้™คใ‹ใ‚‰ใ€ใจ่จ€ใฃใฆใ‚‚ๆฃšๅธใ—ไฝœๆฅญใŒไธปใงใ™ใ€‚ ้‡่ค‡ๆทปไป˜ใƒ•ใ‚กใ‚คใƒซใฎๅ‰Š้™ค ็งป่กŒๅฏพ่ฑกใฎๅ–ๆจ้ธๆŠž ใปใผ็ฉบใฎใ‚นใƒšใƒผใ‚นใฎๅ‰Š้™คใ‚„้›†็ด„ ้‡่ค‡ๆทปไป˜ใƒ•ใ‚กใ‚คใƒซใฎๅ‰Š้™ค Confluence Serverใฏใƒšใƒผใ‚ธใ‚ณใƒ”ใƒผใฎ้š›ใซๆทปไป˜ใƒ•ใ‚กใ‚คใƒซใ‚‚่ค‡่ฃฝใ•ใ‚Œใพใ™ใ€‚ๅฎšไพ‹ใƒšใƒผใ‚ธใชใฉใ‚ณใƒ”ใƒผใ—ใฆๆ–ฐ่ฆใƒšใƒผใ‚ธใ‚’ไฝœใฃใฆใ„ใ‚‹ใจ้›ชใ ใ‚‹ใพๅผใซๆทปไป˜ใƒ•ใ‚กใ‚คใƒซใŒๅข—ใˆใฆใ„ใฃใฆใ—ใพใ„ใพใ™ใ€‚ใ“ใ‚ŒใŒๅคง้‡ใซใ‚ใ‚‹ใฎใงไธ€็•ชๅคใ„ใƒ•ใ‚กใ‚คใƒซไปฅๅค–ใ‚’ๆถˆใ—ใพใ™ใ€‚ ๏ผˆConfluence่ฑ†็Ÿฅ่ญ˜๏ผš2016ๅนดใ‹ใ‚‰ใƒšใƒผใ‚ธใ‚ณใƒ”ใƒผใงๆทปไป˜ใƒ•ใ‚กใ‚คใƒซใŒ่ค‡่ฃฝใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใ‚Šใ€2019ๅนดใซ่ค‡่ฃฝใ—ใชใ„ใ‚ชใƒ—ใ‚ทใƒงใƒณใŒ่ฟฝๅŠ ใ•ใ‚Œใพใ—ใŸใŒใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใงใฏ่ค‡่ฃฝใ—ใพใ™ใ€‚Cloud็‰ˆใ‚‚ๅŒๆง˜ใฎไป•ๆง˜ใงใ™ใŒใ€่ค‡่ฃฝใ—ใชใ„ใ‚ชใƒ—ใ‚ทใƒงใƒณใฏCloud็‰ˆใซใฏใชใ„ใŸใ‚ๅฟ…ใš่ค‡่ฃฝใ•ใ‚Œใพใ™๏ผ‰ ๅ‰Š้™คๆ–นๆณ•ใงใ™ใŒSQLใงๆŠฝๅ‡บใ—ใฆAPIใงๆถˆใ™ใ ใ‘ใงใ™๏ผˆใ‹ใชใ‚Šๆ™‚้–“ใฏใ‹ใ‹ใ‚Šใพใ™๏ผ‰ SQLใงๅŒไธ€ใ‚นใƒšใƒผใ‚นๅ†…ใซใ‚ใ‚‹ใƒ•ใ‚กใ‚คใƒซๅ&ใ‚ตใ‚คใ‚บ&ใƒใƒผใ‚ธใƒงใƒณใŒๅŒใ˜ใ‚‚ใฎใŒ nๅ€‹ไปฅไธŠใ‚ใ‚‹ใƒ•ใ‚กใ‚คใƒซใ‚’ๆŠฝๅ‡บ APIใ‚’ๅฉใ„ใฆๆถˆใ—ใฆใ„ใ ็›ด่ฟ‘ใง่กŒใฃใŸ็ตๆžœใ ใจใ€ ๅ…จไฝ“ใฎ15%ใปใฉใŒ้‡่ค‡ใƒ•ใ‚กใ‚คใƒซใงใ—ใŸ ใ€‚2020ๅนดใซๅˆใ‚ใฆ่กŒใฃใŸใจใใฏ 50%่ฟ‘ใใŒ้‡่ค‡ใƒ•ใ‚กใ‚คใƒซใ ใฃใŸ ใฎใงใ€ใ“ใ‚Œใงใ‚‚้‡่ค‡ๆ•ฐใฏๆธ›ใฃใŸ็Šถๆ…‹ใงใ™ ็งป่กŒๅฏพ่ฑกใฎๅ–ๆจ้ธๆŠž ็งป่กŒๅ…ˆใซใ‚ดใƒŸใ‚’ๆŒใก่พผใพใชใ„ใŸใ‚ใซ้‡่ฆใชใ‚นใƒ†ใƒƒใƒ—ใงใ™ใ€‚ ไปŠๅ›žใฏใƒ’ใ‚ขใƒชใƒณใ‚ฐใ‚ทใƒผใƒˆไฝœใฃใฆ็งป่กŒๅ…ˆ๏ผˆ4ๆŠž๏ผ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใ‚‚ใ‚‰ใ†ๅฝขใง่กŒใ„ใพใ—ใŸใ€‚ ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆๅ€คใŒ็ฉบใ ใจใฉใ†ใ—ใฆใ‚‚ ใ€Œไฝฟใ†ใ‹ใ‚ใ‹ใ‚‰ใชใ„ใ‘ใฉใจใ‚Šใ‚ใˆใš็งป่กŒใ™ใ‚‹ใ‹ใ€ ใจ่€ƒใˆใ‚‹ๆ–นใŒๅคšใ„ ใฎใงใ€ๅ„ใ‚นใƒšใƒผใ‚นใฎๅˆฉ็”จ็ตฑ่จˆใ‹ใ‚‰ๆŽจๅฅจๅ€คใ‚’ๅ…ฅใ‚ŒใฆใŠใใฎใฏใ‚„ใฃใฆใŠใ„ใŸใปใ†ใŒใ„ใ„ใงใ™ใ€‚ใพใŸๆ˜Žใ‚‰ใ‹ใซๆƒ…ๅ ฑใŒๅฐ‘ใชใ„ใ‚นใƒšใƒผใ‚น๏ผˆ่ญฐไบ‹้Œฒใ ใ‘ๆ•ฐใƒšใƒผใ‚ธใ ใ‘ใ‚ใ‚‹๏ผ‰ใฏใ€ๅ…จ็คพๅ…ฑ้€š่ญฐไบ‹้ŒฒDBใ‚’็งป่กŒๅ…ˆใซใ™ใ‚‹ๅฏพๅฟœใ‚’่กŒใ†ใจใ‚ˆใ‚Š่‰ฏใ„ใงใ™ใญใ€‚ ไพ‹๏ผš้•ทๅนดๆ›ดๆ–ฐใŒใชใ„ใ€ใ‚ขใƒผใ‚ซใ‚คใƒ–ใ‚นใƒšใƒผใ‚นใซใชใฃใฆใ„ใ‚‹ โ†’ ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ ็งป่กŒใ—ใชใ„ ไพ‹๏ผšๆ•ฐๅนดๆ›ดๆ–ฐใŒใชใ„ใ€่ฟ‘ๅนดใ‚ขใƒผใ‚ซใ‚คใƒ–ใ‚นใƒšใƒผใ‚นใซใชใฃใŸ โ†’ ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆ ็งป่กŒๅ…ˆๅ•ใ‚ใšไฝฟใˆใ‚‹็Ÿฅ่ฆ‹ใŒAtlassianใ‹ใ‚‰ๆไพ›ใ•ใ‚Œใฆใ„ใ‚‹ใฎใงไธ€ๅบฆ็›ฎใ‚’้€šใ—ใฆใฟใ‚‹ใจใ„ใ„ใจๆ€ใ„ใพใ™ใ€‚ ๅ‚่€ƒ๏ผš Confluence ใฎใƒ™ใ‚นใƒˆใƒ—ใƒฉใ‚ฏใƒ†ใ‚ฃใ‚น | ใ‚ขใƒˆใƒฉใ‚ทใ‚ขใƒณ | Atlassian ๅ‚่€ƒ๏ผš ACE#43 Atlassian Cloudใธใฎ้“ใฎใ‚Š – YouTube ย    ๆƒ…ๅ ฑใฎๅˆ†้กžๅˆ†ใ‘ ๆฌกใซ็งป่กŒๅ‰ใซใ‚„ใฃใฆใŠใใŸใ„ใฎใฏๆƒ…ๅ ฑใฎๅˆ†้กžๅˆ†ใ‘ใงใ™ใ€‚ Confluenceใฎใ‚นใƒšใƒผใ‚นใ‚’็ถญๆŒใ—ใŸๆƒ…ๅ ฑ็ฎก็† Confluenceใ‹ใ‚‰็งป่กŒใ—ใŸ้–ขไฟ‚ไธŠใ€ใ‚นใƒšใƒผใ‚นใจใ„ใ†ๆฆ‚ๅฟตใ‚’ไฟๆŒใ—ใฆใŠใๅฟ…่ฆใŒใ‚ใ‚Šใพใ—ใŸ๏ผˆNotionใ‚‰ใ—ใๅ…จ้ƒจใฒใจใคใฎDBใงใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆๅ…จ้ƒจ็ฎก็†ใ™ใ‚‹ใจใ„ใ†ใฎใฏๆ–ฐ่ฆใชใ‚‰ใ„ใ„ใŒ็งป่กŒใ ใจ้›ฃใ—ใ„๏ผ‰ใ€‚ใใฎใŸใ‚ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏ็‰นๅฎš้šŽๅฑคใซใ‚ใ‚‹ใƒšใƒผใ‚ธใ‚’ ใ‚นใƒšใƒผใ‚นใƒšใƒผใ‚ธ ใจๅ‘ผ็งฐใ—ใ€ๆƒ…ๅ ฑใ‚’ๅ–ใ‚Šๆ‰ฑใ†ใฒใจใคใฎ็ฒ’ๅบฆใจใ—ใฆๆ‰ฑใฃใฆใ„ใพใ™ใ€‚ ็งป่กŒใฎ้š›ใซConfluenceใฎใ‚นใƒšใƒผใ‚นใ‚’ใ–ใฃใใ‚Š Dept ใ€ Knowledge ใ€ Product ใซๅˆ†้กžใ—3ใคใฎใƒใƒผใƒ ใ‚นใƒšใƒผใ‚นๅ†…ใซใ‚นใƒšใƒผใ‚นใƒšใƒผใ‚ธใจใ—ใฆ็งปใ—ใฆใ„ใพใ™ใ€‚ใƒกใ‚ฟๆƒ…ๅ ฑ็š„ใซใฏใ‚‚ใ†ๅฐ‘ใ—็ดฐใ‹ใๅˆ†้กžใ—ใฆใ„ใ‚‹ใฎใงใ™ใŒใ€ใƒใƒผใƒ ใ‚นใƒšใƒผใ‚นใจใ—ใฆใฏใ“ใฎ3็จฎใซใ—ใฆใ„ใพใ™ใ€‚ ไผš็คพใฎ็ต„็น”ๆง‹้€ ใซๅˆใ‚ใ›ใฆใƒใƒผใƒ ใ‚นใƒšใƒผใ‚นใ‚’ๅˆ‡ใฃใฆใ„ใชใ„ใฎใฏใ€ใ‚‚ใจใ‚‚ใจใƒ—ใƒญใƒ€ใ‚ฏใƒˆใƒปใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅ˜ไฝใงๆƒ…ๅ ฑใ‚’้›†ใ‚ใฆใ„ใ‚‹ใ“ใจใŒๅคšใ‹ใฃใŸใฎใงใใ‚Œใ‚’่ธ่ฅฒใ—ใฆใ„ใพใ™ใ€‚   NotionใงๅฎŸ็พใ—ใŸใ‹ใฃใŸใ“ใจใจๆƒ…ๅ ฑ้…็ฝฎ ไป•ไธŠใ’ใซNotionใงใฉใ†้…็ฝฎใ—ใฆใ„ใ‚‹ใฎใ‹ใซใคใ„ใฆใ€‚ ๆคœ็ดขใƒŽใ‚คใ‚บใ‚’ๆธ›ใ‚‰ใ— ใ“ใ“ใซใชใ‹ใฃใŸใ‚‰ใชใ„ใงใ™ใญ ใ‚’ๅฎŸ็พใ—ใŸใ„ ๆƒ…ๅ ฑใŒ่ฒฏใพใฃใฆใ„ใใจใ€ๆคœ็ดขใƒŽใ‚คใ‚บใŒๅคšใใชใ‚Šๆคœ็ดข็ตๆžœใฏ่ฟ”ใฃใฆใใ‚‹ใ‘ใฉ็›ฎๅฝ“ใฆใฎใ‚‚ใฎใŒใชใ„ใ€ใใ‚‚ใใ‚‚ใ‚นใƒˆใƒƒใ‚ฏๆƒ…ๅ ฑใจใ—ใฆๅญ˜ๅœจใ—ใฆใ„ใ‚‹ใ‹ใฉใ†ใ‹ใ‚‚ใ‚ใ‹ใ‚‰ใชใ„ใ€ใจใ„ใ†็ŠถๆณใŒใพใพใ‚ใ‚Šใพใ™ใ€‚ ใใ“ใงๆคœ็ดขใƒœใƒชใƒฅใƒผใƒ ใŒๅคงใใ„ใ€ๅ…จๅพ“ๆฅญๅ“กๅ‘ใ‘ใƒป็‰นๅฎš่ทๅ‹™ๅ‘ใ‘ใƒป็‰นๅฎšใƒ„ใƒผใƒซๅˆฉ็”จ่€…ๅ‘ใ‘ใƒปใ‚ชใƒณใƒœใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใชใฉใฏใ™ในใฆ Knowledgeใƒใƒผใƒ ใ‚นใƒšใƒผใ‚น ใซ้›†็ด„ใ—ใพใ—ใŸใ€‚ ใ“ใ“ใ‚’ๆคœ็ดขใ™ใ‚‹ใ“ใจใงๆญฃ็ขบๆ€งใŒๆ‹…ไฟใ•ใ‚ŒใŸๆƒ…ๅ ฑใ‚’่ฆ‹ใคใ‘ใ‚„ใ™ใใชใ‚‹ไธŠใซใ€่ฆ‹ใคใ‹ใ‚‰ใชใ‹ใฃใŸใ‚‰NotionไธŠใซใฏใชใใพใ ใ‚นใƒˆใƒƒใ‚ฏๅŒ–ใ•ใ‚Œใฆใ„ใชใ„ๆƒ…ๅ ฑใ ใจๅˆคๅˆฅใ™ใ‚‹ใ“ใจใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ ใชใซใ‹ใ—ใ‚‰ๆคœ็ดข็ตๆžœใŒ่ฟ”ใฃใฆใใฆใ—ใพใ†ใจใ€ใ†ใพใๆŽขใ›ใฆใชใ„ใฎใงใฏใชใ„ใ‹ใจๅ†ๆคœ็ดขใ‚’็นฐใ‚Š่ฟ”ใ—ใฆใ—ใพใ†ใ‚‚ใฎใงใ™ใŒใ€็ตๆžœใŒ่ฟ”ใฃใฆใ“ใชใ„ใ‹ๅฐ‘ๆ•ฐใงใ‚ใ‚Œใฐ ใ“ใ“ใซใฏใชใ„ใฎใ‹ ใจๆ€ใ„ใ€ๆ—ฉใ„ๆฎต้šŽใงๅˆฅใฎใ‚ขใ‚ฏใ‚ทใƒงใƒณใซ็งปใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚   ไฟฏ็žฐใ—ใฆๅ…จไฝ“ใ‚’็œบใ‚ ไธŠใ‹ใ‚‰่พฟใฃใฆใ„ใ‘ใ‚‹ใ‚ˆใ†ใซใ—ใŸใ„ ่กŒใชใฃใŸใ“ใจใฏๅคงใใ3็‚นใงใ™ใ€‚ ใ‚นใƒšใƒผใ‚นใƒšใƒผใ‚ธDBใฎไฝœๆˆ ใ‚ซใ‚ชใ‚นใƒžใƒƒใƒ—ใฎๅ†็พ ็ดขๅผ•ใฎไฝœๆˆ ใ‚นใƒšใƒผใ‚นใƒšใƒผใ‚ธDBใฎไฝœๆˆ Confluenceใซใ‚ใฃใŸใ‚นใƒšใƒผใ‚นใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใฎไปฃใ‚ใ‚Šใจใ—ใฆใ€ใ‚นใƒšใƒผใ‚นใƒšใƒผใ‚ธใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นDBใ‚’็”จๆ„ใ—ใพใ—ใŸใ€‚ ย  ใƒ„ใƒผใƒซใ‚ซใ‚ชใ‚นใƒžใƒƒใƒ—ใ‚’Notionใงๅ†็พ ๆŽขใ™ในใใ‚นใƒšใƒผใ‚นใƒšใƒผใ‚ธใŒๅคšใ™ใŽใ‚‹ใจ้ธในใชใ„ๅ ดๅˆใŒใ‚ใ‚‹ใŸใ‚ใ€ใ‚ซใ‚ชใ‚นใƒžใƒƒใƒ—ใ‚’NotionไธŠใงๅ†็พใ™ใ‚‹ใ‚ˆใ†ใซใƒชใƒณใ‚ฏใ‚’้…็ฝฎใ—ใŸใƒšใƒผใ‚ธใ‚’็”จๆ„ใ—ใพใ—ใŸ๏ผˆใ“ใ“ใฏใ„ใšใ‚ŒDBใงใ†ใพใๅ†็พใ—ใŸใ„๏ผ‰ ็ดขๅผ•ใฎไฝœๆˆ ไธป่ฆใชDBใธใƒชใƒฌใƒผใ‚ทใƒงใƒณใ—ใฆ็ดขๅผ•ใจใ—ใฆๆฉŸ่ƒฝใ™ใ‚‹DBใ‚‚็”จๆ„ใ—ใพใ—ใŸใ€‚ Confluenceใฎใจใใฏๅ•ใ„ๅˆใ‚ใ›ๅ…ˆไธ€่ฆงใจใ„ใ†ๅคงใใชใƒ†ใƒผใƒ–ใƒซใ‚’ไฝœใฃใฆใ„ใŸใฎใงใ™ใŒใ€ใ“ใ‚Œใซ็ดขๅผ•ใฎๆฉŸ่ƒฝใ‚’ไป˜ไธŽใ—ใพใ—ใŸใ€‚ไธป่ฆใชDBใซใƒชใƒฌใƒผใ‚ทใƒงใƒณใ™ใ‚‹ใ ใ‘ใงๆƒ…ๅ ฑใŒ้›†ใพใฃใฆใใ‚‹ใŸใ‚ๅ‰ใ‚ˆใ‚Šใ‚‚ใƒกใƒณใƒ†ใƒŠใƒณใ‚นๆ€งใŒไธŠใŒใฃใŸใจๆ€ใ„ใพใ™ใ€‚ใ“ใ“ใฏNotionไบ‹ไพ‹็ดนไป‹ใซใ‚ใฃใŸไผๆฅญๆง˜ใฎใ‚„ใ‚Šๆ–นใ‚’ไธ€้ƒจ็œŸไผผใ•ใ›ใฆใ‚‚ใ‚‰ใ„ใพใ—ใŸใ€‚ ๅ‚่€ƒ๏ผš ๅ…ฅ็คพ1ใƒถๆœˆใงNotionใ‚’ไฝฟใ„ใ‚„ใ™ใ„ๅฝขใซใƒ‡ใ‚ถใ‚คใƒณใ—ใŸ่ฉฑ๏ฝœ่ฅฟๅฑฑ ๅฐ†ๅนณ๏ผˆShohei Nishiyama๏ผ‰๏ฝœnote ใ‚ฟใ‚ฐใจใ—ใฆๅ˜่ชž้ธใณใจ็ฒ’ๅบฆใฏไปŠๅพŒใฉใ†้‹็”จใ—ใฆใ„ใใ‹ใฏ่ชฒ้กŒใจใชใฃใฆใ„ใพใ™๏ผˆไธ€ๆ—ฆFolksonomiesใง้‹็”จใ—ใฆๆ•ฐใ‚’ๅข—ใ‚„ใ—ใ€ๅพŒใงTaxonomyใจใ—ใฆๆ•ด็†็ฎก็†ใ™ใ‚‹ใฎใŒใ„ใ„ใ‹๏ผŸ๏ผ‰   ๆœ€ๅพŒใซ Confluenceใ‚’็พๅœจใŠไฝฟใ„ใฎๆ–นใ‚‚ใ“ใ‚Œใ‹ใ‚‰Cloud็‰ˆใ‚„ไป–ใธ็งป่กŒไบˆๅฎšใฎๆ–นใ‚‚ใ€็งป่กŒๅ‰ใซๆŽƒ้™คใ‚’ใ—ใฃใ‹ใ‚Š่กŒใฃใฆใŠใใจ็งป่กŒๆ•ฐใ‚‚็งป่กŒๆ™‚้–“ใ‚‚ๅคงใใๅ‰Šๆธ›ใ•ใ‚Œใ‚‹ใฎใงๆ˜ฏ้žใ‚„ใ‚Šใพใ—ใ‚‡ใ†ใ€‚ ๆƒ…ๅ ฑใฎๆ•ด็†ใซใคใ„ใฆใฏใ€ๆ—ขๅญ˜ใฎๆƒ…ๅ ฑใ‚’ๅฎŸ้š›ใซ่ฆ‹ใซใ„ใฃใฆใฉใ†ใ„ใ†ๆƒ…ๅ ฑใŒใฉใ†ใ„ใ†ๅฝขใง็ฝฎใ‹ใ‚Œใฆใ„ใ‚‹ใฎใ‹ๆŠŠๆกใ™ใ‚‹ใฎใฏ้‡่ฆใ ใจๆ„Ÿใ˜ใพใ—ใŸใ€‚ๆ™‚้–“ใฏใ‹ใ‹ใ‚Šใพใ™ใŒใ€ใ‚„ใ‚‹ๅ‰ใจๅพŒใงใฏๆƒ…ๅ ฑใซๅฏพใ™ใ‚‹่งฃๅƒๅบฆใŒๅค‰ใ‚ใ‚Šใพใ™ใ€‚็Ÿฅ่ญ˜็š„ใชใ‚‚ใฎใจใ—ใฆใฏใ‚ชใƒฉใ‚คใƒชใƒผใฎๆƒ…ๅ ฑใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใฎๆœฌใŒ้ ญใฎๆ•ด็†ใซๅฝน็ซ‹ใกใพใ—ใŸใ€‚ ๅ‚่€ƒ๏ผš O’Reilly Japan – ๆƒ…ๅ ฑใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃ ็ฌฌ4็‰ˆ NotionไธŠใงใฎ็ต„ใฟๆ–นใงใ™ใŒใ€็งป่กŒๅ‰ใฎใƒšใƒผใ‚ธๆง‹้€ ใ‚’ๅคงใใๅค‰ใˆใšใซไธ€้ƒจๅ…จ็คพๅ…ฑ้€šDBไฝฟใฃใฆใ„ใŸใ‚ŠใจNotionใฃใฝใ•ใ‚‚ๆททใœ่พผใฟใคใคใ€ใฒใจใพใšใ„ใ„ๆ„Ÿใ˜ใซใฏไฝฟใˆใฆใ„ใ‚‹ใฎใงใฏใชใ„ใ‹ใจๆ€ใฃใฆใ„ใพใ™ใ€‚็ต„ใฟๆ–นใซๆญฃ่งฃใฏใชใๅ„็ต„็น”ใ”ใจใซๅˆใฃใŸๆง‹ๆˆใ‚’่ฆ‹ใคใ‘ใฆใ„ใใ—ใ‹ใชใ„ใฎใง้›ฃใ—ใ„้ƒจๅˆ†ใงใ™ใ‚ˆใญใ€ใ“ใ“ใฏไปŠๅพŒใ‚‚้ฉๅฎœๆ”นๅ–„ใ—ใฆใ„ใใคใ‚‚ใ‚Šใงใ™ใ€‚ ๆœฌ่จ˜ไบ‹ใง ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022 ใฏ็ต‚ใ‚ใ‚Šใจใชใ‚Šใพใ™ใ€‚ ๅคš็จฎๅคšๆง˜ใช่จ˜ไบ‹ใŒๆƒใฃใฆใ„ใพใ™ใฎใงใ€ๆ˜ฏ้žไธŠ่จ˜ใƒชใƒณใ‚ฏๅ…ˆใ‹ใ‚‰ไป–ใฎ่จ˜ไบ‹ใ‚‚่จชใ‚Œใฆใฟใฆใใ ใ•ใ„ใ€‚   We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใ“ใฎ่จ˜ไบ‹ใฏใ€ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022 25ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚ ใ“ใ‚“ใซใกใฏใ€ใŸใ‘ใ‚ใ„ใฉใงใ™ใ€‚SvelteKit v1.0.0ใƒชใƒชใƒผใ‚นใŠใ‚ใงใจใ†ใ”ใ–ใ„ใพใ™๏ผ๏ผ ใ“ใฎๆ—ฅใ‚’ๅฟƒๅพ…ใกใซใ—ใฆใ„ใพใ—ใŸใ€‚ใพใ•ใซ้ญ”ๆณ•ใฎใ‚ˆใ†ใซๅ‹•ใใ€ใ‚ณใƒผใƒ‰ใ‚’ๆ›ธใใŸใณใซ้ฉšใ‹ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ ใฏใ˜ใ‚ใซ ใ“ใฎ่จ˜ไบ‹ใงใฏSvelteKitใฎๆŠ€่ก“็š„็Ÿฅ่ฆ‹ใ‚’ๅคšใใฏๆไพ›ใ—ใพใ›ใ‚“ใ€‚ ใฉใกใ‚‰ใ‹ใจใ„ใ†ใจSvelteKitใ‚’ๆœฌ็•ช็’ฐๅขƒใธๆŽก็”จใ™ใ‚‹ใพใงใซ่‡ณใฃใŸๅฟƒๆง‹ใˆใ‚„ๆฐ—ใ‚’ไป˜ใ‘ใฆใ„ใ‚‹ใ“ใจใ‚’่ฟฐในใฆใ„ใใพใ™ใ€‚ ใจใฏใ„ใฃใฆใ‚‚โ€ฆ ใชใซใ‚‚็ดนไป‹ใ—ใชใ„ใจใ„ใ†ใฎใ‚‚้‡ˆ็„ถใจใ—ใชใ„ใฎใงใ€ๆƒ…ๅ ฑใ‚’ใฉใ†้›†ใ‚ใฆใ„ใ‚‹ใ‹ใ‚’ๆฎ‹ใ—ใฆใŠใใพใ™ใ€‚ ใ“ใ‚Œใ‹ใ‚‰SvelteKitใ‚’ไฝฟใฃใฆใ„ใไบบใฎๅ‚่€ƒใซใชใ‚Œใฐใจใฆใ‚‚ใ†ใ‚Œใ—ใ„ใงใ™๏ผ Svelteใ‚„SvelteKitใฏใจใฆใ‚‚ๆ–ฐใ—ใ„ใปใ†ใฎใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใงใ™ใ€‚ใใฎใŸใ‚ๆ—ฅๆœฌ่ชžใฎๆƒ…ๅ ฑใฏๅฐ‘ใชใ„ใงใ™ใ€‚ใ•ใ‚‰ใซSvelteKitใฎv1.0.0ใฎๆƒ…ๅ ฑใฏๆ—ฅๆœฌ่ชžใซ้™ใ‚‰ใšๆƒ…ๅ ฑใŒๅฐ‘ใชใ„ใงใ™ใ€‚ ใใฎๆ™‚ใซ้ ผใ‚Šใซใชใ‚‹ใฎใŒๅ…ฌๅผใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใงใ™๏ผ Svelte SvelteKit Svelteใฏๅ…ฌๅผใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใŒใจใฆใ‚‚ๅ„ช็ง€ใง้–‹็™บใซๅฟ…่ฆใชๆƒ…ๅ ฑใฏ7ๅ‰ฒๆ–นใ“ใกใ‚‰ใ‚’ๅ‚่€ƒใซใ—ใฆใ„ใพใ™ใ€‚ UseCaseใŒๆฌฒใ—ใ„ๅ ดๅˆใฏExamplesใ‚’่ฆ‹ใฆใฟใพใ—ใ‚‡ใ† ใ“ใ‚Œใ‚‰ๅ…ฌๅผใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใฏๆœ‰ๅฟ—ใฎๆ–นใ€…ใŒ็ฟป่จณใ—ใฆใใ ใ•ใฃใฆใ„ใพใ™ใ€‚ๆœฌๅฝ“ใซใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚ SvelteJP SvelteKitJP ไป–3ๅ‰ฒใฏSvelteใฎGithubใ‚’่ฆ‹ใ‚‹ใ“ใจใŒๅคšใ„ใงใ™ใ€‚issueใ‚„discussionใ‚’่ฆ—ใ„ใฆใฟใพใ—ใ‚‡ใ†ใ€‚ใ‚ˆใ‚Š่ฉณ็ดฐใชๆƒ…ๅ ฑใ‚’ๅ…ฅๆ‰‹ใงใใ‚‹ใงใ—ใ‚‡ใ†ใ€‚ ใ‚ˆใSvelte lifeใ‚’ ใจใ„ใ†ใ“ใจใงไธป้กŒใซๅ…ฅใ‚Šใพใ™ใ€‚ SvelteKitๅฐŽๅ…ฅใพใงใฎ้“ใฎใ‚Š ใƒใƒผใƒ ็†่งฃ ใ€ŒSvelteKitใ‚’ไฝฟใ„ใŸใ„ใงใ™๏ผใ€ใจใ„ใฃใฆใ‚‚ใ€ŒNextใงใ„ใ„ใ˜ใ‚ƒใ‚“โ€ฆใ€ใจ่จ€ใ‚ใ‚Œใ‚‹ใ“ใจใŒๅคงๅŠใงใ™ใ€‚ ่ฒ ใ‘ใชใ„ใ‚ˆใ†ใซ่ชฌๅพ—ใ—ใพใ—ใ‚‡ใ†ใ€‚็ขบใ‹ใซใ‚จใ‚ณใ‚ทใ‚นใƒ†ใƒ ใงใฏๅœงๅ€’็š„ใชๅทฎใŒใ‚ใ‚Šใพใ™ใŒโ€ฆ SvelteKitใฎใƒกใƒชใƒƒใƒˆใ‚’ใƒใƒผใƒ ใซ็ดนไป‹ใ—ใพใ—ใ‚‡ใ†ใ€‚ ใ‚ณใƒผใƒ‰่จ˜่ฟฐ้‡ใŒๅฐ‘ใชใ„ใ€‚ใพใ•ใซ้ญ”ๆณ•ใฎใ‚ˆใ†ใชใ‚ณใƒผใƒ‰ Vueใฎใ‚ˆใ†ใชใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆ่จ˜ๆณ•ใ‚’ๆ‰ฑใˆใ‚‹ ไปฎๆƒณDOMใ‚’ไฝฟใ‚ใชใ„ ใ‚ณใƒณใƒ‘ใ‚คใƒฉใงใ‚ใ‚‹ใ“ใจ ใใฎไป–SvelteใƒปSvelteKitใฎใƒกใƒชใƒƒใƒˆใ‚’ๆ„Ÿใ˜ใ‚‹ใซใฏ Tutorial ใ‚’่งฆใฃใฆๅฎŸ้š›ใซไฝ“้จ“ใ—ใฆใฟใพใ—ใ‚‡ใ†๏ผ ใพใŸSvelteใซใคใ„ใฆใฏๅˆฅใฎ่จ˜ไบ‹ใง็ดนไป‹ใ—ใพใ—ใŸใ€‚ ใใกใ‚‰ ใ‚‚่ชญใ‚“ใงใฟใฆใใ ใ•ใ„ใ€‚ ใใ‚ŒใซๅŠ ใˆใฆๆ–ฐใ—ใ„ๆŠ€่ก“ใซใƒˆใƒฉใ‚คใ™ใ‚‹ใ“ใจใฎๆฅฝใ—ใ•ใ‚’ไผใˆใพใ™ใ€‚ใ—ใฃใ‹ใ‚Šใจใ—ใŸ่ซ–็†ใ‚’่ชฌๆ˜ŽใงใใŸไธŠใงใ€็†ฑๆ„ใ‚’ใถใคใ‘ใ‚Œใฐ็†่งฃใ‚’ๅพ—ใ‚„ใ™ใ„ใงใ™ใ€‚ ใกใชใฟใซๆ—งใ‚ตใƒผใƒ“ใ‚นใงJinja2ใชใฉใฎใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใ‚จใƒณใ‚ธใƒณใ‚’ๆ‰ฑใฃใฆใ„ใ‚‹ใฎใชใ‚‰ใ€่จ˜ๆณ•ใŒไผผใฆใ„ใ‚‹ใฎใงใ‚ชใ‚นใ‚นใƒกใงใใ‚‹ใƒใ‚คใƒณใƒˆใŒๅข—ใˆใพใ™ใ€‚ ใ‚ตใƒผใƒ“ใ‚น็†่งฃ ใใฎใ‚ตใƒผใƒ“ใ‚นใซSvelteKitใฏๆœฌๅฝ“ใซๅฟ…่ฆใงใ—ใ‚‡ใ†ใ‹๏ผŸ ใ‚ตใƒผใƒ“ใ‚นใฎ่ฆๆจกๆ„Ÿใ‚’่€ƒใˆใฆใฟใ‚‹ใฎใŒใ‚ˆใ„ใจๆ€ใ„ใพใ™ใ€‚ ็ขบใ‹ใซSvelteKitใฏๅ„ช็ง€ใชใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใงใ™ใŒใ€ๅฎŸ็”จไพ‹ใŒๆฅตใ€…ๅฐ‘ใชใ„ใงใ™ใ€‚ ใใ‚Œใ‚†ใˆใฎไธๅฎ‰ใ‚’ๆจใฆใใ‚Œใพใ›ใ‚“ใ€‚ ๅคงใใชใ‚ตใƒผใƒ“ใ‚นใ‚’ไฝœใ‚‹ใฎใชใ‚‰ๅผ•็ถ™ใŽใ‚„ไฟๅฎˆใƒป้‹็”จใ‚‚ๅคงๅค‰ใงใ™ใ€‚ใใ‚“ใชใ‚ตใƒผใƒ“ใ‚นใงSvelteKitใ‚’ไฝฟใ†ใฎใฏๅฐ‘ใ—ๆ€–ใ„ใงใ™ใญใ€‚ ใพใšใฏๅฐใ•ใชใ‚ตใƒผใƒ“ใ‚นใ‹ใ‚‰ๅง‹ใ‚ใฆใฟใ‚‹ใฎใŒใ‚ชใ‚นใ‚นใƒกใงใ™ใ€‚็คพๅ†…ๅ‘ใ‘ใ‚ตใƒใƒผใƒˆใƒ„ใƒผใƒซใชใฉๅ†…ๅ‘ใใซ้–‰ใ˜ใฆใ„ใ‚‹ใ‚ตใƒผใƒ“ใ‚นใ‚‚ใƒใƒฃใƒฌใƒณใ‚ธใ—ใ‚„ใ™ใใฆใ‚ชใ‚นใ‚นใƒกใงใ™ใ€‚ใƒชใ‚นใ‚ฏใ‚’ๆญฃใ—ใ่ช่ญ˜ใ—ใฆใ„ใ‚Œใฐใƒใƒผใƒ ็†่งฃใ‚‚ๅพ—ใ‚„ใ™ใ„ใจๆ€ใ„ใพใ™ใ€‚ ๆŠ€่ก“็†่งฃ SvelteKitใงใงใใ‚‹ใ“ใจใ‚’็Ÿฅใ‚Šใพใ—ใ‚‡ใ†ใ€‚ ใŸใ„ใฆใ„ใฎใ“ใจใฏใงใใ‚‹ใจๆ€ใ„ใพใ™ใŒไธๅพ—ๆ„ใชใ“ใจใ‚‚ใ‚ใ‚Šใพใ™ใ€‚ ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใ“ใจใฏ้›ฃใ—ใ„ใงใ™ใ—ใ€ใ‚จใ‚ณใ‚ทใ‚นใƒ†ใƒ ใ‚‚Nextใซๆฏ”ในใŸใ‚‰ใพใ ใพใ ใงใ™ใ€‚ Githubใ‚„ ShowCase ใชใฉใ‚’ใฟใฆใ€ใ™ใงใซๅ‹•ใ„ใฆใ„ใ‚‹ใ‚ตใƒผใƒ“ใ‚นใฏใฉใ‚“ใชๅฎŸ่ฃ…ใชใฎใ‹่ฆ‹ใฆใฟใ‚‹ใจๅ‹‰ๅผทใซใชใ‚Šใพใ™ใ€‚ ใพใŸใ‚ใใพใงใ‚‚ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใงใ™ใ€‚็›ฎ็š„ใฏใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ไฝœใ‚‹ใ“ใจใงใใฎSvelteKitใฏไพฟๅˆฉใชๆ‰‹ๆฎตใ‚’ๆไพ›ใ—ใฆใ„ใ‚‹ใซใ™ใŽใพใ›ใ‚“ใ€‚ ใใ‚Œใ‚’ๅฟต้ ญใซSvelteKitใงใ‚ˆใ‚Šใ‚ˆใ„้–‹็™บใ‚’ใ—ใฆใ„ใใพใ—ใ‚‡ใ†ใ€‚ ๆœ€ๅพŒใซ SvelteKitใ‚’ๅฐŽๅ…ฅใ™ใ‚‹ไธŠใงใ“ใ‚Œใ‚‰3ใคใฎ็†่งฃใ‚’ๆทฑใ‚ใฆใ„ใใ“ใจใŒ้‡่ฆใ ใจๆ„Ÿใ˜ใพใ—ใŸใ€‚ SvelteKitใฏไฝฟใ„ๅ‹ๆ‰‹ใŒใ‚ˆใ็ด ๆ™ดใ‚‰ใ—ใ„ใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใงใ™ใ€‚ๆœฌ็•ช็’ฐๅขƒใงไฝฟใ†ใ‹ใฉใ†ใ‹ใฏ็ฝฎใ„ใจใ„ใฆใ‚‚่งฆใ‚ŒใฆใŠใ„ใฆๆใฏใชใ„ใงใ™ใ€‚ ใ“ใฎ่จ˜ไบ‹ใ‚’่ชญใ‚“ใงSvelteKitใ‚’ๆœฌ็•ชใซๅฐŽๅ…ฅใ—ใŸไบ‹ไพ‹ใŒๅข—ใˆใ‚Œใฐๅนธใ„ใงใ™ใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใ“ใ‚“ใซใกใฏใ€ๆ–ฐๅ’2ๅนด็›ฎใฎRyommใงใ™๏ผ ใ“ใฎ่จ˜ไบ‹ใฏใ€ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022 24ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚ ใ‚ฏใƒชใ‚นใƒžใ‚นใ‚คใƒ–ใงใ™๏ผไปŠๆ—ฅใฏSexyZoneใŒใƒ‡ใƒ“ใƒฅใƒผใ‹ใ‚‰11ๅนด็›ฎใซใ—ใฆๅˆใ‚ใฆไบฌใ‚ปใƒฉใƒ‰ใƒผใƒ ใงๅ˜็‹ฌใƒฉใ‚คใƒ–ใ‚’่กŒใฃใŸ่จ˜ๅฟตใ™ในใๆ—ฅใงใ™ใญ๏ผ็งใ‚‚ไปŠๆ—ฅใฏไบฌใ‚ปใƒฉใƒ‰ใƒผใƒ ใซๆฅใฆใ„ใพใ™๏ผ ไปŠๅ›žใฏSexyZoneใ‹ใ‚‰ๅ—ใ‘ๅ–ใฃใŸใ‚จใƒใƒซใ‚ฎใƒผใงไฝœใฃใŸใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผbotใ‚’็ดนไป‹ใ—ใพใ™๏ผ ใฏใ˜ใ‚ใซ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ‚ฏใƒฉใ‚ฆใƒ‰ใƒปใ‚ดใƒผใƒซใƒ‡ใƒณใƒปใ‚ธใƒ ๏ผˆไปฅไธ‹CGG๏ผ‰ใจใ„ใ†ใ‚ฏใƒฉใ‚ฆใƒ‰ไบบๆใ‚’่‚ฒใฆใ‚‹ใŸใ‚ใฎ็คพๅ†…ๅ‹‰ๅผทไผšใ‚’้–‹ๅ‚ฌใ—ใฆใ„ใพใ™ใ€‚ ็งใฏใ“ใฎCGGใฎ้‹ๅ–ถใจใ—ใฆใ€ใ‚ˆใ‚Šๅคšใใฎไบบใซๅ‚ๅŠ ใ—ใฆใ‚‚ใ‚‰ใ†ใ“ใจใง็คพๅ†…ๅ…จไฝ“ใฎๆŠ€่ก“ๅŠ›ใฎๅบ•ไธŠใ’ใซใคใชใ’ใ‚‹ในใใ€ใ„ใใคใ‹ๅ‚ๅŠ ใฎใƒขใƒใƒ™ใƒผใ‚ทใƒงใƒณใจใชใ‚‹ใ‚ˆใ†ใชไป•ๆŽ›ใ‘ใ‚’ๆบ–ๅ‚™ใ—ใพใ—ใŸใ€‚ ใใฎไธ€็’ฐใจใ—ใฆใ€ใ‚ธใƒ ใ‹ใ‚‰้€ฃๆƒณใ—ใฆใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใ‚’ไฝœใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ ใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใฎ่ฆไปถ ใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใฎ่ฆไปถใฏไปฅไธ‹ใฎ้€šใ‚Šใงใ™ใ€‚ ๅ‹‰ๅผทไผšใธใฎๅ‡บๆฌ ใจใ€ๅ‹‰ๅผทไผšใง่กŒใ†ใ‚ฏใ‚คใ‚บใฎ็ตๆžœใ‚’ใ‚‚ใจใซใ‚นใ‚ฟใƒณใƒ—ใฎใƒฉใƒณใ‚ฏใŒๅค‰ใ‚ใ‚‹ใ‚ˆใ†ใซใ—ใŸใ„ ่ชฐใงใ‚‚ๅ‚็…งใงใใฆใ€่ชฐใŒใฉใ‚“ใชใ‚นใ‚ญใƒซใ‚’ๆŒใฃใฆใ„ใ‚‹ใ‹ใฎๆŒ‡ๆจ™ใซใชใ‚‹ใ‚ˆใ†ใซใ—ใŸใ„ ็ฐกๅ˜ใซๅ‚็…งใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใŸใ‚ใ€Slackใงbotใจใ—ใฆๅ‘ผใณๅ‡บใ—ใŸใ„ @hogebot command [target] ใฎใ‚ˆใ†ใชๅฝขๅผใงๅ•ใ„ๅˆใ‚ใ›ใ‚‹ใจใ€ๅฏพ่ฑกใฎ็”ปๅƒใŒ่ฟ”ๅดใ•ใ‚ŒใฆslackไธŠใฎใƒ—ใƒฌใƒ“ใƒฅใƒผใง่ฆ‹ใ‚‰ใ‚Œใ‚‹ใ‚ˆใ†ใซใ—ใŸใ„ ็ฎก็†็”ป้ขใ‚’ไฝœใ‚‹ไฝ™ๅŠ›ใฏใชใ„ใฎใงใ€ใƒ‡ใƒผใ‚ฟใฎ็ฎก็†ใฏGoogle SpreadSheetใง่กŒใ„ใŸใ„ ใงใใŸใ‚‚ใฎ helpใ‚ณใƒžใƒณใƒ‰ ๆคœ็ดข็ตๆžœใŒ1ใคใ ใ‘ใฎใจใ ๆคœ็ดข็ตๆžœใŒ่ค‡ๆ•ฐใ‚ใ‚‹ใจใ ๆคœ็ดข็ตๆžœใซๅˆ่‡ดใ™ใ‚‹ใƒ‡ใƒผใ‚ฟใŒใชใ„ใจใ ๆœ‰ๅŠนใชใ‚ณใƒžใƒณใƒ‰ใŒใชใ„ใจใ ไฝœใฃใฆใฟใŸ ๆฆ‚่ฆใฏไปฅไธ‹ใฎ้€šใ‚Šใงใ™ใ€‚ botๅฟœ็ญ”้ƒจๅˆ†ใฎ้ชจ็ต„ใฟใ‚’ Lambda + API gateway + Slack App ใงไฝœๆˆ ็”ปๅƒๅˆๆˆ้ƒจๅˆ†ใ‚’ Google SpreadSheet + GAS ( + S3 )ใงไฝœๆˆ ๅˆๆˆใ—ใŸ็”ปๅƒใ‚’ S3 ใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใฆURLใ‚’ SpreadSheet ใซไฟๆŒใ™ใ‚‹้ƒจๅˆ†ใ‚’ไฝœๆˆ ไฝœๆˆใ—ใŸURLใจๅๅ‰ใชใฉใ‚’ใ‚ปใƒƒใƒˆใซใ—ใฆ DynamoDB ใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ™ใ‚‹้ƒจๅˆ†ใ‚’ไฝœๆˆ botใŒๅ—ใ‘ๅ–ใฃใŸๅ€คใ‚’็”จใ„ใฆ DynamoDB ใ‚’ๆคœ็ดขใ—ใฆ่ฉฒๅฝ“ใฎใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใ‚ซใƒผใƒ‰URLใ‚’่ฟ”ๅดใ™ใ‚‹้ƒจๅˆ†ใ‚’ไฝœๆˆ ๆง‹ๆˆๅ›ณ 1. botๅฟœ็ญ”้ƒจๅˆ†ใฎ้ชจ็ต„ใฟใ‚’ Lambda + API gateway + Slack Appใงไฝœๆˆ ใพใšใฏๅŸบ็คŽใจใชใ‚‹bot้ƒจๅˆ†ใ‚’ไฝœใ‚Šใพใ™ใ€‚ ใ“ใ“ใงใฏSlack botใซใƒกใƒณใ‚ทใƒงใƒณใ‚’ใคใ‘ใฆใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ใ‚‹ใจใ€Lambdaๅดใงใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅ—ใ‘ๅ–ใ‚‹ใ“ใจใŒใงใใ€ใƒกใƒƒใ‚ปใƒผใ‚ธใซๅฟœใ˜ใฆไฝ•ใ‹ใ—ใ‚‰ใฎ่ฟ”ไฟกใ‚’ใ™ใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ Slack Appไฝœๆˆ Permissionใ‚’่จญๅฎšใ™ใ‚‹ app_mentions:read ใƒกใƒณใ‚ทใƒงใƒณใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่ชญใฟ่พผใ‚€ใŸใ‚ใซๅฟ…่ฆ channels:history ๅ…ฌ้–‹ใƒใƒฃใƒณใƒใƒซใงใƒกใƒณใ‚ทใƒงใƒณใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่ชญใฟ่พผใ‚€ chat:write ใƒใƒฃใƒƒใƒˆใซๆ›ธใ่พผใ‚€ใŸใ‚ใซๅฟ…่ฆ im:history DMใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่ชญใฟ่พผใ‚€ใŸใ‚ใซๅฟ…่ฆ๏ผˆ็พ็ŠถๅฎŸ่ฃ…ใ—ใฆใ„ใชใ„ใฎใงไปŠใฏไฝฟใฃใฆใ„ใชใ„๏ผ‰ users:read ใƒ‡ใƒผใ‚ฟๆŠ•ๅ…ฅๆ™‚ใซๅๅ‰ใ‹ใ‚‰slackๅใ‚’ๅ–ๅพ—ใ™ใ‚‹ใŸใ‚ใซๅฟ…่ฆ users:read:email ใƒ‡ใƒผใ‚ฟๆŠ•ๅ…ฅๆ™‚ใซemailใ‚’ไฝฟใฃใฆ็…งๅˆใ™ใ‚‹ใŸใ‚ใซๅฟ…่ฆ Scopesใฎ่จญๅฎš ็™บ่กŒใ•ใ‚ŒใŸใƒˆใƒผใ‚ฏใƒณใ‚’ๅพŒ่ฟฐใฎlambdaใฎ็’ฐๅขƒๅค‰ๆ•ฐใซ่จญๅฎšใ™ใ‚‹ใŸใ‚ใ€ใ‚ณใƒ”ใƒผใ—ใฆใŠใใพใ™ใ€‚ API Gatewayไฝœๆˆ slackAPIใ‹ใ‚‰ Content-Type ใŒ application/x-www-form-urlencoded ใงใ‚คใƒ™ใƒณใƒˆใŒ้€ใ‚‰ใ‚Œใฆใใ‚‹ใฎใงใ€ใƒžใƒƒใƒ”ใƒณใ‚ฐใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใ‚’ไป•่พผใ‚“ใงใŠใใพใ™ใ€‚ ๅณไธŠใฎ็ตฑๅˆใƒชใ‚ฏใ‚จใ‚นใƒˆใ‚’้–‹ใ ใƒžใƒƒใƒ”ใƒณใ‚ฐใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใฎใƒชใ‚ฏใ‚จใ‚นใƒˆๆœฌๆ–‡ใฎใƒ‘ใ‚นใ‚นใƒซใƒผใฏใ€Œ ใƒชใ‚ฏใ‚จใ‚นใƒˆใฎ Content-Type ใƒ˜ใƒƒใƒ€ใƒผใซไธ€่‡ดใ™ใ‚‹ใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใŒใชใ„ๅ ดๅˆ ใ€ใ‚’้ธๆŠžใ—ใ€ application/x-www-form-urlencoded ใƒžใƒƒใƒ”ใƒณใ‚ฐใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใ‚’ไฝœๆˆใ—ใ€ ใ“ใกใ‚‰ใฎ่จ˜ไบ‹ ใซใ‚ใ‚‹ใ‚ณใƒผใƒ‰ใ‚’่ฒผใ‚Šไป˜ใ‘ใพใ™ใ€‚ Lambdaไฝœๆˆ ใฒใจใพใš @cgg-stamp-rally hello ใจใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ใ‚‹ใจใ€Œไฝ•๏ผŸใ€ใจ่ฟ”ใ™ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ import json import os import logging import urllib.request logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(data, context): # challenge # slack api ใจใฎ้€ฃๆบใซๅฟ…่ฆ if ('challenge' in data): return { "statusCode": 200, "body": json.dumps({'challenge': data['challenge']}) } # slack event event = data["event"] # ใƒกใƒณใ‚ทใƒงใƒณๆ™‚ if (event["type"] == "app_mention"): # helloใ‚ณใƒžใƒณใƒ‰ if ("hello" in event["text"]): send_slack("ไฝ•๏ผŸ") return { "statusCode": 200 } def send_slack(message): url = 'https://slack.com/api/chat.postMessage' token = os.environ['SLACK_TOKEN'] channel = "#specific_channnel" headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json; charset=utf-8' } method = 'POST' data = { "channel": channel, "text": message } json_data = json.dumps(data).encode("utf-8") req = urllib.request.Request(url=url, data=json_data, headers=headers, method=method) res = urllib.request.urlopen(req, timeout=5) tokenใชใฉๆฉŸๅฏ†ๆƒ…ๅ ฑใฏLambdaใฎ็’ฐๅขƒๅค‰ๆ•ฐใซ่จญๅฎšใ—ใฆใ„ใพใ™ใ€‚ challenge Slack Appใง้€ฃๆบใ™ใ‚‹้š›ใซใ€challengeใƒ‘ใƒฉใƒกใƒผใ‚ฟใ‚’ๅ—ใ‘ๅ–ใฃใฆ็–Ž้€š็ขบ่ชใ‚’่กŒใ„ใพใ™ใ€‚ Weโ€™ll send HTTP POST requests to this URL when events occur. As soon as you enter a URL, weโ€™ll send a request with aย challenge ย parameter, and your endpoint must respond with the challenge value. ย Learn more. slack api Slack App Event Subscriptions่จญๅฎš Slack Appใ‚’้–‹ใใ€ Add features and functionality ใฎ Event Subscriptions ใฎ Request URL ใซๅ…ˆใปใฉไฝœๆˆใ—ใŸAPIใฎใ‚จใƒณใƒ‰ใƒใ‚คใƒณใƒˆใ‚’่ฒผใ‚Šไป˜ใ‘ใฆ็–Ž้€š็ขบ่ชใ—ใพใ™ใ€‚ Subscribe to bot eventsใซ app_mention ใ€ message.channels ใ‚’่จญๅฎšใ—ใพใ™ใ€‚ message.im ใฏไธ่ฆใƒปใƒปใƒป ็–Ž้€š็ขบ่ช ใ“ใ“ใพใงใงSlackใจใฎ็–Ž้€šใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸ๏ผ Lambdaใ‚’ไฝœใ‚Š่พผใ‚€ ๆœ€็ต‚็š„ใซใ‚ณใƒžใƒณใƒ‰ใงๆคœ็ดขใงใใ‚‹ใ‚ˆใ†ใซใ—ใŸใ„ใฎใงใ€ๆคœ็ดขใƒฏใƒผใƒ‰ใฎๆŠฝๅ‡บใŒใงใใ‚‹ใ‚ˆใ†ใซใ—ใฆใ„ใพใ™ใ€‚ ใพใŸใ€helpใ‚ณใƒžใƒณใƒ‰ใจใ€ๆŒ‡ๅฎšใฎใ‚ณใƒžใƒณใƒ‰ใŒใชใ„ๆ™‚ใฏhelpใ‚ณใƒžใƒณใƒ‰ใ‚’ๅ‘ผใถใ‚ˆใ†ใซ่ช˜ๅฐŽใ™ใ‚‹ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅ‡บใ™ใ‚ˆใ†ใซใ—ใพใ—ใŸใ€‚ botใŒใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ใ‚‹ใƒใƒฃใƒณใƒใƒซใ‚‚ๅ›บๅฎšใซใ—ใฆใ„ใŸใจใ“ใ‚ใ‚’ใ€ใƒกใƒณใ‚ทใƒงใƒณใŒๅ‘ผใณๅ‡บใ•ใ‚ŒใŸใƒใƒฃใƒณใƒใƒซใซๆŠ•็จฟใ™ใ‚‹ใ‚ˆใ†ใซๅค‰ๆ›ดใ—ใพใ—ใŸใ€‚ import json import os import logging import urllib.request logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(data, context): # challenge # slack api ใจใฎ้€ฃๆบใซๅฟ…่ฆ if ('challenge' in data): return { "statusCode": 200, "body": json.dumps({'challenge': data['challenge']}) } # slack event event = data["event"] # ใƒกใƒณใ‚ทใƒงใƒณๆ™‚ if (event["type"] == "app_mention"): # helpใ‚ณใƒžใƒณใƒ‰ if ("help" in event["text"]): msg = '''`@CGGใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผ help`๏ผšใ“ใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่กจ็คบใ™ใ‚‹ `@CGGใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผ hello`๏ผšไฝ•๏ผŸใจ่ฟ”ใ™ `@CGGใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผ data`๏ผš ๆธกใฃใฆใใ‚‹ใƒ‡ใƒผใ‚ฟใ‚’่ฟ”ใ™๏ผˆ้–‹็™บ็”จ๏ผ‰ `@CGGใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผ ref [ๆคœ็ดขๆ–‡ๅญ—]`๏ผšๆฐๅใƒปslackๅใงๆคœ็ดข๏ผˆ่ค‡ๆ•ฐๆŒ‡ๅฎšใงANDๆคœ็ดข๏ผ‰ ''' send_slack(event["channel"], msg) # helloใ‚ณใƒžใƒณใƒ‰ elif ("hello" in event["text"]): send_slack(event["channel"], "ไฝ•๏ผŸ") # ใฉใ‚“ใชใƒ‡ใƒผใ‚ฟใŒๆธกใฃใฆใใ‚‹ใ‹็ขบ่ชใ™ใ‚‹ใŸใ‚ elif("data" in event["text"]): send_slack(event["channel"], data) # refใ‚ณใƒžใƒณใƒ‰ elif ("ref" in event["text"]): # ๆคœ็ดขๆ–‡ๅญ—ใ‚’ๆŠฝๅ‡บ search_words = event["text"].split() # ใƒฏใƒผใƒ‰ใ‹ใ‚‰botใƒกใƒณใ‚ทใƒงใƒณใ‚’ๅ‰Š้™ค del search_words[0] # ใƒฏใƒผใƒ‰ใ‹ใ‚‰refใ‚ณใƒžใƒณใƒ‰ๆ–‡ๅญ—ๅˆ—ใ‚’ๅ‰Š้™ค search_words.remove("ref") send_slack(event["channel"], search_words) # ใใฎไป–ใฎใ‚ณใƒžใƒณใƒ‰ else: send_slack(event["channel"], "ๆ„ๅ‘ณใŒใ‚ใ‹ใ‚Šใพใ›ใ‚“๏ผhelpใงใ‚ณใƒžใƒณใƒ‰ใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„๏ผ") return { "statusCode": 200 } def send_slack(channel, message): url = 'https://slack.com/api/chat.postMessage' token = os.environ['SLACK_TOKEN'] headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json; charset=utf-8' } method = 'POST' data = { "channel": channel, "text": message } json_data = json.dumps(data).encode("utf-8") req = urllib.request.Request(url=url, data=json_data, headers=headers, method=method) res = urllib.request.urlopen(req, timeout=5) 2. ็”ปๅƒๅˆๆˆ้ƒจๅˆ†ใ‚’Google SpreadSheet+GAS(+S3)ใงไฝœๆˆ ใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใฏๅ‡บๆฌ ใจ็†่งฃๅบฆ็ขบ่ชใ‚ฏใ‚คใ‚บใฎใ‚นใ‚ณใ‚ขใ‚’ๅŸบใซใ‚นใ‚ฟใƒณใƒ—ใฎ่‰ฒใ‚’ๅ‡บใ—ๅˆ†ใ‘ใ‚‹ใ‚ˆใ†ใซใ—ใŸใ„ใงใ™ใ€‚ ใใฎใŸใ‚ใ€ใใ‚Œใžใ‚Œใฎๅ…ฅๅŠ›ใซๅฏพๅฟœใ—ใฆใƒใƒƒใ‚ธใ‚’ใ‚ปใƒƒใƒˆใ™ใ‚‹GASใ‚’ไป•ๆŽ›ใ‘ใฆใ‚ใ‚Šใพใ™ใŒใ€ใ“ใ“ใงใฏ่ฉณ็ดฐ่ชฌๆ˜Žใ‚’็œ็•ฅใ—ใพใ™ใ€‚ ็”ปๅƒๅˆๆˆใฏใ€ๅคงใพใ‹ใซไปฅไธ‹ใฎๆ‰‹้ †ใง้€ฒใ‚ใพใ™ใ€‚ ใƒ™ใƒผใ‚นใซใชใ‚‹htmlใ‚’ไฝœๆˆ ็ฎก็†ใ‚ทใƒผใƒˆใฎใƒ‡ใƒผใ‚ฟใ‚’ๅŸบใซๅๅ‰ใ‚„ใ‚นใ‚ฟใƒณใƒ—็”ปๅƒใ‚’ๅŸ‹ใ‚่พผใ‚€ html2canvas ใ‚’็”จใ„ใฆcanvasใซๅค‰ๆ› toDataURL("image/png") ใ‚’็”จใ„ใฆPNG็”ปๅƒใซๅค‰ๆ› ็ฎก็†ใ‚ทใƒผใƒˆใ‚’ไฝœๆˆใ™ใ‚‹ ็ฎก็†ใ‚ทใƒผใƒˆใฎใ‚ซใƒฉใƒ ใฏไปฅไธ‹ใฎ้€šใ‚Šใงใ™ใ€‚ name๏ผšๅฎŸๅ slack_name๏ผšslackใฎๅๅ‰ image-url๏ผšๅˆๆˆใ—ใŸ็”ปๅƒใฎURL #0attend๏ผš#0๏ผˆ่ฌ›็พฉใฎใƒŠใƒณใƒใƒชใƒณใ‚ฐ๏ผ‰ใฎๅ‡บๆฌ  meetใฎๅ‡บๅธญใƒฌใƒใƒผใƒˆใ‹ใ‚‰ๅ…ฅๅŠ›ใ™ใ‚‹ #0score๏ผš#0ใฎใ‚ฏใ‚คใ‚บใฎใ‚นใ‚ณใ‚ข #0badge๏ผš#0attendใจ#0scoreใฎๅ€คใ‚’ๅŠ ๅ‘ณใ—ใฆๆŒฏใ‚Šๅˆ†ใ‘ใ‚‰ใ‚ŒใŸใƒใƒƒใ‚ธ S3ใ‚’ไฝœๆˆใ—ใ€CORS่จญๅฎšใ‚’่กŒใ† ใ‚นใ‚ฟใƒณใƒ—ใฎ็”ปๅƒใฏS3ใงใƒ›ใ‚นใƒˆใ—ใฆใŠใใพใ™ใ€‚ ็คพๅ†…ใ ใ‘ใงใชใใ‚ฐใƒซใƒผใƒ—ไผš็คพใฎๆ–นใ‚‚ไฝฟใ†ไบˆๅฎšใฎใŸใ‚ใ€็”ปๅƒใŒ้–ฒ่ฆงใงใใ‚‹ใ‚ˆใ†ใซใƒ‘ใƒ–ใƒชใƒƒใ‚ฏใซๅ…ฌ้–‹ใงใใ‚‹่จญๅฎšใซใ—ใฆใ„ใพใ™ใ€‚ใพใŸใ€็‹ฌ่‡ชใƒ‰ใƒกใ‚คใƒณใ‚’ใ‚ใˆใฆ่จญๅฎšใ™ใ‚‹ใ‚ˆใ†ใช็”จ้€”ใงใฏใชใ„ใŸใ‚ใ€CloudFrontใฏๆŒŸใ‚“ใงใ„ใพใ›ใ‚“ใ€‚ ๆฌกใซใ€CORSใซ Access-Control-Allow-Origin ใ‚’่จญๅฎšใ—ใพใ™ใ€‚ CORS่จญๅฎš curlใงๅฉใ„ใฆheaderใซใ‚ญใƒใƒณใจๅซใพใ‚Œใฆใ„ใ‚‹ใ‹็ขบ่ชใ—ใพใ™ใ€‚ โ€ป Access-Control-Allow-Origin: * ใซใ—ใฆใ‚‹ใฎใงๅ‘ผใณๅ‡บใ™ๅดใฎoriginใฏใชใ‚“ใงใ‚‚ใ„ใ„ใงใ™ใ€‚ curl -i {S3ใฎURL}/{็”ปๅƒๅ}.png -H "Origin:{GASใฎๅ‘ผใณๅ‡บใ™ๅดใฎURL}" --head HTTP/1.0 200 Connection established HTTP/1.1 200 OK . . . Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, HEAD Access-Control-Expose-Headers: Access-Control-Allow-Origin . . . ใƒใƒƒใ‚ธ็”ปๅƒใƒชใ‚นใƒˆ ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใซๆ–ฐใ—ใ„ใ‚ทใƒผใƒˆใ‚’ไฝœๆˆใ—ใ€ใƒใƒƒใ‚ธใฎURLใ‚’ๅ‚็…งใงใใ‚‹ใ‚ˆใ†ใซใ—ใฆใŠใใพใ™ใ€‚ ใƒกใƒ‹ใƒฅใƒผใ‚’ไฝœใ‚‹ ๆฏŽๅบฆGASใ‚’้–‹ใ„ใฆๅฎŸ่กŒใ™ใ‚‹ใฎใฏ้ขๅ€’ใชใฎใงใ€ไปฅไธ‹ใฎใ‚ˆใ†ใซใƒฏใƒณใ‚ฏใƒชใƒƒใ‚ฏใงๅ‘ผใณๅ‡บใ›ใ‚‹ใ‚ˆใ†ใซๆบ–ๅ‚™ใ—ใฆใŠใใพใ™ใ€‚ ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใฎใƒกใƒ‹ใƒฅใƒผ ใ‚นใ‚ฏใƒชใƒ—ใƒˆใƒ•ใ‚กใ‚คใƒซใ‚’ไฝœๆˆใ—ใ€ใƒกใƒ‹ใƒฅใƒผใ‚’่ฟฝๅŠ ใ—ใพใ™ใ€‚้–ขๆ•ฐใ‚’ไฝœๆˆใ—ใŸใ‚‰้ †ๆฌกใ“ใกใ‚‰ใซ่ฟฝๅŠ ใ—ใฆใ„ใใพใ™ใ€‚ // ใƒกใƒ‹ใƒฅใƒผใซ่ฟฝๅŠ  function onOpen() { const sp = SpreadsheetApp.getActiveSpreadsheet() const myMenu = [ { name: 'ใƒกใƒ‹ใƒฅใƒผใŒๅ‹•ใใ‹็ขบ่ช', functionName: 'testMenu_' } ] sp.addMenu('่‡ชๅ‹•ๅŒ–ใƒ„ใƒผใƒซ', myMenu) } function testMenu_() { Browser.msgBox('ใƒกใƒ‹ใƒฅใƒผๅ‹•ใ') } ๅœŸๅฐใจใชใ‚‹htmlใ‚’ไฝœๆˆ ใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใฎๅœŸๅฐใฎhtml ใƒญใƒผใ‚ซใƒซใงใ‚ตใ‚ฏใƒƒใจ็ต„ใฟใพใ™ใ€‚ <?=ๅค‰ๆ•ฐๅ ?> ใจใ™ใ‚‹ใ“ใจใงHTML็”Ÿๆˆๆ™‚ใซๅ‹•็š„ใซๅ€คใ‚’ๅŸ‹ใ‚่พผใ‚€ใ“ใจใŒใงใใพใ™ใ€‚ๅคงไฝ“ใงใใŸใ‚‰ใ€GASใซindex.htmlใงไฝœๆˆใ—ใพใ™ใ€‚ GASใงwebใƒšใƒผใ‚ธใ‚’ใƒ›ใ‚นใƒˆใ™ใ‚‹ ๆฏŽๅบฆใƒ‡ใƒ—ใƒญใ‚คใง่กจ็คบใ•ใ›ใฆใ‚‚ใ„ใ„ใงใ™ใŒใ€ใกใ‚‡ใฃใจ้ขๅ€’ใชใฎใงใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใฎๅณๅดใซ่กจ็คบใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ ๅ…ˆใปใฉไฝœใฃใŸindex.htmlใ‚’ๅŸบใซ HtmlService.createTemplateFromFile("index") ใงHtmlใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝœๆˆใ—ใ€ใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใฎๅค‰ๆ•ฐ้ƒจๅˆ†ใซๅ€คใ‚’ๆŒฟๅ…ฅใ—ใพใ™ใ€‚ใใฎๅพŒ evaluateใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅฎŸ่กŒใ—ใฆHtmlOutputใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’็”Ÿๆˆใ—ใพใ™ใ€‚ SpreadsheetApp.getUi().showSidebar(htmlOutput) ใงใ‚ตใ‚คใƒ‰ใƒใƒผใซ็”Ÿๆˆใ—ใŸHtmlOutputใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’่กจ็คบใ•ใ›ใฆใ„ใพใ™ใ€‚ HTMLใ‚ตใƒผใƒ“ใ‚นใ‚„ClassUIใซใคใ„ใฆ่ฉณใ—ใใฏๅ…ฌๅผใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ‚’ใŠ่ชญใฟใใ ใ•ใ„ใ€‚ https://developers.google.com/apps-script/reference/base/ui https://developers.google.com/apps-script/reference/html/html-service.html ๅผ•ๆ•ฐใฎ c ใจ columns ใฏใ€1่กŒๅˆ†ใฎใƒ‡ใƒผใ‚ฟใŒๅ…ฅใฃใŸ้…ๅˆ—ใจใ‚ซใƒฉใƒ ๅใงใ™ใ€‚ ใ“ใฎ้–ขๆ•ฐใ‚’ๅ„่กŒใซๅฏพใ—ใฆforๆ–‡ใงๅ›žใ™ใ“ใจใงไธ€ๆฐ—ใซ็”ปๅƒ็”ŸๆˆใŒใงใใ‚‹็ฎ—ๆฎตใงใ™ใ€‚ ็นฐใ‚Š่ฟ”ใ™ๆ™‚ใฏๅ‡ฆ็†ไธญใฎ่กŒ็•ชๅทใจslackๅใ‚’PropertiesServiceใซๅ…ฅใ‚Œใฆใ„ใพใ™ใ€‚ function createHtml_(c, columns) { const html = HtmlService.createTemplateFromFile("index") // ๅ„่กŒใฎๅ†…ๅฎนใ‚’ๅ–ๅพ—ใ—ใฆhtmlใ‚’็”Ÿๆˆ for (const [i, v] of columns.entries()){ Logger.log(v) switch (v) { case 'name': html.NAME = c[i] break case '#1badge': html.BADGE_1 = c[i] break case '#2badge': html.BADGE_2 = c[i] break case '#3badge': html.BADGE_3 = c[i] break . . . default: break } } const htmlOutput = html.evaluate() SpreadsheetApp.getUi().showSidebar(htmlOutput) } ็”ปๅƒใซๅค‰ๆ›ใ™ใ‚‹ htmlใฏไฝœๆˆใงใใŸใฎใงใ€ไฝœๆˆๅพŒ html2canvas ใ‚’็”จใ„ใฆcanvasใซๅค‰ๆ›ใ—ใ€ toDataURL() ใงpngๅฝขๅผใซๅค‰ๆ›ใ—ใพใ™ใ€‚ใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใฎinde.htmlใ‚’็ทจ้›†ใ—ใ€ไปฅไธ‹ใฎใ‚ˆใ†ใชใ‚ณใƒผใƒ‰ใซใชใฃใฆใ„ใพใ™ใ€‚ <!DOCTYPE html> <html> <head> <script src="https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js"></script> <style> * { margin: 0; padding: 0; line-height: 1; font-size: inherit; font-weight: normal; } .wrapper { width: 400px; padding: 1em; background-color: #e2e5ea; } header { text-align: center; margin-bottom: 0.5em; } header h1 { font-weight: bold; line-height: 2em; } .slack-profile { margin: 0 auto; } .slack-profile h2 { font-size: 1.5em; line-height: 3em; text-align: center; word-break: keep-all; } .stamp-rally table { margin: 0 auto; border-spacing: 1em 2em; } .stamp-rally table td { position: relative; width: 80px; height: 80px; border-radius: 0.3em; background-color: #fff; } .stamp-rally table td span { position: absolute; top: 105%; left: 0; width: 100%; height: 1em; text-align: center; word-break: keep-all; font-size: 0.6em; color: #5e6062; } .stamp-rally table td img.badge { width: 80%; margin: 10%; } </style> </head> <body> <div class="wrapper" id="stampCard"> <header> <h1>CGG 2022 ใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผ</h1> </header> <main> <div class="slack-profile"> <h2><?=NAME ?></h2> </div> <div class="stamp-rally"> <table> <tr> <td> <img class="badge" src="<?=BADGE_1 ?>" crossorigin="anonymous" /> <span class="description">THE AWS</span> </td> <td> <img class="badge" src="<?=BADGE_2 ?>" crossorigin="anonymous" /> <span class="description">่จญ่จˆGD</span> </td> <td> <span class="description">ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰</span> <img class="badge" src="<?=BADGE_3 ?>" crossorigin="anonymous" /> </td> <td> <img class="badge" src="<?=BADGE_4 ?>" crossorigin="anonymous" /> <span class="description">ๆšดใ‚Œใ‚“ๅŠใ‚ณใƒณใƒ†ใƒŠ</span></td> </tr> <tr> <td><img class="badge" src="<?=BADGE_5 ?>" crossorigin="anonymous" /><span class="description">ใ‚ตใƒผใƒใƒผใƒฌใ‚น</span></td> <td><img class="badge" src="<?=BADGE_6 ?>" crossorigin="anonymous" /><span class="description">CI/CD</span></td> <td> <img class="badge" src="<?=BADGE_7 ?>" crossorigin="anonymous" /> <span class="description">ใ‚ชใƒ–ใ‚ถใƒผใƒใƒ“ใƒชใƒ†ใ‚ฃ</span> </td> </tr> <tr> <td> <img class="badge" src="<?=BADGE_gd ?>" crossorigin="anonymous" /> <span class="description">้šœๅฎณๅฏพๅฟœWS</span></td> <td><img class="badge" src="<?=BADGE_quiz ?>" crossorigin="anonymous" /><span class="description">ใƒˆใƒชใƒ“ใ‚ขใ‚ฏใ‚คใ‚บ</span></td> <td> <img class="badge" src="<?=BADGE_lt ?>" crossorigin="anonymous" /> <span class="description">LT</span></td> </tr> </table> </div> </main> </div> </body> <script> window.onload = function() { const stampCard = document.querySelector("#stampCard") html2canvas(stampCard, {scale:2, allowTaint: true, useCORS: true, taintTest: true, logging: true}).then((ele) => { google.script.run.saveImage(ele.toDataURL("image/png")) }) } </script> </html> html2canvas ใ‚’ไฝฟ็”จใ—ใฆๆŒ‡ๅฎšใ—ใŸใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’canvasใซๅค‰ๆ› <script src="<https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js>"></script> toDataURL ใ‚’ไฝฟใฃใฆcanvasใ‚’pngๅฝขๅผใซๅค‰ๆ› google.script.run.saveImage(png็”ปๅƒ) ใฏๅพŒ่ฟฐใฎS3ใซไฟๅญ˜ใ™ใ‚‹ๅ ด้ขใงไฝœๆˆใ™ใ‚‹้–ขๆ•ฐ <script> window.onload = function() { const stampCard = document.querySelector("#stampCard") html2canvas(stampCard, {scale:2, allowTaint: true, useCORS: true, taintTest: true, logging: true}).then((ele) => { google.script.run.saveImage(ele.toDataURL("image/png")) }) } </script> CORSใซใคใ„ใฆ GASใฎhtmlใซๅŸ‹ใ‚่พผใ‚“ใ ็”ปๅƒใฏCORSใซๅผ•ใฃใ‹ใ‹ใ‚Šใ€pngๅค‰ๆ›ๆ™‚ใซๅ‡บๅŠ›ใ•ใ‚Œใพใ›ใ‚“ใ€‚ ใใฎๅ ดๅˆใ€ใพใš็”ปๅƒURLใฎใƒ˜ใƒƒใƒ€ใƒผใซ Access-Control-Allow-Origin ใ‚’่จญๅฎšใ—ใพใ™ใ€‚ ่‡ชๅˆ†ใงใƒ›ใ‚นใƒˆใ—ใฆใ„ใ‚‹็”ปๅƒใงใ‚ใ‚Œใฐใ€ Access-Control-Allow-Origin: * ใ‚’ใƒ˜ใƒƒใƒ€ใƒผใซๅซใ‚ใ‚‹ Slackใฎใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซ็”ปๅƒใชใฉใ€ใƒ˜ใƒƒใƒ€ใƒผใ‚’ๅผ„ใ‚Œใชใ„ๅ ดๅˆใฏๅ‡บๅŠ›ใงใใชใ„ใฎใง่ซฆใ‚ใ‚‹ ใพใŸใ€html2canvasๅฎŸ่กŒๆ™‚ใฎ useCORS ใ‚’ๆœ‰ๅŠนใซใ—ใพใ™ใ€‚ html2canvas(stampCard, {scale:2, allowTaint: true, useCORS: true, taintTest: true, logging: true}).then((ele) => { google.script.run.saveImage(ele.toDataURL("image/png")) }) ใ•ใ‚‰ใซใ€HTMLๅ†…ใฎ ๅ…จใฆใฎimgใ‚ฟใ‚ฐ ใซ crossorigin="anonymous" ใ‚’ๅซใ‚ใพใ™ใ€‚ <img class="badge" src="<?=BADGE_1 ?>" crossorigin="anonymous" /> ใƒ˜ใƒƒใƒ€ใƒผใซ่จญๅฎšใ—ใŸ Access-Control-Allow-Origin ใŒๆถˆๆป…ใ™ใ‚‹ใจใใฏไปฅไธ‹ใฎ็พ่ฑกใŒ่ตทใใฆใ„ใ‚‹ใจ่€ƒใˆใ‚‰ใ‚Œใพใ™ใ€‚็งใฎๅ ดๅˆใ€ crossorigin="anonymous" ใ‚’ๅ…จใฆใฎimgใ‚ฟใ‚ฐใซ่จญๅฎšใ™ใ‚‹ใจใ‚จใƒฉใƒผใŒๆถˆใˆใพใ—ใŸใ€‚ S3ใฎ็”ปๅƒURLใ‚’ไฝฟ็”จใ—ใฆใ„ใ‚‹ๅ ดๅˆใ€ใ‹ใคใ€Chromeใงใƒ–ใƒฉใ‚ฆใ‚ถใฎcacheใŒๆœ‰ๅŠนใซใชใฃใฆใ„ใ‚‹ๅ ดๅˆใ€2ๅบฆ็›ฎใฎใ‚ขใ‚ฏใ‚ปใ‚นๆ™‚ใซ Access-Control-Allow-Origin Headerใฎไป˜ใ„ใฆใ„ใชใ„ใ‚ญใƒฃใƒƒใ‚ทใƒฅใ—ใŸใƒฌใ‚นใƒใƒณใ‚นใ‚’ChromeใŒ่ฟ”ใ™ใŸใ‚CORSใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใฆใ—ใพใ†ๆจกๆง˜ ็‰นๅฎšใฎๆกไปถใงใฎใฟS3ใฎ็”ปๅƒURLใงCORSใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ™ใ‚‹ๅ•้กŒใ‚’ใชใ‚“ใจใ‹ใ™ใ‚‹ – Qiita 3. ๅˆๆˆใ—ใŸ็”ปๅƒใ‚’S3ใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใฆURLใ‚’SpreadSheetใซไฟๆŒใ™ใ‚‹้ƒจๅˆ†ใ‚’ไฝœๆˆ GASใงไฝœๆˆใ—ใŸ็”ปๅƒใ‚’Driveใซไฟๅญ˜ใ—ใฆใƒชใƒณใ‚ฏใ‚’ๅ…ฑๆœ‰ใ™ใ‚‹ใจslackไธŠใง็”ปๅƒใƒ—ใƒฌใƒ“ใƒฅใƒผใ•ใ‚Œใชใ„ใŸใ‚ใ€S3ใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใพใ™ใ€‚ IAM S3FullAccessใ‚’ๆŒ‡ๅฎšใ—ใ€IAMใƒญใƒผใƒซใ‚’ไฝœๆˆใ—ใŸใ‚‰ใ‚ขใ‚ฏใ‚ปใ‚นใ‚ญใƒผใจใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆใ‚ญใƒผใฏPropertyServiceใซไฟๅญ˜ใ—ใฆใŠใใพใ™ใ€‚ S3ใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ™ใ‚‹ใƒฉใ‚คใƒ–ใƒฉใƒช่ฟฝๅŠ  aws-sdk-js ใ‚’ไฝฟ็”จใ™ใ‚‹ใฎใงใ€GASใซใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’่ฟฝๅŠ ใ—ใพใ™ใ€‚ ใ‚นใ‚ฏใƒชใƒ—ใƒˆID 1Qx-smYQLJ2B6ae7Pncbf_8QdFaNm0f-br4pbDg0DXsJ9mZJPdFcIEkw_ ใŸใ ใ—ใ€ใ“ใฎใƒฉใ‚คใƒ–ใƒฉใƒชใฏ็”ปๅƒใ‚’ใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ™ใ‚‹้š›ใซๆ”น้€ ใŒๅฟ…่ฆใซใชใ‚Šใพใ™ใ€‚ GASใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅ†…ใซใƒ•ใ‚กใ‚คใƒซใ‚’ๆ–ฐ่ฆไฝœๆˆใ—ใ€ใใ‚Œใžใ‚Œไปฅไธ‹ใฎใƒ•ใ‚กใ‚คใƒซใ‚’GASใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅ†…ใซใ‚ณใƒ”ใƒšใ—ใพใ™ใ€‚ https://github.com/eschultink/S3-for-Google-Apps-Script/blob/master/S3.gs https://github.com/eschultink/S3-for-Google-Apps-Script/blob/master/S3Request.gs ใ‚ณใƒ”ใƒšใ—ใŸใƒ•ใ‚กใ‚คใƒซใ‚’ใ€ไปฅไธ‹ใฎ่จ˜ไบ‹ใ‚’ๅ‚่€ƒใซไฟฎๆญฃใ—ใพใ™ใ€‚ https://note.com/marina1017/n/n431f0bb4e342 S3ใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใ€ใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใŸ็”ปๅƒใฎURLใ‚’ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใซ่จ˜้Œฒใ™ใ‚‹้–ขๆ•ฐไฝœๆˆ rowNum ใฏforๆ–‡ใง createHtml_() ใ‚’ๅ‘ผใณๅ‡บใ™้š›ใซPropertyServiceใซไฟๅญ˜ใ—ใŸๅ‡ฆ็†ไธญใฎ่กŒ็•ชๅทใงใ™ใ€‚ function saveImage(img) { // ๆƒ…ๅ ฑใ‚’ๆ ผ็ดใ™ใ‚‹่กŒ const row = PropertiesService.getDocumentProperties().getProperty("rowNum") // ไฝœๆˆใ—ใŸ็”ปๅƒใฎใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ๅ…ˆS3ใฎ่จญๅฎš const S3_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty("S3_ACCESS_KEY") const S3_SECRET_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty("S3_SECRET_ACCESS_KEY") const s3 = getInstance(S3_ACCESS_KEY, S3_SECRET_ACCESS_KEY) const S3_BUCKET_NAME = "cgg-stamp-rally" // ใƒ•ใ‚กใ‚คใƒซๅใ‚’็ต„ใฟ็ซ‹ใฆใ‚‹ const today = new Date() const name = PropertiesService.getDocumentProperties().getProperty("slackName").trim() const filename = `${("0" + today.getFullYear()).slice(-2)}${("0" + (today.getMonth() + 1)).slice(-2)}${("0" + today.getDate()).slice(-2)}${("0" + today.getHours()).slice(-2)}${("0" + today.getMinutes()).slice(-2)}-${name}` const a = img.replace('data:image/png;base64,', '') const decodedImg = Utilities.base64Decode(a) const imgblob = Utilities.newBlob(decodedImg, "image/png", `${filename}.png`) s3.putObject(S3_BUCKET_NAME, `${filename}`, imgblob, {logRequests: true}) const url = `{S3ใฎURL}/${filename}` const SPREADSHEET_ID = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID') const s = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName('2022'); s.getRange(Number(row), 4).setValue(url) } ็”ปๅƒใ‚’Blobใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใŸใ‚ใ€data URI schemeใฎใƒกใƒ‡ใ‚ฃใ‚ขใ‚ฟใ‚คใƒ—ใจใ‚จใƒณใ‚ณใƒผใƒ‰ๆ–นๅผใ‚’ๅ‰Š้™คใ—ใฆใ‹ใ‚‰ใƒ‡ใ‚ณใƒผใƒ‰ใ—ใ€ใƒกใƒ‡ใ‚ฃใ‚ขใ‚ฟใ‚คใƒ—ใจใƒ•ใ‚กใ‚คใƒซๅใ‚’ๆŒ‡ๅฎšใ—ใฆBlobใ‚’ไฝœๆˆใ—ใฆใ„ใพใ™ใ€‚ const a = img.replace('data:image/png;base64,', '') const decodedImg = Utilities.base64Decode(a) const imgblob = Utilities.newBlob(decodedImg, "image/png", `${filename}.png`) ใ“ใ‚Œใ‚’htmlไธญใ‹ใ‚‰ๅ‘ผใณๅ‡บใ—ใฆใ„ใพใ™ใ€‚ ๅ‡ฆ็†ไธญใฎ่กŒ็•ชๅทใจใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใงๆŒใฃใฆใ„ใ‚‹slackๅใ‚’PropertyServiceใซๅ…ฅใ‚ŒใŸใฎใฏใ€ saveImage() ใฎใ‚ˆใ†ใซhtmlใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆๅ†…้ƒจใงๅ‘ผใณๅ‡บใ™้–ขๆ•ฐใซๅค‰ๆ•ฐใ‚’ๆธกใ™ใฎใŒๅคงๅค‰ใชใŸใ‚ใงใ™ใ€‚ 4. ไฝœๆˆใ—ใŸURLใจๅๅ‰ใชใฉใ‚’ใ‚ปใƒƒใƒˆใซใ—ใฆDynamoDBใซใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ™ใ‚‹้ƒจๅˆ†ใ‚’ไฝœๆˆ DynamoDBใ‚’ไฝฟใ†ใŸใ‚ใซใƒฉใ‚คใƒ–ใƒฉใƒช่ฟฝๅŠ  GASใ‹ใ‚‰DynamoDBใซ็›ดๆŽฅใƒ‡ใƒผใ‚ฟๆŠ•ๅ…ฅใ‚’่กŒใ„ใŸใ„ใงใ™ใŒใ€่ช่จผใ‚’็ช็ ดใ™ใ‚‹ใ“ใจใŒๅคงๅค‰ใชใฎใง aws-apps-scripts ใ‚’ไฝฟใ„ใพใ™ใ€‚ใƒกใƒณใƒ†็Šถๆณใ‚’่ฆ‹ใฆไธๅฎ‰ใซใชใ‚Šใพใ™ใŒใ€ๅ‹•ใใพใ—ใŸใ€‚ GASใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅ†…ใซใƒ•ใ‚กใ‚คใƒซใ‚’ๆ–ฐ่ฆไฝœๆˆใ—ใ€ไปฅไธ‹ใฎaws.jsๅ†…ใฎใ‚ณใƒผใƒ‰ใ‚’ใใฎใพใพใ‚ณใƒ”ใƒšใ—ใพใ™ใ€‚ https://github.com/smithy545/aws-apps-scripts/blob/master/aws.js IAM ๆจฉ้™ใฏไปฅไธ‹ใฎ2ใค AmazonDynamoDBFullAccess batch-submit-policy ใ‚ขใ‚ฏใ‚ปใ‚นใ‚ญใƒผใจใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆใ‚ญใƒผใ‚’GASใฎPropertyServiceใซ่จญๅฎšใ—ใฆใŠใใพใ™ใ€‚ DynamoDBใซใƒ‡ใƒผใ‚ฟใ‚’็™ป้Œฒใ—ใฆใ„ใ้–ขๆ•ฐไฝœๆˆ DynamoDBใ‚’ๆคœ็ดขใ™ใ‚‹ใ“ใจใ‚’่€ƒใˆใ‚‹ใจๅŒใ˜ไบบใฎใƒ‡ใƒผใ‚ฟใฏๆ›ดๆ–ฐใ—ใฆใ„ใๆ–นใŒๆœ›ใพใ—ใ„ใŸใ‚ใ€updateใƒกใ‚ฝใƒƒใƒ‰ใ‚’ไฝฟใ„ใพใ™ใ€‚ ๆœฌๆฅใฏDynamoDBใซไธ€ๆ‹ฌใงใ‚ขใ‚คใƒ†ใƒ ็™ป้Œฒใ—ใŸๆ–นใŒใ„ใ„ใงใ™ใŒใ€ใ“ใ“ใงใฏforๆ–‡ใงๅ›žใ—ใฆใ„ใพใ™ใ€‚ function updateDynamodb_() { const DYNAMODB_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty('DYNAMODB_ACCESS_KEY') const DYNAMODB_SECRET_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty('DYNAMODB_SECRET_ACCESS_KEY') AWS.init(DYNAMODB_ACCESS_KEY, DYNAMODB_SECRET_ACCESS_KEY) const SPREADSHEET_ID = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID') const s = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName('2022'); const data = s.getRange(2, 1, s.getLastRow(), s.getLastColumn()).getValues() const table = "cgg-stamp-rally" for (const [i, c] of data.entries()) { if (c[1]) { const item = { slackName: {S: c[1]}, name:{S: c[0]}, stampCardUrl: {S: c[3]} } const res = AWS.request( 'dynamodb', 'ap-northeast-1', 'DynamoDB_20120810.UpdateItem', {}, 'POST', { TableName: table, Item: item, Key: { 'slackName': item.slackName }, ExpressionAttributeNames: { '#n': 'name', '#url': 'stampCardUrl' }, ExpressionAttributeValues: { ':newName': item.name, ':newUrl': item.stampCardUrl }, UpdateExpression: 'SET #n = :newName, #url = :newUrl' }, { 'Content-Type': 'application/x-amz-json-1.0' }, ) const code = res.getResponseCode() const text = res.getContentText() if (code < 200 || code >= 300) throw Error(`AWS.request failed: ${code} - ${text}`) Logger.log(`OK: ${table} - ${JSON.stringify(item)}`) } } } 5. botใŒๅ—ใ‘ๅ–ใฃใŸๅ€คใ‚’็”จใ„ใฆDynamoDBใ‚’ๆคœ็ดขใ—ใฆ่ฉฒๅฝ“ใฎใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใ‚ซใƒผใƒ‰URLใ‚’่ฟ”ๅดใ™ใ‚‹้ƒจๅˆ†ใ‚’ไฝœๆˆ lambdaใฎbot้ƒจๅˆ†ใซๆˆปใ‚Šใ€ๆคœ็ดขๆกไปถใซๅˆใฃใŸใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใฎURLใ‚’่ฟ”ๅดใ™ใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ ๆคœ็ดขๆกไปถใซๅˆ่‡ดใ™ใ‚‹ใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผ็”ปๅƒURLใ‚’ๆŽขใ™้–ขๆ•ฐไฝœๆˆ ่ค‡ๆ•ฐใฎๆคœ็ดขใƒฏใƒผใƒ‰ใŒๆธกใ•ใ‚ŒใŸๅ ดๅˆใ€ANDๆคœ็ดขใ™ใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ ๆคœ็ดข็ตๆžœใŒ่ค‡ๆ•ฐใ‚ใ‚‹ๅ ดๅˆใ‚„ใ€ใƒ‡ใƒผใ‚ฟใŒ่ฆ‹ใคใ‹ใ‚‰ใชใ‹ใฃใŸใจใใฏๆ–‡่จ€ใ‚’ๅค‰ใˆใฆใ„ใพใ™ใ€‚ def get_card(targets): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('cgg-stamp-rally') # ๆคœ็ดขๆ–‡ๅญ—ๅˆ—ใ‚’FilterExpressionใซๆŒ‡ๅฎšใงใใ‚‹ๅฝขใซๆ•ดๅฝข fe = None for target in targets: if fe is None: fe = Attr('slackName').contains(target) | \ Attr('name').contains(target) else: fe = fe & Attr('slackName').contains(target) | \ Attr('name').contains(target) res = table.scan( FilterExpression = fe ) items = res['Items'] # ๆœ€ๅพŒใพใง่ชญใฟ่พผใ‚€ while 'LastEvaluatedKey' in res: res = table.scan( FilterExpression = fe, ExclusiveStartKey=resp['LastEvaluatedKey'] ) items.extend(res['Items']) if len(items) == 0: return 'ๆกไปถใซๅˆ่‡ดใ™ใ‚‹ใƒ‡ใƒผใ‚ฟใŒใ‚ใ‚Šใพใ›ใ‚“' # ๅŒๅง“ๅŒๅใฎๅ ดๅˆใ‚’่€ƒๆ…ฎ if len(items) > 1: prospective_targets = [] for item in items: prospective_targets.append(item['slackName']+'๏ผš'+item['stampCardUrl']) return "ๅฏพ่ฑกใƒฆใƒผใ‚ถใƒผใฎๅ€™่ฃœใŒ่ค‡ๆ•ฐใ‚ใ‚Šใพใ™\n" + "\n".join(prospective_targets) target_card = [] for item in items: target_card.append(item['stampCardUrl']) return "\n".join(target_card) FilterExpression ใงๆกไปถใ‚’ๆŒ‡ๅฎšใ—ใฆscan ็ตๆžœใŒใƒšใƒผใ‚ธใƒใƒผใ‚ทใƒงใƒณใ•ใ‚Œใฆใ„ใ‚‹ๅ ดๅˆใ‚’่€ƒๆ…ฎใ—ใ€ LastEvaluatedKey ใงใƒšใƒผใ‚ธใ‚’ๆœ€ๅพŒใพใง่ชญใฟ่พผใ‚€ ๆœ€ๅพŒใซSlackใ‹ใ‚‰ @cgg-stamp-rally ref hoge ใจใ‚ณใƒžใƒณใƒ‰ใ‚’้€ใ‚Šใ€ๅฏพ่ฑกใฎใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใŒ่ฟ”ใฃใฆใใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใŸใ‚‰ๅฎŒๆˆใงใ™๏ผ @cgg-stamp-rally ref hoge ใŠใ‚ใ‚Šใซ ใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผๅˆถไฝœใฏGASไธŠใง่กŒใ†็”ปๅƒๅˆๆˆ้ƒจๅˆ†ใŒไธ€็•ชๅคงๅค‰ใงใ—ใŸใ€‚ ใ‹ใชใ‚Š่’ๅ‰Šใ‚ŠใชๅฎŸ่ฃ…ใงใ™ใŒใ€CGG้–‹ๅ‚ฌๆœŸ้–“ไธญใฎใฟๅˆฉ็”จใ™ใ‚‹ๆƒณๅฎšใชใฎใงไปŠใฎ็Šถๆ…‹ใง้‹็”จใ—ใฆใ„ใพใ™ใ€‚ ใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใฏใ‹ใชใ‚Šๅ้ŸฟใŒ้ซ˜ใใ€ใ•ใ‚‰ใซๅ‰ฏๆฌก็š„ใชๅŠนๆžœใจใ—ใฆใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใใฃใ‹ใ‘ใงๅง‹ใ‚ใŸใ‚ฏใ‚คใ‚บใ‚‚็†่งฃๅบฆใŒไธŠใŒใ‚‹ใจๅฅฝ่ฉ•ใจใชใฃใฆใ„ใพใ™ใ€‚ ใ“ใฎใ‚ฏใ‚คใ‚บใฏ็คพๅ†…็ ”ไฟฎใง่กŒใ‚ใ‚ŒใŸใ‚ธใƒงใƒ–ใƒญใƒผใƒ†ใƒผใ‚ทใƒงใƒณๅ…ˆใฎ ใ‚ตใƒผใƒ“ใ‚นใ‚คใƒณใƒ•ใƒฉใƒใƒผใƒ  ใฎใ€ŒไผๆŽˆใ€ใฎไป•็ต„ใฟใ‹ใ‚‰็€ๆƒณใ‚’ๅพ—ใฆใ€ๅ‹‰ๅผทไผšใซๅฟœ็”จใ—ใฆใฟใพใ—ใŸใ€‚ CGGใฏใ‚ฐใƒซใƒผใƒ—ใ‚’ๆจชๆ–ญใ—ใฆ่กŒใ‚ใ‚Œใ‚‹ๅคง่ฆๆจกใชๅ‹‰ๅผทไผšใฎใŸใ‚ใ€ใƒ†ใƒผใƒžใงใ‚ใ‚‹ใ‚ฏใƒฉใ‚ฆใƒ‰ใ‚ตใƒผใƒ“ใ‚นไปฅๅค–ใซใ‚‚ๆง˜ใ€…ใชๅˆบๆฟ€ใ‚’ๅ—ใ‘ใฆใ‚‚ใ‚‰ใˆใŸใ‚‰ใจ่€ƒใˆ่ฉฆ่กŒ้Œฏ่ชคใ—ใฆใ„ใพใ™ใ€‚ ไปŠๅพŒใฎๅฑ•ๆœ›ใจใ—ใฆใฏใ€ใพใ ใพใ ๆ”นๅ–„ใฎไฝ™ๅœฐใฏใŸใใ•ใ‚“ใ‚ใ‚‹ใ‚ทใ‚นใƒ†ใƒ ใชใŸใ‚้–‹็™บ็’ฐๅขƒใฎๆ•ดๅ‚™ใŒๅฎŒไบ†ๆฌก็ฌฌใ€็คพๅ†…ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นๅŒ–ใ‚’ใ—ใฆๆ‰ฑใ„ใ‚„ใ™ใใ—ใ€็คพๅ†…ๅ‹‰ๅผทไผšใซใŠใ„ใฆใ‚นใ‚ฟใƒณใƒ—ใƒฉใƒชใƒผใŒๅฎš็€ใ—ใฆใใ‚ŒใŸใ‚‰ใ„ใ„ใชใจ่€ƒใˆใฆใ„ใพใ™ใ€‚ ใจใ„ใ†ใ‚ใ‘ใงใ€ไปฅไธŠใŒRyommใ‚ตใƒณใ‚ฟใ‹ใ‚‰ใฎใ‚ฏใƒชใ‚นใƒžใ‚นใƒ—ใƒฌใ‚ผใƒณใƒˆใงใ—ใŸ๏ผ ๆ˜Žๆ—ฅใฏใ€ 14kw ใ•ใ‚“ใฎ Notionใฎใชใ‚“ใ‹ๆ›ธใ ใงใ™ใ€‚ใŠๆฅฝใ—ใฟใซ๏ผ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใ“ใฎ่จ˜ไบ‹ใฏใ€ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022 21ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚ ใฏใ˜ใ‚ใซ ไผšๅ“กใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ— ็ฌฌไบŒ้–‹็™บใƒใƒผใƒ ใฎๅทไธŠใงใ™ใ€‚ๆ™ฎๆฎตใฏใƒ‹ใƒ•ใƒ†ใ‚ฃไผšๅ“กๅ‘ใ‘iOS/Androidใ‚ขใƒ—ใƒชใฎ้–‹็™บใ‚„้‹็”จใ‚’ๆ‹…ๅฝ“ใ—ใฆใ„ใพใ™ใ€‚ ็งใฎใƒใƒผใƒ ใฏใ‚นใ‚ฏใƒฉใƒ ใง้–‹็™บใ—ใฆใŠใ‚Šใ€GitHub Projects(classic)ใงใ‚ฟใ‚นใ‚ฏ็ฎก็†ใ—ใฆใ„ใพใ™ใ€‚ใ‚นใƒ—ใƒชใƒณใƒˆๅ†…ใฎ้€ฒๆ—ใ‚’็ฎก็†ใ™ใ‚‹ไธŠใงใƒ—ใƒฉใƒณใƒ‹ใƒณใ‚ฐใƒใƒผใ‚ซใƒผใงใคใ‘ใŸใƒใ‚คใƒณใƒˆใ‚’ๅฏ่ฆ–ๅŒ–ใ—ใŸใ„ใจใ„ใ†่ฉฑใŒใ‚ใ‚Šใพใ—ใŸใ€‚ใใ“ใงใ€ๅฎšๆœŸ็š„ใซ่‡ชๅ‹•ๆ›ดๆ–ฐใ™ใ‚‹ใƒใƒผใƒณใƒ€ใ‚ฆใƒณใƒใƒฃใƒผใƒˆใ‚’GAS(Google Apps Script)ใง็ฐกๆ˜“็š„ใซ็”จๆ„ใ—ใฆใฟใพใ—ใŸใ€‚ ๆœฌ่จ˜ไบ‹ใงใฏใ“ใฎใƒใƒผใƒณใƒ€ใ‚ฆใƒณใƒใƒฃใƒผใƒˆไฝœๆˆใง่กŒใฃใŸๅฎŸ่ฃ…ใซใคใ„ใฆ็ดนไป‹ใ—ใพใ™ใ€‚ ่ฆไปถ ็พๆ™‚็‚นใพใงใฎๆฎ‹ใ‚Šใƒใ‚คใƒณใƒˆใซใคใ„ใฆๆŠ˜ใ‚Œ็ทšใŒ่กจ็คบใ•ใ‚Œใ‚‹ ใ‚นใƒ—ใƒชใƒณใƒˆ็ต‚ไบ†ๆ—ฅใพใงใฎไบˆๆธฌใƒใ‚คใƒณใƒˆใซใคใ„ใฆๆŠ˜ใ‚Œ็ทšใŒ่กจ็คบใ•ใ‚Œใ‚‹ ไบˆๆธฌ็ทšใฏๆฎ‹ๆ—ฅๆ•ฐใฎๅ‰ฒๅˆใง่จˆ็ฎ— ไผ‘ๆ—ฅใฏใƒใ‚คใƒณใƒˆๆถˆ่ฒปใ—ใชใ„ ๅฎšๆœŸ็š„ใซ่‡ชๅ‹•ๆ›ดๆ–ฐใ™ใ‚‹ ๆง‹ๆˆ ใƒชใ‚ฝใƒผใ‚น็ฎก็†ใ‚„้‹็”จใฎๆ‰‹้–“ใ‚’ๅฐ‘ใชใใ™ใ‚‹ใŸใ‚ใ€GASใงใ‚ฟใ‚นใ‚ฏใƒ‡ใƒผใ‚ฟใ‚’ๅ–ๅพ—ใ—ใฆ Looker Studio ใซ่กจ็คบใ—ใฆใ„ใพใ™ใ€‚ ๅ‰ๆ GitHubใฎIssueใซใฏใƒใƒผใƒ ็‹ฌ่‡ชใฎ้‹็”จใจใ—ใฆไธ‹่จ˜ใŒ่จญๅฎšใ•ใ‚ŒใฆใŠใ‚Šใ€ไธ€้ƒจๅฎŸ่ฃ…ใฏใ“ใฎๅ†…ๅฎนใ‚’ๅ‰ๆใจใ—ใฆใ„ใพใ™ใ€‚ Title ใ‚ฟใ‚นใ‚ฏใฎใ‚ฟใ‚คใƒˆใƒซ ใ€Œ:ใ€ๅพŒใซใƒใ‚คใƒณใƒˆใ‚’่จ˜่ผ‰ ไพ‹) ใ€Œใ€‡ใ€‡ใฎใƒ†ใ‚นใƒˆใ‚’ไฝœๆˆใ™ใ‚‹:3ใ€ใ€ใ€Œใ€‡ใ€‡ใฎใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใ‚’่ฟฝๅŠ ใ™ใ‚‹:2ใ€ Milestones ใ‚นใƒ—ใƒชใƒณใƒˆใ‚’่จญๅฎš ไพ‹๏ผ‰ใ€ŒSprint5ใ€ใ€ใ€ŒSprint11ใ€ Labels ใƒใ‚ฑใƒƒใƒˆใฎ็จฎ้กžใ‚’่จญๅฎš ใ€ŒPRใ€ใ€ŒEpicใ€ไปฅๅค–ใŒใƒใ‚คใƒณใƒˆ้›†่จˆๅฏพ่ฑกใฎใ‚ฟใ‚นใ‚ฏ ไพ‹๏ผ‰ใ€Œandroidใ€ใ€ใ€Œiosใ€ใ€ใ€ŒPRใ€ใ€ใ€ŒEpicใ€ ๅฎŸ่ฃ… 1. ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใ‚’็”จๆ„ ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใ‚’ๆ–ฐ่ฆไฝœๆˆใ—ใฆใ‚ทใƒผใƒˆใ‚’่ฟฝๅŠ ใ—ใฆ4ใค็”จๆ„ใ—ใพใ™ใ€‚ ใ‚ฟใ‚นใ‚ฏไธ€่ฆงใ‚ทใƒผใƒˆ GitHubใ‹ใ‚‰ๅ–ๅพ—ใ—ใŸๆƒ…ๅ ฑใ‚’ไฟๅญ˜ใ—ใฆใŠใใ‚ทใƒผใƒˆ Sprint้›†่จˆใ‚ทใƒผใƒˆ ใ‚ฟใ‚นใ‚ฏไธ€่ฆงใ‚’ใ‚นใƒ—ใƒชใƒณใƒˆใ”ใจใซ้›†่จˆใ—ใŸใ‚ทใƒผใƒˆ ๅฎŸ้š›ใซLooker Studioใ‹ใ‚‰ๅ‚็…งใ—ใฆใƒใƒผใƒณใƒ€ใ‚ฆใƒณใƒใƒฃใƒผใƒˆๅŒ–ใ™ใ‚‹ ่จญๅฎš็”จใ‚ทใƒผใƒˆ ใ‚นใƒ—ใƒชใƒณใƒˆๆœŸ้–“ใชใฉใฎๆƒ…ๅ ฑใŒ่จ˜่ผ‰ใ•ใ‚ŒใŸใ‚ทใƒผใƒˆ ไธ€ๆ™‚่จˆ็ฎ—็”จใ‚ทใƒผใƒˆ GASใ‹ใ‚‰ไธ€ๆ™‚็š„ใซๆ›ธใ่พผใ‚€็ฉบใฎใ‚ทใƒผใƒˆ 2. GitHub API v4ใงใƒ‡ใƒผใ‚ฟๅ–ๅพ—ใ—ใฆใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใซๅŽ้›†ใ™ใ‚‹ GitHub API v4ใงใƒ‡ใƒผใ‚ฟใ‚’ๅ–ๅพ—ใ™ใ‚‹ใŸใ‚ใซใ€ไธ‹่จ˜ใฎ้–ขๆ•ฐใ‚’็”จๆ„ใ—ใพใ™ใ€‚ function fetchGithubTasks() { const graphql_query = ` query { \ search(type: ISSUE, query: "is:issue org:organization_name project:project_name", last: 100) { \ issueCount \ nodes { ... on Issue { \ id \ milestone { title } \ number \ title \ closed \ closedAt \ createdAt \ author { login } \ assignees(first: 100){ nodes { login } } \ labels(first: 100){ nodes { name } } \ } \ } \ } \ } `; // ใ‚นใ‚ฏใƒชใƒ—ใƒˆใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใซ็™ป้Œฒใ•ใ‚ŒใŸใƒˆใƒผใ‚ฏใƒณใ‚’ๅ–ๅพ— const token = PropertiesService.getScriptProperties().getProperty("GITHUB_ACCESS_TOKEN"); const option = { method: "post", contentType: "application/json", headers: { Authorization: "bearer " + token }, payload: JSON.stringify({ query: graphql_query }) }; return UrlFetchApp.fetch("https://api.github.com/graphql", option); } ใ€Œgraphql_queryใ€ใฎๆ–‡ๅญ—ๅˆ—ใงๆŒ‡ๅฎšใ—ใฆใ„ใ‚‹ใ€Œorganization_nameใ€ใจใ€Œproject_nameใ€ใฏ็’ฐๅขƒใซใ‚ใฃใŸๆ–‡ๅญ—ๅˆ—ใซ็ฝฎใๆ›ใˆใฆใใ ใ•ใ„ใ€‚ใพใŸใ€ๅฎšๆœŸๅฎŸ่กŒใ•ใ‚Œใ‚‹ใพใงใฎๆœŸ้–“ใซ100ไปถไปฅไธŠๆ›ดๆ–ฐใ•ใ‚Œใ‚‹ใ“ใจใŒใชใ‹ใฃใŸใŸใ‚ใ€ไธ€ๅ›žใฎๅฎŸ่กŒใงIssueใฎๅ–ๅพ—ไปถๆ•ฐใฏๆ›ดๆ–ฐๆ—ฅๆ™‚ใŒๆ–ฐใ—ใ„้ †ใซ100ไปถใจใ—ใฆใ„ใพใ™ใ€‚ ใ“ใฎ้–ขๆ•ฐใ‚’ๅˆฉ็”จใ—ใฆใƒ‡ใƒผใ‚ฟใ‚’ๅ–ๅพ—ใ—ใ€ใƒ‡ใƒผใ‚ฟๅค‰ๆ›ใจใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใธใฎๆ›ธใ่พผใฟใ‚’่กŒใ„ใพใ™ใ€‚ const SPREAD_SHEET_ID = "ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใฎID" const TASK_SHEAT_NAME = "ใ‚ฟใ‚นใ‚ฏไธ€่ฆงใ‚ทใƒผใƒˆ" const TMP_SHEAT_NAME = "ไธ€ๆ™‚่จˆ็ฎ—็”จใฎใ‚ทใƒผใƒˆ" const ignore_labels = [ "Epic", "PR", ] // ใ‚ฟใ‚นใ‚ฏไธ€่ฆงใ‚’ๅ–ๅพ—ใ—ใฆใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใซๆ›ธใ่พผใ‚€้–ขๆ•ฐ function updateTasks() { // GitHubใ‹ใ‚‰ใ‚ฟใ‚นใ‚ฏใ‚’ๅ–ๅพ— const response = fetchGithubTasks() // ใƒฌใ‚นใƒใƒณใ‚นใ‚’ใ‚ฟใ‚นใ‚ฏๅฝขๅผใซๅค‰ๆ›ใ—ใฆใ€ไธ€้ƒจใฎlabelใซ่ฉฒๅฝ“ใ™ใ‚‹ใ‚ฟใ‚นใ‚ฏใ‚’้™คๅŽป const result = JSON.parse(response) const sbis = result.data.search.nodes .map(x => convertToTask(x)) .filter(x => !ignore_labels.includes(x.label)) // keyใจvalueใ‚’ๅˆ†้›ข const keys = Object.keys(sbis[0]) const records = sbis.map(x => Object.values(x)) // ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใซๆ›ธใ่พผใฟ const sheet = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheetByName(TASK_SHEAT_NAME) const tmpSheet = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheetByName(TMP_SHEAT_NAME) // ๅ–ๅพ—ใ—ใŸใƒ‡ใƒผใ‚ฟใ‹ใ‚‰ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใ‚’ๆ›ดๆ–ฐ records.forEach(x => { // idใ‹ใ‚‰่กŒ็•ชๅทใ‚’ๅ–ๅพ— const row = getRow(tmpSheet, TASK_SHEAT_NAME, x[0]) // IDใŒๅญ˜ๅœจใ—ใชใ„ๅ ดๅˆใฏๆ–ฐ่ฆ่ฟฝๅŠ  if (row == null) { sheet.appendRow(x) return } // ๅญ˜ๅœจใ™ใ‚‹ๅ ดๅˆใฏ็ฝฎใๆ›ใˆ sheet.getRange(row, 1, 1, x.length).setValues([x]) }) } // ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใฎQUERY้–ขๆ•ฐใงIDใ‚’ๆคœ็ดขใ™ใ‚‹้–ขๆ•ฐ // ใƒ‡ใƒผใ‚ฟใŒๅคšใใชใฃใŸใจใใซ็ทšๅฝขๆŽข็ดขใ‚ˆใ‚Š้ซ˜้€Ÿ function getRow(tmpSheet, targetSheetName, id) { tmpSheet.getRange(1,1).setValue(`=QUERY({${targetSheetName}!A:A, ARRAYFORMULA(ROW(${targetSheetName}!A:A))},"WHERE Col1 = '${id}'")`) const row = tmpSheet.getRange(1, 2).getValue() return row != "" ? row : null } // GitHubใ‹ใ‚‰ๅ–ๅพ—ใ—ใŸใƒ‡ใƒผใ‚ฟใ‚’ๆ•ดๅฝขใ™ใ‚‹้–ขๆ•ฐ function convertToTask(item) { const title = item.title.split(':', 2)[0] const point = parseInt(item.title.split(':', 2)[1] ?? 0) const closedAtJST = item.closedAt ? Utilities.formatDate(new Date(item.closedAt), "JST", "yyyy-MM-dd HH:mm:ss") : undefined const createdAtJST = item.createdAt ? Utilities.formatDate(new Date(item.createdAt), "JST", "yyyy-MM-dd HH:mm:ss") : undefined return { id: item.id, title: title, point: point, closed: item.closed, closedAt: closedAtJST, author: item.author.login, assignee: item.assignees.nodes[0]?.login ?? "", label: item.labels.nodes[0]?.name ?? "", milestone: item.milestone?.title ?? "", createdAt: createdAtJST, } } GASใฎใƒˆใƒชใ‚ฌใƒผใซupdateTasks้–ขๆ•ฐใ‚’ๅฎšๆœŸๅฎŸ่กŒใ™ใ‚‹ใ‚ˆใ†ใซ่จญๅฎšใ—ใพใ™ใ€‚ๅฎŸ่กŒๅพŒใฏๆฌกใฎใ‚ˆใ†ใชใƒ‡ใƒผใ‚ฟใŒใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใซๆ›ธใ่พผใพใ‚Œใพใ™ใ€‚ 3. Sprint็”จใฎใƒ‡ใƒผใ‚ฟใซๅค‰ๆ›ใ™ใ‚‹ ใ‚ฟใ‚นใ‚ฏไธ€่ฆงใ‚ทใƒผใƒˆใซใƒ‡ใƒผใ‚ฟๅ–ๅพ—ใงใใพใ—ใŸใŒใ€Looker Studioใงใƒใƒผใƒณใƒ€ใ‚ฆใƒณใƒใƒฃใƒผใƒˆใฎใ‚ˆใ†ใชใ‚ฐใƒฉใƒ•ใ‚’่กจ็คบใ™ใ‚‹ใซใฏใ“ใฎใƒ‡ใƒผใ‚ฟใ‚’ๅ…ƒใซๅ€คใฎๅŠ ๅทฅใŒๅฟ…่ฆใงใ™ใ€‚Looker StudioไธŠใงใ‚‚ๅ€คใฎๅŠ ๅทฅใฏใงใใพใ™ใŒใ€ใƒ‡ใƒผใ‚ฟใ‚ฝใƒผใ‚นใซใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใ‚’ไฝฟใ†ๅ ดๅˆใฏ่ค‡้›‘ใชๅŠ ๅทฅใŒใงใใพใ›ใ‚“ใ€‚ใใฎใŸใ‚ใ€ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆๅดใฎๅˆฅใ‚ทใƒผใƒˆ๏ผˆSprint้›†่จˆใ‚ทใƒผใƒˆ๏ผ‰ใงๅŠ ๅทฅใ‚’่กŒใ„ใพใ™ใ€‚ ใพใŸใ€ใ‚ฟใ‚นใ‚ฏไธ€่ฆงใ‚ทใƒผใƒˆใฎๅค‰ๆ›ดใ‚’ๅณๆ™‚ใซSprint้›†่จˆใ‚ทใƒผใƒˆใซๅๆ˜ ใ™ใ‚‹ๅ‡ฆ็†ใŒๅฟ…่ฆใงใ™ใ€‚ใŸใ ใ€ๅค‰ๆ›ดใ—ใŸใƒ‡ใƒผใ‚ฟใฎๅ–ๅพ—โ†’ๅŠ ๅทฅโ†’ๅๆ˜ ใ‚’ๆ„š็›ดใซๅฎŸ่ฃ…ใ™ใ‚‹ใฎใฏๅฐ‘ใ—ๆ‰‹้–“ใŒใ‹ใ‹ใ‚‹ใŸใ‚ใ€GASใ‹ใ‚‰ใฏใ‚ปใƒซใซใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆ้–ขๆ•ฐใฎๆ–‡ๅญ—ๅˆ—ใ‚’ๆ›ธใ่พผใ‚€ใ“ใจใงๅฎŸ็พใ—ใพใ™ใ€‚ ไธ‹่จ˜ใฎใ‚ณใƒผใƒ‰ใฏ่จญๅฎšใ‚ทใƒผใƒˆใซ่จ˜่ผ‰ใ•ใ‚ŒใŸๆ›ดๆ–ฐๆ—ฅใ‚’้ŽใŽใŸใ‚‰ใ€ๆฌกใฎใ‚นใƒ—ใƒชใƒณใƒˆๆ—ฅๆ•ฐๅˆ†ใฎ่กŒใ‚’่ฟฝๅŠ ใ—ใฆใ€ๅ„ใ‚ปใƒซใซใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆ้–ขๆ•ฐใ‚’ๅŸ‹ใ‚่พผใ‚“ใงใ„ใพใ™ใ€‚๏ผˆๅฎŸ่ฃ…ใ‚’ๅฆฅๅ”ใ—ใฆใ„ใ‚‹ใฎใงใ€ใ‚ทใƒผใƒˆใฎใƒ˜ใƒƒใƒ€ใƒผใŒๅค‰ใ‚ใฃใŸใ‚‰ๅดฉใ‚Œใฆใ—ใพใ„ใพใ™โ€ฆ๏ผ‰ const CONFIG_SHEAT_NAME = "่จญๅฎš็”จใ‚ทใƒผใƒˆ" const ACTIVITY_SHEAT_NAME = "Sprint้›†่จˆใ‚ทใƒผใƒˆ" // ่จญๅฎš็”จใ‚ทใƒผใƒˆใ‚’่ชญใฟ่พผใ‚€้–ขๆ•ฐ function readConfig(sheet) { const rows = sheet.getDataRange().getValues() // Configใƒ‡ใƒผใ‚ฟใ‚’ใƒžใƒƒใƒ—ใซ่ชญใฟ่พผใฟ const config = {} rows.forEach( (x, i) => config[x[0]] = { value: x[1], index: i } ) return config } // ไผ‘ๆ—ฅๅˆคๅฎš็”จใฎ้–ขๆ•ฐ function isHoliday(date) { // ๅœŸๆ—ฅ const day = date.getDay() if (day === 0 || day === 6) return true // ็ฅๆ—ฅ const id = 'ja.japanese#holiday@group.v.calendar.google.com' const cal = CalendarApp.getCalendarById(id) const events = cal.getEventsForDay(date) if (events.length) return true // ใใฎไป–ไผ‘ๆ—ฅ const otherHoliday = [ '12/28', '12/29', '12/30', '12/31', '01/01', '01/02', '01/03', ]; const fd = Utilities.formatDate(date, 'JST', 'MM/dd') return otherHoliday.some(value => value === fd) } // ๆฌกๅ›žใฎใ‚นใƒ—ใƒชใƒณใƒˆใƒ‡ใƒผใ‚ฟใ‚’ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใซๆ›ธใ่พผใ‚€้–ขๆ•ฐ function nextSprint() { const configSheet = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheetByName(CONFIG_SHEAT_NAME) config = readConfig(configSheet) const today = new Date() // ๆ›ดๆ–ฐๆ—ฅๅ‰ใฏไฝ•ใ‚‚ใ—ใชใ„ if (today < config.next_sprint_update_date.value) { return } // ่จญๅฎšใ‚ทใƒผใƒˆใฎใ‚นใƒ—ใƒชใƒณใƒˆ็•ชๅทใ‚’ๆ›ดๆ–ฐใ€ๆฌกๅ›žๆ›ดๆ–ฐๆ—ฅใ‚’่จญๅฎš const nextSprintNumber = config.current_sprint_number.value + 1 const nextUpdateTime = new Date(config.next_sprint_update_date.value.getTime()); nextUpdateTime.setDate(nextUpdateTime.getDate() + 7 * config.sprint_week_span.value) configSheet.getRange(config.current_sprint_number.index+1, 1+1).setValue(nextSprintNumber) configSheet.getRange(config.next_sprint_update_date.index+1, 1+1).setValue(Utilities.formatDate(nextUpdateTime, "JST", "yyyy-MM-dd HH:mm:ss")) const activitySheet = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheetByName(ACTIVITY_SHEAT_NAME) const lastRowNumber = activitySheet.getLastRow() const sprintStartDate = new Date(config.next_sprint_update_date.value.getTime()); sprintStartDate.setDate(sprintStartDate.getDate() + 1) // ๅ‰ๅ‡ฆ็†๏ผˆๆ—ฅๅ‰ฒ่จˆ็ฎ—ใฎใŸใ‚ใ€ใ‚นใƒ—ใƒชใƒณใƒˆใฎๅฎŸๅƒๆ—ฅๆ•ฐใ‚’่จˆ็ฎ—ใ—ใฆใŠใ๏ผ‰ let working_day_num = 0 for (var d = new Date(sprintStartDate.getTime()); d <= nextUpdateTime; d.setDate(d.getDate() + 1)) { working_day_num = !isHoliday(d) ? working_day_num + 1 : working_day_num } // DailyActivityใ‚ทใƒผใƒˆใซๆฌกใฎใ‚นใƒ—ใƒชใƒณใƒˆๅˆ†ใฎใƒ‡ใƒผใ‚ฟใ‚’่ฟฝๅŠ ใ™ใ‚‹ let index = 0 let sprint_elapsed_day = -1 for (var d = new Date(sprintStartDate.getTime()); d <= nextUpdateTime; d.setDate(d.getDate() + 1)) { const currentRowNumber = lastRowNumber + index + 1 // ๅ–ถๆฅญๆ—ฅๅˆคๅฎš const is_business_day = !isHoliday(d) // ใ‚นใƒ—ใƒชใƒณใƒˆ็ตŒ้Žๆ—ฅๆ•ฐ๏ผˆๅˆๆ—ฅใ‚’0ใจใ™ใ‚‹๏ผ‰ sprint_elapsed_day = !isHoliday(d) ? sprint_elapsed_day + 1 : sprint_elapsed_day // ็‰นๅฎšใฎmilestoneใฎใ†ใกdใฎๆ—ฅไป˜ใซไฝœๆˆใ•ใ‚ŒใŸใƒใ‚คใƒณใƒˆ const today_created_point = `=SUMIFS(${TASK_SHEAT_NAME}!$C:$C,${TASK_SHEAT_NAME}!$J:$J,">="&$A${currentRowNumber}, ${TASK_SHEAT_NAME}!$J:$J,"<"&($A${currentRowNumber}+1), ${TASK_SHEAT_NAME}!$I:$I,"="&$B${currentRowNumber})` // ็‰นๅฎšใฎmilestoneใฎใ†ใกdใฎๆ—ฅไป˜ใซๅฎŒไบ†ใ—ใŸใƒใ‚คใƒณใƒˆ const today_closed_point = `=SUMIFS(${TASK_SHEAT_NAME}!$C:$C,${TASK_SHEAT_NAME}!$E:$E,">="&$A${currentRowNumber}, ${TASK_SHEAT_NAME}!$E:$E,"<"&($A${currentRowNumber}+1), ${TASK_SHEAT_NAME}!$I:$I,"="&$B${currentRowNumber})` // ็‰นๅฎšใฎmilestoneใฎใ†ใกdใฎๆ—ฅไป˜ใพใงไฝœๆˆใ•ใ‚ŒใŸใƒใ‚คใƒณใƒˆๅˆ่จˆ const total_created_point = `=SUMIFS(${TASK_SHEAT_NAME}!$C:$C, ${TASK_SHEAT_NAME}!$J:$J,"<"&($A${currentRowNumber}+1), ${TASK_SHEAT_NAME}!$I:$I,"="&$B${currentRowNumber})` // ็‰นๅฎšใฎmilestoneใฎใ†ใกdใฎๆ—ฅไป˜ใพใงๅฎŒไบ†ใ—ใŸใƒใ‚คใƒณใƒˆๅˆ่จˆ const total_closed_point = `=SUM($F${lastRowNumber+1}:$F${currentRowNumber})` // ไบˆๆธฌ็ทš็”จใฎๆฎ‹ใ‚Šใƒใ‚คใƒณใƒˆ๏ผˆๆฎ‹ๆ—ฅๆ•ฐใฎๅ‰ฒๅˆใง่จˆ็ฎ—๏ผ‰ const focast_remaining_point = index == 0 ? `=$G${currentRowNumber}` : `=MAX(($I${currentRowNumber-1}+$E${currentRowNumber})-ROUNDUP(($I${currentRowNumber-1}+$E${currentRowNumber})/(${working_day_num}-$D${currentRowNumber})) * ($D${currentRowNumber}-$D${currentRowNumber-1}), 0)` // ๆฎ‹ใ‚Šใƒใ‚คใƒณใƒˆ๏ผˆๆœชๆฅใฎๆ—ฅไป˜ใฏ็ฉบ็™ฝใ‚’ๅ…ฅๅŠ›๏ผ‰ const remaining_point = `=IF(TODAY()+1>A${currentRowNumber},MAX($G${currentRowNumber}-$H${currentRowNumber}, 0), "")` // ใ‚นใƒ—ใƒฌใƒƒใƒ‰ใ‚ทใƒผใƒˆใซๆ›ธใ่พผใฟ activitySheet.appendRow([ Utilities.formatDate(d, "JST", "yyyy-MM-dd"), `Sprint${nextSprintNumber}`, is_business_day, sprint_elapsed_day, today_created_point, today_closed_point, total_created_point, total_closed_point, focast_remaining_point, remaining_point, ]) index += 1 } } ๅŽ้›†ๅ‡ฆ็†ใจๅŒๆง˜ใซGASใฎใƒˆใƒชใ‚ฌใƒผใซnextSprint้–ขๆ•ฐใ‚’ๅฎšๆœŸๅฎŸ่กŒใ™ใ‚‹ใ‚ˆใ†ใซ่จญๅฎšใ—ใพใ™ใ€‚ๅฎŸ่กŒใ™ใ‚‹ใจๆฌกใฎใ‚ˆใ†ใชใƒ‡ใƒผใ‚ฟใ‚’ๆ›ธใ่พผใฟใพใ™ใ€‚ 4. Looker Studioใง่กจ็คบใ™ใ‚‹ Sprint้›†่จˆใ‚ทใƒผใƒˆ๏ผˆไธ‹่จ˜ใฎๅ›ณใงใฏdaily_activity๏ผ‰ใ‚’Looker Studioใฎใƒ‡ใƒผใ‚ฟใ‚ฝใƒผใ‚นใซ่ฟฝๅŠ ใ—ใฆใ€ๆŠ˜ใ‚Œ็ทšใ‚ฐใƒฉใƒ•ใ‚’ไฝœๆˆใ—ใพใ™ใ€‚ใƒ•ใ‚ฃใƒซใ‚ฟๆฉŸ่ƒฝใงmilestoneใ‚’่จญๅฎšใ™ใ‚‹ใ“ใจใซใ‚ˆใ‚ŠSprintๅ˜ไฝใซ่กจ็คบใ‚’็ตžใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ่จญๅฎšใ‚’ๅฎŒไบ†ใ™ใ‚‹ใจๆฌกใฎใ‚ˆใ†ใชใ‚ฐใƒฉใƒ•ใŒ่กจ็คบใ•ใ‚Œใพใ™ใ€‚ ใŠใ‚ใ‚Šใซ ไปŠๅ›žใฏGAS + Looker Studioใง็ฐกๆ˜“็š„ใชใƒใƒผใƒณใƒ€ใ‚ฆใƒณใƒใƒฃใƒผใƒˆใ‚’ไฝœใ‚‹ๆ–นๆณ•ใ‚’็ดนไป‹ใ—ใพใ—ใŸใ€‚ใƒใƒผใƒณใƒ€ใ‚ฆใƒณใƒใƒฃใƒผใƒˆใŒใ‚ใ‚‹ใ“ใจใง่ฆ–่ฆš็š„ใซ้€ฒๆ—ใŒๆŠŠๆกใ—ใ‚„ใ™ใใชใ‚Šใพใ™ใ€‚ใใ—ใฆใ€ใ‚นใƒ—ใƒชใƒณใƒˆใ‚ดใƒผใƒซใซ้–“ใซๅˆใ†ใ‹ใฉใ†ใ‹ใ‚’ๆ—ฉใ‚ใซ่ฆ‹ๆฅตใ‚ใฆใ€ใƒ—ใƒญใƒ€ใ‚ฏใƒˆใ‚ชใƒผใƒŠใƒผใธใฎ็›ธ่ซ‡ใ‚„ไฝœๆฅญ่‡ชไฝ“ใฎ่ฆ‹็›ดใ—ใŒใ—ใ‚„ใ™ใใชใ‚Šใพใ™ใ€‚ใ‚‚ใ—ใƒใƒผใƒณใƒ€ใ‚ฆใƒณใƒใƒฃใƒผใƒˆใ‚’ๅˆฉ็”จใ—ใฆใ„ใชใ„ๅ ดๅˆใฏใœใฒๅฐŽๅ…ฅใ‚’ๆคœ่จŽใ—ใฆใฟใฆใใ ใ•ใ„ใ€‚ ๆ˜Žๆ—ฅใฏใ€ @penpenpen ใ•ใ‚“ใฎ ใŠ้‡‘ใ‚’ใ‹ใ‘ใšใซๅญฆใถRust ใงใ™ใ€‚ใŠๆฅฝใ—ใฟใซ๏ผ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใฏใ˜ใ‚ใซ ใ“ใ‚“ใซใกใฏใ€‚ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒใƒผใƒ ใฎๆทป้‡Ž้šผ็Ÿขใจ็”ณใ—ใพใ™ใ€‚ ่ฟ‘ๅนดใ€ใ‚ตใ‚คใƒใƒผๆ”ปๆ’ƒใซใ‚ˆใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ่ขซๅฎณใ‚„Apache Log4jใฎ่„†ๅผฑๆ€งใฎไปถใชใฉใงใ€่„†ๅผฑๆ€งใ‚„ใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆๆƒ…ๅ ฑใ‚’ใ‚นใ‚ญใƒฃใƒณใ™ใ‚‹ใ“ใจใŒ้‡่ฆใซใชใฃใฆใใฆใ„ใพใ™ใ€‚ ๆœฌ่จ˜ไบ‹ใงใฏใ€่„†ๅผฑๆ€งใ‚„ใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆๆƒ…ๅ ฑใฎใ‚นใ‚ญใƒฃใƒณใ‚’ๆ‰‹่ปฝใซๅฎŸ่กŒใงใใ‚‹ใƒ„ใƒผใƒซใ€ŒTrivyใ€ใซใคใ„ใฆ็ดนไป‹ใ—ใŸใ„ใจๆ€ใ„ใพใ™ใ€‚ ใ€ŒTrivyใ€ใจใฏ Trivyใจใฏใ€ใ‚ณใƒณใƒ†ใƒŠใ‚คใƒกใƒผใ‚ธใ‚„ใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ใ€RemoteใฎGit Repository็ญ‰ใฎ่„†ๅผฑๆ€งใ‚„ใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆๆƒ…ๅ ฑใ‚’ใ‚นใ‚ญใƒฃใƒณใงใใ‚‹ใƒ„ใƒผใƒซใงใ™ใ€‚ Trivyใฏไป–ใฎ่„†ๅผฑๆ€งใ‚นใ‚ญใƒฃใƒณใƒ„ใƒผใƒซใจๆฏ”ในใ€ใƒใ‚คใƒŠใƒชใ‚’้…็ฝฎใ™ใ‚‹ใ ใ‘ใงๅˆฉ็”จๅฏ่ƒฝใซใชใ‚‹็ญ‰ใ€ๅฐŽๅ…ฅใŒๅฎนๆ˜“ใงใ€ๅฎŸ่กŒใ‚‚ใƒฏใƒณใƒฉใ‚คใƒŠใƒผใงๅฎŸ่กŒใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ใพใŸใ€TrivyใฏGitHub Actionsใ€JenkinsใชใฉใฎCIใซใ‚‚็ฐกๅ˜ใซ็ต„ใฟ่พผใ‚ใ‚‹ใ‚ˆใ†ใซไฝœใ‚‰ใ‚Œใฆใ„ใพใ™ใ€‚ TrivyใŒใ‚นใ‚ญใƒฃใƒณใงใใ‚‹ใ‚ฟใƒผใ‚ฒใƒƒใƒˆ Container Image Filesystem Git Repository (remote) Virtual Machine Image Kubernetes AWS ๆœ€่ฟ‘ใ€AMIใ‚„EBSใ‚นใƒŠใƒƒใƒ—ใ‚ทใƒงใƒƒใƒˆใฎใ‚นใ‚ญใƒฃใƒณใซๅฏพๅฟœใ—ใพใ—ใŸใ€‚๏ผˆ Trivy Now Scans Amazon Machine Images (AMIs) ) ๅ‚่€ƒ๏ผš https://github.com/aquasecurity/trivy#installation Trivyใฎใ‚นใ‚ญใƒฃใƒณๅ†…ๅฎน ไฝฟ็”จใ—ใฆใ„ใ‚‹OSใฎใ‚ฝใƒ•ใƒˆใ‚ฆใ‚งใ‚ขใฎไพๅญ˜้–ขไฟ‚๏ผˆSBOM๏ผ‰ ๆ—ข็Ÿฅใฎ่„†ๅผฑๆ€ง๏ผˆCVE๏ผ‰ IaC ใฎๅ•้กŒใจ่จญๅฎšใƒŸใ‚น ๆฉŸๅฏ†ๆƒ…ๅ ฑใจใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆๆƒ…ๅ ฑ ใ‚ฝใƒ•ใƒˆใ‚ฆใ‚งใ‚ข ใƒฉใ‚คใ‚ปใƒณใ‚น ๅ‚่€ƒ๏ผš https://github.com/aquasecurity/trivy#installation Trivyใฎ่„†ๅผฑๆ€งใ‚นใ‚ญใƒฃใƒณใซใคใ„ใฆ Trivyใฎ่„†ๅผฑๆ€งใ‚นใ‚ญใƒฃใƒณใฏใ€trivy-dbใจๅ‘ผใฐใ‚Œใฆใ„ใ‚‹ใƒ„ใƒผใƒซใงไฝœๆˆใ•ใ‚Œใฆใ„ใ‚‹่„†ๅผฑๆ€งDBใ‚’ๅ‚็…งใ—ใฆ่กŒใ‚ใ‚Œใพใ™ใ€‚ 6ๆ™‚้–“ใŠใใซใ€่„†ๅผฑๆ€งDBใŒๆ›ดๆ–ฐใ•ใ‚Œใฆใ„ใใŸใ‚ใ€ๆœ€ๆ–ฐใฎ่„†ๅผฑๆ€งๆƒ…ๅ ฑใง่„†ๅผฑๆ€งใ‚นใ‚ญใƒฃใƒณใ‚’ใ‹ใ‘ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ Update interval Every 6 hours ๅผ•็”จๅ…ƒ๏ผšhttps://github.com/aquasecurity/trivy-db ไธŠ่จ˜ใฎ่„†ๅผฑๆ€งDBใซๆ›ดๆ–ฐใŒใ‚ใฃใŸ้š›ใ€ใ‚นใ‚ญใƒฃใƒณใ‚ณใƒžใƒณใƒ‰ๅˆๅ›žๅฎŸ่กŒๆ™‚ใซไปฅไธ‹ใฎใ‚ˆใ†ใชใ‚ณใƒžใƒณใƒ‰ใŒๆตใ‚Œใ€่‡ชๅ‹•ใงๆœ€ๆ–ฐใฎ่„†ๅผฑๆ€งๆƒ…ๅ ฑใ‚’ๅ–ใ‚Š่พผใ‚“ใงใใ‚Œใพใ™ใ€‚ INFO Need to update DB INFO DB Repository: ghcr.io/aquasecurity/trivy-db INFO Downloading DB... 35.54 MiB / 35.54 MiB [---------------------------------------------------] 100.00% 2.33 MiB p/s 15s TrivyๅฎŸ้š›ใซไฝฟใฃใฆใฟใ‚‹ ๅˆใ‚ใซTrivyใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใพใ™ใ€‚ ใ‚คใƒณใ‚นใƒˆใƒผใƒซๆ–นๆณ•ใฏไปฅไธ‹ใฎๅ…ฌๅผใซๅพ“ใฃใฆใ€ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ‚’ใ—ใพใ™ใ€‚ https://github.com/aquasecurity/trivy#installation ใ‚ณใƒณใƒ†ใƒŠใ‚คใƒกใƒผใ‚ธใ‚นใ‚ญใƒฃใƒณ ใ‚ณใƒณใƒ†ใƒŠใ‚คใƒกใƒผใ‚ธใ‚’ใ‚นใ‚ญใƒฃใƒณใ™ใ‚‹้š›ใฏใ€ trivy image [imageๅ] ใงใ‚นใ‚ญใƒฃใƒณใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ่ฉฆใ—ใซใƒ™ใƒผใ‚นใ‚คใƒกใƒผใ‚ธ Alpine Linux 3.4ใฎPythonใ‚คใƒกใƒผใ‚ธใซๅฏพใ—ใฆใ‚นใ‚ญใƒฃใƒณใ—ใฆใฟใพใ™ใ€‚ โ€ปๅ‡บๅŠ›็ตๆžœใฏ้•ทใ„ใŸใ‚ใ€่จ˜่ผ‰ใฏไธ€้ƒจใฎใฟใซใ—ใฆใ„ใพใ™ใ€‚ $ trivy image python:3.4-alpine python:3.4-alpine (alpine 3.9.2) Total: 37 (UNKNOWN: 0, LOW: 4, MEDIUM: 16, HIGH: 13, CRITICAL: 4) โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Library โ”‚ Vulnerability โ”‚ Severity โ”‚ Installed Version โ”‚ Fixed Version โ”‚ Title โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ expat โ”‚ CVE-2018-20843 โ”‚ HIGH โ”‚ 2.2.6-r0 โ”‚ 2.2.7-r0 โ”‚ expat: large number of colons in input makes parser consume โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ high amount... โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2018-20843 โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ CVE-2019-15903 โ”‚ โ”‚ โ”‚ 2.2.7-r1 โ”‚ expat: heap-based buffer over-read via crafted XML input โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2019-15903 โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ libbz2 โ”‚ CVE-2019-12900 โ”‚ CRITICAL โ”‚ 1.0.6-r6 โ”‚ 1.0.6-r7 โ”‚ bzip2: out-of-bounds write in function BZ2_decompress โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2019-12900 โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ libcrypto1.1 โ”‚ CVE-2019-1543 โ”‚ HIGH โ”‚ 1.1.1a-r1 โ”‚ 1.1.1b-r1 โ”‚ openssl: ChaCha20-Poly1305 with long nonces โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2019-1543 โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค ๅ‡บๅŠ›็ตๆžœใ‚’็ขบ่ชใ™ใ‚‹ใจ37ไปถใฎ่„†ๅผฑๆ€งใŒใ‚ใ‚‹ใ“ใจใŒใ‚ใ‹ใ‚Šใพใ™ใ€‚ 37ไปถใฎ่„†ๅผฑๆ€งใฎๅ†…่จณใซCRITICALใ€HIGHใ€MEDIUMใ€LOWใ€UNKNOWNใŒๆ›ธใ‹ใ‚Œใฆใ„ใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ ใ“ใกใ‚‰ใฏใ€ๅ…ฑ้€š่„†ๅผฑๆ€ง่ฉ•ไพกใ‚ทใ‚นใƒ†ใƒ CVSS๏ผˆCommon Vulnerability Scoring System๏ผ‰ใซใ‚ˆใฃใฆ่ฉ•ไพกใ•ใ‚ŒใŸ่„†ๅผฑๆ€งใฎใ‚นใ‚ณใ‚ขใ‚’ใ‚‚ใจใซ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹ใ‚‚ใฎใงใ™ใ€‚ ็พๅœจใ€ๆœ€ๆ–ฐ็‰ˆใฎCVSSใƒใƒผใ‚ธใƒงใƒณ3ใงใฎๅ„ใƒฌใƒ™ใƒซใฎใ‚นใ‚ณใ‚ขใฏไปฅไธ‹ใฎ้€šใ‚Šใงใ™ใ€‚ CRITICAL๏ผˆ9.0๏ฝž10.0๏ผ‰ใ€HIGH๏ผˆ7.0๏ฝž8.9๏ผ‰ใ€MEDIUM๏ผˆ4.0๏ฝž6.9๏ผ‰ใ€LOW๏ผˆ0.1๏ฝž3.9๏ผ‰ใ€UNKNOWN๏ผˆๆœช็ขบ่ช๏ผ‰ ใ‚นใ‚ณใ‚ขใฎ็ฎ—ๅ‡บๆ–นๆณ•ใชใฉ่ฉณใ—ใใฏ ใ“ใกใ‚‰ ใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚ --severity ใ‚ชใƒ—ใ‚ทใƒงใƒณใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใงใ€ไธŠ่จ˜ใฎๅ‡บๅŠ›็ตๆžœใ‹ใ‚‰่„†ๅผฑๆ€งใฎใƒฌใƒ™ใƒซใง็ตžใ‚‹ใ“ใจใ‚‚ใงใใพใ™ใ€‚ ๅฎŸ่กŒไพ‹๏ผˆCRITICAL,HIGHใง็ตžใฃใฆใฟใŸไพ‹๏ผ‰ $ trivy image --severity CRITICAL,HIGH python:3.4-alpine python:3.4-alpine (alpine 3.9.2) Total: 17 (HIGH: 13, CRITICAL: 4) โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Library โ”‚ Vulnerability โ”‚ Severity โ”‚ Installed Version โ”‚ Fixed Version โ”‚ Title โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ expat โ”‚ CVE-2018-20843 โ”‚ HIGH โ”‚ 2.2.6-r0 โ”‚ 2.2.7-r0 โ”‚ expat: large number of colons in input makes parser consume โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ high amount... โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2018-20843 โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ CVE-2019-15903 โ”‚ โ”‚ โ”‚ 2.2.7-r1 โ”‚ expat: heap-based buffer over-read via crafted XML input โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2019-15903 โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ libbz2 โ”‚ CVE-2019-12900 โ”‚ CRITICAL โ”‚ 1.0.6-r6 โ”‚ 1.0.6-r7 โ”‚ bzip2: out-of-bounds write in function BZ2_decompress โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2019-12900 โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค ใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ใ‚นใ‚ญใƒฃใƒณ ๆฌกใซใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ใ‚’ใ‚นใ‚ญใƒฃใƒณใ™ใ‚‹้š›ใฏใ€ trivy fs ใพใŸใฏ trivy rootfs ใงใ‚นใ‚ญใƒฃใƒณใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ trivy fs ใจ trivy rootfs ใฎ้•ใ„ fsใ‚ณใƒžใƒณใƒ‰ ใƒญใƒผใ‚ซใƒซใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใซๅฏพใ™ใ‚‹ใ‚นใ‚ญใƒฃใƒณ ๅ‚่€ƒ๏ผš Filesystem roofsใ‚ณใƒžใƒณใƒ‰ ใƒ›ใ‚นใƒˆใƒžใ‚ทใƒณใ€ไปฎๆƒณใƒžใ‚ทใƒณใ‚คใƒกใƒผใ‚ธใ€ๅฑ•้–‹ใ•ใ‚ŒใŸใ‚ณใƒณใƒ†ใƒŠใ‚คใƒกใƒผใ‚ธใฎใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ใชใฉใซๅฏพใ™ใ‚‹ใ‚นใ‚ญใƒฃใƒณ ๅ‚่€ƒ๏ผš Rootfs ่ฉฆใ—ใซDjangoใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใŸPythonใฎไปฎๆƒณ็’ฐๅขƒใฎใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‚’็”จๆ„ใ—ใฆใฟใพใ—ใŸใ€‚ $ cat Pipfile [[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] django = "==4.1.4" [dev-packages] [requires] python_version = "3.8" ไธŠ่จ˜ใฎใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใซๅฏพใ—ใฆใ€ใ‚นใ‚ญใƒฃใƒณใ—ใฆใฟใพใ™ใ€‚ โ€ปๅฎŸ่กŒใ™ใ‚‹ใจใ€ๅฎŸ่กŒๆ™‚ๅˆปใŒๅฎŸ่กŒ็ตๆžœใฎINFOใฎๅทฆๅˆ—ใซๅ‡บใพใ™ใŒใ€ใ“ใ“ใงใฏๆถˆใ—ใฆใ„ใพใ™ใ€‚ $ trivy fs /path/to/project/ INFO Vulnerability scanning is enabled INFO Secret scanning is enabled INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning INFO Please see also https://aquasecurity.github.io/trivy/v0.35/docs/secret/scanning/#recommendation for faster secret detection INFO Number of language-specific files: 1 INFO Detecting pipenv vulnerabilities... ไธŠ่จ˜ใฎใ‚ˆใ†ใชใ‚ณใƒžใƒณใƒ‰ใŒๅ‡บๅŠ›ใ•ใ‚ŒใŸๅพŒใซใ€ใชใซใ‚‚่„†ๅผฑๆ€งๆƒ…ๅ ฑใŒๅ‡บใชใ‹ใฃใŸๅ ดๅˆใฏใ€ใ‚นใ‚ญใƒฃใƒณใง่„†ๅผฑๆ€งใŒ่ฆ‹ๅฝ“ใŸใ‚‰ใชใ‹ใฃใŸใจใ„ใ†ใ“ใจใซใชใ‚Šใพใ™ใ€‚ ใพใŸๅ˜ไธ€ใƒ•ใ‚กใ‚คใƒซ๏ผˆPipfile.lockใชใฉ๏ผ‰ใซๅฏพใ—ใฆใ‚‚ใ‚นใ‚ญใƒฃใƒณใ™ใ‚‹ใ“ใจใŒๅฏ่ƒฝใงใ™ใ€‚ $ trivy fs /path/to/project/Pipfile.lock INFO Vulnerability scanning is enabled INFO Secret scanning is enabled INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning INFO Please see also https://aquasecurity.github.io/trivy/v0.35/docs/secret/scanning/#recommendation for faster secret detection INFO Number of language-specific files: 1 INFO Detecting pipenv vulnerabilities... ใ“ใ“ใงไธ€ๆ™‚็š„ใซDjangoใฎใƒใƒผใ‚ธใƒงใƒณใ‚’4.0.5๏ผˆ่„†ๅผฑๆ€งใŒ็™บ่ฆ‹ใ•ใ‚Œใฆใ„ใ‚‹ใƒใƒผใ‚ธใƒงใƒณ๏ผ‰ใซ่ฝใจใ—ใฆใฟใฆใ€ๅ†ๅบฆใ‚นใ‚ญใƒฃใƒณใ‚’ใ—ใฆใฟใพใ™ใ€‚ $ pipenv install django==4.0.5 $ cat Pipfile [[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] django = "==4.0.5" [dev-packages] [requires] python_version = "3.8" $ trivy fs /path/to/project/Pipfile.lock INFO Vulnerability scanning is enabled INFO Secret scanning is enabled INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning INFO Please see also https://aquasecurity.github.io/trivy/v0.35/docs/secret/scanning/#recommendation for faster secret detection INFO Number of language-specific files: 1 INFO Detecting pipenv vulnerabilities... Pipfile.lock (pipenv) Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 2, CRITICAL: 1) โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Library โ”‚ Vulnerability โ”‚ Severity โ”‚ Installed Version โ”‚ Fixed Version โ”‚ Title โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ django โ”‚ CVE-2022-34265 โ”‚ CRITICAL โ”‚ 4.0.5 โ”‚ 3.2.14, 4.0.6 โ”‚ python-django: Potential SQL injection via Trunc(kind) and โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Extract(lookup_name) arguments โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2022-34265 โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ CVE-2022-36359 โ”‚ HIGH โ”‚ โ”‚ 3.2.15, 4.0.7 โ”‚ An issue was discovered in the HTTP FileResponse class in โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Django 3.2... โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2022-36359 โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ CVE-2022-41323 โ”‚ โ”‚ โ”‚ 3.2.16, 4.0.8, 4.1.2 โ”‚ python-django: Potential denial-of-service vulnerability in โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ internationalized URLs โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ https://avd.aquasec.com/nvd/cve-2022-41323 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ 4.0.5ใซใƒใƒผใ‚ธใƒงใƒณใ‚’ไธ‹ใ’ใฆใ‚นใ‚ญใƒฃใƒณใ—ใŸใจใ“ใ‚ใ€3ไปถใฎ่„†ๅผฑๆ€งใŒๆคœ็Ÿฅใ•ใ‚Œใพใ—ใŸใ€‚ 3ไปถใฎ่„†ๅผฑๆ€งใŒๆคœ็Ÿฅใ•ใ‚Œใ‚‹ใ“ใจใฎ็ขบ่ชใŒ็ต‚ใ‚ใ‚Šใพใ—ใŸใฎใงใ€ใƒใƒผใ‚ธใƒงใƒณใ‚’ๅ…ƒใซๆˆปใ—ใพใ™ใ€‚ $ pipenv install django==4.1.4 ็ต‚ใ‚ใ‚Šใซ Trivyใซใฏใ€ใƒฉใ‚คใ‚ปใƒณใ‚นใƒใ‚งใƒƒใ‚ฏใ‚„ใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆๆƒ…ๅ ฑใฎใƒใ‚งใƒƒใ‚ฏใ€ๅ‡บๅŠ›ๅฝขๅผใฎๆŒ‡ๅฎšใ€ใพใŸ่จ˜ไบ‹ใฎๆœ€ๅˆใฎๆ–นใง่งฆใ‚ŒใŸAWSใฎAMIใ‚„EBSใ‚นใƒŠใƒƒใƒ—ใ‚ทใƒงใƒƒใƒˆใฎใ‚นใ‚ญใƒฃใƒณใชใฉใ€ๆœฌ่จ˜ไบ‹ใง็ดนไป‹ใ—ใฆใ„ใชใ„้ƒจๅˆ†ใŒใพใ ใพใ ใ‚ใ‚Šใพใ™ใ€‚ ไปŠๅพŒใ‚‚ๅผ•ใ็ถšใ็ดนไป‹ใ—ใฆใ„ใ‘ใ‚Œใฐใจๆ€ใ„ใพใ™ใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering
ใ“ใฎ่จ˜ไบ‹ใฏใ€ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022  22ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚ ใ“ใ‚“ใซใกใฏ๏ผใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพใฎไธŠๅŽŸใงใ™ใ€‚ ๅ€‹ไบบ็š„ใซRustใจใ„ใ†่จ€่ชžใซใƒใƒžใฃใฆใŠใ‚Šใ€็คพๅ†…ใงใ‚‚Rustใ‚’ๅญฆใถๅ‹‰ๅผทไผšใ‚’ไธปๅ‚ฌใ—ใฆใ„ใพใ™ใ€‚ ใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐ่จ€่ชžใ‚’ๅญฆ็ฟ’ใ™ใ‚‹้š›ใซใฏใพใšใฏๆ›ธ็ฑใ‚’่ฒทใฃใฆๅ‹‰ๅผทใ•ใ‚Œใ‚‹ๆ–นใ‚‚ๅคšใ„ใจๆ€ใ†ใฎใงใ™ใŒใ€ใŠ้‡‘ใŒใ‹ใ‹ใฃใฆใ—ใพใ„ใพใ™ใ€‚ Rustใฏๅ…ฅ้–€่€…ๅ‘ใ‘ใฎWebไธŠใฎ่ณ‡ๆ–™ใŒๅ……ๅฎŸใ—ใฆใ„ใ‚‹ใŸใ‚ใ€ๆ›ธ็ฑใ‚’่ฒทใ‚ใšใจใ‚‚ๅญฆ็ฟ’ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ใ“ใ“ใงใฏ็„กๆ–™ใง่ฆ‹ใ‚‰ใ‚Œใ‚‹ๆ•™ๆใซใคใ„ใฆใ„ใใคใ‹ใ”็ดนไป‹ใ—ใพใ™ใ€‚ ๆ•™ๆ Tour of Rust Rustใงๅ‡บใฆใใ‚‹ๆฆ‚ๅฟตใฎ่ชฌๆ˜Žใจใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใŒไพ‹็คบใ•ใ‚Œใ€ๅฎŸ้š›ใซใ‚ณใƒผใƒ‰ใ‚’ๆ‰‹ๅ…ƒใงๅฎŸ่กŒใ™ใ‚‹ใ“ใจใŒใงใใ‚‹ๆ•™ๆใงใ™ใ€‚ ็งใฏใ„ใใชใ‚ŠThe Rust Programming Language(ๅพŒ่ฟฐ)ใ‹ใ‚‰ๅง‹ใ‚ใฆใ—ใพใฃใŸใฎใงใ™ใŒใ€ใพใšใฏใ“ใ“ใ‹ใ‚‰ๅง‹ใ‚ใ‚‹ๆ–นใŒ่‰ฏใ‹ใฃใŸใ‹ใชใใจๆ€ใ„ใพใ—ใŸใ€‚ ใƒญใƒผใ‚ซใƒซใซRustใฎ้–‹็™บ็’ฐๅขƒใ‚’ๆ•ดใˆใ‚‹ใ“ใจใชใใ€ใƒ–ใƒฉใ‚ฆใ‚ถไธ€ใคใ‚ใ‚Œใฐๆฐ—่ปฝใซๅญฆ็ฟ’ใ‚’้€ฒใ‚ใ‚‹ใ“ใจใŒใงใใ‚‹ใ“ใจใ‹ใ‚‰ใ€ใพใšใฏTour of Rustใ‹ใ‚‰ใ‚„ใ‚‹ใฎใŒใ„ใ„ใจๆ€ใ„ใพใ™ใ€‚ Tour of Rustใฎๅค‰ๆ•ฐใซใคใ„ใฆใฎใƒšใƒผใ‚ธใ€‚ๆฆ‚ๅฟตใฎ่ชฌๆ˜Žใจใ‚ณใƒผใƒ‰ไพ‹ใŒ็คบใ•ใ‚Œใ€ใ‚ณใƒผใƒ‰ใ‚’ๅฎŸ่กŒใ™ใ‚‹ใ“ใจใ‚‚ใงใใ‚‹ใ€‚ https://tourofrust.com/00_ja.html The Rust Programming Language ๅ…ฌๅผใ‹ใ‚‰ๅ‡บใฆใ„ใ‚‹Rustใฎๅ…ฅ้–€ๆ›ธใงใ€ใ‚ˆใTRPLใจๅ‘ผใฐใ‚Œใฆใ„ใพใ™ใ€‚ ๅ…ฅ้–€ๆ›ธใจ่จ€ใ‚ใ‚Œใฆใฏใ„ใพใ™ใŒใ‚ซใƒใƒผใ—ใฆใ„ใ‚‹็ฏ„ๅ›ฒใฏๅน…ๅบƒใใ€ใ“ใฎๆ•™ๆใ ใ‘ใงRustใฎใชใ‚“ใŸใ‚‹ใ‹ใฏ็†่งฃใงใใ‚‹ใ‹ใจๆ€ใ„ใพใ™ใ€‚ ใใฎๅˆ†ใ€ใ‚คใƒณใƒ—ใƒƒใƒˆใ™ใ‚‹้‡ใฏๅคšใ„ใฎใงใ™ใŒใ‚ณใƒžใƒณใƒ‰ใƒฉใ‚คใƒณใƒ„ใƒผใƒซใ‚„Webใ‚ตใƒผใƒใ‚’ไฝœใ‚‹ๅ›žใ‚‚ใ‚ใ‚‹ใฎใงใ€ๅฎŸ้š›ใซๆ‰‹ใ‚’ๅ‹•ใ‹ใ—ใชใŒใ‚‰ๅญฆใถใ“ใจใ‚‚ใงใใพใ™ใ€‚ ใพใŸใ€ใƒกใƒขใƒชใ‚„HTTPใชใฉใฎRustไปฅๅค–ใฎ่ฉฑใซใ‚‚่งฆใ‚Œใ‚‰ใ‚ŒใฆใŠใ‚Šใ€ๅ‚่€ƒใซใชใ‚Šใพใ™ใ€‚ ้›ฃ็‚นใจใ—ใฆใฏใ€ใจใฆใ‚‚ไธๅฏงใซๆ–‡็ซ ใŒๆ›ธใ‹ใ‚Œใฆใ„ใฆใ€็ตๅฑ€ไฝ•ใ‚’่จ€ใ„ใŸใ„ใฎใ‹ใ‚ใ‹ใ‚‰ใชใใชใฃใฆใ—ใพใ†ใ“ใจใŒใ‚ใฃใŸใ‚Šใ€ๆ—ฅๆœฌ่ชž่จณใŒใจใ“ใ‚ใฉใ“ใ‚ใŠใ‹ใ—ใชๅ ดๆ‰€ใ‚‚ใ‚ใฃใŸใ‚Šใ™ใ‚‹ใจใ“ใ‚ใงใ™ใ€‚ ใใ†ใ„ใ†ๆ™‚ใฏไป–ใฎใƒใƒƒใƒˆใฎ่จ˜ไบ‹ใ‚’่ชญใ‚“ใงใฟใŸใ‚Šใ€ๅŽŸๆ–‡ใฎ่‹ฑ่ชžใง่ชญใ‚€ใจ็†่งฃใŒ้€ฒใ‚€ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ ๅคงไฝ“11็ซ ใพใงใ‚„ใ‚ŒใฐRustใฎๅŸบๆœฌ็š„ใช้ƒจๅˆ†ใฏๆŠ‘ใˆใ‚‰ใ‚Œใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ ใกใชใฟใซ็คพๅ†…ๅ‹‰ๅผทไผšใงใ‚‚TRPLใ‚’ไฝฟใฃใฆใŠใ‚Šใ€ๅ…จใฆ็ต‚ใ‚ใ‚‹ใฎใซ1ๅนดใ‹ใ‹ใ‚‹ใใ‚‰ใ„ๆฟƒๅฏ†ใชๅ†…ๅฎนใจใชใฃใฆใ„ใพใ™ใ€‚ Ther Rust Programming Languageใฎใƒšใƒผใ‚ธใฎไธ€ไพ‹ใ€‚ๆ‡‡ๅˆ‡ไธๅฏงใซ่ชฌๆ˜Žใ—ใฆใใ‚Œใ‚‹ใ€‚ ใ‚ณใƒผใƒ‰ไพ‹ใซ็พใ‚Œใ‚‹ferrisใจใ„ใ†่Ÿนใฎใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใŒๅฏๆ„›ใ„ใ€‚ https://doc.rust-jp.rs/book-ja/ Rust By Example TRPLใจ็•ฐใชใ‚Šใ“ใกใ‚‰ใฏใ‚ณใƒผใƒ‰ไธญๅฟƒใฎๆ•™ๆใซใชใ‚Šใพใ™ใ€‚ไพ‹็คบใ•ใ‚ŒใŸใ‚ณใƒผใƒ‰ใ‚’้€šใ—ใฆRustใฎๅ„ๆฆ‚ๅฟตใ‚’ๅญฆใ‚“ใงใ„ใใพใ™ใ€‚ TRPLใงๅ‹‰ๅผทใ—ใŸ้ƒจๅˆ†ใ‚’็ฐกๅ˜ใซใŠใ•ใ‚‰ใ„ใ—ใŸใ„ใจใใซไฝฟใฃใฆใ„ใพใ™ใ€‚ Rust By Exampleใฎๆ‰€ๆœ‰ๆจฉใจใƒ ใƒผใƒ–ใซใคใ„ใฆ่ชฌๆ˜Žใ—ใฆใ„ใ‚‹ใƒšใƒผใ‚ธใ€‚ใ‚ณใƒผใƒ‰ไพ‹ใ‚’่ฆ‹ใฆๅญฆใถใ“ใจใŒใงใใ‚‹ใ€‚ https://doc.rust-jp.rs/rust-by-example-ja/ rustlings Rustใฎๆ–‡ๆณ•็ทด็ฟ’ๅ•้กŒ้›†ใงใ™ใ€‚ ใใฎใพใพใงใฏใ‚ณใƒณใƒ‘ใ‚คใƒซใงใใชใ„ใ‚ณใƒผใƒ‰ใŒๅนพใคใ‹็”จๆ„ใ•ใ‚ŒใฆใŠใ‚Šใ€ใ‚ณใƒณใƒ‘ใ‚คใƒซใงใใ‚‹ใ‚ˆใ†ใซใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใ‚’ไฟฎๆญฃใ—ใฆใ„ใไธญใงRustใฎ่ซธๆฆ‚ๅฟตใ‚’็ฟ’ๅพ—ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ใ“ใ‚Œใ ใ‘ใ ใจไป–ใฎ่จ€่ชžใฎๆ•™ๆใซใ‚‚ใ‚ใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใŒใ€rustlingsใจใ„ใ†ใ‚ณใƒžใƒณใƒ‰ใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใฆใ‚„ใ‚‹ใจ้€ฒๆ—็Šถๆณใ‚„ๆญฃ่งฃใ‹ใฉใ†ใ‹ใŒ ใง่กจ็คบใ•ใ‚Œใ‚‹ใฎใงใ‚ฒใƒผใƒ ๆ„Ÿ่ฆšใงๆฅฝใ—ใๅญฆใถใ“ใจใŒใงใใ‚‹ใฎใงใŠใ™ใ™ใ‚ใงใ™ใ€‚ TRPLใฎ็ซ ใ‚’็ต‚ใ‚ใ‚‰ใ›ใ‚‹ใ”ใจใซrustlingsใงๅŠ›่ฉฆใ—ใ™ใ‚‹ใจ็†่งฃใŒใ•ใ‚‰ใซๆทฑใพใ‚Šใพใ™ใ€‚ ๅง‹ใ‚ๆ–นใฏใ€rustlingsใจใ„ใ†ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใŒใงใใฆใ‚‚ใ„ใ„ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใงไปฅไธ‹ใฎใ‚ณใƒžใƒณใƒ‰ใ‚’ๅฎŸ่กŒใ—ใพใ™ใ€‚ $ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash ใ‚จใƒ‡ใ‚ฃใ‚ฟใงrust-analyzerใซใ‚ˆใ‚‹่ฃœๅฎŒใ‚’ๅŠนใ‹ใ›ใŸใ„ๆ–นใฏไปฅไธ‹ใฎใ‚ณใƒžใƒณใƒ‰ใ‚’ๅฎŸ่กŒใ—ใฆใŠใใพใ—ใ‚‡ใ†ใ€‚ $ cd rustlings $ rustlings lsp rustlings watchใงใ‚นใ‚ฟใƒผใƒˆใงใ™ $ cd rustlings $ rustlings watch rustlingsใ‚’ใ—ใฆใ„ใ‚‹ๆง˜ๅญใ€‚rustlings watchใ‚’ๅฉใ‘ใฐใ‚ใจใฏๆŒ‡็คบ้€šใ‚Š้€ฒใ‚ใฆใ„ใใ ใ‘ใ€‚ https://github.com/rust-lang/rustlings ใพใจใ‚ ็พๅœจใฏใƒใƒƒใƒˆใงใ‚‚ๅๅˆ†ใซๆƒ…ๅ ฑใ‚’้›†ใ‚ใ€็„กๆ–™ใงใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐ่จ€่ชžใ‚’ๅญฆในใ‚‹ๆ™‚ไปฃใซใชใ‚Šใพใ—ใŸใ€‚ 2023ๅนดใ‚’่ฟŽใˆใ‚‹ใซใ‚ใŸใ‚Šๆ–ฐใ—ใ„ใ“ใจใ‚’ๅง‹ใ‚ใ‚‹ใฎใซใ€Rustใฎๅญฆ็ฟ’ใ‚’ไธ€ใคๅ€™่ฃœใซๅ…ฅใ‚Œใฆใ„ใŸใ ใใ€ใ“ใฎ่จ˜ไบ‹ใ‚’ๅ‚่€ƒใซใ„ใŸใ ใ‘ใ‚Œใฐๅนธใ„ใงใ™ใ€‚ ๆ˜Žๆ—ฅใฏ @kinari321 ใ•ใ‚“ใงใ™๏ผๆฅฝใ—ใฟใงใ™ใญใ€‚ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event โ€“ NIFTY engineering
ใ“ใ‚“ใซใกใ‚ใ€‚11/22ใซใƒ‹ใƒ•ใƒ†ใ‚ฃๅˆใฎใ‚ชใƒณใƒฉใ‚คใƒณใ‚คใƒ™ใƒณใƒˆใ€ŒNIFTY Tech Day 2022ใ€ใ‚’้–‹ๅ‚ฌใ—ใพใ—ใŸใ€‚็š†ๆง˜ใ”่ฆงใ„ใŸใ ใ‘ใพใ—ใŸใงใ—ใ‚‡ใ†ใ‹๏ผŸ ไปŠๅ›žใฏใ€ๅฝ“ๆ—ฅใฎๅ†…ๅฎนใซใคใ„ใฆ็ดนไป‹ใ—ใพใ™ใ€‚ ๆฆ‚่ฆ ใ‚ตใƒผใƒ“ใ‚น้–‹ๅง‹ใ‹ใ‚‰35ๅนดใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฏๅธธใซๆŠ€่ก“่€…ใ‚„ITๆŠ€่ก“ใจๅ…ฑใซใ‚ใ‚Šใพใ—ใŸใ€‚ ้ซ˜ใ„ๅฅฝๅฅ‡ๅฟƒใงๆ–ฐใ—ใ„ๆŠ€่ก“ใƒˆใƒฌใƒณใƒ‰ใ‚’ใ„ใกๆ—ฉใๅฐŽๅ…ฅใ—ใ€ใ‚ทใ‚นใƒ†ใƒ ใ‚„ใ‚ตใƒผใƒ“ใ‚นใธใฎๆดป็”จใ‚’ๅธธใซๆจก็ดขใ—ใฆใ„ใพใ™ใ€‚ใƒ‹ใƒ•ใƒ†ใ‚ฃใŒๅ‰ตๆฅญๆ™‚ใ‹ใ‚‰ๅค‰ใ‚ใ‚‰ใชใ„ใฎใฏใ€ๅฅฝๅฅ‡ๅฟƒใจๆŒ‘ๆˆฆใ—็ถšใ‘ใ‚‹ใ“ใจใ€‚ ใ“ใฎโ€NIFTY Tech Dayโ€ใ‚’้€šใ˜ใฆใ€็งใŸใกใฎไปŠใจๆœชๆฅใ‚’ใŠไผใˆใ—ใพใ™ใ€‚ ๅ…ฌๅผใ‚ตใ‚คใƒˆ ไปŠๅ›žใฎใ‚ฟใ‚คใƒ ใƒ†ใƒผใƒ–ใƒซใจใ‚ปใƒƒใ‚ทใƒงใƒณ็ดนไป‹ใ‚’่ฆ‹ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ ใพใŸ่ฌŽ่งฃใใƒšใƒผใ‚ธใ‚‚ใ‚ใ‚‹ใฎใงใƒใƒฃใƒฌใƒณใ‚ธใ—ใฆใฟใฆใใ ใ•ใ„๏ผ โ†‘ใƒญใ‚ดใจใ‚ตใ‚คใƒˆใฏใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซใƒปSFใƒป่ฟ‘ๆœชๆฅๆ„Ÿใ‚’ใ‚คใƒกใƒผใ‚ธใ—ใฆ็คพๅ†…ใฎๅˆถไฝœใƒใƒผใƒ ใŒไฝœๆˆ ใ‚ปใƒƒใ‚ทใƒงใƒณ ๅ„ใ‚ปใƒƒใ‚ทใƒงใƒณใ”ใจใซ็ดนไป‹ๆ–‡ใจๅ‹•็”ปใ‚’่ผ‰ใ›ใฆใ„ใพใ™ใฎใง่ฆ‹้€ƒใ—ใŸๆ–นใ‚‚ใ†ไธ€ๅบฆ่ฆ‹ใŸใ„ๆ–นใฏใœใฒใƒใ‚งใƒƒใ‚ฏใ—ใฆใใ ใ•ใ„๏ผ ๆœ€่ฟ‘ใฎใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆๅ‹•ๅ‘ใจๆœชๆฅใฎใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใซใคใ„ใฆ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใƒ“ใ‚ธใƒใ‚นใƒ‘ใƒผใƒˆใƒŠใƒผ NTTใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใ‚บๆ ชๅผไผš็คพใฎๆฃฎไฟกๆง˜ ใ‚’ใŠๆ‹›ใใ—ใŸ็‰นๅˆฅใ‚ปใƒƒใ‚ทใƒงใƒณใงใ™ใ€‚ๆœ€่ฟ‘ใฎใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆๅ‹•ๅ‘ใ€ใใ—ใฆใพใฃใŸใๆ–ฐใ—ใ„ๆœชๆฅใฎๆŠ€่ก“ใพใงใ”็ดนไป‹ใ„ใŸใ ใใพใ—ใŸใ€‚ ใ‚นใ‚ฏใƒฉใƒ ใฎใƒใƒผใƒ‰ใƒซใฎ่ถŠใˆๆ–นใ€œใƒชใƒชใƒผใ‚นๆ•ฐใ‚’1.5ๅ€ใซใ™ใ‚‹ใพใงใ€œ ใƒ‡ใƒ–ใ‚ตใƒŸใ‚ฆใƒผใƒžใƒณ ็™ปๅฃ‡่€…ใซใ‚ˆใ‚‹ใ€Œใ‚นใ‚ฏใƒฉใƒ ใฎใƒใƒผใƒ‰ใƒซใฎ่ถŠใˆๆ–นใ€ใซใคใ„ใฆใฎใ‚ปใƒƒใ‚ทใƒงใƒณใงใ™ใ€‚ ็คพๅ†…8ใƒใƒผใƒ ใซๅฏพใ—ใ‚นใ‚ฏใƒฉใƒ ๅฐŽๅ…ฅใ‚’ๆ”ฏๆดใ—ใฆใใŸไธญใงใ‚ใ‹ใฃใŸใ“ใจใซใคใ„ใฆ็ดนไป‹ใ—ใพใ—ใŸใ€‚ ่ค‡ๆ•ฐใƒ—ใƒญใƒ€ใ‚ฏใƒˆใ‚’ๆŠฑใˆใฆ่กŒใ†ใ‚นใ‚ฏใƒฉใƒ ้–‹็™บใฎใ“ใ‚Œใพใงใจใ“ใ‚Œใ‹ใ‚‰ ๆŒใฃใฆใ„ใ‚‹ใƒ—ใƒญใƒ€ใ‚ฏใƒˆใŒ่ค‡ๆ•ฐใ‚ใฃใฆPOใ‚‚่ค‡ๆ•ฐๅฟ…่ฆใ€‚ใ‚นใ‚ฏใƒฉใƒ ้–‹็™บใฎใ‚ขใƒณใƒใƒ‘ใ‚ฟใƒผใƒณใฎใ‚ˆใ†ใซใ‚‚่ฆ‹ใˆใพใ™ใŒใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใง่งฃๆฑบใงใใพใ—ใŸใ€‚ ใใ‚Œใพใงใฎ้“ใฎใ‚Šใซใคใ„ใฆ็ดนไป‹ใ—ใพใ—ใŸใ€‚ ใ‚ฏใƒชใƒผใƒณใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใฏใ“ใฎ3ๅนด้–“ใง็งใŸใกใฎใƒใƒผใƒ ใซไฝ•ใ‚’ใ‚‚ใŸใ‚‰ใ—ใŸใฎใ‹ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚ชใƒ—ใ‚ทใƒงใƒณใ‚ตใƒผใƒ“ใ‚นใฎ่จญ่จˆ้–‹็™บใซใ‚ฏใƒชใƒผใƒณใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใ‚’ๅฐŽๅ…ฅใ—ใพใ—ใŸใ€‚็งใŸใกใ ใ‹ใ‚‰ใ“ใ่ชžใ‚Œใ‚‹ใ‚ฏใƒชใƒผใƒณใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใฎใ‚ใ‚Œใ“ใ‚Œใ‚’ๅฎŸไฝ“้จ“ใ‚’ไบคใˆใฆ็ดนไป‹ใ—ใพใ—ใŸใ€‚ ใชใœใƒ‹ใƒ•ใƒ†ใ‚ฃใฏLeSSใ‚’้ธใ‚“ใ ใฎใ‹ใ€‚ @nifty MAXๅ…‰ใซใŠใ‘ใ‚‹ๅคง่ฆๆจกใ‚นใ‚ฏใƒฉใƒ ้–‹็™บไฝ“้จ“่ซ‡ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎๆ–ฐ่ฆๆŽฅ็ถšใ‚ตใƒผใƒ“ใ‚น @nifty MAXๅ…‰ ใฏๅคง่ฆๆจกใ‚นใ‚ฏใƒฉใƒ LeSSใงไฝœใ‚‰ใ‚Œใพใ—ใŸใ€‚้–‹็™บใฎ่ฃๅดใซใคใ„ใฆใƒ‘ใƒใƒซใƒ‡ใ‚ฃใ‚นใ‚ซใƒƒใ‚ทใƒงใƒณๅฝขๅผใง่ชžใ‚Šใพใ—ใŸใ€‚ AWS/GCPใจSlackใ‚’้ง†ไฝฟใ—ใŸใ‚ชใƒ•ใ‚ฃใ‚นใฎๅ›บๅฎš้›ป่ฉฑๅปƒๆญขใธใฎๅ–ใ‚Š็ต„ใฟ ใ‚ชใƒ•ใ‚ฃใ‚นใฎๅ›บๅฎš้›ป่ฉฑใ‚’ๅปƒๆญขใ™ใ‚‹ใŸใ‚ใ€AWS/GCPใจSlackใ‚’้ง†ไฝฟใ—ใฆใ€ใ‚ตใƒผใƒใƒฌใ‚นใช่‡ชๅ‹•้›ป่ฉฑ้Ÿณๅฃฐๅฟœ็ญ”ใ‚ทใ‚นใƒ†ใƒ ใ‚’้–‹็™บใ—ใŸ่ฉฑใ‚’่‹ฅๆ‰‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใŒใ‚ซใ‚ธใƒฅใ‚ขใƒซใซ็ดนไป‹ใ—ใพใ—ใŸใ€‚ ใ‚ชใƒณใƒฉใ‚คใƒณไผš่ญฐใ‚’็››ใ‚ŠไธŠใ’ใ‚‹๏ผ้Ÿณๅฃฐใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใƒ„ใƒผใƒซใ€Œใ‚‚ใ˜ใ“ใˆใ€ใฎ้–‹็™บ ใƒ‹ใƒ•ใƒ†ใ‚ฃใซใฏๆŠ€่ก“ใ‚’ๅญฆในใ‚‹็’ฐๅขƒใ€ไพฟๅˆฉใƒ„ใƒผใƒซใ‚’ไฝœใฃใฆใฟใ‚‹ใจใ„ใ†ๆ–‡ๅŒ–ใŒใ‚ใ‚Šใพใ™ใ€‚ ไฝœๆˆใ—ใŸใ‚ชใƒณใƒฉใ‚คใƒณไผš่ญฐใฎใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณไธ่ถณใ‚’่งฃๆฑบใ™ใ‚‹ใƒ„ใƒผใƒซใ‚’ไพ‹ใซใƒ„ใƒผใƒซใ‚’ไฝœใ‚‹ใจใใฎ่€ƒใˆๆ–นใ‚„ๆง‹ๆˆใซใคใ„ใฆ็ดนไป‹ใ—ใพใ—ใŸใ€‚ ๅฎ‰ๅฟƒใƒปๅฎ‰ๅ…จใช@niftyใƒกใƒผใƒซใ‚ตใƒผใƒ“ใ‚นใฎ่ฃๅด ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏ @nifty ใƒกใƒผใƒซใ‚ตใƒผใƒ“ใ‚น ใ‚’ๆไพ›ใ—ใฆใ„ใพใ™ใ€‚ ๆœฌใ‚ปใƒƒใ‚ทใƒงใƒณใงใฏใ€ใŠๅฎขๆง˜ใซๅฎ‰ๅฟƒใ—ใฆใ‚ตใƒผใƒ“ใ‚นใ‚’ใ”ๅˆฉ็”จใ„ใŸใ ใใŸใ‚ใฎๅ–ใ‚Š็ต„ใฟใซใคใ„ใฆ็ดนไป‹ใ—ใพใ—ใŸใ€‚ ใ‚ปใ‚ทใƒผใƒซไบ‹ๆฅญใซใŠใ‘ใ‚‹ใƒขใƒŽใƒชใ‚ทใƒƒใ‚ฏใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใจใฎๅ‘ใๅˆใ„ๆ–น ใ€Œใƒ“ใ‚ธใƒใ‚นใ‚’ๅŠ ้€Ÿใ•ใ›ใŸใ„ใ€ ใใฎๆ€ใ„ใ‚’ๅฎŸ็พใ™ใ‚‹ใŸใ‚ใซใฏใ€ใ•ใพใ–ใพใช่ชฒ้กŒใŒใ‚ใ‚Šใพใ™ใ€‚ ๆœฌใ‚ปใƒƒใ‚ทใƒงใƒณใงใฏใ€ใใฎใ‚ˆใ†ใช่ชฒ้กŒใซๅฏพใ—ใฆใ€ใ‚ปใ‚ทใƒผใƒซใŒใฉใ†ๅ‘ใๅˆใฃใฆใ„ใฃใŸใ‹ใ‚’็ดนไป‹ใ—ใพใ—ใŸใ€‚ CI/CDใ‚’ๅฐŽๅ…ฅใ—ใฆๅค‰ใ‚ใฃใŸใƒขใƒใ‚คใƒซใ‚ขใƒ—ใƒช้–‹็™บไฝ“ๅˆถ ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚ฐใƒซใƒผใƒ—ไผš็คพใงใ‚ใ‚‹ใƒ‹ใƒ•ใƒ†ใ‚ฃใƒฉใ‚คใƒ•ใ‚นใ‚ฟใ‚คใƒซๆ ชๅผไผš็คพใฎใ‚ปใƒƒใ‚ทใƒงใƒณใงใ™ใ€‚ CI/CDใƒ„ใƒผใƒซใฎๅฐŽๅ…ฅใซใ‚ˆใ‚‹ใ€Œใƒขใƒใ‚คใƒซใ‚ขใƒ—ใƒช้–‹็™บใฎๅŠน็އๅŒ–ใ€ใซใคใ„ใฆ็ดนไป‹ใ—ใพใ—ใŸใ€‚ ๆทฑๅฑค่‡ช็„ถ่จ€่ชžๅ‡ฆ็†ใซใ‚ˆใ‚‹ใƒ‹ใƒฅใƒผใ‚น่จ˜ไบ‹่ฆ็ด„ใฎๆ‰‹ๆณ•ใจๅฎŸ่ฃ… ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚นใƒšใ‚ทใƒฃใƒชใ‚นใƒˆๅˆถๅบฆใงใ‚ใ‚‹ N1! ใฎๆฉŸๆขฐๅญฆ็ฟ’ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใŒ่‡ช็„ถ่จ€่ชžๅ‡ฆ็†ใซใคใ„ใฆ่งฃ่ชฌใ€‚ ๆœฌใ‚ปใƒƒใ‚ทใƒงใƒณใงใฏใƒ‹ใƒ•ใƒ†ใ‚ฃใƒ‹ใƒฅใƒผใ‚นใซใŠใ‘ใ‚‹่จ˜ไบ‹่ฆ็ด„ใ‚„ๆง‹็ฏ‰ใ—ใŸๆทฑๅฑค่‡ช็„ถ่จ€่ชžๅ‡ฆ็†ใƒขใƒ‡ใƒซใ€AWSใ‚’็”จใ„ใŸๅฎŸ้š›ใฎใ‚ตใƒผใƒ“ใ‚นๅฎŸ่ฃ…ใซใคใ„ใฆ็ดนไป‹ใ—ใพใ—ใŸใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅพนๅบ•ๅˆ†ๆž ไผ‘ๆ†ฉไธญใซๆตใ—ใฆใ„ใŸใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฎใ‚ขใƒณใ‚ฑใƒผใƒˆ็ตๆžœใ‚’ๅฐ‘ใ—ใ ใ‘ใŠ่ฆ‹ใ›ใ—ใพใ™ใ€‚ ้–‹็™บใƒป้‹็”จใฉใกใ‚‰ใ‚‚ๆ‹…ๅฝ“ใ—ใฆใ„ใ‚‹ไบบใŒๅคšใ„ใ‚“ใงใ™๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ‚ตใƒผใƒ“ใ‚นใซใ‚ˆใฃใฆๆง˜ใ€…ใชใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐ่จ€่ชžใŒไฝฟ็”จใ•ใ‚Œใฆใ„ใพใ™ใ€‚ ๆœ€่ฟ‘ใงใฏ็คพๅ†…ใงRustใฎๅ‹‰ๅผทไผšใ‚‚่กŒใ‚ใ‚Œใฆใ„ใพใ—ใŸ๏ผ ใปใจใ‚“ใฉใฎใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฏๆ–ฐใ—ใ„ๆŠ€่ก“ใซใ€Œ ้–ขๅฟƒใŒใ‚ใ‚Š ใ€ใจๅ›ž็ญ”ใ—ใพใ—ใŸใ€‚ ๅฐŽๅ…ฅใ—ใŸ็ตๆžœใ‚’็ดนไป‹ใ—ใฆใ„ใ‚‹ใ‚ปใƒƒใ‚ทใƒงใƒณใ‚‚ใ‚ใ‚Šใพใ™ใฎใงใœใฒใƒใ‚งใƒƒใ‚ฏใ—ใฆใฟใฆใใ ใ•ใ„๏ผ ๆง˜ใ€…ใช็‰นๅพดใŒๅ‡บใพใ—ใŸใ€‚ไป•ไบ‹ใซๅฏพใ™ใ‚‹ๅงฟๅ‹ขใ‚’่กจใ—ใŸใƒฏใƒผใƒ‰ใŒ็›ฎ็ซ‹ใกใพใ™ใญใ€‚ ใ“ใ‚“ใชใ‚ขใƒณใ‚ฑใƒผใƒˆใ‚‚ใ‚ใ‚Šใพใ—ใŸ๏ผ ๏ผˆใกใชใฟใซ็งใฏใใฎใ“ๆดพใงใ™ใ€‚๏ผ‰ ๆŠ€่ก“่€…ไบคๆตไผš ๆŠ€่ก“่€…ไบคๆตไผšใจใฏใ€ŒๆŠ€่ก“่€…ๅŒๅฃซใงๅ–‹ใ‚‹ใ€ใ“ใจใ‚’็›ฎ็š„ใจใ—ใŸๆ‡‡่ฆชไผšใงใ™ใ€‚ ็คพๅ†…ใฎใ‚จใƒณใ‚ธใƒ‹ใ‚ขใจTech Day 2022ใซใ”ๅ‚ๅŠ ใ„ใŸใ ใ„ใŸๆ–นใจใ‚ชใƒณใƒฉใ‚คใƒณใงๆŠ€่ก“่€…ไบคๆตไผšใ‚’ๅฎŸๆ–ฝใ—ใพใ—ใŸใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ๆŠ€่ก“่€…ใจใฎไบคๆตใ‚’ๆŽจ้€ฒใ—ใฆใŠใ‚Šใ€ใใฎๆดปๅ‹•ใฎไธ€็’ฐใจใ—ใฆ้–‹ๅ‚ฌใŒๆฑบๅฎšใ—ใพใ—ใŸใ€‚ Tech Day 2022ใฎ็™ปๅฃ‡่€…ใฎAsk the SpeakerใŒ่กŒใ‚ใ‚ŒใŸใ‚Šใ€ๆŠ€่ก“ใซ้–ข้€ฃใ™ใ‚‹่ฉฑใง็››ใ‚ŠไธŠใŒใฃใŸใ‚Šใจๅ‚ๅŠ ใ•ใ‚ŒใŸๆ–นใ‹ใ‚‰ใฏๅฅฝ่ฉ•ใงใ—ใŸใ€‚ โ†‘Remoใงไฝœๆˆใ—ใŸไผšๅ ดใฎๆง˜ๅญ ใพใจใ‚ NIFTY Tech Day 2022 ใงใฏใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚ตใƒผใƒ“ใ‚นใƒปๆŠ€่ก“ใ‚’็ดนไป‹ใ—ใฆใใพใ—ใŸใ€‚ ้…ไฟกใ‚’้€šใ—ใฆๅฐ‘ใ—ใงใ‚‚ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎ้ญ…ๅŠ›ใ‚’็Ÿฅใฃใฆใ‚‚ใ‚‰ใˆใพใ™ใจๅนธใ„ใงใ™ใ€‚ ใพใŸใ‚ฏใƒญใƒผใ‚ธใƒณใ‚ฐใง่ฉฑใŒใ‚ใ‚Šใพใ—ใŸใŒใ€ๆฅๅนด็ง‹ใซ NIFTY Tech Day 2023 ใ‚’้–‹ๅ‚ฌใ„ใŸใ—ใพใ™ใ€‚ ใใกใ‚‰ใ‚‚ใœใฒใ”ๆœŸๅพ…ใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ—ใงใฏไธ€็ท’ใซๅƒใไปฒ้–“ใ‚’ๅ‹Ÿ้›†ไธญใงใ™ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพ ๆ–ฐๅ’ๆŽก็”จใ€ใ‚ญใƒฃใƒชใ‚ขๆŽก็”จใ‚’ๅฎŸๆ–ฝใ—ใฆใ„ใพใ™ใ€‚ใœใฒ ใƒชใ‚ฏใƒซใƒผใƒˆใ‚ตใ‚คใƒˆ ใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใŒๆฅญๅ‹™ใงๅญฆใ‚“ใ ใ“ใจใ‚„ใ‚คใƒ™ใƒณใƒˆๆƒ…ๅ ฑใ‚’ ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใƒ–ใƒญใ‚ฐ ใซใฆ็™บไฟกใ—ใฆใ„ใพใ™๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃใƒฉใ‚คใƒ•ใ‚นใ‚ฟใ‚คใƒซๆ ชๅผไผš็คพ ๆƒณๅƒไปฅไธŠใ‚’ใ€ใฟใคใ‘ใ‚ˆใ†ใ€‚ ใ‚’ใ‚ณใƒผใƒใƒฌใƒผใƒˆใƒกใƒƒใ‚ปใƒผใ‚ธใซใ€โ€œไธ€ไบบใฒใจใ‚Šโ€ใฎใƒฉใ‚คใƒ•ใ‚นใ‚ฟใ‚คใƒซใ‚’ไพฟๅˆฉใง่ฑŠใ‹ใซใ™ใ‚‹ใŸใ‚ใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใƒฉใ‚คใƒ•ใ‚นใ‚ฟใ‚คใƒซใฎใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฏๆ—ฅใ€…้–‹็™บใ‚’ใ—ใฆใ„ใพใ™ใ€‚ ๆŽก็”จๆƒ…ๅ ฑ ใ‚„ ใƒ‹ใƒ•ใƒ†ใ‚ฃใƒฉใ‚คใƒ•ใ‚นใ‚ฟใ‚คใƒซ Tech Blog ใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚ ๆ ชๅผไผš็คพใ‚ปใ‚ทใƒผใƒซ ใ‚ปใ‚ทใƒผใƒซใงใฏใ€ŒECใ‚ทใ‚นใƒ†ใƒ ใฎๆ–ฐ่ฆ้–‹็™บใ€ใ€ŒๅŸบๅนนใ‚ทใ‚นใƒ†ใƒ ้–‹็™บใƒป้‹็”จใ€ใ€Œใ‚คใƒณใƒ•ใƒฉ่จญ่จˆๆง‹็ฏ‰๏ฝž้‹็”จใ€ใซใคใ„ใฆใ‚ญใƒฃใƒชใ‚ขๆŽก็”จใ‚’่กŒใฃใฆใ„ใพใ™ใ€‚ ่ฉณใ—ใใฏ ใ‚ญใƒฃใƒชใ‚ขๆŽก็”จๅ‹Ÿ้›†่ฆ้ … ใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฎTwitterใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ไฝœใ‚Šใพใ—ใŸ NIFTY Tech Talkใฎใ“ใจใ‚„ใ€ใƒ‹ใƒ•ใƒ†ใ‚ฃใฎใ‚จใƒณใ‚ธใƒ‹ใ‚ขใฎๆดปๅ‹•ใ‚’็™บไฟกใ—ใฆใ„ใใพใ™ใ€‚ https://twitter.com/NIFTYDevelopers
ใ“ใฎ่จ˜ไบ‹ใฏใ€ ใƒ‹ใƒ•ใƒ†ใ‚ฃใ‚ฐใƒซใƒผใƒ— Advent Calendar 2022 18ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚ ใฏใ˜ใ‚ใซ ๅŸบๅนนใ‚ทใ‚นใƒ†ใƒ ใ‚ฐใƒซใƒผใƒ— ใ‚ตใƒผใƒ“ใ‚นใ‚คใƒณใƒ•ใƒฉใƒใƒผใƒ ใฎๅ—ๅทใงใ™ใ€‚ ๆ™ฎๆฎตใฏใƒฆใƒผใ‚ถใƒผใ‚ตใ‚คใƒณใ‚ขใƒƒใƒ—ใ‚„ใ‚ทใƒณใ‚ฐใƒซใ‚ตใ‚คใƒณใ‚ชใƒณใ€้กงๅฎข็ฎก็†ใ‚ทใ‚นใƒ†ใƒ ็ญ‰ใฎ้–‹็™บใ‚„้‹็”จใ‚’ๆ‹…ๅฝ“ใ—ใฆใ„ใพใ™ใ€‚ ไปŠๅ›žใฏใ€ Amazon CloudWatch Logs ใซๅ‡บๅŠ›ใ™ใ‚‹ใƒญใ‚ฐใฎๅฝขๅผใซใคใ„ใฆ่ชฌๆ˜Žใ—ใพใ™ใ€‚ Amazon CloudWatch Logs Amazon CloudWatch Logs ใฏใ€ AWS ใƒชใ‚ฝใƒผใ‚นใ‚„ AWS ไธŠใงๅฎŸ่กŒใ™ใ‚‹ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‹ใ‚‰ใฎใƒญใ‚ฐใƒ•ใ‚กใ‚คใƒซใ‚’ใƒขใƒ‹ใ‚ฟใƒชใƒณใ‚ฐใ€ไฟๅญ˜ใ€ใ‚ขใ‚ฏใ‚ปใ‚นใงใใ‚‹ใ‚ตใƒผใƒ“ใ‚นใงใ™ใ€‚ CloudWatch Logs ใซๅ‡บๅŠ›ใ™ใ‚‹ใƒญใ‚ฐๅฝขๅผ ็ต่ซ–ใ‹ใ‚‰่จ€ใ†ใจ JSON ๅฝขๅผ ใซใ—ใฆใŠใใจใ€ๆคœ็ดขใ‚„ๅˆ†ๆžใ™ใ‚‹้š›ใซๆฅฝใงใ™ใ€‚ ไปŠๅ›žใฏใƒใƒฃใƒƒใƒˆใƒ„ใƒผใƒซใฎใƒญใ‚ฐใ‚’ไพ‹ใจใ—ใฆใ€ใƒญใ‚ฐใŒ JSON ๅฝขๅผใงใชใ„ๅ ดๅˆใจ JSON ๅฝขๅผใงใ‚ใ‚‹ๅ ดๅˆใงใฉใฎใ‚ˆใ†ใช้•ใ„ใŒใ‚ใ‚‹ใ‹ใ‚’ๅ–ใ‚ŠไธŠใ’ใพใ™ใ€‚ ไพ‹๏ผšใƒใƒฃใƒƒใƒˆใƒ„ใƒผใƒซใฎใƒญใ‚ฐ (JSON ๅฝขๅผใงใชใ„ๅ ดๅˆ) ใพใšใ€ใƒญใ‚ฐใจใ—ใฆๅ‡บๅŠ›ใ•ใ‚Œใ‚‹ใƒ‡ใƒผใ‚ฟใฏไปฅไธ‹ใฎใ‚ˆใ†ใซใชใฃใฆใ„ใพใ™ใ€‚ ๅ…ˆ้ ญใซใƒญใ‚ฐใฎใƒฌใƒ™ใƒซใ€ใใฎๅพŒใ‚ใซใƒญใ‚ฐใฎใƒกใƒƒใ‚ปใƒผใ‚ธใŒ่จ˜่ผ‰ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ [INFO] Taro posted "hoge" from 1.2.3.4 [INFO] Jiro posted "fuga" from 5.6.7.8 [INFO] Taro posted "piyo" from 1.2.3.4 [INFO] Jiro posted "hello" from 9.10.11.12 [ERROR] Saburo couldn't post from 1.1.1.1 ๆŠ•็จฟๆˆๅŠŸๆ™‚ (1-4่กŒ็›ฎ) INFO ใƒฌใƒ™ใƒซใงใ€Œ<ใƒฆใƒผใ‚ถใƒผๅ> posted โ€œ<ๆœฌๆ–‡>โ€ from <IPใ‚ขใƒ‰ใƒฌใ‚น>ใ€ ใ‚จใƒฉใƒผ็™บ็”Ÿๆ™‚ (5่กŒ็›ฎ) ERROR ใƒฌใƒ™ใƒซใงใ€Œ<ใƒฆใƒผใ‚ถใƒผๅ> <ใ‚จใƒฉใƒผใƒกใƒƒใ‚ปใƒผใ‚ธ> from <IPใ‚ขใƒ‰ใƒฌใ‚น>ใ€ CloudWatch Logs ใซใ“ใ‚Œใ‚‰ใฎใƒญใ‚ฐใ‚’ๅ‡บๅŠ›ใ™ใ‚‹ใจไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ CloudWatch Logs ใซๅ‡บๅŠ›ใ•ใ‚ŒใŸใ“ใ‚Œใ‚‰ใฎใƒญใ‚ฐใฏใ€ CloudWatch Logs Insights ใ‚’็”จใ„ใฆๆคœ็ดขใƒปๅˆ†ๆžใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ CloudWatch Logs Insights ใงใƒญใ‚ฐใ‚’ๆคœ็ดขใ€ๅˆ†ๆžใ™ใ‚‹ CloudWatch Logs Insights ใงใฏใ€ใ‚ฏใ‚จใƒชใ‚’ไฝฟใฃใฆใƒญใ‚ฐใƒ‡ใƒผใ‚ฟใ‚’ๆคœ็ดขใƒปๅˆ†ๆžใƒปใƒ‡ใƒผใ‚ฟใฎๆŠฝๅ‡บใŒใงใใพใ™ใ€‚ ใใ‚Œใงใฏใ€ๅ…ˆใปใฉใฎ CloudWatch Logs ใซๅ‡บๅŠ›ใ—ใŸใƒญใ‚ฐใซๅฏพใ—ใฆใ€ CloudWatch Logs Insights ใงใƒ‡ใƒผใ‚ฟใ‚’ๆŠฝๅ‡บใ—ใฆใฟใพใ™ใ€‚ ไพ‹๏ผšใƒญใ‚ฐใ‚คใƒ™ใƒณใƒˆใ‚’ๅ–ๅพ—ใ™ใ‚‹ ใพใšใฏใ€็ฐกๅ˜ใชไพ‹ใจใ—ใฆๆœ€ๆ–ฐ20ไปถใฎใƒญใ‚ฐใ‚คใƒ™ใƒณใƒˆใฎใ‚ฟใ‚คใƒ ใ‚นใ‚ฟใƒณใƒ—ใจใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๆ–ฐใ—ใ„้ †ใงๅ–ๅพ—ใ™ใ‚‹ใ‚ฏใ‚จใƒชใ‚’ๅฎŸ่กŒใ—ใพใ™ใ€‚ใ‚ฏใ‚จใƒชใจใใฎๅฎŸ่กŒ็ตๆžœใฏไปฅไธ‹ใฎ้€šใ‚Šใงใ™ใ€‚ fields @timestamp, @message | sort @timestamp desc | limit 20 ไธ‹้ƒจใฎๅฎŸ่กŒ็ตๆžœใซใฏCloudWatch Logsใซๅ‡บๅŠ›ใ•ใ‚ŒใŸใƒญใ‚ฐใฎใ‚ฟใ‚คใƒ ใ‚นใ‚ฟใƒณใƒ—ใจใƒกใƒƒใ‚ปใƒผใ‚ธใŒ่กจ็คบใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใ‚ฏใ‚จใƒชใฏ่ค‡ๆ•ฐใฎใ‚ณใƒžใƒณใƒ‰ใงๆง‹ๆˆใ•ใ‚ŒใฆใŠใ‚Šใ€ใใ‚Œใžใ‚Œใฎใ‚ณใƒžใƒณใƒ‰ใŒใƒ‘ใ‚คใƒ—ๆ–‡ๅญ— ( | ) ใงๅŒบๅˆ‡ใ‚‰ใ‚Œใฆใ„ใพใ™ใ€‚ใ‚ฏใ‚จใƒชๅ†…ใงไฝฟใˆใ‚‹ใ‚ณใƒžใƒณใƒ‰ใซใคใ„ใฆใฏใ€ CloudWatch Logs Insights ใฎใ‚ฏใ‚จใƒชๆง‹ๆ–‡ ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚ไปŠๅ›žใฏใ“ใฎใ‚ฏใ‚จใƒชใงไฝฟใ‚ใ‚Œใฆใ„ใ‚‹ใ‚ณใƒžใƒณใƒ‰ใซใคใ„ใฆ็ฐกๅ˜ใซ่ชฌๆ˜Žใ—ใพใ™ใ€‚ fields @timestamp, @message 1่กŒ็›ฎใฎ fields ใ‚ณใƒžใƒณใƒ‰ใฏใ€ใ‚ฏใ‚จใƒช็ตๆžœใฎ็‰นๅฎšใฎใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚’่กจ็คบใ™ใ‚‹ใ‚ณใƒžใƒณใƒ‰ใงใ™ใ€‚ไพ‹ใฎใ‚ฏใ‚จใƒชใงใฏ @timestamp ใจ @message ใฎๅ€คใ‚’ใ‚ฏใ‚จใƒช็ตๆžœใซ่กจ็คบใ™ใ‚‹ใ‚ˆใ†ใซใ—ใฆใ„ใพใ™ใ€‚ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใงๆŒ‡ๅฎšใงใใ‚‹ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใฏ ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใ‚‹ใƒญใ‚ฐใจๆคœๅ‡บใ•ใ‚Œใ‚‹ใƒ•ใ‚ฃใƒผใƒซใƒ‰ ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚ sort @timestamp desc 2่กŒ็›ฎใฎ sort ใ‚ณใƒžใƒณใƒ‰ใฏใ€็‰นๅฎšใฎใƒ•ใ‚ฃใƒผใƒซใƒ‰ใซใคใ„ใฆใ‚ฝใƒผใƒˆใ™ใ‚‹ใ‚ณใƒžใƒณใƒ‰ใงใ™ใ€‚ไพ‹ใฎใ‚ฏใ‚จใƒชใงใฏ @timestamp ใซใคใ„ใฆ้™้ † (desc) ใ‚ฝใƒผใƒˆใ—ใฆใ„ใพใ™ใ€‚ limit 20 3่กŒ็›ฎใฎ limit ใ‚ณใƒžใƒณใƒ‰ใฏใ€ใ‚ฏใ‚จใƒชใง่ฟ”ใ™ใƒญใ‚ฐใ‚คใƒ™ใƒณใƒˆใฎไธŠ้™ๆ•ฐใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ‚ณใƒžใƒณใƒ‰ใงใ™ใ€‚ไพ‹ใฎใ‚ฏใ‚จใƒชใงใฏๆคœ็ดข็ตๆžœ (ใƒญใ‚ฐใ‚คใƒ™ใƒณใƒˆใฎๆ•ฐ) ใ‚’20ไปถใพใง่ฟ”ใ™ใ‚ˆใ†ใซๆŒ‡ๅฎšใ—ใฆใ„ใพใ™ใ€‚ ไพ‹๏ผšๆŠ•็จฟใซๆˆๅŠŸใ—ใŸใƒญใ‚ฐใ‚คใƒ™ใƒณใƒˆใฎๆŠ•็จฟ่€…ๅใจใƒกใƒƒใ‚ปใƒผใ‚ธใจIPใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ–ๅพ—ใ™ใ‚‹ ๆฌกใซใ€ๆŠ•็จฟใซๆˆๅŠŸใ—ใŸใ‚คใƒ™ใƒณใƒˆใ‚’ๆŠฝๅ‡บใ—ใ€ใใฎใ‚คใƒ™ใƒณใƒˆใฎๆŠ•็จฟ่€…ๅใจใƒกใƒƒใ‚ปใƒผใ‚ธใจIPใ‚ขใƒ‰ใƒฌใ‚นใ‚’่กจ็คบใ™ใ‚‹ใ‚ฏใ‚จใƒชใ‚’ๅฎŸ่กŒใ—ใพใ™ใ€‚ใ‚ฏใ‚จใƒชใจใใฎๅฎŸ่กŒ็ตๆžœใฏไปฅไธ‹ใฎ้€šใ‚Šใงใ™ใ€‚ ๆŠ•็จฟ่€…ๅใ€ใƒกใƒƒใ‚ปใƒผใ‚ธใ€IPใ‚ขใƒ‰ใƒฌใ‚นใฏใใ‚Œใžใ‚Œ userName, body, ipAddress ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใซๆ ผ็ดใ•ใ‚Œใฆใ„ใพใ™ใ€‚ fields @message | parse @message "[*] *" as loggingType, loggingMessage | filter loggingType = "INFO" | filter loggingMessage like /\w+ posted ".*" from \d+\.\d+\.\d+\.\d+/ | parse loggingMessage "* posted \"*\" from *" as userName, body, ipAddress | display @message, loggingType, loggingMessage, userName, body, ipAddress parse @message "[*] *" as loggingType, loggingMessage parse loggingMessage "* posted \"*\" from *" as userName, body, ipAddress 2,5่กŒ็›ฎใฎ parse ใ‚ณใƒžใƒณใƒ‰ใฏใ€ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใฎๅ€คใ‹ใ‚‰ใงใƒ‡ใƒผใ‚ฟใ‚’ๆŠฝๅ‡บใ—ใ€ใ‚ฏใ‚จใƒช (ๅพŒ็ถšใฎใ‚ณใƒžใƒณใƒ‰) ใงไฝฟใˆใ‚‹ไธ€ๆ™‚็š„ใชใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚’ไฝœๆˆใ™ใ‚‹ใ‚ณใƒžใƒณใƒ‰ใงใ™ใ€‚ไพ‹ใฎ2่กŒ็›ฎใฎใ‚ฏใ‚จใƒชใงใฏใ€ @message ใซใŠใ„ใฆ "[*] *" ใฎๅ„ * ใซ่ฉฒๅฝ“ใ™ใ‚‹ๅ€คใŒ as ใฎๅพŒใ‚ใฎๅ„ใƒ•ใ‚ฃใƒผใƒซใƒ‰ (1ใค็›ฎใฎ * ใฎ็ฎ‡ๆ‰€ใฏ loggingType ใ€2ใค็›ฎใฎ * ใฎ็ฎ‡ๆ‰€ใฏ loggingMessage) ใซๆ ผ็ดใ•ใ‚Œใพใ™ใ€‚ไพ‹ใˆใฐใ€ @message ใŒ ใ€Œ [INFO] Taro posted "hoge" from 1.2.3.4 ใ€ ใฎๅ ดๅˆใ€ loggingType ใฏ ใ€Œ INFO ใ€ ใ€ loggingMessage ใฏ ใ€Œ Taro posted "hoge" from 1.2.3.4 ใ€ ใจใชใ‚Šใพใ™ใ€‚ filter loggingType = "INFO" filter loggingMessage like /\w+ posted ".*" from \d+\.\d+\.\d+\.\d+/ 3,4่กŒ็›ฎใฎ filter ใ‚ณใƒžใƒณใƒ‰ใฏใ€1ใคไปฅไธŠใฎๆกไปถใ‚’ๆบ€ใŸใ™ใ‚คใƒ™ใƒณใƒˆใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ‚ณใƒžใƒณใƒ‰ใงใ™ใ€‚ไพ‹ใฎใ‚ฏใ‚จใƒชใงใฏใ€ loggingType ใฎๅ€คใŒ โ€œINFOโ€ ใงใ‚ใ‚‹ใ‚คใƒ™ใƒณใƒˆ๏ผˆ3่กŒ็›ฎ๏ผ‰ใจใ€ loggingMessage ใฎๅ€คใŒ ใ€Œ \w+ posted ".*" from \d+\.\d+\.\d+\.\d+ ใ€ ใจใ„ใ†ใƒ‘ใ‚ฟใƒผใƒณใฎๆญฃ่ฆ่กจ็พใซใƒžใƒƒใƒใ—ใฆใ„ใ‚‹ใ‚คใƒ™ใƒณใƒˆ๏ผˆ4่กŒ็›ฎ๏ผ‰ใ‚’ๅ–ๅพ—ใ—ใฆใ„ใพใ™๏ผˆ4่กŒ็›ฎใฎ filter ใ‚ณใƒžใƒณใƒ‰ใŒ็„กใใฆใ‚‚ๆŠ•็จฟๆˆๅŠŸใ‚คใƒ™ใƒณใƒˆใ‚’ๆŠฝๅ‡บใงใใชใใฏใชใ„ใงใ™ใŒใ€ๆญฃ่ฆ่กจ็พใงใ‚‚ๅˆคๅฎšใงใใ‚‹ไพ‹ใจใ—ใฆ่ฟฝๅŠ ใ—ใฆใ„ใพใ™๏ผ‰ใ€‚ display @message, loggingType, loggingMessage, userName, body, ipAddress 5่กŒ็›ฎใฎ display ใ‚ณใƒžใƒณใƒ‰ใฏใ€ใ‚ฏใ‚จใƒช็ตๆžœใฎ็‰นๅฎšใฎใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚’่กจ็คบใ™ใ‚‹ใ‚ณใƒžใƒณใƒ‰ใงใ™ใ€‚ไพ‹ใฎใ‚ฏใ‚จใƒชใงใฏใ‚ซใƒณใƒžๅŒบๅˆ‡ใ‚Šใงๅˆ—ๆŒ™ใ•ใ‚ŒใŸใƒ•ใ‚ฃใƒผใƒซใƒ‰ (@message, loggingType, loggingMessage, userName, body, ipAddress) ใฎๅ€คใ‚’่กจ็คบใ—ใฆใ„ใพใ™ใ€‚ ใ“ใฎใ‚ˆใ†ใซใ€ใƒญใ‚ฐใ‚’ๆง‹้€ ๅŒ– (JSON ๅฝขๅผใง่จ˜่ฟฐ) ใ—ใฆใ„ใชใ„ๅ ดๅˆใ€ใƒญใ‚ฐใ‹ใ‚‰ๆŠ•็จฟๆ–‡ใ€ๆŠ•็จฟ่€…ๅใ€IPใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๆŠฝๅ‡บใ™ใ‚‹ใŸใ‚ใซ5,6่กŒ็จ‹ๅบฆใฎใ‚ฏใ‚จใƒชใ‚’ๆ›ธใๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ ใƒญใ‚ฐใ‚’ JSON ๅฝขๅผใงๆง‹้€ ๅŒ–ใ™ใ‚‹ ๅ…ˆใปใฉใฎใƒญใ‚ฐใ‚’ JSON ๅฝขๅผใงๆง‹้€ ๅŒ–ใ—ใฆใฟใพใ™ใ€‚ๆง‹้€ ๅŒ–ใ—ใŸไธ€ไพ‹ใฏไปฅไธ‹ใฎ้€šใ‚Šใงใ™ใ€‚ {"level":"INFO","user_name":"Taro","body":"hoge","ip_address":"1.2.3.4"} {"level":"INFO","user_name":"Jiro","body":"fuga","ip_address":"5.6.7.8"} {"level":"INFO","user_name":"Taro","body":"piyo","ip_address":"1.2.3.4"} {"level":"INFO","user_name":"Jiro","body":"hello","ip_address":"9.10.11.12"} {"level":"ERROR","user_name":"Saburo","body":"couldn't post","ip_address":"1.1.1.1"} CloudWatch Logs ใซใ“ใ‚Œใ‚‰ใฎใƒญใ‚ฐใ‚’ๅ‡บๅŠ›ใ™ใ‚‹ใจไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ ใ“ใฎๆง‹้€ ๅŒ–ใ•ใ‚ŒใŸใƒญใ‚ฐใ‹ใ‚‰ใ€ๅ…ˆใปใฉใจๅŒๆง˜ใฎๆŠ•็จฟ่€…ๅใจใƒกใƒƒใ‚ปใƒผใ‚ธใจIPใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ‚ฏใ‚จใƒชใ‚’ๆ›ธใใจไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ๆŠ•็จฟ่€…ๅใ€ใƒกใƒƒใ‚ปใƒผใ‚ธใ€IPใ‚ขใƒ‰ใƒฌใ‚นใฏใใ‚Œใžใ‚Œ user_name, body, ip_address ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใซๆ ผ็ดใ•ใ‚Œใฆใ„ใพใ™ใ€‚ fields @message, level, user_name, body, ip_address | filter level = "INFO" ใƒญใ‚ฐใฎๆœฌๆ–‡ (@message) ใŒ JSON ๅฝขๅผใงใ‚ใ‚‹ๅ ดๅˆใ€ parse ใ‚ณใƒžใƒณใƒ‰ไธ่ฆใง JSON ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใฎๅ€คใ‚’ใ€ใ‚ญใƒผๅใ‚’ๆŒ‡ๅฎšใ—ใฆๅ‚็…งใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ๆง‹้€ ๅŒ–ใ•ใ‚Œใฆใ„ใชใ„ๆ™‚ใซๆฏ”ในใ€ใ‚ฏใ‚จใƒชใฎ่กŒๆ•ฐใ‚’ๅ‰Šๆธ›ใ™ใ‚‹ใ“ใจใŒใงใใพใ—ใŸใ€‚ ใพใŸใ€ใƒใ‚นใƒˆใŒๆทฑใ่ค‡้›‘ใช JSON ใงใ‚‚ใ€ใƒ‰ใƒƒใƒˆ่กจ่จ˜ใ‚’ไฝฟ็”จใ—ใฆ JSON ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใซใ‚ขใ‚ฏใ‚ปใ‚นใ™ใ‚‹ใ“ใจใ‚‚ๅฏ่ƒฝใงใ™ใ€‚ ๅ‚่€ƒ๏ผš ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใ‚‹ใƒญใ‚ฐใจๆคœๅ‡บใ•ใ‚Œใ‚‹ใƒ•ใ‚ฃใƒผใƒซใƒ‰ – Amazon CloudWatch Logs ๆง‹้€ ๅŒ–ใƒญใ‚ฐใฎใƒ‡ใƒกใƒชใƒƒใƒˆ ใƒญใ‚ฐใ‚’ JSON ๅฝขๅผใงๅ‡บๅŠ›ใ™ใ‚‹ๅ ดๅˆใ€ๆง‹้€ ๅŒ–ใ•ใ‚Œใฆใ„ใชใ„ๆ™‚ใซๆฏ”ในใ€ใƒญใ‚ฐใฎใ‚ตใ‚คใ‚บใŒๅคงใใใชใ‚‹ๅ‚พๅ‘ใŒใ‚ใ‚Šใพใ™ใ€‚ใพใŸใ€ CloudWatch Logs ใงใฏใ€ใƒญใ‚ฐใฎๅ–ใ‚Š่พผใฟใ€ไฟ็ฎกใ€ๅˆ†ๆžใซใ‚ˆใฃใฆ 1 GB ใ”ใจใซๆ–™้‡‘ใŒ็™บ็”Ÿใ—ใพใ™ใ€‚ใคใพใ‚Šใ€ JSON ๅฝขๅผใงใƒญใ‚ฐๅ‡บๅŠ›ใ™ใ‚‹ใจใ€ JSONๅฝขๅผใงๅ‡บๅŠ›ใ•ใ‚Œใฆใ„ใชใ„ๆ™‚ใซๆฏ”ในใฆใ€ CloudWatch Logs ใฎใ‚ณใ‚นใƒˆใŒใ‹ใ‹ใ‚‹ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚ JSON ๅฝขๅผใงใƒญใ‚ฐใ‚’ๅ‡บๅŠ›ใ™ใ‚‹้š›ใฏใ€ใ™ในใฆใฎใƒ‡ใƒผใ‚ฟใ‚’ใƒญใ‚ฐๅ‡บๅŠ›ใ™ใ‚‹ใฎใงใฏใชใใ€ๅฟ…่ฆใชใƒ‡ใƒผใ‚ฟใ‚’ๅ–ๆจ้ธๆŠžใ™ใ‚‹ใชใฉใฎๅทฅๅคซใŒๅฟ…่ฆใงใ™ใ€‚ ใŠใ‚ใ‚Šใซ ไปŠๅ›žใฏ CloudWatch Logs ใฎใƒญใ‚ฐๅฝขๅผใซใคใ„ใฆๆ›ธใใพใ—ใŸใ€‚CloudWatch Logs ใซๆ ผ็ดใ™ใ‚‹ใƒญใ‚ฐใฏ JSON ๅฝขๅผ (ๆง‹้€ ๅŒ–ใƒญใ‚ฐ) ใซใ—ใŸใปใ†ใŒใ€ Logs Insights ใฎใ‚ฏใ‚จใƒชใŒ็ฐกๆฝ”ใซใชใ‚Šใ€ๆคœ็ดขใƒปๅˆ†ๆžใƒปใƒ‡ใƒผใ‚ฟๆŠฝๅ‡บใŒๆฅฝใซใชใ‚Šใพใ™ใ€‚ใ—ใ‹ใ—ใ€ใƒญใ‚ฐใ‚ตใ‚คใ‚บใฎ่‚ฅๅคงๅŒ–ใซไผดใ„ใ€ใ‚ณใ‚นใƒˆใŒๅข—ใˆใ‚‹ใ“ใจใ‚‚ใ‚ใ‚‹ใฎใงใ€ไธๅฟ…่ฆใชใƒ‡ใƒผใ‚ฟใฏๅ‡บๅŠ›ใ—ใชใ„ใชใฉใฎๅทฅๅคซใŒๅฟ…่ฆใงใ™ใ€‚็š†ใ•ใ‚“ใ‚‚ AWS ไธŠใซใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ใƒ‡ใƒ—ใƒญใ‚คใ™ใ‚‹้š›ใฏใ€ใƒญใ‚ฐๅฝขๅผใ‚’ JSON ใซใ™ใ‚‹ใ“ใจใ‚’ๆคœ่จŽใ—ใฆใฟใฆใใ ใ•ใ„ใ€‚ ๆ˜Žๆ—ฅใฏใ€ yt_glaceon ใ•ใ‚“ใฎๆ‹…ๅฝ“ใงใ™ใ€‚ ใŠๆฅฝใ—ใฟใซ๏ผ ๅ‚่€ƒ Amazon CloudWatch Logs ใจใฏ – Amazon CloudWatch Logs CloudWatch Logs Insights ใ‚’ไฝฟ็”จใ—ใŸใƒญใ‚ฐใƒ‡ใƒผใ‚ฟใฎๅˆ†ๆž – Amazon CloudWatch Logs ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใ‚‹ใƒญใ‚ฐใจๆคœๅ‡บใ•ใ‚Œใ‚‹ใƒ•ใ‚ฃใƒผใƒซใƒ‰ – Amazon CloudWatch Logs CloudWatch Logs Insights ใฎใ‚ฏใ‚จใƒชๆง‹ๆ–‡ – Amazon CloudWatch Logs Amazon CloudWatch Pricing โ€“ Amazon Web Services (AWS) CloudWatch ใฎๆ–™้‡‘ใ‚’็†่งฃใ—ใฆไปŠๅพŒใฎๆ–™้‡‘ใ‚’ๅ‰Šๆธ›ใ™ใ‚‹ We are hiring! ใƒ‹ใƒ•ใƒ†ใ‚ฃใงใฏใ€ใ•ใพใ–ใพใชใƒ—ใƒญใƒ€ใ‚ฏใƒˆใธๆŒ‘ๆˆฆใ™ใ‚‹ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใ‚’็ตถ่ณ›ๅ‹Ÿ้›†ไธญใงใ™๏ผ ใ”่ˆˆๅ‘ณใฎใ‚ใ‚‹ๆ–นใฏไปฅไธ‹ใฎๆŽก็”จใ‚ตใ‚คใƒˆใ‚ˆใ‚ŠใŠๆฐ—่ปฝใซใ”้€ฃ็ตกใใ ใ•ใ„๏ผ ใƒ‹ใƒ•ใƒ†ใ‚ฃๆ ชๅผไผš็คพๆŽก็”จๆƒ…ๅ ฑ Tech Talkใ‚„MeetUpใ‚‚้–‹ๅ‚ฌใ—ใฆใŠใ‚Šใพใ™๏ผ ใ“ใกใ‚‰ใ‚‚ใŠๆฐ—่ปฝใซใ”ๅฟœๅ‹Ÿใใ ใ•ใ„๏ผ Event – NIFTY engineering