とあるライブラリをGoに移植した結果……

99b72ba4c7dd4da957edb3e619a6d71f?s=47 MakKi
November 13, 2018
2.9k

 とあるライブラリをGoに移植した結果……

golang.tokyo #19 LT

99b72ba4c7dd4da957edb3e619a6d71f?s=128

MakKi

November 13, 2018
Tweet

Transcript

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

  2. 早速ですが質問です

  3. 何を考えますか?

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

  5. やっていること 大昔 • AviUtl 透過性ロゴフィルタ他 現在(仕事) • オンライン対戦の同期まわり ◦ 中継サーバ:Go

    ◦ クライアント:C# (Unity) 現在(趣味) • とあるライブラリをGoに移植
  6. 移植前の私

  7. 移植後の私 デンソーウェーブ BCH符号 JIS X 0510 ISO/IEC 18004 8つのマスクパターン GB2312

    バージョン1〜40 ガロア拡大体 Alphanumeric Mode ReedSolomon符号 ISO-8859-1 構造的連接 þ(ソーン) AIM Inc. Position Pattern 拡張チャネル解釈 中华人民共和国国家标准
  8. いったい私の身に何が?

  9. 移植したライブラリ ZXing (zebra crossing) • https://github.com/zxing/zxing • QRコードとかを読んだり書いたりするライブラリ • 多くのフォーマットに対応

    ◦ 2次元: QRCode, DataMatrix, PDF417, … ◦ 1次元: UPC/EAN, Code39/93/128, ITF, … • Java製 ◦ Androidアプリもあるよ
  10. 移植した理由 • QRコードを読むコマンドがほしい ◦ 探してみるとあんまり無い • そもそも読み取るライブラリ少ない ◦ 生成する方はたくさんある •

    せっかくなのでGoで書きたい ◦ 気持ちが大事 • いい感じのライブラリを移植しよう ◦ ZXingに目をつける
  11. 移植先: 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())
  12. 移植しただけでは  こうはならない  BCH符号 JIS X 0510 ISO/IEC 18004 8つのマスクパターン GB2312

    バージョン1〜40 ガロア拡大体 Alphanumeric Mode ReedSolomon符号 ISO-8859-1 構造的連接 þ(ソーン) AIM Inc. Position Pattern 拡張チャネル解釈 中华人民共和国国家标准
  13. ただの移植には知識は不要 元の処理と同じ処理を書けば動く • 両方の言語を読み書きできればよい ◦ 機械的に対応したコードに書き下すだけ • 特別な知識も不要 ◦ 規格やアルゴリズムを知らなくてもできる

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

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

    (2018)
  16. ただの移植に加えて PDLに必要なこと

  17. テスト!テスト!テスト!

  18. カバレッジ ほぼ 100%

  19. カバレッジ100%を目指す • すべての分岐の意味を理解する ◦ 1行1行の意図を読み取る • 規格書・資料と照らし合わせる ◦ エッジケースをひたすら考える •

    実装だけでなく背景の理解も深める これが学習
  20. テストケースを思いつかないとき • 手が進まないとモチベーションが低下 • 学習も止まってしまう そんなときは • 元のコードを動かしてみる • 入出力のペアを得る

    • そのままテストケースにする
  21. 学習以外の効果 • 一般的なテストの効果 ◦ 単純ミスの防止 ▪ 書き間違い、言語仕様の違い ◦ リファクタや修正も安心 •

    元のライブラリのバグも見つかる ◦ これまで8本のPRがマージ済み ◦ さらに1本PR準備中
  22. gozxingのカバレッジ • 11/12現在 98.35% 右図について • CodecovのSunburst • 緑=カバレッジ100% ◦

    赤に近いほどカバレッジが低い オレンジの場所はReedSolomonDecoder まだ理解が不十分なことがわかる https://codecov.io/gh/makiuchi-d/gozxing
  23. GoはPDLに向いている • テストツールが標準で付いている ◦ みんなテスト書いている ◦ カバレッジ解析も簡単 ▪ 1.10から複数パッケージまとめて coverprofileが取れるようになった

    • Goは新しい言語 ◦ 他言語のサードパーティライブラリを探せば まだGoに無いものがたくさんある(はず)
  24. PDLやっていきましょう!