SlideShare a Scribd company logo
1 of 78
Download to read offline
C#でわかる
こわくないM
2017.5.27 GIFSHARP #1 KOUJI MATSUI (@KEKYO2)
Kouji Matsui - kekyo
• NAGOYA city, AICHI pref., JP
• Twitter – @kekyo2 / Facebook
• ux-spiral corporation
• Microsoft Most Valuable Professional VS
and DevTech 2015-
• Certified Scrum master / Scrum product
owner
• Center CLR organizer.
• .NET/C#/F#/IL/metaprogramming or like…
• Bike rider
はじめに
•ずっと思考していたことを、どうやって自分
の言葉で表現するかを考えていた。今日はそ
のアウトプットです。
•C#書ける人にリーチできるように考えました。
•本日が「岐阜Sharp」であることは、もちろん
承知しております ☺
Agenda
事の始まり
Nullを安全になんとかしたい
ネストしたNullの安全な処理
名前を変える
処理の連鎖
LINQクエリ
岐阜
まとめ
事の始まり
事の始まり
事の始まり
事の始まり
分かりやすい課題だし、
ここからやるのが良かろう…
※Nullの議論や考察の深掘りは、それだけで沼であり、本題か
ら外れるのでここでは扱いません。例えば、.NETのNullable<T>
はどうなのかとか。
Agenda
事の始まり
Nullを安全になんとかしたい
ネストしたNullの安全な処理
名前を変える
処理の連鎖
LINQクエリ
岐阜
まとめ
Nullを安全になんとかしたい
例がアレだが…
ジェネリックじゃない辞書
Nullを安全になんとかしたい
Nullを安全になんとかしたい
.NET Frameworkの進化:
• Dictionary<TKey, TValue> : .NET 2.0で追加された。
• bool TryGetValue(TKey key, out TValue value)
boolの判定を強制させることで、
失敗についてコード化させる。
が、モヤモヤする…
Nullを安全になんとかしたい
値が存在する場合だけ、コールバック関数を実行したらどうか。
こういうのを
作っておき…
Nullを安全になんとかしたい
値が存在する場合だけ、コールバック関数を実行したらどうか。
値が存在しない場合は
単に無視され実行されない
値を安全に操作したい
辞書の例を一般化して、
任意の参照型インスタンスを
安全に操作したい。
入れ物(ValueHolder<T>)に
入れておき、Nullチェックする
値を安全に操作したい
値がnullの場合は
無視される
値を安全に操作したい
これだと一回の操作ですべてが終わるので、ありがたみがない。
実際には値に対して複数の処理を連鎖的に実行したいはず。そこで:
戻り値を返す関数
を指定できる
関数を実行して
戻り値を返す
値を安全に操作したい
安全に操作できる
何か違う…
何でNullを手動で判定
しているんだ
TryExecuteの戻り値はT型なので、そこから先はNull検査が必要。
では、その値をValueHolder<T>に入れれば良いのでは?
値を安全に操作したい
処理が連鎖出来るが、
いちいち入れ直す
必要がある
モヤる
値を安全に操作したい
ValueHolder<T>で
ラップして返す
ターミネーション
処理用
値を安全に操作したい
実行される
実行されない
値を安全に操作したい
途中からNullになると
以降は安全に無視
値を安全に操作したい
こんなユーティリティ
を作っておく
値を安全に操作したい
定義が楽になる
Agenda
事の始まり
Nullを安全になんとかしたい
ネストしたNullの安全な処理
名前を変える
処理の連鎖
LINQクエリ
岐阜
まとめ
ネストしたNullの安全な処理
関数内でもValueHolder<T>を使いたいかもしれない:
Func<T, T>
ネストしたNullの安全な処理
Func<T, T>から
Func<T, ValueHolder<T>>に変更
もうラップしなくても
良くなった
ネストしたNullの安全な処理
今度はこっちがTをそのまま
返しているのでエラー
ネストしたNullの安全な処理
Someを使ってラップして返すと
ValueHolder<T>となって辻褄が合う
ネストしたNullの安全な処理
我々は、これを一般的に「Option型」呼んでいます:
Agenda
事の始まり
Nullを安全になんとかしたい
ネストしたNullの安全な処理
名前を変える
処理の連鎖
LINQクエリ
岐阜
まとめ
名前を変える
ちょっと名前に馴染みが薄
いかもしれませんが:
•“TryExecute”を”Bind”
•”Some”を”Return”
に変えます。
名前を変える
これが、
「Optionモナド」
です。
※あるいはMaybeモナドと言う場合もあります。
※ツッコミが入りそうだから、ちょっとまって♡
モナドを構成するもの
モナドは、Optionだけではなく、様々な種類のものがありますが、
ある構造を「モナド」と呼ぶには、以下の構造を持っている必要が
あります:
• 型構築子 : 値の型をジェネリックとして受け取ることが出来る、
Option<T>型そのものの事です(.NET的に言うなら、オープンジェ
ネリック型)。
• return関数 : Return関数の事です。Tの値をOption<T>に変換します
• bind関数 : Bind関数の事です。Tの値を引数に取る関数を実行し、
Option<U>の値を返します
Wikipedia [モナド(プログラミング)]
モナドを構成するもの
名称がぶれる事がある(returnをunitと呼ぶ場合など)のは、
処理系によって呼称がバラバラだからですが、モナドらしい構
造を持っていれば、名称自体は重要ではありません。
• Wikipediaでは、returnをunitとして説明しています。
• returnはHaskellのreturnから来ています。
• bindはflatMapと呼ぶ場合もあります。
ただし、会話するときには相手に通じないかもしれないので
注意したほうが良いでしょう。
モナドを構成するもの
名称以外にも、「モナドである」と言うには、以下の規則も
備えている必要があります:
1. return関数をそのままbind関数に適用すると、元の値のま
まとなる:
要するにそのまま
ラップして返している
モナドを構成するもの
「 return関数をそのままbind関数に適用」
を素直に書くと、より分かりやすい
モナドを構成するもの
2. ふたつの関数を続けてbindするのは、これらの関数から決
まるひとつの関数を bind することに等しい:
モナドを構成するもの
“DEF”と”GHI”を計算する式を「先に」bindして、そ
の式を”ABC”のOptionにbindしている:
(A bind B) bind C ←同じ→ A bind (B bind C)
モナドを構成するもの
上記の規則のことを
「モナド則」
と言います。
※一見してモナドのような形をした型があっても、この規則に合
致しない場合は、その型はモナドではありません。
Bindを正確に実装
ここまで述べたOption<T>.Bindは、実は正確ではありません。
Option<T>を返す関数(?)
違う型(Option<CultureInfo>)を返し
たくても、Tがstringなのでエラー
Bindを正確に実装
UをジェネリックとしてOption<U>を
返す関数にする。
関数がOption<T>を返しても正しく
マッチする。
• bind関数 : Bind関数の事です。Tの値を引数に取る関数を実行し、
Option<U>の値を返します
その他
“TryExecute”に対応するものを調べたところ、”Match”と呼称す
ることがありました。
これについてはまた後で取り上げますが、とりあえず以降の
サンプルはMatchと表記します。
Agenda
事の始まり
Nullを安全になんとかしたい
ネストしたNullの安全な処理
名前を変える
処理の連鎖
LINQクエリ
岐阜
まとめ
処理の連鎖
複雑な計算処理を安全に行おうとすると、Bindがネストするこ
とがあたりまえになります:
すべての値が存在する場合だけ、
合計を計算する
処理の連鎖
実はこの構造、驚くべきことにLINQのSelectManyにそっくりです:
すべての値が存在する場合だけ、
合計を計算する
処理の連鎖
LINQで異なるところは:
• Return(value)がnew[] { value } // 要素1個だけの配列の生成
• Bind()がSelectMany() // ネストしたリストのアンループ
です。
※最後の出力はMatchがないので、foreachで出力しています。
※bindがflatMapと呼ばれる事から、SelectManyに近しい感じもします。
処理の連鎖
意味を考えてみると:
1. 要素1個だけの配列:
配列のインスタンス(int[])は常に存在し、要素が1個存在するか
又は存在しないか。
→ 要素が1個存在する場合だけ処理 ≒ Nullではない場合だけ処理
Value Null [1] [0]
処理の連鎖
2. SelectManyで配列を返す:
結果が1個だけ格納された、又は要素が格納されていない配列のイ
ンスタンスを返すことで、結果がNullかどうかを間接的に表現
3. 最終結果はIEnumerable<int>だけど、要素が1個存在するか又は存在
しないか、のどちらかで表現される。
処理の連鎖
SelectManyに渡す関数のことを「継続」、このような形式を「継
続渡し」と呼びます:
継続となるラムダ式が3重にネストしている
継続はコールバックとみなせる
Agenda
事の始まり
Nullを安全になんとかしたい
ネストしたNullの安全な処理
名前を変える
処理の連鎖
LINQクエリ
岐阜
まとめ
LINQクエリ構文
LINQと構造がそっくりということは、Option<T>もわざとLINQっぽ
く定義することで、LINQのクエリ構文に対応できます:
Bindに対応するSelectManyの実装
(邪魔なので)拡張メソッドで定義
引数が多少違うのは、LINQクエリ構文
を効率よく実行するためで、
Bindの呼び出し回数を削減する
LINQクエリ構文
すると、このようにシンプルに書けます:
ここらへんがなんとなくbind
bindが全て成功(有効な値)
すると、計算してreturn
LINQクエリ構文
このクエリ構文は、シンプルに短く書けるものの、意味が分かり
づらいことが問題です。
• fromがbindで、selectがreturnとは、想像しにくい。
つまり、LINQはあくまでコレクション(シーケンス)に対する操
作である(だからSQLっぽいキーワード)のに、その構文を全く別
の用途に応用しているからです。
※私自身は、このように書けることにあまりメリットを見いだせ
ていません…
LINQクエリ構文
ですが、なんとなく
LINQがモナドの一種のように見える
と言うのは分かりましたか?
※断定するのは去年あたりに自信がなくなって以来解決していな
いので、やめておきます
ところでこの会は
岐阜Sharp (giFSharp)
でしたね?
Agenda
事の始まり
Nullを安全になんとかしたい
ネストしたNullの安全な処理
名前を変える
処理の連鎖
LINQクエリ
岐阜
まとめ
F#でのモナド
基本的に、C#で見せた構造と変わりません。
(サンプルコードはC#に最適化してありますが)
ここでは、
「なぜC#ではなくF#を使いたいか?」
にフォーカスします。
F#でのOptionモナド
F#でOptionモナドを使ってみます。F#標準のOption型と被るので
”Optional”と変更していますが、C#で書いたクラスをそのまま使えます:
書き方もC#とほとんど同じ
F#でのLINQ
F#でのLINQも書き直して対比させてみます:
書き方もC#とほとんど同じ
IEnumerable<T>の共変性を考慮した
型推論が難しいので、ここだけ補助
F#でのシーケンス
F#ではLINQ演算子を直接使うことはあまりなく、代わりに
シーケンス(Seq)の演算子を使います:
SelectMany (Bind) は
Seq.collectに対応します
Seqなら型推論出来るので、補助は不要
F#でのシーケンス
しかし、シーケンスを使うなら、もっと良い方法があります。
シーケンス式です:
ここらへんがSeq.collect (bind)
bindが全て成功(有効な値)
すると、計算してreturn
C#でのLINQクエリ構文と
そっくりです
F#でのシーケンス
ここではシーケンス式自体はあまり掘り下げませんが、F#はこの
「ブロックで囲まれた式」をビルトインで定義しています:
•シーケンス向き(Seq<T>) : seq { … }
•非同期処理向き(Async<T>) : async { … }
•DBクエリ向き(IQueryable<T>) : query { … }
そして、これらビルトインワークフロー以外にも:
•独自の計算定義 : hogehoge { … }
→ コンピュテーション式
コンピュテーション式の導入
Optionalをコンピュテーション式で使えるようにします:
「ビルダークラス」を定義します。
最低限、”Return”と”Bind”を定義しますが、
既存のOptionalに転送するだけです
このクラスのインスタンスを
”optional”と命名しておきます
コンピュテーション式の導入
OptionalBuilderとそのインスタンス”optional”を見えるスコープ
に配置しておけば:
optionalコンピュテーションブロックが
使用可能に!!
let! (let-bang) でbindが実行される。
値が無効ならそれ以上評価されない
(Optional.Bindが無視する)
自然で穏当な式表記
optionalで生成されたインスタンスは
Optional<T>そのもの
コンピュテーション式の導入
C# LINQクエリ構文
F# カスタムコンピュテーション式
(&中身はOptionモナド)
コンピュテーション式の導入
コンピュテーション式の利点:
• C# LINQクエリ構文と比べ、より自然で適した文法にしやすい。
使用可能なキーワードが多い。
let, do, return, for..do, try..finally, use, yieldなど、大体網羅出来る
• ビルトインワークフロー群と同じ手法で拡張でき、LINQの制約
に縛られない。
• バックエンドはほぼモナドそのまま。
「Computation Expressions」 https://docs.microsoft.com/en-
us/dotnet/fsharp/language-reference/computation-expressions
コンピュテーション式の導入
コンピュテーション式の欠点:
• F#でしか使えない ☺
その他
”Match”の由来が何かを説明するのを忘れていました。
F#には「判別共用体」があります。これを使って強力なパター
ンマッチングが出来るのですが:
F#のOption型(判別共用体)
Some: 任意の型の値を保持
None: 値を保持しない
パターンマッチング:
OptionにはSomeかNoneしかありえない
→網羅性の自動検査が出来る
その他
値が存在する・値が存在しない、の両方のパターンの処理を
書かせるため、Matchと呼称していると思われます。
値が存在する場合と存在しない場合の
両方の関数を必ず書かせることで
網羅性を担保する
Agenda
事の始まり
Nullを安全になんとかしたい
ネストしたNullの安全な処理
名前を変える
処理の連鎖
LINQクエリ
岐阜
まとめ
モナドとは?
モナドとは:
モナドは計算を表現する構造であり、計算ステップの列から
なる。つまり、型がモナド構造をもつというのは、命令を繋げ
るやり方、言い換えるとその型をもつ関数をネストさせる規則
が定まっていることをいう。
Wikipedia [モナド (プログラミング)]
モナドとは?
C#での、モナドの適用動機:
• 正直、あまりない(だから知識共有されない?)。
• LINQの演算子がモナドっぽいけど、普段意識することはない。
• 文(Statement : voidな手続き)とは相性が悪い。Bindに渡す関数が
値を返せない。
F#での、モナドの適用動機:
• 関数型プログラミング言語では一般的に使われる概念(?)。全て
の式が値を返すので、自然に導入できる。
• コンピュテーション式で自然に拡張・記述しやすく出来る
モナドはデザインパターンか?
モナドがデザインパターンと呼べるかどうかわかりませんが:
デザインパターン(または設計パターン)とは、過去のソフ
トウェア設計者が発見し編み出した設計ノウハウを蓄積し、名
前をつけ、再利用しやすいように特定の規約に従ってカタログ
化したものである。
Wikipedia [デザインパターン]
モナドはプログラミングパラダイムか?
モナドがプログラミングパラダイムと呼べるかどうかわかり
ませんが:
プログラミングパラダイムは、プログラマにプログラムの見
方を与えるものと言える。たとえば、オブジェクト指向プログ
ラミングにおいて、プログラムとはオブジェクトをつくりそれ
を管理するものである。関数型プログラミングにおいては、状
態を持たない関数の評価の連続である。
Wikipedia [プログラミングパラダイム]
謝辞
• 「モナドの脅威」
matarillo.com http://matarillo.com/general/monads.php
• 「もしC#プログラマーがMaybeモナドを実装したら」
gab_km http://blog.livedoor.jp/gab_km/archives/1361759.html
• 「Optionに見るコンピュテーション式のつくり方」
bleis-tift http://bleis-tift.hatenablog.com/entry/how-to-make-
computation-expression
謝辞
Thanks join!
The implementations --> GitHub: CSharpMonadic
◦ https://github.com/kekyo/CSharpMonadic/
My blog
◦ http://www.kekyo.net/

More Related Content

What's hot

組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0Masakazu Matsushita
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門Tadahiro Ishisaka
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理KageShiron
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介torisoup
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 

What's hot (20)

組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 

Viewers also liked

continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN LinkingKouji Matsui
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術Unity Technologies Japan K.K.
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法Yoshifumi Kawai
 
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#Yoshifumi Kawai
 
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityYoshifumi Kawai
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions IIIKouji Matsui
 
Final LINQ Extensions
Final LINQ ExtensionsFinal LINQ Extensions
Final LINQ ExtensionsKouji Matsui
 
Final LINQ Extensions II
Final LINQ Extensions IIFinal LINQ Extensions II
Final LINQ Extensions IIKouji Matsui
 
趣味のAzure websitesでパケ死必定?!自腹課金の現実
趣味のAzure websitesでパケ死必定?!自腹課金の現実趣味のAzure websitesでパケ死必定?!自腹課金の現実
趣味のAzure websitesでパケ死必定?!自腹課金の現実Kouji Matsui
 
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」Fujio Kojima
 
Open Fab Night Sensor Special - Android編
Open Fab Night Sensor Special - Android編Open Fab Night Sensor Special - Android編
Open Fab Night Sensor Special - Android編Akira Hatsune
 
ミニ四足 ~歩くミニ四駆~
ミニ四足 ~歩くミニ四駆~ミニ四足 ~歩くミニ四駆~
ミニ四足 ~歩くミニ四駆~Bizan Nishimura
 
これからの「async/await」の話をしよう
これからの「async/await」の話をしようこれからの「async/await」の話をしよう
これからの「async/await」の話をしようKouji Matsui
 
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 20174 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017Takaaki Suzuki
 
Rlsにおけるプロダクト プロジェクトマネジメント
Rlsにおけるプロダクト プロジェクトマネジメントRlsにおけるプロダクト プロジェクトマネジメント
Rlsにおけるプロダクト プロジェクトマネジメントRecruit Lifestyle Co., Ltd.
 
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指してAkira Inoue
 
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創Itsuki Kuroda
 

Viewers also liked (20)

continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN Linking
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
 
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
 
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions III
 
Final LINQ Extensions
Final LINQ ExtensionsFinal LINQ Extensions
Final LINQ Extensions
 
LINQ基本のキ
LINQ基本のキLINQ基本のキ
LINQ基本のキ
 
Final LINQ Extensions II
Final LINQ Extensions IIFinal LINQ Extensions II
Final LINQ Extensions II
 
趣味のAzure websitesでパケ死必定?!自腹課金の現実
趣味のAzure websitesでパケ死必定?!自腹課金の現実趣味のAzure websitesでパケ死必定?!自腹課金の現実
趣味のAzure websitesでパケ死必定?!自腹課金の現実
 
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
 
Open Fab Night Sensor Special - Android編
Open Fab Night Sensor Special - Android編Open Fab Night Sensor Special - Android編
Open Fab Night Sensor Special - Android編
 
ミニ四足 ~歩くミニ四駆~
ミニ四足 ~歩くミニ四駆~ミニ四足 ~歩くミニ四駆~
ミニ四足 ~歩くミニ四駆~
 
これからの「async/await」の話をしよう
これからの「async/await」の話をしようこれからの「async/await」の話をしよう
これからの「async/await」の話をしよう
 
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 20174 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
 
Rlsにおけるプロダクト プロジェクトマネジメント
Rlsにおけるプロダクト プロジェクトマネジメントRlsにおけるプロダクト プロジェクトマネジメント
Rlsにおけるプロダクト プロジェクトマネジメント
 
Setとして活動しはじめた話
Setとして活動しはじめた話Setとして活動しはじめた話
Setとして活動しはじめた話
 
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
 
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創
社内スタートアップによる組織の成長に伴い発生する痛みとその解決策(スクラム&リーンスタートアップ導入)について #devlove #devlove創
 

Similar to C#でわかる こわくないMonad

Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成Kouji Matsui
 
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)Shinichi Nakagawa
 
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!慎一 古賀
 
