電通総研のブログ - TECH PLAY

TECH PLAY

電通総研

電通総研 の技術ブログ

å…š867ä»¶

こんにちは。X むノベヌション 本郚 AI トランスフォヌメヌションセンタヌ 所属の山田です。 本蚘事は 電通総研 Advent Calendar 2024 の 12 月 17 日の蚘事です。 はじめに 私達は普段、 Python を䜿っおアプリケヌション開発をしおいたす。 本蚘事では、チヌムでアプリケヌション開発を進めおいく䞭でテスタビリティを䞊げるために意識しおいるこずを玹介したいず思いたす。 なおコヌド䟋は Python ではありたすが、採甚蚀語に関わらず品質を高めたいず考えおいる゚ンゞニアやリヌダヌにずっお参考になる内容を目指したした。 テスタビリティずはなにか 「テスタビリティ」はプロダクションコヌドをどれだけ容易にテストできるかを指したす。 テスタビリティが䜎いコヌドは ナニットテスト や統合テストの䜜成に時間がかかるだけでなく、コヌドのメンテナンス性が䜎䞋し デバッグ 、新機胜の远加が難しくなる傟向にありたす。 テスタビリティそのものを 定量 的な指暙で枬るこずは難しいため、本蚘事ではテスタビリティを䞋げおしたう事䟋から、どのように改善するずテスタビリティを高められるかを玹介したいず思いたす。 テスタビリティが䜎くなる事䟋ずその察応策 1. むンスタンス 化が困難なクラス テスト察象クラスのコンスト ラク タを確認するこずで、そのクラスのテスタビリティに぀いおはある皋床把握できたす。 テスト察象のクラスの むンスタンス 化が困難な堎合、そのクラスのテスタビリティは䜎い傟向にありたす。 むンスタンス 化を困難にする芁因ずしおは以䞋のこずが考えられたす。 倚すぎる匕数 これは ビゞネスロゞック を蚘述するサヌビスクラス偎で問題ずなるこずが倚いものです。 コンスト ラク タに枡すべき匕数が倚いず、テスト察象クラスを組み立おる際の蚭定が煩雑になりたす。 たたテスト時に倚くのパラメヌタを準備する必芁があり、蚭定ミスも発生しやすくなりたす。 䞍適切な型の定矩 これはデヌタを保持するデヌタクラス偎で問題ずなるこずが倚いものです。 特定の倖郚ラむブラリの型 pandas.DataFrame 、 numpy.array などを盎接利甚した蚭蚈は、テスタビリティを倧きく䞋げる可胜性がありたす。 察応策 クラス蚭蚈の芋盎し むンスタンス 化が困難なクラスを解決するには、倚くの堎合はクラス蚭蚈を芋盎す必芁がありたす。 コンスト ラク タで倚くの匕数を受けるクラスは倧抵の堎合、責務を持ちすぎおいたす。クラスを分割できないかを考えおみたしょう。 倖郚䟝存を隔離しお適切な型を利甚する 倖郚ラむブラリの型に䟝存しないプリミティブな型や ドメむン 固有型のクラスによる蚭蚈をしたしょう。 pandas.DataFrame 、 numpy.array などからデヌタを倉換する必芁がある堎合は、定矩した ドメむン 固有型のクラスにファクトリヌメ゜ッドを甚意するなどのアプロヌチを取りたしょう。 import numpy as np from dataclasses import dataclass @ dataclass class Vector : values: np.ndarray # 倖郚ラむブラリ䟝存 @ dataclass class Vector : values: list [ float ] # Python暙準のfloat型のリストを利甚する 2. 関数・メ゜ッド内に䟝存関係が含たれおいる 関数・メ゜ッド内に䟝存関係が含たれおいるコヌドもテスタビリティを䞋げたす。 䟋えば以䞋のコヌドを考えおみたしょう。 from dataclasses import dataclass # デヌタクラスずしおのUser型 @ dataclass class User : name: str email: str class UserRepository : def save (self, user: User) -> User: # ナヌザヌデヌタをデヌタベヌスに保存する凊理詳现は省略 # ... return user class UserService : def register_user (self, user: User) -> User: # メ゜ッド内で盎接リポゞトリをむンスタンス化 repository = UserRepository() saved_user = repository.save(user) return saved_user 関数・メ゜ッド内で䟝存関係が生成されるず、テスト時に差し替えるこずが困難になりたす。 テスティングラむブラリ偎で差し替え方法が甚意されおいる堎合もありたすが、そのようなコヌドはトリッキヌで可読性が䜎くなりがちです。 察応策 関数・メ゜ッド内に䟝存関係が含たれおいる堎合は、倖郚から䟝存を泚入できるようにパラメヌタ化した蚭蚈にしたす。 いわゆる、 Dependency Injection: DI の考え方です。 䞊蚘のコヌド䟋はコンスト ラク タで UserRepository を泚入するように倉曎するこずでテスタビリティを高めるこずができたす。 from typing import Protocol # リポゞトリのむンタヌフェヌスを定矩 class UserRepository (Protocol): def save (self, user: User) -> User: ... # リポゞトリ実装 class DatabaseUserRepository : def save (self, user: User) -> User: # ナヌザヌデヌタをデヌタベヌスに保存する凊理詳现は省略 # ... return user # サヌビスクラス class UserService : def __init__ (self, repository: UserRepository) -> None : self.repository = repository def register_user (self, user: User) -> User: saved_user = repository.save(user) return saved_user これによっおテストコヌドを曞く際に UserRepository の実装を眮き換えるこずも容易になりたす。 3. 返り倀のない関数・メ゜ッド 返り倀のない関数・メ゜ッドのテストは倧抵、困難になりたす。 プロダクションコヌドにおいお、返り倀のない関数・メ゜ッドは副䜜甚を䌎う凊理を実斜しおいる堎合がほずんどだからです。 䟋えば、ファむルを クラりド ストレヌゞなどにアップロヌド凊理をするコヌドに返り倀がない堎合を考えおみたしょう。 class FileUploader : def upload (self, file_content: str ) -> None : # 実際のアップロヌド凊理 # 返り倀はない ... この凊理が完了したかを確認するためには、アップロヌド先の クラりド ストレヌゞの状態を確認する操䜜が必芁になり厄介です。 察応策 このような堎合は関数・メ゜ッドを返り倀を持぀蚭蚈にし、動䜜結果をテストできるようにしたしょう。 from dataclasses import dataclass @ dataclass class UploadResult : success: bool url: str | None class FileUploader : def upload (self, file_content: str ) -> UploadResult: try : # アップロヌド先のURL uploaded_url = f "https://..." return UploadResult(success= True , url=uploaded_url) except Exception as e: print (f "Failed to upload: {e}" ) return UploadResult(success= False , url= None ) 返り倀があるこずによっお、ファむルのアップロヌドの成吊を怜蚌しやすくなりたす。 たた返り倀があるこずで該圓クラスの FileUploader だけでなく、 FileUploader クラスに䟝存しおいる他のクラスでは返り倀を倉化させたモックを䜿うこずで容易にテストを行うこずができるようになりたす。 4. 時間に関する凊理 時間に関する凊理もテスタビリティを䞋げる芁因ずなりたす。 これは時間に関する凊理を蚘述する堎合、冪等性のない凊理になる可胜性が高いからです。 䟋えば、ナヌザヌの誕生日の情報をもずに幎霢を算出する堎合を考えおみたしょう。 from datetime import date from dataclasses import dataclass @ dataclass class User : name: str birth_date: date # 誕生日 def get_age (self) -> int : # 珟圚の日付を取埗 today = date.today() return today.year - self.birth_date.year - ((today.month, today.day) < (self.birth_date.month, self.birth_date.day)) get_age メ゜ッドは珟圚の日付を取埗しお、ナヌザヌの誕生日情報ずの差分から幎霢を算出したす。 珟圚の日付情報を取埗する date.today() の結果は実行するタむミングで倉化するので、このたたでは冪等性がなくテストが難しくなりたす。 察応策 テスティングラむブラリ偎の機胜で時間を固定する機胜が提䟛されおいる堎合もありたすが、可胜であれば時間情報をパラメヌタヌずしお受けるようにしたしょう。 時間情報をパラメヌタずしお受け入れるようにするこずでメ゜ッドの冪等性を担保できたす。 @ dataclass class User : name: str birth_date: date # 誕生日 def get_age (self, today: date) -> int : # 匕数で受け取った日付情報をもずに幎霢を算出 return today.year - self.birth_date.year - ((today.month, today.day) < (self.birth_date.month, self.birth_date.day)) 匕数から時間情報を枡す蚭蚈にするこずで、安定したテストを行うこずができたす。 実際の 開発プロセス においお䟡倀を匕き出すために ここたではプロダクションコヌドのテスタビリティを高めるために意識するポむントを玹介したした。 しかし実際の 開発プロセス では、ここたで玹介した個別の事䟋ず察応策だけではテスタビリティの高いコヌドを敎備し続けるこずは難しいでしょう。 ここからは、テスタビリティの高いコヌドを敎備し続けるために、実際の 開発プロセス で重芁な芁玠に぀いお玹介したす。 テスト戊略の共有 そもそもなぜテストをするのかやテストは䜕を担保するものなのかを含めおチヌムでテストに関する党䜓的な方針を立おるこずが重芁です。 テスト戊略ぞの意識が垌薄だず圢匏的にテストを远加するだけになり、本質的な品質向䞊には繋がりたせん。 テスト戊略の共有では、テストレベルに合わせたテストのスコヌプを定めるのが良いです。 出発点ずしおはテストピラミッドをベヌスにするず良いでしょう。 テストピラミッドは「E2E テスト」「むンテグレヌションテスト」「 ナニットテスト 」の 3 ぀のテストレベルの関係性に぀いおピラミッド図で衚したものです。 ピラミッド䞊䜍のテストレベルほどテストの実行にコストを芁するため、 ナニットテスト のテストケヌスを重芁であるこずを瀺したす。 ただし戊略を考えるに圓たっお重芁なのは、やみくもに ナニットテスト を増やすのではありたせん。 ナニットテスト 、むンテグレヌションテスト、E2E テストで䜕をカバヌするのかを明確にし、どのようにしたら効果的なテストを実珟できるかを瀺すこずです。 たたテストピラミッドは機胜芁件をテストするための抂念であるため、非機胜芁件のテストに぀いおは盎接的に考慮されおいたせん。 非機胜芁件のテスト戊略に぀いおは機胜テストずは別で考える必芁がありたす。 非機胜芁件のテストは個別の機胜ではなくシステム党䜓に関わる特性を評䟡するものです。 そのためリ゜ヌスや時間が限られる䞭では優先床を決めお、珟実的に可胜な範囲で実行するこずが重芁になりたす。 パフォヌマンステストなどの負荷テストではシステムが提䟛する ナヌスケヌス やビゞネスフロヌに基づいお、特に重芁なシナリオから始めるこずが重芁です。 高床な専門知識が必芁ずなるセキュリティテストは倖郚の専門チヌムに䟝頌するこずも有効なテスト戊略の 1 ぀です。 テストコヌドの曞き方に぀いおの ガむドラむン プロダクションコヌドの曞き方に぀いおはよく取り䞊げられたすが、テストコヌドの曞き方に぀いおは意倖ず軜芖される郚分です。 しかしテストコヌドは開発においお品質保蚌の基盀になるため、プロダクションコヌドず同様に敎備すべきものです。 テストコヌドの曞き方に぀いおもチヌムに共有しおおくこずが重芁です。 以䞋はテストコヌドの曞き方に぀いおの ガむドラむン の䞀䟋です。 構造化されたテストコヌド 「given」「when」「then」を意識しおテストを蚘述をしたしょう。 given: テストの前提条件ずなる準備郚分 when: テスト察象の振る舞いの呌び出し then: 実斜結果の怜蚌 明瞭なテストケヌス名を぀ける テストケヌス名には日本語を䜿っお䜕をテストしおいるかが䞀目でわかるようなテストケヌス名を付けたしょう。 テストコヌドが曞きにくいず思った堎合のアクション テストコヌドが曞きにくい堎合、それはプロダクションコヌドに改善の䜙地があるサむンです。テストが難しい箇所を芋぀けたらプロダクションコヌドを芋盎しおテスタビリティを䞋げおいる芁因を探したしょう。 以䞋はガむドに基づきながら曞いた、先の䟋で取り䞊げたナヌザヌの誕生日から幎霢を算出するメ゜ッドのテストコヌド䟋です。 from datetime import date @ dataclass class User : name: str birth_date: date # 誕生日 def get_age (self, today: date) -> int : # 匕数で受け取った日付情報をもずに幎霢を算出 return today.year - self.birth_date.year - ((today.month, today.day) < (self.birth_date.month, self.birth_date.day)) # テストコヌド def test_user_ 誕生日の算出ができるこず() -> None : # given birth_date = date( 2000 , 4 , 4 ) user = User(name= "テストナヌザヌ" , birth_date=birth_date) today = date( 2024 , 12 , 15 ) expected_age = 24 # when actual_age = user.get_age(today=today) # then assert expected_age == actual_age たた ガむドラむン を敎備するだけでなく、テストコヌドの蚘述も含めおモブプロで取り組むのも良いアプロヌチです。 モブプロを掻甚しおテストコヌドを蚘述するこずで、チヌム党員のスキル向䞊や蚭蚈改善に぀なげるこずができたす。 テストコヌドは単なる補助的な存圚ではなく、システムの品質を支える基盀ずしお、適切に敎備するこずを目指したしょう。 テストケヌスの掗い出し テスタビリティが高くなったコヌドを最倧限に掻甚するには、テストケヌスの蚭蚈が䞍可欠です。 テストケヌス蚭蚈の際はテスト技法を抌さえおおくこずで網矅性を高めながら効果的にテストケヌスの蚭蚈を進めるこずができたす。 以䞋は基本的なものですが、個人的には効果が倧きいず感じおいるテスト技法です。 境界倀分析 境界倀分析は入力倀や条件の境界に着目しお動䜜を確認するテスト技法です。 䞻に入力倀の䞊限/䞋限が決たっおいるフォヌムバリデヌションのテスト項目の蚭蚈に有効です。 同倀分割 同倀分割は入力デヌタや条件をグルヌプ化し、代衚的なケヌスをテストするこずで効率的にケヌスをカバヌするテスト技法です。 デヌタのパタヌンが倚い堎合に代衚倀を䜿っお効率的な怜蚌が求められるテスト項目の蚭蚈に有効です。 テストマトリクス デシゞョンテヌブル  テストマトリクスは デシゞョンテヌブル ずも呌ばれ、耇数の入力倀や条件の組み合わせを敎理しテスト項目を蚭蚈するテスト技法です。 耇数条件の組み合わせを網矅的に怜蚌する際のテスト項目の蚭蚈に有効です。 ナヌザヌストヌリヌテストシナリオテスト 実際にシステムを䜿うナヌザヌのフロヌを再珟しシステムの動䜜を確認するテスト技法です。 E2E テストなどテストピラミッドの䞊䜍のテストレベルにおいお効果的なテスト項目を蚭蚈するにのに有効です。 これらのテスト技法を組み合わせお掻甚するこずで、テストレベルに応じたテストケヌスの蚭蚈をスムヌズに進めるこずができたす。 テスト カバレッゞ の蚈枬ず指暙の理解 テストの品質を評䟡するためにテスト カバレッゞ の蚈枬が甚いられるこずが倚いです。 テスト カバレッゞ は、テストケヌスがテスト察象のプロダクションコヌド䞊でどの皋床実行されたかを瀺す指暙です。 しかし単に カバレッゞ ずいっおも蚈枬方法にはいく぀かの皮類があり、それぞれ異なる芖点からコヌドの網矅性を評䟡したす。 ここでは䞀般的に䜿甚される C0、C1、C2 ず呌ばれる カバレッゞ の蚈枬方法に぀いお玹介したす。 C0: ステヌトメント カバレッゞ プログラム内の ステヌトメント 呜什が少なくずも 1 回実行されたかを蚈枬したす。 C1: ブランチ カバレッゞ プログラム内の条件分岐の各分岐が少なくずも 1 回実行されたかを蚈枬したす。 C2: 条件 カバレッゞ プログラム内の条件匏内の個々の条件が True/False の䞡方を少なくずも 1 回満たしたかを蚈枬したす。 テスト カバレッゞ を導入する際には、たずは C1 のブランチ カバレッゞ の指暙を採甚するこずがおすすめしたす。 C1 のブランチ カバレッゞ は倚くのテスティングラむブラリでサポヌトされおいる蚈枬が簡単です。 たた分岐挏れに起因するバグを発芋しやすい指暙であり、C0 よりも効果的で、C2 よりも珟実的なコストで導入が可胜です。 たた カバレッゞ を蚈枬し運甚するに圓たっおは、数倀目暙に䟝存しないこずが重芁です。 テスト カバレッゞ の倀を単なる数字目暙ずしお蚭定されるず、芋せかけの カバレッゞ 向䞊のために C0 の指暙を採甚するなどのハックが行われおしたうこずがありたす。 重芁なのは指暙を理解した䞊で カバレッゞ を蚈枬し、 蚈枬時点から カバレッゞ を䞋げないように開発を進めるこずです。 蚈枬開始から カバレッゞ が䞋がる堎合、新機胜を远加する際にテストが䞍足しおいたり修正や リファクタリング によっお既存のテストが削陀されおいるこずを意味するからです。 カバレッゞ の䞍足郚分から远加すべきテストケヌスの議論材料ずしお掻甚したしょう。 たずめ 本蚘事では、テスタビリティを䜎くしおしたう事䟋をベヌスにテスタビリティを向䞊させるための方法を玹介したした。 そしお実際の 開発プロセス においお、それらの方法が䟡倀を発揮するための芁玠を取り䞊げたした。 チヌム党䜓でこれらのポむントを意識するこずで、テスタビリティを意識した開発を進められるのではないでしょうか。 本蚘事で玹介した内容によっお、より堅牢で信頌性の高い開発掻動ぞの䞀助ずなれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 電通総研グルヌプ キャリア採甚サむト電通総研 執筆 @yamada.y  Shodo で執筆されたした 
はじめに こんにちは。金融゜リュヌション事業郚゚ンゞニアリングオフィスの加藀です。 仕事でGKEや AKS ずいったマネヌゞド Kubernetes サヌビスを利甚したむンフラ構築を経隓しおきたした。 この蚘事では、 Raspberry Pi 5で K8s クラスタ を構築しながら、マネヌゞド K8s のありがたみに぀いお孊んでいきたす。 ゎヌル 以䞋の䜜業を通しお、 Kubernetes クラスタ のオンプレ環境における構築手順の党䜓的な流れず、蚭蚈刀断のポむントに぀いおざっくり理解する Raspberry Pi をセットアップする Kubernetes クラスタ を䜜る Prometheus, Grafanaを入れお クラスタ の監芖環境をセットアップする Cloudflare tunnelを利甚しお、セキュアにむンタヌネット経由からのアクセスをできるようにする 構成 Raspberry Pi 5は手元に3台ありたす。以䞋の戊略で構築したす。 マスタヌ 1, ノヌド 2 の IPv4 シングルスタックの Kubernetes クラスタ をkubeadmで構築する あずでマスタヌにもノヌドを远加できるように、高可甚性の構成ずする Host Name IP Address Description PC 192.168.3.x 䜜業甚のPC master-1 192.168.3.81 マスタヌ1: Raspberry pi に Ubuntu 24.04 LTS node-1 192.168.3.82 ノヌド1: Raspberry pi に Ubuntu 24.04 LTS node-2 192.168.3.83 ノヌド2: Raspberry pi に Ubuntu 24.04 LTS kubernetes -frontend 192.168.3.90 コン トロヌル プレヌンの API サヌバ負荷分散のための仮想IP (LoadBalancer Service甹) 192.168.3.91-99 Service Type:Loadbalacerで䜿甚するIPレンゞ 構成むメヌゞは以䞋のずおりです。 倧たかな流れ 準備: Raspberry Pi を台数分セットアップ Raspberry Pi のセットアップ カヌネル の蚭定 コンテナランタむムの蚭定 ツヌルのむンストヌル クラスタの構築 HA構成のAPIServer クラスタ 䜜成 Nodeの远加 テスト甚のPodをデプロむしお確認 PrometheusずGrafanaのセットアップ(オプション) kube-prometheus-stack Helmチャヌトによる簡単なセットアップ むンタヌネット経由でアクセスできるようにする 1. 準備 蚘事のボリュヌムの関係䞊、 Raspberry Pi そのものに぀いおの蚘述は少し端折りたす。 Raspberry Pi Imager を利甚しお、 Ubuntu 24.04 LTSのむメヌゞをSDカヌドに焌きたす。 耇数台ありたすので、自宅環境の芁件を満たすための汎甚的な蚭定はuser-dataに曞いた䞊で起動したりshell スクリプト にしたりするず、セットアップが捗りたす。 user-dataのサンプル を䞀番䞋に曞きたしたので、䞀぀の参考ずしおご参照ください。 環境 SDカヌドを入れお起動したす。以䞋のようになりたした。 # 各皮情報確認 $ cat /etc/os-release PRETTY_NAME="Ubuntu 24.04 LTS" NAME="Ubuntu" VERSION_ID="24.04" VERSION="24.04 LTS (Noble Numbat)" VERSION_CODENAME=noble ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=noble LOGO=ubuntu-logo $ uname -a Linux node-1 6.8.0-1004-raspi #4-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 02:29:55 UTC 2024 aarch64 aarch64 カヌネル の蚭定 K8s クラスタ のシステム芁件を確認しながら、蚭定したす。 # カヌネルの蚭定 ## カヌネルモゞュヌルのロヌド $ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF $ sudo modprobe overlay $ sudo modprobe br_netfilter ## カヌネルパラメヌタの蚭定 $ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF # 確認 $ sudo sysctl net.bridge.bridge-nf-call-iptables $ sudo sysctl net.bridge.bridge-nf-call-ip6tables $ sudo sysctl net.ipv4.ip_forward $ sudo sysctl --system コンテナランタむムの蚭定 コンテナランタむム、CNI Pluginを入れおいきたす。今回は cotainerd + runc の䞀般的な構成ずしたした。たた、コンテナ管理にcgroupを利甚するように蚭定したす。 # containerdのむンストヌル $ ARCH="arm64" $ CONTAINERD_VERSION="1.6.32" $ curl -fsSL https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz -o containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz $ curl -fsSL https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz.sha256sum -o containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz.sha256sum $ sha256sum -c containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz.sha256sum $ sudo tar -C /usr/local -xzvf containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz $ rm containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz containerd-${CONTAINERD_VERSION}-linux-${ARCH}.tar.gz.sha256sum # containerdの蚭定 $ sudo mkdir -p /etc/containerd $ containerd config default | sudo tee /etc/containerd/config.toml $ curl https://raw.githubusercontent.com/containerd/containerd/main/containerd.service | sudo tee /etc/systemd/system/containerd.service > /dev/null # containerdをサヌビスずしお起動 $ sudo systemctl daemon-reload $ sudo systemctl enable --now containerd $ sudo systemctl status containerd # runcのむンストヌル $ sudo apt-get update -y $ sudo apt-get install -y libseccomp2 gpg $ curl -fsSL https://github.com/opencontainers/runc/raw/main/runc.keyring -o runc.keyring $ gpg --import runc.keyring $ RUNC_VERSION="1.1.12" $ curl -fsSL https://github.com/opencontainers/runc/releases/download/v${RUNC_VERSION}/runc.${ARCH} -o runc $ curl -fsSL https://github.com/opencontainers/runc/releases/download/v${RUNC_VERSION}/runc.${ARCH}.asc -o runc.asc $ gpg --verify runc.asc runc $ sudo install -m 755 runc /usr/local/sbin/runc $ rm runc runc.asc runc.keyring # むンストヌル確認 $ containerd -v $ runc -v # CNI Pluginのむンストヌル $ sudo mkdir -p /opt/cni/bin CNI_VERSION="1.1.1" $ curl -fsSL https://github.com/containernetworking/plugins/releases/download/v${CNI_VERSION}/cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz -o cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz $ curl -fsSL https://github.com/containernetworking/plugins/releases/download/v${CNI_VERSION}/cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz.sha256 -o cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz.sha256 $ sha256sum -c cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz.sha256 $ sudo tar -C /opt/cni/bin -xzvf cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz $ rm cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz cni-plugins-linux-${ARCH}-v${CNI_VERSION}.tgz.sha256 # systemdを利甚するようにcontainerdの蚭定を倉曎 $ sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak $ sudo sed -i '/\[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options\]/,/\[/ s/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml $ diff /etc/containerd/config.toml /etc/containerd/config.toml.bak 127c127 < SystemdCgroup = true --- > SystemdCgroup = false $ sudo systemctl restart containerd # swapをOFFにする $ sudo swapoff -a Kubernetes 関連のツヌルのむンストヌル 今回は クラスタ の構築に kubeadm を利甚するので、 kubeadm をむンストヌルしたす。その他、 kubelet も必芁になるのでむンストヌルしおおきたす。 kubectl は必芁に応じお入れたす。 $ sudo apt-get install -y apt-transport-https ca-certificates curl gpg $ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list $ sudo apt-get update -y $ sudo apt-get install -y kubelet kubeadm kubectl $ sudo apt-mark hold kubelet kubeadm kubectl # 確認 $ kubeadm version $ kubectl version --client=true $ kubelet --version 2. クラスタ の構築 今回は以䞋の戊略ずしたす。 Kubernetes v1.30を入れる 高可甚性 クラスタ ずしお構成する ※珟時点ではマスタヌノヌドは1台だけですが、将来的に远加できるようにするため。途䞭で倉曎できないため、 クラスタ 䜜成時にこの構成にしおおく必芁がありたす マスタヌノヌド䞊で以䞋のように構成する HAProxyでコン トロヌル プレヌンの API Server宛のリク ゚ス トをリバヌスプロキシする Keepalived で仮想IPを蚭定する 各ノヌドのkubelet,kubectlからはこの仮想IPを䜿甚するようにする 䞊蚘の名前解決は簡易的にhostsを甚いる HA構成のAPIServer たず、 Keepalived をむンストヌルし、固定したIP(今回は192.168.3.90)でアクセスできるように蚭定したす。 #Keepalivedのむンストヌル/蚭定 $ sudo apt update $ sudo apt install keepalived $ K8S_VIP="192.168.3.90" $ cat <<_EOF_ | sudo tee /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { ${K8S_VIP} } } _EOF_ # keepalivedを利甚するためのカヌネルモゞュヌルのロヌド蚭定: https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/load_balancer_administration/s1-initial-setup-forwarding-vsa $ echo "net.ipv4.ip_nonlocal_bind = 1" | sudo tee -a /etc/sysctl.d/k8s.conf $ sudo sysctl net.ipv4.ip_nonlocal_bind $ sudo systemctl start keepalived $ sudo systemctl enable keepalived # 確認 $ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 2c:cf:67:2c:e4:9a brd ff:ff:ff:ff:ff:ff inet 192.168.3.81/24 brd 192.168.3.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.3.90/32 scope global eth0 # ←これができる valid_lft forever preferred_lft forever ...äž­ç•¥... # hostsを線集しお名前解決できるようにしおおく # /etc/cloud/templates/hosts.debian.tmplは起動時にhostsを生成するテンプレヌトのため、䞀旊リブヌトするか、hostsにも盎接曞くかどちらが必芁 $ cat <<_EOF_ | sudo tee -a /etc/cloud/templates/hosts.debian.tmpl # These entry is for testing keepalived configuration for k8s apiserver ${K8S_VIP} kubernetes-frontend.local _EOF_ 続いお、HAProxyを蚭定したす。 # HAProxyのむンストヌル $ sudo apt update $ sudo apt install haproxy $ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_bak # frontendにKeepalived, backendに埌で䜜成するKubernetes API Serverを蚭定 $ cat <<_EOF_ | sudo tee /etc/haproxy/haproxy.cfg global log /dev/log local0 log /dev/log local1 notice user haproxy group haproxy daemon defaults log global mode tcp timeout connect 5000 timeout client 50000 timeout server 50000 frontend kubernetes-frontend bind *:8443 default_backend kubernetes-backend backend kubernetes-backend mode tcp balance roundrobin server master-1 127.0.0.1:6443 check verify none _EOF_ $ sudo systemctl reload haproxy クラスタ 䜜成 K8s クラスタ を䜜成し、Podをデプロむできる状態にしたす。以䞋のような流れになりたす。 コン トロヌル プレヌンの蚭定 Pod Network アドオンの蚭定 Nodeを クラスタ に远加 MetalLBの蚭定 テスト甚のPodをデプロむしお確認 コン トロヌル プレヌンの蚭定 kubeadm init を䜿いたす。コン トロヌル プレヌンの䜜成は、以䞋のような凊理が行われるこずで実珟しおいるようです。 # https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#synopsis # 以䞋の順序で凊理される preflight Run pre-flight checks certs Certificate generation /ca Generate the self-signed Kubernetes CA to provision identities for other Kubernetes components /apiserver Generate the certificate for serving the Kubernetes API /apiserver-kubelet-client Generate the certificate for the API server to connect to kubelet /front-proxy-ca Generate the self-signed CA to provision identities for front proxy /front-proxy-client Generate the certificate for the front proxy client /etcd-ca Generate the self-signed CA to provision identities for etcd /etcd-server Generate the certificate for serving etcd /etcd-peer Generate the certificate for etcd nodes to communicate with each other /etcd-healthcheck-client Generate the certificate for liveness probes to healthcheck etcd /apiserver-etcd-client Generate the certificate the apiserver uses to access etcd /sa Generate a private key for signing service account tokens along with its public key kubeconfig Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file /admin Generate a kubeconfig file for the admin to use and for kubeadm itself /super-admin Generate a kubeconfig file for the super-admin /kubelet Generate a kubeconfig file for the kubelet to use *only* for cluster bootstrapping purposes /controller-manager Generate a kubeconfig file for the controller manager to use /scheduler Generate a kubeconfig file for the scheduler to use etcd Generate static Pod manifest file for local etcd /local Generate the static Pod manifest file for a local, single-node local etcd instance control-plane Generate all static Pod manifest files necessary to establish the control plane /apiserver Generates the kube-apiserver static Pod manifest /controller-manager Generates the kube-controller-manager static Pod manifest /scheduler Generates the kube-scheduler static Pod manifest kubelet-start Write kubelet settings and (re)start the kubelet upload-config Upload the kubeadm and kubelet configuration to a ConfigMap /kubeadm Upload the kubeadm ClusterConfiguration to a ConfigMap /kubelet Upload the kubelet component config to a ConfigMap upload-certs Upload certificates to kubeadm-certs mark-control-plane Mark a node as a control-plane bootstrap-token Generates bootstrap tokens used to join a node to a cluster kubelet-finalize Updates settings relevant to the kubelet after TLS bootstrap /experimental-cert-rotation Enable kubelet client certificate rotation addon Install required addons for passing conformance tests /coredns Install the CoreDNS addon to a Kubernetes cluster /kube-proxy Install the kube-proxy addon to a Kubernetes cluster show-join-command Show the join command for control-plane and worker node kubeadm init を実行する際のオプションは、コマンド匕数ずしお枡すか、 yaml で曞いお枡すこずができたす。今回は以䞋のずおり kubeadm-config.yaml を曞きたした。デフォルトから倉曎する蚭定項目は以䞋のずおりです。 コン トロヌル プレヌンを高可甚性構成にするための controlPlaneEndpoint / apiServer.certSANs Podに割り圓おるサブネットを蚭定するための networking.podSubnet $ cat <<_EOF_ > ~/kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.30.0 controlPlaneEndpoint: "kubernetes-frontend.local:8443" apiServer: certSANs: - kubernetes-frontend.local # hostname of keepalived - 192.168.3.90 # VIP of keepalived - master-1.local # hostname of master-1 - 192.168.3.81 # IP of master-1 networking: podSubnet: "10.64.0.0/16" _EOF_ # kubeadm initを実行する # 他のノヌドを構成する際の手順を簡略化するために `--upload-certs` オプションをオプションを远加 $ sudo kubeadm init \ --config kubeadm-config.yaml \ --upload-certs # 以䞋が出力されたら完了 Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of the control-plane node running the following command on each as root: kubeadm join kubernetes-frontend.local:8443 --token {token} \ --discovery-token-ca-cert-hash sha256:{discovery-token-ca-cert-hash} \ --control-plane --certificate-key {certificate-key} Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use "kubeadm init phase upload-certs --upload-certs" to reload certs afterward. Then you can join any number of worker nodes by running the following on each as root: $ kubeadm join kubernetes-frontend.local:8443 --token {token} \ --discovery-token-ca-cert-hash sha256:{discovery-token-ca-cert-hash} # 完成したらkubectlを䜿えるようにしおおく $ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config $ source <(kubectl completion bash) $ echo "source <(kubectl completion bash)" >> ~/.bashrc Pod Network アドオン この時点では、ただcorednsが起動しおきたせん。Podが動䜜するようになるには、Pod Network アドオンをむンストヌルしたす。 Pod Network アドオンは、䞻に以䞋のような責務を負う コンポヌネント です。 コンテナに察する NIC の蚭定 IPアドレス の管理、動的割り圓お ネットワヌクポリシヌによる分離(Calicoの堎合) クロスホスト通信 Pod Network アドオンはCalicoやFlannelなど耇数の遞択肢がありたすが、今回はCalicoを䜿甚したす。 珟時点で、Calicoは、KubeadmプロゞェクトがE2Eテストを行っおいる唯䞀のアドオンだそうです 今回はCalicoをオペレヌタを䜿っおむンストヌルしたす。 # Calicoをむンストヌルするためのマニフェストを䞀旊ダりンロヌド $ curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml -O $ curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/custom-resources.yaml -O kubeadm init 時ず同様、Podサブネットをこちらにも蚭定する必芁がありたす。 # custom-resource.yaml # クラスタ構築時に指定したPod SubnetのCIDRを指定する # This section includes base Calico installation configuration. # For more information, see: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.Installation apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: # Configures Calico networking. calicoNetwork: ipPools: - name: default-ipv4-ippool blockSize: 26 - cidr: 192.168.0.0/16 + cidr: 10.64.0.0/16 $ kubectl create -f tigera-operator.yaml $ kubectl create -f custom-resources.yaml Nodeの远加 クラスタ ぞのノヌドの远加は、先ほどの kubeadm init を実行した埌に出力されおいた内容に埓うだけで簡単にできたす。 今回はワヌカヌノヌドを2台远加したす。 # 先に、API Serverの仮想IPに解決されるホスト名をhostsに远蚘しおおくリブヌトしお反映 $ cat <<_EOF_ | sudo tee -a /etc/cloud/templates/hosts.debian.tmpl # These entry is for testing keepalived configuration for k8s apiserver ${K8S_VIP} kubernetes-frontend.local _EOF_ # kubeadm init時の出力に埓っおノヌドごずに実行 $ sudo kubeadm join kubernetes-frontend.local:8443 --token {token} \ --discovery-token-ca-cert-hash sha256:{discovery-token-ca-cert-hash} # nodeが䞊がっおいる $ kubectl get node NAME STATUS ROLES AGE VERSION master-1 Ready control-plane 6d11h v1.30.1 node-1 Ready <none> 6d11h v1.30.1 node-2 Ready <none> 6d11h v1.30.1 # Calicoの状態を確認 # Calicoでは、各ノヌドがBGPピアリングしお経路情報を亀換し、L3のレむダでルヌティングする $ sudo ./calicoctl node status Calico process is running. IPv4 BGP status +--------------+-------------------+-------+------------+-------------+ | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO | +--------------+-------------------+-------+------------+-------------+ | 192.168.3.82 | node-to-node mesh | up | 2024-06-07 | Established | | 192.168.3.83 | node-to-node mesh | up | 2024-06-07 | Established | +--------------+-------------------+-------+------------+-------------+ IPv6 BGP status No IPv6 peers found. MetalLBの蚭定 オンプレ環境の K8s クラスタ 環境では、Type: LoadBalancer のServiceを公開するためにL4のLBを甚意する必芁がありたす。今回はMetalLBをLayer2モヌドで䜿甚し、たた、特定の IPアドレス が自動的にアタッチされるように蚭定したす。 # MetalLBのむンストヌル kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml # ServiceのExternal-IPに割り圓おるIPアドレスを蚭定する cat <<_EOF_ | kubectl apply -f - apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 192.168.3.91-192.168.3.99 --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: example namespace: metallb-system _EOF_ テスト甚のPodをデプロむしお確認 準備ができたので、テスト甚のNginxをデプロむし、耇数のタむプのService経由で疎通できるかどうかを確認したす。 #テスト甚Nginx kubectl create deployment test-nginx --image=nginx --replicas 3 kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-nginx-56cc9db4bc-26955 1/1 Running 1 (6d19h ago) 34d 10.64.84.143 node-1 <none> <none> test-nginx-56cc9db4bc-67ddw 1/1 Running 1 (6d19h ago) 34d 10.64.247.16 node-2 <none> <none> test-nginx-56cc9db4bc-6gffj 1/1 Running 1 (6d19h ago) 34d 10.64.84.142 node-1 <none> <none> cat <<_EOF_ | kubectl apply -f - # Service type: ClusterIP apiVersion: v1 kind: Service metadata: name: test-nginx-clusterip spec: type: ClusterIP ports: - name: "http-port" protocol: "TCP" port: 8080 targetPort: 80 selector: app: test-nginx --- # Service type: NodePort apiVersion: v1 kind: Service metadata: name: test-nginx-nodeport spec: type: NodePort ports: - name: "http-port" protocol: "TCP" port: 8080 targetPort: 80 nodePort: 30080 selector: app: test-nginx --- # Service type: LoadBalancer apiVersion: v1 kind: Service metadata: name: test-nginx-metallb spec: type: LoadBalancer ports: - name: "http-port" protocol: "TCP" port: 8080 targetPort: 80 selector: app: test-nginx _EOF_ Pod / Node / PCなどいろいろな堎所から疎通確認しおみたす # Pod間通信をテストする甚のPodを䜜成 kubectl run test --image=ubuntu -it --rm # From test pod ## -> APIServer curl https://kubernetes/healthz #OK ## -> Type: ClusterIP / NodePort / LoadBalancer curl http://test-nginx-clusterip:8080 #OK curl http://test-nginx-nodeport:8080 #OK curl http://test-nginx-metallb:8080/ #OK # From Node ## -> Type: LoadBalancer curl http:/192.168.3.91:8080/ #OK # From PC ## -> Type: LoadBalancer curl http:/192.168.3.91:8080/ #OK 3. PrometheusずGrafanaのセットアップ kube-prometheus-stack Helmチャヌトによる簡単なセットアップ 最埌に、PrometheusずGrafanaを蚭定しお監芖基盀を構築したす。 AlertManager、各皮Monitor、Ruleなどの他にも、NodeExporter、Grafanaなど必芁な コンポヌネント がたくさんあるので、今回は䞀括構築・管理が可胜なHelmチャヌトである kube-prometheus-stack を䜿いたす。 ※ いく぀か手段 が提䟛されおいたすが、蚭定のカスタマむズや管理をする䞊ではHelmチャヌトを䜿うのが融通が利きそうでした ※ Raspberry Pi 5にもM2. SSD HATが発売されたので、master-1を NFS サヌバずしおも蚭定しおいたした。今回、取埗した各メトリクスを共有 ディレクト リに保存したくなったのですが・・・ PrometheusはNFSをサポヌトしおいない ようでした。知りたせんでした。 # https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update # GrafanaダッシュボヌドずPrometheusのUIはPort-ForwardなしでPCから確認したいので、ServiceのTypeを倉曎 cat <<_EOF_ > values.yaml prometheus: service: type: LoadBalancer grafana: service: type: LoadBalancer _EOF_ # monitoring Namespaceを䜜っおそこにデプロむ kubectl create ns monitoring helm install prom-stack prometheus-community/kube-prometheus-stack -n monitoring -f values.yaml ダッシュ ボヌドは初期の状態でたくさん蚭定されおいたすが、远加で、 Raspberry Pi & Docker Monitoring ずいうのを入れおみたした。 Raspberry Pi は枩床を気にしたくなりたすので、良い感じに衚瀺されおいお嬉しいです。 むンタヌネット経由のアクセス (オプション) この K8s クラスタ のメンテナンスを倖出時にもしたい、Grafana ダッシュ ボヌドを倖出先からも確認したい、ずなった堎合、どのようにすれば良いでしょうか。 Cloudflare を䜿っおみお、非垞に䜓隓が良かったので最埌に玹介したす。 簡単にいうず、オンプレ偎のマシンにcloudflaredをむンストヌルしお、そこからCloudflareが管理する゚ッゞ環境に察しおトンネルを匵り、その経路を利甚しおセキュアに通信できる、か぀その仕組みを利甚する際、認蚌機胜、 サブドメむン 甚の自動蚌明曞管理、セキュリティを維持するための各皮機胜も提䟛されおいるずいうものです。自分の ドメむン さえ持っおいれば、今回の甚途では無料で利甚できたす。 Cloudflare Tunnel の䜜成 UIでの䜜成方法 に埓うず、簡単に蚭定できたす。 cloudflaredは、すべおのサヌバに入れる必芁はなく、トンネルを䜜成したいマシンに察しお入れれば足りたす。残りの蚭定はUIから行っおいきたす(今回はmaster-1に入れたした) Public Hostname サブドメむン ずしお利甚できるHostnameになりたすずService(ロヌカル偎からアクセス可胜なIP/ポヌトの組み合わせ)を関連付けたす。今回はGrafana ダッシュ ボヌドず、 SSH アクセスを有効にしたいので、以䞋をサヌビスずしお登録し、それぞれに察しお サブドメむン を割り圓おたした。 http://prom-stack-grafana.monitoring.svc.cluster.local:80 ssh://localhost:22 Application の蚭定 䞊蚘で蚭定したPublic Hostnameに察しお、アクセスポリシヌ、認蚌の蚭定などを有効化できたす。 自分のメヌルアドレスだけアクセスできるようにし぀぀、パスワヌドをメヌル ワンタむムパスワヌド に蚭定したした。 Browser SSH タむプでApplication蚭定を䜜成するず、ブラりザ䞊でタヌミナルが衚瀺されたす。 たずめ Raspberry Pi で K8s クラスタ ヌを䜜っおみたした。これから育おおいきたす HA構成や家庭のLAN環境特有の問題に察凊するこずで、L2/L3呚りの孊びを埗る機䌚になりたした オンプレ Kubernetes を業務運甚する際の難易床の高さを改めお実感したした(N/W、マシン、ストレヌゞ、可甚性・信頌性の確保、継続的な改善ずメンテナンス、倧芏暡運甚・・・) Cloudflareはもっず色々な甚途に䜿っおみたいです user-data  のサンプル 初期蚭定系はすべおこちらに突っ蟌みたくなりたすが、うたくいかない時の デバッグ が難しいので、簡単な最䜎限の蚭定項目だけをuser-dataに、それ以倖は スクリプト を曞くなどしお初回起動埌に実行する方が個人的には奜きです。 #cloud-config hostname: { HOST_NAME } # Configured by Raspberry Pi Imager manage_etc_hosts: true +package_update: true +package_upgrade: true packages: - avahi-daemon + - libseccomp2 + - gpg + - apt-transport-https + - ca-certificates + - curl + - raspi-config apt: ...äž­ç•¥... users: ...äž­ç•¥... +write_files: + # Configure IP Addrress Fixation + - path: /etc/netplan/99_manual_config.yaml + owner: root:root + permissions: "0600" + content: | + network: + version: 2 + ethernets: + eth0: + dhcp4: true + addresses: + - 192.168.3.83/24 + nameservers: + addresses: + - 192.168.3.1 runcmd: - localectl set-x11-keymap "us" pc105 - setupcon -k --force || true + - netplan apply + - | + cat <<_EOF_ | tee -a /etc/cloud/templates/hosts.debian.tmpl + # These entry is for testing keepalived configuration for k8s apiserver + 192.168.3.90 kubernetes-frontend.local + + _EOF_ 参考 kubeadmを䜿甚したクラスタヌの䜜成 Pod Networking kubeadm kubeadm: High Availability Considerations containerd Install Calico networking and network policy for on-premises deployments CalicoによるKubernetesピュアL3ネットワヌキング MetalLB 執筆 @kato.shota 、レビュヌ @kobayashi.hinami  Shodo で執筆されたした 
はじめたしお、Xクロス むノベヌション 本郚プロダクト むノベヌション センタヌの瀧川亮匘です。 本蚘事は、 電通総研 Advent Calendar 2024 10日目の投皿です。 もずもずネむティブアプリを䞻戊堎ずするFlutterですが、Web開発にどれほど掻甚できるのか調査したため共有したす。 Flutter ずは Flutter for Web ずは Flutter for Web の泚意点 泚意点1. ネむティブアプリがメむンタヌゲット 泚意点2. 実装蚀語がDartに限定される 泚意点3. SEOに匱い 泚意点4. 初期ロヌドが重い 察策方法 Flutter for Web の䜿いどころ 終わりに Flutter ずは Flutterは、2017幎に Google が発衚した オヌプン゜ヌス のUI開発 フレヌムワヌク です。 プログラミング蚀語 には コンパむル 型の Dart を採甚しおおり、高いパフォヌマンスず開発効率を実珟しおいたす。 単䞀のコヌドベヌスから iOS 、 Android 、デスクトップ、Webずいった 耇数のプラットフォヌム向けにアプリを開発できる点が特城 です。 たた、 マテリアルデザむン に準拠した倚圩な りィゞェット 郚品が暙準で提䟛されおおり、矎しく盎感的なUIを比范的簡単に䜜成できたす。 Flutter for Web ずは Flutterは圓初、 iOS および Android 向けのネむティブ アプリ開発 をタヌゲットずしおスタヌトしたしたが、珟圚ではデスクトップやWebにも察応しおいたす。 ここではFlutterによるWeb アプリ開発 のこずを Flutter for Web ず呌びたす。 Flutter for Web は、モバむルアプリやデスクトップアプリず 同じコヌドでWebアプリも䞀緒に開発したい ずいう堎合に䟿利です。 コストや開発期間を削枛できるだけでなく、 プラットフォヌム間でのUIの差異を最小限に抑える こずもできたす。 たた、Webアプリのパフォヌマンス向䞊のためにWebAssemblyWasmぞのビルドもサポヌトされおいたす。 Flutter for Web の泚意点 FlutterでWebアプリを開発する堎合、以䞋のような泚意点がありたす。 泚意点1. ネむティブアプリがメむンタヌゲット Web向けのサポヌトも進んでいるものの、モバむル向けず比范するずやはり劣る郚分がありたす。 たずえば、モバむル向けパッケヌゞにはWeb非察応なものが倚く、Web察応であっおも、 Web専甚の機胜改善やバグ修正は劣埌ずなる傟向 にありたす。 たた、ネむティブ アプリ開発 では Hot Reload が利甚可胜ですが、Web開発では Hot Restart しか利甚できず、開発䜓隓が萜ちたす。 Hot Reloadアプリを停止せずにコヌド倉曎を即座に反映する。状態が保持される。 Hot Restartアプリを再起動しおコヌド倉曎を反映する。状態はリセットされる。 泚意点2. 実装蚀語が Dart に限定される 通垞のWeb技術HTML, CSS , JavaScript ず異なり、 党おのロゞックやUIを Dart のみで実装する必芁があるため、実装難易床が高い です。 たた、 サヌドパヌティ の JavaScript ラむブラリを型安党に利甚したい堎合、 Dart 偎で独自に型定矩を行う必芁がありたす。 TypeScriptのように暙準で豊富な型定矩が存圚しない点も、開発のハヌドルを䞊げる芁因のひず぀です。 泚意点3. SEO に匱い FlutterはシングルペヌゞアプリケヌションSPAの構成を採甚しおおり、初期ロヌド埌にクラむアント偎で動的にDOMを生成したす。 暙準ではサヌバヌサむド レンダリング  SSR やマルチペヌゞアプリケヌション MPA に察応しおいないため、 怜玢゚ンゞン のクロヌルやむンデックスが難しくなり、 SEO に匱くなりたす 。 さらに、 Canvas による画面描画では、 怜玢゚ンゞン による解析が困難ずなりたす。これも SEO に匱くなる芁因のひず぀です。 たた、スクリヌンリヌダヌによる読み䞊げも困難ずなるため、 アクセシビリティ の䜎䞋にも぀ながりたす。 泚意点4. 初期ロヌドが重い Flutterでは ビルド時に比范的倧きなファむルが生成されるため、初期ロヌドが重くなりたす 。 空のプロゞェクトでも数MBになり、ペヌゞ数や機胜が増えるずさらに肥倧化したす。 暙準ではNext.jsのような自動コヌド分割機胜も備わっおいないため、ナヌザヌ操䜜ずは関係のない画面゜ヌスもブラりザにダりンロヌドする必芁があり、非効率です。 察策方法 いく぀か察策方法はありたす。 Webサヌバヌで gzip 圧瞮を行い、転送時のファむルサむズを小さくする。 ナヌザヌ操䜜に応じお必芁最小限のラむブラリを遅延ロヌドする。 手動でコヌド分割を行い、画面単䜍で必芁最小限のファむルを取埗する。 根本解決ではありたせんが、初期ロヌド時にロヌディングアニメヌションを衚瀺しおナヌザヌ䜓隓を改善する。 Flutter for Web の䜿いどころ 䞀般的なWeb開発には埓来のWeb技術HTML、 CSS 、 JavaScript などを甚いるのが望たしいです。 しかし、モバむルアプリやデスクトップアプリず同じコヌドベヌスでWebアプリも開発する必芁がある堎合、本蚘事で玹介した泚意点を認識したうえでFlutterを遞択するのが良いでしょう。 終わりに 最埌たでご芧いただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 電通総研グルヌプ キャリア採甚サむト電通総研 執筆 @takigawa.akihiro 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは Xクロス むノベヌション 本郚 プロダクト むノベヌション センタヌの䜐藀です。 電通総研 Advent Calendar 2024 、12日目の今日は、DRY 原則の再解釈を通しお、蚭蚈䞊の萜ずし穎である「誀った共 通化 」に陥らないためにはどうするべきかを考察しおいきたいず思いたす。 本皿は、蚭蚈の䞖界に足を螏み入れたばかりの方から鍛え抜かれた達人 プログラマヌ たで、幅広い方々に気づきを提䟛できるような内容を目指したした。 初孊者の方は手元に参考曞を、達人の方はく぀ろぎのコヌヒヌを携えながら、気軜にお読みいただければ幞いです。 DRY SRP 再び、DRY 誀った共通化 DRY をコヌドで捉えない たずめ 参考文献 DRY DRY 原則は、プログラミングや蚭蚈の初孊者が最初期に孊ぶ考えだず思いたす。 そしお、それはしばしば 「 コピペ をしおはいけない」「 同じコヌド を繰り返し重耇しお曞いおはいけない」 ずいった説明がなされるこずから、「DRY 原則は コヌドそれ自䜓 を察象ずする」ず理解されおいる方々は決しお少なくないのではないでしょうか。 しかし、筆者ずしおは「この理解は、ずもすれば誀解に぀ながるケヌスが倚いのではないか」ず考えおいたす。 実は、DRY 原則を䞖に広めた名著 達人プログラマヌ の第2版においおも、この点に぀いお蚀及されおいたす。 本曞の初版では、「DRY 原則」が意味するこずに぀いお曞き足りない郚分がありたした。倚くの人々はこれがコヌドの話だず受け取っおしたったのです。぀たり、DRY を「 ゜ヌスコヌド のコピヌペヌストをしおはいけない」ず解釈しおしたったのです。 これも DRY 原則の䞀郚ですが、ほんの些现な䞀郚でしかありたせん。 [1], p.40 確かに、コヌドのコピペや繰り返しが奜たしくない結果をもたらす可胜性があるこずは事実です。 しかし、この「コヌド」に着県した理解は、その分かり易さがゆえに 「であれば、同じコヌドは 共 通化 しよう 」 ずいった拡倧解釈を招いおいる可胜性が、䞀定以䞊あるように思いたす。 達人 プログラマヌ は以䞋のように続けたす。 DRY 原則は「知識」や「意図」の二重化に぀いおの原則です。 [1], p.40 本蚘事では、この忘れ去られがちな DRY の本質に぀いお「知識」や「意図」ずは別のもう䞀぀の芳点、「 責任 」の芳点から捉え盎しおみたいのです。 SRP ここで䞀床 DRY から離れお、SOLID 原則のむニシャルを務める、SRP単䞀責任の原則 を思い出しおみたす。 クラスを倉曎する理由は぀以䞊存圚しおはならない。 [2], p.122 ここではクラスず曞かれおいたすが、蚭蚈思想ずしおはクラスに限ったこずではありたせん。 なぜ、1぀以䞊厳密には2぀以䞊ですが、ここでは匕甚元の蚳に倣いたす存圚しおはいけないのでしょうか。 それは、蚭蚈に硬さず脆さを䞎えるこずに぀ながるからです。 ゚ンティティ 本蚘事では、メ゜ッド、クラス、モゞュヌル、 コンポヌネント ずいったシステムの構成芁玠を意味したすが独立した耇数の責任を担っおいる時、ほずんどの堎合においお、その゚ンティティを 倉曎する理由もたた、責任ごずに独立しお生じたす 。 するず、ある責任に関する倉曎により他の責任が意図せず果たせなくなり、予想倖の欠陥が発生する脆さ可胜性がありたす。そしお、埀々にしおこのような実装は倉曎し蟛い硬さものです。 䞀般に、責任ず倉曎理由は察応したす。 アゞャむル゜フトりェア開発の奥矩 以䞋、奥矩本 は、そこに䞀぀「圹割」ずいう抂念も合わせお、SRP における蚀葉を以䞋のように定矩しおいたす。 圹割責任 倉曎理由 [2], p.123 再び、DRY 奥矩本は、「腐敗する゜フトりェアの兆候」の䞀぀「䞍必芁な繰り返し」に぀いお、以䞋のように説明しおいたす。 システム内に重耇するコヌドがあるず、システムの倉曎はずおも骚の折れる䜜業になる。[...] コヌド䞭にある同じような郚分をすべお修正しなければならないからだ。 [2], p.111 たた、 プリンシプル オブ プログラミング にも、DRY を適甚すべき理由ずしお同様のこずが蚘茉されおいたす。 同じようなコヌドが耇数あるず、その耇数箇所を正確に修正しなければ、党䜓ずしおの敎合が取れたせん。慎重に䜜業しないず、修正挏れの危険性がありたす。 [3], p.50 これら、DRY 適甚の動機DRYを砎った堎合の問題から逆算するず、そこには「それらが同じ 倉曎理由 である」ずいう前提が浮かび䞊がっおきたす。 すなわち、DRY ずは「同じ理由で倉曎されおしたう゚ンティティは、重耇しお存圚するべきではない」ず説明されるのが、より適切ではないでしょうか。 筆者は、ここであえお飛躍しおコヌドを゚ンティティず蚀い換えたしたが、なぜコヌドずいう蚘述を避けるのかに぀いおは埌述したす。 奥矩本は、SRP における蚀葉を以䞋のように定矩しおいたす。 圹割責任 倉曎理由 [2], p.123 これは、重芁さを䌝えるための意図的な繰り返しです。 DRY ず SRP の間に、 責任 を軞ずした関連を芋出だせる気がしたす。 誀った共 通化 SRP ず DRY。 この二぀の原則は、いずれも蚭蚈における構成芁玠ずしおの゚ンティティに぀いお、責任の芳点から、その凝集性ず䞀意性を論ずるものだず蚀えたす。 SRPは ゚ンティティは単䞀の責任を担うべきである ずいうこずを説いおいたす。 䞀方で DRY は 同じ責任を担う゚ンティティを重耇しお定矩すべきでない繰り返しおはならない ず説いおいたす。 DRY の衚局だけを捉え、責任の考慮なしに安易な共 通化 に走るず、それは SRP に違反しかねたせん 。 共 通化 される゚ンティティは、SRP に準拠、すなわち単䞀の責任のみを担っおいる必芁がありたす。そしお本来、責任ずいうのは意図的な蚭蚈のうえに芋出され䞎えられるものです。 したがっお、「ここはこの前実装したロゞックずコヌド的に同じだから、メ゜ッドに切り出しお双方から䜿おう」ずいった埌づけの共 通化 や再利甚は、高確率で倱敗するず思われたす。 EC サヌビスを䟋に考えおみたしょう。 このサヌビスには䌚員限定割匕が存圚し、その割匕率の蚈算に぀いお責任を担う calcMemberDiscountRate メ゜ッドが存圚するずしたす。その蚈算ロゞックの䞀郚が、埌から実装される クリスマスセヌル 割匕率蚈算ロゞックず偶然にも重耇するこずが分かりたした。 この時、 calcMemberDiscountRate メ゜ッドの該圓コヌドをコピペしお、 calcXmasDiscountRate メ゜ッドを実装するこずは、果たしお悪でしょうか。 むしろ「それは DRY に違反しおいる」ずしお共 通化 された堎合に誕生する calcMemberAndXmasDiscountRate メ゜ッドの方が、よっぜど恐ろしく感じられたす。 これは説明のための極端な䟋に過ぎたせん。実際にはもっず巧劙に、䟋えばそれらしい抜象的な名前を隠れ蓑にしお、耇数の責任を担う゚ンティティが人知れず実装されるのです。 DRY をコヌドで捉えない 前節では、DRY を以䞋のように捉えたした。 同じ責任を担う゚ンティティを重耇しお定矩すべきでない繰り返しおはならない ずころで、 オブゞェクト指向 の䞖界においお、責任を担える゚ンティティの最小単䜍は䜕でしょうか。 レガシヌコヌドからの脱华 に、以䞋のような蚘茉がありたす。 デゞタルの領域では、ものごずはラベルによっお定矩されるのではなく、ふるたいによっお定矩されるのである。 [4], p.144 これは、凝集性の文脈におけるオブゞェクトクラスに関する説明ではありたすが、この「ふるたい」いわばむンタヌフェヌスこそ責任の基本であり、その最小単䜍はメ゜ッドではないでしょうか。 だずすれば、そもそもそれ以䞋のコヌド断片に぀いおは、実装の詳现のそのたた䞀郚である可胜性が高く、そういった責任の䌎わない単なる欠片ずしおのコヌドに぀いおは、DRY 適甚を論ずるには時期尚早だずも思えるのです。これが、「再び、DRY」節におコヌドを゚ンティティず蚀い換えた理由であり、そのようなコヌドのコピペの良し悪しは、その断片だけからは刀断が難しいでしょう。 前節で述べたような誀った共 通化 に陥らないためには、垞に責任の芳点から DRY を捉え、以䞋のように自問自答するこずが有効です。 「今、自分が実装しおいるこの゚ンティティの責任は、既にほかの゚ンティティが担っおくれおいないか、あるいは他にこの責務の適任者はいないだろうか」 そしお、特に䜕かを共 通化 し始めようずいう時には、たずは䞀呌吞おいお、その゚ンティティが担う責任を泚意深く芳察し、隠れ蓑をたずった意図しない責任倉曎理由がいないかを、慎重に確認するこずが重芁だず蚀えるでしょう。 たずめ 本蚘事では、DRY 原則の本質を SRP における責任の芳点から玐解き、誀った共 通化 に陥らないための新たな DRY 原則の捉え方を怜蚎したした。 蚭蚈原則は奥深く、たずえ衚面䞊は単玔なルヌルのように思えおも、深く怜蚎するこずで新しい気づきや解釈を䞎えおくれたす。 本蚘事の解説が、皆様が今埌取り組む蚭蚈やコヌディングの䞀助ずなれば、嬉しい限りです。 参考文献 [1] David Thomas 他, 村䞊蚳. 達人 プログラマヌ 第2版 熟達に向けたあなたの旅. オヌム瀟 , 2020. [2] Robert C. Martin 他, 瀬谷蚳. アゞャむル ゜フトりェア開発の奥矩 第2版 オブゞェクト指向 開発の神髄ず匠の技. SBクリ゚むティブ 株匏䌚瀟, 2008. [3] 䞊田勲. プリンシプル オブ プログラミング 3幎目たでに身に぀けたい 䞀生圹立぀101の原理原則. 株匏䌚瀟 秀和システム , Kindle 版. [4] David Scott Bernstein, 吉矜 他 èš³. レガシヌコヌドからの脱华 ゜フトりェアの寿呜を延ばし䟡倀を高める9぀のプ ラク ティス. 株匏䌚瀟 オラむリヌ・ゞャパン , 2019. ※ 本皿に掲茉された画像は AI により生成されたした 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研グルヌプ キャリア採甚サむト電通総研 執筆 @satorin 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは、 電通 総研の金子倧地です。 本蚘事は 電通総研 Advent Calendar 2024 の12月11日の蚘事です 前線 に匕き続き、今回も孊生さんに読んでいただくこずを想定しお、実プロゞェクトを進める「珟堎」で行っおいるPM育成掻動に぀いお投皿したす。もちろん、 電通 総研に興味のある瀟䌚人の方も倧歓迎です。 前線では以䞋を説明したした。 電通 総研にはプロゞェクトマネヌゞャヌ以降、「PM」を育成する文化があるこず 䌚瀟党䜓での取り組みのほか、開発の珟堎でPM育成掻動が行われおいるこず 私自身がその掻動をしたこず 今回の埌線では、私が資料化しお瀟内共有した「PMノりハり」 の抂芁ず、PMに求められるスキルを玹介したす。 1. 私が瀟内で共有した「PMノりハり」の抂芁 1-1. PMの圹割 1-2. マスタヌスケゞュヌル・成果物䜓系 1-3. PM掻動の難所 1-4. その他 2. PMに求められるスキル 2-1. タレント・トラむアングル 2-2. 私の考える「PMに求められるスキル」 ①螏み出す力 ②蚀語化胜力 ③論理的思考胜力 ④蚀葉のキャッチボヌル胜力 ⑀もう䞀歩螏み蟌む力 おわりに 1. 私が瀟内で共有した「PMノりハり」の抂芁 私がどのような「PMノりハり」を資料化しお所属郚眲コミュニケヌションIT事業郚に共有した、テヌマ別の抂芁を䞀郚玹介したす。具䜓的なノりハりそのものには觊れたせんが、"どのようなこずが曞いおあるか" のむメヌゞは沞くでしょうか。 1-1. PMの圹割 「1-2」以降の説明の前提ずなる、䞀般的な甚語や 電通 総研に特有の情報を資料化したした。 ちなみに、 電通 総研では「いわゆるPM䜜業」に留たらず、業務・ITスキルの領域に深く螏み蟌むPMが倚い印象です。私は「業務 スペシャ リスト → PM」ずいうキャリアを歩んだこずもあり、「業務に匷いPMスタむル」ず蚀えるかもしれたせん。プロゞェクト芏暡・䜓制にはよりたすが、PMを担圓し぀぀、私自身が蚭蚈曞の䜜成・レビュヌも行うこずが倚々ありたす。 ※ ちなみにここで蚀う「業務に匷い」ずいうのは、䞋蚘を意味しおいたす。 顧客業務の内容・背景・意図を早期に理解しお、プロゞェクトメンバヌず技術リスク・持っおいきたい方向性などを認識合せし、顧客ず仕様調敎しお蚭蚈に萜ずし蟌むスキルがある 䞊蚘をふたえたテスト・移行の方針策定、および テスト蚭蚈・移行蚭蚈ができる ※ 電通総研の瀟員玹介ペヌゞ も、ぜひご参照ください。 コンテンツ抂芁 PMずは ※ 前線 をご参照ください 電通 総研におけるPMに至るキャリア 電通 総研では入瀟埌からPMに至るたで、どのようなキャリアを歩むこずが倚いか。 プロゞェクト䜓制の組み方 瀟内・パヌトナヌ䌚瀟さんのメンバヌを集めお、どのように䜓制を組むか。 PMの具䜓的な䜜業内容 PMが担圓する成果物・䜜業のラむンナップず、PMず各メンバヌチヌムリヌダヌ等ずの圹割分担。 䟋芁件定矩工皋では、「マスタヌスケゞュヌル、テスト蚈画曞、移行蚈画曞」をPMが䜜成する。 1-2. マスタヌスケゞュヌル・成果物䜓系 プロゞェクト個別の事情を考慮しおスケゞュヌリングをしたす。そしお、各工皋芁件定矩・蚭蚈・テスト・移行等で䜕を成果物ずするかを定め、蚈画的に䜜業を進めたす。 コンテンツ抂芁 マスタヌスケゞュヌルの䜜成方法 マスタヌスケゞュヌルは、プロゞェクトの党䜓スケゞュヌルのこず。 倧きいレベルでのスケゞュヌル管理をマスタヌスケゞュヌルで行い、詳现䜜業数1001,000皋床がよく芋られるを「 WBS Work Breakdown Structure」で管理する。 䜜成のためのテクニックはあれど、䞀番倧事なこずは「開始から終了たで、このスケゞュヌルで進められそう」ずいう感芚を持おるたで考え抜き、それをスケゞュヌルに反映するこず。 成果物䜓系の䜜成方法 成果物䜓系は、各工皋の成果物を掗い出し、成果物間の関係性を瀺すもの。 基本的には、「その工皋で䜕を䜜成すれば、 ステヌクホルダヌ 間で必芁な認識合せができ、埌続工皋のむンプットが完成するか」を考える。 1-3. PM掻動の難所 私が難しいず思うPM䜜業に、「芁件定矩」・「テスト蚈画」・「移行蚈画」がありたす。若手PMはたずこの3぀の壁にぶち圓たるので、その壁を乗り越え易くするためのノりハりをたずめたした。実務経隓が無いず理解しづらい内容なので、ここでは簡易な説明に留めたす。 コンテンツ抂芁 芁件定矩の進め方 芁件定矩の「開始前準備・実斜䞭・終盀」それぞれの進め方 䟋えば「終盀」では、”スコヌプ定矩” ずいう倧事なプロセスの進め方を玹介 テスト蚈画・移行蚈画の䜜成方法 蚈画段階で決めるべきこずや、決めるための考え方。 移行タむムチャヌトの䜜成方法 お客様・ 電通 総研・その他 ステヌクホルダヌ 関係ベンダヌさん等の各移行䜜業の前埌関係をどのように敎理しおタむムスケゞュヌルに萜ずし蟌むか。 ※ 移行ずは プロゞェクトで開発・テストしおきたプログラムや準備したデヌタ等を、システムの本番環境に反映する䜜業のこずです。本番移行が完了するず、開発しおきた新芏機胜を゚ンドナヌザが利甚できるようになりたす。 本番移行は限られた時間内に完了させる必芁があるため、あらかじめ各䜜業の前埌関係を明確化したタむムチャヌトを䜜成しお䜜業の予定・実瞟時刻を管理したす。たた、本番移行前に移行リハヌサルをしお、䜜業手順や移行デヌタに䞍備が無いかチェックし、䜜業時間を蚈枬するこずで、本番移行を時間通り正確に進められるようにしたす。 1-4. その他 工皋共通のPM掻動である「コミュニケヌション管理」・「課題管理」・「ドキュメント管理」や、本皌働埌の「保守運甚」、PMが関わる「契玄・手続」に぀いおもノりハりを敎理したした。ここでは説明を割愛したす。 2. PMに求められるスキル 2-1. タレント・トラむアングル PMに求められるスキルは、PMIProject Management Institute、IPMAInternational Project Management Association、 IPA  情報凊理掚進機構 等のPMに関する団䜓が定矩しおいたす。䟋えばPMIでは、「プロゞェクトマネゞメントに携わる人にずっおの理想的なスキルセット」ずしお、 タレント・トラむアングル を提唱しおいたす。 私が行ったPM育成掻動は、 暗黙知 だった「Ways of Working」および「Power Skills」を実践的な 圢匏知 にし、それらをメンタリングにより匷化する掻動、ずいう䜍眮付けでした。 トラむアングル芁玠 説明 Ways of Working プロゞェクト管理手法などのPMに関するテクニカルスキル。 Power Skills リヌダヌシップなどのヒュヌマン系のスキル。゜フトスキルず呌ばれるこずもある。 Business Acumen ビゞネス感芚や業務知識。 ※ PMIのペヌゞから画像を匕甚しおいたす 2-2. 私の考える「PMに求められるスキル」 さお、ここからは「むチ珟堎担圓者私個人の意芋」ずしお捉えおください。 電通 総研の新卒採甚の方針ずすり合わせなどはしおいたせん。 以䞋のずおり、PMに求められるスキルの1぀である「Power Skills」に぀いお、孊生さんに䌝わる蚀葉で衚珟するこずにトラむしおみたした。 倧前提ずしお①が必芁であり、そのうえで②③④が求められたす。さらに⑀を発揮するこずで、もうむチ段高い②③④が発揮される、ず考えおいたす。なお、②③を陀き、䞀般甚語ではありたせんのでご泚意ください。 では、それぞれのスキルがどういうものかを芋おいきたしょう。 ①螏み出す力 自分が分からないこず・未経隓のこずを「やっおみる力」、未知のこずに「飛び蟌む力」、案件・組織等の「壁を越える力」です。明るく前向きであろうずするマむンドや、できない理由を探すのではなくどうやったらできるかを考える思考特性が重芁です。 入瀟埌はぜひ、所属の「郚」ずいう枠組みを超えお知り合いを増やし、話しやすい関係性を築きたしょう。それが、“䌚瀟には味方がたくさんいる” ずいう気持ちに繋がり、「螏み出す力」ぞの远い颚ずなりたす。 ② 蚀語化 胜力 事実・自分の考えを、プラス・マむナス無く、ありのたた・誀解なく䌝える力です。文章・口頭説明のいずれにも求められたす。日垞でも「説明が難しいこず」はあるず思いたすが、諊めずに 蚀語化 に取り組んでみおください。たた、刀断が分かれる話題になった時に、「自分は〇〇がいいず思う。なぜならば△△だから」ずいうように、自分の考えを明確にしおください。それがこの力の匷化に繋がりたす。 ③論理的思考胜力 前提・事実・考え 等を、分かりやすく組立おお説明する力です。䟋えば、お客様ずの限られた䌚議時間で様々なテヌマを扱いたすので、急に「〇〇ですか」ず問いかけおも、「䜕の話」ず蚀われおしたいたす。したがっお、情報を敎理しお筋道立おお認識合せする必芁がありたす。 論理的思考胜力は、他のスキルよりも曞籍・研修が倚く存圚するため、業務倖でも孊びやすいず蚀えるでしょう。 ④蚀葉のキャッチボヌル胜力 盞手の理解床を確認しながら話したり、盞手の質問を理解しお噛み合った返答をしたりする力です。䌚議前の準備段階で考え抜き、「こう説明したらこういう意芋が出おきそうだな」ず想定問答を考えおおくこずで、短時間に有意矩なコミュニケヌションを取れたす。 ちなみに、コロナ犍を経おリモヌト䌚議が増え、盞手の衚情が読み取れなくなったので、「ここたでの説明でご䞍明点・ご意芋などはありたすか」ずいった意識的な問い掛けで理解床を確認する重芁性が高たりたした。 ⑀もう䞀歩螏み蟌む力 「答えらしきモノ」を埗た安堵・小さな達成感を乗り越えお、あるいは䌚話に登堎した「思考停止ワヌド」で止たらずに、もうむチ段階 深掘り、具䜓化しお、考え・話し・聞く力です。䟋えば「お客様に確認しお埗られた回答に基づき、埌続䜜業䟋. 蚭蚈䜜業を進められるか」を考え、䞍足があればさらに螏み蟌んで確認したす。 必芁なこずを突き詰める・深掘りする「粘り匷さ」ずも蚀えそうですね。スキルずいうより、行動特性ず呌べるかもしれたせん。 おわりに 前線 ・埌線を読んでいただき、「PM」ずいう仕事の解像床が少し䞊がったでしょうか。たた、「PM」をやっおみたくなりたしたか。 誰しも、初めおPMを担圓する時は䞍安がいっぱいです。でも、 電通 総研には勉匷する材料はたくさんありたすし、フォロヌしおくれる先茩もたくさんいたす。お客様に説明予定の資料に䞍備があれば、事前にチェックしお改善できるよう寄り添っおくれるこずでしょう。お客様ぞの説明が蚀葉足らずならば、あなたの暪にいる先茩が「補足ですが、・・」ずフォロヌしおくれるこずでしょう。 PMずいう仕事は簡単ではありたせんが、だからこそやりがいがあり達成感を埗られる仕事だず思いたす。 私は、方針・蚈画・仕様等の合意圢成の舵取りをしおプロゞェクトを掚進しおいくずいう、「倧きなものを動かす感芚」を持おるこずに、PMずしおのやりがいを感じたす。様々な䜜業における進め方の自由床が高いので、自分の考えを詰め蟌んだ ”たたき台" で道を切り拓き、関係者ず認識を合わせお、慎重にたたは倧胆に進めるプロセスは "腕の芋せ所" ず思っお取組んでいたす。そしお、お客様ずの協同䜜業をスムヌズに進められた時、課題が解決した時、システムが無事にサヌビスむンした時、メンバヌに感謝しながら達成感を噛み締めたす。 電通 総研でPMをやっおみたいず思った方は、ぜひ䞋蚘もご参照ください。 私たちは同じ事業郚で共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 株匏䌚瀟 電通総研 キャリア採甚サむト 執筆 @kaneko.taichi 、レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは、X むノベヌション 本郚の 米久 保です。 こちらは、 電通 総研テックブログ アドベントカレンダヌ 2024の12月10日の蚘事です。 はじめに 認知負荷 認知負荷理論 ゜フトりェア蚭蚈ず認知負荷理論 認知バむアス ゚ラヌ たずめ 参考文献リスト はじめに IT゚ンゞニア同士で䌚話するずきに、「メンタルモデル」や「認知負荷」などの 認知科孊 に由来する甚語をよく耳にするようになりたした。゜フトりェア開発は結局のずころ人間によっお行われる瀟䌚的な営みなので、人間の心のクセ、぀たり認知特性に泚目するこずはその掻動をより良いものにする䞊で重芁です。 デザむンの領域では人間䞭心デザむンHuman-centered design, HCDに代衚されるように、人間の認知特性を考慮に入れたアプロヌチが䞻流ずなっおおり、ナヌザヌのニヌズ、胜力、行動に合わせたデザむンを行いたす。 ゜フトりェアの品質は倖郚品質ず内郚品質ずに分かれたす。倖郚品質は性胜や䜿い勝手のようにナヌザヌが利甚時に認識できるもので、内郚品質は保守のしやすさのようにナヌザヌには芋えないものです。実行時の実䜓ずしおの゜フトりェアは、UIを通しおその存圚を知芚したす。゜フトりェアの利甚者に察しお提䟛するUIずUXは、デザむナヌが䞭心ずなりナヌザヌのニヌズを満たすようにデザむンしたす。 さお、゜フトりェアの物理的な実䜓である ゜ヌスコヌド のナヌザヌは誰でしょうか。それを曞いたり読んだり倉曎したりする開発者ですね。 内郚品質は゜フトりェアが玠早くか぀持続的に䟡倀を提䟛するために非垞に重芁 ですが、 ゜ヌスコヌド を日々取り扱うナヌザヌである開発者に焊点を圓おお考える必芁があるでしょう。 そのためには人間の認知特性を理解した䞊で、゜フトりェア 開発プロセス や個々のアクティビティをデザむンする必芁がありたす。この蚘事では、「認知負荷」「 認知バむアス 」「゚ラヌ」を題材に、゜フトりェア開発掻動の䞭でも特に蚭蚈にどう掻甚できるかを考察したす。 認知負荷 認知負荷理論 認知負荷理論は、オヌストラリアの 教育心理孊 者、ゞョン・スりェラヌ氏によっお1980幎代に提䟛されたものです。脳内の情報凊理を行う䜜業堎所、ワヌキングメモリに察しおかかる負荷のこずを認知負荷ず呌びたす。ワヌキングメモリの容量は倧きくないため、認知負荷が高すぎるずオヌバヌフロヌを匕き起こしおしたいたす。ワヌキングメモリをいかに効率に䜿うかが重芁です。 認知負荷理論においお、認知負荷は3぀に分類されたす参考文献1,2。 分類 説明 課題内圚性負荷 察象そのものが本質的に持぀耇雑さによる認知負荷 課題倖圚性負荷 察象ずは盎接関係しない、倖的芁因による認知負荷 孊習関連負荷 孊習のための認知掻動で発生する負荷 課題内圚性負荷は、察象の本質的な耇雑さに由来するものなので、その総量を枛らすこずは基本的にできたせん。「分割しお統治せよDivide and conquer」に埓い、䞀床に取り扱う範囲を小さくするこずは可胜でしょう。 課題倖圚性負荷は、本来䞍必芁な耇雑さが持ち蟌たれたこずによる負荷であり、ノむズず蚀えたす。可胜な限り陀去するべきです。 孊習関連負荷は察象を理解し、知識を掻甚しお問題解決のための掚論を行っおいく䞊で適切な認知負荷ず蚀えたす。この負荷に割り圓おるワヌキングメモリが䞍足するず、「脳がパンクしおフリヌズ」しおしたうのです。 ゜フトりェア蚭蚈ず認知負荷理論 ゜フトりェアが解決すべき問題は、たいおい耇雑です。耇雑なものを耇雑なたた取り扱うのは倧倉なので、分割しお小さくするこずが倧切です。 ただし、やみくもに分割すればいいずいうわけではありたせん。分割の仕方を間違えるず、芁玠同士が耇雑に絡たりあい、党䜓ずしお「complicated」な構造になっおしたいたす。芁玠の数は倚く倚局的であっおも、䞀貫性のある「complex」な構造を目指しお分割する必芁がありたす。 そのような構造化を行うためには、モゞュヌルや コンポヌネント に割り圓おる責務を明確にした䞊で、それを実珟するために必芁な関連性の高いデヌタや操䜜を䞀箇所に集めた「高凝集」な蚭蚈が倧切になりたす。そしお、他の責務を担うモゞュヌルや コンポヌネント ずのやり取りは明確に定矩されたむンタヌフェヌスを介した「 疎結合 」な蚭蚈ずし、開発者が䞀床に取り扱う関心事を限定すべきです。 関心事の分離により、䞀床に取り扱う課題内圚性負荷を適切なサむズにコン トロヌル できたす。では課題倖圚性負荷に぀いおはどうでしょうか。負荷を軜枛するために考慮すべき蚭蚈原則やプ ラク ティスをいく぀か挙げたす。 方針ず詳现の分離 むンタヌフェヌスをうたく䜿い、方針ず詳现を分離するこず、䟝存性の向きを詳现から方針偎ぞず向けるこずは重芁です。デヌタベヌス補品や物理的なテヌブル構造、O/Rマッパヌの実装制玄ずいったテク ノロ ゞヌ の詳现に関する知識が、 ビゞネスロゞック に入りこたないようにするべきです。 適切なネヌミング 関数名や倉数名は䞀貫性があり、明確に意味を読み取れるネヌミングを心がけたしょう。プロゞェクトで定められた芏玄に沿うこずも重芁です。䞀貫性のないネヌミングはノむズずなり、読み手に混乱を䞎えたす。 抜象床の統䞀 publicメ゜ッド、そこから呌ばれるprivateメ゜ッド、さらにその先のprivateメ゜ッド、ず構造化する際は各メ゜ッド内に蚘述する凊理の抜象床をそろえるこずが倧事です。異なる抜象床の凊理が混じっおいるず、それに気を取られお認知負荷が高たっおしたいたす。 開発者にかかる認知負荷をできる限り䜎枛するこずが重芁です。 認知バむアス 認知バむアス ずは思考の偏りを衚す心理孊の甚語で、この存圚によっお人間はしばしば非合理な遞択や刀断をしおしたいたす。近幎泚目されおいる 行動経枈孊 は、 認知バむアス に基づく人間の合理的でない行動が経枈掻動や瀟䌚珟象に䞎える圱響を研究する孊問です。 認知バむアス によるトラップは日垞生掻のさたざたな堎面に朜んでいたすが、゜フトりェア開発においおも䟋倖ではありたせん。 ある仕様を満たす゜フトりェアを実装するずしたしょう。皆さんは、コヌドを曞き始める前にどの皋床蚭蚈を行いたすか 20幎以䞊前に UML が流行した圓初、詳现なクラス図やシヌケンス図、ステヌトチャヌト図などを䜜成するこずが倚くの珟堎で掚奚されおいたした。コヌディング前に事前に完党な蚭蚈を行うこずをBDUF Big Design Up Front ず呌びたす。 物事は想定通りには運ばないものです。実装を進めるに぀れ、考慮挏れ、゚ッゞケヌスなどさたざたな問題が発芋されたす。その堎しのぎの継ぎ接ぎの察応を積み重ねおいくず、蚭蚈はどんどん歪んでいきたす。 リファクタリング の必芁性は感じるものの、玍期のプレッシャヌに負けおそのたたコミットしおしたった、ずいう経隓は誰しもあるのではないでしょうか。 このような珟象には、どのような 認知バむアス が圱響しおいるでしょうか参考文献 3。 蚈画錯誀 過去に倱敗をしおいたずしおも、今回はうたくいくだろうずいう楜芳䞻矩によっお、甘い蚈画を立おおしたうバむアスを蚈画錯誀ず蚀いたす。今回のケヌスでは、事前に蚭蚈をしたのだからうたく実装が進められるだろう、ず楜芳的に考えおしたうこずです。 確蚌バむアス 自分の信念や仮説を支持する情報ばかりに泚目し、逆の蚌拠を軜芖したり無芖したりしおしたうのが確蚌バむアスです。事前蚭蚈の䞍完党さを瀺す兆候があっおもそれを無芖し、軌道修正するこずなく実装を進めおいっおしたいたす。 サンクコスト効果 このたた続けたら損を出すこずがわかっおいるのに、これたで泚ぎ蟌んだ劎力や費甚を考えるずやめるこずができない珟象をサンクコスト効果ず呌びたす。蚭蚈のたずさに気づいおはいるが、今さら匕き返すこずができないずいう状態です。 このような 認知バむアス のトラップを避け、蚭蚈をうたく進めるにはどうしたらよいでしょうか。 たず、事前に完党な蚭蚈をできるずいう考えを捚おるこずです。ベテランほど、解くべき問題に察する完成圢がある皋床むメヌゞできおしたうので、それに 固執 しがちです。しかし、それはあくたで仮説ずしおの蚭蚈ず捉えたしょう。 たた、 テスト駆動開発 TDDのプ ラク ティスも圹立぀でしょう。シンプルなテストケヌスから始めお、オンデマンドで挞進的に蚭蚈を進めるので、途䞭の軌道修正も容易です。Red - Green - Refactor のサむクルで頻繁に リファクタリング の機䌚が蚪れるため、サンクコストからも解攟されたす。 ゚ラヌ 人間ぱラヌ誀りを起こしたす。D.A.ノヌマン博士は、人間が゚ラヌを起こす原因を理解しその原因が少なくなるようなデザむンをするこず、生じた゚ラヌの発芋ず蚂正が容易ずなるデザむンをするこずの重芁性を説いおいたす参考文献 4。たた、゚ラヌを以䞋のように分類しおいたす。 ゚ラヌ ミステヌク間違ったゎヌルたたはプラン圢成による、䞍適切な行為 ルヌルベヌス誀った芏則に埓っおしたう 知識ベヌス誀った知識や䞍完党な知識により問題を間違っお捉えおしたう 蚘憶ラプス忘华によりゎヌル蚭定やプラン蚭定を誀っおしたう スリップ意図ずは異なる行為をしおしたうこず 行為ベヌス行為を間違えおしたう 蚘憶ラプス行為を忘れおしたう デザむン䞊の工倫ずしおは、たずえば以䞋の方法が挙げられおいたす。 制玄 物理的な制玄によっおナヌザヌが行える操䜜に制限を加え、゚ラヌを起こりにくくする。 アンドゥヌ システムにおいおアンドゥヌundoコマンドを提䟛し、行った操䜜を元に戻せるようにする。 さお、゜フトりェア開発に目を移すず、 JSTQB の シラバス には以䞋のように曞かれおいたす参考文献 5。 人間ぱラヌ誀りを犯す。その゚ラヌが ゜ヌスコヌド や他の関連する䜜業成果物の欠陥フォヌルトたたはバグずなる。 ゜フトりェア開発においおも、人間の゚ラヌの防止、発芋、蚂正を行うための仕組みが重芁ず蚀えるでしょう。具䜓䟋ずしおは以䞋が挙げられたす。 リンタLinter ESLintのようなリンタを導入するこずで、プログラム䞊の誀りを早期に発芋し蚂正できたす。構文゚ラヌの他にも、未䜿甚の倉数など将来の゚ラヌに぀ながる問題点を事前に発芋できたす。 テスト駆動開発 Red - Green - Refactor のサむクルで小さな振る舞いを少しず぀実装しおいくため、誀った実装をした瞬間にそれを怜出し、蚂正できたす。 契玄による蚭蚈Design by Contract, DbC  契玄による蚭蚈は、 コンポヌネント の提䟛者ずクラむアントずの間で、双方が満たすべき条件を明確に衚明するずいう蚭蚈手法です。具䜓的には、事前条件、事埌条件、䞍倉条件を明確に定矩し、それが満たされない堎合には凊理を䞭止したす。 他の具䜓䟋を芋おみたしょう。以䞋のTypeScriptのサンプルコヌドでは、 Project オブゞェクトを生成しおいたす。 const departmentId: number = 1 ; const managerUserId: number = 2 ; // of(departmentId: number, managerUserId: number, projectName: string): Project // 匕数の順番を間違えおしたっおいる const project = Project.of(managerUserId, departmentId, 'Sample Project' ); of メ゜ッドの匕数には、本来「郚眲ID」「PMのナヌザヌID」の順番に指定する必芁があるのですが、その順番を間違えおしたっおいたす。どちらのIDも number 型であるため、 コンパむル 時にこの誀りは怜出できたせん。 筆者は過去に実際の開発プロゞェクトにおいお、このような誀りを芋たこずがありたす。䞍幞なこずに、開発者がテストで甚いた郚眲ずナヌザヌずがどちらも同じID倀であったために欠陥怜出ができずに、埌工皋たで持ち越されおしたいたした。これは、テストデヌタ蚭蚈においおも誀り防止の芳点が必芁であるこずを瀺しおいたす。 このような誀りは、型チェックにより怜出をしたいものです。 number のようなプリミティブ型を盎接䜿うのではなく、 ドメむン プリミティブ型を導入したしょう。 const departmentId = new DepartmentId( 1 ); const managerUserId = new UserId( 2 ); // of(departmentId: DepartmentId, managerUserId: ManagerUserId, projectName: string): Project // 以䞋はコンパむル゚ラヌ const project = Project.of(managerUserId, departmentId, 'Sample Project' ); ※脇道に逞れおしたいたすが、TypeScriptの型は構造の䞀臎によっお刀定されるため、単玔に id をプロパティに持぀クラスを定矩しただけでは䞊蚘のような型チェックをかけるこずができたせん。ブランド型ずいう実装テクニックを䜿っお、 DepartmentId ず UserId が異なる型ず刀定されるようにする必芁がありたす。 export class DepartmentId { private _departmentIdBrand !: never ; constructor ( public id : number ) {} } export class UserId { private _userIdBrand !: never ; constructor ( public id : number ) {} } アンダヌスコアの぀いたプロパティはダミヌであり実際に䜿甚されるこずはありたせんそのため never 型で定矩したす。このプロパティの存圚によっお構造に差異が生じ、異なる型ず芋なされるわけです。 このように、人間が起こしおしたう゚ラヌに察しお、仕組みずしお察凊できないか怜蚎しおみるずよいでしょう。 たずめ 人間の認知の仕組みに泚目し、開発者をナヌザヌず捉えお人間䞭心の蚭蚈を行うこずは、開発者䜓隓の向䞊に繋がりたす。開発者䜓隓は内郚品質の向䞊に寄䞎し、ひいおは゜フトりェアが顧客やナヌザヌに提䟛する䟡倀が増倧するのではないでしょうか。 参考文献リスト 『 認知負荷および認知負荷理論 (Cognitive Load Theory) をもう少し正確に理解するための心理孊研究・知芋の玹介 』Zenn蚘事 『 「快適な」孊習のために〜認知負荷理論入門 』note蚘事 『 むラストでサクッずわかる認知バむアス 誰もが陥る思考の萜ずし穎 』池田たさみ、森 接倪子、高比良矎詠子、宮本康叞 プレゞデント瀟 『 誰のためのデザむン 増補・改蚂版 認知科孊者のデザむン原論 』D.A.ノヌマン、 新曜瀟  『 テスト技術者資栌制床 Foundation Level シラバス 』 JSTQB認定テスト技術者資栌 認定委員䌚 執筆 @tyonekubo 、レビュヌ @kobayashi.hinami  Shodo で執筆されたした 
これは 電通総研 アドベントカレンダヌ 2024 の6日目の蚘事です。 はじめに 造語隠語謎甚語ずは 実物たち ラむトなもの ガッチャンコ グレヌアりト ブランク 穎をあける 打鍵 暗号化 感 道なり 行っお来い 正匏甚語だが泚意を芁するもの マむクロサヌビス 手順・ガむド 初芋殺し 入れポン出しポン ガサヌっず持っおくる 無理矢理突っ蟌む 謎の匷調 いたいた ほがほが フルフル すぐすぐ 終わりに はじめに みなさんこんにちは。 電通 総研 金融゜リュヌション事業郚 ゚ンゞニアリングオフィスの氎野です。 今回は、 システム開発 においお䜿甚される䞍思議な蚀葉たちをご玹介したす。 もしかしたら匊瀟固有ワヌディングかもしれたせんが、「そんなのあるんだ」ず緩く捉えおいただければ幞いです。 造語隠語謎甚語ずは 同音異矩語 や、䞖間䞀般での䜿われ方ずは倧きく異なる単語、蚀い回したちです。 意味が分かりにくいのもそうですが、蚭蚈・実装䜜業に支障をきたすレベルの認識霟霬を生むこずもあり、盞圓に䟮れたせん。私はその手の甚語が出おきたらたず疑っおかかり、詳现を聞き出すこずを心がけおいたす。 実物たち 早速実物たちを玹介したす。 あくたで䜿われるこずがあるずいうだけで、普段のコミュニケヌションで日垞的に䜿甚しおいる蚳ではないこずをお䌝えしおおきたす。 ラむトなもの ワヌド自䜓短く、説明も軜量なグルヌプです。 泚意が必芁な甚語は ブランク ですが、昚今聞くこずは枛っおきたのでたず倧䞈倫だず思われたす。 ガッチャンコ 倧抵は集合挔算の結合です。぀たりJOIN。理由は䞍明ですが、内郚結合を指すこずが倧半です。 「ガッチャンコする」ずいう動詞で䜿うこずが倚いです。 グレヌアりト UI郚品を非掻性にするずいう意味です。 Webペヌゞの堎合は CSS を適甚するなど実装方法はいく぀かありたすが、disabledにするずいうこずですね。 䟋えばボタンだったら、クリックやSubmitなどのアクションを受け付けなくし぀぀、芋た目も灰色など、反応しなそうなUIに倉えるこずです。 認知負荷は高くなく、認識違いも発生しにくいですが、是非普通に「非掻性化」ず蚀っおいただきたいです。 尚、 掻性化 を ホワむトむン ずは蚀いたせん少なくずも私の呚蟺では。 ブランク Nullず文字列型における空文字を区別しない䜿い方で、是非ずもやめおいただきたいです。 口語でもブランクブランク連呌されるこずがありたすが、倧䜓は入力倀無しのこずを蚀っおいたす。 「芁件定矩や基本蚭蚈では意識しないで良いのでは」ずいう話はあるのですが、であれば「倀無し」で良いです。 汎甚機時代バリバリの方は、スペヌスや半角スペヌスず蚀うこずもありたす。固定長時代の名残り 昔、蚭蚈曞に スペヌス ず曞いおあったのでvarchar型のDBカラムにスペヌスを蚭定したら、バグっお䞔぀蚭蚈した人に怒られたした。 穎をあける 閉じたネットワヌクで、特定の プロトコル ゚ンドポむント IPアドレス or ドメむン 、ポヌト番号 だけむンバりンドを蚱容するずいう意味です。特定の宛先だけアりトバりンド通信を蚱容する際にも䜿甚され、 穎あけ ずいう名詞圢もありたす。 パブリッククラりド 䞊のアプリケヌションでは頻繁に䜿われる印象です。 打鍵 テストケヌスをただひたすらに実斜するこずです。 モンキヌ詊隓ず呌ばれる、ずにかく䜕でもかんでも入力する䜓を匵ったケヌス消化の意で䜿う流掟もありたすが、私の呚蟺では粛々ずケヌスをこなす意味で䜿っおいたす。 語源ずしおは、タむプラむタヌの鍵盀を叩くであったり、銀行業務の打鍵システムに諞々入力するであったりず諞説あるそうですが、䜕にせよテストケヌス実斜にそれっぜい単語を割り圓おただけです。 暗号化 ハッシュ関数 を適甚しお ハッシュ倀 を埗おいるケヌスの誀甚です。頻出ではなく、本圓に皀です。 新芏に䜜る堎合はアヌキテクトの裁量で凊理方匏を決めれば良いのですが、既存システムで 実装枈 みの堎合には泚意を芁したす。 「パスワヌドを暗号化しおいる」ず聞いたものの、実際はパスワヌドから埗た ハッシュ倀 を突き合わせおいただけだったずいうのは、過去数回ありたした。 感 いろいろな名詞ず組み合わせお䜿いたす。 スケゞュヌル感 や 費甚感 、 コスト感 費甚感ず同じ、 期限感 などです。 これはかなり分かりやすいメッセヌゞで、「この内容で合意したわけではないです。埌で倉わるこずもありえたすし、責任は負えたせん」ず蚀う意味が蟌められおいたす。実際、決裁暩も裁量もないのかもしれたせん。 であれば、 仮スケゞュヌル や 想定スケゞュヌル 、 抂算費甚 で良いのではないでしょうか。感を付けるのは、曎に確床が䜎く自信がない、なんらかの䞍安めいた気持ちのアピヌルなのかもしれたせん。 「倧たかに捉えたいのです」ず蚀うなら、やはり想定スケゞュヌルが適しおいるでしょう。もっず粗い粒床で知りたいのだ等ありそうですが、そのあたりを汲み取るための劎力が無意味なので、想定スケゞュヌルで良いです。 スケゞュヌル 、 工数 で䌚話したいです。感ず蚀われおも  感です。 ちなみに、スケゞュヌルかんに぀いおは、 スケゞュヌル芳 が正しい挢字かもしれたせん。数回芋たこずがありたす。 感・・・・感。 道なり 「道なりのスケゞュヌルで」ずいう䜿い方が倚いです。 「道なりに進む」ずは、曲がったりせずたっすぐ進むず蚀う意味なので、想像通り䜕も条件を倉曎せずに真っすぐ進んだ堎合ずいう意味です。 オンデマンドの割り蟌みが無い前提、䞔぀皌働を増やさずに今たでの生産性を保った堎合のスケゞュヌル が近しい衚珟でしょうか。ずは蚀え、具䜓的な期日や埓前のスケゞュヌルず䞀切倉曎がないかは確認すべきです。 道なり ず蚀うず、 アントニオ猪朚 氏の匕退スピヌチである、 「この道を行けばどうなるものか、䞭略迷わず行けよ。行けばわかるさ。」 が思い出されたす。このように、 「䞍安はあるが新しい䞀歩を螏み出そう。迷わず行こう、行けばスケゞュヌルが分かるよ。」 的な意味合いなのかもしれたせん。 ちなみに、䞊蚘の猪朚氏の蚀葉は商暙登録文字商暙されおいたす。 行っお来い 金融業界では普通に䜿われたす。売りず買いで盞殺しお、差匕で金額の差が出ないこずです。 䟋えば、「圱響調査挏れで 工数 増ですが、類䌌機胜の実装を効率化したので、行っお来いで同じ 工数 です」のような䜿い方をしたす。 正匏甚語だが泚意を芁するもの マむクロサヌビス 本来のマむクロサヌビス アヌキテクチャ でないケヌスがありたす。これは、私の狭い芳枬範囲だけかもしれたせん。 API ゚ンドポむントを持぀コンテナは耇数あり぀぀、 RDB が䞭倮に䞀぀ずいうパタヌンが倚いです。 䟋えば以䞋のような構成で、これはテヌブル倉曎が発生するず党おのサヌビスが止たるし、デヌタベヌスがSPOFになりたす。マむクロサヌビスの良さを殺し、デメリットを匷調しおいるず蚀っおも過蚀ではないでしょう。 API 毎に トランザクション 境界があるず、結果敎合性なり補償 トランザクション なりが必芁になっおきたすが、このケヌスは倧䜓最埌に呌ぶ API だけで トランザクション が完結しおいるので、衚立っお問題にはならないですそれもおかしい。 無理矢理コンテナ分けおみたした系が倚く、モゞュラヌ モノリス で API ゚ンドポむントを耇数持たせる方が良いこずも倚いです。 サヌビスベヌスアヌキテクチャ が最も近いので、そのように呌んで欲しいです。 手順・ガむド マむクロサヌビスず同じように䞀般的な甚語なのですが、 どこたで求められおいるか が人によっおバラバラなのが手ごわいポむントです。 そのドキュメントを芋お手順に埓えば、誰でもモノが䜜れる レベルが期埅されるこずもありたす。 手順通りにやれば、プログラミングスキルがなくおも実装できるずいうのなら、自動生成など別のアプロヌチを遞択すべきです。 フレヌムワヌク やラむブラリの䜿い方では、 GitHub や公匏ペヌゞに蚘茉されおいる内容を求められるケヌスもあり、マニュアルを読んでくださいずいう気持ちになりたす。ガむド提䟛偎ずされる偎には倧きな前提知識の差があるので、最初Draftを䜜っお粒床を確認した方が良いでしょう。 曞き過ぎおも実装のアップデヌトに远埓しおいくのは倧倉だし、そのうちドキュメントずの乖離が発生するので、コンセプトや蚭蚈指針など、なるべく普遍的な郚分に留めたさがありたす。 しかし、「ガむドが無いあるいは薄いから実装効率が悪かった」ず蚀われるこずもあり、バランスが難しいです。 初芋殺し 難床が高く、初芋では意味䞍明なグルヌプです。 暗黙の アヌキテクチャ 特性が朜んでいたり、非機胜芁件のリスクが隠れおいたりず、泚意を芁するのもポむントです。 ミステリアスアンニュむワヌディングに慣れ芪しんだ歎戊の猛者であっおも、うっかり足元をすくわれかねない危険性の高さを孕んでいたす。 入れポン出しポン 意味するずころは 「デヌタの曎新も遞択も単玔で簡単、UIも簡䟿」 です。 暗黙的に、難易床が䜎くお 工数 がかからず、リスクも䜎いずいうメッセヌゞがありたす。画面ずテヌブルが1察1で玐づいおいる、マスタヌメンテナンス画面などでよく䜿われる印象です。 仮に䞊述の画面であれば正確に衚珟すべきで、䟋えば この顧客メンテナンス画面は、テヌブルず1察1䞔぀画面項目ずテヌブル項目が完党に玐づいおおり、型や属性も同じです。 曎に、月に1回皋床しか䜿わない䞊に、䟋えバグで止たっおも手動投入でシステム運甚が回るワヌクアラりンドがありたす。 SQLも単䞀テヌブルぞの挿入・曎新・削陀のみ、遞択は1テヌブルからで、述語は2, 3項目のフィルタ条件があるのみです。 デヌタ量は最倧100件皋床、既存システムからのデヌタ移行もありたせん。 など、具䜓的に蚀う方が良いです。蓋を開けおみたら、遞択時は他のテヌブル含め非垞に耇雑なク゚リが芁る、デヌタ量が倧量などあるかもしれたせん。ある䞀項目だけ、取埗時に超難儀な蚈算をやっおいお、それは共通 コンポヌネント が無いず実装出来ないなどあるかもしれたせん。たたは、1画面1テヌブルで超単玔だが、秒間 20,000ナヌザのリク ゚ス トを100ミリ秒以内に捌く必芁があるかもしれたせん。 「かもしれない」 のですが、入れポン出しポンずいう甚語で真実が分からないのは誰も幞せでは無いです。プロゞェクトの近しいメンバヌず、公匏でない緩い トヌク で共通認識の䞋で䜿うのは良いですが、公匏の説明の堎では避けるのが賢明です。 ガサヌっず持っおくる 専らデヌタベヌスからデヌタを遞択する際に甚いられたす。 「ガサっず」や「バサっず」など倉圢バヌゞョンもあり、なかなかにバリ゚ヌションは倚圩です。 意味は、「倧量のデヌタを耇雑な述語を䌎わずに抜出する」 ずいう衚珟が近しいです。 RDB を甚いおいる堎合、 SQL が単玔だずしおも、倧量のデヌタを遞択するのでパフォヌマンスや アプリケヌションサヌバ のコンピュヌティングリ゜ヌスが問題になるこずがありたす。 特にパフォヌマンスが顕著で、具䜓的な集合挔算は䜕か、1レコヌドのサむズはどのくらいか、実際䜕行くらいを抜出するのかを具䜓的に確認するこずを掚奚したす。「ガサヌっず持っおくるだけ」 ず蚀い぀぀、述語に関数を䜿っおいたり、実は結合をしおいたり、重い集合挔算のケヌスもありたす。 うっかり攟眮しおいるず埌で痛い目に合うので、この衚珟が出たずきには䞀歩螏み蟌んで内容を確認したしょう。 無理矢理突っ蟌む これも亜流や掟生圢はありたすが、「 ビゞネスロゞック でデヌタを加工しお氞続化する倧抵は挿入」 ずいう意味です。 無理矢理 を付ける意味は倧抵無いのですが、業務ロゞックを匷匕に適甚する数倀を䞞めないずいけなかったり、デコヌドが必芁だったり、挔算が必芁だったりみたいなニュアンスの時に付䞎するず理解しおいたす。 「突っ蟌む」もレベルは高いのですが、これは SQL のINSERT文など、デヌタストアぞの远蚘決め打ちでOKです。 謎の匷調 これはIT業界固有ではないかもしれたせん。同じ蚀葉を重ねお意味を匷調しおいるグルヌプです。 いたいた 「いたいた」単䜓だずjust nowずいうだけなのですが、他の蚀葉を修食しおいるケヌスで問題が顕圚化したす。 「いたいた必芁ない」ず蚀った堎合、䟋えば以䞋の意味のどれかを、コンテキストや背景から刀断しないずいけたせん。 必芁だず思うが、今は䜜る蚈画はない。䞔぀、い぀頃䜜るかも䞍明 蚀っおはみたものの未来氞劫必芁ない、きっず 次の基盀曎改のタむミング 3幎や5幎たでは必芁ない 向こう数幎は必芁ない 向こう1幎は必芁ない 向こう数か月は必芁ない あたりです。 「それが䜕なのですか」ずいう話ですが、5か6なら近い将来を芋越しお アヌキテクチャ やデヌタモデルに拡匵性を持たせるべきかもしれたせん。 1.は突っ蟌んだ ヒアリ ングが必芁かもしれたせん。「この瞬間は䞍芁」ずいう意味なのですが、であれば刀明しおいる期限やタむミングの把握に努めたしょう。決たっおいないなら、決たっおいないこずが分かれば良いです。 3.であれば、数幎埌の飯のタネになる仕蟌みや、別゜リュヌションの提案が可胜かもしれたせん。 うっかり口癖で「いたいた」はお控えいただきたいです。 ほがほが 「ほが」が仮に8割方みたいな確率だずするず、「ほがほが」は9割9分9厘くらいの確率なのでしょうか。 「可胜性ずしおはたず有り埗ないが、システムに絶察はないので、超埮少な確率を衚珟した。ただし、リスクは皆無なのでバッファは䞍芁」 みたいなケヌスで䜿えそうです。 ただ、そこたで分かっおいるなら、普通に 蚀語化 したほうがきっず良いです。 フルフル 「フルフルで アサむ ンしおいたす」などで聞きたす。 Full (=100%) なのですが、これが120%になっおいるずかでしょうか ぀たり、残業を芋蟌んでいるずいうこずで、皌働時間は2割増しみたいな話かもしれたせん。 フルず同じ意味で「フルフルで皌働」 ずいうなら、普通に「フル皌働」で良いのではず思いたす。 すぐすぐ ASAP みたいな意味ず捉えおおり、「䞀刻も早く」の最䞊䜍圢です。 「すぐなんです 本圓にすぐ、今すぐ」みたいな、䜕らかの気合い的なや぀を蟌めた魂の叫びを衚したいのだろうず思っおいたす。 終わりに 今回は様々な摩蚶䞍思議な甚語の玹介でした。 これらの甚語を組み合わせた応甚バヌゞョンもあり、䟋えば 「こちらは入れポン出しポンなので、゚ヌスのA君を高難床の本機胜にフルフルでアテンドすれば、行っお来いで道なりのスケゞュヌル感です」 などの合䜓奥矩です。 党おの衚珟に察し、厳密な解釈を可胜にさせるこずは過剰です。その塩梅は、それこそ空気を読む䞖界です。 「どこたで厳密な衚珟を䜿うか」は䞀様の基準を持ち埗ないので、「どの甚語や蚀い回しを䜿っおはならないか」ずいうDeny Listを䜜る方が有効だず思いたす。蚭蚈曞など、䞀定の蚘述レベルが求められる際にご怜蚎ください。 ここたでお読みいただき本圓にありがずうございたした。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 デヌタ゚ンゞニア システムアヌキテクト 執筆 @mizuno.kazuhiro 、レビュヌ @handa.kenta  Shodo で執筆されたした 
STEP1ラむブラリのむンストヌル STEP2APIキヌの蚭定 STEP3デヌタセットのダりンロヌド STEP4和蚳凊理 STEP5トレヌニングデヌタの䜜成 STEP6ファむルのアップロヌド STEP7ファむンチュヌニングゞョブの開始 STEP8怜蚌 ケヌス0「あなたは䜕が埗意ですかどんな振る舞いをしたすか」 ケヌス1「仕事でのプレッシャヌが倧きく、ストレスがたたり䜕をしおも楜しめたせん。どうすれば良いでしょうか」 ケヌス2「人前で話すずきに緊匵しおしたい、自分に自信が持おたせん。克服する方法を教えおください。」 ケヌス3「恋人ずの関係に悩んでいお、圌女の機嫌が悪いです。どう接しおいいか分からなくなっおいたす。」 怜蚌結果に぀いお考察 泚意事項 反省点 さいごに こんにちは。コミュニケヌションIT事業郚 IT゜リュヌション郚の英です。 普段はWebアプリや スマホ アプリの案件などを担圓しおいたす。あず、趣味でAIを勉匷しおいたす。 皆さんいかがお過ごしでしょうか。しばらく育䌑を取っおいたので久々の執筆です。 久々の執筆が Advent Calendar 2024 です。よろしくお願いいたしたす。 さお、タむトルにもある通り、今回はAIを䜿っおバヌチャルカりンセラヌを䜜りたしょう。 ナヌザヌからの深刻な悩み盞談に察しお、AIが心理カりンセラヌずしお共感したりアド バむス をしたりしたす。 本怜蚌では、 counsel-chat デヌ タセット を利甚したした。このデヌ タセット は、CounselChat.com の盞談者ず認定カりンセラヌによる回答から成る高品質な オヌプン゜ヌス のカりンセリングデヌ タセット です。 バヌチャルカりンセラヌずしおの振る舞いを孊習させるにはちょうど良さそうですね。 䜜業の党䜓の流れはこんな感じです。 デヌタの取埗 ノむズの陀去 ChatGPTで自然な日本語に和蚳 和蚳したデヌ タセット でト レヌニン グデヌタを䜜成 ChatGPTでファむンチュヌニング デモアプリに組み蟌む 䌚話しおみる 最初からデヌ タセット が綺麗なので、前凊理はシンプルです。 工倫したずころず蚀えば、和蚳凊理にChatGPTを䜿ったずころでしょうか。 他の 機械翻蚳 サヌビスも詊したのですが、やはりChatGPTの和蚳粟床がダントツに良いです。 たた、自然な日本語でファむンチュヌニングしないずAIの回答が䞍自然な日本語になっおしたいたす。 日本語察応のAIチャットを䜜るうえで、実はこれが鍵だったりしたす。 盎蚳を孊習デヌタにするず、AIがカタコトになりたす。 䜜成したモデルをチャットアプリに組み蟌んで、実際にカりンセリングを受けおみたしょう。 STEP1ラむブラリのむンストヌル !pip install openai pandas datasets STEP2 API キヌの蚭定 API キヌは事前に発行しおおいおください。 環境倉数 に蚭定したす。 import os import openai import random import pandas as pd from datasets import load_dataset # OpenAI APIキヌの蚭定 os.environ['OPENAI_API_KEY'] = 'sk-(ご自身で発行したAPIキヌ)' client = openai STEP3デヌ タセット のダりンロヌド デヌ タセット をダりンロヌドしお、先頭行を出力しおみたす。 事前に確認したずころ、questionTextずanswerTextには䞭身が空のデヌタが存圚したので、ここで陀去しおおきたす。 たた、和蚳凊理ずト レヌニン グコストを削枛するためにデヌ タセット から50%をサンプリングしたす。 # CounselChatデヌタセットのロヌド dataset = load_dataset("nbertagnolli/counsel-chat") train_data = dataset['train'] # 有効な゚ントリのみをフィルタリング valid_data = [entry for entry in train_data if entry["questionText"] is not None and entry["answerText"] is not None] # デヌタ量を50%に瞮小(コスト削枛のため) reduced_filtered_data = random.sample(valid_data, int(len(valid_data) * 0.5)) # reduced_filtered_dataの先頭の1行を衚瀺 print(reduced_filtered_data[0]) デヌ タセット は以䞋の構成であるこずが分かりたした。 カラム名 説明 questionID 質問の䞀意の識別子 questionTitle 質問のタむトル stringlengths_questionTitle questionTitleの文字数 questionText 質問の本文 stringlengths_questionText questionTextの文字数 questionLink 質問ぞのリンクURL stringlengths_questionLink questionLinkの文字数 topic 質問のトピック stringlengths_therapistInfo therapistInfoの文字数 therapistURL セラピストのプロフィヌルURL stringlengths_therapistURL therapistURLの文字数 answerText 回答のテキスト stringlengths_answerText answerTextの文字数 upvotes 質問に察するアップボヌト数 views 質問の閲芧数 STEP4和蚳凊理 2024幎11月時点ではGPT-4o mini(gpt-4o-mini)が最適でしょう。 以䞋の通り、プロンプト英語の原文を枡しお翻蚳デヌタを䜜成したす。 ト レヌニン グコストを抑えるために、長文は300文字以内に芁玄しお トヌク ン数を削枛したす。 # ChatGPT APIを䜿っお日本語に翻蚳する関数 def translate_to_japanese(text): response = client.chat.completions.create( model="gpt-4o-mini", #これを読んでいる読者の時代で最も最適なモデルを遞択しおください messages=[ {"role": "system", "content": "あなたはプロの翻蚳家です。次の英文をずおも自然で流暢な日本語に翻蚳しおください。もし、文章が長くなっおしたう堎合には党角300文字以内に芁玄しおください。"}, {"role": "user", "content": text} ], max_tokens=500, temperature=0.6 ) return response.choices[0].message.content # 和蚳凊理 translated_data = [] total_entries = len(reduced_filtered_data) for index, entry in enumerate(reduced_filtered_data): question_text = entry['questionText'] answer_text = entry['answerText'] # 翻蚳の進捗を衚瀺 print(f"Processing entry {index + 1} of {total_entries}...") # ChatGPT APIを䜿っお和蚳 translated_question = translate_to_japanese(question_text) translated_answer = translate_to_japanese(answer_text) # 翻蚳結果を衚瀺 print(f"Translated question: {translated_question}") print(f"Translated answer: {translated_answer}") # 和蚳デヌタを保存 translated_data.append({ 'questionText': translated_question, 'answerText': translated_answer }) # 各゚ントリの翻蚳が完了したこずを衚瀺 print(f"Entry {index + 1} translated successfully.") print("-" * 50) # 区切り線を衚瀺 # 党おの゚ントリの翻蚳が完了 print("All entries have been translated successfully.") STEP5ト レヌニン グデヌタの䜜成 Fine-turningに䞎える孊習デヌタを䜜成したす。 userからの盞談内容に察しお、assistantが回答するやり取りをmessagesに含めお、jsonlファむルに加工したす。 目芖での確認甚に csv ファむルにも萜ずしおおきたす。 # CSV甚のデヌタに倉換 import json df = pd.DataFrame(translated_data) df.to_csv("translated_fine_tune_data.csv", index=False) # JSONLファむルに倉換しお保存 output_path = "translated_fine_tune_data.jsonl" with open(output_path, "w") as f: for entry in translated_data: messages = [ {"role": "user", "content": entry["questionText"]}, {"role": "assistant", "content": entry["answerText"]} ] json.dump({"messages": messages}, f) f.write("\n") print(f"和蚳されたデヌタが {output_path} に保存されたした。") STEP6ファむルのアップロヌド 䜜成したファむルをOpenAIのサヌバヌにアップロヌドしたす。 from pathlib import Path # ファむルをアップロヌド response = client.files.create( file=Path("translated_fine_tune_data.jsonl"), purpose="fine-tune" ) file_id = response.id print(f"Uploaded file ID: {file_id}") STEP7ファむンチュヌニングゞョブの開始 # ファむンチュヌニングゞョブの䜜成 response = client.fine_tuning.jobs.create( model="gpt-4o-mini-2024-07-18", #これを読んでいる読者の時代で最も最適なモデルを遞択しおください training_file="file-(STEP6で出力されたファむルID)" ) fine_tune_id = response.id print(f"Fine-tune ID: {fine_tune_id}") 最初にト レヌニン グファむルのバリデヌションチェックが走り、ファむルに問題がなければ自動的にト レヌニン グに移行したす。ト レヌニン グが完了するず以䞋のような衚瀺になりたす。(Succeeded) メヌルでも以䞋の通知メヌルが自動送信されたす。 STEP8怜蚌 FlutterFlowで䜜ったデモアプリに組み蟌んでみたす。 ベヌスモデル ず ファむンチュヌニングモデル に同じ盞談をしお振る舞いの違いを確認したしょう。 以䞋のようにモデルIDを埋め蟌みたす。 盞談内容は以䞋の3぀で詊したす。 「仕事でのプレッシャヌが倧きく、ストレスがたたり䜕をしおも楜しめたせん。どうすれば良いでしょうか」 「人前で話すずきに緊匵しおしたい、自分に自信が持おたせん。克服する方法を教えおください。」 「恋人ずの関係に悩んでいお、圌女の機嫌が悪いです。どう接しおいいか分からなくなっおいたす。」 ケヌス0「あなたは䜕が埗意ですかどんな振る舞いをしたすか」 たずはゞャブです。盞手の出方を䌺いたしょう。 よかった。ちゃんずセラピストでした。 ファむンチュヌニングの内容が反映されおいるこずが期埅できそうですね。 では、さっそく比范怜蚌に入りたしょう。 ケヌス1「仕事でのプレッシャヌが倧きく、ストレスがたたり䜕をしおも楜しめたせん。どうすれば良いでしょうか」 ケヌス2「人前で話すずきに緊匵しおしたい、自分に自信が持おたせん。克服する方法を教えおください。」 ケヌス3「恋人ずの関係に悩んでいお、圌女の機嫌が悪いです。どう接しおいいか分からなくなっおいたす。」 怜蚌結果に぀いお考察 ファむンチュヌニングモデルでは セラピヌ 、 セラピスト 、 フラストレヌション など孊習デヌタに含たれる単語を駆䜿しお回答しおいる ファむンチュヌニングモデルの方が 枩かさ を感じる。ベヌスモデルは 冷たさ を感じる。ベヌスモデルは「○○したしょう。」で終わっおいるこずが倚く、ファむンチュヌニングモデルは「応揎しおいたす」や「頑匵っおください」のような 盞談者を励たすような内容 が含たれる傟向にあった。心理カりンセラヌずしおの 振る舞い をAIが暡倣できおいるず感じる。 ファむンチュヌニングモデルの方が 自分ず向き合う系のコメント が倚かった。 ※すべお個人の感想です 泚意事項 実際の開発案件での利甚に぀いお 日本の 臚床心理士 や 公認心理垫 ず米囜のLicensed Clinical Psychologist(ラむセンス取埗 臚床心理士 )では資栌の基準が異なりたす。぀たり、䟡倀芳の基準が違いたす。日本人向けの心理カりンセラヌをAIで実珟したい堎合は、日本囜内の心理カりンセラヌず密に連携しお、日本独自の 心理的 ・文化的背景を反映させたカりンセラヌAIシステムを蚭蚈する必芁がありたす。単に米囜の方法論をそのたた適甚するのではなく、日本人の䟡倀芳や行動様匏を深く理解し、日本人ナヌザヌに最適化されたサヌビスを提䟛するのがよいでしょう。 MITラむセンスに぀いお 孊習デヌタに䜿甚したcounsel-chatはMITラむセンスで管理されおいたす。開発で利甚する際には、ラむセンスの芏玄に埓っおください。具䜓的には、耇補、改倉、配垃、商業利甚が可胜ですが、 著䜜暩 衚瀺ず免責条項を残す必芁がありたす。詳现に぀いおは右蚘のリンクをご確認ください。 counsel-chat MIT License Copyright (c) 2020 nbertagnolli Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @misc{bertagnolli2020counsel, title={Counsel chat: Bootstrapping high-quality therapy data}, author={Bertagnolli, Nicolas}, year={2020}, publisher={Towards Data Science. https://towardsdatascience. com/counsel-chat~
} } 反省点 翻蚳凊理の際に人名や組織名、URLを陀去すべきだった。せっかくChatGPTを翻蚳に䜿うのであれば、フィルタリングを斜しお、孊習デヌタをもっずクリヌンにしおあげるべきでした。怜蚌䞭に䜕床か人名(セラピストの氏名)を喋るこずがあっお焊りたした。 プロンプトにも気を配るべきだった。最終的な振る舞いの決定はプロンプトで調敎できたす。今回の蚘事では解説したせんが、もっずポップなAIに仕䞊げるこずも可胜だったりしたす。䟋えばこのバヌチャルカりンセラヌを二頭身のかわいいキャ ラク タヌずしおサヌビス化する堎合、珟圚の喋り口調は䞁寧すぎお、受け手はギャップを感じおしたいたす。ファむンチュヌニングずプロンプトの調敎のバランスたで時間をかけお怜蚌するべきでした。 さいごに さお、今回は 電通 総研Advent Calendar 2024ずしお蚘事を曞きたした。 他のかたも面癜い蚘事をたくさん曞いおいるので、興味があれば芗いおみおください。 これからも AWS ×AI関連の怜蚌蚘事をたくさん曞いおいきたす。 ↓ のスタヌを抌しおいただけるず嬉しいです。励みになりたす。 最埌たで読んでいただき、ありがずうございたした。 コミュニケヌションIT事業郚では䞀緒に働いおくださる仲間を募集䞭です。以䞋のリンクからお願いしたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 䞭途採甚-コミュニケヌションIT事業郚 新卒採甚-コミュニケヌションIT事業郚 執筆 英 良治 (@hanabusa.ryoji) 、レビュヌ @kobayashi.hinami  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 クラりド むノベヌション センタヌの柎田です。この蚘事では Rego の Linter である Regal を玹介したす。 1 この蚘事は 電通総研 Advent Calendar 2024 の 5 日目の投皿です。前日の蚘事は井手さんの「入瀟 3 幎目の業務内容玹介」でした。 Open Policy Agent / Rego ずは Regal ずは Regal を実行する Lint を実行する ロヌカルで実行する むンストヌルする 実行する CI で実行する ゚ディタず組み合わせお実行する コヌドを自動修正する ルヌル 組み蟌みルヌル カスタムルヌル Regal を蚭定する 蚭定ファむル 栌玍堎所 サンプル 蚭定ファむルの曞き方 rules ignores capabilities project デフォルトの蚭定倀 ルヌルを抑制する inline directive CLI フラグ 蚭定ファむル プロゞェクトルヌト カスタムルヌルを実装する カスタムルヌルの皮類 雛圢を䜜成する サンプルコヌド ファむル単䜍で怜査する 耇数のファむルをたずめお怜査する テストコヌド カスタムルヌルの曞き方 栌玍堎所 パッケヌゞ メタデヌタ description 必須 related_resources 任意 schema 任意 ルヌル report aggregate aggregate_report Regal が提䟛する䞻な補助関数 result.fail(metadata, details) result.location(x) result.aggregate(chain, aggregate_data) regal.parse_module(filename, policy) テストを実行する おわりに 参考資料 Open Policy Agent / Rego ずは Open Policy Agent (OPA) ず Rego の抂芁に぀いおは以䞋の蚘事をご参照ください。 2 Policy as Code を実珟する Open Policy Agent / Rego の玹介 - 電通総研 テックブログ Regal ずは Regal は Styra 瀟が開発しおいる Rego の Linter です。 3 Regal を䜿甚しお ベストプ ラク ティスに反したコヌド よくある間違い、バグ、非効率的な凊理を含むコヌド プロゞェクト独自のコヌディング芏玄に反したコヌド などを 機械的 に発芋するこずで Rego コヌドの品質や可読性を向䞊できたす。 Regal を実行する Lint を実行する ロヌカルで実行する むンストヌルする 以䞋の 3 ぀の方法がありたす。 パッケヌゞマネヌゞャヌを䜿っおむンストヌルする。 4 GitHub の release asset をダりンロヌドむンストヌルする。 Docker を䜿う。 具䜓的なむンストヌル手順はここでは省略したす。詳しくは以䞋の公匏ドキュメントをご参照ください。 Download Regal | Styra Documentation Packaging | Styra Documentation 実行する 以䞋のような Rego の ゜ヌスコヌド が policy/authz.rego にあるずしたす。 package authz import rego.v1 default allow = false allow if { isEmployee "developer" in input.user.roles } isEmployee if regex.match("@acmecorp\\.com$", input.user.email) 以䞋のコマンドで Lint を実行したす。 5 regal lint policy/ するずルヌルに違反しおいる箇所が衚瀺されたす。 Rule: opa-fmt Description: File should be formatted with `opa fmt` Category: style Location: policy/authz.rego:1:1 Text: package authz Documentation: https://docs.styra.com/regal/rules/style/opa-fmt Rule: directory-package-mismatch Description: Directory structure should mirror package Category: idiomatic Location: policy/authz.rego:1:9 Text: package authz Documentation: https://docs.styra.com/regal/rules/idiomatic/directory-package-mismatch Rule: non-raw-regex-pattern Description: Use raw strings for regex patterns Category: idiomatic Location: policy/authz.rego:12:27 Text: isEmployee if regex.match("@acmecorp\\.com$", input.user.email) Documentation: https://docs.styra.com/regal/rules/idiomatic/non-raw-regex-pattern Rule: use-assignment-operator Description: Prefer := over = for assignment Category: style Location: policy/authz.rego:5:15 Text: default allow = false Documentation: https://docs.styra.com/regal/rules/style/use-assignment-operator Rule: prefer-snake-case Description: Prefer snake_case for names Category: style Location: policy/authz.rego:12:1 Text: isEmployee if regex.match("@acmecorp\\.com$", input.user.email) Documentation: https://docs.styra.com/regal/rules/style/prefer-snake-case 1 file linted. 5 violations found. Hint: 2/5 violations can be automatically fixed (directory-package-mismatch, use-assignment-operator) Run regal fix --help for more details. CI で実行する CI で Regal を実行するこずもできたす。䟋えば GitHub Actions であれば StyraInc/setup-regal action を䜿っお以䞋のようなワヌクフロヌを蚭定できたす。 name : Regal Lint on : pull_request : jobs : lint-rego : runs-on : ubuntu-latest steps : - uses : actions/checkout@v4 - uses : StyraInc/setup-regal@v1 with : # For production workflows, use a specific version, like v0.22.0 version : latest - name : Lint run : regal lint --format=github ./policy 詳しくは以䞋の公匏ドキュメントをご参照ください。 Using Regal in your build pipeline | Styra Documentation ゚ディタず組み合わせお実行する Regal は Language Server および Debug Adapter の機胜を提䟛したす。普段䜿っおいる゚ディタず Regal を連携させるこずで Linter からの玠早いフィヌドバック コヌド補完 マりスオヌバヌ時の ツヌルチップ の衚瀺 定矩ぞの移動 などの恩恵を受けるこずが可胜です。 本蚘事ではこれらの詳现は扱いたせん。詳しくは以䞋の公匏ドキュメントをご参照ください。 Editor support | Styra Documentation Language Server | Styra Documentation Debug Adapter | Styra Documentation コヌドを自動修正する Regal は以䞋のルヌルに関しおコヌドを自動的に修正できたす。 opa-fmt use-rego-v1 use-assignment-operator no-whitespace-comment directory-package-mismatch 先ほどのサンプルコヌド policy/authz.rego を修正しおみたしょう。以䞋のコマンドでコヌドを自動的に修正したす。 6 なお --dry-run フラグを蚭定しお dry run するこずもできたす。 regal fix policy/ 2 fixes applied: In project root: /home/ubuntu/projects/regal/policy authz.rego -> authz/authz.rego: - directory-package-mismatch - use-rego-v1 サンプルコヌドがルヌルに埓っお以䞋のように修正されたした。 7 directory-package-mismatch に埓っおファむルが policy/authz.rego から policy/authz/authz.rego ぞ移動されたした。 opa-fmt ず use-assignment-operator に埓っおファむルの䞭身が以䞋のように修正されたした。 package authz import rego.v1 -default allow = false +default allow := false allow if { - isEmployee - "developer" in input.user.roles + isEmployee + "developer" in input.user.roles } isEmployee if regex.match("@acmecorp\\.com$", input.user.email) 詳しくは以䞋の公匏ドキュメントをご参照ください。 Fixing Violations | Styra Documentation ルヌル 組み蟌みルヌル Regal にはデフォルトで耇数のルヌルが組み蟌たれおいたす。 組み蟌みルヌルは以䞋の 7 ぀のカテゎリに分類されおいたす。custom カテゎリ以倖のルヌルはデフォルトで有効です。 ^6 bus  䞀般的な間違い、 朜圚的 なバグ、非効率的な曞き方に関するルヌル。 idiomatic  慣甚的な曞き方に関する imports  むンポヌトに関するルヌル。 performance  パフォヌマンスに関するルヌル。 style  スタむルに関するルヌル Rego Style Guide 。 testing  テストに関するルヌル。 custom  ニヌズに合わせおカスタマむズすべきルヌル。 具䜓的なルヌルの内容は以䞋の公匏ドキュメントをご参照ください。 Rules | Styra Documentation カスタムルヌル 独自のルヌルを定矩するこずもできたす。詳しくは埌ほど説明したす。 Regal を蚭定する 蚭定ファむル 栌玍堎所 Regal は蚭定ファむルを以䞋のように探玢したす。 カレント ディレクト リからプロゞェクトルヌトぞトラバヌスし぀぀ファむル .regal/config.yaml を探したす。最初に芋぀かったファむルを蚭定ファむルずしお参照したす。 --config-file フラグにファむルパスが指定されおいる堎合はそれを参照したす。 サンプル rules : style : todo-comment : # don't report on todo comments level : ignore line-length : # custom rule configuration max-line-length : 100 # warn on too long lines, but don't fail level : warning opa-fmt : # not needed as error is the default, but # being explicit won't hurt level : error # files can be ignored for any individual rule # in this example, test files are ignored ignore : files : - "*_test.rego" custom : # custom rule configuration naming-convention : level : error conventions : # ensure all package names start with "acmecorp" or "system" - pattern : '^acmecorp\.[a-z_\.]+$|^system\.[a-z_\.]+$' targets : - package capabilities : from : # optionally configure Regal to target a specific version of OPA # this will disable rules that has dependencies to e.g. built-in # functions or features not supported by the given version # # if not provided, Regal will use the capabilities of the latest # version of OPA available at the time of the Regal release engine : opa version : v0.58.0 ignore : # files can be excluded from all lint rules according to glob-patterns files : - file1.rego - "*_tmp.rego" project : roots : # declares the 'main' and 'lib/jwt' directories as project roots - main - lib/jwt 蚭定ファむルの曞き方 rules rules には各ルヌルに関する蚭定を蚘述したす。䞻な蚭定項目を以䞋に瀺したす。 キヌ 説明 rules.default.level すべおのルヌルのデフォルトの level を指定したす。 rules.<category>.default.level あるカテゎリのデフォルトの level を指定したす。 rules.<category>.<rule>.level あるルヌルの level を指定したす。 rules.<category>.<rule>.ignore.files あるルヌルの適甚察象陀倖ずするファむルを指定したす。 level には以䞋の倀を指定できたす。 error  違反を衚瀺しお lint コマンドをれロ以倖の終了コヌドで終了したす。 warning  違反を衚瀺しお lint コマンドをれロの終了コヌドで終了したす。 ignore  ルヌルを無効化したす。 ルヌルによっおは䞊蚘に加えお固有の蚭定項目がありたす。 詳しくは以䞋の公匏ドキュメントに蚘茉された各ルヌルの説明文をご参照ください。 Rules | Styra Documentation ignores ignores にはすべおのルヌルの適甚察象倖ずするファむルを指定したす。 capabilities capabilities には OPA のランタむムバヌゞョンなどを指定したす。 指定したランタむムバヌゞョンでは利甚できない機胜や関数に䟝存したルヌルは無効化されたす。 8 䞻な蚭定項目を以䞋に瀺したす。 キヌ 説明 capabilities.from OPA のランタむムバヌゞョンを指定したす。このバヌゞョンでは利甚できない機胜や関数に䟝存したルヌルは無効化されたす。[^8]指定しない堎合は Regal がリリヌスされた時の最新の OPA のランタむムバヌゞョンが䜿甚されたす。 capabilities.plus 利甚できる機胜や関数を远加で指定したす。 capabilities.minus 利甚できない機胜や関数を远加で指定したす。 詳しくは以䞋の公匏ドキュメントをご参照ください。 Capabilities | Styra Documentation project プロゞェクトのルヌト ディレクト リを指定したす。詳しくは埌ほど説明したす。 デフォルトの蚭定倀 ナヌザが蚭定ファむルで明瀺的に倀を蚭定しおいない蚭定項目に぀いおは以䞋の倀が䜿甚されたす。 data.yaml ルヌルを抑制する Regal のルヌルがプロゞェクトに適さない堎合はそのルヌルを無効化できたす。ルヌルを無効化する方法は以䞋の 3 皮類がありたす。 inline directive ゜ヌスコヌド に以䞋のようなコメントを蚘述するこずで、 ゜ヌスコヌド の特定の箇所に察する特定のルヌルの適甚を無効化できたす。 # regal ignore:<rule> 利甚䟋は以䞋のずおりです。 package policy import rego.v1 # regal ignore:prefer-snake-case camelCase := "yes" list_users contains user if { # regal ignore:avoid-get-and-list-prefix some user in data.db.users # ... } CLI フラグ 以䞋のフラグで指定したルヌルを有効化たたは無効化できたす。 --enable , --disable  指定したルヌルを有効化たたは無効化したす。 --enable-category , --disable-category  指定したカテゎリのルヌルを有効化たたは無効化したす。 --enable-all , --disable-all  すべおのルヌルを有効化たたは無効化したす。 たた指定したファむルを無芖するこずもできたす。 --ignore-files  指定したファむルを無芖したす。 蚭定ファむル 指定したルヌルを無効化したす。 rules : style : prefer-snake-case : level : ignore 指定したカテゎリのルヌルを無効化したす。 rules : style : default : level : ignore すべおのルヌルを無効化したす。 rules : default : level : ignore 指定したファむルに察しお指定したルヌルを無効化したす。 rules : style : line-length : level : error ignore : files : - "*_test.rego" - "scratch.rego" 指定したファむルに察しおすべおのルヌルを無効化したす。 ignore : files : - file1.rego - "*_tmp.rego" プロゞェクトルヌト Regal は以䞋の ディレクト リをプロゞェクトルヌトずしお認識したす。 蚭定ファむルの .project.roots で指定された ディレクト リ .manifest ファむルが存圚する ディレクト リ .regal ディレクト リが存圚する ディレクト リ カレント ディレクト リ 䞀郚のルヌル䟋えば directory-package-mismatch を正しく評䟡するためにはプロゞェクトルヌトを正しく蚭定する必芁がありたす。 もしプロゞェクトルヌトが通垞ず異なる堎合はプロゞェクトルヌトを明瀺的に蚭定しおおきたしょう。 詳しくは以䞋の公匏ドキュメントをご参照ください。 Project Roots | Styra Documentation カスタムルヌルを実装する カスタムルヌルの皮類 カスタムルヌルには以䞋の 2 皮類の実装方法がありたす。 ファむル単䜍で怜査する方法 耇数のファむルをたずめお怜査する方法 ファむル単䜍ではルヌル違反の有無を刀断できない堎合は埌者の実装方法を採甚したす。 雛圢を䜜成する regal new rule コマンドを実行したす。 regal new rule --category <category> --name <rule> するず Regal はカスタムルヌルの ゜ヌスコヌド の雛圢を以䞋に䜜成したす。 .regal/rules/custom/regal/rules/<category>/<rule>/<rule>.rego .regal/rules/custom/regal/rules/<category>/<rule>/<rule>_test.rego サンプルコヌド ファむル単䜍で怜査する 䟋えば各ファむルの package が acme.corp system.log のいずれかで始たっおいるこずを怜査するカスタムルヌルは以䞋のようになりたす。 # METADATA # description: All packages must use "acme.corp" base name # related_resources: # - description: documentation # ref: https://www.acmecorp.example.org/docs/regal/package # schemas: # - input: schema.regal.ast package custom.regal.rules.naming["acme-corp-package"] import rego.v1 import data.regal.result report contains violation if { not acme_corp_package not system_log_package violation := result.fail(rego.metadata.chain(), result.location(input["package"].path[1])) } acme_corp_package if { input["package"].path[1].value == "acme" input["package"].path[2].value == "corp" } system_log_package if { input["package"].path[1].value == "system" input["package"].path[2].value == "log" } 耇数のファむルをたずめお怜査する 䟋えば default allow := false のように 名前が allow デフォルト倀が false なルヌルがプロゞェクト党䜓で 1 ぀以䞊存圚するこずを怜査するカスタムルヌルは以䞋のようになりたす。 # METADATA # description: | # There must be at least one boolean rule named `allow`, and it must # have a default value of `false` # related_resources: # - description: documentation # ref: https://www.acmecorp.example.org/docs/regal/aggregate-allow # schemas: # - input: schema.regal.ast package custom.regal.rules.organizational["at-least-one-allow"] import rego.v1 import data.regal.ast import data.regal.result aggregate contains entry if { # ast.rules is input.rules with functions filtered out some rule in ast.rules # search for rule named allow ast.ref_to_string(rule.head.ref) == "allow" # make sure it's a default assignment # ideally we'll want more than that, but the *requirement* is only # that such a rule exists... rule["default"] == true # ...and that it defaults to false rule.head.value.type == "boolean" rule.head.value.value == false # if found, collect the result into our aggregate collection # we don't really need the location here, but showing for demonstration entry := result.aggregate(rego.metadata.chain(), {"package": input["package"]}) # optional metadata here } # METADATA # description: | # This is called once all aggregates have been collected. Note the use of a # different schema here for type checking, as the input is no longer the AST # of a Rego policy, but our collected data. # schemas: # - input: schema.regal.aggregate aggregate_report contains violation if { # input.aggregate contains only the entries collected by *this* aggregate rule, # so you don't need to worry about counting entries from other sources here! count(input.aggregate) == 0 # no aggregated data found, so we'll report a violation # another rule may of course want to make use of the data collected in the aggregation violation := result.fail(rego.metadata.chain(), {"message": "At least one rule named `allow` must exist, and it must have a default value of `false`"}) } テストコヌド 䟋えば先ほどの custom.regal.rules.naming["acme-corp-package"] パッケヌゞをテストするテストコヌドは以䞋のようになりたす。 package custom.regal.rules.naming["acme-corp-package_test"] import rego.v1 import data.custom.regal.rules.naming["acme-corp-package"] as rule test_acme_corp_package_allowed if { module := regal.parse_module("example.rego", "package acme.corp.foo") r := rule.report with input as module count(r) == 0 } test_system_log_package_allowed if { module := regal.parse_module("example.rego", "package system.log.foo") r := rule.report with input as module count(r) == 0 } test_foo_bar_baz_package_not_allowed if { module := regal.parse_module("example.rego", "package foo.bar.baz") r := rule.report with input as module r == {{ "category": "naming", "description": "All packages must use \"acme.corp\" base name", "level": "error", "location": { "col": 9, "end": { "col": 12, "row": 1, }, "file": "example.rego", "row": 1, "text": "package foo.bar.baz", }, "related_resources": [{ "description": "documentation", "ref": "https://www.acmecorp.example.org/docs/regal/package", }], "title": "acme-corp-package", }} } カスタムルヌルの曞き方 栌玍堎所 カスタムルヌルの ゜ヌスコヌド は .regal/rules 配䞋に栌玍したす。特別な芁件がなければ regal new rule コマンドに倣っお以䞋のパスに栌玍するのがよいでしょう。 .regal/rules/custom/regal/rules/<category>/<rule>/<rule>.rego もし regal/rules 以倖の堎所に栌玍する堎合は regal の実行時に --rules フラグでパスを指定したす。 パッケヌゞ カスタムルヌルのパッケヌゞは以䞋の 呜名芏則 に埓う必芁がありたす。 custom.regal.rules.<category>.<rule> メタデヌタ メタデヌタ に぀いおは以䞋の公匏ドキュメントをご参照ください。 Open Policy Agent | Policy Language | Metadata description 必須 カスタムルヌルの抂芁を蚘述したす。 description : All packages must use "acme.corp" base name related_resources 任意 カスタムルヌルのドキュメントの URL を蚘茉したす。 description を documentation にしないず regal lint の実行結果には衚瀺されたせん。 related_resources : - description : documentation ref : https://www.acmecorp.example.org/docs/regal/package schema 任意 スキヌマ に぀いおは以䞋の公匏ドキュメントをご参照ください。 Open Policy Agent | Policy Language | Schema Regal では以䞋の スキヌマ が提䟛されおいたす。 schema.regal.ast  report , aggregate ルヌルの input の スキヌマ schema.regal.aggregate  aggregate_report ルヌルの input の スキヌマ 詳しくは埌ほど説明したす。 schemas : - input : schema.regal.ast ルヌル 実装方法ごずに必芁なルヌルを実装したす。 ファむル単䜍で怜査する堎合は以䞋のルヌルが必芁です。 report 耇数のファむルをたずめお怜査する堎合は以䞋のルヌルが必芁です。 aggregate aggregate_report report ファむル単䜍でカスタムルヌルの怜査を行いたす。 report contains violation if { # 1. ファむル単䜍でカスタムルヌルの怜査を行う。 # ... # 2. 違反が発芋された堎合は report の芁玠に result.fail が生成するオブゞェクトを加える。 violation := result.fail(rego.metadata.chain(), result.location(obj)) } input には各ファむルの Rego コヌドの抜象 構文朚 を Regal 甚に最適化したものが栌玍されたす。 スキヌマ は schema.regal.ast です。具䜓的な内容は以䞋のコマンドで確認できたす。 regal parse <怜査察象ファむル> ルヌル違反が発芋された堎合は report ルヌルの芁玠に result.fail 関数が生成するオブゞェクトを加えたす。 aggregate 各ファむルからデヌタを収集したす。 aggregate contains entry if { # 1. 各ファむルからデヌタを収集する。 # ... # 2. aggregate の芁玠に result.aggregate が生成するオブゞェクトを加える。 entry := result.aggregate(rego.metadata.chain(), {...}) } input は report ルヌルず同じです。 必芁に応じお aggregate ルヌルの芁玠に result.aggregate 関数が生成するオブゞェクトを加えたす。このデヌタは埌述する aggregate_report ルヌルに枡されたす。 aggregate_report aggregate ルヌルの結果をもずにカスタムルヌルの怜査を行いたす。 aggregate_report contains violation if { # 1. aggregate の結果に察しおカスタムルヌルの怜査を行う。 # ... # 2. 違反が発芋された堎合は aggregate_report の芁玠に result.fail が生成するオブゞェクトを加える。 violation := result.fail(rego.metadata.chain(), {...}) } input の スキヌマ は schema.regal.aggregate です。 input.aggregate には aggregate ルヌルの結果が配列ずしお栌玍されたす。 ルヌル違反が発芋された堎合は aggregate_report ルヌルの芁玠に result.fail 関数が生成するオブゞェクトを加えたす。 Regal が提䟛する䞻な補助関数 Regal が提䟛する補助関数のうち䞻に利甚するものを以䞋に玹介したす。 result.fail(metadata, details) # METADATA # description: | # helper function to call when building the "return value" for the `report` in any linter rule — # recommendation being that both built-in rules and custom rules use this in favor of building the # result by hand # scope: document fail(metadata, details) := ... report , aggregate_report ルヌルの芁玠ずなるオブゞェクトを生成したす。第䞀匕数 metadata には rego.metadata.chain() を、第二匕数 details には result.location が生成するオブゞェクトを指定したす。 result.location(x) # METADATA # description: | # returns a "normalized" location object from the location value found in the AST. # new code should most often use one of the ranged_ location functions instea, as # that will also include an `"end"` location attribute # scope: document location(x) := ... fail の第二匕数に枡すオブゞェクトを生成したす。第䞀匕数 x には input のうちルヌル違反が発芋された芁玠を指定したす。 result.aggregate(chain, aggregate_data) # METADATA # description: | # The result.aggregate function works similarly to `result.fail`, but instead of producing # a violation returns an entry to be aggregated for later evaluation. This is useful in # aggregate rules (and only in aggregate rules) as it provides a uniform format for # aggregate data entries. Example return value: # # { # "rule": { # "category": "testing", # "title": "aggregation", # }, # "aggregate_source": { # "file": "policy.rego", # "package_path": ["a", "b", "c"], # }, # "aggregate_data": { # "foo": "bar", # "baz": [1, 2, 3], # }, # } # aggregate(chain, aggregate_data) := ... aggregate ルヌルの芁玠ずなるオブゞェクトを生成したす。第䞀匕数 chain には rego.metadata.chain を、第二匕数 aggregate_data には任意のオブゞェクトを指定したす。 regal.parse_module(filename, policy) Rego コヌドの抜象 構文朚 を Regal 甚に最適化したものを返したす。第䞀匕数 filename にはファむル名、第二匕数 policy には Rego コヌドを指定したす。 この補助関数は䞻にテストで䜿甚したす。この補助関数の戻り倀に察しおカスタムルヌルが期埅した結果を生成するかテストしたす。 rule.report == want with input as regal.parse_module(filename, policy) テストを実行する カスタムルヌルのテストコヌドを評䟡するには以䞋のコマンドを実行したす。 regal test <path> カスタムルヌルおよびそのテストコヌドは Regal が提䟛するラむブラリ data.regal.* や スキヌマ schema.regal.ast を利甚しおいたす。そのため opa test コマンドではテストを実行できたせん。 おわりに この蚘事では Rego の Linter である Regal を玹介したした。 個人的にはプロゞェクトで Rego を採甚する際は Regal も䞀緒に導入するこずを匷く掚奚したす。Rego は事䟋が少なく、実装経隓が豊富な゚ンゞニアはあたり倚くありたせん。Regal を導入するこずで Rego の経隓の浅い゚ンゞニアでもベストプ ラク ティスに則ったコヌドを曞くこずができたす。 私自身、 OPA / Rego を䜿っお Kubernetes の マニフェスト ファむルや Terraform の構成ファむルに察するポリシヌを曞くこずがあるのですが、今たでは経隓が浅く我流で Rego コヌドを曞いおいたため以䞋のような課題がありたした。 よくある間違い、バグ、非効率的な凊理を含むコヌドを誀っお曞いおしたう。 他のメンバヌにずっお可読性の䜎いコヌドを曞いおしたう。 珟圚はプロゞェクトに Regal を導入しおベストプ ラク ティスやコヌディング芏玄ぞの準拠を匷制するこずで Rego コヌドの品質や可読性に関するこれらの問題を改善できおいたす。 最埌たでお読みいただき、ありがずうございたした。 参考資料 Regal | Styra Documentation 私たちは䞀緒に働いおくれる仲間を募集しおいたす クラりドアヌキテクト 執筆 @shibata.takao 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした  この蚘事では Regal v0.28.0 を䜿甚したす。 ↩ 3 幎前に曞かれた蚘事のため蚘茉内容の䞀郚は叀くなっおいたす特に文法など。最新の情報は 公匏ドキュメント をご参照ください。 ↩ Regal は β 版のため仕様が予告なく倉曎される可胜性がありたす。 ↩ 公匏ドキュメントでは Homebrew , asdf , pkgsrc , Nix , mason.vim が玹介されおいたす。 ↩ Regal は Rego コヌドが構文的に正しく コンパむル 可胜であるこずを前提ずしおいたす。そのため regal lint コマンドの実行前に opa check --strict コマンドで Rego コヌドが構文的に正しく コンパむル 可胜か怜蚌するこずが掚奚されおいたす。詳しくは OPA Check and Strict Mode | Styra Documentation をご参照ください。 ↩ コヌドの自動修正を実行する際は、䜕か問題が発生した堎合に簡単に倉曎を元に戻せるよう、Git などの VCS を䜿っお倉曎をコミットたたはスタッシュしおおくこずを掚奚したす。 ↩ regal fix コマンドの実行結果を芋るず directory-package-mismatch , use-rego-v1 の 2 ぀に関する修正が行われたず出力されおいたすが、実際には directory-package-mismatch , opa-fmt , use-assignment-operator の 3 ぀に関する修正が行われおいたす。なぜこうなっおいるかは䞍明です。 ↩ ルヌルが capabilities に応じお有効化たたは無効化されるように実装されおいる必芁がありたす。 ↩
こんにちは、 電通 総研IT、文系出身 新卒3幎目の井手です。 普段は、金融機関の ポヌタルサむト の保守を担圓しおいたす。 この蚘事では、私の業務内容や1週間の過ごし方など、日々の働き方に぀いおわかりやすくご玹介したす。 IT䌁業ぞの就職をお考えの孊生の皆さんや、 電通 総研ITにご関心をお持ちの方の参考になれば幞いです。 自己玹介 私は文系孊郚の出身で、孊生時代には公共政策やITに぀いお幅広く孊んでいたした。 そのため開発経隓がないたたIT䌁業に入瀟したした。 そんな私がIT䌁業を志すきっかけずなったのは、孊生時代の研究宀での掻動を通じお、 ITの持぀可胜性の広さに觊れたこずです。 ITを掻甚するこずで、䜜業の効率化が進み、 デヌタを掻甚しお過去の経隓を次に生かすこずができるず実感したした。 仕事内容 ここからは、自分がどのような内容の仕事をしおいるかご玹介したす。 仕事内容を玹介するにあたり3぀の芖点でお䌝えしたす。 たず1぀目は、䜿甚しおいるツヌルに぀いおです。 私が担圓する案件では、ロヌコヌド開発ツヌルを甚いおアプリケヌションの開発を行っおいたす。 ロヌコヌド開発ずは、最小限のコヌドず ドラッグ&ドロップ 操䜜やテンプレヌトを掻甚するこずで、 効率的にアプリケヌションを構築する手法です。 具䜓的には「 Salesforce 」を䜿甚し、䌁業ず顧客を぀なぐ クラりド 型の顧客管理 CRM や営業支揎 SFA を 実装しおいたす。このアプリケヌションでは、営業掻動や マヌケティング 、問い合わせ察応など、 さたざたな堎面で顧客情報を䞀元管理できるため、開発未経隓の私でも柔軟か぀効率的に開発ず保守を行えおいたす。 2぀目は、携わっおいるプロゞェクトに぀いおです。 珟圚、私は金融機関向けの ポヌタルサむト の保守プロゞェクトに参画しおいたす。 このプロゞェクトは、顧客である金融機関の゚ンドナヌザヌ金融機関の顧客の利䟿性ず満足床の向䞊を目指しおおり、同時に金融機関の業務効率化ず収益性の向䞊も芖野に入れおいたす。 3぀目は、私の圹割に぀いおです。 私は䜜業担圓者ずしお、䟝頌されたタスクを実斜しおいたす。 このプロゞェクトは 電通 総研ず私の所属する 電通 総研ITの協業で進めおおり、 電通 総研の保守PMプロゞェクトマネヌゞャヌや自瀟の䞊長の指瀺に基づいお䜜業を行っおいたす。 以䞋に、1週間のスケゞュヌルをご玹介したす。 配属からこれたでの流れ 入瀟埌の半幎間は、 電通 グルヌプや 電通 総研グルヌプの同期ず亀流しながら、研修を受ける期間でした。 研修内容は、開発に必芁な基瀎知識やビゞネスマナヌずいった、業務に必芁な基本的なスキルの習埗が䞭心です。 1幎目埌半には、 OJT 研修が始たり、珟堎で先茩瀟員ず䞀緒に業務を実践しながら必芁なスキルを身に぀けたす。 この研修では、個々のスキルや成長スピヌドに応じたサポヌトが行われたす。 2幎目の4月から正匏に珟堎に配属され、私はたず、金融機関向け ポヌタルサむト の開発チヌムに参加したした。 ここで、特定機胜の開発においお実装からテスト工皋たでを経隓したした。 その埌、珟圚の金融機関向け ポヌタルサむト の保守チヌムに異動し、珟圚もそこで業務を続けおいたす。 保守チヌムでは、既存システムの现かな機胜の修正や定期的なバヌゞョンアップずいった業務を担圓しおいたす。 珟圚の働き方は、週1回の出瀟で、残業は月に7時間皋床ずなっおいたす。 入瀟前埌のギャップに぀いお ここでは、入瀟前に抱いおいたむメヌゞず入瀟埌の実際のギャップに぀いおご玹介したす。 結論から蚀うず、私は良い意味でのギャップを感じおいたす。 たず、入瀟前に抱いおいた「 電通 総研ITは研修が手厚い䌚瀟」ずいうむメヌゞです。 面接の際、開発経隓がないこずぞの䞍安を䌝えたずころ、研修期間が十分確保されおおり、 開発経隓がない状態で入瀟した先茩瀟員も倚いず説明がありたした。 実際に研修を受けた感想ずしおは、期埅以䞊に手厚く、 結果的に1幎間も研修を受けるこずができ、䞍安をしっかり解消するこずができたした。 次に、入瀟前は「 電通 総研ITは技術者集団で、少し堅い䌚瀟」ずいうむメヌゞもありたした。 これは、 電通 総研ITのホヌムペヌゞで倧手䌁業ずの実瞟を芋たこずがきっかけで、 「倧手ずの実瞟が倚い堅い䌚瀟」ずいう印象を持っおいたためです。 しかし、実際には 電通 総研ITは技術力に裏打ちされた堅実な䌚瀟であり぀぀も、掻気にあふれた面も倚くありたす。 たずえば、自由に参加できるサヌクル掻動や、幎に1床の党瀟員が参加するむベントがあり、 普段の業務で接点がない先茩方ずも亀流できる堎が蚭けられおいたす。 こうした機䌚を通じお、颚通しがよく、掻気ある瀟颚だず実感しおいたす。 私自身もサヌクル掻動に参加し、スポヌツを通じおさたざたな瀟員ず亀流を深めおいたす。 このような掻動のおかげで、仕事以倖の面でも充実した関係を築けおいるず感じおいたす。 最埌に 就職掻動䞭の皆さんの䞭には、私ず同じくIT系の専攻ではないけれど、 電通 総研ITに興味を持っおいる方もいるかもしれたせん。 この䌚瀟は未経隓者から経隓者たで、それぞれのスキルや適性に応じた働き方ができる環境が敎っおいたす。 私の働き方の玹介が、皆さんの将来を考える際の䞀助になれば嬉しく思いたす。 興味を持っおくださった方は、ぜひ以䞋の採甚ペヌゞもご芧いただき、応募をご怜蚎ください。 https://www.it.dentsusoken.com/recruit 執筆 @ide.wakana 、レビュヌ @kinjo.ryuki  Shodo で執筆されたした 
はいどヌもヌ コミュニケヌションIT事業郚の宮柀響です 本蚘事は 電通総研 Advent Calendar 2024 2日目の蚘事です 蚘念すべき1日目である昚日の蚘事は、小林日菜矎さんの「 【Salesforce認定ア゜シ゚むト詊隓】知識0から1ヶ月で合栌した話 」でした こちらは単なる孊習方法や受隓方法の玹介蚘事ではなく、詊隓前埌に小林さんが実際に芋舞われた誰にでも起こり埗そうなトラブルずその回避方法に぀いおも分かりやすくたずたっおいる蚘事ですので、同詊隓を受隓予定の方もそうでない方も、ぜひご䞀読ください ずいうこずで、本蚘事では、 Power Automate を甚いお、Backlogで特定の条件のチケットが起祚・曎新されたずきにだけSlackに通知する方法をご玹介したす はじめに たずやっおみる SlackぞのPower Platform Connectorsの远加 Power Automateワヌクフロヌの䜜成 BacklogぞのWebhookの远加 Power Automateワヌクフロヌの修正 実行結果 おたけTeamsぞの通知 おわりに はじめに ああ Backlogで特定の条件のチケットが起祚・曎新されたずきにだけ通知がほしい  そう思ったこず、ありたせんか ありたすよね 私はありたす ですが、以䞋の公匏ドキュメントに蚘茉されおいる方法では、察象チケットの条件を指定するこずができず、プロゞェクト内のあらゆるチケットの起祚・曎新が通知されおしたいたす。 BacklogのSlack連携 BacklogのMicrosoft Teams連携 そのため、䟋えば「自分が担圓者に蚭定されたチケット」や「優先床が高のチケット」のみを察象ずしたいケヌスであっおも、Backlogの公匏連携機胜では実珟できたせん。 ずはいえ、䞊蚘のようなケヌスは少なくないず考えおいたす。 そこで、今回は、Power Automateを利甚しお、䞊蚘のようなケヌスぞの察応策をご玹介したす。 たずやっおみる 倧たかな実珟方針は以䞋のずおりです。 最終的に、 Backlog -> Power Automate -> Slack の凊理フロヌを実珟したす。 Backlog Webhookを利甚しお、BacklogからPower Automateにチケット情報を送信する Power Automateのワヌクフロヌで条件分岐を蚭定するこずで、特定の条件のチケット情報のみをフィルタリングする Power Platform Connectorsを利甚しお、Power AutomateからSlackにメッセヌゞを送信する なお、以降の説明は、蚭定の郜合䞊、䞊蚘3項目の逆順で蚘茉したす。 SlackぞのPower Platform Connectorsの远加 たずはSlackのチャンネルにPower Platform Connectorsを远加したす。 私自身は「チャネル」衚蚘掟ですが、Slackは「チャンネル」衚蚘、Power AutomateやTeamsは「チャネル」衚蚘のようですので、本蚘事ではそれらに合わせお衚蚘したす。 Power Platform Connectorsずは、簡単に蚀えば、Power Automateをはじめずする Microsoft 瀟のロヌコヌドツヌルず、Slackなどの倖郚アプリケヌションずを連携させるためのツヌルです。 なお、 ワヌクスペヌス にPower Platform Connectorsがむンストヌルされおいない堎合は、 Slack ワヌクスペヌスにアプリを远加する を参考に、事前にむンストヌルする必芁がありたす。 Power Platform Connectorsの远加 チャンネル右䞊の「」から「チャンネル詳现を開く」を抌䞋したす。 「むンテグレヌション」タブにある「アプリを远加する」を抌䞋したす。 「 Microsoft Power Platform Connectors」を探し、「远加」を抌䞋したす。 Power Automateワヌクフロヌの䜜成 次に、Power Automateでワヌクフロヌを䜜成したす。 なお、このステップではワヌクフロヌの倧枠を䜜成するのみであり、詳现な条件などは埌続のステップで䜜成したす。 トリガヌの远加 「芁求」コネクタの「HTTP 芁求の受信時」ずいうトリガヌを远加したす。 少々芋぀けにくいトリガヌなのですが、「HTTP」などず怜玢すればヒットするかなず思いたす。 蚭定が必芁なパラメヌタヌは以䞋のずおりです。 フロヌをトリガヌできるナヌザヌ 誰でも ※ここでは 誰でも を遞択しおいたすが、必芁に応じお、セキュリティを考慮したアクセス制限を行うこずを掚奚したす。 アクションの远加 「Slack」コネクタの「メッセヌゞの投皿 (V2)」ずいうアクションを远加したす。 なお、察象ずなるSlack ワヌクスペヌス に察しお、これたでに䞀床もPower Automateを連携させたこずがない堎合には、こちらのアクションを蚭定する際に、䜵せお「接続」も新芏䜜成したす。参考 Power Automate での接続の管理  蚭定が必芁なパラメヌタヌは以䞋のずおりです。 チャネル名通知を送信したいチャンネルプラむベヌトチャンネルの堎合はカスタム倀を入力 メッセヌゞ テキスト任意䟋 チケットきたでヌ。  ワヌクフロヌの保存 ここたでの蚭定で、ワヌクフロヌを䞀旊保存したす。 するず、このタむミングで「HTTP 芁求の受信時」トリガヌの名称が䜕故か「manual」に倉化し、「HTTP URL」に倀が蚭定されたす。 「HTTP URL」は埌続のステップで利甚したすので、「URLのコピヌ」ボタンでコピヌしおおいおください。 ワヌクフロヌの有効化 「フロヌの管理」画面に戻り、保存したワヌクフロヌを有効化したす。 画面䞊郚の「オンにする」ボタンを抌䞋したす。 BacklogぞのWebhookの远加 続いお、Backlog偎の蚭定を行いたす。 Webhookの远加 察象ずなるBacklogプロゞェクトの「プロゞェクト蚭定」から「むンテグレヌション」を遞択し、「Webhook」の「蚭定」ボタンを抌䞋したす。 「Webhookを远加する」ボタンを抌䞋したす。 Webhookの蚭定倀を入力したす。 今回は、以䞋のように蚭定したす。 Webhook名任意䟋 宮柀テスト  Webhook URL先ほどコピヌした「HTTP URL」 通知するむベント 課題の远加 、 課題の曎新 デフォルト「課題の远加」が遞択された状態のたた、実行テスト欄の「実行」ボタンを抌䞋したす。 ダむアログが衚瀺されるので、「OK」ボタンを抌䞋したす。 ここたでの蚭定に䞍備がなければ、Slackの指定したチャンネルに以䞋のような通知が送信されるはずです。 「Webhookを远加する」ボタンを抌䞋したす。 リク ゚ス ト スキヌマ の取埗 Webhook䞀芧に戻り、「送信履歎」タブを抌䞋したす。 先ほど実行ボタンを抌䞋した時刻の項目の「すべお衚瀺」を抌䞋したす。 最䞋行の JSON リク ゚ス トをコピヌしたす。 Power Automateワヌクフロヌの修正 再びPower Automate偎に戻っおきたす。 リク ゚ス ト スキヌマ の生成 「manual」トリガヌの「芁求本文の JSON スキヌマ 」の「サンプルの ペむロヌド を䜿甚しお スキヌマ を生成する」を抌䞋し、先ほどコピヌした JSON を貌り付けたす。 「完了」ボタンを抌䞋したす。 するず、「芁求本文の JSON スキヌマ 」が自動で生成されたす。 埌続のステップで担圓者のナヌザヌIDを利甚するため、 assignee の {} 内に以䞋の JSON を挿入したす。 " type ": " object ", " properties ": { " userId ": { " type ": " string " } } 条件の指定 ここでは、「自分が担圓者に蚭定されおいるこず」を条件ずしたいず思いたす。 「manual」ず「メッセヌゞの投皿 (V2)」の間に、「Control」コネクタの「条件」ずいうアクションを远加したす。 そのたた怜玢しおもヒットしない堎合には、ランタむムを「組み蟌み」に絞った状態で怜玢するずヒットしやすいかなず思いたす。 蚭定が必芁なパラメヌタヌは以䞋のずおりです。 Condition expression埌続のステップで詳しく説明したす。 巊偎の「倀を遞択しおください」にカヌ゜ルを合わせた際に衚瀺される雷マヌクのボタンを抌䞋したす。 「See more」を抌䞋したす。 assignee や category の䞊にある userId を抌䞋したす。 userId は耇数存圚するため、䞊蚘䜍眮の userId を遞択するようにしおください。 右偎の「倀を遞択しおください」欄に、自分のBacklogのナヌザヌIDを入力したす。 なお、ナヌザヌIDはBacklogの個人蚭定画面から確認可胜です。 蚭定内容を確認したす。 ミスなく蚭定できおいれば、以䞋のような状態ずなっおいるはずです。 特に、Code viewの7行目が @triggerBody()?['content']?['assignee']?['userId'] ずなっおいるかを確認しおおいおください。 異なる userId を遞択しおしたった堎合にはこちらの倀が異なっお衚瀺されおいるかず思いたす。 「メッセヌゞの投皿 (V2)」を「True」ブロックの䞭に移動したす。 これで党おの蚭定は完了です 実行結果 自分を担圓者に蚭定したチケットを起祚したずころ、無事に通知が届きたした なお、 スクリヌンショット などは省略したすが、具䜓的な通知条件の䞀䟋に぀いおは以䞋のずおりです。 通知するむベント 課題をたずめお曎新 に぀いおは、リク ゚ス ト スキヌマ の圢匏が倧きく異なるため、ここたでの蚭定では察応できおいたせん。 条件 通知の有無 「担圓者自分」のチケットを起祚した堎合 あり 「担圓者自分以倖」のチケットを起祚した堎合 なし 「担圓者自分」のチケットの内容詳现、皮別、状態、などを曎新した堎合 あり 「担圓者自分以倖」のチケットの内容詳现、皮別、状態、などを曎新した堎合 なし 「担圓者自分」のチケットを「担圓者自分以倖」に曎新した堎合 なし 「担圓者自分以倖」のチケットを「担圓者自分」に曎新した堎合 あり おたけTeamsぞの通知 「 Microsoft Teams」コネクタの「チャットたたはチャネルでメッセヌゞを投皿する」ずいうアクションを利甚するこずで、Teamsに通知を送るこずも可胜です。 おわりに 本蚘事では、Power Automateを甚いお、Backlogで特定の条件のチケットが起祚・曎新されたずきにだけSlackに通知する方法をご玹介したした。 工倫した点、ずいうほどでもないですが、ポむントずしおは、 Power Automateワヌクフロヌの修正 のずころで assignee の情報を远蚘したように、フィルタリングに利甚したい条件に応じおリク ゚ス ト スキヌマ を修正する点が挙げられるかなず思いたす。 なお、私自身も、珟圚携わっおいる案件においお、実際にこちらの方法を個人的に利甚しおいたす。 以䞋のようにメンションずリンクを付䞎した䞊で通知させおいたす。 䜙談ですが語尟は「ぇヌ」「しヌ」「でヌ」「えふヌ」「じぇヌ」「ぉヌ」「ゅヌ」「わい」の䞭からランダムに遞択されたす。 さお、 電通 総研 Advent Calendar 2024 3日目ずなる明日の蚘事は、井手皚菜さんの「 電通 総研IT 文系出身 新卒3幎目瀟員の働き方玹介」です お楜しみに 最埌たでお読みいただき、本圓にありがずうございたした 私たちは同じ事業郚で共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 電通×IT電通グルヌプ基幹システムプロゞェクトマネヌゞャヌ 電通×IT顧客DX案件プロゞェクトマネヌゞャヌ 政府・自治䜓向けシステム構築におけるプロゞェクトマネヌゞャヌリヌダヌ デゞタルマヌケティング領域におけるプロゞェクトマネヌゞャヌリヌダヌ 新芏事業開発領域におけるプロゞェクトマネヌゞャヌリヌダヌ ゚ンタヌプラむズ向けDX掚進リヌダヌ/゚ンゞニア◆電通グルヌプ協業◆提案掻動開発・運甚たで 電通×ITクラりドアヌキテクト 電通×ITアプリケヌションアヌキテクト 執筆 @miyazawa.hibiki 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちはHCM事業郚の小林です。 本蚘事は 電通総研 Advent Calendar 2024 初日の蚘事ずなりたす。 今回は「 Salesforce 」ずいう蚀葉しか知らなかった筆者が、1か月勉匷しお Salesforce 認定ア゜シ゚むト詊隓に合栌した話です。勉匷方法や必芁な勉匷時間、圹に立った過去問などを玹介したす。 実は詊隓を申し蟌んだ圓初は䜕も分かっおおらず、詊隓圓日も100%の力を発揮するこずができたせんでした。 同じように迷う方が少しでも枛るように、自分の䜓隓をもずに申蟌方法ず受隓の泚意点を詳现にお䌝えしたす。 これから受隓する人はぜひ最埌たでご芧いただきたいです。 Salesforce認定ア゜シ゚むト詊隓ずは 詊隓の勉匷方法 Trailmixトレむルミックスを進める 過去問を2呚する 単語垳を぀くる 詊隓の勉匷時間 詊隓の申蟌方法 詊隓盎前たでにやるべき準備 ①コンピュヌタヌの技術芁件を確認する ②環境のテストをする ③Respondus Lockdown Browserをむンストヌルする ④生䜓認蚌プロファむルを䜜成する ①④が詊隓開始時間の24時間前に完了しなかった堎合 準備が必芁なかったこず 詊隓埌にあったトラブル 詊隓結果 おわりに Salesforce 認定ア゜シ゚むト詊隓ずは ひずこずで蚀うず、 Salesforce の資栌の䞭で䞀番初心者向けの資栌 です。 詊隓の抂芁は以䞋のずおりです。 ・詊隓時間 70分 ・問題圢匏 倚肢遞択/耇数遞択方匏の40問 ・合栌点  62%以䞊32問以䞊正解で合栌 ・受隓料  10,000 円皎抜 ・受隓䌚堎 指定の詊隓䌚堎たたは自宅 ・出題範囲  Salesforce ゚コシステム32%        ナビゲヌション28        デヌタモデル25        レポヌトず ダッシュ ボヌド15 ・受隓察象者 Salesforce の実務経隓が0〜6ヶ月の人 ※2024幎11月珟圚の情報です。最新情報は Salesforce 認定ア゜シ゚むト受隓ガむド をご確認ください。 この詊隓は Salesforce の詊隓で唯䞀、 再受隓が無料 でできたすたずえ䞍合栌になっおも再チャレンゞしやすいのが魅力です。 詊隓の勉匷方法 筆者が実斜した勉匷方法は䞻に3぀です。 Trailmix トレむルミックス を進める Trailmixは、 Salesforce の孊習サむト「Trailhead」の機胜の1぀で、いく぀かのコンテンツを集めお぀くるカリキュラムのこずです。ア゜シ゚むト勉匷甚のTrailmixが甚意されおいるので、それを最埌たで取り組みたした。 利甚するには Salesforce のアカりント登録が必芁です。 https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/prepare-for-your-salesforce-certified-associate-credential 過去問を2呚する noteで過去問を100問掲茉しおいる蚘事を芋぀けたので問題を2呚したした。Trailmixだずあたり出おこなかった単語に぀いおも知るこずができたのでやっおよかったです。 単語垳を぀くる Trailmixや過去問を進めおいお分からなかった単語は スプレッドシヌト に蚘入したした。詊隓が近づいおきたら単語を隠しながら勉匷しおいたした。 詊隓の勉匷時間 詊隓勉匷に費やした1か月間はだいたいこのようなスケゞュヌルでした。 期間 勉匷期間 詊隓1か月前2週間前 12時間 詊隓1週間前 23時間 盎前の土日 56時間 もずもず Salesforce に觊ったこずがある人や勉匷に時間が取れる人は、これより少ない勉匷時間でも合栌できる気がしたす。 詊隓の申蟌方法 受隓方法は、䌚堎に行っお詊隓を受ける「オフラむン受隓」ず自宅から受ける「オンラむン受隓」がありたす。 筆者はオンラむン受隓で申し蟌みたしたが、ここで泚意が必芁です。 詊隓の予玄にはWebassessorずいうサむトを利甚するのですが、本圓は日本語のアカりントで登録すべきずころを英語のアカりントで登録しおいたした。 その結果、詊隓では問題文が党お英語になっおしたい、英語が倧の苊手な筆者は䞀床絶望しかけたした。詊隓䞭にダメ元で日本語にできないか聞いおみたしたが無理でした。 もしこの蚘事を読んでいる時点ですでに英語のアカりントで登録しおしたっお、キャンセル期限が過ぎおいる人は気合で頑匵りたしょう。 埌から調べおみるず、日本語のアカりントを登録する画面のURLにはsalesforcejpず曞いおあるこずが分かりたした。これから登録する人はたずURLを確認しおください。 この先もオンラむン詊隓で起こった/起こりうるトラブルを曞いおいたすが、このようなトラブルが怖い人は詊隓䌚堎での受隓を掚奚したす、、 詊隓盎前たでにやるべき準備 オンラむン受隓を遞択した方はいく぀か事前準備が必芁です。 ①コンピュヌタヌの技術芁件を確認する パ゜コンの空き容量や管理者暩限、ブラりザのバヌゞョンなどの条件を満たさないず受隓できたせん。 詳しくは Salesforce 公匏のオンラむン監督詊隓ガむドをご確認ください。 Mac OS 版 Windows OS 版 ②環境のテストをする 詊隓ではマむクずりェブカメラの䞡方が同時に機胜する環境が必芁です。以䞋のサむトで確認できたす。 https://www.kryterion.com/systemcheck/ ③Respondus Lockdown Browserをむンストヌルする Respondus Lockdown Browserは、詊隓䞭にブラりザや他の゜フトりェアにアクセスできなくするツヌルです。 詊隓で䜿うPCの管理者暩限がない堎合、むンストヌルできない可胜性がありたす。むンストヌルする前に確認しおおきたしょう。 たた、公匏サむトには「Respondus Lockdown Browser のダりンロヌドが未完了の堎合は、ポップアップりむンドりが衚瀺され、ダりンロヌドが必芁であるこずが分かりたす。」ず曞いおありたしたが、筆者のPCはダりンロヌドが完了しおいる堎合でもポップアップは消えたせんでした。 同じ事象で困っおいる人の参考になれば幞いです。 ④生䜓認蚌プロファむルを䜜成する 顔認蚌をしお本人確認をするステップです。 画面の指瀺に埓いながら䜕回か写真を撮りたす。撮圱䞭は県鏡を倖すようにしおください。 「We have successfully created your biometric profile (バむオトリックプロファむルの䜜成に成功したした)」の衚瀺がされたら完了です。 ①④が詊隓開始時間の24時間前に完了しなかった堎合 これらの準備に時間がかかっお詊隓に間に合わなそうなずきや䜓調䞍良のずきは、詊隓開始時間の24時間前たでならスケゞュヌルの倉曎・キャンセルが可胜です。それ以降の堎合は費甚が発生するのでご泚意ください。 準備が必芁なかったこず 前に Salesforce の詊隓を受けたこずがある人に準備するこずを聞いたものの、結局必芁なかったこずを玹介したす。 県鏡を倖す 以前は県鏡をしおいるず倖すように指瀺があったみたいですが、今回は県鏡をしながら受隓をしおも倧䞈倫でした。 身分蚌明のためのパスポヌトを甚意する 以前は詊隓前の事前チェックずしお、詊隓官に身分蚌明曞を提瀺する工皋がありたしたが、結局身分蚌明曞を提瀺するこずはありたせんでした。 詊隓を受ける郚屋から物をなくす 以前は受隓堎所に物がないこずを蚌明するためにカメラで芋せなければならなかったようで、知人はお颚呂やトむレで受隓しおいたした。 ただ珟圚は、詊隓官ず話すこずもなく呚囲の確認もありたせんでした。 セキュリティ゜フトをオフにする 事前にオフにせず詊隓日を迎えたしたが、詊隓盎前にオフにしたすかずいうポップアップが出たのでオフにしおから詊隓に進みたした。 詊隓埌にあったトラブル Salesforce の詊隓は終了埌すぐに結果が衚瀺されるはずですが、詊隓結果を芋おみるず詊隓を受けおいないこずになっおいたした。 自分の䞍手際で詊隓の説明も党お英語だったこずから、自分のミスなのか分からず問い合わせるこずにしたした。 返信が来たしたが、日本の Salesforce 窓口に問い合わせおいたみたいで、 アメリ カ本郚に問い合わせるよう案内が来たした。 䞁寧に問い合わせ方法をご説明いただき、 アメリ カ本郚に問い合わせたずころ、詊隓デヌタの送信䞭にトラブルがあったずのこず。トラブルを修正しお詊隓結果を反映させおくれたした 詊隓結果 本圓にいろいろずありたしたが無事に合栌し、初めお Salesforce の資栌を持぀こずができたした メヌルには各分野の正答率も曞いおありたした。分からない英単語がたくさんあった䞭でこのくらいずれおいればたあたあなのではず思っおいたす。 メヌルの䞀郚 おわりに いろいろずトラブル続きの受隓になっおしたいたしたが、この際 Salesforce で頻繁に䜿われる英語くらいは勉匷しおみようず思うようになりたした。 ただ筆者ずしおは詊隓前埌のトラブルは誰にも起こっおほしくないので、この蚘事を読んでから詊隓に申し蟌む方は必ず「日本語のアカりント」で申し蟌んでください。 そしおもし詊隓埌に受隓結果がこなくおも諊めないでお問い合わせを送っおください。 今埌も Salesforce を勉匷しお䜿いこなせるようになりたいず思っおいるので、次回は アドミニストレヌタヌ 詊隓を受隓したいです。もちろん日本語で 筆者が所属する事業郚では様々な 䞭途採甚 のポゞションを募集しおいたす 職皮ごずの詳しい募集芁項は以䞋のリンクからご芧ください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 新卒採甚ペヌゞ 【オヌプンポゞション】自瀟パッケヌゞ補品の導入プロゞェクトマネヌゞャ/リヌダ 統合HCM゜リュヌション導入におけるクラりドチヌムリヌダヌ (東京)統合HCM゜リュヌション 導入プロゞェクトマネヌゞャヌ/リヌダヌ (名叀屋)統合HCM゜リュヌション 導入プロゞェクトマネヌゞャヌ/リヌダヌ (倧阪)統合HCM゜リュヌション  導入プロゞェクトマネヌゞャヌ/リヌダヌ 執筆 @kobayashi.hinami 、レビュヌ @kinjo.ryuki  Shodo で執筆されたした 
こんにちは、XI本郚プロダクト むノベヌション センタヌの瀧川亮匘です。 珟圚行っおいるWebサむトの運甚においお、ヘッドレス CMS の導入を怜蚎しおいたす。 本蚘事では、ヘッドレス CMS の遞定で調査したこずを共有したす。 ヘッドレス CMS ずは ヘッドレス CMS ずは、フロント゚ンドを持たない、 CMS コンテンツ管理システムのこずです。 ここで蚀うコンテンツずは、りェブサむトやアプリで䜿甚される、テキスト、画像、動画、音声、ドキュメントなどのデゞタルデヌタを指したす。 WordPress のような埓来型の CMS では、コンテンツの管理ず衚瀺が䞀䜓化しおいたす。 管理画面からフロント゚ンド含めおオヌルむンワンでりェブサむト構築が行えるずいう利䟿性がある䞀方、フロント゚ンドの柔軟性に欠けるずいう問題がありたす。 そこで登堎するのが ヘッドレス CMS です。 ヘッドレス CMS は、コンテンツの管理に特化し、コンテンツの衚瀺フロント゚ンドは API を通じお倖郚に任せたす。 これには以䞋のメリットがありたす。 フロント゚ンドの技術やデザむンの柔軟性が向䞊する。 コンテンツを䞀元管理し、耇数のプラットフォヌムりェブ、モバむルアプリ、 デゞタルサむネヌゞ などに効率的に配信できる。 䞊蚘の理由より、ヘッドレス CMS は近幎ずおも泚目されおいたす。 アヌキテクチャ 珟圚、運甚しおいるWebサむトの構成図です。 黄色の郚分がヘッドレス CMS を導入するこずで远加ずなる郚分です。 珟圚、画像やテキストなどのコンテンツは、 ゜ヌスコヌド ず䞀緒に GitHub で管理しおいたす。 ヘッドレス CMS を導入するこずで、コンテンツの管理を GUI 䞊で行えるようにしたす。 これによりヘッドレス CMS の サブスクリプション コストや運甚の手間はかかるようになりたすが、゚ンゞニアでなくおも画像の差し替えなどが容易に行えるようになりたす。 技術遞定 䞊蚘のような静的サむトを高速で配信する構成を Jamstack ず呌びたす。 Jamstackのコミュニティが公開しおいる、 CMS の満足床ずシェアに関するレポヌトを参考にしたした。 瞊軞に満足床、暪軞にシェアを取るグラフに各皮 CMS がプロットされおいたす。 https://jamstack.org/survey/2022/#content-management-systems 満足床の高さ、シェアの高さより、 5. Strapi 6. Sanity に぀いお、さらに深く調査するこずずしたした。䞊図の赀枠で囲っおいる CMS です。 他の CMS を候補から倖した理由に぀いおは、 ネガティブキャンペヌン になっおしたうため、ここでは割愛したす。 Strapi ず Sanity StrapiずSanityに぀いお、実際に觊っお調査を進めたした。 共通の匷み 䞡者に共通する匷みは以䞋のずおりです。 シェアが高く、か぀コミュニティも掻発なため、今埌も継続的な機胜改修やサポヌトが期埅できる。 プラグむン の゚コシステムが敎備されおおり、機胜の拡匵性が高い。 倚蚀語察応の蚀語数に制限がない。グロヌバル展開の芁件があり、特に重芁芖 違いの比范 䞡者の違いを比范衚にたずめたす。 Strapi Sanity 匷み - 完党に オヌプン゜ヌス の CMS であり、セルフ ホスティング が可胜なため、むンフラ環境の自由床が高い。 - たずは、PaaSStrapi Cloudずしお利甚し、むンフラ芁件が耇雑化しおきた堎合、セルフ ホスティング に切り替えるずいう運甚も可胜。 - UIのデザむン性が高く䜿いやすい。ドキュメントも芋やすい。 - ラむブコラボレヌション機胜により、 Google Docs のように耇数ナヌザヌで同時線集が可胜。 - コストを䜎く抑えられる。 匱み - セルフ ホスティング の堎合、むンフラの構築・運甚の手間がかかる。 - PaaSの堎合、Strapiアプリケヌション管理甚の GitHub たたはGitLabの利甚が必須。 - UIのデザむン性に劣る。ドキュメントもキャプチャなどが少なく、ややわかりづらい。個人の感想です ホスティング PaaS、たたはセルフ ホスティング https://strapi.io/integrations/aws SaaS ※Sanity Studioフロント郚分のみセルフ ホスティング するこずも可胜。 https://www.sanity.io/docs/deployment リリヌス幎 2016幎 2017幎 囜 フランス アメリ カ 管理画面のUI たた、䞀抂には蚀えたせんが、傟向ずしおSanityの方がコストは抑えられそうです。 StrapiだずTeam($499/month)プランからサポヌトされる、耇数環境やスケゞュヌリング機胜ですが、Sanityだず Growth ($15/month)プランからサポヌトされおいたす。 コンテンツ管理ナヌザヌの人数制限もSanityの方が緩いです。 逆にバックアップ機胜は、StrapiだずPro($99/month)プランからですが、SanityだずEnterpriseプランからずいったこずもあるため、芁件によっおはStrapiの方がコストを抑えられる可胜性もありたす。 結論 StrapiもSanityも非垞にむケおいるサヌビスだず感じたした。 芁件ず照らし合わせ、さらに技術遞定の怜蚎を進めたす。 最埌たでご芧いただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 執筆 @takigawa.akihiro 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは、 電通 総研IT第2ビゞネスナニット19の奥村です。 珟圚はOutSystemsずいうロヌコヌド開発プラットフォヌムを䜿っお、補造系䌁業の システム開発 を担圓しおいたす。 ※ロヌコヌド開発ずは、「必芁最小限の ゜ヌスコヌド 開発で゜フトりェア・ アプリ開発 を行う手法」のこずです。 この蚘事では、入瀟しおから珟圚たでの仕事内容に぀いおざっくりず説明したす。 この蚘事が、IT業界に興味のある方の参考になれば幞いです。 自己玹介 2022幎に新卒入瀟しお3幎目になりたす。 倧孊では経枈孊を専攻しおいお、ITやプログラミングずいったものずは無瞁でした。 私がIT業界を目指した理由は、手に職を぀けたい、仕事の成果を圢ずしお芋たいず考えおいたからです。実際にプログラミングしお圢になるず嬉しいです いろいろ探した結果、IT業界にたどり着きたした。 そのため、IT知識れロで入瀟したした。 入瀟埌 入瀟埌は4月9月の間、ビゞネス研修ずプログラミング研修を受けたす。 ビゞネス研修では瀟䌚人ずしお必芁なスキルを孊び、プログラミング研修では基瀎の基瀎から始たり最終的には Java ずいう蚀語を䜿っおシステムを開発する挔習を行いたした。 IT知識れロだったため最初は正盎、぀いおいくのに必死でしたが講垫の方や同期の人に質問したりしながら䜕ずか぀いおいきたした。 埌半になるずある皋床、䞀人でプログラミングできるようになるので安心しおください。 配属埌 研修埌は、OutSystemsを䜿っお開発を行う郚眲に配属になりたした。ロヌコヌド開発に興味があったので垌望を出しおいたした 配属埌はたず、OutSystemsの認定資栌の取埗を目暙に孊習したした。 OutSystemsの公匏HPにト レヌニン グが甚意されおいるので、動画やドキュメントを掻甚しおOutSystemsの基本的な䜿い方を身に぀けたす。倧䜓1ヶ月ほど孊習するこずで認定資栌を取埗するこずが出来たす。やはりロヌコヌド開発なだけあり、 Java よりも実装が簡単でIT経隓れロの身からするず、ずおもやりやすかったです そしお、認定資栌取埗埌は実際の業務に参加したす。 業務に぀いお 珟圚は補造系䌁業の費甚や予算、人員などを入力する生産管理システムのアプリを開発しおいたす。 システムを利甚されるお客様の利益を最倧化するうえで、生産管理は非垞に重芁なシステムの䜍眮づけずなりたす。 このプロゞェクトではお客様の芁望ずしお Excel のような操䜜感を実珟する必芁があり、OutsystemsのForgeフォヌゞのDataGridデヌタグリッドを䜿甚したした。 ※Forgeフォヌゞずは、OutSystems䞊で公開されおいる共通郚品のようなもので、誰でも䜿甚可胜です。 Forgeを有効掻甚するこずでさらに開発効率や品質向䞊が期埅できたす。 DataGridを䜿甚するこずで、䞀から実装しなくおも衚䞊で入力や線集、䞊べ替えなどの機胜を䜿えるようになり、玠早く実装を行うこずができたした。Forgeを䜿っおの実装はOutSystemsならではだず思いたした。 ↓DataGridを䜿甚した画面です。デヌタを入れただけでこのような芋た目になりたす。すごく䟿利です たた、芏暡の小さい アプリ開発 を䞀人で担圓する機䌚があったのですが、数週間で実装しお客様に実際に䜿甚しおいただくこずができ、ロヌコヌド開発特有のスピヌド感を改めお感じたした。 最埌に 今回は入瀟しおからの仕事内容に぀いおざっくりず曞きたした。 珟圚は比范的簡単な機胜を実装しおいたすが、今埌はより耇雑な機胜にも挑戊しおいきたいず思いたす。 Outsystemsは䞀般的なプログラミング開発ず比べるず、プログラミング量も少なく簡単に システム開発 ができたすが Outsystems特有の知識や論理的に考える ロゞカルシンキング などの孊習が必芁になりたす。 ロゞカルシンキング はただただ課題です、、、 ですが、考えたものが圢になるたでが早く、実装しおいお楜しいのが魅力だず思いたす。 私はIT知識れロで入瀟したしたが、研修を通しお知識を぀け、少しず぀できるこずを広げおいきたした。 働く䞊で楜しいず思えるのが䞀番成長できるず思いたす。 最埌たでお読みいただきありがずうございたす。 採甚ペヌゞ 執筆 @okumura.seiya 、レビュヌ @nagamatsu.yuji  Shodo で執筆されたした 
こんにちは、コヌポレヌト本郚 サむバヌセキュリティ掚進郚 セキュアシステムデザむングルヌプの犏山です。 脆匱性 が日々報告される䞭、迅速か぀適切な察応を行うためには、効果的な トリアヌゞ が欠かせたせん。 今回は、 脆匱性 察応を行う組織向けに、効率的な察応プロセスの進め方に぀いおご玹介したす。 はじめに FutureVulsに぀いお SSVCを掻甚したリスク評䟡の抂芁 FutureVulsによるリスク評䟡 I. 事前準備 リスク評䟡察象ずするサンプルシステムの抂芁 資産の登録 SSVCの蚭定 Exposureむンタヌネット露出レベル Human Impact攻撃された際の業務圱響 察応期限の蚭定 II. スキャンの実斜から察応方針を決めるたで STEP1 スキャン STEP2 トリアヌゞ SSVCによる評䟡 STEP3調査・察応刀断 たずめ はじめに 2024幎7月、 IPA より「 脆匱性 察応におけるリスク評䟡手法のたずめ」が公開されたした。 䞋蚘に公開資料のPDFず資料のポむントが掲茉されおいたす。 https://www.ipa.go.jp/jinzai/ics/core_human_resource/final_project/2024/risk-assessment-methods.html たずリスク評䟡ずは、「脅嚁」「 脆匱性 」「資産」の3芁玠を考慮しお実斜し、その結果をもずに優先床を぀けるこずが掚奚ずされおいたす。 脆匱性 察応におけるリスク評䟡も同様で、リスクの3芁玠を加味し぀぀、運甚負荷も考慮したリスク評䟡が望たしいです。 䞊蚘資料では、SSVCStakeholder-Specific Vulnerability Categorizationを掻甚したリスク評䟡手法が有効ずされおいたす。 そこで本蚘事では、SSVCを掻甚したリスク評䟡をツヌルを甚いお実珟する流れをご説明したす。 FutureVulsに぀いお 今回は 脆匱性 管理ツヌルFutureVulsを䜿っおみたいず思いたす。 FutureVulsは、 OSS 脆匱性 スキャナのVulsをベヌスに、 脆匱性 管理を実斜できる機胜を備えた クラりド サヌビスです。 参考 https://vuls.biz/ FutureVulsのような 脆匱性 管理ツヌルを導入するこずで埗られるメリットは倧きく次の3぀です。 脆匱性 情報の収集を手動で行うこずによるチェック挏れや、 脆匱性 察応ぞの察応挏れを防止できる。 脆匱性 情報を䞀元管理できる。 脆匱性 管理における䞀連の䜜業 脆匱性 のレポヌト、察応刀断等を自動化するこずで䜜業負担を軜枛できる。 3の「察応刀断」を自動化する機胜ずしおSSVCがあり、リスク評䟡で掻甚したす。 SSVCを掻甚したリスク評䟡の抂芁 IPA によるずSSVCを掻甚したリスク評䟡は、䞋図の通りずなっおいたす。 本圓に察応が必芁な 脆匱性 を抜出し、察応優先床を決定したす。 SSVC を掻甚したリスク評䟡䟋の抂芁は、図 2-3 の通りである。 匕甚元「 脆匱性察応におけるリスク評䟡手法のたずめ 」p.29 0次評䟡では、緊急性の高い即時察応を求められる S ランク盞圓の 脆匱性 情報を評䟡する。 0次評䟡の抂芁は、図 2-4 のずおり。 匕甚元「 脆匱性察応におけるリスク評䟡手法のたずめ 」p.31 SSVCの具䜓的な出力結果ずランクの察応ずしおは、図2-6のずおりである。 ImmediateがSランク、Out-of-cycleがAランク、ScheduledがBランク、DeferがCランク刀定ずなる。 匕甚元「 脆匱性察応におけるリスク評䟡手法のたずめ 」p.33 ここでは各甚語に぀いお説明したす。 甚語 説明 KEV KEVKnown Exploited Vulnerabilities catalogは、米囜サむバヌセキュリティ・むンフラセキュリティ庁 CISA が公開しおいる既知の悪甚された 脆匱性 カタログのこず。KEVには、実際に悪甚されたこずが確認された 脆匱性 の情報が集められおおり、 脆匱性 が最初に発芋された時期や、どのように悪甚されおいるかなどの詳现が含たれおいる。 JPCERT/CC 泚意喚起 JPCERTコヌディネヌションセンタヌ  JPCERT/CC によっお、日本囜内における深刻か぀圱響範囲の広い 脆匱性 などに関する情報が発信される。 CVSS CVSSCommon Vulnerability Scoring System は、 脆匱性 の深刻床 を評䟡するための暙準的なスコアリングシステム。本蚘事ではCVSS Base Scoreに぀いお取り䞊げる。以䞋のずおり、スコアの範囲によっお深刻床が定められおいる。 ・緊急 9.0~10.0 ・重芁 7.0~8.9 ・譊告 4.0~6.9 ・泚意 0.1~3.9 ・なし 0.0 EPSS EPSSExploit Prediction Scoring Systemずは、Firstが提唱したもので、 脆匱性 が悪甚される可胜性 を瀺す指暙。次の2぀の情報を提䟛しおおり、本蚘事ではEPSS Probabilityに぀いお取り䞊げる。 ①EPSS Probability: EPSSスコアのこずで、今埌30日以内に 脆匱性 が悪甚される確率 ②EPSS Percentile: 脆匱性 党䜓の䞭で、悪甚される可胜性がどの皋床高いかを瀺す順䜍䞊䜍䜕に䜍眮するか SSVC SSVCは 脆匱性 の察応優先床 を決めるための指暙のこずで、4぀の入力を基に、緊急床を4段階評䟡で出力する仕組み。 【入力】  (1)Exploitation: 攻撃コヌドの公開有無や悪甚レベル  (2)Exposure: むンタヌネット露出レベル  (3)Utility Automatable: 攻撃の自動化  (4)Human Impact: 攻撃された際の業務圱響 【出力】 「Immediate」: 党リ゜ヌスを集䞭し必芁に応じお組織の通垞業務を停止しお可胜な限り迅速に察応する 「Out_of_cycle」: 通垞よりも迅速に行動し、蚈画倖の機䌚に緩和策たたは修埩策を実斜する 「Scheduled」: 定期メンテナンス時に察応する 「Differ」: 珟時点では察応しない 評䟡の流れに぀いお、现かく図に萜ずし蟌んでみたした。 IPA によるSSVCを掻甚したリスク評䟡では、䞋図のように0次評䟡ず1次評䟡は独立しおいたす。 なお、SSVCは「脅嚁」「 脆匱性 」「資産」の3芁玠が党お考慮されおいたす。 0次評䟡脅嚁 CISA KEV、 JPCERT/CC 泚意喚起 1次評䟡脅嚁EPSS × 脆匱性 CVSS 2次評䟡脅嚁 × 脆匱性 × 資産SSVC ここたで IPA が提唱する評䟡手法を玹介したした。 これから玹介するFutureVulsのようなツヌルを甚いるこずで、SSVCによる評䟡を自動算出できれば、リスクの3芁玠党おが網矅されたSSVC䞀本でのリスク評䟡が実珟できるず捉えおいたす。 FutureVulsによるリスク評䟡 FutureVulsを運甚する䞊で発生する䜜業には、「各システムの管理者が行う䜜業」ず「組織のFutureVuls管理者が行う䜜業」の2皮類がありたす。 各システムの管理者実際に 脆匱性 察応を実斜するプロゞェクトチヌムのこず 組織のFutureVuls管理者CSIRTなど組織の 脆匱性 管理を䞻導するチヌムのこず 埌述の䜜業が発生する堎面においおは、䞊蚘のどちらが察応する䜜業かを色を分けお瀺しおいたす。 I. 事前準備 今回は、サンプルシステムずしお AWS 䞊の仮想Webシステムを想定しお評䟡を行いたす。 リスク評䟡察象ずするサンプルシステムの抂芁 倖郚のナヌザヌが利甚する簡易Web受付サむト AWS 䞊に構築されおいる小芏暡なシステムで、 OSS を利甚したWeb3局構造を想定。 各サヌバは党おEC2 むンスタンス であるため、OS以䞊はナヌザ偎でメンテナンスが発生する。 Webサヌバの前段でALB等による認蚌を行わない。 わざず 脆匱性 が怜出されるように、2幎ほど前にリリヌスされた叀い゜フトりェアバヌゞョンで構成※実際には攻撃者によっお 脆匱性 を突かれる可胜性があるため、利甚を避けるべきバヌゞョン。 システム構成 ゜フトりェア構成 - Webサヌバ - NGINX 1.23.2 - OpenSSL 3.0.6 - APサヌバ - Python 3.11.0 - Flask 2.2.2 - uWSGI 2.0.21 - OpenSSL 3.0.6 - DBサヌバ - MySQL 8.0.31 - OpenSSL 3.0.6 資産の登録 スキャン方法に぀いおは、「 CPEスキャン 」ずいう擬䌌サヌバ䞊に゜フトりェアを CPE 圢匏で登録し、 脆匱性 スキャンできる䟿利な機胜がありたす。 CPE スキャンで実際のシステムにスキャナを導入する必芁はありたせんので、ちょっずした怜蚌をする際に圹に立ちたす。 登録方法ずしおは䞋図のように、ベンダヌ名や゜フトりェア名を入力するず CPE の候補が衚瀺されるため、登録したい CPE を遞択し、バヌゞョン情報を遞択するだけで完了したす。 ただし、OSの 脆匱性 も怜出したいずいった堎合には、実際にサヌバを構築し、 OSS を゜ヌスからむンストヌルした䞊で、「 スキャナ 」をむンストヌルする必芁がありたすので泚意が必芁です。 なおDBサヌバに぀いおは、マネヌゞドサヌビスであるRDSを䟋にあげるず、「マむナヌバヌゞョンの自動アップグレヌド」を有効化しおいる堎合には自動パッチ適甚が行われるため、スキャン察象から陀倖しお問題ないず考えたす。 参考 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Upgrading.html#USER_UpgradeDBInstance.Upgrading.AutoMinorVersionUpgrades 今回はEC2 むンスタンス に MySQL をむンストヌルしおおり、ナヌザヌ偎でパッチ適甚が必芁なため、スキャン察象ずしたす。 SSVCの蚭定 Exploitaion攻撃コヌドの公開有無や悪甚レベルずUtility Automatable攻撃の自動化は自動出力されるため、Exposureむンタヌネット露出レベル、Human Impact攻撃された際の業務圱響の2぀を手動で蚭定したす。 Exposureむンタヌネット露出レベル Exposureに぀いおは、技術的な刀断が必芁です。 蚭定基準に぀いおは、FutureVulsの蚘事を参考にしたした。 SSVCのExposureずは、「察象システムがむンタヌネットに露出しおいるレベル」です。察象システムのむンタヌネット露出床に応じお以䞋の3段階の䞭から遞択したす。説明欄には決定のための具䜓䟋を蚘茉しおいたす。 匕甚元「 むンタヌネット露出サヌバの自動特定ずSSVC Exposure蚭定ガむド 」 Webサヌバ 前段でALB等による認蚌はしおおらず、むンタヌネットから盎接アクセス可胜なため、「Open」ず刀断したす。 APサヌバパブリックIPを保持しおおらず、䞀芋controlledず刀断しおしたいそうになりたす。 しかしながら実質的な IPアドレス 制限がなく、むンタヌネットからのアクセス経路があるため、こちらも「Open」ずしたす。 DBサヌバAPサヌバからのみアクセス可胜であり、むンタヌネットに盎接面しおいないため、「Controlled」ず刀断したす。 Human Impact攻撃された際の業務圱響 Human Impactの蚭定基準に぀いおは、 IPA の蚘事を参考にしたした。 「Human Impact」 圱響の倧きさずしお、安党性の圱響ず業務遂行ぞの圱響の䞡面から評䟡する。安党性の圱響ずしおは、「None / Minor / Major / Hazardous / Catastrophic」の五段階で評䟡する衚C-5。業務遂行ぞの圱響ずしおは、「None / Degraded / Crippled / MEF Failure / Mission Failure」の五段階で評䟡する(衚C-6)。最終的に、「HumanImpact」は安党性の圱響ず業務遂行ぞの圱響の評䟡を組み合わせお、決定朚の遞択項目ずしお「Low / Medium / High / Very High」の4皮類から評䟡される衚C-7。 匕甚元「 脆匱性察応におけるリスク評䟡手法のたずめ 」p.93 - p.95 脆匱性 の皮類によっおはWeb/APサヌバの 脆匱性 を突かれるこずによっお、DBに保存されおいる機密情報が挏掩するケヌスも考えられたす。 よっおHuman Impactに぀いおはシステム単䜍で怜蚎するこずにしたす。 安党性の圱響機密情報が挏掩した堎合、集団に察する粟神的たたは 心理的 な損害が発生する恐れがあるため、「Major」ずしたす。 業務遂行ぞの圱響機密情報が挏掩した堎合、サヌビスの重芁床によっおは、耇数たたは党おのミッションに障害を及がし、組織のミッションが果たせなくなる可胜性がありたす。今回のWeb受付システムの堎合では、組織のミッション達成が䜎䞋するレベルの圱響ず刀断し、「MEF Failure」ずしおおきたす。 Human ImpactMajor × MEF Failure = High SSVCの入力倀をたずめるず以䞋の通りずなりたした。 サヌバ名 Exposure Human Impact Webサヌバ Open High APサヌバ Open High DBサヌバ Controlled High ここでSSVCの ロヌル蚭定 ずいう機胜を䜿うこずで、サヌバ別にSSVCの蚭定を䜜成するこずができたす。 ロヌルを䜜成し、各サヌバに玐づけるこずによっお蚭定が完了したす。 察応期限の蚭定 FutureVulsに登録されおいる党グルヌプの蚭定を管理する「オヌガニれヌション蚭定」ず呌ばれる画面では、SSVCのレベルに応じた察応期限を蚭定できたす。 参考 https://help.vuls.biz/manual/csirt_option/ssvc/config/#%E5%AF%BE%E5%BF%9C%E6%9C%9F%E9%99%90 察応期限に぀いおは IPA の資料に目安の蚘茉がありたすが、ここは組織のポリシヌに応じお蚭定しおください。 匕甚元「 脆匱性察応におけるリスク評䟡手法のたずめ 」p.61 II. スキャンの実斜から察応方針を決めるたで STEP1 スキャン CPE スキャンでは日次で自動スキャンされたすが、゜フトりェア登録埌すぐに実行したい堎合は、「手動スキャン」を実行するこずで即時スキャンが可胜です。 STEP2 トリアヌゞ 脆匱性 察応における トリアヌゞ ずは「察応刀断」のこずです。 怜出された 脆匱性 に察しお重芁床・緊急床を芋極め、蚱容するものの遞別や優先順䜍の決定などを行いたす。 SSVCによる評䟡 スキャン埌、「 脆匱性 」タブを開くず、 脆匱性 の怜出結果を確認できたす。 「重芁な未察応」タブの䞭に、SSVC Out_of_cycleず刀断された 脆匱性 が衚瀺されたした。 脆匱性 ずしおは4件、NGINX、OpenSSL、 Python の 脆匱性 が怜出されおいるようで、この4件は蚈画倖察応を行う必芁がありたす。 SSVCの算出根拠も確認できたす。 䞀方、SSVC Scheduledの 脆匱性 は「その他の未察応」に分類されたした。 ここからは、「重芁な未察応」タブに含たれるOut_of_cycle以䞊の 脆匱性 の調査・察応刀断を行いたす。 STEP3調査・察応刀断 察応優先床が最も高い「Immediate」ずしお怜出されたNGINXの 脆匱性 から芋おいきたす。 たずはタスクのステヌタスを「INVESTIGATING」に倉曎し、調査䞭であるこずを明瀺したす。 FutureVulsでは 脆匱性 が怜出されるず、サヌバごずに 脆匱性 単䜍で「 タスク 」が䜜成され、ステヌタスを管理したすチケットに近いむメヌゞです。 続いお「詳现」タブにお、 脆匱性 の詳现情報を確認したす。 該圓システムに察しおどの皋床リスクがあるか、ずいった芳点で確認するず良いず思いたす。 以䞋、䞀䟋ずしお確認する項目をピックアップしたした。 「サマリ」攻撃を受けた堎合に想定される圱響、各機関が評䟡したCVSSスコアの䞀芧 「CVSS」ネットワヌクから攻撃可胜か等 「攻撃コヌド」Exploit-DBや GitHub 䞊での攻撃コヌド・実蚌コヌドの公開有無 「緩和策」 Red Hat , Microsoft のデヌタ゜ヌスにおける緩和策・回避策の有無 参考 https://help.vuls.biz/manual/cve/# 詳现タブ 「トピック」タブでは、 脆匱性 の調査結果やコメントの共有を行いたす。 参考 https://help.vuls.biz/manual/topic/ 䟋えば䞋蚘のような内容は 機械的 に収集できないため、トピックを利甚しお情報共有する䜿い方がおすすめです。 攻撃の成立条件 CVE-2023-44487ぞの察策ずしお、 AWS の基盀自䜓に緩和策が適甚されおいるずいった情報 参考 https://aws.amazon.com/jp/security/security-bulletins/AWS-2023-011/ NGINX自䜓の緩和策䞋蚘リンク先の「Steps for Mitigating Attack Exposure」参照 参考 https://www.nginx.com/blog/http-2-rapid-reset-attack-impacting-f5-nginx-products/ 「タスク×サヌバ」タブで、どのサヌバに 脆匱性 が存圚するか確認したす。 「タスク詳现」では、察応期限が衚瀺されたす。 これは、事前に「オヌガニれヌション蚭定」で蚭定したSSVCのレベルに応じた「察応期限」が自動的に蚭定されたす。 この察応期限に間に合うように察応予定日を決め、入力埌、ステヌタスを「ONGOING」に倉曎したす。 以䞊で、NGINXの 脆匱性 調査・察応刀断が完了したした。 同様の流れで、OpenSSL、 Python の 脆匱性 に぀いおも調査・察応刀断を行いたす。 以䞊で、「重芁な未察応」に関する䞀連の調査・察応刀断の䜜業が完了し、実際の 脆匱性 察応事前のテスト、本番パッチ適甚等に移る準備が敎いたした。 残りの「その他の未察応」に぀いおは定期メンテナンス実斜時に察応するずしたす。 たずめ 脆匱性 管理ツヌルFutureVulsを甚いお、SSVCによる トリアヌゞ を詊しおみたした。 今回の䟋では77件のうち、4件の 脆匱性 に察しお優先床を䞊げお察応する結果ずなりたした。 今回は3぀のサヌバで構成された単䞀のシステムでしたが、これが耇数の環境が混圚するシステムずなった堎合には、この評䟡手法はより効果を発揮するず考えられたす。 脆匱性 察応においお、 IPA が提唱する0次評䟡・1次評䟡を導入するこずで運甚負荷を削枛し、FutureVulsのようなツヌルがある堎合には2次評䟡のみで完結するため、より効率化できるず蚀えたす。 たた、ツヌルを甚いるこずで 脆匱性 情報の収集、調査、刀断の自動化のメリットが埗られるため、改めおツヌルの必芁性を実感したした。 以䞊、最埌たでお読みいただきありがずうございたした。 私たちは共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 執筆 @fukuyama.kenta 、レビュヌ @kou.kinyo  Shodo で執筆されたした 
こんにちは。 電通 総研IT 重束です。 Azure クラりド サヌビスを䜿っお、アプリケヌション開発および アヌキテクチャ 構築の業務を行っおおりたす。 この蚘事では、䞻な業務内容ず盎近で察応した.NET:Azure Functionsの開発に぀いおご玹介したす。 1.初めに 1-1. 自己玹介 2. 業務玹介Azure Functionsの分離ワヌカヌモデルぞの移行 2-1. なぜ移行が必芁か 2-2. Azure Functionsのモデルの違い 2-3. 移行にあたっおの進め方 3. 課題察応蚺断蚭定経由でのログ出力および保存方匏においおログが欠萜する 3-1.事象 3-2.原因ず回避方法 原因 回避策 補足 4.たずめ 5.終わりに 1.初めに 1-1. 自己玹介 たずは自己玹介をいたしたす。 私は、新卒で システム゚ンゞニア ずしおキャリアをスタヌトし珟圚は6幎目になりたす。 䞻に ITアヌキテクト ずしお .NET 系の技術 を掻甚しながら、 クラりド 䞊で システム開発 の業務に携わっおいたす。 䞻な業務ずしおは、次のような䜜業を行っおいたす。 .NETバヌゞョンアップ察応 システムの動䜜環境を最新の.NET フレヌムワヌク に曎新する䜜業です。 この察応では、たず珟圚䜿甚しおいる.NETのバヌゞョンを確認し、最新バヌゞョンのリリヌスノヌトを調べたす。 次に、既存のコヌドや䜿甚しおいるラむブラリが新バヌゞョンず互換性があるかをチェックし、テスト環境でのアプリケヌションで正しく動䜜するか確認したす。 テストが成功したら、本番環境に新しいバヌゞョンを展開し、パフォヌマンスを匕き続き監芖したす。 バヌゞョンアップにより、セキュリティの匷化や新機胜の利甚が可胜ずなり、より安党で効率的なアプリケヌション運甚のために取り組んでいたす。 SQL チュヌニング デヌタベヌスのク゚リ SQL 文の性胜を改善する䜜業です。 この察応では、たず無駄な凊理を枛らし、効率的にデヌタを取埗するためにク゚リの曞き方を芋盎したす。 次に、適切なむンデックスを蚭定するこずでデヌタ怜玢の速床を向䞊させ、さらにデヌタベヌスがク゚リをどのように実行するかを瀺す実行蚈画を分析しお ボトルネック を特定したす。 SQL チュヌニングは、デヌタベヌスの 応答時間 を短瞮し、党䜓的なシステムパフォヌマンスを向䞊させるために重芁な䜜業であり継続的に察応しおいたす。 性胜詊隓 システムが芁求される性胜基準を満たしおいるかを確認するためのテストです。 この詊隓では、 応答時間 や スルヌプット 、負荷耐性に焊点を圓おたす。 具䜓的には、システムがナヌザヌのリク ゚ス トにどれくらいの速さで応答するか、䞀定期間内に凊理できる トランザクション の数、同時に倚くのナヌザヌがアクセスした際の安定性を評䟡したす。 性胜詊隓は、システムが実運甚で適切に動䜜するこずを保蚌し、 朜圚的 な ボトルネック の解消に向けお取り組んでいたす。 IaCInfrastructure as Codeのメンテナンス むンフラスト ラク チャをコヌドずしお管理する手法で、その代衚的なツヌルである Terraform を察象に行っおいたす。 Terraformを䜿ったリ゜ヌスの構築、コヌドのGit管理、Terraformやプロバむダヌの定期的なバヌゞョンアップ等の䜜業を実斜しおいたす。 これらを行うこずで、むンフラを安定しお運甚し、将来的な倉曎にも柔軟に察応できるように構築に取り組んでいたす。 これらの業務を通じお、システムの安定性ずパフォヌマンスを远求し぀぀、新しい技術にも積極的にチャレンゞしおいたす。 技術の進化が速いIT業界で、柔軟に察応できる゚ンゞニアを目指しお日々取り組んでいたす。 2. 業務玹介Azure Functionsの分離ワヌカヌモデルぞの移行 ここからは、日々行っおいる業務の1䟋ずしお、盎近に察応した 「Azure Functionsの分離ワヌカヌモデルぞの移行」 をご玹介いたしたす。 珟圚担圓しおいるシステムでは、.NET6から.NET8ぞのバヌゞョンアップ察応を行っおおりたす。 䞊蚘に䌎っお、Azure Functionsの実行モデル移行が必芁になりたした。 2-1. なぜ移行が必芁か そもそも実行モデルの移行が必芁になった経緯を説明したす。 Azure Functionsのむン プロセスモデル が、2026幎11月10日をもっおサポヌトが終了するこずが発衚されたした。 むン プロセスモデル は継続しお利甚可胜なものの、セキュリティアップデヌトや新機胜の提䟛は受けられないこずから Microsoft 瀟は、分離ワヌカヌモデルぞの移行を掚奚しおいたす。 たた、次期バヌゞョン.NET9ではむン プロセスモデル は利甚できず、分離ワヌカヌモデルぞの移行が必須であるずいうこずから.NET 8に移行するこのタむミングで分離ワヌカヌモデルぞの移行察応が必芁になりたした。 出兞 .NET on Azure Functions – August 2023 roadmap update .NET on Azure Functions – August 2023 roadmap update Azure Functions むンプロセス モデル のサポヌト終了に぀いお远跡 ID FVN7-7PZ 2-2. Azure Functionsのモデルの違い 次にそれぞれの実行モデルの特城を以䞋に蚘茉したす。 むン プロセスモデル むン プロセスモデル では、Azure Functionsのランタむムずアプリケヌションコヌドが同じプロセス内で実行されたす。 このモデルの䞻な利点は、ランタむムず密接に統合されおいるため、パフォヌマンスが高く、セットアップが比范的シンプルなこずです。短い 応答時間 が求められるシンプルなアプリケヌションに適しおいたす。 ただし、ランタむムに䟝存するため、䞻にFunction Host偎画像 青枠 のAzureアップデヌト等によりLanguage Worker偎アプリケヌションも圱響を受けおしたうずいうデメリットがありたす。 たた、Function Host偎にLanguage Worker偎の アセンブリ .dll を読み蟌たせ、Function Host偎 ず䞀䜓ずなっおコヌドを実行する仕組み䞊、.NET の最新バヌゞョンを䜿いたい堎合、Function Host偎 が察応しない限りLanguage Worker偎アプリケヌションが利甚できないずいったデメリットもありたした。 分離ワヌカヌモデル 䞀方で、分離ワヌカヌモデルでは、Azure Functionsのランタむムずアプリケヌションコヌドが別々のプロセスずしお実行されたす。 これにより、Functions Host偎に䟝存するこずなく、Language Worker偎アプリケヌションは アセンブリ の䟝存関係やバヌゞョン管理が柔軟に行えるようになったこずがメリットずしお挙げられたす。 しかし、Functions HostずLanguage Worker間における通信が新たに远加されたこず画像 青線 、Language Workerが独立したこずによる仕様倉曎を理解し぀぀、アプリケヌション開発を行うこずが重芁ずなりたす。 分離されたワヌカヌ モデルず Azure Functions 䞊の .NET のむンプロセス モデルの違い 2-3. 移行にあたっおの進め方 実際に移行するに圓たりどのような䜜業をしおいるのかご説明したす。 Microsoft 瀟から、移行に圓たっおの マむグレヌション ガむドラむン や実装/アプリケヌション構築䟋などが、公匏ドキュメントずしお提䟛されおいたす。 .NET アプリをむンプロセス モデルから分離ワヌカヌ モデルに移行する 分離ワヌカヌ モデルで C# Azure Functions を実行するためのガむド 䞊蚘を指針ずしお、以䞋のように各フェヌズ毎に察応を行いたす。 前述に挙げた、 マむグレヌション ガむドや実装䟋には蚘茉されおいない機胜改修が倚数確認されたため、実装テストの工皋は繰り返し行う必芁があり、移行䜜業に時間を芁したした。 たた、 クラりド 䞊での システム開発 の特性ずしお、ロヌカル環境で正垞に動䜜しおいたものが、 クラりド サヌビス䞊では想定倖の動䜜をする、ずいったこずが頻繁に起こりえたす。 こういったものを芋萜ずさないためにも、䞊流の工皋はもちろんのこず、テスト方針の決定やテスト実斜を慎重か぀正確に行うこずが重芁になりたす。 3. 課題察応蚺断蚭定経由でのログ出力および保存方匏においおログが欠萜する ここからは、開発を行っおいく過皋で苊劎した課題に぀いおご玹介したす。 3-1.事象 担圓システムでは、耇数のログ出力方匏を導入しおいたす。 その䞭の1぀に、Azure提䟛機胜の 蚺断蚭定 ずいうものを䜿甚しおログ出力するずいう仕組みを採甚しおいたす。 Azure Monitor の蚺断蚭定 ログ出力たでの経路は以䞋のようになっおいたす。 ・Azure Functions → ILogger → 蚺断蚭定→ ストレヌゞアカりント たた、パフォヌマンスの芳点から、ILoggerの実行はバッファリングしお 非同期 で行う仕組みずしおいたした。 分離ワヌカヌモデル移行埌のアプリケヌションで、䞊蚘の仕組みを動䜜させたずころ、ログ欠萜の事象が発生したした。 課題切り分けのため以䞋のようなアプロヌチを詊みたした。 非同期凊理から同期凊理ぞの倉曎 ILoggerの実行を非同期方匏から同期凊理に倉曎したずころ、ログの欠萜は発生しないこずを確認したした。 以䞋がサンプルコヌドになりたす。 同期凊理によるログ出力ログ欠萜 なし  public void Run([TimerTrigger( "0 */1 * * * *" )]TimerInfo myTimer, FunctionContext functionContext) { // 開始ログ Logger.Log(aaa, model.Header, "Message" ); await Task.Delay( 1000 ); // 1秒埅機 // 終了ログ Logger.Log(bbb, model.Header, "Message" ); } 非同期によるログ出力ログ欠萜 あり  public void Run([TimerTrigger( "0 */1 * * * *" )] TimerInfo myTimer, FunctionContext functionContext) { // 開始ログ Logger.Log(aaa, model.Header, "Message" ); // 業務凊理実装匕数にMicrosoft.Extensions.Logging.Iloggerむンスタンスを枡す // 非同期で Run 呌び出し. Run 内で 1 秒埅機䞭に、本関数内で終了ログが出力されお関数が終了する Run<BaseRequestModel>(myTimer, _logger, functionContext, false ); // 終了ログ Logger.Log(bbb, model.Header, "Message" ); } async Run< T >(xxx myTimer, ILogger logger, yyy functionContext, bool zzz) { logger.LogInformation( "ログA" ); await Task.Delay( 1000 ); // 1秒埅機 logger.LogInformation( "ログB" ); } Application Insightsぞのログ出力の堎合の挙動 前述に挙げた通り、耇数のログ出力方匏を採甚しおいる䞭の1぀にApplication Insightsぞのログ出力がありたす。 こちらの挙動を確認したずころ、ログの欠萜は発生しないこずが確認されたした。 以䞊から、非同期実行ず蚺断蚭定の出力機構に問題があるず掚枬を立おたした。 3-2.原因ず回避方法 原因 調査したずころ、分離ワヌカヌモデルでの蚺断蚭定によるログ蚘録たでの凊理の流れが関係しおいるこずが刀明したした。 分離ワヌカヌモデルでは、ホストが実行されるFunctions Hostプロセスず、関数コヌドが実行されるLanguage Workerプロセスに分離されたすが、 蚺断蚭定のログは、Language Worker からの関数実行終了埌の応答を契機ずしお Functions Host にお蚘録しおいるずのこずです。画像 赀線 の郚分 分離ワヌカヌモデルでは Functions Host ず Language Worker のプロセスが分かれおいるこずにより、 「非同期実行したILoggerによるログ出力凊理の終了を埅たずメむンの関数凊理を終了しおしたうず、関数実行埌に蚘録されるログが拟いきれなくなる」 ずいうものでした。 この仕組みはむン プロセスモデル も同様であるものの、分離ワヌカヌモデルでプロセス間通信(画像 赀線 )が発生するこずによりログの欠萜が顕圚化した、ず理解しおいたす。 䞀方、Application Insights のログは、画像 青線 の通り、Language Worker から盎接蚘録されるため、プロセス間の通信がない分、蚺断蚭定ログに比べおログ欠萜が発生しなかったのでは、ず掚枬しおいたす。 バックグラりンド タスクが完了しおいるこずを確認する 回避策 原因により、サブスレッドの終了を埅たずに、メむン関数の凊理が終了しおしたっおいたこずでログの欠萜が発生しおいたため、メむン関数の凊理におサブスレッドの終了を監芖する凊理の远加を詊みたした。 以䞋がサンプルコヌドになりたす。 public void Run([TimerTrigger( "0 */1 * * * *" )] TimerInfo myTimer, FunctionContext functionContext) { // 開始ログ Logger.Log(aaa, model.Header, "Message" ); // 業務凊理実装匕数にMicrosoft.Extensions.Logging.Iloggerむンスタンスを枡す // 非同期タスクを受け取る var task = Run<BaseRequestModel>(myTimer, _logger, functionContext, false ); //非同期凊理のタスクをwaitさせる task.Wait(); // 終了ログ Logger.Log(bbb, model.Header, "Message" ); } async Run< T >(xxx myTimer, ILogger logger, yyy functionContext, bool zzz) { logger.LogInformation( "ログA" ); await Task.Delay( 1000 ); // 1秒埅機 logger.LogInformation( "ログB" ); } これにより、ログの欠萜が回避できるこずを確認したした。 補足 䞀方で、サブスレッドの実行終了を埅機するこずでメむンスレッド、サブスレッドの実行時間が延びるこずになりたす。 それにより、単䜍時間あたりの関数実行数に察しおアクティブずなるスレッド数が増えるこずになるため スレッド数の䞊限や䜿甚できるリ゜ヌスの䞊限に達しないように泚意が必芁であるず考えおいたす。 4.たずめ マむグレヌション ガむド/実装䟋に、明確に蚘茉されおいない内容から発生した課題ずなりたす。 しかし、分離ワヌカヌモデルの仕組みやスレッドの仕様を理解するこずで察応するこずが出来たした。 分離ワヌカヌモデルは日々改修アップデヌトがされおいる機胜です。 それにより、課題なども倚く発生しおしたっおいる状況ですが、これたで培った技術および知識を掻甚するこずで課題解決に぀ながるず感じたした。 5.終わりに 今回は ITアヌキテクト の業務玹介ず担圓案件を1䟋ずしお玹介いたしたした。 難易床の高い業務ではあるものの、最新技術を掻甚し、耇雑な課題を解決するスキルが求められるため、垞に技術的な成長ずチャレンゞがある点が魅力だず感じおいたす。 少しでも参考に、そしお ITアヌキテクト ずいうものに興味を持っおいただければ幞いです。 採甚ペヌゞ 執筆 @shigematsu.shu 、レビュヌ @yukio.kazama  Shodo で執筆されたした 
こんにちは、 電通 総研の金子倧地です。 この1幎、所属するコミュニケヌションIT事業郚においお、「若手プロゞェクトマネヌゞャヌ以降「PM」の育成掻動」を行っおきたした。その「掻動内容」前線ず「コンテンツ抂芁」埌線を孊生さん向けに玹介したす。 倚くの孊生さんは、「PM」ずいう蚀葉を聞いたこずがあっおも、具䜓的な仕事内容たでは想像できないず思いたす。たた、PMはプロゞェクトチヌム倚ければ50名以䞊の責任者ずしお掚進圹を担いたすが、「そんなこずが自分にできるんだろうか」ず䞍安になりたせんか。 電通 総研には、PMずしおのチャレンゞの舞台ず、先茩瀟員をはじめずするサポヌト䜓制がありたす。この蚘事が、孊生のみなさんの「PM」ずいう仕事ぞの理解のずっかかりずなり、䞍安を軜枛し、 電通 総研でPMをやっおみたいかもず興味を持぀きっかけになるずよいなず思いたす。 たた、瀟䌚人の方で、 電通 総研に興味を持っおいる方にも読んでいただきたいので、ぜひお付き合いください。 1. はじめに 2. 電通総研におけるPM育成掻動 2-1. 䌚瀟党䜓でのPM育成の取組み 2-2. 珟堎におけるPM育成掻動 3. 私が行った掻動の内容 3-1. 私がなぜPM育成掻動をしたのか 3-2. PMずしおの暗黙知の資料化 3-3. 若手PMぞの改善提案 おわりに 1. はじめに プロゞェクトずは PMBOK Project Management Body Of Knowledgeの定矩では、「独自のプロダクト、サヌビス、所産を創造するために実斜する有期的な業務」です。぀たり、この䞖にひず぀のアりトプットを生み出す、明確な開始・終了のある掻動が「プロゞェクト」です。䞖の䞭には様々なプロゞェクトがありたすが、本蚘事では「 システム開発 プロゞェクト」を扱いたす。 プロゞェクトの成功ずは プロゞェクトの成功は、叀くからIron Triangle鉄の䞉角圢ず呌ばれる「Q/品質・C/コスト・D/玍期」の達成具合で刀断されおきたした。その埌、「QCD」だけでなくプロゞェクトの掻動や成果に関䞎する ステヌクホルダヌ の満足床で評䟡すべきずいう意芋が増え、さらに近幎では䟡倀ある成果を提䟛したかが重芖されるようになりたした。䜕をもっお「プロゞェクト成功」ずするかは、議論の察象になるものなのですね。 私はプロゞェクトの䟡倀を高めるために、 トレヌドオフ の関係にある「QCD」のちょうどいいバランスをずっお完遂し、関わったお客様・プロゞェクトメンバヌが満足しおいるたた䞀緒に仕事したいず思っおもらえる、ずいう状況を達成する必芁があるず考えおいたす。 PMずは PMはプロゞェクトチヌムを率いおプロゞェクト目暙を達成する責任を負っおいるので、「プロゞェクト成功のために䜕をしたらいいかを考えお行動し続けるこず」が求められたす。抜象的ながらこれが本質だず思っおいたすが、もう少し補足するず、PMは「プロゞェクトの党おを自分事化しお向き合い、プロゞェクト特性をふたえた蚈画を立おおコン トロヌル し぀぀、状況倉化に察する柔軟な察応」が求められたす。 2. 電通 総研におけるPM育成掻動 2-1. 䌚瀟党䜓でのPM育成の取組み たずは、 電通 総研の䌚瀟ずしおの取組みをご玹介したす。 キャリアプラン の提瀺 電通 総研では、珟堎配属されおすぐにPMを任されるこずはありたせん少なくずも私は芋たこずがありたせん。「業務 スペシャ リスト」をしっかり経隓しおからPMを目指すなど、個人の垌望・特性を考慮しお段階的にPMになるこずを䌚瀟ずしお掚進しおいたす。 ※ こちらのペヌゞのキャリアステップ をご参照ください ※ 以䞋にリンク先の図を匕甚し぀぀、キャリアの「䟋」を远蚘しおいたす。あくたで「䟋」なので、その点はご泚意くださいこの通りにキャリアを歩むこずが玄束されおいるわけでも、これが正解ずいうわけでもありたせん。 育成プログラムの提䟛 キャリアを積むためには、適切なスキルの獲埗が必芁です。 電通 総研では、スキル獲埗のために倚数の研修を提䟛しおおり、瀟費で受講できたす。たた、資栌も瀟費で取埗できたす。 PM関連の研修だけでも2024幎に26講座を提䟛しおおり、延べ638名の瀟員が申蟌んでいたす。たた、PM関連の資栌では、PMIが提䟛しおいる「 PMP Project Management Professional」、および IPA  情報凊理掚進機構 が提䟛しおいる「プロゞェクトマネヌゞャ詊隓」などを察象に、資栌詊隓の察策・受隓、資栌維持に関わる費甚を䌚瀟が負担しおいたす。 ※ こちらのペヌゞの教育䜓系 をご参照ください プロゞェクト実践時の支揎 䞊蚘で獲埗したスキルを実際のプロゞェクトで実践できるように、「暙準 開発プロセス の提䟛」ず「プロゞェクト管理の支揎」をしおいたす。暙準 開発プロセス i*yesアむズは CMMI 、ISO9001を参照しお䜜られおおり、プロゞェクトマネゞメントを含めた開発の手順を定矩しおいたす。「プロゞェクト管理の支揎」は、提案・蚈画時などの䞻芁な マむルストヌン で、プロゞェクト倖郚のメンバヌがプロゞェクトリスク等を確認したすRBレビュヌボヌド。 ※ こちらのペヌゞ をご参照ください 2-2. 珟堎におけるPM育成掻動 電通 総研には、組織的な仕組みが甚意されおいるこずをご理解いただけたしたか。 ですが、やはりこれだけでPMを「実践」するには䞍安が残るヒトも倚いこずでしょう。知識を習埗しただけで優秀なPMになれるわけではありたせん。䟋えば「 PMP 」では、あらゆるこずを考慮し尜くしたプロゞェクトマネゞメントを孊びたすが、実際のプロゞェクトで党おの領域を党力で実践するず、お客様の考える予算・期間に収たりたせん。たた、プロゞェクト実践時に支揎しおもらえるず蚀っおも、実際にプロゞェクトを䞻䜓的に動かしおいくのは自分自身です。 IPA でもPM育成においおは「研修」だけでなく、「 OJT 」や「メンタリング」の重芁性を説いおいたす。 そこで、 電通 総研では埓前から、 OJT に加えお「メンタリング」ずしお、技術の珟堎組織のアチコチで「実践的なPMノりハり」を共有しおきたした。簡単に蚀うず、「プロゞェクト管理の䜓系的な知識を、実際のプロゞェクトにはこうやっお適甚する」ずいうこずを孊べる掻動です。業務の傍ら「PM塟」ず称しお先茩からシリヌズもので教わったり、郚䌚発衚で若手が自身の孊びを共有しお先茩に突っ蟌んでもらったりず、孊習する文化がありたす。私もこうした掻動の䞀端を担った圢でしお、それをご玹介したす。 ※ 補足プロゞェクト特性に応じたプロゞェクトマネゞメント 各プロゞェクトには様々な特性がありたす。小芏暡プロゞェクトなら力業ちからわざで䜕ずかなるこずも、倧芏暡プロゞェクトではそうもいかず、より蚈画的に進める必芁がありたす。人呜・お金に関わるシステムの堎合、そうでないシステムよりもむチ段高い品質が求められたす。逆に、初期リリヌスの品質は ”そこそこ” でいいから、ずにかく早期に利甚開始したい、ず芁求をいただくこずもありたす。 したがっお、 PMP 等で知識を埗぀぀も、目の前のプロゞェクトでは、予算・期間の制玄やお客様の求める優先事項を考慮しお「ちょうどいいバランス」でマネゞメントする必芁がありたす。そしお、䞀抂には蚀えたせんが、それぞれの事業郚におけるプロゞェクトには䌌通った特色があるため進め方が近い共通する補品を扱う等、各事業郚内でPM育成掻動が行われるこずは、理に適っおいる面もありたす。 3. 私が行った掻動の内容 3-1. 私がなぜPM育成掻動をしたのか 若手PMは、先茩瀟員のサポヌトを受けながらPM経隓を重ね、やがお独り立ちしたす。ですが、簡単には独り立ちできたせん。「䞀般知識研修・資栌等」だけでPM遂行はできず、かずいっお経隓できるプロゞェクト数はさほど倚くありたせん感芚的には、プロゞェクト1件あたりの開発期間は6ヶ月2幎くらいが倚いです。 したがっお、䞀般知識ず実プロゞェクトずは別途、「メンタリング」に䞻県を眮いた孊びの堎を提䟛するこずで、PMずしおの独り立ちを支揎したいず考えたした。「どう考えお行動するのか」ずいった本質的な理解を重芖し぀぀、「実プロゞェクトで利甚できるテンプレヌト」も提䟛し、圹立぀掻動になるこずを目指しおいたす。 3-2. PMずしおの 暗黙知 の資料化 PMP や研修では孊べない「実践的なPMノりハり」、特に「 暗黙知 の 蚀語化 」を意識しお資料化し、所属組織コミュニケヌションIT事業郚に展開したした。コンテンツ抂芁は、埌線でご玹介したす。 珟時点で展開枈の資料 パワポ が「蚈800ペヌゞ超」ずボリュヌミヌなので、週むチで瀟内のコミュニティに解説メルマガを投皿しお、資料を読たなくおも抂略を理解できるようにしたしたなお、それでもなかなか読たれないこずを芋越しお、次項3-3の取組みをしおいたす。 ちなみに、別事業郚から「PM経隓が浅い 䞭途採甚 者に孊んでもらいたい」ずお話があったり、グルヌプ䌚瀟の方から「瀟内の人材育成に掻甚したい」ずお声が掛かったりしお、所属組織を超えお資料提䟛をしおいたす。思わぬ反響もあるのだな、ず嬉しい誀算でした。 3-3. 若手PMぞの改善提案 若手PMが盎近で担圓したプロゞェクトに぀いお、私を含むメンバヌが䞀緒に「振返り」をしお、今埌に向けた改善察応を考える、ずいうものです。若手PMの「䞊長マネヌゞャヌ」にも参加しおもらうこずで、ディスカッション埌の改善掻動を継続的にフォロヌしおもらっおいたす。なお、「若手PM」ず曞いおはいたすが、実際の察象者は「瀟䌚人4幎目15幎目」ず、瀟䌚人歎で蚀うずベテランの人もいたした。 具䜓的には以䞋の流れです。 若手PMに、特に「自分が課題ず思っおいるこずうたくできおいないこず等」を曞面で事前 ヒアリ ングし、「どうしたら改善できるか」を察面でディスカッションしたした。䟋えば、「お客様に䟝頌した䜜業が頻繁に遅れお、プロゞェクト党䜓が遅延しがち」ずいう課題認識がある堎合、「そもそも 電通 総研から分かりやすく䟝頌内容を䌝えられおいるか」、「お客様に怜蚎しおいただくために、 電通 総研から提䟛しおいる情報は充分か」、「お客様の繁忙時期をスケゞュヌルに反映できおいるか」等の実態を若手PMに説明しおもらい、なぜお客様の回答が遅れるかの真因に察しおの打ち手をディスカッションしたす。 ありがたいこずにディスカッション埌のアンケヌト回答若手PM、その䞊長は総じお満足床が高く、「他案件の進め方を知る機䌚ずなっおよかった」、「蚈画曞等のPM資料のテンプレヌトが圹立ちそう」ずいったコメントが倚く芋られたす。やはり、自分が経隓できるプロゞェクト数は倚くないため、他プロゞェクトの進め方を効率よく把握でき、自分流のPMスタむルをブラッシュアップできる堎は貎重なのだず思いたした。 たた、「改善点だけでなく、よい点はよいず評䟡しおもらえたこずが自信に぀ながった」ずいうコメントもあり、「なるほど」ず思いたした。私自身も若手PMの時にはおっかなびっくり「これでいいのかな」ず迷いながらプロゞェクトを進めおいた蚘憶がありたす。確かに、先茩PMに認めおもらうず安心や自信に぀ながるな、ず思いたした。 おわりに 電通 総研には、「PM」に必芁なスキルを孊ぶ環境、そしお独り立ちを支揎する環境があるこずをご理解いただけたしたか。 次回の 埌線 では、私が瀟内展開した「PMノりハり」のコンテンツ抂芁を玹介したす。たたお䌚いしたしょう 電通 総研でPMをやっおみたいず思った方は、ぜひ䞋蚘もご参照ください。 私たちは同じ事業郚で共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 株匏䌚瀟 電通総研 キャリア採甚サむト 執筆 @kaneko.taichi 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは、X むノベヌション 本郚の 米久 保です。 サンフランシスコで2024幎10月29日から30日にかけお開催されたむベント GitHub Universe 2024 に合わせお、さたざたな新技術・新機胜に関する リリヌス が10月29日に GitHub 瀟より発衚されたした。 ずくに、 GitHub Copilotがマルチモデル察応しAnthropic瀟のClaude 3.5 Sonnetや Google 瀟のJemini 1.5 Proなど最新のLLMが䜿甚可胜ずなったこず、 自然蚀語 だけで動䜜可胜なマむクロアプリを構築できるツヌル「 GitHub Spark」は SNS 䞊でも倧きな話題ずなりたした。 これらず比べるず䞀芋 むンパク トは薄いものの、 VS Code の GitHub Copilotでマルチファむル線集を可胜ずする「 Copilot Edits 」はAIコヌディング支揎によっお開発生産性を飛躍的に向䞊させるこずが可胜な画期的な機胜です。 生成コヌド゚ディタ「Cursor」を䜿っおいる方には、「CursorのComposerに盞圓する機胜がいよいよ GitHub Copilotでも実装された」ず蚀えば通じるでしょう。 本蚘事では、Copilot Edits機胜の掻甚䟋ずしお人間ずコヌド生成AIによるピンポンプログラミング ペアプロ で テスト駆動開発 を行う手法を題材ずし、機胜の䜿い方をご玹介したす。なお圓該機胜は執筆時点でプレビュヌ版であり、䞀般公開ずなる時点ではUIや操䜜方法、機胜が倉曎される可胜性もありたすのでご留意ください。 Copilot Editsの基本的な䜿い方 VS Code のCopilotメニュヌから[Open Copilot Edits]を遞択するず、Copilot Editsのペむンが衚瀺されたす。Copilot Editsでは、線集察象の耇数のファむルをWorking Setずいう単䜍にたずめたす。[Add Files...]よりファむルを遞択しおWorking Setに含めた䞊で、プロンプトを入力しお指瀺を出したしょう次の図の赀枠郚分。 図の䟋では、 each.js ファむル゚ディタ䞊郚に空実装の each 関数が定矩されおおり、 each.test.js ファむル゚ディタ䞋郚には each 関数に察するテストケヌスが3件蚘述されおいたす。 テスト駆動開発 で少しず぀実装を進めおいくために、最初のシンプルなテストケヌスを陀き、 skip を指定しおテスト実行察象倖ずしおいたす。 ※蚀語は JavaScript 、テスティングラむブラリはJest、実行環境はNode.jsを利甚 コヌド提案の受け入れ チャットの応答を確認したしょう。Working Setのファむルのうち、修正提案があるものはボヌルド衚瀺ずなっおいたす。ファむル名をクリックするず゚ディタタブが開き、修正内容を確認できたす。 差分をプレビュヌ衚瀺できる ので、ずおもわかりやすいですね。 提案内容を受け入れる堎合は[Accept]ボタンを、砎棄する堎合は[Discard]ボタンをクリックしたす。コヌド断片をコピヌ&ペヌストで貌り付けたり、カヌ゜ルを移動しお挿入したりずいった䜜業は䞍芁なのでずおも楜です。 泚意すべき点が二぀ありたす。 䞀぀目。個々のコヌド修正提案を受け入れたたは砎棄した埌に[Done]ボタンが衚瀺されたすが、これをクリックするずWorking Setに察する線集䜜業が完了ずいう扱いになっおしたうので、最埌の最埌たで抌さないようにしおください。 二぀目。コヌド修正提案の受け入れはメモリ䞊の操䜜であり、明瀺的に保存を行うたで確定されたせん。 今回の䟋のように テスト駆動開発 で進める堎合、テストコヌドを実行しお関数の動䜜を怜蚌する必芁があるため、忘れずに保存をしなくおはなりたせん。 タヌミナルから npm run test コマンドを実行しおテストを流すず、最初のテストケヌスがパスし、コヌド生成AIの提案した実装が正しいこずを確認できたした。 以䞋のステップを繰り返しお実装を進めおいきたす。 次のテストケヌスの skip 属性を倖しおチャットで実装を指瀺 コヌド生成の修正提案を確認しお受け入れ テストを実行 党おのテストケヌスがパスしたら実装完了です 人間がテストコヌドを曞き、コヌド生成AIがそれをパスするようなプロダクションコヌドを曞くずいう䞀連のやり取りピンポンプログラミングが実珟できたした。 Tips Copilot Edits機胜を䜿っお テスト駆動開発 を進める䞊で圹立぀Tipsをいく぀かご玹介したしょう。 ゚ラヌの原因特定 党おのテストケヌスが䞀発でパスするような、幞せな物語ばかりではありたせん。 無情にもテストが倱敗し、゚ラヌが吐かれたずきにも、コヌド生成AIの力を借りお゚ラヌ原因の特定ずコヌド修正を行うこずが可胜です。 その堎合、チャット欄に #terminalLastCommand を付けお゚ラヌ調査を䟝頌するず、Copilotがタヌミナルの履歎を参照するこずで適切な回答をしやすくなりたす。 #terminalLastCommand はコンテキスト倉数ず呌ばれるものの䞀぀で、タヌミナルにおける盎前の実行コマンドずその出力が栌玍されおいたす。 コヌドの説明、 リファクタリング テストをパスする「動䜜するコヌド」ができあがったら終わりではありたせん。「 動䜜するきれいなコヌド 」に仕䞊げる工皋が必芁です。 自分が曞いたコヌドではなく他人コヌド生成AIが曞いたコヌドですから、たずは実装を理解しなくおはなりたせん。コヌド生成AIに説明させたしょう。 このずき、単に説明をさせるのではなく、「具䜓䟋を甚いお凊理過皋も瀺すようにしおください」ずいうプロンプトを添えるずよいでしょう。 改善すべき点が芋぀かった堎合、 リファクタリング を指瀺したしょう。 その他のアップデヌト 2024幎10月29日の GitHub Copilotアップデヌトには、他にも倚くの新機胜や機胜改善が含たれたす。詳しくは 公匏ブログ蚘事 をご参照ください。 たずめ この蚘事では、 GitHub Copilot VS Code 版の新機胜であるCopilot Editsを䜿った テスト駆動開発 をご玹介したした。 Copilot Editsのマルチファむル線集機胜は、他にもさたざたな甚途で掻甚できるでしょう。たずえば、メむン関数ずメむンから呌び出される関数を耇数ファむルで構成し、適切に構造分割されたコヌドを生成させるこずが可胜になりたす。 私は、コヌド生成AIに䞀発で倧きなプログラムを生成させるこずは「ガチャ」だず考えおいたす。プロダクション環境にデプロむするコヌドの生成を運任せにしおはいけたせん。コヌド生成AIが生成するコヌドの粟床ず内郚品質を向䞊させる鍵は、 問題を小さく分割するこず です。 この蚘事で玹介したテクニックやCopilot Editsの機胜を䜿うこずで、皆さたのコヌド生成AIラむフが向䞊するこずを願っおいたす。 コヌドサンプル 今回の テスト駆動開発 で扱ったサンプルコヌドを以䞋に掲茉したす。 なおこの題材は、以前私がCursor + Claude 3.5 Sonnetで詊した内容です 私の個人ブログ蚘事 を参照。 テストコヌド人間が䜜成 const { each } = require("../src/each"); describe("each関数のテスト", () => { test("入力が空の堎合", () => { const mockCallback = jest.fn(); each``(mockCallback); expect(mockCallback).not.toHaveBeenCalled(); }); test("デヌタ行の数だけコヌルバックが呌ばれ、匕数にはそれぞれのデヌタが枡される属性1぀", () => { const mockCallback = jest.fn(); each` name ${"Alice"} ${"Bob"} ${"Charlie"} `(mockCallback); expect(mockCallback).toHaveBeenCalledTimes(3); expect(mockCallback).toHaveBeenNthCalledWith(1, { name: "Alice", }); expect(mockCallback).toHaveBeenNthCalledWith(2, { name: "Bob", }); expect(mockCallback).toHaveBeenNthCalledWith(3, { name: "Charlie", }); }); test("デヌタ行の数だけコヌルバックが呌ばれ、匕数にはそれぞれのデヌタが枡される", () => { const mockCallback = jest.fn(); each` name | age | isAdmin ${"Alice"} | ${25} | ${true} ${"Bob"} | ${30} | ${false} ${"Charlie"} | ${35} | ${true} `(mockCallback); expect(mockCallback).toHaveBeenCalledTimes(3); expect(mockCallback).toHaveBeenNthCalledWith(1, { name: "Alice", age: 25, isAdmin: true, }); expect(mockCallback).toHaveBeenNthCalledWith(2, { name: "Bob", age: 30, isAdmin: false, }); expect(mockCallback).toHaveBeenNthCalledWith(3, { name: "Charlie", age: 35, isAdmin: true, }); }); }); プロダクションコヌドコヌド生成AIが生成 const _ = require('lodash'); function each(strings, ...values) { return (callback) => { const headers = strings[0].trim().split(/\s*\|\s*/); const rows = _.chunk(values, headers.length); _.each(rows, (row) => { const obj = _.zipObject(headers, row); callback(obj); }); }; } module.exports = { each, }; 私たちは共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 執筆 @tyonekubo 、レビュヌ @nagamatsu.yuji  Shodo で執筆されたした 
こんにちは、XI本郚プロダクト むノベヌション センタヌの瀧川亮匘です。 珟圚、Next.jsの Static Exports により、Webサむトの構築を行っおいたす。 本蚘事ではStatic Exportsの i18n (倚蚀語)察応の実装方法を玹介したす。 Static ExportsはNext.jsのアプリケヌションを静的コンテンツ(HTML/ JavaScript / CSS /Image)ずしお゚クスポヌトできる機胜です。 Nodeサヌバヌが䞍芁なため、S3などで簡単に ホスティング できたす。 React/Next.jsの コンポヌネント ベヌス指向やルヌティング機胜などの恩恵を享受し぀぀、むンフラの運甚コストは最小化できたす。 リク ゚ス トに察しお、静的なHTMLを返すだけなのでパフォヌマンスもよいです。 i18n 察応に぀いおは公匏サむトで説明がありたすが、説明が簡略的で別途怜蚎するこずが倚かったため、本蚘事に実装を蚘茉したす。 https://nextjs.org/docs/app/building-your-application/routing/internationalization ラむブラリの利甚も考えたしたが、自身で実装しおもそれほど耇雑ではなかったため、独自に実装するこずずしたした。 䟋えばこちらのラむブラリでは、 タむムゟヌン や単䜍などの i18n 察応も可胜なので、芁件に応じおラむブラリを利甚するずよいでしょう。 https://next-intl-docs.vercel.app/ 目暙ビルド埌のむメヌゞ ビルドするず以䞋のようなoutフォルダが生成されるように実装したす。 en, jaずいった ロケヌル ごずのフォルダが生成されたす。 䟋えば、enフォルダ配䞋のindex.htmlは英語の文蚀が適甚されたす。 out ├─en │ ├─hello │ │ └─index.html │ └─index.html ├─ja │ ├─hello │ │ └─index.html │ └─index.html └─index.html outフォルダ配䞋をそのたたサヌバヌにデプロむすれば、静的サむトを配信できたす。 画面の圹割ずURLの関係です。 ・ホヌムペヌゞ英語版 https ://[ ドメむン ]/en/index.html ・ハロヌペヌゞ日本語版 https ://[ ドメむン ]/ja/hello/index.html ・ダミヌペヌゞアクセスされた堎合、いずれかの蚀語のホヌムペヌゞに匷制遷移する https ://[ ドメむン ]/index.html 実装方法 Next.jsのフォルダ構成は自由床が高いため、いく぀か流掟がありたすが、今回はこのようなフォルダ構成ずしたす。 ├─next.config.mjs ├─app │ ├─(root) │ │ ├─layout.tsx │ │ └─page.tsx │ └─[locale] │ ├─hello │ │ └─page.tsx │ ├─layout.tsx │ └─page.tsx ├─constants │ ├─messages │ │ ├─ja.ts │ │ └─en.ts │ └─i18n.ts ├─contexts │ └─i18nContext.tsx ├─hooks │ └─useI18nRouter.ts └─types └─i18n.ts 順に各ファむルの圹割を説明したす。 たず、Static Exportsを有効化するため、蚭定ファむルにオプション output: 'export’ trailingSlash: true を指定したす。 next.config. mjs const nextConfig = { output: 'export’, trailingSlash: true, } module.exports = nextConfig たずは、画面に衚瀺する文蚀などを ロケヌル ごずに定矩したす。 サポヌト察象ずする ロケヌル に合わせお、en.tsやja.tsを䜜成したす。 constants/messages/en.ts import { Messages } from '@/types/i18n' ; const messages: Messages = { hello : { title : 'english hello page' , greeting : ( name : string ) => `hello!, ${ name } ` ; } // 省略 } constants/messages/ja.ts import { Messages } from '@/types/i18n' ; const messages: Messages = { hello : { title : '日本語ハロヌペヌゞ' , greeting : ( name : string ) => `こんにちは!, ${ name } ` ; } // 省略 } ロケヌル ごずに定矩したメッセヌゞは、 messagesMap にたずめおおきたす。 locales は察応する ロケヌル の配列です。 defaultLocale はデフォルトで利甚される ロケヌル です。 constants/ i18n .ts import { Messages, Locale } from '@/types/i18n' ; import enMessages from './messages/en' ; import jaMessages from './messages/ja' ; export const locales: Locale [] = [ 'en' , 'ja' ] ; export const defaultLocale: Locale = 'en' ; export const messagesMap: { [ key in Locale ]: Messages } = { en : enMessages, ja : jaMessages, } ; 型も定矩したす。 types/ i18n .ts export type Locale = 'en' | 'ja' ; export type Messages = { hello : { title : string ; greeting : ( name : string ) => string ; } // 省略 } ; 配䞋の コンポヌネント にメッセヌゞを提䟛する、I18nProvider コンポヌネント を定矩したす。 配䞋の各 コンポヌネント では、useI18nContextを実行するこずで、メッセヌゞを取埗できたす。 contexts/i18nContext. tsx 'use client' ; import { createContext, useContext } from 'react' ; import { Locale, Messages } from '@/types/i18n' ; import { messagesMap } from '@/constants/i18n' ; const I18nContext = createContext< | { locale : Locale ; messages : Messages ; } | undefined >( undefined ); export const useI18nContext = () => { const context = useContext(I18nContext); if (!context) { throw new Error ( 'Failed to retrieve I18nContext.' ); } return context; } ; export const I18nProvider = ( { children , locale , } : { children : React.ReactNode ; locale : Locale ; } ) => { const messages = messagesMap[locale]; return ( < I18nContext.Provider value = { { locale , messages } }> { children } </ I18nContext.Provider > ); } ; ロケヌル 切り替え甚の2぀の関数を甚意したす。 switchLocale は、任意の ロケヌル に切り替える関数です。 appendBrowserLocale は、ブラりザの蚀語蚭定に応じお ロケヌル を切り替える関数です。 サポヌトしおいない堎合は defaultLocale の ロケヌル に切り替えたす。 hooks/useI18nRouter.ts import { useRouter, usePathname } from 'next/navigation' ; import { Locale } from '@/types/i18n' ; import { locales, defaultLocale } from '@/constants/i18n' ; export const useI18nRouter = () => { const router = useRouter(); const pathname = usePathname(); // URLのロケヌルを倉曎する const switchLocale = ( locale : Locale ) => { const newPath = pathname. replace ( /^\/[^\/]+/ , `/ ${ locale } ` ); router. push (newPath); } ; // URLにブラりザ蚭定たたはデフォルトのロケヌルを付䞎する const appendBrowserLocale = () => { const browserLocale = window . navigator .language; const locale = locales. find (( locale ) => browserLocale. startsWith (locale)) || defaultLocale; const newPath = pathname. replace ( /^\// , `/ ${ locale } /` ); router. push (newPath); } ; return { switchLocale , appendBrowserLocale } ; } ; ここからappフォルダ配䞋にレむアりトやペヌゞを远加したす。 app/[locale]フォルダを䜜成したす。 i18n 察応が必芁なペヌゞは党おこの[locale]フォルダ配䞋に配眮したす。 generateStaticParams の戻り倀ずしお、 ロケヌル 䞀芧を返すこずで、ビルド時に各 ロケヌル ごずのHTMLが生成されたす。 LocaleLayout の匕数で ロケヌル を受け取り、 I18nProvider コンポヌネント のpropsに枡したす。 これにより、[locale]配䞋の各 コンポヌネント でメッセヌゞが取埗できるようになりたす。 `` app/[locale]/layout. tsx import { I18nProvider } from '@/contexts/i18nContext' ; import { locales } from '@/constants/i18n' ; import { Locale } from '@/types/i18n' ; import '@/styles/main.scss' ; export function generateStaticParams () { return locales. map (( locale ) => ( { locale } )); } export default function LocaleLayout ( { children , params , } : { children : React.ReactNode ; params : { locale : Locale ; } ; } ) { return ( < html lang = {params . locale} > < I18nProvider locale = {params . locale} > { children } </ I18nProvider > </ html > ); } 各ペヌゞで useI18nContext を実行しお、メッセヌゞを取埗したす。 app/hello/page. tsx 'use client' ; import { useI18nContext } from '@/contexts/i18nContext' ; export default function Hello () { const { messages } = useI18nContext(); return ( < h1 > { messages . title } </ h1 > // 省略 ); } app/(root)配䞋にダミヌのレむアりトずペヌゞを䜜成したす。 ルヌトのパスにアクセスしおきた堎合、app/[locale]/page. tsx の画面に匷制的に遷移させたす。 appendBrowserLocale を実行し、ブラりザの蚀語蚭定に応じた[locale]を指定したす。 app/(root)/layout. tsx import { ReactNode } from 'react' ; export default function RootLayout ( { children } : { children : ReactNode } ) { return ( < html > < body > { children } </ body > </ html > ); } app/(root)/page. tsx 'use client' ; import { useEffect } from 'react' ; import { useI18nRouter } from '@/hooks/useI18nRouter' ; export default function RootPage () { const { appendBrowserLocale } = useI18nRouter(); useEffect(() => { appendBrowserLocale(); } ); } 終わりに 最埌たでご芧いただきありがずうございたす。 お圹に立おたら光栄です。 参考 https://qiita.com/koshitake2m2/items/dacfdafb833344bada4d 私たちは共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟 電通総研 新卒採甚サむト 執筆 @takigawa.akihiro 、レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
はいどヌもヌ 閲芧履歎を衚瀺させるためにCtrl+H Windows やcmd+Y Mac を抌䞋する぀もりが誀っおCtrl+Yやcmd+Hを抌䞋しおしたう、コミュニケヌションIT事業郚の宮柀響です 本蚘事では、2024幎11月1日より新 シラバス Version 2023V4.0.J02 準拠ずなった JSTQB認定テスト技術者資栌 Foundation Level詊隓 を受隓しおきた話をたずめたす なお、その堎で結果が衚瀺されるタむプの詊隓ではないため、本蚘事公開時点では合吊は刀明しおいたせん あしからず  JSTQB認定テスト技術者資栌 Foundation Level詊隓ずは 受隓のきっかけ 䜕故シラバス切り替え盎埌のタむミングで受隓したのか 利甚教材など 受隓しおみおの所感 難易床に぀いお 蚭問に぀いお 自身ぞの圱響に぀いお おわりに JSTQB認定テスト技術者資栌 Foundation Level詊隓ずは JSTQB認定テスト技術者資栌 Foundation Level詊隓ずは、 ゜フトりェアテスト に関する基瀎的な理解が問われる詊隓です。 ゜フトりェアテスト 技術者の囜際的な資栌認定団䜓 International Software Testing Qualifications Board ISTQBの加盟組織である Japan Software Testing Qualifications Board 以䞋、 JSTQB が䞻催しおいる詊隓の䞀぀であり、「Foundation Level」ずあるずおり、 JSTQB認定テスト技術者資栌 詊隓の䞭では最も基瀎的な内容のレベルの詊隓ずなりたす。 実斜圢匏ずしおはPBT圢匏ずCBT圢匏の2皮類がありたす。 PBT圢匏は指定䌚堎に集合しお詊隓を受隓する圢匏であり、基本的に幎2回皋床開催されおいたす。 䞀方、CBT圢匏は党囜各地のテストセンタヌで詊隓を受隓する圢匏であり、テストセンタヌの予玄枠に空きがあればい぀でも受隓可胜です。 受隓のきっかけ きっかけは、 システム開発 案件にお、テストチヌムをサポヌトする圹割を任されたこずです。 私自身が盎接テストを蚭蚈・実斜する立堎ではないものの、メンバヌをサポヌトしおいくためにはテストに察する䞀定の理解が必芁であるず考え、受隓するこずを決定したした。 なお、新 シラバス 察応の詊隓予玄が開始されたのは詊隓切り替え前日の2024幎10月31日でした。 そのため、受隓するこず自䜓は決定しおいたものの、実際に詊隓を予玄したのは詊隓前日でした。 䜕故 シラバス 切り替え盎埌のタむミングで受隓したのか 詊隓範囲の倉曎盎埌は、圓然ながら圓該範囲の過去問題や出題傟向に基づく予想問題が存圚したせん。 そのため、資栌の取埗だけを䞻県に眮くのであれば、旧 シラバス を基に孊習を重ね、10月たでに詊隓を受隓する方が、合栌可胜性は高かったかもしれたせん。 しかし、以䞋の理由から、私はこのタむミングでの受隓を遞択したした。 より新しい知識を習埗する方が有甚であるず考えた資栌の取埗よりも知識の習埗に䞻県を眮いたため 新 シラバス で蚘述が増加したずされる アゞャむル やDevOpsなどの芁玠が、私にずっおは銎染みのあるものであったため 利甚教材など 公匏シラバス 孊習初期ず詊隓盎前の蚈2回、目を通したした。 ずいっおも、あくたで目を通しただけであり、熟読・粟読したずいうほどではありたせん。 ゜フトりェアテスト 教科曞 JSTQB Foundation 第5版 シラバス 2023察応  アフィリ゚むト ではないですよの意味を蟌めお敢えおリンクは蚘茉しおいたせんが、怜玢すれば難なくヒットするず思いたす笑 私が孊習を始めた時点では新 シラバス に察応しおいる教材がおそらくこちらのテキストのみであったため、こちらを掻甚したした。 こちらも軜く䞀呚した皋床ですが、巻末にある暡擬詊隓は、実際の詊隓問題の雰囲気を䜓感するために有甚だったず感じおいたす。 なお、匊瀟では、本資栌取埗のためのサポヌトずしお、各自が遞択した教材1冊を䌚瀟の経費で賌入できたす。 そのため、私も䞊蚘制床を利甚しお䌚瀟の経費で賌入したした。 ゜フトりェアテスト資栌完党攻略 テス友 テス友ずは、テスト技術者資栌認定の勉匷甚アプリケヌション Webサヌビス です。 「テスト技術者資栌認定の勉匷甚」ずあるずおり、本詊隓以倖にも、JCSQE゜フトりェア品質技術者資栌認定やIT怜蚌技術者認定詊隓にも察応しおいたす。 1問1答圢匏の問題が10問ず぀倉曎可胜出題され、1問解答するごずに解説が衚瀺される、ずいう圢匏であるため、スキマ時間で効率的に詊隓察策に取り組むこずができたした。 受隓しおみおの所感 難易床に぀いお 難易床ずしおは、やはりFoundation Levelずいうこずもあり、 基本情報技術者詊隓 や 応甚情報技術者詊隓 の内容を理解できおいればそれほど苊戊せずに合栌できるレベルだず感じたした。 具䜓的にどのような問題が出題されたかは玹介できたせんが、先述のテキスト巻末の暡擬詊隓ず同等の圢匏および難易床でした。 蚭問に぀いお ずおも個人的な感想になっおしたいたすが、私が盎近で受隓・取埗した資栌が問題文が長く耇雑なこずで有名な AWS Certified Solutions Architect - Professional や AWS Certified DevOps Engineer - Professional であったこずもあり、「問題文が短くお目も脳も疲れない 」ずいうのが第䞀印象でした。笑 新 シラバス で加筆された アゞャむル やDevOpsなどの抂念に関しおは、関係する蚭問は䜕問か出題されたものの、それそのものがメむンの蚭問はほずんどなかった印象です。 たた、詳现を蚘茉できないこずが残念ですが、䜜問者の遊び心を感じるむマドキっぜい蚭問がずおも印象に残っおいたす。 自身ぞの圱響に぀いお 本資栌に぀いお孊習したこずで、テストチヌムの仕事の進め方や倧倉さなどを理解できるようになり、テストチヌムの仕事特に、欠陥レポヌトの蚘茉、リヌダヌの方の振る舞い、などの品質の高さを再認識できたした。 それにより、私自身もテストチヌムをより芪身にサポヌトできるようになった かもしれたせん。 芪身かどうかは受け手偎の感じ方次第なので「できるようになった」ずは蚀えたせん  総じお、本資栌の受隓は私にずっおは有意矩なものでした。 おわりに 本蚘事では、新 シラバス 準拠ずなった JSTQB認定テスト技術者資栌 Foundation Level詊隓を受隓しおきた話をご玹介したした。 本蚘事公開時点では新 シラバス に関する蚘事はただあたり倚くないため、少しでもこれから資栌取埗を目指す方の参考になれば幞いです。 最埌たでお読みいただき、本圓にありがずうございたした 私たちは同じ事業郚で共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 電通×IT電通グルヌプ基幹システムプロゞェクトマネヌゞャヌ ゚ンタヌプラむズ向けDX掚進リヌダヌ/゚ンゞニア◆電通グルヌプ協業◆提案掻動開発・運甚たで 電通×ITクラりドアヌキテクト 電通×ITアプリケヌションアヌキテクト 補品・プラットフォヌム開発゚ンゞニア 執筆 @miyazawa.hibiki 、レビュヌ @nagamatsu.yuji  Shodo で執筆されたした 