JulyTechFesta 2021 Winterにてペパボのテレワーク開始に伴う課題を解決した技術の話をしました。
ಥવͷάϧʔϓҰ੪ࡏۈ։࢝!!1ʹ͓͚Δಇ͖ํΛมֵ͢Δٕज़Έʙౡݝ࢈ͷԴᥡΛ;ΜͩΜʹར༻ͨ͠ോαϒϨฤʙ
View Slide
ࢁԼ!QZBNB(.0ϖύϘٕज़ج൫νʔϜγχΞɾϓϦϯγύϧUFOTOBQPODPNQZBNBGVOTUOTKQ
45/4-JOVY/444FSWFSTUOTKQ
45/4
झຯ: Ωϟϯϓ
ϗεςΟϯάࣄۀ &$ࢧԉࣄۀ ϋϯυϝΠυɾͦͷଞࣄۀ
ϩϦϙοϓʂϨϯλϧαʔόαʔϏεఏڙ։࢝ ϔςϜϧαʔϏεఏڙ։࢝ίʔυॻ͚Δͱӕ͍ͭͯϖύϘʹೖࣾޭʂʂ݄̍ࣛࣇౡݝग़ਫࢢʹ͓͍ͯ1ࢁരʂʂ̍ ݱࡏɾۀϜʔϜʔυϝΠϯαʔϏεఏڙ։࢝ ౦ূҰ෦ࢦఆସ͑
GMOϖύϘ• શύʔτφʔʢैۀһʣ͕ςϨϫʔΫΛجຊͱ͢Δۈମ੍• ίϩφΠϧεͷײછ֦େঢ়گʹΑͬͯɺग़ࣾΛڐՄ੍ʹ͢ΔͳͲ ੍ݶ͕͋Δ• ʹճ͋ΔࣾΠϕϯτʹࢀՃͰ͖ΔͳΒຊશࠃͲ͜ʹॅΜͰՄ• ςϨϫʔΫखͱͯࣗ͠ͷޫඅ௨৴අΛิॿ※GMOάϧʔϓͰैۀһͷ͜ͱΛύʔτφʔͱݺͼ·͢
ʹى͖ͨ͜ͱ
༧ΊͰ͖͍ͯͨ͜ͱ౦ژɺԬɺࣛࣇౡͱڌ͕Ε͍ͯΔͷͰɺڌؒͷΓऔΓΛߦ͏ͨΊͷΈ͕උ͞Ε͍ͯͨఆظతʹࡏۈ܇࿅Λߦ͍ͬͯͨͷͰɺςϨϫʔΫͰ͖Δࣄલ४උ͕ Ͱ͖͍ͯͨձࣾͷنఆͰ͢ΒGitHub EnterpriseʹPRͯ͠࡞͞ΕΔۀϑϩʔͰ͋ͬͨ͜ͱ͔ΒςΩετͰͷίϛϡχέʔγϣϯʹ৫ͱͯ͠ద༻Ͱ͖͍ͯͨG SuiteOneLoginΛ࢝Ίͱ͢ΔSaaSͷҠߦΛਪਐ͍ͯͨͨ͠ΊɺۀͰར༻͢ΔେମͷιϑτΣΞ͕ࣾ֎͔Βར༻Ͱ͖ͨ
ςϨϫʔΫҠߦޙʹͬͨ͜ͱZoomGoogle MeetɺSlackͷ͍ํͷάϥϯυϧʔϧΛఆΊͨرऀΛରʹΦϑΟεͰར༻͍ͯͨ͠όϩϯνΣΞΛैۀһͷՈʹແྉૹɺି༩PC༻σΟεϓϨΠిؾͷิॿ੍ۚԽډॅͷࣗ༝Խɺ໘ͷશΦϯϥΠϯԽ
ಥવͷάϧʔϓҰ੪ࡏۈ։࢝!!1ʹ͓͚Δಇ͖ํΛมֵ͢Δٕज़Έ
ڥքϞσϧϓϥΠϕʔτΫϥυ౦ژΦϑΟεԬΦϑΟεࣛࣇౡΦϑΟεVPNFWVPNϖύϘʹ͓͍ͯओʹɺFromIPΛݩʹωοτϫʔΫͷΞΫηεΛڐՄ͍ͯͨ͠
ڥքϞσϧϓϥΠϕʔτΫϥυ౦ژΦϑΟεԬΦϑΟεࣛࣇౡΦϑΟεVPNFWVPNίϩφՒʹ͓͍ͯഁ໓!!1ӕͰ͢ɺ͜͜·Ͱ߽շʹഁ໓͓ͯ͠Βͣɺഁ໓͍͍͔͔ͬͯͨͬͨΒഁ໓ͬͯॻ͖·ͨ͠ɻഁ໓ɺϩυϦήε
ϩʔϚ1ʹͯ͠ͳΒͣچདྷΑΓΒ͘FromIPͰͷ੍ݶΛߦ͍ͬͯͨͨΊɺଈ࠲ʹ΄͔ͷ ηΩϡϦςΟϞσϧͷҠߦࠔԿ͔͠Βͷٕज़తΞϓϩʔνΛߦ͏ͨΊʹ·ͣΞΫηεܦ࿏Λ֬อ ͢Δඞཁ͕͋Δ
kanmon-kaikyohttps://github.com/pyama86/kanmon-kaikyo
ओͳΞΫηε੍ޚSecurity GroupϖύϘͷຊ൪αʔόͷΞΫηεओʹOpenStackͷSecurity Group(SG)Λར༻੍ͯ͠ޚ͞Ε͍ͯΔSGΛૢ࡞ͯ͠ಛఆͷIPΛFromIPʹ࣋ͭϗετ͔ΒͷSSHΛΞΫηε͢ΔCLIπʔϧͱͯ͠kanmonΛಉ྅ͷ @buty4649 ͕։ൃ͍ͯͨ͠
kanmonࣗͷ*1ΛՃ͍ͨ͠4(ͷ*%ΛઃఆϑΝΠϧʹهड़DBULBONPOZNM[email protected]ڥมΛઃఆ[email protected]&3/".&VTFSOBNF[email protected]"44803%QBTTXPSE[email protected]"65)@63-IUUQFYBNQMFDPNBVUIWίϚϯυ࣮ߦLBONPOPQFOkanmon open
kanmonͷ՝ͱͱΤϯδχΞ͕͏͜ͱΛఆͨ͠πʔϧͳͷͰɺ࣮ߦڥߏஙɺڥมͷઃఆͳͲɺΤϯδχΞҎ֎Ͱͷར༻ͷෑډ͕ߴ͍ίϩφՒʹ͓͍ͯɺϖύϘͰσβΠφʔͦͷଞͷ৬छ͕SSHӽ͠ʹ σϓϩΠ͢Δഎܠ͔ΒɺΤϯδχΞҎ֎ͷ৬छΞΫηεखஈΛ֬อ͢Δ ඞཁ͕ੜ·Εͨ
kanmon-kaikyokanmon-kaikyo1. Slack͔ΒϘοτʹίϚϯυΛൃߦ2. OAuthೝূ༻URL͕ฦ٫͞ΕΔ3. ೝূΛύεͰ͖ͨͳΒɺ ೝূΛύεͨ͠ࡍͷIPΞυϨεΛ ࢦఆͨ͠αʔόʹSSHڐՄ͢Δ1.ίϚϯυൃߦ2.OAuthೝূ3. ΞΫηεڐՄ
kanmon-kaikyoFTTHͷIP࠶ར༻ʹΑΔηΩϡϦςΟϦεΫΛݮΒͨ͢Ίɺఆظతʹkanmon-kaikyoͰՃͨ͠ϙϦγʔΛআ͍ͯ͠ΔϖύϘͷSSHଓݪଇSTNSΛར༻ͨ͠ެ։伴ೝূɺೝՄΛߦ͍ͬͯΔͨΊɺIP + ެ։伴ͷଟཁૉͰೝূ͞Ε͍ͯΔ
kanmon-kaikyo
͕ɺ͔͠͠ɺಇ͘ॴෆͳͷʹIPʹറΒΕͯΔԶͨͪ
IPʹΑΔ੍ޚΛΊ͍͕ͨଟޚͷ͕Ұͭͳ͘ͳΔ
pam-google-web-oauth-rshttps://github.com/pyama86/pam-google-web-oauth-rs
pam-google-web-oauth-rsSSHೝূΛެ։伴 + OAuthೝূͷଟཁૉೝূԽ͢ΔPAMϞδϡʔϧɻྨࣅʹgoogle/google-authenticator-libpam ͕͋Δ͕ɺͪ͜ΒOTPํࣜɻϖύϘGSuiteಋೖ͔ͭG Suiteࣗମ͕2FAඞਢͳͷͰ৫ʹϑΟοτ͢ΔιϑτΣΞΛॻ͍ͨݩʑGo + CͰॻ͍͍͕ͯͨɺWEB + Linuxϓϩάϥϛϯάͷάϧʔݴޠͱͯ͠RustͰॻ͍ͨ΄͏͕εοΩϦॻ͚ͨͷͰษڧΛ݉Ͷͯॻ͖ͨ͠ݱࡏϖύϘͰओʹ౿ΈαʔόʹΠϯετʔϧ͠ɺଟཁૉೝূΛར༻͍ͯ͠Δ
͜͜·Ͱͨ͜͠ͱग़ࣾͰ͖ͳ͍ɺVPNαʔόͷ͕ൃੜ͠ɺ͜Ε·ͰͷIPΛར༻ͨ͠ΞΫηε੍ޚ͕ϑΟοτ͠ͳ͘ͳ͖ͬͯͨҰ࣌తͳΞΫηεܦ࿏ΛΤϯδχΞɺσβΠφʔ͕Slack͔Βར༻Ͱ͖Δ Α͏ʹͨ͠SSHଓʹଟཁૉೝূΛ༻͍Δ͜ͱͰɺੈքத͔Β҆શʹΞΫηεͰ͖ΔΑ͏ʹͨ͠
ۀγεςϜͷΞΫηεܦ࿏
ࡐ͝ͱͷސ٬ཧΞϓϦސ٬ɺܖใͷӾཡσʔλϝϯςφϯεཤྺཧ
ސ٬ཧΞϓϦ͋Δ͋Δૣ͘ݴ͍͍͓ͨ٬༷ʹ͢ΔϑϩϯτΞϓϦͰͳ͍ͨΊɺOSɺϓϩάϥϛϯάݴޠɺϥΠϒϥϦͷόʔδϣϯΞοϓͳͲ͕ޙճ͠ʹͳΓ͕ͪ༏ઌ͕Լ͛ΒΕ͕ͪͰɺʮ͑ͬʂࠓͲ͖͜͏͍͏ڍಈ͋Δͷʁʁʁʯ͍ͬͯ͏࣮͕Γ͕ͪ
ͦΕͰࣾ֎͔Β҆શʹར༻͍ͨ͠github.com/oauth2-proxy/oauth2-proxyoauth2-proxyΛ࠾༻͠ɺސ٬ཧΞϓϦͷલஈʹ OAuthೝূΛՃ͠ɺSSOग़དྷΔΑ͏ʹͨ͠
oauth2-proxyΛར༻ͨ͠SSOSGAppDBʹొ͞ΕͨϢʔβʔIDͰೝূ&ೝՄڐՄ͞ΕͨIP͔ΒͷΈΞΫηεՄೳoauth2-proxyAppoaut2-proxy͔Β࿈ܞ͞ΕͨϔομใͰೝূGoogleGitHubͷΞΧϯτͰOAuthೝূbefore after
oauth2-proxyΛར༻ͨ͠SSOnginxoauth2-proxyclientserver {location /oauth2/ {proxy_pass http://127.0.0.1:4180;...}location = /oauth2/auth {proxy_pass http://127.0.0.1:4180;...}location / {auth_request /oauth2/auth;error_page 401 = /oauth2/sign_in;...}}
oauth2-proxyΛར༻ͨ͠SSOnginxoauth2-proxyproxy_set_header X-User $user;proxy_set_header X-Email $email;Appnginx͔ΒϓϩΩγ͢Δ߹ʹϦΫΤετϔομʹϢʔβʔIDϝʔϧΞυϨεΛຒΊࠐΊΔHTTPϔομΛݩʹSSO͢Δ߹ɺඞͣΞΫηεݩͷIPΛνΣοΫ͢Δඞཁ͕͋Δɻෆਖ਼ͳதܧʹΑͬͯΞΧϯτ͕ͬऔΒΕΔՄೳੑ͕͋Δɻ
oauth2-proxyطଘͷΞϓϦͷલஈʹoauth2-proxyΛஔͯ͠͏༻్ͷͨΊɺ෯͍ ΞϓϦέʔγϣϯʹӨڹͳ͘OAuthೝূΛద༻ՄೳೝূՄೳͳϝʔϧΞυϨευϝΠϯGitHub TeamࢦఆՄೳͳͷͰɺਖ਼͘͠ઃఆ͢Ε҆શʹ׆༻Ͱ͖ΔυΩϡϝϯτφϨοδॆ࣮͓ͯ͠Γɺಋೖָ͕
WEBϒϥβOAuthͰ͍͍͚Ͳɺ CLI͔Β࣮ߦ͞ΕΔΞϓϦʁ
Vault by HashicorpϖύϘͰTLS҉߸Խ௨৴ʹར༻͢Δ伴ͷཧΛVaultͷPublic Key Infrastructure(PKI)Secret EngineΛར༻͍ͯ͠Δɻ
Vault by Hashicorpvault serverapi.pepabo.comconsul-templateclientconsul-templateTLS҉߸Խ௨৴Vault͕͍ग़͢伴Λར༻ͯ͠ɺαʔό ʙ ΫϥΠΞϯτؒͷ௨৴ΛTLSΫϥΠΞϯτೝূ&௨৴Ͱ҉߸Խ
Vault by HashicorpWBVMUTFDSFUTFOBCMFEFTDSJQUJPOTFSWJDFDPOTVMQLJNBYMFBTFUUMIQLJ[email protected][email protected]@UUMIkanmon openVaultൿಗใΛ҆શʹཧग़དྷΔιϑτΣΞͦͷػೳͷҰ͕ͭެ։伴ج൫xxx.service.consul ͷެ։伴Λཧ͢Δઃఆ
consul-templateUFNQMBUF\DPOUFOUT\\XJUITFDSFUaQLJJTTVFTFSWJDFDPOTVMa[email protected]^^\\%[email protected]^^\\FOE^^[email protected]@$"DSU[email protected]@DFSUT^kanmon openHashicorpͷιϑτΣΞͱ࿈ܞͯ͠ɺϑΝΠϧΛग़ྗͨ͠ΓɺίϚϯυΛ࣮ߦͨ͠Γग़དྷΔϛυϧΣΞVaultͷ pki/issue/service-consulͷΤϯυϙΠϯτ͔Βূ໌ॻΛऔಘ͢Δ
consul-templateূ໌ॻͷ༗ޮظݶΛࢹͯ͠ɺظݶΕલʹࣗಈͰߋ৽ͯ͘͠ΕΔͷͰূ໌ॻཧͷख͕ؒͳ໋͍ͳূ໌ॻΛൃߦ͢Δ͜ͱͰɺैۀһͷୀ৬࣌ʹࣗಈͰࣦޮͤ͞ΔͳͲͷॲཧ͕༰қͰ͋Δ
Vault by Hashicorpvault serverapi.pepabo.comconsul-templateclientconsul-templateTLS҉߸Խ௨৴Vault͕͍ग़͢伴Λར༻ͯ͠ɺαʔό ʙ ΫϥΠΞϯτؒͷ௨৴ΛTLSΫϥΠΞϯτೝূ&௨৴Ͱ҉߸ԽΫϥΠΞϯτʹͲͷΑ͏ʹ伴Λ͢Δͷ͔͕େ͖ͳ՝ʹͳͬͨ
kagianapyama86/kagiana
kagianaWEBϒϥβͰkagianaͷUIʹΞΫηεͯ͠ೝূޙɺVaultʹTLS௨৴͢ΔͨΊͷ伴Λμϯϩʔυ•
ʮ͜Εϒϥβ։͘ͷ໘͔ͩΒCLIͰͰ͖ͳ͍͔͢Ͷʁʯ
STNSΛར༻ͨ͠ެ։伴ೝূSTNSkagianaclientެ։伴ͰνϟϨϯδίʔυΛ෮߸νϟϨϯδίʔυνϟϨϯδίʔυΛൿີ伴Ͱॺ໊ͯ͠ૹ৴7BVMUʹΞΫηε͢Δ伴ͷstns/libstns-goΛ։ൃ͠ɺSTNSΛར༻ͨ͠ೝূΛՄೳʹͨ͠ೝূཁٻ
͜͜·Ͱͨ͜͠ͱސ٬ཧγεςϜͳͲͷैۀһ͕ར༻͢ΔͨΊͷΞϓϦέʔγϣϯมߋ༰Λগͳ͘ɺ҆શʹར༻͢ΔͨΊʹɺoauth2-proxyͰೝূΛߦ͏Α͏ʹͨ͠։ൃऀ͕ར༻͢ΔAPITLSΫϥΠΞϯτೝূΛߦ͏Α͏ʹͯ͠ɺ伴ͷVault + kagianaΛར༻ͯ͠ߦ͍ͬͯΔ
ઢ OAuth2.0ೝূ
ೝূͱೝՄೝূೝՄ୭Ͱ͋Δ͔Λಛఆ͢ΔԿ͕ग़དྷΔͷ͔ΛڐՄ͢Δ
OAuth(2.0)ݫີʹೝՄͷ༷RFC 6749ʹͯఆ͍͔ٛͭ͘ͷ࣮ύλʔϯ͕༗ΓɺࣗͰೝՄαʔό࣮͢Δ߹ɺ࣮ύλʔϯʹΑͬͯೝূίʔυͷ͍ճ͠ͳͲͷ੬ऑੑੜΜͰ͠·͏ʮOAuth 2.0 શϑϩʔͷਤղͱಈը※ʯ͕͓͢͢Ί※ https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f
ͳΜͱͳ͘ೝՄͪ͠Όͬͯ·ͤΜ͔ʁTwitterͰΑ͘ݟΔGeneratorྑṖWifiೝՄ༻๏༻ྔΛकͬͯਖ਼͘͠
ܹ͘͠ઢ
ۭલͷΩϟϯϓϒʔϜ౸དྷ
ࠓʂʂʂʂʂʂʂΩϟϯϓ͕ʂʂʂདྷͯ·͢ʂʂʂʂ
શ͘༧͕औΕͳ͍िhttps://booking.montbell.jp/lodging/site.php?site_id=3WEB༧ɺޮత͙͗ͯ͢͢ຒ·Δ
ͦΕͰԶΩϟϯϓʹߦ͖͍ͨhttps://github.com/pyama86/camp1. ৗࣝతͳසͰαΠτΛΫϩʔϧ2.αΠτʹۭ͖͕ग़ͨΒɺLINEʹଈ௨3. ͋ΒΏΔ࡞ۀΛࢭΊͯɺΩϟϯϓαΠτΛ༧
ؓٳ
ςϨϫʔΫΛجຊͱͨ͠ձ͔ࣾͩΒͦ͜ɺςϨϫʔΫ্͕ख͍ձࣾʹͳΓ͍ͨ
໘ͷΦϯϥΠϯԽ໘Google MeetΛར༻࣮ͯ͠ࢪϨδϡϝ໘ཤྺཧʹ࠾༻ཧγεςϜTalentioΛ࠾༻ϦϞʔτͰ࠾༻ͷεϐʔυΛ্͛ΔͨΊ௨Λ
talentio-notifierpyama86/talentio-notifier
ϖύϘͷ໘ϑϩʔॻྨ৹ࠪ 1࣍໘ 2࣍໘ һ໘ ɹ࠾༻ʂʂ̍ෳճͷ໘Ͱٕೳ໘ɺΧϧνϟʔϚονͳͲΛ͓͠·͢
pyama͕ղܾ͔ͨͬͨ͠՝εϐʔυײͷͳ͍ձࣾͰಇ͖͍ͨͱ͕ࣗࣗࢥΘͳ͍ͷͰɺԠื͔Β ߹൱࿈བྷ·ͰͷϦʔυλΠϜΛݮ͍ͨ͠໘ʹඞ༻ͳใ͕ඞ༻ͳͱ͖ʹಧ͘Α͏ʹ͍ͨ͠
TalentioͷAPIΛར༻͠ɺ௨ΛࣗಈԽॻྨબߟɺ໘ධఆͷهೖΛϦϚΠϯυ໘10લʹTalentioͷϨδϡϝϖʔδͷϦϯΫΛࣗಈͰ௨࠾༻νϟϯωϧʹ୭ʹɺͲ͏͍ͬͨґཔΛ௨ͨ͠ͷ͔ΛೲظΛؚΊͯߘ͢Δ͜ͱͰ࠾༻୲τϨʔγϯάՄೳ
ςϨϫʔΫʹ͓͍ͯSlackେ׆༂
શһϦϞʔτͰ͋Δ͕Ώ͑ʹɺ୭͕͍·੮ͷલʹ͍Δͷ͔ɺ୭͕ࠓ͝൧Λ৯͍ͯΔͷ͔Θ͔Βͳ͍ͷͰɺSlackͰͦΕͧΕใࠂ͍͋ͬͯͨ͠ۈଵͷใࠂ੮SlackΛ׆༻
୭͕͍Δ͔͍ͳ͍͔SlackͷྲྀΕͰ ͍͖Εͳ͍ΦϑΟεͰͪΐͬͱ੮Λཱͯݟ͑ͨ ͋ͷਓΠϯλʔωοτӽ͠Ͱݟ͑ͳ͍ςϨϫʔΫΒ͠ͱີͰ͋Δ͕ Ώ͑ʹɺࣗ༝͕ߴ͘੮૿͕͑ͪ܅ͱաͨ͝͠ՆઈରʹΕͳ͍SlackϑϩʔใͳͷͰෆ͖ͳ͜ͱ͋Δ
Away From KeybordϝϯγϣϯͰݺΕͨࡍʹ੮Λͭͨ͑ͨΓɺఆܗใࠂΛίϚϯυԽ
Away From KeybordϝϯγϣϯΛ͛Δͱෆࡏ͕͙͢Θ͔Γɺ ͙͢ରԠ͕ग़དྷΔۈ։࢝ͳͲఆܗใࠂʹ͍ɺ͓·͚Λ͚ͭΔ͜ͱͰɺศརʹར༻ଅਐ
࠷ۙSlackͰ͍ͯ͠Δ͜ͱhttps://github.com/pyama86/issuer-botϑϩʔใΛετοΫใม͢ΔSlackͰϦΞΫγϣϯΛ͚ͭΔͱϘοτ͕ͦͷ༰Λసه͢ΔGitHub IssueͷURLΛൃߦ
ศར͗ͯ͢৭ʑॻ͍ͯ͠·͍͕ͪಉ྅ͷґཔΛSlackʹʑॻ͍ͯ͠·͏ɺͦͯ͠ྲྀΕΔେࣄͳ͓ΒͤͳͷʹSlackʹ͔͠ใ͕ͳ͍ɺͦͯ͠ྲྀΕΔαʔϏε͔ΒͷΞϥʔτɺେࣄ͚ͩͲSlackͷ௨͕ᷓΕͯɺྲྀΕΔ͜Μͳ͔࣌ͩΒͦ͜ɺߟ͑Δ͜ͱ͕͋Δ
ใͷੜଘظؒΛҙࣝͨ͠ίϛϡχέʔγϣϯ͕ٻΊΒΕΔGibHub IssueNotionͳͲੜଘظ͕ؒ͘ɺݕࡧ͕͍͢͠ഔମΛ ར༻͢ΔSlackͰΓऔΓͨ͠༰ςϨϏ௨ͨ͠༰Λจࣈىͯ͜͠͠ɺ ੜଘظ͕͍ؒഔମʹه͢Δ͜ͱ͕কདྷͷ୭͔Λॿ͚Δ͜ͱʹͳΔ
ࠓͨ͜͠ͱ
՝Λղܾ͢ΔͨΊʹίʔυΛॻ͍ͨΓOSS׆༻ͨ͠kanmon-kaikyo - SGͷ։ดΛSlackͰ࣮ߦpam-google-web-oauth-rs - SSHΛଟཁૉೝূԽoauth2-proxy - طଘͷίʔυʹӨڹΛগͳ͘OAuthೝূʹରԠkagiana - VaultʹΞΫηε͢ΔͨΊͷ伴ΛOAuthೝূޙʹ
ςϨϫʔΫΛݪଇͱͨ͠ձ͔ࣾͩΒͦ͜ɺςϨϫʔΫ্͕ख͍ձࣾʹͳΓ͍ͨ
࠷ۙSlackͰ͍ͯ͠Δ͜ͱhttps://github.com/pyama86/issuer-botϑϩʔใΛετοΫใม͢ΔSlackͰϦΞΫγϣϯΛ͚ͭΔͱϘοτ͕ͦͷ༰Λసػ͢ΔGitHub IssueͷURLΛൃߦ
࠷ޙʹίϩφՒͰ৭ʑͳΈΛ࡞Δ্Ͱײͨ͜͡ͱɺ͜Ε·Ͱͱߟ͑ํΛ ม͑ͳ͍ͱߦ͚ͳ͍෦͕ଟ͍ςϨϫʔΫΒ͠ͱີͰ͋Δ͜ͱ͜Ε·ͰՄࢹൣғʹ͋ͬͨͷ͕ݟ͑ͳ͍͜ͱಉ࣭ԽͷఔʹΑΓΞϓϩʔν͕ҧ͏͜ͱ
͓͠·͍࠷৽ͷ࠾༻ใΛνΣοΫˠ [email protected]