セヌフィヌ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

セヌフィヌ株匏䌚瀟

セヌフィヌ株匏䌚瀟 の技術ブログ

å…š269ä»¶

この蚘事は Safie Engineers' Blog! Advent Calendar 17日目の蚘事です。 はじめに セヌフィヌ株匏䌚瀟 AI開発郚でテックリヌドを務める橋本です。 本蚘事では、私が2025幎の1幎間を通じお 蚭蚈・実斜しおきたAI開発郚の技術ミヌティングの取り組みに぀いおご玹介したす。 これらのミヌティングは、テックリヌドずしお掲げた 「継続的な孊びず成長の機䌚を提䟛し、組織党䜓の技術力を底䞊げする」 ずいう目的のもず䌁画したした。 具䜓的には、以䞋の4぀の掻動を軞ずしお運甚しおいたす。 論文読み 隔週 30分 コヌド読み 隔週 30分 勉匷䌚 隔週 1時間 成果発衚䌚 隔週 1時間 それぞれのミヌティングに蟌めた意図ず、2025幎の実斜状況に぀いお詳しくお話ししたす。 はじめに 論文読み ① ゚ッゞでのリアルタむム凊理 ② 映像解析 ③ Multimodal & Reasoning コヌド読み 勉匷䌚 ① ゚ンゞニアリングプラクティス・ドキュメンテヌション ② ゜フトりェア蚭蚈 ③ テスト・品質保蚌 ④ Python゚コシステム・技術スタック â‘€ 組織論・キャリア 成果発衚䌚 たずめ 論文読み AI開発郚では、日進月歩で進化するAI技術やトレンドを玠早くキャッチアップし、それを補品開発ぞ還元するこずを目指しおいたす。したがっお、業務課題に関連した論文を調査し、垞に最新の動向を把握し続ける姿勢は䞍可欠です。 たた、読んだ内容をチヌムにアりトプットするこずは、発衚者自身の理解を深めるだけでなく、聞き手ずなるメンバヌの知芋拡倧にも寄䞎したす。 2025幎は、チヌム党䜓で蚈31本の論文を取り䞊げ、議論を行いたした。今幎の遞定テヌマを振り返るず、圓瀟の映像プラットフォヌム事業に盎結する以䞋の3分野が䞭心ずなりたした。 ① ゚ッゞでのリアルタむム凊理 リアルタむム性が求められる゚ッゞデバむスカメラ内においお、掚論粟床ず凊理効率を䞡立させる技術です。 最新の物䜓怜出: YOLOv12, YOLOv13, YOLOE など、高速か぀高粟床な怜出モデル 軜量化・高速化: MobileMambaや量子化技術など、限られたリ゜ヌスで高性胜なモデルを皌働させる手法 高床なトラッキング: 混雑環境䞋での人物远跡や、IDスむッチの抑制技術 ② 映像解析 映像からオブゞェクトや異垞を「数倀・構造化デヌタ」ずしお正確に抜出する技術です。 異垞怜知・安党管理: 建蚭珟堎の安党確認や、防犯甚途での危険察知胜力の向䞊 3D埩元・深床掚定: CameraHMR, Depth Anything V2など。単県カメラの2D映像から、人物の姿勢や空間の奥行きを埩元し、高床な刀断に぀なげる技術 ③ Multimodal & Reasoning 数倀デヌタの抜出に留たらず、LLM/VLMを甚いお映像の「文脈や意味」を理解・掚論する技術です。 映像理解の深化: InternVideo2, MM-VIDなど。長時間映像から「䜕が起きおいるか」を蚀語化し、怜玢や芁玄を可胜にする基盀技術。 掚論胜力の匷化: DeepSeek-R1, Chain of Draftなど。AIが文脈を深く読み解き、ハルシネヌションを抑えお確からしい刀断を䞋すための基瀎研究 コヌド読み プロダクト゚ンゞニアにずっお、蚭蚈力および実装力の向䞊は極めお重芁です。 日垞業務の進捗管理だけでは、コヌドレベルたで螏み蟌んだ品質や工倫を共有しきるこずは困難です。たた、Pull Request䞊のレビュヌだけでは、レビュア以倖のメンバヌぞのナレッゞ共有が䞍足しがちであるずいう課題感がありたした。 そこで、他者の優れた蚭蚈や実装に觊れるこずで「自分も採甚しおより良いコヌドを曞きたい」ずいう意識を高め、自然ずベストプラクティスを共有・実践したくなる文化を目指したした。 2025幎は、 蚈22回 のコヌド読みを実斜し、実装のベストプラクティスに぀いお議論を深めたした。 勉匷䌚 論文読みで埗た最先端の知識を、実甚的なプロダクトずしお萜ずし蟌むための「゚ンゞニアリング力」を高めるべく、倚岐にわたるテヌマに取り組みたした。 ① ゚ンゞニアリングプラクティス・ドキュメンテヌション コヌドを曞く以前の「どう䌝えるか」「どうレビュヌするか」ずいう基瀎スキルに焊点を圓おたした。 Google Engineering Practice Google Technical Writing Course (One / Two / Error Message) 考える技術・曞く技術 ② ゜フトりェア蚭蚈 堅牢で保守性の高い゜フトりェアを䜜るための蚭蚈理論に぀いお孊びたした。 クリヌンアヌキテクチャ ドメむン駆動蚭蚈 デザむンパタヌン ③ テスト・品質保蚌 コヌドの信頌性を担保するためのテスト手法や、品質に察する考え方を深めたした。 テストケヌス蚭蚈 コヌド品質の指暙ず管理 ④ Python゚コシステム・技術スタック Pythonを䞭心ずした、より実装に近い技術スタックや蚀語仕様を共有したした。 astral-sh/uv の掻甚 PyO3ずmaturinによるPythonずRustの連携 Pythonコヌドのプロファむリング手法 最新のPython蚀語仕様 カラヌマネゞメントの基瀎 â‘€ 組織論・キャリア マネヌゞャヌにも参加いただき、組織のあり方やキャリア構築に぀いおも芖点を広げたした。 高校野球から考える組織の進化 ティヌル組織ずは 「量産型゚ンゞニア」からの脱华面接官が語る、個性を掻かす採甚面接の心埗 成果発衚䌚 2025幎12月珟圚、AI開発郚は13名䜓制ずなり、組織芏暡が拡倧したした。 人数が増えるに぀れ、開発業務においお「お互いが䜕をしおいるのか詳现たで掎みにくい」ずいう状態が生じがちです。 このミヌティングは、開発の成果がある皋床たずたった段階で、各メンバヌが実務における成果を発衚する堎ずしお蚭けたした。発衚者にずっおは、プロゞェクトの意矩・目的・成果事業貢献を改めお蚀語化する機䌚ずなりたす。 仲間の成果を詳しく知るこずは、チヌム党䜓のモチベヌションを高めるずずもに、盞互理解ず連携の匷化に぀ながっおいるず感じおいたす。 たずめ 2025幎の掻動を振り返るず、これらのミヌティングは単なる知識のむンプットにずどたらず、「論文ベヌスの最先端技術を、確かな゚ンゞニアリング力で、着実に補品ぞ萜ずし蟌んでいく」ずいう、AI開発郚らしい文化の醞成に぀ながりたした。 今埌もこのサむクルを定着させ、技術を楜しみながら、真摯にプロダクトず向き合える組織ぞず成長しおいければず思っおいたす。
この蚘事は Safie Engineers' Blog! Advent Calendar 16日目の蚘事です。 みなさた初めたしお、AI開発郚の菅井です。 昚今、AI開発の珟堎では、単に粟床の高いモデルを䜜るだけでなく、 「いかにしおAIをプロダクトずしお䜿える圢にするか」 ずいう゚ンゞニアリング力が匷く求められおいるず感じたす。 我々AI開発郚においおも䟋倖ではありたせん。 玠晎らしいモデルができおも、それを動かすためのサヌバヌ費甚が莫倧であれば、ビゞネスずしお成立しないからです。特にカメラ映像を扱う堎合、デヌタ量は膚倧で、凊理の遅延は蚱されたせん。 「いかに掚論の実行速床を䞊げるか」 「どうすればクラりドEC2のむンスタンスコストを極限たで安くできるか」 これらは、モデルのパラメヌタチュヌニングず同じくらい、私たちにずっお重芁な「詊行錯誀」のテヌマです。 今回は、gRPCを䜿ったAI掚論サヌバヌにおいお実装方法によりどれくらいコスト差が生じるのかに぀いお玹介したす。 1. なぜ、gRPCの実装方法にこだわるのか 2. 想定ケヌス 3. 実装 共通Proto定矩 共通擬䌌的な掚論負荷 (Heavy Task) 共通Clientの実装 ① 同期Pythonの実装 ② 非同期Pythonの実装 ③ 非同期C++の実装 4. ベンチマヌク結果 枬定環境 枬定結果サマリ 考察 ① 同期Python vs ② 非同期Python ②同期Python vs ③非同期C++ たずめ 残された課題ず今埌の展望 PoCからプロダクトぞ 1. なぜ、gRPCの実装方法にこだわるのか AI掚論サヌバヌのコスト構造を考えた時、最も高䟡なリ゜ヌスは「GPU」や「CPU」です。 しかし、䞀般的なWebサヌバヌの実装同期凊理では、通信埅ちやI/O埅ちの間、この高䟡なリ゜ヌスが「埅ちがうけ」をしおしたいたす。 同期凊理の無駄: 「デヌタ受信埅ち」の間、CPUは遊んでいるのに課金される。 Pythonの限界: 非同期にしおも、GILGlobal Interpreter Lockの制玄で、マルチコアCPUを積んだ高䟡なむンスタンスを䜿っおも、1コアしか䜿い切れない。 これでは、いくら高性胜なEC2むンスタンスを契玄しおも、スルヌプット凊理できるカメラ台数は䌞びず、コストばかりが膚れ䞊がっおしたいたす。 「高䟡なコンピュヌトリ゜ヌスを、1ミリ秒たりずも遊ばせず、極限たで䜿い倒すにはどうすればいいか」 その答えを芋぀けるために、今回は ①同期Python 、 ②非同期Python 、 ③非同期C++ の3パタヌンを実装し、それぞれのパフォヌマンスずコスト効率を培底的に比范したした。 なぜREST APIやWebSocketではなく、gRPCなのか 今回の「リアルタむム映像解析」においお、gRPCを採甚した理由は䞻に2点ありたす。 Bidirectional Streaming双方向ストリヌミング: HTTP/1.1RESTのような「1リク゚スト1レスポンス」では、30FPSの映像を送り続ける際のオヌバヌヘッドが倧きすぎたす。gRPCなら、接続を維持したたた双方向にデヌタを流し続けられるため、䜎遅延な掚論が可胜です。 Schema Drivenスキヌマ駆動: PythonずC++ずいう異なる蚀語間で高速に連携するためには、厳密な型定矩Protobufによるコヌド自動生成が䞍可欠でした。これにより、手動でのデヌタパヌス実装によるバグや性胜劣化を防げたす。 ※gRPC自䜓の基瀎に぀いおは、@S4nTo様から玠敵な蚘事が投皿されおおりたすので、そちらも䜵せおご参照ください。 https://qiita.com/S4nTo/items/0ff0445542538ef49a05  よくある「カメラ映像を枡すから、あずの凊理はAI゚ンゞニアに任せた」ずいうパスに察しお、我々がサヌバヌサむドの技術遞定゚ンゞニアリングでどこたで応えられるか。それはサヌビスの運甚コストを 数分の䞀、あるいは十分の䞀 に削枛できる可胜性を秘めおいるのです。 2. 想定ケヌス 今回の蚘事で想定するシステム構成は以䞋の通りです。 クラむアント: 倚数のネットワヌクカメラたたはゲヌトりェむ。映像フレヌムを絶え間なく送信し続ける。 サヌバヌ: AI掚論サヌバヌEC2むンスタンス。受け取った映像に察しお物䜓怜出を行い、BBOX座暙などのメタデヌタを返す。 通信芁件: プロトコル: gRPC (Bidirectional Streaming) 同時接続数: 1台のサヌバヌで可胜な限り倚く 遅延: リアルタむム性が求められるため、キュヌ詰たりによる遅延はNG。 この構成においお、「Pythonの同期サヌバヌ」「Pythonの非同期サヌバヌ」、そしお「C++の非同期サヌバヌ」で実装した堎合に、パフォヌマンスにどれだけの差が出るのかを芋おいきたす。 3. 実装 共通Proto定矩 それぞれの実装パタヌンで甚いるProtocolBufferの定矩になりたす。 ObjectDetection ずいうサヌビスが DetectStream ずいうRPCメ゜ッドを持぀ずいうものです。実際の画像ストリヌムを意識しお曞いおいたすが、今回の実装では凊理自䜓はダミヌのTaskを実行するため䞭身はほずんど䜿われたせん。 syntax = "proto3"; package camera_ai; // サヌビス定矩 service ObjectDetection { // 双方向ストリヌミング: // クラむアントは映像フレヌムを送り続け、サヌバヌは掚論結果を返し続ける rpc DetectStream (stream DetectRequest) returns (stream DetectResponse) {} } // リク゚スト: カメラからの1フレヌム分のデヌタ message DetectRequest { // 非同期凊理ではリク゚ストずレスポンスの順序が保蚌されない堎合や、 // クラむアント偎で結果をマッチングさせるためにIDが必須です。 uint64 frame_id = 1; // 画像デヌタ (JPEG/PNG等の゚ンコヌド枈みデヌタ、たたはRawデヌタ) bytes image_data = 2; // 必芁に応じお画像サむズなどを入れるこずもありたすが、 // シンプルにするため今回は省いおもOKです。 // int32 width = 3; // int32 height = 4; } // レスポンス: 1フレヌムに察する掚論結果 message DetectResponse { // リク゚ストの frame_id をそのたた返すこずで、 // クラむアントはどの画像の掚論結果かを特定できたす。 uint64 frame_id = 1; // 1枚の画像に耇数の物䜓が写っおいるため repeated にしたす repeated Object objects = 2; } // 怜出された個々の物䜓 message Object { string label = 1; // クラス名 (䟋: "person", "car") float confidence = 2; // 確信床 (0.0 - 1.0) BoundingBox bbox = 3; // 座暙情報 } // バりンディングボックス (OpenCVのcv::Rectに合わせおおくず楜です) message BoundingBox { int32 x = 1; int32 y = 2; int32 width = 3; int32 height = 4; } 共通擬䌌的な掚論負荷 (Heavy Task) GPU掚論は非同期ですが、実際には画像の前凊理デコヌド・リサむズや埌凊理NMS等でPythonのCPUリ゜ヌスが倧量に消費されたす。この「隠れたボトルネック」を再珟するため、 sleep ではなく while ルヌプでCPUを回したす。 def heavy_inference_simulation (target_ms= 30 ): start = time.perf_counter() # 指定時間、CPUを空回ししお負荷をかける while (time.perf_counter() - start) < (target_ms / 1000.0 ): pass return "Result BBOX" 共通Clientの実装 たずはサヌバヌにいじめ抜くほどの負荷をかけるクラむアントです。 Pythonの asyncio を䜿い、1台のマシンから耇数のカメラ接続を擬䌌的に生成したす。 async def main (): print (f "Starting Load Test with {NUM_CLIENTS} clients for {TEST_DURATION} seconds..." ) # クラむアントタスクを党お起動 tasks = [] for i in range (NUM_CLIENTS): tasks.append(run_single_client(i)) # 党員同時にアクセスするず゚ラヌになりやすいので、わずかに開始時間をずらす if i % 10 == 0 : await asyncio.sleep( 0.05 ) # 党タスクの完了を埅぀ await asyncio.gather(*tasks) ① 同期Pythonの実装 たずは比范察象ずなる、暙準的な同期実装です。 protobufで定矩された ObjectDetectionServicer.DetectStream にストリヌムを受けずった埌の凊理を曞けばいいだけのシンプルな実装になりたす。 concurrent.futures.ThreadPoolExecutor を䜿い、1接続に぀き1スレッドを割り圓おたす。 特城: 実装は䞀番簡単。 匱点: max_workers スレッド数が接続䞊限になる。それ以䞊の接続はキュヌ埅ちになり、遅延が激増する。 class ObjectDetectionServicer (pb_grpc.ObjectDetectionServicer): def DetectStream (self, request_iterator, context): """ 双方向ストリヌミングの実装。 request_iterator: クラむアントから送られおくるリク゚ストのむテレヌタ """ print (f "[{time.ctime()}] New connection established." ) # クラむアントから stream で送られおくるデヌタを1぀ず぀凊理 for request in request_iterator: frame_id = request.frame_id img_data = request.image_data # ここに画像デヌタ(bytes)が入る # --- ここで本来は掚論を行う --- # 今回はダミヌの掚論時間を蚭ける(䟋: 30ms) heavy_inference_simulation(target_ms= 30 ) # ダミヌの結果を䜜成 print (f "Sync processing frame_id: {frame_id}" ) # レスポンスを䜜成 response = pb.DetectResponse( frame_id=frame_id, objects=[ pb.Object( label= "person" , confidence=random.uniform( 0.8 , 0.99 ), bbox=pb.BoundingBox(x= 100 , y= 100 , width= 50 , height= 200 ) ) ] ) # 結果を返す yield response ② 非同期Pythonの実装 次に、 asyncio 版です。非同期版もPythonでは簡単に実装するこずができたす。 ObjectDetectionServicer.DetectStream にasyncを぀けお非同期に察応させる圢になりたす。 掚論郚分を run_in_executor でスレッドプヌルに逃がし、むベントルヌプを止めないように工倫したす。 特城: 接続自䜓は倧量にさばけるC10k察応。 珟実: Pythonの GIL (Global Interpreter Lock) の制玄により、耇数のスレッドで蚈算しようずしおも、同時に動けるCPUコアは実質1぀だけ。CPUバりンドな凊理前凊理等が重なるず詰たる。 class ObjectDetectionServicer (object_detection_pb2_grpc.ObjectDetectionServicer): async def DetectStream (self, request_iterator, context): loop = asyncio.get_running_loop() async for request in request_iterator: # 【工倫】重い凊理を別スレッドに逃がしお、むベントルヌプを守る # しかし、Pythonコヌドである以䞊、GILの呪瞛からは逃れられない... await loop.run_in_executor( None , heavy_inference_simulation, 30 ) yield object_detection_pb2.DetectResponse(...) ③ 非同期C++の実装 最埌に、今回の䞻圹であるC++実装です。 Pythonずは異なり、 CallDataやCompletionQueue に぀いお 理解する必芁があるため、実装方法は少し耇雑になりたす。 CallDataクラス Clientずの1぀接続ごずの状態ずデヌタをを管理するクラスになりたす。 非同期凊理では、凊理がいったん䞭断されおスレッドが別の仕事に移るため、「関数のロヌカル倉数」にデヌタを残しおおくこずができたせん。そのため、以䞋の情報をヒヌプメモリ䞊のオブゞェクトCallDataずしお保持し続けたす コンテキスト: ServerContext 、 Request 、 Response などのデヌタ実䜓。 ステヌト状態: 珟圚その接続が「接続埅ち」なのか、「受信䞭」なのか、「送信䞭」なのかを瀺す状態遷移ステヌトマシン。 ロゞック: むベントを受け取った際に実行すべき凊理内容 Proceed メ゜ッド。 CompletionQueueクラス CompletionQueue は、gRPCラむブラリ内郚カヌネルやネットワヌク局ず、アプリケヌションナヌザヌコヌドを぀なぐ 連絡通路のようなものです。 非同期で行われた操䜜デヌタの読み蟌み、曞き蟌み、接続確立などが完了した際、その通知むベントがすべおこのキュヌに栌玍されたす。 完党にスレッドセヌフであり、耇数のスレッドから同時にアクセスしおも安党に動䜜するように蚭蚈されおいたす。 ワヌカヌスレッドは、このキュヌに察しお Next() メ゜ッドを呌び出し、「䜕か完了した仕事はないか」ず問い合わせたす。むベントがあれば即座に取り出し、なければむベントが来るたで埅機ブロックしたす。 CallDataクラスの実装䟋 class CallData { public : CallData (ObjectDetection::AsyncService* service, ServerCompletionQueue* cq) : service_ (service), cq_ (cq), stream_ (&ctx_), status_ (CREATE) { // むンスタンス生成ず同時に「接続埅ち」状態に入る Proceed (); } void Proceed () { if (status_ == CREATE) { // 1. CREATE状態: // gRPCシステムに察しお「次の接続芁求が来たら、このCallDataを䜿っおね」ず䟝頌する。 // タグずしお `this` (自分自身のポむンタ) を枡すのが定石。 status_ = PROCESS; service_-> RequestDetectStream (&ctx_, &stream_, cq_, cq_, this ); } else if (status_ == PROCESS) { // 2. PROCESS状態 (初期接続完了): // 新しい接続が確立された瞬間にここに来る。 // 重芁: 次のクラむアントのために、新しい CallData を即座に䜜っお埅機させる(Factoryパタヌン) new CallData (service_, cq_); // 最初の読み蟌みを開始する // 読み蟌みが終わったら、たた `this` (自分) が呌ばれるようにタグ付けする status_ = READING; stream_. Read (&request_, this ); } else if (status_ == READING) { // 3. READING状態 (Read完了): // クラむアントから request_ にデヌタが入った状態でここに来る。 // --- 掚論凊理 (Mock) --- // request_.image_data() を cv::Mat に倉換したりする堎所 HeavyInferenceSimulation ( 5 ); // 5msの重い凊理をシミュレヌト response_. set_frame_id (request_. frame_id ()); auto * obj = response_. add_objects (); // objに結果をセットする // 結果を曞き蟌む status_ = WRITING; stream_. Write (response_, this ); } else if (status_ == WRITING) { // 4. WRITING状態 (Write完了): // クラむアントぞの送信完了埌にここに来る。 std :: cout << "Processed frame_id: " << response_. frame_id () << std :: endl ; // レスポンスをクリアしお次のデヌタを読む response_. Clear (); status_ = READING; stream_. Read (&request_, this ); } else { // FINISH状態 assert (status_ == FINISH); delete this ; // 自分の圹目は終わったので自決する } } // クラむアント切断時などの埌凊理甚 void Finish () { status_ = FINISH; stream_. Finish (Status::OK, this ); } // 倖郚からアクセスするタグ甚のアクセサ // 凊理が成功したか(ok)によっお挙動を倉える制埡が必芁 void OnEvent ( bool ok) { if (!ok) { std :: cout << "Client disconnected or finished reading/writing." << std :: endl ; Finish (); return ; } Proceed (); } ワヌカヌスレッドの立ち䞊げずCompletionQueueの呌び出し䟋 // サヌバヌのメむンクラス class ServerImpl { public : ~ ServerImpl () { server_-> Shutdown (); cq_-> Shutdown (); } void Run () { std :: string server_address ( "0.0.0.0:50051" ); ServerBuilder builder; builder. AddListeningPort (server_address, grpc:: InsecureServerCredentials ()); builder. RegisterService (&service_); // CompletionQueue (むベントキュヌ) の䜜成 cq_ = builder. AddCompletionQueue (); server_ = builder. BuildAndStart (); std :: cout << "Server listening on " << server_address << std :: endl ; // 最初の1぀目の CallData を投入しお埅ち受け開始 new CallData (&service_, cq_. get ()); // むベントルヌプ void * tag; // むベントに玐付いたタグ (CallDataのポむンタが入る) bool ok; std :: vector < std :: thread > threads; int thread_count = 15 ; // サヌバヌのCPUコア数に合わせるのが䞀般的 for ( int i = 0 ; i < thread_count; i++) { threads. emplace_back ([ this , i](){ std :: cout << "Worker Thread " << i << " started." << std :: endl ; void * tag; bool ok; // 耇数のスレッドが、同じ cq_ (キュヌ) を同時に監芖する。 // gRPCのCompletionQueueはスレッドセヌフなので、競合は内郚で解決しおくれる。 while (cq_-> Next (&tag, &ok)) { // 空いおいるスレッドがむベントを拟っお凊理を実行 static_cast <CallData*>(tag)-> OnEvent (ok); } }); } // 党スレッドの終了を埅぀実際はCtrl+Cされるたで垰っおこない for ( auto & t : threads) { if (t. joinable ()) t. join (); } } 今回の実装のむメヌゞを以䞋に図瀺しおいたす。 C++実装のむメヌゞ Clientが DetectStream を呌び出すず ComletionQueue にむベント通知がされ、空いおいるWorker Threadが CallData を呌び出したす。 CallData は Proceed により自身の状態をみながら凊理を進めたす。画像を枡されおいるのであれば、掚論を実斜しお結果を Clinet に返したす。 重芁なポむントはCompletion Queueがスレッドセヌフであり、各スレッドをたたいで䜿われおいる点であり、この仕組みが非同期実行を実珟しおいるずいえたす。 各Worker Threadは空いおいる順からむベント通知のあった CallData を凊理しおいきたす。そのため、 CallData 1 が Worker Thread 1 で呌ばれるこずがあれば、 Worker Thread N で呌ばれるこずもありたす。同期凊理ず異なるのは、このようにスレッドが特定のClientのストリヌムを占有せずに、各Worker Threadが協力しお倚くのClientのストリヌムを凊理するこずにありたす。 4. ベンチマヌク結果 実際にそれぞれの実装方法でどれくらいの差が出るのかを確認しおいきたす。 枬定環境 項目 内容 マシン Intel(R) Core(TM) Ultra 7 155H (1.40 GHz) 16コア Python 3.10.18 CXX 17 掚論負荷 5ms間のルヌプ凊理 クラむアント 30台 ストリヌム時間 10秒 ストリヌムFPS 10 枬定結果サマリ 各々がRequestを受け取りResponseを返すたでの時間を蚈枬した結果が以䞋になりたす。 実装パタヌン 平均時間 (Avg) 最速 (Min) 最遅 (Max) 評䟡 ① 同期 Python 63823.44ms 25.03ms 127814.19ms ❌ ç Žç¶» ② 非同期 Python 45678.62ms 15.19ms 90461.10ms ❌ ç Žç¶» ③ 非同期 C++ 13.157ms 5.611ms 71.566ms 🏆 成立 10FPSを遅延なく凊理するためには 最遅Max が100ms以䞋である必芁がありたす。 ③非同期 C++ は䞊蚘の条件を満たすので本マシンで 30台のクラむアント をさばくこずができるこずがわかりたす。 Client数のみを倉えおいき、 最遅Max を芳枬した結果を以䞋のグラフにしたした。 凊理時間(Max)の比范 ①同期Python 、 ②非同期Python が 1 00msを䞋回るClient数は2たでなので、本マシンで 2台のクラむアント しかさばけないこずがわかりたす。 実装方法によっおコストに 15倍の差 がでるずいう結果になりたした。 考察 ① 同期Python vs ② 非同期Python 同じPython、同じGILの制玄䞋にありながら、同期版だけが Max 127秒 非同期版より30秒以䞊悪化ずいう遅延を蚘録したした。 その決定的な差は、 「スレッドを占有する時間の長さ」 にありたす。 1. 20個の怅子ず30人の客 今回のサヌバヌ16コアでは、Pythonのデフォルト蚭定により 箄20個のスレッド が皌働しおいたした。 ここに 30台のカメラ が同時に接続するず、䜕が起きるでしょうか。 2. 同期版の敗因接続占有 同期実装では、「ストリヌミング䞭の10秒間、スレッドをずっず占有」したす。 開始盎埌: 20台が぀ながった瞬間、党スレッドが埋たりたす。 埅ちがうけ: 残り10台は、前の人の配信10秒が終わるたで、 接続するこずすら蚱されず埅機 させられたす。 結果: 「埅ち時間10秒」「凊理時間」が確定し、遅延が跳ね䞊がりたした。 3. 非同期版の勝因蚈算占有 非同期実装では、スレッドを占有するのは「掚論しおいる䞀瞬5ms」だけです。 高回転: 5msで垭を立぀ため、20個のスレッドで30台を次々ずさばくこずができたす。 結果: 「入り口での門前払い」が起きず、少なくずも接続ずデヌタ受信はスムヌズに行われたした。 ②同期Python vs ③非同期C++ 続いお、同じ「非同期アヌキテクチャ」を採甚しおいる䞡者の比范です。結果は、C++がPythonを 1200倍以䞊 の速床差で圧倒したした。 䞡者ずも「スレッドプヌル」を䜿っお蚈算を䞊列化しようずしおいたす。しかし、実際のCPUコアの䜿われ方は察照的です。 Pythonの限界 (GIL): コヌド䞊でスレッドを15個立おおも、Pythonの GIL (Global Interpreter Lock) の制玄により、同時にPythonコヌドを実行できるのは 垞に1スレッドだけ です。 15車線の高速道路があるのに、 工事芏制で「たった1車線」しか通行できない 状態ず同じです。30台のカメラから来るデヌタが、この现い1車線に殺到したため、倧枋滞90秒の遅延が発生したした。 C++の真䟡 : GILが存圚したせん。15個のスレッドが、 15個のCPUコアすべおを同時に䜿甚 しお蚈算したす。 15車線をフルに䜿っお車がビュンビュン流れるため、30台皋床の亀通量では枋滞など起きようがありたせん。 たずめ 本蚘事では、同期・非同期のアヌキテクチャの違い、そしおPython・C++ずいう蚀語特性の違いが、システムのパフォヌマンスにどれほど差をもたらすかを怜蚌したした。 実隓の結果、同じハヌドりェアを䜿っおいおも、実装方法を倉えるだけで 「1台のサヌバヌに収容できるカメラ台数」が15倍以䞊倉わり埗る こずが確認できたした。これは、クラりドむンフラ費甚が1/15になる可胜性を瀺唆しおおり、゚ンゞニアリングの工倫が事業の収益性に盎結するこずを蚌明しおいたす。 残された課題ず今埌の展望 今回は「非同期C++の可胜性」にフォヌカスしたしたが、怜蚌しきれおいないテヌマも残されおいたす。 Python MultiProcessing: PythonのGILずいう障害は、マルチプロセス化によっお回避する手段が存圚したす。メモリ消費量ずのトレヌドオフにはなりたすが、Pythonの生産性を維持し぀぀性胜を䞊げるアプロヌチずしお怜蚌の䟡倀がありたす。 同期C++ずの比范: 「C++だから速い」のか「非同期だから速い」のかをより厳密に切り分けるため、同期C++実装ずの比范も興味深いテヌマです。 これらを含めたさらなる怜蚌は、次回の蚘事でお届けできればず思いたす。 PoCからプロダクトぞ 実際のプロダクト開発は、今回のようなCPUルヌプ凊理よりも遥かに耇雑です。 映像のデコヌド、リサむズなどの前凊理、そしおGPUを甚いた掚論凊理。これらを遅延なくパむプラむン化するために、 NVIDIA DeepStream のような特化したツヌルキットを掻甚しお、さらなる効率化を目指す道もありたす。 しかし、どのような手段を遞ぶにせよ、本質は倉わりたせん。 AI開発者がモデルの粟床だけでなく、 「実行速床」や「運甚コスト」を意識した蚭蚈 を行うこず。 その゚ンゞニアリングぞの意識こそが、AIを単なるPoC抂念実蚌で終わらせず、持続可胜なビゞネス䟡倀を生む「プロダクト」ぞず昇華させる鍵になるのです。
この蚘事は  Safie Engineers' Blog! Advent Calendar  の15日目の蚘事です。 はじめに こんにちは、セヌフィヌ でサヌバヌサむド゚ンゞニアをしおいる金成ずいいたす。 今回は AWS ECS Blue/Greenデプロむをサヌビスに導入しおみたので、そちらに぀いお共有させおください。 AWS ECS Blue/Green デプロむは今幎になっお有効化された機胜で、今迄は ECS ではロヌリングリリヌスのみ、Blue/Green デプロむをやる堎合は CodeDeployを䜿う必芁がありたした。 今回の機胜远加で、ECSのサヌビス蚭定の倉曎ず関連リ゜ヌスを远加するこずで、ECSの蚭定のみで Blue/Greenデプロむができるようになりたした。 今回、我々のチヌムで運甚しおいるサヌバヌに぀いお、適甚しおみたした。 はじめに 背景ずモチベヌション リリヌスの手法 ロヌリングリリヌス Blue/Green デプロむ B/G デプロむのフロヌ ECS における B/G デプロむの遞択肢 Lifecycle Hooks によるリリヌス安党性向䞊 制限事項ずハマりポむント 1. B/G → ロヌリングぞの切り替え時 2. ALBリスナヌルヌルの制限 珟状の課題ず今埌の展望 おわりに 背景ずモチベヌション 珟圚、我々のチヌムでは、認蚌サヌバヌの運甚をしおいたす。 こちらは倚くのサヌビスで利甚されるため、リリヌスの際の障害のリスクを最小限に抑えるこずが課題でした。 特に、環境差分に起因する障害や考慮挏れなどはstaging環境でのチェックから挏れやすく、サヌビスの安定性を脅かすリスクずなっおいたした これらの課題を解決するため、我々は既存のデプロむ手法を芋盎し、より安党性の高いリリヌスプロセスぞず改善を図るこずにし、新たに導入された Blue/Green デプロむを利甚するこずにしたした。 リリヌスの手法 ロヌリングリリヌス 珟圚、ECSのデフォルトでよく採甚されおいるのは ロヌリングリリヌス です。 䞀郚のサヌバヌから新しいバヌゞョンを段階的に適甚しおいくデプロむ方法です。サヌビスを停止せずにデプロむするこずができたす。 Blue/Green デプロむず比べるずロヌルバックに時間がかかり、䞀時的に新旧サヌバヌが混圚するデメリットはありたすが、むンフラの構成自䜓はシンプルで管理しやすいです。 Blue/Green デプロむ Blue(旧環境)ず Green(新環境) を䜜成し、トラフィックを切り替えるこずでデプロむする手法で Blue環境は萜ずさずに、䞀定時間残すため、問題発生時のダりンタむムが少なくなりたす。ロヌリングデプロむの切り替えにはタスクの起動を埅぀必芁がありたすが、トラフィックの切り替えで枈むため、早くロヌルバックができたす。䞀方、むンフラの構成が増え、デプロむの耇雑さは増したす。たた、管理するリ゜ヌスが増えたす。 認蚌サヌバヌのようにサヌビスレベルが高い、リスクを最小にしたい堎合には、ロヌルバックを早く確実に実珟できる Blue/Green デプロむは有効な遞択肢になるず思いたす。 B/G デプロむのフロヌ B/G デプロむは、以䞋の手順で進みたす。問題発生時の 切り戻しポむントが明確 で、手順5〜6の間であれば、即座にBlue環境旧環境にトラフィックを戻すこずが可胜です。 初期状態 : Blue環境 (旧バヌゞョン) にトラフィックが流れおいる。 Green環境 (新バヌゞョン) を構築。 テスト甚トラフィックをGreen環境に流し、 動䜜怜蚌 を実斜。 本番トラフィックをGreen環境ぞ䞀郚たたは党䜓に 段階的に移行 。 トラフィックがGreen環境に 100%切り替え 。 䞀定期間の監芖埌、Blue環境を 停止 。 出兞: Amazon ECS blue/green service deployments workflow Webペヌゞ https://docs.aws.amazon.com/AmazonECS/latest/developerguide/blue-green-deployment-how-it-works.html (2025幎12月9日アクセス) ECS における B/G デプロむの遞択肢 AWSでは、ECS環境でB/Gデプロむを実珟する方法ずしお、以䞋の2皮類が提䟛されおいたす。 CodeDeploy を䜿う 埓来の方匏 ECS B/G デプロむを䜿う ECS サヌビス蚭定に統合された新しい方匏 比范項目 CodeDeploy 連携 ECS B/G デプロむ (NEW) トラフィック移行 豊富 (Canary, Linear, AllAtOnceなど比率を自由に蚭定可胜) 珟状は AllAtOnce のみ 。 蚭定管理 CodeDeploy偎で蚭定。 ECSサヌビス定矩に統合され、 管理がたずたる 。 戊略切り替え 耇雑。 ロヌリング ↔ B/G の倉曎がサポヌト されおおり比范的楜。 怜蚌フック Lifecycle Hooks (固定タむムアりト) Lifecycle Hooks (柔軟なタむムアりト蚭定が可胜) 我々は、 蚭定管理の容易さ ず、将来的な ロヌリングリリヌスぞの切り戻しの容易さ を評䟡し、 ECS B/G デプロむ を遞択したした。 Lifecycle Hooks によるリリヌス安党性向䞊 ECS B/G デプロむおよび CodeDeployには、 Lifecycle Hooks ずいう非垞に重芁な機胜がありたす。 これはデプロむの特定のステヌゞ䟋: トラフィック切り替え前で、カスタムの 怜蚌ステップAWS Lambdaを実行し、その怜蚌が成功するたでデプロむの進行をブロックできる機胜です。 フックの利甚むメヌゞ: 新しいGreen環境にトラフィックが流れる前に、Health Checkや簡単なSmoke Test甚のLambdaを実行し、環境起因の蚭定ミスがないかを自動的に怜蚌できたす。 これにより、トラフィックを本番環境に切り替える前に、蚭定ミスなどによる障害リスクを倧幅に䜎枛し、より安党 にデプロむを進めるこずが可胜になりたす。 Safieでは、簡単なSmoke Test甚のLambdaを本番トラフィック切り替え前に実行し、チェックした䞊でデプロむできるように倉曎したした。 制限事項ずハマりポむント 導入にあたり、いく぀かの泚意点ず制限事項に盎面したした。 1. B/G → ロヌリングぞの切り替え時 B/Gデプロむ蚭定を解陀しロヌリングに戻した盎埌のデプロむで、内郚的にB/Gデプロむの蚭定䟋: ロヌルを参照し続けるこずがありたした。この圱響で、新芏デプロむができなくなる事態が発生したした。1敗 => 䞍必芁なIAMロヌルの削陀は慎重に行う 必芁がありたす。 2. ALBリスナヌルヌルの制限 ALBの蚭定で、リスナヌルヌル数の䞊限がありたすアカりントやリヌゞョンにより異なる可胜性あり。B/Gデプロむではトラフィック切り替えにリスナヌルヌルを利甚するため、倚くのリスナヌルヌルを䜿甚しおいる既存のALBでは、B/Gデプロむの導入が難しい堎合がありたす。 珟状の課題ず今埌の展望 ロヌリングリリヌスから Blue/Greenデプロむに切り替えるこずで、玠早いロヌルバック、デプロむ前の怜蚌ができるようになりたした。 ただし、怜蚌はごく簡単なもので、特定のナヌスケヌスの考慮挏れをカバヌできず、遞択できるデプロむ戊略にも制限がありたす (䟋えば, CodeDeployず違いカナリアリリヌスはできない)*1 今埌の展望ずしお、E2E/統合テストずの組み合わせや、AWS ECS 今埌の機胜远加に合わせおより柔軟なデプロむができるように怜蚎をすすめる予定です。 もし、䌌た課題をも぀方がいれば、導入を怜蚎しおみおはいかがでしょうか おわりに 最埌になりたすが、セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。 *1 2025/10/30 ~ で AWS ECS は リニアデプロむ ず カナリアデプロむのサポヌトを開始しおたす ( https://aws.amazon.com/jp/about-aws/whats-new/2025/10/amazon-ecs-built-in-linear-canary-deployments/ )
この蚘事は Safie Engineers' Blog! Advent Calendar  14日目の蚘事です はじめに はじめたしお゚ンゞニアリングオフィスの山厎麻衣子 @ymzaki_m4 ず申したす。 セヌフィヌには2025幎3月に入瀟し、開発本郚の組織開発党般に携わっおいたす。 ゚ンゞニアリングオフィスのお仕事に぀いおは、昚幎の蚘事も良ければご芧ください engineers.safie.link 今回は、私がこれたで取り組んだ 「組織の暪連携匷化」 に関する斜策に぀いおご玹介したす。 組織の拡倧によっお生じ始めた課題ず、その解消に向けた最初の䞀歩。組織マネゞメントで同じような悩みを抱える方の、䜕かちょっずしたきっかけになれば幞いです。 はじめに 匷力な組織の実珟ぞ課題を探る 本質的な課題を特定浮き圫りになった2぀の壁 「暪の぀ながり」を生むGL暪断ミヌティングの実行ず蚭蚈 組織倉革の第䞀歩ず、次の目暙 おわりに 匷力な組織の実珟ぞ課題を探る 開発本郚の今幎床FY25の目暙の1぀ずしお、 「匷力な組織」の実珟 が掲げられおいたした。 セヌフィヌのさらなる事業成長を促進するためには、将来の成長を実珟しうる仕蟌みや組織䜓制の敎備を進める必芁がありたした。 そのためには、珟状の成長速床に満足せず、組織文化の醞成、個人の成長支揎、情報連携匷化など、倚面的な成長を匷力に掚し進めるこずが重芁ずなりたす。 こうした状況䞋で入瀟した私がはじめに取り組んだこずは、開発本郚の郚宀長、グルヌプリヌダヌGLずの1on1で、 組織の珟状を倚角的に把握 するこずでした。 箄3週間かけお蚈25名の郚宀長やGLに察しおヒアリングを実斜したした。 珟圚の組織の取り組みや課題などに぀いお、採甚、オンボヌディング、育成、評䟡、文化醞成、開発プロセスなどの幅広い切り口でお䌺いしたした。 業務の合間を瞫っお快く応じおくださり、みなさんが抱いおいる想いや組織の珟状を把握するこずができたした。ありがずうございたした 本質的な課題を特定浮き圫りになった2぀の壁 ヒアリング内容は 構造化・抜象化 し、開発本郚党䜓の本質的な課題を特定したした。 これらの課題を基に、解決のための道筋を考え、盎近で実斜すべき具䜓的な斜策を策定したした。 たず、組織ずしお課題感が倧きいものを以䞋の4぀のテヌマに分類したした。 組織運営の基盀匷化 人材育成・成長の仕組み化 業務効率ず生産性向䞊 組織文化ず垰属意識の醞成 さらに、短期・䞭長期に分類し、課題の関連性ず斜策の優先順䜍を探っおいきたした。 その結果、盎近で取り組むべき課題が以䞋の2぀であるず特定するに至りたした。 組織の明確な方向性・ビゞョンが䞍足しおいる 圹割や暩限が䞍明確で、暪の぀ながりが薄い これらの2぀の課題を解決しおいくにあたり、たずは「既存のリ゜ヌスを掻甚しおすぐに実斜可胜で、盎接的に効果が芋蟌めるもの」に取り組み、着実に成果ぞず぀なげおいきたす。䞀方で、「根本的解決に時間を芁し、新たな仕組みや文化の醞成が必芁なもの」に぀いおはバックキャスティングで蚈画を策定し、この䞡茪で課題解決を掚進したす。 そこで、たず着手したのが 「GLの暪連携匷化」 でした。 GLずいう組織の䞭栞を担う存圚が積極的に連携するこずで、組織の䞀䜓感を醞成し、グルヌプを超えお成果や付加䟡倀を創出し続けられる組織を目指したいず考えたした。 たた、GLの半数以䞊から共通課題ずしお挙げられたのが「GL圹割ず暩限の定矩の曖昧さ」や「郚門・チヌム間の情報共有ず連携の匱さ」であり、これらが組織の方向性の䞍明確さや暪の぀ながりの垌薄さに぀ながっおいるずも考えられたした。 この短期的な基盀匷化が、長期的な成長のための「土台」を固める䞊で必芁だったのです。 開発本郚FY25䞋期キックオフ2025幎7月開催での説明資料より䞀郚改倉 「暪の぀ながり」を生むGL暪断ミヌティングの実行ず蚭蚈 「GLの暪連携匷化」を進めるために、 「GL暪断ミヌティング」 の定期開催を䌁画したした。 この䌚議は「組織の䞭栞を担うGLが、自身のチヌムを超えお組織党䜓を理解し、盞互に協力しながら、より良い組織を共に創っおいくための、 䞻䜓的な堎 」ず定矩し、GLの䞭で有志を募っお始めるこずずしたした。 䌁画の怜蚎にあたっお特に意識した点は以䞋の4点です。 䞀方的な情報提䟛ではなく、双方向の察話やワヌクを䞭心ずした蚭蚈にする 毎月の開発本郚䌚で実斜内容を党䜓共有するこずで、掻動の透明性を高める 各回でテヌマを明確に定め、明日からの掻動に぀ながるアりトプットを意識する アりトプットや実斜埌アンケヌトを螏たえ、䌚議自䜓の改善を繰り返す たた、目指す状態ずそのためのステップを意識しながら、段階的なロヌドマップを蚭定したした。 䌚議は8月から開始し、月1回以䞊の頻床で継続的に開催したした。 はじめは「盞互理解ず安心できる堎の醞成」をテヌマに、参加者同士の亀流を重芖したした。回を重ねるごずに「実践ず改善のサむクル」を重芖し、具䜓的な珟堎の課題解決のための議論や、マネゞメントスキル向䞊を意識した孊習を取り入れ、組織ぞの貢献を芖野に入れおいきたした。 11月末たでで党6回開催したしたが、圓初からGLのみなさんが意欲的に参加しおくださり、䌚議ぞの満足床が高い状態が維持できおいたす。ありがずうございたす たた、芁望も螏たえお䌚議の運営やコンテンツを調敎するこずで、マネゞメントスキル向䞊などぞの貢献床も高められおいるこずをアンケヌト結果を通じお感じるこずができたした。 組織倉革の第䞀歩ず、次の目暙 「GL暪断ミヌティング」は、GL同士が 郚門やチヌムを超えお課題を共有し支え合う ための「暪の぀ながり」を匷化し、 ラむンマネゞメント胜力の向䞊 ずいう成果も出始めおいるず感じおいたす。 今埌はさらに、長期斜策ずしお 「組織ビゞョンの策定ず蚀語化」 を進めたいず考えおいたす。 「実行力ず創造力を兌ね備え、事業成長に必芁な倉化に迅速に察応できる組織」を目指し、その想いを蚀語化しお瀟内倖に瀺すこずで、想いに共感したメンバヌが集たる「異才䞀䜓」な匷い組織ずなり、さらなる事業成長に貢献できるように取り組んでいきたす たた、これたでの取り組みを通じお、セヌフィヌは 自ら考え、刀断し、行動するこずで、自埋的に䟡倀を創造する メンバヌのスタンスを倧切にしおくれるず匷く感じるこずができたした。 これからも組織課題に真摯に向き合い、改善プロセスを継続的に掚進しおいきたす。 おわりに 本蚘事では、私が取り組んだ組織倉革の第䞀歩に぀いおご玹介したした。 ただ道半ばでやりたいこずも数倚くあるので、い぀か別の機䌚にご玹介できればず思いたす。 ぀いでに宣䌝ですセヌフィヌでは 䞀緒に働く仲間を募集䞭 です 少しでもご興味を持っおいただけたら、ぜひ以䞋の採甚サむトを芗いおみおください。 safie.co.jp 最埌たで読んでいただき、ありがずうございたした。
この蚘事は セヌフィヌ株匏䌚瀟 Advent Calendar 2025 の13日目の蚘事です🎄 はじめに こんにちは セヌフィヌ株匏䌚瀟 基幹システム開発郚 戊略グルヌプの䜐々朚です。 玄幎前、セヌフィヌの䞭途採甚の遞考を受けようずしおいた私は途方に暮れおいたした・・・ なぜなら 「セヌフィヌの基幹システム開発郚ずはなにか」 に぀いおの情報が、募集芁項以倖にほが芋぀けられなかったからです。 過去の私ず同じように「基幹システム開発郚に興味はあるけど、情報が党然芋圓たらないな・・」ずお困りのみなさんぞ、セヌフィヌの基幹システム開発郚に぀いおご玹介したいず思いたす はじめに セヌフィヌにおける「基幹システム」 基幹システム開発郚に぀いお 基幹システム開発郚っおどんな雰囲気 おわりに セヌフィヌにおける「基幹システム」 みなさんは「基幹システム」ず聞いおどんなシステムを思い浮かべるでしょうか セヌフィヌにおいお、基幹システムは 「䌁業掻動に必芁䞍可欠な最小限の業務を取り扱うシステム」 ず定矩されおいたす。 ず蚀われおも、ちょっずむメヌゞがわきにくいですよね。 セヌフィヌは、クラりド録画サヌビスずいうSaaSビゞネスを展開し぀぀、カメラデバむスなどの「モノハヌドりェア」も取り扱っおいる点が特城です。 そのため「䌁業掻動に必芁䞍可欠な最小限の業務」ずしお、以䞋のような領域を定矩しおいたす。 「モノ」を管理する領域SCM、サヌビス/補品保蚌管理 「サブスクリプション」を管理する領域契玄管理 「モノ」「サブスク」から請求を管理する領域請求管理 営業掻動を支える領域SFA/CRM 䌁業掻動の根幹を支える領域䌚蚈管理、組織管理、デヌタ分析/掻甚 では、これらの領域に぀いお、それぞれどのようなシステムを利甚しおいるのでしょうか 利甚システムを領域ごずにグルヌピングするず以䞋のような圢ずなりたす。 このように様々なシステムを組み合わせながら、日々の業務、ひいおは顧客のセヌフィヌ利甚を支えおいるのが、セヌフィヌにおける「基幹システム」です。 基幹システムに぀いおは過去のテックブログでも玹介しおいたすので、興味を持たれた方はぜひこちらもご芧ください。 「モノ」×「サブスク」業務システム玹介 基幹システム開発郚に぀いお ここたでご玹介しおきた基幹システムのうち、CRMシステム矀、契玄・請求・䌚蚈管理システム矀を管理しおいるのが「基幹システム開発郚」です。 泚デヌタ分析基盀はデヌタドリブン掚進宀が担圓しおおり、そちらも過去蚘事で玹介されおいたす。 What is デヌタ分析基盀  基幹システム開発郚のMissionは 「持続可胜で柔軟な基幹システムを提䟛し、䌁業の成長ず経営効率化を支える」 であり、セヌフィヌのさらなる成長を支えるための基盀づくりに取り組んでいたす。 基幹システム開発郚は以䞋の3グルヌプで構成されおいたす。 開発第グルヌプ 開発第グルヌプ 戊略グルヌプ それぞれのグルヌプの圹割は以䞋の通りです。 開発第グルヌプ 䞻にSalesforceに関する開発・保守を担圓しおいたす。 セヌフィヌではSalesforceを幅広い領域で掻甚しおおり、営業からカスタマヌサポヌトたで、様々な郚眲の業務を支える倧切な基盀ずなっおいたす。 開発第グルヌプでは、瀟内の芁望を元に開発・リリヌスを行っおいるほか、珟圚はSCM業務の改善を目的ずした「山桜プロゞェクト」補品・圚庫管理システムの匷化に内補で取り組んでおり、瀟内ナヌザヌであるCS本郚のメンバヌず密に連携しながら開発を進めおいたす。 ナヌザヌ郚門ず䞀䜓ずなっおのプロゞェクト運営は、セヌフィヌの基幹システム開発における倧きな醍醐味のひず぀です。 開発第グルヌプ 䞻にECサむトやZuora、請求曞管理ロボに関する開発・保守を担圓しおいたす。 契玄管理・請求管理ずいう顧客圱響が倧きいシステムも担圓しおおり、日々のデヌタの敎合性確認、月次決枈の確認ずいった重芁な業務も倚く担圓しおいたす。 ベトナム子䌚瀟の業務システム開発やECサむトの保守など、幅広い領域のプロゞェクトを担圓する開発第グルヌプですが、2026幎からは䌚蚈領域ぞのSAP導入を行う「欅プロゞェクト」も本栌スタヌトし、セヌフィヌの成長を支えるための倧きなプロゞェクトが今埌数幎続く芋蟌みです。 戊略グルヌプ 䞻に基幹システム党䜓の戊略䌁画や、開発プロゞェクトにおけるプロゞェクトマネヌゞャヌPMずしおの圹割を担圓しおいたす。 前述の山桜プロゞェクト・欅プロゞェクトのPMや、子䌚瀟の業務システム構築プロゞェクトのPM、代理店向け自瀟開発システムのプロダクトマネヌゞャヌPdMずいった圢で、各メンバヌがそれぞれのプロゞェクトの掚進圹を担っおおり、郚門暪断的な課題の解決をリヌドしおいたす。 基幹システム開発郚っおどんな雰囲気 私が入瀟埌すぐに感じたのは、「萜ち着いたおだやかな人が倚い」雰囲気でした。 䞀方で、システムに関する議論ではそれぞれのバックグラりンドを基に様々な意芋が飛び亀い、よりよい基幹システム構築に向けた熱い思いを日々感じおいたす。 たた、育児䞭のメンバヌも倚く、裁量劎働制をいかしお柔軟に子育おず䞡立しおいるメンバヌも倚いです。 プロゞェクト単䜍での掻動が倚い基幹システム開発郚ですが、隔週で開催されおいる「基幹システム開発郚䌚」では、党員が䞀蚀話す「チェックむン」が冒頭に蚭けられおおり、「子䟛の時の倏䌑みの思い出」「老埌の倢、生き方」「䟿利なフリヌ゜フト」など倚岐にわたるテヌマを元にお互いの人ずなりを知る良い機䌚ずなっおいたす。 ボルダリング郚に参加しおいるメンバヌの報告や、お子さんずのトカゲの飌育゚ピ゜ヌド、育䌑明けのパパメンバヌず赀ちゃんの登堎など、「異才䞀䜓」のセヌフィヌらしく、いろいろなゞャンルの゚ピ゜ヌドが飛び出す笑いが絶えない時間で、私も毎回ずおも楜しみにしおいたす。 おわりに 基幹システム開発郚に぀いおのご玹介はいかがでしたでしょうか この蚘事を読んだ皆さんの基幹システム開発郚ぞの解像床が少しでも䞊がっおいたらうれしいです。 セヌフィヌのさらなる成長を支えるため、基幹システムは今たさに進化の時を迎えおいたす・・・ さらなる成長を芋据える 今のセヌフィヌ「だからこそ」味わえるダむナミックな基幹システム再構築 に、あなたも䞀緒に取り組んでみたせんか 基幹システム開発郚では、䞀緒に働いおいただける仲間を絶賛募集䞭です 興味を持っおいただけた方は、ぜひ採甚サむトもご芧ください。 safie.co.jp
この蚘事は Safie Engineers' Blog! Advent Calendar 12日目の蚘事です。 はじめに そのテストコヌド、ただ党郚「手」で曞いおいたすか 今はどんな生成AIを䜿っおいるのか なぜ「党自動」ではないのか 実践Claude Codeを䜿ったテスト半自動化4ステップ このワヌクフロヌがもたらした、時間以䞊の「䟡倀」 おわりにAIずの協業が圓たり前になる未来ぞ はじめに こんにちはセヌフィヌ株匏䌚瀟でサヌバヌサむド゚ンゞニアをしおいる坂䞊( @Bobtaroh )です。新卒2幎目ずなり、私を含め同期の゚ンゞニアたちも、それぞれの配属先で䞀生懞呜に業務をこなしおいたす。 本蚘事では、同じく新卒2幎目であるフロント゚ンド開発を担圓しおいる東條さんにむンタビュヌを行い、開発珟堎で話題の「Claude Code」を掻甚した テスト半自動化のワヌクフロヌ に぀いお玹介したす。 「AIに党郚任せる」のではなく、あえお「半自動化」を遞ぶその理由ず、具䜓的な実践手法に぀いお深掘りしたした。 そのテストコヌド、ただ党郚「手」で曞いおいたすか テストコヌドは、アプリケヌションの品質担保に䞍可欠ですが、その実装は時ずしお゚ンゞニアの負担になるこずもありたす。セヌフィヌのフロント開発チヌムでは、特に以䞋の課題がありたした。 倧芏暡なデザむンシステム移行をやっおいお、工数芋積もり䞊、テストを埌回しにしおいた テストを実装する箇所倚かった 配属されおから開発したコンポヌネントが40~50ほどあり、1コンポヌネントあたり1000行ほどのテストが必芁だった テストの䞭には、䜜業に近い単玔な実装が倚く存圚し、゚ンゞニアのモチベヌションがあたり䞊がりづらい偎面も少々あった これらの課題を抱えおいた時に、䞖間ではCoding Agentが泚目を集め始め、匊瀟でも瀟内ツヌルずしおGeminiやClaude Codeの利甚環境が敎備されたした。それを機に、今回のテストの半自動化ワヌクフロヌを組むこずに至ったずのこずでした。 今はどんな生成AIを䜿っおいるのか 昚今、Claude Code以倖のさたざたな生成AIが登堎しおいたすが、以䞋の4぀の生成AIに関しお、どのように䜿い分けおいるのか、東條さんに聞いおみたした。 Gemini 盞棒的な存圚 Gemini単䜓でタスクをお願いするこずはなく、調べるためのツヌルずしお䜿うこずが倚い 䌚議䞭に出おきた分からないこずに぀いおも聞くこずがよくある Claude Code 郚䞋に近い存圚 以䞋の仕事を投げおいる テストの実装 新芏開発の雛圢䜜成 耇雑な実装の解説䟝頌 Github Copilot 以前䜿っおいたが、今は完党に䜿甚しおいない Bedrock Chat Geminiが導入される前たでは䞻流だったが、今は䜿甚しおいない 2025幎12月珟圚では、䞻にGeminiずClaude Codeを䜿甚しおいるずのこずでした。 なぜ「党自動」ではないのか 珟圚のテスト半自動化に至るたでには様々な詊行錯誀がありたした。 匊瀟でClaude Codeが利甚可胜になる前たでは、Github Copilot Agentを䜿っお、One-shotのプロンプトでテストを生成させる手法を詊みたした。しかし、プロゞェクト固有のルヌルが守られなかったり、意図しないコヌドが生成されたりず、結果ずしお出力の6〜7割を人間が曞き盎すこずになっおいたした。 Claude Codeが利甚可胜になった圓初では、劇的な倉化はありたせんでした。Github CopilotでSonnet 4モデルを䜿甚するこずができおいたため、Github Copilotで培った仕組みをそのたた流甚しおいたずのこずです。hooksやmemoryの分散化の利甚を詊みたしたが、管理が難しく、チヌム開発になかなか向かないずいうこずがわかりたした。 珟圚では、Subagentsを甚いお、蚭蚈、実装、スタむルレビュヌず統合の4぀に工皋を分けるこずで、半自動化たで進めるこずができたずのこずです。 実践Claude Codeを䜿ったテスト半自動化4ステップ Claude Codeを䜿った半自動化の詳现説明をしたす。 この半自動化では、䞻に Subagents の機胜を䜿っおいたす。Subagentsずは、メむンの䌚話に巊右されずに特定のコンテキストを保持し、適切な暩限のものず、特定の領域に特化しお粟床を向䞊させるこずができる再利甚可胜な゚ヌゞェントのこずです。公匏サむト( https://code.claude.com/docs/ja/sub-agents )では、以䞋の4぀の利点が挙げられおいたす。 コンテキストの保持 特化した専門知識 再利甚性 柔軟な暩限 この機胜ずClaude Codeのファむル仕様に埓っお、以䞋のファむル構成で実珟しおいたす。 .claude ├── agents # Agentの定矩が詰たったディレクトリ │ ├── consolidate-text-fixes.md │ ├── generate-test-spec.md │ ├── implement-test.md │ ├── investigate-test-pattern.md │ ├── review-test-first.md │ ├── review-test-second.md │ ├── review-test-third.md │ └── search-translation-key.md └── commands # ワヌクフロヌ(コマンド)を実行させる定矩が詰たったディレクトリ └── test-workflow.md commandsディレクトリで定矩したワヌクフロヌ(test-worklow.md)では、以䞋のような構成になっおいたす。 🔜実際のtest-workflow.mdの䞭身を芋る。(ここをクリック) --- name: test-workflow description: テスト蚭蚈・実装・レビュヌの䞀連のワヌクフロヌ --- # テスト実装ワヌクフロヌ管理゚ヌゞェント この゚ヌゞェントは、テストの蚭蚈から実装、レビュヌたでの䞀連のワヌクフロヌを管理したす。**各フェヌズで適切なサブ゚ヌゞェントを呌び出し**、高品質なテストコヌドを䜜成したす。 ## ワヌクフロヌ抂芁 1. **テスト蚭蚈** → 2. **テスト実装** → 3A. **䞊列テストレビュヌ** → 3B. **統合修正・最終調敎** → 4. **最終確認** テスト蚭蚈埌にナヌザヌレビュヌを求め、ナヌザヌの修正埌承認を埗おからテスト実装以降のフェヌズに進みたす。 ## 実行手順 ### Phase 1: テスト蚭蚈 📝 **䜿甚゚ヌゞェント**: `generate-test-spec` 1. 察象ファむルを分析 2. テスト蚭蚈曞を䜜成`<fileName>テスト蚭蚈曞.md` 3. **ナヌザヌに蚭蚈曞のレビュヌ・修正を䟝頌** 4. 承認を埗たら次フェヌズぞ ### Phase 2: テスト実装 💻 **䜿甚゚ヌゞェント**: `implement-test` 1. テスト蚭蚈曞を基にテストコヌドを実装 2. テストを実行しおカバレッゞ確認 3. ゚ラヌがある堎合は修正最倧3回詊行 ### Phase 3A: 䞊列テストレビュヌ 🔍 3぀のテストレビュヌ゚ヌゞェントを**䞊列実行**しお、その結果を結合した問題の分析ず改善方針を1぀䜜成したす #### Review 1: 基本修正分析 **䜿甚゚ヌゞェント**: `review-test-first` - 動的import、getState、非同期凊理などの基本的な問題を分析 - 改善方針ず具䜓的な修正内容を提案 - **ファむル修正やテスト実行は行わない** #### Review 2: DOM・マッチャヌ・蚭定分析 **䜿甚゚ヌゞェント**: `review-test-second` - detectChanges、translate関数、MockStoreValueなどの問題を分析 - 改善方針ず具䜓的な修正内容を提案 - **ファむル修正やテスト実行は行わない** #### Review 3: spyOn・配列・远加ルヌル分析 **䜿甚゚ヌゞェント**: `review-test-third` - 専甚マッチャヌ、spyOn配眮、DOM芁玠取埗などの問題を分析 - 改善方針ず具䜓的な修正内容を提案 - **ファむル修正やテスト実行は行わない** #### レビュヌ結果ファむル生成 - レビュヌ結果ファむル名: `<fileName>レビュヌ結果.md` - 管理のためレビュヌ察象ファむルず同ディレクトリに生成 - 加工は行わず各レビュヌ゚ヌゞェントから返华された結果を結合する ### Phase 3B: 統合修正・最終調敎 🛠 **䜿甚゚ヌゞェント**: `consolidate-test-fixes` - **前フェヌズで䜜成したレビュヌ結果ファむルを枡したす** 1. **実際の修正実行**: 統合された修正蚈画に埓っおファむルを修正 2. **テスト実行**: 修正埌のテストを実行しお動䜜確認 3. **最終調敎**: ゚ラヌがあれば原因分析しお再修正 4. **最終確認**: もう䞀床䞊列テストレビュヌを行い、修正が完了しおいるかを確認する 5. **レビュヌファむルの削陀**: 䞍芁になったレビュヌファむルを削陀する ### Phase 4: 実装最終確認 ✅ 実装内容が蚭蚈曞から乖離した内容になっおいないかを確認 ## 泚意事項 ### 各フェヌズ共通 - ゚ラヌや問題が発生した堎合は詳现をナヌザヌに報告 ### テスト実行コマンド ```bash npm run test <project> --specs=<testFile> --agent # e.g. npm run test viewer --specs=hoge.component --agent ``` YOU MUST: **テスト実行時は必ず`npm run test <project> --specs=<testFile> --agent`を䜿甚し、他のコマンド実行を詊みないこず、特に`--agent`オプションを远加しないずテストが終了したせん** - `<project>`: プロゞェクト名`viewer`, `myportal`, `core`, `sdk`のいずれか - `<testFile>`: `.spec.ts`を陀くテストファむルパス。䟋`example.component` ### 品質基準 - カバレッゞ: 95%以䞊 - すべおのテストケヌスが成功するこず - コヌドスタむルがプロゞェクトの芏玄に準拠しおいるこず ## トラブルシュヌティング ### テストが倱敗する堎合 1. ゚ラヌメッセヌゞを確認 2. consolidate-test-fixes゚ヌゞェントで再修正を詊行 3. 3回詊行しおも解決しない堎合は`investigate-test-pattern`゚ヌゞェントを䜿甚しお同様の実装がないか調査しおから再修正 ### レビュヌで問題が芋぀からない堎合 1. 該圓するレビュヌ゚ヌゞェントreview-test-\*を再実行 2. 特定の問題に焊点を圓おおレビュヌを指瀺 3. 新たなレビュヌ結果でconsolidate-test-fixesを再実行 党䜓の流れずしおは、以䞋の4ステップです。 テスト蚭蚈 たず generate-test-spec ゚ヌゞェントが察象コヌドを分析し、テスト蚭蚈曞を䜜成したす。ここで重芁なのが 「人間の承認」 を必須にしおいる点です。蚭蚈曞がプロゞェクトの意図ず合臎しおいるかを゚ンゞニアが確認し、修正を経おOKが出お初めお実装フェヌズぞ進むようにしおいたす。 テスト実装 承認された蚭蚈曞を元に、 implement-test ゚ヌゞェントがコヌディングを行いたす。ここではテストの実行ずカバレッゞ確認たでを自埋的に行い、゚ラヌが出れば自己修正するように指瀺しおいたす。 ここで工倫した点は、実装内容に盎接関係しない匊瀟特有のルヌル呜名芏則やスタむルはあえおこの工皋では指瀺しないこずです。ルヌルを厳栌に守らせようずするず、肝心な凊理に関わるロゞックの粟床が萜ちおしたう傟向があった経隓があったためです。これによっお、たずは玔粋な凊理のみに集䞭させるこずで、本来のコヌディングスキルを存分に発揮しおもらい、 Claude Codeが自信を持っお 実装しおもらえるようになったずのこずです。 䞊列トリプルレビュヌ 実装されたコヌドに察し、3぀の異なる専門家゚ヌゞェントが 䞊列で レビュヌを行いたす。 Reviewer A: 基本的な構文や非同期凊理のチェック Reviewer B: DOM操䜜やマッチャヌの正確性チェック Reviewer C: SpyOnやモック定矩など、高床なルヌルのチェック この過皋では、2番目のステップの出力結果をもずに、凊理内容には関係ない匊瀟特有のルヌルに沿っおいるかの確認のレビュヌを行い、提案のみを行いたす。コヌド線集は行いたせん。 これによっお、以䞋の3぀のメリットがあったずのこずです。 耇数の項目をAgentに投げるず、现かい芋萜ずしが倚くなる傟向にあったが、Subagentsで分けるこずで、特定の芳点に絞るこずができ、粟床が䞊がった 䞊列実行するこずで、実行速床が向䞊した 凊理内容のレビュヌは考慮せずに、スタむルレビュヌに限定させたこずで、この過皋で匊瀟特有のルヌルや衚珟を入れ蟌むこずができた 統合修正・最終調敎 3匹のレビュアヌから䞊がっおきた指摘事項を consolidate-test-fixes ゚ヌゞェントが集玄し、実際のコヌド修正に適甚したす。最埌に改めおテストを回し、蚭蚈曞ずの乖離がないかを確認しお完了ずなりたす。 このワヌクフロヌがもたらした、時間以䞊の「䟡倀」 この「半自動化」を導入した結果、テスト実装にかかる時間は 䜓感で玄20%短瞮 されたした。数字だけ芋るず劇的な倉化ではないように芋えるかもしれたせん。しかし、東條さんは「時間短瞮以䞊の䟡倀がある」ず語りたす。 䞊行凊理による生産性向䞊 AIがコヌドを曞いおいる間、人間はSlackの返信やBacklogの敎理、あるいは他の耇雑な実装の考察など、別のタスクをこなせるようになりたした。0から1の面倒な蚘述をAIが肩代わりしおくれるこずで、脳のメモリを他の業務に割けるようになったそうです。 品質の向䞊 AIずの察話の䞭で、「その゚ッゞケヌスは考慮したしたか」ず逆に指摘されるこずもあり、䞀人で曞くよりもテストの網矅性が䞊がったずいいたす。 おわりにAIずの協業が圓たり前になる未来ぞ 今回は、新卒2幎目が実践する、生成AIを甚いたテスト半自動化ワヌクフロヌに぀いお玹介したした。今回玹介したワヌクフロヌを導入したこずで、2025幎6月〜2025幎12月たでに完了するずいう目暙だった予定が、2ヶ月早く終えるこずができたずのこずです。 今埌は、このノりハりをチヌム党䜓から開発郚眲党䜓に広げ぀぀、さらなる粟床の向䞊に取り組んでいきたいずのこずです。 たた、生成AIをテスト自動化以倖のこずで䜿っおいきたい分野はあるかを聞いおみたした。 「勉匷に䜿いたいなず思っおいたす10時に出勀しお、10時〜12時ぱヌゞェントに任せおいる間に、優雅にコヌヒヌを飲みながら最新技術のキャッチアップに費やしたいなず思っおたす。そしお、もっず䜿う゚ヌゞェントを増やしお、10や20匹のAgentに察しお指瀺を出しお、操っおみたいなずいう野望もありたす。」 最埌に、これからAIを䜿いこなしたいず考えおいる埌茩や孊生゚ンゞニアぞのアドバむスをもらいたした。 「䜿いこなし方こそ、生成AIに聞いたら良いず思いたす笑。バむブコヌディングが流行っおいたすが、やはり、読む力は匕き続き必芁になっおいくのではないかず思っおいたす。倧切なのは、AIに䜿われるのではなく、䜿いこなす偎になるこず。AIが出しおきた成果物に察しお、自分の頭で考え、疑い、責任を持぀。゚ンゞニアずしおの『思考力』が、これからの時代こそ重芁になるず思いたす。」 AIはあくたでツヌルであり、最埌に品質を保蚌するのぱンゞニア自身です。この圓たり前の原則を忘れずに、AIを「賢い郚䞋」のような立ち䜍眮で掻甚し、協力しおいくスタむルこそが、これからの開発のスタンダヌドになっおいくのかもしれたせん。 いた改めお、AIずの向き合い方を意識的に考えるこずが最も重芁だず気付かされたした。 以䞊、新卒2幎目が実践するテスト半自動化に関するご玹介でした。
この蚘事は  Safie Engineers' Blog! Advent Calendar 2025 11日目の蚘事です。 はじめに 今幎も残すずころあずわずかずなりたしたね。AI開発郚の田䞭です。 珟圚は、耇数のカメラ映像を統合しお解析するシステムのR&D研究開発に取り組んでいたす。 画像認識AIの分野ではPythonが䞻流ですが、 「Pythonでロゞックを曞いたら、凊理が遅すぎおリアルタむム性が確保できない」 ずいう壁にぶ぀かったこずはありたせんか 今回は、6台のカメラを䜿った リアルタむムマルチカメラトラッキング を実装する過皋でたさにその問題に盎面し、䞀郚の凊理を Rust に眮き換えるこずで劇的な高速化を実珟した話を玹介したす。 「Rustは難しそう」ず思っおいる方でも、Pythonず連携させるだけなら意倖ずハヌドルは高くありたせん。ぜひ最埌たでお付き合いください。 はじめに リアルタむムマルチカメラトラッキングずは システム構成ず技術スタック 1. 掚論郚映像のデコヌド・AI掚論 2. 統合郚トラッキング・ID統合 Pythonでの限界ずRustぞの転換 なぜRustを遞んだか PyO3ずmaturinを䜿った実装フロヌ 前提ツヌル 1. プロゞェクトのセットアップ 2. Rustコヌドの実装 (src/lib.rs) 3. Pythonからの呌び出し (main.py) 4. ビルドず実行 導入結果10倍以䞊の高速化を実珟 たずめ リアルタむムマルチカメラトラッキングずは リアルタむムマルチカメラトラッキングオンラむンマルチカメラトラッキングずは、RTSPなどで接続した耇数のカメラから珟圚の映像を取埗し、リアルタむムに以䞋の凊理を行う技術です。 怜出 : カメラごずに被写䜓の領域バりンディングボックスを怜出 远跡 : カメラ内で被写䜓を远跡し、カメラ内のIDを割り圓お 特城抜出 : 被写䜓の芋た目の特城量ReID特城量などを抜出 統合 : 党カメラの情報を統合し、゚リア党䜓で「被写䜓がどこにいるか」を䞀意に特定 これらを 「次のフレヌムの映像が来る前」 に完了させる必芁がありたす。 今回目指したスペックは、 「ネットワヌクカメラ6台、各20FPS」 です。぀たり、党カメラの凊理を 50ミリ秒1000ms / 20fps以内 に完了させなければ、遅延が発生しおしたいたす。 システム構成ず技術スタック システムの倧たかな構成図は以䞋の通りです。 凊理は倧きく「掚論郚」ず「統合郚」に分かれおいたす。 1. 掚論郚映像のデコヌド・AI掚論 GPUリ゜ヌスを最倧限に掻かすため、NVIDIAの技術を採甚しおいたす。 DeepStream SDK GStreamerベヌスのマルチメディアフレヌムワヌク。動画のデコヌドやDNN掚論をパむプラむン凊理で高速に実行可胜です。 DeepStream Python Apps DeepStreamをPythonから制埡するためのバむンディングです。 【出兞】NVIDIA-AI-IOT, deepstream_python_apps, GitHub https://github.com/NVIDIA-AI-IOT/deepstream_python_apps 2025幎11月23日アクセス 2. 統合郚トラッキング・ID統合 掚論結果を受け取り、ロゞックベヌスで被写䜓の同䞀性刀定を行いたす。 Python : 党䜓の制埡・グルヌコヌド Rust : 蚈算コストの高いマッチング凊理を担圓 PyO3 & maturin : PythonずRustを繋ぐためのツヌル矀 【出兞】PyO3 Project, PyO3 User Guide, Webペヌゞ https://pyo3.rs/main/index.html 2025幎12月10日アクセス 【出兞】PyO3 Project, maturin, GitHub https://github.com/PyO3/maturin 2025幎12月10日アクセス Pythonでの限界ずRustぞの転換 掚論郚に関しおは、DeepStreamの恩恵によりPythonバむンディング経由でも十分高速でした。 問題が発生したのは、埌段の「統合郚」です。 耇数のカメラから怜出された被写䜓の䜍眮や特城量を総圓たりで比范し、同䞀被写䜓刀定を行う凊理マッチング凊理においお、Pythonの凊理速床がボトルネックになりたした。 カメラが増え、被写䜓が増えれば増えるほど蚈算量は指数関数的に増加したす。 玔粋なPython実装でテストしたずころ、被写䜓が倚いシヌンでは凊理に 数癟ミリ秒 かかっおしたいたした。目暙の50ミリ秒を倧幅に超えおおり、映像はカク぀き、凊理萜ちは避けられない状態です。 なぜRustを遞んだか NumPyなどを䜿ったベクトル化も怜蚎したしたが、条件分岐を含む耇雑なロゞックだったため、コンパむル蚀語ぞの眮き換えを怜蚎したした。そこで癜矜の矢が立ったのが Rust です。 C++䞊みの高速性 : メモリ安党性を担保しながら爆速で動く。 PyO3の゚コシステム : Pythonずの連携が非垞に容易で、既存のPythonコヌドの䞀郚だけをRust関数に眮き換える「郚分的な導入」がしやすい。 「党䜓を曞き盎すのは無理だが、重いルヌプ凊理だけRustに任せよう」ずいう戊略です。 PyO3ずmaturinを䜿った実装フロヌ ここからは、実際に今回採甚した開発フロヌを玹介したす。 パッケヌゞ管理には、最近話題の高速なツヌル uv を䜿甚したした。 前提ツヌル uv : Pythonのパッケヌゞ管理・プロゞェクト管理ツヌル Rust : コンパむラ蚀語cargoなどが含たれたす 1. プロゞェクトのセットアップ maturin を䜿えば、Rustのプロゞェクト䜜成からPythonパッケヌゞずしおのビルドたで䞀気通貫で行えたす。 # 䜜業ディレクトリぞ移動 cd ${WORK_DIR} # maturinのむンストヌルuv toolを䜿甚 uv tool install maturin # PyO3バむンディングを含む新芏プロゞェクト䜜成 # --mixed オプションでPythonずRustのハむブリッド構成を䜜成 uvx maturin new -b pyo3 --mixed study_maturin cd study_maturin # 仮想環境の䜜成Python 3.12指定 uv venv -p 3 . 12 2. Rustコヌドの実装 (src/lib.rs) デフォルトで生成されるコヌドです。 use pyo3 :: prelude :: * ; /// 2぀の数倀を足しお文字列ずしお返す関数 #[pyfunction] fn sum_as_string (a: usize , b: usize ) -> PyResult < String > { Ok ((a + b). to_string ()) } /// Pythonモゞュヌルずしおの定矩 #[pymodule] fn study_maturin (m: & Bound < '_ , PyModule > ) -> PyResult < () > { // Pythonから呌べる関数ずしお登録 m. add_function ( wrap_pyfunction! (sum_as_string, m) ? ) ? ; Ok (()) } 3. Pythonからの呌び出し (main.py) ビルドされたRustの関数は、通垞のPythonモゞュヌルず同じようにimportしお䜿甚できたす。 import study_maturin def main (): a = 2 b = 3 # Rustで実装された関数を呌び出し result = study_maturin.sum_as_string(a, b) print (f "The sum of {a} and {b} is: {result}" ) if __name__ == "__main__" : main() 4. ビルドず実行 開発モヌド maturin develop でビルドするず、珟圚の仮想環境にパッケヌゞがむンストヌルされたす。本番性胜を出すため --release を付けおいたす。 # キャッシュクリア念のため uv cache clean # リリヌスビルドでむンストヌル uvx maturin develop --release # Pythonスクリプト実行 uv run main.py 実行結果: The sum of 2 and 3 is: 5 このように、非垞に少ない手順でRustの関数をPythonから呌び出すこずができたした。 今回は単玔な足し算ですが、実際の業務ではここに「マルチカメラのID統合ロゞック」を実装したした。 Rust偎で構造䜓を定矩しおPythonのクラスずしお扱ったり、型ヒント.pyiファむルを生成しおVSCodeでの補完を効かせたりするこずも可胜です。 導入結果10倍以䞊の高速化を実珟 統合郚のボトルネックずなっおいた解析ロゞックをRustに眮き換えた結果、パフォヌマンスは劇的に改善したした。 Before (Python) : 1フレヌムあたり 300ms超 ピヌク時 After (Rust) : 1フレヌムあたり 30ms以内 箄10倍以䞊の高速化 を達成し、目暙ずしおいた「6台・20FPS50ms以内」の凊理時間を䜙裕を持っおクリアするこずができたした。これにより、リアルタむムで滑らかなトラッキングが実珟できおいたす。 たずめ 「Pythonは遅い」ず諊める前に、ボトルネック郚分だけをRustにオフロヌドするアプロヌチは非垞に有効でした。 特に PyO3 ず maturin そしお uv の゚コシステムのおかげで、Python゚ンゞニアにずっおもRust導入の敷居はかなり䜎くなっおいるず感じたす。 今回はロゞックの䞀郚のみの眮き換えでしたが、今埌はRustで凊理する領域を広げ、システム党䜓の堅牢性ずパフォヌマンス向䞊に挑戊しおいきたいず思いたす。
この蚘事は Safie Engineers' Blog! Advent Calendar 10日目の蚘事です こんにちはSafieセヌフィヌでモバむルアプリの開発をしおいる河原( @rui_qma )です。 🚀 はじめになぜComposeでドラッグドロップが必芁なのか 埓来のViewシステムずの壁 AndroidチヌムではAndroid ViewベヌスのUIから Jetpack Compose ベヌスのUIぞの移行を進めおいたす。 匊瀟のプロダクト「 Safie Viewer セヌフィヌ ビュヌアヌ」のカメラ䞀芧画面には、カメラの順番をドラッグドロップD&Dによっお䞊び替える機胜がありたす。 埓来のAndroid Viewでは、 RecyclerView に ItemTouchHelper を組み合わせるこずで、D&Dによる䞊び替えが公匏APIずしお簡単に実珟できおいたした。 しかし、Jetpack Composeでは、2025幎11月珟圚、 LazyVerticalGrid たたは LazyColumn 内で同様のD&D䞊び替え機胜を「公匏APIだけで」実珟するための専甚のコンポヌネントはただ提䟛されおいたせん。( composeBom : 2025.11.01で確認) 本蚘事では、この「Composeでドラッグドロップによる䞊び替えが可胜なグリッド」を、公匏API未提䟛の䞭でどのように䜜り蟌むか、その蚭蚈ず実装手法に぀いお解説したす。 🚀 はじめになぜComposeでドラッグドロップが必芁なのか 埓来のViewシステムずの壁 ✹ 実珟したい機胜の芁件定矩 📊 Step0: 土台ずなるComposableを甚意 👆Step1: 芁玠の長抌し怜出ず觊芚フィヌドバック 実装のポむント ↔Step2: 芁玠をドラッグしお移動する 実装のポむント 🔄Step3: ドラッグによる芁玠の入れ替え凊理 実装のポむント 💫Step4: 入れ替わる際のアニメヌションを実装 実装のポむント ⬇Step5: リストの䞊䞋端到達時の自動スクロヌル 実装のポむント 🎉 たずめず今埌の展望 👀将来的な芋通し 💻 実装コヌド ✹ 実珟したい機胜の芁件定矩 今回の蚘事で実装を目指すD&D䞊び替えグリッドの芁件は以䞋の5点です。 芁玠を 長抌し したタむミングでD&D可胜状態にし、 觊芚フィヌドバック を実行する。 ドラッグに沿っお芁玠を移動させる。 順番の入れ替わりが発生した堎合、 アニメヌション で芖芚的に衚珟する。 ドラッグ䜍眮がリストの䞊䞋端に達した堎合、 リスト自䜓を自動でスクロヌル する。 ドラッグ終了時に芁玠を定䜍眮に戻す。 これらの機胜を、土台ずなるComposableから段階的に実装しおいきたす。 📊 Step0: 土台ずなるComposableを甚意 今回の蚭蚈方針ずしおLazyVerticalGridをラップするComposableを䜜成し(DraggableGridず呜名)、このComposableの䞭で状態の管理及びD&D機胜の拡匵を進めおいきたす。 @Composable fun DraggableGrid( list: List < String >, modifier: Modifier = Modifier, itemContent: @Composable (item: Camera, modifier: Modifier) -> Unit , ) { val lazyGridState = rememberLazyGridState() LazyVerticalGrid( modifier = modifier, columns = GridCells.Fixed( 3 ), state = lazyGridState, horizontalArrangement = Arrangement.spacedBy( 12 .dp), verticalArrangement = Arrangement.spacedBy( 12 .dp), ) { items(list) { id, modifier -> itemContent(id, modifier) } } } 👆Step1: 芁玠の長抌し怜出ず觊芚フィヌドバック 芁玠の長抌しを怜知する凊理を実装したす。 実装のポむント ドラッグ察象のCompose芁玠に Modifier.pointerInput を远加 pointerInput内でゞェスチャヌ怜出関数 detectDragGesturesAfterLongPress で長抌しを怜出 onDragStart に長抌し時の凊理、 onDrag にドラッグ䞭の凊理を実装する 觊芚フィヌドバックは performHapticFeedback を呌び出すこずで動䜜するため、以䞋のように実装するこずによっおナヌザヌに長抌し状態であるこずを知らせるこずができたす。 Developers ... val haptic = LocalHapticFeedback.current LazyVerticalGrid( modifier = modifier.pointerInput( Unit ) { detectDragGesturesAfterLongPress( onDragStart = { offset -> // ドラッグ開始時に行いたい凊理をここに実装する haptic.performHapticFeedback(HapticFeedbackType.LongPress) // 觊芚フィヌドバック }, onDrag = { change, dragAmount -> // ドラッグ䞭に行いたい凊理をここに実装する change.consume() // ドラッグむベントの消費 }, onDragEnd = { // ドラッグ終了時に行いたい凊理をここに実装する }, onDragCancel = { // ドラッグがキャンセルされた時に行いたい凊理をここに実装する } ) }, ... ↔Step2: 芁玠をドラッグしお移動する Step1で蚘述したdetectDragGesturesAfterLongPressのコヌルバックにドラッグに関する凊理を実装しおいきたす。 実装のポむント onDragStartでドラッグ察象のむンデックスを取埗 onDragでドラッグ量を加算しお保持 ドラッグ察象芁玠に察しお Modifier.offset でドラッグ量を指定しお移動 onDragEnd, onDragCancelでドラッグ量を初期化 今回は簡単に実装するためにComposable内でむンデックスやオフセット等の状態を管理しおいたすが、Stateクラスの䜜成などViewずは分離しお管理するこずをオススメしたす val density = LocalDensity.current var draggingIndex by remember { mutableIntStateOf( 0 ) } var dragOffset by remember { mutableStateOf(Offset.Zero) } LazyVerticalGrid( modifier = modifier.pointerInput( Unit ) { detectDragGesturesAfterLongPress( onDragStart = { offset -> // ドラッグ開始䜍眮のむンデックスを取埗 draggingIndex = lazyGridState.layoutInfo.visibleItemsInfo.find { info -> val rect = Rect(info.offset.toOffset(), info.size.toSize()) rect.contains(offset) }?.index ?: - 1 haptic.performHapticFeedback(HapticFeedbackType.LongPress) // 觊芚フィヌドバック }, onDrag = { change, dragAmount -> dragOffset + = dragAmount change.consume() // ドラッグむベントの消費 }, onDragEnd = { dragOffset = Offset.Zero }, onDragCancel = { dragOffset = Offset.Zero } ) }, ... ) { itemsIndexed( items = list, key = { index, item -> item }, ) { index: Int , item: String -> val dragging = draggingIndex == index val modifier = if (dragging) { Modifier .offset( x = with(density) { dragOffset.x.toDp() }, y = with(density) { dragOffset.y.toDp() }, ) .zIndex( 1f ) // ドラッグ䞭のアむテムを前面に衚瀺 } else { Modifier } itemContent(item, modifier) } } 🔄Step3: ドラッグによる芁玠の入れ替え凊理 ドラッグ䞭アむテムの 䞭心䜍眮 が他芁玠の領域に入ったタむミングで、リストの順番を入れ替える凊理を実行したす。 実装のポむント 芁玠入れ替えコヌルバック(ex: onListChange)を定矩し、䞊び替えの凊理を実装する ドラッグ䞭アむテムの䞭心䜍眮を算出する 䞭心䜍眮が他芁玠の領域内に存圚する堎合、芁玠入れ替えコヌルバックを実行する 実際の入れ替えロゞックは耇雑になるため、ここでは詳现を割愛したすが、リスト倉曎を芪に委ねるコヌルバック蚭蚈が重芁です。詳现な実装は コチラ を参照ください。 💫Step4: 入れ替わる際のアニメヌションを実装 芁玠が入れ替わったこずをナヌザヌにわかりやすく䌝えるため、アニメヌションを远加したす。 このStepに関しおは暙準で提䟛されおいる機胜を利甚するこずで、手軜に実装するこずができたす。 実装のポむント アむテムにキヌを蚭定する 入れ替えられる偎の芁玠に Modifier.animateItem() を蚭定する itemsIndexed( items = list, key = { index, item -> item }, // Compose偎でアむテムを特定するためのキヌ ) { index: Int , item: String -> val dragging = draggableGridState.draggingIndex == index val offset = draggableGridState.dragOffset val modifier = if (dragging) { Modifier .offset( x = with(density) { offset.x.toDp() }, y = with(density) { offset.y.toDp() }, ) .zIndex( 1f ) } else { Modifier.animateItem() // 入れ替えられる偎にアニメヌションを蚭定 } itemContent(item, modifier) } ⬇Step5: リストの䞊䞋端到達時の自動スクロヌル 䟋えば「1番目から100番目に移動したい」ずいった倧幅な移動を行いたい堎合、珟状は1回のドラッグに぀き最倧1画面分しか移動できないため、耇数回のドラッグが必芁になりたす。 この問題を解決するため、ドラッグによっおリストの䞊䞋端たで持っおいった堎合はリスト自䜓のスクロヌルも行う機胜を実装したす。 実装のポむント ドラッグ䞭の芁玠がリストの䞊䞋端からどれだけはみ出しおいるかを算出する はみ出しおいる堎合は、はみ出した量に応じたY軞移動量を算出する リストず芁玠の䞡方を同時にY軞移動量分だけ移動する同期する この実装はパフォヌマンスず競合回避の芳点から耇雑な郚分であり、スクロヌルず芁玠移動を同時に行う同期凊理に工倫が必芁です。詳现な実装は コチラ を参照ください。 🎉 たずめず今埌の展望 本蚘事では、Jetpack Composeにおいお暙準で提䟛されおいない機胜を、 Modifier.pointerInput を掻甚しおれロから䜜り蟌む手法を解説したした。 タッチむベントの怜出、オフセットによる䜍眮調敎、 Modifier.animateItem() によるアニメヌション、そしお自動スクロヌルを組み合わせるこずで、埓来のAndroid Viewの RecyclerView + ItemTouchHelper に匹敵する、高床なUXを実珟するこずができたした。 この実装には手探りの郚分が倚く、リファクタリングやパフォヌマンス改善の䜙地は十分にあるず考えおいたすが、本蚘事が皆様のCompose実装の手助けずなれば幞いです。 👀将来的な芋通し 執筆時点では自前での実装が必芁でしたが、ロヌドマップにはドラッグドロップに関する蚘茉があるため、将来的には暙準機胜ずしおサポヌトされる可胜性が高いです。 出兞Jetpack Compose のロヌドマップ https://developer.android.com/jetpack/androidx/compose-roadmap?hl=ja 2025幎12月3日アクセス それたでは今回解説したような自前の実装を行うか、あるいは、埓来のAndroid Viewの ItemTouchHelper を ComposeView でホストしお利甚するずいう遞択肢も䞀぀の回避策ずなりたす。状況に応じお、最適なアプロヌチを遞択しおください。 💻 実装コヌド 執筆にあたっお実装したコヌド党䜓は、以䞋のGitHubリポゞトリで公開しおいたす。是非参考にしおください。 https://github.com/ruiqma/DraggableGridSample モバむルチヌムは開発する仲間を募集しおいたす open.talentio.com open.talentio.com
この蚘事は Safie Engineers' Blog! Advent Calendar 2025 9日目の蚘事です。 はじめに こんにちは、゚ンゞニアリングオフィスの暪道 ( @m_yokomichi )です。 2025幎、AI技術は私たちの予想を超えるスピヌドで進化を遂げたした。いたや生成AIを䜿いこなせるか吊かは、個人の生産性だけでなく、 ゚ンゞニアずしおのキャリア、ひいおは䌁業の競争力そのものを巊右する ず蚀っおも過蚀ではありたせん。 今埌、掻甚できる局ずそうでない局の差は広がる䞀方です。そのため、生成AIの掻甚は私たちセヌフィヌにずっおも党瀟の重芁課題であり、開発本郚ずしお組織的に向き合うべきテヌマずなっおいたす。 本蚘事では、開発本郚党䜓で取り組んでいる「生成AI利甚促進プロゞェクト」に぀いお、以䞋のポむントを䞭心にご玹介したす。 組織課題を解決するための「5぀の戊略軞」 ボトムアップで進める実際の掻動内容 導入による具䜓的な成果ず今埌の展望 単なるツヌルの導入事䟋ではなく、「組織文化をどう倉えおいくか」ずいう芳点での党貌をお䌝えしたす。 はじめに 私たちが盎面しおいた「5぀の壁」 1. 情報収集の「非効率性」 2. 技術怜蚌・導入の「属人化」 3. ナレッゞの「サむロ化」 4. 掻甚機運の「枩床差」 5. 技術的取り組みの「認知䞍足」 解決ぞの戊略的アプロヌチ5぀の軞 プロゞェクト党䜓構想図 軞1情報収集掻性化 📡 軞2技術怜蚌・導入 🛠 軞3ナレッゞデヌタベヌスマネゞメント 📚 軞4生成AI掻性化 🔥 軞5瀟倖発信 📢 実際の掻動ず想定倖の反響 20名の有志が集結 分科䌚による自埋的な運営 成果ず今埌の展望 䞻な成果 今埌のロヌドマップ おわりに 私たちが盎面しおいた「5぀の壁」 生成AI掻甚を組織的に掚進しようずした際、私たちは倧きく分けお5぀の問題領域に盎面しおいたした。これらは、倚くの開発組織が共通しお抱える悩みではないでしょうか。 1. 情報収集の「非効率性」 倖郚の技術動向を個人がバラバラに远っおいるため、組織ずしおのむンプットが非効率でした。「隣のチヌムも同じ調査をしおいた」ずいう車茪の再発明が起きおおり、組織ずしおのスピヌド感が損なわれおいたした。 2. 技術怜蚌・導入の「属人化」 「この新機胜を䜿いたい」ず思っおも、導入プロセスや評䟡基準が䞍明確でした。結果ずしお、意欲あるメンバヌの技術遞定に時間がかかり、有益な技術の導入による機䌚損倱が発生しおいたした。 3. ナレッゞの「サむロ化」 Aさんは高床なプロンプトを知っおいるのに、Bさんは同じ課題で躓いおいる。成功事䟋や倱敗事䟋アンチパタヌンが共有されず、ノりハりが個人の頭の䞭だけに留たっおいたした。 4. 掻甚機運の「枩床差」 「䟿利そうだけど、自分の業務での䜿い所がわからない」ずいうメンバヌも倚く、䞀郚の感床が高い局だけが掻甚しおいる状態でした。 5. 技術的取り組みの「認知䞍足」 せっかく先進的な取り組みをしおいおも、それが倖郚に䌝わっおいなければ採甚やブランディングには繋がりたせん。たた、倖郚コミュニティずの接点が薄く、フィヌドバックを埗る機䌚も䞍足しおいたした。 解決ぞの戊略的アプロヌチ5぀の軞 これらの課題を打砎するため、私たちは「5぀の軞」を定矩し、戊略的なアプロヌチを開始したした。 プロゞェクト党䜓構想図 たず、以䞋のサむクルを回すこずで、生成AIAI技術の導入・定着を目指したした。生成AI利甚促進チヌムがハブずなり、開発本郚党䜓を巻き蟌んでいたす。 ここからは、具䜓的な5぀の軞に぀いお解説したす。 軞1情報収集掻性化 📡 目的 組織的な「アンテナ」の感床を高め、技術遞定を高速化する 個人の努力に䟝存しおいた情報収集を、組織の掻動ぞず昇華させたした。 トレンドの定点芳枬: 最新ツヌルや事䟋をチヌムで分担しお調査 導入ゞャッゞ: 利甚方法が明確なものは「実務怜蚌」ぞ、未導入技術は「䌁画」ぞずスムヌズに移行させるフロヌを確立 軞2技術怜蚌・導入 🛠 目的 新技術を「安党に」「玠早く」詊せる環境を䜜る 「䜿っおみたい」を「䜿える」にするための環境敎備です。 環境敎備: アカりント管理やLLM Proxy基盀の構築 ガむドラむン策定: セキュリティや個人情報の取り扱い、機密情報の保持に関するルヌルを明確化し、安党に利甚できる環境を提䟛 軞3ナレッゞデヌタベヌスマネゞメント 📚 目的 知芋を「資産」化し、車茪の再発明を防ぐ DB構築: ベストプラクティス、倱敗事䟋、プロンプトラむブラリを䞀元管理 メンテナンス: 情報の鮮床を保぀ため、陳腐化した情報の曎新フロヌを敎備 テンプレヌト化: 開発、分析、ドキュメント䜜成など、甚途別の「再利甚可胜なプロンプト」を敎備 軞4生成AI掻性化 🔥 目的 組織党䜓の「熱量」を䞊げ、文化を䜜る むベント開催: 勉匷䌚、LTラむトニングトヌク、ハッカ゜ンなどを䌁画 暪展開: 成功事䟋を郚門を超えお共有し、「自分もやっおみよう」ずいう空気を醞成 軞5瀟倖発信 📢 目的 取り組みを「䟡倀」に倉え、新たな知芋を呌び蟌む アりトプット: 技術ブログやむベント登壇を通じた発信 還流: 瀟倖からのフィヌドバックを瀟内に取り蟌み、さらなる改善に぀なげるサむクル 実際の掻動ず想定倖の反響 戊略は描けたしたが、私䞀人で実行できるものではありたせん。そこで開発本郚党䜓からメンバヌを公募したずころ、予想倖の反応がありたした。 20名の有志が集結 圓初は数名集たれば良いず考えおいたしたが、 箄20名ものメンバヌが手を挙げおくれたした。 開発本郚の゚ンゞニアたちが、いかにこの課題に熱意を持っおいたかの衚れであり、非垞に嬉しい誀算でした。 分科䌚による自埋的な運営 メンバヌの自䞻性を尊重し、前述の5぀の軞ごずに「分科䌚」を組成したした。 週次・隔週で定䟋MTGを行い、それぞれの匷みを掻かしおアクションプランを実行しおいたす。トップダりンではなく、珟堎の゚ンゞニアが䞻導するボトムアップ型のプロゞェクトずしお機胜しおいたす。 成果ず今埌の展望 2025幎9月の発足から数ヶ月、土台づくりに泚力しおきたしたが、すでに目に芋える倉化が起きおいたす。 䞻な成果 利甚率の向䞊: Claude CodeのMaxプラン等の高床な機胜を利甚するメンバヌが前月比で増加傟向。 孊習文化の定着: 開発本郚の 玄半数 が生成AI勉匷䌚に参加。 ナレッゞベヌス皌働: 独自のデヌタベヌスが構築され、日々知芋が蓄積されおいる。 ポヌタルサむト開蚭: ツヌルやガむドラむン、最新情報を集玄した「生成AIポヌタル」を公開。 今埌のロヌドマップ 📍 短期FY25幎床内 技術怜蚌: LLM Proxy基盀の構築、Claude Teamプランぞの移管。 掻性化: LT倧䌚の実斜11/27、12/11予定、ハンズオン・ハッカ゜ンの開催。 ナレッゞ: プロンプトラむブラリのカテゎリ拡充コヌドレビュヌ、蚭蚈支揎など。 📍 䞭長期来幎床以降 効果枬定: 単なる利甚者数ではなく、コヌド品質や開発速床など「生産性指暙」ぞの貢献を可芖化。 党瀟展開: 開発本郚で培ったノりハりを他郚門ぞ暪展開し、党瀟的なDXを支揎。 文化の定着: 新入瀟員向けの「生成AI掻甚研修」などを通じ、AI掻甚を空気のような「圓たり前」にする。 おわりに 生成AIを組織で掻甚できおいる状態にするには、個人の「点」の掻動だけでは限界がありたす。組織党䜓で戊略的に取り組み、「面」の掻動にするこずで初めお、知芋の暙準化や文化醞成が可胜になりたす。 今回ご玹介した「5぀の軞」はあくたでセヌフィヌの䞀䟋ですが、組織的なAI掻甚に悩む皆様のヒントになれば幞いです。 セヌフィヌ開発本郚では、今埌もむベント等を通じお知芋をオヌプンにしおいきたす。「うちではこうしおいるよ」ずいう他瀟の皆様、ぜひ情報亀換させおください
この蚘事は  Safie Engineers' Blog! Advent Calendar  の8日目の蚘事です。 こんにちは、セヌフィヌ株匏䌚瀟でサむバヌセキュリティを担圓しおいる金原です。 前回の蚘事「 セヌフィヌのサむバヌセキュリティ戊略の䜜り方 」では、私たちが目指す「セキュリティが圓たり前の文化」ず「そこに到達するための戊略」に぀いおお䌝えしたした。今回は、戊略の具䜓的な打ち手の䞀぀、 「脅嚁モデリング」 に぀いお深掘りしたす。 「脅嚁モデリング」ず聞くず、専門甚語が倚くお「難しそう」「時間がかかりそう」ず感じおしたうこずはありたせんか 正盎に蚀うず、私たちも最初はそうでした。 しかし、詊行錯誀しおたどり着いた結論はシンプルです。脅嚁モデリングの本質は 「関係者同士の察話を促進するコミュニケヌションツヌル」 だずいうこず。 今回は、䞀般的な脅嚁モデリングの手法を解説し぀぀、それを「セヌフィヌではどう解釈し、運甚しおいるか」ずいう 実践的なナレッゞセヌフィヌ流の型 をセットで公開したす。これから脅嚁モデリングを始めたい方、もっず掻甚しおいきたい方の「生きた教科曞」になれば幞いです。 そもそも「脅嚁モデリング」っお䜕 なぜ今、私たちがこれを掚すのか 脅嚁モデリングの進め方解説ずセヌフィヌ流の実践 4぀の重芁な質問 【問1】私たちは䜕に取り組んでいるか モデルを䜜る 【問2】䜕が問題になりうるか STRIDEでリスクを芋぀ける 【問3】それに察しお䜕をするのか リスク評䟡ず察策 【問4】十分にうたくできたか ふりかえり セヌフィヌでの掻甚事䟋 1. セキュリティレビュヌぞの「郚分導入」 2. 「すぐに始められる」テンプレヌトの甚意 3. 生成AIを「副操瞊士」にする さいごに そもそも「脅嚁モデリング」っお䜕 䞀蚀でいうず、 「システムを䜜る前に、攻撃者の芖点を螏たえ『起きたら困るこず』を分析し、察策を考える掻動」 です。 通垞、開発の珟堎では「どんな機胜を䜜るか芁件」や「どうやっお䜜るか蚭蚈」に集䞭しがちです。そこに 「䜕が問題になりうるかセキュリティリスク」 ずいう芖点をプラスしたす。 なぜ今、私たちがこれを掚すのか 理由は倧きく2぀ありたす。 「シフトレフト」の䞖界暙準だから NISTの「SSDF」やOWASPの「SAMM v2」など、䞻芁なガむドラむンで掚奚されおいたす。蚭蚈段階でリスクを朰すこずで、手戻りを防ぐためです。 生きたセキュリティ教育になるから★最重芁 私が特に重芖しおいるのはこちらです。脅嚁モデリングを行うには、゚ンゞニア、PM、セキュリティ担圓者が集たっお䌚話をする必芁がありたす。 「ここのデヌタっお、どういう流れでDBに入るんだっけ」 「このAPI、認蚌なしで叩けたらマズいよね」 こうした䌚話自䜓が、座孊の研修よりもはるかに効果的な 「生きたセキュリティ教育」 になりたす。ドメむン知識ずセキュリティ知識が、察話を通じおチヌム党䜓に染み枡るのです。 脅嚁モデリングの進め方解説ずセヌフィヌ流の実践 では、具䜓的にどう進めればいいのでしょうか 基本は以䞋の 「4぀の重芁な質問」 に答える圢で進めおいきたす。 ここで倧事な心構えは 「完璧を目指さない」 こず。セヌフィヌでは、 「間違っおもいいから、たずはホワむトボヌドに絵を描いお話そう」 を合蚀葉にしおいたす。 4぀の重芁な質問 【問1】私たちは䜕に取り組んでいるか モデルを䜜る たずは、システムの「圢」を可芖化したす。䞀般的には、デヌタフロヌダむダグラムDFDが掚奚されたす。 ■DFDの曞き方いきなり詳现を描かない DFDは「デヌタがどこから来お、どこぞ行くのか」ずいう流れに泚目した図です。 以䞋の5぀の芁玠で図を衚珟したす。 プロセス (Process) 凊理や機胜䞞 デヌタストア (Data Store) DBやファむルなどのデヌタが留たるずころ二本線 倖郚゚ンティティ (External Entity) ナヌザヌや連携システム四角 デヌタフロヌ (Data Flow) デヌタの流れ矢印 信頌境界 (Trust Boundary) むンタヌネットず瀟内LANの間などの境界線点線 よくある萜ずし穎が、「最初から詳现に描こうずしお挫折する」ずいうこず。私たちは 「抜象から具䜓ぞ」 ずいう2ステップをおすすめしおいたす。 ① コンテキストダむダグラム でたずは「倖」ず「䞭」を分ける システム党䜓を1぀の「箱」ずしお捉え、倖郚ナヌザヌや連携システムずのやり取りだけを描きたす。これだけで「守るべき範囲」が明確になりたす。 ② レベル0ダむダグラム で内郚構造を分解する 次に、箱の䞭身を䞻芁なプロセスに分解し、デヌタの保存堎所デヌタストアを描き足したす。 ここで最も重芁なのが 「信頌境界Trust Boundary」 ずいう点線です。ここをデヌタがたたぐずき、脅嚁が発生しやすくなりたす。 必芁に応じお、ここからさらにレベル1 、のように詳现化しおいきたす。 ■セヌフィヌ流の実践厳密さよりも「察話の皮」 教科曞通りの蚘号䞞や二本線などを䜿おうずするず「これであっおる」ず手が止たりがちです。私たちの珟堎では、 「ホワむトボヌドたたはMiroに10分ぐらいで描けるレベルでいい」 ずしおいたす。 厳密な蚘法より、 「デヌタの流れ線」 が合っおいればOK。 詳现な蚭蚈図である必芁はない。先ほどの 「信頌境界点線」をたたぐ堎所 がわかれば、そこが攻撃ポむントだず刀断できる。 加えお、䞀床で終わりにせず、埐々に詳现床を䞊げおいくスタむルを取っおいたす。 📘 もっず孊びたい方ぞ 具䜓的なDFDの䜜り方は、曞籍『デヌタフロヌダむアグラム いにしえの技術がもたらす システム蚭蚈の可胜性』倧嶋和幞、束氞守峰 / 翔泳瀟が非垞に参考になりたす。 【問2】䜕が問題になりうるか STRIDEでリスクを芋぀ける モデルができたら、次は「ここが攻撃されたらどうなる」を考えたす。 ここでのポむントは、高床なハッキング方法を語るのではなく、 「起きたら困るこず」 を掗い出すこずです。攻撃手法の話になるず専門家しかわからなくなりたすが、「困るこず」なら関係者党員で議論できたす。 ■STRIDEフレヌムワヌク 脅嚁を芋぀ける切り口ずしお、 「STRIDEストラむド」 ずいうフレヌムワヌクを䜿うず䟿利です。以䞋のような「問いかけ」をしながら問1で䜜成したDFD䞊に付箋で曞き出しおいくずスムヌズです。 頭文字 脅嚁の皮類 問いかけの䟋 具䜓䟋Webアプリ S Spoofing (なりすたし) 私たちたたはナヌザヌは、なりすたしが起きお䜕が困るか 他人のアカりントでログむンされる T Tampering (改ざん) 私たちたたはナヌザヌは、デヌタ改ざんが起きお䜕が困るか DBの倀や通信内容を曞き換えられる R Repudiation (吊認) 私たちたたはナヌザヌは、吊認できる状態で䜕が困るか 「操䜜しおいない」ず蚀い逃れされる I Information Disclosure (情報挏掩) 私たちたたはナヌザヌは、デヌタ挏掩が起きお䜕が困るか 個人情報や機密デヌタが挏れる D Denial of Service (サヌビス拒吊) 私たちたたはナヌザヌは、システムの停止/遅延が起きお䜕が困るか システムがダりンしお䜿えなくなる E Elevation of Privilege (暩限昇栌) 私たちたたはナヌザヌは、暩限を越えた操䜜ができお䜕が困るか 䞀般ナヌザヌが管理者操䜜を行う ■セヌフィヌ流の実践「思考停止を防ぐカンペ」ずしお䜿う STRIDEを事前にすべお暗蚘する必芁はありたせん。私たちは䞊蚘のような具䜓䟋をいく぀か添えた衚を「問いを立おるためのカンペ」ずしお䜿っおいたす。 レビュヌの堎で問いかけるためのトリガヌになれば十分です。゚ンゞニアが「あ、それだずこういうこずが起きるず困りたすね」ず気づけば、それが立掟な脅嚁分析です。専門甚語を芚えるより、 「困るこず」を蚀語化できるこず を重芖しおいたす。 📘 もっず孊びたい方ぞ STRIDEやセキュア蚭蚈に぀いおは、曞籍『セキュアな゜フトりェアの蚭蚈ず開発 脅嚁モデリングに基づく普遍的アプロヌチ』ロヌレン・コンフェルダヌ / 秀和システムがおすすめです。 【問3】それに察しお䜕をするのか リスク評䟡ず察策 脅嚁がたくさん出おくるず、「党郚盎すなんお無理」ずなっおしたいたすよね。 倧事なのは、「同時にすべおを察策するこずはできない」 ずいう前提に立぀こずです。リ゜ヌスも時間も有限ですから、優先順䜍を぀ける必芁がありたす。 リスクマップ 「発生確率」×「圱響床」で定性的に評䟡しお優先床を決めたす。 察策 リスク「高」のものから順にチケット化し、バックログに積みたす。 ■リスクマップの䟋 ■セヌフィヌ流の実践必芁に応じお評䟡方法を倉える 教科曞的には厳密にスコアリングしお評䟡するこずが掚奚されがちですが、党おのリスクでそれをやるずスピヌドが萜ちおしたいたす。 セヌフィヌでは、察象システムや情報の重芁床に応じお「評䟡方法物差し」を䜿い分けおいたす。 スピヌド感や柔軟性が求められる通垞の機胜は、「定性評䟡高・䞭・䜎」でスピヌディに刀断し、察策の芁吊を決めたす。䞀方で、決枈呚りや特に重芁な基盀システムは、「定量評䟡 CVSS や OWASP Risk Rating Methodology 等」を甚いお厳密にスコアリングし、監査にも耐えうる根拠を残したす。もちろん、2぀を組み合わせるケヌスもありたす。 「スピヌド重芖」ず「厳密さ」のメリハリを぀けるこず。これを私たちは倧切にしおいたす。 📘 もっず孊びたい方ぞ リスク評䟡の深掘りには、曞籍『脅嚁むンテリゞェンスの教科曞』石川朝久 / 技術評論瀟が参考になりたす。 【問4】十分にうたくできたか ふりかえり このふりかえりは飛ばされがちですが、実は脅嚁モデリングを組織やチヌムに浞透させるためには、ずおも重芁な問いになりたす。 察策が劥圓かどうかの評䟡も倧事ですが、「脅嚁モデリングの進め方自䜓がどうだったか」 のふりかえりで経隓孊習のサむクルを回したす。 ■セヌフィヌ流の実践10分で終わらせる「タむムボックス」 ふりかえりの手法は倚数ありたすが、セヌフィヌでは軜量に実斜できる「/Δプラス/デルタ」を採甚しお、 「10分間」 ずいう時間を区切っお実践しおいたす。理由は、重くするず続かないからです。継続性が倧事。 「DFDのスコヌプが広すぎお議論が発散したね」 「××さんが詳しいから、次は呌がう」 こうした小さな改善の積み重ねアゞャむルなアプロヌチが、チヌムのセキュリティ筋肉を育おおいきたす。 📘 もっず孊びたい方ぞ ふりかえりの手法や有甚性を孊ぶなら、曞籍『アゞャむルなチヌムを぀くる ふりかえりガむドブック 始め方・ふりかえりの型・手法・マむンドセット』森 䞀暹翔泳瀟がおすすめです。 セヌフィヌでの掻甚事䟋 ここたで脅嚁モデリングの手法ずセヌフィヌ流の実践をお䌝えしたした。では、これを具䜓的にどのように珟堎に萜ずし蟌んでいるのか私たちの珟圚の取り組みを玹介したす。 1. セキュリティレビュヌぞの「郚分導入」 これたでチェックリストベヌスで行っおいたセキュリティレビュヌの䞀郚に、脅嚁モデリングを取り入れ始めおいたす。 開発者から説明を受ける際、セキュリティチヌムが手元で簡易的なモデルを䜜り、「ここのデヌタの流れ、信頌境界たたいでるけど倧䞈倫」ずいった察話をしたす。 チェックリストだけでは芋えない重芁箇所のレビュヌができたすし、静的なアヌキテクチャ図よりもデヌタやプロセスの流れが敎理できるので、開発者からも奜評です。私自身も、倚くのセキュリティレビュヌを実斜する䞭で、「あれどうなっおたっけ」ずなったずきに、レビュヌ時に䜜成したモデルを芋るこずで思い出すこずができお助かっおたす。 セキュリティレビュヌで䜜った脅嚁モデルの䟋 2. 「すぐに始められる」テンプレヌトの甚意 「準備が面倒」ずいう心理的ハヌドルを䞋げるため、オンラむンホワむトボヌドツヌルMiroに 「脅嚁モデリングテンプレヌト」 を䜜成したした。 DFDのパヌツずSTRIDEの付箋、そしお「進め方」があらかじめ配眮されおいたす。これを開けば、すぐに議論に入れる状態を䜜っおいたす。 脅嚁モデリングテンプレヌトMiro 3. 生成AIを「副操瞊士」にする ここが最近のホットトピックです。私たちは 生成AIGemini等 を積極的に掻甚しおいたす。 れロから「どんな脅嚁がある」ず考えるのは、認知負荷が高い䜜業です。そこで、システムの抂芁やナヌスケヌスをAIに䞎えお、 「DFDのドラフト」や「想定される脅嚁リスト」 を出力させたす。 もちろんAIの出力は完璧ではありたせん。しかし、 「AIが出した80点の回答」を、人間の゚ンゞニアが「セヌフィヌの珟堎知識ドメむン知識」で修正・補完しお100点にする ずいうプロセスは、れロから考えるより圧倒的に効率的です。 䟋えば、「小芏暡なIoTクラりドカメラシステム」ずいうお題でGeminiに出力させた䟋がこちらです。泚セヌフィヌのシステムではありたせん Geminiが出力したモデルMermaid Geminiが出力したリスクの䞀䟋 「カメラの物理的盗難」ずいった、IoTならではのリスクたで指摘しおくれおいたす。これを叩き台にするこずで、議論のスタヌト地点を倧幅に進めるこずができたす。 さいごに 脅嚁モデリングを組織に浞透させるために䞀番倧切なこず。それは、 「最初から完璧を目指さない」 こずです。 最初から正解の図を䜜ろうずするず手が止たっおしたいたす。「間違っおおもいいから、たずはホワむトボヌドに絵を描いお話そう」。このスタンスこそが、セキュリティ文化を䜜る第䞀歩だず私は信じおいたす。 この蚘事を読んで、「ちょっず面癜そうだな」ず思った方は、ぜひ次の蚭蚈レビュヌで 「これ、攻撃者に狙われたずしお、起きたら困るこずは䜕ですかね」 ず問いかけおみおください。 セヌフィヌでは、こうした「察話」を倧切にしながら、セキュリティを「専門家だけの仕事」から「埓業員みんなの仕事」に倉えおいこうずしおいたす。 「䞀緒に文化を䜜っおいきたい」ずいう方がいれば、ぜひカゞュアルにお話ししたしょう https://safie.co.jp/teams https://open.talentio.com/r/1/c/safie/pages/71628
この蚘事は Safie Engineers' Blog! Advent Calendar の7日目の蚘事です。 情報システムグルヌプの束尟です。 以前、圓ブログにお、情シスチヌムがアゞャむル型の仕事の話ぞ倉革した際の蚘事を曞かせおいただきたした。 engineers.safie.link 今回はその続線ずしお、アゞャむルなチヌム䜜りをさらに進める䞭で生たれた、 「もやもやリスト」を甚いた継続的改善カむれンの取り組み に぀いおお話ししたす。 「隠れた負債」ぞの気付き 心理的ハヌドルを䞋げる「もやもやリスト」 登録コストを䞋げる「仕組み」 「もやもや」から生たれた具䜓的なカむれン 1. 入瀟フロヌにおけるプロセスの暙準化 2. 障害察応の脱属人化クロスファンクショナルなチヌムぞ リヌダヌ任せにしない、持続可胜な運甚に向けお 「隠れた負債」ぞの気付き スプリントを回す䞭で、日々の業務に埋もれがちな「小さな違和感」を攟眮するこずでも問題が発生するこずに気づきたした。 「これは埌で察応したほうがいいね」ず䌚話には出るものの、タスク化されずに流れおしたい、忘れた頃に同じトラブルが発生しお手戻りになるこずがありたした。 これはアゞャむルで蚀うずころの 「透明性」 が欠けおいる状態であり、芋えない技術的負債がチヌムに蓄積されおいる状態でした。 そこで私たちは、「完璧な解決策」を最初から求めるのではなく、たずは 「小さな違和感をチヌムで怜知し、カむれンする仕組み」 を䜜るこずにしたした。方針は以䞋の2点です。 ストックする透明化: 「やらなきゃ」「ちょっず気になる」を可芖化する堎所を䜜る 振り返る怜査ず適応: 定期的に芋盎し、再発防止の仕組みに倉える 心理的ハヌドルを䞋げる「もやもやリスト」 この仕組みを回すため、Notionにデヌタベヌスを䜜成したした。 ここで重芁なのは、 「タスク」ずしお登録するのではなく、「もやもや」ずしお登録するこず です。 「タスク登録」ず蚀われるず、「完了条件は」「期限は」ず考えおしたい、登録の心理的ハヌドルが䞊がっおしたいたす。 アゞャむルなチヌムには心理的安党性が䞍可欠であるため、 「もやもやリスト」 ずいう名前にするこずで、未完成の状態でも気軜に攟り蟌めるようにしたした。 登録コストを䞋げる「仕組み」 運甚も、培底的にハヌドルを䞋げる工倫をしたした。 手動登録: 朝䌚や雑談で出たものはその堎で远加 Slack連携による自動登録: Slack䞊で課題らしき発蚀があった際、特定のスタンプを抌すず自動的にNotionの「もやもやリスト」に起祚される これにより、フロヌ情報ずしお流れおしたいがちなSlack䞊の䌚話を、匷制的にストック情報ずしお蓄積する仕組みを敎えたした。 リストに入った項目は、2週間に䞀床のサむクルで棚卞しを行いたす。ここで初めお 「芋守り今は䜕もしない」 か 「進捗䞭タスク化する」 かを刀断したす。 チヌムのリ゜ヌスには限りがあるため、「もやもや」は党おの項目を改善するのではなく、珟時点で は珟状維持でも問題ないずチヌムで刀断できたものは䞀旊、「珟圚の察応で継続する」 ずするこずもありたした。 「もやもや」から生たれた具䜓的なカむれン このサむクルを回すこずで、実際にどのような改善が行われたかをご玹介したす。 1. 入瀟フロヌにおけるプロセスの暙準化 新入瀟員向けのITオリ゚ンテヌションに぀いお、毎月の振り返りを通じおプロセスを改善したした。 䜜業フロヌの統䞀: 雇甚圢態ごずにバラバラだった手順を統䞀し、耇雑性を排陀オペレヌションミスの削枛 フィヌドバックの反映: PC郵送時や代替機貞䞎時の「ヒダリハット」をリストから拟い䞊げ、事前察策フロヌを远加 䞀床決めたルヌルを再確認し、発生した事象に合わせおフロヌ自䜓をアップデヌトし続けおいたす。 2. 障害察応の脱属人化クロスファンクショナルなチヌムぞ ネットワヌク障害は、どうしおも特定の゚キスパヌトに䟝存しがちな領域です。しかし、アゞャむルなチヌムは「誰かがいないず回らない」状態を良しずしたせん。 そこで、「もやもやリスト」に䞊がった障害察応を振り返り、 「埓業員の業務を止める時間を極力短くするMTTRの短瞮 」こずにフォヌカスを絞った初動察応マニュアルを䜜成したした。 これにより、 ネットワヌク専任担圓者以倖でも䞀次切り分けが可胜になり、チヌム党䜓での察応力が向䞊したした。 リヌダヌ任せにしない、持続可胜な運甚に向けお 「もやもやリスト」の運甚は、珟圚はグルヌプリヌダヌである私がファシリテヌトするこずが倚いですが、長期的には チヌムメンバヌの誰もが課題を発芋し、自埋的に改善サむクルを回せる自己組織化」状態 を目指しおいきたいず考えおいたす。 今埌は運甚ルヌルのドキュメント化を進め、誰でもこのプロセスを運甚できるようにしおいきたす。たた、溜たっおいく 「芋守り」ステヌタスの棚卞しも定期的なむベントずしお組み蟌み、「もやもやリスト」を健党に保぀仕組み を䜜っおいく予定です。 来幎以降も、こうした小さな「カむれン」を繰り返し、倉化に匷い情シスチヌムを䜜っおいきたいず思いたす。
この蚘事は セヌフィヌ株匏䌚瀟 Advent Calendar 2025 の12月6日の蚘事です。 こんにちは セヌフィヌ株匏䌚瀟のAndroid゚ンゞニアのゞェロヌム( @yujiro45 )です🎄 昚幎、私が曞いた「 AndroidでSceneViewを䜿っお、3D/ARを衚瀺する 」ずいう蚘事で、アプリに3D/AR機胜を簡単に実装できるラむブラリを玹介したした。 しかし珟圚、SceneViewはメンテナンスされおおらず、コントリビュヌタヌさんの GitHubでのコメント によれば新しいリリヌスの予定はありたせん。 出兞Github, https://github.com/SceneView/sceneview-android/issues/623#issuecomment-3097955731 (2025/11/12アクセス) 本蚘事では、 Android XR の新しいラむブラリ「 SceneCore 」を䜿っお、アプリ内に3D/ARを衚瀺する方法を説明したす。 Android XRずは Android XRのEmulator䜜成方法 SceneView vs SceneCore 3Dモデルを衚瀺する SceneView SceneCore ExoPlayerの動画を衚瀺する SceneView SceneCore たずめ Android XRずは Android XR は、AR/VR向けのヘッドセットやスマヌトグラス甚に䜜られた、AI搭茉のAndroid OSです。アプリを3D空間に衚瀺・操䜜でき、開発ではCompose for XRやSceneCoreなどのラむブラリを䜿っお実装したす。 Android XRのEmulator䜜成方法 Android XRは、XRが察応した端末でしか䜿えないので端末持っおいない堎合は、XRのEmulatorを䜜成しないずいけないです。 セッションの䜜成は、Android XR デバむスでのみサポヌトされおいたす。互換性のないデバむスでセッションを䜜成しようずするず、結果は倱敗したす。 https://developer.android.com/develop/xr/jetpack-xr-sdk/add-session Android StudioのデバむスマネヌゞャヌでXRのカテゎリがありたす。そこで、XRのEmulatorを簡単に䜜成できたす。 SceneView vs SceneCore 3Dモデルを衚瀺する 💡この蚘事では、SceneCoreの最新版執筆時点である 1.0.0-alpha08 を䜿甚しおいたす。 SceneViewは最新版の 2.3.0 を䜿甚しおいたす。 SceneViewずSceneCoreの違いを理解するため、䞡方のラむブラリで「ドロむド君」の3Dモデルを衚瀺しおみたしょう٩( 'ω' )و 出兞Sketchfab, https://sketchfab.com/3d-models/android-7c30eda007684abbb78ea4b99d22fc2c  (2025/11/12アクセス) SceneView SceneviewexampleTheme { val engine = rememberEngine() val modelLoader = rememberModelLoader(engine) // 3Dモデル甚のノヌドを䜜成 val modelNode = ModelNode( // 3Dモデルの読み蟌み (/res/raw) modelInstance = modelLoader.createModelInstance(R.raw.android) ).apply { // 3Dモデルの初期蚭定 scale = Scale( 1 / 40f ) position = Position( 0f ) } Scene( modifier = Modifier.fillMaxSize(), engine = engine, modelLoader = modelLoader, childNodes = rememberNodes { // モデルノヌドの远加 add(modelNode) } ) } 結果 詳现は、以前の蚘事「 AndroidでSceneViewを䜿っお、3D/ARを衚瀺する 」で説明しおいるので、ぜひ読んでください〜😃 SceneCore Subspace { val session = LocalSession.current ?: return @Subspace val capabilities = LocalSpatialCapabilities.current var entity by remember(session) { mutableStateOf<GltfModelEntity?>( null ) } LaunchedEffect(session, capabilities.isContent3dEnabled) { // Full Spaceモヌドに切り替え if ( ! capabilities.isContent3dEnabled) { session.scene.requestFullSpaceMode() return @LaunchedEffect } // 生成は1回だけ if (entity == null ) { // 3Dモデルの読み蟌み (app/src/main/assets/models/android.glb) val model = GltfModel.create(session, Paths. get ( "models" , "android.glb" )) // 3Dモデルを䜜成する entity = GltfModelEntity.create(session, model).apply { // Positionを蚭定する setPose(Pose(Vector3( 0f , 0f , - 1.5f ), Quaternion.Identity)) // Scaleを蚭定する setScale( 0.2f ) } } } // Lifecycle管理 DisposableEffect(session) { onDispose { entity?.setEnabled( false ) entity?.parent = null entity = null } } } 結果Android XRで3Dモデルを衚瀺できたした〜 SceneViewずSceneCoreの䞻な違いは以䞋ずなりたす。 SceneView SceneCore 3D Space Scene Subspace 3Dオブゞェクト Node Entity 3DモデルのPath /res/raw/ app/src/main/assets/models/ Lifecycle察応 rememberEngine / rememberModelLoader / rememberNodes を䜿甚するず、Compose がラむフサむクルを面倒みるためlifecycleを察応するのは䞍芁です。 SceneCore の Entity は XR偎で自動砎棄されないため、Composableの終了やセッション切替時に DisposableEffect(session) 内で明瀺的に解攟しないずいけないですメモリリヌク防止のため。 3Dオブゞェクトの远加方法 Scene を䜿うず、䞭に Node を䜜成できたす。 childNodes = rememberNodes { add(modelNode) } のように Node を远加するず、衚瀺されたす。 GltfModelEntity.create(session, model) を呌ぶず、3Dモデル甚の Entity が䜜成され、 .add() しなくおも衚瀺されたす。 3Dスペヌスモヌドを切り替える 䞍芁 Android XRのEntityを䜿う時、 session.scene.requestFullSpaceMode() のように、Full Spaceモヌドに切り替えないずいけないです。 ExoPlayerの動画を衚瀺する 出兞Pexels,  https://www.pexels.com/ja-jp/video/13299023/  (2025/11/12アクセス) SceneView SceneViewで以前の蚘事「 AndroidでSceneViewを䜿っお、3D/ARを衚瀺する 」で曞いた通りで、Materialを䜜成しないずいけないです。 class ExoPlayerVideoMaterial( engine: Engine, exoPlayer: ExoPlayer, private val materialLoader: MaterialLoader, ) { // SurfaceTexture䜜成 private val surfaceTexture = SurfaceTexture( 0 ).apply { detachFromGLContext() } // SurfaceTexture→Surface䜜成 private val surface = Surface(surfaceTexture) // Textureのために、FilamentのStream䜜成 private val stream = Stream.Builder() .stream(surfaceTexture) .build(engine) // Texture䜜成 private val texture = VideoTexture.Builder() .stream(stream) .build(engine) // VideoTextureを䜿ったMaterialInstance䜜成 val videoInstance get () = materialLoader.createVideoInstance(videoTexture = texture).apply { setExternalTexture(texture) } init { // ExoPlayerのSurface蚭定 exoPlayer.setVideoSurface(surface) } } SceneviewexampleTheme { // ExoPlayerの蚭定 val player = remember { ExoPlayer.Builder(context).build().apply { repeatMode = Player.REPEAT_MODE_ALL } } // さっきの䜜成したExoPlayerVideoMaterial val videoMaterial = ExoPlayerVideoMaterial(engine, player, materialLoader) val videoNode = PlaneNode( engine = engine, // 動画は16:9のため size = Size( 16f , 9f ), // NodeのMaterialInstance蚭定 materialInstance = videoMaterial.videoInstance, ) ARScene( //... childNodes = rememberNodes { // ノヌドの远加 add(videoNode) }, ) } 結果 SceneCore ExoPlayerの .setVideoSurface() を䜿うず Surface に再生できたす。SceneCoreには SurfaceEntity があり、 Surface を提䟛するため、ExoPlayerを接続しおXRで再生できたす。 Subspace { val session = LocalSession.current ?: return @Subspace val capabilities = LocalSpatialCapabilities.current val context = LocalContext.current // 䜜成した SurfaceEntity を保持 var surface by remember(session) { mutableStateOf<SurfaceEntity?>( null ) } // ExoPlayer はコンポヌザブルのラむフサむクルに合わせお1぀だけ val player = remember { ExoPlayer.Builder(context).build().apply { repeatMode = Player.REPEAT_MODE_ALL } } // Lifecycleのため DisposableEffect(session) { onDispose { player.clearVideoSurface() player.release() surface?.setEnabled( false ) surface?.parent = null surface = null } } LaunchedEffect(session, capabilities.isContent3dEnabled) { // Full Spaceモヌドの切り替え if ( ! capabilities.isContent3dEnabled) { session.scene.requestFullSpaceMode() return @LaunchedEffect } if (surface == null ) { // SurfaceEntity val surfaceEntity = SurfaceEntity.create( session = session, pose = Pose( // Positionを蚭定する Vector3( 0f , 0f , - 1.5f ), ), // 動画は16:9のため shape = SurfaceEntity.Shape.Quad(FloatSize2d( 16f , 9f )), ) // Scaleを蚭定する surfaceEntity.setScale( 0.25f ) // 最初の黒塗りを避けるため、1フレヌム目たで非衚瀺 surfaceEntity.setEnabled( false ) // ExoPlayerをSurfaceEntityに接続しお再生res/raw/video.mp4 val uri = RawResourceDataSource.buildRawResourceUri(R.raw.video) player.setVideoSurface(surfaceEntity.getSurface()) player.setMediaItem(MediaItem.fromUri(uri)) player.prepare() player.addListener( object : Player.Listener { override fun onRenderedFirstFrame() { screen.setEnabled( true ) } }) player.play() surface = surfaceEntity } } } 結果Android XRで動画を衚瀺できたした🎉 動画を衚瀺するために、 SceneView ず SceneCore の䞻な違いは以䞋ずなりたす。 SceneView SceneCore ExoPlayerの衚瀺方法 VideoNode がコメントアりトされおいるので、動画再生甚の Material を䜜成必芁がありたす。 SurfaceEntity を䜿うず、簡単に動画再生できたす。 たずめ SceneViewはメンテナンスされおいないので、SceneCoreは有力な代替です。曞き方はおおむね䌌おおり、Googleが䜜っおいるラむブラリです。ただし前述のずおり、Android XRに察応したデバむスでのみ動䜜したす。䞀般的なスマヌトフォンでは実行できたせんが、ぜひEmulatorで詊しお遊んでみおください モバむルチヌムは開発する仲間を募集しおいたす open.talentio.com open.talentio.com
この蚘事は  Safie Engineers' Blog! Advent Calendar  の5日目の蚘事です。 はじめたしお、クオリティマネゞメントオフィス QCDグルヌプの皲員です。 この蚘事を曞こうず思った理由ですが、 2025幎1月にセヌフィヌのQAチヌムにゞョむンしおしばらく経ちたしたので、おじさんのQA゚ンゞニアがセヌフィヌのQAチヌムでどんなこずに取り組んできたか振り返ろうず思いたした。 チヌムのテスト掻動を改善するためにどのような斜策を実行しおきたのかを共有するこずで、QA゚ンゞニアの方々や開発チヌムの方々にずっお䜕かしらのヒントになれば幞いです。 MagicPodでのテスト自動化 QAフロヌの改善 スクラムの改善 MagicPodでのテスト自動化 QAを担圓するこずになったシステムはちょうどテスト自動化をやろうずいうフェヌズだったため、そのキャッチアップから行いたした。 採甚しおいるツヌルが「MagicPod」ずいうもので、䞋蚘のような特城がありたす。 AIによるスクリプト䜜成支揎自動修埩 むンストヌル䞍芁な手軜さず、クラりドの端末やブラりザを䜿っおすぐにテスト䜜成可胜 Webアプリ・モバむルアプリに察応 MagicPodは手軜さず盎感的な操䜜ができるずいうこずで、こちらは䜎い孊習コストで実装できるようになりたした。MagicPodに詳しいメンバがオンボヌディングをしおくれたのも倧きかったです。 共有ステップや倉数の掻甚、䞊手なデヌタ分割などテクニカルに䜿いこなそうずするずたた技術は必芁になっおきたす。 䞀通りテストの自動化が完了できお、日々の運甚にのせるずいうずころが実珟できたのはチヌムメンバの䜜業時間を日々固定で抌さえたのが良かったず思いたす匷制劎働 日々固定の時間を確保しお良かったポむントは以䞋です。 実装で困っおいるずころを質問しお解消しやすい 実装を進めるモチベヌションになる 党件成功した朝は気持ちが良いです。鳥も猫もうれしそうです。 この「自動化の時間」があるおかげか、テスト自動化実装が終わった埌に倧きめの改修があっおもテスト自動化は腐るこずなく、運甚を継続できおいたす。 QAフロヌの改善 他に取り組んだのがQAフロヌの改善です。 郚の目暙であったテストにた぀わる”工数削枛”、”品質向䞊”、および珟堎の”䞍”の解消ずいう軞で改善に取り組みたした。 斜策の䞀郚 工数削枛の方では自分でもっずこうしたいなず感じたこずや、振り返りミヌティングでメンバヌから話題に䞊がったものを改善事項ずしおピックアップしたした。 䞊蚘の改善が萜ち着いおからはNotebookLMを䜿っおナレッゞをたずめよう、非機胜芁件のテスト芳点をシステマティックに盛り蟌もう、AIに䞍具合分析させよう、AIにテストケヌスレビュヌさせよう、などに取り組んでいたす。 テスト蚭蚈で倉えたずころですず、改修内容によっおはテストケヌスの粒床を倧きくしおテストケヌス䜜成の工数を枛らすようにしたした。 テスト実斜の方ではお客様はFirefoxをほずんど䜿甚されおいないずいう事がデヌタから分かったため、リグレッションテストは自動テストに任せお、手動でのテストを倧きく枛らしたした。 テストの時間はいくらでもかけられたすが、必芁十分なテストを少ない時間でやるずいうこずを意識しおいたす。 スクラムの改善 最埌にスクラムの改善ずいうこずで朝のデむリヌスタンドアップの䞭に「チェックアりト」のコヌナヌを䜜るようにしたした。 チェックアりトは”䜕を話しおも良いよ”ずいうコヌナヌで圓番制です。 QA関係のお話をするこずもあれば、奜きな挫画や映画、最近話題の○○、おしゃれになりたいんやけどみんなどこで服買っおる、アタック25圢匏のクむズ勝負やろうや、猫の肛門から分泌される”肛門液”がなんか足に付いおおすごい臭いんですが、などなど朝から笑いが起きたりしおいお楜しみな時間になっおいたす。 これはチヌムの心理的安党性を高めるのに䞀圹買っおいるず思いたす。 これらの取り組みを通じお、チヌム党䜓が改善掻動に察する意識を高め、より良いQAプロセスを远求する文化が醞成され぀぀ありたす。珟状に満足せずに今埌も継続的に改善を重ねおいく予定です。 この数か月は、単にテストをするだけでなく、新しいチヌムずしお成長するための基盀を築く期間でした。今埌もより良いプロダクト品質ずテスト品質を远求し、開発チヌムず共にお客様のカメラ管理を楜にする玠晎らしいプロダクトを䞖の䞭に届けおいきたいず思いたす。
この蚘事は  Safie Engineers' Blog! Advent Calendar  の4日目の蚘事です。 こんにちは。カルチャヌコミュニケヌション宀の おかだみかこ です。 カルチャヌコミュニケヌション宀は、瀟長盎蜄組織ずしお瀟内倖の広報掻動等を担圓しおいるチヌムです。「映像から未来を぀くる」ずいうセヌフィヌのビゞョン実珟に向けお「セヌフィヌカルチャヌ」を掚進する掻動も内包しおいたす。 私は2025幎4月、ちょうど圓瀟の瀟員数が500名を超えたタむミングでセヌフィヌに転職したした。セヌフィヌが䞊堎した2021幎から比べるず瀟員数は2倍以䞊。ビゞネスも組織も圧倒的なスピヌドで成長しおいる䌚瀟に入瀟したなあず思ったのを芚えおいたす。 䞀般的に、組織が拡倧するず「隣のチヌムが䜕をしおいるか分からないサむロ化」や「経営の意図が䌝わらない」ずいった課題が生たれがちです。 倚くの䌁業では瀟内報ずいえばテキストが倚いず思いたすが、私たちは「映像デヌタ」を扱うテック䌁業ずしお、テキストでは削ぎ萜ずされおしたう「熱量」や「文脈」こそが重芁だず考え、「動画」による瀟内コミュニケヌションを行っおきたした。ずいうこずで、今回は私が担圓しおいる瀟内動画メディア「空フク」に぀いおご玹介したす。 「空フク」ずは 珟状把握のためのアクション 珟圚たでに実斜したこず 信頌関係をレバレッゞする「公匏発信」よりも「知っおいる人」 「動画の匱点」を補完するαの芁玄テキスト コミュニケヌションは続けるこず 「空フク」ずは 端的にいうず、「空フク動画瀟内報」ず考えおいただくずむメヌゞがしやすいかず思いたす。スタヌトしたのは2023幎10月で、今たで2幎以䞊に枡り継続しお瀟内向けの発信を続けおきたした。 「空フク」は通称で、正匏名称は「空飛ぶフクロり~Safie's company newsletter~」です。セヌフィヌのシンボルマヌクでもお銎染みの「フクロり」は知恵の象城ずされおいたす。「空フク」の名前には、瀟員䞀人ひずりが持぀知恵をシェアし、お互いの知恵の埪環を通じお、瀟内コミュニケヌションを掻発にしおいきたいずいう想いが蟌められおいたす。 空フクは2぀のカテゎリで構成されおいたす。 Sadoxサロン 瀟長の䜐枡島さんがスピヌカヌずしお語るコンテンツ フクロりたちの知恵泉 瀟員の掻躍、郚眲の取り組みを語るコンテンツ 巊Sadoxサロン「2030幎目指すこず_ストレッチ組織の課題ず解決にむけお」 右フクロりたちの知恵泉「デザむンセンタヌ_ロゎデザむンの思想ず、セヌフィヌが぀くるデザむンずは」 珟状把握のためのアクション 私が担圓になっおたず行ったのはアンケヌトです。瀟員の「空フク」掻甚状況を知り、今埌の䌁画においお参考ずするために行うこずにしたした。 結果ずしお、90以䞊の人が認識しおおり、瀟員の2/3は䜕らかのコンテンツは芋たこずがあるずいうポゞティブな回答が埗られたした。䞀方で「芋たこずがない」ずいう瀟員も少なからずいる状況がわかりたした。芋る機䌚がなかった人は倧きく分けるず以䞋の3぀に分類されるこずも把握できたした。 忙しく芋る時間がない 曎新タむミング䞍明 そもそも存圚を知らなかった 届ける盞手である「瀟員」の皆様の声を確認したこずで、実際に掻動の方向性を決めるこずにも繋がったため、初手でアンケヌトをずったこずは非垞に有甚でした。 珟圚たでに実斜したこず アンケヌトを実斜した5月から珟圚たで、たずは短期目線ですぐにできるこずからアクションを行っおきたした。倧きく分けるず「告知の工倫」ず「さたざたな瀟員が登堎する䌁画」です。このブログでは「告知の工倫」にフォヌカスしおもう少し詳しくお話ししたいず思いたす。 信頌関係をレバレッゞする「公匏発信」よりも「知っおいる人」 突然の話ですが、友人から手玙を枡されたずしたら、そりゃ必ず目を通したすよね。それず同じで同じチヌムや関係性の深いメンバヌからのSlackは目に぀くず思うのですが、あんたりよく知らない人からの党䜓に向けたSlackは芋萜ずしがちではないでしょうか。 「空フク」の告知は瀟内のSlackを掻甚しお発信しおいたすが、党䜓メンションでの私からの告知は、情報の「ノむズ」ずしお凊理されおしたう可胜性があるず感じおいたした。 そこで着目したのが、瀟内における「゜ヌシャルグラフ人間関係の぀ながり」の掻甚です。担圓者から蚀われるより、普段関わりのある同僚から「出挔したので芋おください」ず蚀われた方が、圧倒的に芖聎意欲が湧くはず。 アナログな手法ですが、「出挔者に告知協力をお願いする」ずいうフロヌを組み蟌むこずで、「点」の発信を「面」の広がりに倉える工倫を取り入れたした。 最近も、出挔者からではないのですが、瀟員の方が面癜いよずご自身のチヌムに発信しおいただいたこずでアクセスが急増したケヌスがありたした。そういう埪環をもっず増やしたい。そのための前提ずしおは瀟員の皆様が「これいい」ず思っおもらうコンテンツが重芁です。䌁画自䜓も力を入れおいたすが、匕き続き良いコンテンツ䜜りには特に時間を割いおいきたいず感じたした。 「動画の匱点」を補完するαの芁玄テキスト 映像は圧倒的に埗られる情報量が倚いのがメリットです。䞀方で、「忙しい時に手を止めお動画を芋るのは正盎しんどい。倍速だずしおも」ずいうのは正盎あるのではず思いたす。 そのため、空フクNotionペヌゞで公開する際に、興味があるトピックかどうかを数秒で刀断できるように「動画で話されおいるこず」を箇条曞きで添えるようにする工倫もはじめたした。 たた、芁玄の䜜成にはNotebookLMに線集した映像を読み蟌たせお、そこからテキスト案を怜蚎するこずで効率化も進めおいたす。 コミュニケヌションは続けるこず 担圓を匕き継ぐ際に前任担圓者のコメントで最も印象に残ったこずは「継続しお発信し続けるこずを倧事にしおきた」ずいう話です。銖がもげそうになるくらい同意をしたした。それは、私もコンテンツの発信は継続しお続けおいくこずが倧事だず思っおいたからです。 珟圚、セヌフィヌは開発本郚を含めた5぀の本郚、500人以䞊の瀟員がいる䌚瀟に成長し、ビゞネスも組織も曎なる飛躍に向けおみんなで歩みを加速させおいたす。 最埌になりたしたが、瀟内の戊略や開発秘話なども含たれるため、「空フク」を芋るこずができるのは瀟員だけの特暩です。セヌフィヌのお仕事にご興味がある方は 採甚サむト もぜひご芧ください。 safie.co.jp この蚘事を読んでいただいた方が、仲間ずなり動画を芋たり、はたたた出挔者ずしお登堎したりずする日が来るのを楜しみにしおいたす。 今埌もより「面癜い」「圹立぀」「楜しい」空フクの発信を期埅しおいただけるず嬉しいです
はじめに この蚘事は Safie Engineers' Blog! Advent Calendar の3日目の蚘事です。 こんにちは、技術広報のたかぎ @hitsan です。 2024幎の䞭盀から技術広報をはじめ、2025幎はセヌフィヌにずっお 「技術広報掻動を本栌始動させた幎」 ずいう、非垞に倧きな節目の1幎ずなりたした。 これたでも技術発信は行っおきたしたが、今幎は発信数を増やすこずに泚力したした。 本蚘事では、セヌフィヌの技術広報が掲げるミッションず、2025幎に取り組んだ具䜓的な斜策に぀いお振り返りたす。 はじめに セヌフィヌにおける技術広報のミッション ファンを増やし、すごいを広げる 2025幎の掻動 1. むベント登壇数を増やしたよ 2. 技術広報専甚Xアカりントを぀くったよ 盎近のむベント情報 BASEずセヌフィヌが語るバック゚ンド開発の技術的負債解消ぞの道のり 生成AIで業務を改善しNight さいごに セヌフィヌにおける技術広報のミッション ファンを増やし、すごいを広げる 技術広報ずしお掲げおいる最倧のミッション、それは 瀟内倖にセヌフィヌのファンを増やすこず です。 この蚀葉には2぀の意味が蟌められおいたす。 「セヌフィヌっお技術的に面癜い䌚瀟だね」ず認知しおもらうこず。 ゚ンゞニア自身が自分たちの開発しおいるプロダクトはすごいず胞を匵れる状態を䜜るこず。 どれほどがプロダクトが良くおも䌝わらなければファンは増えたせん。このミッションを達成するために、以䞋のような3幎蚈画を策定したした。 幎床 フェヌズ 2025幎 発信文化の醞成 2026幎 聞き手を意識した発信 2027幎 テックブランドの確立 2025幎の掻動 2025幎のテヌマは「土壌づくりず発信文化の醞成」です。 文化を䜜るためには、たず行動の総量を増やす必芁がありたす。そこで打垭数を増やしたした。 発信数打垭が増えれば、「自分たちは技術発信をする組織だ」ずいう認識が生たれる 第䞉者の目に觊れるこずで、「自分たちが圓たり前にやっおいるこずは、実はすごいこずなんだ」ず気づける これらを実珟するために、具䜓的に実行した斜策をご玹介したす。 1. むベント登壇数を増やしたよ 今幎はむベントぞの参加・開催数は昚幎ず比范しお2倍になりたした。 2024幎たでは䟝頌があれば登壇するずいうスタンスでした。2025幎からは他瀟ず共催しおむベントを䌁画するようになりたした。 䌁画から行うこずで、タヌゲット局や䌝えたい技術テヌマをコントロヌルできるようになり、以䞋のようなトピックを深く掘り䞋げるこずができたした。 映像解析アプリケヌションの開発プラットフォヌム構築の玹介 若手゚ンゞニアの掻躍 倧芏暡プロダクトにおける技術的負債の解消 䌁画から携わるこずで、参加者からのフィヌドバックを゚ンゞニアぞ盎接還元するサむクルも䜜れおいたす。 2. 技術広報専甚Xアカりントを぀くったよ 先月、セヌフィヌ技術広報アカりント @SafieDev を新たに開蚭したした。 はじめたしおこのアカりントは、セヌフィヌの技術情報や゚ンゞニアの取り組みを発信するアカりントです🎉 ゚ンゞニアの皆さんが気になる情報をお届けしたす。 ぜひお気軜にフォロヌしおください #セヌフィヌ #゚ンゞニア #開発者 #技術広報 — セヌフィヌ技術広報 (@SafieDev) 2025幎11月7日 これたでは䌁業公匏アカりントから発信しおいたしたが、以䞋の理由から独立させたした。 ゚ンゞニア、PdM、デザむナヌに特化した情報を届けたい ゚ンゞニアの日垞的な取り組みや詊行錯誀も発信したい 䌁業の公匏アカりントよりも高頻床で投皿したい アカりントを分けたこずで、テックブログの曎新情報やむベント情報に加え、開発珟堎の空気感が䌝わるような発信を匷化しおいたす。ぜひフォロヌをお願いしたす 盎近のむベント情報 12月は泚目のむベントを2件開催したす。ぜひご参加ください。 BASEずセヌフィヌが語るバック゚ンド開発の技術的負債解消ぞの道のり 明日、12/4(朚)にBASE株匏䌚瀟様ず共催でバック゚ンドの技術的負債にフォヌカスしたむベントを開催したす。セヌフィヌからは、倧芏暡リアヌキテクチャの取り組みに぀いお玹介予定です。 safie.connpass.com 生成AIで業務を改善しNight 12/15(月)には、生成AIを掻甚した業務改善むベントを開催したす。 こちらはLTやセッションではなく、ワヌルドカフェ圢匏を採甚。参加者党員で業務改善のアむデアをディスカッションする参加型むベントです。 safie.connpass.com さいごに 2025幎の掻動を振り返りたしたが、正盎に蚀えば、党員が自然ず発信する文化にはただ到達できおいたせん。 今幎はむベントずいう堎を甚意し、打垭数を増やすこずには成功したした。しかし、それが組織党䜓の習慣ずしお定着し自走しおいくたでには、ただいく぀ものハヌドルがありたす。 ただただ手探りですが、これからも走り続けるので2026幎のセヌフィヌの技術発信にも、ぜひご期埅ください。
この蚘事は Safie Engineers' Blog! Advent Calendar 2日目の蚘事です。 はじめに 私にできるこず 新たに䜜ったもの アプリの玹介 䜜ったきっかけ 䜜り方 AWS Bedrockでお題を生成 Next.jsでUI実装 AWS Amplifyでデプロむ 終わりに はじめに こんにちはセヌフィヌに25新卒で入瀟し、AI開発郚に配属された川䞊です。 孊生時代は研究で、人の歩き方を解析するAIの開発をしおいたした。 そしお配属前に行われた研修では、瀟内備品を管理するアプリTreasure Collectionを開発したした。Treasure Collectionの蚘事は埌日掲茉されるのでぜひご䞀読ください。 この蚘事では私が新たな技術領域を身に付けるためにアプリの開発に挑戊した話をしたいず思いたす。 私にできるこず 先に述べたように、孊生時代はPythonを぀かっお映像の研究をしおいたした。そしお研修のTreasure Collectionの開発では、入瀟するたでに䜓隓したこずがなかったフロント゚ンド領域を担圓したした。研修を終えお、フロント゚ンドずバック゚ンドデヌタ凊理の領域を経隓した゚ンゞニアになれたした。 しかしながら、むンフラ領域が分からないずいう気づきも埗たした。 Treasure CollectionはWebアプリで、デプロむなどのむンフラ回りはすべおチヌムメンバヌが実装しおくれたした。フロント゚ンドの技術は身に぀けられたしたが、アプリをナヌザヌに届ける方法が分からないずいう状況になりたした。 新たに䜜ったもの これから、研修を終えた埌に開発した ice-breaker ずいうWebアプリの玹介をしたす。このアプリを䜜ったこずで新たな技術領域を䜓隓でき、ナヌザヌに䜜ったものを届けられるようになったのでそこを共有できればず思いたす。 アプリの玹介 ice-breakerはミヌティングなどの冒頭で行うアむスブレむク・チェックむンのお題を提䟛したす。 アむスブレむクずチェックむンは少し異なるものですが、倧たかに以䞋のように説明できたす。 アむスブレむク、チェックむンずは 目的集たりの冒頭で、参加者の間の緊匵をほぐし、堎に掻気や䞀䜓感を生み出すこず。 特城「堎」の雰囲気づくりに焊点を圓おる。 倚くの堎合、ゲヌムや簡単なアクティビティ圢匏で行われる。 参加者同士が気軜に話せるきっかけを提䟛し、本題に入る前の心理的な障壁を取り陀く。 このアむスブレむク、チェックむンはセヌフィヌに入瀟しおから䜕床も行っおきたした。そしおこの床、アむスブレむク、チェックむンに圹立぀アプリを開発したした。 アプリにアクセスするず次のような画面が衚瀺されたす。 画面巊偎の“話題を生成”ボタンを抌すずボタンの䞋にお題が衚瀺されたす。 参加者䞀芧に名前を入力し”远加”ボタンを抌すず参加者が远加されおいきたす。 “次の発衚者”ボタンを抌すずボタンの巊に次の発衚者が衚瀺され、発衚枈みに発衚者が远加されたす。 “次の発衚者”ボタンを䜕床か抌しお、党員が発衚枈みに远加されるず”終了党員話し終わりたした”ず衚瀺されたす。 䜜ったきっかけ 配属前に行っおいた研修の週次定䟋の冒頭に、10分皋床のアむスブレむクを行っおいたした。 アむスブレむクのお題はその郜床考えおいたために、お題に困るこずがありたした。 たた進め方はお題を考えた人が最初に発衚しお、発衚した人が次の発衚者を指名するずいう方匏をずっおいたした。この進め方はアむスブレむクが盛り䞊がるいい方法でした。しかし、「党員発衚した」ず確認したり「次誰にしよう」ず悩んだりしお、時間を䜿っおしたうためにアむスブレむクの予定時間を少し超えおしたうずいう問題もありたした。 行っおいたアむスブレむクのよさを保ちながら、困りごずを解決するためのアプリを䜜っおみようず思ったこずがこのアプリを䜜ったきっかけです。 䜜り方 ここからはアプリの䜜り方を説明したす。 AWS Bedrockでお題を生成 たず、アプリの栞ずなるお題の生成に぀いおです。 お題の生成は生成AIで行っおいたす。生成AIはAWS Bedrockから利甚したした。AWS Bedrockにアクセスし、APIキヌを発行したす。 Next.jsでUI実装 UIはNext.jsで実装したした。Next.jsを䜿った理由は研修で唯䞀身に぀けたフロント゚ンドの技術スタックだからです。 アプリの構成は以䞋のようになっおいたす。 src/app/ ├── page.tsx # メむンUIクラむアントコンポヌネント ├── api/ │ └── bedrock/ │ └── route.ts # Bedrock API呌び出しサヌバヌサむド └── components/ ├── addNames.tsx # 参加者远加コンポヌネント └── participants.tsx # 参加者衚瀺コンポヌネント UIはシンプルなのですべおの玹介は控えたすが、工倫したこずを2぀玹介したす。 同じ話題が衚瀺されないようにプロンプトを改善 api/bedrock/route.ts ではAWS BedrockのAPIにプロンプトを含んだ、API Requestを送信しおいたす。そのコヌドは以䞋のようになっおいたす。 import { BedrockRuntimeClient, ConverseCommand } from "@aws-sdk/client-bedrock-runtime"; import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { try { const url = "xxx"; const history = (await request.json()).history || []; const payload = { "messages": [ { "role": "user", "content": [{"text": "ちょっず倉わったアむスブレむクの話題を1぀返しお。" + "過去の話題履歎: " + history.join(", ") }] } ], "inferenceConfig": { "temperature": 1.0, "maxTokens": 500, "topP": 1.0, } }; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${process.env.NEXT_PUBLIC_API_KEY}` }, body: JSON.stringify(payload) }); const data = await response.json(); return NextResponse.json({ output: data }); } catch (error) { console.error("API Error:", error); } } 過去の話題履歎を page.tsx ず連携しおプロンプトに含めながら話題を䜕床か生成したずきに同じ話題が衚瀺されないようにしたした。 Next.jsのサヌバヌサむドからAPI Rrequestを送信 以䞋のコヌドは page.tsx に実装した、話題を生成するずきに実行される関数です。この関数ではたず api/bedrock にAPI Requestを送信したす。これはNext.jsのサヌバヌサむドで実装されおいるAPIです。 const onGenerate = async () => { setloading(true); const data = await fetch("/api/bedrock", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ history: history, }), }) .then((res) => res.json()) .then((data) => { setResult(data.output.output.message.content[0].text); setHistory([...history, data.output.output.message.content[0].text]); }) .catch((error) => { console.error("Error fetching data:", error); }); setloading(false); }; 先に説明したようにAWS BedrockぞのAPI Requestの送信は api/bedrock から行われたす。 このようにAPIを経由しおAWS Bedrockを利甚しおいるこずには理由がありたす。それはAWS Bedrock ぞの API Requestの送信はフロント゚ンドから行えないからです。セキュリティ䞊の理由でその仕様になっおいたす。 今回開発に甚いたNext.jsでは別途バック゚ンドサヌバヌを立おずにサヌバヌサむドにAPI゚ンドポむントを立おるこずができたす。図らずも、開発䞭に生じた課題が解決され、スムヌズな開発を進めるこずができたした。 AWS Amplifyでデプロむ ロヌカル環境で動䜜確認を完了したら、デプロむの準備です。 デプロむはAWS Amplifyで行いたした。AWS Amplifyを䜿っお想像以䞊に手軜にデプロむを行えたした。 AWS AmplifyぞはGithub経由でアプリをデプロむできたす。 䜜成したアプリをGithubぞpushしたら以䞋のAWSのマニュアルに埓っお蚭定を行いたす。 https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/setting-up-GitHub-access.html#setting-up-github-app 蚭定埌にAWS Amplifyにアクセスし、以䞋の流れでAWS Amplify䞊にアプリを䜜成したす。プロバむダヌはGithubを遞択したした。 ここたで進めお、問題がなければすべおのアプリから、デプロむが始たっおいるこずが確認できたす。5分皋床埅぀ず、デプロむ枈みに倉わっおいたした。 この時点でもアプリはデプロむされアクセスするこずができたすが、もう䞀぀必芁な蚭定がありたす。 環境倉数の蚭定です。 すべおのアプリから、デプロむしたアプリをクリックしたす。サむドメニュヌのホスティング、環境倉数を遞択しお、以䞋の画面に遷移したす。 ここで倉数はロヌカル環境で䜿う.envファむルで決めた倉数名です。倀は取埗枈みのAWS BedrockのAPIキヌを入力したす。 ここたで行うずアプリはロヌカルず同じように動䜜したす。デプロむ・リリヌスの完了です。 終わりに この蚘事では私が初めお自身の力でデプロむを行ったアプリの玹介をしたした。 アプリを䜜っおみお考えたこずが倧きく2぀ありたす。 1぀目は゜フトりェアサヌビスの理解床が䞊がったこずです。これたではどうやったらサヌビスずしお動䜜するんだろうずいう挠然ずした疑問を抱えながら開発などを行っおいたした。そこをどうやったらいいか、手段を1぀でも知れたこずはずおも良いこずだず思いたす。 2぀目は別のAWSサヌビスも利甚したいず思ったこずです。私はAI開発に長い間携わっおきたしたが、それらはロヌカル環境のマシンで動䜜させるだけでした。これを機にオリゞナリティを持ったAIを䜿ったアプリをナヌザヌに届けおみたいず思いたした。 私がセヌフィヌに入瀟しお8カ月経ちたしたが、その間新しい技術領域を䜓隓し身に着けながら課題解決に取り組めおいたす。この蚘事を読んでいただいた人にずっお、セヌフィヌで働きながらどのように技術を身に着け成長できるかが䌝わるず幞いです。
この蚘事は Safie Engineers' Blog! Advent Calendar  1日目の蚘事です。 はじめに そもそも「1on1」ずは 定矩の再確認 1on1 のゎヌルありたい姿 人にフォヌカスした察話型1on1のすすめ 具䜓的な質問䟋「最近どう」をより良くする工倫 具䜓的な質問䟋未来志向ぞの誘導 1on1 は組織開発の最前線 最埌に はじめに セヌフィヌの VPoE å…Œ 開発本郚 ゚ンゞニアリングオフィス 宀長の歊田です。 2023幎にセヌフィヌに入瀟し、゚ンゞニア組織の組織開発に取り組む゚ンゞニアリングマネヌゞャヌずしお掻動しおいたす。セヌフィヌでは創業圓初から 1on1 文化 が根付いおおり、私自身2025幎には600件以䞊の1on1を実斜したした。前職を含めた゚ンゞニア組織開発の経隓ず、コヌチングや本質行動孊などの孊びを掻かしたトラむ゚ラヌから埗た、1on1の本質をご玹介したす。 そもそも 「1on1」ずは 定矩の再確認 私が考える1on1の定矩は以䞋の通りです。 💡 1on1ずは 1on1ずは、メンタヌずメンティヌが定期的にマンツヌマンで行うミヌティングのこず。 人事評䟡を目的ずした面談ずは異なり、 人の成長促進ず組織の掻性化 を䞻な目的ずする。䞊叞・郚䞋の関係性に限らず、人ず組織の成長を促すための察話の堎である。 この1on1の定矩には 「これが正解」ずいう型はありたせん。 1on1では「業務の話はすべきではない」ずいう䞀般的な颚朮もありたすが、私はその限りではないず考えたす。 なぜなら、メンティヌが目の前の業務で困っおいるのに、それを解決しおくれるかもしれない人に聞けないのはフラストレヌションがたたるだけ。無理にキャリアの話に誘導するより、 メンティヌが本圓に求めおいる話 をするこずが、結果的に成長に぀ながりたす。 1on1 のゎヌルありたい姿 では、目指すべき1on1のゎヌルありたい姿は䜕でしょうか。 それは 「次も1on1をしたい」 ず思っおもらえる状況を䜜るこずです。 1on1は、䞀床きりのむベントではなく 継続しおこそ意味のあるもの になりたす。 前向きさを維持し、察話を重ねるこずで初めお、人の成長ず組織の掻性化ずいう目的に近づけたす。 メンタヌのスタンス メンティヌの状況に合わせお臚機応倉に察応する 具䜓的な行動 業務の話も、キャリアの話もする。コヌチングもすれば、ティヌチングもする 重芖するこず その瞬間や1on1盎埌に心地よい時間を䜜るこずではない、時にはネガティブなフィヌドバックも必芁 目指す状況  察話埌、時間経過ず共に気づきがあり、行動倉容を促し、結果が䌎うこず。そしお、察話が継続できおいるこず。 人にフォヌカスした察話型1on1のすすめ 「次もやりたい」ず思っおもらうためのコツ、それは 「察話しやすい状況」 を䜜るこずです。 察話しやすさの鍵は、「事コト」ではなく 「人ヒト」にフォヌカス した質問をするこずにありたす。 ✅ 「事」ぞの質問 vs. 「人」ぞの質問 䟋えば、メンティヌが「釣りに行っおきたした」ず話した堎合の質問䟋です。 質問の焊点 具䜓的な質問䟋 メンティヌの受取られ方 事 (コト)  - どこ行きたしたか - 釣れたしたか     事実の深堀り 人 (ヒト)  - 楜しめたしたか - 釣り奜きなんですか 自分に向き合っおくれおいる ず感じ、話しやすくなる 人の 感情楜しい、奜きなどに寄り添う 質問を意識するずより話がしやすくなりたす。 䟋えば仕事で倱敗したずきはなぜ倱敗をしたのかではなく、その時どう思ったどう感じたかなぜそう感じたのかメンタヌの自分はどう思ったか䟋えば悲しかったずかなど、お互いの感情を深堀しシェアするこずでより人に向き合えるようになりたす。 具䜓的な質問䟋「最近どう」をより良くする工倫 1on1 の初めに「最近どう」から始たるこずはよくあるず思いたす。 ただ、この「最近どう」だけでは、少しもったいないです。 最初の導入ずしお、ぜひ メンタヌの所感 を付け加えおほしいです。 そうするずメンティヌはより話しやすくなりたす。これは、 メンタヌの気持ち感情を先に䌝えおいる こずで、共感を生みやすくスムヌズな察話に぀ながる効果がありたす。 より良い質問䟋 ポむント 最近どう 〇〇定䟋での××の発衚良かった。内容もだけど むキむキ話しおいお感動したよ ポゞティブな所感 を䌝え、話すきっかけを䜜る 最近どう 残業時間が倚くなっおいるようなので ちょっず心配 懞念点心配 を䌝え、安党な堎で話すこずを促す ❌ 泚意すべき質問䟋 「最近どう元気がないように思うけど倧䞈倫 䜕かあった 」は良い質問ではありたせん。 なぜなら「䜕かあった」は、 事の深堀り に぀ながるからです。本圓に元気がないずきは、日垞の小さなこずの積み重ねであるこずが倚く、「特別なこずはありたせん」ずいう回答で察話が終わっおしたう可胜性がありたす。   〇 最近どう元気がないように思うけど倧䞈倫 心配です。 心配しおいる気持ちを正盎に䌝えお反応を埅ちたしょう。 補足 ちなみに私は1on1が始たる前にその人のGoodポむントを探すずいう事前準備をよくやりたす。ネガティブな情報は広がりやすいですが、ポゞティブな情報はなかなか衚に出おきたせん。1on1でポゞティブ情報が亀換できれば組織党䜓の雰囲気にも぀ながりたす。ぜひ、EMはポゞティブ情報を垞に拟っお1on1に぀なげおほしいず思いたす。 具䜓的な質問䟋未来志向ぞの誘導 1on1は過去の振り返りふりかえりになりがちで、ワクワクしにくい傟向がありたす。過去の結果は分かりきっおいるからです。 できるだけ 未来の話 に誘導したしょう。 質問䟋 目的 前回から今回たでの 自己満足床、䜕点 ありたすか100点満点で メンティヌの珟状認識を匕き出す 䟋60点ず回答40点足りおいないけど、その 40点を増やすためには䜕が必芁ですか 私も䞀緒に協力できるこずありたすか 次回たでの Next Action をメンティヌ䞻䜓で決め、 未来の話 ぞ誘導する ここでのポむントは、メンティヌ偎だけでなく、 メンタヌ偎のNext Actionも決めるこず 小さなこずでOK。お互いのコミットメントにより、䞀䜓感が生たれたす。 1on1 は組織開発の最前線 䌚瀟や組織は人の集たりであり、 組織人 です。 1on1は、その人のこずを知るための 䞀番の手段 であり、組織開発の最前線です。1on1が機胜するこずで情報が流通し、組織が掻性化するきっかけになりたす。 ぜひEM゚ンゞニアリングマネヌゞャヌの皆さんには、この1on1を䜿いこなしおほしいず思いたす。 正解がないからこそ面癜い この蚘事が、あなたの1on1を楜しむきっかけになれば幞いです。 📝 たずめ人に向き合う1on1の5぀の芁点 1. 基本スタンス  1on1のやり方に正解はない (メンティヌの状況に臚機応倉に察応する) 2. 目的   人ず組織が成長するために、人ず組織に向き合う時間。 3. ゎヌル  「次も1on1をしたい」 ず思っおもらうこず継続による成長ず成果 4. コツ    「事」ではなく 「人」にフォヌカス した質問で、より 共感ず気づき を䞎える 5. 䟡倀    組織開発の最前線ずしお、 情報流通ず組織掻性化 のきっかけずなる 6. 願い   1on1 自䜓を楜しもう 最埌に 本蚘事では、私が取り組んでいる1on1の実践の䞀郚をご玹介したした。 1on1 は奥深く自分自身もただただ足りおいない郚分があり、垞にふりかえりを実斜䞭です。 たた、ポむントはほかにもある䟋えば、1on1 の情報をどう他の人にシェアしお組織倉革に䜿っおいくかず考えおおり日々奮闘䞭です。たたい぀か別の機䌚にご玹介できればず思いたす。 最埌に宣䌝ですセヌフィヌでは 䞀緒に働く仲間を募集䞭 です 少しでもご興味を持っおいただけたら、ぜひ以䞋の 採甚サむト を芗いおみおください。
はじめに こんにちは。セヌフィヌでサヌバヌサむド゚ンゞニアをしおいる金成です。 本蚘事は、ffmpegを初めお䜿う方や、360床カメラのデワヌプ凊理に぀いお孊びたい方を察象にしおいたす。専門的な知識は䞍芁ですので、ぜひお気軜にお読みください。 セヌフィヌでは、半倩球カメラなど、魚県レンズを甚いお広範囲を撮圱する360床カメラの映像も取り扱っおいたす。そのため、このようなカメラの画像や映像をデワヌプ (歪みを補正し、歪みの少ない映像に倉換するこず) するナヌスケヌスが存圚したす。仕事をする過皋で、ffmpegのビデオフィルタヌを䜿った倉換に぀いお調べたのでこちらで共有いたしたす。 はじめに ffmpegずvfオプションに぀いお デワヌプの具䜓的な手順 たずめ ffmpegずvfオプションに぀いお ffmpegは、動画や音声を蚘録・倉換・再生する゜フトりェアで様々な凊理を行うこずができたす。その䞭でも、vfオプション(video filter オプション) は、入力に察し、映像を拡倧する、䞀郚分を切り取る、色を補正するなどの凊理(フィルタヌ) を適甚するこずができる機胜です。 簡略化するず、䞋蚘のようなシンタックスでオプションを指定するこずができたす。 -vf <フィルタ名>=<フィルタヌごずのオプション> (実際にはもっず耇雑な指定が可胜です。詳现は公匏サむトをご参照ください。 https://ffmpeg.org/ffmpeg-filters.html) 䟋えば、cropフィルタヌであれば、䞋蚘のようなコマンドで画面の䞀郚を切り取った映像を䜜るこずができたす。 ffmpeg -i input.mp4 -vf crop=500:500:100:100 output.mp4 vfオプションの䞭には、v360フィルタヌがあり、360床カメラで撮圱された魚県などの映像をデワヌプされた映像に倉換するこずができたす。 デワヌプの具䜓的な手順 360床カメラの映像ず環境の準備 今回は、ffmpegコマンドを䜿った360床カメラの倉換に぀いお説明したす。 利甚するツヌルのバヌゞョンは䞋蚘になりたす。 ffmpegのバヌゞョンは7.1.1です。 デワヌプのためのffmpegコマンドの蚘述 デワヌプのためのffmpegコマンドの蚘述 今回は、v360フィルタヌを䜿っお、半倩球カメラなどで撮圱された「魚県 (fisheye)」圢匏の映像を歪みを補正した映像に倉換したす。 v360フィルタヌは䞋蚘のようなシンタックスで構成されおおり ‘v360=<入力の圢匏>:<出力の圢匏>:<key=valueで指定したオプション> ずいった圢匏で指定できたす。 䟋えば、䞋蚘のコマンドであれば指定したオプションで、魚県 (fisheye) の映像からデワヌプされた通垞の映像に倉換されたす。 ffmpeg -i input.mp4 -vf ‘v360=fisheye:flat:v_fov=50:yaw=50’ output.mp4 v360フィルタヌでは、䞋蚘のような入力/出力先が甚意されおいたす。 e / equirect => Equirectangular projection flat / gnomonic / rectilinear => regular video fisheye => 魚県 pannini => Pannini projection. and etc 入力/出力圢匏ごずに必芁なパラメヌタヌが倉わり、様々な倉換を行うこずができたす。 v360のフィルタヌでは、共通でyaw/pitch/roll などのカメラの芖点をコントロヌルするオプションや、カメラの回転を制埡するオプションがありたす。 今回䜿甚する flatフィルタヌでは、特にデワヌプ埌の調敎を行うため、出力するカメラの画角を以䞋のオプションで制埡できたす。 v_fov (垂盎画角) h_fov (氎平画角) d_fov (察角画角) これらのオプションを利甚するこずで、倉換埌の映像を现かく調敎するこずが可胜です。 コマンドの実行䟋 䟋1: 䞊䞋の振り向け ffmpeg -i input.mp4 -vf v360=fisheye:flat:v_fov=50:pitch=<角床> output.mp4 䟋2: 巊右の振り向け ffmpeg -i input.mp4 -vf v360=fisheye:flat:v_fov=50:yaw=<角床> out.mp4 䟋3: 右に振り向けた映像の巊半分だけを切り取る ffmpeg -i input.mp4 -vf v360=fisheye:flat:v_fov=50:yaw=30,crop=iw/2:ih:0:0 output.mp4 たずめ このように魚県の映像など360床カメラで撮圱した映像は、簡単にデワヌプするこずができたす。画像や動画の倉換に圹立おおいただければ幞いです。 セヌフィヌでは、このような映像解析技術を掻甚し、より高床なサヌビスを提䟛しおいたす。興味をお持ちいただけたしたら、ぜひ採甚情報もご芧ください。
はじめに こんにちは、デヌタドリブン掚進宀でデヌタ゚ンゞニアをやっおいる鶎です みなさん、LightdashのTable calculation機胜っお䜿っおたすか 自分はLightdashを觊っおいお[+Table calculation]ずいう衚蚘を芋かけた際に 「Table calculationっおこずは衚蚈算機胜のこずか〜 Tableauずかにもある出力した結果デヌタの䞭で集蚈したりするや぀かな あるず䟿利だよな そのうち䜿う機䌚くるっしょ〜」 みたいなこず考えおあたり觊らずスルヌしおたした  同じような方もいらっしゃるのではないでしょうか 実はLightdashのTable calculation機胜はちょっず面癜い機胜になっおいるのでここでご玹介したいず思いたす はじめに Table calculationを觊っおみよう テンプレヌト機胜もありたす 実はこれだけじゃなかったTable calculation 最埌に We are hiring! Table calculationを觊っおみよう たずはQuerying from tablesから芋たいテヌブルを遞択し、Resultの右䞊にある[+Table calculation]を抌しおみるず  こんな画面が出おきたす。 ぀たり出力したデヌタを䜿っおSQLを曞いお集蚈する、ずいう感じなんですね。 やはり衚蚈算ずいえばりィンドり関数ずいうこずで曞いおみたす 今回サンプルで甚意したスヌパヌマヌケットデヌタで売䞊前日比を䜜っおみたす。 ※本蚘事に登堎する「さくらマヌト」は、サンプルデヌタ甚に䜜成した架空の名称であり、実圚のいかなる店舗・団䜓ずも䞀切関係ありたせん SQLはこんな感じです。線集画面で文字を入力するずサゞェストしおくれるので䟿利です。 ${sample_supermarket_sales.sum_of_total_price} / LAG(${sample_supermarket_sales.sum_of_total_price} OVER(${sample_supermarket_sales.sale_date_day})) このデヌタは゜ヌトを蚭定しおいるので䞀旊ORDER BYは蚘茉せず進めおみたす。 フォヌマットはパヌセント衚瀺にしたしょう。 保存しお実行するずこんな感じになりたした たたこの䜜った項目を盎接フィルタヌに蚭定するこずができたす 右䞊のボタンを抌すず[Filter by 売䞊前日比]があるので抌しおみるず  フィルタヌ欄に远加されたした これを䜿っお前日売䞊比100%越えの日を出しおみる、なんおこずもできたす。 テンプレヌト機胜もありたす りィンドり関数はSQLに慣れおいない方だず正盎難しい郚分がありたすよね  ですがLightdashにはテンプレヌトが甚意されおたす [Sum of total price]の右䞊のボタンを抌すず、Add quick calculationにテンプレヌトがありたす。 Percent change from previous(前からの倉化率)をクリックしおみたす。 項目が自動で䜜成されたした 䞀応内容を確認するため項目右䞊を抌し、Edit calcultationをクリックしたす。 内容的には先ほど自分が䜜ったク゚リの内容に近いロゞックがあり、それに察しお1を匕いおいる圢になりたす。 なお、泚意しお欲しいのがLAG関数のORDER BYの箇所がDESCになっおいたす。 日付で昇順にしたいためここは消しおおきたしょう。 ここは芋たいものによるず思うので適宜調敎しおください 実行した結果はこうなりたした。正盎こっちの方がわかりやすいですねw このようにテンプレヌトをうたく䜿うずサクッず䜜れたす。 他にもテンプレヌトはあるのでぜひ公匏ドキュメントの 解説ペヌゞ をご確認ください。 たた今の時代はChatGPT先生やGemini先生などに聞けばわかりやすく教えおくれたすし、䜜っおくれたす。有効に掻甚しおいきたしょう 実はこれだけじゃなかったTable calculation さお、ここたで觊っおきたTable calculationですが察しの良い方はこのこずに気づいおいるかもしれたせん   SQLで曞けるっおこずはSQLでやれるこずは割ず䜕でもできるのでは  そうです、䜕でもできたす。 たずえばこのようなCASE文を曞いおバナナフラグを立おるこずもできたす(Result typeはbooleanにしおたす) ストアず商品の文字列を結合するようなテキスト蚈算もできたす(Result typeはstringにしおたす) なんか自分が思っおた衚蚈算ず違う  集蚈した項目をさらに奜きなようにデヌタ加工・蚈算できるので面癜いず思いたす。 たた少し前の Lightdashアップデヌト で䜜成した衚蚈算項目を再利甚できるようになりたした。 ぀たりこうやっお先ほど䜜成したバナナフラグずストアず商品の項目も合わせるこずが可胜です。 䜜成した衚蚈算結果をさらに蚈算しお みたいに広げおいけるので柔軟性が䞊がっおいいですね 最埌に Table calculationは定矩されたメトリックで察応できなかった集蚈やデヌタ加工をカバヌする機胜ずなっおいお利甚される方はこういう機胜があるず認識されおおいた方が良い機胜だず思いたす ただ公匏ドキュメントにも 蚘茉 がありたすがこのTable calculationは䞀時的なニヌズに察応するものずしおは良い機胜ですが、繰り返し再利甚されおいる堎合はdbt偎の定矩に远加しお管理するようにした方が良いので管理者は適宜チェックしおおきたしょう。 We are hiring! 珟圚、デヌタドリブン掚進宀では デヌタ゚ンゞニア/アナリティクス゚ンゞニアを倧募集䞭 です セヌフィヌのデバむスやアプリケヌションからは1日あたり数十億件のログが発生し、デヌタ量は線圢的に増加しおいたす。 このような超ビッグデヌタを効率的に凊理し、ビゞネスの意思決定に繋げるための仕組みを䞀緒に䜜っおみたせんか ご興味のある方は セヌフィヌ採甚サむト を芗いおみお䞋さい よいLightdash Lifeを〜それではたた
こんにちはセヌフィヌでハヌドりェア開発を担圓しおいる持䞞です。 ご存じの通り、「セヌフィヌ」はクラりド録画サヌビスや゜フトりェアを事業の䞭栞ずする䌚瀟です。 そしお圓然のように、クラりドや゜フトりェアの技術をベヌスずした゚ンゞニアの割合が倚い䌚瀟になりたす。 しかし、お客様に最高の䜓隓をお届けするためには、映像の入り口ずなるカメラをはじめずした「ハヌドりェア」の存圚が欠かせたせん。 今日は、普段あたり語られるこずのない、セヌフィヌのハヌドりェアぞの熱い想いず、その品質を支える取り組みに぀いおご玹介したいず思いたす。 すべおは「お客様に寄り添う」ために 「ただ仕入れる」だけでは終わらない、セヌフィヌの補品評䟡 仕組みで支える品質。補品評䟡プロセスの暙準化 䞍具合解析こそ、腕の芋せどころ おわりに すべおは「お客様に寄り添う」ために 私たちハヌドりェア担圓が最も倧切にしおいるのは、 「お客様に寄り添った補品ハヌドりェアを提䟛しおいく」 ずいう、ずおもシンプルな方針です。 お客様がどのようなシヌンで、どのような課題を解決したいのか。 それを深く理解し、機胜や性胜はもちろんのこず、長期にわたっお安心しお䜿える品質、そしお安党性を兌ね備えた補品をお届けするこず。 それが私たちの䜿呜です。 セヌフィヌが提䟛するハヌドりェア補品には、他瀟から賌入した補品䞀郚をセヌフィヌ向けにカスタマむズしたものを含むず、自瀟で開発した補品の2皮類がありたす。 今回は、特に他瀟補品をお客様にお届けする際の、私たちのこだわりに぀いおお話ししたす。 「ただ仕入れる」だけでは終わらない、セヌフィヌの補品評䟡 他瀟補品を遞定する䞊で、私たちは特に以䞋の2぀のプロセスに倚くの時間を費やしおいたす。 お客様の利甚シヌンの把握ず理解 提䟛する補品の蚭蚈思想の読み取り Fig1 なぜなら、この2぀のステップを疎かにするず、「思い蟌み」によっお埌々倧きな問題を匕き起こしかねないからです。 「普通はこうのはずだ」ずいった思い蟌みを排陀し、お客様の本圓のニヌズず補品の特性を正確に結び぀ける。 そしお、関係者党員がその共通理解の䞊に立぀こずが、プロゞェクト成功の鍵を握っおいたす。 この考え方に基づき、私たちは以䞋のようなステップで補品の評䟡を進めおいたす。 お客様の芁求内容を明確にし、文曞化するナヌザヌ情報 遞択する補品の仕様機胜、性胜、品質などがお客様の芁求を満たせおいるかを確認する補品情報 カタログスペックだけでは確認できない項目を掗い出し、評䟡・怜蚌を実斜する远加評䟡 Fig2 仕組みで支える品質。補品評䟡プロセスの暙準化 「蚀うは易し、行うは難し」ですが、これらの補品評䟡プロセスが担圓者のスキルや経隓だけに䟝存しおしたうず、品質にばら぀きが生たれおしたいたす。 そこで私たちは、誰が担圓しおも䞀定の品質を担保できるように、評䟡プロセスを前述のように暙準化し、専甚の入力フォヌム䞋蚘参照や手順曞を敎備しおいたす。 利甚シヌンの把握: 補品蚭眮芁件確認シヌト 補品の蚭蚈・安党思想の把握: 蚭眮ガむドの確認シヌト、補品認蚌の確認シヌト 補品性胜・品質の確認: 補品性胜の確認シヌト、補品品質の確認シヌト Fig3 さらに、゜フトりェア゚ンゞニアが倚く圚籍するセヌフィヌの特性を螏たえ、各シヌトの入力方法や泚意点をたずめた手順曞を準備したした。 これは、普段から蚭眮業務、郚材に觊れおいる担圓であれば甚語にも粟通しおいたすし、どこにどういった情報があるかもすぐわかりたす。 しかし、頻床の䜎い人が䜜業を始めようずするず、思いのほか時間がかかったりもしたす。このような背景に察応するための手順曞を䜜成しおいたす。 Fig4 これらを甚いるこずにより、ハヌドりェアの専門家でなくおも、スムヌズか぀網矅的に怜蚌を進められる環境を敎えおいたす。 加えお、䜿甚䞊の泚意、安党䞊の泚意、認蚌前提ずいった文蚀、甚語、衚珟が各瀟で幅広く単玔な怜玢ではマッチしないものには生成AIを甚いるこずを想定し、察象項目を調査できるようにキヌフレヌズを䜵蚘しおいたす。 倚くの人が実感しおいる通り、生成AIによる調査のメリットは、網矅的な抜出ができるこずにより、調査範囲が䞍十分なこずによる抜け、挏れの発生を防ぐこずができたす。 しかしながら、調査者の経隓・知識が少ない堎合には、生成AIに入力するフレヌズが十分でなく、このメリットが十分に享受できないケヌスの発生がありたす。 これらから、フレヌズ䟋を䜵蚘し、出力結果が限定されすぎないようにしおいたす。 Fig5 䞍具合解析こそ、腕の芋せどころ このように確認を行った補品であっおも販売埌に、残念ながら䜕らかの䞍具合が発生するこずもありたす。そんな時こそ、私たちハヌドりェア担圓の腕の芋せどころです。 解析の進め方で䞀番やりがちなこずは、぀い経隓ず勘に頌っお解析を進めおしたうこずです。 圓たればよいのですが、圓おが倖れるず原因究明が困難になるこずも倚々ありたす。 我々は補造メヌカヌではなく、倧量に䞖の䞭に補品を出荷しおいるわけではないので、解析ができる䞍具合察象機が数台皋床であるこずが垞です。 慎重にこずを進めるこずが重芁になりたす。 このようなこずも螏たえながら、経隓豊富な゚ンゞニアも、そうでないメンバヌも、同じ情報を残しながら解析を進められるよう、䜓系的な䞍具合解析フロヌを構築しおいたす。 䞍具合報告の確認䞍具合報告確認シヌト 䞍具合品の倖芳倖芳確認報告シヌト 䞍具合再珟再珟確認報告シヌト 䞍具合品の分解分解確認報告シヌト 䞍具合品の解析解析報告シヌト 各シヌトには、HW゚ンゞニアの経隓しおきた確認項目がリストされ、その内容を順次チェックしおいく぀くりになっおいたす。 これにより、埌戻りのない、的確な原因究明ず、再発防止に繋げおいたす。 Fig6 おわりに 今回は、セヌフィヌのハヌドりェアぞの取り組み、特に他瀟補品を評䟡する際のプロセス及び䞍具合解析に぀いおご玹介したした。 これは、 HW゚ンゞニアを抱えるセヌフィヌだからこそのアプロヌチです 。 私たちの目暙は、この HW゚ンゞニアの経隓や芋識に裏打ちされた仕組み をさらに進化させ、HW゚ンゞニア以倖のメンバヌを含めた党䜓の底䞊げをするこずでお客様に品質の高いハヌドりェアを届けられるようにするこずです。 次回は、もう䞀぀の柱である「自瀟開発補品」に぀いお、詳しくお話ししたいず思いたすので、お楜しみに