SlideShare una empresa de Scribd logo
1 de 55
Doom3コード解説
(イベントシステムとカスタム
        RTTI)
     @DADA246
自己紹介
• 名前:多田 航@DADA246

• ゲームプログラマやってます

• 得意分野 C++,C#,GPU,javascript,PHP
• 描画関係とかCIとか
自己紹介
• 海外ゲーム歴
PC9801版Test Driveが最初?
その後Doom、Diablo、StarCraft、 NetStorm
から始まり、今ではSteam、Origin、iPhone
で海外ゲームを遊んでいます

秋葉原で輸入ゲームも良く買ってます
アジェンダ
•   Doom3ゲーム概要
•   Doom3コード概要
•   idLib
•   エンティティ
•   カスタムRTTI
•   イベントシステム
•   まとめ
Doom3とは?
• id softwareが開発したFPS
• 2004/8発売
• マルチプラットフォーム(Windows、Mac、
  Linux)
• メインプログラマはJohn Carmack

• 2011/10にソースコードが公開された
https://github.com/TTimo/doom3.gpl
Doom3の特徴
•   狭い通路
•   懐中電灯と武器を切り替えるスタイル
•   ステンシルシャドウ
•   いくつかのカットシーン
•   スクリプトドリブンのレベルデザイン
• コンソールウィンドウによるパラメータ
  調整
→idの伝統
John Carmack
• id Software設立者の一人で、
  FPSの生みの親
• wolfenstein、Doom、Quake、
  Rageなど数々のゲームを開発

• id Softwareのゲームはほとん
  どJohn Carmackが一人で書い
  ていると言われている
Doom3のコードを読んでみる
• Visual Studioで開く
→neodoom.sln

• Visual Studio Expressでビルドするためにはコード
  からATLを外す必要がある
→チャレンジしてみましたがビルド出来ませんで
した…

• ソースコードはGPLでもテクスチャなどのリソー
  スは公開されていません。Doom3を買う必要が
  あります
コーディングスタイル
•   C++
•   stl、boostは不使用
•   例外、標準RTTIは不使用
•   シンプルなテンプレート

→2004年のコンパイラ事情や、John Carmackが書
いたコードということで、移植性と処理速度を
重視していると思われる(なにしろDoomを書いた
プログラマーであり…そもそもQuake3まではC言
語だった)
コーディングスタイル
• C++の基本を押さえた書き方
→constの徹底
→最低限のvirtual
→プリコンパイル済みヘッダー
→クラスの前方宣言

• レガシーな書き方も残っている
→変数宣言を関数の先頭で行っている
→名前空間を使っていない
全体構成
• Game
→機種共通コード。別
verとしてGame-d3xpが
ある

• DoomDll
→機種依存コード。
exeが出力されるのはコ
レ
idLib
• ゲームタイトルに依存しない処理を集めたラ
  イブラリ

•   エンディアンスワップ
•   色定義
•   タイマー
•   Key/value dictionary
•   ローカライズ用辞書
•   汎用ファイルフォーマット
idLib
• ハッシュ(CRC32,MD4,MD5)
• テキスト(CmdArgs,Base64)
• コンテナ(2分探索,btree,ハッシュテーブル,
  リスト,リンクリスト,キュー,スタック,文字
  列リスト, Vector Set …)
→STLの代わり
数学
• ベクトル
• 行列
• 角度
• クォオータニオン
• 複素数
• 乱数(線形合同法)
• Lcp(Box Constrained Mixed Linear Complementarity
  Problem solver)
• Polynormal(Polynomial of arbitrary degree with real
  coefficients)
ジオメトリ
•   DrawVert
•   JointTransform
•   Surface
•   Surface_Patch(Bezier patch surface)
•   Surface_Polytope(多面体)
•   Surface_SweptSpline
•   TraceModel(コリジョン用モデル)
•   Winding(任意凸形状)
•   Winding2D
ODE(常微分方程式)
• Euler法
• 4次のルンゲクッタ法
衝突形状
• AABB,OBB,視錐台,球
• operatorオーバーロードを活用したシンプ
  ルなコード
プリュッカー座標系
• a way to assign six homogenous coordinates
  to each line in projective 3-space(wikipedia)ら
  しいですが、詳細は理解していません。

• 衝突判定に6次元座標を使う?
SIMD
• Simd_GenericでC++の汎用実装をしつつ、一部
  関数をSIMDに置き換えている

•   以下の実装がある
•   3DNow!
•   AltiVec
•   MMX
•   SSE
•   SSE2
•   SSE3(2004年 Doom3発売年)
SIMD
• 処理負荷を計測する「テスト」が関数ご
  と用意されている

