SlideShare a Scribd company logo
1 of 23
Download to read offline
足し算をつくろう
豊田陽一 (@rs_wisteria)
今日のおはなし
▰ 自力で + を実装する
▰ 論理回路
▰ 半加算器
▰ 全加算器
▰ 最適化
▰ キャリー先読み
▰ キャリー予測
2進数
▰ 0 or 1で表現される数字
▰ 桁が2で進むから2進数
▰ 1000 = 8
▰ 計算機上でのプリミティブな表現
▰ 1000 + 0100 = 1100
▰ 桁上りが無ければ足し算は分かりやすい
論理回路
▰ true/falseを入出力にもつ回路
▰ AND: 2つの入力がtrueの時のみtrueを出力
▰ OR: 2つの入力がfalseの時以外trueを出力
▰ XOR: 2つの入力が異なる場合trueを出力
▰ NAND: 2つの入力がtrueの時以外trueを出力
▰ NOR: 2つの入力がfalseの時のみtrueを出力
▰ NOT: 1つの入力を反転して出力
論理回路による足し算の実現
▰ 2進数の各桁ごとに論理演算
▰ 0 + 0 = 0
▰ 1 + 0 = 1
▰ 0 + 1 = 1
▰ 1 + 1 = 0
▰ XOR回路によって実現可能
桁上りの対応
▰ 1 + 1 = 0の場合、桁上りが発生
▰ 次の桁の計算結果に影響する
▰ 00 + 00 = 00
▰ 01 + 00 = 01
▰ 00 + 01 = 01
▰ 01 + 01 = 10
▰ 1 + 1 の次の桁に関してはXORで実現できない
半加算器
▰ 入力2つ、出力2つの回路
▰ 入力: 各桁の値 (A, B)
▰ 出力: 加算の結果(S)、桁上りの有無(C)
A B S C
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
半加算器の実現
▰ 2つの論理回路による実現
▰ S = A XOR B
▰ C = A AND B
全加算器
▰ 入力3つ、出力2つの回路
▰ 半加算器の桁上りも入力に加える(Ci)
▰ 値(S)と桁上り(Co)を出力する
A B Ci S Co
0 0 0 0 0
0 1 0 1 0
1 0 0 1 0
1 1 0 0 1
A B Ci S Co
0 0 1 1 0
0 1 1 0 1
1 0 1 0 1
1 1 1 1 1
全加算器の実現
▰ 半加算器(HA)とOR回路による実現
▰ 半加算器2つを利用
▰ A, Bを受け取る半加算器HF1
▰ HF1の結果とCiを受け取る半加算器HF2
▰ HF1, HF2のいずれかで桁上りが発生して
いれば、桁上り(Co)が真になる
全加算器による足し算の実現
▰ 4bit整数(Unsigned)の例 (0~15)
▰ 1つの半加算器、3つの全加算器を利用
▰ 下の桁から桁上りを次の全加算器に伝搬させ
ていく
▰ A + B = S
▰ A = { A4, A3, A2, A1 }
▰ B = { B4, B3, B2, B1 }
▰ S = { S4, S3, S2, S1 }
課題
▰ ビット数が増えるに従い、論理回路の
段数が増える
▰ 2桁目の計算を行うためには1桁目の計算結果
を待つ必要があるた
▰ 各桁の計算を並列に走らせられないだろうか?
キャリー先読み
▰ 全ての桁の計算結果から各桁の桁上りを先読みす
る回路を作る
▰ X: 前の桁の桁上げを考慮した桁上げの有無
▰ X1 = C0 = A0 AND B0
▰ X2 = (A1 and B1) or ((A1 xor B1) and C0)
▰ = (A1 and B1) or ((A1 xor B1) and (A0 and B0))
▰ = (A1 and B1) or ((A1 and A0 and B0) or
▰ (B1 and A0 and B0))
▰ 前の回路の結果Cを使わずにXを表現できた
キャリー先読み (2)
▰ 前の回路の結果を待たずに桁上りの有
無を取得可能になった
▰ 桁数が増えるほど回路が増える
▰ 64bit全部先読みすると一体…
キャリー予測
▰ 全桁数を半分に分割
▰ 上位桁は桁上りがあるパターンと無いパターン
の両方を計算する
▰ 下位桁の結果により、上位桁の結果を選択
▰ 桁数の分割個数を増やすことで高速化
キャリー予測 (2)
▰ ex) 8bit整数の計算
▰ 00111001 + 01001100 (0x39 + 0x4C)
▰ 下位桁: 1001 + 1100 = 0101 + Carry
▰ 上位桁(Carryなし): 0011 + 0100 = 0111
▰ 上位桁(Carryあり): 0011 + 0100 + 0001 = 1000
▰ Carryがあるので、Carryありを選択
▰ 00111001 + 01001100 = 10000111 (0x87)
キャリー予測 (3)
▰ 32bit整数を際限なく分解する
▰ 32→16→8→4→2→1
▰ 5段のマルチプレクサの遅延
▰ 1.5^5倍の回路数
▰ 回路の増え方や遅延がbit長の増加に伴い、ゆ
るやかに増えていく
引き算の実現
▰ 補数を利用する
▰ ex) 9の補数: 足すと9になる数
▰ 3523 - 1245を桁下がりの引き算なしで計算
▰ 3523 + 10000 - 1245 - 10000
▰ = 3523 + 1 + (9999 - 1245) - 10000
▰ = 3524 + 8754 - 10000
▰ = 12278 - 10000
▰ = 2268
2進数での引き算
▰ ex) 1001 - 0110 (0x9-0x6)
▰ = 1001 + 0001 + (1111 - 0110) - 10000
▰ 太字部分は桁下がりが発生しないため、単純に
xorのみで計算可能
▰ = 1001 + 0001 + 1001 - 10000
▰ = 1010 + 1001 - 10000
▰ = 10011 - 10000
▰ = 0011 (0x3)
おまけ: 集合論的アプローチ
▰ 自然数の定義 (ペアノの公理)
▰ 0 = Φ = {}
▰ N: 全ての自然数
▰ successor(n): nの次の値
▰ successor(0) = {0} = 1
▰ successor(1) = successor(successor(0)) =
{ 0, {0} } = 2
▰ successor(2) = successor(successor(1)) =
{ 0, {0}, { 0, {0} } } = 3
ペアノの加法定理
▰ successor(a) + b = successor(a+b)
▰ ex) 1+1=2
▰ successor(0) + successor(0)
= successor(successor(0) + 0)
= successor(successor(0))
= successor(1)
= 2
ペアノの加法定理 (2)
▰ ex) 2+3
▰ suc(1) + suc(2)
= suc(suc(0)) + suc(suc(suc(0)))
= suc(suc(0) + suc(suc(suc(0))))
= suc(suc(suc(suc(suc(0)))))
= 5
▰ + を使わない式に変換できた
おわりに
▰ 足し算、結構大変
▰ bit数が増えるにつれて、回路数が増える
▰ 気軽にCPUのレジスタのbit数が増えない訳
▰ 計算量と回路数のトレードオフ

