SlideShare a Scribd company logo
DI(依存性注入)について
伊藤 結
ところで、DIと聞いて
  ピンとくる方はいますか?
DI(依存性注入)とは
なるほど。わからん。
依存性の注入(英: Dependency injection)とは、コンポーネント間の依存関係をプロ
グラムのソースコードから 排除し、外部の設定ファイルなどで注入できるようにするソ
フトウェアパターンである。英語の頭文字からDIと略される。
wikipediaより
https://ja.wikipedia.org/wiki/依存性の注入
DI(依存性注入)とは
依存性の注入(英: Dependency injection)とは、コンポーネント間の依存関係をプロ
グラムのソースコードから 排除し、外部の設定ファイルなどで注入できるようにするソ
フトウェアパターンである。英語の頭文字からDIと略される。
wikipediaより
https://ja.wikipedia.org/wiki/依存性の注入
言葉の意味から考えてみよう!
依存性ってなに?
public class Siphon implements BrewingMethod {
@Override
public String brew() {
return "サイフォンでいれたコーヒー ";
}
}
public class CoffeeShop {
public String brewCoffee() {
BrewingMethod siphone = new Siphone();
return siphone.brew() + "が出来上がりました [_]P";
}
}
public class CoffeeShopApp {
public static void main(String... args) {
CoffeeShop coffeeShop = new CoffeeShopApp();
System.out.println(coffeeShop.brewCoffee());
}
}
public class Siphon implements BrewingMethod {
@Override
public String brew() {
return "サイフォンでいれたコーヒー ";
}
}
public class CoffeeShop {
public String brewCoffee() {
BrewingMethod siphone = new Siphone();
return siphone.brew() + "が出来上がりました [_]P";
}
}
public class CoffeeShopApp {
public static void main(String... args) {
CoffeeShop coffeeShop = new CoffeeShopApp();
System.out.println(coffeeShop.brewCoffee());
}
}
プログラムの実行クラス
BrewingMethod(抽出方法)
の実装クラス
クラスAからクラスBを直接インスタンス化している時、
クラスAはクラスBがないと動きません。
このような状態は
クラスAとクラスBが依存関係にある、
クラスAはクラスBに依存しているといえます。
今回の例でいうと、
 CfeeShopAppとCoffeeShop
 CoffeeShopとSiphone
の間で依存関係があるということになります
注入ってなに?
実際のコードで説明します
DIコンテナを使って、
  実際にDIをやってみよう!
