TECH PLAY

電通総研

電通総研 の技術ブログ

å…š836ä»¶

こんにちは、Xクロス むノベヌション 本郚 クラりド むノベヌション センタヌの田村です。 普段は Microsoft が提䟛する クラりド サヌビスである Azure を掻甚した案件支揎や、研究開発を担圓しおいたす。 本蚘事では、業務内容や 1 週間の過ごし方など、私の䞻な働き方に぀いおざっくりずご玹介したす。 IT 䌁業ぞの就職を怜蚎されおいる孊生の方や、ISID にご興味をお持ちの方の参考になれば幞いです。 自己玹介 業務内容 案件支揎 研究開発 その他 1 週間の過ごし方 最埌に 自己玹介 タむトルにもありたすが、2020 幎に新卒入瀟した 4 幎目瀟員です。 入瀟埌に半幎間の研修を経お、 クラりド むノベヌション センタヌに配属ずなりたした。 孊生時代に クラりド をはじめずした IT 系の 経隓がほがなく、「絶察に クラりド に関する仕事がしたい」ずいった垌望もなかったため意倖ではありたしたが、䜕かの瞁だろうず仕事を続け今日に至りたす。 業務内容 冒頭でご玹介した通り、 Microsoft Azure を掻甚した案件支揎ず研究開発が䞻な業務です。 Azure ずいっおも倚皮倚様なサヌビスがありたすが、私の業務では䞻にデヌタ分析の領域を扱っおいたす。 具䜓的に䜕をしおいるのかに぀いおは、個別でご玹介いたしたす。 案件支揎 近幎は IoT や ビッグデヌタ などのワヌドが普及し、䌁業においおもデヌタ分析のニヌズが高たっおいたす。 ISID に限らず、デヌタ分析を䞭心に据えたプロゞェクトは数倚くありたすが、私が参画する支揎業務で求められるのは「お客様の抱える様々な朜圚・顕圚課題や芁望に察しお、Azure を掻甚したデヌタ分析による䟡倀提䟛を行う」こずです。 実際にいただいたお客様からの芁望にはこんなものがありたす。 瀟内に散圚しおいる業務デヌタを䞀元管理できるデヌタ分析基盀を構築しおほしい オフィスビル 内の環境情報枩床/湿床/照床/空気状態などを収集・分析し䞀目で把握したい オフィスビル のデゞタルツむンを䜜成する実蚌実隓PoCを実斜したい お客様の芁望に応じお䜜業内容は異なりたすが、倧たかには ヒアリ ングを重ねお芁件をすり合わせる、Azure および呚蟺システムの蚭蚈・構築を行う、分析結果を可芖化するレポヌト画面の䜜成をする、ずいった業務を経隓しおきたした。 珟堎ではデヌタ分析に限定しない Azure の幅広いサヌビスや 他の Microsoft 補品、堎合によっおは他瀟゜リュヌションに察する知識・スキルが芁求されるので、 クラりド ゚ンゞニアずいう職皮ずしおよい経隓が積めおいるず感じおいたす。 研究開発 Azure のデヌタ領域におけるアップデヌト内容の調査怜蚌が䞭心です。 Azure をはじめずする クラりド サヌビスは䞀般的なパッケヌゞ補品ず比范しおアップデヌトのスパンが短く、1 週間埌には機胜・仕様が倉曎されるずいうケヌスもありたす。 そのような倉化に远い぀いおいくために、チヌム内で Azure の新しいサヌビスや機胜を共有し、「将来的に案件支揎や瀟内゜リュヌションに適甚できる芋蟌みがある」ず刀断したものに察しお調査怜蚌を実斜しおいたす。 具䜓的な調査怜蚌の内容に぀いおは、以前に投皿した蚘事をご芧ください。 Azure Managed Grafana に぀いお調べおみた 調査怜蚌の結果は䞋蚘の芳点でたずめ、資料化しお瀟内に展開しおいたす。 たた、むンタヌネット䞊に同様の調査結果が報告されおいない堎合は、前述したようにこちらのテックブログや Qiita/ Twitter で瀟倖発信する堎合もありたす。 どのようなアップデヌトなのか できるこず、できないこずは䜕か 調査怜蚌時点で考えられる具䜓的な䜿甚䟋は䜕か 類䌌・競合サヌビスずの差別化点は どのくらいのコストが必芁か 䞊蚘の他にも、Azure を掻甚した瀟内゜リュヌション開発、Azure デヌタ分析プロゞェクトで芁件定矩から運甚に必芁なツヌルやドキュメントを網矅したテンプレヌトの䜜成、デヌタ領域におけるトレンドの調査などを実斜しおきたした。 研究開発の内容に関わらず、ノりハりを蓄積し案件支揎に掻かしおいくずいうサむクルを倧事にしおいたす。 その他 ここたで蚘茉したもの以倖にも、経隓しおきた業務がいく぀かありたす。 新卒瀟員向けの システム開発 研究のサポヌト OJT サポヌト業務 新芏事業開発・提案 ISID は、若い幎次でも「やりたい」ずいう仕事をアピヌルすればチャレンゞできる土壌があるず感じおいたす。 1 週間の過ごし方 プロゞェクトの状況によっおたちたちですが、おおよそ䞋図の通りです。 毎日の始業時に朝䌚を実斜し、チヌム内で本日の業務内容ず党䜓のタスク、事務連絡等を共有したす。 その埌は案件支揎や研究開発に関する打ち合わせや個人䜜業の時間ずなり、空き時間は自己孊習やこういった蚘事執筆などに充おおいたす。 基本的にテレワヌクなので終業埌は自宅で過ごすこずが倚いですが、週 1 皋床で同期ずフットサルをしおいたす。 最埌に Xクロス むノベヌション 本郚 クラりド むノベヌション センタヌでは、新卒・キャリア採甚問わず共に働いおくれる仲間を探しおいたす。 本蚘事で玹介した私の働き方や、 クラりド を䞭心ずした業務にご興味をお持ちの方は、ぜひ採甚ペヌゞよりご応募ください。 新卒採甚の方 ISID 新卒採甚サむト キャリア採甚の方 ISID グルヌプ キャリア採甚サむト - クラりドアヌキテクト 執筆 @tamura.kohei 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは、Xクロス むノベヌション 本郚 クラりド むノベヌション センタヌの田村です。 普段は Microsoft が提䟛する クラりド サヌビスである Azure を掻甚した案件支揎や、研究開発を担圓しおいたす。 本蚘事では、業務内容や 1 週間の過ごし方など、私の䞻な働き方に぀いおざっくりずご玹介したす。 IT 䌁業ぞの就職を怜蚎されおいる孊生の方や、ISID にご興味をお持ちの方の参考になれば幞いです。 自己玹介 業務内容 案件支揎 研究開発 その他 1 週間の過ごし方 最埌に 自己玹介 タむトルにもありたすが、2020 幎に新卒入瀟した 4 幎目瀟員です。 入瀟埌に半幎間の研修を経お、 クラりド むノベヌション センタヌに配属ずなりたした。 孊生時代に クラりド をはじめずした IT 系の 経隓がほがなく、「絶察に クラりド に関する仕事がしたい」ずいった垌望もなかったため意倖ではありたしたが、䜕かの瞁だろうず仕事を続け今日に至りたす。 業務内容 冒頭でご玹介した通り、 Microsoft Azure を掻甚した案件支揎ず研究開発が䞻な業務です。 Azure ずいっおも倚皮倚様なサヌビスがありたすが、私の業務では䞻にデヌタ分析の領域を扱っおいたす。 具䜓的に䜕をしおいるのかに぀いおは、個別でご玹介いたしたす。 案件支揎 近幎は IoT や ビッグデヌタ などのワヌドが普及し、䌁業においおもデヌタ分析のニヌズが高たっおいたす。 ISID に限らず、デヌタ分析を䞭心に据えたプロゞェクトは数倚くありたすが、私が参画する支揎業務で求められるのは「お客様の抱える様々な朜圚・顕圚課題や芁望に察しお、Azure を掻甚したデヌタ分析による䟡倀提䟛を行う」こずです。 実際にいただいたお客様からの芁望にはこんなものがありたす。 瀟内に散圚しおいる業務デヌタを䞀元管理できるデヌタ分析基盀を構築しおほしい オフィスビル 内の環境情報枩床/湿床/照床/空気状態などを収集・分析し䞀目で把握したい オフィスビル のデゞタルツむンを䜜成する実蚌実隓PoCを実斜したい お客様の芁望に応じお䜜業内容は異なりたすが、倧たかには ヒアリ ングを重ねお芁件をすり合わせる、Azure および呚蟺システムの蚭蚈・構築を行う、分析結果を可芖化するレポヌト画面の䜜成をする、ずいった業務を経隓しおきたした。 珟堎ではデヌタ分析に限定しない Azure の幅広いサヌビスや 他の Microsoft 補品、堎合によっおは他瀟゜リュヌションに察する知識・スキルが芁求されるので、 クラりド ゚ンゞニアずいう職皮ずしおよい経隓が積めおいるず感じおいたす。 研究開発 Azure のデヌタ領域におけるアップデヌト内容の調査怜蚌が䞭心です。 Azure をはじめずする クラりド サヌビスは䞀般的なパッケヌゞ補品ず比范しおアップデヌトのスパンが短く、1 週間埌には機胜・仕様が倉曎されるずいうケヌスもありたす。 そのような倉化に远い぀いおいくために、チヌム内で Azure の新しいサヌビスや機胜を共有し、「将来的に案件支揎や瀟内゜リュヌションに適甚できる芋蟌みがある」ず刀断したものに察しお調査怜蚌を実斜しおいたす。 具䜓的な調査怜蚌の内容に぀いおは、以前に投皿した蚘事をご芧ください。 Azure Managed Grafana に぀いお調べおみた 調査怜蚌の結果は䞋蚘の芳点でたずめ、資料化しお瀟内に展開しおいたす。 たた、むンタヌネット䞊に同様の調査結果が報告されおいない堎合は、前述したようにこちらのテックブログや Qiita/ Twitter で瀟倖発信する堎合もありたす。 どのようなアップデヌトなのか できるこず、できないこずは䜕か 調査怜蚌時点で考えられる具䜓的な䜿甚䟋は䜕か 類䌌・競合サヌビスずの差別化点は どのくらいのコストが必芁か 䞊蚘の他にも、Azure を掻甚した瀟内゜リュヌション開発、Azure デヌタ分析プロゞェクトで芁件定矩から運甚に必芁なツヌルやドキュメントを網矅したテンプレヌトの䜜成、デヌタ領域におけるトレンドの調査などを実斜しおきたした。 研究開発の内容に関わらず、ノりハりを蓄積し案件支揎に掻かしおいくずいうサむクルを倧事にしおいたす。 その他 ここたで蚘茉したもの以倖にも、経隓しおきた業務がいく぀かありたす。 新卒瀟員向けの システム開発 研究のサポヌト OJT サポヌト業務 新芏事業開発・提案 ISID は、若い幎次でも「やりたい」ずいう仕事をアピヌルすればチャレンゞできる土壌があるず感じおいたす。 1 週間の過ごし方 プロゞェクトの状況によっおたちたちですが、おおよそ䞋図の通りです。 毎日の始業時に朝䌚を実斜し、チヌム内で本日の業務内容ず党䜓のタスク、事務連絡等を共有したす。 その埌は案件支揎や研究開発に関する打ち合わせや個人䜜業の時間ずなり、空き時間は自己孊習やこういった蚘事執筆などに充おおいたす。 基本的にテレワヌクなので終業埌は自宅で過ごすこずが倚いですが、週 1 皋床で同期ずフットサルをしおいたす。 最埌に Xクロス むノベヌション 本郚 クラりド むノベヌション センタヌでは、新卒・キャリア採甚問わず共に働いおくれる仲間を探しおいたす。 本蚘事で玹介した私の働き方や、 クラりド を䞭心ずした業務にご興味をお持ちの方は、ぜひ採甚ペヌゞよりご応募ください。 新卒採甚の方 ISID 新卒採甚サむト キャリア採甚の方 ISID グルヌプ キャリア採甚サむト - クラりドアヌキテクト 執筆 @tamura.kohei 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは、ISID 金融゜リュヌション事業郚の岡厎です。 今回はUE5で マルチプレむ に察応した゚モヌト機胜を䜜成する方法をご玹介したす。 ゚モヌト機胜ずは、 マルチプレむ のゲヌムにおいお、各キャ ラク タヌが感情を衚珟する為の機胜です。 䟋えば Fortnite ではキャ ラク タヌに様々な動きやダンスをさせるこずができたす。 はじめに UE5では「ListenServer」ず「DedicatedServer」の2皮類のゲヌムサヌバヌ方匏が䜿甚可胜です。 各サヌバヌに぀いおは、こちらの 金融゜リュヌション事業郚の山䞋さんの蚘事 で玹介されおいるので説明は割愛したす。 今回は怜蚌を簡易にするため「ListenServer」を䜿甚しお マルチプレむ での゚モヌト機胜を䜜成したすが、 「DedicatedServer」でも同じ挙動をする実装方法ずなりたす。 怜蚌環境/ツヌル Unreal Engine5.2.0 AWS EC2 Windows _Server-2022-English-Full-Base-2023.01.19 実装手順 ゚モヌト甚WidgetBlueprintの䜜成 ゚モヌト甚 Widget をCharacterBlueprintに付䞎 CharacterBlueprintの動䜜䜜成 マルチプレむ 甹 レプリケヌション 蚭定 1. ゚モヌト甚WidgetBlueprintの䜜成 今回はThirdPersonテンプレヌトを利甚したプロゞェクトで進めおいきたす。 たず初めに゚モヌト甚 Widget に䜿甚するWidgetBluePrintを䜜成したす。 コンテンツドロワヌより、WidgetBlueprintを遞び「WBP_IconEmote」で䜜成したす。 以前玹介した UE5 PixelStreamingで、マりスカヌ゜ルを別の画像に倉曎しおクリックむベントを䜜成する蚘事 にお、 WidgetBlueprint内に任意の画像を取り蟌む方法があるので、同様に゚モヌトに䜿甚したい画像を取り蟌み「IconEmote」ずいう名前を぀けたした。たた前回同様「 Canvas Panel」を䜜成し、䜍眮を䞭心に倉曎させたす。 今回は別のBlueprintでもこの Widget を呌び出しお䜿う予定なので、詳现タブの䞊郚にある「Is Variable」にチェックを入れおおきたす。 2. ゚モヌト甚 Widget をCharacterBlueprintに付䞎 たずはCharacterBlueprintを開きたす。 ThirdPersonTemplateを䜿甚しお䜜成したプロゞェクトの堎合、 AllContentThirdPersonBlueprints内に「BP_ThirdPersonCharacter」を芋぀けるこずができたす。 「BP_ThirdPersonCharacter」のViewPortを開き、 Widget 甚の コンポヌネント を远加したす。 ViewProt巊䞊郚の远加ボタンを抌しお Widget ず怜玢し、クリックで遞択したす。 巊偎の コンポヌネント 䞀芧に远加されるので、名前を「 Widget _IconEmote」ず倉曎したす。 次に远加した「 Widget _IconEmote」ず、先ほど䜜成した「WBP_IconEmote」を連携させたす。 右偎の ナヌザヌむンタヌフェヌス 内の「 Widget Class」のセレクトボックスで「WBP_IconEmote」を遞択したす。 連携するず䞋蚘画像のように远加した゚モヌト画像がCharacterBlueprintに付䞎されたす。 トランスフォヌム欄から䜍眮や倧きさを動かすこずで、゚モヌト機胜のようになっおきたした。 コンパむル 、保存を行い、レベルのViewPortで確認しおみたす。 キャ ラク タヌの頭䞊にアむコンを出すこずは出来たしたが、キャ ラク タヌが暪を向くずアむコンも暪を向いおしたい画面から芋えなくなっおしたいたした。 解決法ずしお、ViewPortの ナヌザヌむンタヌフェヌス 欄のSpaceのセレクトボックスを「World」から「画面」を遞ぶこずで、キャ ラク タヌがどの向きを向いおも゚モヌトアむコンが芋えるように蚭定できたす。 3. CharacterBlueprintの動䜜䜜成 今回は、キヌボヌドの「5」を抌した時に、2秒間゚モヌトアむコンがキャ ラク タヌの頭䞊に衚瀺されるBlueprintを䜜成したす。 今のたたでは、アむコンが出続けおしたうのでたずゲヌムスタヌトずずもにアむコンを隠す凊理を行いたす。 たずは「BP_ThirdPersonCharacter」から「WBP_IconEmote」に接続できるように「Event BeginPlay」から「Cast To WBP_IconEmote」をピンで぀なげたす。 さらにObject属性に察しお、「Get User Widget Object」ノヌドを远加し、タヌゲットを「 Widget Icon Emote」にしたす。 これにより、「BP_ThirdPersonCharacter」から「WBP_IconEmote」に接続できるようになりたした。 次に、アむコンを非衚瀺にするために「Set Visibility」ノヌドを接続し、タヌゲットを「Cast To WBP_IconEmote」の「As WBP Emote」に接続したす。「In Visibility」の倀を「非衚瀺」にするこずで、アむコンを非衚瀺にできたすが、今回は埌述の マルチプレむ 甚に、衚瀺・非衚瀺を叞る倉数を䜜成しおおきたす。 画面巊䞋の倉数欄からプラスを抌し、「var_IconEmoteByte」ずいう倉数を䜜成したす。タむプはByteを遞択し、デフォルト倀を「2」にしたす。 䜜成した「var_IconEmoteByte」を「Set Visibility」に぀なぎたす。 ここで入力した「2」ずいうのは、「In Visibility」の倀の配列番号になり、「非衚瀺」を意味しおいたす。 ここたでで、キャ ラク タヌ頭䞊のアむコンは䞀旊非衚瀺になっおいるはずです。 次にキヌボヌドの「5」を抌した時にアむコンを衚瀺させる凊理の説明を行いたす。 「Press 5」ノヌドを远加し、「Pressed」のピンに察しお、「var_IconEmoteByte」をセットするためのノヌドを远加したす。 倉数の倀を「0」「In Visibility」の倀の配列番号になり、「衚瀺」の意に曞き換える凊理の埌に、先ほど䜜成した「Cast To WBP_IconEmote」の流れを耇補したす。 これにより、キヌボヌドの「5」を抌した時にアむコンを衚瀺させるこずができたす。 しかし、この状態ではただ巊右の画面 マルチプレむダヌ 間での同期は取れおいないので、 次のステップで修正しおいきたす。 4. マルチプレむ 甹 レプリケヌション 蚭定 UEで マルチプレむ を行う際は、ゲヌムサヌバヌがゲヌムクラむアントに察しお、情報をレプリケヌト耇補するこずで、 各クラむアント間プレむダヌ間での差異が生じないようになりたす。 今回䜜った凊理は、ただクラむアントで行われおいるだけの凊理なので、クラむアント間では同期されたせん。 たずは先ほど䜜成した倉数「var_IconEmoteByte」を レプリケヌション する蚭定にしたす。 「var_IconEmoteByte」の詳现画面から レプリケヌション の蚭定を「RepNotify」に蚭定したす。 「RepNotify」ずは、倉数の倀をりォッチしおおり、倉数の倀が倉わった時に埌続の関数「OnRep〜」関数を起動させたす。 倉数を「RepNotify」蚭定にするず、巊偎の関数欄に「OnRep_var_IconEmoteByte」ずいう関数ができたす。 次に、「Cast To WBP_IconEmote」から「Set Visibility」の凊理をコピヌし、「OnRep_var_IconEmoteByte」内で貌り付けたす。 「OnRep_var_IconEmoteByte」内ぞの移動方法は、巊偎の関数欄の「OnRep_var_IconEmoteByte」をダブルクリックするこずで移動ができたす。 貌り付けた凊理を「On Rep Var Icon Emote Byte」ノヌドに繋ぎ、元あった堎所の凊理は消しおしたいたす。 これで、「var_IconEmoteByte」の倀が曞き換わった際に、埌続の凊理をゲヌムサヌバヌからゲヌムクラむアントに同期しおくれるようになりたす。 アむコンを衚瀺させおから2秒埌にアむコンを消す凊理を远加するために、䞋のように「Delay」ノヌドず「var_IconEmoteByte」のセット甚のノヌドを远加したす。非衚瀺にする必芁があるので、「var_IconEmoteByte」の倀は「2」にしたす。 実行するず䞋の動画のようになりたす。 巊偎の画面のプレむダヌの゚モヌトアむコンは右偎の画面に同期されおいるのに察し、右偎の画面の゚モヌトは巊偎に同期されおいないこずがわかりたす。 この挙動はリッスンサヌバヌで怜蚌を行っおいるためのものです。 リッスンサヌバヌでは人のプレむダヌがゲヌムサヌバヌずゲヌムクラむアント䞡方の機胜をもち、 その他のプレむダヌがゲヌムクラむアントだけの機胜を持ちたす。 䞊の動画では巊偎がゲヌムサヌバヌを持っおいるクラむアントで、右偎がゲヌムクラむアントだけの画面になりたす。 UEの レプリケヌション 機胜では、 ゲヌムサヌバヌが情報をレプリケヌト耇補しおゲヌムクラむアントの情報を曞き換え、同期するこずは出来たすが、 ゲヌムクラむアントがゲヌムサヌバヌの情報を曞き換えお同期するこずは出来たせん。 たた、クラむアントがクラむアントの情報を曞き換えお同期するこずも出来たせん。 たずめるず䞋蚘のようになりたす。 ゲヌムサヌバヌでの情報倉曎 → ゲヌムサヌバヌの情報を耇補しお、ゲヌムクラむアントの情報を曞き換えるこずが可胜 ゲヌムクラむアントでの情報倉曎 → ゲヌムクラむアントの情報を耇補しお、ゲヌムサヌバヌの情報を曞き換えるこずは䞍可胜 ゲヌムクラむアントでの情報倉曎 → ゲヌムクラむアントの情報を耇補しお、他のゲヌムクラむアントの情報を曞き換えるこずは䞍可胜 䞊蚘の理由から、巊偎の行動はレプリケヌトされ、右偎の行動はレプリケヌトされない凊理になっおしたっおいるので修正しおいきたす。 たずはカスタムむベントを远加したす。今回は「Press5sync」ずいう名前のむベントにしたした。 「Press5sync」を遞択し、右偎の詳现画面から耇補欄で「サヌバヌで実行」を遞択したす。 次にキヌボヌドの「5」を抌しお起動する凊理を、今䜜った「Press5sync」に繋ぎ盎し、キヌボヌドの「5」の凊理は「Press5sync」を起動させるために぀なぎたす。 これにより、ゲヌムクラむアント偎で行われた凊理も、ゲヌムサヌバヌで実行する圢匏をずるのでゲヌムサヌバヌずゲヌムクラむアント間で同期が取れるようになりたす。 同様の手順で、TextタむプのWidgetBlueprintを远加するこずで、䞋蚘のような゚モヌトを远加するこずもできたす。 以䞊が、 マルチプレむ に察応した゚モヌト機胜を䜜成する手順になりたす。 所感 今回のUE5で マルチプレむ に察応した゚モヌト機胜を䜜成する手順を調査するにあたり、 UE5でのWidgetBlueprintの䜿甚方法や、 マルチプレむ のゲヌムサヌバヌ、ゲヌムクラむアント間の関係性などに詳しくなるこずが出来たした。 マルチプレむ のプロゞェクトを䜜成するにあたり、プレむダヌ間の情報の同期 レプリケヌション は必須事項になるので、今回の基瀎的な知識をもずに、より耇雑な レプリケヌション の方法なども孊習しおいきたす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 https://docs.unrealengine.com/4.26/ja/InteractiveExperiences/Networking/HowTo/DedicatedServers/ https://docs.unrealengine.com/4.27/ja/Resources/ContentExamples/Networking/1_4/ https://qiita.com/Shibash/items/2408b653abe0549abe37 執筆 @okazaki.wataru 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは、ISID 金融゜リュヌション事業郚の岡厎です。 今回はUE5で マルチプレむ に察応した゚モヌト機胜を䜜成する方法をご玹介したす。 ゚モヌト機胜ずは、 マルチプレむ のゲヌムにおいお、各キャ ラク タヌが感情を衚珟する為の機胜です。 䟋えば Fortnite ではキャ ラク タヌに様々な動きやダンスをさせるこずができたす。 はじめに UE5では「ListenServer」ず「DedicatedServer」の2皮類のゲヌムサヌバヌ方匏が䜿甚可胜です。 各サヌバヌに぀いおは、こちらの 金融゜リュヌション事業郚の山䞋さんの蚘事 で玹介されおいるので説明は割愛したす。 今回は怜蚌を簡易にするため「ListenServer」を䜿甚しお マルチプレむ での゚モヌト機胜を䜜成したすが、 「DedicatedServer」でも同じ挙動をする実装方法ずなりたす。 怜蚌環境/ツヌル Unreal Engine5.2.0 AWS EC2 Windows _Server-2022-English-Full-Base-2023.01.19 実装手順 ゚モヌト甚WidgetBlueprintの䜜成 ゚モヌト甚 Widget をCharacterBlueprintに付䞎 CharacterBlueprintの動䜜䜜成 マルチプレむ 甹 レプリケヌション 蚭定 1. ゚モヌト甚WidgetBlueprintの䜜成 今回はThirdPersonテンプレヌトを利甚したプロゞェクトで進めおいきたす。 たず初めに゚モヌト甚 Widget に䜿甚するWidgetBluePrintを䜜成したす。 コンテンツドロワヌより、WidgetBlueprintを遞び「WBP_IconEmote」で䜜成したす。 以前玹介した UE5 PixelStreamingで、マりスカヌ゜ルを別の画像に倉曎しおクリックむベントを䜜成する蚘事 にお、 WidgetBlueprint内に任意の画像を取り蟌む方法があるので、同様に゚モヌトに䜿甚したい画像を取り蟌み「IconEmote」ずいう名前を぀けたした。たた前回同様「 Canvas Panel」を䜜成し、䜍眮を䞭心に倉曎させたす。 今回は別のBlueprintでもこの Widget を呌び出しお䜿う予定なので、詳现タブの䞊郚にある「Is Variable」にチェックを入れおおきたす。 2. ゚モヌト甚 Widget をCharacterBlueprintに付䞎 たずはCharacterBlueprintを開きたす。 ThirdPersonTemplateを䜿甚しお䜜成したプロゞェクトの堎合、 AllContentThirdPersonBlueprints内に「BP_ThirdPersonCharacter」を芋぀けるこずができたす。 「BP_ThirdPersonCharacter」のViewPortを開き、 Widget 甚の コンポヌネント を远加したす。 ViewProt巊䞊郚の远加ボタンを抌しお Widget ず怜玢し、クリックで遞択したす。 巊偎の コンポヌネント 䞀芧に远加されるので、名前を「 Widget _IconEmote」ず倉曎したす。 次に远加した「 Widget _IconEmote」ず、先ほど䜜成した「WBP_IconEmote」を連携させたす。 右偎の ナヌザヌむンタヌフェヌス 内の「 Widget Class」のセレクトボックスで「WBP_IconEmote」を遞択したす。 連携するず䞋蚘画像のように远加した゚モヌト画像がCharacterBlueprintに付䞎されたす。 トランスフォヌム欄から䜍眮や倧きさを動かすこずで、゚モヌト機胜のようになっおきたした。 コンパむル 、保存を行い、レベルのViewPortで確認しおみたす。 キャ ラク タヌの頭䞊にアむコンを出すこずは出来たしたが、キャ ラク タヌが暪を向くずアむコンも暪を向いおしたい画面から芋えなくなっおしたいたした。 解決法ずしお、ViewPortの ナヌザヌむンタヌフェヌス 欄のSpaceのセレクトボックスを「World」から「画面」を遞ぶこずで、キャ ラク タヌがどの向きを向いおも゚モヌトアむコンが芋えるように蚭定できたす。 3. CharacterBlueprintの動䜜䜜成 今回は、キヌボヌドの「5」を抌した時に、2秒間゚モヌトアむコンがキャ ラク タヌの頭䞊に衚瀺されるBlueprintを䜜成したす。 今のたたでは、アむコンが出続けおしたうのでたずゲヌムスタヌトずずもにアむコンを隠す凊理を行いたす。 たずは「BP_ThirdPersonCharacter」から「WBP_IconEmote」に接続できるように「Event BeginPlay」から「Cast To WBP_IconEmote」をピンで぀なげたす。 さらにObject属性に察しお、「Get User Widget Object」ノヌドを远加し、タヌゲットを「 Widget Icon Emote」にしたす。 これにより、「BP_ThirdPersonCharacter」から「WBP_IconEmote」に接続できるようになりたした。 次に、アむコンを非衚瀺にするために「Set Visibility」ノヌドを接続し、タヌゲットを「Cast To WBP_IconEmote」の「As WBP Emote」に接続したす。「In Visibility」の倀を「非衚瀺」にするこずで、アむコンを非衚瀺にできたすが、今回は埌述の マルチプレむ 甚に、衚瀺・非衚瀺を叞る倉数を䜜成しおおきたす。 画面巊䞋の倉数欄からプラスを抌し、「var_IconEmoteByte」ずいう倉数を䜜成したす。タむプはByteを遞択し、デフォルト倀を「2」にしたす。 䜜成した「var_IconEmoteByte」を「Set Visibility」に぀なぎたす。 ここで入力した「2」ずいうのは、「In Visibility」の倀の配列番号になり、「非衚瀺」を意味しおいたす。 ここたでで、キャ ラク タヌ頭䞊のアむコンは䞀旊非衚瀺になっおいるはずです。 次にキヌボヌドの「5」を抌した時にアむコンを衚瀺させる凊理の説明を行いたす。 「Press 5」ノヌドを远加し、「Pressed」のピンに察しお、「var_IconEmoteByte」をセットするためのノヌドを远加したす。 倉数の倀を「0」「In Visibility」の倀の配列番号になり、「衚瀺」の意に曞き換える凊理の埌に、先ほど䜜成した「Cast To WBP_IconEmote」の流れを耇補したす。 これにより、キヌボヌドの「5」を抌した時にアむコンを衚瀺させるこずができたす。 しかし、この状態ではただ巊右の画面 マルチプレむダヌ 間での同期は取れおいないので、 次のステップで修正しおいきたす。 4. マルチプレむ 甹 レプリケヌション 蚭定 UEで マルチプレむ を行う際は、ゲヌムサヌバヌがゲヌムクラむアントに察しお、情報をレプリケヌト耇補するこずで、 各クラむアント間プレむダヌ間での差異が生じないようになりたす。 今回䜜った凊理は、ただクラむアントで行われおいるだけの凊理なので、クラむアント間では同期されたせん。 たずは先ほど䜜成した倉数「var_IconEmoteByte」を レプリケヌション する蚭定にしたす。 「var_IconEmoteByte」の詳现画面から レプリケヌション の蚭定を「RepNotify」に蚭定したす。 「RepNotify」ずは、倉数の倀をりォッチしおおり、倉数の倀が倉わった時に埌続の関数「OnRep〜」関数を起動させたす。 倉数を「RepNotify」蚭定にするず、巊偎の関数欄に「OnRep_var_IconEmoteByte」ずいう関数ができたす。 次に、「Cast To WBP_IconEmote」から「Set Visibility」の凊理をコピヌし、「OnRep_var_IconEmoteByte」内で貌り付けたす。 「OnRep_var_IconEmoteByte」内ぞの移動方法は、巊偎の関数欄の「OnRep_var_IconEmoteByte」をダブルクリックするこずで移動ができたす。 貌り付けた凊理を「On Rep Var Icon Emote Byte」ノヌドに繋ぎ、元あった堎所の凊理は消しおしたいたす。 これで、「var_IconEmoteByte」の倀が曞き換わった際に、埌続の凊理をゲヌムサヌバヌからゲヌムクラむアントに同期しおくれるようになりたす。 アむコンを衚瀺させおから2秒埌にアむコンを消す凊理を远加するために、䞋のように「Delay」ノヌドず「var_IconEmoteByte」のセット甚のノヌドを远加したす。非衚瀺にする必芁があるので、「var_IconEmoteByte」の倀は「2」にしたす。 実行するず䞋の動画のようになりたす。 巊偎の画面のプレむダヌの゚モヌトアむコンは右偎の画面に同期されおいるのに察し、右偎の画面の゚モヌトは巊偎に同期されおいないこずがわかりたす。 この挙動はリッスンサヌバヌで怜蚌を行っおいるためのものです。 リッスンサヌバヌでは人のプレむダヌがゲヌムサヌバヌずゲヌムクラむアント䞡方の機胜をもち、 その他のプレむダヌがゲヌムクラむアントだけの機胜を持ちたす。 䞊の動画では巊偎がゲヌムサヌバヌを持っおいるクラむアントで、右偎がゲヌムクラむアントだけの画面になりたす。 UEの レプリケヌション 機胜では、 ゲヌムサヌバヌが情報をレプリケヌト耇補しおゲヌムクラむアントの情報を曞き換え、同期するこずは出来たすが、 ゲヌムクラむアントがゲヌムサヌバヌの情報を曞き換えお同期するこずは出来たせん。 たた、クラむアントがクラむアントの情報を曞き換えお同期するこずも出来たせん。 たずめるず䞋蚘のようになりたす。 ゲヌムサヌバヌでの情報倉曎 → ゲヌムサヌバヌの情報を耇補しお、ゲヌムクラむアントの情報を曞き換えるこずが可胜 ゲヌムクラむアントでの情報倉曎 → ゲヌムクラむアントの情報を耇補しお、ゲヌムサヌバヌの情報を曞き換えるこずは䞍可胜 ゲヌムクラむアントでの情報倉曎 → ゲヌムクラむアントの情報を耇補しお、他のゲヌムクラむアントの情報を曞き換えるこずは䞍可胜 䞊蚘の理由から、巊偎の行動はレプリケヌトされ、右偎の行動はレプリケヌトされない凊理になっおしたっおいるので修正しおいきたす。 たずはカスタムむベントを远加したす。今回は「Press5sync」ずいう名前のむベントにしたした。 「Press5sync」を遞択し、右偎の詳现画面から耇補欄で「サヌバヌで実行」を遞択したす。 次にキヌボヌドの「5」を抌しお起動する凊理を、今䜜った「Press5sync」に繋ぎ盎し、キヌボヌドの「5」の凊理は「Press5sync」を起動させるために぀なぎたす。 これにより、ゲヌムクラむアント偎で行われた凊理も、ゲヌムサヌバヌで実行する圢匏をずるのでゲヌムサヌバヌずゲヌムクラむアント間で同期が取れるようになりたす。 同様の手順で、TextタむプのWidgetBlueprintを远加するこずで、䞋蚘のような゚モヌトを远加するこずもできたす。 以䞊が、 マルチプレむ に察応した゚モヌト機胜を䜜成する手順になりたす。 所感 今回のUE5で マルチプレむ に察応した゚モヌト機胜を䜜成する手順を調査するにあたり、 UE5でのWidgetBlueprintの䜿甚方法や、 マルチプレむ のゲヌムサヌバヌ、ゲヌムクラむアント間の関係性などに詳しくなるこずが出来たした。 マルチプレむ のプロゞェクトを䜜成するにあたり、プレむダヌ間の情報の同期 レプリケヌション は必須事項になるので、今回の基瀎的な知識をもずに、より耇雑な レプリケヌション の方法なども孊習しおいきたす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 https://docs.unrealengine.com/4.26/ja/InteractiveExperiences/Networking/HowTo/DedicatedServers/ https://docs.unrealengine.com/4.27/ja/Resources/ContentExamples/Networking/1_4/ https://qiita.com/Shibash/items/2408b653abe0549abe37 執筆 @okazaki.wataru 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
皆さんこんにちはISID新卒入瀟7幎目の池内です。珟圚はEIT事業郚 ゚ンタヌプラむズ IT事業郚に所属しおおり、ISIDの自瀟開発補品である「BusinessSPECTRE」ビゞネ ススペ クトル、「VisAP」ノィス゚ヌピヌの提案、導入を担圓しおいたす。 このブログを通じ、私の仕事内容や1日の流れ、たたISIDに少しでも興味を持っおもらえる就掻生にずっお圹立぀情報を発信できればず思っおいたす 1. 自己玹介 それでは早速、簡単に自己玹介させおください。 倧孊、倧孊院を卒業し、2017幎に新入瀟員ずしおISIDぞ入瀟したした。倧孊圚孊䞭は、特に情報系プログラムずかの授業をなるべく避けおきたしたので、IT リテラシヌ はほが0。倧孊、倧孊院では 統蚈孊 を専攻しおいたした。 圓時、補薬䌚瀟のデヌタサむ゚ンティストを志望し、就掻に励んでいたしたが、残念ながらどの䌚瀟からも最終面接ぞのチケットをもらえず。やっぱり薬孊郚に進孊しないずだめなのかなずか、自分っお将来どこで䜕しお働くんだろうずか、色々考えながら日々を過ごしおいたずころ、ISIDに出䌚うこずができ入瀟するこずを決めたした。 入瀟埌の配属先ずしおは、䞻に顧客の基幹システム䌚蚈、販売、圚庫など、顧客の心臓ずなるシステム呚りのお仕事をしおいる郚眲に配属されるこずになりたした。 幎床ごずに組織倉曎があり、郚眲名が倉わっおばかりですが、仕事内容は倉わらず基幹システムの呚蟺領域BIやDWHずも呌ばれるの゜リュヌションを提案したり導入したりしおいたす。 ※ISIDの自瀟開発補品「BusinessSPECTRE」ビゞネ ススペ クトル、「VisAP」ノィス゚ヌピヌに぀いおは、こちらのサむト https://erp.isid.co.jp/solution/sap-bi-businessspectre/ に掲茉されおいたすので興味のある方は是非 2. 就掻生の皆さんが気になるであろう質問に淡々ず答えたす Q1. どんなお仕事 A1. ISIDの自瀟開発補品「BusinessSPECTRE」、「VisAP」の提案や導入掻動をしおいたす。ドむツ補の基幹システム「SAP」を導入しおいるお客様をタヌゲットに、日々の業務デヌタを蓄積→分析→可芖化するようなシステムを提案しおいたす。 Q2. どんな職堎環境 A2. 䞊叞や先茩ずは、よくコミュニケヌションを取りたす。最近ではテレワヌクのため、瀟内打合せやチャットでのやり取りが䞻流ですが、仕事のこずはもちろんプラむベヌトなこずでも気兌ねなく話できるメンバヌばかりの環境だなず感じおいたす。同期ずもたたに連絡を取り合いたす。同期は宝物です。 Q3. 教育制床は A3. 入瀟埌は新人教育のカリキュラムが組たれおいるため、それに則っお教育を受けるこずができたす。ITに関する研修や、瀟䌚人ずしおのマナヌ研修など内容は様々で、どれもISIDで働いおいく䞊で必芁な知識です。配属埌は瀟内研修制床を通じお専門分野に぀いお知識習埗する機䌚がありたす。半幎に䞀床申し蟌むこずができ、実務をこなしながら自身の スキルアップ を図るこずもできるので、有効掻甚しおいたす Q4. 働いおいおやりがいを感じるずきは A4. 䞀番はお客様から感謝されるずきや案件が無事完了したずきですが、幎次が䞊がるず責任感も増したすし、䞊叞や先茩からの期埅も倧きくなりたす。そういった期埅に応えられたずきや、励たしの蚀葉をもらったずきにやりがいを感じるこずが倚いです。 Q5. 入瀟前にすべきこずはありたすか A5. 働く䞊で必芁なこずは入瀟しおから孊べるので、特にやっおおくべきこずはないです。逆に働いおから長期䌑暇を取りづらくなる䌑暇は取れるけど色々調敎するのが面倒ので、海倖旅行に行くずか、日ごろすぐにはできないこずにチャレンゞするこずをオススメしたす Q6. テレワヌクでの難しさは A6. 出瀟時に比べお瀟内メンバヌやお客様ずの雑談が極端に枛ったように感じたす。察面時は気にするこずなくできおいた雑談も、Web䌚議越しでは衚情が芋えないこずで雑談しづらい気持ちになるのが正盎なずころです。お客様ずのコミュニケヌションでは雑談っお結構倧事なので、そのあたりのバランスが難しいですね。 Q7. ISIDに入っお良かったこずは悪かったこずは A7. 良かったこずは、䜕よりISIDの「人柄」です。本圓にみんなナヌモアがあっお、やさしさがあっお、それでいお頭が切れお面癜くお仕事だけではなく、プラむベヌトでも䞀緒に過ごしたいず思えるメンバヌばかりです。悪かったこずは1぀もありたせん本圓ですよ笑 Q8. ISIDに入瀟する人の共通点は A8. あくたで個人的な意芋ですが、、、 自分を持っおいお、自分らしさを盞手に䌝えるこずができる 色んなこずに興味を持っおいる すぐにチャレンゞしたがる Q9. どんな埌茩が欲しいですか A9. 䜕事にもチャレンゞしおくれる、手を挙げおくれる埌茩は倧歓迎です。䜕事もやっおみないずわからない、ず思うので、垞に前向きにトラむしおくれる埌茩が入っおきおくれるこずを願っおいたす Q10 . 1日の流れは Q10 . こんな感じです。 3. 最埌に ISIDで䞀緒に働きたしょう私の所属する郚は、新卒入瀟ず䞭途入瀟の瀟員が半々くらいです。 男女比は男女82くらいでしょうか。 本蚘事でご玹介した内容や働きに぀いお、たた基幹システム呚蟺分野のシステム導入業務にご興味をお持ちの方は、ぜひ採甚ペヌゞよりご応募ください 私たちは䞀緒に働いおくれる仲間を募集しおいたす ISID 募集職皮䞀芧 執筆 @ikeuchi.keisuke 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
皆さんこんにちはISID新卒入瀟7幎目の池内です。珟圚はEIT事業郚 ゚ンタヌプラむズ IT事業郚に所属しおおり、ISIDの自瀟開発補品である「BusinessSPECTRE」ビゞネ ススペ クトル、「VisAP」ノィス゚ヌピヌの提案、導入を担圓しおいたす。 このブログを通じ、私の仕事内容や1日の流れ、たたISIDに少しでも興味を持っおもらえる就掻生にずっお圹立぀情報を発信できればず思っおいたす 1. 自己玹介 それでは早速、簡単に自己玹介させおください。 倧孊、倧孊院を卒業し、2017幎に新入瀟員ずしおISIDぞ入瀟したした。倧孊圚孊䞭は、特に情報系プログラムずかの授業をなるべく避けおきたしたので、IT リテラシヌ はほが0。倧孊、倧孊院では 統蚈孊 を専攻しおいたした。 圓時、補薬䌚瀟のデヌタサむ゚ンティストを志望し、就掻に励んでいたしたが、残念ながらどの䌚瀟からも最終面接ぞのチケットをもらえず。やっぱり薬孊郚に進孊しないずだめなのかなずか、自分っお将来どこで䜕しお働くんだろうずか、色々考えながら日々を過ごしおいたずころ、ISIDに出䌚うこずができ入瀟するこずを決めたした。 入瀟埌の配属先ずしおは、䞻に顧客の基幹システム䌚蚈、販売、圚庫など、顧客の心臓ずなるシステム呚りのお仕事をしおいる郚眲に配属されるこずになりたした。 幎床ごずに組織倉曎があり、郚眲名が倉わっおばかりですが、仕事内容は倉わらず基幹システムの呚蟺領域BIやDWHずも呌ばれるの゜リュヌションを提案したり導入したりしおいたす。 ※ISIDの自瀟開発補品「BusinessSPECTRE」ビゞネ ススペ クトル、「VisAP」ノィス゚ヌピヌに぀いおは、こちらのサむト https://erp.isid.co.jp/solution/sap-bi-businessspectre/ に掲茉されおいたすので興味のある方は是非 2. 就掻生の皆さんが気になるであろう質問に淡々ず答えたす Q1. どんなお仕事 A1. ISIDの自瀟開発補品「BusinessSPECTRE」、「VisAP」の提案や導入掻動をしおいたす。ドむツ補の基幹システム「SAP」を導入しおいるお客様をタヌゲットに、日々の業務デヌタを蓄積→分析→可芖化するようなシステムを提案しおいたす。 Q2. どんな職堎環境 A2. 䞊叞や先茩ずは、よくコミュニケヌションを取りたす。最近ではテレワヌクのため、瀟内打合せやチャットでのやり取りが䞻流ですが、仕事のこずはもちろんプラむベヌトなこずでも気兌ねなく話できるメンバヌばかりの環境だなず感じおいたす。同期ずもたたに連絡を取り合いたす。同期は宝物です。 Q3. 教育制床は A3. 入瀟埌は新人教育のカリキュラムが組たれおいるため、それに則っお教育を受けるこずができたす。ITに関する研修や、瀟䌚人ずしおのマナヌ研修など内容は様々で、どれもISIDで働いおいく䞊で必芁な知識です。配属埌は瀟内研修制床を通じお専門分野に぀いお知識習埗する機䌚がありたす。半幎に䞀床申し蟌むこずができ、実務をこなしながら自身の スキルアップ を図るこずもできるので、有効掻甚しおいたす Q4. 働いおいおやりがいを感じるずきは A4. 䞀番はお客様から感謝されるずきや案件が無事完了したずきですが、幎次が䞊がるず責任感も増したすし、䞊叞や先茩からの期埅も倧きくなりたす。そういった期埅に応えられたずきや、励たしの蚀葉をもらったずきにやりがいを感じるこずが倚いです。 Q5. 入瀟前にすべきこずはありたすか A5. 働く䞊で必芁なこずは入瀟しおから孊べるので、特にやっおおくべきこずはないです。逆に働いおから長期䌑暇を取りづらくなる䌑暇は取れるけど色々調敎するのが面倒ので、海倖旅行に行くずか、日ごろすぐにはできないこずにチャレンゞするこずをオススメしたす Q6. テレワヌクでの難しさは A6. 出瀟時に比べお瀟内メンバヌやお客様ずの雑談が極端に枛ったように感じたす。察面時は気にするこずなくできおいた雑談も、Web䌚議越しでは衚情が芋えないこずで雑談しづらい気持ちになるのが正盎なずころです。お客様ずのコミュニケヌションでは雑談っお結構倧事なので、そのあたりのバランスが難しいですね。 Q7. ISIDに入っお良かったこずは悪かったこずは A7. 良かったこずは、䜕よりISIDの「人柄」です。本圓にみんなナヌモアがあっお、やさしさがあっお、それでいお頭が切れお面癜くお仕事だけではなく、プラむベヌトでも䞀緒に過ごしたいず思えるメンバヌばかりです。悪かったこずは1぀もありたせん本圓ですよ笑 Q8. ISIDに入瀟する人の共通点は A8. あくたで個人的な意芋ですが、、、 自分を持っおいお、自分らしさを盞手に䌝えるこずができる 色んなこずに興味を持っおいる すぐにチャレンゞしたがる Q9. どんな埌茩が欲しいですか A9. 䜕事にもチャレンゞしおくれる、手を挙げおくれる埌茩は倧歓迎です。䜕事もやっおみないずわからない、ず思うので、垞に前向きにトラむしおくれる埌茩が入っおきおくれるこずを願っおいたす Q10 . 1日の流れは Q10 . こんな感じです。 3. 最埌に ISIDで䞀緒に働きたしょう私の所属する郚は、新卒入瀟ず䞭途入瀟の瀟員が半々くらいです。 男女比は男女82くらいでしょうか。 本蚘事でご玹介した内容や働きに぀いお、たた基幹システム呚蟺分野のシステム導入業務にご興味をお持ちの方は、ぜひ採甚ペヌゞよりご応募ください 私たちは䞀緒に働いおくれる仲間を募集しおいたす ISID 募集職皮䞀芧 執筆 @ikeuchi.keisuke 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS Security Hubの コントロヌル には、「倉曎によっおトリガヌされるチェック」ず「定期的なチェック」がありたす。 それぞれのチェックスケゞュヌルに぀いおは こちら に蚘茉があり、「定期的なチェック」は次のように曞かれおいたす。 定期的なチェックは、最埌の実行から 12 時間たたは 24 時間以内に自動的に実行されたす。呚期は Security Hub によっお決定され、倉曎はできたせん。定期的なコン トロヌル は、実行時の評䟡をキャプチャしたす。 すなわち、リ゜ヌス䜜成・倉曎埌にすぐにチェックが行われない堎合があり、最倧で24時間埅たなければなりたせん。コン トロヌル の動きを調査をするずきなどに䞍䟿だず感じおいたしたが、「定期的なチェック」に察しおもすぐに実行する方法を芋぀けたのでご玹介したす。 定期的なチェックをすぐに実行する方法 1. コントロヌルに察応する Config ルヌルを特定する 2. AWS Config コン゜ヌルでルヌルを芋぀ける 3. 「アクション」>「再評䟡」を実行する コマンドラむンでチェックをすぐに実行する方法 定期的なチェックをすぐに実行する方法 1. コン トロヌル に察応する Config ルヌルを特定する Security Hubのセキュリティチェックは AWS Config ルヌルを利甚しおおり、ドキュメントにはそれぞれのコン トロヌル が利甚しおいる Config ルヌルが蚘茉されおいたす。 たずは AWS の公匏ドキュメントから、すぐにチェックを実行したいコン トロヌル の Config ルヌルを特定したしょう。 https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-controls-reference.html 2. AWS Config コン゜ヌルでルヌルを芋぀ける AWS Configのコン゜ヌルにお、該圓するルヌルを芋぀けたす。ルヌルによっおは名前が少し異なる堎合があるようです。 3. 「アクション」>「再評䟡」を実行する ルヌル右䞊の「アクション」>「再評䟡」をクリックするず、すぐにチェックを再実行しおくれたす。 しばらくしおリロヌドするず、最埌に評䟡した日時ずルヌルに非準拠なリ゜ヌスが曎新されたした。 Security Hubのコン゜ヌルでも、すぐにチェックの結果が反映されおいたした。 コマンドラむン でチェックをすぐに実行する方法 ルヌル名を特定した埌の「再評䟡」操䜜は、 コマンドラむン の start-config-rules-evaluation コマンド で実行するこずもできたす。 aws configservice start-config-rules-evaluation --config-rule-name <ルヌル名> 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo 、レビュヌ @yamada.y  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS Security Hubの コントロヌル には、「倉曎によっおトリガヌされるチェック」ず「定期的なチェック」がありたす。 それぞれのチェックスケゞュヌルに぀いおは こちら に蚘茉があり、「定期的なチェック」は次のように曞かれおいたす。 定期的なチェックは、最埌の実行から 12 時間たたは 24 時間以内に自動的に実行されたす。呚期は Security Hub によっお決定され、倉曎はできたせん。定期的なコン トロヌル は、実行時の評䟡をキャプチャしたす。 すなわち、リ゜ヌス䜜成・倉曎埌にすぐにチェックが行われない堎合があり、最倧で24時間埅たなければなりたせん。コン トロヌル の動きを調査をするずきなどに䞍䟿だず感じおいたしたが、「定期的なチェック」に察しおもすぐに実行する方法を芋぀けたのでご玹介したす。 定期的なチェックをすぐに実行する方法 1. コントロヌルに察応する Config ルヌルを特定する 2. AWS Config コン゜ヌルでルヌルを芋぀ける 3. 「アクション」>「再評䟡」を実行する コマンドラむンでチェックをすぐに実行する方法 定期的なチェックをすぐに実行する方法 1. コン トロヌル に察応する Config ルヌルを特定する Security Hubのセキュリティチェックは AWS Config ルヌルを利甚しおおり、ドキュメントにはそれぞれのコン トロヌル が利甚しおいる Config ルヌルが蚘茉されおいたす。 たずは AWS の公匏ドキュメントから、すぐにチェックを実行したいコン トロヌル の Config ルヌルを特定したしょう。 https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-controls-reference.html 2. AWS Config コン゜ヌルでルヌルを芋぀ける AWS Configのコン゜ヌルにお、該圓するルヌルを芋぀けたす。ルヌルによっおは名前が少し異なる堎合があるようです。 3. 「アクション」>「再評䟡」を実行する ルヌル右䞊の「アクション」>「再評䟡」をクリックするず、すぐにチェックを再実行しおくれたす。 しばらくしおリロヌドするず、最埌に評䟡した日時ずルヌルに非準拠なリ゜ヌスが曎新されたした。 Security Hubのコン゜ヌルでも、すぐにチェックの結果が反映されおいたした。 コマンドラむン でチェックをすぐに実行する方法 ルヌル名を特定した埌の「再評䟡」操䜜は、 コマンドラむン の start-config-rules-evaluation コマンド で実行するこずもできたす。 aws configservice start-config-rules-evaluation --config-rule-name <ルヌル名> 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo 、レビュヌ @yamada.y  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 IAM の Permissions Boundaryアクセス蚱可境界 に぀いおやもやしおいたした。効果はわかるものの、どうしお IAM ポリシヌだけではダメで Permissions Boundary が必芁なのかよくわかりたせんでした。この蚘事では IAM のポリシヌドキュメントず API の仕様から、 Permissions Boundary が導入された本質的な理由を考えおみたす。 結論から先に述べるず、Permissions Boundary を䜿うこずで特定の暩限を超えお IAM ナヌザヌ/ロヌルが䜜成されるのを防ぐ効果があり、これは IAM ポリシヌだけでは実珟できたせん。Permissions Boundary は、特定のナヌザヌが IAM ナヌザヌ/ロヌルを䜜成するのを蚱可し぀぀、暩限昇栌を防止する目的などに䜿甚できたす。 暩限昇栌の䟋 Permissions Boundary ずは 暩限昇栌を防ぐ䟋 本質1: IAM ポリシヌドキュメントに iam:PermissionsBoundary 条件キヌが䜿える 本質2: Permissions Boundary は CreateUser / CreateRole 時に远加できる さいごに 暩限昇栌の䟋 たずは IAM の暩限昇栌を簡単な䟋で芋おみたす。 以䞋の IAM ポリシヌを持぀ IAM ナヌザヌがあるずしたす。 iam:CreateRole IAM ロヌルを䜜成する暩限 ず iam:PutRolePolicy IAM ロヌルにむンラむンポリシヌを远加する暩限、さらには sts:AssumeRole が蚱可されおいたす。他の暩限に぀いおは省略したす。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " iam:CreateRole ", " iam:PutRolePolicy " ] , " Resource ": " * " } , { " Effect ": " Allow ", " Action ": [ " sts:AssumeRole " ] , " Resource ": " * " } ] } iam:CreateRole が蚱可されおいるので、以䞋の信頌ポリシヌを持぀ IAM ロヌルを䜜るこずができたす。同じアカりント内の プリンシパル であれば、 AssumeRole を蚱可 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Principal ": { " AWS ": " arn:aws:iam::000000000000:root " } , " Action ": " sts:AssumeRole " } ] } 先の IAM ナヌザヌは iam:PutRolePolicy が蚱可されおいるので、䜜ったロヌルに任意のむンラむンポリシヌを远加できたす。䟋えば以䞋のような党おを蚱可するポリシヌを゚ラヌなく远加できたす。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": " * ", " Resource ": " * " } ] } 先の IAM ナヌザヌは sts:AssumeRole が蚱可されおいるので、䜜ったロヌルを AssumeRole し、アクセスキヌID、シヌクレットアクセスキヌ、セッション トヌク ンを獲埗するこずで、党おの操䜜が蚱可される暩限を手に入れるこずができたす。元のナヌザヌにはできなかった操䜜ができるようになるので、暩限昇栌されおいたす。 以䞊の䟋は「IAM ナヌザヌ」が「IAM ロヌルを経由しお」暩限昇栌する䟋でしたが、暩限昇栌する䞻䜓が「IAM ロヌル」の堎合や、「IAM ナヌザヌを経由しお」暩限昇栌する堎合もありたす。 Permissions Boundary ずは Permissions Boundary の実態は IAM 管理ポリシヌです。他の IAM 管理ポリシヌず同じように䜜成したす。 䞀぀の IAM ナヌザヌ/ロヌルには最倧で1぀の IAM 管理ポリシヌを、 Permissions Boundary ずしお远加できたす。たた、Permissions Boundary にむンラむンポリシヌを指定するこずはできたせん。 IAM ナヌザヌ/ロヌルに Permissions Boundary が远加されおいる堎合、そのナヌザヌ/ロヌルに蚱可される暩限は「 アむデンティティ ベヌスのポリシヌ」ず「Permissions Boundary」の AND 条件になりたす。Permissions Boundary で明瀺的に蚱可されおいない暩限は、 アむデンティティ ベヌスのポリシヌで蚱可されおいおも最終的にナヌザヌ/ロヌルには蚱可されたせん。  https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_boundaries.html より 暩限昇栌を防ぐ䟋 Permissions Boundary を䜿うこずで、どのように暩限昇栌を防ぐこずができるのか芋おみたす。 以䞋の IAM 管理ポリシヌを my-permissions-boundary ずいう名前で䜜成したす。 iam:CreateRole iam:PutRolePolicy sts:AssumeRole の3぀の暩限しか蚱可しおいたせん。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " iam:CreateRole ", " iam:PutRolePolicy ", " sts:AssumeRole " ] , " Resource ": " * " } ] } 察象の IAM ナヌザヌに䜜成した my-permissions-boundary を Permissions Boundary ずしお远加したす。 察象の IAM ナヌザヌのポリシヌを以䞋のように倉曎したす。 Condition 句を远加し、Permissions Boundary ずしお my-permissions-boudary が指定された堎合のみ iam:CreateRole iam:PutRolePolicy できるようにしおいたす。この䟋では自身のポリシヌを倉曎する暩限を持っおいないこずもポむントです。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " iam:CreateRole ", " iam:PutRolePolicy " ] , " Resource ": " * ", " Condition ": { " StringEquals ": { " iam:PermissionsBoundary ": " arn:aws:iam::000000000000:policy/my-permissions-boudary " } } } , { " Effect ": " Allow ", " Action ": [ " sts:AssumeRole " ] , " Resource ": " * " } ] } 以䞊が準備段階で、この状態で IAM ロヌルを経由しお暩限昇栌を詊みおも次のような結果になりたす。 my-permissions-boudary を付䞎しないず、IAM ロヌルを䜜るこずに倱敗したす。 my-permissions-boudary を付䞎すれば、IAM ロヌルを䜜成できたす。 Admin 暩限盞圓のむンラむンポリシヌを䜜成した IAM ロヌルに぀け、AssumeRole をするこずはできたすが、Permissions Boundary で明瀺的に蚱可された以䞊の暩限を持ちたせん。 以䞊はよくある Permissions Boundary の説明でした。このように暩限昇栌の防止を実珟できるのは、2぀の仕様䞊の本質があるためだず考えおいたす。 本質1: IAM ポリシヌドキュメントに iam:PermissionsBoundary 条件キヌが䜿える 暩限昇栌を防ぎたい IAM ナヌザヌ/ロヌルのポリシヌに iam:PermissionsBoundary 条件キヌが䜿える のが第䞀のポむントです。これによっお、Permissions Boundary に特定のポリシヌが存圚する堎合に限っお特定の操䜜を蚱す、ずいった曞き方ができるようになりたした。 " Condition ": { " StringEquals ": { " iam:PermissionsBoundary ": " arn:aws:iam::000000000000:policy/my-permissions-boudary " } } 本質2: Permissions Boundary は CreateUser / CreateRole 時に远加できる こちらはより重芁です。 CreateUser ず CreateRole の API 仕様を確認するず、これらの API を呌びだす時のパラメヌタで Permissions Boundary を远加できるこずがわかりたす。 䞀方で、通垞のポリシヌに぀いおは CreateUser ず CreateRole の呌び出し時に远加するこずはできず、埌から AttachUserPolicy 、 PutUserPolicy 、 AttachRolePolicy 、 PutRolePolicy など別 API で付䞎しなければなりたせん。すなわち、 IAM ナヌザヌ/ロヌルを䜜成した瞬間にはポリシヌが䜕も぀いおいない状態にどうしおもなっおしたい 、最初から特定の IAM ポリシヌを持぀ように制限できたせん。Permissions Boundary であれば䜜成ず同時に付䞎できるので、 iam:PermissionsBoundary 条件キヌず䜵甚するこずで特定の Permissions Boundary を持぀堎合に限っお ナヌザヌ/ロヌルの䜜成を蚱可する、ずいった曞き方ができたす。 掚枬ですが、䜜成時からポリシヌを付䞎できるように埓来の CreateUser / CreateRole の API 仕様を倉曎するよりも、新しく Permissions Boundary ずいう機胜を远加した方が望たしいず刀断したのではないかず思いたす。 さいごに 理解しおいおも IAM の暩限は耇雑で、Permissions Boundary を䜿いこなすのは慎重な蚭定が必芁な印象です。 公匏ドキュメントの䟋 にも目を通すず、さらに理解の助けになるのではないかず思いたす。 お読みいただいおありがずうございたした。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 IAM の Permissions Boundaryアクセス蚱可境界 に぀いおもやもやしおいたした。効果はわかるものの、どうしお IAM ポリシヌだけではダメで Permissions Boundary が必芁なのかよくわかりたせんでした。この蚘事では IAM のポリシヌドキュメントず API の仕様から、 Permissions Boundary が導入された本質的な理由を考えおみたす。 結論から先に述べるず、Permissions Boundary を䜿うこずで特定の暩限を超えお IAM ナヌザヌ/ロヌルが䜜成されるのを防ぐ効果があり、これは IAM ポリシヌだけでは実珟できたせん。Permissions Boundary は、特定のナヌザヌが IAM ナヌザヌ/ロヌルを䜜成するのを蚱可し぀぀、暩限昇栌を防止する目的などに䜿甚できたす。 暩限昇栌の䟋 Permissions Boundary ずは 暩限昇栌を防ぐ䟋 本質1: IAM ポリシヌドキュメントに iam:PermissionsBoundary 条件キヌが䜿える 本質2: Permissions Boundary は CreateUser / CreateRole 時に远加できる さいごに 暩限昇栌の䟋 たずは IAM の暩限昇栌を簡単な䟋で芋おみたす。 以䞋の IAM ポリシヌを持぀ IAM ナヌザヌがあるずしたす。 iam:CreateRole IAM ロヌルを䜜成する暩限 ず iam:PutRolePolicy IAM ロヌルにむンラむンポリシヌを远加する暩限、さらには sts:AssumeRole が蚱可されおいたす。他の暩限に぀いおは省略したす。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " iam:CreateRole ", " iam:PutRolePolicy " ] , " Resource ": " * " } , { " Effect ": " Allow ", " Action ": [ " sts:AssumeRole " ] , " Resource ": " * " } ] } iam:CreateRole が蚱可されおいるので、以䞋の信頌ポリシヌを持぀ IAM ロヌルを䜜るこずができたす。同じアカりント内の プリンシパル であれば、 AssumeRole を蚱可 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Principal ": { " AWS ": " arn:aws:iam::000000000000:root " } , " Action ": " sts:AssumeRole " } ] } 先の IAM ナヌザヌは iam:PutRolePolicy が蚱可されおいるので、䜜ったロヌルに任意のむンラむンポリシヌを远加できたす。䟋えば以䞋のような党おを蚱可するポリシヌを゚ラヌなく远加できたす。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": " * ", " Resource ": " * " } ] } 先の IAM ナヌザヌは sts:AssumeRole が蚱可されおいるので、䜜ったロヌルを AssumeRole し、アクセスキヌID、シヌクレットアクセスキヌ、セッション トヌク ンを獲埗するこずで、党おの操䜜が蚱可される暩限を手に入れるこずができたす。元のナヌザヌにはできなかった操䜜ができるようになるので、暩限昇栌されおいたす。 以䞊の䟋は「IAM ナヌザヌ」が「IAM ロヌルを経由しお」暩限昇栌する䟋でしたが、暩限昇栌する䞻䜓が「IAM ロヌル」の堎合や、「IAM ナヌザヌを経由しお」暩限昇栌する堎合もありたす。 Permissions Boundary ずは Permissions Boundary の実態は IAM 管理ポリシヌです。他の IAM 管理ポリシヌず同じように䜜成したす。 䞀぀の IAM ナヌザヌ/ロヌルには最倧で1぀の IAM 管理ポリシヌを、 Permissions Boundary ずしお远加できたす。たた、Permissions Boundary にむンラむンポリシヌを指定するこずはできたせん。 IAM ナヌザヌ/ロヌルに Permissions Boundary が远加されおいる堎合、そのナヌザヌ/ロヌルに蚱可される暩限は「 アむデンティティ ベヌスのポリシヌ」ず「Permissions Boundary」の AND 条件になりたす。Permissions Boundary で明瀺的に蚱可されおいない暩限は、 アむデンティティ ベヌスのポリシヌで蚱可されおいおも最終的にナヌザヌ/ロヌルには蚱可されたせん。  https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_boundaries.html より 暩限昇栌を防ぐ䟋 Permissions Boundary を䜿うこずで、どのように暩限昇栌を防ぐこずができるのか芋おみたす。 以䞋の IAM 管理ポリシヌを my-permissions-boundary ずいう名前で䜜成したす。 iam:CreateRole iam:PutRolePolicy sts:AssumeRole の3぀の暩限しか蚱可しおいたせん。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " iam:CreateRole ", " iam:PutRolePolicy ", " sts:AssumeRole " ] , " Resource ": " * " } ] } 察象の IAM ナヌザヌに䜜成した my-permissions-boundary を Permissions Boundary ずしお远加したす。 察象の IAM ナヌザヌのポリシヌを以䞋のように倉曎したす。 Condition 句を远加し、Permissions Boundary ずしお my-permissions-boudary が指定された堎合のみ iam:CreateRole iam:PutRolePolicy できるようにしおいたす。この䟋では自身のポリシヌを倉曎する暩限を持っおいないこずもポむントです。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " iam:CreateRole ", " iam:PutRolePolicy " ] , " Resource ": " * ", " Condition ": { " StringEquals ": { " iam:PermissionsBoundary ": " arn:aws:iam::000000000000:policy/my-permissions-boudary " } } } , { " Effect ": " Allow ", " Action ": [ " sts:AssumeRole " ] , " Resource ": " * " } ] } 以䞊が準備段階で、この状態で IAM ロヌルを経由しお暩限昇栌を詊みおも次のような結果になりたす。 my-permissions-boudary を付䞎しないず、IAM ロヌルを䜜るこずに倱敗したす。 my-permissions-boudary を付䞎すれば、IAM ロヌルを䜜成できたす。 Admin 暩限盞圓のむンラむンポリシヌを䜜成した IAM ロヌルに぀け、AssumeRole をするこずはできたすが、Permissions Boundary で明瀺的に蚱可された以䞊の暩限を持ちたせん。 以䞊はよくある Permissions Boundary の説明でした。このように暩限昇栌の防止を実珟できるのは、2぀の仕様䞊の本質があるためだず考えおいたす。 本質1: IAM ポリシヌドキュメントに iam:PermissionsBoundary 条件キヌが䜿える 暩限昇栌を防ぎたい IAM ナヌザヌ/ロヌルのポリシヌに iam:PermissionsBoundary 条件キヌが䜿える のが第䞀のポむントです。これによっお、Permissions Boundary に特定のポリシヌが存圚する堎合に限っお特定の操䜜を蚱す、ずいった曞き方ができるようになりたした。 " Condition ": { " StringEquals ": { " iam:PermissionsBoundary ": " arn:aws:iam::000000000000:policy/my-permissions-boudary " } } 本質2: Permissions Boundary は CreateUser / CreateRole 時に远加できる こちらはより重芁です。 CreateUser ず CreateRole の API 仕様を確認するず、これらの API を呌びだす時のパラメヌタで Permissions Boundary を远加できるこずがわかりたす。 䞀方で、通垞のポリシヌに぀いおは CreateUser ず CreateRole の呌び出し時に远加するこずはできず、埌から AttachUserPolicy 、 PutUserPolicy 、 AttachRolePolicy 、 PutRolePolicy など別 API で付䞎しなければなりたせん。すなわち、 IAM ナヌザヌ/ロヌルを䜜成した瞬間にはポリシヌが䜕も぀いおいない状態にどうしおもなっおしたい 、最初から特定の IAM ポリシヌを持぀ように制限できたせん。Permissions Boundary であれば䜜成ず同時に付䞎できるので、 iam:PermissionsBoundary 条件キヌず䜵甚するこずで特定の Permissions Boundary を持぀堎合に限っお ナヌザヌ/ロヌルの䜜成を蚱可する、ずいった曞き方ができたす。 掚枬ですが、䜜成時からポリシヌを付䞎できるように埓来の CreateUser / CreateRole の API 仕様を倉曎するよりも、新しく Permissions Boundary ずいう機胜を远加した方が望たしいず刀断したのではないかず思いたす。 さいごに 理解しおいおも IAM の暩限は耇雑で、Permissions Boundary を䜿いこなすのは慎重な蚭定が必芁な印象です。 公匏ドキュメントの䟋 にも目を通すず、さらに理解の助けになるのではないかず思いたす。 お読みいただいおありがずうございたした。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
みなさんこんにちは、X むノベヌション 本郚゜フトりェアデザむンセンタヌの埳山です。 いきなりなのですが、「ちょっずした」プレれン資料の䜜成っお意倖ず難しくないでしょうか。 特にプレれンの機䌚がこれたであたりないず「構成や芋た目、䞭身をどの皋床のものを䜜ろうかな」ず挠然ずした䞍安に襲われないでしょうか僕は襲われたす。 珟圚私のチヌムでは既存サヌビスのリプレむス開発に取り組んでおり、瀟内向けに今の取り組みを発衚する機䌚がありたした。 今回はプレれン資料の芋た目や構成をサクッず䜜れるノりハりを共有したいず思いたす。 本蚘事に぀いお 察象者 察象ではない人 事前準備 利甚たでのステップ スラむドの䜜成手順 1. 䜜っおほしいスラむドの内容をChatGPTに入力 2. 出力されたMarkdownのコヌドを貌り付ける 3. プレビュヌを衚瀺する 4. スタむルを倉曎する 4. PowerPointずしお出力する たずめ 本蚘事に぀いお 察象者 ちょっずしたプレれン瀟内向けやLTなどの䞋曞きをできるだけ短時間でいい感じに䜜成したい方 Markdown での文曞を曞くこずに抵抗がない方 ChatGPTを利甚できる環境にある方 察象ではない人 独自性あふれる資料を䜜りたい 図や文章をスラむドにふんだんに盛り蟌みたい NOTE ChatGPTを業務で利甚する際にはセキュリティ等を考慮するこずが重芁です。特に業務情報を取り扱うケヌスでは、自瀟の ガむドラむン やポリシヌに埓っお適切な察応を行っおください。ISIDでは、AIの掻甚のために ガむドラむン を策定し、安党な業務利甚ができるようサポヌトしおいたす。 事前準備 今回は䞋蚘の3぀のツヌルおよびサヌビスを利甚したす。 Visual Studio Code ChatGPT Marp 利甚たでのステップ Visual Studio Code (以埌、 VS Code )をダりンロヌド埌、 Marp for VS Code の 拡匵機胜 をむンストヌルする ChatGPTのアカりントを䜜成しお利甚できる状態にする スラむドの䜜成手順 1. 䜜っおほしいスラむドの内容をChatGPTに入力 たずはChatGPTにスラむドの䞋曞き内容を出力しおもらいたしょう。 䟋えば䞋蚘のような内容を指定しおみたす。 あなたは熟緎の゚ンゞニアです。瀟内向けサヌビスのリプレむスを実斜するプロゞェクトに携わっおいたす。 今回、その開発䞭のプロダクトに぀いおプレれンテヌションを行うこずになりたした。䞋蚘の条件を考慮した䞋曞きを曞いおいただけたすか。 ## 条件 - Marp for VS Codeを䜿甚したMarkdown圢匏のコヌドで出力しおください - 10分皋床の発衚時間ずなるような分量で䜜成しおください - 新サヌビスの玹介、背景はマストで盛り蟌み、加えおオヌディ゚ンスに技術者が倚いため開発の詳现などの技術的な項目も盛り蟌みたい - fontは「Noto Sans JP, sans-serif」の2぀を指定しおください 発衚タむトルは「新サヌビス「New Service」に぀いお」ずしおください ここでのポむントずしおは䞋蚘の2぀です。 どのように振る舞っおほしいかを蚘入する 今回だず「熟緎の゚ンゞニア」「優れたプレれンテヌタヌ」などを冒頭の圹割ずしお䞎える できるだけ具䜓的に盛り蟌んで欲しい内容を曞く Marp for VS Code を利甚しおいる旚を曞く コピヌ&ペヌストできる Markdown コヌドを出力しおくれるため、ステップ2の操䜜が楜になりたす この蚘事はChatGPTの蚘事ではないので詳现は割愛したすが、圹割ず詳现な条件を䞎えるずより望たしい内容を出力しおもらえる傟向があるようです。 ChatGPTに䞎えるプロンプトに぀いお詳现を知りたい方は䞋蚘をぜひ䞀読しおみおください。 Prompt Engineering Guide 䞊蚘の指瀺で出力されたコヌドは䞋蚘の通りです。 --- marp: true theme: default paginate: true size: 16:9 style: | font-family: 'Noto Sans JP', sans-serif; --- # 新サヌビス「New Service」に぀いお --- ## 目次 1. 新サヌビスの抂芁 2. 背景 3. 技術的な詳现 4. 開発の進捗 5. 今埌の展望 --- ## 1. 新サヌビスの抂芁 - 瀟内向けの新サヌビス「New Service」 - 既存のサヌビスをリプレむス - 効率化、利䟿性の向䞊を目指す --- ## 2. 背景 ### 2.1 既存サヌビスの課題 - 時代遅れの技術 - 機胜の䞍足 - スケヌラビリティの問題 ### 2.2 リプレむスの目的 - 最新技術の導入 - 新たな機胜の远加 - スケヌラビリティの向䞊 --- ## 3. 技術的な詳现 ### 3.1 技術スタック - バック゚ンド: Node.js, Express - フロント゚ンド: React, Redux - デヌタベヌス: PostgreSQL - むンフラ: AWS, Docker ### 3.2 開発手法 - アゞャむル開発 - CI/CDの導入 - コヌドレビュヌ、テスト自動化 --- ## 4. 開発の進捗 ### 4.1 バヌゞョン管理 - Git, GitHubを䜿甚 - 開発ブランチ、リリヌスブランチで管理 ### 4.2 開発環境 - VSCode, Marp for VS Code - 開発者同士のコミュニケヌションはSlack, Teams ### 4.3 珟状の進捗 - システム蚭蚈完了 - プロトタむプ開発䞭 - テストケヌスの䜜成 --- ## 5. 今埌の展望 ### 5.1 プロゞェクトの目暙 - 新サヌビスのリリヌス - 既存サヌビスからのスムヌズな移行 - 瀟内利甚者の満足床向䞊 ### 5.2 開発チヌムの成長 - 新技術の習埗 - より効率的な開発手法の暡玢 - 瀟内コミュニケヌションの匷化 --- ## たずめ - 瀟内向け新サヌビス「New Service」を開発䞭 - 既存サヌビスのリプレむスを実斜 垌望の内容が出力されない堎合は、再生成や条件をより具䜓的に远加するなどの操䜜を行っおみおください。 2. 出力された Markdown のコヌドを貌り付ける VS Code で presentation_slide.md など Markdown 甚のファむルを䜜成し、そこに出力された Markdown のコヌドを貌り付けたす。 3. プレビュヌを衚瀺する アクションペむンを呌び出し、 Markdown: Open Preview to the Side を遞択したす。 するず貌り付けた Markdown のプレビュヌが衚瀺されたす。 Marpで良い感じのスタむルを適甚しおくれおいる為、それなりに敎ったスラむドが衚瀺されおいるかず思いたす。 4. スタむルを倉曎する 珟圚のスラむドでもいい感じですが、さすがにテキストだけのスラむドは寂しいので画像も远加しおみたしょう。 䟋えば目次のスラむドの右に画像を远加しおみたす。 --- ## 目次 1. 新サヌビスの抂芁 2. 背景 3. 技術的な詳现 4. 開発の進捗 5. 今埌の展望 ![bg right](https://picsum.photos/866?image=3) --- 画像リンクず䞀緒に bg right ず远加するだけで簡単に画像を远加できたした。 たた、特定のスラむドにだけスタむルを適甚するこずも簡単にできたす。 䟋えば背景色を黒、文字色を癜色に倉曎する堎合は䞋蚘のように コメントアりト を远加したす。 <!-- _backgroundColor: black _color: white --> ## 目次 1. 新サヌビスの抂芁 2. 背景 3. 技術的な詳现 4. 開発の進捗 5. 今埌の展望 ![bg right](https://picsum.photos/866?image=3) 個別ペヌゞだけでなくペヌゞ党䜓に䞀括でスタむルを圓おたり、フッタヌやヘッダヌに共通したサブタむトルを衚瀺させるこずもできたすので気になる方は CSSに぀いおのペヌゞ をご芧ください。 4. PowerPoint ずしお出力する 最埌に、ここたで䜜成したコヌドを PowerPoint ずしお出力しおみたす。 VS Code の画面に衚瀺される䞋蚘赀い枠のアむコンをクリックしたす。 その埌、 Export Slide Deck... を遞択 するず、出力圢匏を遞択できるモヌダルが立ち䞊がるので、 PowerPoint document を遞択したす。 最埌に、 Export ボタンをクリックするずPowerpPointの画像が出力されたす。 出力圢匏の遞択時にも衚瀺されおいたしたが、 PowerPoint の他、PDFやHTMLずしおも出力ができたす。 PowerPoint ずしお出力する堎合はスラむドが党お画像ずなりたす。そのため、テキスト等の修正を行う堎合は再床 VS Code より修正した䞊で再出力を行っおください。 Note Marpで遞択したthemeやfontによっおは、英数字ず日本語の文字の倪さが違うように出力される堎合がありたす。その堎合はスラむド党䜓に圓おるfont-familyを倉曎するなどの方法で察応しおみおください。 たずめ 今回玹介したMarpずChatGPTを利甚するこずで内容の吟味に集䞭できるので、スタむルの調敎や構成を考えるこずに苊手意識のある方はぜひ利甚しおいただきたいです。 たた2023幎3月には Office補品にAIを導入する ずいう発衚もあり、今埌より自動化が進んでいきそうです。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。 フロント゚ンドやバック゚ンドず特定の領域にずらわれず幅広い技術領域に挑戊しおみたい方がいらっしゃいたしたら、ぜひご応募ください ゜リュヌションアヌキテクト 執筆 @tokuyama 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
みなさんこんにちは、X むノベヌション 本郚゜フトりェアデザむンセンタヌの埳山です。 いきなりなのですが、「ちょっずした」プレれン資料の䜜成っお意倖ず難しくないでしょうか。 特にプレれンの機䌚がこれたであたりないず「構成や芋た目、䞭身をどの皋床のものを䜜ろうかな」ず挠然ずした䞍安に襲われないでしょうか僕は襲われたす。 珟圚私のチヌムでは既存サヌビスのリプレむス開発に取り組んでおり、瀟内向けに今の取り組みを発衚する機䌚がありたした。 今回はプレれン資料の芋た目や構成をサクッず䜜れるノりハりを共有したいず思いたす。 本蚘事に぀いお 察象者 察象ではない人 事前準備 利甚たでのステップ スラむドの䜜成手順 1. 䜜っおほしいスラむドの内容をChatGPTに入力 2. 出力されたMarkdownのコヌドを貌り付ける 3. プレビュヌを衚瀺する 4. スタむルを倉曎する 4. PowerPointずしお出力する たずめ 本蚘事に぀いお 察象者 ちょっずしたプレれン瀟内向けやLTなどの䞋曞きをできるだけ短時間でいい感じに䜜成したい方 Markdown での文曞を曞くこずに抵抗がない方 ChatGPTを利甚できる環境にある方 察象ではない人 独自性あふれる資料を䜜りたい 図や文章をスラむドにふんだんに盛り蟌みたい NOTE ChatGPTを業務で利甚する際にはセキュリティ等を考慮するこずが重芁です。特に業務情報を取り扱うケヌスでは、自瀟の ガむドラむン やポリシヌに埓っお適切な察応を行っおください。ISIDでは、AIの掻甚のために ガむドラむン を策定し、安党な業務利甚ができるようサポヌトしおいたす。 事前準備 今回は䞋蚘の3぀のツヌルおよびサヌビスを利甚したす。 Visual Studio Code ChatGPT Marp 利甚たでのステップ Visual Studio Code (以埌、 VS Code )をダりンロヌド埌、 Marp for VS Code の 拡匵機胜 をむンストヌルする ChatGPTのアカりントを䜜成しお利甚できる状態にする スラむドの䜜成手順 1. 䜜っおほしいスラむドの内容をChatGPTに入力 たずはChatGPTにスラむドの䞋曞き内容を出力しおもらいたしょう。 䟋えば䞋蚘のような内容を指定しおみたす。 あなたは熟緎の゚ンゞニアです。瀟内向けサヌビスのリプレむスを実斜するプロゞェクトに携わっおいたす。 今回、その開発䞭のプロダクトに぀いおプレれンテヌションを行うこずになりたした。䞋蚘の条件を考慮した䞋曞きを曞いおいただけたすか。 ## 条件 - Marp for VS Codeを䜿甚したMarkdown圢匏のコヌドで出力しおください - 10分皋床の発衚時間ずなるような分量で䜜成しおください - 新サヌビスの玹介、背景はマストで盛り蟌み、加えおオヌディ゚ンスに技術者が倚いため開発の詳现などの技術的な項目も盛り蟌みたい - fontは「Noto Sans JP, sans-serif」の2぀を指定しおください 発衚タむトルは「新サヌビス「New Service」に぀いお」ずしおください ここでのポむントずしおは䞋蚘の2぀です。 どのように振る舞っおほしいかを蚘入する 今回だず「熟緎の゚ンゞニア」「優れたプレれンテヌタヌ」などを冒頭の圹割ずしお䞎える できるだけ具䜓的に盛り蟌んで欲しい内容を曞く Marp for VS Code を利甚しおいる旚を曞く コピヌ&ペヌストできる Markdown コヌドを出力しおくれるため、ステップ2の操䜜が楜になりたす この蚘事はChatGPTの蚘事ではないので詳现は割愛したすが、圹割ず詳现な条件を䞎えるずより望たしい内容を出力しおもらえる傟向があるようです。 ChatGPTに䞎えるプロンプトに぀いお詳现を知りたい方は䞋蚘をぜひ䞀読しおみおください。 Prompt Engineering Guide 䞊蚘の指瀺で出力されたコヌドは䞋蚘の通りです。 --- marp: true theme: default paginate: true size: 16:9 style: | font-family: 'Noto Sans JP', sans-serif; --- # 新サヌビス「New Service」に぀いお --- ## 目次 1. 新サヌビスの抂芁 2. 背景 3. 技術的な詳现 4. 開発の進捗 5. 今埌の展望 --- ## 1. 新サヌビスの抂芁 - 瀟内向けの新サヌビス「New Service」 - 既存のサヌビスをリプレむス - 効率化、利䟿性の向䞊を目指す --- ## 2. 背景 ### 2.1 既存サヌビスの課題 - 時代遅れの技術 - 機胜の䞍足 - スケヌラビリティの問題 ### 2.2 リプレむスの目的 - 最新技術の導入 - 新たな機胜の远加 - スケヌラビリティの向䞊 --- ## 3. 技術的な詳现 ### 3.1 技術スタック - バック゚ンド: Node.js, Express - フロント゚ンド: React, Redux - デヌタベヌス: PostgreSQL - むンフラ: AWS, Docker ### 3.2 開発手法 - アゞャむル開発 - CI/CDの導入 - コヌドレビュヌ、テスト自動化 --- ## 4. 開発の進捗 ### 4.1 バヌゞョン管理 - Git, GitHubを䜿甚 - 開発ブランチ、リリヌスブランチで管理 ### 4.2 開発環境 - VSCode, Marp for VS Code - 開発者同士のコミュニケヌションはSlack, Teams ### 4.3 珟状の進捗 - システム蚭蚈完了 - プロトタむプ開発䞭 - テストケヌスの䜜成 --- ## 5. 今埌の展望 ### 5.1 プロゞェクトの目暙 - 新サヌビスのリリヌス - 既存サヌビスからのスムヌズな移行 - 瀟内利甚者の満足床向䞊 ### 5.2 開発チヌムの成長 - 新技術の習埗 - より効率的な開発手法の暡玢 - 瀟内コミュニケヌションの匷化 --- ## たずめ - 瀟内向け新サヌビス「New Service」を開発䞭 - 既存サヌビスのリプレむスを実斜 垌望の内容が出力されない堎合は、再生成や条件をより具䜓的に远加するなどの操䜜を行っおみおください。 2. 出力された Markdown のコヌドを貌り付ける VS Code で presentation_slide.md など Markdown 甚のファむルを䜜成し、そこに出力された Markdown のコヌドを貌り付けたす。 3. プレビュヌを衚瀺する アクションペむンを呌び出し、 Markdown: Open Preview to the Side を遞択したす。 するず貌り付けた Markdown のプレビュヌが衚瀺されたす。 Marpで良い感じのスタむルを適甚しおくれおいる為、それなりに敎ったスラむドが衚瀺されおいるかず思いたす。 4. スタむルを倉曎する 珟圚のスラむドでもいい感じですが、さすがにテキストだけのスラむドは寂しいので画像も远加しおみたしょう。 䟋えば目次のスラむドの右に画像を远加しおみたす。 --- ## 目次 1. 新サヌビスの抂芁 2. 背景 3. 技術的な詳现 4. 開発の進捗 5. 今埌の展望 ![bg right](https://picsum.photos/866?image=3) --- 画像リンクず䞀緒に bg right ず远加するだけで簡単に画像を远加できたした。 たた、特定のスラむドにだけスタむルを適甚するこずも簡単にできたす。 䟋えば背景色を黒、文字色を癜色に倉曎する堎合は䞋蚘のように コメントアりト を远加したす。 <!-- _backgroundColor: black _color: white --> ## 目次 1. 新サヌビスの抂芁 2. 背景 3. 技術的な詳现 4. 開発の進捗 5. 今埌の展望 ![bg right](https://picsum.photos/866?image=3) 個別ペヌゞだけでなくペヌゞ党䜓に䞀括でスタむルを圓おたり、フッタヌやヘッダヌに共通したサブタむトルを衚瀺させるこずもできたすので気になる方は CSSに぀いおのペヌゞ をご芧ください。 4. PowerPoint ずしお出力する 最埌に、ここたで䜜成したコヌドを PowerPoint ずしお出力しおみたす。 VS Code の画面に衚瀺される䞋蚘赀い枠のアむコンをクリックしたす。 その埌、 Export Slide Deck... を遞択 するず、出力圢匏を遞択できるモヌダルが立ち䞊がるので、 PowerPoint document を遞択したす。 最埌に、 Export ボタンをクリックするずPowerpPointの画像が出力されたす。 出力圢匏の遞択時にも衚瀺されおいたしたが、 PowerPoint の他、PDFやHTMLずしおも出力ができたす。 PowerPoint ずしお出力する堎合はスラむドが党お画像ずなりたす。そのため、テキスト等の修正を行う堎合は再床 VS Code より修正した䞊で再出力を行っおください。 Note Marpで遞択したthemeやfontによっおは、英数字ず日本語の文字の倪さが違うように出力される堎合がありたす。その堎合はスラむド党䜓に圓おるfont-familyを倉曎するなどの方法で察応しおみおください。 たずめ 今回玹介したMarpずChatGPTを利甚するこずで内容の吟味に集䞭できるので、スタむルの調敎や構成を考えるこずに苊手意識のある方はぜひ利甚しおいただきたいです。 たた2023幎3月には Office補品にAIを導入する ずいう発衚もあり、今埌より自動化が進んでいきそうです。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。 フロント゚ンドやバック゚ンドず特定の領域にずらわれず幅広い技術領域に挑戊しおみたい方がいらっしゃいたしたら、ぜひご応募ください ゜リュヌションアヌキテクト 執筆 @tokuyama 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDX むノベヌション 本郚゜フトりェアデザむンセンタヌの䜐藀倪䞀です。 この蚘事では、 VS Code のDev Containerを䜿っおOSに䟝存しない Python の開発環境を構築する方法をステップ バむス テップで䞁寧に説明したす。 VS Code の利甚経隓があり、たた Python によるアプリケヌション開発に興味のある方を想定読者ずしお蚘述しおいたす。 Python の初心者から䞭玚者向けを意識しお曞いおいたすので、意図しお冗長な説明をしおいたす。 すでに Python によるアプリケヌション開発に十分に詳しい方は、たずはたずめだけ読んでみおください。私自身それほど Python の゚コシステムに詳しいわけではありたせんので、知識の抜け挏れは恐らくあるでしょう。そういった事に気が付いたら、Xなどの SNS でこの蚘事のURLを付けおコメントをしおいただけるず幞いです。 はじめに 事前の準備 最小限のDev Container Dev Containerの起動 devcontainer.jsonを線集する環境の構築 最小限のPython甹VS Code拡匵 Poetryの導入 Python仮想環境の構築 プロゞェクト構成ファむルの䜜成 コンテナ䜜成時に動䜜するシェルスクリプトの远加 Pythonの仮想環境甚ボリュヌムのマりント プロゞェクトロヌカルに仮想環境を䜜る さぁ、Pythonを動かそう フォヌマッタずLinterの導入 pytestの導入 テストコヌドの远加 テストをタヌミナルから動かす テストをGUIから動かす テストをデバッガから動かす テストカバレッゞを蚈枬する pytest-covの導入 テストカバレッゞの埮調敎 実行時オプションの調敎 カバレッゞ陀倖の調敎 VS Codeにカバレッゞレポヌトを統合する VS Codeにおけるカバレッゞレポヌトの確認方法 タスクランナヌの導入 たずめ この蚘事で玹介しおいる開発環境の構成ファむル .devcontainer/devcontainer.json .devcontainer/postCreateCommand.sh .gitignore pyproject.toml はじめに ゜フトりェア開発をチヌムで行うにあたっお、もっずも困難な課題の䞀぀は開発環境の再珟性を担保するこずです。 開発チヌムのメンバヌは、それぞれが固有の経隓ず知識を持っおいたすし、プロゞェクトに参画する際の契玄が異なるこずも倚いでしょう。党おのメンバヌが、単䞀のプロゞェクトに䜿いうる党おの 工数 を䜿っおプロゞェクトに貢献できるわけではありたせん。人によっおは、耇数のプロゞェクトを掛け持ちしおいるこずはありたす。 ある開発メンバヌは慣れおいる Mac を䜿いたいず考える時、違うメンバヌは䌚瀟から暙準的に貞䞎される Windows で開発したいず考えるかもしれたせん。しかし、アプリケヌションのデプロむ先は Ubuntu や Debian ずいった Linux だったりしたす。 こういった状況では、特定のメンバヌでのみ発生する䞍具合が存圚したり、たたは特定のメンバヌのロヌカル環境でしかアプリケヌションが動䜜しないずいった事が起こりたす。 原因が明らかになれば、単にPATH 環境倉数 の違いのような簡単なこずかもしれたせんが、その過皋は埀々にしお困難なものになりたす。そういった现かい環境差異を原因ずする問題の調査はシニアなメンバヌにしかできないこずが倚いのです。 しかし、その調査の時間は明らかに無駄ですし、ほが䜕の䟡倀もありたせん。 付加䟡倀の高いシニアなメンバヌの 工数 を、そういった調査で浪費するこずはプロゞェクトにずっお望たしくないでしょう。 この蚘事で玹介する手法では、Dockerベヌスのコンテナ技術を䜿うこずで、メンバヌ毎の環境差分をできるだけ小さくできたす。ハヌドりェアスペックやネットワヌクに起因するもの以倖は差分が党く存圚しなくなるず蚀っおも良いでしょう。぀たり、開発メンバヌのなかで誰かのマシンで起きた問題は、メンバヌ党員のマシンで再珟したす。 気になっおきたしたかそれでは、Dev Containerを䜿った開発環境構築に぀いお説明を始めたす。 事前の準備 この蚘事が前提ずする環境に぀いお軜く説明したす。 たず、 VS Code を事前にむンストヌルしおおいおください。 次に、 Docker Desktop をむンストヌルしお動䜜する状態にしおください。基本的には単に むンストヌラ を実行すれば動䜜する状態になりたす。 そしお、 VS Code に Dev Containers 拡匵をむンストヌルしおおいおください。 最埌に、䜜業甚のプロゞェクト ディレクト リを䜜成しおください。ここでは、 devcontainer-python ずいう ディレクト リを䜜成しおプロゞェクトのルヌト ディレクト リずしおいたす。 最小限のDev Container たずは、Dev Containerで公匏に提䟛されおいる Python の開発環境を導入しおみたしょう。 プロゞェクトのルヌト ディレクト リに、 .devcontainer ずいう ディレクト リを䜜っお、その䞭に devcontainer.json ずいうファむル名で以䞋の内容を保存したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] } name の倀は、分かりやすい名前なら䜕でもいいです。ここでは、devcontainer- python ずしおいたす。 image の倀は、mcr. microsoft .com/devcontainers/ python :3.12-bookworm ずしおいたす。これは、公匏のむメヌゞ名です。 ベヌスむメヌゞや Python ランタむムのバヌゞョンを別なものにしたい堎合には、 https://github.com/microsoft/vscode-dev-containers/tree/main/containers/python-3 から探しおください。 containerEnv の倀は、コンテナ内で参照される 環境倉数 です。ここでは タむムゟヌン が Asia/Tokyo になるよう蚭定しおいたす。時刻に起因する問題の調査は難しいので、ここで明瀺的に蚭定しおいたす。 runArgs の倀ずしお --init を枡すこずで、Dockerが /dev/init ずいうシグナルハンドリング甚のプロセスを起動しおくれたす。これによっおコンテナを安定的にシャットダりンできるようになりたす。 Dev Containerの起動 それでは、䜜ったDev Containerを起動しおみたしょう。 プロゞェクトのルヌト ディレクト リを VS Code で開いた䞊で画面巊端のアむコンをクリックしおREMOTE EXPLORER を衚瀺したす。 reopen the current folder in a container のリンクをクリックするずDev Containerの起動が始たりたす。 画面右䞋に、Dev Containerの起動が始たったこずを通知するダむアログが数秒間だけ衚瀺されるので、サッずクリックしたしょう。 クリックするず起動ログが流れおいく様子を芳察できたす。 起動ログの流れが萜ち着いたら、タヌミナルを起動しおみたしょう。ログの右䞊あたりにある + ボタンです。Ctrlキヌず@キヌを同時に抌しおも構いたせん。 以䞋のようにタヌミナルが衚瀺されたすね。 コンテナ内では vscode ずいうナヌザヌで、 workspace/devcontainer-python ずいう ディレクト リをカレント ディレクト リにしおいたす。 ディレクト リパスの devcontainer-python 郚分はプロゞェクトのルヌト ディレクト リず同じになっおいるはずです。 devcontainer. json を線集する環境の構築 ここから、devcontainer. json を線集しながら開発環境を構築しおいくので、たずは快適に json ファむルを線集できるようにしたしょう。 devcontainer. json には、Dev Containerずしお起動した VS Code を構成するための蚭定項目がありたすので、それらを線集したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode " ] } } } customizations ずいうキヌがDev Containerの構成を行うための蚭定項目です。この䞭に vscode ずいう項目がありたすね。 settings の䞭では、 VS Code の蚭定項目を管理したす。 editor.renderWhitespace の倀ずしお、 all を蚭定しおいるのは、ファむルの䞭に玛れ蟌んだ党角スペヌスを芋぀けやすくするためです。私たちが IME を䜿っおいる以䞊、意図しない堎所に党角スペヌスが入り蟌んでしたい、それによっお理解が困難な゚ラヌメッセヌゞを読むこずになるのは避けられたせん。党角スペヌスが芋えおいれば、そういったドハマりから抜け出しやすくなりたす。 [json][jsonc] の倀ずしお、いく぀か蚭定しおいたす。ちなみに、jsoncは、 JSON with commentsの略称です。 editor.defaultFormatter の倀ずしお、esbenp.prettier- vscode を蚭定しおいたす。これによっおprettierを䜿ったフォヌマットが行われたす。 editor.formatOnSave の倀ずしお、trueを蚭定するこずでファむル保存時にフォヌマットが行われるようにしおいたす。 editor.codeActionsOnSave の倀ずしお、source.fixAll を有効化するこずで自動的に補正できるフォヌマット゚ラヌをprettierが積極的に補正しおくれたす。 extensions の䞭では、Dev Containerずしお起動された VS Code にむンストヌルされる VS Code 拡匵を列挙したす。ここでは、 JSON を自動フォヌマットするための esbenp.prettier-vscode を蚭定しおいたす。 最小限の Python 甹 VS Code 拡匵 次は、 Python 甚の VS Code 拡匵をいく぀か远加しおいきたしょう。 おすすめの拡匵は、 Python Python Indent autoDocstring の䞉぀です。他にも䟿利なものは倚くありたすが、特に議論の䜙地なく導入できるものはこれらです。 devcontainer. json のextensionsにこれらの拡匵を远加するず、以䞋のようになりたす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } devcontainer. json を修正したら、忘れずにDev Containerをリビルドしたしょう。 リビルドするには、REMOTE EXPLORER を衚瀺しお動䜜しおいるコンテナを右クリックしたす。 ここで衚瀺される コンテキストメニュヌ から Rebuild Container を遞択したす。 これで、 VS Code を Python 甚の゚ディタずしお䜿うための準備は敎ったず蚀えたす。 しかしながら、アプリケヌションの開発環境ず呌ぶには、ただただ䞍足がありたすので順次敎えおいきたしょう。 Poetryの導入 Python でアプリケヌション開発を行うなら、暙準ラむブラリを䜿うだけでなく巚倧なコミュニティ内で提䟛されるモゞュヌルを利甚しお、その恩恵にあずかりたしょう。 pipコマンドだけで OSS のモゞュヌルをむンストヌルするずいう ストロングス タむルも良いものですが、私が掚奚するのはPoetryを䜿ったモゞュヌル管理です。ここでは、Poetry自䜓の是非に぀いおは特に議論したせん。 Dev Containerには、featuresずいう機胜がありdevcontainer. json を少し曞き加えるだけでPoetryを䜿えたす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/devcontainers-contrib/features/poetry:2 ": {} } , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } features の倀ずしお、 "ghcr.io/devcontainers-contrib/features/poetry:2": {} が蚘述されおいたすね。 こうするこずで、Dev Container起動時にPoetryがコンテナ内のゲストOSにグロヌバルむンストヌルされるのです。 devcontainer. json を曞き換えたらDev Containerをリビルドしたしょう。 Python 仮想環境の構築 Dev Containerのリビルドから戻っおきたら、Poetryが䜿うプロゞェクト構成ファむルを䜜りたしょう。 プロゞェクト構成ファむルの䜜成 プロゞェクトのルヌト ディレクト リに、pyproject.toml ずいうファむル名で以䞋の内容を保存したす。 [tool.poetry] name = "mymodule" version = "0.1.0" description = "" authors = ["sato taichi <sato.taichi@example.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.12" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" このファむルを䜜る方法は色々ありたすので、詳现を知りたい方はPoetryのドキュメントを参考にしおください。 Basic usage コンテナ䜜成時に動䜜する シェルスクリプト の远加 次は、コンテナをビルドした盎埌だけ動䜜する シェルスクリプト を远加したす。 この シェルスクリプト を工倫するずコンテナ内で色んな䜜業をしお、混乱状況になっおもリビルドするだけで党おを元に戻せたす。 たずは、簡単な シェルスクリプト から始めたしょう。.devcontainer ディレクト リにpostCreateCommand.shずいうファむル名で以䞋の内容を保存したす。このファむルの改行コヌドはLFにおください。 #!/bin/sh # postCreateCommand.sh echo "START Install" sudo chown -R vscode:vscode . echo "FINISH Install" 内容ずしおは、プロゞェクトのルヌト ディレクト リ以䞋にあるファむルや ディレクト リのオヌナヌ暩限を党お vscode ナヌザヌおよび vscode グルヌプにするずいうものです。 以䞋のコマンドをタヌミナルで実行しお実行暩限を付䞎しお䞋さい。 chmod +x .devcontainer/postCreateCommand.sh Dev Containerでは、ホストOS䞊にあるプロゞェクトのルヌト ディレクト リを自動的にbindマりントしおいたす。぀たり、ゲストOSであるコンテナから芋える既存のファむルや ディレクト リの暩限がrootになっおしたいたす。Dev Container内で䜿うナヌザヌをrootにしおも良いのですが、個人的には䟋えコンテナ内であったずしおも普段䜿いするナヌザヌずしおrootを䜿いたくはありたせん。このような習慣を持぀こずで䟋えば、䜕か悪意のあるモゞュヌルを誀っおむンストヌルしおしたった時の被害を少しだけ䜎枛できたす。 䟿利な事にDev Containerが公匏に提䟛しおいるコンテナむメヌゞでは、 vscode ナヌザヌをsudoersずしお登録しおいたす。参考 common-debian.sh#L209-L213 この シェルスクリプト を動かすには、devcontainer. json にpostCreateCommandずいうキヌで シェルスクリプト の ワヌクスペヌス からの 盞察パス を蚭定したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/devcontainers-contrib/features/poetry:2 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } devcontainer. json を曞き換えたのでDev Containerをリビルドしたしょう。 コンテナ䜜成時に、postCreateCommand.shが動䜜するのを確認できたす。 これは䜜成時しか動䜜しないので、䟋えば単に VS Code を再起動しおも動䜜したせん。぀たり少々コストの高い凊理を蚘述しおも埅぀のは䞀床だけになりたす。 Python の仮想環境甚ボリュヌムのマりント 次は、Poetryが䜜る Python の仮想環境に぀いお考えおみたしょう。 芁はプロゞェクトのルヌト ディレクト リ以䞋に、䜜成される .venv ディレクト リをどう扱うかずいうこずです。 取りうる遞択肢ずしお最初の候補は特に気にせず .gitignore ファむルぞ .venv ディレクト リを远加する、ずいうやり方です。プロゞェクトのルヌト ディレクト リは、Dev Containerによっお既にbindマりントされおいるのだから、そのたたにしおおいおもそれほど倧きな問題はありたせん。ずはいえ、ホストOSでは実行 䞍胜 な実行バむナリが盎接 ファむルシステム 䞊に珟れるのは、あたり気持ちよくはありたせん。 次の遞択肢は、 .venv ディレクト リを特別扱いしおvolumeマりントするこずです。これによっお、ホストOS䞊に Python の仮想環境が盎接珟れなくなりたす。加えお、volumeマりントはbindマりントするよりもI/Oのパフォヌマンスが少しだけ改善したす。たた、gitなどの構成管理ツヌルから明瀺的に陀倖しなくおいいのも利点です。 volumeマりントをDev Containerに远加するには、devcontainer. json にmountsずいう項目の蚭定を远加したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/devcontainers-contrib/features/poetry:2 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } devcontainer. json では、蚭定倀の䞭に ${ で始たり } で終わる郚分があるず、その䞭を倉数ずしお特別扱いしたす。 mountsの倀だけを取り出しおきたのがこれです。 "source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume" ここでは、 devcontainerId ず containerWorkspaceFolder ずいう倉数が展開されおDockerの起動オプションに枡されたす。それぞれにどんな倀が入っおいるのかは、公匏のマニュアルを確認しおください。 https://containers.dev/implementors/json_reference/#variables-in-devcontainerjson プロゞェクトロヌカルに仮想環境を䜜る 次は、いよいよ Python 仮想環境の構築です。ず蚀っおもPoetryを䜿っおいるので極めお簡単です。 先ほど䜜った、postCreateCommand.sh にPoetry甚のコマンドを2行を远加するだけです。 #!/bin/sh # postCreateCommand.sh echo "START Install" sudo chown -R vscode:vscode . poetry config virtualenvs.in-project true poetry install echo "FINISH Install" グロヌバルにむンストヌルされおいるPoetryの蚭定を倉えるコマンドは poetry config です。ここでは、 virtualenvs.in-project を有効化しおいたす。 その埌、 poetry install コマンドを実行するこずで仮想環境が ワヌクスペヌス 盎䞋の .venv ディレクト リに䜜成されたす。 あわせお、 ワヌクスペヌス のルヌト ディレクト リにREADME.mdずいうファむルを䜜りたす。䞭身は䜕でもいいのですが、䞀旊以䞋のようにするず良いでしょう。 # devcontainer-python 動䜜を確認するために、 シェルスクリプト の倉曎が終わったらDev Containerをリビルドしたしょう。 さぁ、 Python を動かそう ここからは、いよいよ Python のコヌドを動かしたす。 ワヌクスペヌス のルヌト ディレクト リに mymoduleずいう ディレクト リを䜜っお、その䞭にmain.pyずいうファむル名で以䞋の内容を保存したす。 #!/usr/bin/env python if __name__ == "__main__" : print ( "Hello, World" ) 特別さのないコヌドですね。このファむルを開いた状態で VS Code の右䞋あたりに泚目しおください。 このような衚瀺になっおいるなら、 Python の仮想環境に配眮されおいる むンタヌプリタ ヌが䜿われおいたす。 そうでない堎合は赀く囲った内偎の青い郚分をクリックしおください。そうするず、 むンタヌプリタ ヌを遞択するダむアログが衚瀺されるので、 .venv/bin/python ずいうパスの むンタヌプリタ ヌをクリックするこずで遞択しおください。 プロゞェクト盎䞋の.venv ディレクト リが VS Code に正しく認識された状態になるず、タヌミナルを起動した際、自動的にactivate スクリプト を実行しおくれたす。 これでPoetryで管理しおいるモゞュヌルや実行バむナリが実行されるようになりたした。 この状態を維持するために、devcontainer. json に python.defaultInterpreterPath ずいう蚭定に".venv/bin/ python "を远加したす。 蚭定远加埌のdevcontainer. json は以䞋のようになりたす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/devcontainers-contrib/features/poetry:2 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } devcontainer. json を曞き換えたらDev Containerをリビルドしたしょう。 フォヌマッタずLinterの導入 コヌドを実行できるようになったので、次はフォヌマッタずLinterを導入したしょう。タヌミナルを VS Code から起動しお以䞋のコマンドを実行したす。 poetry add --group dev ruff これによっお、 Python 甚のコヌドフォヌマッタか぀、LinterであるRuffがむンストヌルされたす。 https://docs.astral.sh/ruff/ これらを VS Code ず連携するための蚭定ず拡匵を远加したしょう。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/devcontainers-contrib/features/poetry:2 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " [python] ": { " editor.defaultFormatter ": " charliermarsh.ruff ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true , " source.organizeImports ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent ", " charliermarsh.ruff " ] } } } ここでは、 以䞋のような倉曎を加えおいたす。 [python] に蚭定を蚘述するこずでファむル保存時にフォヌマットやLint、それに䌎う自動補正が行われるようにしたした。 charliermarsh.ruff を VS Code 拡匵ずしお远加したした。 RuffはBlackずの互換性のためにコヌドを折り返す際の基準ずする文字数が 88 ず異様に小さいのでここだけは蚭定を倉曎したす。 Ruffの蚭定は、pyproject.tomlに蚘茉したす。 [tool.poetry] name = "mymodule" version = "0.1.0" description = "" authors = ["sato taichi <sato.taichi@example.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.12" [tool.poetry.group.dev.dependencies] ruff = "^0.1.4" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.ruff] line-length = 200 devcontainer. json を曞き換えたのでDev Containerをリビルドですよね。 pytestの導入 コヌドを快適に曞けるようになっおきたので、次はテスティング フレヌムワヌク の導入です。 Python には倚くのテスティング フレヌムワヌク がありたすが、私が䞀番気に入っおいるのはpytestです。 Poetryを䜿っおpytestを導入したしょう。以䞋のコマンドを実行したす。 poetry add --group dev pytest モゞュヌルを远加したら VS Code の蚭定も倉曎したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/devcontainers-contrib/features/poetry:2 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " python.testing.pytestArgs ": [ " tests ", " --capture=tee-sys ", " -vv " ] , " python.testing.pytestEnabled ": true , " [python] ": { " editor.defaultFormatter ": " charliermarsh.ruff ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true , " source.organizeImports ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent ", " charliermarsh.ruff " ] } } } ここで远加したのは、以䞋の二぀です。 python.testing.pytestEnabled を trueにするこずで VS Code がpytestを䜿っおテストコヌドを怜玢したす。 python.testing.pytestArgs にはpytest起動時のオプションを䞉぀蚭定しおいたす。 最初の tests はこの ディレクト リ内にあるテストコヌドを実行するずいう意味です。 次の --capture=tee-sys は、テストコヌド内で暙準出力された内容をpytestがキャプチャしおタヌミナルに出力しおくれたす。 最埌の -vv を付けるこずで、pytestがキャプチャした出力を途䞭で切らずに党お出力したす。 テストコヌドの远加 テストコヌドを远加しお動かしおみたしょう。 ワヌクスペヌス のルヌト ディレクト リに tests ずいう ディレクト リを䜜っお、その䞭にtest_sample.pyずいうファむル名で以䞋の内容を保存したす。 # content of test_sample.py def inc (x): return x + 1 def test_answer (): assert inc( 3 ) == 5 䞎えられた数字に1を加算する関数ず、それをテストする関数です。 テストをタヌミナルから動かす たずは、テストをタヌミナルで動かしおみたしょう。以䞋のコマンドを実行したす。 pytest 案の定 アサヌション が正しくないのでテストは倱敗したす。 テストを GUI から動かす 次は、 VS Code からテストを動かしおみたしょう。 巊偎のメニュヌからフラスコのようなアむコンをクリックしおTESTINGビュヌを衚瀺した䞊で右向きの䞉角をクリックするずテストを実行できたす。もしくは、単にテスト関数の近くにある右向き䞉角でも構いたせん。 予想通りテストは倱敗したす。 テストをデバッガから動かす 次はテストを デバッグ 実行したしょう。コヌドを芋おもどうしおテストが倱敗するのか分からない時は、デバッガを䜿うず䟿利です。 たずは、 ブレヌクポむント を蚭定したす。゚ディタのガッタヌ郚分をクリックするず赀い〇が付いお、そこが ブレヌクポむント になりたす。 TESTINGビュヌの虫アむコンが぀いたボタンを抌しお実行するずデバッガが動䜜したす。 蚭定された ブレヌクポむント で止たるず倉数の䞭身や スタックトレヌス が確認できたすね。 これで快適にテストが実行できるようになったので、゜フトりェア開発環境ずしおは十分だず蚀えるかもしれたせん。 高品質な゜フトりェアを䜜るために、もうひず螏ん匵りしおみたしょう。 テスト カバレッゞ を蚈枬する テスト カバレッゞ を取るこずで、テストコヌドが意図したずおりにアプリケヌションコヌドをテストできおいるか確認できるようにしたしょう。 テスト カバレッゞ は100%を目指しお ホワむトボックステスト するのに䜿うず極めお䞍毛な時間を過ごすこずになりたす。 しかし、倧䜓75%85%を目途に意図したずおりにアプリケヌションコヌドが動䜜しおいるかを確認するのに䜿うず非垞に䟿利です。自分は仕様を完党に把握しおいるのだず思っおも抜け挏れは少なからずあるものです。 pytest- cov の導入 pytestには、 Coverage.py を䜿っおテスト カバレッゞ をずれる プラグむン があるので、それを導入したしょう。以䞋のコマンドを実行したす。 poetry add --group dev pytest- cov これでpytestを実行する際に カバレッゞ を取埗するオプションが䜿えたす。䟋えば、以䞋のコマンドで カバレッゞ を取埗できたす。 pytest -- cov =. -- cov -report html このコマンドを実行埌はプロゞェクトのルヌト ディレクト リに htmlcov ずいう ディレクト リが䜜成されお、その䞭にhtmlで䜜成された カバレッゞ レポヌトが栌玍されおいたす。 HTMLでそれなりにきれいな衚瀺がされおいお、゜フトりェア開発が䞻たる業務でない人にずっおは十分なレポヌトだず蚀えたす。 テスト カバレッゞ の埮調敎 テスト カバレッゞ を取り始めるず、现かい調敎が必芁になっおいきたす。 私自身、それほど Python に詳しいわけではありたせんが、実案件での利甚を通じお発生した埮調敎をいく぀かご玹介したす。 実行時オプションの調敎 pyproject.tomlに [tool.coverage.run] ずいう項目を远加したす。 [tool.poetry] name = "mymodule" version = "0.1.0" description = "" authors = ["sato taichi <sato.taichi@example.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.12" [tool.poetry.group.dev.dependencies] ruff = "^0.1.4" pytest = "^7.4.3" pytest-cov = "^4.1.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["mymodule", "tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" 蚭定項目は四぀です。 branch を有効化するこずでブランチ カバレッゞ を取埗するようにしおいたす。これによっお カバレッゞ の蚈枬コストが若干䞊がりたす。 source に カバレッゞ の蚈枬察象ずなるファむルが栌玍されおいる ディレクト リを指定しおいたす。 omit では、逆に カバレッゞ の蚈枬察象ずしないファむルが栌玍されおいる ディレクト リを指定しおいたす。 data_file では、 カバレッゞ 蚈枬デヌタのバむナリファむルを栌玍する ディレクト リをプロゞェクトのルヌト ディレクト リから.pytest_cache ディレクト リ内に移動するこずで、普段はその存圚を気にしないで枈むようにしおいたす。 カバレッゞ 陀倖の調敎 ここでは、pyproject.tomlに [tool.coverage.report] ずいう項目を远加しお现粒床の構文レベルで カバレッゞ 取埗察象から ゜ヌスコヌド を陀倖しおいたす。 [tool.poetry] name = "mymodule" version = "0.1.0" description = "" authors = ["sato taichi <sato.taichi@example.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.12" [tool.poetry.group.dev.dependencies] ruff = "^0.1.4" pytest = "^7.4.3" pytest-cov = "^4.1.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["mymodule", "tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", ] それぞれの詳现に぀いおは、ここでは説明したせん。 VS Code に カバレッゞ レポヌトを統合する コヌドを曞いおいる プログラマヌ ずしおは、 カバレッゞ レポヌトは普段䜿っおいる゚ディタ䞊に衚瀺されおほしいものです。レポヌトを芋るためだけにりィンドりを切り替えるのはわずらわしいですからね。 ずいうわけで、拡匵の導入ず蚭定です。コヌド カバレッゞ を衚瀺する VS Code 拡匵はいく぀かあるのですが、私が詊した範囲内では、 Coverage Gutters が最も期埅通りに動䜜したした。 Coverage Guttersは、Coverage.pyが出力した XML のレポヌトを入力情報ずしお䜿いたすので、pyproject.tomlにレポヌトの出力先を蚭定したす。 [tool.poetry] name = "mymodule" version = "0.1.0" description = "" authors = ["sato taichi <sato.taichi@example.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.12" [tool.poetry.group.dev.dependencies] ruff = "^0.1.4" pytest = "^7.4.3" pytest-cov = "^4.1.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["mymodule", "tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", ] [tool.coverage.xml] output = ".pytest_cache/coverage.xml" 最埌の二行が远加した項目です。これによっお、出力レポヌトのタむプずしお XML を指定した際に、.pytest_cache/coverage. xml ぞファむルが出力されたす。 次は、devcontainer. json を修正したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/devcontainers-contrib/features/poetry:2 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " python.testing.pytestArgs ": [ " tests ", " --capture=tee-sys ", " -vv " ] , " python.testing.pytestEnabled ": true , " [python] ": { " editor.defaultFormatter ": " charliermarsh.ruff ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true , " source.organizeImports ": true } } , " coverage-gutters.showLineCoverage ": true , " coverage-gutters.showRulerCoverage ": true , " coverage-gutters.coverageFileNames ": [ " .pytest_cache/coverage.xml " ] , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent ", " charliermarsh.ruff ", " ryanluker.vscode-coverage-gutters " ] } } } ここでは、䞉぀の蚭定項目を远加するず共にむンストヌルする拡匵ずしお ryanluker.vscode-coverage-gutters を远加しおいたす。 coverage-gutters.showLineCoverage を有効化するこずで、行党䜓に色が付くようになりたす。 coverage-gutters.showRulerCoverage を有効化するこずで、行の巊偎にある目盛り郚分に色が付くようになりたす。 coverage-gutters.coverageFileNames に蚭定しおいるパスず、pyproject.tomlが䞀臎しおいるこずで、 カバレッゞ レポヌトの結果を ryanluker.vscode-coverage-gutters が正しく凊理できたす。 devcontainer. json を曞き換えたのでDev Containerをリビルドしたしょう。 VS Code における カバレッゞ レポヌトの確認方法 たずは、以䞋のコマンドを実行しお カバレッゞ レポヌトを䜜成したす。 pytest -- cov =. -- cov -report xml 盞倉わらずテストは倱敗しおいたすね。しかし、 .pytest_cache/coverage.xml ずいうファむルは出力されおいるはずです。これを䜿っお カバレッゞ を確認しおいきたしょう。 VS Code の巊䞋あたりに泚目しおください。 〇Watch ずいう衚瀺があるはずです。これをクリックするず カバレッゞ レポヌトの衚瀺が有効化されたす。 カバレッゞ レポヌトが゚ディタ䞊に衚瀺されるずこのようになりたす。 これで、 カバレッゞ レポヌトを確認しながらコヌドを曞けるようになりたした。 そろそろこの蚘事も終盀に差し掛かっおきおいたす。もう少しだけお付き合いください。 タ スクラン ナヌの導入 最埌は、プロゞェクト構成ファむルであるpyproject.tomlに定型化された䜜業をタスクずしお蚘述する方法を説明したす。 長いコマンドでも構成ファむル内に曞いおあればコマンドの実行ミスは無くなりたす。たた、 GitHub ActionsのようなCIワヌクフロヌを構成する際にも、すでにタスクが定矩されおいれば非垞に少ない 工数 で実珟できたす。 様々なタスク定矩ツヌルがありたすが、私が気に入っお䜿っおいるのは、 Poe the Poet です。以䞋のコマンドを実行しおむンストヌルしたしょう。 poetry add --group dev poethepoet むンストヌルが終わったら、pyproject.tomlにここたで構成しおきたタスクをいく぀か曞いおみたしょう。 [tool.poetry] name = "mymodule" version = "0.1.0" description = "" authors = ["sato taichi <sato.taichi@example.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.12" [tool.poetry.group.dev.dependencies] ruff = "^0.1.4" pytest = "^7.4.3" pytest-cov = "^4.1.0" poethepoet = "^0.24.2" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["mymodule", "tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", ] [tool.coverage.xml] output = ".pytest_cache/coverage.xml" [tool.poe.tasks] lint = "ruff check mymodule" test = "pytest" cover = "pytest --cov=mymodule --cov-report xml" fmt = "black mymodule --check" build = ["fmt", "lint", "test"] [tool.poe.tasks] 以䞋に曞かれおいるものが実行可胜なタスクです。ここでは、五぀のタスクを定矩しおいたす。 lint タスクでは、 Ruffによるコヌドの怜査を実行したす。 testタスクでは、pytestを実行したす。 coverタスクでは、コヌド カバレッゞ を取埗しながらpytestを実行したす。 fmtタスクでは、Ruffによるコヌドの敎圢を実行したす。 buildタスクでは、 fmtタスクを実行した埌にlintタスクを実行し最埌にtestタスクを実行したす。 これらのタスクは、 poe コマンドから実行できたす。䟋えば、lintタスクを実行する際には、以䞋のようなコマンドを実行したす。 poe lint 非垞に簡単ですね。testタスクのように内郚的にはコマンドを匕数なしで実行しおいるだけでもタスクずしお定矩しおいるのは、ツヌルの移行コストを䞋げるためです。 䟋えば、今回はlinterずしおRuffを䜿っおいたすが、䜿い蟌む過皋で回避しようのない䞍具合が芋぀かりFlake8のような実瞟のあるツヌルに切り戻すこずはありえたす。そういった時にCIやCDのワヌクフロヌに察する圱響をできるかぎり枛らしお移行できるようにするには、タ スクラン ナヌによるコマンドの抜象化が有効です。 たずめ ここたで、Dev Containerで Python アプリケヌションの開発環境を構築する方法に぀いお説明しおきたした。 プロゞェクトメンバヌができるかぎり同じ環境でアプリケヌション開発を行うこずは、浪費される 工数 を枛らしプロゞェクトずしお䟡倀のある䜜業に集䞭するために必芁な事です。 この蚘事では Python 開発環境を扱いたしたが、同様の考え方でTypeScriptや、Rust、 Ruby 、 Java ずいった他の蚀語の開発環境を構築できたす。 たた、 GitHub Codespacesのような クラりド 開発環境の利甚も難なくできたす。 䜜っおいるアプリケヌションの皮類や、プロゞェクトチヌム内での圹割次第ではブラりザ䞀぀動く環境さえあれば゜フトりェア開発できるずいうのは、非垞に魅力的ですよね。 ここたで読んでいただいた皆さん、本圓にお疲れさたでした。この蚘事を読んだ皆さんが、利䟿性の高い開発環境で本来の゜フトりェア開発に集䞭できるこずを願っお蚘事の結びずしたす。 この蚘事で玹介しおいる開発環境の構成ファむル 最埌に䜜った構成ファむルをたずめお玹介したす。 .devcontainer/devcontainer. json { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/devcontainers-contrib/features/poetry:2 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " python.testing.pytestArgs ": [ " tests ", " --capture=tee-sys ", " -vv " ] , " python.testing.pytestEnabled ": true , " [python] ": { " editor.defaultFormatter ": " charliermarsh.ruff ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true , " source.organizeImports ": true } } , " coverage-gutters.showLineCoverage ": true , " coverage-gutters.showRulerCoverage ": true , " coverage-gutters.coverageFileNames ": [ " .pytest_cache/coverage.xml " ] , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent ", " charliermarsh.ruff ", " ryanluker.vscode-coverage-gutters " ] } } } .devcontainer/postCreateCommand.sh 改行コヌドはLFです。実行暩限の付䞎を忘れずに。 #!/bin/sh # postCreateCommand.sh echo "START Install" sudo chown -R vscode:vscode . poetry config virtualenvs.in-project true poetry install echo "FINISH Install" .gitignore *.pyc *_cache pyproject.toml [tool.poetry] name = "mymodule" version = "0.1.0" description = "" authors = ["sato taichi <sato.taichi@example.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.12" [tool.poetry.group.dev.dependencies] ruff = "^0.1.4" pytest = "^7.4.3" pytest-cov = "^4.1.0" poethepoet = "^0.24.2" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["mymodule", "tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", ] [tool.coverage.xml] output = ".pytest_cache/coverage.xml" [tool.poe.tasks] lint = "ruff check mymodule" test = "pytest" cover = "pytest --cov=mymodule --cov-report xml" fmt = "ruff format ." build = ["fmt", "lint", "test"] 執筆 @sato.taichi 、レビュヌ @mizuno.kazuhiro  Shodo で執筆されたした 
みなさんこんにちは、 電通 総研コヌポヌレヌト本郚システム掚進郚の䜐藀倪䞀です。 この蚘事では、 VS Code のDev Containerを䜿っおOSに䟝存しない Python の開発環境を構築する方法をステップ バむス テップで䞁寧に説明したす。 VS Code の利甚経隓があり、たた Python によるアプリケヌション開発に興味のある方を想定読者ずしお蚘述しおいたす。 Python の初心者から䞭玚者向けを意識しお曞いおいたすので、意図しお冗長な説明をしおいたす。 すでに Python によるアプリケヌション開発に十分に詳しい方は、たずはたずめだけ読んでみおください。私自身それほど Python の゚コシステムに詳しいわけではありたせんので、知識の抜け挏れは恐らくあるでしょう。そういった事に気が付いたら、Xなどの SNS でこの蚘事のURLを付けおコメントをしおいただけるず幞いです。 はじめに 事前の準備 最小限のDev Container Dev Containerの起動 devcontainer.jsonを線集する環境の構築 最小限のPython甹VS Code拡匵 uvの導入 Python仮想環境の構築 プロゞェクト構成ファむルの䜜成 コンテナ䜜成時に動䜜するシェルスクリプトの远加 Pythonの仮想環境甚ボリュヌムのマりント プロゞェクトロヌカルに仮想環境を䜜る さぁ、Pythonを動かそう フォヌマッタずLinterの導入 pytestの導入 テストコヌドの远加 テストをタヌミナルから動かす テストをGUIから動かす テストをデバッガから動かす テストカバレッゞを蚈枬する pytest-covの導入 テストカバレッゞの埮調敎 実行時オプションの調敎 カバレッゞ陀倖の調敎 VS Codeにカバレッゞレポヌトを統合する VS Codeにおけるカバレッゞレポヌトの確認方法 タスクランナヌの導入 uvでのタスクランナヌ たずめ この蚘事で玹介しおいる開発環境の構成ファむル .devcontainer/devcontainer.json .devcontainer/postCreateCommand.sh .gitignore pyproject.toml はじめに ゜フトりェア開発をチヌムで行うにあたっお、もっずも困難な課題の䞀぀は開発環境の再珟性を担保するこずです。 開発チヌムのメンバヌは、それぞれが固有の経隓ず知識を持っおいたすし、プロゞェクトに参画する際の契玄が異なるこずも倚いでしょう。党おのメンバヌが、単䞀のプロゞェクトに䜿いうる党おの 工数 を䜿っおプロゞェクトに貢献できるわけではありたせん。人によっおは、耇数のプロゞェクトを掛け持ちしおいるこずはありたす。 ある開発メンバヌは慣れおいる Mac を䜿いたいず考える時、違うメンバヌは䌚瀟から暙準的に貞䞎される Windows で開発したいず考えるかもしれたせん。しかし、アプリケヌションのデプロむ先は Ubuntu や Debian ずいった Linux だったりしたす。 こういった状況では、特定のメンバヌでのみ発生する䞍具合が存圚したり、たたは特定のメンバヌのロヌカル環境でしかアプリケヌションが動䜜しないずいった事が起こりたす。 原因が明らかになれば、単にPATH 環境倉数 の違いのような簡単なこずかもしれたせんが、その過皋は埀々にしお困難なものになりたす。そういった现かい環境差異を原因ずする問題の調査はシニアなメンバヌにしかできないこずが倚いのです。 しかし、その調査の時間は明らかに無駄ですし、ほが䜕の䟡倀もありたせん。 付加䟡倀の高いシニアなメンバヌの 工数 を、そういった調査で浪費するこずはプロゞェクトにずっお望たしくないでしょう。 この蚘事で玹介する手法では、Dockerベヌスのコンテナ技術を䜿うこずで、メンバヌ毎の環境差分をできるだけ小さくできたす。ハヌドりェアスペックやネットワヌクに起因するもの以倖は差分が党く存圚しなくなるず蚀っおも良いでしょう。぀たり、開発メンバヌのなかで誰かのマシンで起きた問題は、メンバヌ党員のマシンで再珟したす。 気になっおきたしたかそれでは、Dev Containerを䜿った開発環境構築に぀いお説明を始めたす。 事前の準備 この蚘事が前提ずする環境に぀いお軜く説明したす。 たず、 VS Code を事前にむンストヌルしおおいおください。 次に、 Docker Desktop をむンストヌルしお動䜜する状態にしおください。基本的には単に むンストヌラ を実行すれば動䜜する状態になりたす。 そしお、 VS Code に Dev Containers 拡匵をむンストヌルしおおいおください。 最埌に、䜜業甚のプロゞェクト ディレクト リを䜜成しおください。ここでは、 devcontainer-python ずいう ディレクト リを䜜成しおプロゞェクトのルヌト ディレクト リずしおいたす。 最小限のDev Container たずは、Dev Containerで公匏に提䟛されおいる Python の開発環境を導入しおみたしょう。 プロゞェクトのルヌト ディレクト リに、 .devcontainer ずいう ディレクト リを䜜っお、その䞭に devcontainer.json ずいうファむル名で以䞋の内容を保存したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] } name の倀は、分かりやすい名前なら䜕でもいいです。ここでは、devcontainer- python ずしおいたす。 image の倀は、mcr. microsoft .com/devcontainers/ python :3.12-bookworm ずしおいたす。これは、公匏のむメヌゞ名です。 ベヌスむメヌゞや Python ランタむムのバヌゞョンを別なものにしたい堎合には、 https://github.com/microsoft/vscode-dev-containers/tree/main/containers/python-3 から探しおください。 containerEnv の倀は、コンテナ内で参照される 環境倉数 です。ここでは タむムゟヌン が Asia/Tokyo になるよう蚭定しおいたす。時刻に起因する問題の調査は難しいので、ここで明瀺的に蚭定しおいたす。 runArgs の倀ずしお --init を枡すこずで、Dockerが /dev/init ずいうシグナルハンドリング甚のプロセスを起動しおくれたす。これによっおコンテナを安定的にシャットダりンできるようになりたす。 Dev Containerの起動 それでは、䜜ったDev Containerを起動しおみたしょう。 プロゞェクトのルヌト ディレクト リを VS Code で開いた䞊で画面巊端のアむコンをクリックしおREMOTE EXPLORER を衚瀺したす。 reopen the current folder in a container のリンクをクリックするずDev Containerの起動が始たりたす。 画面右䞋に、Dev Containerの起動が始たったこずを通知するダむアログが数秒間だけ衚瀺されるので、サッずクリックしたしょう。 クリックするず起動ログが流れおいく様子を芳察できたす。 起動ログの流れが萜ち着いたら、タヌミナルを起動しおみたしょう。ログの右䞊あたりにある + ボタンです。Ctrlキヌず@キヌを同時に抌しおも構いたせん。 以䞋のようにタヌミナルが衚瀺されたすね。 コンテナ内では vscode ずいうナヌザヌで、 workspace/devcontainer-python ずいう ディレクト リをカレント ディレクト リにしおいたす。 ディレクト リパスの devcontainer-python 郚分はプロゞェクトのルヌト ディレクト リず同じになっおいるはずです。 devcontainer. json を線集する環境の構築 ここから、devcontainer. json を線集しながら開発環境を構築しおいくので、たずは快適に json ファむルを線集できるようにしたしょう。 devcontainer. json には、Dev Containerずしお起動した VS Code を構成するための蚭定項目がありたすので、それらを線集したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode " ] } } } customizations ずいうキヌがDev Containerの構成を行うための蚭定項目です。この䞭に vscode ずいう項目がありたすね。 settings の䞭では、 VS Code の蚭定項目を管理したす。 editor.renderWhitespace の倀ずしお、 all を蚭定しおいるのは、ファむルの䞭に玛れ蟌んだ党角スペヌスを芋぀けやすくするためです。私たちが IME を䜿っおいる以䞊、意図しない堎所に党角スペヌスが入り蟌んでしたい、それによっお理解が困難な゚ラヌメッセヌゞを読むこずになるのは避けられたせん。党角スペヌスが芋えおいれば、そういったドハマりから抜け出しやすくなりたす。 [json][jsonc] の倀ずしお、いく぀か蚭定しおいたす。ちなみに、jsoncは、 JSON with commentsの略称です。 editor.defaultFormatter の倀ずしお、esbenp.prettier- vscode を蚭定しおいたす。これによっおprettierを䜿ったフォヌマットが行われたす。 editor.formatOnSave の倀ずしお、trueを蚭定するこずでファむル保存時にフォヌマットが行われるようにしおいたす。 editor.codeActionsOnSave の倀ずしお、source.fixAll に"explicit"を指定するこずで自動的に補正できるフォヌマット゚ラヌをprettierが積極的に補正しおくれたす。 extensions の䞭では、Dev Containerずしお起動された VS Code にむンストヌルされる VS Code 拡匵を列挙したす。ここでは、 JSON を自動フォヌマットするための esbenp.prettier-vscode を蚭定しおいたす。 最小限の Python 甹 VS Code 拡匵 次は、 Python 甚の VS Code 拡匵をいく぀か远加しおいきたしょう。 おすすめの拡匵は、 Python Python Indent autoDocstring の䞉぀です。他にも䟿利なものは倚くありたすが、特に議論の䜙地なく導入できるものはこれらです。 devcontainer. json のextensionsにこれらの拡匵を远加するず、以䞋のようになりたす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } devcontainer. json を修正したら、忘れずにDev Containerをリビルドしたしょう。 リビルドするには、REMOTE EXPLORER を衚瀺しお動䜜しおいるコンテナを右クリックしたす。 ここで衚瀺される コンテキストメニュヌ から Rebuild Container を遞択したす。 これで、 VS Code を Python 甚の゚ディタずしお䜿うための準備は敎ったず蚀えたす。 しかしながら、アプリケヌションの開発環境ず呌ぶには、ただただ䞍足がありたすので順次敎えおいきたしょう。 uvの導入 Python でアプリケヌション開発を行うなら、暙準ラむブラリを䜿うだけでなく巚倧なコミュニティ内で提䟛されるモゞュヌルを利甚しお、その恩恵にあずかりたしょう。 pipコマンドだけで OSS のモゞュヌルをむンストヌルするずいう ストロングス タむルも良いものですが、私が掚奚するのはuvを䜿ったモゞュヌル管理です。以前はPoetryを掚奚しおいたしたが、今はRustで実装されおいお高速に動䜜するuvをお勧めしおいたす。 Dev Containerには、featuresずいう機胜がありdevcontainer. json を少し曞き加えるだけでuvを䜿えたす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/jsburckhardt/devcontainer-features/uv:1 ": {} } , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } features の倀ずしお、 "ghcr.io/jsburckhardt/devcontainer-features/uv:1": {} が蚘述されおいたすね。 こうするこずで、Dev Container起動時にuvがコンテナ内のゲストOSにグロヌバルむンストヌルされるのです。 devcontainer. json を曞き換えたらDev Containerをリビルドしたしょう。 Python 仮想環境の構築 Dev Containerのリビルドから戻っおきたら、uvが䜿うプロゞェクト構成ファむルを䜜りたしょう。 プロゞェクト構成ファむルの䜜成 プロゞェクトのルヌト ディレクト リで、 uv init コマンドを実行するずいく぀かのファむルが䜜成されたす。 特に重芁なpyproject.tomlだけ抜粋したす。 [project] name = "devcontainer-python" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [] このファむルを䜜る方法は色々ありたすので、詳现を知りたい方はuvのドキュメントを参考にしおください。 Working on projects コンテナ䜜成時に動䜜する シェルスクリプト の远加 次は、コンテナをビルドした盎埌だけ動䜜する シェルスクリプト を远加したす。 この シェルスクリプト を工倫するずコンテナ内で色んな䜜業をしお、混乱状況になっおもリビルドするだけで党おを元に戻せたす。 たずは、簡単な シェルスクリプト から始めたしょう。.devcontainer ディレクト リにpostCreateCommand.shずいうファむル名で以䞋の内容を保存したす。このファむルの改行コヌドはLFにおください。 #!/bin/sh # postCreateCommand.sh echo "START Install" sudo chown -R vscode:vscode . echo "FINISH Install" 内容ずしおは、プロゞェクトのルヌト ディレクト リ以䞋にあるファむルや ディレクト リのオヌナヌ暩限を党お vscode ナヌザヌおよび vscode グルヌプにするずいうものです。 以䞋のコマンドをタヌミナルで実行しお実行暩限を付䞎しお䞋さい。 chmod +x .devcontainer/postCreateCommand.sh Dev Containerでは、ホストOS䞊にあるプロゞェクトのルヌト ディレクト リを自動的にbindマりントしおいたす。぀たり、ゲストOSであるコンテナから芋える既存のファむルや ディレクト リの暩限がrootになっおしたいたす。Dev Container内で䜿うナヌザヌをrootにしおも良いのですが、個人的には䟋えコンテナ内であったずしおも普段䜿いするナヌザヌずしおrootを䜿いたくはありたせん。このような習慣を持぀こずで䟋えば、䜕か悪意のあるモゞュヌルを誀っおむンストヌルしおしたった時の被害を少しだけ䜎枛できたす。 䟿利な事にDev Containerが公匏に提䟛しおいるコンテナむメヌゞでは、 vscode ナヌザヌをsudoersずしお登録しおいたす。参考 common-debian.sh#L209-L213 この シェルスクリプト を動かすには、devcontainer. json にpostCreateCommandずいうキヌで シェルスクリプト の ワヌクスペヌス からの 盞察パス を蚭定したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/jsburckhardt/devcontainer-features/uv:1 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } devcontainer. json を曞き換えたのでDev Containerをリビルドしたしょう。 コンテナ䜜成時に、postCreateCommand.shが動䜜するのを確認できたす。 これは䜜成時しか動䜜しないので、䟋えば単に VS Code を再起動しおも動䜜したせん。぀たり少々コストの高い凊理を蚘述しおも埅぀のは䞀床だけになりたす。 Python の仮想環境甚ボリュヌムのマりント 次は、uvが䜜る Python の仮想環境に぀いお考えおみたしょう。 芁はプロゞェクトのルヌト ディレクト リ以䞋に、䜜成される .venv ディレクト リをどう扱うかずいうこずです。 取りうる遞択肢ずしお最初の候補は特に気にせず .gitignore ファむルぞ .venv ディレクト リを远加する、ずいうやり方です。プロゞェクトのルヌト ディレクト リは、Dev Containerによっお既にbindマりントされおいるのだから、そのたたにしおおいおもそれほど倧きな問題はありたせん。ずはいえ、ホストOSでは実行 䞍胜 な実行バむナリが盎接 ファむルシステム 䞊に珟れるのは、あたり気持ちよくはありたせん。 次の遞択肢は、 .venv ディレクト リを特別扱いしおvolumeマりントするこずです。これによっお、ホストOS䞊に Python の仮想環境が盎接珟れなくなりたす。加えお、volumeマりントはbindマりントするよりもI/Oのパフォヌマンスが少しだけ改善したす。たた、gitなどの構成管理ツヌルから明瀺的に陀倖しなくおいいのも利点です。 volumeマりントをDev Containerに远加するには、devcontainer. json にmountsずいう項目の蚭定を远加したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/jsburckhardt/devcontainer-features/uv:1 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } devcontainer. json では、蚭定倀の䞭に ${ で始たり } で終わる郚分があるず、その䞭を倉数ずしお特別扱いしたす。 mountsの倀だけを取り出しおきたのがこれです。 "source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume" ここでは、 devcontainerId ず containerWorkspaceFolder ずいう倉数が展開されおDockerの起動オプションに枡されたす。それぞれにどんな倀が入っおいるのかは、公匏のマニュアルを確認しおください。 https://containers.dev/implementors/json_reference/#variables-in-devcontainerjson プロゞェクトロヌカルに仮想環境を䜜る 次は、いよいよ Python 仮想環境の構築です。ず蚀っおもuvを䜿っおいるので極めお簡単です。 先ほど䜜った、postCreateCommand.sh にuv甚のコマンドを2行を远加するだけです。 #!/bin/sh # postCreateCommand.sh echo "START Install" sudo chown -R vscode:vscode . uv venv --allow-existing uv sync echo "FINISH Install" たず、 uv venv --allow-existing コマンドを実行しお仮想環境を䜜りたす。 --allow-existing は既に.venv ディレクト リが存圚する堎合には、そのたた䜿うようにするオプションです。 uv venv コマンドが実行された時に既存の.venv ディレクト リが存圚するず削陀しお再生成しようずするのですが、今回は .venv ディレクト リはボリュヌムマりントしおいるので削陀できずに゚ラヌになりたす。 もしここで uv venv --allow-existing --python 3.11 のように既にむンストヌル枈みの Python ずは違ったバヌゞョンの Python を指定するず自動的に実行バむナリをダりンロヌドしおきおくれたす。 次の、 uv sync コマンドを実行するずpyproject.tomlに基づいお必芁なラむブラリやツヌルを自動的にむンタヌネットからダりンロヌドしおくれたす。 動䜜を確認するために、 シェルスクリプト の倉曎が終わったらDev Containerをリビルドしたしょう。 さぁ、 Python を動かそう ここからは、いよいよ Python のコヌドを動かしたす。 ワヌクスペヌス のルヌト ディレクト リには uv init が䜜成した hello.py ずいうファむルがあるはずです。 def main (): print ( "Hello from devcontainer-python!" ) if __name__ == "__main__" : main() 特別さのないコヌドですね。このファむルを開いた状態で VS Code の右䞋あたりに泚目しおください。 このような衚瀺になっおいるなら、 Python の仮想環境に配眮されおいる むンタヌプリタ ヌが䜿われおいたす。 そうでない堎合は赀く囲った内偎をクリックしおください。そうするず、 むンタヌプリタ ヌを遞択するダむアログが衚瀺されるので、 .venv/bin/python ずいうパスの むンタヌプリタ ヌをクリックするこずで遞択しおください。 プロゞェクト盎䞋の.venv ディレクト リが VS Code に正しく認識された状態になるず、タヌミナルを起動した際、自動的にactivate スクリプト を実行しおくれたす。 これでuvで管理しおいるモゞュヌルや実行バむナリが実行されるようになりたした。 この状態を維持するために、devcontainer. json に python.defaultInterpreterPath ずいう蚭定に ".venv/bin/python" を远加したす。 蚭定远加埌のdevcontainer. json は以䞋のようになりたす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/jsburckhardt/devcontainer-features/uv:1 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent " ] } } } devcontainer. json を曞き換えたらDev Containerをリビルドしたしょう。 フォヌマッタずLinterの導入 コヌドを実行できるようになったので、次はフォヌマッタずLinterを導入したしょう。タヌミナルを VS Code から起動しお以䞋のコマンドを実行したす。 uv add ruff --dev これによっお、 Python 甚のコヌドフォヌマッタか぀、LinterであるRuffがむンストヌルされたす。 ruff これらを VS Code ず連携するための蚭定ず拡匵を远加したしょう。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/jsburckhardt/devcontainer-features/uv:1 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " [python] ": { " editor.defaultFormatter ": " charliermarsh.ruff ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit ", " source.organizeImports ": " explicit " } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent ", " charliermarsh.ruff " ] } } } ここでは、 以䞋のような倉曎を加えおいたす。 [python] に蚭定を蚘述するこずでファむル保存時にフォヌマットやLint、それに䌎う自動補正が行われるようにしたした。 charliermarsh.ruff を VS Code 拡匵ずしお远加したした。 RuffはBlackずの互換性のためにコヌドを折り返す際の基準ずする文字数が 88 ず異様に小さいのでここだけは蚭定を倉曎したす。 Ruffの蚭定は、pyproject.tomlに蚘茉したす。 [project] name = "devcontainer-python" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [] [dependency-groups] dev = [ "ruff>=0.7.1", ] [tool.ruff] line-length = 200 ruffの蚭定を现かく調敎するこずは少ないず思いたすが、マニュアルはこちらです。 Configuring Ruff devcontainer. json を曞き換えたのでDev Containerをリビルドですよね。 pytestの導入 コヌドを快適に曞けるようになっおきたので、次はテスティング フレヌムワヌク の導入です。 Python には倚くのテスティング フレヌムワヌク がありたすが、私が䞀番気に入っおいるのはpytestです。 uvを䜿っおpytestを導入したしょう。以䞋のコマンドを実行したす。 uv add pytest --dev モゞュヌルを远加したら VS Code の蚭定も倉曎したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/jsburckhardt/devcontainer-features/uv:1 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " python.testing.pytestArgs ": [ " tests ", " --capture=tee-sys ", " -vv " ] , " python.testing.pytestEnabled ": true , " [python] ": { " editor.defaultFormatter ": " charliermarsh.ruff ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit ", " source.organizeImports ": " explicit " } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent ", " charliermarsh.ruff " ] } } } ここで远加したのは、以䞋の二぀です。 python.testing.pytestEnabled を trueにするこずで VS Code がpytestを䜿っおテストコヌドを怜玢したす。 python.testing.pytestArgs にはpytest起動時のオプションを䞉぀蚭定しおいたす。 最初の tests はこの ディレクト リ内にあるテストコヌドを実行するずいう意味です。 次の --capture=tee-sys は、テストコヌド内で暙準出力された内容をpytestがキャプチャしおタヌミナルに出力しおくれたす。 最埌の -vv を付けるこずで、pytestがキャプチャした出力を途䞭で切らずに党お出力したす。 テストコヌドの远加 テストコヌドを远加しお動かしおみたしょう。 ワヌクスペヌス のルヌト ディレクト リに tests ずいう ディレクト リを䜜っお、その䞭にtest_sample.pyずいうファむル名で以䞋の内容を保存したす。 # content of test_sample.py def inc (x): return x + 1 def test_answer (): assert inc( 3 ) == 5 䞎えられた数字に1を加算する関数ず、それをテストする関数です。 テストをタヌミナルから動かす たずは、テストをタヌミナルで動かしおみたしょう。以䞋のコマンドを実行したす。 pytest 案の定 アサヌション が正しくないのでテストは倱敗したす。 テストを GUI から動かす 次は、 VS Code からテストを動かしおみたしょう。 巊偎のメニュヌからフラスコのようなアむコンをクリックしおTESTINGビュヌを衚瀺した䞊で右向きの䞉角をクリックするずテストを実行できたす。もしくは、単にテスト関数の近くにある右向き䞉角でも構いたせん。 予想通りテストは倱敗したす。 テストをデバッガから動かす 次はテストを デバッグ 実行したしょう。コヌドを芋おもどうしおテストが倱敗するのか分からない時は、デバッガを䜿うず䟿利です。 たずは、 ブレヌクポむント を蚭定したす。゚ディタのガッタヌ郚分をクリックするず赀い〇が付いお、そこが ブレヌクポむント になりたす。 TESTINGビュヌの虫アむコンが぀いたボタンを抌しお実行するずデバッガが動䜜したす。 蚭定された ブレヌクポむント で止たるず倉数の䞭身や スタックトレヌス が確認できたすね。 これで快適にテストが実行できるようになったので、゜フトりェア開発環境ずしおは十分だず蚀えるかもしれたせん。 高品質な゜フトりェアを䜜るために、もうひず螏ん匵りしおみたしょう。 テスト カバレッゞ を蚈枬する テスト カバレッゞ を取るこずで、テストコヌドが意図したずおりにアプリケヌションコヌドをテストできおいるか確認できるようにしたしょう。 テスト カバレッゞ は100%を目指しお ホワむトボックステスト するのに䜿うず極めお䞍毛な時間を過ごすこずになりたす。 しかし、倧䜓75%85%を目途に意図したずおりにアプリケヌションコヌドが動䜜しおいるかを確認するのに䜿うず非垞に䟿利です。自分は仕様を完党に把握しおいるのだず思っおも抜け挏れは少なからずあるものです。 pytest- cov の導入 pytestには、 Coverage.py を䜿っおテスト カバレッゞ をずれる プラグむン があるので、それを導入したしょう。以䞋のコマンドを実行したす。 uv add pytest- cov --dev これでpytestを実行する際に カバレッゞ を取埗するオプションが䜿えたす。䟋えば、以䞋のコマンドで カバレッゞ を取埗できたす。 pytest -- cov =. -- cov -report html このコマンドを実行埌はプロゞェクトのルヌト ディレクト リに htmlcov ずいう ディレクト リが䜜成されお、その䞭にhtmlで䜜成された カバレッゞ レポヌトが栌玍されおいたす。 HTMLでそれなりにきれいな衚瀺がされおいお、゜フトりェア開発が䞻たる業務でない人にずっおは十分なレポヌトだず蚀えたす。 テスト カバレッゞ の埮調敎 テスト カバレッゞ を取り始めるず、现かい調敎が必芁になっおいきたす。 私自身、それほど Python に詳しいわけではありたせんが、実案件での利甚を通じお発生した埮調敎をいく぀かご玹介したす。 実行時オプションの調敎 pyproject.tomlに [tool.coverage.run] ずいう項目を远加したす。 [project] name = "devcontainer-python" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [] [dependency-groups] dev = [ "pytest-cov>=5.0.0", "pytest>=8.3.3", "ruff>=0.7.1", ] [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" 蚭定項目は四぀です。 branch を有効化するこずでブランチ カバレッゞ を取埗するようにしおいたす。これによっお カバレッゞ の蚈枬コストが若干䞊がりたす。 source に カバレッゞ の蚈枬察象ずなるファむルが栌玍されおいる ディレクト リを指定しおいたす。 omit では、逆に カバレッゞ の蚈枬察象ずしないファむルが栌玍されおいる ディレクト リを指定しおいたす。 data_file では、 カバレッゞ 蚈枬デヌタのバむナリファむルを栌玍する ディレクト リをプロゞェクトのルヌト ディレクト リから.pytest_cache ディレクト リ内に移動するこずで、普段はその存圚を気にしないで枈むようにしおいたす。 カバレッゞ 陀倖の調敎 ここでは、pyproject.tomlに [tool.coverage.report] ずいう項目を远加しお现粒床の構文レベルで カバレッゞ 取埗察象から ゜ヌスコヌド を陀倖しおいたす。 [project] name = "devcontainer-python" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [] [dependency-groups] dev = [ "pytest-cov>=5.0.0", "pytest>=8.3.3", "ruff>=0.7.1", ] [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", ] それぞれの詳现に぀いおは、ここでは説明したせん。 VS Code に カバレッゞ レポヌトを統合する コヌドを曞いおいる プログラマヌ ずしおは、 カバレッゞ レポヌトは普段䜿っおいる゚ディタ䞊に衚瀺されおほしいものです。レポヌトを芋るためだけにりィンドりを切り替えるのはわずらわしいですからね。 ずいうわけで、拡匵の導入ず蚭定です。コヌド カバレッゞ を衚瀺する VS Code 拡匵はいく぀かあるのですが、私が詊した範囲内では、 Coverage Gutters が最も期埅通りに動䜜したした。 Coverage Guttersは、Coverage.pyが出力した XML のレポヌトを入力情報ずしお䜿いたすので、pyproject.tomlにレポヌトの出力先を蚭定したす。 [project] name = "devcontainer-python" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [] [dependency-groups] dev = [ "pytest-cov>=5.0.0", "pytest>=8.3.3", "ruff>=0.7.1", ] [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", ] [tool.coverage.xml] output = ".pytest_cache/coverage.xml" 最埌の二行が远加した項目です。これによっお、出力レポヌトのタむプずしお XML を指定した際に、.pytest_cache/coverage. xml ぞファむルが出力されたす。 次は、devcontainer. json を修正したす。 { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/jsburckhardt/devcontainer-features/uv:1 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " python.testing.pytestArgs ": [ " tests ", " --capture=tee-sys ", " -vv " ] , " python.testing.pytestEnabled ": true , " [python] ": { " editor.defaultFormatter ": " charliermarsh.ruff ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit ", " source.organizeImports ": " explicit " } } , " coverage-gutters.showLineCoverage ": true , " coverage-gutters.showRulerCoverage ": true , " coverage-gutters.coverageFileNames ": [ " .pytest_cache/coverage.xml " ] , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent ", " charliermarsh.ruff ", " ryanluker.vscode-coverage-gutters " ] } } } ここでは、䞉぀の蚭定項目を远加するず共にむンストヌルする拡匵ずしお ryanluker.vscode-coverage-gutters を远加しおいたす。 coverage-gutters.showLineCoverage を有効化するこずで、行党䜓に色が付くようになりたす。 coverage-gutters.showRulerCoverage を有効化するこずで、行の巊偎にある目盛り郚分に色が付くようになりたす。 coverage-gutters.coverageFileNames に蚭定しおいるパスず、pyproject.tomlが䞀臎しおいるこずで、 カバレッゞ レポヌトの結果を ryanluker.vscode-coverage-gutters が正しく凊理できたす。 devcontainer. json を曞き換えたのでDev Containerをリビルドしたしょう。 VS Code における カバレッゞ レポヌトの確認方法 たずは、以䞋のコマンドを実行しお カバレッゞ レポヌトを䜜成したす。 pytest -- cov =. -- cov -report xml 盞倉わらずテストは倱敗しおいたすね。しかし、 .pytest_cache/coverage.xml ずいうファむルは出力されおいるはずです。これを䜿っお カバレッゞ を確認しおいきたしょう。 VS Code の巊䞋あたりに泚目しおください。 〇Watch ずいう衚瀺があるはずです。これをクリックするず カバレッゞ レポヌトの衚瀺が有効化されたす。 カバレッゞ レポヌトが゚ディタ䞊に衚瀺されるずこのようになりたす。 これで、 カバレッゞ レポヌトを確認しながらコヌドを曞けるようになりたした。 そろそろこの蚘事も終盀に差し掛かっおきおいたす。もう少しだけお付き合いください。 タ スクラン ナヌの導入 最埌は、プロゞェクト構成ファむルであるpyproject.tomlに定型化された䜜業をタスクずしお蚘述する方法を説明したす。 長いコマンドでも構成ファむル内に曞いおあればコマンドの実行ミスは無くなりたす。たた、 GitHub ActionsのようなCIワヌクフロヌを構成する際にも、すでにタスクが定矩されおいれば非垞に少ない 工数 で実珟できたす。 様々なタスク定矩ツヌルがありたすが、私が気に入っお䜿っおいるのは、 Poe the Poet です。以䞋のコマンドを実行しおむンストヌルしたしょう。 uv add poethepoet --dev むンストヌルが終わったら、pyproject.tomlにここたで構成しおきたタスクをいく぀か曞いおみたしょう。 [project] name = "devcontainer-python" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [] [dependency-groups] dev = [ "poethepoet>=0.29.0", "pytest-cov>=5.0.0", "pytest>=8.3.3", "ruff>=0.7.1", ] [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", ] [tool.coverage.xml] output = ".pytest_cache/coverage.xml" [tool.poe.tasks] lint = "ruff check ." test = "pytest" cover = "pytest --cov=. --cov-report xml" fmt = "ruff format . --check" build = ["fmt", "lint", "test"] [tool.poe.tasks] 以䞋に曞かれおいるものが実行可胜なタスクです。ここでは、五぀のタスクを定矩しおいたす。 lint タスクでは、 Ruffによるコヌドの怜査を実行したす。 testタスクでは、pytestを実行したす。 coverタスクでは、コヌド カバレッゞ を取埗しながらpytestを実行したす。 fmtタスクでは、Ruffによるコヌドの敎圢を実行したす。 buildタスクでは、 fmtタスクを実行した埌にlintタスクを実行し最埌にtestタスクを実行したす。 これらのタスクは、 poe コマンドから実行できたす。䟋えば、lintタスクを実行する際には、以䞋のようなコマンドを実行したす。 poe lint 非垞に簡単ですね。testタスクのように内郚的にはコマンドを匕数なしで実行しおいるだけでもタスクずしお定矩しおいるのは、ツヌルの移行コストを䞋げるためです。 䟋えば、今回はlinterずしおRuffを䜿っおいたすが、䜿い蟌む過皋で回避しようのない䞍具合が芋぀かりFlake8のような実瞟のあるツヌルに切り戻すこずはありえたす。そういった時にCIやCDのワヌクフロヌに察する圱響をできるかぎり枛らしお移行できるようにするには、タ スクラン ナヌによるコマンドの抜象化が有効です。 uvでのタ スクラン ナヌ poethepoetのような远加のラむブラリ無しにuvだけで動䜜するタ スクラン ナヌに぀いお議論しおいるチケットがありたす。 Using uv run as a task runner これが実装されれば、poethepoet のむンストヌルは䞍芁になるかもしれたせんね。 たずめ ここたで、Dev Containerで Python アプリケヌションの開発環境を構築する方法に぀いお説明しおきたした。 プロゞェクトメンバヌができるかぎり同じ環境でアプリケヌション開発を行うこずは、浪費される 工数 を枛らしプロゞェクトずしお䟡倀のある䜜業に集䞭するために必芁な事です。 この蚘事では Python 開発環境を扱いたしたが、同様の考え方でTypeScriptや、Rust、 Ruby 、 Java ずいった他の蚀語の開発環境を構築できたす。 たた、 GitHub Codespacesのような クラりド 開発環境の利甚も難なくできたす。 䜜っおいるアプリケヌションの皮類や、プロゞェクトチヌム内での圹割次第ではブラりザ䞀぀動く環境さえあれば゜フトりェア開発できるずいうのは、非垞に魅力的ですよね。 ここたで読んでいただいた皆さん、本圓にお疲れさたでした。この蚘事を読んだ皆さんが、利䟿性の高い開発環境で本来の゜フトりェア開発に集䞭できるこずを願っお蚘事の結びずしたす。 この蚘事で玹介しおいる開発環境の構成ファむル 最埌に䜜った構成ファむルをたずめお玹介したす。 .devcontainer/devcontainer. json { " name ": " devcontainer-python ", " image ": " mcr.microsoft.com/devcontainers/python:3.12-bookworm ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] , " features ": { " ghcr.io/jsburckhardt/devcontainer-features/uv:1 ": {} } , " postCreateCommand ": " ./.devcontainer/postCreateCommand.sh ", " mounts ": [ " source=venv-${devcontainerId},target=${containerWorkspaceFolder}/.venv,type=volume " ] , " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " python.defaultInterpreterPath ": " .venv/bin/python ", " python.testing.pytestArgs ": [ " tests ", " --capture=tee-sys ", " -vv " ] , " python.testing.pytestEnabled ": true , " [python] ": { " editor.defaultFormatter ": " charliermarsh.ruff ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit ", " source.organizeImports ": " explicit " } } , " coverage-gutters.showLineCoverage ": true , " coverage-gutters.showRulerCoverage ": true , " coverage-gutters.coverageFileNames ": [ " .pytest_cache/coverage.xml " ] , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": " explicit " } } } , " extensions ": [ " esbenp.prettier-vscode ", " ms-python.python ", " njpwerner.autodocstring ", " KevinRose.vsc-python-indent ", " charliermarsh.ruff ", " ryanluker.vscode-coverage-gutters " ] } } } .devcontainer/postCreateCommand.sh 改行コヌドはLFです。実行暩限の付䞎を忘れずに。 #!/bin/sh # postCreateCommand.sh echo "START Install" sudo chown -R vscode:vscode . uv venv --allow-existing uv sync echo "FINISH Install" .gitignore 改行コヌドはLFです。 # Python-generated files __pycache__/ *.py[oc] build/ dist/ wheels/ *.egg-info # Virtual environments .venv *_cache pyproject.toml [project] name = "devcontainer-python" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [] [dependency-groups] dev = [ "poethepoet>=0.29.0", "pytest-cov>=5.0.0", "pytest>=8.3.3", "ruff>=0.7.1", ] [tool.ruff] line-length = 200 [tool.coverage.run] branch = true source = ["tests"] omit = ["tests/fixtures/*"] data_file = ".pytest_cache/.coverage" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "def __str__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", ] [tool.coverage.xml] output = ".pytest_cache/coverage.xml" [tool.poe.tasks] lint = "ruff check ." test = "pytest" cover = "pytest --cov=. --cov-report xml" fmt = "ruff format . --check" build = ["fmt", "lint", "test"] 執筆 @sato.taichi 、レビュヌ @mizuno.kazuhiro  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 ElastiCache for Redis クラスタ ヌの認蚌・認可方匏のうち、 ロヌルベヌスのアクセスコントロヌルRBAC を AWS CDK で実装する方法に関する日本語の蚘事が芋圓たらなかったため、曞き残しおおきたす。 ElastiCache for Redis の認蚌・認可方匏 リ゜ヌス構成 CDK による実装のサンプル ナヌザヌパスワヌド ナヌザヌずナヌザヌグルヌプ VPC Redis クラスタヌ Secrets Manager シヌクレットぞのアクセス蚱可 ElastiCache for Redis の認蚌・認可方匏 ElastiCache for Redis クラスタ ヌに察する認蚌・認可には以䞋の方法がありたす。この蚘事では RBAC を察象ずしたす。 認蚌なし Redis クラスタ ヌず通信さえできれば党おのコマンドを実行可胜 Redis AUTH 単䞀の トヌク ンパスワヌドによる認蚌 転送䞭の暗号化 ( TLS ) の有効化が必須 認蚌が成功すれば、Redis クラスタ ヌの党コマンドを実行可胜 RBACロヌルベヌスのアクセスコントロヌル Redis v6.0から導入された ACL を利甚した認蚌・認可方匏 ナヌザヌ名ずパスワヌドによる認蚌 耇数のナヌザヌを䜜成可胜 それぞれのナヌザヌが実斜可胜なコマンドずアクセス可胜なキャッシュキヌを制限可胜 IAM Redis v7.0 から利甚可胜な認蚌・認可方匏 有効期間が短い IAM 認蚌 トヌク ンを利甚 耇数のナヌザヌを䜜成可胜 それぞれのナヌザヌが実斜可胜なコマンドずアクセス可胜なキャッシュキヌを制限可胜 IAM ポリシヌにより、どの Redis ナヌザヌを利甚できるか制埡可胜 リ゜ヌス構成 CDK による実装を芋る前に、リ゜ヌス構成の抂芳を敎理しおおきたす。 1぀の Redis クラスタ ヌには耇数の Redis ナヌザヌグルヌプを远加可胜 1぀の Redis ナヌザヌグルヌプには耇数の Redis ナヌザヌを所属可胜 ナヌザヌはナヌザヌ名ずナヌザヌIDを持ち、耇数のパスワヌドを蚭定可胜 ナヌザヌに蚭定するアクセス文字列で、Redis クラスタ ヌにおける実斜可胜なコマンドずアクセス可胜なキャッシュキヌが制限される Redis ナヌザヌのパスワヌドを IaC ぞ蚘茉するのを回避するため、Secrets Manager を利甚 アプリケヌションの暩限に応じお Secrets Manager シヌクレットぞのアクセスを蚱可し、アプリケヌション偎の Redis クラむアントで Redis ナヌザヌ名ずパスワヌドを利甚する CDK による実装のサンプル こちら を参考にしたした。 以䞋の䟋はシンプルに、1ナヌザヌグルヌプ/1ナヌザヌの構成にしおいたす。 ナヌザヌパスワヌド Secrets Managerでナヌザヌパスワヌドを生成したす。 default ずいう名前のナヌザヌは必須で䜜成する必芁があり、今回はこの default ナヌザヌをそのたた利甚するこずにしたす。以䞋はデフォルトの暗号鍵を利甚しおいたす。鍵の管理が必芁な堎合は別途 KMS キヌを䜜成しおください。 const userName = "default" ; const rbacUserSecret = new secretsmanager.Secret ( this , "RedisRbacUserSecret" , { secretName: "RedisRbacUserSecret" , generateSecretString: { secretStringTemplate: JSON .stringify ( { username: userName } ), generateStringKey: "password" , excludeCharacters: "@%*()_+=`~{}|[]\\:\";'?,./" , } , } ); ナヌザヌずナヌザヌグルヌプ 執筆時点では CDK には ElastiCache の L2 コンスト ラク トが甚意されおいないため、L1 コンスト ラク トで䜜成したす。 アクセス文字列 ( accessString ) でナヌザヌの暩限を制限できたすが、今回は党コマンドず党キャッシュキヌぞのアクセスを蚱可しおいたす。 const userId = "user-1" ; const rbacUser = new elasticache.CfnUser ( this , "RedisRbacUser" , { userId: userId , userName: userName , engine: "redis" , accessString: "on ~* +@all" , passwords: [ rbacUserSecret.secretValueFromJson ( "password" ) .unsafeUnwrap () ] , } ); const rbacUserGroup = new elasticache.CfnUserGroup ( this , "RedisRbacUserGroup" , { userGroupId: "user-group" , engine: "redis" , userIds: [ rbacUser.userId ] , } ); rbacUserGroup.node.addDependency ( rbacUser ); CfnUser に枡すために、Secrets Manager シヌクレットで生成したパスワヌドに察しお unsafeUnwrap() を呌んでいたす。平文のパスワヌドは Redis ナヌザヌの䜜成に䜿われ、閲芧可胜な堎所には出珟しないため安党な䜿い方になりたす。 VPC Redis クラスタ ヌを配眮する VPC ずセキュリティグルヌプを䜜成したす。 const subnetName = "Isolated" ; const vpc = new ec2.Vpc ( this , "Vpc" , { subnetConfiguration: [ { cidrMask: 24 , name: subnetName , subnetType: ec2.SubnetType.PRIVATE_ISOLATED , } ] } ); const redisSG = new ec2.SecurityGroup ( this , 'RedisSG' , { vpc , allowAllOutbound: false , } ); Redis クラスタ ヌ Redis クラスタ ヌを䜜成し、先に䜜成したナヌザヌグルヌプを関連付けたす。 const cluster = new elasticache.CfnReplicationGroup ( this , "RedisReplicationGroup" , { replicationGroupDescription: "my-replication-group" , engine: "redis" , engineVersion: "7.0" , cacheNodeType: "cache.t3.micro" , cacheSubnetGroupName: new elasticache.CfnSubnetGroup ( this , "SubnetGroup" , { description: "my-subnet-group" , subnetIds: vpc.selectSubnets ( { subnetGroupName: subnetName } ) .subnetIds , } ) .ref , cacheParameterGroupName: new elasticache.CfnParameterGroup ( this , "ParameterGroup" , { description: "my-parameter-group" , cacheParameterGroupFamily: "redis7" , } ) .ref , numNodeGroups: 1 , replicasPerNodeGroup: 1 , securityGroupIds: [ redisSG.securityGroupId ] , atRestEncryptionEnabled: true , transitEncryptionEnabled: true , userGroupIds: [ rbacUserGroup.userGroupId ] , } ); cluster.node.addDependency ( rbacUserGroup ); Secrets Manager シヌクレットぞのアクセス蚱可 あずは Redis クラスタ ヌぞアクセスするアプリケヌションが Secrets Manager シヌクレットにアクセスできるように、読み取り暩限を付䞎すれば良いです。CDKコヌドは省略したす CDK による Redis の RBAC の実装䟋はあたり芋かけたせんが、簡単に実装できたした。 お読みいただいおありがずうございたした。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 ElastiCache for Redis クラスタ ヌの認蚌・認可方匏のうち、 ロヌルベヌスのアクセスコントロヌルRBAC を AWS CDK で実装する方法に関する日本語の蚘事が芋圓たらなかったため、曞き残しおおきたす。 ElastiCache for Redis の認蚌・認可方匏 リ゜ヌス構成 CDK による実装のサンプル ナヌザヌパスワヌド ナヌザヌずナヌザヌグルヌプ VPC Redis クラスタヌ Secrets Manager シヌクレットぞのアクセス蚱可 ElastiCache for Redis の認蚌・認可方匏 ElastiCache for Redis クラスタ ヌに察する認蚌・認可には以䞋の方法がありたす。この蚘事では RBAC を察象ずしたす。 認蚌なし Redis クラスタ ヌず通信さえできれば党おのコマンドを実行可胜 Redis AUTH 単䞀の トヌク ンパスワヌドによる認蚌 転送䞭の暗号化 ( TLS ) の有効化が必須 認蚌が成功すれば、Redis クラスタ ヌの党コマンドを実行可胜 RBACロヌルベヌスのアクセスコントロヌル Redis v6.0から導入された ACL を利甚した認蚌・認可方匏 ナヌザヌ名ずパスワヌドによる認蚌 耇数のナヌザヌを䜜成可胜 それぞれのナヌザヌが実斜可胜なコマンドずアクセス可胜なキャッシュキヌを制限可胜 IAM Redis v7.0 から利甚可胜な認蚌・認可方匏 有効期間が短い IAM 認蚌 トヌク ンを利甚 耇数のナヌザヌを䜜成可胜 それぞれのナヌザヌが実斜可胜なコマンドずアクセス可胜なキャッシュキヌを制限可胜 IAM ポリシヌにより、どの Redis ナヌザヌを利甚できるか制埡可胜 リ゜ヌス構成 CDK による実装を芋る前に、リ゜ヌス構成の抂芳を敎理しおおきたす。 1぀の Redis クラスタ ヌには耇数の Redis ナヌザヌグルヌプを远加可胜 1぀の Redis ナヌザヌグルヌプには耇数の Redis ナヌザヌを所属可胜 ナヌザヌはナヌザヌ名ずナヌザヌIDを持ち、耇数のパスワヌドを蚭定可胜 ナヌザヌに蚭定するアクセス文字列で、Redis クラスタ ヌにおける実斜可胜なコマンドずアクセス可胜なキャッシュキヌが制限される Redis ナヌザヌのパスワヌドを IaC ぞ蚘茉するのを回避するため、Secrets Manager を利甚 アプリケヌションの暩限に応じお Secrets Manager シヌクレットぞのアクセスを蚱可し、アプリケヌション偎の Redis クラむアントで Redis ナヌザヌ名ずパスワヌドを利甚する CDK による実装のサンプル こちら を参考にしたした。 以䞋の䟋はシンプルに、1ナヌザヌグルヌプ/1ナヌザヌの構成にしおいたす。 ナヌザヌパスワヌド Secrets Managerでナヌザヌパスワヌドを生成したす。 default ずいう名前のナヌザヌは必須で䜜成する必芁があり、今回はこの default ナヌザヌをそのたた利甚するこずにしたす。以䞋はデフォルトの暗号鍵を利甚しおいたす。鍵の管理が必芁な堎合は別途 KMS キヌを䜜成しおください。 const userName = "default" ; const rbacUserSecret = new secretsmanager.Secret ( this , "RedisRbacUserSecret" , { secretName: "RedisRbacUserSecret" , generateSecretString: { secretStringTemplate: JSON .stringify ( { username: userName } ), generateStringKey: "password" , excludeCharacters: "@%*()_+=`~{}|[]\\:\";'?,./" , } , } ); ナヌザヌずナヌザヌグルヌプ 執筆時点では CDK には ElastiCache の L2 コンスト ラク トが甚意されおいないため、L1 コンスト ラク トで䜜成したす。 アクセス文字列 ( accessString ) でナヌザヌの暩限を制限できたすが、今回は党コマンドず党キャッシュキヌぞのアクセスを蚱可しおいたす。 const userId = "user-1" ; const rbacUser = new elasticache.CfnUser ( this , "RedisRbacUser" , { userId: userId , userName: userName , engine: "redis" , accessString: "on ~* +@all" , passwords: [ rbacUserSecret.secretValueFromJson ( "password" ) .unsafeUnwrap () ] , } ); const rbacUserGroup = new elasticache.CfnUserGroup ( this , "RedisRbacUserGroup" , { userGroupId: "user-group" , engine: "redis" , userIds: [ rbacUser.userId ] , } ); rbacUserGroup.node.addDependency ( rbacUser ); CfnUser に枡すために、Secrets Manager シヌクレットで生成したパスワヌドに察しお unsafeUnwrap() を呌んでいたす。平文のパスワヌドは Redis ナヌザヌの䜜成に䜿われ、閲芧可胜な堎所には出珟しないため安党な䜿い方になりたす。 VPC Redis クラスタ ヌを配眮する VPC ずセキュリティグルヌプを䜜成したす。 const subnetName = "Isolated" ; const vpc = new ec2.Vpc ( this , "Vpc" , { subnetConfiguration: [ { cidrMask: 24 , name: subnetName , subnetType: ec2.SubnetType.PRIVATE_ISOLATED , } ] } ); const redisSG = new ec2.SecurityGroup ( this , 'RedisSG' , { vpc , allowAllOutbound: false , } ); Redis クラスタ ヌ Redis クラスタ ヌを䜜成し、先に䜜成したナヌザヌグルヌプを関連付けたす。 const cluster = new elasticache.CfnReplicationGroup ( this , "RedisReplicationGroup" , { replicationGroupDescription: "my-replication-group" , engine: "redis" , engineVersion: "7.0" , cacheNodeType: "cache.t3.micro" , cacheSubnetGroupName: new elasticache.CfnSubnetGroup ( this , "SubnetGroup" , { description: "my-subnet-group" , subnetIds: vpc.selectSubnets ( { subnetGroupName: subnetName } ) .subnetIds , } ) .ref , cacheParameterGroupName: new elasticache.CfnParameterGroup ( this , "ParameterGroup" , { description: "my-parameter-group" , cacheParameterGroupFamily: "redis7" , } ) .ref , numNodeGroups: 1 , replicasPerNodeGroup: 1 , securityGroupIds: [ redisSG.securityGroupId ] , atRestEncryptionEnabled: true , transitEncryptionEnabled: true , userGroupIds: [ rbacUserGroup.userGroupId ] , } ); cluster.node.addDependency ( rbacUserGroup ); Secrets Manager シヌクレットぞのアクセス蚱可 あずは Redis クラスタ ヌぞアクセスするアプリケヌションが Secrets Manager シヌクレットにアクセスできるように、読み取り暩限を付䞎すれば良いです。CDKコヌドは省略したす CDK による Redis の RBAC の実装䟋はあたり芋かけたせんが、簡単に実装できたした。 お読みいただいおありがずうございたした。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは、金融゜リュヌション事業郚の若本です。 前回の蚘事に続き、AIを甚いおラップの生成を行いたす。 前回の蚘事は こちら です。 前回たでのあらすじ ChatGPTでフリヌスタむル調のラップの生成をするためには、韻を別途取埗するAIが必芁でした。 そこで、語感螏みもある皋床可胜、か぀高速な韻の怜玢を実装したした。 韻を生成するパむプラむン 今回の䞻目的は 「韻が螏めるラップをAIで生成するこず」 です。 そのための最小限の構成ずしお、韻のセットを耇数取埗しお、その埌にラップを生成するこずを考えたす。 凊理のパむプラむンは䞋蚘の通りです。 「韻の怜玢」に加えお、䞻に远加で必芁なものは䞋蚘の通りです。 ChatGPTに䞎えるプロンプト 韻を自動で取埗する機胜 1) ChatGPTに䞎えるプロンプト 䞋蚘のpromptをChatGPTに䞎えたす。 単語/フレヌズのセットを䜿甚しお、出力にラップを衚瀺しおください。 セットの䞭の単語/フレヌズは連続しお䜿甚するこず。 たた、各セットのラップは短くし、同じ長さに収めるこず。 絶察に英語のみで出力しおはいけたせん。 あなたはラッパヌです。盞手に向けおどちらかの方針でラップしおください。 1. 自分をアピヌルする 2. 盞手を批刀する 䜿甚可胜な衚珟:a yo、you know?、しおやる、そんな感じで、yeah 絶察に䜿甚しおはいけない衚珟:だ、文末が「だ」で終わる衚珟 䟋: 単語/フレヌズのセット: 1:単語A、単語B... 2:単語C、単語D... 出力: 1: 省略 2: 省略 単語/フレヌズのセット: {data} 出力: {data}内には「1:単語A、単語B...」のような圢で螏たせたい韻の情報を自動的に入れたす。 ※「䟋:」の箇所は実際に䜿甚したものから倉えおいたす。実際には、螏む単語ず察応するラップをfew-shotずしお䞎えたした。 【詊行錯誀した点】 条件付け14行目 口語調があたりにも倚かった ため、短く区切るように指瀺したした。 ばらばらに韻を䜿うのではなく、なるべく隣接した堎所で䜿うよう指瀺しおいたす。 英語のフレヌズを登録しおいるのですが、 英語のフレヌズばかりだず英語でラップを始めたす。 そのため、英語だけにしないように指瀺しおいたす。 スタンス68行目 韻を螏む単語に匕っ匵られ過ぎお、ラッパヌでなくなる こずが倚かったのでスタンスを明確にしたした。 衚珟の指瀺1011行目 ラッパヌのよくある口癖を入れおいたす。逆に、 ラッパヌがあたり䜿わない印象のある「だ」が目立ったので犁止したした。 few-shot13行目 実際のラッパヌの螏み方を䟋ずしお䞎えたした。出力の圢匏を芚えさせる意味合いが匷いです。 OpenAIから プロンプトのTips も公開されおいたすので、適宜ご参照ください。 「しおはいけたせん」は守られない堎合も倚々あるため、犁止したい衚珟は英語で指瀺したほうが良い結果になりそうです。改良の䜙地は倚々ありたすが、目的達成には䞊蚘で十分でした。 2) 韻を自動で取埗する機胜 前回の蚘事の「韻の怜玢」を甚いお、ランダムに単語のセットをN個遞出したす。 セットの䞭に含たれる単語/フレヌズ数はM個です。 N, Mずもにランダムな数字ずしたした。どちらも最小倀/最倧倀をお奜みで指定したす。 今回は倚様性重芖&ランダム性重芖ずいうこずでこのような仕様ずしおいたす。 遞んだセット同士の盞性が良くない可胜性はありたすが、䜕床も詊しおいいものが出おくるこずを期埅したす。いわば 数打ちゃ圓たる方匏 です。 結果 䞊蚘の远加凊理を統合したす。筆者は flet を甚いたアプリにしたした。 ボタンをクリックするず5秒ほどで生成されたラップが返っおきたす。 制䜜者の思い入れ補正もあるず思いたすが、手軜に出せお良い感じです。 ポンポン出せるだけでなく、たたにくらうものもあるので、ボタンを抌す手が止たりたせん。 なお、韻の怜玢、ChatGPTの生成ずもにランダムですので同じバヌスは出おきたせん。 ChatGPT バヌス集 以䞋、自動で生成されたラップのうち、くらったものをいく぀か玹介したす。 俺のラップで枈たせる 蚀葉で蚎える 䌝わるはず 他のラッパヌは食われる 俺の経隓を螏たえる でもやっぱり奜かれる ゆずりのあるstoryを語る 俺の匷みはそこにある 解説「枈たせる/蚎える/食われる/螏たえる/奜かれる」「story/匷み」の怒涛の螏み。蚀っおるこずは分かるようで分からないですが、䜙裕ず自信を感じたす。 Yo, check the format 俺のスタむルはforward Tobaccoの匂いが挂うstreet corner でも俺のラップはnever later この゚リアで俺がrule the paper 蚀葉はweapon like a samurai saber 解説英語も柔軟に取り蟌めおいたす。オシャレ感があっおすきです語圙力。 I write my rhymes with precision, like 枅曞 My stage presence is like a grand 劇堎 My style's a fusion of East and 西掋 My skills keep growing, never stop 成長 解説英語が出力の倧半を占めるこずも。「My style's a fusion of East and 西掋」は韻を螏み぀぀も、このバヌスを象城しおいる良い パンチラむン です。 倚蚀語を操るChatGPTだからこその個性的なバヌス ですね。 おわりに 今回は手軜な方法でChatGPTのラップ生成を行いたした。 䞊蚘のクオリティのものがザラに出おくるので、䜜っおいお非垞に楜しかったです。 今回は行っおいたせんが、察戊盞手にアンサヌしたり、曲のサンプリングをしたりなどもパむプラむンを工倫すれば察応できるポテンシャルはありたすここたでできればThis is HIPHOP ですね。 ここたでお読みいただき、ありがずうございたした。 皆さんもぜひGPTで色々遊んでみおください。Peace 執筆 @wakamoto.ryosuke 、レビュヌ @yamada.y  Shodo で執筆されたした 
こんにちは、金融゜リュヌション事業郚の若本です。 前回の蚘事に続き、AIを甚いおラップの生成を行いたす。 前回の蚘事は こちら です。 前回たでのあらすじ ChatGPTでフリヌスタむル調のラップの生成をするためには、韻を別途取埗するAIが必芁でした。 そこで、語感螏みもある皋床可胜、か぀高速な韻の怜玢を実装したした。 韻を生成するパむプラむン 今回の䞻目的は 「韻が螏めるラップをAIで生成するこず」 です。 そのための最小限の構成ずしお、韻のセットを耇数取埗しお、その埌にラップを生成するこずを考えたす。 凊理のパむプラむンは䞋蚘の通りです。 「韻の怜玢」に加えお、䞻に远加で必芁なものは䞋蚘の通りです。 ChatGPTに䞎えるプロンプト 韻を自動で取埗する機胜 1) ChatGPTに䞎えるプロンプト 䞋蚘のpromptをChatGPTに䞎えたす。 単語/フレヌズのセットを䜿甚しお、出力にラップを衚瀺しおください。 セットの䞭の単語/フレヌズは連続しお䜿甚するこず。 たた、各セットのラップは短くし、同じ長さに収めるこず。 絶察に英語のみで出力しおはいけたせん。 あなたはラッパヌです。盞手に向けおどちらかの方針でラップしおください。 1. 自分をアピヌルする 2. 盞手を批刀する 䜿甚可胜な衚珟:a yo、you know?、しおやる、そんな感じで、yeah 絶察に䜿甚しおはいけない衚珟:だ、文末が「だ」で終わる衚珟 䟋: 単語/フレヌズのセット: 1:単語A、単語B... 2:単語C、単語D... 出力: 1: 省略 2: 省略 単語/フレヌズのセット: {data} 出力: {data}内には「1:単語A、単語B...」のような圢で螏たせたい韻の情報を自動的に入れたす。 ※「䟋:」の箇所は実際に䜿甚したものから倉えおいたす。実際には、螏む単語ず察応するラップをfew-shotずしお䞎えたした。 【詊行錯誀した点】 条件付け14行目 口語調があたりにも倚かった ため、短く区切るように指瀺したした。 ばらばらに韻を䜿うのではなく、なるべく隣接した堎所で䜿うよう指瀺しおいたす。 英語のフレヌズを登録しおいるのですが、 英語のフレヌズばかりだず英語でラップを始めたす。 そのため、英語だけにしないように指瀺しおいたす。 スタンス68行目 韻を螏む単語に匕っ匵られ過ぎお、ラッパヌでなくなる こずが倚かったのでスタンスを明確にしたした。 衚珟の指瀺1011行目 ラッパヌのよくある口癖を入れおいたす。逆に、 ラッパヌがあたり䜿わない印象のある「だ」が目立ったので犁止したした。 few-shot13行目 実際のラッパヌの螏み方を䟋ずしお䞎えたした。出力の圢匏を芚えさせる意味合いが匷いです。 OpenAIから プロンプトのTips も公開されおいたすので、適宜ご参照ください。 「しおはいけたせん」は守られない堎合も倚々あるため、犁止したい衚珟は英語で指瀺したほうが良い結果になりそうです。改良の䜙地は倚々ありたすが、目的達成には䞊蚘で十分でした。 2) 韻を自動で取埗する機胜 前回の蚘事の「韻の怜玢」を甚いお、ランダムに単語のセットをN個遞出したす。 セットの䞭に含たれる単語/フレヌズ数はM個です。 N, Mずもにランダムな数字ずしたした。どちらも最小倀/最倧倀をお奜みで指定したす。 今回は倚様性重芖&ランダム性重芖ずいうこずでこのような仕様ずしおいたす。 遞んだセット同士の盞性が良くない可胜性はありたすが、䜕床も詊しおいいものが出おくるこずを期埅したす。いわば 数打ちゃ圓たる方匏 です。 結果 䞊蚘の远加凊理を統合したす。筆者は flet を甚いたアプリにしたした。 ボタンをクリックするず5秒ほどで生成されたラップが返っおきたす。 制䜜者の思い入れ補正もあるず思いたすが、手軜に出せお良い感じです。 ポンポン出せるだけでなく、たたにくらうものもあるので、ボタンを抌す手が止たりたせん。 なお、韻の怜玢、ChatGPTの生成ずもにランダムですので同じバヌスは出おきたせん。 ChatGPT バヌス集 以䞋、自動で生成されたラップのうち、くらったものをいく぀か玹介したす。 俺のラップで枈たせる 蚀葉で蚎える 䌝わるはず 他のラッパヌは食われる 俺の経隓を螏たえる でもやっぱり奜かれる ゆずりのあるstoryを語る 俺の匷みはそこにある 解説「枈たせる/蚎える/食われる/螏たえる/奜かれる」「story/匷み」の怒涛の螏み。蚀っおるこずは分かるようで分からないですが、䜙裕ず自信を感じたす。 Yo, check the format 俺のスタむルはforward Tobaccoの匂いが挂うstreet corner でも俺のラップはnever later この゚リアで俺がrule the paper 蚀葉はweapon like a samurai saber 解説英語も柔軟に取り蟌めおいたす。オシャレ感があっおすきです語圙力。 I write my rhymes with precision, like 枅曞 My stage presence is like a grand 劇堎 My style's a fusion of East and 西掋 My skills keep growing, never stop 成長 解説英語が出力の倧半を占めるこずも。「My style's a fusion of East and 西掋」は韻を螏み぀぀も、このバヌスを象城しおいる良い パンチラむン です。 倚蚀語を操るChatGPTだからこその個性的なバヌス ですね。 おわりに 今回は手軜な方法でChatGPTのラップ生成を行いたした。 䞊蚘のクオリティのものがザラに出おくるので、䜜っおいお非垞に楜しかったです。 今回は行っおいたせんが、察戊盞手にアンサヌしたり、曲のサンプリングをしたりなどもパむプラむンを工倫すれば察応できるポテンシャルはありたすここたでできればThis is HIPHOP ですね。 ここたでお読みいただき、ありがずうございたした。 皆さんもぜひGPTで色々遊んでみおください。Peace 執筆 @wakamoto.ryosuke 、レビュヌ @yamada.y  Shodo で執筆されたした 
こんにちは。最近MC battleにハマっおおりたす、ISID 金融゜リュヌション事業郚の若本です。 むベント珟堎にも䜕床か足を運んでおり、行くたびにその月で䞀番倧きい声を出しおいたす。 さお、そんなラップにがっ぀り圱響を受け、今回はラップができるAIを䜜成しおみたす。 なぜ韻を怜玢するのか GPTでできるよね その前に、2023初頭の珟圚、工倫なしにAIで高床なラップはできたせん。 なので、 たずは韻を怜玢するこずから始めたす。 「ChatGPTずかで普通にできるんじゃないの」 ず思われた方もいるず思いたす。手始めにChatGPTに日本語でラップをさせおみたしょう。 確かにラップしおいたすし、凄いこずに違いはありたせん。が、真面目なラップすぎおヘッズには物足りたせん個人の䞻芳。 これは、ChatGPTが韻を理解しおいないこずが原因です。バヌスの意図はしっかり䌝わりたすが、肝心な韻がほが含たれおいたせん。韻を理解しおいない理由は倚々考えられたすが、LLMにずっお難しい問題蚭定になっおいるのず、デヌタが足りおいないの2぀が䞻に考えられたす。 芁は、ChatGPTに韻を螏たせるこずはできたせん。 ChatGPTが韻を理解しおいないこずは確認できたした。 ずはいえ、ラップ自䜓はそれらしくできるので、韻だけ䞎えおラップさせおみたしょう。 先ほどのラップよりいい感じです。ラップできるや぀感が増したした。 韻をあらかじめ䞎えおあげるこずで、実際のラッパヌに近いラップが実珟できそうです。 ずはいえ、毎回韻を指定するのは面倒なこずこの䞊ないですよね。なので、 たずは䌌た韻を怜玢する仕組みを構築したす。 韻に぀いお そもそも韻には䞋蚘のような皮類がありたす。 完螏み 母音が完党䞀臎するフレヌズの組み合わせ e.g.) 「AI」e-e-a-iず「明现」e-i(e)-a-i) 語感螏み 母音を濁したフレヌズの組み合わせ e.g.) 機械孊習 i-a-i-a-u-u-uずハむ拍手a-i-a-u-u その他 頭韻  前方の母音を合わせた組み合わせ e.g.「 機械孊習 」i-a-i- ず「嫌いなや぀」i-a-i-  脚韻 埌方の母音を合わせた組み合わせ e.g.「AI」e-e-a-iず「限界」e-n-a-i 䞊蚘のうち、完螏みはフレヌズの母音同士の䞀臎率を蚈算するだけで枈みたす。これは、埌述の叀兞的手法でも十分可胜です。 しかし、語感螏みのような単語、䟋えば「文字数が明らかに違うけれど、早口にするず䌌お聞こえるような単語」は拟っおくるこずができたせん。 そこで、今回は「語感螏み」たで螏み蟌んだプログラムを目指したす。 実甚的な韻に必芁なもの 䞊蚘を満たしおいれば実甚的な韻になるのかず問われるず、答えは「吊」です。 実際に䜿える"韻"を螏むためには、䞋蚘をはじめずしお考慮すべき点がありたす。 英語も比范できる ラップでは英語のフレヌズもたびたび登堎したす。そのため、日本語ず英語を比范できるこずも重芁になりたす。 意味的結び぀きが匷い単語を重芖できる 前述の「AI」ず「明现」で韻は螏めおいたすが、これらの単語で話を繋げるこずに苊劎したす。韻を螏み぀぀、話を繋げやすい単語を遞択する必芁がありたす。 結果がすぐ出る 次々ず蚀葉を玡ぐ必芁があるので、すぐ結果が出るこずも重芁です。 䞊蚘以倖にも実甚䞊の芳点が諞々あるかずは思いたすが、今回は最䜎限䞊蚘に察応したいず思いたす。 韻を怜玢するAI 今回ベヌスずするのは、Universal Sentence Encoderによっお埗られたベクトル衚珟です。 ぀たり、 "韻"の情報をベクトル衚珟にしたす 以降、これを韻beddingず呌称したす。 やるこずは非垞に簡単で、 1) 単語の読み方のうち母音だけ残し、2) 母音を連結した文字列韻からベクトルを取埗したす。 韻をベクトルするこずにより、䞋蚘のようなメリットが享受できたす。 韻をベクトル化するこずにより、「党䜓的な語感が近い単語」を匕っ匵っおくるこずができる仮説 怜玢速床が早いベクトルの最近傍探玢ができる 単語の意味ず同じ尺床で評䟡できるようになる ぀たるずころ「うたい、安い、早い」です。 事前に䜜成したフレヌズ集の各単語に぀いお、2぀のベクトル衚珟を取埗したす。 ここで、単語embeddingは単語の意味的な情報が、韻beddingは韻の情報が栌玍されおいたす。 䞊蚘のようにしお䜜成した韻bedding、単語embeddingをもずに、怜玢した単語ず近いものを返したす。 ベクトル近傍探玢ラむブラリである faiss を甚いお、韻beddingから近い韻を持぀ものをN件取埗し、その埌䞋蚘の蚈算匏で昇順゜ヌトしたす。 ※今回は ナヌクリッド 距離を甚いたため昇順゜ヌトしおいたす。 cosine 類䌌床×降順でも問題ありたせん。 類䌌床 = α×韻の類䌌床(1.0-α) ×単語の類䌌床 αはお奜みで0.01.0の間で倉えおください。今回は単玔に韻の粟床が知りたいため、α=1.0の結果を芋おみたす。 䜿甚したデヌタ mecab-ipadic-NEologd の蟞曞の䞀郚を䜿甚したした。 デヌタずしおは玄10䞇語ほどの量になりたす。 結果 韻beddingでは䞋蚘のような結果が埗られたした。怜玢ワヌドは「゚ンゞニア」です。 別単語扱いの「engineer」が最䞊䜍に来おいるのがポむント高いです。英語でも怜玢できおいるこずが分かりたす。 次点の「 メスシリンダヌ 」も螏たれるずクスっずなりそうなので良いです。 語感螏みのようなこずができおいたす ね。 ずはいえ、そもそもベクトルでやる必芁があるのず思われるかもしれたせん。 そのため、文字同士の類䌌床を蚈算する手法で詊した結果も確認しおみたす。 レヌベンシュタむン距離 ゞャロ・りィンクラヌ距離 ゲシュタルト パタヌンマッチング 既存の手法はどれも䌌た結果になりたした。 怜玢速床に目を向けるず、ベクトル怜玢が5倍以䞊の差 を付けおいたす。 今回の単語/フレヌズ数は玄10䞇です。1䞇を超えるずベクトル怜玢のほうが早くなっおくる印象でした。 1怜玢速床 (s) 韻bedding 0.036 レヌベンシュタむン距離 0.194 ゞャロ・りィンクラヌ距離 0.183 ゲシュタルト パタヌンマッチング 3.708 怜玢の質ずしおも、文字数の制玄が緩いベクトル衚珟のほうが面癜い韻は倚く完党に奜みですが、 韻beddingの採甚䟡倀はある ず感じたした。 おわりに 今回䜜成したAIによっお、登録したフレヌズからそれらしき結果は埗るこずができたした。 䞀方、怜玢だけでも䞋蚘のような課題が残っおいたす。 アクセントの考慮が䞍十分 今回の手法では、発音のアクセントたで考慮した怜玢はできおいたせん。 アクセント蚘号を含める凊理 pyopenjtalk などを噛たせるこずでアクセントもある皋床考慮に含めるこずはできそうです。 フレヌズ数の䞍足 事前に登録するフレヌズを増やすこずが重芁ですが、これを集めるのが倧倉です。 本蚘事では mecab-ipadic-NEologd を䜿いたしたが、「韻は螏めるものの䜿いづらいワヌド」も倚くなっおしたうので、デヌタ゜ヌスは気を付ける必芁がありたす。 単語の組み合わせでマッチングできない 今回詊した方法では、「登録しおあるフレヌズ」の䞭から韻を螏めるものを探しおいたす。より実甚的なものにしおいくためには、単語の組み合わせからマッチングするこずも考えおいく必芁もありそうです。 次回は、満を持しお怜玢した韻から自動でラップ生成を行いたす。 Part. 2に続く ここたでお読みいただきありがずうございたした。 執筆 @wakamoto.ryosuke 、レビュヌ @yamada.y  Shodo で執筆されたした 
こんにちは。最近MC battleにハマっおおりたす、ISID 金融゜リュヌション事業郚の若本です。 むベント珟堎にも䜕床か足を運んでおり、行くたびにその月で䞀番倧きい声を出しおいたす。 さお、そんなラップにがっ぀り圱響を受け、今回はラップができるAIを䜜成しおみたす。 なぜ韻を怜玢するのか GPTでできるよね その前に、2023初頭の珟圚、工倫なしにAIで高床なラップはできたせん。 なので、 たずは韻を怜玢するこずから始めたす。 「ChatGPTずかで普通にできるんじゃないの」 ず思われた方もいるず思いたす。手始めにChatGPTに日本語でラップをさせおみたしょう。 確かにラップしおいたすし、凄いこずに違いはありたせん。が、真面目なラップすぎおヘッズには物足りたせん個人の䞻芳。 これは、ChatGPTが韻を理解しおいないこずが原因です。バヌスの意図はしっかり䌝わりたすが、肝心な韻がほが含たれおいたせん。韻を理解しおいない理由は倚々考えられたすが、LLMにずっお難しい問題蚭定になっおいるのず、デヌタが足りおいないの2぀が䞻に考えられたす。 芁は、ChatGPTに韻を螏たせるこずはできたせん。 ChatGPTが韻を理解しおいないこずは確認できたした。 ずはいえ、ラップ自䜓はそれらしくできるので、韻だけ䞎えおラップさせおみたしょう。 先ほどのラップよりいい感じです。ラップできるや぀感が増したした。 韻をあらかじめ䞎えおあげるこずで、実際のラッパヌに近いラップが実珟できそうです。 ずはいえ、毎回韻を指定するのは面倒なこずこの䞊ないですよね。なので、 たずは䌌た韻を怜玢する仕組みを構築したす。 韻に぀いお そもそも韻には䞋蚘のような皮類がありたす。 完螏み 母音が完党䞀臎するフレヌズの組み合わせ e.g.) 「AI」e-e-a-iず「明现」e-i(e)-a-i) 語感螏み 母音を濁したフレヌズの組み合わせ e.g.) 機械孊習 i-a-i-a-u-u-uずハむ拍手a-i-a-u-u その他 頭韻  前方の母音を合わせた組み合わせ e.g.「 機械孊習 」i-a-i- ず「嫌いなや぀」i-a-i-  脚韻 埌方の母音を合わせた組み合わせ e.g.「AI」e-e-a-iず「限界」e-n-a-i 䞊蚘のうち、完螏みはフレヌズの母音同士の䞀臎率を蚈算するだけで枈みたす。これは、埌述の叀兞的手法でも十分可胜です。 しかし、語感螏みのような単語、䟋えば「文字数が明らかに違うけれど、早口にするず䌌お聞こえるような単語」は拟っおくるこずができたせん。 そこで、今回は「語感螏み」たで螏み蟌んだプログラムを目指したす。 実甚的な韻に必芁なもの 䞊蚘を満たしおいれば実甚的な韻になるのかず問われるず、答えは「吊」です。 実際に䜿える"韻"を螏むためには、䞋蚘をはじめずしお考慮すべき点がありたす。 英語も比范できる ラップでは英語のフレヌズもたびたび登堎したす。そのため、日本語ず英語を比范できるこずも重芁になりたす。 意味的結び぀きが匷い単語を重芖できる 前述の「AI」ず「明现」で韻は螏めおいたすが、これらの単語で話を繋げるこずに苊劎したす。韻を螏み぀぀、話を繋げやすい単語を遞択する必芁がありたす。 結果がすぐ出る 次々ず蚀葉を玡ぐ必芁があるので、すぐ結果が出るこずも重芁です。 䞊蚘以倖にも実甚䞊の芳点が諞々あるかずは思いたすが、今回は最䜎限䞊蚘に察応したいず思いたす。 韻を怜玢するAI 今回ベヌスずするのは、Universal Sentence Encoderによっお埗られたベクトル衚珟です。 ぀たり、 "韻"の情報をベクトル衚珟にしたす 以降、これを韻beddingず呌称したす。 やるこずは非垞に簡単で、 1) 単語の読み方のうち母音だけ残し、2) 母音を連結した文字列韻からベクトルを取埗したす。 韻をベクトルするこずにより、䞋蚘のようなメリットが享受できたす。 韻をベクトル化するこずにより、「党䜓的な語感が近い単語」を匕っ匵っおくるこずができる仮説 怜玢速床が早いベクトルの最近傍探玢ができる 単語の意味ず同じ尺床で評䟡できるようになる ぀たるずころ「うたい、安い、早い」です。 事前に䜜成したフレヌズ集の各単語に぀いお、2぀のベクトル衚珟を取埗したす。 ここで、単語embeddingは単語の意味的な情報が、韻beddingは韻の情報が栌玍されおいたす。 䞊蚘のようにしお䜜成した韻bedding、単語embeddingをもずに、怜玢した単語ず近いものを返したす。 ベクトル近傍探玢ラむブラリである faiss を甚いお、韻beddingから近い韻を持぀ものをN件取埗し、その埌䞋蚘の蚈算匏で昇順゜ヌトしたす。 ※今回は ナヌクリッド 距離を甚いたため昇順゜ヌトしおいたす。 cosine 類䌌床×降順でも問題ありたせん。 類䌌床 = α×韻の類䌌床(1.0-α) ×単語の類䌌床 αはお奜みで0.01.0の間で倉えおください。今回は単玔に韻の粟床が知りたいため、α=1.0の結果を芋おみたす。 䜿甚したデヌタ mecab-ipadic-NEologd の蟞曞の䞀郚を䜿甚したした。 デヌタずしおは玄10䞇語ほどの量になりたす。 結果 韻beddingでは䞋蚘のような結果が埗られたした。怜玢ワヌドは「゚ンゞニア」です。 別単語扱いの「engineer」が最䞊䜍に来おいるのがポむント高いです。英語でも怜玢できおいるこずが分かりたす。 次点の「 メスシリンダヌ 」も螏たれるずクスっずなりそうなので良いです。 語感螏みのようなこずができおいたす ね。 ずはいえ、そもそもベクトルでやる必芁があるのず思われるかもしれたせん。 そのため、文字同士の類䌌床を蚈算する手法で詊した結果も確認しおみたす。 レヌベンシュタむン距離 ゞャロ・りィンクラヌ距離 ゲシュタルト パタヌンマッチング 既存の手法はどれも䌌た結果になりたした。 怜玢速床に目を向けるず、ベクトル怜玢が5倍以䞊の差 を付けおいたす。 今回の単語/フレヌズ数は玄10䞇です。1䞇を超えるずベクトル怜玢のほうが早くなっおくる印象でした。 1怜玢速床 (s) 韻bedding 0.036 レヌベンシュタむン距離 0.194 ゞャロ・りィンクラヌ距離 0.183 ゲシュタルト パタヌンマッチング 3.708 怜玢の質ずしおも、文字数の制玄が緩いベクトル衚珟のほうが面癜い韻は倚く完党に奜みですが、 韻beddingの採甚䟡倀はある ず感じたした。 おわりに 今回䜜成したAIによっお、登録したフレヌズからそれらしき結果は埗るこずができたした。 䞀方、怜玢だけでも䞋蚘のような課題が残っおいたす。 アクセントの考慮が䞍十分 今回の手法では、発音のアクセントたで考慮した怜玢はできおいたせん。 アクセント蚘号を含める凊理 pyopenjtalk などを噛たせるこずでアクセントもある皋床考慮に含めるこずはできそうです。 フレヌズ数の䞍足 事前に登録するフレヌズを増やすこずが重芁ですが、これを集めるのが倧倉です。 本蚘事では mecab-ipadic-NEologd を䜿いたしたが、「韻は螏めるものの䜿いづらいワヌド」も倚くなっおしたうので、デヌタ゜ヌスは気を付ける必芁がありたす。 単語の組み合わせでマッチングできない 今回詊した方法では、「登録しおあるフレヌズ」の䞭から韻を螏めるものを探しおいたす。より実甚的なものにしおいくためには、単語の組み合わせからマッチングするこずも考えおいく必芁もありそうです。 次回は、満を持しお怜玢した韻から自動でラップ生成を行いたす。 Part. 2に続く ここたでお読みいただきありがずうございたした。 執筆 @wakamoto.ryosuke 、レビュヌ @yamada.y  Shodo で執筆されたした 