More Related Content

What's hot

Python仮想環境構築の基礎と ツールの比較
Python仮想環境構築の基礎と ツールの比較Python仮想環境構築の基礎と ツールの比較
Python仮想環境構築の基礎と ツールの比較cocodrips
 
Pythonと型チェッカー
Pythonと型チェッカーPythonと型チェッカー
Pythonと型チェッカーTetsuya Morimoto
 
Famix Next-Generation
Famix Next-GenerationFamix Next-Generation
Famix Next-GenerationJulienDelp
 
Bitwise Operations in Programming
Bitwise Operations in ProgrammingBitwise Operations in Programming
Bitwise Operations in ProgrammingSvetlin Nakov
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門Yoshitaka Seo
 
オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話京大 マイコンクラブ
 
BitVisor Summit 11「2. BitVisor on Aarch64」
BitVisor Summit 11「2. BitVisor on Aarch64」BitVisor Summit 11「2. BitVisor on Aarch64」
BitVisor Summit 11「2. BitVisor on Aarch64」BitVisor
 
Looking glass + videoplayer
Looking glass + videoplayerLooking glass + videoplayer
Looking glass + videoplayer優介 黒河
 
Building confidence in concurrent code with a model checker: TLA+ for program...
Building confidence in concurrent code with a model checker: TLA+ for program...Building confidence in concurrent code with a model checker: TLA+ for program...
Building confidence in concurrent code with a model checker: TLA+ for program...Scott Wlaschin
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようC# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようFujio Kojima
 
疑似乱数
疑似乱数疑似乱数
疑似乱数m4_ms1
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境Fumihito Yokoyama
 
GoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングするGoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングするYuta Ohashi
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
複数のGTFSを用いた時刻表アプリ
複数のGTFSを用いた時刻表アプリ複数のGTFSを用いた時刻表アプリ
複数のGTFSを用いた時刻表アプリMasaki Ito
 
Intoduction to Homotopy Type Therory
Intoduction to Homotopy Type TheroryIntoduction to Homotopy Type Therory
Intoduction to Homotopy Type TheroryJack Fox
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る wata2ki
 
Quantum computer adder grover
Quantum computer adder groverQuantum computer adder grover
Quantum computer adder groverOishiKenta
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさcct-inc
 

What's hot (20)

Python仮想環境構築の基礎と ツールの比較
Python仮想環境構築の基礎と ツールの比較Python仮想環境構築の基礎と ツールの比較
Python仮想環境構築の基礎と ツールの比較
 