リモートチームとふりかえり改善フレームワーク
リモートチームとふりかえり改善フレームワークリモートチームとふりかえり改善フレームワーク
リモートチームとふりかえり改善フレームワークMaehana Tsuyoshi
 
効果的なスプリントプランニングのトライ
効果的なスプリントプランニングのトライ効果的なスプリントプランニングのトライ
効果的なスプリントプランニングのトライ貴明 今井
 
冬休みにAzureを学習したい方へ!おすすめマイクロソフト公式サイトまとめ情報
冬休みにAzureを学習したい方へ!おすすめマイクロソフト公式サイトまとめ情報冬休みにAzureを学習したい方へ!おすすめマイクロソフト公式サイトまとめ情報
冬休みにAzureを学習したい方へ!おすすめマイクロソフト公式サイトまとめ情報Rie Moriguchi
 
Bootstrapにちょい足しアニメーション@春のJavascript祭り
Bootstrapにちょい足しアニメーション@春のJavascript祭りBootstrapにちょい足しアニメーション@春のJavascript祭り
Bootstrapにちょい足しアニメーション@春のJavascript祭りMasayuki Abe
 
セキュアに使おう Microsoft Teams
セキュアに使おう Microsoft Teamsセキュアに使おう Microsoft Teams
セキュアに使おう Microsoft Teams祥子 松山
 
