SlideShare a Scribd company logo
1 of 39
/ 38
Bait and Switch を試してみた
1
城東.NET #11
2017年08月16日
石崎 充良
/ 38
自己紹介
石崎 充良 ( @mishi_cs )
言語: C# XAML
活動:
JXUG (もくもく会) (connpass)
城東.NET Users Group (connpass)
.NET 読書会 (connpass)
2
/ 38
概要
3
/ 38
Bait and Switch とは
・Xamarin で使うライブラリでよく使われている技法。
・共通コードからは個別のプラットフォームの機能を本来直接呼び出すことができない。
・これを個共通コードから個別のプラットフォームの機能を直接呼び出しているかのよ
うに扱える。
4
/ 38
共通コード?
Android、iOS 対応のアプリを作る場合、
通常 3 つのプロジェクトが含まれたソリューションを作る。
■ ソリューション名プロジェクト
共通のコードを実装するプロジェクト。(コード共有)
■ ソリューション名.Droid プロジェクト
Android 用プロジェクト。Android 固有の機能も使える。
■ ソリューション名.iOS プロジェクト
iOS 用プロジェクト。iOS 固有の機能も使える。
5
全てのプラットフォームのプロ
ジェクトから参照される。
例えばここから Android 固有の
機能が使われていると、iOS で使
えなくなる。
/ 38
実現方法
6
/ 38
DLL を置き換える
・共通コードではダミーの空実装の DLL を参照
・ビルド時に実装の DLL に置き換える
・Plugins for Xamarin (Open Source Components for Xamarin) で使われている
7
/ 38
Plugins for Xamarin
を作ってみよう
8
/ 38
テンプレートの導入
9
https://github.com/xamarin/XamarinComponents
下へスクロール
Visual Studio Plugins Templates
からダウンロード
ダウンロード
/ 38
プロジェクトの新規作成
10
Plugin for Xamarin
で新規作成
/ 38
出来上がるプロジェクト
4 つのプロジェクトが含まれた
ソリューションが作られる
11
CrossFeature1.cs
は全てひとつのファイルを参照
/ 38
CrossFeature1.cs
12
共通コード用プロジェクトではダミー実装
プラットフォーム用プロジェクトでは実装を返却
/ 38
インターフェイスに追加
13
メソッドを追加
プラットフォーム用プロジェクトでエラー
実装がプラットフォーム用にしかない
/ 38
それぞれ実装
14
Android 実装
iOS 実装
/ 38
.nuspec ファイルを作成
15
Plugin for Xamarin NuSpec
を選択
名前に注意!
今回は Feature2 を Feature1
に変更
/ 38
.nuspec ファイルを編集
16
<licenseUrl/>
<projectUrl/>
を削除
<files> の中の <file> を
Core
Xamarin.Android
Xamarin.iOS
を除いて削除
/ 38
nuget.exe をダウンロード
17
https://dist.nuget.org/index.html
ダウンロード
/ 38
nuget パッケージを作成
・.nuspec ファイルのある場所で、nuget.exe を実行
■ コマンド
■ 実行結果
18
> Nuget pack
/ 38
作った
nuget パッケージを
使ってみよう
19
/ 38
.nupkg ファイルをローカルに保存
もともとローカルにありますが、分かりやすい場所に移動しておく。
20
/ 38
ローカルの .nupkg を参照
・ nuget パッケージを探すソースを追加
21
「ソースの構成」を選択
.nupkg ファイルを保存した
フォルダーを選択
/ 38
パッケージを選択
22
作ったパッケージを選択
/ 38
nuget パッケージを使う
PCL プロジェクトで nuget パッケージの機能(今回はプロパティの参照)を使用
23
コードビハインドから呼べるよう
名前付け
プロパティの値を画面表示
/ 38
実行結果
24
iOS Android
/ 38
nuget パッケージの
内容を見てみよう
25
/ 38
とりあえず .zip に変えてみて展開
26
共通コードプロジェクト
と各プラットフォームのフォルダー
各フォルダーに同じ名前の
.dll が含まれる
/ 38
アプリプロジェクト
の出力を見てみよう
27
/ 38
全てに同じ名前の DLL がいる
28
iOS
Android
共通プロジェクト
/ 38
DLL を比較してみる
・nuget パッケージ内の DLL とアプリプロジェクト出力の DLL を比較してみる
・それぞれのフォルダー内の DLL をプラットフォーム毎に比較 (名前はリネーム)
※プラットフォーム間の比較
29
/ 38
つまり
・DLL はビルド時と異なるファイルを実行時に参照できる。
・共通プロジェクトのビルド時には、空実装の DLL を参照してビルド
・アプリの実行ファイルの参照先には、プラットフォーム用の DLL を配置
30
共通プロジェクトでは空実装 DLL を使用
アプリのビルド時 (プラットフォームのプロジェクトのビルド時)
にはプラットフォーム個別実装の DLL を配置
実行時には個別実装 DLL が使われる
/ 38
コンソール アプリで
試してみよう
31
/ 38
ソリューションの作成
■ App
Dll、DllA、DllB のいずれも直接参照しないアプリ(Library のみ参照)
■ AppA
Library と DllA を参照したアプリ
■ AppB
Library と DllB を参照したアプリ
■ Dll
空実装 DLL 役の DLL
■ DllA
プラットフォーム用 DLL 役の DLL その1
■ DllB
プラットフォーム用 DLL 役の DLL その2
■ Library
共通プロジェクト役の DLL
32上記ソリューションは https://github.com/m-ishizaki/BaSに上げてあります。
/ 38
DLL 役の実装
Class1 というクラスに Name というプロパティを実装
33
プロジェクト毎にプロパティの値を変更
Dll では、Dll
DllA では、DllA
DllB では、DllB
/ 38
共通プロジェクト役 DLL の実装
Dll の機能を呼び出す
34
DLL の機能を呼び出す
実行時に参照する DLL が変われば値が変わる
/ 38
アプリ役実行ファイルの実装
共通 DLL の機能を呼び、自身の名前とともに出力
35
DLL の機能を呼び出す
実行時に参照する DLL が変われば値が変わる
/ 38
実行結果
■ App の場合
■ AppA の場合
■ AppB の場合
36
App.Program Dll
AppA.Program DllA
AppB.Program DllB
実行時に使われる DLL が変わることが確認できた
/ 38
まとめ
37
/ 38
まとめ
・クラシック デスクトップ アプリ でも環境ごとの設定の切り替えなどで使えそう
38
Bait and Switch 完璧にマスターした
/ 38
ご清聴ありがとうご
ざいました。
39