Pythonと型チェッカー
Pythonと型チェッカーPythonと型チェッカー
Pythonと型チェッカー
 
Famix Next-Generation
Famix Next-GenerationFamix Next-Generation
Famix Next-Generation
 
Bitwise Operations in Programming
Bitwise Operations in ProgrammingBitwise Operations in Programming
Bitwise Operations in Programming
 
Userland Hooking in Windows
Userland Hooking in WindowsUserland Hooking in Windows
Userland Hooking in Windows
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門
 
オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話
 
BitVisor Summit 11「2. BitVisor on Aarch64」
BitVisor Summit 11「2. BitVisor on Aarch64」BitVisor Summit 11「2. BitVisor on Aarch64」
BitVisor Summit 11「2. BitVisor on Aarch64」
 
Looking glass + videoplayer
Looking glass + videoplayerLooking glass + videoplayer
Looking glass + videoplayer
 
Building confidence in concurrent code with a model checker: TLA+ for program...
Building confidence in concurrent code with a model checker: TLA+ for program...Building confidence in concurrent code with a model checker: TLA+ for program...
Building confidence in concurrent code with a model checker: TLA+ for program...
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようC# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
 
疑似乱数
疑似乱数疑似乱数
疑似乱数
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
GoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングするGoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングする
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
複数のGTFSを用いた時刻表アプリ
複数のGTFSを用いた時刻表アプリ複数のGTFSを用いた時刻表アプリ
複数のGTFSを用いた時刻表アプリ
 
Intoduction to Homotopy Type Therory
Intoduction to Homotopy Type TheroryIntoduction to Homotopy Type Therory
Intoduction to Homotopy Type Therory
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る 
 
Quantum computer adder grover
Quantum computer adder groverQuantum computer adder grover
Quantum computer adder grover
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさ
 

Similar to 足し算をつくろう

CRC-32
CRC-32CRC-32
CRC-327shi
 
コンピュータシステムの理論と実装2
コンピュータシステムの理論と実装2コンピュータシステムの理論と実装2
コンピュータシステムの理論と実装2H T
 
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用MITSUNARI Shigeo
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
kagami_comput2016_03
kagami_comput2016_03kagami_comput2016_03
kagami_comput2016_03swkagami
 
機械系のためのメカトロニクス ディジタル回路
機械系のためのメカトロニクス ディジタル回路機械系のためのメカトロニクス ディジタル回路
機械系のためのメカトロニクス ディジタル回路makoto shimojo
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しようUnity Technologies Japan K.K.
 
kagami_comput2016_02
kagami_comput2016_02kagami_comput2016_02
kagami_comput2016_02swkagami
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Inc.
 
kagami_comput2015_2
kagami_comput2015_2kagami_comput2015_2
kagami_comput2015_2swkagami
 

Similar to 足し算をつくろう (14)

明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
CRC-32
CRC-32CRC-32
CRC-32
 
コンピュータシステムの理論と実装2
コンピュータシステムの理論と実装2コンピュータシステムの理論と実装2
コンピュータシステムの理論と実装2
 
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
kagami_comput2016_03
kagami_comput2016_03kagami_comput2016_03
kagami_comput2016_03
 
機械系のためのメカトロニクス ディジタル回路
機械系のためのメカトロニクス ディジタル回路機械系のためのメカトロニクス ディジタル回路
機械系のためのメカトロニクス ディジタル回路
 
計算機理論入門03
計算機理論入門03計算機理論入門03
計算機理論入門03
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう
 
レポート1
レポート1レポート1
レポート1
 
kagami_comput2016_02
kagami_comput2016_02kagami_comput2016_02
kagami_comput2016_02
 
5 Info Theory
5 Info Theory5 Info Theory
5 Info Theory
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
kagami_comput2015_2
kagami_comput2015_2kagami_comput2015_2
kagami_comput2015_2
 

More from Yoichi Toyota

超フランクにスクラムの大事なことの話をする
超フランクにスクラムの大事なことの話をする超フランクにスクラムの大事なことの話をする
超フランクにスクラムの大事なことの話をするYoichi Toyota
 
ジャワカレーをおいしく作る最後の一押し
ジャワカレーをおいしく作る最後の一押しジャワカレーをおいしく作る最後の一押し
ジャワカレーをおいしく作る最後の一押しYoichi Toyota
 
ライブラリを作る思考回路
ライブラリを作る思考回路ライブラリを作る思考回路
ライブラリを作る思考回路Yoichi Toyota
 
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技Yoichi Toyota
 
はじめてのDynamoDBスキーマ設計
はじめてのDynamoDBスキーマ設計はじめてのDynamoDBスキーマ設計
はじめてのDynamoDBスキーマ設計Yoichi Toyota
 
オブジェクト指向についてあまり知られていないこと
オブジェクト指向についてあまり知られていないことオブジェクト指向についてあまり知られていないこと
オブジェクト指向についてあまり知られていないことYoichi Toyota
 
