Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
スキャン音は鳴るのにカートに入らない — レジと物理デバイスの事件簿
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kenta Enomoto
August 26, 2026
Technology
43
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
スキャン音は鳴るのにカートに入らない — レジと物理デバイスの事件簿
Mobile Mob #2 の登壇資料です
https://bitkey.connpass.com/event/400743/
Kenta Enomoto
August 26, 2026
More Decks by Kenta Enomoto
See All by Kenta Enomoto
Renovate のバグを直した話
enomotok
0
18
[DroidKaigi 2025] 共有と分離 - Compose Multiplatform "本番導入" の設計指針
enomotok
0
150
Kotlin Multiplatform / Compose Multiplatform を活用したモバイルアプリ開発の最前線
enomotok
0
170
Compose MultiplatformにおけるiOSネイティブ実装のベストプラクティス
enomotok
1
540
STORES ブランドアプリのスケールするアプリづくり
enomotok
0
110
What's new in Xcode 16 ダイジェスト
enomotok
0
900
Introducing Pkl
enomotok
0
3.2k
iOS リポジトリへの Renovate の導入
enomotok
2
460
iOS開発とGitLab CI
enomotok
7
4.1k
Other Decks in Technology
See All in Technology
大型犬好きによるPugの紹介
yamanoku
1
110
Cognition AI Japan - ウェビナー2_テストQA_運用監視
cogakira
0
130
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
0
1.6k
Essential architectural thinking (revised edition)
ufried
0
110
Deep Data Security 機能解説
oracle4engineer
PRO
2
760
生成AIと進める探索的データ分析(2026.10.03 第122回Tokyo.R勉強会)
tatamiya
2
1.5k
ハードウェアコンペでもAI駆動開発が進んでいる話
iotengineer22
1
670
12 個 Tool と、 4,096 Token
hlum
0
110
契約書画像からの情報抽出に特化した視覚接地モデルを育てる話
sansantech
PRO
1
160
しろおびから始める!ログ活用の第一歩
shumei_ito
0
860
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
360
Claude Code本は、どのように執筆チームで書かれたか
oikon48
1
360
Featured
See All Featured
How to Ace a Technical Interview
jacobian
280
24k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
450
Faster Mobile Websites
deanohume
310
32k
The browser strikes back
jonoalderson
0
1.8k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
390
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
320
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
350
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
840
How to Talk to Developers About Accessibility
jct
2
570
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
440
Transcript
スキャン音は鳴るのにカートに入らない — レジと物理デバイスの事件簿 2026.08.26 Mobile Mob #2 STORES 株式会社 榎本健太
自己紹介 榎本 健太 STORES 株式会社 x.com/enomot_ github.com/enomoto 最近の趣味はジョギングです 2
STORES レジ 3
STORES レジと物理デバイスたち レシートプリンター キャッシュドロア バーコードスキャナー 決済端末 今日は、この現場で実際に起きた「事件」の話をします 4
事件: 10点スキャンしたのに、8点しか計上されていない 10点スキャンしたのに、 8点しか計上されていない…。 スキャンが早くなると、よく起きるんです 😥 お店の人 • レジ利用店舗からの報告。会計のズレに直結しかねない、最も避けたい類の不具合 •
環境: iPad 第9世代 / プリンター: スター精密 mcPrint3 / スキャナー: BSH-20U • スキャナーはプリンターに有線接続 — スキャンデータはプリンター経由で iPad に届く 5
この不具合の何が嫌か • 構成が特殊 — スキャナーがプリンター経由。再現には、まずこの物理構成を組むところ から • タイミング依存 — ゆっくりスキャンすると再現しない
• 失敗が静か — スキャン音は鳴る。エラー表示は次のスキャンで即消える Q. みなさんなら、どこから調べますか? 6
手がかり①: 経路の「差分」を読む スキャナー入力の経路は2系統 スキャナー iPad(レジ) ① 直挿し(HID): 改行までバッファ → フレーミングあり
スキャナー プリンター 有線 iPad(レジ) Bluetooth classic ② プリンター経由: 前後トリムのみ → フレーミングなし 🤔「複数のバーコードが、1回の didReceive にまとまって届いているのでは?」 (※didReceive はプリンターメーカーの SDK で呼ばれるメソッド) 7
手がかり②: デバイス境界に「生ログ」を仕込む 単発スキャン(正常) didReceive count=14 utf8="2002226945019\n" → 照合ヒット → カート追加成功
高速連続スキャン(不具合) didReceive count=42 utf8="2002226945019\n2002226945019\n2002226945019\n" → 照合失敗 → カート未追加(でもスキャン音は鳴る) • 3回分のスキャンが、改行連結で1回にまとまって届いていた • 前後トリムでは中間の改行が残り、「この世に存在しない商品コード」が誕生 • この1行で「取りこぼし」「デコード失敗」の仮説も同時に棄却できた 8
原因の本質: フレーミングの欠如 ストリーム型の入力には、メッセージの境界がない • 「1回の受信イベント = 1メッセージ」は、受信側が勝手にしていた思い込み • 区切りを解釈して1件ずつに切り出す —
フレーミングは受信側の責務 • HID の経路には考慮が入っていたが・・・ “Notify that the data is received” didReceive の公式リファレンスの説明 — これで全文。区切りも集約も、何も書かれていない BLE の notify / TCP / シリアル — ストリームを受けるコードには必ず潜む問題 9
修正と検証 • 修正: 受信ペイロードを改行で分割し、1件ずつ処理する。それだけ • 工夫: 分割ロジックを static 関数に切り出し →
実機なしでユニットテスト (単一 / 複数連結 / CR・CRLF 混在 / 空セグメント) • 検証: 実機の高速連続スキャンで before / after を動画に記録して確認 「観測された事実の範囲で直す」— 線引きを PR に明記 10
Take Away: 物理デバイスとの付き合い方 • ストリーム受信を見たら、フレーミングを疑う 「1回の受信 = 1メッセージ」はどのプロトコルでも思い込み • タイミング依存の不具合には、デバイス境界の「生ログ」
加工前のバイト数と生文字列。1行で複数の仮説を棄却できる • 経路の「差分」を探す 動く経路に在って、壊れる経路に無いものが、答えの近くにいる • 再現環境をケチらない 報告と同じ物理構成を組んで再現できた 11