More Related Content

What's hot

RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-Takaaki Suzuki
 
TypeScriptで作る型安全FirefoxOSアプリ
TypeScriptで作る型安全FirefoxOSアプリTypeScriptで作る型安全FirefoxOSアプリ
TypeScriptで作る型安全FirefoxOSアプリprogre
 
Fiddler 使ってますか?
Fiddler 使ってますか?Fiddler 使ってますか?
Fiddler 使ってますか?Joni
 
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)parrotstudio
 
TypeScript + Express
TypeScript + ExpressTypeScript + Express
TypeScript + Expresskamiyam .
 
TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2kamukiriri
 
達人出版会のご紹介(技術編)
達人出版会のご紹介(技術編)達人出版会のご紹介(技術編)
達人出版会のご紹介(技術編)masayoshi takahashi
 
マイクロソフト系エンジニアとは何をしている人?
マイクロソフト系エンジニアとは何をしている人?マイクロソフト系エンジニアとは何をしている人?
マイクロソフト系エンジニアとは何をしている人?m ishizaki
 
Casablanca
CasablancaCasablanca
Casablancaegtra
 
C++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用するC++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用するYou&I
 
5月13日 JapanAndroidGroup - Hamamatsu c# go
5月13日 JapanAndroidGroup - Hamamatsu c# go5月13日 JapanAndroidGroup - Hamamatsu c# go
5月13日 JapanAndroidGroup - Hamamatsu c# goAtsuya Tsuchikawa
 
Xamarin で クラシックデスクトップ 2
Xamarin で クラシックデスクトップ 2Xamarin で クラシックデスクトップ 2
Xamarin で クラシックデスクトップ 2m ishizaki
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホンKouji Matsui
 
.NET today and tomorrow
.NET today and tomorrow.NET today and tomorrow
.NET today and tomorrowAkira Inoue
 
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Narami Kiyokura
 