Ruby is comming ractor編
Ruby is comming ractor編Ruby is comming ractor編
Ruby is comming ractor編Yoichi Toyota
 
array.map(&:key)ってなんやねん
array.map(&:key)ってなんやねんarray.map(&:key)ってなんやねん
array.map(&:key)ってなんやねんYoichi Toyota
 
はじめてのPull Request
はじめてのPull RequestはじめてのPull Request
はじめてのPull RequestYoichi Toyota
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞYoichi Toyota
 
jqで極めるシェル芸の話
jqで極めるシェル芸の話jqで極めるシェル芸の話
jqで極めるシェル芸の話Yoichi Toyota
 
React Hooksでカスタムフックをつくろう
React HooksでカスタムフックをつくろうReact Hooksでカスタムフックをつくろう
React HooksでカスタムフックをつくろうYoichi Toyota
 
ActionCableのクライアントはRails外から利用できるのか
ActionCableのクライアントはRails外から利用できるのかActionCableのクライアントはRails外から利用できるのか
ActionCableのクライアントはRails外から利用できるのかYoichi Toyota
 
サーバーレスアプリケーションの作り方
サーバーレスアプリケーションの作り方サーバーレスアプリケーションの作り方
サーバーレスアプリケーションの作り方Yoichi Toyota
 
SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方Yoichi Toyota
 
AWS WAFでらくらくファイアーウォール生活
AWS WAFでらくらくファイアーウォール生活AWS WAFでらくらくファイアーウォール生活
AWS WAFでらくらくファイアーウォール生活Yoichi Toyota
 
Docker in production
Docker in productionDocker in production
Docker in productionYoichi Toyota
 
How to fight against “full scratch disease”
How to fight against  “full scratch disease”How to fight against  “full scratch disease”
How to fight against “full scratch disease”Yoichi Toyota
 
Amazon lexを触ってみた
Amazon lexを触ってみたAmazon lexを触ってみた
Amazon lexを触ってみたYoichi Toyota
 
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーンForkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーンYoichi Toyota
 

More from Yoichi Toyota (20)

超フランクにスクラムの大事なことの話をする
超フランクにスクラムの大事なことの話をする超フランクにスクラムの大事なことの話をする
超フランクにスクラムの大事なことの話をする
 
ジャワカレーをおいしく作る最後の一押し
ジャワカレーをおいしく作る最後の一押しジャワカレーをおいしく作る最後の一押し
ジャワカレーをおいしく作る最後の一押し
 
ライブラリを作る思考回路
ライブラリを作る思考回路ライブラリを作る思考回路
ライブラリを作る思考回路
 
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技
 
はじめてのDynamoDBスキーマ設計
はじめてのDynamoDBスキーマ設計はじめてのDynamoDBスキーマ設計
はじめてのDynamoDBスキーマ設計
 
オブジェクト指向についてあまり知られていないこと
オブジェクト指向についてあまり知られていないことオブジェクト指向についてあまり知られていないこと
オブジェクト指向についてあまり知られていないこと
 
Ruby is comming ractor編
Ruby is comming ractor編Ruby is comming ractor編
Ruby is comming ractor編
 
array.map(&:key)ってなんやねん
array.map(&:key)ってなんやねんarray.map(&:key)ってなんやねん
array.map(&:key)ってなんやねん
 
はじめてのPull Request
はじめてのPull RequestはじめてのPull Request
はじめてのPull Request
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 
jqで極めるシェル芸の話
jqで極めるシェル芸の話jqで極めるシェル芸の話
jqで極めるシェル芸の話
 
React Hooksでカスタムフックをつくろう
React HooksでカスタムフックをつくろうReact Hooksでカスタムフックをつくろう
React Hooksでカスタムフックをつくろう
 
ActionCableのクライアントはRails外から利用できるのか
ActionCableのクライアントはRails外から利用できるのかActionCableのクライアントはRails外から利用できるのか
ActionCableのクライアントはRails外から利用できるのか
 
サーバーレスアプリケーションの作り方
サーバーレスアプリケーションの作り方サーバーレスアプリケーションの作り方
サーバーレスアプリケーションの作り方
 
SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方
 
AWS WAFでらくらくファイアーウォール生活
AWS WAFでらくらくファイアーウォール生活AWS WAFでらくらくファイアーウォール生活
AWS WAFでらくらくファイアーウォール生活
 
Docker in production
Docker in productionDocker in production
Docker in production
 
How to fight against “full scratch disease”
How to fight against  “full scratch disease”How to fight against  “full scratch disease”
How to fight against “full scratch disease”
 
Amazon lexを触ってみた
Amazon lexを触ってみたAmazon lexを触ってみた
Amazon lexを触ってみた
 
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーンForkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
 

足し算をつくろう