SlideShare a Scribd company logo
C# ドキドキ ライブ コーディング!!
~ 小島の分 ~
BuriKaigi 2020 @ 富山
2020/02/01
小島 富治雄
#BuriKaigi
自己紹介
2
今回はトランプのゲーム「スピード」で対決。
3
どこをhackするか?
4
今回は6つのhack
5
hack 0.
6
hack 0. 社会的hack
7
hack 1.
8
hack 1. 相手プレイヤーのメソッドの入れ替え
9
public unsafe static void
unsafe
if
int int
int int
else
long long
long long
hack 1. 相手プレイヤーのメソッドの入れ替え
1
unsafe
hack 1.1 相手プレイヤーのメソッドの入れ替え
- 動的な unsafe アセンブリの生成 - その1 動的コンパイル
11
var codeProvider = new CSharpCodeProvider();
var compiler = codeProvider.CreateCompiler();
var parameters = new CompilerParameters { GenerateInMemory = true,
CompilerOptions = "/unsafe" };
parameters.ReferencedAssemblies.Add("System.Reflection.dll");
var sourceText =
"using System;¥n" +
"using System.Reflection;¥n" +
"public class MethodReplacer {¥n" +
" public unsafe static void Replace(MethodInfo targetMethod, MethodInfo
methodToInject) {¥n" +
" // Hack!¥n" +
" }¥n" +
"}¥n";
var results = compiler.CompileAssemblyFromSource(parameters, sourceText);
hack 1.1. 相手プレイヤーのメソッドの入れ替え
- 動的な unsafe アセンブリの生成 - その1 動的コンパイル
12
hack 1.1. 相手プレイヤーのメソッドの入れ替え
- 動的な unsafe アセンブリの生成 - その1 動的コンパイル
例外
PlatformNotSupportedException
"Operation is not supported
on this platform."
13
hack 1.2. 相手プレイヤーのメソッドの入れ替え - 動的な unsafe アセンブリの生成
- その2 コンパイル済みのアセンブリを動的に読み込み
14
hack 1.2. 相手プレイヤーのメソッドの入れ替え - 動的な unsafe アセンブリの生成
- その2 コンパイル済みのアセンブリを動的に読み込み
const string "KojimaLib"
static string $" .dll"
// Base64でエンコードされたアセンブリ
const string "TVqQAAMAAAAEAA...A="
var
using var new
using var new
var
if null
return
// リフレクションでメソッドを呼ぶ…
15
public unsafe static void
unsafe
if
int int
int int
else
long long
long long
hack 1. 相手プレイヤーのメソッドの入れ替え
.NET Core だと
うまくいかない!
16
hack 2.
17
hack 2. SpeedApp.Console.exe
18
https://www.youtube.com
/watch?v=bqyv3X66TZU
10,000回勝負
しても5秒くらい
https://www.youtube.com
/watch?v=eNP3XVfl4F0
hack 3.
21
hack 3. まじめに高速化
22
hack 3. まじめに高速化
23
hack 3. まじめに高速化
24
static int
var
for var
return
static int ListをCountを変数にしてからforする(List<Foo> foos)
{
var sum = 0;
var count = foos.Count;
for (var index = 0; index < count; index++)
sum += foos[index].Value;
return sum;
}
static int Listをforeachする(List<Foo> foos)
{
var sum = 0;
foreach (var foo in foos)
sum += foo.Value;
return sum;
}
hack 3. まじめに高速化 - for ループの高速化
25
hack 3. まじめに高速化 - for ループの高速化
forとforeachのどっちが速いかテスト
結果 (コレクションの要素数: 3, 回数: 100,000,000):
1. Listをforするテスト - 0.509秒
2. ListをCountを変数にしてからforするテスト - 0.591秒
3. ListをIListとしてCountを変数にしてからforするテスト- 2.066秒
4. Listをforeachするテスト - 2.488秒
5. ListをIListとしてforするテスト - 3.529秒
6. ListをIListとしてforeachするテスト - 9.031秒
26
参考: 配列を順次アクセスするだけでも…
※ BenchmarkDotNet を使用 27
hack 4.
28
hack 4. シャッフルで工夫(謎)
static readonly int[] shuffledCardNumbers = new[]
{ 1, 1, 6, 6, 11, 11, 3, 3, 8, 8, 13, 13, 5, 5,
10, 10, 2, 2, 7, 7, 12, 12, 4, 4, 9, 9 };
29
hack 4. シャッフルで工夫(謎)
30
『全100,000ゲームの結果』
小島は99,999勝, 引き分けは1回 / 全100,000回中
それぞれのプレイヤーが速く手札を場に出せた回数:
小島は156,237回, 石野は66,665回
hack 5.
31
hack 5. 「発想の転換」
32
復習: CPU のキャッシュ メモリー
1次キャッシュ 1次キャッシュ 1次キャッシュ 1次キャッシュ
2次キャッシュ 2次キャッシュ 2次キャッシュ 2次キャッシュ
3次キャッシュ
主メモリー
3次キャッシュは
複数のスレッドで共有
33
hack 5. 「発想の転換」 - 自分以外を遅くする
34
hack 5. 「発想の転換」 - 自分以外を遅くする
35
『全100,000ゲームの結果』
小島は91,549勝、石野は4,393勝, 引き分けは4,058回 / 全100,000回中
それぞれのプレイヤーが速く手札を場に出せた回数:
小島は459,425回, 石野は150,647回
『全100,000ゲームの結果』
小島は94,573勝、石野は2,616勝, 引き分けは2,811回 / 全100,000回中
それぞれのプレイヤーが速く手札を場に出せた回数:
小島は498,093回, 石野は106,065回
hack 5. 「発想の転換」 - 自分以外を遅くする
36
×
×
○
○
○
○
今回のhack (× 失敗、 ○ 成功)
37

More Related Content

PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PPTX
C# LINQ ~深く知って、使いまくろう~
PPTX
メタプログラミング C#
PDF
LINQソースでGO!
PPTX
C#を始めたばかりの人へのLINQ to Objects
PPTX
.NET MVP によるドキドキ・ライブコーディング! 小島の分
PDF
Javaセキュアコーディングセミナー東京第1回 演習
PDF
Javaセキュアコーディングセミナー東京第3回演習の解説
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# LINQ ~深く知って、使いまくろう~
メタプログラミング C#
LINQソースでGO!
C#を始めたばかりの人へのLINQ to Objects
.NET MVP によるドキドキ・ライブコーディング! 小島の分
Javaセキュアコーディングセミナー東京第1回 演習
Javaセキュアコーディングセミナー東京第3回演習の解説

What's hot (20)

KEY
Clojure programming-chapter-2
PDF
PHP5.5新機能「ジェネレータ」初心者入門
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
KEY
Objc lambda
PDF
Mock and patch
PPTX
C#6.0の新機能紹介
PDF
traitを使って楽したい話
PDF
Pythonで始めるDropboxAPI
PDF
Metaprogramming in JuliaLang
PDF
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
PDF
Effective java 勉強会
PDF
Juliaで並列計算
PPTX
Java8 Lambda chapter5
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
PDF
Javaセキュアコーディングセミナー東京第2回演習の解説
PDF
Java puzzlers 2013 at JavaFesta Japan
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
PDF
Emcjp item21
PDF
Introduction Xtend
Clojure programming-chapter-2
PHP5.5新機能「ジェネレータ」初心者入門
Javaセキュアコーディングセミナー東京第1回演習の解説
Objc lambda
Mock and patch
C#6.0の新機能紹介
traitを使って楽したい話
Pythonで始めるDropboxAPI
Metaprogramming in JuliaLang
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
Effective java 勉強会
Juliaで並列計算
Java8 Lambda chapter5
Java SE 8 lambdaで変わる プログラミングスタイル
Javaセキュアコーディングセミナー東京第2回演習の解説
Java puzzlers 2013 at JavaFesta Japan
【java8 勉強会】 怖くない!ラムダ式, Stream API
Emcjp item21
Introduction Xtend
Ad

Similar to C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020 (20)

PDF
Fork/Join Framework。そしてLambdaへ。
PDF
おまえらこのライブラリ使ってないの? m9 (2013-07)
PDF
Python physicalcomputing
PDF
研究生のためのC++ no.2
PDF
Rの高速化
PDF
PHPコアから読み解くPHP5.5
PPTX
C# 7.2 with .NET Core 2.1
PDF
Boost Tour 1_58_0 merge
PDF
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
PDF
RubyKaigi2014: Just in Time compiler for CRuby
PDF
2018年度 若手技術者向け講座 リファクタリング
PDF
わかるコードを書くために For writing clean code
PDF
Apache Torqueについて
PPTX
Prosym2012
PDF
Boost Tour 1.50.0 All
PDF
Pythonによる並列プログラミング -GPGPUも-
ODP
Introduction of Python
PDF
Node予備校 vol.1 名古屋
ODP
Buffer overflow
PDF
Javaセキュアコーディングセミナー東京第3回講義
Fork/Join Framework。そしてLambdaへ。
おまえらこのライブラリ使ってないの? m9 (2013-07)
Python physicalcomputing
研究生のためのC++ no.2
Rの高速化
PHPコアから読み解くPHP5.5
C# 7.2 with .NET Core 2.1
Boost Tour 1_58_0 merge
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
RubyKaigi2014: Just in Time compiler for CRuby
2018年度 若手技術者向け講座 リファクタリング
わかるコードを書くために For writing clean code
Apache Torqueについて
Prosym2012
Boost Tour 1.50.0 All
Pythonによる並列プログラミング -GPGPUも-
Introduction of Python
Node予備校 vol.1 名古屋
Buffer overflow
Javaセキュアコーディングセミナー東京第3回講義
Ad

More from Fujio Kojima (20)

PDF
AIエージェント勉強会~マイクロソフトの最新技術発表を受けて~ (2025/07)
PDF
ITエンジニア (Developer) 向けAIエージェント勉強会 (2025/06/13)
PDF
Burikaigi 2023「C# Live Coding!」 小島の分
PDF
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
PDF
.NET 6 時代のデスクトップ アプリケーション開発
PDF
BuriKaigi 2022 「C# Live Coding!」 小島の分
PDF
C#勉強会 ~ C#9の新機能 ~
PDF
.NET 5 勉強会 ~.NET Framework から .NET へ~
PDF
.NETラボ 勉強会 2021年1月 「C#で機械学習」
PDF
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
PDF
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
PDF
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
PDF
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
PDF
機械学習 (AI/ML) 勉強会 #2 IoT編
PDF
機械学習 (AI/ML) 勉強会 #1 基本編
PPTX
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
PPTX
機械学習入門
PPTX
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
PPTX
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
PPTX
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
AIエージェント勉強会~マイクロソフトの最新技術発表を受けて~ (2025/07)
ITエンジニア (Developer) 向けAIエージェント勉強会 (2025/06/13)
Burikaigi 2023「C# Live Coding!」 小島の分
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発
BuriKaigi 2022 「C# Live Coding!」 小島の分
C#勉強会 ~ C#9の新機能 ~
.NET 5 勉強会 ~.NET Framework から .NET へ~
.NETラボ 勉強会 2021年1月 「C#で機械学習」
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #1 基本編
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
機械学習入門
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...

C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020