What's hot (20)

RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-
 
TypeScriptで作る型安全FirefoxOSアプリ
TypeScriptで作る型安全FirefoxOSアプリTypeScriptで作る型安全FirefoxOSアプリ
TypeScriptで作る型安全FirefoxOSアプリ
 
Fiddler 使ってますか?
Fiddler 使ってますか?Fiddler 使ってますか?
Fiddler 使ってますか?
 
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
 
ReactiveSignalR
ReactiveSignalRReactiveSignalR
ReactiveSignalR
 
TypeScript + Express
TypeScript + ExpressTypeScript + Express
TypeScript + Express
 
TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2
 
達人出版会のご紹介(技術編)
達人出版会のご紹介(技術編)達人出版会のご紹介(技術編)
達人出版会のご紹介(技術編)
 
マイクロソフト系エンジニアとは何をしている人?
マイクロソフト系エンジニアとは何をしている人?マイクロソフト系エンジニアとは何をしている人?
マイクロソフト系エンジニアとは何をしている人?
 
酒の肴はC# vNext
酒の肴はC# vNext酒の肴はC# vNext
酒の肴はC# vNext
 
Casablanca
CasablancaCasablanca
Casablanca
 
C++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用するC++ REST SDKを使ってWebサービスを利用する
C++ REST SDKを使ってWebサービスを利用する
 
C#_GO ABC spring 2017
C#_GO ABC spring 2017C#_GO ABC spring 2017
C#_GO ABC spring 2017
 
5月13日 JapanAndroidGroup - Hamamatsu c# go
5月13日 JapanAndroidGroup - Hamamatsu c# go5月13日 JapanAndroidGroup - Hamamatsu c# go
5月13日 JapanAndroidGroup - Hamamatsu c# go
 
Xamarin で クラシックデスクトップ 2
Xamarin で クラシックデスクトップ 2Xamarin で クラシックデスクトップ 2
Xamarin で クラシックデスクトップ 2
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホン
 
.NET today and tomorrow
.NET today and tomorrow.NET today and tomorrow
.NET today and tomorrow
 
俺とホットキー
俺とホットキー俺とホットキー
俺とホットキー
 
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
 
Reactに触れてみた
Reactに触れてみたReactに触れてみた
Reactに触れてみた
 

Similar to Bait and switch

Xamarin.Forms オリジナルタイマーアプリを作ろうハンズオン
Xamarin.Forms オリジナルタイマーアプリを作ろうハンズオンXamarin.Forms オリジナルタイマーアプリを作ろうハンズオン
Xamarin.Forms オリジナルタイマーアプリを作ろうハンズオンm ishizaki
 
XAML Islands その2
XAML Islands その2XAML Islands その2
XAML Islands その2m ishizaki
 
Xamarin で始めるクロスプラットフォーム開発
Xamarin で始めるクロスプラットフォーム開発Xamarin で始めるクロスプラットフォーム開発
Xamarin で始めるクロスプラットフォーム開発m ishizaki
 
Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発m ishizaki
 
TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口Sunao Tomita
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platformToru Yamaguchi
 
新しい EditorConfig (IntelliCode)
新しい EditorConfig (IntelliCode)新しい EditorConfig (IntelliCode)
新しい EditorConfig (IntelliCode)m ishizaki
 
Uno Platform 入門
Uno Platform 入門Uno Platform 入門
Uno Platform 入門m ishizaki
 
.NET Standard で SQLServer と接続してみた
.NET Standard で SQLServer と接続してみた.NET Standard で SQLServer と接続してみた
.NET Standard で SQLServer と接続してみたm ishizaki
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTakahisa Iwamoto
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021Atsushi Nakamura
 
C# 9 のおすすめ新機能
C# 9 のおすすめ新機能C# 9 のおすすめ新機能
C# 9 のおすすめ新機能m ishizaki
 
7 つの Blazor
7 つの Blazor7 つの Blazor
7 つの Blazorm ishizaki
 
UWPでもDataTable
UWPでもDataTableUWPでもDataTable
UWPでもDataTablem ishizaki
 
ソフト屋が挑戦した電子工作 〜力ずくの10か月〜
ソフト屋が挑戦した電子工作 〜力ずくの10か月〜ソフト屋が挑戦した電子工作 〜力ずくの10か月〜
ソフト屋が挑戦した電子工作 〜力ずくの10か月〜Shinichi Hirauchi
 