What's Cooking In Ruby 2.7
What's Cooking In Ruby 2.7What's Cooking In Ruby 2.7
What's Cooking In Ruby 2.7Akinori Musha
 
20121017_アプリ制作勉強会@GMO Yours
20121017_アプリ制作勉強会@GMO Yours20121017_アプリ制作勉強会@GMO Yours
20121017_アプリ制作勉強会@GMO YoursYozo SATO
 
[enPiT筑波大ワークショップ(成果発表会)情報交換会]全部スクラム!~SIerで大切だったこと、サービサーで大切だったこと~
[enPiT筑波大ワークショップ(成果発表会)情報交換会]全部スクラム!~SIerで大切だったこと、サービサーで大切だったこと~[enPiT筑波大ワークショップ(成果発表会)情報交換会]全部スクラム!~SIerで大切だったこと、サービサーで大切だったこと~
[enPiT筑波大ワークショップ(成果発表会)情報交換会]全部スクラム!~SIerで大切だったこと、サービサーで大切だったこと~Shigeki Morizane
 
JXUGC #9 Xamarin.Forms Mvvm Teachathon
JXUGC #9 Xamarin.Forms Mvvm TeachathonJXUGC #9 Xamarin.Forms Mvvm Teachathon
JXUGC #9 Xamarin.Forms Mvvm TeachathonYoshito Tabuchi
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホンKouji Matsui
 
