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
MakKi
November 13, 2018
1
4.4k
とあるライブラリをGoに移植した結果……
golang.tokyo #19 LT
MakKi
November 13, 2018
Tweet
Share
More Decks by MakKi
See All by MakKi
XSLTで作るBrainfuck処理系
makki_d
0
250
眼鏡と視力についての誤解を解く
makki_d
0
140
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
730
range over funcのエラー処理
makki_d
1
1.7k
GoとテストとインプロセスDB
makki_d
3
630
君は古の言語M4を知っているか (LT)
makki_d
0
460
型パラメータが使えるようになったのでLINQを実装してみた
makki_d
2
1.5k
mallocしただけでメモリが確保できるって本当ですか?
makki_d
0
260
ホットリロードツールの作り方
makki_d
1
1.2k
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Keith and Marios Guide to Fast Websites
keithpitt
411
23k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
Visualization
eitanlees
149
16k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.7k
Designing Experiences People Love
moore
142
24k
Done Done
chrislema
185
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.6k
Statistics for Hackers
jakevdp
799
220k
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やっていきましょう!