Android道第1回公開用
Android道第1回公開用Android道第1回公開用
Android道第1回公開用Takaya Funabiki
 
Visual Studio Code でプログラムをデバッグしよう!
Visual Studio Code でプログラムをデバッグしよう!Visual Studio Code でプログラムをデバッグしよう!
Visual Studio Code でプログラムをデバッグしよう!m ishizaki
 

Similar to Bait and switch (20)

Xamarin.Forms オリジナルタイマーアプリを作ろうハンズオン
Xamarin.Forms オリジナルタイマーアプリを作ろうハンズオンXamarin.Forms オリジナルタイマーアプリを作ろうハンズオン
Xamarin.Forms オリジナルタイマーアプリを作ろうハンズオン
 
XAML Islands その2
XAML Islands その2XAML Islands その2
XAML Islands その2
 
Xamarin で始めるクロスプラットフォーム開発
Xamarin で始めるクロスプラットフォーム開発Xamarin で始めるクロスプラットフォーム開発
Xamarin で始めるクロスプラットフォーム開発
 
Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発
 
TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platform
 
新しい EditorConfig (IntelliCode)
新しい EditorConfig (IntelliCode)新しい EditorConfig (IntelliCode)
新しい EditorConfig (IntelliCode)
 
Uno Platform 入門
Uno Platform 入門Uno Platform 入門
Uno Platform 入門
 
.NET Standard で SQLServer と接続してみた
.NET Standard で SQLServer と接続してみた.NET Standard で SQLServer と接続してみた
.NET Standard で SQLServer と接続してみた
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
 
DartVM on Android
DartVM on AndroidDartVM on Android
DartVM on Android
 
広がる .Net
広がる .Net広がる .Net
広がる .Net
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
C# 9 のおすすめ新機能
C# 9 のおすすめ新機能C# 9 のおすすめ新機能
C# 9 のおすすめ新機能
 
7 つの Blazor
7 つの Blazor7 つの Blazor
7 つの Blazor
 
UWPでもDataTable
UWPでもDataTableUWPでもDataTable
UWPでもDataTable
 
ソフト屋が挑戦した電子工作 〜力ずくの10か月〜
ソフト屋が挑戦した電子工作 〜力ずくの10か月〜ソフト屋が挑戦した電子工作 〜力ずくの10か月〜
ソフト屋が挑戦した電子工作 〜力ずくの10か月〜
 
Android道第1回公開用
Android道第1回公開用Android道第1回公開用
Android道第1回公開用
 
Visual Studio Code でプログラムをデバッグしよう!
Visual Studio Code でプログラムをデバッグしよう!Visual Studio Code でプログラムをデバッグしよう!
Visual Studio Code でプログラムをデバッグしよう!
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 

More from m ishizaki

継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#m ishizaki
 
継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#m ishizaki
 
Visual Studio を使わず .NET する
Visual Studio を使わず .NET するVisual Studio を使わず .NET する
Visual Studio を使わず .NET するm ishizaki
 
Xamarin で良くやっていたあれを MAUI でする話
Xamarin で良くやっていたあれを MAUI でする話Xamarin で良くやっていたあれを MAUI でする話
Xamarin で良くやっていたあれを MAUI でする話m ishizaki
 
「スタバ」する話
「スタバ」する話「スタバ」する話
「スタバ」する話m ishizaki
 
エンジニアと「スタバ」ツイートについて
エンジニアと「スタバ」ツイートについてエンジニアと「スタバ」ツイートについて
エンジニアと「スタバ」ツイートについてm ishizaki
 
Build 2022 / Uno Platform
Build 2022 / Uno PlatformBuild 2022 / Uno Platform
Build 2022 / Uno Platformm ishizaki
 
C# Tokyo コミュニティ説明 202205 版
C# Tokyo コミュニティ説明 202205 版C# Tokyo コミュニティ説明 202205 版
C# Tokyo コミュニティ説明 202205 版m ishizaki
 
仮想環境に MAUI 環境を構築する話
仮想環境に MAUI 環境を構築する話仮想環境に MAUI 環境を構築する話
仮想環境に MAUI 環境を構築する話m ishizaki
 