Azure上でec cubeを運用するポイント
Azure上でec cubeを運用するポイントAzure上でec cubeを運用するポイント
Azure上でec cubeを運用するポイントMakoto Nishimura
 
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜Koichi ITO
 
Scrumワークショップ
ScrumワークショップScrumワークショップ
ScrumワークショップYou&I
 
Aiming における scrum 20130118
Aiming における scrum 20130118Aiming における scrum 20130118
Aiming における scrum 20130118俊仁 小林
 
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?なべ
 

Similar to C#でわかる こわくないMonad (20)

Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成
 
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
 
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!
 
Ciecleci
CiecleciCiecleci
Ciecleci
 
リモートチームとふりかえり改善フレームワーク
リモートチームとふりかえり改善フレームワークリモートチームとふりかえり改善フレームワーク
リモートチームとふりかえり改善フレームワーク
 
効果的なスプリントプランニングのトライ
効果的なスプリントプランニングのトライ効果的なスプリントプランニングのトライ
効果的なスプリントプランニングのトライ
 
冬休みにAzureを学習したい方へ!おすすめマイクロソフト公式サイトまとめ情報
冬休みにAzureを学習したい方へ!おすすめマイクロソフト公式サイトまとめ情報冬休みにAzureを学習したい方へ!おすすめマイクロソフト公式サイトまとめ情報
冬休みにAzureを学習したい方へ!おすすめマイクロソフト公式サイトまとめ情報
 
