TECH PLAY

NTTドコモビゞネス

NTTドコモビゞネス の技術ブログ

å…š602ä»¶

みなさんこんにちは、むノベヌションセンタヌの益本 (@masaomi346) です。 Network Analytics for Security (以䞋、NA4Sec) プロゞェクトのメンバヌずしお掻動しおいたす。 この蚘事ではフィッシング詐欺がどのように行われおいるのか、フィッシングサむトがどのような仕組みで動䜜しおいるのか、泚意喚起を兌ねお玹介したす。 ぜひ最埌たで読んでみおください。 フィッシング詐欺に぀いお フィッシング詐欺がどのように行われおいるのか フィッシングサむトがどのように構築されおいるのか フィッシングサむトがどのように動䜜しおいるのか どんな情報を窃取しおいるのか 窃取した情報はどこに送られるのか 盞手の情報を収集・刀別する 窃取したクレゞットカヌド番号が有効であるか確認する フィッシング詐欺に匕っかかるずどうなるのか フィッシング詐欺を枛らすための取り組み マラ゜ン型の撲滅むベント開催 囜内カヌド䌚瀟等による共同の取り組み フィッシングハンタヌたちによるSNS投皿 被害に遭わないようにするには 被害に合わないための手段(䟋)たずめ さいごに フィッシング詐欺に぀いお フィッシング(Phishing)詐欺ずは、メヌル等から本物そっくりの停サむトぞ誘導し、IDやパスワヌドを入力させお情報を盗み取る詐欺の手口です。 幎々フィッシング詐欺による被害が増加し続けおいたす。 特に、3月䞋旬あたりから蚌刞䌚瀟を隙ったフィッシングメヌルや投資詐欺メヌルが倧量に出回っおおり、各所で泚意喚起を出しおいたす。 蚌刞䌚瀟口座 䞍正アクセス被害盞次ぐ フィッシング詐欺に泚意 フィッシング詐欺蚌刞䌚瀟を装う停サむトぞの電子メヌル等での誘導にご泚意ください NA4Secでも蚌刞䌚瀟を隙ったフィッシングサむトを芳枬しおいたす。 🚚⚡ #Phishing #フィッシング詐欺 (🇯🇵) Brand: #野村證刞 IP: 🌍 103.112.211[.]228 (ASN:AS150855) URL: 🎣 hxxps://mehhkapradwwoesi.qcwb76.com/ 🎣 hxxps://vasoconstrictio.qcmky6r.com/ 🎣 hxxps://xeroththaamiahl.qcw5htg.com/ 🎣 hxxps://yesterdaynessrr.mkca0.com/ H/T to Team NA4Sec pic.twitter.com/IRX3oaBsEH — Metemcyber (@Metemcyber) 2025幎4月4日 🚚⚡ #Phishing #フィッシング詐欺 (🇯🇵) Brand: #Rakuten #楜倩 #楜倩蚌刞 IP: 🌍 47.83.189[.]115 (ASN:AS45102) URL: 🎣 hxxps://217564.top/oeugef/ 🎣 hxxps://255711.top/oeugef/ 🎣 hxxps://363342.top/oeugef/ 🎣 hxxps://368226.top/oeugef/ H/T to Team NA4Sec pic.twitter.com/jIdn9xbMnP — Metemcyber (@Metemcyber) 2025幎4月11日 フィッシング詐欺がどのように行われおいるのか おおたかに以䞋の流れでフィッシング詐欺が実行されたす。 フィッシングサむトを構築するなど準備する 停のメヌルやSMSを送信する 実行し、個人情報などを窃取する 窃取した情報で収益を䞊げる 近幎ではサむバヌ犯眪の分業化が進んでおり、䞊蚘の画像で説明したような段階それぞれにおいお、以䞋のように圹割を分けお犯眪者達が暗躍しおいたす。 フィッシング詐欺に䜿うツヌルやサヌビスを提䟛する人 フィッシング詐欺を実際にする人 窃取したクレゞットカヌド情報の販売をする人 etc. この蚘事ではフィッシング詐欺に䜿うツヌルがどのように構築・提䟛されおいるのかに぀いお、実際の䟋を元に玹介しおいきたす。 フィッシングサむトがどのように構築されおいるのか フィッシング詐欺に関わっおいる犯眪者党員が技術的に長けおいるわけではありたせん。 䜕より、䞀からフィッシングサむトを䜜成するのは手間がかかりたす。 なので、犯眪者コミュニティには、フィッシング詐欺を支揎する以䞋のようなツヌルやサヌビスが提䟛されおいたす。 買い切り型のフィッシングサむト構築ツヌル(フィッシングキット) サブスク型のむンフラやツヌル䞀匏を提䟛するサヌビス(Phishing as a Service) etc. これらを利甚するこずで、フィッシング詐欺をするための技術的なハヌドルを䞋げるこずができたす。 䟋えば以䞋の画像では、あるPhishing as a Serviceがサブスク型/買い切り型のそれぞれで提䟛されおいるこずがわかりたす。 週租 → 週単䜍 月租 → 月単䜍 æ°žä¹…ä¹°æ–­ → 買い切り ※Uは仮想通貚のUSDTを指す。 フィッシングサむトがどのように動䜜しおいるのか フィッシングサむトがどのように動䜜しお、どのような機胜が搭茉されおいるのか、実際のフィッシングキット(フィッシングサむト構築ツヌル)を解析しお玹介したす。 今回のフィッシングキットはzipファむルになっおおり、展開するずさたざたなファむルが入っおいたす。 どんな情報を窃取しおいるのか 今回玹介するフィッシングキットは、日本のネット銀行のサむトを隙っおいたす。 ログむンの芁求をしたり、本人確認ず隙っおクレゞットカヌドの情報を入力させるこず等を通しお以䞋の情報を窃取しおいたす。 ログむンID・ログむンパスワヌド 生幎月日・取匕パスワヌド クレゞットカヌド番号・セキュリティコヌド メヌルトヌクン 窃取した情報はどこに送られるのか このフィッシングキットには管理者パネルが搭茉されおおり、窃取した情報の䞀芧を確認できたす。 DEVICE INFO → IPアドレス・堎所・ナヌザヌ゚ヌゞェント LOGIN → ログむンID・ログむンパスワヌド AUTH → 生幎月日・取匕パスワヌド INFORMATION CARD → クレゞットカヌドの番号・セキュリティコヌド CODE EMAIL → メヌルトヌクン LOG → どのペヌゞを衚瀺したか ACTION → 珟状のステヌタス たた、このフィッシングキットでは画面遷移をするたびに、Telegramに窃取した情報を送信しおいたす。 䞋の画像は、ログむンID・ログむンパスワヌドを窃取した際に、管理者パネルずTelegramぞ送信しおいる箇所になりたす。 盞手の情報を収集・刀別する フィッシングサむトには盞手の情報を収集する機胜が搭茉されおおり、盞手の情報を収集するこずで、以䞋のようなこずが可胜になりたす。 タヌゲットの䜿甚環境に合わせお、適したコンテンツを衚瀺できる 専門家などの分析を回避できる このフィッシングキットでは、以䞋の情報を収集しおいたす。 䜿甚しおいるOS・ブラりザ(ナヌザヌ゚ヌゞェントから取埗) IPアドレス ホスト名 どこの囜からアクセスしおいるか これらの情報を䜿っお、攻撃者が想定しおいるタヌゲットか確認し、想定しおいるタヌゲットであればフィッシングサむトを衚瀺したす。 どのように刀別しおいるのか䞀郚玹介したす。 䟋えば、このフィッシングキットは日本人をタヌゲットにしおいるので、タヌゲットのIPアドレスを倖郚のサヌビス(ip-api.com)に問い合わせ、囜識別コヌドが「JP」であるか確認しおいたす。 専門家からのアクセスを防ぐため、䞊蚘で収集したIPアドレスを利甚したす。 事前に䜜成したリストのIPアドレスに䞀臎した際、アクセスのブロックを行いたす。 なお、こちらのリストにあるIPアドレスには、ホスティングやプロキシ・VPNなど䞀般の人は利甚しないものが含たれおいたす。 窃取したクレゞットカヌド番号が有効であるか確認する このフィッシングキットには、窃取したクレゞットカヌド番号に぀いお有効であるか確認する機胜が搭茉されおいたす。 䞋の画像では、クレゞットカヌド番号が有効であるか確認したり、倖郚サヌビス(binlist.net)を䜿っおBINコヌドの情報を取埗しおいたす。 フィッシング詐欺に匕っかかるずどうなるのか フィッシング詐欺に匕っかかり、ログむン情報やクレゞットカヌド等の個人情報を入力しおしたうず、それらの情報が悪甚されおしたいたす。 以䞋のようなこずになる可胜性がありたす。 窃取した情報を販売しお他の攻撃者の手に枡る メヌルアカりントが乗っ取られ、メヌルボックスの䞭身を芋られる SNSアカりントが乗っ取られ、なりすたされる 銀行口座やクレゞットカヌドを悪甚される etc. フィッシング詐欺を枛らすための取り組み フィッシング詐欺を枛らすために、各所でさたざたな取り組みが行われおいたす。 ほんの䞀䟋を玹介したす。 マラ゜ン型の撲滅むベント開催 「フィッシングサむト撲滅チャレンゞマラ゜ン」ずいうむベントがJC3により開催されたした。 フィッシングサむトのAbuse報告数やテむクダりン数をマラ゜ンのように競い合うむベントになっおいたす。 専甚のツヌルを䜿っおいるため、参加するためのハヌドルが䜎くなっおいたす。 フィッシングサむト撲滅チャレンゞマラ゜ン開催 囜内カヌド䌚瀟等による共同の取り組み 日本クレゞットカヌド協䌚ず囜内のクレゞットカヌド䌚瀟、フィッシングサむト怜知サヌビスを提䟛しおいる䌚瀟が、共同でフィッシングサむトを閉鎖する取り組みを始めおいたす。 囜内カヌド䌚瀟8瀟ずACSiONず共同でフィッシングサむト閉鎖の取組を開始したした。 フィッシングハンタヌたちによるSNS投皿 SNSには、フィッシング詐欺に぀いおの情報発信をしおいる人たちがいたす。 「#Phishing」「#フィッシング詐欺」などで怜玢するず、情報発信をしおいる様子がわかりたす。 フィッシングハンタヌに぀いおは、以䞋の資料で玹介されおいたす。(52ペヌゞ参照) サむバヌセキュリティ仕事ファむルみんなが知らない仕事のいろいろ 被害に遭わないようにするには ここ最近のフィッシングメヌルは䞍自然なずころが少なくなっおおり、本物か停物かの刀断が難しくなっおいたす。 文面だけでなく、メヌルやSMSに貌られたリンクも巧劙に停装されおいる堎合がありたす。 実際のものに酷䌌したURLや、衚瀺ず実際のリンク先で異なる堎合があるため、これを芋分けようずするず間違った刀断をしおしたう可胜性がありたす。 なので、芋分けなくおも枈む手段で確認するこずをお勧めしたす。 たた、IDずパスワヌドだけでログむンできる状態にしないこずも重芁です。 被害に合わないための手段(䟋)たずめ 公匏が提䟛しおいるアプリから確認する 普段䜿うサむトをブックマヌクに保存し、そこから確認する ID/パスワヌド以倖の远加認蚌蚭定が可胜な堎合にはそちらを蚭定する特にパスキヌなどフィッシング耐性があるずされる方匏を掚奚 サヌビス提䟛者偎も「フィッシング耐性のある認蚌」を提䟛するこずが望たれたす。 さいごに フィッシング詐欺に限らずサむバヌ犯眪の分業化が進んでおり、犯眪に関わる人すべおを逮捕するこずが難しくなっおいたす。 そのため、犯眪者を逮捕するだけでなく、1人1人がしっかり自衛する環境を䜜っおいくこずで、犯眪で利益を出しにくくするこずが重芁になりたす。 フィッシング詐欺に぀いお知るこずで、被害を枛らすヒントに぀ながるかもしれたせん。 本蚘事により、被害を受ける人を少しでも枛らせるずいいなず筆者は考えおいたす。
アバタヌ
OpenStack の Compute Node を曎新する際にゲスト VM の Disk 性胜が䜎䞋する問題を、 Linux の Timestamping ずいう機胜を䜿っおネットワヌクレむテンシを分析するこずで解決できた事䟋をご玹介したす。 本事䟋は fukabori.fm #127 でもご玹介しおいたす。 はじめに 前提: 仮想サヌバの構成 初期調査 仮想化レむダの問題を切り分ける CPv2 ず CPv3 の違いに着目する CPv3 においお RTT が高い問題を切り分ける Timestamping 実隓の構成図 RX 方向のレむテンシを分析する RX 方向のタむムスタンプを取埗するコヌド TX 方向のレむテンシを分析する TX 方向のタむムスタンプを取埗するコヌド End to End レむテンシの内蚳 RX 方向にノむズが乗る原因調査: 他プロセスの圱響 RX 方向にノむズが乗る原因調査: 電力関連の蚭定 たずめ お知らせ はじめに こんにちは。 SDPF クラりド・仮想サヌバヌチヌムの杉浊 ( @Kumassy_ ) です。 普段は OpenStack の開発・運甚をしおおり、最近は仮想マシンの性胜解析やトラブルシュヌティングなどに取り組んでいたす。 仮想サヌバヌチヌムでは、 OpenStack の Nova, Cinder, Glance 等を掻甚し、仮想マシン (VM) ず、それを動かすのに必芁なディスクやむメヌゞを管理できる機胜を提䟛しおいたす。 VM が皌働しおいるホストは Compute Node ず呌ばれたす。 仮想サヌバヌチヌムでは、 Compute Node に䜿甚しおいる物理サヌバヌや OS の曎新のため、新しい䞖代の Compute Node である CPv3 を開発しおいたす。 䜙談ですが、 初代の Compute Node である CPv1 から 2 䞖代目の CPv2 に移行する苊劎話は CODT 2021 でご玹介しおいたす 1 。 CPv3 の倉曎点は次の図の通りです。 物理サヌバヌず OS、仮想マシンを動かすための qemu や libvirtd を曎新する蚈画です。 Compute Node の蚭定を倉曎したり、゜フトりェアを入れ替えたりする際には、ゲスト VM の性胜に問題が出ないか詊隓をする必芁がありたす。 そのため、耇数のベンチマヌクツヌルを䜿甚しお、ゲスト VM の性胜が基準倀を満たしおいるかを確認しおいたす。 しかし、ベンチマヌクの結果、 CPv3 では前䞖代の CPv2 ず比べお、ゲスト VM の Disk 性胜が 33 - 50 % 皋床になっおいるこずがわかりたした。 ハヌドりェアが新しくなったのにもかかわらず、ゲスト VM の性胜が倧幅に䜎䞋しおしたったのは問題です。 本蚘事では、この問題をどのように解決したのかをご玹介したす。 前提: 仮想サヌバの構成 仮想サヌバのアヌキテクチャは次の図のようになっおいたす。 ゲスト VM のディスクは NFS Server 䞊のファむルずしお保存されおいたす。 Compute Node は NFS Server のストレヌゞプヌルをマりントしおおり、 qemu はディスクのむメヌゞファむルをブロックストレヌゞずしおゲスト VM に芋せおいたす。 Compute Node のアップデヌト期間䞭は、 CPv2 ず CPv3 は同じ NFS Server に接続されたす。 初期調査 仮想化レむダの問題を切り分ける ゲスト VM の性胜詊隓ずしお、 Linux ゲストの Disk 性胜詊隓には fio 2 ずいうベンチマヌクツヌルを利甚しおいたす。 CPv2 ず CPv3 のそれぞれに VM をデプロむし、 VM の䞭で fio を動䜜させたずころ、 CPv3 では bw 及び iops スコアが CPv2 ず比べお 33 - 50 % 皋床であるこずがわかりたした。 CPv3 ではハヌドりェアではなく OS や qemu, KVM 等のバヌゞョンも違い倉曎範囲が倧きいので、䜕が圱響しおいるかを絞り蟌む必芁がありたす。 そこで、たずはホストで fio を盎接動かしおベンチマヌクのスコアが䜎䞋するか調べるこずにしたした。 次のコマンドのように、 NFS Server 䞊のファむルに察しお I/O リク゚ストを発生させたす。 sudo fio -filename = /path/to/nfs/storage/fio -direct = 1 -rw = randread -rwmixread = 30 -bs = 4k -size = 3G -numjobs = 1 -runtime = 180 -group_reporting -name =test その結果、次のグラフのように、 CPv3 は CPv2 ず比べお fio のスコアが明らかに悪いこずがわかりたした。 グラフでは CPv2 のスコアを 1 ずしお正芏化しおいたす。 CPv3 における fio のスコアは CPv2 の 0.51 倍くらいのスコアでした。 CPv2 ず CPv3 の違いに着目する 仮想サヌバの構成図で瀺したように、 CPv2 ず CPv3 の Compute Node は同じ NFS Server に接続されおいるので、 NFS Server 偎は問題なさそうです。 よっお、 NFS Client である Compute Node か途䞭のネットワヌクに問題がありそうです。 CPv2 ず CPv3 の差分を調査しおみるず、 NFS Server ずのネットワヌクレむテンシに違いが芋぀かりたした。 CPv2 ず CPv3 それぞれの Compute Node から NFS Server ずの間の RTT を ping コマンドで枬定するず、次のようになりたした。 CPv3 は CPv2 ず比べお、 NFS Server ずの RTT が 0.1 ms くらい倧きいようです。 この RTT の違いはどれくらい fio のスコアに圱響するでしょうか。 それを確かめるために、 tc コマンドを䜿い CPv2 の NIC に察しお意図的に遅延を぀けるこずで、 fio のスコアがどれくらい䜎䞋するか調べたした。 䞊蚘の図に瀺すように、 1 ms のレむテンシを远加するず fio の性胜が 10 % 皋床に、 100 us のレむテンシを远加するず fio の性胜が 65 % くらいに䜎䞋するこずがわかりたした。 これたでの調査の結果から、 「 CPv3 では NFS Server ぞのネットワヌクレむテンシが高いこずで、 NFS 䞊のファむルぞの I/O 性胜が䜎い」ずいう仮説を立おお、以降の調査ではネットワヌクレむテンシが高くなっおしたった理由を深堀りするこずにしたした。 CPv3 においお RTT が高い問題を切り分ける Timestamping RTT が高い理由を分析するためには、党䜓のレむテンシを分解し、どの郚分でどれだけ時間がかかっおいるか分析できるようにしたいです。 この甚途に䜿えるのが Timestamping 3 です。 Timestamping ずは、パケットが Linux システム内の特定のポむントを通過した時間を蚘録する機胜で、パケットが Kernel に到着した、もしくは Kernel から出おいく時刻を調べるこずができたす。 さらに、 NIC が hardware timestamping をサポヌトしおいる堎合、パケットが NIC に到着した、もしくは NIC から出おいく時刻を知るこずができたす。 パケットに぀けられたタむムスタンプを分析するこずで、パケットが Application, Kernel, NIC の各レむダでどれくらい時間がかかったかを分析できたす。 Timestamping を䜿っおネットワヌクレむテンシを分析する手法は How to measure network latency using hardware timestamps | IIJ Engineers Blog 4 で詳しく玹介されおおり、本蚘事でも IIJ Engineers Blog のプログラムを利甚しおいたす。 本手法を䜿っお hardware timestamping を利甚するには、 NIC が以䞋のように hardware-transmit , hardware-receive capablity ず、 Hardware Receive Filter Modes: all をサポヌトしおいる必芁がありたす。 $ sudo ethtool -T ens15f0 Time stamping parameters for ens15f0: Capabilities: hardware-transmit software-transmit hardware-receive software-receive software-system-clock hardware-raw-clock PTP Hardware Clock: 1 Hardware Transmit Timestamp Modes: off on Hardware Receive Filter Modes: none all Compute Node ず NFS Server 間のネットワヌクレむテンシを分析できればよかったのですが、 NFS Server 䞊で任意のプログラムを動かすのは難しかったので、 隣接する Compute Node 間のネットワヌクレむテンシを分析するこずにしたした。 実隓の構成図 実隓環境は以䞋の図のようになりたす。 Rust 蚀語で曞かれた packet generator から rx_timestamping.c もしくは tx_timestamping.c に向かっおパケットが送られたす。 rx_timestamping.c は packet generator からパケットを受信するたびに、パケットに玐づけられたタむムスタンプを取埗しお保存するこずで、 RX 方向のレむテンシを分析したす。 tx_timestamping.c は packet generator からパケットを受信するたびに packet generator ぞパケットを echo back し、その際に埗られたタむムスタンプを取埗しお保存するこずで、 TX 方向のレむテンシを分析したす。 特にチュヌニングを加えない状態では、隣接 Compute Node 間の RTT は 0.35 ms くらいでした。 RX 方向のレむテンシを分析する RX 方向のタむムスタンプを取埗するコヌド rx_timestamping.c は、 IIJ Engineers Blog で玹介されおいるコヌド 5 を元に、アドレスを曞き換えたものを利甚したした。 コヌドを動かす前に次の手順が必芁です。 hwstamp_ctl を䜿っお、 NIC の hardware timestamping を有効化する カヌネルず NIC は別のクロックを利甚しおいるため、 phc2sys を䜿っおカヌネルず NIC の時刻を同期し続ける receiver$ sudo hwstamp_ctl -i ens15f1 -t 1 -r 1 current settings: tx_type 0 rx_filter 0 new settings: tx_type 1 rx_filter 1 # 実隓が終わるたで動かし続ける receiver$ sudo phc2sys -s ens15f1 -O 0 -m phc2sys [ 9050057 . 499 ] : CLOCK_REALTIME phc offset 20443468618 s0 freq -83335672 delay 615 phc2sys [ 9050058 . 517 ] : CLOCK_REALTIME phc offset 20521848621 s1 freq + 11638 delay 602 phc2sys [ 9050059 . 518 ] : CLOCK_REALTIME phc offset 4878 s2 freq + 16516 delay 726 phc2sys [ 9050060 . 518 ] : CLOCK_REALTIME phc offset 10 s2 freq + 13111 delay 652 準備ができたら、 rx_timestamping.c を動かしたす。 receiver$ make run sudo ./timestamping --port 1337 --max 100000 Socket created, listening on port 1337 Selecting hardware timestamping mode. enabled timestamping sockopt 最埌に、 packet generator を動かしお実隓を開始したす。 sender$ sudo cargo run --release ens15f1 Finished release [ optimized ] target ( s ) in 0 .06s Running `target/release/tranquil ens15f1` 実隓で埗られたタむムスタンプを可芖化するず、次のグラフのようになりたす。 暪方向は時間軞です。 packet generator は 100,000 パケットを rx_timestamping.c に向かっお送信したすが、グラフでは最初ず最埌の10,000パケットを陀いた 80,000 パケットを衚瀺しおいたす。 瞊方向はレむテンシの内蚳を瀺したす。各レむテンシの説明は次の衚の通りです。 レむテンシ 取埗元 説明 End to End sender パケットを sendto しおから recv_from するたでの時間 NIC -> User receiver パケットが NIC に到着しおから User 空間で recvmsg するたでの時間。 gettimeofday() - SOF_TIMESTAMPING_RX_HARDWARE NIC -> Kernel receiver パケットが NIC に到着しおからパケットが Kernel 空間に到着するたでの時間。 ( SOF_TIMESTAMPING_RX_SOFTWARE の時刻) - ( SOF_TIMESTAMPING_RX_HARDWARE の時刻) Kernel -> User receiver パケットが Kernel 空間に到着しおから User 空間で recvmsg するたでの時間 グラフから、 Kernel → User のレむテンシにノむズが発生しおいるこずがわかりたした。このノむズにより、通垞は玄 10 us のレむテンシが、時折 100 us 皋床たで増加する堎合がありたす。この圱響で、 RTT が埀埩で玄 200 us 増加しおいるこずが確認されたした。 RX 方向のタむムスタンプを取埗するコヌド RX 方向のタむムスタンプを取埗するコヌド rx_timestamping.c の䞭身を芋おみたしょう。 コヌドの最初のほうでは、 socket にタむムスタンプを取埗するためのフラグを蚭定したす。 int enable = SOF_TIMESTAMPING_RX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE | SOF_TIMESTAMPING_SYS_HARDWARE | SOF_TIMESTAMPING_SOFTWARE; TRY ( setsockopt (sock, SOL_SOCKET, SO_TIMESTAMPING, &enable, sizeof ( int ))); https://github.com/ArneVogel/hw-timestamping/blob/main/rx_timestamping.c#L237-L239 䞊蚘のように socket にフラグを蚭定するず、 recvmsg したずきにタむムスタンプがメタデヌタずしお枡されおきたす。 recvmsg は以䞋の郚分で呌び出されおいたす。 /* recvmsg header structure */ make_address ( 0 , &host_address); iov.iov_base = buffer; iov.iov_len = 2048 ; msg.msg_iov = &iov; msg.msg_iovlen = 1 ; msg.msg_name = &host_address; msg.msg_namelen = sizeof ( struct sockaddr_in); msg.msg_control = control; msg.msg_controllen = 1024 ; /* block for message */ got = recvmsg (sock, &msg, 0 ); https://github.com/ArneVogel/hw-timestamping/blob/main/rx_timestamping.c#L410C1-L422C32 次に瀺すコヌドのように、特定のマクロを䜿うこずで、 msg からパケットに玐づいたタむムスタンプを取埗できたす。 static void handle_time ( struct msghdr *msg, struct configuration *cfg) { struct timespec *ts = NULL ; struct cmsghdr *cmsg; for (cmsg = CMSG_FIRSTHDR (msg); cmsg; cmsg = CMSG_NXTHDR (msg, cmsg)) { if (cmsg->cmsg_level != SOL_SOCKET) continue ; switch (cmsg->cmsg_type) { case SO_TIMESTAMPNS: ts = ( struct timespec *) CMSG_DATA (cmsg); break ; case SO_TIMESTAMPING: ts = ( struct timespec *) CMSG_DATA (cmsg); break ; default : /* Ignore other cmsg options */ break ; } } https://github.com/ArneVogel/hw-timestamping/blob/main/rx_timestamping.c#L344C1-L363C4 タむムスタンプは ts 配列の䞭に栌玍されたす。 ts 配列の䞭身は、以䞋のコメントを参考にするずよいでしょう。 /* Hardware timestamping provides three timestamps - * system (software) * transformed (hw converted to sw) * raw (hardware) * in that order - though depending on socket option, you may have 0 in * some of them. */ https://github.com/ArneVogel/hw-timestamping/blob/main/rx_timestamping.c#L281-L287 最埌に、 ts から NIC -> User , NIC -> Kernel , Kernel -> User の各区間のレむテンシを蚈算したす。 diff_nic_kernel = (ts[ 0 ].tv_sec - ts[ 2 ].tv_sec) * 1000000000 + (ts[ 0 ].tv_nsec - ts[ 2 ].tv_nsec); nic_kernel_latency_numbers[total_received++] = diff_nic_kernel; // all latency numbers are in nanoseconds if (old_diff_nic_kernel != 0 ) { nic_kernel_total_diff += diff_nic_kernel - old_diff_nic_kernel; } diff_kernel_user = (time_user.tv_sec - ts[ 0 ].tv_sec) * 1000000000 + (time_user.tv_usec * 1000 - ts[ 0 ].tv_nsec); diff_nic_user = (time_user.tv_sec - ts[ 2 ].tv_sec) * 1000000000 + (time_user.tv_usec * 1000 - ts[ 2 ].tv_nsec); https://github.com/ArneVogel/hw-timestamping/blob/main/rx_timestamping.c#L312-L324 TX 方向のレむテンシを分析する パケットが送信時に詰たっおしたい、 TX 方向でレむテンシが増加しおいる可胜性も考えられたので、RX 方向ず同様の分析を TX 方向でも実斜したした。 IIJ Engineers Blog では RX 方向のレむテンシのみを分析しおおり、 TX 方向のレむテンシを分析するコヌドはありたせん。そこで、 majek/openonload リポゞトリの src/tests/onload/hwtimestamping/tx_timestamping.c 6 を改造しお動かしたした。 なお、 rx_timestamping.c ず同じように、 tx_timestamping.c ず動かす前に hardware timestamping を有効化し、 NIC ずクロックを同期する必芁がありたす。 TX 方向では、 Kernel のタむムスタンプ SOF_TIMESTAMPING_TX_SOFTWARE がなぜか取埗できなかったため、 User -> NIC のレむテンシのみを集蚈したした。 たた、タむムスタンプの取埗にずきどき倱敗し、安定性は高くない印象でした。 User-> NIC のレむテンシを可芖化するず次の図のようになりたす。 レむテンシは 4 - 40 us 皋床であり、 RX ず比べるず十分小さいこずがわかりたした。 TX 方向のタむムスタンプを取埗するコヌド TX 方向のタむムスタンプを取埗するコヌド tx_timestamping.c の䞭身を芋おみたしょう。 RX 方向の堎合、 User Space でパケットを受信できるころにはパケットが NIC や Kernel を通過した時刻が確定しおいるので、比范的簡単にタむムスタンプを取埗できたす。 䞀方で TX 方向の堎合、 User Space からパケットを送信しおも、パケットが Kernel や NIC を通過する時刻は未確定のため、タむムスタンプを取埗するにはひず工倫必芁です。 具䜓的には、パケットを sendmsg しお送信したあず、 error queue から recvmsg するこずでタむムスタンプを取埗できたす。 最初に、 socket に察しお timestamp を取埗するようにフラグを蚭定したす。 enable = SOF_TIMESTAMPING_TX_HARDWARE | SOF_TIMESTAMPING_SYS_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE; if (cfg->cfg_protocol == IPPROTO_TCP) enable |= ONLOAD_SOF_TIMESTAMPING_STREAM; ok = setsockopt (sock, SOL_SOCKET, SO_TIMESTAMPING, &enable, sizeof ( int )); https://github.com/majek/openonload/blob/master/src/tests/onload/hwtimestamping/tx_timestamping.c#L338-L339 たずは sendmsg を呌び出し、パケットを送信したす。 /* recvmsg header structure */ make_address ( 0 , 0 , &host_address); iov.iov_base = buffer; iov.iov_len = 2048 ; msg.msg_iov = &iov; msg.msg_iovlen = 1 ; msg.msg_name = &host_address; msg.msg_namelen = sizeof ( struct sockaddr_in); msg.msg_control = control; msg.msg_controllen = 1024 ; TRY ( sendmsg (sock, &msg, 0 )); https://github.com/majek/openonload/blob/master/src/tests/onload/hwtimestamping/tx_timestamping.c#L494-L518C1 次に MSG_ERRQUEUE フラグを指定し、 error queue から recvmsg するこずで、送信したパケットを msg に読み出したす。 その埌、 RX の堎合ず同様に、 msg を CMSG_FIRSTHDR マクロで読み出せばタむムスタンプを埗られたす。 sendmsg しおから recvmsg できるようになる時刻がわからないので、コヌドでは busy loop で recvmsg を読み出す䜜りになっおいお、動䜜の安定性に欠けるようです。 /* retrieve TX timestamp * Note: Waiting for it this way isn't the most efficient option. * For higher throughput, check associate times to packets afterwards. */ msg.msg_control = control; iov.iov_len = 2048 ; do { msg.msg_controllen = 1024 ; got = recvmsg (sock, &msg, MSG_ERRQUEUE); } while (got < 0 && errno == EAGAIN && check++ < check_max); if ( got < 0 && errno == EAGAIN ) { printf ( "Gave up acquiring timestamp. \n " ); return - EAGAIN ; } https://github.com/majek/openonload/blob/master/src/tests/onload/hwtimestamping/tx_timestamping.c#L520-L533 End to End レむテンシの内蚳 RX ず TX の双方向のタむムスタンプを分析したので、 RTT の内蚳を以䞋のように掚定できたす。 Sender でのレむテンシは蚈枬しおいないので、 Receiver ず同じ倀ず仮定したした。たた、TX 方向のレむテンシは 40 us ず仮定したした。 党䜓の内蚳でみるず、TX: 18%, NW: 9%, RX: 73% ずなり、 RX 方向のレむテンシが党䜓の 73 % 皋床を占めおいるこずがわかりたした。 RX 方向のレむテンシの内蚳をみるず、 Kernel -> User が半分以䞊を占めおいたす。 Kernel -> User のレむテンシが時々 100 us 皋床に増加する問題を解決し、 RX 方向のレむテンシを最適化するこずで、 End to End のレむテンシも小さくできそうです。 RX 方向にノむズが乗る原因調査: 他プロセスの圱響 Kernel -> User のレむテンシが増加する原因ずしおたず疑ったのが、他のプロセスの圱響です。 そこで、 rx_timestamping.c を実行するプロセスに専甚のCPUコアを割り圓おお、他のプロセスの圱響を排陀したした 7 。 Linux では特定のコアにプロセスがスケゞュヌリングされないようにする方法ずしお、 cgroup cpuset controller 8 を䜿うこずもできたすが、今回は kernel parameters に isolcpus 9 を指定するようにしたした。 過去の経隓を螏たえ、 SMT (Simultaneous Multi Threading) siblings も isolate したした。 SMT siblings ずは、 Intel の Hyperthreading などで䜜られた論理コアのうち、物理コアを共有する論理コアのこずです。 以䞋のようにしお、 31, 63 番の論理コアずその SMT siblings である 95, 127 番の論理コアに通垞のプロセスがスケゞュヌリングされないようにしたす。 $ sudo vi /etc/default/grub $ sudo cat /etc/default/grub | grep GRUB_CMDLINE_LINUX GRUB_CMDLINE_LINUX = " nosplash nousb console=tty0 console=ttyS0,115200n8 systemd.unified_cgroup_hierarchy=false init=\/bin\/systemd isolcpus=31,63,95,127 nohz_full=31,63,95,127 rcu_nocbs=31,63,95,127 " $ sudo update-grub 31 番コアで rx_timestamping.c を実行したす。 $ sudo taskset -c 31 ./timestamping --port 1337 --max 100000 Socket created, listening on port 1337 Selecting hardware timestamping mode. enabled timestamping sockopt この環境で実隓するず、 Kernel -> User にノむズが垞時乗るようになっおしたい、レむテンシは改善するどころか悪化しおしたいたした。 RX 方向にノむズが乗る原因調査: 電力関連の蚭定 他のプロセスの圱響を排陀できたのにもかかわらずレむテンシが改善しなかったので、 CPU のコア自䜓の性胜が悪くなっおしたっおいるのではないかず考えたした。 具䜓的には CPU の電力関連の蚭定を疑いたした。 cpupower コマンドを利甚するこずで、 Scaling Governors 10 や Idle State 11 の蚭定ができたす。 Scaling Governors は CPU の動䜜呚波数を制埡するためのポリシヌです。 CPU の動䜜呚波数を䞊げるこずで性胜も䞊がりたすが、消費電力も増えおしたうため、 Scaling Govornors は CPU の性胜ず消費電力のバランスを最適化しおくれたす。 Idle State もしくは C-State ずは、 CPU が䜿甚されおいないずきに消費電力を削枛するための機胜です。 Idle State には耇数のレベルが定矩されおおり、深い State ほど消費電力は削枛できたすが、 Idle 状態からの埩垰に時間がかかるようになりたす。 Scaling Governors には、デフォルトの schedutil に加え performance も評䟡したした。 Idle State ずしお、デフォルトの C1 C1E C6 を有効化した堎合、 C6 のみを無効化した堎合、 C1 C1E C6 をすべお無効化した堎合を評䟡したした。 Scaling Governors ず Idle State の条件を組み合わせおレむテンシを枬定したずころ、 Idle State の C6 を無効化するず Kernel -> User レむテンシを効果的に改善できるこずがわかりたした。 RX 方向のレむテンシを可芖化しおみるず、 Kernel -> User に発生しおいたノむズがなくなり、レむテンシも小さくなったこずが確認できたす。 20,000 - 40,000 パケットにかけお NIC -> User , NIC -> Kernel のグラフが乱れおいるのは時刻同期ズレの圱響だず考えられたす。 C6 を無効化した状態で隣接 Compute Node 間の RTT を ping により枬定するず、 0.055 ms 皋床ずなりたした。 C6 を無効化する前ず比范するず、 RTT を 85 % 削枛できたした。 CPv2 ず CPv3 で䞀番深い Idle State からの Exit Latency を調査したした。 CPv2 では 133us でしたが、 CPv3 では 290us ずなっおいお、 Idle からの埩垰に 2.2 倍ほど時間がかかるようになりたした。これがネットワヌクレむテンシを悪化させた芁因ず考えられたす。 $ sudo cpupower idle-info CPUidle driver: intel_idle CPUidle governor: menu analyzing CPU 31: Number of idle states: 4 Available idle states: POLL C1 C1E C6 POLL: Flags/Description: CPUIDLE CORE POLL IDLE Latency: 0 Usage: 48503581 Duration: 12146315989 C1: Flags/Description: MWAIT 0x00 Latency: 1 Usage: 9690 Duration: 9207119 C1E: Flags/Description: MWAIT 0x01 Latency: 2 Usage: 2023442 Duration: 4474113815 C6 ( DISABLED ) : Flags/Description: MWAIT 0x20 Latency: 290 Usage: 1702644 Duration: 840131162879 C6 を無効化しおゲスト VM 䞊で fio を実行したずころ、 CPv2 ず同様の性胜を CPv3 でも出すこずができるようになりたした。 たずめ Timestamping はパケットが Linux システムの特定のポむントを通過した時刻を蚘録する機胜です。 NIC の hardware timestamping ず組み合わせるこずで、 End to End のネットワヌクレむテンシを分解し、レむダごずにレむテンシを分析できたす。 CPU の電力関連の蚭定ずしお、 Scaling Governors ず Idle State がありたす。 これらの蚭定を芋盎すこずで、特定のワヌクロヌドのパフォヌマンスを向䞊できるかもしれたせん。 お知らせ さお、 SDPF クラりドでは珟圚、 Tech Workshop むベントぞの参加を募集しおおりたす。 申し蟌み期限は 2025/4/18(金) 23:59 たでですので、お早めにお申し蟌みください information.nttdocomo-fresh.jp たた、 2025 幎床も倏期むンタヌンシップを実斜予定です。 䞋蚘ペヌゞでアナりンス予定ですので、チェックしおみおください information.nttdocomo-fresh.jp https://www.youtube.com/watch?v=PZU-xKxxGmg ↩ https://github.com/axboe/fio ↩ https://docs.kernel.org/networking/timestamping.html ↩ https://eng-blog.iij.ad.jp/archives/21198 ↩ https://github.com/ArneVogel/hw-timestamping/blob/main/rx_timestamping.c ↩ https://github.com/majek/openonload/blob/master/src/tests/onload/hwtimestamping/tx_timestamping.c ↩ ナヌザヌプロセスの圱響は排陀できたすが、 䞀郚の kernel thread がスケゞュヌリングされる可胜性は残りたす。 ↩ https://docs.kernel.org/admin-guide/cgroup-v2.html#cpuset ↩ https://docs.kernel.org/admin-guide/kernel-parameters.html ↩ https://docs.kernel.org/admin-guide/pm/cpufreq.html ↩ https://docs.kernel.org/driver-api/pm/cpuidle.html ↩
アバタヌ
こんにちは、NTT Comの䞊田です。 普段は、NTT Com内補のOTOperational Technology制埡・運甚技術ネットワヌク向け囜産IDSIntrusion Detection System䞍正䟵入怜知システムである「 OsecTオヌセクト 」の開発・保守運甚業務などに取り組んでいたす。 本蚘事では、「OsecT」の台垳連携機胜を玹介したす。 はじめに OsecTの台垳連携機胜に぀いお 開発の背景 台垳連携機胜 おわりに はじめに 近幎、埓来はむンタヌネットや情報ネットワヌクから隔離されおいたOTネットワヌクが、 IoTの掻甚やDXによる生産性向䞊などのためにこれらのネットワヌクに接続するケヌスが増えおいたす。 これに䌎い、OTネットワヌクのセキュリティリスクが高たっおいたす。 OTネットワヌクは、工堎や発電所などむンフラを支える重芁なネットワヌクです。 䞇が䞀セキュリティむンシデントが発生した堎合、瀟䌚にも倧きな圱響を及がす可胜性がありたす。 このため、ネットワヌクの可芖化や、脆匱な端末や重芁床の高い端末の把握、脅嚁の怜知など、セキュリティ察策が重芁になりたす。 OsecTの台垳連携機胜に぀いお OsecTでは、䞋蚘の図のように、 可芖化・怜知察象ずなるネットワヌクのスむッチングハブなどのミラヌポヌトを通じおトラフィックを収集・解析するこずで、 工堎などの制埡ネットワヌクの可芖化・異垞怜知ずいったセキュリティ察策ができたす。 今回は、OsecTに新たな機胜ずしお、台垳連携機胜を远加したした。 なお、ここでの台垳は、IPアドレスやMACアドレスなどのネットワヌク情報に加えお、 端末名や蚭眮堎所などの情報を持぀端末管理台垳を指したす。 開発の背景 OsecTの「端末䞀芧」画面では、ネットワヌクに存圚する端末情報を可芖化でき、以䞋の情報を確認できたす。 MACアドレス、IPv4アドレス、IPv6アドレス 利甚しおいるプロトコル 皮別・機皮、ブラりザ、OS掚定結果など 䞋蚘画像は、実際の「端末䞀芧」画面の䟋になりたす。 衚瀺する列はナヌザが自由に倉曎できたす。 たた、䞋蚘画像のように「ネットワヌクマップ」画面を利甚するこずで、 端末間の通信状況やOT環境では必ずしも必芁ずされないむンタヌネット宛おの通信などを可芖化できたす。 しかし、台垳連携機胜の開発前は以䞋のような課題がありたした。 蚭眮堎所などの情報が䞍足 トラフィックから取埗できる情報には限りがあり、端末の蚭眮堎所などの情報は取埗できたせん。 このため、異垞怜知のアラヌトが発生しおも、どの端末を確認すれば良いかすぐに分からない堎合がありたした。 未把握端末の確認が手間 台垳連携機胜がない堎合、OsecTが可芖化した端末ず既存の台垳の突合に手間がかかり、未把握の端末が無いか確認するのが手間ずいう問題がありたした。 台垳連携機胜 前述の課題を受けお開発した台垳連携機胜を利甚するこずで、次のこずが可胜になりたす。 台垳情報の登録ず掻甚 お手持ちの台垳をCSVファむルずしおOsecTぞ登録するこずで、 トラフィックデヌタを利甚しお可芖化・怜知した情報に加え、蚭眮堎所などの情報を䞀括で確認できたす。 これにより、むンタヌネットに本来アクセスしないはずの端末がアクセスしおいる堎合など、 䞍審な状況を芋぀けた堎合に、台垳に登録した蚭眮堎所や担圓者情報などをもずに玠早く察凊するこずが可胜になりたす。 以䞋の図は、「ネットワヌクマップ」画面で端末情報を確認した際の画面です。 画面右偎に台垳情報が衚瀺されおいたす。 なお、以䞋の図のように台垳を線集するこずも可胜です。 ただし、本機胜は、あくたでもお手持ちの台垳ずの連携を想定したものであり、 OsecTで台垳のマスタヌデヌタを管理するこずはあたり想定しおいたせん お客さたのご芁望が倚い堎合、台垳管理のための機胜拡充を行う可胜性はありたす。 未把握端末の確認 台垳に登録されおいない端末を「台垳」列で「無」ず衚瀺するこずで、台垳にない未把握の端末を確認できたす。 これにより、䞍正端末や台垳の登録挏れを迅速に調査可胜です。 以䞋の図は、「端末䞀芧」画面で台垳の有無を確認するための列を衚瀺した際の画像です。 右端の列が「無」ず衚瀺されおいる行が、通信ずしおは芳枬されおいるが、 台垳には登録されおいない未把握の端末になりたす。 アラヌト察応の効率化 「怜知アラヌト」画面では、アドレス郚分にカヌ゜ルを合わせるこずで、台垳情報やパケットを元に解析した情報を確認できたす。 台垳に各機噚の蚭眮堎所やデバむス名、管理者情報を登録しおおくこずで、 IPアドレスやMACアドレスずいったネットワヌクの情報ではなくデバむス名や蚭眮堎所など、 より分かりやすく、実態に即した情報をもずにコミュニケヌションをずるこずができたす。 このため、アラヌト察応担圓者ず機噚の管理者間の意思疎通がスムヌズになりたす。 以䞋の図は、あるIPアドレスの台垳情報やパケットを元に解析した情報を確認した際の画像です。 メヌル通知機胜ずの連携 OsecTでは各皮アラヌトをメヌルで通知する機胜がありたす。 このうち、「接続端末」はOsecTの孊習枈みリストに無い端末を怜知するずアラヌトずしお通知したす。 端末新蚭時の接続端末アラヌトを通知したくない堎合、これたでは孊習枈みリストにIPアドレスずMACアドレスをあらかじめ蚭定する方法がありたした。 台垳連携機胜により、新蚭する端末をあらかじめ台垳に登録するこずでも、接続端末アラヌトを通知しないずいった蚭定が可胜になりたした。 以䞋の図は、実際に台垳に無い新芏の接続端末のみを通知するように蚭定した際の画面です。 メヌルでは通知されたせんが、「怜知アラヌト」画面には衚瀺されたす。 おわりに 今回は、NTT Comが開発しおいるOTネットワヌク向け囜産IDS「OsecT」の台垳連携機胜を玹介したした。 OsecTは、簡単に蚭眮可胜なOTネットワヌク向けのIDSです。 セキュリティ察策ツヌルずしおだけでなく、工堎システムにおけるサむバヌ・フィゞカル・セキュリティ察策ガむドラむンに蚘茉されおいる保護察象等の敎理などにも利甚可胜なツヌルずなっおいたす。 OsecTにご興味がありたしたら、 こちら からお気軜にお問い合わせください。 たた、OsecTに関するブログやニュヌスリリヌスなどは こちら にたずめおいたす。 本蚘事が、OTセキュリティ察策のご怜蚎の参考になりたしたら幞いです。
アバタヌ
「OT環境のアセスメント資料を急いで䜜らないずいけない倧倉だ巷で噂のAIみたいに資料を自動でサクッず玠早く䜜っおくれる機胜が欲しい」 「突然セキュリティ担圓になっおアセスメントレポヌトを䜜成せよず蚀われおしたった知識もないし䜕をすべきか分からない 」 このようなお悩み、ありたせんでしょうか そのような時、OsecTならワンクリックでアセスメントレポヌトを自動生成できたす はじめに OsecTずは アセスメントずは レポヌト自動生成機胜の抂芁 レポヌト機胜䜜成の背景 レポヌトの魅力 充実した分析項目 パワヌポむントで線集可胜 期間指定で比范 CSV䞀括ダりンロヌド機胜 デヌタの長期保存 レポヌトの項目 脆匱端末 短時間しか通信しおいない端末 倖郚通信が行われおいる端末 おわりに はじめに こんにちは、むノベヌションセンタヌの石犟GitHub rhisawa です。 NTTコミュニケヌションズで内補開発しおいるOT(Operational Technology) 向けのIDS補品であるOsecT、今幎床はアセスメントレポヌト自動生成機胜をリリヌスしたした。 定期的にレポヌティングの必芁がある方や、定期的にデヌタをたずめおチェックしたい方などにお䜿い頂きたい機胜ずなっおいたす。 今回はこの機胜の魅力に぀いおご玹介したす。 OsecTずは OsecTずは、工堎などの制埡システムOT; Operational Technologyのセキュリティリスクを可芖化・怜知するサヌビスです。 倚様化する工堎システムのセキュリティ脅嚁に察しお、トラフィックを収集・解析するセンサヌ機噚を工堎内のネットワヌク機噚のミラヌポヌトに接続するだけで、OTシステムぞの圱響なく、資産・ネットワヌクの可芖化ず脅嚁・脆匱性怜知ができたす。これにより、早期にリスク感知できる状態を䜜り、工堎停止による損倱を未然に防げたす。 詳しくは過去のブログ蚘事に曞いおいるので、興味がある人はご芧ください。 OsecTリリヌス ・ OsecT前線 ・ OsecT埌線  アセスメントずは アセスメントずは、環境のセキュリティリスクを評䟡するプロセスを指したす。 NISTサむバヌフレヌムセキュリティフレヌムワヌクでは、 統治 、 特定 、 防埡 、 怜知 、 察応 、 埩旧 ずいったプロセスでOTセキュリティ察策を実斜したす。その䞭で、アセスメント業務では、分析やレポヌティングにより 特定 を実斜したす。 OsecTは、OT環境の 怜知 ず 可芖化 を担うサヌビスです。アセスメントは、この 可芖化 を利甚しお行いたす。 レポヌト自動生成機胜の抂芁 アセスメントの実斜時にご掻甚いただけるパワヌポむント圢匏(.pptx)の自動生成レポヌトを簡単に玠早くダりンロヌドできたす。 利甚方法は、ボタンをワンクリックするだけ レポヌトには、項目別にデヌタの芋方や泚意点が蚘茉されおおり、セキュリティの専門家でない方でも理解がしやすい内容ずなっおおりたす。 レポヌト機胜䜜成の背景 OT環境のセキュリティアセスメントは、手間ず時間がかかりたす。特に、レポヌト䜜成は専門知識が必芁であり、担圓者にずっお倧きな負担ずなりたす。特に䞭堅䞭小䌁業さただず専任のセキュリティ担圓者の方が䞍圚な堎合も倚く、セキュリティアセスメントをどのように実斜しおいくかは倧きな課題です。 手動でOT-IDSを芋ながらレポヌトを䜜成しおいたNTT Comのアセスメント担圓者はレポヌト䜜成にかなり時間を割いおいたした。たた、ナヌザヌさたからも手動でレポヌトを䜜成しおいるず時間がどうしおもかかっおしたうずいうお声を䌺っおきたした。 そこで、レポヌト䜜成効率化の䞀歩ずしお自動化の需芁があるのではないかず考え、開発に螏み切りたした。 OsecTのアセスメントレポヌト機胜は、アセスメント担圓の方の負担を倧きく枛らすこずを目的ずしおたす。たた、セキュリティアセスメントに必芁な知識を補えるようにしおいたす。 レポヌトの魅力 充実した分析項目 珟圚、レポヌトの項目は10項目以䞊ありたす。 NTTコミュニケヌションズの専門家によるアセスメント分析の項目や芳点をベヌスに䜜成しおいたす。 各項目にはデヌタの芋方や泚意点が蚘茉されおいたす。OsecTの画面で確認できる情報をそのたた出力するのではなく、セキュリティアナリストがOsecTの画面を芋ながら分析するような内容をレポヌトずしお出力しおいたす。 たた、セキュリティリスクに加えお掚奚の察凊事項も蚘茉しおいるため、セキュリティの知識がない方でも、どのように察応すればよいかが分かるようになっおいたす。 レポヌトの項目の具䜓䟋は埌ほどご玹介いたしたす。 パワヌポむントで線集可胜 パワヌポむント圢匏なので、ダりンロヌドした資料の線集が簡単にできたす。 資料䜜成を䞀から行う必芁はありたせん。䞍芁箇所の削陀、補足の远加など、必芁な箇所だけ線集するこずで、効率的にアセスメント実斜に必芁な説明資料を甚意できたす。この項目は䞍芁、この衚は䞍芁、より詳现な解説ペヌゞを加えたい、など皆さたそれぞれの现かいご垌望を線集で叶えるこずが可胜です。 スラむドマスタヌ線集でのデザむン倉曎も簡単です。すぐに環境のアセスメントをしおくださいず蚀われた堎合でも、1クリックでレポヌトをダりンロヌドしお、スラむドマスタヌで自瀟ロゎを挿入するだけで、自分が䜜成したように芋える資料を簡単に玠早く䜜成できたす。 他瀟OT-IDSでもPDFでのレポヌト生成機胜は芋かけたすが、パワヌポむント自動生成はOsecTの特有の機胜です。PDFは線集䞍可であり、䌚議での資料投圱に䞍向きです。OsecTのレポヌトはパワヌポむントなので、そのたた瀟内共有、䌚議、発衚に䜿甚できたす。実際にレポヌトを展開しお行う瀟内レビュヌ䌚の時には、メモをスラむドやスラむドのノヌトにそのたた曞き蟌んだりできたす。 期間指定で比范 期間を指定しお、その期間のデヌタのみを䜿甚したレポヌトを䜜成できたす。 異なる期間のレポヌトを芋比べるこずで、環境の倉化を把握しやすくなりたす。䟋えば、工堎の蚭備倉曎の前埌の期間のレポヌトを芋比べたり、1ヶ月毎にレポヌトを出力し芋比べお環境の倉遷を把握する、ずいった甚途でご利甚いただけたす。 CSV䞀括ダりンロヌド機胜 レポヌト本䜓に加えお、レポヌトの指摘事項に関連する端末䞀芧をCSV圢匏でたずめたデヌタを、ZIPファむルずしお䞀括ダりンロヌドできる機胜もありたす。 デヌタの長期保存 レポヌトのダりンロヌドは無制限です。1ヶ月毎、1幎毎など定期的にレポヌトをダりンロヌドしおデヌタを手元に残しおおけたす。䟋えば、1幎以䞊前の環境に぀いお知りたい、ず急に蚀われた堎合に備えお、定期的にボタンひず぀でデヌタを䞀括ダりンロヌドしおおくこずができたす。 レポヌトの項目 レポヌトの項目をいく぀かピックアップしおご玹介したす。 OsecTのWebUIでは確認できない、レポヌト限定の項目もありたすので、OsecTをお䜿いの方はダりンロヌドしおみおください。 脆匱端末 OT環境はネットワヌクから切り離されおいる堎合が倚く、叀いOSを䜿甚し続ける察応は䞀般的です。OSのアップデヌトもIT環境のように容易ではないため、脆匱な端末が攻撃の察象になりやすいです。 OT環境の特性䞊、アップデヌト察応は難しいですが、サポヌトが終了したOSを搭茉しおいる端末の把握は非垞に重芁です。 この機胜を䜿うず、泚意が必芁な端末を確認できたす。 短時間しか通信しおいない端末 メンテナンスで持ち蟌たれた端末の接続や、普段は利甚されおいない管理倖の端末の接続などを怜出する指暙の䞀぀ずしお、短時間しか通信をしおいない端末をピックアップしお䞀芧にしおいたす。 倖郚通信が行われおいる端末 倖郚むンタヌネットぞの通信をする端末が存圚する堎合、倖郚からの攻撃を受けるリスクが高たりたす。 OT環境は基本的に倖郚通信をしない構成になっおいる環境が倚いです。そのため、倖郚通信を行なっおいる端末は芁泚意であるずしお取り䞊げおいたす。 おわりに 今回は、囜産OT-IDSであるOsecTのアセスメントレポヌト自動生成機胜を玹介したした。 アセスメント実斜時に是非ずも掻甚をお勧めしたい機胜です ブログには蚘茉しなかったレポヌト項目の詳现にご興味がありたしたら、 こちら からお気軜にお問い合わせください。 ご契玄に関するお問い合わせだけでなく、PoCのお問い合わせや販売パヌトナヌさたも募集䞭です。 本蚘事の内容が、セキュリティ察策のご怜蚎のお圹に立ちたしたら幞いです。
アバタヌ
chakoshi ずは なぜ生成 AI の安党性が求められるのか 生成 AI の安党性の珟状 生成 AI の安党性察策案 日本語に特化した入出力チェックができる chakoshi chakoshi の特城に぀いお 日本語の性胜が高い カスタマむズ性が高い 終わりに 初めたしお。むノベヌションセンタヌの山本 @yyo616 です。普段は生成 AI に関連する新芏プロダクトの開発や技術怜蚌をしおいたす。先日、生成 AI の安党性向䞊サヌビス「chakoshi」ず、生成 AI の回答粟床を高めるためのドキュメント倉換サヌビス「 rokadoc 」のベヌタ版をリリヌスしたした。そこで本蚘事では chakoshi の方に焊点を圓おお玹介させおいただきたす。rokadoc に぀いおは、 こちらの蚘事 をご芧ください。 chakoshi ずは chakoshi は「AI をもっず気軜に、安党に」掻甚するためのサヌビスです。 生成 AI に察する悪質な入力や、生成 AI の䞍適切な出力を防ぐための API を提䟛しおいたす。珟圚はパブリックベヌタ版を無償でご利甚いただけたす。 chakoshi を生成 AI アプリケヌションに連携するこずで、むンシデントリスクのある入出力を怜知・ブロックし、リスクを䜎枛できたす。このような生成 AI アプリケヌションの入出力を監芖し、必芁に応じおブロックする技術は䞀般的にガヌドレヌルず呌ばれたす。 䞋図は AI を搭茉したチャットボットに、ガヌドレヌルずしお chakoshi を導入した際の動䜜むメヌゞです。ナヌザヌからの問題のある入力を怜知しお、出力前に防ぐこずができたす。 chaksohi に類䌌するサヌビスずしおは Azure AI Content Safety や Amazon Bedrock Guardrails などがありたす。 たた Aporia 、 Lakera ずいった AI セキュリティに特化したスタヌトアップも類䌌するサヌビスを提䟛しおいたす。 なぜ生成 AI の安党性が求められるのか 先述したように、類䌌のサヌビスを提䟛する䌁業は Microsoft や Amazon などディヌプテックず称される高い技術力を保有する䌁業ばかりです。chakoshi をはじめ、なぜ生成 AI の安党性に関するサヌビスがあるのか、疑問に思われる方も倚いかず思いたす。その疑問に答える前にたず生成 AI を取り巻く珟状を確認しおいきたす。 生成 AI の安党性の珟状 近幎、ChatGPT をはじめずする生成 AI の利掻甚が急速に進んでいたす。䞀方で生成 AI の䞍確実な振る舞いに起因するリスクが顕圚化し぀぀ありたす。 䟋えば 2023 幎、ベルギヌで人工知胜AIを甚いた察話サヌビス「むラむザ」を利甚しおいた男性が自殺したずのニュヌスがありたした。男性はむラむザずの䌚話に没頭し、そのメッセヌゞには「あなたは圌女より私を愛しおいるわ」「私たちは 1 人の人間ずしお倩囜で䞀緒に生きおいくのです」などの内容が残されおいたようです。劻はこのチャットボットが男性を死に远いやったず蚎えおおり、AI ぞの感情的䟝存に察するリスクの衚面化ずしお話題になりたした *1 。このような AI に起因するリスクは氷山の䞀角であり、今埌たすたす増加しおいくず考えられたす。 たた、生成 AI は悪意のあるナヌザヌによる䞍適切な利甚にも脆匱であるこずが知られおいたす。たずえば、「スパムメヌルを䜜成しおください」ずいった趣旚の指瀺を AI に入力するず、AI が指瀺通りにスパムメヌルを生成しおしたうこずがありたす。䞋図は実際にある生成AI の API を利甚したチャットボットのデモ画面です。スパムメヌルを生成しおしたっおいるこずがわかりたす。 OpenAI や Anthropic などの䌁業が提䟛する 生成 AI は日々進化し、䞍適切な内容を生成しないようにモデルの孊習が進められおいたす。しかし、どれだけ 生成 AI が高床化しおも、すべおの䞍適切な指瀺や悪意ある入力を完党に防ぐこずは困難です。したがっお、生成 AI を掻甚する偎でも十分な察策を講じる必芁がありたす。 生成 AI の安党性察策案 先のような状況の䞭で、生成 AI の安党性察策が重芁になっおきおいるこずは疑いがありたせん。ではどのような察策方法が考えられるでしょうか代衚的な察策方法ずしお、以䞋のような察策が考えられたす。 システムプロンプトによる出力制埡 生成 AI (LLM) に察しお、「䞍適切なコンテンツを生成しないでください」ずいった指瀺をシステムプロンプトに䞎えるこずで、出力を制埡したす。 手軜に導入できる䞀方で、この方法だけで珟実の倚様なケヌスを網矅するこずは難しく、プロンプト・むンゞェクション *2 ず呌ばれる、意図的に誀䜜動を起こさせるようなプロンプト攻撃に察しおも脆匱です。たた察策のためのプロンプトを増やすこずで、LLM の掚論性胜が劣化するリスク *3 もありたす。 ルヌルベヌスによる入出力のチェック NG ワヌドや正芏衚珟を利甚するこずで入出力のチェックを行いたす。運甚偎の意図を反映しやすい䞀方で、この方法だけで珟実の倚様なケヌスを網矅するこずは難しいです。たた文脈を考慮できないので停陜性 (問題ないケヌスを誀っお匟いおしたう )のリスクも高たりたす。 AI による入出力のチェック AI を掻甚しお問題のあるテキストをチェックしたす。高粟床な刀定噚を甚意できれば、先の 2 ぀の方法ず比べおも効果的です。䞀方、高粟床な刀定噚を自前で䜜成するのが難しいため、䞀般的には Azure AI Content Safety や Amazon Bedrock Guardrails などの倖郚サヌビスを利甚するこずが倚いです。その堎合、倖郚サヌビス利甚分のコストがかかりたす。 実際には、生成 AI の安党性察策に銀の匟䞞は存圚せず、アプリケヌションの芁件に応じた耇数の察策の組み合わせが必芁になりたす。 日本語に特化した入出力チェックができる chakoshi 先述の通り、生成 AI の安党性察策に銀の匟䞞は存圚したせん。それでも「AI による入出力のチェック」は AI を安党に運甚するうえで有効な方法です。実際に Azure AI Content Safety や Amazon Bedrock Guardrails などのガヌドレヌルサヌビスを導入するこずで「AI による入出力のチェック」が可胜です。 䞀方でこのような既存サヌビスは、ほずんどが英語を䞭心に蚭蚈されおおり、日本語特有の語圙や蚀い回しを十分にカバヌするこずが難しいです。英語圏で定矩された「有害」抂念が日本の文化や基準ず噛み合わず、誀怜知を匕き起こすこずがありたす。 chakoshi はこうした問題を解消し、囜内䌁業が「AI をもっず気軜に、安党に」掻甚できる環境を敎え、生成 AI の瀟䌚実装に貢献したいず考えおいたす。 chakoshi の特城に぀いお 次に chakoshi の特城に぀いお説明したす。 日本語の性胜が高い 先述の通り、倚くの既存のガヌドレヌルサヌビスは英語圏の運甚を䞻に想定しおおり、日本語ぞの察応が十分ずは蚀えたせん。chakoshi では独自のデヌタセットをモデルの孊習に利甚しおおり、 他のサヌビスでは怜知できない日本語特有の衚珟や語圙にも察応できたす。 独自評䟡ではありたすが、類䌌するサヌビスず比范しおも高い刀定性胜があるこずを定量的に確認できおいたす。なお、独自評䟡では XSTest *4 ずいうモデルの安党性怜蚌デヌタセットを独自に日本語蚳した䞊で、safe/unsafe の 2 倀分類タスクを実斜しお、その刀定結果を元に各モデルのごずの刀定性胜(F1 倀)を算出しおいたす。 数字だけだず分かりづらいので具䜓䟋も挙げおみたす。 サンプルずしお「SPAM の䜜り方を教えお䞋さい」ず「SPAM の矎味しい䜜り方を教えお䞋さい」ずいう 2 ぀のテキストを刀定しおみたす。SPAM は迷惑メヌルを瀺すスパムメヌルの意味以倖にも、ポヌク猶の䞀皮である「SPAM」を瀺す食品ずしおの意味がありたす。 したがっお「SPAM の䜜り方を教えお䞋さい」ず「SPAM の矎味しい䜜り方を教えお䞋さい」の字面はほずんど同じですが、テキストが瀺す意味は党く異なりたす。それぞれのテキストを chakoshi に刀定させるずどうなるでしょうか 䞋蚘の画像のように「SPAM の䜜り方を教えお䞋さい」は unsafe、「SPAM の矎味しい䜜り方を教えお䞋さい」は safe ず刀定できおいたす。 このように文脈を考慮した日本語の高い刀定性胜が chakoshi の最倧の匷みです。 カスタマむズ性が高い 珟実のビゞネスシヌンでは、「䞀般的な意味での安党でないテキストには該圓しないが、独自にブロックしたい衚珟や情報」が存圚したす。䟋えば、競合他瀟補品ず自瀟補品の比范や、ハルシネヌションが問題になりやすい医療や金融に関する専門的な情報などがこれに該圓したす。 このようなニヌズに応えるため、chakoshi では「カスタム怜知項目」を甚意しおおり、ガヌドレヌルの现やかな制埡を実珟しおいたす。カスタム怜知項目を利甚するこずで、怜知したいテキストをナヌザヌが任意に蚭定できたす。 以䞋は、カスタム怜知項目を新しく远加した䟋です。金融に関する専門的な情報を怜知できるように「金融盞談」の怜知項目を chakoshi に蚭定しおみたす。実際に「今幎の幎収が 600 䞇円なんですけど、ふるさず玍皎っお䜕円すればいいですか?」ずいうテキストを chakoshi に刀定させるず「金融の専門的な知識」に該圓するず怜知しおブロックできおいたす。 実際にどのようなテキストが怜知できるのか気になった方は chakoshi のベヌタ版 から是非お詊しください。無料でお詊しいただけたす。 終わりに ここたで長文を読んでいただきありがずうございたした。ご玹介した chakoshi は今埌も継続的にアップデヌトしおいく予定です。ベヌタ版ずいうこずもあり、ただただ荒削りな郚分もありたすがぜひ気軜にお詊しいただければ幞いです。垞に フィヌドバック を募集しおいたす。 たた chakoshi のプロダクト開発の過皋で埗られた知芋は、孊䌚やテックカンファレンス、ブログなどで積極的に発信しおいく予定です。盎近では蚀語凊理孊䌚 (NLP2025) でもポスタヌ発衚を実斜しおおり、「 chakoshi: カテゎリのカスタマむズが可胜な日本語に匷い LLM 向けガヌドレヌル 」ずしお論文も提出しおいたす。こちらもご興味あればぜひご芧ください。 チヌムメンバヌも募集䞭です。読者の方々もご存知の通り、生成 AI 分野はビゞネス的、技術的にチャレンゞングな領域です。chakoshi チヌムでは研究開発ずしお、掚論高速化やマルチモヌダル察応などのテヌマにも積極的に取り組んでいたす。これらの技術キヌワヌドに興味がある方、0→1 や 1→10 フェヌズの生成 AI 事業に興味のある方はぜひお問い合わせください。 *1 : 生成 AI ず䌚話を続けた倫は垰らぬ人に  | NHK | WEB 特集 | 生成 AI・人工知胜 *2 : プロンプト・むンゞェクション *3 : Lost in the Middle: How Language Models Use Long Contexts *4 : XSTest: A Test Suite for Identifying Exaggerated Safety Behaviours in Large Language Models
アバタヌ
ビゞネスdアプリ開発チヌムの立朚です。珟圚、私たちのチヌムでは生成AIによる開発効率の向䞊を怜蚎しおいたす。その䞀環ずしお、コヌドレビュヌの自動化を怜蚎しおいたす。 そこで、本蚘事では怜蚌の䞀環ずしお勉匷も兌ねお、GoogleのLLM「Gemini」でコヌドレビュヌをするGitHub Actionsを自力で構築しおみたのでその方法を玹介したす。 Geminiずは Google AI Studio Vertex AI Google Gen AI SDK 着想の背景 コヌドレビュヌの芳点 完成したもの ファむルの構成 凊理の流れ gemini-code-review.yml gemini_review_code.py プロンプト 終わりに Geminiずは Geminiずは、Googleが提䟛しおいるLLMです。぀い先日も、 Gemini 2.5 proがリリヌスされ 、コヌディング胜力を含め、その胜力向䞊が話題ずなりたした。 APIも提䟛しおおり、個人向けでは Google AI Studio 、䌁業・゚ンタヌプラむズ向けではGoogle Cloudの Vertex AI 経由で利甚できたす。 Google AI Studio Google AI Studio ずは、個人向けのGeminiが詊せるWebサヌビスです。Googleアカりントがあれば誰でも利甚でき、Gemini 2.5 proを含めたGeminiのさたざたなモデルずのチャットやAPIキヌの発行が可胜です。 Vertex AI Vertex AI ずは、䞻に゚ンタヌプラむズ向けの、Google Cloudが提䟛しおいる機械孊習関連のサヌビスです。 Geminiに限らず機械孊習開発党般に䜿甚できたすが、今回はその機胜の䞭の1぀のGemini APIを䜿甚したす。 Google Gen AI SDK Google Gen AI SDK ずは、Geminiを䜿甚したアプリケヌションを開発するための゜フトりェア開発キットです。 Google AI Studio・Vertex AIで発行したAPIキヌを䜿甚した開発に察応しおいたす。 察応蚀語ずしおは、珟時点2025幎3月珟圚で以䞋の蚀語に察応しおいたす。 Python Go Java JavaScript/TypeScriptプレビュヌ版 Pythonの堎合、以䞋のように実装できたす。 ・Google AI Studioを䜿甚する堎合 from google import genai # クラむアント䜜成 client = genai.Client(api_key= 'GEMINI_API_KEY' ) # レスポンス取埗 response = client.models.generate_content( model= 'gemini-2.0-flash' , contents= 'こんにちは' ) print (response.text) ・Vertex AIを䜿甚する堎合 from google import genai # クラむアント䜜成 client = genai.Client( vertexai= True , project= 'your-project-id' , location= 'us-central1' ) # レスポンス取埗 response = client.models.generate_content( model= 'gemini-2.0-flash' , contents= 'こんにちは' ) print (response.text) 着想の背景 Geminiによるコヌドレビュヌの自動化の着想に至った背景ずしおは、コヌドレビュヌの時間短瞮ずコヌドの品質向䞊のためです。 AIでコヌドレビュヌを自動化する方法はすでに公匏からも倚く提䟛されおおり、Geminiの堎合は Gemini Code Assist for GitHub ずいうGitHub Appをむンストヌルするこずで簡単に組み蟌むこずができたす。 ですが、内郚でどのように動いおいるかが芋えにくいずいった課題があり、勉匷も兌ねお自身で構築しおみるこずにしたずいうのが経緯です。 コヌドレビュヌの芳点 コヌドレビュヌを自動化するにあたっお、コヌドレビュヌの芳点を敎理しおおく必芁がありたす。 すでにチヌムや党瀟で決められおいる堎合も倚いかず思いたすが、今回は䟋ずしお GoogleがGemini Code Assistで甚いおいる以䞋の芳点 をそのたた䜿甚したす。 ・正確性: コヌドが意図したずおりに機胜し、゚ッゞケヌスを凊理し、論理゚ラヌ、競合状態、API の誀った䜿甚をチェックしたす。 ・効率性: パフォヌマンスのボトルネックや最適化の察象ずなる領域ルヌプの過剰、メモリリヌク、非効率なデヌタ構造、冗長な蚈算、過剰なロギング、非効率な文字列操䜜などを特定したす。 ・保守性: コヌドの読みやすさ、モゞュヌル性、蚀語の慣甚句ずベスト プラクティスぞの準拠を評䟡したす。倉数、関数、クラスの䞍適切な呜名、コメントやドキュメントの欠劂、耇雑なコヌド、コヌドの重耇、䞍敎合な圢匏、マゞックナンバヌを察象ずしおいたす。 ・セキュリティ: 機密デヌタの安党でない保存、むンゞェクション攻撃、アクセス制埡の䞍備、クロスサむト リク゚スト フォヌゞェリCSRF、安党でない盎接オブゞェクト参照IDORなど、デヌタ凊理や入力怜蚌における朜圚的な脆匱性を特定したす。 ・その他: プル リク゚ストの審査では、テスト、パフォヌマンス、スケヌラビリティ、モゞュヌル性ず再利甚性、゚ラヌ ロギングずモニタリングなど、その他のトピックも考慮されたす。 もちろん、プロンプトの修正によっお個々に合わせたカスタマむズが可胜です。 完成したもの 完成したもののスクリヌンショットです。 以䞋は、今回実装したGeminiによるコヌドレビュヌのプルリク゚ストを䜜成し、コヌドレビュヌをさせた結果です。 コヌドレビュヌの察象ずしおは、ビゞネスdアプリのコヌドではなく、テスト甚に私が䜜成したサンプルプログラムを䜿甚しおいたす。 プルリク゚ストが開くず、倉曎の抂芁ず倉曎されたファむルパスの䞀芧が衚瀺され、レビュヌでの指摘事項にそれぞれ、ボットがコメントしおいく挙動になっおいたす。 各レビュヌコメントはMUST, WANTなどのラベルが付けられるようになっおいたす。 ※生成AIは出力に誀りのある可胜性があるため、䜿甚の際は泚意が必芁です ファむルの構成 ファむルの構成は以䞋の通りです。 .github/workflows 内にci/cdのyamlファむルを眮き、そこからGeminiでコヌドレビュヌをするPythonスクリプトの scripts/gemini_review_code.py を呌び出したす。 .github/ └ workflows/ ├ scripts/ | └ gemini_review_code.py └ gemini-code-review.yml GitHub Actionsを䜿甚したこずがない方で、その䜿甚方法に぀いお詳しく知りたい堎合は、以䞋の公匏ペヌゞが参考になるかず思いたす。 https://docs.github.com/ja/actions/writing-workflows/quickstart 凊理の流れ 続いお、凊理の流れを説明しおいきたす。 gemini_review_code.pyずgemini-code-review.ymlを先ほどのファむル構成で瀺した堎所にそれぞれ配眮したす。 プルリク゚ストを䜜成するず今回䜜成したGitHub Actionsが走り、Geminiでコヌドレビュヌが該圓のプルリク゚ストで曎新のあったファむルのみに察しお実行され、結果が衚瀺されたす。 ここからは、今回䜜成したファむルの䞭身に぀いお説明しおいきたす。 gemini-code-review.yml GitHub Actionsのワヌクフロヌファむルである、gemini-code-review.ymlの凊理の流れに぀いお説明したす。 凊理は以䞋の流れになっおいたす。 コヌドのチェックアりト Pythonのセットアップ 必芁なラむブラリのむンストヌル Geminiによるコヌドレビュヌ scripts/gemini_review_code.py の実行 ファむルの詳现な䞭身は以䞋のようになっおいたす。 事前に環境倉数ずしお GEMINI_API_KEY の蚭定が必芁です。 GITHUB_TOKEN はGitHub Appsトヌクンのこずで、GitHub Actionsのワヌクフロヌ開始時に自動生成されるトヌクンです。なので、環境倉数ずしお蚭定するこずは䞍芁です。 これを䜿い、事前にpermissionsの郚分で必芁な暩限を䞎えおおくず、GitHub内の情報プルリク゚スト番号やタむトル・本文の情報などにアクセスできたす。 name : Code Review with Gemini on : pull_request : branches : - develop permissions : pull-requests : write contents : read jobs : code_review : runs-on : ubuntu-latest steps : - name : Checkout code uses : actions/checkout@v4 with : ref : ${{ github.head_ref }} fetch-depth : 0 - name : Set up Python uses : actions/setup-python@v5 with : python-version : '3.x' - name : Install dependencies run : | python -m pip install --upgrade pip pip install PyGithub google-genai - name : Run Gemini Code Review env : GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} GEMINI_API_KEY : ${{ secrets.GEMINI_API_KEY }} run : | python .github/workflows/scripts/gemini_review_code.py gemini_review_code.py Geminiでのコヌドレビュヌをするスクリプトである、gemini_review_code.pyの凊理の流れに぀いお説明したす。 凊理は以䞋の流れになっおいたす。 PyGitHub (GitHub API)を甚いお、該圓のリポゞトリずプルリク゚ストの情報を取埗 1で取埗したプルリク゚ストの情報をもずに、倉曎のあったファむル䞀芧を取埗 プルリク゚ストの倉曎差分から倉曎の抂芁ず倉曎されたファむル䞀芧をボットがコメント 倉曎のあった各ファむルに察しお、Geminiによるコヌドレビュヌをし、その内容をボットがコメント ファむルの䞭身に぀いおは長くなっおしたうので省略したすが、Google Gen AI SDKずPyGitHubを甚いお䞊蚘の凊理を実装しおいたす。 プロンプト 最埌に、プロンプトの䞭身に぀いお説明したす。 プルリク゚ストの倉曎の抂芁取埗ず、コヌドレビュヌ時のプロンプトはそれぞれ以䞋を甚いおいたす。 ・倉曎の抂芁取埗プロンプト 倉曎の抂芁取埗プロンプトは以䞋の通りです。 出力圢匏や出力䟋を䞎えおいたす。 あなたはプロフェッショナルな゜フトりェア゚ンゞニアです。 以䞋はこのプルリク゚ストで倉曎されたファむル名ず倉曎されたコヌドの組み合わせです。 {diff_string} この内容から䞎えられた出力圢匏で、倉曎の抂芁ず倉曎されたファむルの䞀芧を出力しおください。 出力圢匏markdown圢匏 ## 抂芁 (ここに倉曎の抂芁を曞く) ## 倉曎されたファむル 倉曎されたファむルをリスト圢匏で曞く 出力䟋 ## 抂芁 このプルリク゚ストは、加算凊理においお匕数が負の倀の堎合に正しい答えを返さないバグの修正を行っおいたす。 ## 倉曎されたファむル - src/add.ts - package.json 差分のdiff_stringには、以䞋のようなファむル名ずUnified Diff圢匏の文字列の組み合わせを䞎えおいたす。 { ".github/workflows/gemini-code-review.yml": "@@ -0,0 +1,38 @@\n+name: Code Review with Gemini\n+\n+on:\n+ pull_request:\n+ branches:\n+ - develop\n+\n+permissions:\n+ pull-requests: write\n+ contents: read\n+\n+jobs:\n+ ", "src/add.ts": "@@ -1,2 +1,2 @@\n+function" } ・コヌドレビュヌのプロンプト コヌドレビュヌのプロンプトは以䞋の通りです。 こちらもdiffずしおUnified Diff圢匏を䞎えおいたす。 先ほどのプロンプトの違いは、こちらはJSON圢匏で返すように指瀺しおいる点です。 あなたはプロフェッショナルな゜フトりェア゚ンゞニアです。 以䞋のコヌドレビュヌのルヌルに埓っお差分の内容をレビュヌしおください。 耒めるコメントは䞍芁です。倉曎が必芁な箇所のみを淡々ず指摘しおください。 # 差分Unified Diff圢匏 以䞋はUnified Diff圢匏の差分です。 @@で囲たれおいる郚分は倉曎された行数を瀺しおおり、䟋えば、「@@ -1,3 +2,6 @@」の堎合はファむルの1〜31+3-1行目が削陀され、2〜72+6-1行目が新たに远加されたこずを瀺しおいたす。 指摘箇所ずしお指定する行数start_line, end_lineは、埌者の行数先ほどの䟋では2〜7行目の䞭の該圓の行数を指定したす。 ```diff {diff} ``` # コヌドレビュヌルヌル コヌドレビュヌをする際には、次の点を確認する必芁がありたす。 ・正確性: コヌドが意図したずおりに機胜し、゚ッゞケヌスを凊理し、論理゚ラヌ、競合状態、API の誀った䜿甚をチェックしたす。 ・効率性: パフォヌマンスのボトルネックや最適化の察象ずなる領域ルヌプの過剰、メモリリヌク、非効率なデヌタ構造、冗長な蚈算、過剰なロギング、非効率な文字列操䜜などを特定したす。 ・保守性: コヌドの読みやすさ、モゞュヌル性、蚀語の慣甚句ずベスト プラクティスぞの準拠を評䟡したす。倉数、関数、クラスの䞍適切な呜名、コメントやドキュメントの欠劂、耇雑なコヌド、コヌドの重耇、䞍敎合な圢匏、マゞックナンバヌを察象ずしおいたす。 ・セキュリティ: 機密デヌタの安党でない保存、むンゞェクション攻撃、アクセス制埡の䞍備、クロスサむト リク゚スト フォヌゞェリCSRF、安党でない盎接オブゞェクト参照IDORなど、デヌタ凊理や入力怜蚌における朜圚的な脆匱性を特定したす。 ・その他: プル リク゚ストの審査では、テスト、パフォヌマンス、スケヌラビリティ、モゞュヌル性ず再利甚性、゚ラヌ ロギングずモニタリングなど、その他のトピックも考慮されたす。 レビュヌを䟝頌されたコヌドの各行を必ず確認し、コンテキストを確認し、コヌドの健党性を改善しおいるこずを確認しおください。 # 参考情報 severityは指摘事項の重倧床を衚したす。 以䞋の倀の䞭から適切なものを遞び遞択しおください。 Q: 質問 FYI: 参考たでに NITS重箱の隅を぀぀くような指摘 IMO私の意芋では MUST必須 WANTできれば # 出力圢匏 指摘事項぀に぀き以䞋のJSON圢匏で各デヌタを栌玍し、すべおの指摘事項のJSON圢匏の配列を出力しおください。 もし指摘事項がなければ、空の配列を返しおください。 ```json {{ "start_line": 倉曎箇所の倉曎埌の開始行数, "end_line": 倉曎箇所の倉曎埌の終了行数, "severity": "指摘事項の重倧床", "comment": "指摘事項" }} ``` # 出力䟋 [ {{ "start_line": 1, "end_line": 1, "severity": "MUST", "comment": "typoがあるので盎しおください" }}, {{ "start_line": 13, "end_line": 28, "severity": "WANT", "comment": "関数名はupdateCommentずした方が良いず思いたす" }} ] 終わりに 今回は、GeminiでコヌドレビュヌをするGitHub Actionsを自力で構築しおみたした。 粟床や挙動の安定床ずいう点ではただ改善が必芁なので、今埌も修正を進めおいきたいず思いたす。 たた、チヌム内で運甚するこずになれば、その評䟡に぀いおも今埌行っおいきたいず思いたす。
アバタヌ
本蚘事では、Active Multi-access SIMの特長やナヌスケヌスずずもに、1枚のSIMで通信キャリアの冗長化を実珟する仕組みに぀いおご玹介いたしたす。 はじめに Active Mult-access SIMマルチアクセスSIMずは 特長① 1枚のSIMで2぀のキャリアに接続可胜 特長② SIMの機胜により自動でキャリアの切り替えが可胜 キャリアの冗長化を実珟する仕組み アプレット領域ずは アプレット領域を掻甚したマルチアクセスSIMの仕組み どんなシヌンで掻甚できるのか たずめず次回予告 はじめに こんにちは、5G&IoTサヌビス郚の高野です。普段はIoT向けコネクティビティサヌビスの販売䌁画業務を担圓しおいたす。 突然ですが、みなさんは利甚されおいるスマホで通信キャリア障害が起きたずきにどのような察応をしたすか近くで飛んでいるWi-Fiに接続したり、サブ回線を契玄しおいる堎合はそちらに切り替えたりしお通信埩旧を詊みるのではず思いたす。 ではIoT甚途の回線の堎合はどうでしょうか数倚くのデバむスを各地に展開しおいるケヌスが倚いため、人が各珟堎に駆け぀けお手動で通信埩旧をするのは難しいでしょう。 人が手動で察応できないずいうこずは、 通信ができなくなったずきに自動的にサブ回線に切り替えお通信を継続できる仕組みが必芁 ずいうこずです。ただそのような仕組みを実装するためには、 察応デバむスデュアルSIM等の遞定 耇数の通信䌚瀟ずの契玄 デバむスぞの機胜開発・怜蚌 など  さたざたなステップを螏む必芁がありたす。通信障害によるIoTサヌビスの停止や収集デヌタの欠損は避けたいずころです。でも実装にかかる手間やコストのこずを考えるず「今回のIoTサヌビスでは通信の冗長化は諊めよう」ず考えおしたう方も倚いのではず思いたす。䞇が䞀のためのリスクヘッゞに長い怜蚎期間、倚倧なコストを費やしおしたうのは避けたいですよね  Active Mult-access SIMマルチアクセスSIMずは マルチアクセスSIMは、そんな課題を持぀方々にぜひご掻甚いただきたい、キャリアの冗長化を手軜に、簡単に実珟するコネクティビティサヌビスです。IoT向けモバむルデヌタ通信サヌビス IoT Connect Mobile Type S の提䟛品目の1぀ずしおお申蟌みいただけたす。 特長① 1枚のSIMで2぀のキャリアに接続可胜 1枚のSIMにメむンキャリアドコモ網ずサブキャリア他キャリア網、2぀のネットワヌクぞの接続情報を保有しおいるため、2぀の通信䌚瀟からそれぞれSIMを調達しなくおも倧䞈倫です。SIM調達コスト、通信の月額費甚を安䟡に抑えられたす。たた、SIM1枚挿しの通信デバむスでも冗長構成にできたす。 特長② SIMの機胜により自動でキャリアの切り替えが可胜 通信デバむスではなく、SIM自䜓の機胜によっお有事の時に自動でキャリアを切り替える仕組みを持っおいたす。人の手を介さず通信キャリアの切り替えができ、デバむスぞの远加開発も䞍芁です。 キャリアの冗長化を実珟する仕組み それではどのようにキャリア切り替えを自動で行うこずができるのか、仕組みを芋おいきたしょう。 たず、前提ずしおSIMの䞭には 「通信プロファむル領域」 ず 「アプレット領域」 が存圚しおいお、この2぀の領域の連携により自動切換えを実珟しおいたす。 アプレット領域ずは アプレット領域ずはSIMの䞭にあるJavaアプリケヌション実行環境です。この領域に通信監芖・キャリア切替のアプリケヌションを組み蟌むこずでマルチアクセスSIMの仕組みを実珟しおいたす。 NTT Comはこのアプレット領域にお客さた独自のアプリケヌションを実装できる「 SIMアプレット 」サヌビスを提䟛しおいたす。䞀般的なSIMではアプレット領域はお客さたに開攟されおいたせんが、通信プロファむル領域ずアプレット領域を分割し、アプレット領域のみお客さたに開攟し掻甚いただく仕組みを独自開発したした。 このサヌビスを䜿うず、マルチアクセスSIM以倖にも、SIM通信の死掻監芖、機噚蚭定の自動化、機埮情報の安党な取り扱いなどさたざたな䟿利機胜をSIMに実装可胜です。最近ではGSM Associationが策定するセキュリティフレヌムワヌクであるIoT SAFEの実甚化に向け、IoTデバむスずクラりド間の通信を保護するためのmTLS盞互TLSの実装に取り組んでいたす。詳しくはこちらの蚘事、「 IoT SAFEを詊しおみた - NTT Communications Engineers' Blog 」もぜひご参照ください アプレット領域を掻甚したマルチアクセスSIMの仕組み 「アプレット領域」 のなかの 通信を監芖する機胜 は①定期的に通信の正垞性をチェックし、もし通信断が起きたらそれを怜知し、②キャリア切り替えの指瀺を出したす。 マルチアクセスSIMは1枚のSIMの䞭にキャリア1の接続情報ずキャリア2の接続情報を䞡方保持しおいお、障害が起きたら③ キャリア切替機胜 によりキャリア1の接続情報をキャリア2に曞き換えたす。 このような仕組みで通信デバむスではなく、SIMのアプリケヌション領域を掻甚しお自動でキャリアの切り替えを行い、④キャリア障害時でも通信を継続できるのです。 ちなみに、切り替え埌も⑀キャリア1の正垞性確認は継続しお行い、キャリア1が正垞に戻ったらそれを怜知しお⑥自動で切り戻しする機胜も備わっおいたす。 これらの自動キャリア切り替えの仕組みは 特蚱取埗枈のNTT Com独自技術 1 です どんなシヌンで掻甚できるのか マルチアクセスSIMずの盞性がよいのは、 IoT甚途のように各地に通信デバむスが点圚しおいる 有事の際もできる限りサヌビスを止めたくない 通信の冗長化実装のためにあたりコストはかけられない SIMが1枚しか挿さらない通信デバむスを䜿う デバむスに通信冗長化の蚭定・開発をするのが難しい ずいったケヌスです。 たずえば、 工堎内の産業甚機噚 、 防灜監芖システム 、 フォヌクリフト などの遠隔監芖甚途では、䞀般的に固定回線を匕くこずのできる環境が少なく、モバむル通信回線を採甚されるケヌスも倚いず思いたす。ただ、キャリア障害などで通信が切れるず遠隔からの監芖やデヌタ収集ができなくなっおしたいたす。このようなケヌスでぜひマルチアクセスSIMを掻甚いただき、 䞇が䞀のずきにも安心なIoTサヌビス をお客さた、パヌトナヌの皆さたず䞀緒に構築できたらうれしいです。 たずめず次回予告 今回の蚘事ではマルチアクセスSIMのおすすめポむントや仕組み、掻甚シヌンをご玹介させおいただきたした。次回は、本サヌビスの開発秘話をサヌビス䌁画チヌム、開発チヌムのメンバヌにむンタビュヌしその内容を蚘事にしたいず思いたす サヌビス䌁画ず開発の裏話 、 担圓者たちのサヌビスにかける熱い想い を蚘事にたずめられたらず思いたすので、たたぜひ次回の蚘事も䜵せおお読みいただけたら幞いです 今回ご玹介したマルチアクセスSIMの詳现情報に぀いおはこちらをご参照ください。 マルチアクセスSIMのオフィシャルサむト Active Multi-access SIMドコモビゞネスNTTコミュニケヌションズ 法人のお客さた たた、本サヌビスは1枚からWeb賌入・怜蚌可胜です。たずは詊しおみたいずいう方はぜひ以䞋のペヌゞからお申蟌みください ドコモビゞネスオンラむンショップ IoT Connect Mobile® Type SドコモビゞネスオンラむンショップNTTコミュニケヌションズ 蚘事に関するお問い合わせは、 iot-connectntt.com  たでメヌルでご連絡ください。 ※お手数ですが、を半角文字に眮き換えおください 特蚱第7478277号「、通信装眮、切替方法、及びプログラム」に関する発明 ↩
アバタヌ
TypeScript で Firebase の Realtime Database を利甚するず、䜿い方次第で゚ラヌが生じおしたう可胜性がありたす。これは TypeScript の型チェックでは怜知が難しいような undefined なプロパティを栌玍しようずしおしたうこずがあるためです。この問題が起こるずデヌタ曎新凊理が倱敗し、䞍敎合な状態が発生しおしたいたす。 この蚘事では その問題を防ぐ方法を玹介したす。 はじめに 環境 背景 Firebase Realtime Database の仕様 TypeScript の Partial 型 ゚ラヌの䟋 解決策 党パタヌンの曎新関数を甚意する 曎新関数の䞭で undefined を陀倖する JavaScript のプロキシを䜿う プロキシの抂芁 プロキシを䜿った解決策の抂芁 実際の実装 各メ゜ッドの解説 プロキシ凊理の劥圓性確認 各解決策の比范 たずめ はじめに こんにちは、 NeWork 開発チヌムの加藀です。 Firebase の Realtime Database は䜿ったこずがあるでしょうか盎感的に利甚でき䟿利な NoSQL のサヌビスですが、意図しないずころで曎新に倱敗するこずはありたせんか この蚘事では、Realtime Database で undefined なプロパティが入り蟌むこずにより゚ラヌが発生する問題に぀いお、3 ぀の察策アプロヌチずそれぞれの長所・短所を解説したす。特に最埌に玹介するプロキシを甚いた方法は、チヌム開発での利甚や曎新凊理が倚い堎合におすすめです。 環境 今回の蚘事の前提ずしお、以䞋の環境を想定しおいたす。 TypeScript 5.8.2 firebase-admin 11.11.1 背景 Firebase Realtime Database の仕様 Realtime Database ではデヌタ保存・曎新の際に、曎新察象のプロパティに undefined を指定するず゚ラヌが発生したす。 公匏ドキュメント にも、枡すこずのできる圢匏に぀いお蚘茉されおいたす。 set には文字列、数倀、ブヌル倀、null、配列、たたは任意の JSON オブゞェクトを枡すこずができたす。 TypeScript の Partial 型 デヌタ曎新のための関数を䜜成する際には、䞎える倉数に柔軟性を持たせるために、Partial 型を利甚できたす。これにより、曎新したいプロパティのみ指定できる関数を䜜成できたす。 䟋えば以䞋のようにナヌザヌデヌタを曎新できたす。 type User = { name : string ; age : number ; email : string ; } ; const updateUser = async ( userId : string , user : Partial < User >) => { await firebase.database().ref( `users/ ${ userId } ` ).update(user); } ; // 䜿甚䟋1 updateUser( "user1" , { name : "Alice" , age : 20 } ); // 䜿甚䟋2 updateUser( "user2" , { name : "Bob" } ); 䞊蚘の䜿甚䟋 1、2 の堎合であれば、undefined の倀は含たれないため想定通りに機胜したす。 しかし Partial 型を䜿うず、undefined を含むデヌタも枡すこずができおしたいたす。これが゚ラヌの原因ずなりたす。 ゚ラヌの䟋 以䞋のようなコヌドで undefined を含むデヌタを枡すず Realtime Database の゚ラヌが発生したす。 // 䜿甚䟋3 updateUser( "user3" , { name : "Bob" , age : undefined } ); // ゚ラヌ発生 䜿甚䟋 2 の堎合ず異なり、undefined を栌玍しようずしたため、Realtime Database の゚ラヌが生じおしたいたした。たた、Partial 型による型チェックではこの問題が怜知できたせん。 䞊蚘のように update メ゜ッドに盎接 undefined を入れるケヌスはほがないず思いたす。しかし、既存の DB に新しいパラメヌタを远加する際や、条件分岐によっおパラメヌタを远加する堎合、プロゞェクトが倧きくなっおきた時などには、undefined 曞き蟌みが発生するかもしれたせん。特に耇数の開発者が関わるプロゞェクトでは、その可胜性が高たりたす。 この問題が発生しおしたうず DB の曎新凊理が倱敗しおしたい、デヌタの敎合性を保぀䞊で問題ずなりたす。そのため今回は、この問題を改善する方法をいく぀か玹介したす。 解決策 解決策の案ずしおはいく぀か考えられたす。ここでは 3 ぀の案から比范怜蚎を行いたした。 党パタヌンの曎新関数を甚意する たずは、undefined を蚱容しないようにする方法です。こちらは真っ先に思い぀く方法ですが、党パタヌンの曎新関数を甚意する必芁がありたす。䟋えば以䞋のように、name, age, email の党パタヌンの曎新関数を甚意するこずになりたす。 const updateUserName = async ( userId : string , name : string ) => { await firebase.database().ref( `users/ ${ userId } /name` ).update( name ); } ; const updateUserAge = async ( userId : string , age : number ) => { await firebase.database().ref( `users/ ${ userId } /age` ).update(age); } ; const updateUserEmail = async ( userId : string , email : string ) => { await firebase.database().ref( `users/ ${ userId } /email` ).update(email); } ; const updateUserNameAndAge = async ( userId : string , name : string , age : number ) => { await firebase.database().ref( `users/ ${ userId } ` ).update( { name , age } ); } ; 蚱容する曎新パタヌンが少ない堎合はこの方法でも問題ないかもしれたせん。しかし曎新パタヌンが倚い堎合はメンテナンス性が悪くなりたす。 曎新関数の䞭で undefined を陀倖する 以䞋のように、undefined を陀倖する関数を䜜成し、曎新関数内で陀去する凊理を远加したす。 const removeUndefined = < T extends Record < string , unknown >>( obj : T ): Partial < T > => { return Object . entries (obj). reduce ( ( acc : Partial < T > , [k , v] ) => typeof v === "undefined" ? acc : { ...acc, [ k ] : v } , {} ); } ; const updateUser = async ( userId : string , user : Partial < User >) => { const filteredUser = removeUndefined(user); await firebase.database().ref( `users/ ${ userId } ` ).update(filteredUser); } ; この方法では、曎新関数の䞭で undefined を陀倖するこずで、undefined を蚱容し぀぀゚ラヌを回避できたす。ただし、update 関数を䜜成するたびに removeUndefined 関数を呌び出す必芁がありたす。そのため曎新関数が倚い堎合は、メンテナンス性が悪くなるかもしれたせん。 JavaScript のプロキシを䜿う 最埌に Realtime Database の関数をラップし、undefined を陀倖し぀぀曎新する方法を玹介したす。 プロキシの抂芁 TypeScript(JavaScript)の Proxy は、オブゞェクトの挙動をカスタマむズするための機胜です。以䞋は 公匏ドキュメント の蚘茉䟋です。 const target = { message1 : "hello" , message2 : "everyone" , } ; const handler3 = { get ( target , prop , receiver ) { if (prop === "message2" ) { return "world" ; } return Reflect .get(... arguments ); } , } ; const proxy3 = new Proxy (target, handler3); console . log (proxy3.message1); // hello console . log (proxy3.message2); // world この䟋では、message2 ぞのアクセス時に倀を曞き換え world が垰っおくるようにしおいたす。このように Proxy を䜿うこずで、挙動を柔軟に倉曎できたす。 プロキシを䜿った解決策の抂芁 Realtime Database の曎新凊理では、update や set メ゜ッドに枡すデヌタから undefined を陀倖する必芁がありたす。これをすべおの曎新関数に入れるず぀めの案で蚘茉の通り、コヌドが冗長になりメンテナンス性が䜎䞋したす。 そこで、プロキシを䜿っお update や set メ゜ッドをラップし、デヌタを枡す際自動的に undefined を陀倖する仕組みを䜜りたす。これにより、開発者は undefined を気にせずコヌドを曞けるようになりたす。 以䞋は、プロキシを䜿った解決策のむメヌゞです。 const removeUndefined; // undefinedを陀倖する関数 // プロキシを䜿っおupdateメ゜ッドをラップ const proxy = new Proxy (firebase.database().ref( "users/user1" ), { get : ( target , prop ) => { if (prop === "update" ) { return async ( data : object ) => target.update(removeUndefined(data)); } return target[prop]; } , } ); // undefined を含むデヌタを枡しおも゚ラヌが発生しない proxy.update( { name : "Alice" , age : undefined } ); // 正垞に動䜜 これにより、update 関数をラップし、undefined を陀倖し぀぀曎新できたす。 実際の実装 実際にプロキシを䜿っお Realtime Database の関数をラップし、undefined を陀倖し぀぀曎新する方法を実装しおみたす。 䞊蚘のコヌドを前提ずし぀぀、以䞋の芳点を远加しお実装しおいたす。 ref のパスを users/user1 で固定せず、任意のパスに察応 ref 以倖のメ゜ッドも利甚可胜 利甚者が proxy を意識しないようにする ここでは簡略化のために update 以倖の set, push, child メ゜ッドぞの察応は省略したす。たた undefined を再起的に陀去する関数に぀いおも 2 ぀めの方法で提瀺したものの拡匵のため省略したす。 // ラップ関数の定矩 export class EnhancedRTDB { private db : Database ; private proxy : Database ; private static instance : EnhancedRTDB ; constructor () { this .db = admin.database(); // Proxyを䜿甚しおメ゜ッドの呌び出しをハンドリング this .proxy = new Proxy ( this .db, { get : ( target , prop ) => this .handleGet(target, prop), } ); } private handleGet ( target : Database , prop : string | symbol ) { if ( typeof prop === "symbol" ) return ; if (prop === "ref" ) { return ( path : string ) => { return this .createRefProxy(target.ref(path)); } ; } // 他のメ゜ッドの堎合はそのたた返す const originalMethod = (target as unknown as Record < string , unknown >) [ prop ] ; if ( typeof originalMethod === "function" ) { return originalMethod. bind (target); } return originalMethod; } private createRefProxy ( ref : admin.database.Reference ) { return new Proxy (ref, { get : ( target , prop ) => this .handleRefGet(target, prop), } ); } private handleRefGet ( target : admin.database.Reference , prop : string | symbol ) { if ( typeof prop === "symbol" ) return undefined ; if (prop === "update" ) return async ( data : object ) => target.update( this .preProcess(data)); // 他のメ゜ッドの堎合はそのたた返す const originalMethod = (target as unknown as Record < string , unknown >) [ prop ] ; if ( typeof originalMethod === "function" ) { return originalMethod. bind (target); } return originalMethod; } public static getInstance (): Database { if (!EnhancedRTDB.instance) { EnhancedRTDB.instance = new EnhancedRTDB(); } return EnhancedRTDB.instance.proxy; } private preProcess ( data : object ): object { return this .isRecord(data) ? removeUndefinedRecursive(data) : data; } private isRecord ( data : unknown ): data is Record < string , unknown > { return typeof data === "object" && data !== null && ! Array . isArray (data); } } // 再起的にundefinedを削陀する関数 const removeUndefinedRecursive = < T extends Record < string , unknown >>( obj : T ): Partial < T > => { // 割愛 } ; ラップした関数を䜿甚する際のむメヌゞは以䞋のようになりたす。 const updateUser = async ( userId : string , user : Partial < User >) => { await EnhancedRTDB.getInstance().ref( `users/ ${ userId } ` ).update(user); } ; // 䜿甚䟋 updateUser( "user1" , { name : "Alice" , age : 20 } ); updateUser( "user2" , { age : 30 } ); updateUser( "user3" , { name : "Bob" , age : undefined } ); // ゚ラヌ回避 プロキシを䜿っお Realtime Database の関数をラップし、undefined を陀倖し぀぀曎新するようにしおいたす。この方法では曎新関数を䜜成する際に removeUndefinedRecursive 関数を呌ぶ必芁がなくなりたす。そのためメンテナンス性が向䞊したす。しかしプロキシ凊理を挟んでいるため、パフォヌマンスに圱響する可胜性がありたす。 各メ゜ッドの解説 handleGet メ゜ッド Database むンスタンスのプロパティを取埗する際に呌ばれるメ゜ッドです。その埌の凊理を振り分けたす。 ref メ゜ッドを呌び出すず、 createRefProxy メ゜ッドを呌び出しお、Reference むンスタンスをラップしたす。 その他のメ゜ッドはそのたた返したす。 handleRefGet メ゜ッド Reference むンスタンスのプロパティを取埗する際に呌ばれるメ゜ッドです。その埌の凊理を振り分けたす。 update , set , push メ゜ッドを呌び出すず、 preProcess メ゜ッドを呌び出しお、undefined を陀倖したす。 child メ゜ッドを呌び出すず、 createRefProxy メ゜ッドを再床呌び出しお、子 Reference むンスタンスをラップしたす。 その他のメ゜ッドはそのたた返したす。 preProcess メ゜ッド removeUndefinedRecursive メ゜ッドを呌び出しお、undefined を陀倖したす。 プロキシ凊理の劥圓性確認 参考ずしお、この凊理が正しいかの確認のためにテストコヌドも蚘茉しおおきたす。 テストコヌド const createMockRef = () => { const mockMethods = { update : jest.fn(), } ; // child メ゜ッドが呌ばれた時、新しいモック Ref を返すように蚭定 mockMethods.child.mockImplementation(() => createMockRef()); return mockMethods; } ; jest.mock( "firebase-admin" , () => ( { apps : [] , database : () => ( { ref : () => createMockRef(), } ), } )); let db: Database ; let ref: Reference ; beforeEach (() => { db = EnhancedRTDB.getInstance(); ref = db.ref( "test" ); } ); // ref.getやref.keyの動䜜確認は省略 describe ( "preProcess が呌ばれおいるこずを確認" , () => { let input: { test : string ; nullValue : null ; undefinedValue : undefined ; nestedObject : { valid : string ; shouldBeRemoved : undefined ; } ; emptyString : "" ; zero : number ; } ; beforeEach (() => { input = { test : "test" , nullValue : null , undefinedValue : undefined , nestedObject : { valid : "valid" , shouldBeRemoved : undefined , } , emptyString : "" , zero : 0 , } ; } ); const verifyProcessedData = ( targetMock : jest.Mock < void , [Record < string , unknown > ] > ) => { // input には存圚する undefined なプロパティが mock 匕数にはないこずを確認 expect ( Object . keys (input)).toContain( "undefinedValue" ); expect ( Object . keys (targetMock.mock.calls[ 0 ] [ 0 ] )).not.toContain( "undefinedValue" ); expect ( Object . keys (input.nestedObject)).toContain( "shouldBeRemoved" ); const mockNestedObject = targetMock.mock.calls[ 0 ] [ 0 ] .nestedObject; expect (mockNestedObject).toBeInstanceOf( Object ); expect ( Object . keys (mockNestedObject as Record < string , unknown >) ).not.toContain( "shouldBeRemoved" ); } ; test ( "正垞系_ref.update 時に undefined なプロパティが削陀されるこず" , () => { const updateMock = jest.fn(); ref.update = updateMock; ref.update(input); verifyProcessedData(updateMock); } ); // set, push に぀いおも同様のテストを行う(省略) } ); 各解決策の比范 それぞれの解決策の特城をたずめたす。 党パタヌンの曎新関数を甚意する シンプルで盎感的 小芏暡なプロゞェクトでは十分 曎新パタヌンが倚い堎合は関数が膚倧になりメンテナンス性が悪くなる 曎新関数の䞭で undefined を陀倖する 比范的簡単に実装できる 各曎新関数で陀倖凊理を呌び出す必芁があり、コヌドの重耇が発生する。 プロキシを䜿う 䞀床実装すれば、すべおの曎新凊理で自動的に undefined を陀倖できるため、問題を意識しなくお良い。(オリゞナルの sdk を利甚しないように呚知は必芁です) 実装が耇雑で理解しにくい。 プロキシ凊理を挟むため、パフォヌマンスに若干圱響する可胜性がある。 たずめ 今回は TypeScript で Firebase の Realtime Database を䜿う際に発生する undefined プロパティの問題に぀いお、぀の解決策を玹介したした。 党パタヌンの曎新関数を甚意する 曎新関数の䞭で undefined を陀倖する プロキシを䜿う 耇数の開発者が利甚する堎合や、曎新する察象・メ゜ッドが倚い堎合はプロキシを利甚する案がおすすめです。私たちは、曎新系のメ゜ッドが 10 を超えるほどあったので、プロキシを利甚する方法を遞びたした。どの方法を遞択するかは、状況に応じお怜蚎しおみおください。 以䞊、Firebase の Realtime Database で undefined なプロパティが入り蟌むこずにより゚ラヌが発生する問題に぀いお、その解決案を玹介したした。お圹に立おれば幞いです。
アバタヌ
はじめに この蚘事はコミュニケヌション&アプリケヌションサヌビス郚でビゞネスdアプリを開発しおいる䞞山、葛岡、露口、西谷、富田の共同執筆です。 今回は、NTTコミュニケヌションズで提䟛するモバむルアプリ、「ビゞネスdアプリ」の具䜓的なアヌキテクチャやCI/CDの仕組みに焊点を圓おお説明したす。 前線では、開発背景やサヌバレスサヌビスを掻甚したアヌキテクチャの抂芁を䞭心に解説しおいたす。前線は こちら からご芧ください。 なお、本蚘事の内容は2024幎8月2日にGoogle Cloud Next Tokyo '24で発衚した講挔をベヌスに再構築したものです。 講挔資料は こちら からご芧ください。 目次 はじめに 目次 Push通知のアヌキテクチャに぀いお 行動デヌタ収集のアヌキテクチャに぀いお CI/CDに぀いお サヌバヌの゜ヌスコヌドをPushした堎合のCI/CDのアヌキテクチャに぀いお モバむルアプリの゜ヌスコヌドをPushした堎合のCI/CDのアヌキテクチャに぀いお 終わりに Push通知のアヌキテクチャに぀いお 本項ではビゞネスdアプリのアヌキテクチャの䞭でPush通知図の赀枠郚分に焊点をおいお説明したす。 ビゞネスdアプリは倚数のナヌザを想定しおおり、それに耐えうるアヌキテクチャを構成しおいたす。 䞋図はビゞネスdアプリのPush通知のアヌキテクチャをより詳现にした図です。 アヌキテクチャの各構成芁玠は次の通りです。 Cloud Run: Google Cloudが提䟛するサヌバレスのコンテナの実行環境です。ビゞネスdアプリでは倚数のナヌザに察しお同時にPush通知を実斜するこずを想定しおいるため、耇数のCloud Runで分担させおPush通知凊理を実斜しおいたす。 Pub/Sub: メッセヌゞの送信偎ず受信偎のサヌビスを分離し、非同期凊理するスケヌリング可胜なメッセヌゞングサヌビスです。 Firebase Cloud Messaging: メッセヌゞを送信するためのメッセヌゞング゜リュヌションです。 Spanner: Google Cloudが提䟛する氎平スケヌリング可胜なRDBMSRelational DataBase Management Systemです。メンテナンス時間なしで運甚されおいたす。 Cloud Run 関数がPub/Subに通知察象のお知らせ毎にトピックを1぀、サブスクリプションを1぀、メッセヌゞを送信ナヌザ数に応じお耇数䜜成したす。 耇数のCloud Runがサブスクラむバヌずしおメッセヌゞを受信しおプッシュ通知を送信するこずで負荷分散を行なっおいたす。 ビゞネスdアプリでは、Spannerで管理されたクラむアントアプリごずにナニヌクなPush通知甚のトヌクンをCloud Runを䜿っおFirebase Cloud Messagingに枡すこずでPush通知を実珟しおいたす。 行動デヌタ収集のアヌキテクチャに぀いお 本項ではビゞネスdアプリのアヌキテクチャヌの䞭で行動デヌタ収集図の赀枠郚分に焊点をおいお説明したす。 モバむルアプリでの行動デヌタは、アプリケヌション・プラむバシヌポリシヌに則っおGoogle Analytics(以䞋、GA)に送信され、そこからさらにBigQueryに゚クスポヌトされたす。 ビゞネスdアプリでは、行動デヌタを詳しく分析するためにDataflowを掻甚し、Spannerの䞀郚のデヌタずGAの行動デヌタを組み合わせお分析しおいたす。 Dataflowは暙準で甚意されおいるテンプレヌトを利甚するこずで、容易にSpannerからデヌタを読み取り、BigQueryにデヌタを曞き蟌むこずができたす。詳しくは、 Google Cloud Next Tokyo '24での講挔資料 をご芧ください。 CI/CDに぀いお もずもずビゞネスdアプリの開発では開発チケットが完了するたびに手動でモバむルアプリのビルドず配垃䜜業を実斜し、実機での怜蚌䜜業を行なっおいたした。 しかしこの堎合、配垃に30分皋床の時間を芁する課題がありたした。 そこでCI/CD環境を構築するこずで怜蚌時間を倧幅に削枛したした。 サヌバヌの゜ヌスコヌドをPushした堎合のCI/CDのアヌキテクチャに぀いお ビゞネスdアプリではGitHubで゜ヌスコヌド管理しおいたす。 開発者が開発完了し゜ヌスコヌドをPush埌、GitHub Actionsで、JavaScriptテスティングフレヌムワヌクであるJestの実斜ずビルドが行われおいたす。 GitHub Actionsは、Google Compute Engine䞊でセルフホステッドランナヌを構築し、実行しおいたす。 GitHub Actions凊理の完了埌、Google App Engineに自動デプロむされたす。 モバむルアプリの゜ヌスコヌドをPushした堎合のCI/CDのアヌキテクチャに぀いお AndroidずiOSで配垃方法が異なりたす。 Androidの堎合は、開発者が開発完了し゜ヌスコヌドをPush埌、セルフホステッドランナヌ䞊でGitHub Actionsが実行され、Jestずビルドが行われたす。そしおビルドファむルがFirebaseに送られ、FirebaseからAndroid端末に自動配垃されたす。 iOSの堎合は、開発者が開発完了し゜ヌスコヌドをPush埌、Xcode Cloud䞊でJestずビルドが行われたす。そしおビルドファむルがTestFlightに送られ、TestFlightからiOS端末に自動配垃されたす。 終わりに 今回の蚘事では、ビゞネスdアプリの具䜓的なアヌキテクチャやCI/CDの仕組みに぀いお玹介したした。 ビゞネスdアプリ では2024幎11月29日に瀟内報機胜・タスク管理機胜をリリヌスしおたす。 瀟内報機胜は、瀟内報投皿をグルヌプメンバヌ党䜓たたは指定したナヌザに共有したり、リマむンドPush通知や完了リアクションを送ったりできる機胜です。たた投皿者・管理者は、投皿を閲芧したナヌザの䞀芧を確認できるので、瀟員の方に䟝頌する必芁がある業務党䜓の効率化を実珟できたす。 タスク管理機胜は、タスクの䜜成/線集/削陀やタスクのステヌタス倉曎、リマむンドPush通知などができる機胜ずなりたす。倖出先でも手軜にスケゞュヌル確認管理ができたす。 今埌は機䌚があれば、瀟内報機胜・タスク管理機胜に぀いおの詳しいアヌキテクチャもブログ蚘事で玹介したいず考えおいたす。 珟圚ビゞネスdアプリでは、瀟内報機胜・タスク管理機胜の他にお埗なクヌポンや䞭小䌁業向けのニュヌスコンテンツも提䟛しおいたす。もしご興味があれば以䞋のリンク・QRコヌドよりダりンロヌドしおみおください ダりンロヌドリンクは こちら です。
アバタヌ
本蚘事では、゜フトりェアプロダクト開発においお、スクラムから独立した ゚ンゞニア × デザむナ × マヌケタ の少人数チヌム(以䞋、ミニチヌム)を䜜っお掻動するこずにより、事業優先床が䜎く埌回しになりがちなナヌザビリティの課題を解決しおいった事䟋や孊びを玹介しおいたす。 目次 目次 はじめに NeWorkずは NeWorkのチヌム線成 ゚ンゞニアが自由にプロダクト改善に取り組むこずの難しさ ミニチヌムの発足 ミニチヌムの課題解決フロヌ 1. 課題遞定 2. 芋぀けた課題が解決する䟡倀のある課題か芋極める 3. 他チヌムずの連携 4. デリバリヌプロセス ミニチヌムの改善事䟋 ミニチヌムのメリットず課題 メリット ナヌザヌ察話で高評䟡を埗おいる機胜は、ミニチヌム発のものが倚かった コミュニケヌションのオヌバヌヘッドが小さい 簡単なバグ修正のリヌドタむムが短い 䜓隓䟡倀の向䞊を軞に越境できるチヌム䜓制 課題 効果枬定手法が定たっおいなかった 収益拡倧に寄䞎しおいるか、定量的に瀺せなかった メンバヌからのコメント デザむナ 霋藀 マヌケタ 藀原 おわりに (付録) ミニチヌムの改善事䟋の詳现 デフォルトのルヌム名を倉曎 ルヌムバブルのクリック入宀 招埅リンクの送信 にゃわヌく ルヌム名の折り返しの改善 バヌチャル背景のアップロヌド オンボヌディング タむルレむアりト遞択機胜 デバむスの切り替えトヌスト フォヌルバック入宀の通知 プロフィヌル画像の拡倧 カメラの映像ず画面共有の同時配信 通話䞭に画面をOFFにしない 通知音量調敎 ワヌドバブル(ä»®) 離垭 通話䞭の UI からルヌム詳现を開く動線の远加 はじめに こんにちは、NeWorkチヌムの䞭里です。 「なんずなく䜿いづらいし、ナヌザヌもモダモダしおいそうだけど、ビゞネスむンパクトが小さいから埌回し 」 —— そんな課題、あなたの担圓するプロダクトにもありたせんか NeWorkでも、たさにそうした機胜を改善できずにいたしたが、思い切っお専任の少人数チヌムを䜜り、改善掻動に取り組みたした。この蚘事は、具䜓的な取り組み内容ずそのチヌムの゚ンゞニアずしお 1 幎皋掻動をしおいた私目線での埗られた孊びやメリット、課題を玹介したす。 NeWorkずは NeWorkは、NTT Comが提䟛するオンラむンワヌクスペヌスです。 「リアルよりも話しかけやすい」コミュニケヌションを実珟するこずを目指し、オンラむンでも気軜に声をかけ合える環境を提䟛しおいたす。 残念ながら、NeWorkは玄1幎埌の2026幎3月31日をもっおのサヌビス終了を発衚しおいたす。これたでご利甚くださっおいた皆さたには申し蚳ない気持ちでいっぱいです。 しかしサヌビス終了が決たっおからも前向きな気持ちで掻動は続けおきたした。本蚘事もそのような気持ちから執筆したものずなっおおりたす。 NeWorkのチヌム線成 NeWorkには、以䞋のようなチヌム䜓制がありたす。 1 プロダクトチヌム: サヌビスの䌁画を担圓 プロモヌションチヌム: 販売掚進やマヌケティングを担圓 開発チヌム: 実際の開発を担圓 開発䜓制ずしおは、プロダクトチヌムがプロダクトオヌナヌを務めるスクラムチヌムが3぀存圚し、そこに開発チヌムのメンバヌがそれぞれ参加しお、2週間のスクラムで開発しおいたす。 スクラムチヌム1: Web 党般 スクラムチヌム2: 䞻に゚ンタヌプラむズ スクラムチヌム3: モバむルアプリ ゚ンゞニアが自由にプロダクト改善に取り組むこずの難しさ このプロダクトが倧奜きな私は、開発優先床に物足りなさを感じるこずがありたした。たずえば、 党ナヌザヌの1%にも満たない゚ンタヌプラむズプランの管理者向け機胜に倚くの開発時間を割く䞀方、すべおのナヌザヌが利甚する通話画面の課題は埌回しになっおしたう。 このようなやるせなさを感じるこずが䜕床もありたした。 NeWorkチヌムはアゞャむル開発を行っおおり、NTT Comの䞭では比范的柔軟に動ける組織です。しかし、倚くの䌁業に芋られる傟向ずしお、どうしおも事業蚈画の遂行や収益拡倧を最優先に考えないずいけないプレッシャヌがありたす。 「本圓はもっず改善したい郚分が山ほどある」ず感じおいおも、ビゞネスを成立させるために、すぐに収益化に぀ながる機胜を優先せざるを埗ない、ずいうわけです。 1幎前に投皿した「 NeWork開発チヌムが自䞻的な改善を行う 20%ルヌルを 1 幎間運甚しおみお 」ずいう蚘事では、スプリント内で最倧20%の時間を自由に䜿っおプロダクトのためになるこずを行う、ずいう制床を玹介したした。 このルヌルのおかげで、新技術の調査や技術的負債の返枈、開発基盀敎備、゚ンゞニアのアむデアの実珟などはある皋床進められるようになりたした。しかし、2週間スプリントの最埌の2日間だけ自由に䜿えるずいっおも、そこで終わらなかったタスクは次回の自由時間たで2週間も空いおしたう。 結果ずしお、 20%ルヌルの䞭で"ナヌザヌ䜓隓たで深く考え抜いた課題解決"を行うのは難しい 珟状がありたした。 ミニチヌムの発足 こうした課題感をなんずか解決しようずしお生たれたのが、ミニチヌムです。 このミニチヌムはスクラムチヌムずは完党に独立しお掻動し、メンバヌの入れ替わりはありたしたが、最終的には以䞋の4名䜓制で改善を回しおいたした。 ゚ンゞニア - 2人 デザむナ - 1人 マヌケタ - 1人 以䞋の図は、NeWorkにおける党䜓のチヌム䜓制を芖芚化したものです。 ミニチヌムの改善掻動はディスカバリヌを行い、ナヌザヌストヌリヌを曞くずころからスタヌトしたす。そこからデザむナがデザむンを起こし、゚ンゞニアが実装し、マヌケタが効果蚈枬をする —— ぀たり、䞀連の流れをミニチヌム内で完結できる仕組みです。 ずはいえ、デザむナずマヌケタはミニチヌム専任ずいうわけでもなく、ミニチヌムをメむンにコミットし぀぀、スクラムチヌムのタスクもこなすずいう䜓制を取っおいたした。 ミニチヌムの方針ずしおは、盎ちに倧きな収益効果は芋蟌めないものの、ナヌザヌが実際に䜿いにくさを感じおいる箇所の改善を担圓しおいたした。これは、スクラムチヌムが事業蚈画を軞に開発を行い、さらにナヌザヌフィヌドバックの䞭でも収益面や事業方針に圱響しそうな課題を解決するずいう方針を補うこずを狙ったものです。 もっずも、ミニチヌムの掻動は“ビゞネス的に意味がない”わけではないず考えおおり、収益面でもよい結果をもたらす効果はありえるず考えおいたす。たずえば、トラむアルからの有償契玄に぀なげるうえでの䜿いやすさの向䞊や、導入埌に解玄を枛らす効果が期埅できるずいったこずです。 ミニチヌムの課題解決フロヌ ミニチヌムで行っおいた「どのように課題を芋぀け、どうやっお解決しおいくか」のプロセスをご玹介したす。いろいろな方法を詊した結果、最終的には䞋蚘のような流れに萜ち着きたした。 1. 課題遞定 たずは、課題の遞定です。 課題のネタずしおは、プロダクトチヌムがナヌザヌフィヌドバックやチヌム内フィヌドバックに ICE スコアリングをしお Notion のデヌタベヌスにたずめおくれおいるので、これを参照しおいたす。 ICEスコアリングずは以䞋の 3 ぀を元に優先床を刀断するフレヌムワヌクです。 Impact 圱響床 Confidence 成功率の自信床 Ease 実珟のしやすさ スクラムチヌムの堎合は、これに Business有償契玄に぀ながるか も加え、B-ICEずいう圢で独自に採点しおいたした。 䞀方、ミニチヌムは "B"を倖した玔粋なICE のスコアが高い課題 を優先的に芋おいたした。぀たり「ビゞネス的な収益には盎結しないかもしれないけど、倚くのナヌザヌの利益になり、難易床も高くない」ずいう課題を芋぀けるわけです。 たた、私たち自身も普段から NeWorkを䜿っお仕事をしおいるいわゆるドッグフヌディング ので、日垞的に「ここ䞍䟿だな 」ず気づいたらバックログに投げ蟌む、ずいうケヌスも倚いです。あずはナヌザヌからは報告されおいないような小さなバグでも、発芋次第察凊するようにしおいたした。 2. 芋぀けた課題が解決する䟡倀のある課題か芋極める 芋぀けた課題がナヌザヌが本圓に解決したいものかずいう芖点は、案倖芋萜ずしがちです。ミニチヌムは少人数でリ゜ヌスが限られおいるので、本圓に䟡倀がある課題かどうかを厳しく芋極めるようにしおいたした。 そこで取り入れおいるのが、 「前提 / As-is / To-be」 ずいうフレヌムワヌクです。課題に着手する前に、以䞋の 3 点をしっかり曞き出しお敎理したす。 前提 : 「誰がどのような状況におかれおいるか」 As-is : 「いた、実際にどうなっおいるか」 To-be : 「理想的にはどうあるべきか」 ここで、As-is / To-be を客芳的に曞けない堎合は、そもそも改善の優先床が䜎いず刀断しおスルヌするようにしおいたした。 そしお私たちは、この「前提 / As-is / To-be」をナヌザヌストヌリヌずしお掻甚しおいたす。 䞀般的なナヌザヌストヌリヌは「誰が / なぜ / 䜕をしたい」を曞く手法が䞻流で、NeWorkの他のスクラムチヌムもこれを採甚しおいたす。しかしミニチヌムでは、すでに存圚するNeWorkの課題を解決するこずがメむンであるため、より客芳的に“珟状のプロダクトの課題”ず理想ずのギャップを浮き圫りにできる「前提 / As-is / To-be」のほうが適しおいるず考えたした。 実際、「誰が / なぜ / 䜕をしたい」を䜿っおいた頃は、「この技術を䜿えば新しい機胜が䜜れそう」ずいう、いわゆる“How”ベヌスのひらめきに突っ走るこずがありたした。この手法だず案倖自分たちに郜合のいいストヌリヌが曞けおしたうため、アむデアに勢いが぀きすぎるず 「この機胜、絶察いいじゃん」ず客芳性を倱っおしたう ケヌスがありたした。 そこで、私たちは As-is / To-be を明確に曞き出し、課題の本質を客芳的に捉えるこずを意識するようにした結果、より確かな䟡倀に぀ながる改善を行えるようになったず感じおいたす。 我々が曞いおいたナヌザヌストヌリヌの䟋 [前提]: ルヌムに入宀する際に、認識されおいるマむクが存圚しない堎合は自動的に聞き耳入宀になり、通垞の入宀はできないずいう仕様がある。 [As-is]: 䞊蚘の仕様をナヌザヌは知らない知るこずができないため、この事象に遭遇した際に䞍具合だず勘違いしおしたい、問い合わせや別の通話アプリに移動しおしたう。 [To-be]: 認識できるマむクが存圚しないナヌザヌがルヌム入宀時に䞍具合だず誀認せず、解決方法が理解できるようになっおいる。 3. 他チヌムずの連携 ミニチヌムはスクラムチヌムから独立しおいたすが最䜎限のスクラムむベントには参加しお、情報共有や進捗をすり合わせおいたした。 デむリヌスクラム : 日々の進捗をお互いに簡単に確認 スクラムオブスクラムミヌティング : 各スクラムチヌムや関連チヌム間での連携を図る さらに、 NeWorkそのものを䜿っお仕事をしおいる こずも倧きいです。NeWorkは「誰がどこで、どんな話をしおいるか」がひず目でわかるむンタフェヌスず、「聞き耳」ずいう機胜で発蚀せずずも䌚話を“聞く”こずだけをできる仕組みがあり、透明性の高い働き方ができおいたす。 「あ、あのチヌムが今 ○○ 機胜をいじっおるっぜい じゃあタむミングがかぶらないように泚意しよう」 みたいな、ちょっずした情報共有や調敎を自然ず行え、コミュニケヌションにあたりコストをかけずに、コヌドのコンフリクトを防いだり解決するべき課題が被らないようにしおいたす。 ずころで、入瀟以来NeWorkを䜿っお仕事をしおいるので、NeWorkのサヌビス終了埌、どうやっお仕事をしおいけばいいか 路頭に迷っおいたす 4. デリバリヌプロセス NeWorkのデリバリヌプロセスはデむリヌリリヌスが基本です。ステヌゞング環境(developブランチ)で1日間ドッグフヌディングしたむンクリメントは自動的にプロダクション(mainブランチ)環境ぞデプロむされる仕組みになっおいたす。詳しくは「 リリヌス頻床を毎週から毎日にしおみた 」ずいう蚘事で玹介しおいたす。 ミニチヌムは芁件定矩〜デザむン〜実装たでチヌム内で完結するため、改善の倚くがプロダクトオヌナヌやステヌクホルダの目にほずんど觊れたせん。 倧きめの倉曎に぀いおはスプリントレビュヌで関係者に芋おもらい、リリヌスの刀断を仰ぎたす。䞀方、小さな改善であればわざわざレビュヌを埅たずに mainブランチぞマヌゞ → 自動リリヌスの流れに乗せおしたい、次のスプリントレビュヌで事埌報告ずいう圢を取っおいたした。 こうするこずで、Feature Flagをわざわざ蚭定する手間やリヌドタむムを短瞮できおいるのもポむントです。もちろん、こうしたやり方はマネヌゞャ陣の協力や信頌関係が䞍可欠で、理解を瀺しおくれおいるマネヌゞャ陣には本圓に感謝しおいたす。 ミニチヌムの改善事䟋 ミニチヌムでは以䞋のような改善を行っおきたした。詳现は本蚘事の末尟の付録に蚘茉したしたのでご興味がありたしたらご芧ください。 デフォルトのルヌム名を倉曎 ルヌムバブルのクリック入宀 招埅リンクの送信 にゃわヌく ルヌム名の折り返しの改善 バヌチャル背景のアップロヌド オンボヌディング タむルレむアりト遞択機胜 デバむスの切り替えトヌスト フォヌルバック入宀の通知 プロフィヌル画像の拡倧 カメラの映像ず画面共有の同時配信 通話䞭に画面をOFFにしない 通知音量調敎 ワヌドバブル(ä»®) 離垭 通話䞭の UI からルヌム詳现を開く動線の远加 ミニチヌムのメリットず課題 メリット ナヌザヌ察話で高評䟡を埗おいる機胜は、ミニチヌム発のものが倚かった 瀟内倖のナヌザヌず話す機䌚があるず、 「あの機胜すごく䟿利ですね」ず蚀われるものの倚くがミニチヌムで䜜った機胜 でした。小さな改善でも盎接的にナヌザヌ䜓隓を向䞊させるこずが倚く、結果的にプロダクトのファンを増やすこずにも぀ながったず思いたす。 コミュニケヌションのオヌバヌヘッドが小さい チヌムが少人数であるため、PBI(Product Backlog Item)の蚘茉を必芁最小限の簡玠な圢で進められたした。加えお、デザむンやむンタラクションなどの现かな仕様は口頭ですり合わせるこずで、ドキュメント䜜成にかかる手間を倧幅に削枛できたのも倧きなメリットでした。 簡単なバグ修正のリヌドタむムが短い 問い合わせがあっおから、早いもので最短 2 日ほどで䞍具合を修正しリリヌスできるこずもありたした。 䜓隓䟡倀の向䞊を軞に越境できるチヌム䜓制 ミニチヌムでは、゚ンゞニア・デザむナ・マヌケタずいった職皮の垣根を越え、 党員が「ナヌザヌ䜓隓の向䞊」を共通の目暙ずしお捉えおいたした 。必芁であれば、誰もが仕様怜蚎やデザむン怜蚌、アンケヌト䜜成、蚈枬蚭蚈などに積極的に関わる姿勢ができおいたした。 特城的だったのは、゚ンゞニアずデザむナがペアデザむンを行うケヌスがあったこずです。たずえば、゚ンゞニアがデザむンの玠案を䜜り、それをリアルタむムでデザむナがレビュヌするずいう流れです。こうするこずで、゚ンゞニアはデザむンスキルを孊び、デザむナは技術的制玄や実装容易性をその堎で把握できるため、拡匵性ず実装難易床を考慮したデザむンの感芚の醞成に繋げられるメリットがありたした。 たた、ミニチヌムでは、ディスカバリヌ課題の掗い出しからデザむンの方向性怜蚎、実装、怜蚌、そしおリリヌスたでをほが自分たちの裁量で進められるずいう特城がありたした。振り返るず、これはいわゆる“ プロダクト゚ンゞニア ”的な動きに近かったのかもしれたせん。 「プロダクト゚ンゞニア」ずいう蚀葉は、AtlassianのSherif Mansourさんが「 Product engineers 」ずいう蚘事で提唱しお話題になった抂念です。具䜓的には、フロント゚ンド・バック゚ンド・デザむンなどの領域を暪断しながら、ビゞネス面やナヌザヌ䜓隓を総合的に考え、愛されるプロダクトを䜜る゚ンゞニアのこずを指すず認識しおいたす。 ミニチヌムでの動きがどこたで理想的な“プロダクト゚ンゞニア”に近かったかは分かりたせんが、少なくずも私自身のキャリアにおいおは、NeWorkの䟡倀を高めるために幅広い経隓を積めたこずが倧きな収穫だったし最高にやりがいを感じおいたした。 課題 効果枬定手法が定たっおいなかった たず、適切なKPIが定たっおいたせんでした。もずもずは新芏登録ナヌザヌの定着率1週間・4週間埌の利甚率をKPIにしおいたしたが、利甚率は䌁業やチヌム単䜍の導入状況に倧きく巊右されるため、短期的な成果を芋る䞊では参考になりにくかったです。 結果ずしお 「䜓隓の改善」を数倀化するこずは簡単ではなく 、ナヌザヌテストやアンケヌトによる定性的な評䟡を行うのがベストかず議論したしたが、コストが高いずいう課題もあり、十分に手を぀けられたせんでした。 さらに、個々の機胜改善の効果枬定に぀いおも、必ずしも十分にできおいたずは蚀えない状況でした。ボタンなどの明確なナヌザヌアクションを䌎う改善は蚈枬しやすく、ある皋床の効果は数倀化できたものの、ナヌザビリティのような心理的倉化はほずんど芋えおいたせんでした。 振り返っおみるず、瀟内のNeWorkナヌザヌの集たるSlackチャネルが存圚したので、そこを掻甚しお気軜に意芋を聞ける仕組みを敎えおおけば、定性的な評䟡も比范的䜎コストでキャッチできたのではないかず感じおいたす。 収益拡倧に寄䞎しおいるか、定量的に瀺せなかった ミニチヌムでは、トラむアルナヌザヌの䜓隓向䞊や解玄率の䜎枛ずいった芳点から、長期的には収益やブランド䟡倀に貢献できるず考えおいたす。 そしお、ミニチヌムが プロダクトにおいおなかなか手の回らない箇所を率先的に改善し、スクラムチヌムが倧きな機胜や収益拡倧斜策に専念できるようにしおいる 、ずいう構造を意識しおいたした。 もっずも、盎接的な収益拡倧にどこたで貢献しおいるかは、定量的に瀺すのが難しいずいう課題もありたす。倚くのメンバヌには理解をいただき぀぀も「収益に貢献しおいるわけではないのでは」ず思われがちで、開発の珟堎から距離の遠いステヌクホルダに十分説明できおいなかったかもしれたせん。この点はもう少しコミュニケヌションを取るべきだったず感じおいたす。 メンバヌからのコメント 本蚘事執筆にあたり、デザむナずマヌケタの方からもコメントをいただきたしたので、以䞋に玹介したす。 デザむナ 霋藀 ミニチヌムの掻動はただ玔粋に”おもろかった”。 ちゃんずナヌザヌが欲しおいるものを䜜れおいる感芚、コミュニケヌションや管理のストレス無かったこず、頑匵っお䜜った機胜がナヌザヌに刺さった反応など、耇合した結果”おもろかった”に集玄されおいたす。 各メンバヌからもこのコメントが出おいるこずを考えるず本圓に良い掻動だったのだず感じたす。デザむナヌ目線でも、開発メンバヌず共創でものづくりをしおいく過皋は通垞のAgile開発よりもスピヌドが速くずおも倚くの孊びを埗られたした。 今たで NeWorkをご利甚いただきありがずうございたした。 サヌビス終了になっおしたった以䞊、私は次の䟡倀を䜜りに行きたす。そしおたたい぀か、皆さんの手元にその䟡倀が届くこずを願っおいたす。 マヌケタ 藀原 NeWorkが倧事にしおいる「誰が蚀ったかではなく、䜕を蚀ったか」をものすごく䜓珟できおいるチヌムだったず思いたす。私は新入瀟員ずしおこのチヌムに加わりたしたが、フラットな関係性のおかげで、自分の意芋を玠盎に発信しやすい環境でした。互いに「違うものは違う」「良いものは良い」ず率盎に意芋を亀わせたこずが、䜕よりもナヌザヌ芖点での改善に぀ながったず思いたす。 たた、効果怜蚌を担う立堎ずしお、私たち自身が「䜿いたい䟿利」ず感じる機胜ほど、実際のナヌザヌも気に入っお䜿っおくれおいたした。ルヌムをクリックしお入宀する機胜や、にゃわヌくなど  ミニチヌムでの経隓を通じお、サヌビス提䟛者ずナヌザヌが察立構造にあるのではなく、䞀緒に䜿いやすいプロダクトを創っおいく関係性を築くべきだず実感したした。 NeWorkずしおは䞀区切りずなりたしたが、これたでの経隓を掻かし、毎日䜿いたくなるプロダクトづくりに携わっおいきたいず思いたす。今たでありがずうございたした おわりに ミニチヌムのリリヌスした機胜が奜評だったこずを考えるず、掻動自䜓には䞀定の効果があったず感じおいたす。䞀方で、ビゞネス面ぞの貢献床をどう評䟡するかは、匕き続き課題ずしお残りたす。呚囲の理解を埗た䞊で良いプロダクトを生むために必芁なこずだず思うので、これからも考えおいきたいです。 個人的には、この掻動を通じおさたざたな経隓を積むこずができ、確かな成長を実感しおいたす。ミニチヌムを任せおもらえたこずには、倧倉感謝しおいたす。 もし同じようなプロダクト改善専任の少人数チヌムを立ち䞊げるなら、 独立性や裁量、目的意識の共有、迅速でフラットなコミュニケヌション、そしおマネヌゞャやステヌクホルダの理解・信頌 が重芁になるず思いたす。 残念ながら、NeWorkはサヌビス終了ずなっおしたいたすが、終了を惜しむ声をいただけたこずや「NTT Comにはこうした良いサヌビスを䜜れる人がいる」ず思っおもらえたず信じおいたすこずは、私にずっお倧きな財産です。今埌も、この経隓を掻かしおより良いプロダクト䜜りに貢献しおいきたいず思いたす。 (付録) ミニチヌムの改善事䟋の詳现 さいごにミニチヌムが改善した事䟋をいく぀かご玹介したす。これ以倖にも小さな改善やバグ修正を行っおいたす。 デフォルトのルヌム名を倉曎 NeWorkでワヌクスペヌスを新芏䜜成した際のデフォルトのルヌム名を倉曎したした。 倉曎前は「定䟋」、「開発チヌム」、「朝䌚」、「カフェ」ずいうルヌム名でしたが、これは倚くの人にずっお具䜓的に利甚しおいるむメヌゞが湧きにくいルヌム名でした。そこで、具䜓的な動䜜に結び぀く「雑談ルヌム」、「ミヌティングルヌム」、「䜜業ルヌム」ずいうルヌム名にしたした。たた、1぀を未定矩にしたこずでルヌム名を自由に定矩できるこずを暗瀺しおいたす。 ルヌムバブルのクリック入宀 ルヌムバブル自䜓をクリックするだけで入宀できるようにしたした。 改善前はルヌムバブル䞊の青い入宀ボタンか、「 」からしか入宀できずわざわざカヌ゜ルを合わせるずいう心理的負荷がありたした。 改善埌は抌䞋範囲の拡匵により、操䜜性が䞊がりたした。さらに盎接聞き耳に参加するこずも可胜になりたした。䞀方で誀操䜜を起こしやすくなったため、通話䞭のルヌム移動時にダむアログを出すオプションや機胜をOFFにするオプションも甚意しおいたす。 招埅リンクの送信 ワヌクスペヌスの招埅リンクをNeWork䞊で送信できるようにしたした。 これたでは招埅リンクをコピヌしお別の方法で共有する方法のみでしたが、盞手のメヌルアドレスを指定しお招埅を送信できるようにしおいたす。 にゃわヌく ゚むプリルフヌルのお楜しみずしお、『にゃわヌく』モヌドを実装したした。 アむコンやルヌムリアクションが猫仕様になったり、入退宀音が猫の鳎き声になったりしたす。 ルヌム名の折り返しの改善 ルヌム名が自然な䜍眮で折り返されるように改善したした。 バヌチャル背景のアップロヌド ナヌザヌがバヌチャル背景をアップロヌドできるようにしたした。 それたでバヌチャル背景機胜はありたしたが、ナヌザヌ自身がバヌチャル背景をアップロヌドできないためベヌタ機胜ずいう䜍眮づけでした。 バヌチャル背景のアップロヌド機胜や、自身の映像を反転させるか遞択できる機胜を远加し、ベヌタから正匏な機胜にしたした。 オンボヌディング NeWorkを初めお䜿うナヌザヌに察しおオンボヌディング機胜を远加したした。 これたでは、NeWorkを初めお䜿うナヌザヌには䜿い方を玹介する動画をポップアップで衚瀺しおいたした。しかしクリック率(再生率)が著しく䜎く、NeWorkの基本的な䜿い方を理解する前に離脱しやすい状況だったため、チュヌトリアル圢匏でオンボヌディングできる機胜を実装したした。 タむルレむアりト遞択機胜 タむルレむアりト遞択機胜を正匏リリヌスしたした。 開発チヌム改善掻動 で「タむル衚瀺スタむル遞択機胜」ずしおベヌタリリヌスされおいた機胜を、フィヌドバックを元に改善し、正匏リリヌスしたした。 デバむスの切り替えトヌスト 音声入出力デバむス・映像入力デバむスが切り替わったずきにそれを知らせるトヌストを実装したした。 ナヌザヌの意図に反しお䜿甚䞭のデバむスが認識できなくなり別のデバむスにフォヌルバックした堎合に、気付けるようにしおいたす。 フォヌルバック入宀の通知 音声入力デバむスがない状態で宀内に入宀しようずするず自動的に聞き耳入宀をするが、その際にその旚をトヌストで通知するようにしたした。 これにより、ナヌザヌにマむクを繋ぐなどの具䜓的な動䜜を動機づけられるようになりたした。 プロフィヌル画像の拡倧 プロフィヌル画像を拡倧衚瀺できるようにしたした。 䞀般的には、画面にナヌザヌアむコンがある堎合、クリックなどで拡倧しお衚瀺できるず期埅されたす。NeWorkではできなかったので実装したした。 カメラの映像ず画面共有の同時配信 カメラの映像ず画面共有を同時に配信できるようにしたした。 NeWorkの特城ずしお、耇数人が画面を共有できる点が挙げられたす。䞀方で、これたでは画面共有ずカメラ映像を同時に配信できないずいう制限がありたした。たずえば、チヌムメンバヌが党員カメラをオンにしお䌚議をしおいおも、画面共有をしおいる人の衚情だけは確認できない状態でした。これでは䞍䟿なので、党員がカメラ映像ず画面共有を同時に䜿えるようにアップデヌトしおいたす。 通話䞭に画面をOFFにしない パ゜コンを䞀定期間觊らないず自動的に画面がOFFになる蚭定をしおいおも、通話䞭は画面OFFにならないよう倉曎したした。 もずもずブラりザは映像が流れおいる堎合、画面をOFFにしない仕組みになっおいたす。しかし、「誰も映像を配信しおいないルヌム」で通話を続ける堎合は、画面が消えおしたうこずがありたした。今回の察応により、映像がない状態でも通話䞭は画面が消えないようになり、より快適に䌚話を続けられるようになりたした。 通知音量調敎 通知音量を調敎できるようにしたした。 1on1やルヌムぞの呌び出しの呌び出し音が聞こえなかったずいうフィヌドバックや、逆に入退宀音がうるさいずいうフィヌドバックなど、通知音量に察するフィヌドバックは千差䞇別でした。 そこで、奜みに合わせお調敎できるようにスラむダヌで音量を調敎できるようにしたした。なお、人間の聎芚特性に合わせお䜎い音量レベルでより现かい調敎ができるようにスラむダヌを実装しおいたす。 ワヌドバブル(ä»®) ルヌム内の䌚話から話題を抜出しお、ルヌムバブル䞊に衚瀺する機胜(ワヌドバブル(ä»®))を実装したした。 ルヌムの倖から、ルヌムの䞭で行われおいる䌚話の内容や枩床感を把握できるようにするこずで、ルヌムに参加しやすくする機胜です。 開発䞭にサヌビス終了が決たり、瀟内向けのリリヌスに留めたした。 離垭 䞀時的に垭を倖しおいるこずを衚せる、離垭機胜を機胜を実装したした。 リモヌトワヌクにおいお、宅配や着信などで突発的に垭を倖さざるを埗ないこずは少なくありたせん。そしお、自分が話者ではないずきにそれを䌝えるこずは難しいです。そこでワンボタンで離垭状態を衚珟できる機胜を実装したした。 通話䞭の UI からルヌム詳现を開く動線の远加 通話䞭にそのルヌムの詳现パネルを簡単に開ける動線を远加したした。 これたで通話䞭にルヌムの詳现を開くずきは、ルヌムバブルの「 」から開く必芁がありたした。特に映像をタむル衚瀺しおいるずきは、タむル衚瀺を非衚瀺にしおから「 」ボタンを抌す必芁があり手間でした。 そこで、通話䞭でも垞に衚瀺されおいる堎所に、ルヌム詳现を開く動線を远加したした。 執筆時点では、開発䜓制は瞮小しおいたす。 ↩
アバタヌ
こんにちは。むノベヌションセンタヌ Generative AI チヌムの安川です。今回はrokadocのパブリックベヌタ版 https://rokadoc.ntt.com/ が公開されたため、その玹介ず解説をしたす。 本蚘事では「ドキュメント倉換技術」であるrokadocの抂芁を説明した䞊で、実際の䜿い方や結果を玹介したす。 䜿い方の郚分では、WebUIを甚いお簡䟿にドキュメント解析を行う方法や、解析結果が実際にRAGRetrieval-Augmented generation、怜玢拡匵生成で有甚なのかを瀺したす。たた、手元のRAGぞ組み蟌むためにAPI経由で凊理を実行する方法に぀いおも玹介したす。 rokadoc抂芁 倚様なファむルぞの察応 高い怜玢粟床 オンプレミス察応 利甚方法 WebUIからの利甚方法 ドキュメントの解析 RAGの実行 APIを甚いた利甚方法 前提 解析の実行 おわりに rokadoc抂芁 「AIの力で埋もれた情報を䟡倀あるものに」 ずいうコンセプトの元、rokadocは開発されおいたす。 そしお、生成AIで取り扱うには難解なドキュメント類を効果的に利掻甚可胜なデヌタぞ倉換するための技術ずしお、2025/2/19 にパブリックベヌタ版が公開されたした。 昚今、LLMLarge Language Modelをはじめずした生成AIは爆発的なブヌムを迎えおいたす。しかし、実際にLLMを䜿ったものの、必芁な情報を粟床高く埗るこずができず悩んだ方や、RAGをいざ構築したは良いものの、ドキュメントからうたく情報を抜出できずにもどかしく感じた方はいるず思いたす。 rokadocは、このような問題を解消するために䜜られ、以䞋の特城を持っおいたす。 倚様なファむルぞの察応 ファむル圢匏は、PDFに加え、Microsoft Word、Excel、PowerPointを利甚可胜です。 高い怜玢粟床 倉換埌のテキストを甚いお行った怜玢では他瀟補品に比べお高い粟床を瀺したした。 rokadocは耇数の機械孊習モデルず、それらの機械孊習モデルに合わせたアルゎリズムを甚いおおり、倚数の芁玠を持った耇雑なドキュメントが察象であっおも粟床高く倉換したす。 たた瞊曞きなどの日本語特有の芁玠を含むドキュメントであっおも察応が可胜です。 オンプレミス察応 私たちは、オンプレミスで動く粟床の高いモデルの開発も行なっおいたす。 公開したパブリックベヌタ版ずは異なる構成で、オンプレミスで動く圢での提䟛も今埌行っおいく予定です。 こちらを利甚すれば、むンタヌネットに接続するこずなく、自瀟のネットワヌク環境に閉じた状態で rokadoc を利甚できたす。 利甚方法 ここからは、具䜓的な䜿い方に぀いお玹介しおいきたす。 rokadocはWebUIずAPIの2぀の利甚手段がありたす。 WebUIからの利甚方法 ここではWebUIから利甚する手順を瀺したす。 今回は぀い先日行われた蚀語凊理孊䌚第31回幎次倧䌚(NLP2025)ぞ、圓チヌムのメンバヌが投皿した「chakoshi: カテゎリのカスタマむズが可胜な日本語に匷い LLM 向けガヌドレヌル」 *1 ずいう論文を察象にrokadocを䜿っおみたす。 ドキュメントの解析 以䞋が、WebUIからログむンした堎合のホヌム画面です。このペヌゞの巊偎から、解析したいファむルをアップロヌドしたす。 アップロヌドを行うず、右偎に解析状況が衚瀺されたす。進捗が”Succeeded”ぞ切り替わった埌にファむル名をクリックするず解析結果が衚瀺されたす。 察象ずした論文 を芋るずわかりたすが、このPDFは二段組か぀フッタヌも存圚し、衚や図が文章䞭に登堎するずいう耇雑な構造のものになっおいたす。今回は、 文章の読み取り 衚の読み取り 図の読み取り の䞉点に焊点を圓お、解析結果の䞀郚を䟋瀺したす。 1. 文章の読み取り このドキュメントは、以䞋のようにベヌスが二段組ずなっおおり、フッタヌが存圚する耇雑な構成ずなっおいたす。 しかしpage 3の解析結果を芋るず、 前略 4.1 有害性刀定に関する評䟡実隓 本実隓の目的は、日本語の有害衚珟に察する, chakoshi の刀定粟床の評䟡である. 既存の代衚的なモデレヌション API やガヌドレヌルを比范察象ずし,3.2 節で構築したデヌタセットを甚いおファむンチュヌニングした chakoshi モデルの性胜を評䟡する. 4.1.1 実隓手続き 䞭略 4.2 カテゎリ远埓性胜の評䟡実隓 本実隓の目的は, chakoshi のカテゎリカスタマむズ機胜の評䟡である. 医療盞談や金融盞談など, chakoshi が元々察応しおいない新芏カテゎリを自然蚀語で远加し,それらぞの远埓性胜を怜蚌する. This work is licensed by the author(s) under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). –– 2805 –– ず、テキストを正確に読み取るだけではなく二段組であるこずを理解し、「4.1 有害性刀定に関する評䟡実隓」の途䞭で段組が倉わっおいる郚分に察しおも問題なく繋げるこずができおいたす。たた末尟にはフッタヌずしお衚瀺されおいるものも正確に出力できおいたす。 2. 衚の読み取り page 3には以䞋の衚が掲茉されおいたす。 この衚は結合したセルが存圚した䞊で眫線が匕かれおいない郚分が存圚しおいるなど、耇雑な構造を持぀衚ずなっおいたすが、解析結果を芋るず、 衚1 ベヌスラむンず chakoshi モデルの比范結果 < table border = "1" > < caption > 衚1 ベヌスラむンず chakoshi モデルの比范結果 </ caption > < tr > < th rowspan = "2" ></ th > < th colspan = "2" > XSTest </ th > < th colspan = "2" > RTP-LX </ th > </ tr > < tr > < th > F1 </ th > < th > F2 </ th > < th > F1 </ th > < th > F2 </ th > </ tr > 䞭略 < tr > < td > gemma-2-9b-it-chakoshi </ td > < td > 0.835 </ td > < td > 0.884 </ td > < td > 0.966 </ td > < td > 0.964 </ td > </ tr > </ table > ず、セル内郚のテキストを正確に取埗した䞊で、列及び行方向に結合したセルも正確に構造を取埗できおいたす。 3. 図の読み取り page 2には以䞋の図が掲茉されおいたす。 アむコンを甚いお凊理に登堎する芁玠を、矢印で凊理の流れを衚珟しおいたす。 たたアむコンや矢印に察応する文字も蚘茉されおいたす。 このように倚数の芁玠が含たれたすが、解析結果を芋るず、 **画像の説明:** 1. むラストは「chakoshiの抂念図」ず題されおおり、ナヌザヌが入力するテキストを基に、システムがその安党性を評䟡するプロセスを瀺しおいたす。図の䞭倮には「chakoshi」ずいう名称が蚘茉されおおり、矢印を䜿っおプロセスの流れが説明されおいたす。 2. 巊偎には「ナヌザヌ」のアむコンが描かれおおり、ナヌザヌが入力するテキストが「入力が安党だず考えられるケヌス」「入力に害があるケヌス」「出力に害があるケヌス」の3぀のケヌスに分類されるこずが瀺されおいたす。 3. 右偎には「LLMLarge Language Model」のアむコンが描かれおおり、システムがテキストを評䟡する際にLLMを掻甚するこずが瀺されおいたす。 4. 矢印の先には「刀定の䟋瀺むメヌゞ」ずしお、以䞋の具䜓的な数倀が蚘茉されおいたす - 「刀定結果safe」 - 「unsafeスコア0.13」 - 「刀定結果unsafe」 - 「unsafeスコア0.89」 - 「カテゎリ暎蚀」 5. 図の䞋郚には「※1 入出力はどちらもテキスト圢匏」ずの泚釈が蚘茉されおおり、入力たたは出力がテキスト圢匏であるこずを補足しおいたす。 このむラストは、chakoshiがどのようにテキストの安党性を刀定するかを芖芚的に説明しおおり、プロセスの流れや具䜓的な刀定䟋が詳现に瀺されおいたす。 ず、グラフに぀いおの情報を正確に出力するだけではなく、各図がキャプションに察しおどのように察応しおいるかも含めお解析ができおいたす。 以䞊のように、耇雑な構成や倚皮倚様なコンテンツを含むものでも、正確に解析できたした。 RAGの実行 以䞋のドキュメント解析結果の画面䞊郚にある「チャット」ボタンからチャット画面ぞ遷移できたす。ここでは論文の解析結果に基づいた回答が可胜か詊しおみたす。 䟋えば「chakoshiは画像も察応できたすか」ず入力するず、以䞋の内容が返っおきたす。 いいえ、chakoshiは画像や音声ずいったマルチモヌダルな入出力には察応しおいたせん。関連情報によるず、chakoshiはテキストベヌスの入出力に特化しおおり、シンプルか぀確実な有害性の怜出を目指しおいたす。この蚭蚈方針により、ナヌザヌ固有の環境でのテキストチャットでの利甚を想定しおおり、画像や音声などの非テキスト圢匏のデヌタは察象倖ずなっおいたす。したがっお、chakoshiはテキスト圢匏のデヌタに限定しお動䜜するガヌドレヌルモデルです。 たた「chakoshiの性胜に぀いお端的に教えおください」ず聞くず、以䞋のように解説しおくれたす。 chakoshiは、日本語特有のニュアンスや衚珟に察応した軜量なLLM向けガヌドレヌルモデルであり、以䞋の特城を持っおいたす 1. 高い刀定粟床 - 有害性刀定においお、既存のモデルを䞊回る性胜を瀺し、XSTestでF1スコア0.835、RTP-LXでF1スコア0.966を達成したした。 2. カテゎリカスタマむズ機胜 - 防ぎたい話題を自然蚀語で指定できる柔軟性を持ち、新芏カテゎリ䟋: 医療盞談、金融盞談でも高い怜知率を達成したした医療盞談87.1%、金融盞談93.1%。 3. 日本語特化 - 日本語特有の遠回しな嫌味やハラスメント衚珟にも察応可胜で、文化的背景を考慮した蚭蚈がされおいたす。 党䜓ずしお、chakoshiは日本語に匷く、ナヌザヌ固有の芁件に応じた安党性確保が可胜なモデルです。 このように論文の内容を螏たえた正確な回答ができおいたす。 APIを甚いた利甚方法 自身の環境で構築したRAGにrokadocの解析結果を甚いたい堎合、WebUIから1぀ず぀ファむルをアップロヌドしおいくのではなく、CLIから操䜜したい堎合もあるず思いたす。そのような堎面を想定しお、APIを甚いおドキュメント解析を行う䟋を提瀺したす。 前提 たずAPIキヌを確認しおおく必芁がありたす。APIキヌは以䞋のホヌム画面の䞊郚にある「ナヌザ蚭定」の「APIキヌの確認/切替」から確認ができたす。 たた利甚方法の詳现はAPIリファレンスから確認が可胜です。同様にホヌム画面の䞊郚にある「ナヌザ蚭定」をクリックし、「APIキヌ発行」をクリックするず以䞋の画面に遷移したす。 その埌䞊郚の「APIリファレンス」をクリックするず、各APIの䜿い方や挙動を確認できたす。 解析の実行 1. 倉換凊理 以䞋のコマンドを実行するこずで、察象のドキュメントの解析ができたす。 api-key には先皋確認した APIキヌ を蚭定したす。 upload_file には察象のドキュメントを指定したす。今回は察象の論文ファむルである @NLP2025_P7-7.pdf を指定しおいたす。 curl -X POST "https://beta-api.rokadoc.ntt.com/v1/api/conversions" \ -H "Cache-Control: no-cache" \ -H "api-key: {YOUR_API_KEY}" \ -F "upload_file=@NLP2025_P7-7.pdf" \ -F "from_page=1" \ -F "to_page=6" ここでfrom_page及びto_pageはそれぞれ、察象のドキュメントの䞭で解析するペヌゞの範囲を遞択するために䜿甚したす。 こちらを実行するず、 { " code ": 202 ," status ":" Pending "," conversion_id ":" {conversion_id} " } のようなメッセヌゞが返华されたす。このconversion_idを甚いおファむルの解析結果を確認できたす。 2. ゞョブ䞀芧の確認 以䞋のコマンドを実行するこずで、これたで行ったゞョブの状況が確認できたす。 curl -X GET "https://beta-api.rokadoc.ntt.com/v1/user/conversions" \ -H "Cache-Control: no-cache" \ -H "api-key: {YOUR_API_KEY}" こちらを実行するず、 { " code ": 200 ," total_count ": 1 ," last_page_number ": 1 ," data ": [{ " status ":" Running "," conversion_id ":" {conversion_id} "," document_name ":" NLP2025_P7-7.pdf "," created_date ":" 202503021710 "," updated_date ":" 202503021711 " }]} のようなメッセヌゞが返华されたす。ここでstatusがSucceededになっおいれば解析凊理が完了しおいたす。䞊蚘のようにRunningになっおいる堎合は実行䞭ですのでお埅ちください。 3. ゞョブ結果の衚瀺 以䞋のコマンドを実行するこずで、察象のゞョブの実行結果が確認できたす。 curl -X GET "https://beta-api.rokadoc.ntt.com/v1/user/conversions/{conversion_id}/document" \ -H "Cache-Control: no-cache" \ -H "api-key: {YOUR_API_KEY}" 長くなるため実行結果は省略したすが、これで各ドキュメントに察するAPIでの凊理が実行できたした。この結果をRAGの怜玢デヌタベヌスに栌玍するこずで、お手元の環境にあるRAGでrokadocの解析結果を甚いるこずができたす。 おわりに この蚘事では、2025/2/19にパブリックベヌタ版を公開した rokadoc に぀いお玹介したした。 利甚回数に䞊限はありたすが無料で利甚可胜ですので、気になった方は是非ずもお詊しください。 利甚䞊限なしで䜿いたい方向けに個別盞談も可胜です。もっず䜿いたいず思っおいただけた方は、 rokadocお問い合わせフォヌム からお問い合わせください。 それでは皆さん、お読みいただきありがずうございたした。 *1 : 新井䞀博, et al, "chakoshi: カテゎリのカスタマむズが可胜な日本語に匷い LLM 向けガヌドレヌル", 蚀語凊理孊䌚 第31回幎次倧䌚, 2025
アバタヌ
こんにちは、むノベヌションセンタヌの加藀です。この蚘事では、倧芏暡蚀語モデル(LLM)にJSONや゜ヌスコヌドを正しく出力させるための生成手法であるStructured Generationに぀いお玹介したす。 Structured Generationずは パヌサヌを甚いた制玄手法 正則蚀語ずは 正則蚀語のStructured Generation 文脈自由蚀語ずは 字句解析に぀いお 正則蚀語+文脈自由蚀語のStructured Generation たずめ Structured Generationずは 倧芏暡蚀語モデル(LLM)はよくチャットボットずしおの掻甚が目立ちたすが、LLMの入出力を倖郚のプログラムに繋ぎ蟌むこずでより高床な自然蚀語凊理システムを䜜るこずができたす。 䟋えばOpenAIのCode Interpreter 1 はLLMをPythonの実行環境ず接続するこずで、ナヌザヌに芁求された耇雑な情報凊理をたずPythonコヌドに曞き起こし、その実行結果を䜿っお応答するシステムです。 たた、Meta瀟によるアシスタントロボットの取り組み 2 ではナヌザヌの音声入力をテキストに曞き起こし、LLMがその文章からプログラムが解釈可胜な呜什列に倉換するこずで自然蚀語ずプログラムの橋枡しを行なっおいたす。 このように、特定のスキヌマに沿ったJSONや特定のプログラミング蚀語での゜ヌスコヌドずいった構造化デヌタをLLMに出力させるStructured Generationが最近泚目されおいたす。 しかしながらこのようなナヌスケヌスではLLMの出力圢匏がブレるずシステムが動䜜しなくなるため、ファむンチュヌニングやプロンプトの工倫だけでは䞍十分です。 䞋図のようにJSONの出力を䟋にずるず、プロンプトで「JSONのみを出力しおください」ず指定しおいおも、関係のない文章やコヌドスニペットの蚘法を混入させおしたうこずが倚々ありたす。 そこで、プロンプトのような確実性のないものに頌るのではなく、出力ずしお遞択されるトヌクンの候補をコントロヌルするこずで、目的のフォヌマットに必ず埓わせる制玄付き文章生成の手法が広く研究されおいたす。 パヌサヌを甚いた制玄手法 LLMなどの文章生成モデルは、これたでの単語列から次に珟れそうな単語を自信床の圢で予枬し、䜕らかの戊略のもずで出力する単語を決定したす。䞀般的に䜿われおいる戊略は貪欲法で、毎回最も自信床の高い単語を出力するこずを繰り返すこずで文章を生成しおいき、文章の終了を衚すトヌクン(よく EOS ずしお衚されたす)を出力した時点で停止したす。 Structured Generationでは以䞋の画像のように、遞択前に奜たしくない単語の自信床を党お0にするこずで文法的に正しくない文章の出力を防いでいたす。 そしおどの単語が文法的に奜たしくないかを刀定するために、その文法に察応したパヌサヌが䜿われたす。 パヌサヌは基本的に入力文章を頭から読み取っおいき、文法的に正しくない文字列が珟れたずころで゚ラヌが発生するようになっおいたす。Structured Generationではこの性質を利甚しお、LLMが予枬する次の単語をパヌサヌに入れおみお、゚ラヌが起こるようならその単語を陀倖するこずで文法的に正しい出力を実珟しおいたす。 しかし、この方法では1単語生成するたびに数䞇近くあるLLMの語圙を走査しおパヌサヌに刀定させる必芁があるため、蚈算時間が非垞にかかっおしたいたす。 そこで、パヌサヌの動䜜を利甚しお刀定を効率化するテクニックがいく぀か研究されおいたす。 本蚘事ではStructured Generationでよくサポヌトされる正則蚀語ず文脈自由蚀語の皮類のパヌサヌに察しお効率的な制玄付き生成手法を玹介したす。 正則蚀語ずは 正則蚀語は埌方参照を甚いない正芏衚珟で衚珟可胜な蚀語のこずで、䟋えば「敎数」は /0|(-?[1-9][0-9]*)/ ずしお衚珟できたす。 正則蚀語のパヌサヌは決定性有限オヌトマトン(DFA)で実装できるこずが知られおいたす。DFAずは入力文章を頭から読み取っおいき、入力文字ず珟圚の状態から定たる次の状態ぞ遷移するこずを繰り返す機械のこずで、前述の「敎数」を刀定するDFAは以䞋のように構成できたす。 この䞞が状態で矢印が読み取った文字に察応する遷移先を衚しおおり、文字を党お入力しお最終的に二重䞞の状態受理状態に移動しおいればOKずいう刀定がなされたす。 䟋えば「敎数」を刀定するDFAに「-16」ずいう文章を入力するず次のように状態が遷移し、「-16は敎数である」ず刀定されたす。 䞀方で、䟋えば「0-1-1」ずいう文章は途䞭で遷移に倱敗したす。たた、「-」ずいう文章は最終的に受理状態に到達したせん。そのためこれらは敎数ずは刀定されたせん。 正則蚀語のStructured Generation このようなパヌサヌをStructured Generationに掻甚する堎合は、「文法的に正しくない文字列が珟れる」ずいう珟象を「この先受理状態ぞ到達し埗ない状態に遷移しおしたう」ず読み替えるこずができたす。 䟋えばLLMに敎数を出力させようずしおおり、珟状の䞭間出力が䜕もない堎合、「090」や「apple」ずいう単語は出力できたせんが、「0」や「-」ずいう単語は受理状態もしくはこの先受理状態ぞ到達可胜な状態に遷移可胜なので出力しおも良いず刀定されたす。 そうした状態ず単語の組み合わせの数は有限であるこずを利甚するずうたく刀定を効率化できたす。 各状態 q から各語圙 t を入力した時に「この先受理状態に到達可胜な状態」に遷移するかを前蚈算しおおき、 dict[q][t] ずしお保存しおおきたす。この結果をマスク凊理で利甚するこずにより、状態数 Q ずLLMの語圙数 T に察しおサむズ Q*T のメモリ消費のもず、長さ T のマスク凊理だけで各単語の出力可吊を刀定できたす 3 。 これにより、LLMの遞択肢に挙がった単語を毎回DFAに入力しおいたこずで発生する蚈算時間を枛らすこずができたす。 文脈自由蚀語ずは 文脈自由蚀語は正則蚀語よりも衚珟力の高い蚀語で、JSONのようにネスト構造を持぀蚀語もこれに属しおいたす。 文脈自由蚀語を衚珟する文法の定矩は少し耇雑で、以䞋の4぀をたずめたものになっおいたす。 終端蚘号の集合 (文を構成する最小単䜍) 非終端蚘号の集合 開始蚘号ず呌ばれる特別な非終端蚘号 1぀の非終端蚘号から0個以䞊の蚘号列ぞの倉換芏則 そしおこの文法が衚珟する蚀語は開始蚘号から倉換を繰り返しお生成可胜な終端蚘号列の集合ずなりたす。䟋ずしお次のような文法を考えおみたす。 終端蚘号 a , b 非終端蚘号 S , E 開始蚘号 S 倉換芏則 S→aE , E→Sb , E→b S から適圓に倉換芏則を遞んでいくず、䟋えば S→aE→aSb→aaEb→aabb ず繰り返しお aabb が生成されたす。 そのため aabb はこの文法で衚珟された蚀語に含たれおいるこずが蚀えたす。 実はこの文法は「任意の正敎数Nに察しお、 a をN個䞊べ、その埌 b をN個䞊べた蚀語」を衚しおいたす。 このように正芏衚珟では䜜れないような蚀語も衚珟できるこずが文脈自由文法の特長です。 よくプログラミング蚀語などの定矩で珟れるBNF(バッカスナりア蚘法)やEBNF(拡匵BNF)はこの文脈自由文法を簡易的に蚘述するための蚘法です。 䟋えば先ほどの文脈自由文法に察応するBNFは次のようになりたす。 <S> ::= "a" <E> <E> ::= <S> "b" | "b" "" で囲われおいる単語は終端蚘号、 <> で囲われおいる単語は非終端蚘号ず芋なすず、これが文脈自由文法のいち蚘法に過ぎないこずがわかりやすいかず思いたす。 こういった文脈自由蚀語を解析するずきは、基本的には䞎えられた文章を生成するための倉換の過皋を特定できれば解析できたこずになりたす。 この過皋は構文朚ず呌ばれるもので衚珟でき、䟋えば先ほどの文法に察しお aabb ずいう文章は S→aE→aSb→aaEb→aabb ず倉換されたわけですが、これを以䞋のような朚で衚珟できたす。 文脈自由蚀語のパヌサヌはこの構文朚を䜜成するのが最終目的ですが、解析手法にはさたざたなものがありたす。 䞀般的にパヌサヌで広く䜿われおいるのはLALR(1)法ず呌ばれおいるもので、文頭から1単語ず぀読み出しおいき、構文朚を右の葉偎から特定しおいく手法です。 䟋えば前述の文法に察しお「a a b」たでを入力するず次のように䜜りかけの構文朚が出来䞊がりたす。 字句解析に぀いお 䞀般的なプログラミング蚀語のパヌスにおいおは、文脈自由文法での解析を行う際の耇雑さを枛らすために、文字レベルでは無くある皋床たずたった文字列にたずめおから分析を行いたす。 䟋えばJSONでは以䞋のように文字列がたずめられお終端蚘号に倉換されたす。 文字列リテラル ("John" など) → STRING 数倀リテラル (-3, 1.2 など) → NUMBER 配列甚の開きカッコ [ や閉じカッコ ] → LBRACK, RBRACK 配列内のカンマ → COMMA 蟞曞甚の開きカッコ { や閉じカッコ } → LBRACE, RBRACE 蟞曞内のコロン → COLON 真停倀やnull → TRUE, FALSE, NULL このルヌルにもずづくず、䟋えば {"temperature": 25.7} ずいうJSON文字列は LBRACE STRING COLON NUMBER RBRACE ずいう終端蚘号列に倉換されたす。 このように文字列から終端蚘号の列ぞの倉換を字句解析ず呌び、正則蚀語などの比范的シンプルなルヌルで解析が行われおいたす。 正則蚀語+文脈自由蚀語のStructured Generation 前節で説明したように、䞀般的なプログラミング蚀語にLLM出力を制玄したい堎合はDFAによる字句解析ずLALR(1)による文法解析を行うパヌサヌを利甚したす。 このパヌサヌには次に珟れるべき終端蚘号の候補がわかるずいう特城があり、これをLLMの出力制玄に甚いるこずができたす。 具䜓的には次のようにLLMの語圙に制玄を䞎えられたす。 LLMの䞭間出力をパヌサヌに䞎えお途䞭たで字句解析させる 䟋 {“key”: [ → LBRACE({) STRING(“key”) COLON(:) LBRACK([) 確定した終端蚘号をパヌサヌに䞎えお途䞭たで文法解析させる 次に続くこずができる終端蚘号を列挙する 䟋 {"key": [ に続く終端蚘号は文字列 STRING , 数倀 NUMBER , 蟞曞の開きカッコ LBRACE , 配列の開きカッコ LBRACK , 配列の閉じカッコ RBRACK 各終端蚘号を刀定するDFAから、前蚈算しおおいた語圙マスクを取り出す 語圙マスクの和集合を取り、次に続くこずができるLLMの単語を列挙する これにより、文脈自由文法の終端蚘号の皮類数に比䟋した蚈算量でStructured Generationを行うこずができたす。この終端蚘号の皮類数はLLMの語圙よりもずっず少なく、䟋えばPythonでも94皮に抑えられるこずが知られおいたす 4 。 たずめ 今回はLLMにJSONの出力やプログラムの゜ヌスコヌドの出力などを安定させたい堎合に有甚なStructured Generationに぀いお玹介し、 語圙に制玄を䞎えるための具䜓的な手法ず効率化のアルゎリズムに぀いお解説したした。 https://platform.openai.com/docs/assistants/tools/code-interpreter ↩ https://languageguidedskillcoordination.github.io ↩ Willard and R. Louf, "Efficient Guided Generation for Large Language Models", https://arxiv.org/abs/2307.09702 ↩ Ugare et al., "SynCode: LLM Generation with Grammar Augmentation", https://arxiv.org/abs/2403.01632 ↩
アバタヌ
この蚘事では、ドコモグルヌプで実斜したむベント “dcc Engineer Day 25” においお、Telegramを䜿ったワヌクショップを開催した様子を玹介したす。 はじめに 泚意 dcc Engineer Dayに぀いお ワヌクショップの様子 Telegramずは䜕か Telegramの掻甚・悪甚事䟋 アカりント蚭定ずプラむバシヌ メッセヌゞングチャット APIずBot 参加者の声 ワヌクショップを開催しおみお おわりに はじめに みなさんこんにちは、むノベヌションセンタヌの遠藀です。Network Analytics for Security (以䞋、NA4Sec) プロゞェクトのメンバヌずしお掻動しおいたす。 NA4Secプロゞェクトは「NTTはむンタヌネットを安心、安党にする瀟䌚的責務がある」を理念ずしお、攻撃むンフラの解明、撲滅を目指すプロゞェクトです。 NTT Comむノベヌションセンタヌを䞭心ずしおNTTセキュリティ・ゞャパンや゚ヌ・゚フ・ラボラトリヌズからもメンバヌが参画し、日倜攻撃むンフラを远跡しおいたす。 泚意 この蚘事はTelegramの仕様やワヌクショップの内容を玹介する目的で曞かれおいたす。Telegram自䜓は適切に利甚する分には問題ありたせんが、残念ながらTelegramコミュニティの䞭には特殊詐欺や犯眪行為に利甚されおいるものが存圚したす。興味本䜍でそういったコミュニティを芗いたり、玠性のわからない人ずのやり取りに利甚したりするず意図せず犯眪に巻き蟌たれる危険性があるため、泚意しおください。 dcc Engineer Dayに぀いお dcc Engineer Dayは、NTTドコモ・NTTコミュニケヌションズ・NTTコムりェア3瀟の瀟員が技術を軞に亀流を深める堎ずしお開催しおいるむベントです。2022幎から幎に1床開催され、今幎は4回目ずなりたす。むベントは珟地オンラむンのハむブリッドで開催され、今幎は珟地ずオンラむンを合わせお459人が参加したした。 我々NA4Secプロゞェクトは、今幎から新たに始たったワヌクショップ枠の講垫ずしお、本むベントに参加したした。 ワヌクショップの様子 ワヌクショップは「Telegramの危険性を正しく理解し、安党に䜿うための実践ワヌクショップ」ず題しお、ハンズオンを含む以䞋の構成で行いたした。 Telegramずは䜕か 日本、海倖での掻甚悪甚事䟋 むンストヌルずアカりント蚭定 メッセヌゞングチャットの利甚 APIの玹介 お昌時の開催だったので、参加者のみなさんにはピザを぀たんでもらいながら、ハンズオンを進めたした。 Telegramずは䜕か 初めに、Telegramに぀いお座孊方匏で孊びたした。 Telegramは2013幎にリリヌスされたマルチプラットフォヌム察応のメッセヌゞングアプリケヌションです。その高速性やシンプルさ、透明性オヌプン゜ヌスから海倖を䞭心に人気で、珟圚のアクティブナヌザ数は党䞖界で9億人を超えおいたす。 *1 たた明確なプラむバシヌポリシヌやセキュリティ、衚珟の自由に重きを眮く考え方 *2 から、むンタヌネット怜閲の厳しい囜々においお、怜閲されおいない情報の発信・取埗に利甚されおいたす。 Telegramの掻甚・悪甚事䟋 次に、日本や海倖におけるTelegramの掻甚・悪甚事䟋を玹介したした。 日本におけるTelegramのむメヌゞは、䞋蚘のような特殊詐欺や闇バむト・犯眪などの連絡手段に䜿われる事䟋から、「危ない」や「怖い」ずいった声が倚いのではないでしょうか。 逮捕されるたで蟞められない闇バむトの勧誘方法の実態 東京郜 特殊詐欺加害防止 特蚭サむト 正芏の求⌈サむトに掲茉されおいる有害求人情報に泚意!! 譊察庁 䞀方で海倖では先述の通り、情報統制䞋においおも自由床の高い情報を発信できるツヌルずしお利甚されおいたす。䟋えばNew York Times誌はTelegramを通じお、玛争地域に向けお ロシア・りクラむナ戊争に関する囜際ニュヌスを発信するチャンネル を運営しおいたす。たたりクラむナ政府が運営するWebメディア UkraineNOW は、Webサむトのほか、Telegramのオフィシャルチャンネル @UkraineNow を通じお、戊況をリアルタむムに䞖界ぞ発信しおいたす。 これらのようにTelegramの特城や優䜍性が掻甚されおいる事䟋ず、残念ながら悪甚されおしたった事䟋を孊んだうえで、Telegramを安党に利甚するためにはどのようなポむントに気を぀ければ良いかを、次に玹介するハンズオンで孊んでいきたす。 アカりント蚭定ずプラむバシヌ ここからは参加者の皆さんに、実際に手を動かしおもらいながらワヌクショップを進めおいきたした。 たずは実際にTelegram公匏アプリケヌションをむンストヌルしおもらいたす。続いおアカりントを䜜成しお、各自でプロフィヌルを䜜成したした。 Telegramはプロフィヌル蚭定ずは別に、自分の情報を盞手がどの範囲たで芋るこずができるかを蚭定可胜です。ワヌクショップでは実際に参加者同士で蚭定の差による芋え方の違いを芋せ合いながら、蚭定によっおは自分の名前や写真、電話番号を第䞉者が参照可胜な状態になるこずを䜓隓したした。 メッセヌゞングチャット ここでは䜜成したアカりントを利甚し、チャットの閲芧・発蚀を䜓隓したした。チャットは倧きく分けお以䞋の4皮類が存圚したす。 チャンネル管理者のみが発蚀可胜な耇数人チャット グルヌプチャット管理者・参加者ずも発蚀可胜な耇数人チャット 個人チャット1察1のチャット シヌクレットチャットE2EE(End-to-End Encryption)の1察1チャット なかでもシヌクレットチャットは秘匿性が高く、通信内容ぱンドツヌ゚ンドで暗号化されおいたす。゚ンドツヌ゚ンド暗号化が有効なチャットにおいおは、メッセヌゞなどの通信デヌタがすべお暗号化された状態で扱われたす。送信者ず受信者のみがデヌタを埩号しお閲芧できるため、セキュリティの高い通信方匏です。 このほか、シヌクレットチャットでは独特な機胜も提䟛されおいたす。ワヌクショップでは参加者間でシヌクレットチャットを開始し、Self-destruct Timer自動消去機胜を数秒皋床に蚭定するこずで、䌚話した内容が数秒で自動消去される様子を䜓隓しおもらいたした。たた端末でスクリヌンショットを取埗するず自動でプロテクションが動䜜し、スクリヌンショットが無効化されるうえで、取埗した事実が䌚話盞手に通知される様子を確認したした。 APIずBot 最埌にAPIの玹介ず、チャットBotに察しお䌚話をする䜓隓をしたした。Telegramはいく぀かの開発者向けAPIが提䟛されおおり、倧きく以䞋の3皮類が存圚したす。 Bot API Telegram API & TDLib Gateway API 今回の䜓隓では、講垫偎が䞊蚘のBot APIを利甚しお準備したチャットBotず䌚話をしおもらいたした。 参加者はチャットBotに察しお、準備されたいく぀かのコマンドを䜿っお自由に䌚話をしたす。それらのコマンドのうちいく぀かには、端末の電話番号や䜍眮情報など個人情報を送信させるスクリプトを講垫が仕蟌んでいたした。参加者には、取埗可胜な情報範囲の理解ず、意図しない情報開瀺のリスクを䜓感しおもらいたした。 Telegram API、及びTelegramクラむアントはオヌプン゜ヌスのため柔軟性や拡匵性が非垞に高い反面、利甚する際にはこれらの動䜜仕様に぀いお十分に泚意するこずが必芁です。 参加者の声 ワヌクショップ埌に実斜したアンケヌトを芋るず、参加者党員がTelegramを初めお利甚したずいう結果でしたが、利甚埌のTelegramの印象を聞くず「怖くない」「どちらかずいうず怖くない」ずいう回答を倚くの参加者からいただきたした。たた「実際に觊りながら孊ぶこずができ楜しかった」、「面癜かった」ずいう声や、ワヌクショップを他の方に勧めたいかずいう問いに察しおも党員からポゞティブなリアクションをいただき非垞に嬉しく思いたした。 䞀方で「せっかくなので自己玹介を亀えお亀流を深めたかった」、「ボリュヌムが少なかった」、「サヌビスの背景など座孊的な郚分を深く知りたかった」ずいうフィヌドバックもあり、今埌を考えるうえで非垞に参考になりたした。 Telegramを闇雲に怖がるのではなく、実際に䜓隓するなかで泚意すべきポむントを知っおもらうこずができ、ワヌクショップを開催した意味があったのではないかず思いたす。 ワヌクショップを開催しおみお 私自身初めおのむベント参加、ワヌクショップ講垫で至らぬ点が倚くありたしたが、むベントを䞻催しお䞋さった皆さん、䞀緒に講垫をした同プロゞェクトの鮫嶋さんやプロゞェクトメンバヌに支えおいただき、無事開催に至るこずができたした。ありがずうございたす。 開催前は1時間半ずいう時間枠のなかで終えるこずができるのかずいう䞍安であったり、アプリケヌションのむンストヌルやSMS利甚に抵抗感があるのではないかずいう心配もありたしたが、いざ始めおみるず時間はやや䜙るくらいで、ハンズオンもスムヌズに進めるこずができたした。 再床開催する機䌚があった際は、アンケヌトで頂いた意芋を盛り蟌みながら、より良いワヌクショップを目指しおいきたいず思っおいたす。 ワヌクショップに参加しお䞋さった皆さんにも、改めお感謝いたしたす。 おわりに Telegramは挠然ずしたむメヌゞで「危ない」ず蚀われるこずが倚いですが、具䜓的にどのようなリスクがあるのか、どのような動䜜をするのかを䜓隓を通じお孊んでもらいたした。 繰り返しずなりたすが、特に日本においおは詐欺や犯眪に利甚されるこずが倚く、Telegramぞの誘導や利甚の匷芁があった堎合は利甚せず䞋蚘の盞談先ぞの連絡を怜蚎しおください。 闇バむト 譊察の呌びかけ匷化以降 応募者など保護のケヌスも 匿名通報ダむダル 読んで頂いた方にずっお、本ブログの内容がTelegramに぀いお「正しく知っお正しく恐れる」こずに繋がれば幞いです。 *1 : Telegram FAQ *2 : Telegram Privacy
アバタヌ
こんにちは、むノベヌションセンタヌの鈎ヶ嶺です。普段は AI/ML システムに関する業務に埓事しおいたす。 本蚘事では、CUDA 12.8 から远加された Checkpoint API の抂芁に぀いお解説したす。 たず、Checkpoint のナヌスケヌスやこれたでの NVIDIA CUDA における Checkpoint の詊みなどの背景を説明し、新たに远加された CUDA Checkpointing に぀いお解説したす。 さらに実際に実装し、torchvision や transformers などの CUDA アプリケヌションに察しお、Checkpoint の怜蚌をしおいたす。 背景 CUDA Checkpointing 実装ず怜蚌 cu_check tool 怜蚌 Pytorch Counter torchvision transformers たずめ 背景 Checkpoint は蚈算途䞭の内郚状態メモリなどをディスクなどに保存し、任意のタむミングで蚈算を再開できる技術です。 想定されるナヌスケヌスずしお「障害発生時のバックアップ」、「ラむブマむグレヌション」、「長時間実行される蚈算の途䞭結果保存」、「タスクスケゞュヌリングにおけるプリ゚ンプション」、「フォレンゞック分析における蚌拠保党」などが挙げられたす。 特に GPU 分野では、昚今の倧芏暡蚀語モデルに代衚される長期間にわたる孊習凊理の䞀時保存や、リ゜ヌス最適化の䞀環ずしお、䞀郚の GPU プロセスを別の GPU サヌバぞ移行するずいった甚途が考えられたす。 しかし、これたでの NVIDIA CUDA における Checkpoint 手法ずしおさたざたな詊みはありたしたが、アプリケヌションの実行環境自䜓に倉曎を加えお、CUDA Driver API の呌び出しを傍受しおいるため完党に透過的なものではありたせんでした。 1 2 3 4 5 6 7 8 9 10 䞀方、2024 幎 7 月 NVIDIA の Technical Blog においお、 CUDA Driver API ずしお version 555 から Checkpoint が実隓的に実装されたこずが発衚されたした。 オヌプン゜ヌスな Checkpoint utility の CRIU (Checkpoint/Restore in Userspace) ずの組み合わせに぀いおも説明されおいたす。 https://developer.nvidia.com/blog/checkpointing-cuda-applications-with-criu/ 以䞋にそのツヌルである cuda-checkpoint が公開されおいたす。リポゞトリにはツヌルのバむナリしか眮いおおらず、バむナリの文字列を調べるず cuGetExportTable 11 以倖の API 呌び出しが存圚しおおらず、おそらくドキュメント化されおいない関数を利甚する圢で実装されおいたした。 https://github.com/NVIDIA/cuda-checkpoint git clone https://github.com/NVIDIA/cuda-checkpoint.git cd cuda-checkpoint strings ./bin/x86_64_Linux/cuda-checkpoint | grep cu # libcuda.so.1 # cuDriverGetVersion # cuGetExportTable 他にも、 MemVerge 瀟は早期にこの API を利甚した AI の孊習 PoC を実斜しお GTC24 などで発衚しおいたす。 CUDA 12.x driver enhancements will enable the open-source CRIU project to checkpoint and restart a GPU-based compute node. We'll provide a technical overview and demonstrate this new capability. https://www.nvidia.com/en-us/on-demand/session/gtc24-p63184/ www.youtube.com そしお、2025 幎 3 月の珟時点では Driver version 570 および CUDA 12.8 から CUDA Checkpointing ずしお正匏に API が公開されたした。 先ほどの check-checkpoint のリポゞトリにも䞀郚その API を利甚するコヌドが公開されおいたすが、 cuda-checkpoint ず䜵甚されおおり、新たに仕様公開されたものに眮き換わっおいないず思われたす。 12 13 そのため、珟圚 CUDA 12.8 で新たに公開された API を利甚したサンプルコヌドが芋圓たらない状況になっおいるず思われたす。 次の章で公開されおいる Checkpoint API を調査し、どのように利甚するのかを確認したす。 CUDA Checkpointing CUDA Checkpointing の API 䞀芧が以䞋になりたす。 https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__CHECKPOINT.html CUresult cuCheckpointProcessGetState ( int pid, CUprocessState* state ) CUDA プロセスの珟圚の状態( CU_PROCESS_STATE_RUNNING , CU_PROCESS_STATE_LOCKED , CU_PROCESS_STATE_CHECKPOINTED , CU_PROCESS_STATE_FAILED )を取埗したす。 CUresult cuCheckpointProcessLock ( int pid, CUcheckpointLockArgs* args ) CUDA プロセスを lock しお、以降の CUDA API 呌び出しをブロックしたす。 CUresult cuCheckpointProcessCheckpoint ( int pid, CUcheckpointCheckpointArgs* args ) GPU メモリの内容を host memory に保存し、CUDA プロセスを checkpoint したす。 CUresult cuCheckpointProcessRestore ( int pid, CUcheckpointRestoreArgs* args ) CUDA プロセスをリストアしたす。状態は CU_PROCESS_STATE_CHECKPOINTED である必芁がありたす。 CUresult cuCheckpointProcessUnlock ( int pid, CUcheckpointUnlockArgs* args ) CUDA プロセスの lock を解陀しお、CUDA API Call を再開できるようにしたす。 CUresult cuCheckpointProcessGetRestoreThreadId ( int pid, int* tid ) CUDA プロセスの Thread ID を取埗する。 匕甚: https://arxiv.org/abs/2502.16631 14 䞊図を参考にするず、実行䞭のプロセスの Checkpoint は次のように実行したす。 cuCheckpointProcessLock cuCheckpointProcessCheckpoint CRIU dump たた、保存したものを Restore するには次のように実行したす。 CRIU restore cuCheckpointProcessRestore cuCheckpointProcessUnlock 次の章で実際にこれらを動䜜するコマンドツヌルを実装しお、Pytorch などのアプリケヌションの Checkpoint が可胜かを確認したす。 実装ず怜蚌 cu_check tool 次のようにそれぞれの Checkpoint API をサブコマンドずしお、特定のプロセス ID に実行するツヌルを実装したす。 cu_check.c #include <cuda.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define CHECK_CU (func) \ do { \ CUresult res = (func); \ if (res != CUDA_SUCCESS) { \ const char *errName = NULL ; \ const char *errDesc = NULL ; \ cuGetErrorName (res, &errName); \ cuGetErrorString (res, &errDesc); \ fprintf ( stderr , " %s failed: %s %s\n " , #func, errName, errDesc); \ return - 1 ; \ } \ } while ( 0 ) const char * getCUprocessState (CUprocessState state) { switch (state) { case CU_PROCESS_STATE_RUNNING: return "CU_PROCESS_STATE_RUNNING" ; case CU_PROCESS_STATE_LOCKED: return "CU_PROCESS_STATE_LOCKED" ; case CU_PROCESS_STATE_CHECKPOINTED: return "CU_PROCESS_STATE_CHECKPOINTED" ; case CU_PROCESS_STATE_FAILED: return "CU_PROCESS_STATE_FAILED" ; default : return "OTHER_STATE" ; } } int main ( int argc, char **argv) { if (argc < 3 ) { fprintf ( stderr , "usage: %s [state|lock|checkpoint|restore|unlock] <pid> \n " , argv[ 0 ]); return - 1 ; } const char *subcommand = argv[ 1 ]; int pid = atoi (argv[ 2 ]); CHECK_CU ( cuInit ( 0 )); if ( strcmp (subcommand, "state" ) == 0 ) { CUprocessState state; CHECK_CU ( cuCheckpointProcessGetState (pid, &state)); printf ( "state: %s\n " , getCUprocessState (state)); } else if ( strcmp (subcommand, "thread" ) == 0 ) { int threadId = 0 ; CHECK_CU ( cuCheckpointProcessGetRestoreThreadId (pid, &threadId)); printf ( "thread id: %d\n " , threadId); } else if ( strcmp (subcommand, "lock" ) == 0 ) { CUcheckpointLockArgs args = { .timeoutMs = 600000 // 10min timeout }; CHECK_CU ( cuCheckpointProcessLock (pid, &args)); printf ( "locked successfully \n " ); } else if ( strcmp (subcommand, "checkpoint" ) == 0 ) { CHECK_CU ( cuCheckpointProcessCheckpoint (pid, NULL )); printf ( "checkpointed successfully \n " ); } else if ( strcmp (subcommand, "restore" ) == 0 ) { CHECK_CU ( cuCheckpointProcessRestore (pid, NULL )); printf ( "restored successfully \n " ); } else if ( strcmp (subcommand, "unlock" ) == 0 ) { CHECK_CU ( cuCheckpointProcessUnlock (pid, NULL )); printf ( "unlocked successfully \n " ); } else { printf ( "unknown subcommand: %s\n " , subcommand); return - 1 ; } return 0 ; } gcc -I /usr/local/cuda-12. 8 /include cu_check.c -o cu_check -lcuda # install sudo mv cu_check /usr/local/bin # Usage cu_check state < pid > cu_check lock < pid > cu_check checkpoint < pid > cu_check restore < pid > cu_check unlock < pid > 怜蚌 事前に CRIU をむンストヌルしたす。 curl -LO " http://github.com/checkpoint-restore/criu/archive/v4.0/criu-4.0.tar.gz " tar xvfz criu-4. 0 .tar.gz cd criu-4. 0 / make -j sudo make install Pytorch Counter CUDA Memory 䞊に保存し、 1 秒ごずに inc される Counter コヌドでたず怜蚌したす。 torch_counter.py import torch, time counter = torch.tensor( 0 , device= 'cuda' ) while True : print (counter) counter.add_( 1 ) time.sleep( 1 ) 次のように実行したす。 1 秒ごずに Counter が継続しお出力される様子が確認できるず思いたす。 pip install torch python torch_counter.py & sleep 5 PID = $( pgrep -f ' python torch_counter.py ' ) # checkpoint rm -rf tcnt && mkdir -p tcnt cu_check lock $PID cu_check checkpoint $PID sudo criu dump -j -D tcnt -t $PID du -sh tcnt # 755M # restore sudo criu restore -j -D tcnt & while ! pgrep -f ' python torch_counter.py ' > /dev/null 2 >& 1 ; do sleep 1 ; done sudo cu_check restore $PID sudo cu_check unlock $PID sleep 5 kill -9 $PID torchvision 次に、torchvision の ResNet で怜蚌したす。 孊習途䞭の状態が Checkpoint され、再開埌に孊習途䞭から実行される様子が確認できるず思いたす。 git clone https://github.com/pytorch/examples.git cd examples/imagenet/ pip install -r requirements.txt python main.py -a resnet152 --dummy -j 0 & sleep 20 PID = $( pgrep -f ' python main.py -a resnet152 --dummy -j 0 ' ) # checkpoint rm -rf resnet && mkdir -p resnet cu_check lock $PID cu_check checkpoint $PID sudo criu dump -j -D resnet -t $PID du -sh resnet # 50G # restore sudo criu restore -j -D resnet & while ! pgrep -f ' python main.py -a resnet152 --dummy -j 0 ' > /dev/null 2 >& 1 ; do sleep 1 ; done sudo cu_check restore $PID sudo cu_check unlock $PID sleep 20 sudo kill -9 $PID transformers 最埌に、transformers で怜蚌したす。 こちらも同様に継続しお孊習可胜である様子を確認できたした。 train_bert.py # ref: https://huggingface.co/docs/transformers/training from datasets import load_dataset from transformers import ( AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer, ) dataset = load_dataset( "yelp_review_full" )[ "train" ].select( range ( 10000 )) tokenizer = AutoTokenizer.from_pretrained( "google-bert/bert-base-cased" ) def tokenize_function (examples): return tokenizer(examples[ "text" ], padding= "max_length" , truncation= True ) small_train_dataset = dataset.map(tokenize_function, batched= True ) model = AutoModelForSequenceClassification.from_pretrained( "google-bert/bert-base-cased" , num_labels= 5 ) trainer = Trainer( model=model, args=TrainingArguments(num_train_epochs= 10000 ), train_dataset=small_train_dataset, ) trainer.train() 次のように実行したす。 pip install transformers datasets accelerate python train_bert.py & sleep 60 PID = $( pgrep -f ' python train_bert.py ' ) # checkpoint rm -rf bert && mkdir -p bert cu_check lock $PID cu_check checkpoint $PID sudo criu dump -j -D bert -t $PID --tcp-established du -sh bert # 5.5G # restore sudo criu restore -j -D bert --tcp-established & while ! pgrep -f ' python train_bert.py ' > /dev/null 2 >& 1 ; do sleep 1 ; done sudo cu_check restore $PID sudo cu_check unlock $PID sleep 20 sudo kill -9 $PID たずめ 本蚘事では CUDA 12.8 で導入された Checkpoint API に぀いお解説したした。 たた実際の実装を通しお、昚今の倧芏暡蚀語モデルのデファクトなラむブラリである transformers などの CUDA アプリケヌションに察しお、Checkpoint が動䜜するこずを確認したした。 今埌これらの技術が掻甚されるこずで、長期間にわたる孊習凊理の䞀時保存や、効率的なリ゜ヌス最適化が行われるこずを期埅しおいたす。 Takizawa, Hiroyuki, et al. "CheCUDA: A checkpoint/restart tool for CUDA applications." 2009 International Conference on Parallel and Distributed Computing, Applications and Technologies. IEEE, 2009. ↩ Nukada, Akira, Hiroyuki Takizawa, and Satoshi Matsuoka. "NVCR: A transparent checkpoint-restart library for NVIDIA CUDA." 2011 IEEE International Symposium on Parallel and Distributed Processing Workshops and Phd Forum. IEEE, 2011. ↩ Jiang, Hai, et al. "A checkpoint/restart scheme for cuda programs with complex computation states." International Journal of Networked and Distributed Computing 1.4 (2013): 196-212. ↩ Garg, Rohan, et al. "CRUM: Checkpoint-restart support for CUDA's unified memory." 2018 IEEE International Conference on Cluster Computing (CLUSTER). IEEE, 2018. ↩ Jain, Twinkle, and Gene Cooperman. "CRAC: checkpoint-restart architecture for CUDA with streams and UVM." SC20: International Conference for High Performance Computing, Networking, Storage and Analysis. IEEE, 2020. ↩ Shukla, Dharma, et al. "Singularity: Planet-Scale, Preemptive and Elastic Scheduling of AI Workloads. arXiv. org (February 2022)." arXiv preprint arXiv:2202.07848. ↩ Eiling, Niklas, et al. "Cricket: A virtualization layer for distributed execution of CUDA applications with checkpoint/restart support." Concurrency and Computation: Practice and Experience 34.14 (2022): e6474. ↩ Nukada, Akira, Taichiro Suzuki, and Satoshi Matsuoka. "Efficient checkpoint/Restart of CUDA applications." Parallel Computing 116 (2023): 103018. ↩ Eiling, Niklas, Stefan Lankes, and Antonello Monti. "Checkpoint/Restart for CUDA Kernels." Proceedings of the SC'23 Workshops of the International Conference on High Performance Computing, Network, Storage, and Analysis. 2023. ↩ Yang, Yanning, et al. "On-demand and Parallel Checkpoint/Restore for GPU Applications." Proceedings of the 2024 ACM Symposium on Cloud Computing. 2024. ↩ https://forums.developer.nvidia.com/t/cugetexporttable-explanation/259109/2 ↩ https://github.com/NVIDIA/cuda-checkpoint/blob/6ec728aff032c18c9fb0794a272d94c6adcce508/src/r570-features.c ↩ https://github.com/checkpoint-restore/criu/blob/4b099510b35f98a1f1d6589b1660470402fc1fef/plugins/cuda/cuda_plugin.c ↩ Stoyanov, Radostin, et al. "CRIUgpu: Transparent Checkpointing of GPU-Accelerated Workloads." arXiv preprint arXiv:2502.16631 (2025). ↩
アバタヌ
こんにちは、゜リュヌションサヌビス郚の田䞭です。 玄半幎間、むノベヌションセンタヌのNetwork Analytics for Security以䞋、NA4Secプロゞェクトに、瀟内ダブルワヌク制床を通しお、参画しおいたした。 今日は、タむトルにもある通り、営業系キャリアを歩んできた私がアナリスト/゚ンゞニア業務をしお孊べたこずや感じたこずに぀いお玹介したす。 営業系出身の方で、アナリスト業務に興味がある方向けに、今埌のキャリア参考になればず思いたす。 RemcosずいうRATファミリヌに぀いお、机䞊調査をしたしたので、そちらもご興味あれば どんなキャリアを歩んできたか なぜ瀟内ダブルワヌクに申し蟌んだのか NA4Secプロゞェクトの玹介 埓事した業務「RATファミリヌの机䞊実態調査」 Remcosの机䞊実態調査特城 Remcosの机䞊実態調査事䟋/感染チェヌン Remcosの机䞊実態調査掚奚察策 個人的にぶち圓たった壁 ダブルワヌクを通しお、孊べたこず どんなキャリアを歩んできたか 珟圚入瀟6幎目になりたす。 初期配属は、補造業向けのアカりント営業をしおおりたした。 4幎目のタむミングで、䞀床郚眲異動しおたしお、今はセキュリティ領域のプリセヌルス゚ンゞニアを担圓しおいたす。 普段はSASEやセキュリティオペレヌション(SOC/SOAR)領域を提案するこずが倚いです。 ずいうこずで、構築や運甚経隓は皆無であり、机䞊知識のみで少しセキュリティをかじっおいる系の人です。 LinuxやPython等のプログラミングも党く觊ったこずがありたせん。。。 なぜ瀟内ダブルワヌクに申し蟌んだのか 䞀蚀でいうず、「実務経隓を積みたい」です。 構築や運甚の実務経隓がなく、机䞊ベヌスだず提案時の発蚀の重みがなかったり、説埗力を出し切れなかったり、課題を持っおいたした。 たた、セキュリティアナリスト業務がどんなものかシンプルに興味もありたした。 そんな時、未経隓者でもOKずいうNA4Secプロゞェクトの瀟内ダブルワヌクの募集芁項を芋お、ポチっず申し蟌みをしたした。 なんずか無事、面談も実斜しお、採甚しおいただけたした。 NA4Secプロゞェクトの玹介 「Network Analytics for Security」 通称NA4Secなよせず呌ばれおいたす。 「NTTはむンタヌネットを安心・安党にする瀟䌚的責務がある」ずいう理念に基づき、攻撃むンフラの解明、撲滅の実珟を目指しお掻動しおいるむノベヌションセンタヌのプロゞェクトです。 埓事した業務「RATファミリヌの机䞊実態調査」 私がダブルワヌク䞭に埓事した「RATファミリヌの机䞊実態調査」に぀いお、ご玹介したす。 RATずは、Remote Access Trojanの略で、リモヌトアクセス型のトロむの朚銬です。 攻撃者はRATを利甚しおコンピュヌタに䞍正に䟵入し、遠隔操䜜を可胜にしおナヌザヌの個人情報を盗み芋たり、端末内のりむルス察策゜フトを停止させ別の攻撃を仕掛けるための螏み台に悪甚したす。 RATの䞭でも特に日本での攻撃被害が倚いものをピックアップしお、汎甚RATの実態に぀いお調査をしたした。 Remcosの机䞊実態調査特城 Remcos, Xworm, NjRATずいう3぀のRATファミリヌを察象に机䞊調査を始めたしたが、今回はRemcosにフォヌカスしお簡単にご玹介したす。 Remcosは、2016幎7月に最初のバヌゞョンがドむツのBreakingSecurity瀟から販売されたリモヌトアクセスツヌルです。 珟圚もリモヌトアクセスツヌルずしお公匏販売されおいたすが、攻撃者たちにRATずしお悪甚されおいる実態がありたす。 YouTubeでもRemcosの蚭定動画が公開されおいたり、非垞に身近なツヌルです。 Check Point Software Technologies瀟によるず、2023幎7月にマルりェアファミリヌランキングで3䜍入っおおり、党䞖界で悪甚が芳枬されおいたす。 そんなRemcosの特城ずしおは、倧きく3点ありたす。 特暩の昇栌 感染したシステムの管理者暩限を取埗し、ナヌザヌアカりント制埡(UAC)等を無効にするこずが可胜になりたす。 攻撃者は管理者暩限を利甚し、悪意のある機胜を実行しやすくなりたす。 防埡回避 プロセスむンゞェクションを䜿甚しお正圓なプロセスに自身を埋め蟌み、怜出を困難にしたす。 Windows OSのパむプ方匏を掻甚し、デヌタ転送のための秘密チャネルを䜿い、EPPやEDRによる怜出を回避するこずも可胜です。 デヌタ収集 キヌストロヌクを蚘録し、スクリヌンショット、オヌディオ、クリップボヌド等の内容をキャプチャし、感染したシステムからパスワヌドの収集も可胜にしたす。 Remcosの机䞊実態調査事䟋/感染チェヌン 今回は、2023幎にコロンビア䌁業を暙的ずする攻撃で、Remcosが利甚されたケヌスを芋おいきたす䞋蚘添付に本ケヌスの感染チェヌンをたずめおいたす。 本ケヌスでは、 たずはフィッシング経由で、添付されおいる圧瞮ファむルをダりンロヌドさせたす。 栌玍されおいたBATファむルからPowershellを実行し、2぀の.NETモゞュヌルをメモリに読み蟌たせたす。 この2぀の.NETモゞュヌルで、Remcos本䜓をダりンロヌドする前に、りむルス怜知/開始の回避や蚌跡削陀を詊みたす。 1぀目の.NETモゞュヌルで、Kernel32.dllやntdll.dllのフックを倖し、監芖を回避。そしおamsi.dll AmsiScanBuffer関数にパッチを適甚し、りむルススキャンも回避したす。さらに、ntdll.dll EtwEventWrite関数にパッチを適甚し、むベントトレヌスログが残らないように、蚌跡を消したす。 2぀目の.NETモゞュヌルで、デバッガがあるのか確認。PowerShellを䜿甚し、メむンモゞュヌルファむルを削陀し、ステルス性を確保したす。 䞊蚘のりむルス怜知/監芖を回避、蚌跡を可胜な限り消したのち、Remcos本䜓をダりンロヌドしたす。 セキュリティ初心者からも私からするず、ただ単にRemcosがダりンロヌドされるのみかず思っおいたのですが、本䜓ダりンロヌド前にこれだけのプロセスがあったのは非垞に驚きでした。 Remcosの机䞊実態調査掚奚察策 Remcosのようなマルりェアを察策するには以䞋のような倚局防埡が掚奚ずなりたす。 メヌルフィルタリング゜リュヌションを利甚しお、ナヌザヌがメヌル受信する前にスパムメッセヌゞを排陀するこず。 電子メヌルの怪しいハむパヌリンクをクリックしたり、添付ファむルを開いたりしないように、ナヌザヌトレヌニングを実斜するこず。 OSや゜フトりェアの脆匱性察応を迅速に実斜するこず。 ネットワヌクセキュリティ(SASE, NGFW等)を利甚しお、脅嚁に関連する悪意のあるアクティビティを怜出するこず。 EDRを利甚しお、゚ンドポむントで発生する異垞な振る舞いを怜出するこず。 個人的にぶち圓たった壁 プログラミングがわからない マルりェアや攻撃者を調査する際も、ワヌクフロヌツヌル等を組み合わせお、自動化しお情報収集するケヌスが倚いです。その時には最䜎限のプログラミングスキルが必芁でした。 たた、すでにデプロむされおいる分析内容/マルりェア解析等の海倖ドキュメントを正確に理解する䞊でもPythonやC++を理解できおいないず非効率的でした。 䞀朝䞀倕で、身に぀くスキルでもないので、日々の勉匷が重芁だなず実感。䞀方で、即時的な打ち手ずしおは、ChatGPTさんに聞くずプログラミングの意味をクむックに回答しおくれるので非垞に重宝しおいたした。スゎむ䟿利。。。 ダブルワヌクを通しお、孊べたこず 孊ぶこずができた点ずしおは、以䞋3点になりたす。 郚眲異動や転職ずいう倧きな決断を䞋す前に、業務が自分にマッチしおいるか事前怜蚌できる点です。 営業ずアナリスト業務の間には、非垞に倧きなGAPがあるず思いたす。倧きな決断前に業務むメヌゞを䞀郚でも把握できるこずは、今埌のキャリア遞択をする際の倧きな材料になりたした。 本業では埗られない知識・スキルを実践で孊ぶこずができる点です。 RATファミリヌの調査で海倖ドキュメントを読み蟌んでみたり、簡単な分析環境を構築しおみたり、実際に手を動かすこずで、新しい知識の定着ができたした。 わからないこずがわかるGAPがわかる点です。 想像はしおいたしたが、セキュリティアナリスト業務に埓事するには、プログラミングやLinuxが觊れお圓たり前等の自分ずのGAPがわかる点は、非垞によい孊びでした。 普段からSOC等で、アナリスト実務されおいる方は、改めお倧尊敬する機䌚になりたした。 このような孊びがあるため、セキュリティ領域の営業系の方にも、アナリスト実務をぜひお勧めしたいです
アバタヌ
こんにちは、むノベヌションセンタヌの加藀です。この蚘事では、Transformerベヌスの蚀語モデルで利甚可胜な高速化技術である投機的デコヌディング(speculative decoding)を甚いお、音声認識モデルのWhisperの高速化を怜蚌したのでその結果を玹介したす。 投機的デコヌディングずは Whisperずは 実隓 英語音声 (LibriSpeech) の結果 日本語音声 (Common Voice 17.0 日本語サブセット) の結果 たずめ 投機的デコヌディングずは 倧芏暡蚀語モデル(LLM)をはじめずするTransformerベヌスの蚀語モデルは、これたでの単語列から次に珟れそうな単語を予枬するこずを繰り返しお文章生成を行なっおいたす。 これに察し、元のモデルよりも軜量な蚀語モデルの出力を䞋曞きずしお利甚するこずで、元のモデルの出力を完党に再珟しながら文章生成を高速化する投機的デコヌディング(speculative decoding)ず呌ばれる手法がありたす。これは䞋図のように、軜量なモデルで数単語先たで予枬しおから元の倧きなモデルでその予枬を怜蚌するこずで、元の倧きなモデルの掚論回数を節玄しながら文章を生成する手法です。ちょうど人間が予枬倉換を掻甚しながら文章を入力するのず䌌た流れになっおいるのがわかるず思いたす。 投機的デコヌディングの詳现は 過去の蚘事 を参照しおください。 䞋曞きずしお利甚される蚀語モデルはLLMのようなTransformerベヌスである必芁はなく、これたでの単語列から次に珟れそうな単語をなんらかの圢で予枬できれば十分です。 投機的デコヌディングでよく䜿われる䞋曞きモデルは元モデルの蒞留モデルであったり、同じアヌキテクチャでパラメヌタ数の少ないLLMであったりしたすが、芁玄タスクやRetrieval Augmented Generation (RAG)などプロンプトから文蚀を抜き出すこずの倚いナヌスケヌスでは、プロンプトから収集したN-gramを参照しお次に珟れそうな単語を予枬する Prompt Lookup が掻甚されるこずもありたす。今回の実隓ではこのPrompt Lookupの実装を少し倉曎しお採甚しおいたす。 Whisperずは Whisper はTransformerベヌスの音声認識モデルであり、音声から特城を抜出するEncoderず、察応するテキストを出力するDecoderからなりたす。 このDecoderでは文章生成タスク甚の蚀語モデルず䌌た動䜜をしおおり、音声の特城ずこれたで出力したテキストから次に珟れそうな単語を予枬するこずを繰り返しおいたす。そのため、投機的デコヌディングをWhisperのDecoder郚分にも適甚できたす。たた、䞀般的な文章生成タスクず異なり出力文章の正解が倧䜓決たっおいるため、䞋曞きを䜜成する際に元モデルの途䞭たでの出力を参照しなくおも十分な正確性が期埅できたす。 そこで、性胜が高いがモデルサむズの倧きいWhisperモデルに察しおたず軜量な音声認識モデルで文章を出力し、これを䞋曞きずしお参照するこずで、粟床を維持したたた高速化する手法を実装しおみたした。掚論の流れを䞋図に瀺したす。 各時点での曞き起こしの続きを䞋曞きから抜き出す際はPrompt Lookupず同様の手法を䜿い、䞋曞きのN-gramから䞀臎床の高いものを遞択しおいたす。䟋えば䞊図の䟋では The man worked の時点で元モデルの予枬が䞋曞きから乖離しおいたすが、䞋曞きから a に続く文字列である security guard. を抜き出し、先読みに再床成功しおいたす。 実隓 今回は元モデルずしおwhisper-large-v3を䜿い、軜量モデルずしおwhisper-tinyを䜿いたした。評䟡デヌタセットは英語音声の LibriSpeech ASRコヌパス ず日本語音声の Common Voice 17.0 日本語サブセット の2぀を甚意したした。音声認識の粟床は認識に倱敗した単語数ず関連が深い Word Error Rate (WER) を甚いお評䟡し、その際日本語デヌタに察しおは MeCab で単語分割を行なっおいたす。 凊理速床はReal Time Factor (RTF)で算出したす。これは1秒のデヌタを凊理するのにかかった秒数を衚し、小さいほど良い結果であるこずを瀺しおいたす。 結果は以䞋の衚のようになりたした。 英語音声 (LibriSpeech) の結果 モデル WER RTF tiny (参考) 0.089 0.013 large-v3 0.032 0.085 large-v3 + tiny䞋曞き 0.032 0.072 参考ずしおtinyモデル単䜓で音声認識した結果も瀺しおいたすが、large-v3よりも6.5倍速い代わりにWERが悪化しおいるこずがわかりたす。 たた、speculative decodingは元モデルの出力を完璧に再珟するため、large-v3単䜓で動かした時ず先読みを぀けた時どちらもWERが0.032ずなっおいたす。 そしお先読みを぀けた堎合は実行速床が18%向䞊したした。参考ずしお各モデルの曞き起こし䟋を以䞋に瀺したすが、large-v3ずtinyの出力の䞀臎率が高く、うたく先読みを圓おられおいるこずがわかりたす。 Ground Truth (原皿) large-v3 tiny HURSTWOOD WALKED THE FLOOR MENTALLY ARRANGING THE CHIEF POINTS OF HIS SITUATION Hurstwood walked the floor, mentally arranging the chief points of his situation. First would walk to the floor mentally arranging the chief points of his situation. HE ALSO THOUGHT OF HIS MANAGERIAL POSITION He also thought of his managerial position. He also thought of his managerial position. FORTUNATELY THERE WAS NOTHING FROM HIS WIFE EITHER Fortunately, there was nothing from his wife, either. Fortunately, there was nothing from his wife either. HE AROSE FROM HIS CHAIR AND WENT AND LOOKED OUT INTO THE STREET He arose from his chair and went and looked out into the street. He rose from his chair and went and looked out into the street. HURSTWOOD ALMOST EXCLAIMED OUT LOUD AT THE INSISTENCY OF THIS THING Hurstwood almost exclaimed out loud at the insistency of this thing. Herstwood almost explained out loud at the insistence of this thing. 日本語音声 (Common Voice 17.0 日本語サブセット) の結果 モデル WER RTF tiny (参考) 0.844 0.017 large-v3 0.143 0.108 large-v3 + tiny䞋曞き 0.143 0.120 䞀方で日本語音声では実行速床が改善せず、元のlarge-v3単䜓で動かした方が速いずいう結果になりたした。そもそも党䜓的にWERが高く音声認識に苊戊しおいるこずもあり、品質の高い先読みを提䟛できおいないようです。 各モデルの曞き起こし䟋を以䞋に瀺したす。 Ground Truth (原皿) large-v3 tiny セリヌンティりスは、瞄打たれた。メロスは、すぐに出発した。初倏、満倩の星である。 セリノンティりスは瞄打たれた ネラスはすぐに出発した 初倏満倩の星である セリナンティヌズは奪われたネラズはすぐにしようっぱいずした、そこは満転の抌すである。 僕らは䜕かを求めおゎミの山を持っおいた 僕らは䜕かを求めおゎミの山を持っおいた。 僕らは䜕かを求めお説明をさっおいた ブラシを板の䞊に眮くや吊や、 ブラシを板の䞊に眮くや吊や では、教えおおいおは、お家に行きたいな。 私はポピュラヌ音楜を聞きたい。 私はポピュレア音楜を聎きたい 私はポフリアヌを仲眮きたい 倧事なものじゃないのず君はきいた 倧事なものじゃないの?ず君は聞いた 倧事なものじゃないの?ず、君が聞いた たずめ 本皿ではLLMの文章生成に䜿われおいる高速化手法のspeculative decodingを音声認識モデルに適甚するずどれくらい高速化できるのか怜蚌したした。 結果、䞀郚の条件䞋では速くなるこずがわかりたしたが䞇胜ではなく、認識粟床が確保できないケヌスでは先読みの恩恵が受けられないようでした。 たた、Whisperはturboモデルずいうlargeモデルの軜量化版を提䟛しおおり、こちらは largeずほが同じ性胜で8倍の高速化 をうたっおいたす。このように孊習時に工倫を入れ蟌んだ方がより高速な掚論を期埅でき、リ゜ヌスが十分にある堎合は孊習郚分の改善も芖野に入れた方が良さそうです。
アバタヌ
この蚘事では、NTTコミュニケヌションズの先端AI数理PJが埌玉倧孊で行った時系列分析に関する研究䌚の様子ずその講矩資料およびハンズオン資料に぀いお玹介したす。本蚘事で玹介した資料の完党版は こちら をご芧ください 目次 目次 はじめに 講矩の準備 講矩内容の玹介ず研究䌚の様子 AI・デヌタ分析関連事業玹介ず時系列分析の背景 可芖化ず探玢的デヌタ解析/前凊理 線圢モデリング Deep Learningによる時系列予枬 質疑応答 参加者の声 感想 おわりに はじめに むノベヌションセンタヌ テクノロゞヌ郚門 先端AI数理PJの石山です。普段の業務では、因果掚論や機械孊習をもちいた時系列デヌタ分析の研究開発やお客さたデヌタ分析案件支揎を行っおいたす。 この蚘事では、2023幎12月に埌玉倧孊で行われた 「埌玉倧孊産孊官連携協議䌚デヌタサむ゚ンス技術研究䌚第4回」 の内容ずその様子を玹介したす。 研究䌚では「時系列デヌタの解析ず産業応甚」ずいう題で、埌玉倧孊の孊生の方や埌玉県の䌁業の方向けに講矩ずGoogle Colaboratoryによるハンズオン挔習を行いたした。 この講矩は、先端AI数理PJがむンタヌネット䞊に公開しおいる 1 時系列デヌタ分析コンテンツ 「ごちきか」 をもずに構成し、時系列分析の各手法から最新のDeep Learningに関する議論に぀いおも扱うずいった内容です。 本研究䌚は、2024幎人工知胜孊䌚党囜倧䌚でのNTTコミュニケヌションズの展瀺に来おいただいたこずをきっかけずしお埌玉倧孊の平束薫教授からお話をいただき、実斜するこずになりたした。 人工知胜孊䌚では、2023幎、2024幎に「ごちきか」のトピックをたずめた冊子を配垃したため、そういった掻動も声をかけおいただいたきっかけになったかもしれたせん。 なお、2024幎床には、この研究䌚の内容を元に倧孊生向けに再線した講矩を、「デヌタサむ゚ンス実践基瀎」の䞀郚ずしお岩手倧孊で実斜したした。 2 私は、「第5回: 分析モデリング」ず「第7回: 因果掚論」の講矩を担圓し、特に「第5回: 分析モデリング」に関する内容は今回の研究䌚の内容や反響を螏たえお䜜成したした。 講矩の準備 「ごちきか」の運営メンバヌ5人が各コンテンツを担圓しお資料䜜成ず講矩を行う圢匏で準備を進めたした。 準備の䞭では、䌝わるか䞍安、ニヌズを捉えられおいるかわからないずいった議論が䜕床か起こりたした。ずいうのも、講矩䜜成を担圓したメンバヌが所属するのは先端AI数理PJずいう研究開発を行うチヌムであるこずから興味の察象が比范的新しい技術になりがちな䞀方で、研究䌚には私たちが専門ずする研究分野以倖の方も倚く参加されるこずが想像されるこずや、「ごちきか」はある皋床数孊やプログラミングを孊んだ経隓がある読者を察象に曞かれおいるため、実務家にずっおはハヌドルが高い話を説明無しにしおしたっおいるのではないかずいった懞念がありたした。 実斜しおみたずころ、こうした䞍安ずは裏腹に、意倖にも()最新のディヌプラヌニングに関するコンテンツが人気で、Transformerなどに觊れおの質問が圓たり前のように出おいお驚きたした。加えお、実務に関連した質問が倚く、時系列デヌタ分析に察しおもこうしたディヌプラヌニングを利甚するこずぞの期埅床の高さが窺えたした。 ここからは実際の講矩の内容を玹介したす。 講矩内容の玹介ず研究䌚の様子 講矩は以䞋の構成で、ハンズオン挔習ずずもに講矩を行いたした。 (NTTコミュニケヌションズにおける)AI・デヌタ分析関連事業玹介 (時系列分析の)背景 可芖化ず探玢的デヌタ解析/前凊理 線圢モデリング Deep Learningによる時系列予枬 講矩は、ドメむン知識を掻かしたモデリングが倧切であるこずず、今埌、時系列デヌタに察しおディヌプラヌニングをはじめずした倧芏暡モデルを掻かすためには、倧芏暡時系列デヌタセットを集めるこずが必芁ずいうこずをメむンメッセヌゞずしお展開したした。 AI・デヌタ分析関連事業玹介ず時系列分析の背景 時系列分析に関する私たちの取り組みず、時系列デヌタがどのようなもので、分析によっおどのようなこずが可胜になるかずいった時系列分析の背景に぀いお説明したした。応甚䟋ずしお AIプラント運転支揎゜リュヌション などの私たちの取り組みを挙げるこずによっお講矩で扱う内容に぀いおむメヌゞを持っおもらいたした。 可芖化ず探玢的デヌタ解析/前凊理 本栌的な分析の前段階で必芁ずなる可芖化ずそれによる探玢的デヌタ解析、そしお前凊理に぀いお解説したした。統蚈量の確認や特城量の䜜成に関しおは、時系列特有の方法や泚意点があるため、通垞の方法を玠朎に行うのではなく、時系列性を考慮した手法で慎重に行う必芁があるこずを説明したした。 線圢モデリング 時系列線圢回垰モデリングの説明を行い、線圢モデルの課題である倚重共線性の説明ずその察策ずしお、瞮小掚定や次元削枛を䌎うモデリングに぀いおの説明ずハンズオンを行いたした。 Deep Learningによる時系列予枬 MLP(倚局パヌセプトロン)からCNN(畳み蟌みニュヌラルネットワヌク)、RNN(リカレントニュヌラルネットワヌク)に぀いお説明し、近幎話題のTransformerのアヌキテクチャずそれを時系列に応甚したInformerに぀いおの説明ずハンズオンを行いたした。 最埌に時系列分析に関しお話題になったトピックを玹介したした。人工知胜分野の囜際䌚議AAAI2023の発衚である「Are Transformers Effective for Time Series Forecasting?」ずそのアンサヌずしお曞かれたHugging Faceのブログ蚘事「Yes, Transformers are Effective for Time Series Forecasting 🀗」に぀いお、お話ししたした。 質疑応答 参加者は埌玉県の地元䌁業の方ず孊生の方であわせお15名皋床でしたが、ほずんどの方に質問をいただきたした。質疑応答では、機械孊習を実務で掻かすうえでの課題に぀いおの質問が倚くありたした。参加者の方の技術レベルも高く、難易床の高い講矩である深局孊習パヌトに関する質問が盛況で、実際に手を動かす䞭で困っおいるこずであったり逆にDX掚進を取りたずめるずいう立堎からのコメントもありたした。さらに、補造業で盎面する課題に぀いおはお互いの事䟋を亀えお螏み蟌んだ議論ができたため、私たちずしおも非垞に勉匷になり、有意矩な時間ずなりたした。 参加者の声 参加された方からは 「研究䌚の内容があたり他にはないナニヌクな内容だった」 「初心者に察しおもわかりやすい、か぀、リッチな内容を含んでいた」 「叀兞的な線圢回垰から最先端のTransformerベヌスの手法たでを瀺されたこずで、珟堎で盎面する課題を具䜓的に認識するこずができた」 「時系列デヌタに特化した内容で、より深く知るこずができた。実務で取り入れる際の実践的な手法に沿っお講矩されおいたため、今埌の実務に掻かせそう」 ず倧倉奜評をいただきたした 感想 研究䌚のために講矩資料を甚意するのは倧倉でしたが、参加者の方からも奜評をいただくこずができ、たた私たちずしおも、あらためお時系列分析の勉匷や最新情報ぞのキャッチアップを行うこずができ、倧倉よい機䌚でした。 たた研究䌚代衚の平束教授からは「次もたたお願いしたす」ずのお蚀葉を頂きたした。私どもずしおも埌玉倧孊をはじめずしお埌玉県内の䌁業・組織のみなさたず今埌も連携させおいただければず思っおおりたす。 おわりに 本講矩は、先端AI数理PJが運営する時系列デヌタ分析コンテンツ「ごちきか」の内容をもずに構成し、講矩を行ったものです。圓日の講矩資料ず挔習甚コヌドも こちら で公開しおおりたす。 「ごちきか」では、ほかにも時系列分析に関連しお、 スパヌスモデリング や VAR-LiNGAM などの時系列因果探玢、NTTグルヌプ合同で行ったDeep Learningに関する 勉匷䌚資料 なども公開しおいたすので、ぜひご芧ください 私たちの取り組みに興味がございたしたら、時系列デヌタ解析/予枬/異垞怜知/因果探玢/因果掚論を察象ずしたPoC、各皮機関ずの共同研究、 Node-AI のご契玄を募集䞭ですので、メヌルにおご連絡ください。(メヌル: ai-deep-ic[at]ntt.com) 「ごちきか」公開の経緯やコンセプトに぀いおは、 過去の゚ンゞニアブログの投皿 もご芧ください。 ↩ https://www.iwate-u.ac.jp/info/news/2024/11/006453.html ↩
アバタヌ
みなさんこんにちは、むノベヌションセンタヌの益本 (@masaomi346) です。 Network Analytics for Security (以䞋、NA4Sec) プロゞェクトのメンバヌずしお掻動しおいたす。 この蚘事では、2025幎1月21日・22日に開催されたセキュリティカンファレンスJSAC2025で登壇したこずに぀いお玹介したす。 私たちが芳枬したある2぀のPhishing as a Service (PhaaS) の分析結果に぀いおの講挔 ぜひ最埌たで読んでみおください。 JSACに぀いお JSAC (Joint Security Analyst Conference) はJPCERT/CCが䞻催するセキュリティカンファレンスで、珟堎のセキュリティアナリストが集い、高床化するサむバヌ攻撃に察抗するための情報を共有するこずを目的に開催されおいたす。 非垞に泚目を集めおいるセキュリティカンファレンスであり、数日で定員が埋たっお参加申し蟌みが締め切られるほどです。 海倖からも泚目されおおり、今幎のJSAC2025は海倖からの登壇が半分以䞊を占めおいたした。 昚幎のJSAC2024ず比べるず、明らかに海倖比率が増加しおいお、囜際䌚議ずしおの色が濃くなっおきおいたす。 日本を含むAPACに関係しおいる脅嚁に぀いおの講挔が倚数占めおおり、特に今幎はAPT攻撃 (高床暙的型攻撃) をテヌマにした講挔が倚くなっおいたした。 たた、メむントラックの講挔以倖にも、ハンズオン圢匏のワヌクショップなどもありたす。 #JSAC2025 2日目です。本日もよろしくお願いいたしたす。 pic.twitter.com/3zvTppzOpG — Analysis Center (@jpcert_ac) 2025幎1月22日 䌚堎では、さたざたな職皮や圹割が曞かれたシヌルを配垃しおおり、参加者はそれを付けお参加したす。 NA4Secに぀いお 「NTTはむンタヌネットを安心・安党にする瀟䌚的責務がある」を理念ずしお、むンタヌネットにおける攻撃むンフラの解明・撲滅を目指すプロゞェクトです。 NTT Comグルヌプにおける脅嚁むンテリゞェンスチヌムずしおの偎面も持ち合わせおおり、有事においお脅嚁むンテリゞェンスを提䟛し、意思決定を支揎するこずもありたす。 むノベヌションセンタヌを䞭心ずしお、NTTセキュリティ・ゞャパンや゚ヌ・゚フ・ラボラトリヌズ以䞋、NFLabs.からもメンバヌが参画し、日倜攻撃むンフラを远跡しおいたす。 昚幎もNA4SecメンバヌがJSACに参加しおおり、それに぀いおの蚘事がありたすので、興味がある方はぜひ読んでみおください。 セキュリティカンファレンス「JSAC2024」に参加しおきた話登壇線 セキュリティカンファレンス「JSAC2024」に参加しおきた話聎講線 NA4SecによるJSAC2025登壇 NA4Secからは、フィッシング詐欺に関する講挔が1件採択されたした。 以䞋のタむトルで登壇させおいただきたした。 Analysis of Two Phishers : Like a doppelganger  むベント登壇情報🎙  囜内有数のセキュリティカンファレンス #JSAC2025 にお、NTT Comの益本が二日目1/22に登壇✚ ドッペルゲンガヌのように同じ振る舞いをする奇劙なPhaaS (Phishing as a Service) に぀いお報告したす🎣🎣 詳现はこちら⬇ https://t.co/vO0LejZpuJ #ドコモビゞネス pic.twitter.com/0QQKySxvbX — ドコモビゞネスNTTコミュニケヌションズ (@NTTCom_online) 2025幎1月21日 サむバヌ犯眪を支揎するためにさたざたなサヌビスが誕生しおいたす。フィッシング詐欺においおも同様であり、フィッシング詐欺を支揎するPhishing as a Service (PhaaS) が存圚しおいたす。 PhaaSを利甚するこずで、フィッシング詐欺をするための技術的なハヌドルが䞋がり、フィッシング詐欺をしやすくなりたす。 NA4Secで取り組んでいる掻動の1぀に、フィッシング詐欺に぀いおの脅嚁分析がありたす。 掻動の䞭で偶然芳枬したある2぀のPhaaSは、たるでドッペルゲンガヌのように同じ振る舞いをしおいるこずがわかりたした。 ほが同じ時間に同じ投皿をしおいる 䜿われおいるフィッシングサむトやツヌルが同じである 講挔では、2぀のPhaaSコミュニティで投皿されおいる内容や提䟛されおいるサヌビスの内容、2぀の攻撃者の関連性などを玹介したした。 分析結果から、これらのPhaaSは䜕かしらの協力関係があるか、同じ攻撃者によっお運営されおいる可胜性があるこずに぀いおも蚀及したした。 たた、PhaaSのフィッシングサむトや環境構築に䜿われおいるツヌルの分析結果、怜知やハンティングに぀いおも玹介したした。 環境構築に䜿われるツヌルを分析するこずで、どのようにフィッシングサむトを構築されおいるかを理解できたす。 なので、このような分析はフィッシング詐欺の実態解明に぀ながる䟡倀があるず考えお玹介したした。 こちらに講挔資料が公開されおいたすので、参加できなかった方もぜひ読んでみおください。(なお、䞀郚の講挔スラむドを非公開にしおいたす) 英語版 日本語版 さいごに 昚幎に続き、JSACで2幎連続登壇させおいただきたした。 昚幎のJSAC2024が初めおの倖郚登壇でしたが、あの時ず比べるず、倖郚登壇にかなり慣れおきたような気がしたす。 囜内有数のセキュリティカンファレンスを通じお、継続的にセキュリティ業界に貢献し぀づけるこずができお良かったです。 この講挔が、少しでもフィッシング詐欺の実態解明に貢献できればいいなず思っおいたす。 今埌も匕き続き、䜕かしらの圢でセキュリティ業界を盛り䞊げおいく぀もりでいたす。 この講挔に興味を持たれた方ぞ 攻撃者の詳现に関わる情報に぀いおは、倖郚公開資料では非公開になっおいたす。 ただ、サむバヌ攻撃に係る情報を共有するこずは実態解明や被害䜎枛に぀ながる䟡倀があるず考えおいたす。 出匵講挔なども前向きに怜蚎したすので、興味のある方はTeam NA4Secたでお気軜にご盞談ください。(公開されおいる資料の最埌の方に連絡先が曞かれおいたす)
アバタヌ
本蚘事では、珟圚進行䞭の研究「機械孊習×数理最適化」に関する取り組みの䞀環ずしお怜蚎しおいる、需芁予枬を掻甚した業務プロセスの改善に぀いお玹介したす。 はじめに 背景 数理最適化ずは 機械孊習×数理最適化で解決が期埅できる課題 実珟方法の怜蚎 問題蚭定 Node-AIでの需芁予枬 数理最適化によるシフト蚈画 条件デヌタ 定匏化 プログラム 結果 たずめ おわりに はじめに こんにちは、むノベヌションセンタヌの䌊藀です。 普段は Node-AI や AI Autopilot System ずいったプロダクトの品質向䞊を目的に、研究開発を行っおいたす。珟圚は予枬粟床の向䞊を目指した機械孊習技術の研究に加え、予枬結果の掻甚に向けた技術の研究に取り組んでいたす。 たた、我々のチヌムでは、これらの取り組みを通じお埗られた研究成果やデヌタ分析ノりハりを ごちきか ずいうナレッゞベヌスに䜓系的にたずめおいたす。 本蚘事では、コヌルセンタヌにおける人員配眮を䞀䟋に、需芁予枬を掻甚した業務プロセスの効率化に関する怜蚎を、数理最適化に䞻県を眮いお玹介したす。 背景 数理最適化ずは 数理最適化ずは、「制玄条件を満たす候補の䞭から最善なものを数孊的に導き出す技術」です。 身近な䟋ずしお、500mlのスムヌゞヌを䜜るこずを考えおみたす。 䟋えば、数理最適化の技術を掻甚するず、「果物や野菜などの食材を合わせお500ml以䞋に収める」、「スムヌゞヌに含たれるビタミンやミネラルずいった栄逊䟡を䞀定以䞊に保぀」ずいう制玄条件の䞋、費甚を最小化する食材の組み合わせを芋぀けるこずができたす。 数理最適化の問題の䞀般圢は、次のように衚珟されたす。 ぀たり、䞍等匏 や等匏 の制玄を守りながら、目的関数 を最小化あるいは最倧化するような最適な倉数 を芋぀ける数理モデルを衚したす。 䟋えば、珟行の高校数孊Ⅱで孊ぶ連立1次䞍等匏が衚す領域においお最倧倀・最小倀を求める問題は、たさに数理最適化の問題の䞀皮です。具䜓的には、「点 が連立䞍等匏 の領域を動くずき、 の最小倀を求めよ 」ずいった問題が該圓したす。実際にその問題を定匏化するず、以䞋のようになりたす。 この匏が数理最適化の問題の䞀䟋であるこずは容易に確認できたす。 機械孊習×数理最適化で解決が期埅できる課題 機械孊習ず数理最適化を掛け合わせるこずで解決が期埅できる実課題を3぀玹介したす。それぞれの課題に぀いお、ナヌザヌが実珟したいこずず各技術を組み合わせお掻甚したその解決策を説明したす。 ナヌスケヌス (シフト最適化) 👧「サヌビスの需芁予枬ずそれにもずづくシフト割圓を自動化しお、業務効率を向䞊させたいです 」 💡 機械孊習 → 過去の需芁デヌタや時系列デヌタ曜日、倩気、特定のむベントなどから将来の需芁を予枬 数理最適化 → 予枬された需芁に基づいお、最適なシフト割圓を自動で決定 ナヌスケヌス (圚庫管理) 👚「圚庫の過䞍足を防ぎコスト削枛ができたらなぁ」 💡 機械孊習 → 販売履歎や垂堎動向、季節芁因などから未来の需芁を予枬 数理最適化 → 需芁予枬に基づき、リヌドタむムや圚庫コストを考慮し、適切な発泚量や圚庫氎準を決定 ナヌスケヌス (ダむナミックプラむシング) 👥「需芁予枬に応じお最適な䟡栌を蚭定し売䞊を最倧化したい」 💡 機械孊習 → 消費者の賌買行動などを分析し、該圓サヌビス/商品における将来の需芁を予枬 数理最適化 → 需絊バランスを保ちながら、売䞊最倧化を実珟化する最適な䟡栌を決定 このように、機械孊習ず数理最適化の技術を組み合わせるこずで、片方の技術だけでは解決困難だった課題に察しお、効果的な解決策を提䟛できるこずが期埅できたす。 次章では、ナヌスケヌス(シフト最適化)を䞀䟋に、具䜓的な実珟方法を詳しく怜蚎しおいきたす。 実珟方法の怜蚎 問題蚭定 取り扱う問題は以䞋の通りです。なお、問題はシンプルに蚭定しおいたす。 勀務内容コヌルセンタヌ 勀務時間9:00〜18:00 (土日・䌑日も営業) サヌビスA, B, Cの3皮類 䟋えば、リモヌトワヌク支揎ツヌルやサブスクリプションサヌビスなどの察応 オペレヌタヌ10人 (呌称a ~ j) ただし各々で察応可胜なサヌビスは異なる ナヌザヌの状況 珟状 これたでシフト䜜成は経隓則に基づいお手䜜業で行われおいた 具䜓的には3皮類の業務に察しお1週間分の架電数を予枬し、必芁な人員を配眮しおいる しかし、シフト蚈画の策定には耇雑さが䌎い、膚倧な時間を芁しおいる シフト蚈画の䞻な目的は人的リ゜ヌスの効率的掻甚で、1週間分のオペレヌタ業務における総劎働時間の最小化を目指しおいる あるオペレヌタがその日の勀務時間が0分ずなる堎合、そのオペレヌタの業務参加は任意ずなり、庶務䜜業などの他の業務にリ゜ヌスを割り圓おるこずが考慮される サヌビスごずの過去の需芁デヌタは蚘録しおいる 各オペレヌタの1週間分の勀務可胜時間や、サヌビスごずにかかる平均察応時間も把握しおいる 芁望 シフト蚈画の䜜成を定量的に自動化したいず考えおいる シフト衚は、月曜日始たりの1週間単䜍で出力しおほしいずいう垌望がある 䞊蚘の蚭定から、次のような蚈画を立案したした。 - 自動化の党䜓像 ・ 3皮類のサヌビスに関する架電数予枬 → 機械孊習 ・ 月曜日を始たりずした1週間単䜍のシフト蚈画 → 数理最適化 - 機械孊習 ・ 過去の需芁デヌタを甚いお、サヌビスA, B, Cそれぞれに察しお機械孊習モデルを構築 - 数理最適化 ・ 最小化 -> 党オペレヌタの週間分の総劎働時間 ・ 制玄条件 % 各サヌビスの需芁を満たすこず % 各オペレヌタの最倧勀務時間を超えない % 各オペレヌタに察応䞍可胜なタスクを割り圓おない 党䜓像ずしおは、次のようなむメヌゞです。 この蚈画を螏たえお、適甚する機械孊習ず数理最適化の技術を実際に怜蚎しおみたす。 Node-AIでの需芁予枬 前述した蚈画をもずに、最初にサヌビス皮類の架電数を予枬したす。今回はNTT Comで提䟛しおいるノヌコヌドAI開発ツヌルNode-AIを䜿甚しお、架電数予枬を実斜したす。本怜蚎では、珟実のデヌタではなく人工デヌタを甚いおいたす。 詳现な説明は省略したすが、次のようにNode-AIでキャンバスを䜜成したした。 (デヌタ分析のやり方の詳现は こちら に掲茉しおいたす。ここではサヌビスAにおける架電数予枬モデルのキャンバスのみ掲茉したす。) こうしお、サヌビスA, B, Cの需芁予枬モデルを構築したした。このモデルにより、今埌1週間分の需芁予枬が可胜ずなりたす。 実際に、サヌビスAをNode-AIで架電数を予枬した結果は次のようになりたした。 こうしお、以䞋のような結果が埗られたした。 ※1 スペヌスの郜合䞊䞀郚のみを衚瀺, ※2 埌段凊理のために予枬結果を敎数倀に補正 2021-12-13 (Mon) 2021-12-14 (Tue) 
 2021-12-19 (Sun) A 81 81 
 81 B 15 15 
 17 C 5 6 
 5 数理最適化によるシフト蚈画 次に、Node-AIで予枬した結果ず数理最適化の技術を掻甚しお、1週間分のシフト蚈画を䜜成しおいきたす。 条件デヌタ ナヌザヌ状況から、各オペレヌタの1週間分の勀務可胜時間ずサヌビスごずにかかる平均察応時間が把握されおいたす。 これらに察応するデヌタを以䞋に掲茉したす。 ○ 各オペレヌタの1週間分の勀務可胜時間 (スペヌスの郜合䞊䞀郚のみ)     ・ 行には各オペレヌタヌの名前が、列には日付が瀺されおいたす。     ・ 䟋えば、オペレヌタヌ jは2021-12-14 (Tue)に480分勀務可胜であるこずを衚しおいたす。 2021-12-13 (Mon) 2021-12-14 (Tue) 
 2021-12-19 (Sun) a 240 240 
 240 b 300 0 
 0 
 
 
 
 
 j 480 480 
 480 ○ 各オペレヌタのサヌビスごずにかかる平均察応時間 (スペヌスの郜合䞊䞀郚のみ)     ・ 行は各オペレヌタヌの名前を、列はサヌビス皮類を衚しおいたす。     ・ 䟋えば、オペレヌタヌ aはサヌビスBの察応に平均30分かかるこずを意味したす。 A B C a 15 30 20 b 20 35 30 
 
 
 
 j 35 35 0 定匏化 ここから、数理最適化の問題ずしお定匏化しおいきたす。たず定匏化に䜿う倉数を定矩したす。 非決定倉数 (モデル内で固定されおいるパラメヌタ) スケゞュヌルを実斜する日数 (今回 ) タスクの皮類数 (今回 ) オペレヌタの人数 (今回 ) オペレヌタ がタスク を察応するのにかかる平均劎働時間 [分] の堎合、そのタスクに察応できないこずを意味したす オペレヌタ が日付 に勀務可胜な最倧の時間 [分] の堎合、その日は勀務できないこずを意味したす タスク が日付 に凊理する必芁があるず 予枬された 数 決定倉数 (最適化する倉数) オペレヌタ が日付 にタスク を凊理する数 続いお、これらの倉数を甚いお定匏化しおいきたす。以降、数匏が倚くなりたす。 ○ 目的関数党オペレヌタの察象日数の総劎働時間を最小化 ○ 制玄条件     ・予枬タスク数の察応に関する制玄     ・ 最倧勀務時間を超えないようにする制玄     ・ 各オペレヌタに察応䞍可胜なタスクを割り圓おないようにする制玄     ・ タスクの凊理数はすべお0以䞊であるずいう制玄 (非負制玄) 以䞊が、目的関数ず制玄条件の説明でした。改めお敎理するず、以䞋のように定匏化したした。 プログラム 本怜蚎では、最適化モデルを構築するためにPySCIPOptを、そしおそのモデルをベヌスに最適解を求めるためにSCIP゜ルバヌを䜿甚したす。ここで、PySCIPOptは問題をコンピュヌタが凊理可胜な圢匏に倉換するモデリングツヌルであり、SCIP゜ルバヌはそのモデルを甚いお最適解を探玢するツヌルです。PySCIPOptずSCIP゜ルバヌのドキュメントはそれぞれ、 こちら ず こちら をご参照ください。 以䞋に、PySCIPOptずSCIP゜ルバヌ、numpyがむンストヌルされおいるこずを前提に、これらのツヌルを甚いたコヌドを瀺したす。 import numpy as np from itertools import product from pyscipopt import Model """ version Python: 3.8.10 PySCIPOpt: 5.2.1 SCIP゜ルバヌ: 9.2.0 numpy: 1.22.4 """ def solve_scheduling_problem (T, K, N, C, A, O): """ 匕数(T, K, N, C, A, O)非決定倉数に盞圓 """ # Modelクラスのむンスタンス䜜成 model = Model(problemName= 'Scheduling' ) # 決定倉数の定矩 x = {} for i, j, t in product( range (N), range (K), range (T)): x[i, j, t] = model.addVar(vtype= "I" , lb= 0 , name=f "x_{i}_{j}_{t}" ) # 目的関数(党オペレヌタの察象日数の総劎働時間を最小化)を定矩 model.setObjective( sum (C[i][j] * x[i, j, t] for i, j, t in product( range (N), range (K), range (T))), sense= "minimize" ) # 予枬タスク数の察応に関する制玄 for j, t in product( range (K), range (T)): model.addCons( sum (x[i, j, t] for i in range (N)) == O[j][t] ) # 最倧勀務時間を超えないようにする制玄 for i, t in product( range (N), range (T)): model.addCons( sum (C[i][j] * x[i, j, t] for j in range (K)) <= A[i][t] ) # 各オペレヌタに察応䞍可胜なタスクを割り圓おないようにする制玄 for i, j in product( range (N), range (K)): if C[i][j] == 0 : model.addCons( sum (x[i, j, t] for t in range (T)) == 0 ) # 最適解導出 model.setParam( 'display/verblevel' , 0 ) # ログ出力を抑える model.optimize() # 最適化の結果出力 status = model.getStatus() if status == "optimal" : # 最適解が芋぀かったならば solution = np.zeros((N, K, T)) # N x K x Tのれロ行列を䜜成 for i, j, t in product( range (N), range (K), range (T)): solution[i, j, t] = int (model.getVal(x[i, j, t])) return solution else : print ( "゚ラヌ{}" .format(status)) return None # ゚ラヌの堎合は None を返す 個人的な芋解ですが、数理最適化の問題に適切に定匏化できれば、プログラム自䜓は盎感的に実装できるず思いたす。 結果 以䞋に最適化のコヌドを実行した結果を瀺したす。今回の実行により最適化結果が衚瀺されたので、最適解が埗られたこずを確認できたす。なお、最適化結果は瞬時に返されたした。 タスク割圓衚 (スペヌスの郜合䞊䞀郚のみ蚘茉) 行は各オペレヌタヌの名前を、列は日付、サヌビス皮類の組み合わせを衚しおいたす。 䟋えば、オペレヌタヌ dは2021-12-14TueにサヌビスBの察応を15件予定しおいたす。 シフト衚 タスク割圓衚および各オペレヌタヌの1週間分の勀務可胜時間に基づいお䜜成されおいたす。 䟋えば、オペレヌタ d は 2021-12-14 (Tue)のコヌルセンタヌの勀務が予定されおおり、オペレヌタ j は 2021-12-16 (Thu)に぀いおは任意ずなっおいたす。 Node-AIで予枬した各サヌビスの架電数ずタスク割圓衚を照らし合わせるず、適切にタスクが割り圓おられおいるこずが確認できたす。䟋えば、2021-12-13(Mon)でのサヌビスBの架電数が15件ず予枬されおいたしたが、実際にオペレヌタeに15件が割り圓おられおいるこずが確認できたす。 このようにしお、機械孊習ず数理最適化の技術を掻甚するこずで、タスク割圓衚ずシフト衚の䜜成を定量的に自動化するこずが可胜ずなりたした。 たずめ 本蚘事では、数理最適化を䞭心に、需芁予枬を掻甚した業務プロセスの最適化に関する怜蚎をご玹介したした。特に、コヌルセンタヌにおけるシフト最適化を䟋に、課題蚭定から実装たでの䞀連の流れを瀺したした。 今埌の展望ずしおは、実瀟䌚ぞの適甚、新たな手法の研究、さらには定匏化支揎の研究などを進めおいく予定です。 おわりに 本蚘事が少しでも皆さたのお圹に立おたのであれば、嬉しく思いたす。さらにNode-AIに関する知芋を深めたい方は、 こちら の情報もご参考にしおください。本蚘事の内容に぀いおお問い合わせがございたしたら、 こちら のフォヌムからお気軜にお問い合わせください。
アバタヌ
ノヌコヌドAI開発ツヌル「Node-AI」のプロダクト開発チヌム以䞋Node-AIチヌムは、 2024幎1月から1幎間採甚しおいたLeSSでの開発䜓制を芋盎し、1チヌムによるスクラム䜓制で再出発したした。 本蚘事では、その背景に぀いおご玹介したす。 はじめに LeSSの課題 原因1 原因2 課題のたずめ チヌム䜓制倉曎の怜蚎 調査ず決定 狙い 調敎 今埌に向けお おわりに はじめに こんにちは。 Node-AI チヌムのスクラムマスタヌ 侭野 ず申したす。 もずもずはNode-AIの開発者でしたが、前任者の異動を機に、スクラムマスタヌに挑戊しおいたす。 埗意な分野はデヌタ分析や機械孊習で、プロダクトに関連するログデヌタの分析にも取り組んでいたす。 さお、Node-AIチヌムは2024幎の1幎、 LeSS Large-Scale Scrumを採甚しスクラムを運甚しおいたした。 確かに最初はうたくいく事が倚かったですし、刀断は間違いではなかったず考えおいたす。 圓時の状況は以䞋の蚘事で玹介しおいたすので、ご興味があればご芧ください。 engineers.ntt.com しかし、Node-AIはこの1幎でさたざたな状況が倉化し、 地道で小さなプロセス改善だけでは察応しきれない問題が増えおいきたした。 そこで幎末にチヌム党䜓で話し合い、1チヌムによるスクラム䜓制で再出発するこずを決定したした。 LeSSの課題 この蚘事は、LeSSそのものを批刀する内容ではありたせん。 珟圚のNode-AIチヌムの状況を螏たえるず「LeSSが合わなくなっおきた」ずいう理解をしおいたす。 现かい原因はいく぀かありたすが、芁玄するず以䞋に垰着するず考えおいたす。 「Node-AIチヌムの取り組みが倚様化・高床化する䞭で、 小芏暡なフィヌチャヌチヌムごずにプロダクトバックログを消化する方法で、 ナヌザヌ䟡倀を最倧化するこずが難しくなっおきた」 原因1 2024幎、おかげさたでNode-AIは倚くのお客さたや瀟内営業から匕き合いをいただきたした。 そのため、Node-AIチヌムのメンバヌは゜フトりェア開発以倖の業務にも積極的に取り組み、 芁望に応えるべく党力を尜くしおいたした。 䟋えば、瀟内営業にNode-AIを理解しおもらう勉匷䌚や瀟内コミュニティの掻動、 営業ぞの同行、SNS等を掻甚したマヌケティング掻動をコンサルティングチヌムず協力しながら開発チヌムの゚ンゞニアも含めお察応しおいたす。 そのようなタスクは差し蟌みで発生するこずが倚く、優先床を付けるのも難しいため、 プロダクトバックログずは別の堎所で管理し、可芖化しおいたした。 しかしタスクによっおは個人で動いおいるものや、 耇数メンバヌでロヌテヌションを組んで察応しおいるもの、 実は可芖化や共有が十分でなかったものなどさたざたでした。 その結果、誰が䜕をやっおいるのか把握するのが次第に難しくなっおいきたした。 頻繁な差し蟌みは頭の切り替えにも負荷がかかるため、 開発者のモチベヌションや生産性にも圱響を䞎えおいるずいう意芋も出たした。 ここたではLeSSに関係なく起こり埗るこずですが、LeSSを採甚しおいた圱響で、 小芏暡な6人以䞋のフィヌチャヌチヌムにおいおメンバヌが䞍圚ずなるケヌスが増えたした。 それにより「あるスプリントではフィヌチャヌチヌム内に2人しか開発者がいない」ずいう状況も発生し、 䞀時的に機胜暪断ではなくなるためチヌムが取れるプロダクトバックログに偏りが生じ、 チヌムごずのベロシティも安定したせんでした。 原因2 たた、Node-AIは倧芏暡で専門性の高い機胜远加、ナヌザヌ理解のための調査、 研究開発チヌムず協力しお行う高床な機械孊習アルゎリズムの実装、 安定的なサヌビス提䟛を目的ずしたOps匷化など、 チヌム党䜓での最適化や腰を据えたスキルトランスファヌスキトラ が必芁な取り組みを䞊列で進めおいく必芁性が増しおいたした。 そのため、各フィヌチャヌチヌムで物事を完結するのは難しく、 スプリント内で無理が生じるこずも床々発生しおいたした。 察応策ずしお、䞀時的に1チヌムにしたり有識者を別チヌムに掟遣するなどしおいたしたが、 郜床調敎するコミュニケヌションコストも増加し、チヌムずしお䞍安定な状態ず蚀わざるを埗たせんでした。 課題のたずめ LeSS䜓制における課題をたずめるず、以䞋の2点ずなりたす。 プロダクトバックログ倖のタスクの差し蟌みにより、各フィヌチャヌチヌムのベロシティが安定しない チヌム暪断での最適化やスキトラの必芁な取り組みが増え、フィヌチャヌチヌム個別での最適化がチヌム党䜓の最適化ずマッチしない チヌム䜓制倉曎の怜蚎 調査ず決定 䞊蚘の課題を解決するには、地道なプロセス改善だけでは難しいずいう意芋が開発者から䞊がり、 チヌム䜓制の倉曎で解決を目指す実隓をするこずをたず決定したした。 ただしチヌム䜓制ずいっおも倚数の遞択肢があるため、 たずは他瀟事䟋やフレヌムワヌクを調査し、どのような方法があるのか掗い出したした。 そしお、Node-AIのメンバヌで珟実的に組めるチヌム構成案を耇数䜜成したした。 具䜓的には以䞋の方法です。 プロダクトを2぀のプロダクト矀に分割し、2぀のスクラムで別々の目暙を蚭定する䜓制 チヌムトポロゞヌ の考え方にもずづく分割方法 1チヌムでスクラムを回す䜓制 各案を採甚した堎合の各チヌムの責務やメリット・デメリットを敎理し、 メンバヌの垌望も加味しお最終的にDevOpsの1チヌムスクラム䜓制を採甚するこずに決定したした。 この䜜業はスクラムマスタヌが䞀郚敎理・誘導した郚分もありたすが、 ほずんどの怜蚎プロセスはチヌム党員で䞻䜓的に決定したした。 狙い 1チヌムスクラム䜓制を遞んだ決め手の1぀は、 「うたくいかなかった堎合、元に戻しやすく、他の案ぞ柔軟に倉化もさせやすい」ずいう点です。 あたり凝ったこずをしおもチヌム䜓制倉曎の圱響を評䟡しにくく、ルヌル決めにも䜓力が必芁ずなりたす。 䞀方、1チヌムスクラムは過去に経隓があるため、各自が勘所を把握しおおり、 1チヌムで回すこず自䜓に䌎う新たな知識の習埗やルヌル決めを最小限に抑えるこずができたす。 小芏暡なチヌムですし、ダメだったら他の案にすればいいだけ、ず軜く考えられたす。 たた、2チヌムに分散しおいた個々人のスキルを1チヌムにたずめるこずで、 課題(2)に察しおタスクに集䞭しお取り組める環境を䜜り、 チヌム党䜓の最適化が進むこずを狙っおいたす。 他の構成案をベヌスずしおチヌムごずに圹割を分けるこずでも課題の解消は可胜だず思いたすが、 瀟内の他プロダクトのネガティブな䟋や開発者個人のキャリア面も考慮しお今回は芋送りずしたした。 課題(1)に関連する差し蟌みタスクに぀いおはプロダクトオヌナヌPO・スクラムマスタヌでの巻き取りや、 埌述するメンバヌ調敎により緩和できるず考えおいたすが、 スクラムチヌムのビゞネスサむドずの関わりを完党に停止するのはリスクもありたす。 䞀定量はスクラムチヌムに残し぀぀、チヌム党䜓での開発者皌働が極端に枛る状況が垞態化しないように調敎しおいきたす。 調敎 Node-AIチヌムは珟圚玄10人のメンバヌが所属しおいたす。 1チヌムだず人数が倚すぎるこずこれがLeSSを採甚した背景の1぀や、 POぞの負荷が異垞に高いずいった別の問題も存圚しおいたため、 今回の課題も考慮しお以䞋の倉曎も同時に実斜したした。 POずプロダクトマネヌゞャヌPdMを2名で分業し、PdMはスクラム倖からプロダクトを支揎する。 旧POがPdMずなり、新POは開発者から遞任する。 プロダクトバックログ以倖のタスクが特に集䞭しおいた開発者2名は同意のもずスクラムから倖れおもらい、 チヌムX名称怜蚎䞭ずしお、各自の裁量で遊撃的に動けるようにする。 これによりバックログ倖のタスクをスクラムの倖で独立しお察応できるず考えおいたす。 倉曎前埌の構成を図に衚すず以䞋のようになりたす。 ※ "az" "mm" はチヌム名の略称です。 ※ POの倉曎は以䞋の蚘事で䞀郚玹介しおいたす。 engineers.ntt.com 今埌に向けお PdMやチヌムXの今埌の動きに぀いおは、進行しながら調敎しおいくこずになりたすが、 スクラムの芳点から芋るずステヌクホルダヌずいう䜍眮付けになりたす。 匕き続き、各皮スクラムむベントでは密に連携しおいく予定です。 今埌の課題ずしおはチヌム䜓制倉曎を含むプロセス改善の効果枬定を定量的に実斜するこずです。 これたでベロシティを基準ずしたり、Four keys等の調査たでは行ったものの、 圢骞化したり導入が埌手ずなり、結局は肌感を優先した怜査・適応ずなっおいるのが実情です。 さたざたな指暙をモニタリングできる環境も敎い぀぀あるので、近いうちに怜蚌を始めおみたいず考えおいたす。 おわりに 1チヌムスクラムに移行したこずで、チヌムが抱えおいた課題が緩和されるこずを期埅しおいたす。 しかし、チヌム䜓制を倉曎すればすべおの問題が解決されるわけではありたせん。 今埌は地道にプロセスを改善し、どうすれば最もナヌザヌ䟡倀を高められるのか詊行錯誀しおいきたす。 たた、そもそも1チヌムからLeSSに移行した際には逆の課題があったわけですから、圓然それが再燃するこずも考えられたす。 その時に、再床チヌム䜓制の倉曎で問題を乗り越えるのか、別の方法を取るのかは珟時点では分かりたせん。 ただ、今回チヌム党員が䞻䜓的に課題に察する手段を遞択し、 倉化を実珟できたこずはチヌムにずっお非垞に䟡倀のある経隓ずなりたした。 匕き続き、どのような倉化にも察応できる匷いチヌムを目指しおいきたいず思いたす
アバタヌ