Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
俺はビッグエンディアンでテストがしたいんだ!
Search
kenjihanada
February 22, 2019
Technology
0
2.7k
俺はビッグエンディアンでテストがしたいんだ!
by kawashin73
kenjihanada
February 22, 2019
Tweet
Share
More Decks by kenjihanada
See All by kenjihanada
Akatsuki Summer Internship 2019 インターン成果発表
kenjihanada
0
2.2k
ゼロから始めるGo Modules
kenjihanada
0
2.7k
MMOの作り方
kenjihanada
0
2.6k
今風トゥーンシェーディング
kenjihanada
0
2.8k
お父さんが教えるプログラミング教育
kenjihanada
0
2.6k
Other Decks in Technology
See All in Technology
事業成長の裏側:エンジニア組織と開発生産性の進化 / 20250703 Rinto Ikenoue
shift_evolve
PRO
1
390
ネットワーク保護はどう変わるのか?re:Inforce 2025最新アップデート解説
tokushun
0
150
CI/CD/IaC 久々に0から環境を作ったらこうなりました
kaz29
1
200
Tech-Verse 2025 Keynote
lycorptech_jp
PRO
0
1.3k
モバイル界のMCPを考える
naoto33
0
360
プロダクトエンジニアリング組織への歩み、その現在地 / Our journey to becoming a product engineering organization
hiro_torii
0
140
SpringBoot x TestContainerで実現するポータブル自動結合テスト
demaecan
0
120
AWS テクニカルサポートとエンドカスタマーの中間地点から見えるより良いサポートの活用方法
kazzpapa3
2
610
登壇ネタの見つけ方 / How to find talk topics
pinkumohikan
5
590
Github Copilot エージェントモードで試してみた
ochtum
0
130
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
440
整頓のジレンマとの戦い〜Tidy First?で振り返る事業とキャリアの歩み〜/Fighting the tidiness dilemma〜Business and Career Milestones Reflected on in Tidy First?〜
bitkey
0
380
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Building Applications with DynamoDB
mza
95
6.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
Done Done
chrislema
184
16k
RailsConf 2023
tenderlove
30
1.1k
Code Reviewing Like a Champion
maltzj
524
40k
GitHub's CSS Performance
jonrohan
1031
460k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
124
52k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
Transcript
俺はビッグエンディアンでテス トがしたいんだ! @kawasin73
言語の壁をぶっ壊す
自己紹介 かわしん @kawasin73 東京大学工学部システム創成学科 3年生 (2年半休学してました) DMM.com のCTO室で、Go言語でデータベースを作るインターン この1年半くらいGo。それまでは、Rails、iOS、Android、Webフロントなど 趣味は特にない(強いて挙げれば蟻の飼育)
ビットベクトルライブラリを作ってテストした Go 言語で マシンエンディアンに関わらず 指定されたエンディアンで動く ビットベクトルライブラリを作ってテストを行った https://github.com/kawasin73/bitset ビットベクトル:[]bool の省メモリ版データ構造
エンディアンとは
エンディアンはバイトの並び順(バイトオーダーとも) 例えば uint64 は 8 バイトの数値。その中身がどのように配置されているか ビッグエンディアン 0x0123456789abcdef → 0x01
| 0x23 | 0x45 | 0x67 | 0x89 | 0xab | 0xcd | 0xef リトルエンディアン → 0xef | 0xcd | 0xab | 0x89 | 0x67 | 0x45 | 0x23 | 0x01 エンディアンとは
エンディアンはどう決まるのか エンディアンは CPU によって違う。 amd64 (Intel) など → リトルエンディアン arm
など → ビッグエンディアン CPU によっては切り替えることもできる
エンディアンはいつ気にするのか? バイナリで外部とのやりとり(ファイル読み書き、ネットワーク通信)する時 エンディアンが違うと正しい値を読み取れない。 ビッグエンディアンの uint64(1) → リトルエンディアンのuint64(72057594037927936) 普通は、ネットワークライブラリがエンディアン処理をしているので、気にする必要はな い。
Go でのエンディアン "encoding/binary" パッケージが用意されている binary.BigEndian.PutUint64(bytes, v) binary.LittleEndian.Uint64(bytes) Go ではエンディアンは露出しない。uint64 のビットの順番は環境に寄らず同じ
課題 ファイルへの読み書きを頻繁に行う時 毎回エンディアン処理を行うのはオーバーヘッドになる。
言語の壁をぶっ壊す
unsafe.Pointer だ!!
unsafe.Pointer マシンエンディアンで直接扱うために、unsafe.Pointer を使って []byte から []uint64 に 強制キャストをしている。
壊したので unsafe.Pointer によって壊したので、どのエンディアンの環境でも正しく動くかをテストす る必要がある。
俺はビッグエンディアンでテス トがしたいんだ! @kawasin73 本編
Travis CI で自動テスト Travis CI の CPU アーキテクチャは amd64 (リトルエンディアン)のみ
Travis CI でビッグエンディアンでテストする手法を探す → QEMU でビッグエンディアンの CPU をエミュレートする
qemu で go test Linux で Go の実行環境をインストールできるのは以下のCPUアーキテクチャ amd64, 386,
arm, arm64, s390x, ppc64le この中で、ビッグエンディアンなのは s390x https://golang.org/doc/install#requirements ※ arm はリトルエンディアン、armbe がビッグエンディアン
qemu-ppc64-static で go test 無慈悲なエラー
なんでや
go test はできない 原因は不明。Go が悪いのか qemu が悪いのか。 qemu が特定の CPU
命令に対応していない? 行き詰まった。
救世主
おい、テストを コンパイルできるらしいぞ
コンパイルできると可能性が広がる ビッグエンディアンに対応している ppc64, mips, mips64, s390x ppc64 だとうまくいった
結論
None
よっしゃ https://travis-ci.com/kawasin73/bitset/jobs/172066523
参考資料 ブログ記事 https://kawasin73.hatenablog.com/entry/2018/12/01/172708 対応した github issue https://github.com/kawasin73/bitset/issues/5