Bootstrapにちょい足しアニメーション@春のJavascript祭り
Bootstrapにちょい足しアニメーション@春のJavascript祭りBootstrapにちょい足しアニメーション@春のJavascript祭り
Bootstrapにちょい足しアニメーション@春のJavascript祭り
 
セキュアに使おう Microsoft Teams
セキュアに使おう Microsoft Teamsセキュアに使おう Microsoft Teams
セキュアに使おう Microsoft Teams
 
What's Cooking In Ruby 2.7
What's Cooking In Ruby 2.7What's Cooking In Ruby 2.7
What's Cooking In Ruby 2.7
 
20121017_アプリ制作勉強会@GMO Yours
20121017_アプリ制作勉強会@GMO Yours20121017_アプリ制作勉強会@GMO Yours
20121017_アプリ制作勉強会@GMO Yours
 
Fun with BrainPad
Fun with BrainPadFun with BrainPad
Fun with BrainPad
 
[enPiT筑波大ワークショップ(成果発表会)情報交換会]全部スクラム!~SIerで大切だったこと、サービサーで大切だったこと~
[enPiT筑波大ワークショップ(成果発表会)情報交換会]全部スクラム!~SIerで大切だったこと、サービサーで大切だったこと~[enPiT筑波大ワークショップ(成果発表会)情報交換会]全部スクラム!~SIerで大切だったこと、サービサーで大切だったこと~
[enPiT筑波大ワークショップ(成果発表会)情報交換会]全部スクラム!~SIerで大切だったこと、サービサーで大切だったこと~
 
