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
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
16
[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
AI感のないAWS構成図をAIエージェントに描かせたい!
sagochiko
2
490
1万名の社員が使う認証基盤で どう信頼性を担保するか?
kairim0
0
170
[2026 Oracle Technical Deep Dive] オンプレミスDBのCloud移行アプローチ:移行計画に基づくメソッドとツールの選択 (2026年9月17日開催)
oracle4engineer
PRO
0
100
企業の現実世界をグラフで写し取る
sansantech
PRO
0
240
【ゲームメーカーズスクランブル2026】『Shadowverse: Worlds Beyond』UIとアニメーションで実現する最高のユーザー体験を叶えるプロトタイピング
cygames
PRO
1
710
個別開発で終わらせない。 現場の課題をプロダクトの強さに変える StockmarkのFDE
ktkrhr
0
530
LLM機能を自作して分かるSnowflake Cortex AIの強み
nayuts
0
170
SQL Server 2025 最適化されたロック
odashinsuke
0
120
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
2
290
2026-10-01_MagicPod_QAハーネスエンジニアリングとQA組織の未来像
ynisqa1988
1
380
生成AIと進める探索的データ分析(2026.10.03 第122回Tokyo.R勉強会)
tatamiya
2
1.1k
【Findyテック文化祭ワークショップ】新卒エンジニア&採用担当と作る、 なりたい姿と今やるべき一歩
dip_tech
PRO
0
150
Featured
See All Featured
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Google's AI Overviews - The New Search
badams
0
1.6k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
900
How to build a perfect <img>
jonoalderson
1
6.1k
Facilitating Awesome Meetings
lara
57
7.2k
WENDY [Excerpt]
tessaabrams
14
40k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
510
Documentation Writing (for coders)
carmenintech
77
5.6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
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