DIコンテナとは
● すごく簡単に言うと、「XXにこのクラスのオブジェクトを注入してね」
という設定を書いておくとDI(依存性の注入)を実行するよくんのこと。
今回はJava向けのDaggerというDIコンテナを使います。
@Module(injects = CoffeeShopApp.class)
public class BrewingMethodModule {
@Provides
public BrewingMethod provideBrewingMethod() {
return new Siphon();
}
}
public class CoffeeShop {
// Siphonオブジェクトが注入される
@Inject BrewingMethod brewingMethod;
....
}
public class CoffeeShopApp {
  //兄弟クラスがないので設定なしでCoffeeShopオブジェクトが注入される
@Inject CoffeeShop coffeeShop;
public void run() {
System.out.println(coffeeShop.brewCoffee());
}
public static void main(String... args) {
    // Daggerのオブジェクト生成(設定を読み込んで、各オブジェクトが注入されたCoffeeShopAppオブジェクトを生成)
ObjectGraph objectGraph = ObjectGraph.create(new BrewingMethodModule());
CoffeeShopApp coffeeShopApp = objectGraph.get(CoffeeShopApp.class);
coffeeShopApp.run();
}
@Module(injects = CoffeeShopApp.class)
public class BrewingMethodModule {
@Provides
public BrewingMethod provideBrewingMethod() {
return new Siphon();
}
}
public class CoffeeShop {
// Siphonオブジェクトが注入される
@Inject BrewingMethod brewingMethod;
....
}
public class CoffeeShopApp {
  //兄弟クラスがないので設定なしでCoffeeShopオブジェクトが注入される
@Inject CoffeeShop coffeeShop;
public void run() {
System.out.println(coffeeShop.brewCoffee());
}
public static void main(String... args) {
    // Daggerのオブジェクト生成(設定を読み込んで、各オブジェクトが注入されたCoffeeShopAppオブジェクトを生成)
ObjectGraph objectGraph = ObjectGraph.create(new BrewingMethodModule());
CoffeeShopApp coffeeShopApp = objectGraph.get(CoffeeShopApp.class);
coffeeShopApp.run();
}
@Moduleで注入先クラスを指定
@Providesを付与したメソッドで、注入するオ
ブジェクトを生成する処理を記述。
Daggerライブラリのオブジェクト生成処理
(BrewingMethodModuleの設定を読み込
んで、CoffeeShopAppオブジェクトを生
成)。
@Injectが付与されている
CofeeShopApp#cofeeShop,
CofeeShop#resingMethod
にオブジェクトが注入された状態の
CoffeeShopAppオブジェクトが生成されま
す。
Daggerが依存性が注入されたオブジェクトを生成することで、
CofeeShopAppから直接インスタンス化する記述をなくすことができ、
以下のモジュール間の依存関係を外部に逃がすことができました。
 CofeeShop ー Siphon
 CoffeeShopApp ー CofeeShop
で、DI使うと
   なにがよくなるの?
DIを使う場合の利点
● モジュール間の依存関係を弱めることができる(保守性が高まる)
● 単体テストが楽になる
(Aモジュールが完成する前にBモジュールをテストできる、外から特定のモジュールをモック
に差し替えることができる)
実際やってみて、特にテストコードを書くとき、Mockオブ
ジェクトに差し替えてテストながせるのが心地よかったで
す。
public class CoffeeShopTest {
@Inject CoffeeShop coffeeShop;
@Inject BrewingMethod brewingMethod;
@Before
public void setUp() {
ObjectGraph.create(new TestModule()).inject(this);
}
@Module(includes = BrewingMethodModule.class,
injects = CoffeeShopTest.class,
overrides = true)
static class TestModule {
@Provides
@Singleton
public BrewingMethod provideBrewingMethod() {
return Mockito.mock(BrewingMethod.class);
}
}
@Test
public void testBrewCoffee() {
Mockito.when(brewingMethod.brew()).thenReturn("テストコーヒー");
String result = coffeeShop.brewCoffee();
Mockito.verify(brewingMethod, Mockito.times(1)).brew();
assertThat(result, is("テストコーヒーが出来上がりました [_]P"));
}
DIを利用したテストコードの一例
CoffeShopのテストコードです。
BrewingMethodクラスのオブジェクトは
モックに置き換えてテストを実行してい
ます。
CoffeeShopから
BrewingMethod#brewメソッドが1回呼
ばれていること、
CoffeeShop#brewCoffeeメソッドの結
果が正しいこと
を確認するテストコードです。
public class CoffeeShopTest {
@Inject CoffeeShop coffeeShop;
@Inject BrewingMethod brewingMethod;
@Before
public void setUp() {
ObjectGraph.create(new TestModule()).inject(this);
}
@Module(includes = BrewingMethodModule.class,
injects = CoffeeShopTest.class,
overrides = true)
static class TestModule {
@Provides
@Singleton
public BrewingMethod provideBrewingMethod() {
return Mockito.mock(BrewingMethod.class);
}
}
@Test
public void testBrewCoffee() {
Mockito.when(brewingMethod.brew()).thenReturn("テストコーヒー");
String result = coffeeShop.brewCoffee();
Mockito.verify(brewingMethod, Mockito.times(1)).brew();
assertThat(result, is("テストコーヒーが出来上がりました [_]P"));
}
BrewingMethodModuleを、BrewingMethod
のモックを返却するように上書きしている。
public class CoffeeShopTest {
@Inject CoffeeShop coffeeShop;
@Inject BrewingMethod brewingMethod;
@Before
public void setUp() {
ObjectGraph.create(new TestModule()).inject(this);
}
@Module(includes = BrewingMethodModule.class,
injects = CoffeeShopTest.class,
overrides = true)
static class TestModule {
@Provides
@Singleton
public BrewingMethod provideBrewingMethod() {
return Mockito.mock(BrewingMethod.class);
}
}
@Test
public void testBrewCoffee() {
Mockito.when(brewingMethod.brew()).thenReturn("テストコーヒー");
String result = coffeeShop.brewCoffee();
Mockito.verify(brewingMethod, Mockito.times(1)).brew();
assertThat(result, is("テストコーヒーが出来上がりました [_]P"));
}
本クラスへの依存性注入の実行
CoffeeShop#brewingMethod、
brewingMethodへ
BrewingMethodのMockを注入する。
(TestModule#provideBrewingMethodに
Singletonアノテーションを付与しているので
すべて同じオブジェクトが注入される)。
注入した、モックオブジェクトの振る舞
いを設定して、テストを実行。
※BrewingMethod#brew()が呼ばれ
た際に”テストコーヒー”が返却されるよ
う設定。
DIコンテナって
他にはどんなのがあるの?
代表的なDIコンテナ
● Spring Framework
● JavaEE (CDI)
● Seasar2
● Zend Framework 2
● Dagger
● Dagger2
● Proton
● RoboGuice
なんかJavaばっかりじゃね?
言語とDIコンテナ
● Javaなどの静的言語では色々と種類があるが、
RubyやPythonなどの動的言語ではあまり使われていない(と思う)。
私は一時DIについて関心を持って、いろいろ調べてみたし、 自分でDIコンテナ
を実装してみたりもした。 でも、RubyでならDIコンテナがわずか20行で記述で
きる上、 よく考えてみたら、その20行も、なくてもほぼ同じことが簡単に実現で
きることに気がついた時、 DIってのは硬直した言語のための技術なんだと気
がついた。
Matzにっき より
http://www.rubyist.net/~matz/20091003.html
どんな所でDIを使うべき?
DIの使いどころ
● (当たり前ですが) DIを前提にしたフレームワークを使用するとき。
● Javaを使用しており、テスト駆動開発(TDD)とかテストコードを書くことが前提のプロジェクト。
● 実装があるモジュールに依存してるが、そのモジュールは未完成、でも単体テストを始めない
といけないんだよ〜みたいなことになりそうなとき。
採用したときのコスト(学習コストなど)に比べて、モ
ジュール間の依存関係を弱めることが重要な時に使用
するべき。
何でもかんでもDIすればいいってもんでもない。
ご清聴ありがとうございました

More Related Content

What's hot

怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)Yoshitaka Kawashima
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)A AOKI
 
Azure App Service Overview
Azure App Service OverviewAzure App Service Overview
Azure App Service OverviewTakeshi Fukuhara
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術dena_study
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話JustSystems Corporation
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説Shoken Fujisaki
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NETterurou
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 

What's hot (20)

怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 
Azure App Service Overview
Azure App Service OverviewAzure App Service Overview
Azure App Service Overview
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 

Similar to DI(依存性注入)について

はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Yukiko Kato
 
WordPressプラグイン作成入門
WordPressプラグイン作成入門WordPressプラグイン作成入門
WordPressプラグイン作成入門Yuji Nojima
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストYoichiro Sakurai
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見Yosuke HASEGAWA
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法Naruto TAKAHASHI
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークkenjis
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略cch-robo
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Nakazawa Yuichi
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 
つ部 Android Studio 勉強会 12/7
つ部 Android Studio 勉強会 12/7つ部 Android Studio 勉強会 12/7
つ部 Android Studio 勉強会 12/7Hikaru Wada
 
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門晃 遠山
 
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdfソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf耕二 阿部
 

Similar to DI(依存性注入)について (20)

AndroidでDIxAOP
AndroidでDIxAOPAndroidでDIxAOP
AndroidでDIxAOP
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】
 
WordPressプラグイン作成入門
WordPressプラグイン作成入門WordPressプラグイン作成入門
WordPressプラグイン作成入門
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
Scoop!
Scoop!Scoop!
Scoop!
 
Firefoxosハンズオン
FirefoxosハンズオンFirefoxosハンズオン
Firefoxosハンズオン
 
How To Drink Wsgi
How To Drink WsgiHow To Drink Wsgi
How To Drink Wsgi
 
Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
つ部 Android Studio 勉強会 12/7
つ部 Android Studio 勉強会 12/7つ部 Android Studio 勉強会 12/7
つ部 Android Studio 勉強会 12/7
 
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門
 
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdfソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf
 

Recently uploaded

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルCRI Japan, Inc.
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptxssuserbefd24
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizesatsushi061452
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdfAyachika Kitazaki
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...atsushi061452
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)NTT DATA Technology & Innovation
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)keikoitakurag
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptxyassun7010
 

Recently uploaded (10)

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 

DI(依存性注入)について