モバイルディスプレイ
モバイルディスプレイモバイルディスプレイ
モバイルディスプレイm ishizaki
 
Windows フォームアプリ 2022
Windows フォームアプリ 2022Windows フォームアプリ 2022
Windows フォームアプリ 2022m ishizaki
 
C# Tokyo コミュニティについて Short 版
C# Tokyo コミュニティについて Short 版C# Tokyo コミュニティについて Short 版
C# Tokyo コミュニティについて Short 版m ishizaki
 
C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内m ishizaki
 
C# Tokyo コミュニティ説明 2021/01/29 版
C# Tokyo コミュニティ説明 2021/01/29 版C# Tokyo コミュニティ説明 2021/01/29 版
C# Tokyo コミュニティ説明 2021/01/29 版m ishizaki
 
秋葉原 C# もくもく会
秋葉原 C# もくもく会秋葉原 C# もくもく会
秋葉原 C# もくもく会m ishizaki
 
C# Tokyo guide 2020/12/25
C# Tokyo guide 2020/12/25C# Tokyo guide 2020/12/25
C# Tokyo guide 2020/12/25m ishizaki
 
C# Tokyo コミュニティ案内 20201217
C# Tokyo コミュニティ案内 20201217C# Tokyo コミュニティ案内 20201217
C# Tokyo コミュニティ案内 20201217m ishizaki
 

More from m ishizaki (20)

継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#
 
継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#継承辺りのもしかしたらマイナーかもしれない C#
継承辺りのもしかしたらマイナーかもしれない C#
 
Visual Studio を使わず .NET する
Visual Studio を使わず .NET するVisual Studio を使わず .NET する
Visual Studio を使わず .NET する
 
Xamarin で良くやっていたあれを MAUI でする話
Xamarin で良くやっていたあれを MAUI でする話Xamarin で良くやっていたあれを MAUI でする話
Xamarin で良くやっていたあれを MAUI でする話
 
「スタバ」する話
「スタバ」する話「スタバ」する話
「スタバ」する話
 
エンジニアと「スタバ」ツイートについて
エンジニアと「スタバ」ツイートについてエンジニアと「スタバ」ツイートについて
エンジニアと「スタバ」ツイートについて
 
Build 2022 / Uno Platform
Build 2022 / Uno PlatformBuild 2022 / Uno Platform
Build 2022 / Uno Platform
 
C# Tokyo コミュニティ説明 202205 版
C# Tokyo コミュニティ説明 202205 版C# Tokyo コミュニティ説明 202205 版
C# Tokyo コミュニティ説明 202205 版
 
仮想環境に MAUI 環境を構築する話
仮想環境に MAUI 環境を構築する話仮想環境に MAUI 環境を構築する話
仮想環境に MAUI 環境を構築する話
 
2022 抱負
2022 抱負2022 抱負
2022 抱負
 
モバイルディスプレイ
モバイルディスプレイモバイルディスプレイ
モバイルディスプレイ
 
Windows フォームアプリ 2022
Windows フォームアプリ 2022Windows フォームアプリ 2022
Windows フォームアプリ 2022
 
dotnet tool
dotnet tooldotnet tool
dotnet tool
 
C#10
C#10C#10
C#10
 
C# Tokyo コミュニティについて Short 版
C# Tokyo コミュニティについて Short 版C# Tokyo コミュニティについて Short 版
C# Tokyo コミュニティについて Short 版
 
C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内
 
C# Tokyo コミュニティ説明 2021/01/29 版
C# Tokyo コミュニティ説明 2021/01/29 版C# Tokyo コミュニティ説明 2021/01/29 版
C# Tokyo コミュニティ説明 2021/01/29 版
 
秋葉原 C# もくもく会
秋葉原 C# もくもく会秋葉原 C# もくもく会
秋葉原 C# もくもく会
 
C# Tokyo guide 2020/12/25
C# Tokyo guide 2020/12/25C# Tokyo guide 2020/12/25
C# Tokyo guide 2020/12/25
 
C# Tokyo コミュニティ案内 20201217
C# Tokyo コミュニティ案内 20201217C# Tokyo コミュニティ案内 20201217
C# Tokyo コミュニティ案内 20201217
 

Bait and switch