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.4k
俺はビッグエンディアンでテストがしたいんだ!
by kawashin73
kenjihanada
February 22, 2019
Tweet
Share
More Decks by kenjihanada
See All by kenjihanada
Akatsuki Summer Internship 2019 インターン成果発表
kenjihanada
0
2k
ゼロから始めるGo Modules
kenjihanada
0
2.4k
MMOの作り方
kenjihanada
0
2.4k
今風トゥーンシェーディング
kenjihanada
0
2.5k
お父さんが教えるプログラミング教育
kenjihanada
0
2.4k
Other Decks in Technology
See All in Technology
How to Think Like a Performance Engineer
csswizardry
4
590
さらに高品質・高速化を目指すAI時代のテスト設計支援と、めざす先 / AI Test Lab vol.1
shift_evolve
0
190
サービス開発を前に進めるために 新米リードエンジニアが 取り組んだこと / Steps Taken by a Novice Lead Engineer to Advance Service Development
nologyance
0
180
頼られるのが大好きな 皆さんへ - 支援相手との期待の合わせ方、突き放し方 -/For_people_who_like_to_be_relied_on
naitosatoshi
1
290
LINE WORKSへ簡単通知!Incoming Webhookアプリの紹介
mmclsntr
0
110
可視化プラットフォームGrafanaの基本と活用方法の全て
hamadakoji
0
230
AWSで”最小権限の原則”を実現するための考え方 /20240722-ssmjp-aws-least-privilege
opelab
10
4.4k
「単なる OAuth 2.0 を認証に使うと、車が通れるほどのどでかいセキュリティー・ホールができる」のか検証してみた
terara
0
380
データベース研修 分析向けSQL入門【MIXI 24新卒技術研修】
mixi_engineers
PRO
0
110
DevIO2024_レガシー運用からの脱却 -クラウド活用の実践事例とベストプラクティス-
jun2882
0
210
初中級者用如何使用backlog -VALE TUDOEDITION-
in0u
0
140
エンジニア向け会社紹介資料
caddi_eng
14
230k
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
34
1.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
245
1.2M
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
325
21k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
13
430
GraphQLとの向き合い方2022年版
quramy
36
13k
What's new in Ruby 2.0
geeforr
338
31k
In The Pink: A Labor of Love
frogandcode
139
22k
The Language of Interfaces
destraynor
151
23k
Building Better People: How to give real-time feedback that sticks.
wjessup
357
18k
Become a Pro
speakerdeck
PRO
15
4.8k
Practical Orchestrator
shlominoach
185
10k
Speed Design
sergeychernyshev
9
270
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