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

俺はビッグエンディアンでテストがしたいんだ!

F9c4e8b768c5857ee6b7003e283765a0?s=47 kenjihanada
February 22, 2019

 俺はビッグエンディアンでテストがしたいんだ!

by kawashin73

F9c4e8b768c5857ee6b7003e283765a0?s=128

kenjihanada

February 22, 2019
Tweet

Transcript

  1. 俺はビッグエンディアンでテス トがしたいんだ! @kawasin73

  2. 言語の壁をぶっ壊す

  3. 自己紹介 かわしん @kawasin73 東京大学工学部システム創成学科 3年生 (2年半休学してました) DMM.com のCTO室で、Go言語でデータベースを作るインターン この1年半くらいGo。それまでは、Rails、iOS、Android、Webフロントなど 趣味は特にない(強いて挙げれば蟻の飼育)

  4. ビットベクトルライブラリを作ってテストした Go 言語で マシンエンディアンに関わらず 指定されたエンディアンで動く ビットベクトルライブラリを作ってテストを行った https://github.com/kawasin73/bitset ビットベクトル:[]bool の省メモリ版データ構造

  5. エンディアンとは

  6. エンディアンはバイトの並び順(バイトオーダーとも) 例えば uint64 は 8 バイトの数値。その中身がどのように配置されているか ビッグエンディアン 0x0123456789abcdef → 0x01

    | 0x23 | 0x45 | 0x67 | 0x89 | 0xab | 0xcd | 0xef リトルエンディアン → 0xef | 0xcd | 0xab | 0x89 | 0x67 | 0x45 | 0x23 | 0x01 エンディアンとは
  7. エンディアンはどう決まるのか エンディアンは CPU によって違う。 amd64 (Intel) など → リトルエンディアン arm

    など → ビッグエンディアン CPU によっては切り替えることもできる
  8. エンディアンはいつ気にするのか? バイナリで外部とのやりとり(ファイル読み書き、ネットワーク通信)する時 エンディアンが違うと正しい値を読み取れない。 ビッグエンディアンの uint64(1) → リトルエンディアンのuint64(72057594037927936) 普通は、ネットワークライブラリがエンディアン処理をしているので、気にする必要はな い。

  9. Go でのエンディアン "encoding/binary" パッケージが用意されている binary.BigEndian.PutUint64(bytes, v) binary.LittleEndian.Uint64(bytes) Go ではエンディアンは露出しない。uint64 のビットの順番は環境に寄らず同じ

  10. 課題 ファイルへの読み書きを頻繁に行う時 毎回エンディアン処理を行うのはオーバーヘッドになる。

  11. 言語の壁をぶっ壊す

  12. unsafe.Pointer だ!!

  13. unsafe.Pointer マシンエンディアンで直接扱うために、unsafe.Pointer を使って []byte から []uint64 に 強制キャストをしている。

  14. 壊したので unsafe.Pointer によって壊したので、どのエンディアンの環境でも正しく動くかをテストす る必要がある。

  15. 俺はビッグエンディアンでテス トがしたいんだ! @kawasin73 本編

  16. Travis CI で自動テスト Travis CI の CPU アーキテクチャは amd64 (リトルエンディアン)のみ

    Travis CI でビッグエンディアンでテストする手法を探す → QEMU でビッグエンディアンの CPU をエミュレートする
  17. qemu で go test Linux で Go の実行環境をインストールできるのは以下のCPUアーキテクチャ amd64, 386,

    arm, arm64, s390x, ppc64le この中で、ビッグエンディアンなのは s390x https://golang.org/doc/install#requirements ※ arm はリトルエンディアン、armbe がビッグエンディアン
  18. qemu-ppc64-static で go test 無慈悲なエラー

  19. なんでや

  20. go test はできない 原因は不明。Go が悪いのか qemu が悪いのか。 qemu が特定の CPU

    命令に対応していない? 行き詰まった。
  21. 救世主

  22. おい、テストを コンパイルできるらしいぞ

  23. コンパイルできると可能性が広がる ビッグエンディアンに対応している ppc64, mips, mips64, s390x ppc64 だとうまくいった

  24. 結論

  25. None
  26. よっしゃ https://travis-ci.com/kawasin73/bitset/jobs/172066523

  27. 参考資料 ブログ記事 https://kawasin73.hatenablog.com/entry/2018/12/01/172708 対応した github issue https://github.com/kawasin73/bitset/issues/5