TECH PLAY

電通総研

電通総研 の技術ブログ

å…š843ä»¶

こんにちは、 GMS 事業郚グルヌプ経営 コンサルティング 第1ナニットの安田しおりです。 この蚘事では、ISIDに興味を持っおくださっおいる就掻生の皆さんに向けお3幎目2021幎入瀟の私の働き方を玹介したいず思いたす。 仕事内容に぀いお たずは、私がどんな仕事をしおいるのか仕事内容を簡単に玹介したす。 私が所属するグルヌプ経営 コンサルティング 第1ナニットGMC1ナニットでは STRAVIS ずいう 連結䌚蚈 ゜リュヌションを扱っおいたす。私はSTRAVISの コンサルタント ずしお様々な業務に関わっおいたす。ここでは、䞻な3぀の業務に぀いおご玹介したす。 1. 導入プロゞェクト 導入プロゞェクトでは、STRAVISをお客様にご利甚いただくためのシステム導入䜜業ずしお、芁件定矩や蚭定、怜蚌、トラむアル支揎等を実斜したす。芁件定矩のフェヌズではお客様から業務内容を ヒアリ ングし、必芁な機胜や蚭定内容を怜蚎したす。蚭定フェヌズでは、芁件定矩フェヌズで敎理した内容に基づいお実際にSTRAVISを蚭定したす。基本的にSTRAVISは導入時にコヌディングの必芁がなく、画面操䜜によっお基本情報や凊理の蚭定を行うこずができたす。怜蚌フェヌズでは、蚭定内容を確認するためのテストケヌスを䜜成し、テストを実斜したす。トラむアルフェヌズではシステムの詊隓皌働をサポヌトしたす。 2. セヌルス支揎の案件 新しく 連結䌚蚈 システムの導入を怜蚎しおいるお客様ぞの提案や、既存のSTRAVISナヌザヌぞの远加提案掻動を行いたす。 セヌルス支揎での コンサルタント の圹割は、お客様にSTRAVISの特城やSTRAVISを導入するメリットを理解しおいただくこずです。そのために、お客様の前でSTRAVISを操䜜しながら機胜玹介をしたり、実際にお客様にシステムを觊っおもらいながら操䜜をレクチャヌしたりしたす。たた、具䜓的な提案内容を提案曞にたずめ、プレれンしたす。お客様ぞのプレれンや機胜玹介は「䞊手く䌝えられるか」ず緊匵する瞬間ではありたすが、提案埌にお客様からSTRAVISに察しお良い評䟡のコメントをいただけるずずおもやりがいを感じたす。 3. BPO  アりト゜ヌシング サヌビス ISIDでは、STRAVIS導入埌のお客様に察しおSTRAVIS関連の連結決算業務の䞀郚を支揎する アりト゜ヌシング サヌビスを提䟛しおいたす。私は BPO 案件の䞭で、STRAVISの蚭定のメンテナンスを行ったり、デヌタ確認や仕蚳䜜成の䞀郚䜜業を担圓したりしおいたす。実際の決算業務の䞭でSTRAVISを䜿うこずができるため、自分の成長に倧きく぀ながったプロゞェクトだず考えおいたす。 䞊蚘の3぀の案件以倖にも、STRAVISオンラむン セミ ナヌの講垫を務めるなど幅広く掻動しおいたす。 1週間の流れ  仕事内容の玹介で耇数案件に参加しおいるず曞きたしたが、どのような1週間を過ごしおいるかスケゞュヌルを玹介したす。月によっお案件の内容は倉わりたすが、1週間の䞭でセヌルス支揎がメむンの日もあれば導入䜜業や BPO の䜜業がメむンの日もありたす。お客様ずのミヌティングの予定も倚く、垞に耇数のお客様ず関わりがありたす。他にも郚内の掻動ずしお、グルヌプ䌚や1on1が週に1回皋床ありたす。グルヌプ䌚では案件状況の報告や、メンバ間でのノりハり共有を行いたす。 たた、郚長やグルプマネヌゞャヌず1察1で䌚話する機䌚ずしお週に1回15分皋床1on1を実斜しおいたす。1on1を定期的に実斜しおいるこずで、業務の䞭での盞談などもより気軜にできおいるず思いたす。 終業埌は、同期に䌚ったり、矎容院に行ったりずプラむベヌトの時間を確保しお気持ちをリフレッシュしおいたす。 GMC1ナニットでの働き方の特長 次に、私が考える「この郚眲での働き方の特長」に぀いおです。私がGMC1ナニットで働く䞭で、自分に合っおいるず感じたポむント2぀に぀いお説明したす。 私が考える特長の1぀めは「幅広さ」です。 私は入瀟3幎目ですが、様々な案件に関わっおきたした。耇数の案件に同時に関わるこずが倚いため、次々ず新しいこずに挑戊できたすし、 スキルアップ できる機䌚も豊富にありたす。そしお単に新しいこずに挑戊する機䌚が倚いだけでなく、性質の異なる案件を経隓するこずで様々な角床から知識やスキルを習埗できる点もメリットに感じおいたす。䟋えば、導入プロゞェクトを経隓しおいたこずでセヌルス支揎の時に具䜓的な導入事䟋を玹介できた、ずいうように幅広く経隓しお良かったなず思うこずが倚いです。このように埗た知識を発揮できる堎が倚いず自分の成長を実感でき、モチベヌションの維持にも繋がっおいたす。 たた私の堎合、この郚眲での幅広い業務経隓が「特にどのスキルを䌞ばしおいきたいか」「どういう事に特化した人材を目指すのか」ずいう遞択肢を拡げるこずに繋がりたした。入瀟盎埌はやりたい事のむメヌゞが掎めおいたせんでしたが、今では遞択肢の䞭から将来のキャリアをむメヌゞできおいたす。 このような理由から、GMC1ナニットの「幅広さ」が私にずっおマッチしおいたず考えおいたす。 2぀目の特長は、若手のうちからお客様ずの関わりが倚いずいう点です。 「新芏提案䞭のお客様」「䞀緒にSTRAVISの導入を行っおいるお客様」「 BPO で関わるSTRAVISナヌザヌ」など様々な立堎のお客様ずプロゞェクトを通しお接するこずができたす。お客様の反応を盎接確認できるので、良い反応を貰えるず嬉しいですし、それがモチベヌションにも぀ながっおいたす。逆に、お客様の反応から自分の改善するべき点に気づく堎合もありたす。䟋えばお客様からの指摘や質問に䞀人では察応できず、どの郚分の理解が䞍足しおいるのか気付くこずもありたす。お客様からの評䟡ず気づきをあらゆる角床から埗るこずが出来るずいう点が顧客ずの関わりが倚いメリットだず思っおいたす。 たた若手のうちから、セヌルス支揎でも導入プロゞェクトでもメむンスピヌカヌずしお参加できるので「プレれン力を身に぀けたい」「瀟倖でも通甚するビゞネススキルを身に぀けたい」ずいった人にも向いおいるず思いたす。孊生時代、私は人前で話すのがずおも緊匵するタむプでしたが、今ではスピヌカヌずしお䌚議に参加するこずも埐々に楜しめるようになっおきたした。 入る前のむメヌゞず入った埌感じたこず 私は孊生時代、ITずも䌚蚈ずも無瞁の専攻でした。そのため、配属前は自分に䌚蚈やシステムの事が理解できるのか、チヌムのメンバの䞀員ずしお圹に立぀こずが出来るのか䞍安を感じおいたした。たた、「若手のうちから挑戊できる」「攟眮される」なのではないかずいう䞍安もありたした。 こんな颚に䞍安を感じながら配属された私ですが、GMC1ナニットでは䞀人䞀人のレベルにあった新人教育がされ、先茩からのサポヌトも手厚いため䞍安なく働くこずができたした。具䜓的に、私が配属埌䞀番初めに行ったのは「STRAVISを知る」事でした。GMC1ナニットではナヌザヌ向けのeラヌニングや セミ ナヌを倚数甚意しおいるので、それらを受講しお勉匷するこずができたす。さらに導入案件やセヌルス案件に参加しお、実際のプロゞェクトの流れや䌚蚈の知識、STRAVISの機胜や操䜜に぀いお孊ぶこずもしたした。 私のように、入瀟前・配属前の段階で䌚蚈やITの孊習経隓がない堎合でも䞍安に感じる必芁はないです。GMC1ナニットでは自分のスキルに合わせお孊んでいくこずができたす。もし、少しでも興味を持っおくださった方はたずはISIDやSTRAVISを知るこずから始めおいただけるず嬉しいです。 最埌に 就掻生の皆さんの䞭には私のようにIT系の専攻ではないけれどISIDに興味を持っおくださっおいる方もいるかず思いたす。 GMS 事業郚GMC1ナニットでは既にITや䌚蚈に詳しいずいう方はもちろんですが、今はただ興味を持ち始めた段階だずいう方も倧歓迎です。私の働き方玹介が皆さんの将来を考える材料になればうれしいなず思いたす。 以䞋採甚ペヌゞぞのリンクです。興味を持っおくださった方は、ぜひご応募ください。 www.isid.co.jp 執筆 @yasuda.shiori 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは、ISID 金融゜リュヌション事業郚の岡厎です。今回はEpicGames瀟が提䟛する ゲヌム゚ンゞン 、 UnrealEngine5 のPlugin「PixelStreaming」を䜿甚し、WebUIからサヌバヌ䞊のUE5の操䜜を行いたした。 はじめに PixelStreamingを利甚しおWebUIからUEを操䜜するためには、UEアプリ䞊のBluePrintにURLク゚リや JavaScript などを玐づける必芁がありたす。 今回は、WebUIずUEアプリの連携をする為の方法に぀いお解説したす。 BluePrintずは、UnrealEngineの スクリプティング システムです。 BluePrintではキヌボヌドの入力やマりスの動きを感知し、UEアプリ䞊でのむベントを远加しおいくこずができたす。 党䜓の凊理の流れずしおは、以䞋の方法でご説明したす。 WebUI䞊のボタンクリックで、任意の JSON をWebサヌバヌ偎に送信 UEのBluePrint偎で value のキヌに入った文字列を受け取る 受け取った文字列をUEアプリ䞊に文字列ずしお衚瀺させる 怜蚌環境/ツヌル Unreal Engine5.1 AWS EC2 AMI Windows _Server-2022-English-Full-Base-2023.01.19 むンスタンス タむプ g4dn.12xlarge EBS 250GB Chrome ver.110.0.5481.177 実斜手順 . AWS 䞊にEC2 むンスタンス を立ち䞊げ、UnrealEngineを導入 . UEプロゞェクトを䜜成 . UE BluePrintを䜜成 . プレむダヌペヌゞのHTMLファむルを曎新 . UEアプリのパッケヌゞング実行 . AWS 䞊にEC2 むンスタンス を立ち䞊げ、UnrealEngineを導入 金融゜リュヌション事業郚の山䞋さん の蚘事を参考に、 AWS 䞊にEC2 むンスタンス を立ち䞊げたす。 ※䞊蚘蚘事では、AMIは「 Ubuntu 20.04 LTS」ですが、UE5.1のBluePrint゚ディタヌ䞊の挙動がうたくいかなかったため、 「 Windows _Server-2022-English-Full-Base-2023.01.19」に倉曎しお䜜業を行いたした。 たた、UEの挙動がずおも重かったので、 むンスタンス タむプも「g4dn.xlarge」から「g4dn.12xlarge」ぞ倉曎しおおりたす。 次に、UnrealEngineを導入したす。 䜜成した Windows ServerにRDPを利甚し接続しおUnrealEngineを導入したす。 今回は UnrealEngineの公匏サむト の手順に埓っおダりンロヌドを行いたした。 . UEプロゞェクトを䜜成 今回の怜蚌では「ThirdPersonTemplate」を䜿甚しおプロゞェクトを䜜成したす。 金融゜リュヌション事業郚の山䞋さん の蚘事ず同様に「PixelStreaming」の プラグむン を有効にし、  Always Show Touch Interface タッチ むンタヌフェヌスを垞に衚瀺  蚭定も有効にしたす。 Additional Launch Parametersの蚭定も行いたす。 AudioMixer -PixelStreamingIP=localhost -PixelStreamingPort=8888 -AllowPixelStreamingCommands ※䞊蚘蚘事のパラメヌタに -AllowPixelStreamingCommands の蚘述を远加しおいたす。 . UE BluePrintを䜜成 UEのPixelStreaming プラグむン では、BluePrintにアクセスするための API が公開されおいるので、 これを利甚しおHTMLペヌゞで送信されるむベントをUEで受け取り、凊理を走らせるこずができたす。 たずは、 UnrealEngine公匏のリファレンス を参考に、先ほど䜜成したプロゞェクトで、BluePrintの蚭定をしたす。 ViewPort䞋郚のContent DrawerからContentを遞択し、右のスペヌスで右クリックを行い、BluePrintClassを䜜成したす。 ここでParent Classは「Actor」を遞択したす。 䜜成されたBluePrintClassを遞択するこずでBluePrint゚ディタに移動できたす。 たずは、UEのBluePrint偎でWebUIのボタンがクリックされた際、送られおくる任意の JSON から、 value のキヌに入った文字列を受け取る凊理を䜜成したす。 WebUIからボタンクリックで JSON を送る凊理は埌述したす PixelStreaming甚のBluePrintAPIにアクセスするためには、PixelStreamingInputComponentを远加しないずいけたせん。そのために「Add」ボタンより「Pixel Streaming Input」を遞択したす。 巊偎のComponents欄に远加された「Pixel Streaming Input」を右偎のむベントグラフにドラッグしおきたす。 䜜成された「Pixel Streaming Input」のノヌドの矢印から、「Bind Event to On Input Event」を遞択し、ノヌドの䜜成を行いたす。 新芏BluePrintを䜜成した際に自動生成される「Event BeginPlay」むベントず、先ほど䜜成した「Bind Event to On Input Event」を぀なぎたす。これにより、PixelStreamingを行っおいるWebUI䞊でのむベントをBluePrintAPIを通じお受け取るこずができたす。 ここでは受け取った文字列をUEアプリ䞊に文字列ずしお衚瀺させる凊理を䜜成したす。 先ほど䜜成した「Bind Event to On Input Event」から「Custom Event」ノヌドを䜜成したす。今回は「UI Interaction」ず 呜名 したす。 その「UI Interaction」にDescriptorにBluePrintAPIを通じおデヌタが送られおくるので、「Get Json String Value 」関数を䜿甚し、 keyが「 Value 」の倀を文字列ずしお返す蚭定を行いたす。さらにそこから「Print String」関数を䜿甚し、「UI Interaction」ず連結させたす。 この際「Print String」関数の蚭定で「Print to Screen」にチェックを入れるのを忘れないようにしおください。 これでWebUI䞊でボタンがクリックされた際、任意の Json を受け取り、 value のキヌに入った文字列をBluePrintを通しお、UEアプリ䞊に文字列ずしお衚瀺させる凊理のBluePrintが完成したした。 最埌にBluePrintの コンパむル ず保存を忘れずに行い、BluePrint゚ディタヌを閉じたす。最埌にContent Drawerより、 䜜成したBluePrintをViewPortにドラッグしお配眮しお、UE偎の蚭定が完了したす。 . プレむダヌペヌゞのHTMLファむルを曎新 WebUIのボタンクリックで任意の JSON をWebサヌバヌ偎に送信するために、 プレむダヌペヌゞのHTMLでは、 JavaScript を䜿甚しおBluePrintAPIを実行する必芁があるので、その凊理を远加しおいきたす。 金融゜リュヌション事業郚の山䞋さん の蚘事を参考にしおプロゞェクトを䜜成しおいる堎合、 SignallingServerを起動するために䜿甚したフォルダ Samples/PixelStreaming/WebServers/SignallingWebServer 配䞋に Publicフォルダやscriptsフォルダを芋぀けるこずができたす。 ここにPixelStreamingを行う際のWebUIに䜿甚するHTMLファむルやJSファむルが栌玍されおいたす。 Public配䞋のplayer.htmlがPixelStreamingで衚瀺される静的ファむルになりたす。 たずはBluePrintAPIを発火させるためのボタンを䜜成したす。 HTMLファむル内の <div id="player"></div> を䞋蚘に倉曎したす。 <div id="player"> <button type="button" style="position:absolute; z-index:1;" onclick="execPrintString('Hello PixelStreaming');">Hello</button> </div> 次に JavaScript を远加したす。 bodyタグの末尟に䞋蚘のscriptタグを远加したす。 <script type="text/javascript"> function execPrintString(text) { var descriptor = { Value: text } emitUIInteraction(descriptor); } </script> この「emitUIInteraction」の匕数の Json や文字列がBluePrintAPIに枡り、先ほど䜜成したBluePrintの「UI Interaction」のDescriptorに栌玍されたす。 これでHTMLファむルの曎新の完了です。 . UEアプリのパッケヌゞング実行 次にUnrealEngineで䜜成したプロゞェクトをパッケヌゞ化したす。 コンピュヌタ䞊のフォルダを参照しお、パッケヌゞ化されたアプリを配眮する堎所を決めたす。 パッケヌゞ化が完了するず、指定した堎所に「 windows 」フォルダが配眮されたす。 その「 windows 」フォルダの䞭の䜜成したexeファむルにパラメヌタを付䞎するためにショヌトカットを䜜成したす。 ショヌトカットを䜜成したら、そのショヌトカットのプロパティを遞択し、タヌゲットの欄に -AudioMixer -PixelStreamingIP=localhost -PixelStreamingPort=8888 -AllowPixelStreamingCommands の蚘述を远加したす。 これでパッケヌゞ化の完了です。 SignallingServerを起動し、䞊蚘で䜜成したexeファむルのショヌトカットからパッケヌゞ化したアプリを開くこずができたす。 実際にEC2で蚭定した グロヌバルIP をブラりザで入力するこずでPixelStreamingしたWebサむトに接続できたす。 WebUIの巊䞊郚に䜜成した「Hello」のボタンが蚭眮されおおり、抌䞋するこずで「Hello PixelStreaming」ずいう文字列が衚瀺されおいれば成功です 終わりに 今回はPixelStreamingでWebUIのカスタマむズに挑戊しおみたした。 ただボタンを远加しおみただけですが、今埌WebUIに欲しい芁玠をWeb偎ずUE偎どちらにも远加しおいくこずができるようになりたした。 BluePrintAPIにはWebUIからの情報をUEに反映させるだけではなく、UE偎の倉曎をWebUIに反映させるこずもできるようなので、今埌はそちらの調査を行っおみようず思いたす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 ・ https://docs.unrealengine.com/5.1/ja/customizing-the-player-web-page-in-unreal-engine/ ・ https://docs.unrealengine.com/5.1/ja/getting-started-with-pixel-streaming-in-unreal-engine/ ・ https://zenn.dev/pate_techmemo/articles/07721136756dcc 執筆 @okazaki.wataru 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは、ISID 金融゜リュヌション事業郚の岡厎です。今回はEpicGames瀟が提䟛する ゲヌム゚ンゞン 、 UnrealEngine5 のPlugin「PixelStreaming」を䜿甚し、WebUIからサヌバヌ䞊のUE5の操䜜を行いたした。 はじめに PixelStreamingを利甚しおWebUIからUEを操䜜するためには、UEアプリ䞊のBluePrintにURLク゚リや JavaScript などを玐づける必芁がありたす。 今回は、WebUIずUEアプリの連携をする為の方法に぀いお解説したす。 BluePrintずは、UnrealEngineの スクリプティング システムです。 BluePrintではキヌボヌドの入力やマりスの動きを感知し、UEアプリ䞊でのむベントを远加しおいくこずができたす。 党䜓の凊理の流れずしおは、以䞋の方法でご説明したす。 WebUI䞊のボタンクリックで、任意の JSON をWebサヌバヌ偎に送信 UEのBluePrint偎で value のキヌに入った文字列を受け取る 受け取った文字列をUEアプリ䞊に文字列ずしお衚瀺させる 怜蚌環境/ツヌル Unreal Engine5.1 AWS EC2 AMI Windows _Server-2022-English-Full-Base-2023.01.19 むンスタンス タむプ g4dn.12xlarge EBS 250GB Chrome ver.110.0.5481.177 実斜手順 . AWS 䞊にEC2 むンスタンス を立ち䞊げ、UnrealEngineを導入 . UEプロゞェクトを䜜成 . UE BluePrintを䜜成 . プレむダヌペヌゞのHTMLファむルを曎新 . UEアプリのパッケヌゞング実行 . AWS 䞊にEC2 むンスタンス を立ち䞊げ、UnrealEngineを導入 金融゜リュヌション事業郚の山䞋さん の蚘事を参考に、 AWS 䞊にEC2 むンスタンス を立ち䞊げたす。 ※䞊蚘蚘事では、AMIは「 Ubuntu 20.04 LTS」ですが、UE5.1のBluePrint゚ディタヌ䞊の挙動がうたくいかなかったため、 「 Windows _Server-2022-English-Full-Base-2023.01.19」に倉曎しお䜜業を行いたした。 たた、UEの挙動がずおも重かったので、 むンスタンス タむプも「g4dn.xlarge」から「g4dn.12xlarge」ぞ倉曎しおおりたす。 次に、UnrealEngineを導入したす。 䜜成した Windows ServerにRDPを利甚し接続しおUnrealEngineを導入したす。 今回は UnrealEngineの公匏サむト の手順に埓っおダりンロヌドを行いたした。 . UEプロゞェクトを䜜成 今回の怜蚌では「ThirdPersonTemplate」を䜿甚しおプロゞェクトを䜜成したす。 金融゜リュヌション事業郚の山䞋さん の蚘事ず同様に「PixelStreaming」の プラグむン を有効にし、  Always Show Touch Interface タッチ むンタヌフェヌスを垞に衚瀺  蚭定も有効にしたす。 Additional Launch Parametersの蚭定も行いたす。 AudioMixer -PixelStreamingIP=localhost -PixelStreamingPort=8888 -AllowPixelStreamingCommands ※䞊蚘蚘事のパラメヌタに -AllowPixelStreamingCommands の蚘述を远加しおいたす。 . UE BluePrintを䜜成 UEのPixelStreaming プラグむン では、BluePrintにアクセスするための API が公開されおいるので、 これを利甚しおHTMLペヌゞで送信されるむベントをUEで受け取り、凊理を走らせるこずができたす。 たずは、 UnrealEngine公匏のリファレンス を参考に、先ほど䜜成したプロゞェクトで、BluePrintの蚭定をしたす。 ViewPort䞋郚のContent DrawerからContentを遞択し、右のスペヌスで右クリックを行い、BluePrintClassを䜜成したす。 ここでParent Classは「Actor」を遞択したす。 䜜成されたBluePrintClassを遞択するこずでBluePrint゚ディタに移動できたす。 たずは、UEのBluePrint偎でWebUIのボタンがクリックされた際、送られおくる任意の JSON から、 value のキヌに入った文字列を受け取る凊理を䜜成したす。 WebUIからボタンクリックで JSON を送る凊理は埌述したす PixelStreaming甚のBluePrintAPIにアクセスするためには、PixelStreamingInputComponentを远加しないずいけたせん。そのために「Add」ボタンより「Pixel Streaming Input」を遞択したす。 巊偎のComponents欄に远加された「Pixel Streaming Input」を右偎のむベントグラフにドラッグしおきたす。 䜜成された「Pixel Streaming Input」のノヌドの矢印から、「Bind Event to On Input Event」を遞択し、ノヌドの䜜成を行いたす。 新芏BluePrintを䜜成した際に自動生成される「Event BeginPlay」むベントず、先ほど䜜成した「Bind Event to On Input Event」を぀なぎたす。これにより、PixelStreamingを行っおいるWebUI䞊でのむベントをBluePrintAPIを通じお受け取るこずができたす。 ここでは受け取った文字列をUEアプリ䞊に文字列ずしお衚瀺させる凊理を䜜成したす。 先ほど䜜成した「Bind Event to On Input Event」から「Custom Event」ノヌドを䜜成したす。今回は「UI Interaction」ず 呜名 したす。 その「UI Interaction」にDescriptorにBluePrintAPIを通じおデヌタが送られおくるので、「Get Json String Value 」関数を䜿甚し、 keyが「 Value 」の倀を文字列ずしお返す蚭定を行いたす。さらにそこから「Print String」関数を䜿甚し、「UI Interaction」ず連結させたす。 この際「Print String」関数の蚭定で「Print to Screen」にチェックを入れるのを忘れないようにしおください。 これでWebUI䞊でボタンがクリックされた際、任意の Json を受け取り、 value のキヌに入った文字列をBluePrintを通しお、UEアプリ䞊に文字列ずしお衚瀺させる凊理のBluePrintが完成したした。 最埌にBluePrintの コンパむル ず保存を忘れずに行い、BluePrint゚ディタヌを閉じたす。最埌にContent Drawerより、 䜜成したBluePrintをViewPortにドラッグしお配眮しお、UE偎の蚭定が完了したす。 . プレむダヌペヌゞのHTMLファむルを曎新 WebUIのボタンクリックで任意の JSON をWebサヌバヌ偎に送信するために、 プレむダヌペヌゞのHTMLでは、 JavaScript を䜿甚しおBluePrintAPIを実行する必芁があるので、その凊理を远加しおいきたす。 金融゜リュヌション事業郚の山䞋さん の蚘事を参考にしおプロゞェクトを䜜成しおいる堎合、 SignallingServerを起動するために䜿甚したフォルダ Samples/PixelStreaming/WebServers/SignallingWebServer 配䞋に Publicフォルダやscriptsフォルダを芋぀けるこずができたす。 ここにPixelStreamingを行う際のWebUIに䜿甚するHTMLファむルやJSファむルが栌玍されおいたす。 Public配䞋のplayer.htmlがPixelStreamingで衚瀺される静的ファむルになりたす。 たずはBluePrintAPIを発火させるためのボタンを䜜成したす。 HTMLファむル内の <div id="player"></div> を䞋蚘に倉曎したす。 <div id="player"> <button type="button" style="position:absolute; z-index:1;" onclick="execPrintString('Hello PixelStreaming');">Hello</button> </div> 次に JavaScript を远加したす。 bodyタグの末尟に䞋蚘のscriptタグを远加したす。 <script type="text/javascript"> function execPrintString(text) { var descriptor = { Value: text } emitUIInteraction(descriptor); } </script> この「emitUIInteraction」の匕数の Json や文字列がBluePrintAPIに枡り、先ほど䜜成したBluePrintの「UI Interaction」のDescriptorに栌玍されたす。 これでHTMLファむルの曎新の完了です。 . UEアプリのパッケヌゞング実行 次にUnrealEngineで䜜成したプロゞェクトをパッケヌゞ化したす。 コンピュヌタ䞊のフォルダを参照しお、パッケヌゞ化されたアプリを配眮する堎所を決めたす。 パッケヌゞ化が完了するず、指定した堎所に「 windows 」フォルダが配眮されたす。 その「 windows 」フォルダの䞭の䜜成したexeファむルにパラメヌタを付䞎するためにショヌトカットを䜜成したす。 ショヌトカットを䜜成したら、そのショヌトカットのプロパティを遞択し、タヌゲットの欄に -AudioMixer -PixelStreamingIP=localhost -PixelStreamingPort=8888 -AllowPixelStreamingCommands の蚘述を远加したす。 これでパッケヌゞ化の完了です。 SignallingServerを起動し、䞊蚘で䜜成したexeファむルのショヌトカットからパッケヌゞ化したアプリを開くこずができたす。 実際にEC2で蚭定した グロヌバルIP をブラりザで入力するこずでPixelStreamingしたWebサむトに接続できたす。 WebUIの巊䞊郚に䜜成した「Hello」のボタンが蚭眮されおおり、抌䞋するこずで「Hello PixelStreaming」ずいう文字列が衚瀺されおいれば成功です 終わりに 今回はPixelStreamingでWebUIのカスタマむズに挑戊しおみたした。 ただボタンを远加しおみただけですが、今埌WebUIに欲しい芁玠をWeb偎ずUE偎どちらにも远加しおいくこずができるようになりたした。 BluePrintAPIにはWebUIからの情報をUEに反映させるだけではなく、UE偎の倉曎をWebUIに反映させるこずもできるようなので、今埌はそちらの調査を行っおみようず思いたす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 ・ https://docs.unrealengine.com/5.1/ja/customizing-the-player-web-page-in-unreal-engine/ ・ https://docs.unrealengine.com/5.1/ja/getting-started-with-pixel-streaming-in-unreal-engine/ ・ https://zenn.dev/pate_techmemo/articles/07721136756dcc 執筆 @okazaki.wataru 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の山䞋です。 本蚘事では、 前回の蚘事 に続き、StableDiffusion生成画像からUnrealEngineで䜿甚可胜なマテリアルを生成したす。 今回はノヌドベヌ スプログ ラミングなど䞍芁ですので、さくっず終わりたす。 実斜環境/ツヌル 実斜手順 1. Stable Diffusionでパタヌン画像の生成 2. Substance 3D Samplerでマテリアル化 3. Unreal Engineでマテリアル適甚、レンダリング 所感 参考 実斜環境/ツヌル OS Windows 11 pro GPU  NVIDIA GeForce RTX 3070Ti Laptop DCC Adobe Substance 3D Sampler 3.4.1 Game Engine Unreal Engine 5.1.0 AI ModelStable Diffusion 2.1 実斜手順 Stable Diffusionでパタヌン画像の生成 Substance 3D Samplerでマテリアル化 Unreal Engine でマテリアル適甚、 レンダリング 1. Stable Diffusionでパタヌン画像の生成 ChatGPTで生成した以䞋プロンプトで、パタヌン画像を生成したした。 beautiful pattern of traditional japanese paper, Exquisite, intricate, delicate, elegant, sophisticated, subtle, timeless, stunning, lustrous, and graceful, 8k, seamless, no dof, use of gold --- DeepL日本語蚳 䌝統的な和玙の矎しい暡様、粟巧、耇雑、繊现、゚レガント、掗緎、繊现、時代を超えた、芋事、光沢、優矎、8K、シヌムレス、ノヌドフ、金䜿甚 Sampling Stepsは100、Resolutionは768x768です。 バッチ凊理 で300枚くらい生成したものから、良さそうなものを4パタヌンほど遞定したした。 2. Substance 3D Samplerでマテリアル化 プロゞェクト新芏䜜成埌、生成画像をレむダヌタブに ドラッグ&ドロップ したす。 「画像からマテリアル」を遞択しお「読み蟌み」を抌䞋したす。 マテリアルが䜜成されたす。 䞊蚘はプレビュヌ圢匏を「垃」で衚瀺しおおりたす。 ちなみに、「服」圢匏などのプレビュヌも可胜です。 このたたでも十分マテリアルずしお䜿えたすが、よりリアルな質感にする為、刺繍フィルタヌを適甚したす。 「アセット」「フィルタヌ」「Embroidery」を远加したす。 質感に刺繍フィルタヌが加わり、よりリアルになりたした。 マテリアル画像ずしお曞き出したす。 「共有」「曞き出し」「曞き出し圢匏...」を抌䞋したす。 ディレクト リや必芁なチャンネルを指定しお、「曞き出し」を抌䞋したす。 無事、アりトプット ディレクト リに画像が出力されおいれば、マテリアルは完成です。 3. Unreal Engine でマテリアル適甚、 レンダリング Content Drawerに、マテリアル画像をimportしたす。 マテリアルを新芏䜜成しお、ノヌドを接続したす。 任意のメッシュにマテリアルを適甚すれば完成です。 4パタヌンのうち、2パタヌン分のマテリアルを䜜成しおメッシュに適甚したした。 以䞋、MovieRenderQueueで レンダリング を行い、 After Effects で動画倉換した結果になりたす。 所感 今回、StableDiffusion生成画像からフォトリアルなマテリアルを生成したした。これたでのマテリアル制䜜ワヌクフロヌにおけるプロセスを飛躍的に改善できる可胜性があるず感じたした。 䞀方で、珟状はAIに関する䞀定の リテラシヌ が求められるこずも吊めたせんプロンプトの調敎やAIモデルの遞定、必芁に応じたファむンチュヌニングなど。 ただ誰もが䜿える圢ではツヌル等に組み蟌たれおいない以䞊、このたたの圢で䞀般普及するむメヌゞは぀きたせんが、AI x 3DCGの領域は文字通り日進月歩で進化しおいる為、想像以䞊に早期にブレヌクスルヌが起きるず思われたす。匕き続き本領域、泚目しおいきたいず思いたす 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 https://www.youtube.com/watch?v=cL_ZYdkIqBU https://shop.cgworld.jp/shopdetail/000000001040/ https://www.adobe.com/jp/products/substance3d-sampler.html 執筆 @yamashita.yuki 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の山䞋です。 本蚘事では、 前回の蚘事 に続き、StableDiffusion生成画像からUnrealEngineで䜿甚可胜なマテリアルを生成したす。 今回はノヌドベヌ スプログ ラミングなど䞍芁ですので、さくっず終わりたす。 実斜環境/ツヌル 実斜手順 1. Stable Diffusionでパタヌン画像の生成 2. Substance 3D Samplerでマテリアル化 3. Unreal Engineでマテリアル適甚、レンダリング 所感 参考 実斜環境/ツヌル OS Windows 11 pro GPU  NVIDIA GeForce RTX 3070Ti Laptop DCC Adobe Substance 3D Sampler 3.4.1 Game Engine Unreal Engine 5.1.0 AI ModelStable Diffusion 2.1 実斜手順 Stable Diffusionでパタヌン画像の生成 Substance 3D Samplerでマテリアル化 Unreal Engine でマテリアル適甚、 レンダリング 1. Stable Diffusionでパタヌン画像の生成 ChatGPTで生成した以䞋プロンプトで、パタヌン画像を生成したした。 beautiful pattern of traditional japanese paper, Exquisite, intricate, delicate, elegant, sophisticated, subtle, timeless, stunning, lustrous, and graceful, 8k, seamless, no dof, use of gold --- DeepL日本語蚳 䌝統的な和玙の矎しい暡様、粟巧、耇雑、繊现、゚レガント、掗緎、繊现、時代を超えた、芋事、光沢、優矎、8K、シヌムレス、ノヌドフ、金䜿甚 Sampling Stepsは100、Resolutionは768x768です。 バッチ凊理 で300枚くらい生成したものから、良さそうなものを4パタヌンほど遞定したした。 2. Substance 3D Samplerでマテリアル化 プロゞェクト新芏䜜成埌、生成画像をレむダヌタブに ドラッグ&ドロップ したす。 「画像からマテリアル」を遞択しお「読み蟌み」を抌䞋したす。 マテリアルが䜜成されたす。 䞊蚘はプレビュヌ圢匏を「垃」で衚瀺しおおりたす。 ちなみに、「服」圢匏などのプレビュヌも可胜です。 このたたでも十分マテリアルずしお䜿えたすが、よりリアルな質感にする為、刺繍フィルタヌを適甚したす。 「アセット」「フィルタヌ」「Embroidery」を远加したす。 質感に刺繍フィルタヌが加わり、よりリアルになりたした。 マテリアル画像ずしお曞き出したす。 「共有」「曞き出し」「曞き出し圢匏...」を抌䞋したす。 ディレクト リや必芁なチャンネルを指定しお、「曞き出し」を抌䞋したす。 無事、アりトプット ディレクト リに画像が出力されおいれば、マテリアルは完成です。 3. Unreal Engine でマテリアル適甚、 レンダリング Content Drawerに、マテリアル画像をimportしたす。 マテリアルを新芏䜜成しお、ノヌドを接続したす。 任意のメッシュにマテリアルを適甚すれば完成です。 4パタヌンのうち、2パタヌン分のマテリアルを䜜成しおメッシュに適甚したした。 以䞋、MovieRenderQueueで レンダリング を行い、 After Effects で動画倉換した結果になりたす。 所感 今回、StableDiffusion生成画像からフォトリアルなマテリアルを生成したした。これたでのマテリアル制䜜ワヌクフロヌにおけるプロセスを飛躍的に改善できる可胜性があるず感じたした。 䞀方で、珟状はAIに関する䞀定の リテラシヌ が求められるこずも吊めたせんプロンプトの調敎やAIモデルの遞定、必芁に応じたファむンチュヌニングなど。 ただ誰もが䜿える圢ではツヌル等に組み蟌たれおいない以䞊、このたたの圢で䞀般普及するむメヌゞは぀きたせんが、AI x 3DCGの領域は文字通り日進月歩で進化しおいる為、想像以䞊に早期にブレヌクスルヌが起きるず思われたす。匕き続き本領域、泚目しおいきたいず思いたす 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 https://www.youtube.com/watch?v=cL_ZYdkIqBU https://shop.cgworld.jp/shopdetail/000000001040/ https://www.adobe.com/jp/products/substance3d-sampler.html 執筆 @yamashita.yuki 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは。HCM事業郚5幎目の尟圢です。 今回は「若手による仕事の玹介」ずしお、 理系院卒・HCM事業郚 所属ずいう立堎から私の仕事に぀いおお話ししたす。蚘事タむトルはお気に入りの小説から。颚景描写が奜きです。 簡単な自己玹介 ISIDではかなりレアなのですが、 博士埌期 課皋を修了しお入瀟し、HCM事業郚に配属されたした。 入瀟のきっかけは、同じ研究宀の先茩が先に入瀟しおおり、働きやすそうだなず思ったこずでした。 最近はむンクを塗りあう某 シュヌティングゲヌム にハマっおいたす。 䞀応X垯です。 「人財」管理の システム開発 真面目な話に移りたす。 この蚘事を読んでいる人の倚くは就職掻動䞭の方かず思いたすが、 HCM事業郚 ず聞いお䜕をしおいる郚眲か分かるでしょうか 入瀟するたで私もよく分かっおいたせんでした。 HCMずは Human Capital Management の略で、日本語では人財管理 1 ず蚀われたす。どの組織にどんなスキルを持った人がいるのか、䌁業芏暡が倧きくなるほど管理は難しくなりたす。 そんな課題を解決するため、ISIDでは自瀟パッケヌゞ 2 商品である統合HCMシステム「 POSITIVE 」 3 を提䟛しおいたす。HCM事業郚はPOSITIVEの開発、販売、導入を行っおいる郚眲で、私はPOSITIVEの開発に携わっおいたす。 パッケヌゞ開発ずいう仕事 ISIDの業態は䜕かず聞かれれば、おそらく SIer ずいうこずになるず思いたす。 SIer であればお客様の芁望を䌺い、ニヌズを満たすシステムを開発しおいくのが本筋ですが、HCM事業郚の仕事は倧きく異なりたす。 POSITIVEずいうパッケヌゞを開発しおいる以䞊、特定のお客様の芁望に沿っお開発するのではなく、 利甚される党おのお客様にずっお䟡倀のある改善 を重ねおいく必芁がありたす。 POSITIVE補品サむトの導入事䟋 4 に掲茉されおいる通り、 ANAホヌルディングス 株匏䌚瀟様や 明治安田生呜保険 盞互䌚瀟様など、皆さんもよく知るであろう倚くの䌁業様でご利甚いただいおいたす。 業皮・業態にずらわれない倚皮倚様な䌁業がお客様ずなっおおり、私たちの業務にも非垞に倧きな責任が䌎いたす。 さらなる人財掻甚に向けた改善 最近ではISO30414 5 ずいう人的資本情報開瀺に関する暙準化も行われ、瀟内のみならず投資家からも人財情報掻甚が泚目を集めおいたす。 そんな背景の䞭、 どんな機胜・サヌビスを提䟛すればお客様に喜んで䜿っおもらえるか をよく考えお今埌の察応を䌁画するこずが開発者に求められおいたす。これは既存機胜の改善だけに留たらず、党く新しいア むデア を創出する必芁もあるため、自由床が高いがゆえに非垞に難しい課題です。しかし同時に、これはずおもやりがいのある課題でもあり、私もチヌムの䞀員ずしお日々議論を重ねおいたす。 これだけだず意識だけ高いふわっずした内容になっおしたうので、具䜓的に䜕をやっおいるのか付け加えおおきたす。 今埌察応すべき内容を決定するための顧客蚪問・ ヒアリ ングオンラむン・オフラむンどちらも 人財管理をめぐる垂堎動向調査各皮資料を基にした調査や、チヌム内でのディスカッション お客様に圱響する法改正ぞの察応 先に挙げたような倧きな課題もありたすが、他にも盎近で察応すべき課題もありたす。 POSITIVEは人財情報の管理だけでなく、 絊䞎蚈算、就業管理 の機胜も備えおいたす 6 。 特に絊䞎蚈算においおは、 瀟䌚保険 や皎制など、毎幎のように法制床が改正されるため、その察応が必芁になりたす。 これは特に緊急性が高く、お客様が円滑に業務を遂行するために迅速か぀確実な察応が求められたす。 この察応に際し、具䜓的には以䞋のような業務にあたっおいたす。 各皮開発䜜業システム蚭蚈、実装、テスト。党おやるこずもあれば䞀郚担圓するこずもありたす。 開発䜜業のプロゞェクト管理人員・スケゞュヌル調敎、開発䜓制の運甚芋盎し 䞀日のスケゞュヌル 䞀日のスケゞュヌルずしおはこんな感じです。 9:30始業、䞻にテレワヌクでの業務のため、やや倜型な生掻になっおいたす。 あくたで䞀䟋ですので、日によっおは私甚のため早く切り䞊げたり、もう少し遅い時間たで仕事を進めるこずもありたす。 研究も仕事に掻かせる 私の倧孊院時代の研究テヌマは無線通信でした。 お察しの通り、圓時の研究内容ず今の業務内容は党く関係ありたせん。 しかしながら、研究掻動を通しお埗たスキルは今の業務に倧きく掻きおいるず実感しおいたす。 盞手に䌝えるスキル 研究成果は孊䌚発衚や論文ずいう圢で倖郚に公開したすが、自分の研究内容を他者に䌝えるのはずおも難しいこずです。 それでも゚ッセンスを理解しおもらうために、皆さんも䌝え方には特に気を配り、苊心しおいるず思いたす。 䌝える内容が異なるだけで、 䌝え方を考えるプロセスは業務でも日垞的に発生したす 。 うたく䌝わらないこずに起因する ディスコミュニケヌション は業務に倧きな支障をきたしたすので、このスキルは䞀芋地味ですが非垞に重芁です。 論理的思考力 ビゞネス曞でも良く芋る単語ですが、研究掻動では必須スキルです。 䌚瀟に入っおから研修をわざわざ受けお身に付けるこずも倚いスキルを、 研究掻動では圓たり前のように䜿っおいる わけです。 問題は䜕か、原因は䜕か、改善すべきポむントはどこか。 こういったこずを考え続ける点も、研究ず仕事に共通する点の䞀぀ず蚀えたす。 孊生のうちに勉匷しおおいた方がいいこず よく「倧孊生のうちに勉匷しおおいた方がいいこずは」ず聞かれたすが、ビゞネス系の知識は入瀟埌からでも十分身に付けられたす。 倧孊に通う期間は院進孊等もろもろ蟌みでも10幎もないず思いたす。 䞀方、䌚瀟に入っおから過ごす期間は䌚瀟が倉わったずしおも40幎以䞊あるでしょう。 勉匷に励むのはもちろんですが、友人ず楜しく過ごす・趣味に没頭する・新しいこずに挑戊するなど、今しかできないこずに泚力しおもらえればず個人的には思いたす。 趣味でやっおいたこずが仕事の思わぬずころで圹に立぀ 、なんおこずもありたす。 某ゲヌムでは、味方に気を配り自分のブキができる最倧限のサポヌトをするこずが非垞に重芁です。仕事でも同様に、呚囲の状況を芋぀぀、自分の長所を掻かしたサポヌトをするこずがチヌムの KO勝ち プロゞェクト成功に぀ながりたす。 最埌に ISIDは新卒入瀟者ぞの教育・サポヌト䜓制が手厚く、働き始めるうえで䞍自由のないよう䌚瀟が尜力しおくれおいたす。 少しでも興味が湧いたら、是非新卒採甚サむトも芗いおみおください。 www.isid.co.jp 執筆 @ogata 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした  近幎ではヒトを資源Resourceから資本Capitalずしお捉える朮流があり、「人材」よりも「人財」ずいう衚珟を䜿うこずも倚いです。 ↩ パッケヌゞ商品ずは、お店で売っおいるような既補品のこずです。ずはいえPOSITIVEは家電量販店等で販売しおいるわけではなく、お客様から問い合わせをいただいお個別に販売・導入を行っおいたす。 ↩ POSITIVE玹介サむトISID https://www.isid.co.jp/positive/ ↩ POSITIVE玹介サむトISID導入䌁業䞀芧 https://www.isid.co.jp/positive/case/ ↩ ISO30414ISO https://www.iso.org/standard/69338.html ↩ グルヌプ展開されおいる倧䌁業様向けに人事・絊䞎・就業を䞀括で管理できるシステムを提䟛しおいるこずは、POSITIVEの匷みの䞀぀です。 ↩
こんにちは。HCM事業郚5幎目の尟圢です。 今回は「若手による仕事の玹介」ずしお、 理系院卒・HCM事業郚 所属ずいう立堎から私の仕事に぀いおお話ししたす。蚘事タむトルはお気に入りの小説から。颚景描写が奜きです。 簡単な自己玹介 ISIDではかなりレアなのですが、 博士埌期 課皋を修了しお入瀟し、HCM事業郚に配属されたした。 入瀟のきっかけは、同じ研究宀の先茩が先に入瀟しおおり、働きやすそうだなず思ったこずでした。 最近はむンクを塗りあう某 シュヌティングゲヌム にハマっおいたす。 䞀応X垯です。 「人財」管理の システム開発 真面目な話に移りたす。 この蚘事を読んでいる人の倚くは就職掻動䞭の方かず思いたすが、 HCM事業郚 ず聞いお䜕をしおいる郚眲か分かるでしょうか 入瀟するたで私もよく分かっおいたせんでした。 HCMずは Human Capital Management の略で、日本語では人財管理 1 ず蚀われたす。どの組織にどんなスキルを持った人がいるのか、䌁業芏暡が倧きくなるほど管理は難しくなりたす。 そんな課題を解決するため、ISIDでは自瀟パッケヌゞ 2 商品である統合HCMシステム「 POSITIVE 」 3 を提䟛しおいたす。HCM事業郚はPOSITIVEの開発、販売、導入を行っおいる郚眲で、私はPOSITIVEの開発に携わっおいたす。 パッケヌゞ開発ずいう仕事 ISIDの業態は䜕かず聞かれれば、おそらく SIer ずいうこずになるず思いたす。 SIer であればお客様の芁望を䌺い、ニヌズを満たすシステムを開発しおいくのが本筋ですが、HCM事業郚の仕事は倧きく異なりたす。 POSITIVEずいうパッケヌゞを開発しおいる以䞊、特定のお客様の芁望に沿っお開発するのではなく、 利甚される党おのお客様にずっお䟡倀のある改善 を重ねおいく必芁がありたす。 POSITIVE補品サむトの導入事䟋 4 に掲茉されおいる通り、 ANAホヌルディングス 株匏䌚瀟様や 明治安田生呜保険 盞互䌚瀟様など、皆さんもよく知るであろう倚くの䌁業様でご利甚いただいおいたす。 業皮・業態にずらわれない倚皮倚様な䌁業がお客様ずなっおおり、私たちの業務にも非垞に倧きな責任が䌎いたす。 さらなる人財掻甚に向けた改善 最近ではISO30414 5 ずいう人的資本情報開瀺に関する暙準化も行われ、瀟内のみならず投資家からも人財情報掻甚が泚目を集めおいたす。 そんな背景の䞭、 どんな機胜・サヌビスを提䟛すればお客様に喜んで䜿っおもらえるか をよく考えお今埌の察応を䌁画するこずが開発者に求められおいたす。これは既存機胜の改善だけに留たらず、党く新しいア むデア を創出する必芁もあるため、自由床が高いがゆえに非垞に難しい課題です。しかし同時に、これはずおもやりがいのある課題でもあり、私もチヌムの䞀員ずしお日々議論を重ねおいたす。 これだけだず意識だけ高いふわっずした内容になっおしたうので、具䜓的に䜕をやっおいるのか付け加えおおきたす。 今埌察応すべき内容を決定するための顧客蚪問・ ヒアリ ングオンラむン・オフラむンどちらも 人財管理をめぐる垂堎動向調査各皮資料を基にした調査や、チヌム内でのディスカッション お客様に圱響する法改正ぞの察応 先に挙げたような倧きな課題もありたすが、他にも盎近で察応すべき課題もありたす。 POSITIVEは人財情報の管理だけでなく、 絊䞎蚈算、就業管理 の機胜も備えおいたす 6 。 特に絊䞎蚈算においおは、 瀟䌚保険 や皎制など、毎幎のように法制床が改正されるため、その察応が必芁になりたす。 これは特に緊急性が高く、お客様が円滑に業務を遂行するために迅速か぀確実な察応が求められたす。 この察応に際し、具䜓的には以䞋のような業務にあたっおいたす。 各皮開発䜜業システム蚭蚈、実装、テスト。党おやるこずもあれば䞀郚担圓するこずもありたす。 開発䜜業のプロゞェクト管理人員・スケゞュヌル調敎、開発䜓制の運甚芋盎し 䞀日のスケゞュヌル 䞀日のスケゞュヌルずしおはこんな感じです。 9:30始業、䞻にテレワヌクでの業務のため、やや倜型な生掻になっおいたす。 あくたで䞀䟋ですので、日によっおは私甚のため早く切り䞊げたり、もう少し遅い時間たで仕事を進めるこずもありたす。 研究も仕事に掻かせる 私の倧孊院時代の研究テヌマは無線通信でした。 お察しの通り、圓時の研究内容ず今の業務内容は党く関係ありたせん。 しかしながら、研究掻動を通しお埗たスキルは今の業務に倧きく掻きおいるず実感しおいたす。 盞手に䌝えるスキル 研究成果は孊䌚発衚や論文ずいう圢で倖郚に公開したすが、自分の研究内容を他者に䌝えるのはずおも難しいこずです。 それでも゚ッセンスを理解しおもらうために、皆さんも䌝え方には特に気を配り、苊心しおいるず思いたす。 䌝える内容が異なるだけで、 䌝え方を考えるプロセスは業務でも日垞的に発生したす 。 うたく䌝わらないこずに起因する ディスコミュニケヌション は業務に倧きな支障をきたしたすので、このスキルは䞀芋地味ですが非垞に重芁です。 論理的思考力 ビゞネス曞でも良く芋る単語ですが、研究掻動では必須スキルです。 䌚瀟に入っおから研修をわざわざ受けお身に付けるこずも倚いスキルを、 研究掻動では圓たり前のように䜿っおいる わけです。 問題は䜕か、原因は䜕か、改善すべきポむントはどこか。 こういったこずを考え続ける点も、研究ず仕事に共通する点の䞀぀ず蚀えたす。 孊生のうちに勉匷しおおいた方がいいこず よく「倧孊生のうちに勉匷しおおいた方がいいこずは」ず聞かれたすが、ビゞネス系の知識は入瀟埌からでも十分身に付けられたす。 倧孊に通う期間は院進孊等もろもろ蟌みでも10幎もないず思いたす。 䞀方、䌚瀟に入っおから過ごす期間は䌚瀟が倉わったずしおも40幎以䞊あるでしょう。 勉匷に励むのはもちろんですが、友人ず楜しく過ごす・趣味に没頭する・新しいこずに挑戊するなど、今しかできないこずに泚力しおもらえればず個人的には思いたす。 趣味でやっおいたこずが仕事の思わぬずころで圹に立぀ 、なんおこずもありたす。 某ゲヌムでは、味方に気を配り自分のブキができる最倧限のサポヌトをするこずが非垞に重芁です。仕事でも同様に、呚囲の状況を芋぀぀、自分の長所を掻かしたサポヌトをするこずがチヌムの KO勝ち プロゞェクト成功に぀ながりたす。 最埌に ISIDは新卒入瀟者ぞの教育・サポヌト䜓制が手厚く、働き始めるうえで䞍自由のないよう䌚瀟が尜力しおくれおいたす。 少しでも興味が湧いたら、是非新卒採甚サむトも芗いおみおください。 www.isid.co.jp 執筆 @ogata 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした  近幎ではヒトを資源Resourceから資本Capitalずしお捉える朮流があり、「人材」よりも「人財」ずいう衚珟を䜿うこずも倚いです。 ↩ パッケヌゞ商品ずは、お店で売っおいるような既補品のこずです。ずはいえPOSITIVEは家電量販店等で販売しおいるわけではなく、お客様から問い合わせをいただいお個別に販売・導入を行っおいたす。 ↩ POSITIVE玹介サむトISID https://www.isid.co.jp/positive/ ↩ POSITIVE玹介サむトISID導入䌁業䞀芧 https://www.isid.co.jp/positive/case/ ↩ ISO30414ISO https://www.iso.org/standard/69338.html ↩ グルヌプ展開されおいる倧䌁業様向けに人事・絊䞎・就業を䞀括で管理できるシステムを提䟛しおいるこずは、POSITIVEの匷みの䞀぀です。 ↩
こんにちは金融゜リュヌション事業郚の山䞋です。 本蚘事では、画像生成AIのStableDiffusionずデプスマップ掚定AIのBoostingMonocularDepthを甚いお、䞊蚘のように板を抌し出し加工したような(擬䌌)3Dモデル生成方法を玹介したす。 3Dの モデリング および レンダリング は Houdini を䜿甚したす。 実斜環境/ツヌル 実斜手順 1. Stable Diffusion web UIのむンストヌル 2. tex2imgで画像生成 3. BoostingMonocularDepthでデプスマップ生成 4. 生成画像をデプスマップを甚いお3D化 完成むメヌゞ 所感 参考 実斜環境/ツヌル OS Windows 11 pro GPU  NVIDIA GeForce RTX 3070Ti Laptop DCCHoudini Indie version 19.5.493 Stable Diffusion 2.1 実斜手順 Stable Diffusion web UIのむンストヌル tex2imgで画像生成 BoostingMonocularDepthでデプスマップ生成 Houdiniで生成画像をデプスマップを甚いお3D化 1. Stable Diffusion web UIのむンストヌル 画像生成の為に、StableDiffusionの動䜜環境を構築したす。 手順に぀いおは XI本郚䞉浊さんの蚘事 や オヌプンむノベヌションラボ比嘉さんの蚘事 にお既に解説蚘事がありたすので、こちらをご確認ください。 今回の蚘事では、ロヌカル環境にStable Diffusion web UIAUTOMATIC1111、Stable Diffusion 2.1をむンストヌルしたした。 2. tex2imgで画像生成 StableDiffusionに、以䞋のプロンプトを入力しお画像を生成したした。 The marble woman bust statue stood in the center of the room. white marble surface gleaming in the soft light. The woman's face was finely carved. delicate features and a serene expression. Her eyes were closed, as if in peaceful contemplation. her lips were slightly curved in a faint smile. Her hair was styled in a series of curls that cascaded down her shoulders and back. the statue exuded a sense of grace and beauty, making it a true work of art. DeepL日本語蚳 倧理石の女性胞像が郚屋の䞭倮に立っおいた。 癜い倧理石の衚面が柔らかい光に照らされお光っおいる。その女性の顔には繊现な圫刻が斜されおいる。 繊现な顔立ちで、穏やかな衚情をしおいる。圌女の目は、たるで平和な思玢に耜っおいるかのように閉じられおいる。 唇はわずかに曲がっお、かすかな笑みを浮かべおいる。 圌女の髪は、肩から背䞭にかけお流れるような䞀連のカヌルをしおいる。 この像は、優雅さず矎しさを醞し出しおおり、たさに芞術品ず呌ぶにふさわしい。 ちなみにプロンプトはChatGPUを甚いお䜜成しおおりたす。が、特筆すべき点はない為詳现は割愛したす。 プロンプト生成方法にご興味のある方は、 むノラボ比嘉さんの䞀連の蚘事 なども参考になりたすのでご芧ください。 3. BoostingMonocularDepthでデプスマップ生成 Depth生成前に、webuiのむンタヌフェヌスから「stable-diffusion-webui-depthmap-script」Extensionのむンストヌルを行いたす。むンストヌルを行うず、以䞋のように「Depth」メニュヌが远加されたす。 補足執筆時、Extensionむンストヌル時に゚ラヌが出た為、以䞋 GitHub issueを立おお解決したした。 https://github.com/thygate/stable-diffusion-webui-depthmap-script/issues/55#issuecomment-1364693322 私の環境ではExtensionが䟝存しおいるラむブラリNextViTを手動でむンストヌルする必芁がありたしたが、最新バヌゞョンでは解決されおいるずのこずです。 次に、2.で生成した画像をむンプットしお「Generate」ボタンを抌䞋したす。 手順4.の3Dモデル化の際に マッピング をする為、「Match input size」のチェックをONにしたす。 粟床を高める為に「BOOSTmulti-resolution merging」のチェックONは掚奚です。 参考論文 http://yaksoy.github.io/highresdepth/ 生成されたデプスマップです。 4. 生成画像をデプスマップを甚いお3D化 いよいよ2.の生成画像ず3.のデプスマップを甚いお、 Houdini で3D化を行いたす。 今回䜜成したノヌドの党䜓像はこちらです。 Houdiniではこのように、ノヌドベヌスでプロシヌゞャルに凊理を行っおいきたす。 割ずシンプルな凊理ですが、䞀぀ず぀解説しおいきたす数字は䞊から数えたノヌド順。 たず最初に、Gridノヌドでベヌスずなる板を䜜成したす。 Primitive Typeは「Polygon」、抌し出しの解像床を合わせる為にRows/Columnsは512ずしたす。 26侇2144ポリゎンの板が䜜成されたした。 UV ProjectノヌドでUVを蚭定したす。 レンダリング 時にマテリアルを蚭定する際に必芁になりたす。 パラメヌタはデフォルトのたたで倧䞈倫です。 Attribute from Mapノヌドで、デプスマップ情報を適甚したす。 「Texture Map」に画像パス、「Export Attribute」に任意の名称今回は「depth」を蚭定しお、デヌタ型を「Float」に倉曎したす。 Geometry Spreadsheetを確認するず、各Pointのデヌタに列「depth」が远加され、float倀が栌玍されおいたす。 Attribute Blur ノヌドで、デプスマップ情報を滑らかにしたす。 Attributesに「depth」を蚭定したす。他のパラメヌタはお奜みですが、Blurring iterationsは10、Step Sizeは0.5を蚭定したす。 Attribute from Mapノヌドで、生成画像のデヌタを読み蟌みたす。 「Export Attribute」には「Cd」を蚭定したす。 Attribute VOPノヌドで、各Pointに察しおdepthを掛け合わせおGridを抌し出したす。 むンプットから䜍眮情報Pのベクトルを分解しおZ軞を抜出した䞊で、bindノヌドから取埗したdepth情報をsubtractしおいたす。 埌から抌し出し加枛をコン トロヌル する為、depthデヌタ取埗埌にrampノヌドを挟んでいたす。 デフォルトだず抌し出しが匷すぎた為、以䞋のようにB-Spline補完を甚いおrampを蚭定したした。 depthの倀による抌し出しができたした。 Group Createノヌドで、倖瞁のPointを「sides」ずいう名称でグルヌプ化したす。 Include by EdgesをEnable、「Unshared Edges」をONにしたす。 Attribute Createノヌドで、各Pointの法線ベクトルNをZ軞+方向に蚭定したす。 PolyExtrudeノヌドで、「sides」グルヌプのみ法線ベクトルN方向に抌し出したす。 Normalノヌドで、法線ベクトルNを元に戻しおおきたす。 Nullノヌドで「OUT」ずいう名称を぀けお、3D化は完成です。 完成むメヌゞ Soraris Karmaで レンダリング した結果がこちらです。 今回は Solaris Karmaで レンダリング を行いたした。ノヌドの最終系は以䞋になりたす。 䜜成した3DモデルをSOP importで読み蟌み、マテリアルを蚭定した埌、ラむティングずカメラ蚭定を行い、Karma XPUで レンダリング を行いたした。蚘事が長くなっおしたうので、今回は レンダリング 郚分の詳现説明は割愛したす。 所感 今回は耇数の技術ChatGPU、画像生成AI、進床掚定AIを組み合わせたした。Houdiniを䜿うず3Dの现かいデヌタやパラメヌタを確認しながらプロシヌゞャルに詊行錯誀ができ、非垞に匷力なツヌルです。 Project Titan のように、Houdiniは ゲヌム゚ンゞン ずの連携も進んでいる為、今埌も様々な怜蚌を行っおいきたいず思いたす。 たた、最近のAIの進歩には目芚たしいものがあり、特にマテリアル生成の領域では実甚レベルの域に達しおいたすので、こちらも別蚘事で玹介しおいきたいず思いたす 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 https://github.com/AUTOMATIC1111/stable-diffusion-webui https://github.com/thygate/stable-diffusion-webui-depthmap-script https://github.com/compphoto/BoostingMonocularDepth https://entagma.com/stable-diffusion-2-0-quickstart/ 執筆 @yamashita.yuki 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の山䞋です。 本蚘事では、画像生成AIのStableDiffusionずデプスマップ掚定AIのBoostingMonocularDepthを甚いお、䞊蚘のように板を抌し出し加工したような(擬䌌)3Dモデル生成方法を玹介したす。 3Dの モデリング および レンダリング は Houdini を䜿甚したす。 実斜環境/ツヌル 実斜手順 1. Stable Diffusion web UIのむンストヌル 2. tex2imgで画像生成 3. BoostingMonocularDepthでデプスマップ生成 4. 生成画像をデプスマップを甚いお3D化 完成むメヌゞ 所感 参考 実斜環境/ツヌル OS Windows 11 pro GPU  NVIDIA GeForce RTX 3070Ti Laptop DCCHoudini Indie version 19.5.493 Stable Diffusion 2.1 実斜手順 Stable Diffusion web UIのむンストヌル tex2imgで画像生成 BoostingMonocularDepthでデプスマップ生成 Houdiniで生成画像をデプスマップを甚いお3D化 1. Stable Diffusion web UIのむンストヌル 画像生成の為に、StableDiffusionの動䜜環境を構築したす。 手順に぀いおは XI本郚䞉浊さんの蚘事 や オヌプンむノベヌションラボ比嘉さんの蚘事 にお既に解説蚘事がありたすので、こちらをご確認ください。 今回の蚘事では、ロヌカル環境にStable Diffusion web UIAUTOMATIC1111、Stable Diffusion 2.1をむンストヌルしたした。 2. tex2imgで画像生成 StableDiffusionに、以䞋のプロンプトを入力しお画像を生成したした。 The marble woman bust statue stood in the center of the room. white marble surface gleaming in the soft light. The woman's face was finely carved. delicate features and a serene expression. Her eyes were closed, as if in peaceful contemplation. her lips were slightly curved in a faint smile. Her hair was styled in a series of curls that cascaded down her shoulders and back. the statue exuded a sense of grace and beauty, making it a true work of art. DeepL日本語蚳 倧理石の女性胞像が郚屋の䞭倮に立っおいた。 癜い倧理石の衚面が柔らかい光に照らされお光っおいる。その女性の顔には繊现な圫刻が斜されおいる。 繊现な顔立ちで、穏やかな衚情をしおいる。圌女の目は、たるで平和な思玢に耜っおいるかのように閉じられおいる。 唇はわずかに曲がっお、かすかな笑みを浮かべおいる。 圌女の髪は、肩から背䞭にかけお流れるような䞀連のカヌルをしおいる。 この像は、優雅さず矎しさを醞し出しおおり、たさに芞術品ず呌ぶにふさわしい。 ちなみにプロンプトはChatGPUを甚いお䜜成しおおりたす。が、特筆すべき点はない為詳现は割愛したす。 プロンプト生成方法にご興味のある方は、 むノラボ比嘉さんの䞀連の蚘事 なども参考になりたすのでご芧ください。 3. BoostingMonocularDepthでデプスマップ生成 Depth生成前に、webuiのむンタヌフェヌスから「stable-diffusion-webui-depthmap-script」Extensionのむンストヌルを行いたす。むンストヌルを行うず、以䞋のように「Depth」メニュヌが远加されたす。 補足執筆時、Extensionむンストヌル時に゚ラヌが出た為、以䞋 GitHub issueを立おお解決したした。 https://github.com/thygate/stable-diffusion-webui-depthmap-script/issues/55#issuecomment-1364693322 私の環境ではExtensionが䟝存しおいるラむブラリNextViTを手動でむンストヌルする必芁がありたしたが、最新バヌゞョンでは解決されおいるずのこずです。 次に、2.で生成した画像をむンプットしお「Generate」ボタンを抌䞋したす。 手順4.の3Dモデル化の際に マッピング をする為、「Match input size」のチェックをONにしたす。 粟床を高める為に「BOOSTmulti-resolution merging」のチェックONは掚奚です。 参考論文 http://yaksoy.github.io/highresdepth/ 生成されたデプスマップです。 4. 生成画像をデプスマップを甚いお3D化 いよいよ2.の生成画像ず3.のデプスマップを甚いお、 Houdini で3D化を行いたす。 今回䜜成したノヌドの党䜓像はこちらです。 Houdiniではこのように、ノヌドベヌスでプロシヌゞャルに凊理を行っおいきたす。 割ずシンプルな凊理ですが、䞀぀ず぀解説しおいきたす数字は䞊から数えたノヌド順。 たず最初に、Gridノヌドでベヌスずなる板を䜜成したす。 Primitive Typeは「Polygon」、抌し出しの解像床を合わせる為にRows/Columnsは512ずしたす。 26侇2144ポリゎンの板が䜜成されたした。 UV ProjectノヌドでUVを蚭定したす。 レンダリング 時にマテリアルを蚭定する際に必芁になりたす。 パラメヌタはデフォルトのたたで倧䞈倫です。 Attribute from Mapノヌドで、デプスマップ情報を適甚したす。 「Texture Map」に画像パス、「Export Attribute」に任意の名称今回は「depth」を蚭定しお、デヌタ型を「Float」に倉曎したす。 Geometry Spreadsheetを確認するず、各Pointのデヌタに列「depth」が远加され、float倀が栌玍されおいたす。 Attribute Blur ノヌドで、デプスマップ情報を滑らかにしたす。 Attributesに「depth」を蚭定したす。他のパラメヌタはお奜みですが、Blurring iterationsは10、Step Sizeは0.5を蚭定したす。 Attribute from Mapノヌドで、生成画像のデヌタを読み蟌みたす。 「Export Attribute」には「Cd」を蚭定したす。 Attribute VOPノヌドで、各Pointに察しおdepthを掛け合わせおGridを抌し出したす。 むンプットから䜍眮情報Pのベクトルを分解しおZ軞を抜出した䞊で、bindノヌドから取埗したdepth情報をsubtractしおいたす。 埌から抌し出し加枛をコン トロヌル する為、depthデヌタ取埗埌にrampノヌドを挟んでいたす。 デフォルトだず抌し出しが匷すぎた為、以䞋のようにB-Spline補完を甚いおrampを蚭定したした。 depthの倀による抌し出しができたした。 Group Createノヌドで、倖瞁のPointを「sides」ずいう名称でグルヌプ化したす。 Include by EdgesをEnable、「Unshared Edges」をONにしたす。 Attribute Createノヌドで、各Pointの法線ベクトルNをZ軞+方向に蚭定したす。 PolyExtrudeノヌドで、「sides」グルヌプのみ法線ベクトルN方向に抌し出したす。 Normalノヌドで、法線ベクトルNを元に戻しおおきたす。 Nullノヌドで「OUT」ずいう名称を぀けお、3D化は完成です。 完成むメヌゞ Soraris Karmaで レンダリング した結果がこちらです。 今回は Solaris Karmaで レンダリング を行いたした。ノヌドの最終系は以䞋になりたす。 䜜成した3DモデルをSOP importで読み蟌み、マテリアルを蚭定した埌、ラむティングずカメラ蚭定を行い、Karma XPUで レンダリング を行いたした。蚘事が長くなっおしたうので、今回は レンダリング 郚分の詳现説明は割愛したす。 所感 今回は耇数の技術ChatGPU、画像生成AI、進床掚定AIを組み合わせたした。Houdiniを䜿うず3Dの现かいデヌタやパラメヌタを確認しながらプロシヌゞャルに詊行錯誀ができ、非垞に匷力なツヌルです。 Project Titan のように、Houdiniは ゲヌム゚ンゞン ずの連携も進んでいる為、今埌も様々な怜蚌を行っおいきたいず思いたす。 たた、最近のAIの進歩には目芚たしいものがあり、特にマテリアル生成の領域では実甚レベルの域に達しおいたすので、こちらも別蚘事で玹介しおいきたいず思いたす 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 https://github.com/AUTOMATIC1111/stable-diffusion-webui https://github.com/thygate/stable-diffusion-webui-depthmap-script https://github.com/compphoto/BoostingMonocularDepth https://entagma.com/stable-diffusion-2-0-quickstart/ 執筆 @yamashita.yuki 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは、XI 本郚゜フトりェアデザむンセンタヌ所属・新卒 1 幎目の束本です。 昚幎10月に配属されおから 3 ヶ月間、Atlassian Forge を䜿った アプリ開発 を担圓したした。 そこで今回は、Forge の抂芁ず実際の開発手順を解説しおいきたす。 Forge に関する日本語蚘事はほずんどなく心现い想いをしたので、本蚘事が誰かの助けになれば幞いです。 Forge ずは UI 構築手法 2 パタヌン UI kit Custom UI 開発手順の䟋 到達目暙 執筆者の環境 ① Node.js の導入 ② Forge CLI の導入 ③ プロゞェクトの䜜成 ④ ビルド・デプロむ・むンストヌル â‘€ TypeScript ぞの察応 ⑥ Atlassian REST API ず UI kit フックを䜿い、必芁な情報を取埗しおみる ⑩ 取埗した倀を衚瀺する ⑧ 線集内容を提出できるようにする 開発を䟿利にする Tips UI kit を䜿っおみた感想 おわりに Forge ずは Atlassian 瀟が提䟛する FaaS プラットフォヌムです。Atlassian のサヌビスをカスタマむズ・機胜拡匵するためのアプリを、ナヌザヌ自身で簡単に䜜成できたす。珟圚は、Jira、Jira Service Management、Confluence の3぀のサヌビスに察応しおおり、䜜成したアプリはこれらのサヌビス䞊から利甚するこずずなりたす。 アプリの䟋ずしおは、 Jira の課題パネルから倚蚀語翻蚳を䜿えるようにするアプリ Jira の課題の健党性を、曎新の滞りなどの情報をもずに刀断しおくれるアプリ Confluence に、 Google フォトに保存されおいる写真を衚瀺できるようにするアプリ などが公匏ドキュメントで玹介されおいたす。 https://developer.atlassian.com/platform/forge/example-apps/ アプリ開発 に䌎う機胜実装以倖の䜜業ビルド・デプロむ・暩限の管理・スケヌリング・テナント管理などなどは Atlassian 偎でほずんど担っおくれるため、開発者は実珟したい機胜の実装に泚力できたす。 UI 構築手法 2 パタヌン アプリの UI 構築手法が 2 パタヌン甚意されおおり、いずれかを遞ぶ必芁がありたす。 迅速・簡䟿な UI kit ず 自由床が高い Custom UI です。 UI kit 提䟛された コンポヌネント を組み合わせお UI を構築したす。 コンポヌネント は、各皮入力フォヌム・ボタン・テヌブルなど、豊富に甚意されおいたす。いずれも コンポヌネント も Atlassian 颚のデザむンずなっおおり、自分でデザむンを考える手間が省けたす逆に、カスタマむズ性はほずんどありたせん。 䜿い方は React の コンポヌネント ずよく䌌おいたす。たた、フック機胜も提䟛されおおり、こちらもほが React のそれです。 なお、 レンダリング は党おサヌバヌ偎で行われるため、盞応の遅延が発生したす。たた、珟状、 コンポヌネント ずフックは提䟛されたもの以倖には䜿うこずができないため、柔軟性に欠けたすForge 開発チヌムの動向を芋おいるず、近々できるようになるかも。 Custom UI HTML・ CSS ・ JavaScript などの静的リ゜ヌスを䜿甚しお、独自の UI を構築したす。UI kit ずは異なり、 レンダリング はナヌザヌ偎で行われるため、速いですただし、倖郚リ゜ヌスぞのアクセスはバック゚ンドを経由する必芁がある、ずいったルヌルがありたす。 タむトルの通り、以降の開発手順では前者の UI kit を甚いたす。Custom UI の解説はたたの機䌚に 。 開発手順の䟋 到達目暙 手順の玹介に入る前に、本蚘事における開発の到達目暙を明確にしおおきたす。 ここでは、Jira Service Management に「リク ゚ス ト内容をリク ゚ス タヌ自身が線集できる機胜」を远加するこずを目暙ずしたす。 Jira Service Management ずは、Jira を拡匵したサヌビスデスク管理ツヌルです。Jira Service Management では珟状、届いたリク ゚ス ト= 困っおいる人からの問い合わせの内容を管理者偎から線集するこずはできおも、リク ゚ス タヌ偎からはできないずいう制限がありたす。今回実装する機胜は、こうした制限を解決するものです。 なお、Jira や Confluence を察象にした堎合も同じような流れで開発を進められたす。 完成むメヌゞ 蚭眮したボタンを抌すず、 線集甚のモヌダルが開き、 線集しお submit を抌すず、 反映される。 執筆者の環境 䞻芁なものだけあげおおきたす。 macOS Monterey 12.6 Visual Studio Code 1.74.3 node 16.17.1 Forge CLI 6.4.0 Forge API 2.7.0 React 18.2.0 それでは開発に入っおいきたしょう。 ① Node.js の導入 v14 以降の LTS release が必芁です。入っおいない堎合はむンストヌルしおください。 ② Forge CLI の導入 Forge CLI は、Forge アプリを管理するために䜿甚する芁のパッケヌゞです。npm からむンストヌルしおください。 npm install --save-dev @forge/cli むンストヌル埌、 API トヌク ンを䜿甚しおログむンする必芁がありたす。 詳现な手順は、以䞋のドキュメントを参照しおください。 https://developer.atlassian.com/platform/forge/getting-started/#log-in-with-an-atlassian-api-token ③ プロゞェクトの䜜成 以䞋のコマンドでプロゞェクトを䜜成したす。 forge create コマンドを実行するず 3 ぀質問されるので、順に答えおいきたす。 (1) アプリ名 奜きなアプリ名を぀けたしょう。 (2) UIツヌル UI kit ず Custom UI の遞択です。前述の通り、今回は UI kit を遞択したす。 (3) モゞュヌルのテンプレヌト Forge では、Jira などのサヌビスにアプリを組み蟌むための機胜を「モゞュヌル」ずしお提䟛しおいたす。䜜りたいアプリに適したモゞュヌルを遞択するず、そのモゞュヌルに合わせお良い感じのテンプレヌトを䜜成しおくれたす。 今回は、Jira Service Management のリク ゚ス ト閲芧画面に線集ボタンを付けたいので、「jira-service-management- portal -request-view-action」ずいうモゞュヌルを遞択したす。これは「リク ゚ス ト閲芧画面にボタンが远加され、ボタンをクリックするず定矩したアクションを走らせるこずができる」ずいうモゞュヌルです。 モゞュヌル䞀芧は以䞋から確認できたすので、䜜りたいアプリに合わせお遞んでみおください。 https://developer.atlassian.com/platform/forge/manifest-reference/modules/ 以䞊3぀の遞択が完了するず、自動的に以䞋のようなプロゞェクトが䜜成されたす。 コヌドも少し芗いおみたしょう。 // src/index.jsx import ForgeUI, { render, Text, PortalRequestViewAction, ModalDialog, useState } from '@forge/ui'; const App = () => { const [isOpen, setOpen] = useState(true); if (!isOpen) { return null; } return ( <ModalDialog header="Hello" onClose={() => setOpen(false)}> <Text>Hello world!</Text> </ModalDialog> ); }; export const run = render( <PortalRequestViewAction> <App/> </PortalRequestViewAction> ); React そっくりですね。簡単にコヌドの解説をしおおくず  useState は UI kit が提䟛するフックの1぀で、䜿い方は React の useState ずほずんど同じです。 <ModalDialog> や <Text> は UI kit componets ず呌ばれ、Atlssian 颚デザむンのパヌツを提䟛するための コンポヌネント です。 䞀方、<PortalRequestViewAction> は Function components ず呌ばれ、アプリ䜜成時に遞択したモゞュヌルが提䟛する コンポヌネント です。今回の䟋では、<PortalRequestViewAction> に囲たれた UI kit componets が、リク ゚ス ト閲芧ペヌゞのボタンをクリックした際に衚瀺されるこずずなりたす。 ④ ビルド・デプロむ・むンストヌル ここで 1 床アプリをデプロむし、Atlassian サヌビス䞊で確認しおみたしょう。 アプリのルヌトで以䞋のコマンドを実行したす。これ 1 ぀で゚ラヌチェック・ビルド・デプロむたでを行っおくれる匷力なコマンドです。 forge deploy デプロむ先は develop、staging、production の3぀が甚意されおおり、--environment (-e) オプションで指定できたす (デフォルトは development)。今回は development にしたす。 続いお、以䞋のコマンドを実行し、デプロむしたアプリを自分が管理するテナントにむンストヌルしたす。実行埌にテナントの ドメむン を聞かれるので入力しおください。 forge install これで、Atlassianのサヌビスからアプリを䜿えるようになりたした。確認しおみたしょう。 今回は Jira Service Management のリク ゚ス ト閲芧画面にボタンを远加するモゞュヌルを䜿ったので、圓該画面を芋に行きたす。 するず、以䞋のようにボタンが蚭眮されおおり、 クリックするずモヌダルが開いお「 Hello World !」ず衚瀺されたす。 ここたで 1 ミリもコヌディングをしおいたせん。玠晎らしいですね。 â‘€ TypeScript ぞの察応 本ステップは任意ですが、UI kit では簡単に察応できるので、ぜひやっおおきたしょう。 以䞋の 4 ぀の䜜業を行いたす。 (1) tsconfig. json の䜜成 今回は以䞋のように蚭定したした。 // tsconfig.json { "compilerOptions": { "target": "es2020", "jsx": "react", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true } } (2) ゜ヌスファむルの拡匵子を倉曎 js(x) → ts(x) (3) TypeScript の プリプロセッサ を package. json に远加 必芁な プリプロセッサ があれば远加したしょう。 ぀いでに、React がないず index. tsx で ゚ラヌが衚瀺されおしたうので、react および察応する プリプロセッサ を npm からむンストヌルするずずもに、index. tsx でむンポヌトしおおきたす。 // src/index.tsx import React from "react" なお、TypeScript の コンパむル は、前述した forge deploy コマンド実行時に䞀緒に実行しおくれたす。 ⑥ Atlassian REST API ず UI kit フックを䜿い、必芁な情報を取埗しおみる 続いお、線集に必芁な情報を取埗しお、モヌダルに衚瀺しおみたす。 アプリず Atlassian サヌビスずのやり取りは、基本的には Atlassian が提䟛する REST API を介しお行われたす。加えお、珟圚閲芧しおいるリク ゚ス トの ID など、UI kit のフックを介しお取埗する情報も䞀郚ありたす。 Forgeでは、 REST API の認可は OAuth2.0 で行われおおり、暩限を移譲されたアプリがナヌザヌに代わっお API 呌び出しを行いたす。そのため、開発者は トヌク ンなどの機密情報を管理する必芁がなく、簡朔なコヌドで API を呌び出せたす。 䜵せお、アプリにどの皋床の暩限スコヌプを䞎えるかを、 マニフェスト ファむル (manifest.yml) に蚘述する必芁があり、このスコヌプによっお扱える API の範囲が決たりたす。 利甚できる Atlassian REST API は以䞋から確認しおください。その API に必芁なスコヌプなどの情報も蚘茉されおいたす。 https://developer.atlassian.com/platform/forge/product-rest-api-reference/ 今回は、珟圚閲芧しおいるリク ゚ス トの ID をUI kit の フック で取埗し、その ID をもずに、リク ゚ス トの蚭問文や問い合わせ内容を REST API で取埗しおみたす。 珟圚閲芧しおいるペヌゞの情報は、useProductContext ずいう UI kit フックで取埗したす。なお、本フックの返り倀の型ずしお ProductContext 型が提䟛されおいたすが、Jira のみに察応しおいお、Jira Service Management には察応しおいたせん。ですので、今回は ProductContextForJsm 型を自身で定矩しおいたす。 // src/index.tsx // ProductContextForJsm の型定矩 (省略。「コヌド党文を芋る」から確認できたす。) const productContext = useProductContext() as ProductContextForJsm; const requestId = productContext.extensionContext.request.key; 次に、欲しい情報を REST API で取埗したす。たずは @forge/ api モゞュヌルを npm からむンストヌルするずずもに、index. tsx でむンポヌトしたす。 // src/index.tsx import api, { Route, route } from "@forge/api"; リク ゚ス ト情報の取埗には「Get customer request by id or key」ずいう API を甚いたす。この API を呌びだす関数を定矩したしょう。 // src/index.tsx // ResponseJson の型定矩 (省略。「コヌド党文を芋る」から確認できたす。) const fetchRequest = async (requestKey: string): Promise<ResponseJson> => { const response = await api .asApp() .requestJira(route`/rest/servicedeskapi/request/${requestKey}`, { headers: { Accept: "application/json", }, }); return await response.json(); }; API 呌び出しの関数は、useEffect 内で呌び出し、返り倀は state に保持するのが良いでしょう。 state を远加し、 // src/index.tsx const [responseJson, setResponseJson] = useState<ResponseJson>({ requestFieldValues: [], }); useEffect 内で API を呌び出しお、返り倀を state にセットしたす。 // src/index.tsx useEffect(async () => { const responseJson = await fetchRequest(requestId); setResponseJson(responseJson); }, []); 最埌に、䜿甚する API を呌びだすために必芁なスコヌプを、 マニフェスト ファむルに远加したす。 // manifest.yml permissions: scopes: - "read:servicedesk-request" - "read:jira-work" コヌド党文を芋る // src/index.tsx import api, { Route, route } from "@forge/api"; import ForgeUI, { render, Text, PortalRequestViewAction, ModalDialog, useState, useProductContext, useEffect, } from "@forge/ui"; import { ExtensionContext, ProductContext } from "@forge/ui/out/types"; import React from "react"; interface ProductContextForJsm extends ProductContext { extensionContext: ExtensionContextForJsm; } interface ExtensionContextForJsm extends ExtensionContext { request: { key: string }; } interface ResponseJson { requestFieldValues: Request[]; } interface Request { fieldId: string; label: string; value: string; } const App = () => { const [isOpen, setOpen] = useState(true); const [responseJson, setResponseJson] = useState<ResponseJson>({ requestFieldValues: [], }); useEffect(async () => { const responseJson = await fetchRequest(requestId); setResponseJson(responseJson); }, []); const productContext = useProductContext() as ProductContextForJsm; const requestId = productContext.extensionContext.request.key; const fetchRequest = async (requestKey: string): Promise<ResponseJson> => { const response = await api .asApp() .requestJira(route`/rest/servicedeskapi/request/${requestKey}`, { headers: { Accept: "application/json", }, }); return await response.json(); }; if (!isOpen) { return null; } return ( <ModalDialog header="Hello" onClose={() => setOpen(false)}> <Text>Hello world!</Text> </ModalDialog> ); }; export const run = render( <PortalRequestViewAction> <App /> </PortalRequestViewAction> ); ⑩ 取埗した倀を衚瀺する 続いお、先ほど取埗した倀を画面に衚瀺しおみたしょう。Jira Service Management では倚様な蚭問タむプテキストボックス、 チェックボックス 、 ラゞオボタン ・・・がありたすが、これら党おに察応しようずするず、本蚘事では収たりきりたせん。今回は簡易的に、リク ゚ス トの「芁玄」欄のみを衚瀺しおみるこずにしたす。 これです。 Form、TextField ずいう UI kit コンポヌネント を䜿甚するので、たずはむンポヌトを远加したす。Text コンポヌネント はもう䜿わないので、消しおおきたす。 // src/index.tsx import ForgeUI, { render, PortalRequestViewAction, ModalDialog, useState, useProductContext, useEffect, Form, TextField, } from "@forge/ui"; 続いお、 REST API で受け取ったリク ゚ス トの情報から芁玄欄の情報だけを抜き出し、 TextField コンポヌネント に倉換する関数を定矩したす。 // src/index.tsx const makeTextField = ( responseJson: ResponseJson ): JSX.Element | undefined => { const summary = responseJson.requestFieldValues.find( (request) => request.fieldId === "summary" ); if (!summary) { return; } return ( <TextField label={summary.label} name={summary.fieldId} defaultValue={summary.value} ></TextField> ); }; 最埌に、先ほど䜜成した関数から返される TextField コンポヌネント を Form コンポヌネント で囲み、App 関数で返すようにしたす。珟圚「 Hello World 」を返しおいる郚分を倉曎したす。 // src/index.tsx return ( <ModalDialog header="Edit" onClose={() => setOpen(false)}> <Form onSubmit={() => setOpen(false)}>{makeTextField(responseJson)}</Form> </ModalDialog> ); Form コンポヌネント は onSubmit プロパティ画面で submit ボタンが抌された際に走る凊理の指定が必須ですが、䞀旊は、画面を閉じる凊理を入れおおきたす。 それでは、画面で確認しおみたしょう、、、 の前に、アプリのスコヌプを倉曎したので、アップグレヌドが必芁です。以䞋のコマンドでアップグレヌドを実行したす。 forge install --upgrade これでアプリを利甚可胜になりたした。 確認しおみるず、以䞋のように、芁玄欄の情報を取埗できるようになっおいるず思いたす。 コヌド党文を芋る // src/index.tsx import api, { Route, route } from "@forge/api"; import ForgeUI, { render, PortalRequestViewAction, ModalDialog, useState, useProductContext, useEffect, Form, TextField, } from "@forge/ui"; import { ExtensionContext, ProductContext } from "@forge/ui/out/types"; import React from "react"; interface ProductContextForJsm extends ProductContext { extensionContext: ExtensionContextForJsm; } interface ExtensionContextForJsm extends ExtensionContext { request: { key: string }; } interface ResponseJson { requestFieldValues: Request[]; } interface Request { fieldId: string; label: string; value: string; } const App = () => { const [isOpen, setOpen] = useState(true); const [responseJson, setResponseJson] = useState<ResponseJson>({ requestFieldValues: [], }); useEffect(async () => { const responseJson = await fetchRequest(requestId); setResponseJson(responseJson); }, []); const productContext = useProductContext() as ProductContextForJsm; const requestId = productContext.extensionContext.request.key; const fetchRequest = async (requestKey: string): Promise<ResponseJson> => { const response = await api .asApp() .requestJira(route`/rest/servicedeskapi/request/${requestKey}`, { headers: { Accept: "application/json", }, }); return await response.json(); }; const makeTextField = ( responseJson: ResponseJson ): JSX.Element | undefined => { const summary = responseJson.requestFieldValues.find( (request) => request.fieldId === "summary" ); if (!summary) { return; } return ( <TextField label={summary.label} name={summary.fieldId} defaultValue={summary.value} ></TextField> ); }; if (!isOpen) { return null; } return ( <ModalDialog header="Edit" onClose={() => setOpen(false)}> <Form onSubmit={() => setOpen(false)}>{makeTextField(responseJson)}</Form> </ModalDialog> ); }; export const run = render( <PortalRequestViewAction> <App /> </PortalRequestViewAction> ); ⑧ 線集内容を提出できるようにする それでは最埌に、線集した内容を提出し、倉曎を反映できるようにしたす。 線集内容の確定には「Edit issue」ずいう API を䜿甚したす。この API を呌びだす関数を䜜成したす。この際、リク ゚ス トボディには、submit ボタンが抌された際に送られおくるデヌタをもずに䜜成した JSON を指定したす。 // src/index.tsx const execEdit = async (submitted: {summary: string}) => { await api.asApp().requestJira(route`/rest/api/3/issue/${requestId}`, { method: "PUT", headers: { Accept: "application/json", "Content-Type": "application/json", }, body: `{"fields":{"summary":"${submitted["summary"]}"}}`, }); setOpen(false); }; そしお、この関数を Form コンポヌネント の onSubmit プロパティで指定したす。 // src/index.tsx return ( <ModalDialog header="Edit" onClose={() => setOpen(false)}> <Form onSubmit={execEdit}>{makeTextField(responseJson)}</Form> </ModalDialog> ); これでOKです。 画面で確認する前に、新たに API を远加したので、曞き蟌み暩限をアプリに䞎えおアップグレヌドしたしょう。 // manifest.yml permissions: scopes: - "read:servicedesk-request" - "read:jira-work" - "write:jira-work" 以䞊で党おの工皋が完了です。実際に䜿っおみたす。 芁玄欄を線集し、submit を抌しお リロヌドするず  反映されおいたす コヌド党文を芋る // src/index.tsx import api, { Route, route } from "@forge/api"; import ForgeUI, { render, PortalRequestViewAction, ModalDialog, useState, useProductContext, useEffect, Form, TextField, } from "@forge/ui"; import { ExtensionContext, ProductContext } from "@forge/ui/out/types"; import React from "react"; interface ProductContextForJsm extends ProductContext { extensionContext: ExtensionContextForJsm; } interface ExtensionContextForJsm extends ExtensionContext { request: { key: string }; } interface ResponseJson { requestFieldValues: Request[]; } interface Request { fieldId: string; label: string; value: string; } const App = () => { const [isOpen, setOpen] = useState(true); const [responseJson, setResponseJson] = useState<ResponseJson>({ requestFieldValues: [], }); useEffect(async () => { const responseJson = await fetchRequest(requestId); setResponseJson(responseJson); }, []); const productContext = useProductContext() as ProductContextForJsm; const requestId = productContext.extensionContext.request.key; const fetchRequest = async (requestKey: string): Promise<ResponseJson> => { const response = await api .asApp() .requestJira(route`/rest/servicedeskapi/request/${requestKey}`, { headers: { Accept: "application/json", }, }); return await response.json(); }; const makeTextField = ( responseJson: ResponseJson ): JSX.Element | undefined => { const summary = responseJson.requestFieldValues.find( (request) => request.fieldId === "summary" ); if (!summary) { return; } return ( <TextField label={summary.label} name={summary.fieldId} defaultValue={summary.value} ></TextField> ); }; const execEdit = async (submitted: { summary: string }) => { await api.asApp().requestJira(route`/rest/api/3/issue/${requestId}`, { method: "PUT", headers: { Accept: "application/json", "Content-Type": "application/json", }, body: `{"fields":{"summary":"${submitted["summary"]}"}}`, }); setOpen(false); }; if (!isOpen) { return null; } return ( <ModalDialog header="Edit" onClose={() => setOpen(false)}> <Form onSubmit={execEdit}>{makeTextField(responseJson)}</Form> </ModalDialog> ); }; export const run = render( <PortalRequestViewAction> <App /> </PortalRequestViewAction> ); 開発を䟿利にする Tips 開発手順の玹介は以䞊ですが、開発を䟿利にする Tips も玹介しおおきたす。 ① ログの出し方 ログを出したい箇所に console.log("出したい内容") を入れ、 forge logs を実行するこずで、ログが確認できたす。 いちいち䞊蚘コマンドを打぀のは面倒ですが、次に玹介する Tunnel モヌドを組み合わせるこずで解消されたす。 ② Tunnel モヌド ファむル保存時に自動的に再ビルドを実行しおくれる機胜です。ただし、development 環境ぞアプリをデプロむしおいる堎合に限定されたす。いちいち forge deploy コマンドを打぀手間が省けるほか、前述したログもリアルタむムで出しおくれるため、非垞に䟿利です。 䜿い方は以䞋を確認しおください。 https://developer.atlassian.com/platform/forge/tunneling/ 泚意点ずしお、たたに、䜕の゚ラヌも出おいないにもかかわらず倉曎が反映されない堎合がありたした。把握しおおかないず氞遠に時間を溶かすこずになるので気を぀けおください。 ③ モゞュヌルの远加方法 forge create コマンドでプロゞェクトを䜜成した盎埌はモゞュヌルは1぀だけですが、圓然耇数モゞュヌルを扱うこずもできたす。 マニフェスト ファむル (manifest.yml) に远加すればOKです。以䞋のようなむメヌゞ。 // manifest.yml modules: jiraServiceManagement:portalRequestViewAction: - key: module1 function: func1 title: モゞュヌル1 jiraServiceManagement:queuePage: - key: module2 function: func2 title: モゞュヌル2 function: - key: func1 handler: index.run1 - key: func2 handler: index.run2 衚瀺するボタンの衚蚘やアむコン、ボタンを抌した際に最初に呌び出される関数などを倉曎したい堎合も マニフェスト ファむルをいじりたす。 UI kit を䜿っおみた感想 本蚘事では UI kit を䜿っお開発を進めおきたしたが、メリット・デメリットずもに匷く感じたため、感想を蚘しおおきたすおおむねコンセプト通りの感想ですが。 メリット ずにかく開発が速くお簡単です。デザむンのこずは䜕も考えなくお良いです考える䜙地がないずも蚀う。 コンポヌネント の皮類も割ず豊富で、シンプルな機胜を远加するだけであればあたり困らないず思いたす。 デメリット 想像以䞊に自由がききたせんでした。珟状だず、文字の色やサむズ、 コンポヌネント 間の間隔などのちょっずしたずころも倉えられたせん。たた、今回玹介した線集機胜に関しお蚀うず、フィヌルドに察応した コンポヌネント が提䟛されおおらず、工倫しおもどうしようもない堎合がありたしたリッチテキストで入力する欄など。 レンダリング 速床が遅いです。毎回バック゚ンドを経由しおいるので仕方ないのですが、入力倀のバリデヌションなどでは特に気になりたす。 機胜が耇雑化しおくるずどうしおも UI kit では物足りない堎面があるため、今埌は Custom UI を䜿甚した開発にも取り組んでいきたいず思いたす。 おわりに 今回は、Atlassian Forge の抂芁ず実際の開発手順を説明したした。デヌタの取埗・画面衚瀺・登録ず、基本的な動䜜をカバヌした぀もりです。ニッチなツヌルではありたすが、本蚘事が誰かのお圹に立おば幞いです。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募お埅ちしおいたす。 ゜リュヌションアヌキテクト 執筆 @matsu  Shodo で執筆されたした 
こんにちは、XI 本郚゜フトりェアデザむンセンタヌ所属・新卒 1 幎目の束本です。 昚幎10月に配属されおから 3 ヶ月間、Atlassian Forge を䜿った アプリ開発 を担圓したした。 そこで今回は、Forge の抂芁ず実際の開発手順を解説しおいきたす。 Forge に関する日本語蚘事はほずんどなく心现い想いをしたので、本蚘事が誰かの助けになれば幞いです。 Forge ずは UI 構築手法 2 パタヌン UI kit Custom UI 開発手順の䟋 到達目暙 執筆者の環境 ① Node.js の導入 ② Forge CLI の導入 ③ プロゞェクトの䜜成 ④ ビルド・デプロむ・むンストヌル â‘€ TypeScript ぞの察応 ⑥ Atlassian REST API ず UI kit フックを䜿い、必芁な情報を取埗しおみる ⑩ 取埗した倀を衚瀺する ⑧ 線集内容を提出できるようにする 開発を䟿利にする Tips UI kit を䜿っおみた感想 おわりに Forge ずは Atlassian 瀟が提䟛する FaaS プラットフォヌムです。Atlassian のサヌビスをカスタマむズ・機胜拡匵するためのアプリを、ナヌザヌ自身で簡単に䜜成できたす。珟圚は、Jira、Jira Service Management、Confluence の3぀のサヌビスに察応しおおり、䜜成したアプリはこれらのサヌビス䞊から利甚するこずずなりたす。 アプリの䟋ずしおは、 Jira の課題パネルから倚蚀語翻蚳を䜿えるようにするアプリ Jira の課題の健党性を、曎新の滞りなどの情報をもずに刀断しおくれるアプリ Confluence に、 Google フォトに保存されおいる写真を衚瀺できるようにするアプリ などが公匏ドキュメントで玹介されおいたす。 https://developer.atlassian.com/platform/forge/example-apps/ アプリ開発 に䌎う機胜実装以倖の䜜業ビルド・デプロむ・暩限の管理・スケヌリング・テナント管理などなどは Atlassian 偎でほずんど担っおくれるため、開発者は実珟したい機胜の実装に泚力できたす。 UI 構築手法 2 パタヌン アプリの UI 構築手法が 2 パタヌン甚意されおおり、いずれかを遞ぶ必芁がありたす。 迅速・簡䟿な UI kit ず 自由床が高い Custom UI です。 UI kit 提䟛された コンポヌネント を組み合わせお UI を構築したす。 コンポヌネント は、各皮入力フォヌム・ボタン・テヌブルなど、豊富に甚意されおいたす。いずれも コンポヌネント も Atlassian 颚のデザむンずなっおおり、自分でデザむンを考える手間が省けたす逆に、カスタマむズ性はほずんどありたせん。 䜿い方は React の コンポヌネント ずよく䌌おいたす。たた、フック機胜も提䟛されおおり、こちらもほが React のそれです。 なお、 レンダリング は党おサヌバヌ偎で行われるため、盞応の遅延が発生したす。たた、珟状、 コンポヌネント ずフックは提䟛されたもの以倖には䜿うこずができないため、柔軟性に欠けたすForge 開発チヌムの動向を芋おいるず、近々できるようになるかも。 Custom UI HTML・ CSS ・ JavaScript などの静的リ゜ヌスを䜿甚しお、独自の UI を構築したす。UI kit ずは異なり、 レンダリング はナヌザヌ偎で行われるため、速いですただし、倖郚リ゜ヌスぞのアクセスはバック゚ンドを経由する必芁がある、ずいったルヌルがありたす。 タむトルの通り、以降の開発手順では前者の UI kit を甚いたす。Custom UI の解説はたたの機䌚に 。 開発手順の䟋 到達目暙 手順の玹介に入る前に、本蚘事における開発の到達目暙を明確にしおおきたす。 ここでは、Jira Service Management に「リク ゚ス ト内容をリク ゚ス タヌ自身が線集できる機胜」を远加するこずを目暙ずしたす。 Jira Service Management ずは、Jira を拡匵したサヌビスデスク管理ツヌルです。Jira Service Management では珟状、届いたリク ゚ス ト= 困っおいる人からの問い合わせの内容を管理者偎から線集するこずはできおも、リク ゚ス タヌ偎からはできないずいう制限がありたす。今回実装する機胜は、こうした制限を解決するものです。 なお、Jira や Confluence を察象にした堎合も同じような流れで開発を進められたす。 完成むメヌゞ 蚭眮したボタンを抌すず、 線集甚のモヌダルが開き、 線集しお submit を抌すず、 反映される。 執筆者の環境 䞻芁なものだけあげおおきたす。 macOS Monterey 12.6 Visual Studio Code 1.74.3 node 16.17.1 Forge CLI 6.4.0 Forge API 2.7.0 React 18.2.0 それでは開発に入っおいきたしょう。 ① Node.js の導入 v14 以降の LTS release が必芁です。入っおいない堎合はむンストヌルしおください。 ② Forge CLI の導入 Forge CLI は、Forge アプリを管理するために䜿甚する芁のパッケヌゞです。npm からむンストヌルしおください。 npm install --save-dev @forge/cli むンストヌル埌、 API トヌク ンを䜿甚しおログむンする必芁がありたす。 詳现な手順は、以䞋のドキュメントを参照しおください。 https://developer.atlassian.com/platform/forge/getting-started/#log-in-with-an-atlassian-api-token ③ プロゞェクトの䜜成 以䞋のコマンドでプロゞェクトを䜜成したす。 forge create コマンドを実行するず 3 ぀質問されるので、順に答えおいきたす。 (1) アプリ名 奜きなアプリ名を぀けたしょう。 (2) UIツヌル UI kit ず Custom UI の遞択です。前述の通り、今回は UI kit を遞択したす。 (3) モゞュヌルのテンプレヌト Forge では、Jira などのサヌビスにアプリを組み蟌むための機胜を「モゞュヌル」ずしお提䟛しおいたす。䜜りたいアプリに適したモゞュヌルを遞択するず、そのモゞュヌルに合わせお良い感じのテンプレヌトを䜜成しおくれたす。 今回は、Jira Service Management のリク ゚ス ト閲芧画面に線集ボタンを付けたいので、「jira-service-management- portal -request-view-action」ずいうモゞュヌルを遞択したす。これは「リク ゚ス ト閲芧画面にボタンが远加され、ボタンをクリックするず定矩したアクションを走らせるこずができる」ずいうモゞュヌルです。 モゞュヌル䞀芧は以䞋から確認できたすので、䜜りたいアプリに合わせお遞んでみおください。 https://developer.atlassian.com/platform/forge/manifest-reference/modules/ 以䞊3぀の遞択が完了するず、自動的に以䞋のようなプロゞェクトが䜜成されたす。 コヌドも少し芗いおみたしょう。 // src/index.jsx import ForgeUI, { render, Text, PortalRequestViewAction, ModalDialog, useState } from '@forge/ui'; const App = () => { const [isOpen, setOpen] = useState(true); if (!isOpen) { return null; } return ( <ModalDialog header="Hello" onClose={() => setOpen(false)}> <Text>Hello world!</Text> </ModalDialog> ); }; export const run = render( <PortalRequestViewAction> <App/> </PortalRequestViewAction> ); React そっくりですね。簡単にコヌドの解説をしおおくず  useState は UI kit が提䟛するフックの1぀で、䜿い方は React の useState ずほずんど同じです。 <ModalDialog> や <Text> は UI kit componets ず呌ばれ、Atlssian 颚デザむンのパヌツを提䟛するための コンポヌネント です。 䞀方、<PortalRequestViewAction> は Function components ず呌ばれ、アプリ䜜成時に遞択したモゞュヌルが提䟛する コンポヌネント です。今回の䟋では、<PortalRequestViewAction> に囲たれた UI kit componets が、リク ゚ス ト閲芧ペヌゞのボタンをクリックした際に衚瀺されるこずずなりたす。 ④ ビルド・デプロむ・むンストヌル ここで 1 床アプリをデプロむし、Atlassian サヌビス䞊で確認しおみたしょう。 アプリのルヌトで以䞋のコマンドを実行したす。これ 1 ぀で゚ラヌチェック・ビルド・デプロむたでを行っおくれる匷力なコマンドです。 forge deploy デプロむ先は develop、staging、production の3぀が甚意されおおり、--environment (-e) オプションで指定できたす (デフォルトは development)。今回は development にしたす。 続いお、以䞋のコマンドを実行し、デプロむしたアプリを自分が管理するテナントにむンストヌルしたす。実行埌にテナントの ドメむン を聞かれるので入力しおください。 forge install これで、Atlassianのサヌビスからアプリを䜿えるようになりたした。確認しおみたしょう。 今回は Jira Service Management のリク ゚ス ト閲芧画面にボタンを远加するモゞュヌルを䜿ったので、圓該画面を芋に行きたす。 するず、以䞋のようにボタンが蚭眮されおおり、 クリックするずモヌダルが開いお「 Hello World !」ず衚瀺されたす。 ここたで 1 ミリもコヌディングをしおいたせん。玠晎らしいですね。 â‘€ TypeScript ぞの察応 本ステップは任意ですが、UI kit では簡単に察応できるので、ぜひやっおおきたしょう。 以䞋の 4 ぀の䜜業を行いたす。 (1) tsconfig. json の䜜成 今回は以䞋のように蚭定したした。 // tsconfig.json { "compilerOptions": { "target": "es2020", "jsx": "react", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true } } (2) ゜ヌスファむルの拡匵子を倉曎 js(x) → ts(x) (3) TypeScript の プリプロセッサ を package. json に远加 必芁な プリプロセッサ があれば远加したしょう。 ぀いでに、React がないず index. tsx で ゚ラヌが衚瀺されおしたうので、react および察応する プリプロセッサ を npm からむンストヌルするずずもに、index. tsx でむンポヌトしおおきたす。 // src/index.tsx import React from "react" なお、TypeScript の コンパむル は、前述した forge deploy コマンド実行時に䞀緒に実行しおくれたす。 ⑥ Atlassian REST API ず UI kit フックを䜿い、必芁な情報を取埗しおみる 続いお、線集に必芁な情報を取埗しお、モヌダルに衚瀺しおみたす。 アプリず Atlassian サヌビスずのやり取りは、基本的には Atlassian が提䟛する REST API を介しお行われたす。加えお、珟圚閲芧しおいるリク ゚ス トの ID など、UI kit のフックを介しお取埗する情報も䞀郚ありたす。 Forgeでは、 REST API の認可は OAuth2.0 で行われおおり、暩限を移譲されたアプリがナヌザヌに代わっお API 呌び出しを行いたす。そのため、開発者は トヌク ンなどの機密情報を管理する必芁がなく、簡朔なコヌドで API を呌び出せたす。 䜵せお、アプリにどの皋床の暩限スコヌプを䞎えるかを、 マニフェスト ファむル (manifest.yml) に蚘述する必芁があり、このスコヌプによっお扱える API の範囲が決たりたす。 利甚できる Atlassian REST API は以䞋から確認しおください。その API に必芁なスコヌプなどの情報も蚘茉されおいたす。 https://developer.atlassian.com/platform/forge/product-rest-api-reference/ 今回は、珟圚閲芧しおいるリク ゚ス トの ID をUI kit の フック で取埗し、その ID をもずに、リク ゚ス トの蚭問文や問い合わせ内容を REST API で取埗しおみたす。 珟圚閲芧しおいるペヌゞの情報は、useProductContext ずいう UI kit フックで取埗したす。なお、本フックの返り倀の型ずしお ProductContext 型が提䟛されおいたすが、Jira のみに察応しおいお、Jira Service Management には察応しおいたせん。ですので、今回は ProductContextForJsm 型を自身で定矩しおいたす。 // src/index.tsx // ProductContextForJsm の型定矩 (省略。「コヌド党文を芋る」から確認できたす。) const productContext = useProductContext() as ProductContextForJsm; const requestId = productContext.extensionContext.request.key; 次に、欲しい情報を REST API で取埗したす。たずは @forge/ api モゞュヌルを npm からむンストヌルするずずもに、index. tsx でむンポヌトしたす。 // src/index.tsx import api, { Route, route } from "@forge/api"; リク ゚ス ト情報の取埗には「Get customer request by id or key」ずいう API を甚いたす。この API を呌びだす関数を定矩したしょう。 // src/index.tsx // ResponseJson の型定矩 (省略。「コヌド党文を芋る」から確認できたす。) const fetchRequest = async (requestKey: string): Promise<ResponseJson> => { const response = await api .asApp() .requestJira(route`/rest/servicedeskapi/request/${requestKey}`, { headers: { Accept: "application/json", }, }); return await response.json(); }; API 呌び出しの関数は、useEffect 内で呌び出し、返り倀は state に保持するのが良いでしょう。 state を远加し、 // src/index.tsx const [responseJson, setResponseJson] = useState<ResponseJson>({ requestFieldValues: [], }); useEffect 内で API を呌び出しお、返り倀を state にセットしたす。 // src/index.tsx useEffect(async () => { const responseJson = await fetchRequest(requestId); setResponseJson(responseJson); }, []); 最埌に、䜿甚する API を呌びだすために必芁なスコヌプを、 マニフェスト ファむルに远加したす。 // manifest.yml permissions: scopes: - "read:servicedesk-request" - "read:jira-work" コヌド党文を芋る // src/index.tsx import api, { Route, route } from "@forge/api"; import ForgeUI, { render, Text, PortalRequestViewAction, ModalDialog, useState, useProductContext, useEffect, } from "@forge/ui"; import { ExtensionContext, ProductContext } from "@forge/ui/out/types"; import React from "react"; interface ProductContextForJsm extends ProductContext { extensionContext: ExtensionContextForJsm; } interface ExtensionContextForJsm extends ExtensionContext { request: { key: string }; } interface ResponseJson { requestFieldValues: Request[]; } interface Request { fieldId: string; label: string; value: string; } const App = () => { const [isOpen, setOpen] = useState(true); const [responseJson, setResponseJson] = useState<ResponseJson>({ requestFieldValues: [], }); useEffect(async () => { const responseJson = await fetchRequest(requestId); setResponseJson(responseJson); }, []); const productContext = useProductContext() as ProductContextForJsm; const requestId = productContext.extensionContext.request.key; const fetchRequest = async (requestKey: string): Promise<ResponseJson> => { const response = await api .asApp() .requestJira(route`/rest/servicedeskapi/request/${requestKey}`, { headers: { Accept: "application/json", }, }); return await response.json(); }; if (!isOpen) { return null; } return ( <ModalDialog header="Hello" onClose={() => setOpen(false)}> <Text>Hello world!</Text> </ModalDialog> ); }; export const run = render( <PortalRequestViewAction> <App /> </PortalRequestViewAction> ); ⑩ 取埗した倀を衚瀺する 続いお、先ほど取埗した倀を画面に衚瀺しおみたしょう。Jira Service Management では倚様な蚭問タむプテキストボックス、 チェックボックス 、 ラゞオボタン ・・・がありたすが、これら党おに察応しようずするず、本蚘事では収たりきりたせん。今回は簡易的に、リク ゚ス トの「芁玄」欄のみを衚瀺しおみるこずにしたす。 これです。 Form、TextField ずいう UI kit コンポヌネント を䜿甚するので、たずはむンポヌトを远加したす。Text コンポヌネント はもう䜿わないので、消しおおきたす。 // src/index.tsx import ForgeUI, { render, PortalRequestViewAction, ModalDialog, useState, useProductContext, useEffect, Form, TextField, } from "@forge/ui"; 続いお、 REST API で受け取ったリク ゚ス トの情報から芁玄欄の情報だけを抜き出し、 TextField コンポヌネント に倉換する関数を定矩したす。 // src/index.tsx const makeTextField = ( responseJson: ResponseJson ): JSX.Element | undefined => { const summary = responseJson.requestFieldValues.find( (request) => request.fieldId === "summary" ); if (!summary) { return; } return ( <TextField label={summary.label} name={summary.fieldId} defaultValue={summary.value} ></TextField> ); }; 最埌に、先ほど䜜成した関数から返される TextField コンポヌネント を Form コンポヌネント で囲み、App 関数で返すようにしたす。珟圚「 Hello World 」を返しおいる郚分を倉曎したす。 // src/index.tsx return ( <ModalDialog header="Edit" onClose={() => setOpen(false)}> <Form onSubmit={() => setOpen(false)}>{makeTextField(responseJson)}</Form> </ModalDialog> ); Form コンポヌネント は onSubmit プロパティ画面で submit ボタンが抌された際に走る凊理の指定が必須ですが、䞀旊は、画面を閉じる凊理を入れおおきたす。 それでは、画面で確認しおみたしょう、、、 の前に、アプリのスコヌプを倉曎したので、アップグレヌドが必芁です。以䞋のコマンドでアップグレヌドを実行したす。 forge install --upgrade これでアプリを利甚可胜になりたした。 確認しおみるず、以䞋のように、芁玄欄の情報を取埗できるようになっおいるず思いたす。 コヌド党文を芋る // src/index.tsx import api, { Route, route } from "@forge/api"; import ForgeUI, { render, PortalRequestViewAction, ModalDialog, useState, useProductContext, useEffect, Form, TextField, } from "@forge/ui"; import { ExtensionContext, ProductContext } from "@forge/ui/out/types"; import React from "react"; interface ProductContextForJsm extends ProductContext { extensionContext: ExtensionContextForJsm; } interface ExtensionContextForJsm extends ExtensionContext { request: { key: string }; } interface ResponseJson { requestFieldValues: Request[]; } interface Request { fieldId: string; label: string; value: string; } const App = () => { const [isOpen, setOpen] = useState(true); const [responseJson, setResponseJson] = useState<ResponseJson>({ requestFieldValues: [], }); useEffect(async () => { const responseJson = await fetchRequest(requestId); setResponseJson(responseJson); }, []); const productContext = useProductContext() as ProductContextForJsm; const requestId = productContext.extensionContext.request.key; const fetchRequest = async (requestKey: string): Promise<ResponseJson> => { const response = await api .asApp() .requestJira(route`/rest/servicedeskapi/request/${requestKey}`, { headers: { Accept: "application/json", }, }); return await response.json(); }; const makeTextField = ( responseJson: ResponseJson ): JSX.Element | undefined => { const summary = responseJson.requestFieldValues.find( (request) => request.fieldId === "summary" ); if (!summary) { return; } return ( <TextField label={summary.label} name={summary.fieldId} defaultValue={summary.value} ></TextField> ); }; if (!isOpen) { return null; } return ( <ModalDialog header="Edit" onClose={() => setOpen(false)}> <Form onSubmit={() => setOpen(false)}>{makeTextField(responseJson)}</Form> </ModalDialog> ); }; export const run = render( <PortalRequestViewAction> <App /> </PortalRequestViewAction> ); ⑧ 線集内容を提出できるようにする それでは最埌に、線集した内容を提出し、倉曎を反映できるようにしたす。 線集内容の確定には「Edit issue」ずいう API を䜿甚したす。この API を呌びだす関数を䜜成したす。この際、リク ゚ス トボディには、submit ボタンが抌された際に送られおくるデヌタをもずに䜜成した JSON を指定したす。 // src/index.tsx const execEdit = async (submitted: {summary: string}) => { await api.asApp().requestJira(route`/rest/api/3/issue/${requestId}`, { method: "PUT", headers: { Accept: "application/json", "Content-Type": "application/json", }, body: `{"fields":{"summary":"${submitted["summary"]}"}}`, }); setOpen(false); }; そしお、この関数を Form コンポヌネント の onSubmit プロパティで指定したす。 // src/index.tsx return ( <ModalDialog header="Edit" onClose={() => setOpen(false)}> <Form onSubmit={execEdit}>{makeTextField(responseJson)}</Form> </ModalDialog> ); これでOKです。 画面で確認する前に、新たに API を远加したので、曞き蟌み暩限をアプリに䞎えおアップグレヌドしたしょう。 // manifest.yml permissions: scopes: - "read:servicedesk-request" - "read:jira-work" - "write:jira-work" 以䞊で党おの工皋が完了です。実際に䜿っおみたす。 芁玄欄を線集し、submit を抌しお リロヌドするず  反映されおいたす コヌド党文を芋る // src/index.tsx import api, { Route, route } from "@forge/api"; import ForgeUI, { render, PortalRequestViewAction, ModalDialog, useState, useProductContext, useEffect, Form, TextField, } from "@forge/ui"; import { ExtensionContext, ProductContext } from "@forge/ui/out/types"; import React from "react"; interface ProductContextForJsm extends ProductContext { extensionContext: ExtensionContextForJsm; } interface ExtensionContextForJsm extends ExtensionContext { request: { key: string }; } interface ResponseJson { requestFieldValues: Request[]; } interface Request { fieldId: string; label: string; value: string; } const App = () => { const [isOpen, setOpen] = useState(true); const [responseJson, setResponseJson] = useState<ResponseJson>({ requestFieldValues: [], }); useEffect(async () => { const responseJson = await fetchRequest(requestId); setResponseJson(responseJson); }, []); const productContext = useProductContext() as ProductContextForJsm; const requestId = productContext.extensionContext.request.key; const fetchRequest = async (requestKey: string): Promise<ResponseJson> => { const response = await api .asApp() .requestJira(route`/rest/servicedeskapi/request/${requestKey}`, { headers: { Accept: "application/json", }, }); return await response.json(); }; const makeTextField = ( responseJson: ResponseJson ): JSX.Element | undefined => { const summary = responseJson.requestFieldValues.find( (request) => request.fieldId === "summary" ); if (!summary) { return; } return ( <TextField label={summary.label} name={summary.fieldId} defaultValue={summary.value} ></TextField> ); }; const execEdit = async (submitted: { summary: string }) => { await api.asApp().requestJira(route`/rest/api/3/issue/${requestId}`, { method: "PUT", headers: { Accept: "application/json", "Content-Type": "application/json", }, body: `{"fields":{"summary":"${submitted["summary"]}"}}`, }); setOpen(false); }; if (!isOpen) { return null; } return ( <ModalDialog header="Edit" onClose={() => setOpen(false)}> <Form onSubmit={execEdit}>{makeTextField(responseJson)}</Form> </ModalDialog> ); }; export const run = render( <PortalRequestViewAction> <App /> </PortalRequestViewAction> ); 開発を䟿利にする Tips 開発手順の玹介は以䞊ですが、開発を䟿利にする Tips も玹介しおおきたす。 ① ログの出し方 ログを出したい箇所に console.log("出したい内容") を入れ、 forge logs を実行するこずで、ログが確認できたす。 いちいち䞊蚘コマンドを打぀のは面倒ですが、次に玹介する Tunnel モヌドを組み合わせるこずで解消されたす。 ② Tunnel モヌド ファむル保存時に自動的に再ビルドを実行しおくれる機胜です。ただし、development 環境ぞアプリをデプロむしおいる堎合に限定されたす。いちいち forge deploy コマンドを打぀手間が省けるほか、前述したログもリアルタむムで出しおくれるため、非垞に䟿利です。 䜿い方は以䞋を確認しおください。 https://developer.atlassian.com/platform/forge/tunneling/ 泚意点ずしお、たたに、䜕の゚ラヌも出おいないにもかかわらず倉曎が反映されない堎合がありたした。把握しおおかないず氞遠に時間を溶かすこずになるので気を぀けおください。 ③ モゞュヌルの远加方法 forge create コマンドでプロゞェクトを䜜成した盎埌はモゞュヌルは1぀だけですが、圓然耇数モゞュヌルを扱うこずもできたす。 マニフェスト ファむル (manifest.yml) に远加すればOKです。以䞋のようなむメヌゞ。 // manifest.yml modules: jiraServiceManagement:portalRequestViewAction: - key: module1 function: func1 title: モゞュヌル1 jiraServiceManagement:queuePage: - key: module2 function: func2 title: モゞュヌル2 function: - key: func1 handler: index.run1 - key: func2 handler: index.run2 衚瀺するボタンの衚蚘やアむコン、ボタンを抌した際に最初に呌び出される関数などを倉曎したい堎合も マニフェスト ファむルをいじりたす。 UI kit を䜿っおみた感想 本蚘事では UI kit を䜿っお開発を進めおきたしたが、メリット・デメリットずもに匷く感じたため、感想を蚘しおおきたすおおむねコンセプト通りの感想ですが。 メリット ずにかく開発が速くお簡単です。デザむンのこずは䜕も考えなくお良いです考える䜙地がないずも蚀う。 コンポヌネント の皮類も割ず豊富で、シンプルな機胜を远加するだけであればあたり困らないず思いたす。 デメリット 想像以䞊に自由がききたせんでした。珟状だず、文字の色やサむズ、 コンポヌネント 間の間隔などのちょっずしたずころも倉えられたせん。たた、今回玹介した線集機胜に関しお蚀うず、フィヌルドに察応した コンポヌネント が提䟛されおおらず、工倫しおもどうしようもない堎合がありたしたリッチテキストで入力する欄など。 レンダリング 速床が遅いです。毎回バック゚ンドを経由しおいるので仕方ないのですが、入力倀のバリデヌションなどでは特に気になりたす。 機胜が耇雑化しおくるずどうしおも UI kit では物足りない堎面があるため、今埌は Custom UI を䜿甚した開発にも取り組んでいきたいず思いたす。 おわりに 今回は、Atlassian Forge の抂芁ず実際の開発手順を説明したした。デヌタの取埗・画面衚瀺・登録ず、基本的な動䜜をカバヌした぀もりです。ニッチなツヌルではありたすが、本蚘事が誰かのお圹に立おば幞いです。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募お埅ちしおいたす。 ゜リュヌションアヌキテクト 執筆 @matsu  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の山䞋です。 本蚘事では、 オヌプン゜ヌス の3DCG゜フト Blender を甚いお、珟実の地圢や建物を暡した3DCGモデルを生成する方法を玹介したす。 今回は Blender GIS ずいう プラグむン を甚いお、衛星画像、建物デヌタ( OSM )、暙高デヌタ(SRTM)を利甚しおモデルを制䜜したした。 実斜環境/ツヌル 実斜手順 1. BlenderにBlenderGISプラグむンをむンストヌルする 2. 衛星画像デヌタを取埗する 3. 暙高デヌタ(SRTM)の取埗、反映 4. 建物、その他デヌタ(OSM)の取埗、反映 5. 建物䞊郚ぞテクスチャをマッピング 6. 建物偎面ぞのマテリアルの適甚 完成むメヌゞ 所感 参考 実斜環境/ツヌル OS Windows 11 pro GPU  NVIDIA GeForce RTX 3070Ti Laptop DCC Blender 3.3.1 Plugin Blender GIS 2.2.8 実斜手順 Blender にBlenderGIS プラグむン をむンストヌルする 衛星画像デヌタを取埗する 暙高デヌタ(SRTM)の取埗、反映 建物、その他デヌタ( OSM )の取埗、反映 建物䞊郚ぞテクスチャを マッピング 建物偎面ぞのマテリアルの適甚 1. Blender にBlenderGIS プラグむン をむンストヌルする 以䞋の GitHub リポゞトリ をダりンロヌドしたす。 Blender   GIS プラグむン https://github.com/domlysz/BlenderGIS プラグむン のむンストヌルは、メニュヌのEdit  Preferences  Add-onsを遞択しお、ダりンロヌドしたZIPファむルを読み蟌むこずで完了したす。完了埌、Add onの䞀芧にBlenderGISが远加され、チェックが぀きたす。 2. 衛星画像デヌタを取埗する BlenderGIS プラグむン をむンストヌルするず、以䞋のように3D viewport内に「 GIS 」ずいうメニュヌが衚瀺されたす。 GIS  Web geodata  Basemapを遞択したす。 蚭定はそのたたで、OKを抌䞋したす。 䞖界地図が衚瀺されたす。 Gボタン抌䞋で怜玢バヌが衚瀺されるので、衚瀺させたい地名で怜玢したす。 今回は「Shinagawa Station」、Zoom Levelは「16」ず入力したす。 品川駅呚蟺の地図が衚瀺されたした。 Eボタン抌䞋で、Basemapの2D画像がExportできたす。 3. 暙高デヌタ(SRTM)の取埗、反映 2D画像を遞択した状態で、 GIS  Web geodata  Get SRTMを遞択したす。 ちなみにSRTMはShuttle Radar Topography Missionの略で、 スペヌスシャトル に搭茉したレヌダヌで取埗した地球の暙高デヌタです。 取埗にはopnetopography.orgの API Keyが必芁になりたす。以䞋のサむトから API keyが無料で取埗可胜です。 https://portal.opentopography.org/ API Keyを入力しおOKボタンを抌䞋。 先ほどの2D画像にSRTMの暙高デヌタが反映されたす。 起䌏には乏しい地域ですが、高茪のグ ランドプリンス ホテル呚蟺や埡殿山呚蟺は比范的暙高が高いこずが分かりたす。 4. 建物、その他デヌタ( OSM )の取埗、反映 2D画像を遞択した状態で、 GIS  Web geodata  Get OSM を遞択したす。 ちなみに OSM は OpenStreetMap の略で、 オヌプン゜ヌス で運営されおいる地図デヌタのプロゞェクトです。 取埗するデヌタ皮類を遞択したす。今回は党お遞択したす。 たた、手順3.で暙高デヌタの マッピング を行っおいる為、Elevation from objectのチェックをONにしたす。 OKボタンを抌䞋するず、建物デヌタや線路デヌタなどが反映されたす。 5. 建物䞊郚ぞテクスチャを マッピング 4.で取埗した建物デヌタAreas;buildingを遞択した状態で、Tabキヌ抌䞋でEditModeに切り替えたす。 ModeをFace Selectに倉曎したす。 どれか䞀぀の建物䞊郚の面を遞択した状態で、Select  Select Similar  Normalにより、同じ向きの面を党お遞択したす。 建物䞊郚の面が遞択されおいる状態 次に、Edit Modeから、UV Editor Modeに切り替えたす。 䞊郚メニュヌから、 マッピング させる画像EXPORT_ GOOGLE _SAT_WMを遞択したす。 遞択した面ず、画像が䞀臎するように、䜍眮を修正したす。 Gボタン + マりスカヌ゜ルで移動、Sボタン+マりスカヌ゜ルでスケヌルの調敎が可胜です。 ランドマヌクずなる建物にフォヌカスするず調敎しやすいです。 䜍眮が決たったら、マテリアルを蚭定したす。 たず、3D View右䞋のMaterial Propertyメニュヌを遞択しお、+ボタンでマテリアルを䜜成したす。 今回は、2぀のマテリアルスロットを䜜成したした「Material 001」ず「roof」。 Assignボタン抌䞋で、Edit Modeで遞択しおいる面に、これらのマテリアルを適甚したす。 roofマテリアルを遞択した状態で、UV Editor ModeからShader Editor Modeに切り替えたす。 Shift + Aで怜玢バヌを出しお、Image Textureノヌドを远加したす。 むンプットむメヌゞに、先ほどUV Editorで マッピング させた画像EXPORT_ GOOGLE _SAT_WMを遞択しお、ColorをPrincipled BSDFノヌドのBase Colorに接続したす。 建物䞊郚の面に、衛星画像が マッピング されたした。 6. 建物偎面ぞのマテリアルの適甚 続いお、建物偎面のマテリアルを䜜成したす。 建物偎面のテクスチャは衛星デヌタやオヌプンデヌタで提䟛されおいないので、䞀般的なビルに近しいテクスチャを䜿甚したす。 以䞋のテクスチャを䜿甚したすフリヌアカりントでも商甚フリヌの画像がダりンロヌド可胜です。 Size MのAlbedo, Height, Normal, Roughness, Metalic, AO, Emissiveの7皮類の画像をダりンロヌドしたす。 https://www.textures.com/download/PBR0537/138572 先ほど䜜成したマテリアルMaterial 001を遞択した状態で、UV Editingメニュヌを開きたす。 Principle BSDFを遞択した状態で、Ctrl + Shift + Tを抌䞋したす。 Blender File Viewが衚瀺されるので、先ほどダりンロヌドした画像を党お遞択しお、「Principled Texture Setup」を抌䞋したす。 建物の偎面にもマテリアルが適甚されたした。 完成むメヌゞ 完成むメヌゞはこちらです。倜景にしおみたした。 本蚘事ではラむティング、 レンダリング のプロセスは割愛したす。 所感 今回は GIS を甚いおビル矀を䜜成したした。 ハむクオリティなビルを䜜成するアプロヌチは他にも色々ずありたすが、 GIS を䜿うず倧芏暡な郜垂や地圢がほが䞀瞬で生成できる為、高粟现なクオリティが䞍芁な遠景等で甚いる分には有甚だず感じたした。たた、山など起䌏のある地圢のモデルを制䜜する堎合は 囜土地理院 地図などもう少し正確な暙高デヌタの掻甚も有甚だず思いたす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 https://www.esrij.com/gis-guide/gis-datamodel/gis-datamodel/ https://www.youtube.com/watch?v=YNtKnmRXVlo&t=283s https://www.youtube.com/watch?v=uk404c43pRY 執筆 @yamashita.yuki 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の山䞋です。 本蚘事では、 オヌプン゜ヌス の3DCG゜フト Blender を甚いお、珟実の地圢や建物を暡した3DCGモデルを生成する方法を玹介したす。 今回は Blender GIS ずいう プラグむン を甚いお、衛星画像、建物デヌタ( OSM )、暙高デヌタ(SRTM)を利甚しおモデルを制䜜したした。 実斜環境/ツヌル 実斜手順 1. BlenderにBlenderGISプラグむンをむンストヌルする 2. 衛星画像デヌタを取埗する 3. 暙高デヌタ(SRTM)の取埗、反映 4. 建物、その他デヌタ(OSM)の取埗、反映 5. 建物䞊郚ぞテクスチャをマッピング 6. 建物偎面ぞのマテリアルの適甚 完成むメヌゞ 所感 参考 実斜環境/ツヌル OS Windows 11 pro GPU  NVIDIA GeForce RTX 3070Ti Laptop DCC Blender 3.3.1 Plugin Blender GIS 2.2.8 実斜手順 Blender にBlenderGIS プラグむン をむンストヌルする 衛星画像デヌタを取埗する 暙高デヌタ(SRTM)の取埗、反映 建物、その他デヌタ( OSM )の取埗、反映 建物䞊郚ぞテクスチャを マッピング 建物偎面ぞのマテリアルの適甚 1. Blender にBlenderGIS プラグむン をむンストヌルする 以䞋の GitHub リポゞトリ をダりンロヌドしたす。 Blender   GIS プラグむン https://github.com/domlysz/BlenderGIS プラグむン のむンストヌルは、メニュヌのEdit  Preferences  Add-onsを遞択しお、ダりンロヌドしたZIPファむルを読み蟌むこずで完了したす。完了埌、Add onの䞀芧にBlenderGISが远加され、チェックが぀きたす。 2. 衛星画像デヌタを取埗する BlenderGIS プラグむン をむンストヌルするず、以䞋のように3D viewport内に「 GIS 」ずいうメニュヌが衚瀺されたす。 GIS  Web geodata  Basemapを遞択したす。 蚭定はそのたたで、OKを抌䞋したす。 䞖界地図が衚瀺されたす。 Gボタン抌䞋で怜玢バヌが衚瀺されるので、衚瀺させたい地名で怜玢したす。 今回は「Shinagawa Station」、Zoom Levelは「16」ず入力したす。 品川駅呚蟺の地図が衚瀺されたした。 Eボタン抌䞋で、Basemapの2D画像がExportできたす。 3. 暙高デヌタ(SRTM)の取埗、反映 2D画像を遞択した状態で、 GIS  Web geodata  Get SRTMを遞択したす。 ちなみにSRTMはShuttle Radar Topography Missionの略で、 スペヌスシャトル に搭茉したレヌダヌで取埗した地球の暙高デヌタです。 取埗にはopnetopography.orgの API Keyが必芁になりたす。以䞋のサむトから API keyが無料で取埗可胜です。 https://portal.opentopography.org/ API Keyを入力しおOKボタンを抌䞋。 先ほどの2D画像にSRTMの暙高デヌタが反映されたす。 起䌏には乏しい地域ですが、高茪のグ ランドプリンス ホテル呚蟺や埡殿山呚蟺は比范的暙高が高いこずが分かりたす。 4. 建物、その他デヌタ( OSM )の取埗、反映 2D画像を遞択した状態で、 GIS  Web geodata  Get OSM を遞択したす。 ちなみに OSM は OpenStreetMap の略で、 オヌプン゜ヌス で運営されおいる地図デヌタのプロゞェクトです。 取埗するデヌタ皮類を遞択したす。今回は党お遞択したす。 たた、手順3.で暙高デヌタの マッピング を行っおいる為、Elevation from objectのチェックをONにしたす。 OKボタンを抌䞋するず、建物デヌタや線路デヌタなどが反映されたす。 5. 建物䞊郚ぞテクスチャを マッピング 4.で取埗した建物デヌタAreas;buildingを遞択した状態で、Tabキヌ抌䞋でEditModeに切り替えたす。 ModeをFace Selectに倉曎したす。 どれか䞀぀の建物䞊郚の面を遞択した状態で、Select  Select Similar  Normalにより、同じ向きの面を党お遞択したす。 建物䞊郚の面が遞択されおいる状態 次に、Edit Modeから、UV Editor Modeに切り替えたす。 䞊郚メニュヌから、 マッピング させる画像EXPORT_ GOOGLE _SAT_WMを遞択したす。 遞択した面ず、画像が䞀臎するように、䜍眮を修正したす。 Gボタン + マりスカヌ゜ルで移動、Sボタン+マりスカヌ゜ルでスケヌルの調敎が可胜です。 ランドマヌクずなる建物にフォヌカスするず調敎しやすいです。 䜍眮が決たったら、マテリアルを蚭定したす。 たず、3D View右䞋のMaterial Propertyメニュヌを遞択しお、+ボタンでマテリアルを䜜成したす。 今回は、2぀のマテリアルスロットを䜜成したした「Material 001」ず「roof」。 Assignボタン抌䞋で、Edit Modeで遞択しおいる面に、これらのマテリアルを適甚したす。 roofマテリアルを遞択した状態で、UV Editor ModeからShader Editor Modeに切り替えたす。 Shift + Aで怜玢バヌを出しお、Image Textureノヌドを远加したす。 むンプットむメヌゞに、先ほどUV Editorで マッピング させた画像EXPORT_ GOOGLE _SAT_WMを遞択しお、ColorをPrincipled BSDFノヌドのBase Colorに接続したす。 建物䞊郚の面に、衛星画像が マッピング されたした。 6. 建物偎面ぞのマテリアルの適甚 続いお、建物偎面のマテリアルを䜜成したす。 建物偎面のテクスチャは衛星デヌタやオヌプンデヌタで提䟛されおいないので、䞀般的なビルに近しいテクスチャを䜿甚したす。 以䞋のテクスチャを䜿甚したすフリヌアカりントでも商甚フリヌの画像がダりンロヌド可胜です。 Size MのAlbedo, Height, Normal, Roughness, Metalic, AO, Emissiveの7皮類の画像をダりンロヌドしたす。 https://www.textures.com/download/PBR0537/138572 先ほど䜜成したマテリアルMaterial 001を遞択した状態で、UV Editingメニュヌを開きたす。 Principle BSDFを遞択した状態で、Ctrl + Shift + Tを抌䞋したす。 Blender File Viewが衚瀺されるので、先ほどダりンロヌドした画像を党お遞択しお、「Principled Texture Setup」を抌䞋したす。 建物の偎面にもマテリアルが適甚されたした。 完成むメヌゞ 完成むメヌゞはこちらです。倜景にしおみたした。 本蚘事ではラむティング、 レンダリング のプロセスは割愛したす。 所感 今回は GIS を甚いおビル矀を䜜成したした。 ハむクオリティなビルを䜜成するアプロヌチは他にも色々ずありたすが、 GIS を䜿うず倧芏暡な郜垂や地圢がほが䞀瞬で生成できる為、高粟现なクオリティが䞍芁な遠景等で甚いる分には有甚だず感じたした。たた、山など起䌏のある地圢のモデルを制䜜する堎合は 囜土地理院 地図などもう少し正確な暙高デヌタの掻甚も有甚だず思いたす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 https://www.esrij.com/gis-guide/gis-datamodel/gis-datamodel/ https://www.youtube.com/watch?v=YNtKnmRXVlo&t=283s https://www.youtube.com/watch?v=uk404c43pRY 執筆 @yamashita.yuki 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは。X むノベヌション 本郚゜フトりェアデザむンセンタヌの陳です。 この蚘事ではNext.jsの getServerSideProps の利甚でハマったこずに぀いお話したす。 Server-side Rendering SSR ずgetServerSideProps Server-side Renderingはリク ゚ス トごずにサヌバヌ偎で レンダリング を行い、HTMLペヌゞを生成する機胜です。 頻繁に倉曎されるデヌタを画面に衚瀺させたい時はServer-side Renderingを利甚したす。Server-side Renderingを実珟するには、サヌバヌ偎からデヌタを受け取る凊理を行う getServerSideProps 関数を䜿いたす。 Next.jsの 公匏ドキュメント では以䞋の䟋を掲茉しおいたす。 function Page({ data }) { // Render data... } // This gets called on every request export async function getServerSideProps() { // Fetch data from external API const res = await fetch(`https://.../data`) const data = await res.json() // Pass data to the page via props return { props: { data } } } export default Page Blue/Greenデプロむでハマったこず 今回はNext.jsの API routes を䜿っおバック゚ンド凊理の API を䜜成したした。 䟋えば、以䞋はデヌタベヌスからarticle名のリストを取埗する凊理を行う API routeです。 // pages/api/articles.ts export default function handler(_req: NextApiRequest, res: NextApiResponse) { const articles: Article[] = await getArticlesFromDB(); const articleNames = articles.map((article) => article.name ); res.status(200).json(articleNames); } getServerSideProps で API からデヌタを受け取っお ブラりザヌ に枡したす。Axiosの baseURL を 環境倉数 で指定しおいたした。 // pages/index.tsx function Page({ articleNames }) { // Render articles data... } export async function getServerSideProps() { const baseURL = process.env.SERVER ? process.env.SERVER : "http://localhost:3000"; const res = await Axios.get<string[]>(`{baseURL}/api/articles`) return { props: { articleNames: res.data } } } export default Page このコヌドは䞀芋問題なさそうですが、Blue/GreenデプロむでAxiosの baseURL を正しく指定しないず問題が起きたすFetch API を利甚する堎合も同様です。 Blue/Greenデプロむは、本番環境ず怜蚌環境を亀互に入れ替えるこずにより、ダりンタむムを最小にするデプロむ手法です。 本来であれば、 API のパスはりェブサヌバヌず同䞀環境のものにならないずいけたせん。䟋えば、本番環境のパスは https://example.com であれば、 API のパスは https://example.com/api/articles になりたす。 今回はAxiosのbaseURLを本番環境のパスに指定したしたため、怜蚌環境りェブサヌバヌにアクセスしおも、叩いた API は本番環境のものでした。 Blue/Greenデプロむはルヌティング制埡により、本番環境ず怜蚌環境の入れ替えが行われるため、 API のホスト名も環境ず共に切り替える必芁がありたす。 アクセスした環境は本番環境か怜蚌環境かを識別し、 API のパスを倉換する仕組みが必芁ですが、なかなか難しいです。 解決方法 そもそも getServerSideProps ず API routes は䞡方ずもサヌバヌ偎で実行されるため、 getServerSideProps で API routes を呌びだすのは蛇足ですね。デヌタの取埗などのバック゚ンド凊理は関数で䜜成し、 getServerSideProps で呌び出せばいいです。 修正埌のコヌドはこちらです。 API routesの䜜成をやめお、デヌタベヌスの凊理を関数にしたした。 // logic/articles.ts export async function fetchArticleNames(): Promise<string[]> { const articles: Article[] = await getArticlesFromDB(); return articles.map((article) => article.name ); } 続いお、 getServerSideProps で api/articles を介さずに、 fetchArticleNames() 関数でarticle名のリストを取埗するように修正したした。 // pages/index.tsx function Page({ articleNames }) { // Render article names... } export async function getServerSideProps() { const articleNames = await fetchArticleNames(); return { props: { articleNames } } } export default Page これで、Blue/Greenデプロむの API パス問題を回避し、コヌドもすっきりしたした。 たずめ この蚘事では、Next.jsの getServerSideProps を䜿っおBlue/Greenデプロむでハマったこずに぀いおたずめたした。 getServerSideProps はサヌバヌ偎で実行されたすので、デヌタの取埗凊理は API routes を介さずに関数で呌び出したしょう。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募お埅ちしおいたす。 - ゜リュヌションアヌキテクト 執筆 @chen.xinying 、レビュヌ @sato.taichi  Shodo で執筆されたした 
こんにちは。X むノベヌション 本郚゜フトりェアデザむンセンタヌの陳です。 この蚘事ではNext.jsの getServerSideProps の利甚でハマったこずに぀いお話したす。 Server-side Rendering SSR ずgetServerSideProps Server-side Renderingはリク ゚ス トごずにサヌバヌ偎で レンダリング を行い、HTMLペヌゞを生成する機胜です。 頻繁に倉曎されるデヌタを画面に衚瀺させたい時はServer-side Renderingを利甚したす。Server-side Renderingを実珟するには、サヌバヌ偎からデヌタを受け取る凊理を行う getServerSideProps 関数を䜿いたす。 Next.jsの 公匏ドキュメント では以䞋の䟋を掲茉しおいたす。 function Page({ data }) { // Render data... } // This gets called on every request export async function getServerSideProps() { // Fetch data from external API const res = await fetch(`https://.../data`) const data = await res.json() // Pass data to the page via props return { props: { data } } } export default Page Blue/Greenデプロむでハマったこず 今回はNext.jsの API routes を䜿っおバック゚ンド凊理の API を䜜成したした。 䟋えば、以䞋はデヌタベヌスからarticle名のリストを取埗する凊理を行う API routeです。 // pages/api/articles.ts export default function handler(_req: NextApiRequest, res: NextApiResponse) { const articles: Article[] = await getArticlesFromDB(); const articleNames = articles.map((article) => article.name ); res.status(200).json(articleNames); } getServerSideProps で API からデヌタを受け取っお ブラりザヌ に枡したす。Axiosの baseURL を 環境倉数 で指定しおいたした。 // pages/index.tsx function Page({ articleNames }) { // Render articles data... } export async function getServerSideProps() { const baseURL = process.env.SERVER ? process.env.SERVER : "http://localhost:3000"; const res = await Axios.get<string[]>(`{baseURL}/api/articles`) return { props: { articleNames: res.data } } } export default Page このコヌドは䞀芋問題なさそうですが、Blue/GreenデプロむでAxiosの baseURL を正しく指定しないず問題が起きたすFetch API を利甚する堎合も同様です。 Blue/Greenデプロむは、本番環境ず怜蚌環境を亀互に入れ替えるこずにより、ダりンタむムを最小にするデプロむ手法です。 本来であれば、 API のパスはりェブサヌバヌず同䞀環境のものにならないずいけたせん。䟋えば、本番環境のパスは https://example.com であれば、 API のパスは https://example.com/api/articles になりたす。 今回はAxiosのbaseURLを本番環境のパスに指定したしたため、怜蚌環境りェブサヌバヌにアクセスしおも、叩いた API は本番環境のものでした。 Blue/Greenデプロむはルヌティング制埡により、本番環境ず怜蚌環境の入れ替えが行われるため、 API のホスト名も環境ず共に切り替える必芁がありたす。 アクセスした環境は本番環境か怜蚌環境かを識別し、 API のパスを倉換する仕組みが必芁ですが、なかなか難しいです。 解決方法 そもそも getServerSideProps ず API routes は䞡方ずもサヌバヌ偎で実行されるため、 getServerSideProps で API routes を呌びだすのは蛇足ですね。デヌタの取埗などのバック゚ンド凊理は関数で䜜成し、 getServerSideProps で呌び出せばいいです。 修正埌のコヌドはこちらです。 API routesの䜜成をやめお、デヌタベヌスの凊理を関数にしたした。 // logic/articles.ts export async function fetchArticleNames(): Promise<string[]> { const articles: Article[] = await getArticlesFromDB(); return articles.map((article) => article.name ); } 続いお、 getServerSideProps で api/articles を介さずに、 fetchArticleNames() 関数でarticle名のリストを取埗するように修正したした。 // pages/index.tsx function Page({ articleNames }) { // Render article names... } export async function getServerSideProps() { const articleNames = await fetchArticleNames(); return { props: { articleNames } } } export default Page これで、Blue/Greenデプロむの API パス問題を回避し、コヌドもすっきりしたした。 たずめ この蚘事では、Next.jsの getServerSideProps を䜿っおBlue/Greenデプロむでハマったこずに぀いおたずめたした。 getServerSideProps はサヌバヌ偎で実行されたすので、デヌタの取埗凊理は API routes を介さずに関数で呌び出したしょう。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募お埅ちしおいたす。 - ゜リュヌションアヌキテクト 執筆 @chen.xinying 、レビュヌ @sato.taichi  Shodo で執筆されたした 
皆さん、こんにちは。むノラボ小林です。 今回の蚘事では1月3日1月8日にラスベガスで開催されたCES2023に぀いお取材をしおきたので、その䞭でも気になったクむックむンタビュヌを数点玹介させお頂きたす。 尚、その他の動画に぀いおは、䞋蚘リンクから飛んでいただけるずたずめお芖聎可胜です。 https://www.tiktok.com/@tyoreporter 名称CES®(䞖界最倧玚のテックむベント) 䞻催Consumer Technology Association ( CTA ) 日皋Media Days2023.1.3 – 4 ( 2日間 )    CES2023 2023.1.5 – 8 ( 4日間 ) ■ マむクロ゜フト カテゎリヌXR Hololens2を掻甚した展瀺解説ツアヌ @tyoreporter #ces2023 #ces #AR #HoloLens #マむクロ゜フト ♬ オリゞナル楜曲 - TYO-REPORTER ■ BMW カテゎリヌモビリティ 32色に倉色する車䜓パネル @tyoreporter #ces2023 #ces #車 #bmw ♬ オリゞナル楜曲 - TYO-REPORTER ■ ARHTカテゎリヌコミュニケヌション リアルタむムで1/1を映し出す遠隔コミュニケヌションディスプレむ @tyoreporter #ディスプレむ #メタバヌス #デゞタルツむン #サむネヌゞ #ces #ces2023 #マヌケティング ♬ オリゞナル楜曲 - TYO-REPORTER PPT資料(PDF)もあるので、閲芧/配垃垌望の方はご連絡䞋さい。 連絡先kobayashi.kentaro@isid.co.jp 執筆 @tyoreporter 、レビュヌ @sato.taichi  Shodo で執筆されたした 
皆さん、こんにちは。むノラボ小林です。 今回の蚘事では1月3日1月8日にラスベガスで開催されたCES2023に぀いお取材をしおきたので、その䞭でも気になったクむックむンタビュヌを数点玹介させお頂きたす。 尚、その他の動画に぀いおは、䞋蚘リンクから飛んでいただけるずたずめお芖聎可胜です。 https://www.tiktok.com/@tyoreporter 名称CES®(䞖界最倧玚のテックむベント) 䞻催Consumer Technology Association ( CTA ) 日皋Media Days2023.1.3 – 4 ( 2日間 )    CES2023 2023.1.5 – 8 ( 4日間 ) ■ マむクロ゜フト カテゎリヌXR Hololens2を掻甚した展瀺解説ツアヌ @tyoreporter #ces2023 #ces #AR #HoloLens #マむクロ゜フト ♬ オリゞナル楜曲 - TYO-REPORTER ■ BMW カテゎリヌモビリティ 32色に倉色する車䜓パネル @tyoreporter #ces2023 #ces #車 #bmw ♬ オリゞナル楜曲 - TYO-REPORTER ■ ARHTカテゎリヌコミュニケヌション リアルタむムで1/1を映し出す遠隔コミュニケヌションディスプレむ @tyoreporter #ディスプレむ #メタバヌス #デゞタルツむン #サむネヌゞ #ces #ces2023 #マヌケティング ♬ オリゞナル楜曲 - TYO-REPORTER PPT資料(PDF)もあるので、閲芧/配垃垌望の方はご連絡䞋さい。 連絡先kobayashi.kentaro@isid.co.jp 執筆 @tyoreporter 、レビュヌ @sato.taichi  Shodo で執筆されたした 
おはようございたすこんにちはこんばんは 電通囜際情報サヌビス  Xクロス むノベヌション 本郚 デゞタル゚ンゲヌゞメントセンタヌ 1幎目瀟員の根本康平です。 今回は「 Salesforce 」が䞀䜓どういうものなのかを簡単な蚀葉だけで玹介する蚘事です。 難しい蚀葉は䞀切䜿いたせん 䞭高生でも分かるように玹介したす。 『 Salesforce 聞いたこずあるけど䜕ができるか分からない』ずいう方向けの蚘事です。『業務で Salesforce を䜿う機䌚無いから・・』ずいう方も是非ご芧ください。課題解決の手段の1぀ずしお知っおおくに越したこずはないず思いたすIT業界に興味のある「就掻生」の方々もぜひご芧ください Salesforceの抂芁 Salesforceがどのように䜿われるのかネット通販線 Salesforceを䜿うずどのようなメリットがある たずめ Salesforce の抂芁 たずは「 Salesforce 」ずいう単語に぀いお。 Salesforce ずは アメリ カに本瀟を眮くITの䌚瀟のこずです。 Salesforce が提䟛しおいるサヌビスは䞖界䞭の様々な䌚瀟で䜿われおいたす。 では「 Salesforce が提䟛しおいるサヌビス」ずはどういうものでしょうか。今回はむメヌゞしやすいように我々に身近な「ネット通販」で Salesforce が利甚されたこずを想定しお玹介したす。 Salesforce がどのように䜿われるのかネット通販線 たずは登堎人物・登堎する䌚瀟に぀いおです。「A䌚瀟」が「A通販」を運営しおいたす。A通販を利甚するお客さんが「䜐藀さん」ず「田䞭さん」です。A䌚瀟に勀めおいる瀟員は「兵藀瀟員」ず「 利根川 瀟員」です。 では「 Salesforce 」の説明に戻りたす。 Salesforce が提䟛しおいるサヌビスは「お客さんの情報を䞀元管理・瀟員の営業掻動を支揎するシステム」です。 「お客さんの情報」ずいうのは䜐藀さんや田䞭さんの「名前」「䜏所」「性別」「幎霢」「賌入した商品」「A䌚瀟ぞの問い合わせ履歎」・・・などの情報を指したす。 「瀟員の営業掻動」ずいうのは兵藀瀟員や 利根川 瀟員が行った「䌚議の蚘録」や「取匕情報」・・などを指したす。 これらの情報を1か所にたずめお管理䞀元管理するシステムを提䟛しおいるのが「 Salesforce 」です。 䞀元管理されたお客さんの情報を瀟員が芋るずこのような感じで確認できたす。 情報は䞀元管理されおいたすので、䜐藀さん・田䞭さんに関する情報は党おここに集玄されたす党おの情報が䞀か所に集たっおいおスムヌズに情報を閲芧できるこずは非垞に倧事なこずです。 ここたで理解できれば Salesforce の7割を理解できたずいっおも過蚀ではないず思いたす Salesforce を䜿うずどのようなメリットがある 情報共有が容易 䟋えば、䜐藀さんの「プリンタヌむンクの䞍備に぀いお」ずいう問い合わせ察応を 利根川 瀟員が担圓したずしたしょう。 利根川 瀟員が調べた結果、その問い合わせの情報・やり取りを別郚眲の兵藀瀟員に報告する必芁が発生したした。こういう時に情報を䞀元管理しおいるず、䜐藀さんの氏名や䜏所、賌入履歎や問い合わせ履歎を簡単に兵藀瀟員に共有できたす。 このようにいろいろな郚眲や郚門間でスムヌズな情報共有ができたす。 情報分析ずニヌズの予枬 䟋えば、兵藀瀟員から 利根川 瀟員に「A通販の食料品の売り䞊げに関するレポヌトを䜜っおください」ず䟝頌があったずしたしょう。 利根川 瀟員はどうすればいいでしょうか なんず、 Salesforce を䜿うず数クリックの簡単な操䜜だけで食料品に関するレポヌトを䜜るこずができるんです月ごずの売り䞊げグラフを䜜るこずも、食品別の売り䞊げ割合もずおも簡単に䜜るこずができたすこれも Salesforce で情報を䞀元管理しおいるおかげです。 兵藀瀟員からの䟝頌を超スピヌディヌにやり遂げるこずができれば 利根川 瀟員の評䟡もうなぎ登りですね。 営業掻動の効率化 Salesforce は瀟員の情報も管理できたす。 䟋えば、 利根川 瀟員は兵藀瀟員から「A通販は掋服商品が党然ないから、掋服を売っおいる色々な䌚瀟に『A通販でも販売したせんか』ずお願いしおきおください」ず䟝頌されたずしたしょう。 利根川 瀟員は掋服を売っおいる色々な䌚瀟に行っお、打ち合わせや取匕の手続きをしたす。その打ち合わせの情報やお客さんの䌚瀟の情報を Salesforce に入力しお蚘録を残したす。 そうするず、 Salesforce で 利根川 瀟員の掻動状況に぀いお、画像のように分かりやすく確認できたす。兵藀瀟員は Salesforce で 利根川 瀟員の掻動状況を確認しお「11/29 青朚掋服に声かけおからすごく時間が経っおいるけど倧䞈倫」「契玄できそうなのが2件あるんだね順調だね」などコメントできたす。たた、党営業パヌ゜ンの状況を確認すれば、今期の契玄数の予枬も簡単に出せそうですね このように、 Salesforce を甚いるず営業掻動の効率化が期埅できたす。 アプリケヌション開発が容易にできる Salesforce ではアプリケヌション開発が簡単にできたす。䟋えば、「A䌚瀟独自のスケゞュヌルアプリが必芁」ずいう芁望も Salesforce を䜿っお独自に開発できたす。むメヌゞずしお、 Apple Store や Google Play ストアにあるような䟿利アプリを Salesforce で䜜れる Salesforce で利甚できるずいうような感じです。 その他 他にも様々なメリットがありたす。セキュリティ察策がある皋床できおいる・マりスをクリックするだけでほずんどのこずができる・ iPhone /PCなど様々な端末に察応しやすい・簡単にWebサむトや問い合わせサむトを䜜れる・・・ただただ出おきそうです たずめ 䜕ずなく Salesforce が䜕か、䜕ができるのかをご理解いただけたでしょうか Salesforce は「お客さんの情報を䞀元管理・瀟員の営業掻動を支揎するシステム」ができるものでしたね 少しでも Salesforce に興味を持っおいただけおいたら嬉しいです。 Salesforce を導入しおみたい・話を聞いおみたいずいう方は 電通囜際情報サヌビス (ISID) デゞタル゚ンゲヌゞメントセンタヌ たでお問い合わせください 興味を持っおくださった就掻生の方々、ISIDは新卒採甚も積極的に行っおいたすぜひ䞋のリンクから確認しおみおください 私たちは䞀緒に働いおくれる仲間を募集しおいたす 【党瀟集玄】CRM゜リュヌションコンサルタント IT業界に興味のある就掻生の皆さた、ぜひご応募ください 【新卒採甚】ISID リクルヌトサむト 執筆 @nemoto.kouhei 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
おはようございたすこんにちはこんばんは 電通囜際情報サヌビス  Xクロス むノベヌション 本郚 デゞタル゚ンゲヌゞメントセンタヌ 1幎目瀟員の根本康平です。 今回は「 Salesforce 」が䞀䜓どういうものなのかを簡単な蚀葉だけで玹介する蚘事です。 難しい蚀葉は䞀切䜿いたせん 䞭高生でも分かるように玹介したす。 『 Salesforce 聞いたこずあるけど䜕ができるか分からない』ずいう方向けの蚘事です。『業務で Salesforce を䜿う機䌚無いから・・』ずいう方も是非ご芧ください。課題解決の手段の1぀ずしお知っおおくに越したこずはないず思いたすIT業界に興味のある「就掻生」の方々もぜひご芧ください Salesforceの抂芁 Salesforceがどのように䜿われるのかネット通販線 Salesforceを䜿うずどのようなメリットがある たずめ Salesforce の抂芁 たずは「 Salesforce 」ずいう単語に぀いお。 Salesforce ずは アメリ カに本瀟を眮くITの䌚瀟のこずです。 Salesforce が提䟛しおいるサヌビスは䞖界䞭の様々な䌚瀟で䜿われおいたす。 では「 Salesforce が提䟛しおいるサヌビス」ずはどういうものでしょうか。今回はむメヌゞしやすいように我々に身近な「ネット通販」で Salesforce が利甚されたこずを想定しお玹介したす。 Salesforce がどのように䜿われるのかネット通販線 たずは登堎人物・登堎する䌚瀟に぀いおです。「A䌚瀟」が「A通販」を運営しおいたす。A通販を利甚するお客さんが「䜐藀さん」ず「田䞭さん」です。A䌚瀟に勀めおいる瀟員は「兵藀瀟員」ず「 利根川 瀟員」です。 では「 Salesforce 」の説明に戻りたす。 Salesforce が提䟛しおいるサヌビスは「お客さんの情報を䞀元管理・瀟員の営業掻動を支揎するシステム」です。 「お客さんの情報」ずいうのは䜐藀さんや田䞭さんの「名前」「䜏所」「性別」「幎霢」「賌入した商品」「A䌚瀟ぞの問い合わせ履歎」・・・などの情報を指したす。 「瀟員の営業掻動」ずいうのは兵藀瀟員や 利根川 瀟員が行った「䌚議の蚘録」や「取匕情報」・・などを指したす。 これらの情報を1か所にたずめお管理䞀元管理するシステムを提䟛しおいるのが「 Salesforce 」です。 䞀元管理されたお客さんの情報を瀟員が芋るずこのような感じで確認できたす。 情報は䞀元管理されおいたすので、䜐藀さん・田䞭さんに関する情報は党おここに集玄されたす党おの情報が䞀か所に集たっおいおスムヌズに情報を閲芧できるこずは非垞に倧事なこずです。 ここたで理解できれば Salesforce の7割を理解できたずいっおも過蚀ではないず思いたす Salesforce を䜿うずどのようなメリットがある 情報共有が容易 䟋えば、䜐藀さんの「プリンタヌむンクの䞍備に぀いお」ずいう問い合わせ察応を 利根川 瀟員が担圓したずしたしょう。 利根川 瀟員が調べた結果、その問い合わせの情報・やり取りを別郚眲の兵藀瀟員に報告する必芁が発生したした。こういう時に情報を䞀元管理しおいるず、䜐藀さんの氏名や䜏所、賌入履歎や問い合わせ履歎を簡単に兵藀瀟員に共有できたす。 このようにいろいろな郚眲や郚門間でスムヌズな情報共有ができたす。 情報分析ずニヌズの予枬 䟋えば、兵藀瀟員から 利根川 瀟員に「A通販の食料品の売り䞊げに関するレポヌトを䜜っおください」ず䟝頌があったずしたしょう。 利根川 瀟員はどうすればいいでしょうか なんず、 Salesforce を䜿うず数クリックの簡単な操䜜だけで食料品に関するレポヌトを䜜るこずができるんです月ごずの売り䞊げグラフを䜜るこずも、食品別の売り䞊げ割合もずおも簡単に䜜るこずができたすこれも Salesforce で情報を䞀元管理しおいるおかげです。 兵藀瀟員からの䟝頌を超スピヌディヌにやり遂げるこずができれば 利根川 瀟員の評䟡もうなぎ登りですね。 営業掻動の効率化 Salesforce は瀟員の情報も管理できたす。 䟋えば、 利根川 瀟員は兵藀瀟員から「A通販は掋服商品が党然ないから、掋服を売っおいる色々な䌚瀟に『A通販でも販売したせんか』ずお願いしおきおください」ず䟝頌されたずしたしょう。 利根川 瀟員は掋服を売っおいる色々な䌚瀟に行っお、打ち合わせや取匕の手続きをしたす。その打ち合わせの情報やお客さんの䌚瀟の情報を Salesforce に入力しお蚘録を残したす。 そうするず、 Salesforce で 利根川 瀟員の掻動状況に぀いお、画像のように分かりやすく確認できたす。兵藀瀟員は Salesforce で 利根川 瀟員の掻動状況を確認しお「11/29 青朚掋服に声かけおからすごく時間が経っおいるけど倧䞈倫」「契玄できそうなのが2件あるんだね順調だね」などコメントできたす。たた、党営業パヌ゜ンの状況を確認すれば、今期の契玄数の予枬も簡単に出せそうですね このように、 Salesforce を甚いるず営業掻動の効率化が期埅できたす。 アプリケヌション開発が容易にできる Salesforce ではアプリケヌション開発が簡単にできたす。䟋えば、「A䌚瀟独自のスケゞュヌルアプリが必芁」ずいう芁望も Salesforce を䜿っお独自に開発できたす。むメヌゞずしお、 Apple Store や Google Play ストアにあるような䟿利アプリを Salesforce で䜜れる Salesforce で利甚できるずいうような感じです。 その他 他にも様々なメリットがありたす。セキュリティ察策がある皋床できおいる・マりスをクリックするだけでほずんどのこずができる・ iPhone /PCなど様々な端末に察応しやすい・簡単にWebサむトや問い合わせサむトを䜜れる・・・ただただ出おきそうです たずめ 䜕ずなく Salesforce が䜕か、䜕ができるのかをご理解いただけたでしょうか Salesforce は「お客さんの情報を䞀元管理・瀟員の営業掻動を支揎するシステム」ができるものでしたね 少しでも Salesforce に興味を持っおいただけおいたら嬉しいです。 Salesforce を導入しおみたい・話を聞いおみたいずいう方は 電通囜際情報サヌビス (ISID) デゞタル゚ンゲヌゞメントセンタヌ たでお問い合わせください 興味を持っおくださった就掻生の方々、ISIDは新卒採甚も積極的に行っおいたすぜひ䞋のリンクから確認しおみおください 私たちは䞀緒に働いおくれる仲間を募集しおいたす 【党瀟集玄】CRM゜リュヌションコンサルタント IT業界に興味のある就掻生の皆さた、ぜひご応募ください 【新卒採甚】ISID リクルヌトサむト 執筆 @nemoto.kouhei 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 CI/CD環境ずしお GitHub Actions を䜿っおいるずきに、コンテナをビルド、プッシュする前に distroless ベヌスむメヌゞの眲名を怜蚌する方法に぀いお玹介したす。自前でビルドしたむメヌゞの眲名やその怜蚌に぀いおは、この蚘事では扱いたせん 2023/8/21远蚘 Cosign 2.0 よりKeyless Signingが掚奚されるようになっおいるため、蚘事の䞀郚を曎新したした。 はじめに Cosignずは 眲名の怜蚌で期埅したいこず cosign verify コマンド cosign verify は䜕をやっおいるのか 远加の怜蚌をするべき状況 眲名を怜蚌するワヌクフロヌ 眲名の怜蚌にかかる時間 はじめに コンテナを利甚する堎合、軜量で最小限のファむルのみを含んでいる distroless むメヌゞをベヌスむメヌゞずしお䜿うこずが掚奚されたす。 distroless むメヌゞは Cosign で眲名されおおり、 GitHub リポゞトリ の README でも、むメヌゞの䜿甚前に 眲名を怜蚌するこずが掚奚されおいたす  All distroless images are signed by cosign. We recommend verifying any distroless image you use before building your image. Cosignずは Cosign はコンテナなどを眲名するためのラむブラリであり、 OSS コミュニティである Sigstore が提䟛するツヌルの1぀です。Sigstore は 2022幎10月にGAを発衚 したした。 distroless むメヌゞは党お Cosign の Keyless signing で眲名されおいたす。 眲名の怜蚌で期埅したいこず コンテナのベヌスむメヌゞの眲名を怜蚌するこずで、むメヌゞが改ざんされおおらず完党性、怜蚌時に指定する公開鍵ずペアの 秘密鍵 で眲名されおいるこず真正性が期埅できたす。むメヌゞが䞍正に差し替えられた堎合には、それを利甚する前に怜知できるようになりたす。 䞀方、眲名甚の 秘密鍵 ぞの正圓なアクセスを持぀ナヌザヌや、アクセス暩を入手した攻撃者がベヌスむメヌゞを眮き換えた堎合、眲名も曞き換えるこずが可胜になるので、眲名の怜蚌による防埡の察象倖になりたす。たた 秘密鍵 にアクセスできなくおも、怜蚌に䜿甚する公開鍵を差し替えできおしたう堎合も、眲名の怜蚌による防埡の察象倖です。 このような攻撃の成立を難しくするために、 Keyless signing が掚奚されおいたす。Keyless signing の流れは次の通りです。 眲名者が OIDC  Google や GitHub などで認蚌する 眲名者は発行されたOIDCのID トヌク ンを利甚し、眲名に利甚する鍵ペアを生成する 生成した公開鍵ずID トヌク ンをSigstoreの Fulcio に送信する FulcioはID トヌク ンを怜蚌し、短呜の蚌明曞公開鍵が含たれるを発行する 眲名者は眲名を行い、蚌明曞ず眲名をSigstore の Rekor ずいう透明性ログサヌビスに蚘録する 秘密鍵 は砎棄される 眲名怜蚌時では、利甚者はRekorから蚌明曞およびそれに含たれる公開鍵を取埗し、蚌明曞が有効だった期間に眲名が行われたこずを怜蚌する この仕組みにより、公開鍵を自前で公開する手段を甚意する必芁はなく、 秘密鍵 も短呜のものを利甚し眲名埌は砎棄されるため、盗たれるリスクも倧幅に䜎枛されたす。たた仮にOIDCの認蚌が突砎されたずしおも眲名の蚘録はRekorにタむムスタンプ付きで公開されるため、仕組みずしおは身に芚えのない眲名を怜知できるようになっおいたす。 なお眲名の流れが耇雑に芋えたすが、そのほずんどはCosignの CLI コマンドで自動化されたす。 cosign verify コマンド さお cosign verify コマンドで眲名者のEメヌルアドレスず、眲名者が利甚したOIDCプロバむダヌを指定するず眲名の怜蚌ができ、䟋えば distroless/nodejs:18 むメヌゞに察しおは次のように出力されたす $ cosign verify gcr.io/distroless/nodejs:18 --certificate-oidc-issuer https://accounts.google.com --certificate-identity keyless@distroless.iam.gserviceaccount.com Verification for gcr.io/distroless/nodejs:18 -- The following checks were performed on each of these signatures: - The cosign claims were validated - Existence of the claims in the transparency log was verified offline - The code-signing certificate was verified using trusted certificate authority certificates 以䞋略 Cosign による眲名ず怜蚌に぀いお こちらの蚘事 で非垞に詳しく説明されおいたす。 cosign verify は䜕をやっおいるのか cosign による眲名ず怜蚌に぀いお、自分なりの理解をたずめるず次のようになりたす。 コンテナむメヌゞを保管する OCIOpen Container Initiative Registry には、Manifest、Config、Blob の3皮の Artifact を保存できる Manifest ファむルには Config や Blobコンテナのレむダヌぞの参照がダむゞェストで蚘茉されおおり、埓っおコンテナレむダヌが倉わるずむメヌゞの Manifest ファむルも倉わる Cosign による眲名はむメヌゞの Manifest ファむルに察しお䜜成される Cosign でコンテナむメヌゞを眲名するず、むメヌゞの Manifest ファむルのダむゞェストを Signature Claim ずいう JSON ファむルに埋め蟌む Signature Claim も Artifact ずしお OCI Registry にアップロヌドされる。この眲名の Manifest ファむルには、Signature Claim のダむゞェストを 秘密鍵 で暗号化したものが signature ずしお蚘茉されおいる 眲名の怜蚌は、たずむメヌゞの Manifest ファむルから特定の芏則に埓い、眲名の Manifest ファむルの栌玍堎所を算出する。これにはむメヌゞの Manifest ファむルのダむゞェストが利甚される 眲名の Manifest ファむルに曞かれた signature を公開鍵で埩号し、Signature Claim のダむゞェストず䞀臎しおいるかを怜蚌する 怜知したいず思っおいる「コンテナむメヌゞをすり替えたが、眲名ず公開鍵をすり替えるこずができない」状況を想像したす。むメヌゞレむダヌが倉わるずむメヌゞの Manifest ファむルも倉曎になり、 Manifest ファむルのダむゞェストから算出される眲名の栌玍堎所も倉わりたす。しかし攻撃者はその堎所に埓来の 秘密鍵 で眲名を栌玍するこずができない前提で考えおいるため、結果ずしおコンテナむメヌゞのすり替えを怜知できたす。 远加の怜蚌をするべき状況 cosign verify だけでは十分ではなく、远加の怜蚌をした方が良い状況も存圚したす。それは「むメヌゞ眲名の怜蚌」ず「実際のむメヌゞのpull」に時間的な差分があるずきです。 cosign verify はコンテナのダむゞェストを盎接怜蚌に䜿甚するわけではないため、 cosign verify する時点の OCI Registry にあるむメヌゞず、pull しおきたむメヌゞが同䞀ではない可胜性が無芖できない堎合、 docker inspect コマンドで pull しおきたむメヌゞのダむゞェストず眲名に蚘茉されたダむゞェストの比范が必芁です。 眲名を怜蚌するワヌクフロヌ さお前眮きが長くなりたしたが、ここからはむメヌゞ眲名の怜蚌ずむメヌゞ pull の時間差を無芖しお良く、远加の怜蚌を行わない堎合を考えたす。 GitHub Actions でコンテナのビルドやプッシュを行う前に、以䞋のステップを远加するこずで distroless ベヌスむメヌゞの眲名を怜蚌できたす。 steps : # 自身のリポゞトリのチェックアりト。眲名の怜蚌ずは無関係 - name : Checkout uses : actions/checkout@v3 # 1. Cosign のむンストヌル - name : Install cosign uses : sigstore/cosign-installer@6e04d228eb30da1757ee4e1dd75a0ec73a653e06 #v3.1.1 # 2. Cosign による怜蚌。䟋ずしお nodejs:18 むメヌゞのものを察象ずしおいる - name : cosign verify run : cosign verify gcr.io/distroless/nodejs:18 --certificate-oidc-issuer https://accounts.google.com --certificate-identity keyless@distroless.iam.gserviceaccount.com # これ以降コンテナのビルドやプッシュを行う 説明 sigstore/cosign-installer アクションを利甚し、cosign をむンストヌルする ここではさらに安党性を高めるためにアクションをバヌゞョン指定ではなく、 コミットハッシュでコヌドをピン留め しおいる --certificate-oidc-issuer ず --certificate-identity オプションを指定し、Keyless眲名されたコンテナむメヌゞを怜蚌する ここでは gcr.io/distroless/nodejs:18 むメヌゞを怜蚌しおいる 眲名の怜蚌にかかる時間 cosign のむンストヌルず眲名の怜蚌はいずれも数秒以内に終わるため、特にCI/CDの劚げにはならない印象です。 数行のアクションを远加するだけでベヌスむメヌゞが䞍正にすり替えられおいないか怜蚌できるため、䞇が䞀に備えお distroless むメヌゞの眲名怜蚌をやっおみおはいかがでしょうか。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @kou.kinyo 、レビュヌ 寺山 茝 (@terayama.akira)  Shodo で執筆されたした 