• 四則演算の他にTransformVertsなどの描画
  演算や、UpSamplePCMTo44kHzなどのサウ
  ンド処理が実装されている
アロケータ
• MemoryBlock
• DynamicAllocator
• ページアロケータ

→大きめのメモリ確保はページ単位
小さめのメモリ確保はメモリプール
(MemoryBlock)で行う
TypeInfoプロジェクト
• Type Info Generator
→NoGameTypeInfo.hを生成する
CurlLib
• Daniel StenbergのcURL(クライアントサイド
  URL転送ライブラリ)
• http://curl.haxx.se



• ファイルシステムで使われている
アジェンダ
•   Doom3ゲーム概要
•   Doom3コード概要
•   idLib
•   エンティティ
•   カスタムRTTI
•   イベントシステム
•   まとめ
エンティティ
• ゲームオブジェクトはエンティティと呼ばれ、以下の種類が
  ある

•   idAnimatedEntity(アニメーションするもの。ActorやPlayer)
•   idTestModel
•   idEntityFx
•   idAFAttachment(Articulated figure:多関節形状)
•   idAFEntity_Generic
•   idCursor3D
•   idWeapon(武器)
•   idLight(光源)
•   idBeam
•   idFuncEmitter
•   …
エンティティの例
• idWeapon(武器制御)

• 武器のOn/Offや、サウンド
  などの他のモジュールの処
  理を行っている
idTypeInfo
• カスタムRTTI
• idClassでstaticな情報を扱うために存在する

• 他のクラスからは直接触られず、idClass経由
  で利用される
idTypeInfo主なフィールド
• クラス名
→文字列版とint版が用意されている
→int版は通信対戦時のパケットに使う

• 継承元のクラス名
• イベント(メソッドを関数ポインタにしたもの。
  後述)
• セーブ、ロード時に使う関数ポインタ
idTypeInfoの使い道
• クラス名の管理
→クラス名からインスタンスを生成する
→デバッグ表示、エラー表示にクラス名を入
れる

• 他のクラスと基底クラスが同じかどうか判
  別
• イベントの管理
idClass
• idTypeInfoをstaticで所持している
• イベントを実行する
• セーブ、ロードもある
idClass主なメソッド
• CreateInstance
• GetClassname
• ListClasses_f
→ “Classname”, “Superclass”, “Type”, “Subclasses”
の表示

• Spawn
→エンティティ出現時に呼ばれる
idClassイベント関連
• PostEventMS( const idEventDef *ev, int time )
• PostEventSec( const idEventDef *ev, float time )
• ProcessEvent( const idEventDef *ev )

→各種イベント(関数ポインタ)の実行。後述
idClass staticフィールド
• static int idClass::memused
→クラスインスタンスの総メモリ使用量

• static int idClass::numobjects
→クラスインスタンスの総数
フィールド初期化忘れ対策
• idClass::CreateInstance
→newするときにメモリ領域に0xcdcdcdcdを書い
ておく

→コンストラクタが走った後、メモリ領域に
0xcdcdcdcdがあるかどうかを調べて、フィール
ドの初期化忘れを見つける

Debugビルドでのみ上記チェックを行う
idEntity
• 様々な処理が集まっている

•   thinking(物理更新やUpdate処理など)
•   visuals(描画処理)
•   animation
•   sound
•   entity binding(エンティティの親子関係)
•   physics
•   damage(体力を減らしたり)
•   scripting(スクリプトの処理、シグナル管理)
•   gui(GUIに命令を出す)
•   targets(別のエンティティのシグナルを送る)
idAnimatedEntity
• idEntityにアニメーション(idAnimator)を加
  えたもの

• idAnimator
→複数チャンネルのモーションブレンドや、
親子構造が書いてあるが、詳細は割愛
おさらい
• idWeapon
他のエンティティ
• idLight(光源制御クラス)
• 光源の方向や色を保持している
• On/Offやフェードも出来る

• クラス階層がシンプル
エンティティの一括管理
• エンティティはidGameLocalで一括管理さ
  れている
• idGameLocalでは全エンティティを所持す
  る他、エンティティの作成、削除、検索
  ができる
idGameLocal
• 様々なモジュールの集合クラス

•   Entity(全エンティティの管理)
•   Random
•   Program(スクリプト)
•   Clipping
•   Physics
•   PVS(potential visible set)
•   MultiPlayerGame
•   SmokeParticles
•   カメラ
•   ゲームの種類などの汎用情報
•   …
idGameLocal
• 様々なメソッドを持つ