JXUGC #9 Xamarin.Forms Mvvm Teachathon
JXUGC #9 Xamarin.Forms Mvvm TeachathonJXUGC #9 Xamarin.Forms Mvvm Teachathon
JXUGC #9 Xamarin.Forms Mvvm Teachathon
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホン
 
Azure上でec cubeを運用するポイント
Azure上でec cubeを運用するポイントAzure上でec cubeを運用するポイント
Azure上でec cubeを運用するポイント
 
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
 
Scrumワークショップ
ScrumワークショップScrumワークショップ
Scrumワークショップ
 
Aiming における scrum 20130118
Aiming における scrum 20130118Aiming における scrum 20130118
Aiming における scrum 20130118
 
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
 

More from Kouji Matsui

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理Kouji Matsui
 
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Kouji Matsui
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewKouji Matsui
 
What's Functional?
What's Functional?What's Functional?
What's Functional?Kouji Matsui
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTEKouji Matsui
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculatorKouji Matsui
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhereKouji Matsui
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of ReferenceKouji Matsui
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.Kouji Matsui
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and TaskKouji Matsui
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITKouji Matsui
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:codeKouji Matsui
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPSKouji Matsui
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basicsKouji Matsui
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組みKouji Matsui
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけようKouji Matsui
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式Kouji Matsui
 
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話Kouji Matsui
 
SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南Kouji Matsui
 
Hello! intermediate language
Hello! intermediate languageHello! intermediate language
Hello! intermediate languageKouji Matsui
 

More from Kouji Matsui (20)

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overview
 
What's Functional?
What's Functional?What's Functional?
What's Functional?
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTE
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculator
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhere
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of Reference
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and Task
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:code
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPS
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basics
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式
 
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話
 
SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南
 
Hello! intermediate language
Hello! intermediate languageHello! intermediate language
Hello! intermediate language
 

C#でわかる こわくないMonad