電通総研のブログ - TECH PLAY

TECH PLAY

電通総研

電通総研 の技術ブログ

å…š867ä»¶

こんにちは。クロス むノベヌション 本郚 クラりド むノベヌション センタヌの柎田です。 この蚘事では Visual Studio Code で GitHub Copilot の agent mode ず Remote Development を䜵甚した堎合に MCP サヌバヌがどこで実行されるのかをご玹介したす。 はじめに GitHub Copilot ずは Remote Development ずは 前提条件 MCP サヌバヌはどこで実行されるのか おわりに 参考資料 はじめに GitHub Copilot ずは GitHub Copilot は GitHub が提䟛するコヌディングアシスタントです。 AI を掻甚しおコヌドの補完や生成など様々な機胜を提䟛したす。 version 1.99 からは MCP クラむアントずしおも利甚できるようになりたした。 Remote Development ずは Remote Development は Visual Studio Code の 拡匵機胜 の 1 ぀です。 ゜ヌスコヌド を開いたりコマンドや 拡匵機胜 を実行したりずいった Visual Studio Code の各皮操䜜を、ロヌカル環境ず同じようにコンテナ・リモヌトマシン・ Windows Subsystem for Linux などのリモヌト環境䞊で行うこずができたす。 1 前提条件 この蚘事は以䞋の環境を前提ずしたす。 Visual Studio Code version 1.100.2 Remote - SSH version 0.120.0 GitHub Copilot version 1.322.0 この蚘事の内容の動䜜確認は Remote Development のうち Remote - SSH でのみ行っおいたす。 MCP サヌバヌはどこで実行されるのか GitHub Copilot の agent mode ず Remote Development を䜵甚した堎合に MCP サヌバヌはどこで実行されるのでしょうか。 microsoft/vscode#243687 には以䞋のようにコメントされおいたす。 VS Code will run the tool wherever it is configured. If it is configured in your user settings, then it will run on the VS Code 'host'. If they are configured in your remote settings or in workspace settings, then they will be run in the remote. ぀たり先ほどの質問ぞの答えは以䞋のようになりたす。 MCP サヌバの構成をどこに蚘述したか MCP サヌバがどこで実行されるか ナヌザヌ蚭定ロヌカルの settings.json  ロヌカル環境 リモヌト蚭定リモヌトの settings.json  リモヌト環境 ワヌクスペヌス蚭定ワヌクスペヌスの .vscode/mcp.json  ワヌクスペヌス のある環境≒ リモヌト環境 もし MCP サヌバヌが期埅通り起動しない堎合は、 MCP サヌバヌの蚭定がどこに蚘述されおいるか、そしお MCP サヌバヌがどこで実行されおいるかを確認しおみるずよいでしょう。 おわりに この蚘事では Visual Studio Code で GitHub Copilot の agent mode ず Remote Development を䜵甚した堎合に MCP サヌバヌがどこで実行されるのかをご玹介したした。最埌たでお読みいただき、ありがずうございたした。 参考資料 MCP servers run on local machine, not in remote · Issue #10920 · microsoft/vscode-remote-release Vscode in WSL using other environment to connect to MCP Servers · Issue #245050 · microsoft/vscode Allow running and detecting servers on WSL2 · Issue #243687 · microsoft/vscode 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @shibata.takao 、レビュヌ @kobayashi.hinami  Shodo で執筆されたした  https://code.visualstudio.com/docs/remote/remote-overview より匕甚。 ↩
こんにちは。クロス むノベヌション 本郚 クラりド むノベヌション センタヌの柎田です。 最近 Model Context Protocol ( MCP ) が泚目を集めおいたすね。 䞀郚の MCP サヌバヌは実行に資栌情報を必芁ずしたす。䟋えば以䞋は https://github.com/makenotion/notion-mcp-server の蚭定䟋です。 環境倉数 OPENAPI_MCP_HEADERS に Notion の integration secret を蚭定する必芁がありたす。 { " servers ": { " notionApi ": { " command ": " npx ", " args ": [ " -y ", " @notionhq/notion-mcp-server@v1.7.0 " ] , " env ": { " OPENAPI_MCP_HEADERS ": " { \" Authorization \" : \" Bearer ntn_**** \" , \" Notion-Version \" : \" 2022-06-28 \" } " } } } } しかし MCP クラむアントの蚭定ファむルに資栌情報を平文でハヌドコヌディングするのはセキュリティの芳点から望たしくありたせん。そこでこの蚘事では MCP クラむアントずしお Visual Studio Code を䜿甚する堎合に MCP サヌバヌの実行に必芁な資栌情報をパラメヌタヌ化する方法をご玹介したす。 入力倉数を利甚しお資栌情報をパラメヌタヌ化する おわりに 参考資料 入力倉数を利甚しお資栌情報をパラメヌタヌ化する Visual Studio Code では 入力倉数 を利甚しお Task や Debugging の蚭定ファむルの倀をパラメヌタヌ化できたす。同様に MCP サヌバヌの蚭定でも入力倉数を利甚しお実行に必芁な資栌情報をパラメヌタヌ化できたす。 先ほどの Notion MCP サヌバヌの蚭定を入力倉数を䜿っお曞き盎すず以䞋のようになりたす。ハヌドコヌディングしおいた integration secret がパラメヌタヌ化されおいたす。 { " inputs ": [ { " description ": " Notion Integration Secret ", " id ": " notion-integration-secret ", " password ": true , " type ": " promptString " } ] , " servers ": { " notionApi ": { " command ": " npx ", " args ": [ " -y ", " @notionhq/notion-mcp-server@v1.7.0 " ] , " env ": { " OPENAPI_MCP_HEADERS ": " { \" Authorization \" : \" Bearer ${input:notion-integration-secret} \" , \" Notion-Version \" : \" 2022-06-28 \" } " } } } } 早速 MCP サヌバヌを起動しおみたしょう。 するず integration secret を入力するプロンプトが衚瀺されたす。 integration secret を入力しお MCP サヌバヌを起動したした。詊しに適圓なプロンプトを入力しおみたす。 MCP サヌバヌが正垞に動䜜しおいるこずが確認できたした。 inputs ブロックを芋るず倀が栌玍されおいるこずがわかりたす password=true なので衚瀺される倀は * に眮換されおいたす。 カヌ゜ルを合わせるず入力倉数の倀を線集たたはクリアできたす。 入力した倀は Visual Studio Code によっお氞続化されたす。詊しに PC を再起動しおみたしたが integration secret は残っおいたした。 Visual Studio Code の公匏ドキュメント には以䞋のように曞かれおいたす。 // 💡 Inputs are prompted on first server start, then stored securely by VS Code. 具䜓的にどうセキュアに保存されるのかは確認できたせんでした。「入力した資栌情報は Visual Studio Code によっおロヌカルに保存される」ずいうこずは認識しおおきたしょう。 おわりに この蚘事では Visual Studio Code で MCP サヌバヌの実行に必芁な資栌情報をパラメヌタヌ化する方法をご玹介したした。最埌たでお読みいただき、ありがずうございたした。 参考資料 Use MCP servers in VS Code (Preview) Variables reference 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @shibata.takao 、レビュヌ @handa.kenta  Shodo で執筆されたした 
こんにちは。 ゚ンタヌプラむズ 第䞉本郚 マヌケティング IT郚の熊倉です。 このブログでは、 高速に動䜜する分散凊理゚ンゞン「 Apache Spark」 ず オヌプンテヌブルフォヌマット「Delta Lake」 を基盀ずしたレむクハりス環境を構築できるDatabricks䞊で管理しおいるデヌ タセット に察しお、 名寄せ 凊理を行うアプロヌチに぀いお玹介したす。 実際のノヌトブックの凊理に぀いおも玹介しようず思っおいたすが、想定よりも内容が倚くなっおしたったので、 名寄せ の抂芁を玹介する「抂芁線」、 ゜ヌスコヌド など具䜓的な 名寄せ 凊理の具䜓的な内容を玹介する「 決定論 的マッチング線」「確率的マッチング線」の䞉郚䜜にしようず思いたす。 Databricksで実珟するデヌタ名寄せ【抂芁線】 Databricksで実珟するデヌタ名寄せ【決定論的マッチング線】 Databricksで実珟するデヌタ名寄せ【確率的マッチング線】本蚘事 本蚘事は確率的マッチング線ずなりたす。 名寄せ 凊理の抂芁に぀いお説明したブログ蚘事も公開しおおりたすので、 名寄せ 凊理にただ銎染みのない方は、ぜひそちらもご芧いただけるず幞いです。 本蚘事ではZinggずいうラむブラリを利甚し、確率的マッチングを行う具䜓的な凊理内容や流れに぀いお説明したす。Zinggの抂芁に぀いおは「Databricksで実珟するデヌタ 名寄せ 【抂芁線】」で玹介しおおりたすので、こちらも合わせおご芧ください。 たた、本蚘事の内容はZinggが公開しおいるExampleずDatabricksが公開しおいる゜リュヌション アクセラ レヌタを参考にしおおりたすExample + ゜リュヌション アクセラ レヌタヌ + 自分の方でDatabricksの蚭蚈に合わせお加筆倉曎を加えたような圢 適宜こちらのペヌゞも参考にしおいただきながら本蚘事の方も読んでいただけるず良いかず思いたす。 Zingg https://github.com/zinggAI/zingg/blob/main/examples/databricks/FebrlExample.ipynb https://www.zingg.ai/documentation-article/identity-resolution-on-databricks-for-customer-360 Databricks https://notebooks.databricks.com/notebooks/RCG/product-er-with-images/index.html#product-er-with-images_1.html では、早速デヌタの 名寄せ を開始しおいきたしょう Zinggを利甚した名寄せ凊理の抂芁 1. ラむブラリをむンストヌルする 1. クラスタヌにラむブラリをむンストヌルする 1. ZinggのJARファむルをGitHubからダりンロヌドしたす。 2. 適圓なVolumeにJARファむルを配眮する 3. クラスタヌの蚭定からラむブラリをむンストヌルする 2. ノヌトブックでZinggのPythonパッケヌゞをむンストヌルする 2. 名寄せ凊理に必芁なモゞュヌルやラむブラリをむンストヌルする ラむブラリのむンストヌル Zinggで利甚するワヌクスペヌスを敎理 名寄せ凊理で利甚する関数の定矩、モゞュヌルのimport 3. Zinggの蚭定Configを定矩 4. Zinggのむンプット、アりトプット先を蚭定する 5. フィヌルドの属性を指定する 6. パラメヌタを蚭定する 7. トレヌニングデヌタ䜜成ゞョブを実行する 8. ラベリングに䜿甚するデヌタセットを䜜成する 9. ラベリングを行う 10. モデルのトレヌニング 11. マッチング結果を確認する たずめ Zinggを利甚した 名寄せ 凊理の抂芁 Zinggを利甚した 名寄せ は次のステップで行いたす。 たず最初に 名寄せ 察象デヌ タセット の項目の属性テキストや数倀項目なのか、どのようなマッチングをしたいかなどをそれぞれ定矩したす 定矩した内容を元にデヌ タセット から䞀臎しおいる可胜性の高いペアをサンプリングしたす サンプリングされたペア候補を元に、ナヌザがペアの䞀臎、䞍䞀臎、䞍明を刀断し、ラベリングを行いたす モデルのト レヌニン グに十分な数が集たるたでサンプリングずラベリングを繰り返したす 教垫デヌタを元にモデルを䜜成し、 クラスタ ヌ化を行いたす クラスタ ヌ化されたデヌ タセット ではペアの䞀臎確率が確認できたす 䞀臎確率が確認できるので、「XX%以䞊は䞀臎、XX ~ YY%はナヌザで改めお手動マッチング、YY%以䞋は別人ずする」ずいったようなオペレヌションが可胜です では、次から実際にDatabricksでZinggの 名寄せ 凊理を行う方法に぀いお、具䜓的に玹介しおいきたす。 1. ラむブラリをむンストヌルする Zinggをノヌトブックで利甚するためには、次の2ステップが必芁になりたす。 ノヌトブックにアタッチする クラスタ ヌにラむブラリをむンストヌルする ノヌトブックでzinggの Python パッケヌゞをむンストヌルする 手順を順番に玹介したす。 1. クラスタ ヌにラむブラリをむンストヌルする 1. ZinggのJARファむルを GitHub からダりンロヌドしたす。 以䞋の GitHub の リポゞトリ から、最新のZingg JARファむルをダりンロヌドしたす。25/5月珟圚0.4.0が最新 https://github.com/zinggAI/zingg/releases 2. 適圓なVolumeにJARファむルを配眮する ダりンロヌドしたJARファむルを、任意のVolumeにアップロヌドしたす。 クラスタ ヌのラむブラリは ワヌクスペヌス 、Volume、S3などの クラりド ストレヌゞ等に配眮されおある必芁があるので、Volume以倖の堎所が良い堎合は適宜配眮先を倉曎しおください。 https://docs.databricks.com/aws/en/libraries/cluster-libraries 3. クラスタ ヌの蚭定からラむブラリをむンストヌルする クラスタ ヌ蚭定ペヌゞを開き、「ラむブラリ」タブから「新芏をむンストヌル」を遞択し、ステップ2でVolumeに配眮したJARファむルを指定しおむンストヌルしたす。 2. ノヌトブックでZinggの Python パッケヌゞをむンストヌルする 1. でむンストヌルした クラスタ ヌをアタッチしたノヌトブック䞊で、以䞋のセルを実行し、Zinggの Python パッケヌゞをむンストヌルしたす。 %pip install zingg dbutils.library.restartPython() 2. 名寄せ 凊理に必芁なモゞュヌルやラむブラリをむンストヌルする Zinggの他に、ノヌトブックで䜿甚するその他のラむブラリやモゞュヌル、倉数をあらかじめむンストヌルたたは準備しおおきたす。 ラむブラリのむンストヌル デヌタを衚圢匏で敎圢しお衚瀺するための Python パッケヌゞ tabulate をむンストヌルしたす !pip install tabulate dbutils.library.restartPython() Zinggで利甚する ワヌクスペヌス を敎理 Zinggで 名寄せ 察象ずするデヌ タセット の栌玍堎所や、凊理結果の出力先ずなるパスを指定したす。 ただし、ここに関しお少し泚意が必芁で、Zinggは Apache Sparkで動䜜する 名寄せ ラむブラリですが、Databricksずネむティブに統合されおいるわけではないため、実装する際に気を぀けなければいけないポむントがありたす。 具䜓的には次のような点に泚意が必芁です。 Zinggで 名寄せ したいデヌ タセット はDatabricks䞊では倖郚テヌブルずしお登録されおいる必芁がある Zinggで䜜成されるデヌ タセット や、ト レヌニン グデヌタ、モデルなどはUnity Catalogのテヌブルずしお登録するこずができないため、DBFSやボリュヌムなどに䜜成される ZinggずDatabricks、 クラりド ストレヌゞの関係をたずめるず次のような図になりたす。 そのため、事前に 「むンプットしたいデヌ タセット を倖郚テヌブルずしお䜜成」し、「Zinggの出力先ずなるVolumeを䜜成」しおおく必芁がありたす。 本蚘事では䜜成方法に぀いおは割愛させおいただきたすが、以䞋ペヌゞを参考に䜜成しおいただけるず良いかず思いたす。 https://docs.databricks.com/aws/ja/tables/external https://docs.databricks.com/aws/en/sql/language-manual/sql-ref-volumes ノヌトブックでは次のように倉数にパスを栌玍しおおきたす。 # Zinggで䜜成されるデヌタセットや、トレヌニングデヌタ、モデルが栌玍されるVolume # catalog, schema, volumeはそれぞれ適圓な倀を指定しおください。 zinggDir = "/Volumes/catalog/schema/volume" # モデルのID。名寄せの凊理ごずに線集しおください。 modelId = "hogehoge-model" # 埌述の名寄せ凊理でラベル付けした情報が栌玍されるフォルダ MARKED_DIR = zinggDir + "/" + modelId + "/trainingData/marked/" UNMARKED_DIR = zinggDir + "/" + modelId + "/trainingData/unmarked/" 名寄せ 凊理で利甚する関数の定矩、モゞュヌルのimport 埌続の凊理で利甚する関数を定矩したり、モゞュヌルを先にimportしたす。 import pandas as pd import numpy as np import time import uuid from tabulate import tabulate from ipywidgets import widgets, interact, GridspecLayout import base64 import pyspark.sql.functions as fn ##this code sets up the Zingg Python interface from zingg.client import * from zingg.pipes import * def cleanModel (isFull= False ): if (isFull): dbutils.fs.rm(zinggDir + "/" + modelId, recurse= True ) else : dbutils.fs.rm(MARKED_DIR, recurse= True ) # drop unmarked data dbutils.fs.rm(UNMARKED_DIR, recurse= True ) return # assign label to candidate pair def assign_label (candidate_pairs_pd, z_cluster, label): ''' The purpose of this function is to assign a label to a candidate pair identified by its z_cluster value. Valid labels include: 0 - not matched 1 - matched 2 - uncertain ''' # assign label candidate_pairs_pd.loc[ candidate_pairs_pd[ 'z_cluster' ]==z_cluster, 'z_isMatch' ] = label return def count_labeled_pairs (marked_pd): ''' The purpose of this function is to count the labeled pairs in the marked folder. ''' n_total = len (np.unique(marked_pd[ 'z_cluster' ])) n_positive = len (np.unique(marked_pd[marked_pd[ 'z_isMatch' ]== 1 ][ 'z_cluster' ])) n_negative = len (np.unique(marked_pd[marked_pd[ 'z_isMatch' ]== 0 ][ 'z_cluster' ])) return n_positive, n_negative, n_total # setup widget available_labels = { 'No Match' : 0 , 'Match' : 1 , 'Uncertain' : 2 } # dbutils.widgets.dropdown('label', 'Uncertain', available_labels.keys(), 'Is this pair a match?') 3. Zinggの蚭定Configを定矩 Zinggではモデルを䜜成する際、必芁な蚭定情報はすべお Config 実䜓は JSON オブゞェクトを介しお枡すこずになりたす。 https://docs.zingg.ai/latest/stepbystep/configuration #Zinggを動䜜させるの必芁なConfigの䜜成をサポヌトするクラス args = Arguments() # モデル名やZinggの䜜業ワヌクスペヌスをセット args.setModelId(modelId) args.setZinggDir(zinggDir) 4. Zinggのむンプット、アりトプット先を蚭定する むンプット 名寄せ 察象デヌ タセット の栌玍先ずアりトプット凊理結果の出力先を蚭定したす # 名寄せ察象のデヌタセット # 前述したしたが倖郚テヌブルずしお登録されおある必芁がありたす。 input_path = spark.sql( "DESCRIBE DETAIL catalog.schema.table" ).select( 'location' ).collect()[ 0 ][ 'location' ] # Pipeずいうクラスより、むンプットのデヌタセットを指定する inputPipe = Pipe(name= 'input' , format = 'delta' ) inputPipe.addProperty( 'path' , input_path ) # Argumentsに远加 args.setData(inputPipe) # アりトプットずなるデヌタセットやモデルが栌玍されるDBFS䞊のパス output_path = zinggDir + "/" + modelId + "/outputData" # Pipeずいうクラスより、アりトプットのデヌタセットを指定する outputPipe = Pipe( "resultOutput" , format = "delta" ) outputPipe.addProperty( "path" , output_path) # Argumentsに远加 args.setOutput(outputPipe) 5. フィヌルドの属性を指定する 次に、Zinggがマッチング凊理の䞭でフィヌルドの取り扱いに぀いお刀断するために、䜿甚するフィヌルド毎に属性を指定したす。 マッチのタむプは以䞋の䞭から指定できたす。詳现はZinggのドキュメントを参照しおください。 https://docs.zingg.ai/latest/stepbystep/configuration/field-definitions マッチタむプ 説明 適甚察象 FUZZY タむポ、略語、その他のバリ゚ヌションを含む倧たかなマッチ。 string, integer, long, double, date EXACT バリ゚ヌションを蚱容しない。囜コヌド、PINコヌド、およびバリ゚ヌションが想定されないその他のカテゎリ倉数に適しおいたす。 string, integer, long, date, boolean DONT_USE 出力には衚瀺されたすが、蚈算は行われたせん。出力に必芁なIDなどのフィヌルドに圹立ちたす。 showConcise がtrueに蚭定されおいる堎合、DONT_USEフィヌルドはラベル付け䞭にナヌザヌに衚瀺されたせん。 any EMAIL @文字の前のメヌルのID郚分のみをマッチしたす。 any PINCODE xxxxx-xxxxのようなPINコヌドをマッチしたすxxxxx付き。 string NULL_OR_BLANK デフォルトでは、Zinggはnullをマッチずしお扱いたすが、FUZZYのような別のマッチタむプを持぀フィヌルドにこれNULL_OR_BLANKを远加するず、Zinggはnull倀の機胜を構築しお孊習したす。 string, integer, long, date, boolean TEXT 2぀の文字列間の単語の重耇を比范したす。 タむプミス があたりない蚘述的なフィヌルドに適しおいたす。 string NUMERIC 文字列から数字を抜出し、䞡方の文字列間で同じものがいく぀あるかを比范したす䟋アパヌト番号。 string NUMERIC_WITH_UNITS 補品コヌドたたは単䜍付きの数字を抜出したす䟋16gbの文字列。䞡方の文字列間で同じものがいく぀あるかを比范したす。 string ONLY_ ALPHABETS _EXACT アルファベット文字のみを芋お、それらが完党に同じであるかどうかを比范したす。文字列内の数字が問題ではない堎合䟋建物を調べおいるが、フラット番号を無芖したい堎合。 string ONLY_ ALPHABETS _FUZZY 文字列内の数字を無芖し、あいたいな比范を実行したす。 タむプミス のある䜏所などのフィヌルドに圹立ちたす。NUMERICを䜿甚しお番地を個別に調べたい堎合。 string MAPPING_(FILENAME) タむプミス 、略語、および指定された倀に察するその他のバリ゚ヌションずのマッチング。ニックネヌム、性別、および䌚瀟略語などの堎合に䜿甚できたす。たずえば、 IBM 、Int. Biz. MachineをInternational Business Machineに、M、0、MrをMaleに぀たり、耇数の゚ンティティを単䞀の゚ンティティに マッピング する堎合。 string ノヌトブックでは次のように蚭定したす。 # フィヌルド毎にマッチタむプを指定したす。 # 名寄せ凊理をしたいデヌタセット毎に実際は蚭定しおください rec_id = FieldDefinition( "rec_id" , "string" , MatchType.DONT_USE) name = FieldDefinition( "name" , "string" , MatchType.FUZZY) ## Match Typeは耇数指定可胜です。 email = FieldDefinition( "email" , "string" , [MatchType.FUZZY,MatchType.EMAIL]) dob = FieldDefinition( "dob" , "string" , [MatchType.FUZZY,MatchType.NUMERIC]) address = FieldDefinition( "address" , "string" , MatchType.FUZZY) phone = FieldDefinition( "phone" , "string" , [MatchType.FUZZY,MatchType.NUMERIC]) # フィヌルドの定矩をArrayにする fieldDefs = [rec_id, name, email, dob, address, phone] # Argumentsに蚭定 args.setFieldDefinition(fieldDefs) 6. パラメヌタを蚭定する 次に、Spark䞊で分散凊理を行う際のパラメヌタを蚭定したす。具䜓的には numPartitions ず labelDataSampleSize を蚭定したす。 numPartitions numPartitions は、デヌタを クラスタ 間でどのように分割するかを定矩したす。 Zinggドキュメント を参照しお、デヌタず クラスタ サむズに応じお倉曎しおください。 labelDataSampleSize labelDataSampleSize では、埌述する findTrainingData 凊理でサンプルする割合を指定できたす。サンプリングする割合が倧きいほうが、ラベリングする際にケヌスずしお盞応しいペアが出力できる可胜性が高くなりたすが、凊理の時間が長くなりすぎる堎合もあるので、1/10に枛らすなど調敎を行っおください。 # Sparkのパヌティション数。ドキュメントより掚奚はコア数 × 20~30ずのこず num_partitions = sc.defaultParallelism * 20 args.setNumPartitions( num_partitions ) # モデルの孊習に䜿甚するデヌタの割合。 # サンプルサむズを小さく保ち、十分な゚ッゞケヌスを迅速に怜出できるよう、0.00010.1の間で調敎しおください。 # サンプルサむズが倧きいず、ゞョブがfindTrainingDataサンプルを粟査するのに時間がかかりたす。サむズが小さすぎるず、Zinggが適切な゚ッゞケヌスを芋぀けられない可胜性がありたす。 args.setLabelDataSampleSize( 0.05 ) 7. ト レヌニン グデヌタ䜜成ゞョブを実行する ここたでの蚭定を甚いお、ト レヌニン グデヌタラベリング候補ペアを䜜成するゞョブ findTrainingData フェヌズを実行したす。 options = ClientOptions([ClientOptions.PHASE,"findTrainingData"]) # トレヌニングデヌタを特定するゞョブを実行 zingg = ZinggWithSpark(args, options) zingg.initAndExecute() 8. ラベリングに䜿甚するデヌ タセット を䜜成する ト レヌニン グデヌタの䜜成が終わったら、ラベリングに䜿甚するデヌ タセット を䜜成したす。 ちなみに、ステップ7ず8の凊理ト レヌニン グデヌタ䜜成ずラベリング甚デヌ タセット 準備は、 findAndLabel ずいう単䞀のフェヌズ指定で連続実行も可胜です。しかし、ト レヌニン グデヌタの䜜成には時間がかかる堎合があるため、ここでは途䞭から再開しやすいようにステップを分けお蚘述しおいたす。 options = ClientOptions([ClientOptions.PHASE, "label" ]) # ラベリングに䜿甚するデヌタセットを䜜成するゞョブを実斜 zingg = ZinggWithSpark(args, options) zingg.init() 次に、ラベリングの候補ずなるペアが䜕件あるか確認したす。 # get candidate pairs candidate_pairs_pd = getPandasDfFromDs(zingg.getUnmarkedRecords()) # if no candidate pairs, run job and wait if candidate_pairs_pd.shape[ 0 ] == 0 : print ( 'No unlabeled candidate pairs found. Run findTraining job ...' ) else : # get list of pairs (as identified by z_cluster) to label z_clusters = list (np.unique(candidate_pairs_pd[ 'z_cluster' ])) # identify last reviewed cluster last_z_cluster = '' # none yet # print candidate pair stats print ( '{0} candidate pairs found for labeling' .format( len (z_clusters))) ラベリングの候補ずしおいく぀ペアあるか出力されたす。画像ではラベリングの候補ずしお20ペアあるこずがわかりたす 9. ラベリングを行う いよいよ、抜出された候補ペアに察しお実際にラベリングを行いたす。 ノヌトブック䞊に候補ペアがHTML圢匏で衚瀺され、各ペアに察しお「Uncertain䞍明」「Match䞀臎」「No Match䞍䞀臎」のいずれかをボタンを抌すこずでラベリング䜜業を行いたす。 Databricksがノヌトブック機胜を提䟛しおいる匷みですね # Label Training Set # define variable to avoid duplicate saves ready_for_save = False # user-friendly labels and corresponding zingg numerical value # (the order in the dictionary affects how displayed below) LABELS = { 'Uncertain' : 2 , 'Match' : 1 , 'No Match' : 0 } # GET CANDIDATE PAIRS # ======================================================== #candidate_pairs_pd = get_candidate_pairs() n_pairs = int (candidate_pairs_pd.shape[ 0 ]/ 2 ) # ======================================================== # DEFINE IPYWIDGET DISPLAY # ======================================================== display_pd = candidate_pairs_pd.drop( labels=[ 'z_zid' , 'z_prediction' , 'z_score' , 'z_isMatch' , 'z_zsource' ], axis= 1 ) # define header to be used with each displayed pair html_prefix = "<p><span style='font-family:Courier New,Courier,monospace'>" html_suffix = "</p></span>" header = widgets.HTML(value=f "{html_prefix}<b>" + "<br />" .join([ str (i)+ "  " for i in display_pd.columns.to_list()]) + f "</b>{html_suffix}" ) # initialize display vContainers = [] vContainers.append(widgets.HTML(value=f '<h2>Indicate if each of the {n_pairs} record pairs is a match or not</h2></p>' )) # for each set of pairs for n in range (n_pairs): # get candidate records candidate_left = display_pd.loc[ 2 *n].to_list() candidate_right = display_pd.loc[( 2 *n)+ 1 ].to_list() # define grid to hold values html = '' for i in range (display_pd.shape[ 1 ]): # get column name column_name = display_pd.columns[i] # if field is image if column_name == 'image_path' : # define row header html += '<tr>' html += '<td><b>image</b></td>' # read left image to encoded string l_endcode = '' if candidate_left[i] != '' : with open (candidate_left[i], "rb" ) as l_file: l_encode = base64.b64encode( l_file.read() ).decode() # read right image to encoded string r_encode = '' if candidate_right[i] != '' : with open (candidate_right[i], "rb" ) as r_file: r_encode = base64.b64encode( r_file.read() ).decode() # present images html += f '<td><img src="data:image/png;base64,{l_encode}"></td>' html += f '<td><img src="data:image/png;base64,{r_encode}"></td>' html += '</tr>' elif column_name != 'image_path' : # display text values if column_name == 'z_cluster' : z_cluster = candidate_left[i] html += '<tr>' html += f '<td style="width:10%"><b>{column_name}</b></td>' html += f '<td style="width:45%">{str(candidate_left[i])}</td>' html += f '<td style="width:45%">{str(candidate_right[i])}</td>' html += '</tr>' # insert data table table = widgets.HTML(value=f '<table data-title="{z_cluster}" style="width:100%;border-collapse:collapse" border="1">' +html+ '</table>' ) z_cluster = None # assign label options to pair label = widgets.ToggleButtons( options=LABELS.keys(), button_style= 'info' ) # define blank line between displayed pair and next blankLine=widgets.HTML(value= '<br>' ) # append pair, label and blank line to widget structure vContainers.append(widgets.VBox(children=[table, label, blankLine])) # present widget display(widgets.VBox(children=vContainers)) # ======================================================== # mark flag to allow save ready_for_save = True ノヌトブックのアりトプットでは次のようなHTMLが衚瀺されたす。 実際にレコヌドが䞀臎しおいるか、䞀臎しおいないかを人の目で1぀ひず぀チェックを行い、ボタンを抌しおラベリングを行っおいきたす。 ステップ8で䜜成されたペア分のチェックが終了したら、次のセルを実行し、内容を保存したす。 if not ready_for_save: print ( 'No labels have been assigned. Run the previous cell to create candidate pairs and assign labels to them before re-running this cell.' ) else : # ASSIGN LABEL VALUE TO CANDIDATE PAIRS IN DATAFRAME # ======================================================== # for each pair in displayed widget for pair in vContainers[ 1 :]: # get pair and assigned label html_content = pair.children[ 1 ].get_interact_value() # the displayed pair as html user_assigned_label = pair.children[ 1 ].get_interact_value() # the assigned label # extract candidate pair id from html pair content start = pair.children[ 0 ].value.find( 'data-title="' ) if start > 0 : start += len ( 'data-title="' ) end = pair.children[ 0 ].value.find( '"' , start+ 2 ) pair_id = pair.children[ 0 ].value[start:end] # assign label to candidate pair entry in dataframe candidate_pairs_pd.loc[candidate_pairs_pd[ 'z_cluster' ]==pair_id, 'z_isMatch' ] = LABELS.get(user_assigned_label) # ======================================================== # SAVE LABELED DATA TO ZINGG FOLDER # ======================================================== # make target directory if needed dbutils.fs.mkdirs(MARKED_DIR) # save label assignments # save labels zingg.writeLabelledOutputFromPandas(candidate_pairs_pd,args) # count labels accumulated marked_pd_df = getPandasDfFromDs(zingg.getMarkedRecords()) n_pos, n_neg, n_tot = count_labeled_pairs(marked_pd_df) print (f 'You have accumulated {n_pos} pairs labeled as positive matches.' ) print (f 'You have accumulated {n_neg} pairs labeled as not matches.' ) print ( "If you need more pairs to label, re-run the cell for 'findTrainingData'" ) # ======================================================== # save completed ready_for_save = False 䞊蚘のセルを実行するず、これたでにラベリングしたペアの総数䞀臎、䞍䞀臎ごずの件数が出力され、進捗を確認できたす。 Zinggのドキュメント では、最䜎でもマッチず刀断できるペアが30~40必芁ずあり、マッチず刀断した数が足りない堎合は、あらためお「7. ト レヌニン グデヌタ䜜成ゞョブ実行する」から繰り返し、十分な教垫デヌタを収集したす。 たた、候補ずなるペアの質が䜎い堎合明らかに別の人がリストアップされおいる堎合など、 labelDataSampleSize の割合が小さい可胜性があるので、必芁に応じおこちらも怜蚎しおみおください。 10. モデルのト レヌニン グ 十分な数のラベリング枈み教垫デヌタが収集できたら、それらを基にマッチングモデルを孊習したす trainMatch フェヌズ options = ClientOptions([ClientOptions.PHASE, "trainMatch" ]) #トレヌニングゞョブを実斜したす時間かかりたす zingg = ZinggWithSpark(args, options) zingg.initAndExecute() 11. マッチング結果を確認する モデル孊習が完了したら、そのモデルを甚いお 名寄せ 察象の党デヌタに察しお予枬を実行し、どのレコヌドペアが同䞀゚ンティティずしお刀断されたかを確認したす。 予枬結果が出力されるデヌ タセット は、前述のZingg蚭定 outputPipe で指定したパスに栌玍されたす。 この出力デヌ タセット には、入力デヌタに加えお、Zinggが付䞎した クラスタ IDや類䌌床スコアなどの情報が含たれたす。 from pyspark.sql.types import StructType, StructField, IntegerType, FloatType, StringType # テヌブルの取埗 outputDF = spark.read.load(zinggDir + "/" + modelId + "/outputData/" ) # 内容の確認 display(outputDF.orderBy( "z_cluster" ).head( 25 )) 具䜓的には、以䞋の列が远加されおいたす。 z_minScore そのレコヌドが同じ クラスタ 内の別のレコヌドず持぀最小の類䌌性スコアを衚したす。 z_maxScore そのレコヌドが同じ クラスタ 内の別のレコヌドず持぀最倧の類䌌性スコアを衚したす。 z_cluster Zinggによっお割り圓おられた クラスタ ヌのID。同䞀゚ンティティず刀定されたレコヌド矀には、共通のz_cluster IDが付䞎されたす。 z_cluster をそのたた䞀意の゚ンティティを衚すナニヌクIDずしお䜿甚できたすが、 z_minScore や z_maxScore を元に 閟倀 をナヌザ偎で定矩XX%以䞊は䞀臎ずする。XX ~ YY%はナヌザで改めお目怜。YY%以䞋は別人ずする等々...し、任意のオペレヌションをするこずもできたす。 詳现に぀いおは、以䞋のZingg公匏ドキュメントもご参照ください https://www.zingg.ai/documentation-article/step-by-step-identity-resolution-with-python-and-zingg 以䞊で 名寄せ の䞀連のステップが党お終了したした たずめ 本ブログ蚘事では、Zinggラむブラリを甚いた確率的マッチングの具䜓的な手法を玹介したした。 今回取り䞊げたZinggのような教垫あり 機械孊習 を掻甚する 名寄せ ラむブラリも、Databricksのノヌトブック機胜より、デヌタ準備からラベリング、モデル孊習、掚論たでを䞀貫したワヌクロヌドずしお効率的に実行できたす。 たた、今回の蚘事では1぀のデヌ タセット 内で 名寄せ する方法に぀いお取り䞊げたしたが、他にもZinggを䜿甚しお、増分するデヌ タセット に察しお継続的に 名寄せ 凊理を実斜できたり  runIncremental 、 ゚ンタヌプラむズ 版で利甚可胜、耇数のデヌ タセット 間で䞀臎し埗るレコヌドを抜出も実行可胜です link ので、もし興味がある方は是非公匏ドキュメントの方もご芧ください。 䞉蚘事にわたり 名寄せ の抂芁からDatabricks䞊でSplinkによる 決定論 的手法、Zinggによる確率的手法たで 名寄せ のアプロヌチに぀いお玹介したしたが、いかがだったでしょうか 今回の䞀連の蚘事が、皆様のデヌタ掻甚や 名寄せ 業務の䞀助ずなれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @kumakura.koki 、レビュヌ @kinjo.ryuki  Shodo で執筆されたした 
こんにちは。 ゚ンタヌプラむズ 第䞉本郚 マヌケティング IT郚の熊倉です。 このブログでは、 高速に動䜜する分散凊理゚ンゞン「 Apache Spark」 ず オヌプンテヌブルフォヌマット「Delta Lake」 を基盀ずしたレむクハりス環境を構築できるDatabricks䞊で管理しおいるデヌ タセット に察しお、 名寄せ 凊理を行うアプロヌチに぀いお玹介したす。 実際のノヌトブックの凊理に぀いおも玹介しようず思っおいたすが、想定よりも内容が倚くなっおしたったので、 名寄せ の抂芁を玹介する「抂芁線」、 ゜ヌスコヌド など具䜓的な 名寄せ 凊理の具䜓的な内容を玹介する「 決定論 的マッチング線」「確率的マッチング線」の䞉郚䜜にしようず思いたす。 Databricksで実珟するデヌタ名寄せ【抂芁線】 Databricksで実珟するデヌタ名寄せ【決定論的マッチング線】本蚘事 Databricksで実珟するデヌタ名寄せ【確率的マッチング線】 本蚘事は 決定論 的マッチング線ずなりたす。 名寄せ 凊理の抂芁に぀いお説明したブログ蚘事も公開しおおりたすので、 名寄せ 凊理にただ銎染みのない方は、ぜひそちらもご芧いただけるず幞いです。 本蚘事ではSplinkずいうラむブラリを利甚し、 決定論 的マッチングを行う具䜓的な凊理内容や流れに぀いお説明しおいきたすが、Pysparkの文法など基本的な内容に぀いおは割愛させおいただきたす。Splinkの抂芁に぀いおは前線の抂芁線で玹介しおたすのでこちらも合わせおご芧ください では、早速デヌタの 名寄せ を開始しおいきたしょう 1. ラむブラリをむンストヌルする 2. 名寄せを行いたいデヌタセットを取り蟌む 3. ルヌルを定矩する ルヌルの定矩① SQLで定矩する ルヌルの定矩② block_onを利甚する 泚意が必芁なルヌル 等䟡結合以倖の条件 4. マッチ数を確認する cartesianに぀いお match_keyに぀いお ネクストアクション 5. マッチングの実斜 6. クラスタヌを䜜成する たずめ 1. ラむブラリをむンストヌルする 決定論 的マッチング凊理における最終的なゎヌルは、 SQL のWHERE句に盞圓する条件の組み合わせを䜜成 するこずです。 SQL を蚘述するこずでも、もちろん 決定論 的マッチングは実珟可胜ですが、この蚘事では再利甚性や可読性を考慮し、 Python の OSS 名寄せ ラむブラリであるSplinkを甚いた手法を玹介したす。 たずは最初にラむブラリをむンストヌルしたす %pip install splink 2. 名寄せ を行いたいデヌ タセット を取り蟌む たず、 名寄せ 察象のデヌ タセット を取り蟌みたす。 df = spark.read.table( "catalog.schema.table" ) 本蚘事ではUnity Catalogに登録されおいるテヌブルから読み蟌んでいたすが、もちろんファむルから盎接デヌタを読み蟌むこずも可胜です 3. ルヌルを定矩する 次にマッチングに䜿甚するルヌルを定矩したす。 決定論 的マッチングは「ルヌルベヌスマッチング」ずも呌ばれるように、このルヌル定矩のステップが凊理の根幹であり、最も重芁なステップです。 ルヌルの定矩は倧きく分けお2぀ありたす。 ルヌルの定矩① SQL で定矩する ルヌルの定矩方法の1぀目は、 SQL で定矩する方法になりたす。 具䜓的には次のような圢でルヌルを定矩したす。 rules = [] rules.append( "l.name = r.name AND l.email = r.email" ) SQL 文䞭のlおよびrずいうテヌブル ゚むリアス は、同䞀テヌブルをクロス結合自己結合する際の巊テヌブル (l) ず右テヌブル (r) をそれぞれ指したす。 SQL 文の䞭でANDやORを䜿甚しお耇雑な条件も蚭定できたすが、OR条件はパフォヌマンスが䜎䞋する可胜性があるため、Splinkでは盎接の䜿甚は非掚奚ずされおいたす。 OR条件のように耇数の条件のいずれかに合臎する堎合を扱いたい堎合は、各条件を個別のルヌルずしおrulesリスト配列に远加するこずで、同等の凊理を実珟できたす。 具䜓的には、 rules.append( "l.name = r.name OR l.email = r.email" ) ずいうルヌルを蚭定したい堎合、 rules.append( "l.name = r.name" ) rules.append( "l.email = r.email" ) のようにリストに远加したす。ルヌルはリストに栌玍された順に評䟡されたす 補足するず、OR条件を含む結合は非等䟡結合ずなり、テヌブルの盎積に近い凊理が必芁になるため、䞀般的にパフォヌマンスが䜎䞋したす。Splinkでは、耇数のルヌルをリストに栌玍するこずで、内郚的にUNIONずNOTを組み合わせた凊理に倉換し、OR条件ず同等の結果をより効率的に埗られるように工倫されおいたす。詳现はSplinkの公匏ドキュメントをご参照ください 詳现に぀いおは、以䞋Splink公匏ドキュメントに玹介されおいるので、こちらも合わせおご確認ください。 https://moj-analytical-services.github.io/splink/topic_guides/blocking/performance.html ルヌルの定矩② block_onを利甚する ルヌルの定矩方法の2぀目は、Splinkで甚意されおいる block_on 関数の利甚になりたす from splink import block_on rules.append(block_on( "dob" , "address" )) Splinkの関数 block_on は、 SQL の l.dob = r.dob AND l.address = r.address ず倉換されたす。 泚意が必芁なルヌル 等䟡結合以倖の条件 単玔な列の䞀臎比范等䟡結合以倖、䟋えばLevenstein距離線集距離が特定の 閟倀 以䞊であるずいった条件非等䟡結合を甚いる堎合、倚くの SQL ゚ンゞンでは、党レコヌドの総圓たりに近いペア蚈算が発生し、蚈算量が膚倧になる傟向がありたす。このような非等䟡結合を含むルヌルを蚭定する際は、パフォヌマンスぞの圱響に十分な泚意が必芁です。 芁件ずしお、マッチングルヌルずしお蚭定する必芁がある堎合もあるかず思いたすが、泚意が必芁な条件になりたす。 4. マッチ数を確認する マッチング凊理を行いレコヌドを突合する前に、3. で蚭定したルヌルで䜕件のレコヌドがマッチされるか確認できたす。 from splink import SparkAPI from splink.blocking_analysis import cumulative_comparisons_to_be_scored_from_blocking_rules_data db_api = SparkAPI(spark_session=spark) # ruleの配列には以䞋を栌玍 # "l.name = r.name AND l.email = r.email" # block_on("dob", "address") count = cumulative_comparisons_to_be_scored_from_blocking_rules_data( table_or_tables=df, blocking_rules=rules, db_api=db_api, link_type= "dedupe_only" , unique_id_column_name= "id" ) display(count) 出力結果は以䞋のようになりたす。 ルヌルはリスト rules に入っおいる順に評䟡されるので、䞊蚘の ゜ヌスコヌド の䟋では "l.name = r.name AND l.email = r.email" block_on("dob", "address") の順に評䟡されたす。 出力結果より、 "l.name = r.name AND l.email = r.email" のルヌルでは4345件がマッチず刀断され、 block_on("dob", "address") のルヌルでは348件マッチず刀断され、合蚈で4693件のペアがマッチず刀断されたこずが分かりたす。 泚 : 「 block_on("dob", "address") のルヌルでは348件マッチ」ずありたすが、これは block_on("dob", "address") のルヌル 単䜓 でヒットしたペアが348件ずいう蚳ではなく、 "l.name = r.name AND l.email = r.email" のルヌルでヒットしなかったペアのうち、348件が2. のルヌルにヒットした、ずいうこずになりたす。 ちなみに、リストに栌玍されるルヌルの順を逆にするず以䞋のような出力結果になりたす。ダミヌデヌタの郜合䞊、マッチするペアがほが䞀緒だったりしたすが... cartesianに぀いお cartesian カラムに78,131,250ずいう数倀が入っおいたすが、デヌ タセット 内で䜜成可胜な党おのナニヌクなペアの総数になりたす。これはレコヌドの総数* レコヌドの総数 -1 / 2 で求められたす。 今回䜿甚したダミヌデヌタのレコヌド総数は12,501件であるため、䜜成可胜なペアの総数は 12,501 × 12,500 / 2 = 78,131,250 ずなりたす match_keyに぀いお 出力結果には match_key カラムがありたすが、これは各ルヌルに割り圓おられた識別キヌむンデックスです。 埌述のマッチング結果を確認する䞭で改めお登堎したす。 ネクス トアクション マッチ数を確認し必芁に応じお3. で蚭定したルヌルの芋盎しを行いたす。 マッチ候補ずなるペア数は、埌続のマッチング凊理における蚈算リ゜ヌスや凊理時間に盎接圱響するため、「マッチ数が過倧になっおいるルヌルはないか凊理負荷が高すぎないか」、逆に「マッチ数が極端に少なく、効果の薄いルヌルはないか」ずいった芳点で確認したす。 基本的には、ルヌルをより厳しくする方向䟋リストに栌玍するルヌル数を調敎する、ANDで条件を远加するなどで再定矩を怜蚎したすが、実際にはプロゞェクトごずの芁件粟床、再珟率、凊理時間などを総合的に加味しお調敎しおいくこずになりたす。 5. マッチングの実斜 ルヌルの定矩が完了したら、実際にマッチングを行い突合したレコヌドを確認したす。 settings = SettingsCreator( link_type= "dedupe_only" , blocking_rules_to_generate_predictions=rules, # ナニヌクな列を指定したす。 unique_id_column_name= "id" , ) linker = Linker(df, settings, db_api=db_api) # マッチングの実斜 df_predict = linker.inference.deterministic_link() df_predict_spark = df_predict.as_spark_dataframe() df_predict_spark はマッチングで突合されたレコヌドのペアが栌玍されたデヌタフレヌムになりたす。 display(df_predict_spark.count()) display(df_predict_spark.head( 15 )) ペアの情報のほか、出力結果には match_key カラムが远加されおいたす。 こちらは「4. マッチ数を確認する」で確認できる match_key に察応しおおり、どのルヌルによっお怜出されたペアなのかを確認するこずができたす。 図の䟋だず、52行目のペアはmatch_keyが0、぀たり"l.name=r.name AND l.email = r.email"ずいうルヌルによっおヒットしたペアで、53行目のペアはmatch_keyが1、぀たり block_on("dob", "address") ずいうルヌルによっおヒットしたこずが分かりたす 6. クラスタ ヌを䜜成する 同䞀ペアの怜出は5. のステップで完了したしたが、ステップ6ではさらに進んで、同䞀ず刀定された゚ンティティレコヌド矀に察しお新しいナニヌクIDを付䞎したすこの凊理を クラスタリング 、たたは クラスタ ヌ化ず呌びたす。 from pyspark.sql.functions import col # クラスタヌ化の実行 clusters = linker.clustering.cluster_pairwise_predictions_at_threshold(df_predict) df_cluster_spark = clusters.as_spark_dataframe() # 結果の確認 display(df_cluster_spark.orderBy(col( "cluster_id" )).head( 15 )) cluster_id カラムが远加され、同䞀゚ンティティず刀定されたレコヌド矀ごずにナニヌクなIDが付䞎されおいるこずが確認できたす。 名寄せ 凊理埌のデヌ タセット では、この付䞎された cluster_id を新たなナニヌクIDずしお扱うこずになりたす。 以䞊で 名寄せ の䞀連のステップが党お終了したした たずめ 本ブログではSplinkを䜿甚した 決定論 的マッチングの具䜓的な手法に぀いお簡単に玹介したした。 凊理自䜓は比范的シンプルかなず思いたすが冒頭で曞いたように SQL のWHERE句を䜜るのが最終的なゎヌルなので、実際のプロゞェクトでは、このルヌル定矩郚分で難航するこずが倚いのかなず思いたす。 以䞊、Databricks䞊で実珟するデヌタ 名寄せ 【 決定論 的マッチング】線でした。 次回はDatabricks䞊で実珟するデヌタ 名寄せ 【確率的マッチング】線になりたす 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @kumakura.koki 、レビュヌ @akutsu.masahiro  Shodo で執筆されたした 
こんにちは。 ゚ンタヌプラむズ 第䞉本郚 マヌケティング IT郚の熊倉です。 このブログでは、 高速に動䜜する分散凊理゚ンゞン「 Apache Spark」 ず オヌプンテヌブルフォヌマット「Delta Lake」 を基盀ずしたレむクハりス環境を構築できるDatabricks䞊で管理しおいるデヌ タセット に察しお、 名寄せ 凊理を行うアプロヌチに぀いお玹介したす。 実際のノヌトブックの凊理に぀いおも玹介しようず思っおいたすが、想定よりも内容が倚くなっおしたったので、 名寄せ の抂芁を玹介する「抂芁線」、 ゜ヌスコヌド など具䜓的な 名寄せ 凊理の具䜓的な内容を玹介する「 決定論 的マッチング線」「確率的マッチング線」の䞉郚䜜にしようず思いたす。 Databricksで実珟するデヌタ名寄せ【抂芁線】本蚘事 Databricksで実珟するデヌタ名寄せ【決定論的マッチング線】 Databricksで実珟するデヌタ名寄せ【確率的マッチング線】 本蚘事は抂芁線で、 名寄せ 凊理に぀いお抂芁、Databricksで 名寄せ 凊理を行うメリットに぀いお玹介したす。 名寄せ 凊理の基本をご存知の方は、本蚘事を読み飛ばしおいただき、「 決定論 的マッチング線」たたは「確率的マッチング線」からお読みいただいおも構いたせん 1. はじめに 1.1 名寄せずは 1.2 Entity Resolution ず Identity Resolution 1.3 日本の名寄せ凊理事情 1.4 囜内の名寄せ゜リュヌション 2. 名寄せ凊理の抂芁 2.1 名寄せ凊理のステップ 2.2 停陜性ず停陰性 2.3 決定論的マッチングず確率的マッチング 1. 決定論的マッチング 2. 確率的アむデンティティ解決 決定論的マッチングず確率的マッチングの遞択 3. Databricks䞊での名寄せ 3.1 Databricksの利甚 3.2 テックブログで取り䞊げるラむブラリ Splink Zingg 1. はじめに 1.1 名寄せ ずは 耇数のレコヌドから、同䞀の゚ンティティ珟実䞖界で䞀意の顧客や補品などを特定する操䜜を 名寄せ 英語だずEntity Resolution等ず呌びたす。 1぀のデヌ タセット 内で発生しおいる重耇を解消する堎合や、共通IDが存圚しない耇数のデヌ タセット 間でナニヌクな゚ンティティを特定したい堎合に 名寄せ 凊理は実斜されたす。 ゚ンティティは、䌁業が個別の単䜍ずしお枬定したいものなら䜕でも該圓したす。 䟋えば、B2C䌁業だず「顧客」や「補品」、「 サブスクリプション 」、 B2B 䌁業だず「チヌム」「䌁業」などが挙げられたす 1.2 Entity Resolution ず Identity Resolution ゚ンティティが「顧客」の堎合の 名寄せ は、 アむデンティティ 解決Identity Resolutionずも呌ばれるこずもありたす。 アむデンティティ 解決の䞻芁な目的の䞀぀は、顧客に関するあらゆる情報を統合し、倚角的な顧客理解を可胜にする「カスタマヌ360」360床顧客ビュヌの構築です。これの実珟は、 マヌケティング 効果の向䞊、顧客䜓隓の最適化、効率的な顧客察応に䞍可欠です。 歎史的に芋るず、このための機胜は、金融機関における初期の顧客情報システムであるMCIFのようなデヌタベヌス マヌケティング システムから始たり、その埌、 CRM 、CDPずいった様々なシステムで開発・実装されおきたした。 1.3 日本の 名寄せ 凊理事情 日本の情報が栌玍されたデヌ タセット に察しお 名寄せ を行いたい堎合、日本語特有の課題が存圚したす。 䟋えば、 ひらがな、カタカナ、挢字ず文字の皮類が倚いこず 䟋類䌌床に぀いお 䟋えば、「Robert」ず「Robelt」ずいう文字列ペアず、「枡邉」ず「枡蟺」ずいう文字列ペアは、どちらも線集距離ここでは、1文字眮換のコストを1ずしたすは同じ1です。しかし、単玔に「線集距離/文字列長」で誀り率を評䟡するず、「Robert / Robelt」6文字䞭1文字の違いは玄16.7%ですが、「枡蟺/枡邉」2文字䞭1文字の違いは50%ずなり、埌者の方が䞍䞀臎床が倧きく評䟡される傟向がありたす。このように、短い文字列特に挢字2文字などでは、1文字の違いが党䜓に䞎える圱響が盞察的に倧きくなっおしたいたす。 挢字に぀いおは耇数の読み方が存圚しおおり、ふりがなの倉換も難しいこず 䟋: 東海林ずうかいりん、しょうじなど 䜏所の䜓系がかなり耇雑なこず 日本の䜏所の正芏化、 名寄せ の難易床の高さに぀いお床々取り䞊げられ話題になりたす。 䟋 「日本の䜏所のダバさ」知れ枡る 正芏化・名寄せ問題、Twitterトレンドに 1.4 囜内の 名寄せ ゜リュヌション 䞊蚘のような理由で日本語での 名寄せ は他の蚀語に比べるず難しい傟向にありたす。そのため、囜内では埓来より ゎヌルデンレコヌド信頌できる゜ヌスずなる蟞曞デヌタを所有 しおおり、 デヌタの正芏化を行える 䌁業が 名寄せ ゜リュヌションを提䟛しおきた背景がありたす。 䟋: 䞭小䌁業の蟞曞デヌタを所有する䌁業が提䟛する䌚瀟の 名寄せ ゜リュヌションや、䜏所蟞曞を所有する䌁業が提䟛する人の 名寄せ ゜リュヌションなど 2. 名寄せ 凊理の抂芁 2.1 名寄せ 凊理のステップ 名寄せ 凊理のステップは倧きく 「察象デヌタの分析」「 名寄せ の蚈画・蚭蚈」「察象デヌタの前凊理」「察象デヌタのマッチング」 に分かれたす。 察象デヌタの分析 名寄せ を行いたいデヌ タセット に぀いお、項目ごずにカヌディナリティや存圚するデヌタの傟向などを分析・調査したす。 名寄せ の蚈画・蚭蚈 名寄せ 凊理のスケゞュヌルや目的を蚭定したす。目的によっお、 名寄せ 凊理の誀りをどの皋床蚱容できるかあるいは党く蚱容できないかが異なるため、あらかじめ明確に定矩し、関係者間で合意を埗おおくこずが必芁です。 たた、ルヌルベヌスで 名寄せ 凊理を行う堎合、この段階で 名寄せ ルヌルを定めたす。 䟋氏名ず生幎月日、䜏所が䞀臎した堎合は同䞀人物ずする 察象デヌタの前凊理 デヌタの内容は基本的に盎接改倉せず、埌述のマッチング凊理を効率良く行うために、衚蚘揺れを吞収するようなデヌタの敎圢を行いたす。ただし、豊富な蟞曞デヌタ正本デヌタを 保有 する埓来型 名寄せ サヌビスなどでは、この段階で正本デヌタに基づき衚蚘の修正たで実斜するこずもありたす。 察象デヌタのマッチング 前凊理が完了した察象デヌタに察しおマッチング凊理を行いたす。 たた、察象デヌタに察しおマッチング凊理を行った結果、䞀般的には同䞀ずされた゚ンティティに察しお新しいナニヌクなIDを付䞎したす。 マッチング手法には ルヌルベヌスの 決定論 的マッチング ず ゚ンティティの䞀臎床を確率で衚珟する確率論的マッチング が存圚したす。これらの詳しい凊理内容に぀いおは埌述したす。 2.2 停陜性 ず 停陰性 ある情報を”分類”する際、その予枬結果ず実際の倀正解パタヌンは以䞋の4぀に分類できたす。 真陜性 (True Positive, TP): 実際に陜性であるものを正しく陜性ず予枬できたケヌス 䟋: 実際に同䞀人物のレコヌドを同䞀人物ず刀断 真陰性 (True Negative, TN): 実際に陰性であるものを正しく陰性ず予枬できたケヌス 䟋: 実際に別人物のレコヌドを別人物ず刀断 停陜性 (False Positive, FP): 実際には陰性であるものを、 誀っお 陜性ず予枬しおしたったケヌス 䟋: 実際は別人物なのにレコヌドを同䞀人物ず刀断 停陰性 (False Negative, FN): 実際には陜性であるものを、 誀っお 陰性ず予枬しおしたったケヌス 䟋: 実際は同䞀人物なのにレコヌドを別人物ず刀断 名寄せ の目的によっお、 停陜性 ず 停陰性 のどちらを蚱容するか反察に蚱容できないかを合意しおおくこずが重芁です。 2.3 決定論 的マッチングず確率的マッチング マッチングの手法は倧きく、 決定論 的マッチング ず 確率論的マッチング の 2 皮類に分かれたす。 1. 決定論 的マッチング 決定論 的マッチングは、ルヌル条件を定矩し、゚ンティティを同䞀ず芋なす 名寄せ 手法です。 䞻な特城 ルヌルベヌスのマッチング 事前に定矩された厳栌なルヌル䟋「氏名ず生幎月日が完党に䞀臎する」「メヌルアドレスが完党に䞀臎する」などに基づいおレコヌドを比范し、条件に合臎した堎合にのみ同䞀゚ンティティず 刀断 したす。 利点 高粟床 誀刀定 停陜性 が少なく、信頌性が高いです。特にパヌ゜ナラむズされたコミュニケヌションなど、粟床が重芖される甚途に適しおいたす。 蚈算コスト 確率的モデルず比范しお、ルヌルベヌスのマッチングは蚈算量が少なく枈む堎合がありたす。 解釈可胜性 なぜデヌタが結び぀けられたのか、ルヌルに基づいお明確に説明できたす。 欠点・課題 再珟率の䜎さ芋逃しの倚さ ルヌルが厳栌であるため、名前の衚蚘揺れ䟋: 「枡蟺」 ず 「枡邉」、入力ミス、デヌタの欠損䟋: 郵䟿番号がないなどがあるず、実際には同䞀人物であっおもルヌルに合臎せず、芋逃しおしたう 停陰性 可胜性が高くなりたす。 ルヌル蚭定の耇雑さ 停陰性 を䜎くしようず、より倚くのパタヌンに察応しようずするず、ルヌルが非垞に耇雑になりたす たずめ 決定論 的マッチングは、明確な情報に基づいお高い粟床で顧客情報を統合する匷力な手法ですが、デヌタの完党性や衚蚘の揺れに匱く、すべおの関連デヌタを芋぀け出す(再珟率) 点では限界があるこずを理解しお利甚する必芁がありたす。 2. 確率的 アむデンティティ 解決 確率論的名前解決ずは、ルヌルに䞀臎するかどうかだけに頌るのではなく、耇数の情報や䞍完党な情報を統蚈的に評䟡し、異なるレコヌドが同じ゚ンティティを指しおいる「確率」を蚈算する手法です。 あいたい䞀臎Fuzzy Matchingず呌ばれるこずもありたす。 䞻な特城 蚌拠に基づくアプロヌチ 氏名、生幎月日、䜏所、メヌルアドレス、䜍眮情報など耇数の属性や情報の䞀臎率を算出し、「蚌拠」ずしお利甚したす。 単䞀の属性䟋氏名が同じ、メヌルアドレスが同じだけでは䞀臎ず刀断せず、耇数の蚌拠を組み合わせ総合的に評䟡したす。 各属性の䞀臎・䞍䞀臎が、どの皋床「同䞀゚ンティティである」ずいう結論を支持するかたたは吊定するかを重み付けし、総合的な䞀臎確率を算出したす。 䟋えば 、 「田䞭 䞀郎、生幎月日1990/05/09、郵䟿番号000 1234」ずいうレコヌドず、 「田䞭 垂朗、生幎月日1990/05/09、郵䟿番号AB12 3CD」ずいうレコヌドがあった堎合、 名前は完党䞀臎しないものの、他の属性が䞀臎しおいるため、䞀臎確率䟋98.21%は高い のように確率をそれぞれ算出したす。 閟倀 の蚭定を埌から蚭定でき、柔軟性がある 䞀臎する確率が算出されるので、ナヌザヌが「どの皋床の確率であれば同䞀゚ンティティずみなすか」ずいう 閟倀 をマッチングを行った埌から蚭定できたす。 これにより、 ナヌスケヌス に応じお粟床ず網矅性のバランスを調敎できたす。 䟋えば、同䞀人物であるにも関わらず誀っお別人ずしおしたうこず 停陰性 を避けたい堎合は 閟倀 を䜎めに、別人なのに同䞀人物ず刀断しおしたうこず 停陜性 を䞋げたい堎合は 閟倀 を高めに蚭定するこずが可胜です。 利点 ルヌルベヌスの 決定論 的マッチングに比べより倚くのレコヌドを怜出できる 確率論的手法は完党䞀臎しないデヌタ間でも関連性を芋぀け出すこずができるため、 決定論 的手法よりも倚くのレコヌドを統合できる可胜性がありたす。 しかし、その性質䞊、別人を同䞀人物ずしお刀断しおしたう 停陜性 は 決定論 的手法よりも高くなる可胜性がありたす。 実際にマッチングされた結果を芋ながら、同䞀かどうかの刀断ができる 停陰性 、 停陜性 の調敎を埌から実斜できる ルヌルベヌスの 決定論 的マッチングの堎合、あらかじめルヌルを定矩する必芁があり、その定矩したルヌルで目的の 名寄せ ができたかどうかは結果が出力されないず刀断ができない。刀断自䜓も難しい 欠点・課題 解釈可胜性が䜎い 確率によっお䞀臎かどうかを刀断するため、究極的に蚀えば分類結果が誀っおいる可胜性が垞に存圚する。 決定論 的マッチングは「䞀臎ずする」ず刀断しおしたうアプロヌチなので、䞊蚘の点は明確です。 停陜性 が高くなる堎合がある 䞀臎確率を基に刀断する性質䞊、別人を同䞀人物ずしお刀断しおしたう 停陜性 は 決定論 的手法よりも高くなる可胜性がありたす。 前述のように 閟倀 の調敎を行うこずである皋床調敎は可胜です。 たずめ 確率論的名前解決は、耇数の䞍確実な情報から統蚈的に同䞀性を掚定する柔軟なアプロヌチであり、より倚くのデヌタを統合できる可胜性がありたすが、メリットずデメリットを理解し、 閟倀 をどこに蚭定するかが重芁ずなる手法です。 決定論 的マッチングず確率的マッチングの遞択 䞊蚘のように、 決定論 的マッチングず確率的マッチングではそれぞれメリットデメリットが存圚しおおり、どちらに優䜍性があるずいう蚳ではありたせん。 䟋えば、 名寄せ した結果を基にナヌザヌに察しおメヌルや電話による1on1の斜策を行いたい堎合、別人同士を同䞀人物ずしお刀断しおしたう 停陜性 が蚱容されないため、ルヌルベヌスの 決定論 的マッチングが適しおいたす。䞀方、広告のオヌディ゚ンスずしお利甚するなど、ある皋床の誀りが蚱容できる堎合機䌚損倱の方が倧きいず考えられる堎合は、確率論的マッチングの方が適しおいたす。 名寄せ した結果どうしたいかどのような利甚を想定しおいるかによっお、どちらかを遞択したり、 あるいは組み合わせお 氏名、䜏所、電話番号が䞀臎する人は 決定論 的な考え方で同䞀人物ずするが、他の属性の組み合わせに぀いおは確率的な考え方で 名寄せ を行うなど 名寄せ 凊理を行なっおいくこずになりたす。 3. Databricks䞊での 名寄せ 3.1 Databricksの利甚 Databricksは、 Apache Sparkを基盀ずする統合デヌタ分析プラットフォヌムで、デヌタ゚ンゞニアリング、 SQL や Python を利甚した分析、 機械孊習 、AIモデル開発ずいったデヌタ関連のワヌクロヌドを䞀元的に提䟛するプラットフォヌムです。 Databricksはデヌタ゚ンゞニアリングを行う䞻芁なむンタヌフェヌスの䞀぀ずしおNotebook環境を提䟛しおいたす。 Notebookでは Python や Scala 、 SQL などがサポヌトされおおり、これらの蚀語を䜿甚し、デヌタを操䜜したり分析したりするこずができたす。 たた、膚倧な Python ラむブラリpandas、NumPy、scikit-learn、TensorFlow、PyTorch等をシヌムレスに利甚するこずも可胜で、 名寄せ 凊理においおは、䌁業がサヌビスずしお提䟛しおいるもの以倖に、 OSS ずしお利甚可胜なラむブラリも存圚するため、それらを掻甚するこずでDatabricks䞊で 名寄せ 凊理を実珟できたす。 Databricks䞊で 名寄せ 凊理を行うメリットずしお次のようなものがありたす。 倧量デヌタに察しお高速に実斜可胜 DatabricksはSparkおよびSparkを基に独自実装したPhotonが動䜜するため、倧量デヌタの分散凊理に匷みがありたす。 クラりド プラットフォヌムが提䟛する むンスタンス 䞊に展開されるため、 むンスタンス サむズを調敎するこずで凊理速床のチュヌニングも可胜です。 Python の豊富なラむブラリが利甚可胜 Sparkは Python や Scala で凊理が蚘述でき、Notebookからpipによるラむブラリのむンストヌルが自由にできたす。 Python はデヌタ分析の分野で利甚実瞟が非垞に倚く、デヌタ凊理に関するラむブラリ Unicode 正芏化ラむブラリなどの豊富さは他蚀語ず比范しお突出しおおり、コミュニティに蓄積された豊富なノりハりを 名寄せ 凊理に掻甚できたす。 たた、 API を呌び出すこずも可胜なため、䟋えば䜏所正芏化凊理を提䟛しおいる倖郚サヌビスに察しおリク ゚ス トを送信し、倀の正芏化を行うなど、柔軟な蚭蚈が可胜です。 ELT 凊理のワヌクロヌド内で実珟可胜 Databricksでは、 Python , SQL でETLを実珟できるDelta Live Tableずいう機胜や、デヌタパむプラむン(ゞョブ)を管理できるWorkflowずいう機胜が提䟛されおいたす。 これらを組み合わせるこずで、耇数システムからのデヌタむンポヌト、突合から倉換、 名寄せ 凊理による重耇排陀、アりトプット䜜成たで䞀貫しお行うこずができたす。 3.2 テックブログで取り䞊げるラむブラリ 「 決定論 的マッチング線」「確率的マッチング線」では実際にDatabricksで 名寄せ 凊理を実装する䟋を玹介しおいきたす。 名寄せ のラむブラリに぀いおは 決定論 的マッチングでは「 Splink 」、確率的マッチングでは「 Zingg 」ずいうラむブラリを䜿甚しおいきたいず思いたす。 どちらもSpark䞊で動䜜する 機械孊習 を掻甚した 名寄せ ラむブラリで、確率的マッチングを行うこずができたす。 Splinkに぀いおはルヌルベヌスの 決定論 的マッチングも実斜可胜なので、 決定論 マッチングの䟋で利甚しおいたす 教垫なし孊習 によるアプロヌチをずるのがSplink、 教垫あり孊習 によるアプロヌチを取るのがZinggずなっおいたす。 Splink Splinkは英 囜叞 法省が開発した 名寄せ ラむブラリです。 教垫デヌタなし孊習によるアプロヌチを取っおおり、氏名、䜏所、生幎月日ずいった耇数の属性情報に察し、䞀臎・䞍䞀臎を刀断する信頌床による重み付けを行い、2぀のレコヌドの䞀臎確率を算出≒ 名寄せ するこずができたす。 「 Fellegi - Sunter 」モデルずいう理論に基づいお2぀のレコヌドの䞀臎確率を求めるのですが、その䞭でパラメヌタチュヌニング䜜業が求められるため、実装ずしおはやや難易床が高くなる傟向にありたす。実装には「 Fellegi - Sunter 」モデルの理解、基本的な 機械孊習 の理解、そのデヌ タセット の理解が必芁 メむンずなる 名寄せ 凊理モデル䜜成など以倖に 名寄せ マッチングに必芁な分析機胜なども提䟛されおおり、 名寄せ のステップでいう察象デヌタの分析を行う API が甚意されおいたす。 Databricksでは以前、ARCAuto Record Linkageずいうレコヌドの 名寄せ を行えるラむブラリが提䟛されおいたした。 内容ずしおはSplinkをラップし、Databricks利甚に特化したものだったようですが、珟圚曎新が停止しおおり、利甚が非掚奚ずなっおいたす代わりにSplinkを盎接䜿っお欲しいず蚘茉あり https://www.databricks.com/blog/improving-public-sector-decision-making-simple-automated-record-linking https://github.com/databricks-industry-solutions/auto-data-linkage Zingg Zinggは、 機械孊習 MLを掻甚した オヌプン゜ヌス の 名寄せ ゚ンティティ解決ラむブラリです。 顧客、補品、 サプラむダヌ など様々な゚ンティティに察応し、異なるデヌタ゜ヌス間や単䞀デヌタ゜ヌス内の重耇レコヌドや同䞀実䜓を特定・結合できたす。 名寄せ 凊理のステップは少しナニヌクで、察象ずなるデヌ タセット からたずラベリングを行い2レコヌドが同䞀か別かを刀断、ラベリングした教垫デヌタを元にト レヌニン グを行い、モデルを䜜成し、実際のデヌ タセット に察しお 名寄せ を行う、ずいった流れを取りたす。 Databricksや Snowflake 、Cassandra、S3、Azure、䞻芁 RDBMS など、倚くのデヌタ゜ヌスやファむル圢匏Parquet, Avro, JSON , CSV などに察応しおおり、特にDatabricksに関しおは、すぐにDatabricks䞊で凊理を実行できるNotebookのサンプルなども提䟛されおいたす。 Databricksが提䟛する特定の ナヌスケヌス に特化したテンプレヌト゜リュヌション アクセラ レヌタヌず呌ばれたすで利甚されおいたり、 AWS の公匏ブログやHightouchのドキュメントで取り䞊げられるなど、 名寄せ ラむブラリの䞭では 比范的 知名床 の高いラむブラリずなっおいたす。 GitHub stars 1k https://www.databricks.com/jp/solutions/accelerators/product-matching-with-ml https://aws.amazon.com/jp/blogs/big-data/entity-resolution-and-fuzzy-matches-in-aws-glue-using-the-zingg-open-source-library/ https://hightouch.com/blog/what-is-entity-resolution 「Databricksで実珟するデヌタ 名寄せ 【抂芁線】」に぀いおは以䞊になりたす。 本蚘事が 名寄せ 凊理を理解する䞊で、少しでもお圹に立おれば幞いです。 「 決定論 的マッチング線」、「確率的マッチング線」では実際にDatabricks䞊で実装する䟋に぀いお玹介したすので、こちらもぜひご芧ください 以䞊、最埌たでご芧いただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @kumakura.koki 、レビュヌ @akutsu.masahiro  Shodo で執筆されたした 
みなさんこんにちは。 ゚ンタヌプラむズ 第䞀本郚の鈎朚です。 この蚘事では、Feature Flagフィヌチャヌフラグを甚いた開発手法に぀いおたずめおいきたす。Feature Flagは昔からある開発手法の䞀぀ですが、調査する䞭で面癜い手法だず思ったため、改めおたずめたいず思いたす。 1.はじめに 2.メリット/デメリット 2-1.メリット リリヌスサむクルずデプロむの分離 安党なデプロむ 本番環境での容易な怜蚌ず実隓 2-2.デメリット コヌドベヌスの乱雑化ずテストCIの耇雑化 未䜿甚のFeature Flagがコヌドベヌスに残るこずで、技術負債を抱える可胜性がある 3.Feature Flagを甚いた開発のラむフサむクル 4.開発のプラクティス 未䜿甚のFeature Flagの定期的な削陀 Feature Flagの呜名ず敎理 決定点ず決定ロゞックを分離する 5.たずめ 6.参考文献 1.はじめに たずはじめに、Feature Flagに぀いお説明したす。 Feature Flagずは、新たなコヌドをデプロむするこずなく、実行時に特定の機胜をオンたたはオフにする゜フトりェア開発手法です。 フィヌチャヌトグルやフィヌチャヌスむッチなどずも呌ばれるこずがありたす。 以䞋に簡単なTypeScriptの実装を掲茉しおいたす。 // app/page.tsx const featureFlag = true ; export default function Home () { return ( { featureFlag ? ( < div > < p > 🎉 新機胜が有効になっおいたす </ p > </ div > ) : ( < div > < p > 🚧 新機胜は無効になっおいたす 。</ p > </ div > ) } ); } このように、特定の機胜やコヌドブロックが実行されるかどうかを条件文にしお、それをフラグによっおオンたたはオフを切り替えたす。 この䟋では分かりやすいように featureFlag ずいう倉数をハヌドコヌドしおいたすが、通垞は蚭定ファむルやデヌタベヌス、管理サヌビスなどで保持したす。 䞊蚘の通り、抂芁自䜓はずおも単玔ですが、Feature Flagを開発に取り入れるこずで埗られるメリットは倚くありたす。 次章では、Feature Flagを開発に取り入れるこずで埗られるメリット/デメリットに぀いおたずめたす。 2.メリット/デメリット 2-1.メリット リリヌスサむクルずデプロむの分離 Feature Flagを採甚するこずの番のメリットは、リリヌスサむクルずデプロむの分離ができるこずだず思いたす。 Feature Flagによっお、実装したコヌドをデプロむするタむミングず、その機胜をナヌザヌに提䟛するタむミングを分離するこずができたす。 蚀い換えるず、機胜リリヌスタむミングに䟝存せずに開発チヌムは任意のタむミングでコヌドをデプロむするこずが可胜になりたす。 デプロむの独立性が高たるこずで、開発チヌムは迅速に短いスパンでコヌド倉曎をメむンブランチにマヌゞしたり、本番環境にデプロむしたりしやすくなりたす。 たた、ナヌザヌぞの機胜リリヌスは、任意のタむミングでFeature FlagをONにするこずで、コヌドのデプロむに䟝存せずにリリヌスが可胜になりたす。これによりリリヌスのタむミングずコヌドデプロむを合わせなくおも良くなりたす。 安党なデプロむ Feature Flagによっお安党に本番環境ぞデプロむするこずができたす。 開発者はナヌザヌが新しく開発した機胜を利甚できない状態でデプロむするこずができたす。 たた、Feature Flagは「 キルスむッチ 」ずしおも機胜したす。仮に本番環境で新機胜を有効化しお問題が発生した堎合、問題のある機胜をピンポむントで、 ロヌルバック なしに迅速に無効化するこずができたす。 以䞊から、機胜リリヌスのリスクを抑え぀぀、安党に本番環境ぞデプロむするこずができたす。 本番環境での容易な怜蚌ず実隓 Feature Flagによっお本番環境を甚いお、以䞋のような怜蚌がしやすくなりたす。 ①本番環境の トラフィック やデヌタ量を甚いた動䜜怜蚌 通垞、怜蚌環境では本番同等の トラフィック やデヌタ量を完党に再珟しお怜蚌するこずができないため、本番環境で予想倖のむンシデントが発生する可胜性がありたす。怜蚌甚ナヌザヌ限定でFeature Flagを有効化すれば、本番環境の トラフィック やデヌタ量など実運甚環境でシステムを怜蚌するこずができたす。 ② カナリア リリヌスによる怜蚌 カナリア リリヌスずは、新バヌゞョンず旧バヌゞョンのアプリケヌションを䞊行皌働させ、新バヌゞョンを段階的に少数のナヌザヌに提䟛し、問題がないこずを確認しおから党䜓にリリヌスする手法です。炭鉱で カナリア を甚いお有毒ガスを怜知しおいたこずに由来したす。 䞀郚のナヌザヌでのみFeature Flagを有効化しおリリヌスするこずで、新機胜のリリヌスの圱響が党ナヌザヌに及ぶリスクを回避しながらリリヌスするこずができたす。 仮に問題が発生した堎合は、Feature Flagを無効にするこずで迅速に ロヌルバック が可胜ずなりたす。たた、リリヌス埌に問題が発生しない堎合は、Feature Flagを有効にするナヌザヌの割合を増やすこずで比范的安党に党䜓ぞのリリヌスが可胜ずなりたす。 ③A/Bテストによる怜蚌 Feature Flagによっお、本番環境で新機胜ず既存機胜を比范し、デヌタに基づいお意思決定を行うこずができたす。 䟋えば、ナヌザヌの半分は新機胜を有効化し、残りは無効化にしたす。そしお本番環境で特定のメトリクスアプリの䜿甚率、コンバヌゞョン率などやナヌザヌフィヌドバックを収集したす。それらを分析しお、新機胜を完党にリリヌスするか、改善するか、削陀するかなど、実デヌタに基づいた粟床の高い意思決定をするこずができたす。 2-2.デメリット コヌドベヌスの乱雑化ずテストCIの耇雑化 Feature Flagを採甚するず、条件分岐if文の実装が増えるこずになりたす。 これによっおコヌドベヌスが乱雑になり、冗長な実装ずなり埗たす。 たた、条件分岐が増えるこずでテストCIの耇雑性が高たりたす。単玔に新機胜ず旧機胜もしくは新機胜がない状態をそれぞれ怜蚌する必芁が生じたす。耇数のFeature Flag同士で䟝存関係がある堎合は、テストケヌス数が指数関数的に増加するため、蚭蚈時に泚意する必芁がありたす。 未䜿甚のFeature Flagがコヌドベヌスに残るこずで、技術負債を抱える可胜性がある Feature Flagの実装でコヌドベヌス䞊に䞍芁なコヌドが残るこずにより、技術負債を抱えるこずがありたす。 適切にFeature Flagが管理されお、怜蚌埌にはきちんず削陀すれば問題はありたせん。しかし、怜蚌期間が長期にわたったり、削陀挏れがたびたび起こったりするず䞍芁なコヌドが残り続けるこずになりたす。 3.Feature Flagを甚いた開発のラむフサむクル Feature Flagを甚いた開発のラむフサむクルの䞀䟋は以䞋のずおりです。 Feature Flagを含む機胜実装・怜蚌 コヌドベヌスでFeature Flagを定矩しお、機胜を実装する。 Feature Flagを定矩ファむルや管理システムに蚭定する。 怜蚌環境などで動䜜怜蚌する。 本番環境ぞデプロむ、Feature Flagの有効化 開発したコヌドを本番環境にデプロむする。 任意のタむミングでFeature Flagを有効化しお機胜をリリヌスする。この時、リリヌス戊略に合わせお新機胜を有効にするナヌザヌの割合やタヌゲットグルヌプを蚭定する。 動䜜やパフォヌマンスの怜蚌 新機胜の動䜜に問題がないこずを確認する。 䞻芁な指暙コンバヌゞョン率、ナヌザヌ゚ンゲヌゞメントなどや、ナヌザヌからのフィヌドバックを収集する。収集した情報を分析するこずで、実装した機胜を完党にリリヌスするか改善するかの刀断材料にする。 Feature Flagの削陀 機胜が完党にリリヌスされたり、廃止されたりした堎合、技術負債を防ぐためにFeature Flagを削陀する。 コヌドベヌスのみでなく蚭定ファむルや管理システムからも削陀する。 4.開発のプ ラク ティス Feature Flagを開発に導入する際、以䞋の点に気を぀ける必芁がありたす。 未䜿甚のFeature Flagの定期的な削陀 「2.メリット/デメリット > 2-2.デメリット」に蚘茉したずおり、Feature Flagを削陀しないでコヌドベヌスに残したたたにするず、技術負債を抱え続けるこずになりたす。 察策ずしおは、以䞋が考えられたす。 機胜実装の バックログ に「Feature Flagの削陀」を含める。 Feature Flagに有効期限を持たせる。䟋えば少し乱暎ではあるが、期限切れのFeature Flagを甚いたCIは倱敗するように蚭定するなどが考えられる。 Feature Flagの 呜名 ず敎理 ファむル名やクラス名などず同様に、Feature Flagにも䞀貫した 呜名芏則 を確立しおおくこずが重芁です。 曖昧な 呜名 をしたFeature Flagが乱立するず、䜕の機胜に察するフラグかわからなくなりたす。結果的にリリヌス時の蚭定ミスにより意図しない機胜が有効化されおしたったり、䞍芁なFeature Flagがコヌドベヌスに残っおしたったりするこずが考えられたす。 各フラグに぀いお、䞀貫した 呜名 で、目的ず想定動䜜を文曞化しお管理しおおくこずが重芁です。 決定点ず決定ロゞックを分離する 少し実装寄りの話になりたすが、Feature Flagによる機胜の有効/無効をチェックする堎所決定点ず、Feature Flagの状態を決定する堎所決定ロゞックを分離するのが良いずされおいたす。 䟋えば以䞋の実装を芋おみたしょう。 // featureFlags.ts 決定ロゞック export type FeatureFlagName = "isNewFeature1Enabled" | "isNewFeature2Enabled"; type FeatureFlagStates = Record<FeatureFlagName, boolean>; // 䟋: 蚭定ファむルやAppConfigのような管理サヌビスなどから取埗した倀 const featureFlagConfig: FeatureFlagStates = { isNewFeature1Enabled: true, isNewFeature2Enabled: false, }; // 決定ロゞック export function isFeatureEnabled(flag: FeatureFlagName): boolean { // 匕数で指定されるフラグ名に蚭定されたBoolean型を返华する。 return featureFlagConfig[flag]; } // app/page.tsx決定点 import { isFeatureEnabled } from "./featureFlags" ; export default function Home () { return ( { isFeatureEnabled ( "isNewFeature1Enabled" ) && ( < div > 🎉 新機胜1が有効です </ div > ) } { isFeatureEnabled ( "isNewFeature2Enabled" ) && ( < div > 🎉 新機胜2が有効です </ div > ) } ); } このように決定点ず決定ロゞックを分離するこずで以䞋のメリットがありたす。 ①メンテナンス性が向䞊する。 決定点ず決定ロゞックを分離するこずで、フラグの刀定基準が倉わっおもフラグの利甚箇所を修正する必芁がありたせん。 そのため、フラグの利甚箇所を探しお䞀埋倉曎する必芁がなく、決定ロゞックのみ修正すれば良くなりたす。 ②テストが容易になる。 決定点ず決定ロゞックを分離するこずで、それぞれ単䜓でのテストが可胜ずなりたす。 仮に決定点ず決定ロゞックが同時に蚘述されおいた堎合、テストケヌスが耇雑になり、ロゞック倉曎の際に ゜ヌスコヌド やテストケヌスの修正に劎力がかかりたす。そのため デザむンパタヌン の「䟝存性の泚入」の原則の通り、決定点ず決定ロゞックは分離しお管理するのが良いず考えられたす。 5.たずめ 今回はFeature Flagに぀いお、抂芁からメリット・デメリット、そしお開発に取り入れる際のプ ラク ティスをたずめたした。 Feature Flagに぀いお調査する前は、単に「if文で新機胜を有効/無効にするだけでしょう」ず雑に理解しおいたしたが、いざ調べるず倚くのメリットがあるこずがわかりたした。 特に、リリヌスサむクルずデプロむの分離が実珟できるこずはずおも魅力的ず感じたした。 䞀方で実際にプロゞェクトに導入する堎合は、開発サむクルの改善やプロゞェクト内の教育など、それなりの劎力がかかりたす。そのため、プロゞェクトに導入したずきのメリット・デメリットをきちんず敎理したうえで刀断しおいくのが倧切だず思いたした。 この蚘事には茉せおいたせんが、理解を深めるためFeature Flagを利甚したデモアプリを構築しおみたした。 今埌蚘事にたずめる予定のため、興味がある方はそちらも読んでいただけるずありがたいです最埌たで読んでいただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 6.参考文献 What are feature flags? - optimizely.com How to Use Feature Flags in Azure DevOps for Seamless Feature Management - www.featbit.co Feature Toggles (aka Feature Flags) 執筆 @suzuki.takuma 、レビュヌ @handa.kenta  Shodo で執筆されたした 
はじめに こんにちは、クロス むノベヌション 本郚゚ンゞニアリングテク ノロ ゞヌ センタヌの埳山です。 この蚘事は、2025幎5月 20日 に公開されたばかりの Terraform MCP Server を GitHub Copilot in VS Code ( 以降、Copilotず蚘茉 ) で䜿甚しおみた䜓隓談です。Terraform MCP Server の導入前のコヌド生成状況から導入内容、導入埌のコヌド生成結果たでを玹介したす。 Terraform MCP Server は、 LLM (倧芏暡 蚀語モデル ) の AI゚ヌゞェントぞ Terraform のプロバむダヌずモゞュヌルの怜出やプロバむダヌのリ゜ヌス詳现情報取埗などの機胜を提䟛する MCP サヌバです。 Terraform MCP Server の導入前の Copilot は、Terraform の AzureRM には存圚しない架空のプロパティを提案しおきおいたしたが、導入埌はシャキッず AzureRM にもずづくコヌドを提案しおくれるようになりたした。 1. Terraform MCP Server 導入前 Copilotぞの䟝頌内容 Copilot に今回䟝頌する内容は、こちらの azurerm_logic_app_workflow のサンプルコヌドぞワヌクフロヌ定矩を远加しおもらいたいずいうものです。 サンプルコヌド Copilot ぞ䟝頌した結果 ( Terraform MCP Serverがないずき ) Copilot ぞ䟝頌するず以䞋のコヌドが提案されたしたが、 definition ずいうプロパティは terraform の AzureRM に存圚しないためにコヌド䞊で゚ラヌになっおいたす。 提案されたコヌド ゚ラヌ内容 2. Terraform MCP Server を導入 Terraform MCP Serverは、先日2025幎5月 20日 にHashicopから公開された MCP サヌバです。 今回は Building the Docker Image locally にしたがっお Docker Image で導入したした。 導入手順の make docker-build の埌、 VS Code で mcp . json ぞ以䞋のずおり蚘茉し、 MCP サヌバが停止しおいれば起動したす。 mcp . json Terraform MCP Server 起動 Copilot Chat を開いお Agentモヌドで Tools を確認した結果は以䞋のずおりで、Terraform MCP Serverが利甚できる状態であるこずを確認できたす。 Agent Tools (䞀芧の䞋の方がTerraform MCP Server) 3. Terraform MCP Server 導入埌 azurerm_logic_app_workflow のサンプルコヌドぞのワヌクフロヌ定矩の远加を再床䟝頌したしたが、導入埌でも導入前ず同等のコヌドを再び提案しおくるため、少しプロンプトを工倫しお Copilot に AzureRM を参照しおもらうようにしたした。 䟝頌した際に Copilot が resolveProviderDocID や getProviderDocs の䜿甚蚱可を求めおきおくれたら蚱可し、それで terraform の AzureRM を参照しおくれるようになりたした。 圓蚘事の䜜成にあたっお䜕床かプロンプトを詊した䞭では、「terraformの公匏情報を参照しお」や「AzureRMの情報を参照しお」などず具䜓的な条件を Copilot ぞ瀺すず話が早いように思いたす。 導入埌に䟝頌1 : 別の Tools をただ䜿甚しお期埅ずは異なる回答 導入埌の䟝頌2 : Terraform MCP Server の resolveProviderDocID や getProviderDocs を䜿甚し始めおコヌド生成 実際に生成されたコヌド ( Terraform MCP Server があるずき ) resource "azurerm_logic_app_workflow" "daily_trigger" { name = "daily-trigger-workflow" location = azurerm_resource_group.eode_datapf.location resource_group_name = azurerm_resource_group.eode_datapf.name workflow_schema = "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#" workflow_parameters = jsonencode({ "definition" = { "triggers" = { "Recurrence" = { "type" = "Recurrence" "recurrence" = { "frequency" = "Day" "interval" = 1 "startTime" = "2025-05-22T01:00:00Z" } } } "actions" = { "Trigger_Container_App_Job" = { "type" = "Http" "inputs" = { "method" = "POST" "uri" = azurerm_container_app_job.generate_tpcds_refresh_data.manual_trigger_url "headers" = { "Content-Type" = "application/json" } } } } "contentVersion" = "1.0.0.0" } }) } 䞊蚘の生成されたコヌドでは、コヌド䞊の゚ラヌは発生しおいたせん。 このたた terraform apply するず゚ラヌになっおしたう内容ではありたすが、存圚しないプロパティを生成しおくるこずはひずたずなくなりたした。 さいごに Terraform MCP Server を導入するこずで GitHub Copilot の生成内容の粟床向䞊を䜓隓できたした。 導入埌も導入前ず同様に definition ずいう間違ったプロパティを提案するこずがあるのですが、これは GitHub Copilot for Azure の Tools を䜿甚しおAzureの公匏ドキュメントを参照しおいる圱響ず掚察しおいたす。 根拠は、Copilot の皌働時に @azure get code gen best practices ずいう GitHub Copilot for Azure の Tools を利甚しおいるログが確認できるこずず、 Azure公匏情報のこちらのペヌゞ のずおり Azure Logic Apps のワヌクフロヌ定矩には definition が存圚しおいるためです。 圓然のこずではありたすが、目的や甚途に応じお MCP サヌバや Agent の Tools を適切に遞別しお切り替えるこずが重芁であるずあらためお感じたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 執筆 @shikarashika 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは。コヌポレヌト本郚 サむバヌセキュリティ掚進郚の耿です。 2025幎3月に tj-actions や reviewdog など有名な サヌドパヌティ アクションを巻き蟌んだ サプラむチェヌン 攻撃が発生したした。 GitHub や GitHub Actions の仕様を熟知したうえで悪甚した、非垞に巧劙な攻撃手法です。  詳现  GitHub Actions の action の利甚は、自組織の GitHub リポゞトリ で第 䞉者 が曞いたコヌドの実行を蚱すこずに他なりたせん。その䟿利さず匕き換えに䞀定のセキュリティリスクを孕んでいるこずを意識し、正しく察策を考えるこずが重芁です。 今回発生したような䟵害ぞの防止策ずしお、 GitHub Actions の action を利甚する堎合のバヌゞョン指定はバヌゞョンタグではなく、フルコミットハッシュSHAを利甚しお「ピン留め」するこず 参考 が、より䞀局掚奚されるようになっおいたす。Gitのコミットハッシュは、 リポゞトリ 内のオブゞェクトを階局的に SHA-1 ハッシュ化したものなので、コヌドが曞き換わるずコミットハッシュも勝手に倉わりたす。぀たりコミットハッシュでバヌゞョン指定するこずにより、実行されるコヌドを事実䞊固定するこずができたす。 しかし、コミットハッシュによるバヌゞョン指定だけで話を終えるのは䞍十分です。運甚たで考えたずきに、コミットハッシュで指定したバヌゞョンの曎新方法にも気を配らないず、党くリスク䜎枛にならない可胜性がありたす。 GitHub Actions の action をバヌゞョン曎新する際の運甚負荷ずセキュリティリスク䜎枛のバランスに぀いお考えおみたす。 おさらいフルコミットハッシュSHAによるバヌゞョン指定 バヌゞョン曎新の課題 解決策セキュリティアップデヌト以倖は曎新を自動化しない 解決策セキュリティアップデヌト以倖は自動曎新を䞀定期間埅機する 自動曎新の埅機期間をどれぐらいにするべきなのか おさらいフルコミットハッシュSHAによるバヌゞョン指定 様々なずころで蚀われおいるこずなので詳现は省きたすが、 GitHub Actions の action に付けられたGitタグは曞き換え可胜なので、バヌゞョンタグでバヌゞョン指定するず、実行されるコヌドは可倉です。 ❌ - uses : actions/checkout@v4 アクションのREADMEや技術蚘事などでバヌゞョンタグによる䟋が蚘茉されおいおも、自分で利甚するずきにはフルコミットハッシュに曞き換えるようにしたしょう。 ✅ - uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 バヌゞョン曎新の課題 フルコミットハッシュでバヌゞョン指定をしおも解決されない課題がありたす。どのようにバヌゞョン曎新を行うかずいう課題です。 特に倚くの GitHub Actions の action を䜿っおいる堎合や、倚くの リポゞトリ を管理しおいる堎合は、バヌゞョンの曎新を手䜜業で実斜するのは手間がかかりたす。手間を枛らすために、Dependabot や Renovate を利甚しお曎新を自動化するこずがよく行われおいたす。Dependabot ず Renovate は、フルコミットハッシュでバヌゞョン指定しおいおも曎新のPRを䜜成できたす。 ここで留意しおおきたいのは、曎新を自動化するこずにより、 新しいバヌゞョンが䟵害されおいた堎合には圱響を受けやすくなっおしたう ずいうこずです。今回 tj-actions/changed-files が䟵害を受けた件でも、バヌゞョンタグが悪意のあるコミットを指すように曎新されたこずを怜知し、倚くの リポゞトリ で動いおいる Renovate がバヌゞョン曎新の PR を出しおいたした 参考 。さらに、 GitHub Actions のワヌクフロヌでよく䜿われる push の むベントトリガヌ では、曎新されたブランチ぀たり曎新された新しいバヌゞョンのワヌクフロヌファむルが実行されたす。぀たり自動䜜成された PR をマヌゞせずずも、PR が自動䜜成されただけで䟵害されたバヌゞョンが自分の リポゞトリ 䞊で実行される可胜性があるずいうこずです。 たずめるず、以䞋の攻撃が成立し埗たす 利甚しおいる GitHub Actions の action が䟵害され、リリヌスされる。あるいは曎新された新しいバヌゞョンに 脆匱性 が含たれる DependabotやRenovateがバヌゞョン曎新を怜知し、PRを䜜る push むベントをトリガヌに実行されるワヌクフロヌでは新しいバヌゞョン䟵害されたバヌゞョン or 脆匱性 のあるバヌゞョンの GitHub Actions の action が実行する 自分の リポゞトリ が被害を受ける GitHub Actions の action の曎新の自動化には気を遣わなければならないず考えおいたす。 解決策セキュリティアップデヌト以倖は曎新を自動化しない 自動化せずにアップデヌトを手䜜業で行えばリスクは䜎枛できたすが、運甚負荷が䞊がっおしたいたす。 特に GitHub Actions のセキュリティアップデヌトを自動化しない堎合、察応たでの時間が䌞びおしたいたす。 䞡者のバランスを考えたずきに、䞀定のセキュリティリスクが発生するこずを承知の䞊で「セキュリティアップデヌトのみを自動化し、それ以倖のアップデヌトは自動化しない」方針が考えられたす。 セキュリティアップデヌトのみの自動化は次の方法で実珟できたす。 Dependabotの堎合 Dependabot Version UpdatesではなくDependabot Security Updatesを利甚する Renovateの堎合 脆匱性 のみ自動曎新するように蚭定する 参考  セキュリティアップデヌト以倖を自動化せずに曎新する郚分に぀いおは、完党に手䜜業でコミットハッシュをコピヌ&ペヌストしおいくのは倧倉なので、ロヌカルツヌルの pinact などでコミットハッシュを曎新するのも良いでしょう。 解決策セキュリティアップデヌト以倖は自動曎新を䞀定期間埅機する Renovateには、セキュリティアップデヌト以倖の曎新をすぐにせずに指定期間埅機しおからPRを䜜成する機胜がありたす。䞀定期間埅機するこずで、その間に攻撃や 脆匱性 が怜知・解決されるこずを期埅するずいう考え方です。 Renovateの堎合 minimumReleaseAge パラメヌタ https://docs.renovatebot.com/configuration-options/#minimumreleaseage Dependabot Version Updatesにも、最近のアップデヌトで同じような機胜がベヌタ版ずしお出おいたす。ただし珟時点ではただ GitHub Actionsはサポヌトされおいないようです。䜿えるようになったら詊しおみたいず思いたす。 Dependabotの堎合cooldown パラメヌタ今埌に期埅 https://github.com/dependabot/dependabot-core/issues/3651 2025/7/10远蚘Dependabotのcooldownパラメヌタが正匏リリヌスされたしたので、 解説蚘事 を公開したした。 自動曎新の埅機期間をどれぐらいにするべきなのか これは答えが出ない問題です。 GitHub Actions の action による悪さを「100%」回避するには次のどちらかしかないず思っおいたす。 GitHub Actions の action をそもそも利甚しない GitHub の公匏 action actions/checkout などが䟵害されるリスクも考慮し、利甚しないずするず、「 GitHub ActionsによるCI/CDを実斜しない」こずずほが同矩になるず思いたす GitHub Actions の action のバヌゞョン曎新をするずきに「コヌドの内容を党お読み」、「動きを完党に理解」したうえで曎新する このどちらも珟実的ではないのは明らかです。 GitHub Actions の action を利甚するこずの䟿利さを享受するには、䞀定のリスクを受容するしかないず考えおいたす。埅機期間の刀断も同じです。今回の䟵害の件では tj-actions に察する䟵害は数日で察応されたしたが、 reviewdog に察する䟵害の察応には1週間以䞊かかったようです。どれぐらいの期間を眮けば䟵害や 脆匱性 が怜知され、受容できる皋床たでリスクが䜎枛するかは皋床問題でしかありたせん。 リポゞトリ の重芁床ず運甚の手間で刀断するこずになるでしょう。 それでもあえお個人的な考えを述べるならば、1週間皋床は少なくずも埅ちたい気持ちがありたす。根拠はなく、ただの個人的な感芚であるこずを匷調しおおきたす。 お読みいただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 執筆 @kou.kinyo 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
初めたしお。゚ンタプラむズ第䞀本郚の䜐藀です。 前回は MCP サヌバヌの立ち䞊げ方の蚘事を䜜成したしたが、今回はこのサヌバヌに接続するClientを甚いお接続偎の実装をするずいう詊みです。 前回蚘事はこちら 【初心者向け】2幎目゚ンゞニアが実践したMCPサヌバヌ構築ガむド2025 既出の内容か぀䞍正確な郚分もあるかもしれたせんが、私の個人的な怜蚌蚘録ずしお残しおおきたいずいう目的でこの蚘事を䜜成したす。 最近 MCP サヌバヌが盛り䞊がっおたすが、サヌバヌぞ接続する方法も知りたかったので本蚘事を䜜成したす。 前回の蚘事では以䞋の図の赀枠の郚分を実装したした。 䞊偎の氎色の矢印郚分にあたるツヌル呌び出し郚はClaudeDesktopに内包されおいたので、前回はこの郚分のロゞックを意識せずにツヌルを実行できるかずいう郚分を怜蚌しおいたした。 さお、ClaudeDesktopから呌び出せるのも良いのですが、通信芏栌を統䞀したずいうずころの良さを実感し぀぀、なぜツヌルが遞択できおいるのかを詳しく芋おいきたす。 では、䟋のごずく MCP QuickStartの For Client Developers を参考にClientの実装を行いたしょう。 たずは環境構築です。 䞊から順に、 䜜業 ディレクト リの䜜成 仮想環境を有効化 仮想環境に必芁な䟝存関係を远加 main.pyを削陀client.pyで䜜業するため client.pyを䜜成 ずいう操䜜をしおいたす。 client.pyが今回、コヌドを䜜成する郚分です。 # Create project directory uv init mcp-client cd mcp-client # Create virtual environment uv venv # Activate virtual environment # On Windows: .venv\Scripts\activate # On Unix or MacOS: source .venv/bin/activate # Install required packages uv add mcp anthropic python-dotenv # Remove boilerplate files rm main.py # Create our main file touch client.py 次はAnthropicの API キヌを取埗しお.envファむルに曞いおおきたす。 ファむルの䜜成 # Create .env file touch .env この.envファむルを線集しお以䞋の蚘述を远加。 your key hereの郚分は API キヌを蚘茉したす。 API キヌの取埗方法はこちらで、 APIのペヌゞ に遷移しお、StartBuildingを抌䞋し、GetAPIkeysを遞択したす。 Create Keyを遞択しお、任意の名前を぀けおAddを抌䞋。 次のポップアップでキヌが出るのでコピヌしおください。 【泚意】この API キヌは厳重に保管し、䜿甚しなくなった堎合は削陀をしおください。流出するず思わぬ課金の原因になりたす。 ANTHROPIC_API_KEY=<your key here> 次に以䞋のコマンドで.gitignoreにこのファむルを远加したす。 構成管理に含めないこずで API キヌがリモヌトレポゞトリに保存されないようにしたす。 echo ".env" >> .gitignore 以䞊で環境構築は終了です。 次にclient.py内で䜜業を行っおいきたす。 import asyncio from typing import Optional from contextlib import AsyncExitStack from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client from anthropic import Anthropic from dotenv import load_dotenv load_dotenv() # load environment variables from .env class MCPClient : def __init__ (self): # Initialize session and client objects self.session: Optional[ClientSession] = None self.exit_stack = AsyncExitStack() self.anthropic = Anthropic() async def connect_to_server (self, server_script_path: str ): """Connect to an MCP server Args: server_script_path: Path to the server script (.py or .js) """ is_python = server_script_path.endswith( '.py' ) is_js = server_script_path.endswith( '.js' ) if not (is_python or is_js): raise ValueError ( "Server script must be a .py or .js file" ) command = "python" if is_python else "node" server_params = StdioServerParameters( command=command, args=[server_script_path], env= None ) stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params)) self.stdio, self.write = stdio_transport self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write)) await self.session.initialize() # List available tools response = await self.session.list_tools() tools = response.tools print ( " \n Connected to server with tools:" , [tool.name for tool in tools]) ここたでがサヌバヌずの接続を担う郚分です。暙準入出力を甚いるようにしおいたす。 async def process_query (self, query: str ) -> str : """Process a query using Claude and available tools""" messages = [ { "role" : "user" , "content" : query } ] response = await self.session.list_tools() available_tools = [{ "name" : tool.name, "description" : tool.description, "input_schema" : tool.inputSchema } for tool in response.tools] # Initial Claude API call response = self.anthropic.messages.create( model= "claude-3-5-sonnet-20241022" , max_tokens= 1000 , messages=messages, tools=available_tools ) ここたでで入力された質問に関する解析を行っおいたす。 具䜓的には関数ツヌルの説明文ず匕数の型の情報をも぀䜿甚可胜なツヌルをLLMに枡しおいたす。 図のようなむメヌゞでツヌル情報ず質問文をLLMに投げちゃっおたす # Process response and handle tool calls final_text = [] assistant_message_content = [] for content in response.content: if content.type == 'text' : final_text.append(content.text) assistant_message_content.append(content) elif content.type == 'tool_use' : tool_name = content.name tool_args = content.input # Execute tool call result = await self.session.call_tool(tool_name, tool_args) final_text.append(f "[Calling tool {tool_name} with args {tool_args}]" ) この郚分でさっき䜿えるツヌル情報ず質問文を投げた結果を甚いおいたす。 むメヌゞは以䞋の図で倩気の質問なら、倩気取埗ツヌルを䜿った方が良いですねずなっおいるずいうこずです。 ここでresultに䜿甚すべきツヌルずしお”use_tool”フラグが぀いた関数を呌び出した結果を栌玍し、LLMに枡すメッセヌゞの䞀郚ずしお栌玍しおいたす。 assistant_message_content.append(content) messages.append({ "role" : "assistant" , "content" : assistant_message_content }) messages.append({ "role" : "user" , "content" : [ { "type" : "tool_result" , "tool_use_id" : content.id, "content" : result.content } ] }) # Get next response from Claude response = self.anthropic.messages.create( model= "claude-3-5-sonnet-20241022" , max_tokens= 1000 , messages=messages, tools=available_tools ) final_text.append(response.content[ 0 ].text) return " \n " .join(final_text) ここで最初の質問文である「今日の倩気は」ず利甚した倩気取埗ツヌルからのレスポンス「晎れ」を甚いお、回答を出力したす。 むメヌゞは以䞋の図の通りです。 ここたでで、LLMぞのリク ゚ス トは2回しおいたす。 たずめるず、1぀のツヌルを呌びだすにはツヌルの刀定、質問文ず結果のセットで回答生成ずいうプロセスを背埌で行うずいうこずです。 async def chat_loop (self): """Run an interactive chat loop""" print ( " \n MCP Client Started!" ) print ( "Type your queries or 'quit' to exit." ) while True : try : query = input ( " \n Query: " ).strip() if query.lower() == 'quit' : break response = await self.process_query(query) print ( " \n " + response) except Exception as e: print (f " \n Error: {str(e)}" ) async def cleanup (self): """Clean up resources""" await self.exit_stack.aclose() async def main (): if len (sys.argv) < 2 : print ( "Usage: python client.py <path_to_server_script>" ) sys.exit( 1 ) client = MCPClient() try : await client.connect_to_server(sys.argv[ 1 ]) await client.chat_loop() finally : await client.cleanup() if __name__ == "__main__" : import sys asyncio.run(main()) 最埌に、先ほどの回答生成プロセスの実䜓であるprocess_query関数で回答を生成するようにしおいたす。 これでサヌバヌを起動する偎の準備が敎いたした。 前回の続きでサヌバヌを立おおいればweather.pyが利甚できるはずなので、こちらを指定しおclient.pyでweather.pyを起動したす。 #pathは自分の環境に蚭定しおください uv run client.py path/to/weather.py このコマンドを実行するず、以䞋のようにコン゜ヌルでLLMを䜿甚でき、 MCP サヌバヌにも接続できおいたす。 実際に䜿甚可胜なツヌルずしお、add、get_alerts、get_forecastの3぀が衚瀺されたした。 Queryの埌に「 サクラメント の倩気は」のように適圓な指瀺文を枡すず回答が生成されたす。 この怜蚌を応甚しおむンタフェヌスを倉えるこずもできそうですね 以䞊で䜜業を終わりたす。 ここたで読んでくださり、ありがずうございたした 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.yu 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
はじめに 初めたしお。 ゚ンタヌプラむズ 第䞀本郚、2幎目の䜐藀悠です。 Datadogは様々な環境でのモニタリングが可胜で、監芖察象の統合に向いおおりオンプレミスず クラりド 環境のハむブリッドの堎合や耇数 クラりド の組み合わせなど、むンテグレヌションの倚様さで柔軟に察応できるのが匷みであるず思いたす。 個人的には䜿いやすくお、デザむンが奜きなので気に入っおいたす。 この蚘事ではAmazonLinuxのマシンむメヌゞを䜿甚したEC2 むンスタンス のメトリクスを、手順のスクショや図解をもずに ダッシュ ボヌドに衚瀺するずころたで実斜したす。 䜜業手順 無料トラむアルを開始したす。 以䞋のサむトにアクセスし、画面䞭倮にある無料トラむアルボタンを抌䞋したす。 https://www.datadoghq.com/ 以䞋の画面で必芁事項の入力が求められるので、これを埋めたす。 䞀応、リヌゞョンが日本になっおいるこずを確認しおください。 入力埌サむンアップのボタンを抌䞋するこずで以䞋のアンケヌトの画面に遷移したす。 党お任意の内容なので実斜はお任せしたす。画面䞋郚たでスクロヌルしNextのボタンを抌䞋したす。 遷移先では以䞋の画面になりたす。 今回は AWS 䞊のマシンむメヌゞがAmazonLinuxのEC2 むンスタンス を立ち䞊げお監芖察象にしたす。 巊偎の Linux を遞択しお、コマンドをコピヌしおおきたす。 では、 AWS でEC2を立ち䞊げたす。 今回はコマンドをEC2䞊で実行する必芁があるので、セッションマネヌゞャヌ以降SSMでEC2に接続する蚭定も同時に行いたす。 むンスタンス 名などは任意のものを䜿甚したすが、OSに関しおは指定したす。 むンスタンス タむプもデモなので最も小さいサむズのものにしおいたす。 ネットワヌク蚭定はSSMを䜿甚するため、アりトバりンドの443ポヌトを蚱可しおいたす。 Datadogの ネットワヌクトラフィック の資料を参考にするずAgentを䜿甚する ナヌスケヌス に限定すれば、アりトバりンドの443ポヌトの解攟のみで動䜜したす。 ネットワヌク蚭定に関する詳现はリンク先の資料をご確認ください。 次に、以䞋の郚分の高床な蚭定を線集しお、SSMに必芁なロヌルを持぀ むンスタンス プロファむルをアタッチしたす。 ない堎合には赀枠の郚分から䜜成したす。 遷移先の画面でロヌルの䜜成を抌䞋しお以䞋の画面に遷移したす。 ラゞオボタン で ナヌスケヌス を遞択しお、System Manager甚のロヌルを䜜成出来ればOKです。 ここで任意のロヌル名を぀けお先ほどのEC2 むンスタンス の画面で むンスタンス プロフィヌルに䜜成したものを遞択すれば、準備完了です。 プロフィヌルが衚瀺されない堎合は少し時間をあけおリロヌドボタンを抌䞋すれば出たす。 むンスタンス が立ち䞊がったこずを確認し、䜜成した むンスタンス IDを抌䞋し、 むンスタンス 抂芁の画面で右䞊の接続ボタンを抌䞋したす。 タブの切り替えでセッションマネヌゞャヌを遞択し、接続を抌䞋したす。 接続ボタンがグレヌになっおいるずきは、ネットワヌクの蚭定、ロヌル、たたはポリシヌの蚭定ができおいない堎合が倚いです むンスタンス に接続埌は CUI の画面で先ほどのDatadogで衚瀺されおいたコマンドを実行したす。 このたたコピヌ&ペヌストしお実行でOKです。 これでDatadogの゚ヌゞェントがEC2 むンスタンス にむンストヌルできたした。 珟時点での構成を図にしお解説したす。 今回はデモなので図のような構成になっおいたす。 実際にはEC2をプラむベヌトサブネットに配眮し、NAT ゲヌトりェむ を䜿甚しお倖郚ず通信するのが望たしいですが、コストの関係で実斜しおいたせん。 では、Datadog画面巊䞋のIntegrationsにカヌ゜ルを合わせ赀枠のView Agentsを抌䞋しお実際にデヌタが取埗できおいるかを確認したしょう。 遷移先でView Agentsを遞択し衚瀺を芋るず以䞋のずおりでAgentをむンストヌルしたEC2 むンスタンス がDataDogず接続できおいるこずが確認できたした。 以䞋の画像で考えるず むンスタンス IDがHOSTNAMEず䞀臎しおいるかで確認できたす。 次に画面巊偎のツヌルの赀枠、Infrastructureを抌䞋したす。 ここで遷移した先に、監芖察象のEC2 むンスタンス が衚瀺されおいたす。 右赀枠のどこでもいいので抌䞋するず詳现な衚瀺を確認するこずができたす。 衚瀺される むンスタンス に関する詳しいメトリクスは以䞋のようになっおいたす。 ここで取埗した内容を ダッシュ ボヌドに衚瀺したす。 これは環境ごずの ダッシュ ボヌドを䜜成し、䞀元管理するこずによっお芋通しが良くなるこずが期埅できたす。 以䞋の画像のように、開発・ STG ・PRODのように分離するこずが実際の運甚ではありそうですね。 では実際に䜜成したす。 巊偎ツヌル赀枠にカヌ゜ルを合わせNew Dashboard を抌䞋したす。 以䞋の衚瀺で名前ず Dashboard の抂芳を決定したす。 以䞋の画面に遷移したら右偎䞊赀枠の怜玢窓でHOSTず怜玢し、右䞋赀枠のHosts Overviewを抌䞋したす。 以䞋の画面で巊偎赀枠のPowerpack filtersで先ほどのhostを遞択したす。 右䞋のconfirmを抌䞋しお Dashboard の りィゞェット に远加したす。 画面のようにモニタリング内容を Dashboard に远加するこずができたした。 モニタリングしおいるCPUの䜿甚率を高めお、画面に反映されるか確認したす。 EC2 むンスタンス に接続しお以䞋のコマンドを実行したす。 sudo yum install stress stress -c 1 CPUに負荷をかけるstressをむンストヌルしお、実際にCPUに負荷をかけたす。 この結果がすぐにモニタヌに反映されUsageが䞊昇したした。 これでEC2 AmazonLinuxを監芖し、遞択した内容を ダッシュ ボヌドに远加するこずができたしたね たずめ 耇雑化し続ける クラりド アヌキテクチャ ヌをDatadogで䞀元管理 14日間はホスト数に制限はありたすが、党おの機胜が無料で䜿えたす。 以降は機胜に制限はかかりたすが怜蚌甚には䜿えるのでありがたいですね 無料期間のスタヌト ダッシュ に本蚘事を参考にしおいただければ幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.yu 、レビュヌ @yamada.y  Shodo で執筆されたした 
こんにちは。金融IT本郚  経営管理 ゜リュヌション郚の藀暫です。 珟圚、金融機関ぞの ERP パッケヌゞの新芏導入案件に携わっおいたす。 私は2023幎10月に 電通 総研旧ISIDぞ䞭途入瀟し、ちょうど1幎半が経過したした。 今回は転職の経緯や入瀟しお感じたこずをお話したいず思いたす。 転職掻動に぀いお 前職はナヌザヌ系 SIer 䌁業で、 ERP の保守を担圓しおいたした。 IT系の業界や仕事が奜きで、転職埌も ERP を甚いた システム開発 に携わりたい、ずいう想いがあったため 同業で ERP を扱っおいる募集に絞り、転職掻動を開始したした。 初めお面接を受けた䌁業が 電通 総研だったのですが、面接が察話圢匏で進んだのが驚きでした。 もっずお堅い堎を想像しおいたした 人事の方をはじめ、珟堎の方から圹職の方たでずおもフランクに接しおくださり ナヌモアを亀えながら進めおくださったのが奜印象でした。 入瀟の決め手 瀟員の皆さんの人柄が1番の決め手ずなりたした。 たた面接で経歎だけでなく、人ずなりたで芋た䞊で遞考しおいただいたこず、 内定承諟前にカゞュアル面談をしおいただき、最埌たでフォロヌが手厚かったこずも良かった点でした。 遞考の過皋で、 電通 総研の皆さんず䞀緒に働きたいずいう想いが匷くなり、 電通 総研ぞの入瀟を決めたした。 入瀟前に䞍安だったこず ①業界の違い 孊生時代は情報系の専攻で、前職は電力業界であったため、金融業界は初めおでした。 そのため業界知識のキャッチアップから始める必芁がありたした。 ②補品の違い 前職はSAPを扱っおおり、今扱っおいる Oracle ERP Cloudは初めおでした。 同じ ERP でも補品が違うず思想や仕組みが党く異なるため、これもたた0からの勉匷が必芁であり ちゃんず貢献できるようになるのか䞍安を感じおいたした。 ③職皮の違い 前職では芪䌚瀟の保守業務を担圓しおいたため、新芏導入案件には携わったこずがありたせんでした。 システム開発 のフロヌは机䞊の知識しかなく、実務は経隓がないため、前述の①②に加え さらに䞍安ずなる芁玠の1぀でした。 入瀟埌のギャップ 遞考䞭のフォロヌがかなり手厚かったため、ギャップはほずんどありたせんでした。 前述の入瀟前の䞍安事項も、郚の皆さんのサポヌトのおかげで、埐々に解消されたした。 1぀挙げるずすれば、“働きやすさ”です。 これはいい意味でのギャップなのですが、想像以䞊に働きやすい環境であるず感じおいたす。 詳现は埌述の「珟圚の働き方」でお話したす。 入瀟前埌における環境の倉化 転職を機に初めお䞊京したため、職堎だけでなく、居䜏環境も倧きく倉わりたした。 䜏む゚リアを決める際、入瀟前にも関わらず、郚の皆さんがアド バむス しおくださったおかげで 通勀時間や䜏みやすさを考慮した、玍埗のいく郚屋に䜏むこずができ、無事東京生掻をスタヌトするこずができたした。 たた勀務スタむルにも倉化がありたした。前職は党員が同じ拠点に出瀟し毎日顔を合わせお働いおいたしたが、 珟圚は、各自が 臚機応倉 に出瀟勀務ず圚宅勀務を遞択できたす。 たたお客様先ぞの移動の前埌などは、サテラむトシェアオフィスでの勀務も認められおいたす。 働きやすい反面、顔を合わせる機䌚が少ないため、最初は郚や仕事に銎染めるのかずおも䞍安でした。 ただ入瀟埌も、郚員党員ずの1on1や、党員ず察面できるようランチ䌚を耇数回䌁画しおいただく等 コミュニケヌションを取りやすくするための、様々な工倫をしおいただきたした。 そのため環境には割ず早い段階で慣れるこずができたず感じおいたす。 䌚瀟や事業郚でも、䞭途入瀟者・女性瀟員・若手瀟員の座談䌚があったりず コミュニティが倚数あるため、䞭途入瀟でも人脈を広げやすい環境かず思いたす。 珟圚の働き方 普段は、基本的に案件業務を行っおおり、これたで芁件定矩テスト工皋たで携わっおきたした。 具䜓的には、お客様ずの仕様の合意圢成や蚭蚈業務・開発チヌムの取りたずめ等を実斜しおいたす。 特に、ナヌザヌず盎接やり取りできるポゞションに憧れおいたので、 電通 総研に入瀟しお 垌望の業務に埓事するこずができ、やりがいや充実感を持っお仕事ができおいたす。 案件以倖では、このような蚘事の執筆䜜業だったり、新人の OJT ・䞭途入瀟者のフォロヌ等を行っおいたす。 勀務堎所は、前述の通り遞択肢が幅広く、自宅・ サテラむトオフィス ・お客様先等、 仕事内容や䜓調に合わせお柔軟に遞択可胜で、メリハリを぀けお働くこずができおいたす。 長期䌑暇のタむミングでは、ワヌケヌション勀務制床を掻甚し、地方にある実家からリモヌトワヌクをするこずもありたす。 忙しい時でも公私ずもに充実させるこずができるため、ずおも働きやすい環境であるず感じおいたす。 デスクワヌクで 疲劎 が溜たった時には、瀟内のマッサヌゞルヌムを利甚し、凝りの解消や息抜きをしおいたす。 瀟員䟡栌で栌安なので、すごくオススメです たたプラむベヌトの話になりたすが、ディズニヌが奜きなので グッズを買ったりパヌクぞ行ったりするこずを楜しみに、日々励んでいたす。 最埌に ここたで読んでいただきありがずうございたした 電通 総研では、新卒・キャリア採甚問わず共に働いおくれる仲間を募集しおいたす。 私の所属する郚は、䞭途瀟員ず新卒瀟員が半々で、女性も半数近くいたす。 たた経隓倀や幎次に関わらず、やりたいこずが実珟できる環境が敎っおいたす。 もし 電通 総研にご興味があれば、応募をご怜蚎いただければず思いたす 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @togashi.ayana 、レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは、クロス むノベヌション 本郚゚ンゞニアリングテク ノロ ゞヌ センタヌの小柀英泰です。 本蚘事では GitHub Codespacesを掻甚する䞭で孊んだ、耇数のDev Containerの蚭定がある リポゞトリ においお、起動するDev Containerを指定する方法を玹介したす。 はじめに 耇数のDev Containerの蚭定方法 ロヌカルマシンでのDev Containerの起動 GitHub CodespacesでのDev Containerの起動 Default Codespaces configration ずは 問題 解決策1 解決策2 さいごに はじめに 前提知識ずなるDev Containerや GitHub Codespacesの抂芁は本蚘事では省略したす。 適宜、過去に匊瀟瀟員が発衚の蚘事や動画を参照しおください。 テックブログGitHub Codespace を䜿った開発環境のメリットをたずめおみた TECH PLAY の蚘事開発効率向䞊・フレキシブルな働き方・セキュリティの確保──ストレスフリヌな開発䜓隓を「GitHub Codespaces」で実珟するポむント解説 TECH PLAY のアヌカむブ動画開発効率向䞊も、フレキシブルな働き方も、セキュリティの確保も、GitHub Codespacesで実珟-ストレスフリヌな開発䜓隓のカギ- 耇数のDev Containerの蚭定方法 耇数のDev Containerを蚭定するには、 リポゞトリ の .devcontainer 配䞋はどのような ディレクト リ構成になるでしょうか。 䟋えば、 VSCode のドキュメント Connect to multiple containers では、䞋蚘の構成を採っおいたす。 📁 project-root 📁 .git 📁 .devcontainer 📁 python-container 📄 devcontainer.json 📁 node-container 📄 devcontainer.json 📁 python-src 📄 hello.py 📁 node-src 📄 hello.js 📄 docker-compose.yml .devcontainer 配䞋に蚭定ごずの ディレクト リ python-container ず node-container を䜜成し devcontainer.json を眮いおいたす。 䞊蚘の構成にならっお、耇数のDev Containerの蚭定をしたした。 . ├── .devcontainer ├── DevContainerA │ └── devcontainer.json └── DevContainerB └── devcontainer.json .devcontainer/DevContainerA/devcontainer.json の䞭身 { " name ": " DevContainerA ", " image ": " mcr.microsoft.com/devcontainers/base:ubuntu " } .devcontainer/DevContainerB/devcontainer.json の䞭身 { " name ": " DevContainerB ", " image ": " mcr.microsoft.com/devcontainers/base:ubuntu " } それではロヌカルマシンず GitHub Codespaces䞊の2぀のパタヌンでDev Containerの起動方法を確認したしょう。 ロヌカルマシンでのDev Containerの起動 ロヌカルマシンでのDev Containerの起動手順を確認したす。 VSCode の コンテナヌで再床開く を遞択するず、蚭定したDev Containerの䞀芧が衚瀺され、起動察象のDev Containerを遞べたす。 GitHub CodespacesでのDev Containerの起動 GitHub CodespacesでのDev Containerの起動手順を確認したす。 VSCode の Create New Codespace... を遞択埌、起動察象のブランチを遞択するず、Dev Containerの䞀芧が衚瀺されたす。 ロヌカルマシンの堎合ず異なり、 GitHub Codespacesの堎合は、䞀番䞊に Default Codespaces configration が衚瀺されおいたす。Default Codespaces configrationずは、䞀䜓䜕者なのでしょうか。 Default Codespaces configration ずは Default Codespaces configration を日本語では 既定の開発コンテナヌ構成 ず呌びたす。 既定の開発コンテナヌ構成ずは、 GitHub が甚意したDev Containerです。䞋蚘の特城がありたす。 GitHub によっお既定の Linux むメヌゞからコンテナヌが䜜成されたす。 この Linux むメヌゞには、 Python 、Node、 PHP 、 Java 、Go、 C++ 、 Ruby 、.NET Core/ C# などの䞀般的な蚀語のランタむム バヌゞョンが倚数含たれおいたす。 これらの蚀語の最新たたは LTS リリヌスが䜿甚されたす。 JupyterLab や Conda など、デヌタ サむ゚ンスず 機械孊習 をサポヌトするツヌルもありたす。 既定の開発コンテナヌ むメヌゞには、Git、 GitHub CLI 、yarn、openssh、 vim などの他の開発者ツヌルやナヌティリティも含たれおいたす。 詳现は 既定の開発コンテナヌ構成の䜿甚 を参照しおください。 たた、Default Codespaces configrationが衚瀺されるのは、 .devcontainer 盎䞋に devcontainer.json がない堎合の GitHub の仕様です。 .devcontainer/devcontainer. json たたは .devcontainer. json が存圚する堎合は、codespace を䜜成するずきに䜿甚可胜な構成ファむルの䞀芧でそれが既定の遞択になりたす。 どちらのファむルも存圚しない堎合は、既定の開発コンテナヌ構成が既定で遞択されたす。 詳现は codespace の䜜成時における既定の構成の遞択 を参照しおください。 問題 VSCode から GitHub Codespacesを起動する堎合はDev Containerの䞀芧が衚瀺され起動察象のDev Containerを遞べるため、䞀芋問題はなさそうです。しかし、ブラりザの github .comから GitHub Codespacesを起動する堎合に泚意が必芁です。 リポゞトリ を開き Code をクリックし Codespacesタブ を開きたす。 + ボタン たたは Create codespace on main をクリックするず、自動で既定の開発コンテナヌ構成で起動したす。 起動察象のDev Containerを遞ぶこずはできたせん。 起動察象のDev Containerを遞ぶには、  ボタン から New with options... をクリックしたす。遷移先の画面で他のオプションも含め遞択するこずができたす。 毎回、 New with options... から起動するのは面倒です。油断しお + ボタン たたは Create codespace on main から起動し、 npm run dev などのコマンド実行の倱敗埌にミスに気づき残念な気持ちにもなりたす。再䜜成には時間も費甚もかかるので改善したしょう。 解決策1 ディレクト リの構成を倉曎したす。 DevContainerA 配䞋の devcontainer.json を .devcontainer 盎䞋に移動するこずでデフォルトのDev ContaienerをDevContainerAの蚭定ずするこずができたす。 倉曎前の構成 . ├── .devcontainer ├── DevContainerA │ └── devcontainer.json └── DevContainerB └── devcontainer.json 倉曎埌の構成 . ├── .devcontainer │ ├── DevContainerB │ │ └── devcontainer.json │ └── devcontainer.json 倉曎埌はDefault Codespaces configrationが消え、デフォルトでDevContainerAが遞択されたす。 VSCode から起動する堎合もDefault Codespaces configrationが消えおいたす。 なお、 ディレクト リ構成を倉曎しおもロヌカルマシンでのDev Containerの起動方法に圱響はありたせん。 解決策2 ディレクト リ構成を倉えない堎合は、READMEに GitHub Codespaces 䜜成ペヌゞぞのリンクを眮くこずで問題を回避できたす。蚭定するURLは Share a deep link から確認できたす。 Markdown タブを開くず、READMEに埋め蟌む倀をコピヌできたす。 [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Hideyasu-Ozawa/multi-dev-container) 䞊蚘コピヌした倀をREADMEに貌り付けるず、バッゞが衚瀺されたす。 バッチをクリックするずオプションを遞択する画面に飛びたす。 各オプションの倀もク゚リパラメヌタを倉曎するこずで簡単にカスタマむズできたす。バッチに蚭定したURLを䞋蚘に倉曎したす。 https://github.com/codespaces/new/Hideyasu-Ozawa/multi-dev-container?skip_quickstart=true&machine=standardLinux32gb&repo=934587189&ref=branchName&devcontainer_path=.devcontainer%2FDevContainerB%2Fdevcontainer.json&geo=UsEast) バッチをクリックするず、ブランチにbranchName、Dev ContainerにDevContainerB、RegionにUS East、Machine typeに4-coreを蚭定した状態で開きたす。 READMEに配眮したバッチから GitHub Codespacesを䜜成するこずで、Dev Containerに既定の開発コンテナヌ構成を䜿うミスを回避できるようになりたした。 さいごに 本蚘事では、耇数のDev Containerの蚭定がある リポゞトリ においお、 GitHub Codespacesで起動するDev Containerを指定する方法を玹介したした。 ロヌカルマシンず GitHub CodespacesでDev Containerを起動する際の仕様が異なるこずには泚意が芁りたすが、解決策1の ディレクト リ構成を倉曎し぀぀、解決策2のREADMEにリンクを眮くこずで、 GitHub Codespacesの起動時の䜓隓をより良くするこずができたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ozawa.hideyasu 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは。 ゚ンタヌプラむズ 第䞀本郚 戊略゜リュヌション 1 郚の英です。 普段はWebアプリや スマホ アプリの案件などを担圓しおいたす。あず、趣味でAIを勉匷しおいたす。 OpenAIから新しいCodexが発衚されたのでさっそく遊んでみたす。 https://help.openai.com/en/articles/11096431-openai-codex-cli-getting-started 1.環境構築 2.むンストヌル 3.デモアプリを䜜る 4.デモアプリで遊んでみる 5.デモアプリで遊んでみる(再) 6.デザむンを敎える 7.テストコヌドを曞かせおみる 8.テストコヌドを远加しおみる さいごに 1.環境構築 詳现は割愛したすが、手元で以䞋を行っおください。 筆者の環境は Windows です。 VSCode のむンストヌル Node.jsのむンストヌル(npmにパスを通す) API キヌを発行する(OpenAIのDeveloperペヌゞで䜜成できる) 2.むンストヌル VSCode で新芏のタヌミナルを開き、以䞋を実行したす。 npm実行の際に、暩限系で止められたら各自で远加しおください。 npm install -g @openai/codex 次に以䞋を実行したす。 codex これで動かせたす。早い。 3.デモアプリを䜜る さお、さっそくアプリを䜜っおみたしょう。 そうですね。 「愚痎を吐いたらAIが励たしおくれるようなサヌビス」なんおどうでしょうか。 ア むデア の匕き出しで攟眮しおいたのですが、ここで消費しおみようず思いたす。 Codexに以䞋のプロンプトを送信しおみたす。 Node.js + Express を䜿っお、愚痎を投皿するず耇数の仮想キャラクタヌ陜キャ・理系・スパルタ・癒し系が ChatGPT API を䜿っお日本語で励たしのコメントを返しおくれるWebアプリを䜜っおください。UIはEJSで構築し、すべお日本語衚瀺にしおください。 ChatGPTのAPIキヌはenvファむルにセットする仕組みずしたしょう。 モデルはgpt-4o-miniなんおどうでしょう 思考が始たりたした。かわいいですね。 mkdirのコマンドを叩きたいず芁求しおきたした。蚱可しおみたす。 実行できなくお困っおたすね。かわいいですね。 すごい手前で躓いおいるので情報を足しおみたす。 package. json を䜜成しおいいかず聞かれたした。「Y」で肯定しおおきたす。 ファむルが䜜られたした。 次はnode_modulesの ディレクト リずenvファむルの䜜成を提案しおきたした。「Y」で肯定しおおきたす。 READMEの䜜成を提案しおきたした。「Y」で肯定しおおきたす。 やっず䞭身のコヌディングに入りたした。index.jsの提案が来たした。「Y」で肯定しおおきたす。 このペヌスでスクショを茉せおいるず長くなりそうなので、CodeXが考えに詰たるたでスキップしたすね。 4.デモアプリで遊んでみる Yを10回くらい抌したらアプリができたようです。 以䞋は最埌の出力で、このアプリの実行方法を教えおくれおいたす。手順に埓っおみたす。 ゚ラヌを吐きたした。もう䞀床Codexを開いお、この事実を䌝えたす。(党文コピペでOK) デバッグ 方法を考え始めたした。しばらく提案を受けたしょう。 「Y」を5回くらい叩くず、バグ修正が終わったみたいです。 5.デモアプリで遊んでみる(再) 再床実行するずうたく起動したした。 さっそく localhost にアクセスしおみたす。 気になっおいたのですが、 CSS は曞いおいない(そもそも呜什しおいない)ので単玔なHTMLが衚瀺されおいたす。 䞊手くいきたした。 急に4人から励たされるずびっくりしたすね。 ちなみに、ChatGPT API ぞのプロンプトは以䞋のように蚭蚈されおいたした。 const personas = [ { key: 'yo', name: '陜キャ', system: 'あなたは陜キャのキャラクタヌです。明るく元気な蚀葉でナヌザヌを励たしおください。' }, { key: 'rikei', name: '理系', system: 'あなたは理系のキャラクタヌです。論理的で萜ち着いた蚀葉でナヌザヌを励たしおください。' }, { key: 'sparta', name: 'スパルタ', system: 'あなたはスパルタのキャラクタヌです。厳しくも的確な蚀葉でナヌザヌを励たしおください。' }, { key: 'iyashi', name: '癒し系', system: 'あなたは癒し系のキャラクタヌです。優しく枩かい蚀葉でナヌザヌを励たしおください。' }, ]; 6.デザむンを敎える シンプルなHTMLだずちょっずダサすぎるので、いたっぜいデザむンに曞き換えおみたしょう。 デザむン修正だけなのに「Y」を10回くらい叩かされたした。 以䞋に理由を曞いおいたすが、CodeXに文脈を䌝えるのが少し面倒でした。 この蟺は GitHub Copilotの方が操䜜性は高いず感じたす。 7.テストコヌドを曞かせおみる 自動生成の ゜ヌスコヌド はテストコヌドずセットで䜜成するべきだず個人的には考えおいたす。 今回もテストコヌドを曞かせおみたす。 先ほどの CSS の䜜成の時もそうでしたが、CodeXが珟状を把握をするのにすごく時間がかかりたす。 以䞋のプロンプトはかなり有効だったのでお詊しあれ。 テストコヌドが提案されたした。 テストに実行方法も蚘茉しおくれおいるので実行しおみたす。 コケたした。 Codexに䌝えお、原因を探りたす。 修正が完了したため、再テストしおみたす。 GETずPOSTの2本のテストに通過したした。 8.テストコヌドを远加しおみる テストコヌドが少なすぎるので、Codexに愚痎をこがしたす。 愚痎をこがしたあずのペヌゞの確認がテストコヌドに远加されたした。 submitのPOSTも含めおテストに通過したした。めでたしめでたし。 さいごに さお、今回はCodexの怜蚌を行いたしたが、コンテキストの枡し方以倖は特に䞍䟿な点はありたせんでした。 反省点ずしおは、スタヌト地点でデザむンに぀いおも蚀及するべきだったな・・・、ず。 今回の怜蚌でかかったコストは$2$3くらいでした。 無駄なキャッチボヌルが倚かったので、初期のプロンプトを最適化すればもっず安く枈むず思いたす。 これからも AWS やAI関連の怜蚌蚘事をたくさん曞いおいきたす。 ↓ のスタヌを抌しおいただけるず嬉しいです。励みになりたす。 最埌たで読んでいただき、ありがずうございたした。 ゚ンタヌプラむズ 第䞀本郚では䞀緒に働いおくださる仲間を募集䞭です。以䞋のリンクからお願いしたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 䞭途採甚-゚ンタヌプラむズ第䞀本郚 新卒採甚-゚ンタヌプラむズ第䞀本郚 執筆 英 良治 (@hanabusa.ryoji) 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
初めたしお。 ゚ンタヌプラむズ 第䞀本郚、2幎目の䜐藀悠です。 最近話題の MCP サヌバヌを構築しお、倖郚情報ずの連携をするずいう挑戊をしたす。 既出の内容か぀䞍正確な郚分もあるかもしれたせんが、私の個人的な怜蚌蚘録ずしお残しおおきたいずいう目的でこの蚘事を䜜成したす。 想定読者はゞュニアレベルの゚ンゞニアが MCP サヌバヌずは䜕かどのように構築するかを実䟋ず共に知りたいずいう際に読むのがちょうど良いず思っおいたす。 目次 MCPずは アヌキテクチャ抂芁 テスト実行 远加の怜蚌 たずめ 参考文献 MCP ずは 提䟛元のAnthropicにおける説明[ 1 ]は以䞋の通りです。 The Model Context Protocol is an open standard that enables developers to build secure, two-way connections between their data sources and AI-powered tools. 私の理解ではAI Agentが倖郚情報を取埗する際の接続郚の話だず思っおいたす。 ぀たりは、 MCP サヌバヌを甚いるこずでAI Agentず倖郚デヌタリ゜ヌス間での安党なコネクタの芏栌敎備をしたずいうこずです。 統䞀芏栌が提䟛されおいるのでAI Agentに手軜に機胜を茉せたり、粟床を向䞊させたりできるようになり、 MCP を䞭心に゚コシステムが盛り䞊がりを芋せおいるずいう珟状の分析をしおいたす。 2025幎3月27日にはChatGPTのAgent SDK にも MCP をサポヌトするずいったような旚の発衚がありたした。 このように異なるAI Agentで様々なデヌタ゜ヌスを利甚できるようになるず、自由床や拡匵性が高たりAI Agentの発展に぀ながるず感じたすし、この朮流に乗りたいずも感じさせたす。 以䞊が MCP の抂芳で、本蚘事を䜜成するモチベヌションです。 アヌキテクチャ 抂芁 本蚘事では、はじめに公匏が提䟛しおいるQuickStart[ 2 ]ず党く同じ構成でサヌバヌを䜜成しおみたした。 簡単な構成図は以䞋のずおりです。 ClaudeDesktopのむンストヌルずサむンむンをあらかじめしおおきたす。 このアプリから MCP サヌバヌにアクセスし、倩気の情報を取埗するような構成です。 具䜓的には以䞋のツヌルを MCP サヌバヌに配眮したす。 get-alerts 指定された地域で珟圚出おいる譊報を取埗する get-forecast 指定された地点の倩気予報を取埗する 私の環境は Windows なので、参考資料のその手順に埓い実行したコマンドを茉せおいたす。 以䞋のコマンドを PowerShell で実行したす。 uvをむンストヌルし、 Python プロゞェクトを甚意したす。 powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 次に䜜業 ディレクト リを䜜成し、移動。 仮想環境を䜜成しお䟝存関係をむンストヌル。 最埌に Python のファむルを䜜成するコマンドを実行したす。 # Create a new directory for our project uv init weather cd weather # Create virtual environment and activate it uv venv .venv\Scripts\activate # Install dependencies uv add mcp[cli] httpx # Create our server file new-item weather.py 以降の䜜業は、ここで䜜成したweather.pyを線集したす。 ファむルの先頭に以䞋のコヌドを远加。 from typing import Any import httpx from mcp.server.fastmcp import FastMCP # Initialize FastMCP server mcp = FastMCP( "weather" ) # Constants NWS_API_BASE = "https://api.weather.gov" USER_AGENT = "weather-app/1.0" The FastMCP class uses Python type hints and docstrings to automatically generate tool definitions, making it easy to create and maintain MCP tools. ここの泚釈にPyhtonの型ヒントずドキュメントで、このツヌルを定矩したすずありたす。 この郚分の理解は実装埌にできたした。最埌に解説したす。 次に倖郚情報を取埗する郚分を実装しおいたす。 #これがリク゚スト凊理 async def make_nws_request (url: str ) -> dict [ str , Any] | None : """Make a request to the NWS API with proper error handling.""" headers = { "User-Agent" : USER_AGENT, "Accept" : "application/geo+json" } async with httpx.AsyncClient() as client: try : response = await client.get(url, headers=headers, timeout= 30.0 ) response.raise_for_status() return response.json() except Exception : return None #これがフォヌマッタ def format_alert (feature: dict ) -> str : """Format an alert feature into a readable string.""" props = feature[ "properties" ] return f """ Event: {props.get('event', 'Unknown')} Area: {props.get('areaDesc', 'Unknown')} Severity: {props.get('severity', 'Unknown')} Description: {props.get('description', 'No description available')} Instructions: {props.get('instruction', 'No specific instructions provided')} """ これは以䞋のツヌル内の凊理で倖郚に情報を取埗しにいく際ず取埗したデヌタ敎圢に䜿甚しおいたす。 get_alertsはUS state codeを期埅しおいたす。 これをURLのパスに加えるこずで、その地域の情報を API で取埗できるずいう寞法です。 get_forecastも緯床・経床で同様の凊理をリク ゚ス トしおいたすね。 @ mcp.tool () async def get_alerts (state: str ) -> str : """Get weather alerts for a US state. Args: state: Two-letter US state code (e.g. CA, NY) """ url = f "{NWS_API_BASE}/alerts/active/area/{state}" data = await make_nws_request(url) if not data or "features" not in data: return "Unable to fetch alerts or no alerts found." if not data[ "features" ]: return "No active alerts for this state." alerts = [format_alert(feature) for feature in data[ "features" ]] return " \n --- \n " .join(alerts) @ mcp.tool () async def get_forecast (latitude: float , longitude: float ) -> str : """Get weather forecast for a location. Args: latitude: Latitude of the location longitude: Longitude of the location """ # First get the forecast grid endpoint points_url = f "{NWS_API_BASE}/points/{latitude},{longitude}" points_data = await make_nws_request(points_url) if not points_data: return "Unable to fetch forecast data for this location." # Get the forecast URL from the points response forecast_url = points_data[ "properties" ][ "forecast" ] forecast_data = await make_nws_request(forecast_url) if not forecast_data: return "Unable to fetch detailed forecast." # Format the periods into a readable forecast periods = forecast_data[ "properties" ][ "periods" ] forecasts = [] for period in periods[: 5 ]: # Only show next 5 periods forecast = f """ {period['name']}: Temperature: {period['temperature']}°{period['temperatureUnit']} Wind: {period['windSpeed']} {period['windDirection']} Forecast: {period['detailedForecast']} """ forecasts.append(forecast) return " \n --- \n " .join(forecasts) 最埌にサヌバヌの初期化ず実行を蚘述したす。 この郚分の意味は盎接 スクリプト が実行された際に、暙準入出力を通信手段に䜿うずいう意味です。 if __name__ == "__main__" : # Initialize and run the server mcp.run(transport= 'stdio' ) これで MCP サヌバヌの準備は終わりたした。 次にClaudeがこのサヌバヌにアクセスできるようにしたす。 code $env:AppData\Claude\claude_desktop_config.json 以䞊のコヌドを PowerShell で実行したす。これは単玔にClaude Desktopの蚭定ファむルを曞くために VScode を開くだけのものです。 開いたら以䞋の蚭定を蚘述。 { "mcpServers" : { "weather" : { "command" : "uv" , "args" : [ "--directory" , //ここは実際のweather.pyたでの絶察パスを蚘述する "/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather" , "run" , "weather.py" ] } } } さっきたで線集しおいたweather.pyを実行するようにClaude偎に指瀺しおいたす。 これで暙準入出力を埅぀サヌバヌが立ち、回答のための情報をどのツヌルで取埗するかを遞ぶ準備がClaudeでもできたした。 それではテストです テスト実行 以䞋の画像の赀䞞で囲った郚分のハンマヌアむコンが MCP サヌバヌに配眮されたツヌルの数を瀺しおいたす。 手順に沿っおいれば2個のはずです。私は远加したので3の衚瀺です。 私は実装盎埌はここで倉曎が反映されおいたせんでした。 以䞋のスクショのように、䞀床巊䞊のメニュヌからファむル→終了たたは衚瀺→再読み蟌みで戻っおくるず反映されおいたした。 たたメニュヌから開発者の機胜を有効にするず MCP サヌバヌのログを芋るこずができるようになりたす。 他の原因で動䜜しなかった堎合は、このログを参考に修正を加えるず良いず思いたす。 反映されたら、ハンマヌアむコンをクリックするず䜿甚できるツヌルが衚瀺されたす。 では、ようやくですが参考資料に埓っお以䞋のプロンプトでテストを実行したす。 What’s the weather in Sacramento? What are the active weather alerts in Texas? たずは䞀぀目。日本語でも指瀺が可胜かも含めお怜蚌したした。 What’s the weather in Sacramento? ツヌルを䜿甚しおいいかの蚱可を聞くポップアップが出たす。 おお無事 サクラメント の倩気を取埗できたした。 次に二぀目。ちゃんず英語でも怜蚌したす。 What are the active weather alerts in Texas? 同様にツヌル実行のポップアップが出お、回答が生成されたした。 䜕気なく䜿甚しおいたすが、ツヌルの匕数に緯床・経床/US state codeを求めおいるのに回答生成できるの凄いですねLLMが情報補完をしおいるのでしょう。 远加の怜蚌 さらにツヌルを䜜っおみる実隓をしたした。 コヌドは以䞋のずおりです。 @ mcp.tool () def add (a: int ,b: int ) -> int : """䟋の凊理ずいえばこれです. 匕数 数字文章䞭の二぀の数字 """ return a + b 今たでの曞き方を参考に、凊理を远加したした 「䟋の凊理」のように背景情報が必芁なものはLLMは通垞回答できたせん。 このツヌルの远加で足し算が実行出来たら、远加の怜蚌は成功です。 出来たした足し算はLLMでも回答できたすが、「䟋の凊理」の理解はできないですからね ちゃんずツヌル実行蚱可のポップアップも出珟したした。 ここの泚釈にPyhtonの型ヒントずドキュメントで、このツヌルを定矩したすずありたす。 この郚分の理解は実装埌にできたした。最埌に解説したす。 最埌に远加実装郚分を䟋に䞊蚘の内容を解説したす。 関数宣蚀の埌に以䞋のテキストを远加しおいたすね。 """䟋の凊理ずいえばこれです. 匕数 数字文章䞭の二぀の数字 """ ここでしか、「䟋の凊理」は蚘述しおいたせん。 ぀たり、関数の説明をテキストですれば、ツヌルを遞択可胜な状態にできるずいうこずですね。 型ヒントの郚分も def add(a:int,b:int) -> int: のように蚘述するこずで、図䞭のプロンプトの埌半、意味䞍明な数倀の䞊び 䟋の凊理を頌む 10 20 を解釈できおいそうです。 怜蚌は以䞊です。 たずめ MCP がなぜ盛り䞊がっおいるのかを実装しおみお理解したした。 今のうちに詳しくなっおおきたいですね 参考文献 [1] https://www.anthropic.com/news/model-context-protocol [2] https://modelcontextprotocol.io/quickstart/server#installing-prerequisites-macos 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.yu 、レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは。クロス むノベヌション 本郚 クラりド むノベヌション センタヌの柎田です。 re:Invent 2024 で Amazon EKS Auto Mode の䞀般提䟛が発衚されたした。この蚘事では Auto Mode を利甚する際に気を぀けるべきこずをご玹介したす。 ℹ この蚘事の内容は 2025 幎 2 月 22 日時点のものです。最新の情報は Amazon EKS の公匏ドキュメント をご参照ください。 Amazon EKS Auto Mode ずは Amazon EBS CSI driver OSS 版ずの䞻な違い OSS 版ず䜵甚できる OSS 版からリ゜ヌスを移行できない Auto Mode のノヌド以倖では利甚できない Amazon VPC CNI plugin OSS 版ずの䞻な違い AWS Load Balancer Controller OSS 版ずの䞻な違い 蚭定項目が異なる OSS 版ず䜵甚できる OSS 版からリ゜ヌスを移行できない .spec.loadBalancerClass のデフォルト倀が eks.amazonaws.com/nlb になる 補足Service, Ingress がどの controller によっお凊理されるか Service Ingress Karpenter OSS 版ずの䞻な違い 蚭定項目が異なる ノヌドの AMI は AWS によっお管理される ノヌドは起動から最長 21 日経過するず終了する Pod からノヌドのむンスタンスメタデヌタやむンスタンスプロファむルを利甚できない その他 他のコンピュヌトリ゜ヌスず䜵甚できる 組蟌みの NodeClass, NodePool は線集できない コスト 終わりに 参考資料 Amazon EKS Auto Mode ずは Amazon EKS Auto Mode では以䞋のアドオンに盞圓する機胜がマネヌゞドサヌビスずしお提䟛されたす。 Amazon EBS CSI driver Amazon VPC CNI plugin AWS Load Balancer Controller CoreDNS Karpenter kube-proxy EKS Pod Identity Agent これにより クラスタ 管理者はこれらのアドオンの保守・運甚から開攟されたす。 ℹ この蚘事では各アドオンの解説はしたせん。各アドオンの詳现はそれぞれの公匏ドキュメントをご参照ください。 Amazon EBS CSI driver OSS 版ずの䞻な違い Auto Mode は Amazon EBS CSI driver ず以䞋の違いがありたす。 1 The block storage capability of EKS Auto Mode is different from the EBS CSI Driver. Static Provisioning If you want to use externally-created EBS volumes with EKS Auto Mode, you need to manually add an AWS tag with the key eks:eks-cluster-name and the value of the cluster name. Node Startup Taint You cannot use the node startup taint feature to prevent pod scheduling before storage capability readiness Custom Tags on Dynamically Provisioned Volumes You cannot use the extra-tag CLI flag to configure custom tags on dynamically provisioned EBS volumes You can use StorageClass tagging to add custom tags. EKS Auto Mode will add tags to the associated AWS resources. You will need to update the Cluster IAM Role for custom tags. For more information, see Custom AWS tags for EKS Auto resources. EBS Detailed Performance Metrics You cannot access Prometheus metrics for EBS detailed performance OSS 版ず䜵甚できる Auto Mode ず Amazon EBS CSI driver は䜵甚できたす。 OSS 版からリ゜ヌスを移行できない 既存の PersistentVolume の管理を Amazon EBS CSI driver から Auto Mode ぞ移行できたせん。 Auto Mode のノヌド以倖では利甚できない Auto Mode が管理する PersistentVolume を利甚するためにはノヌドで Auto Mode の CSI driver の node plugin が動いおいる必芁がありたす。そのため該圓する PersistentVolume を利甚する Pod は Auto Mode のノヌドで実行する必芁がありたす。 同様に Amazon EBS CSI driver が管理する PersistentVolume を利甚するためにはノヌドで Amazon EBS CSI driver の node plugin が動いおいる必芁がありたす。 Amazon EBS CSI driver の node plugin の DaemonSet は Auto Mode のノヌドでは実行されたせん。そのため該圓の PersistentVolume を利甚する Pod は Auto Mode 以倖のノヌドで実行する必芁がありたす。 Amazon VPC CNI plugin OSS 版ずの䞻な違い Auto Mode は Amazon VPC CNI plugin ず以䞋の違いがありたす。 2 EKS Auto Mode does not support: Security Groups per Pod (SGPP). Custom Networking. The IP Addresses of Pods and Nodes must be from the same CIDR Block. Warm IP, warm prefix, and warm ENI configurations. Minimum IP targets configuration. Enabling or disabling prefix delegation. Other configurations supported by the open-source AWS CNI. Network Policy configurations such as conntrack timer customization (default is 300s). Exporting network event logs to CloudWatch. AWS Load Balancer Controller OSS 版ずの䞻な違い 蚭定項目が異なる 以䞋のリ゜ヌスは AWS Load Balancer Controller ず蚭定項目フィヌルドや annotationが異なりたす。 Service Ingress IngressClassParam TargetGroupBinding 詳现は以䞋のドキュメントをご参照ください。 Create an IngressClass to configure an Application Load Balancer - Amazon EKS Use Service Annotations to configure Network Load Balancers - Amazon EKS OSS 版ず䜵甚できる Auto Mode ず AWS Load Balancer Controller は䜵甚できたす。 OSS 版からリ゜ヌスを移行できない 既存の Service, Ingress の管理を AWS Load Balancer Controller から Auto Mode ぞ移行できたせん。 .spec.loadBalancerClass のデフォルト倀が eks.amazonaws.com/nlb になる Service の .spec.loadBalancerClass が未指定の堎合、 Auto Mode は mutating webhook によっおこの倀を eks.amazonaws.com/nlb に蚭定したす。これには以䞋の圱響がありたす。 AWS Load Balancer Controller にも 類䌌の mutating webhook がありたす。䞡者を有効にしおいる堎合、正垞に機胜するのは片方のみです。 .spec.loadBalancerClass を未指定のたたにできないため、新芏に CLB を䜜成できたせん。 補足Service, Ingress がどの controller によっお凊理されるか Service .spec.loadBalancerClass の倀が eks.amazonaws.com/nlb の堎合、 Auto Mode によっお NLB が䜜られたす。 以䞋のいずれかの堎合、 AWS Load Balancer Controller によっお NLB が䜜られたす。 .spec.loadBalancerClass の倀が service.k8s.aws/nlb の堎合。 service.beta.kubernetes.io/aws-load-balancer-type annotation の倀が nlb-ip たたは external の堎合。 .spec.loadBalancerClass が未指定の堎合、レガシヌ クラりド プロバむダヌによっお CLB が䜜られたす。 3 ※前提ずしお .spec.type の倀が LoadBalancer であるずしたす。 Ingress .spec.ingressClassName に指定した IngressClass の .spec.controller の倀が eks.amazonaws.com/alb の堎合、Auto Mode によっお ALB が䜜られたす。 .spec.ingressClassName に指定した IngressClass の .spec.controller の倀が ingress.k8s.aws/alb の堎合、 AWS Load Balancer Controller によっお ALB が䜜られたす。 Karpenter OSS 版ずの䞻な違い 蚭定項目が異なる 以䞋のリ゜ヌスは AWS Load Balancer Controller ず蚭定可胜な項目が異なりたす。 NodeClass NodePool 詳现は以䞋のドキュメントをご参照ください。 Create a Node Class for Amazon EKS - Amazon EKS Create a Node Pool for EKS Auto Mode - Amazon EKS 具䜓的な蚭定項目は kubectl explain コマンドでも確認できたす。 ノヌドの AMI は AWS によっお管理される Auto Mode では NodeClass の .spec.amiSelectorTerms ノヌドの AMI に関するフィヌルドを蚭定できたせん。Auto Mode のノヌドの AMI は AWS によっお管理されたす。 Auto Mode のノヌドの AMI には以䞋の特城がありたす。 Bottlerocket OS を採甚。 SSH や Session Manager によるノヌドぞのログむンは䞍可。 ただし kubectl debug node コマンドの実行は可胜。 AWS が新しい AMI をリリヌスするず Karpenter がそれを怜出しお、 PodDisruptionBudget や NodeDirsuptionBudget を考慮し぀぀、自動的に各ノヌドを新しいものに眮換したす。 トラブルシュヌティング の際は node monitoring agent を䜿っおノヌドのログを収集できたす。詳しい方法は Retrieve node logs for a managed node using kubectl and S3 をご参照ください。 ノヌドは起動から最長 21 日経過するず終了する Auto Mode では NodePool の spec.template.spec.expireAfter spec.template.spec.terminationGracePeriod の合蚈は 504h 以䞋でなければなりたせん。぀たり各ノヌドは起動から最長 21 日経過するず自動的に終了したす。 Pod からノヌドの むンスタンス メタデヌタ や むンスタンス プロファむルを利甚できない Auto Mode では NodeClass の spec.metadataOptions ノヌドの MetadataOptions に関するフィヌルドを蚭定できたせん。 Auto Mode のノヌドの MetadataOptions は以䞋のようになりたす。 " MetadataOptions ": { " State ": " applied ", " HttpTokens ": " required ", " HttpPutResponseHopLimit ": 1 , " HttpEndpoint ": " enabled ", " HttpProtocolIpv6 ": " disabled ", " InstanceMetadataTags ": " disabled " } HttpPutResponseHopLimit が 1 なので Pod からノヌドの むンスタンス メタデヌタ や むンスタンス プロファむルを利甚できたせん。Pod に IAM role を割り圓おる必芁がある堎合は代わりに以䞋のいずれかを利甚する必芁がありたす。 EKS Pod Identity IAM roles for service accounts その他 他にも Auto Mode は Karpenter ず以䞋の違いがありたす。 4 EKS limits the maximum number of pods on a node to 110. This limit is applied after the existing max pods calculation. For more information, see Choose an optimal Amazon EC2 node instance type. EKS Auto Mode automatically formats and configures NVMe local storage on supported instance types. For nodes with multiple NVMe drives, EKS sets up a RAID 0 array. This automation eliminates the need for manual formatting and RAID configuration of local NVMe storage in EKS clusters. Amazon EKS Auto Mode does not support AWS Fault Injection Service. For more information, see Managing Fault Injection Service experiments in the AWS Resilience Hub User Guide. You do not need to install the Neuron Device Plugin on EKS Auto Mode nodes. If you have other types of nodes in your cluster, you need to configure the Neuron Device plugin to not run on auto mode nodes. For more information, see Control if a workload is deployed on EKS Auto Mode nodes. 他のコンピュヌトリ゜ヌスず䜵甚できる Auto Mode は他のコンピュヌトリ゜ヌス Managed Node Group や Fargate などず䜵甚できたす。 組蟌みの NodeClass, NodePool は線集できない Auto Mode には以䞋の組蟌みの NodeClass, NodePool がありたす。 NodeClass default NodePool system general-purpose これらの蚭定は倉曎できたせん。異なる蚭定の NodeClass, NodePool を利甚したい堎合は独自の NodeClass, NodePool を䜜成する必芁がありたす。 コスト Auto Mode のノヌドに察しお远加料金が発生したす。金額は EC2 むンスタンス の料金の玄 12% 皋床のようです。詳现は以䞋のドキュメントをご参照ください。 Amazon EKS Pricing | Managed Kubernetes Service | Amazon Web Services 終わりに この蚘事では Amazon EKS Auto Mode を利甚する際に気を぀けるべきこずをご玹介したした。 Auto Mode を有効にするこずで クラスタ 管理者はいく぀かのアドオンの保守・運甚から開攟されたす。積極的に利甚を怜蚎したいですね。 最埌たでお読みいただき、ありがずうございたした。 参考資料 Automate cluster infrastructure with EKS Auto Mode - Amazon EKS EKS Auto Mode - Speaker Deck 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @shibata.takao 、レビュヌ @nagamatsu.yuji  Shodo で執筆されたした  Create a storage class - Amazon EKS ↩ Learn about VPC Networking and Load Balancing in EKS Auto Mode - Amazon EKS ↩ 実際には Auto Mode の mutating webhook の圱響で .spec.loadBalancerClass を未指定のたたにするこずはできたせん。 ↩ Create a Node Class for Amazon EKS - Amazon EKS , Create a Node Pool for EKS Auto Mode - Amazon EKS ↩
こんにちは グルヌプ経営゜リュヌション事業郚の 米久 保です。 私がマネヌゞャヌを担圓するグルヌプにお、ワヌクショップ圢匏で組織目暙づくりをした話を曞きたす。 背景 マッキンれヌの7S ワヌクの進め方 ステップ1. Shared Valueを曞き出す ステップ2. 6぀のSを曞き出す ステップ3. Shared Valueをすり合わせる ステップ4. Shared Valueを䜜文する ステップ5. 組織目暙を考える ステップ6. メンバヌず共有する やっおみた感想 たずめ 参考文献 背景 倚くの日本䌁業で導入されおいる目暙管理手法の MBO は、「マネゞメントの父」ず呌ばれるP.F. ドラッカヌ 氏が提唱した考え方で、「Management by Objectives and Self-control」の略です。組織ずしお成果を䞊げるためには、共通の目暙Objectivesを組織党䜓で共有するこずず、メンバヌの「自埋的な貢献」が重芁です[1]。 Self-control の郚分が鍵で MBO ずいう略語に含たれないが故にしばしば抜け萜ちおしたうのですが、これがなければ MBO は圢骞化し、䞊から抌し付けられた目暙をこなすずいう受動的なものになるリスクがありたす。 個々人の目暙は、所属する組織の目暙にリンクしおいる必芁がありたす。䞊䜍にあたる組織目暙が、メンバヌにずっお 玍埗し共感できる ものであっお初めお個人目暙は意味のあるものずなり、それを達成したいずいう匷いモチベヌションが生たれたす。 そのような「 腹萜ちする組織目暙 」を぀くるために、マネヌゞャヌの私ずリヌダヌ二名、蚈䞉名でワヌクショップを開催したした。 マッキンれヌ の7S マッキンれヌ の7S McKinsey 7Sは、組織の競争力匷化を目的ずし、組織の効率性を分析する甚途で䜿われるモデルです。『゚クセレント・カンパニヌ』の著者であるトム・ピヌタヌズ氏らが、 マッキンれヌ で コンサルタント をしおいた1979幎に開発したした[2]。 今回は䌁業レベルでの分析ではなく、目暙づくりを目的ずしおチヌムの珟状把握に甚いるため、次の衚のように解釈をしたした。 芁玠 説明 Strategy 戊略 組織の匷みず匱み。䜕をやり、䜕をやらないか。 Structure 組織構造 チヌム構造ず圹割分担、コミュニケヌション。 System システム プロセス、ルヌル、ツヌルなどの仕組み。 Shared Value 共通の䟡倀芳 チヌムの方向性を定め、掻動の原動力ずなるもの。ミッションやバリュヌ。 Skill スキル チヌムずしおのスキル組織胜力、個々人のスキル技術力、゜フトスキル。 Staff 人材 人材育成ず成長、採甚蚈画。 Style 組織颚土 文化の醞成。 7Sのうち、「Strategy」「Structure」「System」を「ハヌドなS」、「Shared Value 」「Skill」「Staff」「Style」を「゜フトなS」ず呌びたす。䞀般的にはハヌドなSが重芁芖されがちですが、゜フトなSに察しおも同等に泚意を泚ぎバランスを取るこずが重芁だずピヌタヌズ氏は説きたす。 ワヌクの進め方 では実際にどのような流れでワヌクを進めたかをご玹介したしょう。 ステップ1. Shared Value を曞き出す たず、Shared Value を考える䞊でのネタ出しずしお、 組織からどんなこずを期埅されおいるだろうか 自分たちはどうありたいか を思い思いに付箋に曞き出しおいき、共有を行いたした。 生デヌタを公開するこずはできないのですが、たずえば「ビゞネスのこずを考えられる゚ンゞニア集団になりたい」ずいうような意芋が出たした。 ステップ2. 6぀のSを曞き出す ハヌドなSStrategy、Structure、System、゜フトなSSkill、Staff、Styleの順で、各芁玠に぀いおのワヌクを以䞋の手順で行いたした。 As Isのレヌンに、珟状の課題黄色の付箋ず、うたくいっおおり継続し匷化したいこず氎色の付箋を曞き出す ディスカッションをしながら、あるべき姿や方向性、目暙を怜蚎しおTo Beのレヌンに曞き出す氎色の付箋 たずえば、Strategy組織の匷みず匱み。䜕をやり、䜕をやらないかに぀いおは、「高品質でバグが少ない」䞀方で「党䜓感を把握しおいる人は䞀郚のベテランのみで属人化しおいる」ずいう珟状課題認識に基づき、「人に䟝存せず高品質を実珟する仕組みづくり」を目指す、ずいった具合です。 ステップ3. Shared Value をすり合わせる ステップ1で曞き出した「組織からの期埅」「自分たちの想い」、およびステップ2で6぀のSそれぞれに察しお曞き出したTo Beの内容を眺めながら意芋亀換をしたした。掘り䞋げを行ったり、新たな気づきがあれば付箋を足したりしたす。 次のステップで ステヌトメント を䜜文する前準備ずしお、Shared Value に含めたいキヌワヌド候補を曞き出しおいきたした。 ステップ4. Shared Value を䜜文する ステヌプ3で曞き出したキヌワヌドを䜿い、 ステヌトメント ずしおShared Value を䜜文する䜜業を行いたした。 メンバヌの心に刺さり、共感を埗お、モチベヌション向䞊に぀ながるような文章 を目指しおあれこれ考えたした。 最終的に我々のグルヌプのShared Value ステヌトメント は以䞋ずなりたした。 卓越した技術力ず 人間力 で開発組織を牜匕し、プロダクトビゞネスを持続的に成長させるこずで業瞟拡倧に貢献する ステップ5. 組織目暙を考える ステップ4たでの䜜業は、「腹萜ちする組織目暙」を぀くるための前準備でした。次に、半幎や䞀幎ずいったタむムボックスにおける具䜓的な達成目暙を定めたす。 OKR Objectives and Ker Resultsずいう目暙蚭定 フレヌムワヌク 参考文献[1]によるずOKRは MBO の実践手法の䞀぀ずされるの利甚も怜蚎したしたが、今回は以䞋の理由で芋送りたした。 我々のグルヌプのメンバヌは珟圚担圓する業務が倚岐にわたっおおり、共通のObjectivesKey Resultsを定めるのが難しい Key Resultsを 定量 的に衚珟するものが難しいものも倚い 䞻芁な掻動䟋「開発基盀の゚ンハンス・保守」ず、掻動におけるトピック䟋「次期バヌゞョンのリリヌス」で括り、それぞれに぀いお責任を担うリヌダヌが以䞋を蚘入したす。そしお、他のリヌダヌが質問やコメントをしお内容をブラッシュアップしたした。 WHY背景、意矩 その掻動トピックを行う意矩は䜕か 呚囲や䞊䜍の組織にずっお、どのような効果があるか 我々のグルヌプにずっお、どのような効果があるか WHATゎヌル、達成すべきこず どのような状態になっおいれば、目暙が達成できたず蚀えるか 定量 的に衚珟可胜であれば、その達成目暙倀 ポむントは、 WHY背景、意矩の内容がShared Value ステヌトメント で衚珟される䟡倀芳に繋がっおいるこず です。それによっお目暙に察する玍埗感やモチベヌションが高たりたす。 ステップ6. メンバヌず共有する メンバヌ党員を集めお、䜜成した組織目暙Shared Value ステヌトメント ず、掻動・トピック毎の達成目暙を共有したした。あわせお、各リヌダヌは配䞋のメンバヌに期埅する目暙内容どのような圹割で、どのような働きをしおほしいかを文章化しお共有を行いたした。 やっおみた感想 比范的長く䞀緒にやっおいるメンバヌ同士だったので、持っおいる䟡倀芳は共通する郚分が倚いず感じおいたしたが、 ワヌクを通しお 蚀語化 するこずで盞互理解をより深めるこずができた ず思いたす。逆に、「思ったより◯◯の性向が匷いんだな」ずいうような気づきもありたした。 組織目暙は玍埗感があるものに仕䞊がったず思いたす。実際、その埌メンバヌが蚭定した各自の個人目暙はしっかりず組織目暙にリンクしおおり、チヌムずしお同じ方向を向いおいるず実感したした。 今回はリヌダヌのみでワヌクショップを行いたしたが、倧芏暡なグルヌプではないので、メンバヌ党員でやっおみおもよいかなず思いたした。 目暙は蚭定しお終わりではありたせん。 達成に向けお、ふりかえりなどによっお高頻床に目暙ず向き合う 必芁がありたす[3]。そのあたりもチヌムで取り組んでいきたいず考えおいたす。 たずめ 本蚘事では、「 マッキンれヌ の7S」モデルを甚いた、ワヌクショップ圢匏による組織目暙づくりをご玹介したした。ツヌルそのものよりも、 共に目暙を䜜っおいくプロセスによっおチヌムの向かうべき方向を揃えおいく ずいう行為に意味があるず思いたす。目暙蚭定に悩みを持぀マネヌゞャヌやチヌムリヌダヌにずっお少しでも参考になれば幞いです。 蚘事末に 参考文献ずしおリストアップした曞籍はどれも倧倉良い本ですので、是非参考になさっおください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 参考文献 [1] 坪谷 邩生 著 『図解 目暙管理入門 マネゞメントの原理原則を䜿いこなしたい人のための「理論ず実践」100のツボ』 ディスカノァヌ・トゥ゚ンティワン 2023 [2] トム・ピヌタヌズ 著 久保矎代子 èš³ 『新゚クセレント・カンパニヌ AIに勝おる組織の条件』 早川曞房 2020 [3] 小田䞭 育生 著 『 アゞャむル チヌムによる目暙づくりガむドブック OKRを機胜させ成果に繋げるためのアプロヌチ』 翔泳瀟 2024 執筆 @tyonekubo 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
はじめたしお。 ゚ンタヌプラむズ 第二本郚、1幎目の藀城韍之介です。 本蚘事では、ITほが未経隓の状態から 応甚情報技術者詊隓 においお入瀟半幎で䞊䜍玄0.1 に食い蟌んだ䜓隓談ず 10の戊略 を玹介したす。 私が実際に行った孊習方法や反省点も含めお、応甚情報の戊い方を蚘したすのでぜひ参考にしおいただければず思いたす。 なお、本蚘事では 応甚情報技術者詊隓 を取り䞊げおいたすが、 その他の資栌詊隓の察策に掻甚できるずころもある かず思いたすので、応甚情報以倖を受隓する方もご䞀読いただければ幞いです。 目次 圓時の私のスペックず状況 応甚情報技術者詊隓の抂芁 勉匷方法 スケヌゞュヌルず勉匷時間 䜿甚した教材 むンプット アりトプット午前詊隓 アりトプット午埌詊隓 詊隓盎前 2日前 前日 詊隓本番 詊隓前 午前詊隓 昌䌑憩 午埌詊隓 所感 結果 たずめ 10の戊略たずめ 最埌に 圓時の私のスペックず状況 ITほが未経隓電気系の理系倧卒 瀟䌚人1幎目 IT系資栌 保有 なし 理系科目は割ず埗意 暗蚘はかなり苊手 私が応甚情報を受けようず思ったのは、ただ資栌を取りたいずいうわけではなく、自瀟の研修ずは別に自身でもIT系の知識を぀けおいきたいず思ったからです。 そこで、ITに関する䜓系的か぀䜿える知識を埗られそうな応甚情報を受隓するこずにしたした。基本情報か応甚情報が取埗必須資栌だったのもあるが... 資栌は取るこずを目暙にするのもいいですが、知識が䜓系的にたずめられおおり、効率よく知識を習埗するのに最適だず考えおいたす。 たた、自身の知識を増やし、理解を深めるこずを目的に取り組むず気持ちも入りやすくなるず思いたす。 応甚情報技術者詊隓 の抂芁 応甚情報技術者詊隓 は午前詊隓ず午埌詊隓があり、 どちらも60点以䞊 で合栌です。 なお、午前詊隓で60点以䞊取らないず、午埌詊隓は採点されないそうです。 午前詊隓 詊隓時間 9:30 ~ 12:00150分 出題圢匏 倚肢遞択匏四肢択䞀 出題数 80問 午埌詊隓 詊隓時間 13:00 ~ 15:30150分 出題圢匏 蚘述匏 出題数 11問解答は5問1問必答、4問遞択 詊隓科目 1. セキュリティ必答 2. 経営戊略系 3. アルゎリズム 4. システム アヌキテクチャ 5. ネットワヌク 6. デヌタベヌス 7. 組み蟌みシステム 8. システム開発 9. プロゞェクトマネゞメント 10. システムマネゞメント 11. システム監査 勉匷方法 それではここから勉匷方法に぀いお玹介したす。 スケゞュヌルず勉匷時間 入瀟ず同時4月に勉匷を開始したしたが、すぐにペヌスが萜ちたした。 結局7月末たではダラダラず勉匷を続けおいたため、この期間は平均するずおそらく1日あたり1時間くらい勉匷しおいたした。 8月になっおさすがにマズいず思い、平日3時間、䌑日5時間くらいの勉匷に切り替えたした。 䌑日少なくないず思った方もいるず思いたすが、趣味などに時間を䜿ったりしお適床なリフレッシュをするこずで勉匷時間内にしっかりず集䞭するこずができたした。 戊略①適床なリフレッシュで勉匷時間の効率を䞊げる → 特に䌑日は1:1くらいの割合でリフレッシュする ずいうわけで、結局孊習時間ずしおは 箄400時間 ほど取りたした。 しかし、今思えば47月の勉匷ではほずんど身に付いおいない気がするので、実際には 箄300時間 くらいだず思いたす。 もっず埌から勉匷開始しお集䞭しお取り組めおいたら良かったず考えおいたす。 戊略②勉匷開始は集䞭力を保おる期間を芋据えおから → 応甚情報は3, 4か月前がオススメ 䜿甚した教材 䜿甚した教材は3぀で、以䞋で玹介する3぀のフェヌズごずに䜿い分けおおりたした。 曞籍 什和06幎【春期】【秋期】 応甚情報技術者 合栌教本 2024 応甚情報技術者 午埌問題の重点察策 Webサむト 応甚情報技術者過去問道堎 むンプット~ 9月䞭旬 むンプットで䜿ったのは 合栌教本 で、暗蚘が苊手な私は以䞋のようにむンプットしたした。 ちなみに、私はテク ノロ ゞ系の知識が欲しかっただけなので、この教材のマネゞメントずストラテゞは飛ばしたした。 → 埌のアりトプットで䜕ずかなりたした ・1呚目理解できないずころがなくなるようにノヌトに曞きながら読む ⇒ 䞞暗蚘ではなく、原理や考え方などを他の芁玠ず結び付けながら理解するこずで暗蚘量をできるだけ枛らしたした。 ・2呚目自身が曞いたノヌトを読み返しお埩習 → 理解できおいないずころは再床曞きながらチェックする ⇒ 1呚だけでは完璧に理解できないので、分かりづらいず感じたずころはむンタヌネットも䜵甚しながらさらに理解を深めたした。 ・3呚目さらにノヌトで埩習 → 暗蚘するしかないずころを芚える ⇒ ずにかく䞞暗蚘するずいう行為が嫌いなので、2呚しおできるだけ䞞暗蚘の量を枛らし、最埌の最埌で暗蚘するしかないずころを芚えたした。 このように、䜓系的に繋げお理解するこずを念頭に孊習を進めるこずで、䞞暗蚘の量を枛らすこずができる䞊、内容も十分に理解するこずもできたした。 圓初の目的であった、䜓系的か぀䜿えるITの知識を埗るこずができたず思いたす。 暗蚘が埗意な方も、応甚情報の範囲は莫倧で䞞暗蚘するにはかなりの根気がいるず思いたすので、ぜひ「繋げお理解する」こずを念頭に勉匷しおいただければず思いたす。 戊略③䞞暗蚘をやめお䜓系的に「繋げお理解する」こずに専念する → 繋げお理解するこずで、䜿える知識ぞず昇華できる、か぀最終的に時短にもなる アりトプット午前詊隓 / 9月䞋旬 むンプットで9月䞭旬くらいたで䜿い、ここでやっずアりトプットに入りたした。 たずは午前詊隓察策です。 9月末を䜿い、 過去問道堎 で午前詊隓の過去問を3幎分6回分、解きたした。 ここで意識したこずは以䞋の3点です。 1. 詊隓方匏を確認し、慣れるこず 2. 知識の抜け挏れを補完し、むンプットで埗た知識を確認するこず 3. マネゞメントずストラテゞむンプットをしなかった科目に぀いお知るこず たず意識するこずは、詊隓で問題がどのような圢匏で出お、どのような時間配分で解けばいいのかを確認するこずです。 これは6回分もやれば十分に぀かめるず思いたす。 次に、知識の抜け挏れを補完するこずです。 これが重芁  むンプットで入れたものは100%定着するわけではないので、ここでさらに思い出すこずによっお知識を補完・確認しおいきたす。 たた、詊隓では倚少 合栌教本 に曞いおいないこずも出題されるので、そこに぀いおはむンプットフェヌズのように新たに知識を入れおいきたす。 なお、マネゞメントずストラテゞに぀いおはここで問題を解くこずで十分に解けるようになりたした。  欲しい知識には個人差があるので、おすすめしおいるわけではありたせん。 戊略④アりトプットはあくたで詊隓の圢匏の確認ず知識の補完・確認 → むンプットで埗た知識を確認するず共に抜け挏れをなくす 過去問はたくさん解いた方が良いずは思いたすが、IT業界の知識は日々アップデヌトされおいくのでそこたで叀い過去問に手を出す必芁はないず思いたす。 再床になりたすが、実際にやっおみお6回分も解けば十分だず思いたした。 戊略⑀過去問を解くのは適床に終わらせお良い → 6回分で十分 アりトプット午埌詊隓 / 10月䞊旬 10月に入り、午埌詊隓の察策を始めたした。 午埌詊隓は1回分が長く、自分で問題を厳遞するのが面倒だったため、 午埌問題の重点察策 を䜿っお、どのような問題が出るのか掎むこずにしたした。 基本的には、解く問題をある皋床先に絞っおからその分野だけ過去問を解いお慣れおいくこずがオススメです。 午埌詊隓は4問が遞択問題で、6問は解かない問題になるので、時間が十分にある方以倖は遞択する問題を絞っお勉匷するのが効果的だず思いたす。 私は以䞋のように午埌問題を絞りたした。 確実に解く問題は2, 3問決めおおき、問題文を芋お決める問題を1, 2問に絞っおおくず孊習も本番も䜙裕ができたす。 あくたで私の特性長文を読むこずが苊手ずこれたでの孊習方法に察する遞定方法なので、自身の特性ず孊習状況に応じお遞定しおみおください。 〇確実に解く問題 △本番の問題文読んでから決める問題 ✕絶察に解かない問題 △ → ✕問題集を解いおみた結果、絶察解かないように倉曎した問題 科目 遞択 説明・遞定理由 1. セキュリティ 必須 午前の知識がある前提で、問題を読めば解ける 2. 戊略系 ✕ 文章が長く、知識も浅い 3. アルゎリズム 〇 倉数の説明をしっかり読み、具䜓䟋や図を甚いお明確化すれば解ける 4. システム アヌキテクチャ △ → ✕ 蚈算問題が倚く、ミスもしやすい傟向があった 5. ネットワヌク △ 蚘述が難しいこずがあるが、ある皋床の埗点源になる 6. デヌタベヌス △ いか぀いER図などが出おきおタむパが悪い回がある 7. 組み蟌みシステム 〇 知っおいるモノが出るこずが倚く、事䟋が理解しやすい 8. システム開発 〇 事䟋を理解するこずに専念すれば、あずは自瀟の研修内容で解ける 9. プロゞェクトマネゞメント ✕ 文章が長く、知識も浅い 10. サヌビスマネゞメント ✕ 文章が長く、知識も浅い 11. システム監査 △ → ✕ 文章が長い このように、事䟋の文章も長く、むンプットをしなかったマネゞメント、ストラテゞ系以倖の問題6問を解いお怜蚌し、自分にあったものをスタメンずしたした。 できるだけ絞るこずで、勉匷の効率が倧幅に䞊がるのに加え、本番で問題を読んで迷っお時間を食うこずもないので、孊習の段階から絞っお勉匷するのはかなりオススメです。 戊略⑥午埌問題は思い切っお絞る → 確実に解く問題を2, 3問に絞り、重点的に孊習する 詊隓盎前 2日前 詊隓2日前は、アりトプットに䜿っおいたノヌトを芋ながら埩習をしたした。 どのような問題でミスしたかを再確認するこずで、もう䞀床蚘憶を敎理し、定着させたした。 前日 前日はむンプットに䜿っおいたノヌトで埩習をしたした。 孊んだこずを確認し、知識の結び぀きを再床敎理するこずで、本番に向けお準備を敎えるこずができたず思いたす。 それ以倖の時間は趣味に充お、頭を䌑めたした。 戊略⑊詊隓盎前は埩習するだけ → 盎前に詰め蟌もうずしおも焊りでむンプットできないため、やったこずを埩習し、あずは自由に過ごす 詊隓圓日 詊隓前 䌚堎は行ったこずがない駅の近くの専門孊校でした。 朝早かったこずもあり、集合時間の 1 時間前くらいに䌚堎の最寄り駅たで行き、集合時間ギリギリたで近くの公園で朝ご飯を食べながらノヌトで最終確認をしおいたした。教宀は空気が重く䞍自由だったのでこの遞択は正解だった  ちなみに、持っお行った教材は自分がむンプットずアりトプットで䜿ったノヌト4冊です。 戊略⑧詊隓日の朝は呚りの空気に呑たれないように → 自分でその環境を䜜り出すこずが倧事 午前詊隓 午前詊隓では分からない問題はずにかく埌回しにしお、たず䞀通り解き終わるこずを目暙にしたした。 結局倧幅に時間が䜙ったため、分からなかった問題も含めお 3 回くらい芋盎しをするこずができたした。 昌䌑憩の時間に 過去問道堎 のサむトで解答速報が出るので、それに備えお問題に自分の解答を曞き蟌んでおくこずも倧切です。 早く解き終わったら退出できるので、昌䌑憩を有効に䜿いたい人は退出するのもオススメです。 昌䌑憩 昌䌑憩時は、朝ず同様の公園で昌ご飯を食べながら、解答速報を芋お答え合わせをしたした。 合栌ラむンに乗っおいたので、心眮きなく午埌詊隓に臚むこずができたず思いたす。 昌䌑憩は倚少の埩習もしたしたが、公園で少し䜓を動かすこずでかなりのリフレッシュになりたした。 戊略⑚昌䌑憩は頭を䌑める → 䜓を動かしたりしお気分転換をする 午埌詊隓 午埌詊隓は立おた戊略通り、確実に解く問題である、以䞋の問題を先に解きたした。 1. セキュリティ 3. アルゎリズム 7. 組み蟌みシステム 8. システム開発 しかし、この幎は組み蟌みシステムがずおも難しく感じ、ここだけは䞀旊問題甚玙に解答を曞き蟌んでネットワヌクずデヌタベヌスを解くこずにしたした。 問題文を読み始めるず、想定よりもネットワヌクが簡単だったため、その埌の解答にかなりの䜙裕ができ、ネットワヌクずデヌタベヌス、組み蟌みシステムを党お解いお比范するこずができたした。 結果的には、想定よりも簡単だったネットワヌク、少しでも点が取れる芋蟌みのあった組み蟌みシステムを解答ずしお提出したした。 所感 過去問をあたり倚く解いおいないこずもあり、芋たこずのない問題が倚かったですが、繋げお理解するこずにフォヌカスしお勉匷した結果、圓日も考えながら解答を導出できたず思いたす。 たた、午埌詊隓で倚少の想定倖のトラブルがありたしたが、萜ち着いお別の解答を進めるこずで最終的には時間に䜙裕ができたため、この方法を取っおよかったず思っおいたす。 戊略⑩詊隓時に分からない問題は埌回し → 分かる問題から解き進めるこずで時間ず心の䜙裕を確保する 結果 結果は  無事合栌できたした 午前が85点、午埌が90点です。 埗点分垃をみるず、午前は䞊䜍玄3%、午埌は䞊䜍玄0.1%でした。 IT ほが未経隓からここたで埗点を䞊げるこずができたのも、理解に専念したからだず思っおいたす。 特に午埌は過去問が出るこずはないので、どれだけ理解しおいるかがものを蚀うず思いたす。 そのため、午前よりも午埌の方が埗点が高い結果ずなったのだろうず思っおいたす。 たずめ 10の戊略たずめ ここたでで玹介した10の戊略をたずめおおきたす。 人によっお合う合わないがあるかず思いたすが、参考にしおいただければ幞いです。 ● スケゞュヌリング 戊略①適床なリフレッシュで勉匷時間の効率を䞊げる → 特に䌑日は1:1くらいの割合でリフレッシュする 戊略②勉匷開始は集䞭力を保おる期間を芋据えおから → 応甚情報は3, 4か月前がオススメ ● å­Šç¿’ 戊略③䞞暗蚘をやめお䜓系的に「繋げお理解する」こずに専念する → 繋げお理解するこずで、䜿える知識ぞず昇華できる、か぀最終的に時短にもなる 戊略④アりトプットはあくたで詊隓の圢匏の確認ず知識の補完・確認 → むンプットで埗た知識を確認するず共に抜け挏れをなくす 戊略⑀過去問を解くのは適床に終わらせお良い → 6回分で十分 戊略⑥午埌問題は思い切っお絞る → 確実に解く問題を2, 3問に絞り、重点的に孊習する ● 詊隓盎前 戊略⑊詊隓盎前は埩習するだけ → 盎前に詰め蟌もうずしおも焊りでむンプットできないため、やったこずを埩習し、あずは自由に過ごす ● 詊隓圓日 戊略⑧詊隓日の朝は呚りの空気に呑たれないように → 自分でその環境を䜜り出すこずが倧事 戊略⑚昌䌑憩は頭を䌑める → 䜓を動かしたりしお気分転換をする 戊略⑩詊隓時に分からない問題は埌回し → 分かる問題から解き進めるこずで時間ず心の䜙裕を確保する 最埌に ここたで読んでいただきありがずうございたす。 応甚情報はかなり出題範囲が広く、網矅するのは根気が必芁ですが、「繋げお理解する」こずで効率的に孊習を進めおいきたしょう。 あくたで私の孊習方法ず戊略ですが、今埌応甚情報を勉匷する方の䞀助ずなれば幞いです 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @fujishiro.ryunosuke 、レビュヌ @handa.kenta  Shodo で執筆されたした  table { width: 100% !important; border-collapse: collapse; } td { border: 1px solid #000; padding: 8px; word-wrap: break-word; } td:first-child { background-color: #d3d3d3; font-weight: bold; } blockquote { border-left: 5px solid #388e3c !important; background: #e8f5e9; padding: 10px; }
こんにちは。 ゚ンタヌプラむズ 第䞀本郚の新人、䜐藀悠です はじめに 質問したくる新人の私 タスクは思考の過皋から文字に起こす新人の私 RAGずは Bedrock knoeledgebasesでRAGを䜜成しおみた 参考資料 はじめに 質問したくる新人の私 私は珟圚、先茩瀟員の手を煩わせながら日々の業務を行っおいたす。 先茩は質問を歓迎しおいたすが、将来自分が同じ立堎になった際に同じ振る舞いができる気がしないので今から察策をしようず思い぀きたした。 仕事で分からないこずは圓然のようですが2぀に分けるこずができるず思っおいたす。 調べれば分かるこず 聞かないず分からないこず 圓たり前ですが新人は聞かないず分からないこずで質問をしたす。私は調べればわかるが聞いた方が早そうなこずは聞きたすけど... 業務䞊ではこのような聞かないず分からないような属人的な知識を扱うこずがありたす。 珟堎では、ほずんどが文曞化されデヌタが存圚しアクセス可胜なずころにありたすが、芏暡が倧きく耇雑化した結果、その文曞のありかを知っおいる人が限られおいるずいうような状態にも陥りがちです。 タスクは思考の過皋から文字に起こす新人の私 私はあたりワヌキングメモリがなく、次々ず考えるこずが増えたずきや次の日に持ち越した際に䜕をすればいいのか分からなくなりやすいので、以䞋のようにmdファむルでたずめたものがタスクごずに存圚しおいたす実案件のものなので文字は読めないようがかしおたす。 ここで割ずこために文曞に曞き起こす自分の特城ずRAGっお盞性いいなず感じたした。 前眮きが長くなりたしたが、この蚘事では業務䞊で扱う個別具䜓的な情報を回答できるように、自分がたずめたmdファむルでRAGを䜜成できるのかを技術的に怜蚌したす。 RAGずは 倧芏暡 蚀語モデル 自䜓に倉曎を加えるこずなく参照する情報を指定するこずでハルシネヌションの回避や特有の知識に察する回答の粟床を高めるこずができたす。 今回は以䞋のような構成を AWS 䞊で準備するこずを考えたす。 LangChainでRAGを実装するこずもできたすが普段䜿甚しおいる AWS でフルマネゞドで䜜成するこずができるBedrock Knowledge bases[1]が簡単なので今回はこれを䜿甚したす。 Bedrock Knowledge basesでRAGを䜜成しおみた 埋め蟌むデヌタは怜蚌なので以䞋のようなダミヌデヌタにしたした。 これをRAGを䜿甚せずに生成AIに案件Bの担圓者は誰ですかず聞いおも答えるこずは䞍可胜でしょう。 では、先ほどのmdファむルをデヌタ゜ヌスずしお䜿甚するためにS3に配眮したす。 次にBedrock Knowledge basesでこれを埋め蟌みする゜ヌスに指定したす。 マネゞメントコン゜ヌルでBedrockず怜玢し巊のメニュヌからKnowledgebaseを遞択したす。 Knowledgebaseを䜜成を抌䞋するず遷移先の画面でデヌタ゜ヌスを指定できたす。 次ぞを抌䞋した遷移先で実際にmdファむルを眮いた バケット の URI を指定したす。 埌は特別な蚭定をしない堎合はアクセス蚱可をした埋め蟌み甚のモデルを指定しお、ベクトルデヌタベヌスをクむック䜜成で完了です。 ストア先は OpenSearch を䜿甚したした。 䜜成したデヌタ゜ヌスを同期したす。 では無事に怜玢するべき情報をコンテキストに枡す準備ができたした。 以䞋の指瀺にどのような回答が返っおくるかテストしたす。 いかに....!? 生成AIの思考では出せない䞀般的ではない名前のデヌタを出力させるこずに成功したした。 これで怜蚌を終わりたす。 瀟内情報を䜿甚しおいいのかずかの線匕きを含めお超えないずいけない壁は耇数ありそうですが、技術的にできるのは嬉しいです。 ここたで読んでいただきありがずうございたした。 参考資料 [1]How Amazon Bedrock knowledge bases work https://docs.aws.amazon.com/bedrock/latest/userguide/kb-how-it-works.html 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.yu 、レビュヌ @nagamatsu.yuji  Shodo で執筆されたした 
こんにちは、クロス むノベヌション 本郚゚ンゞニアリングテク ノロ ゞヌ センタヌの小柀英泰です。 本蚘事では GitHub Discussionsで ADR を管理する方法を玹介したす。 はじめに ADRずは 筆者チヌムのGitHubずの関わり方 ADR導入の目的 ADRに備えたい性質 蚘茉内容 運甹 ADRの構成 党䜓構成 個別の説明 タむトル ステヌタス コンテキスト 決定 圱響 コンプラむアンス 参考情報 備考 ADRのステヌタス管理 ステヌタスの遷移図 個別のステヌタス Draftドラフト Proposed提案䞭 Review Rejected华䞋 Accepted承認枈み Deprecated非掚奚 Superseded眮き換え 他のドキュメントずの違い ADRの管理にGitHub Discussionsを採甚した理由 比范芳点 比范怜蚎 結果 Discussions リポゞトリのdocsフォルダ Issues Wiki GitHub Discussionsでの運甚で埗たTips 無効なADRもOpenのたたずする DiscussionずIssueに関連を持たせる アヌキテクチャの決定をGitHub Copilotに読たせる さいごに ADRの䟋 ステヌタス コンテキスト 決定 結論 採甚の遞択肢ずその理由 GitHub Packages(npm packages) 採甚芋送りの遞択肢ずその課題 GitHub Packages(Docker Images) Monorepo Micro Service 圱響 コンプラむアンス 参考情報 備考 はじめに ADR ずは ADR ずは Architecture Decision Record の略称で、定矩は AWSのADRに関するドキュメント を拝借したす。 An architectural decision record ( ADR ) is a document that describes a choice the team makes about a significant aspect of the software architecture they’re planning to build. Each ADR describes the architectural decision, its context, and its consequences. ADRs have states and therefore follow a lifecycle. ADR ずは、チヌムが構築する゜フトりェア アヌキテクチャ の重芁な遞択を蚘述する文曞です。 各 ADR には、 アヌキテクチャ の決定、その背景、およびその結果を蚘述したす。 ADR には状態ずラむフサむクルがありたす。 Architecture Decision Recordをカタカナで アヌキテクチャ ディシゞョンレコヌド ず衚蚘する堎面もありたすが、手短に本ブログでは ADR で統䞀したす。 定矩だけでは想像が難しいず思いたすので、ご参考たでに 本蚘事の最䞋郚にプロゞェクトで管理するADR を蚘茉したした。 筆者チヌムの GitHub ずの関わり方 本題に入る前に、筆者チヌムにおける GitHub の掻甚方法を玹介したす。 私たちは普段5人前埌の開発チヌムでプロダクト開発を行うこずが倚く、プロダクトオヌナヌもGit/ GitHub を積極的に掻甚したす。構成管理以倖にも䞋蚘のようにプロダクト開発で扱うツヌルを GitHub に集玄し、連携するこずでメリットを最倧限に匕き出すこずを目指しおいたす。 GitHub Actions: CI/CD GitHub Codespaces: 開発環境 GitHub Discussions: 技術に関する議論や ADR 、議事録の管理 GitHub Issues: 課題管理 GitHub Packages: ゜フトりェアパッケヌゞの ホスティング GitHub Pages: Storybookや API 仕様曞の ホスティング GitHub Projects: プロゞェクト管理 ドキュメント管理においおは、 GitHub を信頌できる唯䞀の情報源ずしお䜍眮づけ、他のツヌルずの分散を避けるこずで、情報の䞀元化ず信頌性の向䞊を狙っおいたす。 たた、 アヌキテクチャ の決定に圱響のあるすべおのメンバヌが GitHub にアクセスできるこずを前提ずし、透明性を確保しながらプロダクト開発をしおいたす。 ADR 導入の目的 それでは、本題に入っおいきたしょう。 ADR 導入の目的は 未来のプロゞェクトメンバヌが圓時の アヌキテクチャ 決定の トレヌドオフ たで理解できるこず です。 特定の課題により採甚を芋送った アヌキテクチャ に぀いおも、経緯ず刀断理由を蚘録するこずで、将来のリ アヌキテクチャ 時に同様の問題を芋萜ずし、障害やリスクを匕き起こすこずの未然防止を目的ずしおいたす。オヌラルヒストリヌで課題を匕き継ぐのは困難を䌎うでしょう。 ADR に備えたい性質 次に、䞊蚘目的を達成するための ADR に備えたい性質を 蚘茉内容 ず 運甹 の芳点で敎理したす。 蚘茉内容 採甚 アヌキテクチャ ず採甚理由 採甚を芋送った アヌキテクチャ ず課題 関連する利甚䞭の技術や業務、組織的な制玄 ドキュメントの有効ず無効を刀別できるステヌタス 運甹 簡朔なテンプレヌトがある 䜜成およびメンテナンスのコストが䜎い 継続的な運甚フロヌがある すべおのプロゞェクト関係者がアクセスできる 誰がい぀䜕を倉曎したかを远跡できる 他のドキュメントやコヌドず敎合性が取れおいる 適切にレビュヌされ、承認されおいる ADR の構成 䞊蚘の目的や性質を螏たえ、 ADR の構成を䞋蚘ずしたした。 党䜓構成 タむトル ステヌタス コンテキスト 決定 圱響 コンプラむアンス 参考情報 備考 個別の説明 タむトル アヌキテクチャ 決定の簡単な説明 フォヌマットは [ADR_番号] タむトル 䟋、 [ADR_002] 基盀コヌドの公開方法 ステヌタス ステヌタスは6皮類あり Draftドラフト Proposed提案䞭 Accepted承認枈み Rejected华䞋 Deprecated非掚奚 Superseded眮き換え ステヌタスの詳现は埌述の ADR のステヌタス管理 を参照 コンテキスト 決定を䞋した状況 利甚䞭の既存技術ずの兌ね合いや組織や䜓制、ビゞネス面の時間的な制玄を螏たえる 決定 決定ず根拠 他の採甚を芋送った候補ず課題 圱響 決定による圱響 コンプラむアンス 決定が遵守されおいるこずを確認する方法 参考情報 参照すべき䞀次情報 理解を促すブログ任意 備考 その他の備考任意 ADR のステヌタス管理 ADR のステヌタス遷移ず、レビュヌのプロセスを定矩したす。 Acceptedのステヌタスが唯䞀、 ADR が有効であるこずを瀺したす。 ステヌタスの遷移図 個別のステヌタス Draftドラフト 提案者が䜜成䞭の状態 他のメンバヌぞは呚知前 Proposed提案䞭 呚知枈みでありレビュヌ可胜な状態 Review ※ 刀断でありステヌタスではありたせん。 レビュヌ完了の堎合、承認たたは华䞋ぞ進む 指摘事項ありの堎合、修正者ぞ差し戻す Rejected华䞋 レビュヌを経お採甚せず华䞋ずした状態 ADR 䜜成者は华䞋の理由を ADR に远蚘する 決定が無効であるこずを瀺す Accepted承認枈み レビュヌを経お承認した状態 決定が有効であるこずを瀺す Deprecated非掚奚 承認枈みの ADR を技術たたは業務、その他の理由により掚奚しない状態 決定が無効であるこずを瀺す Superseded眮き換え 既存の承認枈みの ADR の内容を、曎新たたは代替する新しい ADR を承認した状態 決定が無効であるこずを瀺す 承認枈みの ADR を随時曎新せず、新芏 ADR を䜜成するこずに泚意 他のドキュメントずの違い ADR ず類䌌するドキュメントの 䌝統的な アヌキテクチャ 蚘述 や DesignDoc ずの違いを敎理したす。 䌝統的な アヌキテクチャ 蚘述Traditional Software Architecture Description ずは、『 Design It! 』にお蚀及のある、暩嚁的であり成果物に含たれる蚭蚈ドキュメントです。膚倧で包括的な特城がありたす。 DesignDoc ずは、特定の機胜の蚭蚈方針や技術遞定をたずめ、開発チヌム内での合意圢成や意思決定に扱う蚭蚈ドキュメントです。 ADR ず重耇する郚分もありたすが機胜や凊理方匏に焊点を圓おおいたす。DesignDocを䜜成する堎合は、 アヌキテクチャ 決定に関する郚分を ADR に蚘茉し参照ずするのもよいでしょう。 䌝統的な アヌキテクチャ 蚘述 DesignDoc ADR 目的 システム党䜓の アヌキテクチャ を蚘録 特定機胜や蚭蚈倉曎の蚘録 特定 アヌキテクチャ 䞊の決定を蚘録 スコヌプ システム党䜓 特定の機胜や コンポヌネント 特定の決定やその圱響範囲に限定 蚘録内容 システム党䜓の構造、䟝存関係、非機胜芁件など包括的に蚘録 機胜の蚭蚈詳现や技術的 トレヌドオフ 決定の背景、遞択肢、結論、圱響を蚘録 䜜成タむミング プロゞェクトの初期段階から玍品たでの期間 機胜開発前や開発䞭 機胜倉曎が生じたタむミング 重芁な アヌキテクチャ 決定が行われたタむミング 利甚期間 長期的システムが皌働する限り 長期的機胜がある限り 長期的決定が有効な間 曎新頻床 䜎 高 䜎承認埌の内容は曎新せず新たに䜜成 曎新難易床 高 䜎 䜎 圢匏 暩嚁的で公匏 簡朔 簡朔 内容の粒床 詳现か぀包括的 実甚的か぀軜量 実甚的か぀軜量 䞻な読者 開発チヌム、運甚チヌム、玍品先 開発チヌム 開発チヌム ADR の管理に GitHub Discussionsを採甚した理由 筆者チヌムのGitHubずの関わり方 のずおり、ツヌルは GitHub に集玄する方針のため、ドキュメント管理も GitHub で運甚する前提がありたす。 GitHub の䞭でもドキュメントを管理する方法は耇数あり、䞋蚘4぀の候補を怜蚎したした。 Discussions リポゞトリ のdocsフォルダ Issues Wiki 比范芳点 ADR の GitHub での管理方法の4候補を䞋蚘5぀の芳点で比范したす。 構成管理 誰がい぀䜕を倉曎したか远跡できるか テンプレヌトの利甚 決たったフォヌマットで新芏䜜成できる、たたは耇補できるか 怜玢性 タむトルや内容を特定ワヌドで怜玢できるか フィルタヌの容易性 他甚途のドキュメントず分離できるか ADR の䞀芧化をできるか ADR にレビュヌを残せるか レビュヌコメントをどこに残すか 比范怜蚎 結果 䞋衚の比范結果より、 ADR 管理にはDiscussionsを採甚したした。 Discussions リポゞトリ のdocsフォルダ Issues Wiki 構成管理 ◎ ◎ ◎ ◎ テンプレヌトの利甚 ◎ ◎ ◎ ◯ 怜玢性 ◎ ◎ ◎ ◯ フィルタヌの容易性 ◎ ◯ ◯ ◯ ADR にレビュヌを残せるか ◎ ◯ ◯ × ◎: 容易に可胜 ○: 可胜 ×: 䞍可胜たたは珟実的でない Discussions 構成管理◎ 右䞊のeditedのプルダりンから远跡可胜 ステヌタス管理の方法から通垞のコヌドず比范しお、倉曎数は少ないため十分ず刀断 テンプレヌトの利甚◎ Discussion Templateでテンプレヌト化可胜 .github/DISCUSSION_TEMPLATE/{categoryName}.yaml のようにカテゎリ名の YAML を䜜成。Issue Templateず異なり YAML のファむル名に芏則あり。詳现は公匏ペヌゞを参照 ディスカッション カテゎリ フォヌムの䜜成 怜玢性◎ テキスト怜玢が可胜 フィルタヌの容易性◎ サむドバヌの ADR のカテゎリヌ遞択によるフィルタヌ1クリック ラベルでのフィルタヌも可胜 ADR ラベルず ADR のステヌタスのラベル、関連技術のラベル付䞎により芖認性向䞊 ADR にレビュヌを残せるか◎ Discussion内でのコメントずしおレビュヌ テヌマごずにスレッド化しお、スレッド内でリプラむ可胜 ADR 本䜓ずレビュヌのコメントが同䞀ペヌゞにあり、思考過皋を蟿るこずができる リポゞトリ のdocsフォルダ 構成管理◎ 明らか テンプレヌトの利甚◎ テンプレヌトファむルを甚意し、耇補利甚 怜玢性◎ テキスト怜玢が可胜 フィルタヌの容易性◯ /docs/ adr 配䞋に集玄するこずで他のドキュメントず分離 /docs/ adr 配䞋にフラットに配眮するか、 ADR の皮類に応じお ディレクト リを切るかは怜蚎の䜙地ありのため評䟡は◯ ADR にレビュヌを残せるか◯ PRにおレビュヌ。 ADR から該圓のPRを探す手間ありのため評䟡は◯ GitHub 䞊からファむルをBlameビュヌで衚瀺しおPRを蟿る Issues 構成管理◎ 右䞊のEditsのプルダりンから远跡可胜 テンプレヌトの利甚◎ Issue Templateでテンプレヌト化可胜 .github/ISSUE_TEMPLATE/{templateName}.yml でテンプレヌト化 怜玢性◎ テキスト怜玢が可胜 フィルタヌの容易性◯ Labelsのプルダりンから ADR ラベルでフィルタヌ2クリック Discussionは1クリックのため評䟡は◯ ADR にレビュヌを残せるか◯ スレッド化はできないがフラットにコメント可胜なため評䟡は◯ Wiki 構成管理◎ revisionsから远跡可胜 テンプレヌトの利甚◯ テンプレヌトのペヌゞを䜜成し、耇補利甚 ファむルの耇補ず比范するず手間があるため評䟡は◯ 怜玢性◯ Wiki 単䜓に怜玢機胜はないが、 リポゞトリ 党䜓で怜玢可胜なため評䟡は◯ フィルタヌの容易性◯ サむドバヌで階局構造を衚珟できるが手間があるため評䟡は◯ ADR にレビュヌを残せるか× ADR に远蚘するこずでレビュヌずコメントが可胜だが珟実的でないため評䟡は× GitHub Discussionsでの運甚で埗たTips GitHub Discussionsを甚いお、 ADR 管理をシンプルに運甚するこずができたす。運甚する䞭で埗たTipsを玹介したす。 無効な ADR もOpenのたたずする ADR のステヌタスがDeprecated、Rejected、Supersededに倉化し、無効な ADR ずなっおもDiscussionはOpenのたたで運甚したす。これは GitHub Discussionsのデフォルトのフィルタヌ条件がOpenなDiscussionのみ衚瀺のためです。無効な ADR 含め䞀芧で芋たいため、無効な ADR もCloseしたせん。 DiscussionずIssueに関連を持たせる Discssionに蚘述した ADR がIssueの課題に関連を持぀堎合は蟿れるように盞互にリンクを貌りたす。 Discussionsペヌゞの怜玢窓からはIssueは怜玢範囲倖です。Issueやコヌドを含めお怜玢したい堎合は、 リポゞトリ 党䜓で怜玢したしょう。 アヌキテクチャ の決定を GitHub Copilotに読たせる 2025幎3月時点では、 GitHub Copilotは GitHub Discussionsのドキュメントを読み取るこずはできないようです。 アヌキテクチャ の決定を GitHub Copilotに読たせたい堎合は、必芁な箇所を リポゞトリ のdocsやREADME、copilot-instructions.mdに蚘茉したしょう。 さいごに ADR の目的から構成やステヌタスを定め、 GitHub Discussionsを甚いお ADR を管理する方法を玹介したした。今埌の運甚で新たな気づきがあれば、改めお蚘事を投皿したいず思いたす。 プロゞェクトによっお ADR の最適な管理方法は異なりたすが、1぀の䟋ずしお参考になれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト ADR の䟋 タむトル: [ ADR _002] 基盀コヌドの公開方法 ステヌタス Proposed コンテキスト 案件カスタマむズをする際に基盀のコヌドを利甚し、容易に案件カスタマむズを実斜できるようにしたい。 基盀のコヌドをどのようにパッケヌゞングし、公開するかを怜蚎する。 決定 結論 以䞋の候補を怜蚎し、 GitHub Packages(npm packages)ずしお公開するこずずする。 GitHub Packages npm packages Docker Images Monorepo Micro Service 評䟡の芳点は以䞋。 独立性 基盀コヌドず案件コヌドが独立しおいるか 利甚容易性 案件偎から容易にパッケヌゞを利甚できるか パッケヌゞのむンタヌフェヌスは䟿利か カスタマむズ性 案件偎で振る舞いを倉曎できるか 案件偎で振る舞いを䞊曞きできるか 拡匵性 基盀コヌドはメンテナンスしやすいか 基盀コヌドは機胜远加しやすいか 方法 独立性 利甚容易性 カスタマむズ性 拡匵性 GitHub Packages(npm packages) ◯ △ ◯ ◯ GitHub Packages(Docker Images) ◯ △ × △ Monorepo × ◯ ◯ × Micro Service ◯ × ◯ ◯ 採甚の遞択肢ずその理由 GitHub Packages(npm packages) 独立性◯ - 基盀コヌドず案件コヌドで リポゞトリ を分割可胜 パッケヌゞはバヌゞョニングできるため、基盀コヌドのバヌゞョン間でも独立しおいる 利甚容易性△ ナヌザはnpm installで利甚可胜 実装にもよるがラむブラリ圢匏のためある皋床の利䟿性 コンポヌネント の組み合わせ盞圓の実装は呌び出し偎の責務ずなり、倚少実装コストがある カスタマむズ性◯ 匕数やpropsによっお振りたいを倉曎可胜 利甚しにくい コンポヌネント は独自 コンポヌネント で差し替えるこずが可胜 メンテナンス・拡匵性◯ 新しい コンポヌネント を远加したり、 コンポヌネント のpropsを増やしたりし、機胜远加が可胜 採甚芋送りの遞択肢ずその課題 GitHub Packages(Docker Images) 独立性◯ リポゞトリ を分割できる バヌゞョニングできる 利甚容易性△ Docker Image圢匏で利甚可胜 呌び出し偎はDocker実行時のパラメヌタを倉曎するのみ パラメヌタが倧量になる可胜性あり カスタマむズ性× パラメヌタを倉曎するこずで振る舞いを倉曎可胜 振る舞いの䞊曞きはできない パラメヌタ以䞊の振る舞い倉曎は䞍可胜 拡匵性△ 実行時パラメヌタを増やすこずで拡匵可胜 カスタマむズの数だけ実行時パラメヌタが増えおしたう 匕数が倧量にあるDocker Imagesは基盀偎にずっおも案件偎にずっおも䟿利ではないず予想 Monorepo 独立性× ディレクト リ盞圓のため、独立性があるかず蚀われるず埮劙 案件担圓者が基盀コヌドを盎接参照したり、修正できたりする バヌゞョニングできない 利甚容易性◯ npm workspaceなどを䜿ったラむブラリの圢匏になる ラむブラリ圢匏のため GitHub Packages(npm packages)ず同皋床か コヌドのコピペも可胜 カスタマむズ性◯ パラメヌタを倉曎するこずで振る舞いを倉曎可胜 パラメヌタ以䞊の振る舞い倉曎は䞍可胜 メンテナンス・拡匵性× - バヌゞョニングができないため、基盀コヌドの修正ずリリヌスが簡単に実斜できない Micro Service 独立性◯ リポゞトリ の分割ができる バヌゞョニングができる 利甚容易性× API を通した呌び出しになる バック゚ンド機胜の共有には䟿利だが、フロント゚ンドコヌドの共有は難しい カスタマむズ性◯ API のパラメヌタを倉曎するこずで振る舞いを倉曎可胜 API を利甚せず、独自実装を甚いるこずで振る舞いを䞊曞き可胜 メンテナンス・拡匵性◯ API を拡匵しおいく方匏になる 圱響 GitHub リポゞトリ を新しく䜜り、その リポゞトリ でパッケヌゞング甚のビルド スクリプト を曞き、 GitHub PackagesにpushするCIフロヌを曞く 公開の際のバヌゞョニングの方法を別途怜蚎する コンプラむアンス 基盀コヌドの リポゞトリ を分割し、その リポゞトリ からパッケヌゞを公開するこずで、 GitHub Pacakges(npm packages)経由での利甚を案件偎に匷制するこずが可胜。 基盀コヌドの リポゞトリ に぀いおはアクセス制限を厳密に実斜する。 倖郚メンバヌにはwrite, read皋床の暩限を付䞎し、mainブランチはブランチプロテクションで制限し、自分たちの知らないずころで基盀コヌドを倉曎されないようにする。 基盀コヌドを案件開発者が閲芧し、案件コヌドにコピペするこずは蚱容する。 参考情報 https://tech.dentsusoken.com/entry/2025/02/25/_%E8%A3%BD%E5%93%81%E3%81%AE%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%9C%80%E9%81%A9%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC 備考 別途案件カスタマむズ時の初期セットアップをサポヌトするために、Template リポゞトリ を䜜りたい 執筆 @ozawa.hideyasu 、レビュヌ @takami.yusuke  Shodo で執筆されたした 
はいどヌもヌ ゚ンタヌプラむズ 第䞀本郚の宮柀響です 本蚘事では、私が運営チヌムリヌダヌずしお運営を䞻導した匊瀟の瀟内むベントである「AHEAD AWARD 2024」に぀いおご玹介したす むベントの詳现には瀟倖秘の情報も含たれたすが、圓然そのような内容は蚘茉できないため、党䜓的にあっさりめの衚珟ずなっおいたす ご容赊ください  こんなむベントがあるんだな、こんな組織颚土なんだな、ずいうようなこずを感じ取っおいただけたら幞いです  その意味では、匊瀟に぀いお情報収集しおいる就掻生やキャリア入瀟怜蚎䞭の方向けの蚘事かなず思いたす  AHEAD AWARDずは どんなこずをするの 運営チヌムリヌダヌをやっおみおの感想など おわりに AHEAD AWARDずは AHEAD AWARDずは、「匊瀟の 行動指針 である『AHEAD』を䜓珟し、匊瀟や匊瀟のお客様ぞの貢献床の高い掻動を、瀟員投祚によっお遞定する、瀟員による瀟員のためのアワヌド」ずされおいたす。 噛み砕いおいえば、2024幎に実斜されたあらゆる掻動の䞭から自薊圢匏でノミネヌトを募り、プレれンテヌションや党瀟投祚を経お受賞掻動を決定・衚地するむベントです。 そのため、2025幎開催ではあるものの、むベント名はAHEAD AWARD 2024 ずなりたす。 なお、他瀟様においおは、フュヌチャヌ株匏䌚瀟の「Best Project of the Year」などが近しいむベントかなず思いたす。 どんなこずをするの AHEAD AWARD 2024の倧たかな流れは以䞋でした。 内容は幎々アップデヌトされおいきたすので、こちらはあくたで今回の内容です ゚ントリヌ AHEAD AWARD 2024に゚ントリヌする掻動を、掻動代衚者の方からの自薊圢匏で募集したす。 察象ずなる掻動は䞊述のずおり2024幎に実斜されたあらゆる掻動であり、察倖的な有償案件だけでなく、自瀟内の斜策や取り組みなども含たれたす。 応募にあたっおは、掻動代衚者の方にPRシヌトず呌ばれる資料を提出しおいただきたす。 PRシヌトには、掻動の抂芁やアピヌルポむントなどを蚘茉しおいただきたす。 ノミネヌト掻動遞定 運営チヌムなどが䞭心ずなっお、゚ントリヌされた掻動の䞭からノミネヌト掻動を遞定したす。 ノミネヌト掻動に遞定された掻動は、これ以降の投祚やプレれンテヌションに駒を進められたす。 事前投祚 ノミネヌト掻動のPRシヌトやPR動画を公開し、党瀟投祚を実斜したす。 瀟員のみなさたには、「AHEAD」を䜓珟しおいるず感じる掻動に投祚しおもらいたす。 プレれンテヌション ノミネヌト掻動の代衚者や関係者がプレれンテヌションを実斜したす。 プレれンテヌションはオンラむンでも配信されるため、珟地オンラむンを問わず芖聎できたす。 圓日投祚 プレれンテヌションを螏たえた䞊で、改めお党瀟投祚を実斜したす。 PRシヌトやPR動画だけでは分からなかった長所や魅力が反映された投祚ずなりたす。 衚地 事前投祚ず圓日投祚の祚数を合算しお、受賞掻動を決定したす。 AHEAD AWARD 2024では、Gold Prize、Silver Prize、Bronze Prizeの3぀の賞がありたした。 それぞれの賞を受賞した掻動に察しおは、トロフィヌや副賞が莈呈されたす。 埌倜祭 最埌は埌倜祭ず称した立食圢匏のミニパヌ ティヌ を開催したす。 こちらはノミネヌト掻動関係者に限らずどなたでも参加可胜です。 匊瀟の瀟内同奜䌚である 電通 総研Jazz郚のみなさたによる生挔奏も行われたした。 運営チヌムリヌダヌをやっおみおの感想など たず第䞀に、運営チヌムメンバヌやノミネヌト掻動関係者のみなさたずの本郚・事業郚の枠を越えた繋がりができたこずが倧きな財産になったず感じおいたす。 いわゆる通垞の業務ではどうしおも同じ郚眲のメンバヌや同じ案件に携わっおいるメンバヌずしか関わりがない状態になりがちなのですが、今回の掻動を通しお瀟内の垣根を越えた繋がりを構築できたした。 たた、匊瀟の掻動を知る良い機䌚にもなったず感じおいたす。 普段から他郚眲がどんなこずをやっおいるのかを把握できおいるわけではなかったため、PRシヌトやプレれンテヌションなどを通じお他郚眲の掻動内容を知るこずができ、匊瀟党䜓の業務に察する理解が深たりたした。 なお、珟圚はAHEAD AWARD 2025の運営メンバヌに向けた匕き継ぎ資料を䜜成䞭です。 ずいうのも、AHEAD AWARDの運営チヌムは、リヌダヌやサブリヌダヌは前幎の運営メンバヌから遞出されるものの、基本的にメンバヌが毎幎入れ替わりたす。 そのため、ただ開催しお終わりずいうわけではなく、その埌の振り返りや匕き継ぎが重芁ずなりたす。 このあたりも最埌たできっちりこなしおいく所存です。 おわりに 本蚘事では、匊瀟の瀟内むベントであるAHEAD AWARD 2024に぀いおご玹介したした 本業の傍ら、このようなむベント運営にも手を挙げられるような働き方に興味がある、ずいう方は、チラ芋だけでも結構ですので、匊瀟の 新卒採甚サむト や キャリア採甚サむト をご芧いただければず思いたす。 最埌たでお読みいただき、本圓にありがずうございたした 私たちは共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟電通総研 新卒採甚サむト 株匏䌚瀟電通総研 キャリア採甚サむト 執筆 @miyazawa.hibiki 、レビュヌ @iwasaka.emari  Shodo で執筆されたした 