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.3k
とあるライブラリをGoに移植した結果……
golang.tokyo #19 LT
MakKi
November 13, 2018
Tweet
Share
More Decks by MakKi
See All by MakKi
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
510
range over funcのエラー処理
makki_d
0
1.3k
GoとテストとインプロセスDB
makki_d
2
490
君は古の言語M4を知っているか (LT)
makki_d
0
320
型パラメータが使えるようになったのでLINQを実装してみた
makki_d
2
1.3k
mallocしただけでメモリが確保できるって本当ですか?
makki_d
0
190
ホットリロードツールの作り方
makki_d
0
1k
JavaプログラムをGoに移植するためのテクニック――継承と例外
makki_d
1
1.6k
JavaプログラムをGoに移植するためのテクニック――継承と例外
makki_d
4
4k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Automating Front-end Workflow
addyosmani
1366
200k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Thoughts on Productivity
jonyablonski
67
4.3k
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
92
16k
Building Applications with DynamoDB
mza
90
6.1k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
400
Into the Great Unknown - MozCon
thekraken
32
1.5k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.2k
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やっていきましょう!