Slide 1

Slide 1 text

とあるライブラリを Goに移植した結果…… golang.tokyo #19 LT 牧内大輔

Slide 2

Slide 2 text

早速ですが質問です

Slide 3

Slide 3 text

何を考えますか?

Slide 4

Slide 4 text

自己紹介 牧内大輔 MakKi / @makki_d 所属:KLab株式会社 ○ このビルのもう少し下の階

Slide 5

Slide 5 text

やっていること 大昔 ● AviUtl 透過性ロゴフィルタ他 現在(仕事) ● オンライン対戦の同期まわり ○ 中継サーバ:Go ○ クライアント:C# (Unity) 現在(趣味) ● とあるライブラリをGoに移植

Slide 6

Slide 6 text

移植前の私

Slide 7

Slide 7 text

移植後の私 デンソーウェーブ BCH符号 JIS X 0510 ISO/IEC 18004 8つのマスクパターン GB2312 バージョン1〜40 ガロア拡大体 Alphanumeric Mode ReedSolomon符号 ISO-8859-1 構造的連接 þ(ソーン) AIM Inc. Position Pattern 拡張チャネル解釈 中华人民共和国国家标准

Slide 8

Slide 8 text

いったい私の身に何が?

Slide 9

Slide 9 text

移植したライブラリ ZXing (zebra crossing) ● https://github.com/zxing/zxing ● QRコードとかを読んだり書いたりするライブラリ ● 多くのフォーマットに対応 ○ 2次元: QRCode, DataMatrix, PDF417, … ○ 1次元: UPC/EAN, Code39/93/128, ITF, … ● Java製 ○ Androidアプリもあるよ

Slide 10

Slide 10 text

移植した理由 ● QRコードを読むコマンドがほしい ○ 探してみるとあんまり無い ● そもそも読み取るライブラリ少ない ○ 生成する方はたくさんある ● せっかくなのでGoで書きたい ○ 気持ちが大事 ● いい感じのライブラリを移植しよう ○ ZXingに目をつける

Slide 11

Slide 11 text

移植先: 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())

Slide 12

Slide 12 text

移植しただけでは  こうはならない  BCH符号 JIS X 0510 ISO/IEC 18004 8つのマスクパターン GB2312 バージョン1〜40 ガロア拡大体 Alphanumeric Mode ReedSolomon符号 ISO-8859-1 構造的連接 þ(ソーン) AIM Inc. Position Pattern 拡張チャネル解釈 中华人民共和国国家标准

Slide 13

Slide 13 text

ただの移植には知識は不要 元の処理と同じ処理を書けば動く ● 両方の言語を読み書きできればよい ○ 機械的に対応したコードに書き下すだけ ● 特別な知識も不要 ○ 規格やアルゴリズムを知らなくてもできる

Slide 14

Slide 14 text

ただの移植で終わらないために ● せっかくだからちゃんと理解したい ● 移植しながら学習できる良い方法 移植駆動学習(PDL)

Slide 15

Slide 15 text

移植駆動学習(PDL)とは Porting-Driven Learning. 何らかのプログラムを 別の言語に移植することにより そのプログラムと対象技術領域について 自然と学習することができる学習方法のこと。 ― Makiuchi, D. (2018)

Slide 16

Slide 16 text

ただの移植に加えて PDLに必要なこと

Slide 17

Slide 17 text

テスト!テスト!テスト!

Slide 18

Slide 18 text

カバレッジ ほぼ 100%

Slide 19

Slide 19 text

カバレッジ100%を目指す ● すべての分岐の意味を理解する ○ 1行1行の意図を読み取る ● 規格書・資料と照らし合わせる ○ エッジケースをひたすら考える ● 実装だけでなく背景の理解も深める これが学習

Slide 20

Slide 20 text

テストケースを思いつかないとき ● 手が進まないとモチベーションが低下 ● 学習も止まってしまう そんなときは ● 元のコードを動かしてみる ● 入出力のペアを得る ● そのままテストケースにする

Slide 21

Slide 21 text

学習以外の効果 ● 一般的なテストの効果 ○ 単純ミスの防止 ■ 書き間違い、言語仕様の違い ○ リファクタや修正も安心 ● 元のライブラリのバグも見つかる ○ これまで8本のPRがマージ済み ○ さらに1本PR準備中

Slide 22

Slide 22 text

gozxingのカバレッジ ● 11/12現在 98.35% 右図について ● CodecovのSunburst ● 緑=カバレッジ100% ○ 赤に近いほどカバレッジが低い オレンジの場所はReedSolomonDecoder まだ理解が不十分なことがわかる https://codecov.io/gh/makiuchi-d/gozxing

Slide 23

Slide 23 text

GoはPDLに向いている ● テストツールが標準で付いている ○ みんなテスト書いている ○ カバレッジ解析も簡単 ■ 1.10から複数パッケージまとめて coverprofileが取れるようになった ● Goは新しい言語 ○ 他言語のサードパーティライブラリを探せば まだGoに無いものがたくさんある(はず)

Slide 24

Slide 24 text

PDLやっていきましょう!