Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
とあるライブラリをGoに移植した結果……
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
MakKi
November 13, 2018
4.5k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
とあるライブラリをGoに移植した結果……
golang.tokyo #19 LT
MakKi
November 13, 2018
More Decks by MakKi
See All by MakKi
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
47
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
60
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
Recap: An Operating System in Go
makki_d
2
170
XSLTで作るBrainfuck処理系
makki_d
0
390
眼鏡と視力についての誤解を解く
makki_d
0
230
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
780
range over funcのエラー処理
makki_d
1
1.8k
GoとテストとインプロセスDB
makki_d
3
700
Featured
See All Featured
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Google's AI Overviews - The New Search
badams
0
1k
HDC tutorial
michielstock
2
710
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Practical Orchestrator
shlominoach
191
11k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
The Curse of the Amulet
leimatthew05
1
13k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
570
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Git: the NoSQL Database
bkeepers
PRO
432
67k
Transcript
とあるライブラリを Goに移植した結果…… golang.tokyo #19 LT 牧内大輔
早速ですが質問です
何を考えますか?
自己紹介 牧内大輔 MakKi / @makki_d 所属:KLab株式会社 ◦ このビルのもう少し下の階
やっていること 大昔 • AviUtl 透過性ロゴフィルタ他 現在(仕事) • オンライン対戦の同期まわり ◦ 中継サーバ:Go
◦ クライアント:C# (Unity) 現在(趣味) • とあるライブラリをGoに移植
移植前の私
移植後の私 デンソーウェーブ BCH符号 JIS X 0510 ISO/IEC 18004 8つのマスクパターン GB2312
バージョン1〜40 ガロア拡大体 Alphanumeric Mode ReedSolomon符号 ISO-8859-1 構造的連接 þ(ソーン) AIM Inc. Position Pattern 拡張チャネル解釈 中华人民共和国国家标准
いったい私の身に何が?
移植したライブラリ ZXing (zebra crossing) • https://github.com/zxing/zxing • QRコードとかを読んだり書いたりするライブラリ • 多くのフォーマットに対応
◦ 2次元: QRCode, DataMatrix, PDF417, … ◦ 1次元: UPC/EAN, Code39/93/128, ITF, … • Java製 ◦ Androidアプリもあるよ
移植した理由 • QRコードを読むコマンドがほしい ◦ 探してみるとあんまり無い • そもそも読み取るライブラリ少ない ◦ 生成する方はたくさんある •
せっかくなのでGoで書きたい ◦ 気持ちが大事 • いい感じのライブラリを移植しよう ◦ ZXingに目をつける
移植先: gozxing https://github.com/makiuchi-d/gozxing • image.Imageから読み取り可 • Pure Go • QRCode,
DataMatrix, UPC-A/E, EAN-8/13, Code39/93/(128) ◦ 他は順次移植作業中 bmp, _ := gozxing.NewBinaryBitmapFromImage(img) result, _ := qrcode.NewQRCodeReader().Decode(bmp, nil) fmt.Println(result.GetText())
移植しただけでは こうはならない BCH符号 JIS X 0510 ISO/IEC 18004 8つのマスクパターン GB2312
バージョン1〜40 ガロア拡大体 Alphanumeric Mode ReedSolomon符号 ISO-8859-1 構造的連接 þ(ソーン) AIM Inc. Position Pattern 拡張チャネル解釈 中华人民共和国国家标准
ただの移植には知識は不要 元の処理と同じ処理を書けば動く • 両方の言語を読み書きできればよい ◦ 機械的に対応したコードに書き下すだけ • 特別な知識も不要 ◦ 規格やアルゴリズムを知らなくてもできる
ただの移植で終わらないために • せっかくだからちゃんと理解したい • 移植しながら学習できる良い方法 移植駆動学習(PDL)
移植駆動学習(PDL)とは Porting-Driven Learning. 何らかのプログラムを 別の言語に移植することにより そのプログラムと対象技術領域について 自然と学習することができる学習方法のこと。 ― Makiuchi, D.
(2018)
ただの移植に加えて PDLに必要なこと
テスト!テスト!テスト!
カバレッジ ほぼ 100%
カバレッジ100%を目指す • すべての分岐の意味を理解する ◦ 1行1行の意図を読み取る • 規格書・資料と照らし合わせる ◦ エッジケースをひたすら考える •
実装だけでなく背景の理解も深める これが学習
テストケースを思いつかないとき • 手が進まないとモチベーションが低下 • 学習も止まってしまう そんなときは • 元のコードを動かしてみる • 入出力のペアを得る
• そのままテストケースにする
学習以外の効果 • 一般的なテストの効果 ◦ 単純ミスの防止 ▪ 書き間違い、言語仕様の違い ◦ リファクタや修正も安心 •
元のライブラリのバグも見つかる ◦ これまで8本のPRがマージ済み ◦ さらに1本PR準備中
gozxingのカバレッジ • 11/12現在 98.35% 右図について • CodecovのSunburst • 緑=カバレッジ100% ◦
赤に近いほどカバレッジが低い オレンジの場所はReedSolomonDecoder まだ理解が不十分なことがわかる https://codecov.io/gh/makiuchi-d/gozxing
GoはPDLに向いている • テストツールが標準で付いている ◦ みんなテスト書いている ◦ カバレッジ解析も簡単 ▪ 1.10から複数パッケージまとめて coverprofileが取れるようになった
• Goは新しい言語 ◦ 他言語のサードパーティライブラリを探せば まだGoに無いものがたくさんある(はず)
PDLやっていきましょう!