Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

MakKi
November 13, 2018
4.1k

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

golang.tokyo #19 LT

MakKi

November 13, 2018
Tweet

Transcript

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

    View full-size slide

  2. 早速ですが質問です

    View full-size slide

  3. 何を考えますか?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. 移植前の私

    View full-size slide

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

    View full-size slide

  8. いったい私の身に何が?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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())

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. カバレッジ
    ほぼ
    100%

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  24. PDLやっていきましょう!

    View full-size slide