•   Entityの出現、削除、検索
•   ネットワーク対戦情報
•   セーブ、ロード
•   ユーザー情報
•   Draw
•   ゲームのリセット
•   Printf
•   マップのロード
•   AAS(area system)
エンティティの検索
• 名前で検索
  const char * name;
  idEntity* ent = gameLocal.FindEntity( name );




• Key Value Dictionaryで検索
  const char * key;
  gameLocal.GetTargets(Key Value Dictionary, Entity, key );
エンティティの検索
• クリッピング結果の取得


trace_t tr;//トレース結果用変数
gameLocal.clip.TracePoint( tr,線分の開始地点,線分の終了地点, …);

idEntity* ent = gameLocal.GetTraceEntity( tr );//エンティティの取得

ent->Signal( SIG_TOUCH );//シグナルの発行
ent->ProcessEvent( &EV_Touch, …);//イベントの実行
エンティティ生成
• idTypeInfoで型指定してエンティティを生
  成できる

worldModel = static_cast< idAnimatedEntity * >
            ( gameLocal.SpawnEntityType( idAnimatedEntity::Type, NULL ) );
アジェンダ
•   Doom3ゲーム概要
•   Doom3コード概要
•   idLib
•   エンティティ
•   カスタムRTTI
•   イベントシステム
•   まとめ
イベントシステム
• C++の関数をスクリプトから呼ぶためのも
  の
• idEventとidEventDefで構成されている
イベントを使った処理
• idWeaponで直接関数を呼
  ばずにイベント
  (idClass::ProcessEvent)を経
  由している
イベントの登録
• 各種エンティティの先頭でidEventDefを宣
  言 idEventDef EV_Weapon_Next( "nextWeapon" );
   const
    …




• その後マクロで関数をイベントに登録す
   CLASS_DECLARATION( idAnimatedEntity, idWeapon )
  る
     EVENT( EV_Weapon_Next,idWeapon::Event_Next )

    END_CLASS
イベントの呼び出し
• idClass::ProcessEventを呼ぶと、イベント登
  録された関数が呼ばれる


    idEntity *other;
    other->ProcessEvent( &EV_Touch, this, &collision );
スクリプト
• イベントはスクリプトクラスでも使われ
  ている
• Script_Compiler
• Script_Interpreter
• Script_Program
• Script_Thread
スクリプトからのイベント呼び
      出し
• スクリプトからidInterpreter::CallEventでイ
  ベントを呼べる

• idWeapon::Event_Clearといったメソッドを
  直接呼び出さないでイベントを経由して
  いるのはスクリプトのため?
まとめ
• Doom3を読んでみました
• 海外ゲームの基礎システムに興味を持って
  頂ければ幸いです
解説していないコード
•   スクリプトコンパイラ
•   ファイルシステム
•   物理
•   アニメーション
•   Dedicated Server
•   描画(renderEntity,qgl)
•   …
Question?
ご清聴ありがとうございました

Más contenido relacionado

La actualidad más candente

BHyVeってなんや
BHyVeってなんやBHyVeってなんや
BHyVeってなんや
Takuya ASADA
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
 
BHyVe: The BSD Hypervisor
BHyVe: The BSD HypervisorBHyVe: The BSD Hypervisor
BHyVe: The BSD Hypervisor
Takuya ASADA
 
#ljstudy KVM勉強会
#ljstudy KVM勉強会#ljstudy KVM勉強会
#ljstudy KVM勉強会
Etsuji Nakai
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
Takuya ASADA
 
物理マシンをケチる技術
物理マシンをケチる技術物理マシンをケチる技術
物理マシンをケチる技術
Satoshi KOBAYASHI
 
Bhyve code reading
Bhyve code readingBhyve code reading
Bhyve code reading
Takuya ASADA
 

La actualidad más candente (19)

AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境
 
Free bsd jail入門
Free bsd jail入門Free bsd jail入門
Free bsd jail入門
 
Kubernetes in プロダクション! -- cndjp第2回
Kubernetes in プロダクション! -- cndjp第2回Kubernetes in プロダクション! -- cndjp第2回
Kubernetes in プロダクション! -- cndjp第2回
 
GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)GPUをJavaで使う話(Java Casual Talks #1)
GPUをJavaで使う話(Java Casual Talks #1)
 
BHyVeってなんや
BHyVeってなんやBHyVeってなんや
BHyVeってなんや
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
Bhyve Internals
Bhyve InternalsBhyve Internals
Bhyve Internals
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
BHyVe: The BSD Hypervisor
BHyVe: The BSD HypervisorBHyVe: The BSD Hypervisor
BHyVe: The BSD Hypervisor
 
#ljstudy KVM勉強会
#ljstudy KVM勉強会#ljstudy KVM勉強会
#ljstudy KVM勉強会
 
Osc2009 Do Xen Hara
Osc2009 Do Xen HaraOsc2009 Do Xen Hara
Osc2009 Do Xen Hara
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
物理マシンをケチる技術
物理マシンをケチる技術物理マシンをケチる技術
物理マシンをケチる技術
 
Bhyve code reading
Bhyve code readingBhyve code reading
Bhyve code reading
 
㉒初期プロジェクトを改造!
㉒初期プロジェクトを改造!㉒初期プロジェクトを改造!
㉒初期プロジェクトを改造!
 
Slub data structure
Slub data structureSlub data structure
Slub data structure
 
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
 

Destacado

shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ
DADA246
 
Component basedgameenginedesign
Component basedgameenginedesign Component basedgameenginedesign
Component basedgameenginedesign
DADA246
 
メモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なことメモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なこと
Masaya TARUI
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 

Destacado (11)

shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ
 
Component basedgameenginedesign
Component basedgameenginedesign Component basedgameenginedesign
Component basedgameenginedesign
 
ゲームオブジェクトの管理
ゲームオブジェクトの管理ゲームオブジェクトの管理
ゲームオブジェクトの管理
 
次の世代のインタラクティブレンダリング5つの挑戦と10の滅ぶべき技術
次の世代のインタラクティブレンダリング5つの挑戦と10の滅ぶべき技術 次の世代のインタラクティブレンダリング5つの挑戦と10の滅ぶべき技術
次の世代のインタラクティブレンダリング5つの挑戦と10の滅ぶべき技術
 
GPU最適化入門
GPU最適化入門GPU最適化入門
GPU最適化入門
 
メモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なことメモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なこと
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
 
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr LightingHable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
 
ゲームエンジンの中の話
ゲームエンジンの中の話ゲームエンジンの中の話
ゲームエンジンの中の話
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 

Similar a Doom3 commentary

ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
Preferred Networks
 
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
CLRの基礎 - プログラミング .NET Framework 第3版 読書会CLRの基礎 - プログラミング .NET Framework 第3版 読書会
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
Yoshihisa Ozaki
 
cocos2d-xとCocosBuilderでゲームを作ってみよう
cocos2d-xとCocosBuilderでゲームを作ってみようcocos2d-xとCocosBuilderでゲームを作ってみよう
cocos2d-xとCocosBuilderでゲームを作ってみよう
Tomoaki Shimizu
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
Exploring the x64
Exploring the x64Exploring the x64
Exploring the x64
FFRI, Inc.
 
オンラインゲームソリューション@トレジャーデータ
オンラインゲームソリューション@トレジャーデータオンラインゲームソリューション@トレジャーデータ
オンラインゲームソリューション@トレジャーデータ
Takahiro Inoue
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with Symfony
Atsuhiro Kubo
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼 [CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
CODE BLUE
 
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
Takuya Matsunaga
 

Similar a Doom3 commentary (20)

ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
 
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
CLRの基礎 - プログラミング .NET Framework 第3版 読書会CLRの基礎 - プログラミング .NET Framework 第3版 読書会
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
 
cocos2d-xとCocosBuilderでゲームを作ってみよう
cocos2d-xとCocosBuilderでゲームを作ってみようcocos2d-xとCocosBuilderでゲームを作ってみよう
cocos2d-xとCocosBuilderでゲームを作ってみよう
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
Using xvim with macvim
Using xvim with macvimUsing xvim with macvim
Using xvim with macvim
 
Exploring the x64
Exploring the x64Exploring the x64
Exploring the x64
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectCompute
 
DOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵までDOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵まで
 
オンラインゲームソリューション@トレジャーデータ
オンラインゲームソリューション@トレジャーデータオンラインゲームソリューション@トレジャーデータ
オンラインゲームソリューション@トレジャーデータ
 
Software Development with Symfony
Software Development with SymfonySoftware Development with Symfony
Software Development with Symfony
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
 
進化するArt
進化するArt進化するArt
進化するArt
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
Rとcdisc@moss10 公開用
Rとcdisc@moss10 公開用Rとcdisc@moss10 公開用
Rとcdisc@moss10 公開用
 
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼 [CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
 
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
 
JSON Value into Power Automate
JSON Value into Power AutomateJSON Value into Power Automate
JSON Value into Power Automate
 
IgGrid 入門編
IgGrid 入門編IgGrid 入門編
IgGrid 入門編
 

Doom3 commentary