Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
とあるライブラリをGoに移植した結果……
Search
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
77
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
80
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
Recap: An Operating System in Go
makki_d
2
200
XSLTで作るBrainfuck処理系
makki_d
0
450
眼鏡と視力についての誤解を解く
makki_d
0
260
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
790
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
720
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
710
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Practical Orchestrator
shlominoach
192
12k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Marketing to machines
jonoalderson
1
5.8k
How to train your dragon (web standard)
notwaldorf
97
6.8k
sira's awesome portfolio website redesign presentation
elsirapls
0
430
Making the Leap to Tech Lead
cromwellryan
135
10k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
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やっていきましょう!