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
レシート印刷が途中で止まる?Stream APIとBluetooth接続のルールを守って楽しく...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
satoryo56
September 19, 2025
Programming
410
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
レシート印刷が途中で止まる?Stream APIとBluetooth接続のルールを守って楽しくレシートプリンターで印刷しよう! / iOSDC Japan 2025 satoryo
https://fortee.jp/iosdc-japan-2025/proposal/95648833-0e4f-4dfd-ba87-60b739a7dabe
satoryo56
September 19, 2025
More Decks by satoryo56
See All by satoryo56
WWDC25に現地参加してきました / satoryo attended WWDC25 onsite
satoryo56
0
150
STORES Tech Conf 2024 “New Engineering” - 複数のScrollViewが連動!STORES レジ でスプレッドシート風UIを実装しました
satoryo56
0
2.3k
Gemini in Android Studio 使ってますか?
satoryo56
0
1.2k
Other Decks in Programming
See All in Programming
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
710
残高管理から台帳サービスへの進化
artoy
1
200
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
Event is what happens
moro
2
770
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
210
気持ちぃ〜角丸 Squircle
ryu1013
0
310
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
140
Featured
See All Featured
Paper Plane (Part 1)
katiecoart
PRO
2
12k
Everyday Curiosity
cassininazir
0
350
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Building Applications with DynamoDB
mza
96
7.2k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
620
A Soul's Torment
seathinner
8
3.8k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
Navigating Team Friction
lara
192
16k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
Scaling GitHub
holman
464
140k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
730
Skip the Path - Find Your Career Trail
mkilby
1
260
Transcript
J04%$+BQBO Ϩγʔτҹ్͕தͰࢭ·Δʁ 4USFBN"1*ͱ#MVFUPPUIଓͷϧʔϧΛ कָͬͯ͘͠ϨγʔτϓϦϯλʔͰҹ͠Α͏ʂ CZTBUPSZP!TBUPSZP
satoryo STORES גࣜձࣾ iOSɾAndroidΤϯδχΞ ࣗݾհ X(Twitter): @satoryo056 ࠓͷ WWDC25
ʹॳࢀՃʂ iOSDC ॳొஃͰ40τʔΫʂ
ళฮͰ͓ձܭ͢Δͱ Β͑Δͷʁ
Ϩγʔτ🧾
αʔϏεհɿ4503&4Ϩδ ɾখചۀɾαʔϏεۀͷళฮ͚ΞϓϦ ɾݱͰͷ͓ձܭͰΦʔφʔɾελοϑ͕༻
αʔϏεհɿ4503&4Ϩδ ɾখചۀɾαʔϏεۀͷళฮ͚ΞϓϦ ɾݱͰͷ͓ձܭͰΦʔφʔɾελοϑ͕༻ ɾ͓ձܭޙͷϨγʔτ ྖऩॻҹͷχʔζ͕ߴ͍
αʔϏεհɿ4503&4Ϩδ ɾখചۀɾαʔϏεۀͷళฮ͚ΞϓϦ ɾݱͰͷ͓ձܭͰΦʔφʔɾελοϑ͕༻ ɾ͓ձܭޙͷϨγʔτ ྖऩॻҹͷχʔζ͕ߴ͍ ɾϨγʔτϓϦϯλʔͱଓ͠ ϨγʔτҹΛαϙʔτ
ຊτʔΫͰ͢͜ͱ ϨγʔτϓϦϯλʔͷհ ෳͷϝʔΧʔΛαϙʔτ Ϩγʔτҹ్͕தͰࢭ·Δෆ۩߹ ·ͱΊ
ຊτʔΫͰ͢͜ͱ ϨγʔτϓϦϯλʔͷհ ෳͷϝʔΧʔΛαϙʔτ Ϩγʔτҹ్͕தͰࢭ·Δෆ۩߹ ·ͱΊ
ϨγʔτϓϦϯλʔͷհ
ϨγʔτϓϦϯλʔʹ͍ͭͯ ɾϨγʔτ ྖऩॻΛൃߦ͢ΔͨΊͷઐ༻ϓϦϯλʔ ɾ#MVFUPPUI64#έʔϒϧ ༗ઢ-"/ͳͲͰͱଓ ɾϢʔεέʔεʹ߹Θͤͯෳͷछྨ͕ଘࡏ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT
ϞόΠϧΞϓϦͰϨγʔτҹΛ͢Δʹʁ
ϞόΠϧΞϓϦͰϨγʔτҹΛ͢Δʹʁ ֤ϝʔΧʔͷ4%,Λར༻
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) Ҿ༻ɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04
4%,Λར༻ͨ͠Ϩγʔτҹͷ࣮ྫ // 1. ϓϦϯλʔݕࡧ let manager = StarDeviceDiscoveryManager() let
printers = try await manager.discoverPrinters() // 2. ϓϦϯλʔଓ guard let printer = printers.first else { return } let starPrinter = StarPrinter(connectionSettings: printer.connectionSettings) ελʔਫ਼ີ4UBS9QBOE4%,ͷ߹ // 3. Ϩγʔτ࡞ let builder = StarXpandCommand.DocumentBuilder() builder.addPrinter( StarXpandCommand.PrinterBuilder() .styleAlignment(.center) .styleBold(true) .actionPrintText("Ϩγʔτ\n") .styleBold(false) .styleAlignment(.left) .actionPrintText("໊: ίʔώʔ\n") .actionPrintText("ֹۚ: ¥300\n") .actionCut(.partial) ) // 4. ҹ࣮ߦ let commands = builder.getCommands() try await starPrinter.print(command: commands) ࢀߟɿIUUQTHJUIVCDPNTUBSNJDSPOJDT4UBS9QBOE4%,J04 গͳ͍ߦͰ Ϩγʔτҹ͕Մೳʂ
ຊτʔΫͰ͢͜ͱ ϨγʔτϓϦϯλʔͷհ ෳͷϝʔΧʔΛαϙʔτ Ϩγʔτҹ్͕தͰࢭ·Δෆ۩߹ ·ͱΊ
ෳͷϝʔΧʔΛαϙʔτ ϨγʔτϓϦϯλʔͰҹ͢Δ
ͳͥෳͷϝʔΧʔΛαϙʔτʁ ɾ4503&4ϨδΛར༻͢Δళฮ͝ͱʹϢʔεέʔε͕ҟͳΔ ɾݻఆͰஔ͖͍ͨPS࣋ͪӡͼ͍ͨ ɾݱۚΛҰॹʹཧ͍ͨ͠ ɾಛఆͷϨγʔτ෯ʹ͍ͨ͠ɹͳͲ ɾ͞·͟·ͳϢʔεέʔεʹԠ͑ΔͨΊ ෳͷϝʔΧʔΛαϙʔτ
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT
4503&4Ϩδ͕αϙʔτ͢ΔϨγʔτϓϦϯλʔͷҰ෦ &QTPO ελʔਫ਼ີ ͦͷଞ ਾ͑ஔ͖ܕ ਾ͑ஔ͖ܕ υϩϫʔҰମܕ ख࣋ͪܕ ηΠίʔΠϯεπϧ
ख࣋ͪܕ ख࣋ͪܕ λϒϨοτҰମܕ Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT
ϝʔΧʔͷαϙʔτΛ૿͢ʹʁ
ϝʔΧʔͷαϙʔτΛ૿͢ʹʁ શͯͷϝʔΧʔͷ4%,Λ ΞϓϦʹΈࠐΉ
શͯͷϝʔΧʔͷ4%,ΛΈࠐΉ͜ͱ ϝϦοτ ɾ֤ϝʔΧʔͷϓϦϯλʔΛશͯαϙʔτͰ͖Δ σϝϦοτ ɾ4%,͝ͱʹ"1*༷͕ҟͳΔ ɾڞ௨ΠϯλʔϑΣʔεԽͷқ͕ߴ͍ ɾͦͦ4%,͕ͳ͍ϝʔΧʔ͕ଘࡏ͢Δ
શͯͷϝʔΧʔͷ4%,ΛΈࠐΉ͜ͱ ϝϦοτ ɾ֤ϝʔΧʔͷϓϦϯλʔΛશͯαϙʔτͰ͖Δ σϝϦοτ ɾ4%,͝ͱʹ"1*༷͕ҟͳΔ ɾڞ௨ΠϯλʔϑΣʔεԽͷқ͕ߴ͍ ɾͦͦ4%,͕ଘࡏ͠ͳ͍ϝʔΧʔ͕ଘࡏ͢Δ 4%,͚ͩͰ શͯͷϝʔΧʔʹ
ରԠͰ͖ͳ͍
શͯͷϝʔΧʔͷ4%,ΛΈࠐΉ͜ͱ ϝϦοτ ɾ֤ϝʔΧʔͷϓϦϯλʔΛશͯαϙʔτͰ͖Δ σϝϦοτ ɾ4%,͝ͱʹ"1*༷͕ҟͳΔ ɾڞ௨ΠϯλʔϑΣʔεԽͷқ͕ߴ͍ ɾͦͦ4%,͕ଘࡏ͠ͳ͍ϝʔΧʔ͕ଘࡏ͢Δ ࣗͨͪͰ ࡞Δ͔͠ͳ͍🦌
શͯͷϝʔΧʔͷ4%,ΛΈࠐΉ͜ͱ ϝϦοτ ɾ֤ϝʔΧʔͷϓϦϯλʔΛશͯαϙʔτͰ͖Δ σϝϦοτ ɾ4%,͝ͱʹ"1*༷͕ҟͳΔ ɾڞ௨ΠϯλʔϑΣʔεԽͷқ͕ߴ͍ ɾͦͦ4%,͕ଘࡏ͠ͳ͍ϝʔΧʔ͕ଘࡏ͢Δ 4%,ΛΘͣʹ ෳϝʔΧʔΛαϙʔτ
4%,ΛΘͣϨγʔτϓϦϯλʔͰҹ͢ΔྲྀΕ ϨγʔτϓϦϯλʔΛ୳͢ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ ϨγʔτϓϦϯλʔʹσʔλΛૹΔ
4%,ΛΘͣϨγʔτϓϦϯλʔͰҹ͢ΔྲྀΕ ϨγʔτϓϦϯλʔΛ୳͢ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ ϨγʔτϓϦϯλʔʹσʔλΛૹΔ
ϨγʔτϓϦϯλʔΛ୳͢ ɾ4503&4ϨδͰ#MVFUPPUI$MBTTJDΛར༻ ɾ&""DDFTTPSZ.BOBHFSΛ༻͠ϨγʔτϓϦϯλʔͱଓ
طଘͷଓࡁΈΞΫηαϦΛεΩϟϯ͢Δ߹ // ௨ొ EAAccessoryManager.shared().registerForLocalNotifications() let accessories = EAAccessoryManager.shared().connectedAccessories for
accessory in accessories { // accessory: EAAccessory ͔ΒϨγʔτϓϦϯλʔΛݕࡧ } ϨγʔτϓϦϯλʔΛ୳͢
طଘͷଓࡁΈΞΫηαϦΛεΩϟϯ͢Δ߹ // ௨ొ EAAccessoryManager.shared().registerForLocalNotifications() let accessories = EAAccessoryManager.shared().connectedAccessories for
accessory in accessories { // accessory: EAAccessory ͔ΒϨγʔτϓϦϯλʔΛݕࡧ } ϨγʔτϓϦϯλʔΛ୳͢
طଘͷଓࡁΈΞΫηαϦΛεΩϟϯ͢Δ߹ // ௨ొ EAAccessoryManager.shared().registerForLocalNotifications() let accessories = EAAccessoryManager.shared().connectedAccessories for
accessory in accessories { // accessory: EAAccessory ͔ΒϨγʔτϓϦϯλʔΛݕࡧ } ϨγʔτϓϦϯλʔΛ୳͢ ଓࡁΈΞΫηαϦΛऔಘ
طଘͷଓࡁΈΞΫηαϦΛεΩϟϯ͢Δ߹ // ௨ొ EAAccessoryManager.shared().registerForLocalNotifications() let accessories = EAAccessoryManager.shared().connectedAccessories for
accessory in accessories { // accessory: EAAccessory ͔ΒϨγʔτϓϦϯλʔΛݕࡧ } ϨγʔτϓϦϯλʔΛ୳͢ ଓࡁΈΞΫηαϦ͔Βݕࡧ
ϨγʔτϓϦϯλʔΛ୳͢ ৽نΞΫηαϦΛεΩϟϯ͢Δ߹ /// BluetoothΞΫηαϦϐοΧʔΛදࣔ public func showBluetoothAccessoryPicker( nameFilter:
NSPredicate? = nil ) async throws { try await EAAccessoryManager .shared() .showBluetoothAccessoryPicker( withNameFilter: nameFilter ) }
ϨγʔτϓϦϯλʔΛ୳͢ ৽نΞΫηαϦΛεΩϟϯ͢Δ߹ /// BluetoothΞΫηαϦϐοΧʔΛදࣔ public func showBluetoothAccessoryPicker( nameFilter:
NSPredicate? = nil ) async throws { try await EAAccessoryManager .shared() .showBluetoothAccessoryPicker( withNameFilter: nameFilter ) }
ϨγʔτϓϦϯλʔΛ୳͢ ৽نΞΫηαϦΛεΩϟϯ͢Δ߹ /// BluetoothΞΫηαϦϐοΧʔΛදࣔ public func showBluetoothAccessoryPicker( nameFilter:
NSPredicate? = nil ) async throws { try await EAAccessoryManager .shared() .showBluetoothAccessoryPicker( withNameFilter: nameFilter ) } ΞΫηαϦ໊ͰߜΓࠐΈՄೳ
ϨγʔτϓϦϯλʔΛ୳͢ ৽نΞΫηαϦΛεΩϟϯ͢Δ߹ /// BluetoothΞΫηαϦϐοΧʔΛදࣔ public func showBluetoothAccessoryPicker( nameFilter:
NSPredicate? = nil ) async throws { try await EAAccessoryManager .shared() .showBluetoothAccessoryPicker( withNameFilter: nameFilter ) }
ଓ௨ͷࢹ let connectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidConnect, object: nil,
queue: .main ) { [weak self] notification in // ଓͨ͠ϨγʔτϓϦϯλʔΛอ࣋ let accessory = notification.object as? EAAccessory … } notificationTokens.append(connectToken) ϨγʔτϓϦϯλʔΛ୳͢
ଓ௨ͷࢹ let connectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidConnect, object: nil,
queue: .main ) { [weak self] notification in // ଓͨ͠ϨγʔτϓϦϯλʔΛอ࣋ let accessory = notification.object as? EAAccessory … } notificationTokens.append(connectToken) ϨγʔτϓϦϯλʔΛ୳͢ ΞΫηαϦͱଓͨ࣌͠ʹ௨
ଓ௨ͷࢹ let connectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidConnect, object: nil,
queue: .main ) { [weak self] notification in // ଓͨ͠ϨγʔτϓϦϯλʔΛอ࣋ let accessory = notification.object as? EAAccessory … } notificationTokens.append(connectToken) ϨγʔτϓϦϯλʔΛ୳͢
அ௨ͷࢹ let disconnectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidDisconnect, object: nil,
queue: .main ) { [weak self] notification in // அͨ͠ϨγʔτϓϦϯλʔΛআ } notificationTokens.append(disconnectToken) ϨγʔτϓϦϯλʔΛ୳͢
அ௨ͷࢹ let disconnectToken = NotificationCenter.default.addObserver( forName: .EAAccessoryDidDisconnect, object: nil,
queue: .main ) { [weak self] notification in // அͨ͠ϨγʔτϓϦϯλʔΛআ } notificationTokens.append(disconnectToken) ϨγʔτϓϦϯλʔΛ୳͢ ΞΫηαϦͱஅͨ࣌͠ʹ௨
4%,ΛΘͣϨγʔτϓϦϯλʔͰҹ͢ΔྲྀΕ ϨγʔτϓϦϯλʔΛ୳͢ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ ϨγʔτϓϦϯλʔʹσʔλΛૹΔ
Ϩγʔτσʔλͷੜ4503&4Ϩδͷ߹ ɾϨγʔτσʔλͷߏ ɾϔομʔใɿλΠτϧը૾ͳͲ ɾใɿ໊Ձ֨ͳͲ ɾձܭใɿ߹ܭֹۚ੫ۚͳͲ ɾϑολʔใɿ23ίʔυͳͲ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ
ϓϦϯλʔίϚϯυϓϩτίϧ ɾϝʔΧʔ͝ͱʹϨγʔτϓϦϯλʔ༻ͷίϚϯυମܥ͕ଘࡏ ɾ&QTPO͕։ൃͨ͠ʮ&4$104ܗࣜʯ ɾελʔਫ਼ີ͕։ൃͨ͠ʮ4UBS 13/5ܗࣜʯ ɾίϚϯυਐͰදݱʢྫɿY"ʣ ɾςΩετը૾ͷҹͳͲ༷ʑͳίϚϯυΛઃఆՄೳ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ
// վߦίϚϯυ public func lineFeedCommand() -> Data { Data([0x0A])
} // ςΩετҹίϚϯυ public func textCommand(_ text: String) -> Data { text.data(using: .utf8) ?? Data() } // ςΩετΛଠࣈʹ͢ΔίϚϯυ public func boldCommand(_ enabled: Bool) -> Data { let value: UInt8 = enabled ? 0x01 : 0x00 return Data([0x1B, 0x45, value]) } ϝʔΧʔڞ௨ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ
// վߦίϚϯυ public func lineFeedCommand() -> Data { Data([0x0A])
} // ςΩετҹίϚϯυ public func textCommand(_ text: String) -> Data { text.data(using: .utf8) ?? Data() } // ςΩετΛଠࣈʹ͢ΔίϚϯυ public func boldCommand(_ enabled: Bool) -> Data { let value: UInt8 = enabled ? 0x01 : 0x00 return Data([0x1B, 0x45, value]) } ϝʔΧʔڞ௨ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ %BUBܕΛฦ͢
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1D,
0x56, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1D, 0x76, 0x30, 0x00])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } &QTPOϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1B,
0x64, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1B, 0x58])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } ελʔਫ਼ີϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1D,
0x56, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1D, 0x76, 0x30, 0x00])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } &QTPOϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1B,
0x64, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1B, 0x58])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } ελʔਫ਼ີϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ
// ϨγʔτΛΧοτʢஅʣ͢ΔίϚϯυ public func cutPaperCommand() -> Data { Data([0x1B,
0x64, 0x00]) } // ը૾Λҹ͢ΔͨΊͷίϚϯυ public func bitmapCommand(_ data: Data, width: Int, height: Int) -> Data { var command = Data() // ϏοτϚοϓҹίϚϯυ command.append(Data([0x1B, 0x58])) // ෯ͱߴ͞ command.append(Data([UInt8(width & 0xFF), UInt8((width >> 8) & 0xFF)])) command.append(Data([UInt8(height & 0xFF), UInt8((height >> 8) & 0xFF)])) // ϏοτϚοϓσʔλ command.append(data) return command } ελʔਫ਼ີϨγʔτϓϦϯλʔ༻ίϚϯυͷྫ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ %BUBܕΛฦ͢
4%,ΛΘͣϨγʔτϓϦϯλʔͰҹ͢ΔྲྀΕ ϨγʔτϓϦϯλʔΛ୳͢ ҹ͢ΔϨγʔτσʔλΛ࡞͢Δ ϨγʔτϓϦϯλʔʹσʔλΛૹΔ
ϨγʔτίϚϯυ%BUBܕ public func cutPaperCommand() -> Data { Data([0x1D, 0x56,
0x00]) } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ
ϨγʔτίϚϯυ%BUBܕ public func cutPaperCommand() -> Data { Data([0x1D, 0x56,
0x00]) } %BUBܕΛόΠτྻʹม extension Data { func toBytes() -> [UInt8] { withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> [UInt8] in let unsafeBufferPointer = pointer.bindMemory(to: UInt8.self) let unsafePointer = unsafeBufferPointer.baseAddress! return [UInt8](UnsafeBufferPointer(start: unsafePointer, count: count)) } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ
var bytes: [UInt8] = data.toByte() ϨγʔτϓϦϯλʔʹσʔλΛૹΔ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ &"4FTTJPO͔Β 0VUQVU4USFBNΛநग़ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ σʔλʢίϚϯυʣΛ 0VUQVU4USFBNʹॻ͖ࠐΉ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ ॻ͖ࠐΜͩͷσʔλΛ CZUFT͔ΒऔΓআ͘ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ϨγʔτϓϦϯλʔʹσʔλΛૹΔ ॻ͖ࠐΈ͕ྃ͢Δ͔ ճࣦഊ͢Δ·Ͱϧʔϓ %BUBܕΛόΠτྻʹม͠0VUQVU4USFBNʹॻ͖ࠐΉ
J04ΞϓϦ͔ΒϨγʔτϓϦϯλʔʹϨγʔτσʔλΛૹ৴͢Δํ๏ ϨγʔτϓϦϯλʔʹσʔλΛૹΔ
J04ΞϓϦ͔ΒϨγʔτϓϦϯλʔʹϨγʔτσʔλΛૹ৴͢Δํ๏ ϨγʔτϓϦϯλʔʹσʔλΛૹΔ ˠ4USFBN"1*Λར༻
J04ΞϓϦ͔ΒϨγʔτϓϦϯλʔʹϨγʔτσʔλΛૹ৴͢Δํ๏ ϨγʔτϓϦϯλʔʹσʔλΛૹΔ ˠ4USFBN"1*Λར༻ 🤔
ෳͷϝʔΧʔΛαϙʔτ 4USFBN"1*Λར༻͢Δ
4USFBN"1*ͱ ɾ'PVOEBUJPOϑϨʔϜϫʔΫͷΈ ɾ4XJGUͰσʔλͷಡΈॻ͖ΛඇಉظͰ࣮ࢪ ɾެࣜʹ'PVOEBUJPO4USFBNTͱදݱ ɾຊτʔΫͰ૯শͱͯ͠4USFBN"1*ͱදݱ
ɾ&YUFSOBM"DDFTTPSZ'SBNFXPSLʹ͓͚Δඪ४తͳΠϯλʔϑΣʔε ɾϨγʔτϓϦϯλʔҰʹେྔͷσʔλͷड৴͕ෆՄ ˠ4USFBN"1*Ͱૹड৴Մೳ͔Ͳ͏͔ΠϕϯτͰཧ͍ͨ͠ ɾϨγʔτϓϦϯλʔͱͷ௨৴ͰํͷΓͱΓ͕ॏཁ ˠΞϓϦ͔ΒҹσʔλΛૹ৴͠ͳ͕ΒҹྃɾΤϥʔΛड৴͍ͨ͠ ͳͥ4USFBN"1*ʁ
4USFBN"1*ͱ 0VUQVU4USFBN ɾΞϓϦ͔ΒσʔλΛૹ৴͢ΔͨΊͷ௨৴νϟϯωϧ ɾྫɿϓϦϯλʔҹίϚϯυΛૹ৴ *OQVU4USFBN ɾ֎෦͔ΒΞϓϦʹσʔλΛड৴͢ΔͨΊͷ௨৴νϟϯωϧ ɾྫɿϓϦϯλʔ͔ΒҹྃɾΤϥʔ௨Λड৴
4USFBN"1*ͱ 0VUQVU4USFBN Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT *OQVU4USFBN ϨγʔτҹίϚϯυ ҹྃɾΤϥʔ௨
4USFBN"1*ͱ 4USFBN%FMFHBUF ɾΠϕϯτۦಈͰ4USFBNͷঢ়ଶΛࢹ ɾΠϕϯτ 4USFBN&WFOU ͷछྨ PQFO$PNQMFUFE 4USFBNΛ։࢝ͨ͠ IBT#ZUFT"WBJMBCMF
*OQVU4USFBNͰಡΈऔΓՄೳͳσʔλ͕౸ணͨ͠ IBT4QBDF"WBJMBCMF 0VUQVU4USFBNͷॻ͖ࠐΈ͕Մೳʹͳͬͨ FSSPS0DDVSSFE 4USFBNͷૢ࡞தʹΤϥʔ͕ൃੜͨ͠ FOE&ODPVOUFSFE 4USFBN͕ਖ਼ৗʹऴྃͨ͠
4USFBNͷ࣮ྫɿΫϥεશମ final class PrinterStream: NSObject, StreamDelegate { private let
session: EASession init(session: EASession) { self.session = session } func openStreams() { // OutputStreamઃఆ session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) session.outputStream?.open() // InputStreamઃఆ session.inputStream?.delegate = self session.inputStream?.schedule( in: .main, forMode: .common ) session.inputStream?.open() } func closeStreams() { // OutputStreamऴྃ session.outputStream?.close() session.outputStream?.remove( from: .main, forMode: .common ) session.outputStream?.delegate = nil // InputStreamऴྃ session.inputStream?.close() session.inputStream?.remove( from: .main, forMode: .common ) session.inputStream?.delegate = nil } func stream(_ aStream: Stream, handle eventCode: Stream.Event) { switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά case _ as InputStream: // inputStream ͷϋϯυϦϯά default: break } }
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ func
startSession() { guard let session = EASession( accessory: accessory, forProtocol: protocolString) else { return } … }
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ func
startSession() { guard let session = EASession( accessory: accessory, forProtocol: protocolString) else { return } … } ֎෦ଓΞΫηαϦ ϨγʔτϓϦϯλʔ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ func
startSession() { guard let session = EASession( accessory: accessory, forProtocol: protocolString) else { return } … } ௨৴ϓϩτίϧจࣈྻ ɾ&QTPODPNFQTPOFTDQPT ɾελʔਫ਼ີKQTUBSNTUBSQSP
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) …
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) … 4USFBN%FMFHBUFͷઃఆ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) … 3VO-PPQΛొ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { session.outputStream?.delegate = self session.outputStream?.schedule( in: .main, forMode: .common ) … 3VO-PPQΛొ 4USFBNΛ ϝΠϯεϨουͰॲཧ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { … session.outputStream?.open() }
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func openStreams() { … session.outputStream?.open() } 4USFBNͷ։࢝
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ final
class PrinterStream: …, StreamDelegate { … func stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά default: break …
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ final
class PrinterStream: …, StreamDelegate { … func stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά default: break … 4USFBN&WFOU͕ ݺΕΔ PQFO$PNQMFUFE 4USFBNΛ։࢝ͨ͠ IBT#ZUFT"WBJMBCMF *OQVU4USFBNͰಡΈऔΓՄೳͳσʔλ͕౸ணͨ͠ IBT4QBDF"WBJMBCMF 0VUQVU4USFBNͷॻ͖ࠐΈ͕Մೳʹͳͬͨ FSSPS0DDVSSFE 4USFBNͷૢ࡞தʹΤϥʔ͕ൃੜͨ͠ FOE&ODPVOUFSFE 4USFBN͕ਖ਼ৗʹऴྃͨ͠
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ final
class PrinterStream: …, StreamDelegate { … func stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά default: break … 4USFBNͷ ϋϯυϦϯάΛ࣮ࢪ PQFO$PNQMFUFE 4USFBNΛ։࢝ͨ͠ IBT#ZUFT"WBJMBCMF *OQVU4USFBNͰಡΈऔΓՄೳͳσʔλ͕౸ணͨ͠ IBT4QBDF"WBJMBCMF 0VUQVU4USFBNͷॻ͖ࠐΈ͕Մೳʹͳͬͨ FSSPS0DDVSSFE 4USFBNͷૢ࡞தʹΤϥʔ͕ൃੜͨ͠ FOE&ODPVOUFSFE 4USFBN͕ਖ਼ৗʹऴྃͨ͠
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func closeStreams() { … session.outputStream?.close() session.outputStream?.remove( from: .main, forMode: .common ) session.outputStream?.delegate = nil }
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func closeStreams() { … session.outputStream?.close() session.outputStream?.remove( from: .main, forMode: .common ) session.outputStream?.delegate = nil } 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ private
let session: EASession func closeStreams() { … session.outputStream?.close() session.outputStream?.remove( from: .main, forMode: .common ) session.outputStream?.delegate = nil } $PO fi HVSBUJPOઃఆͷআ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ
4USFBNͷϥΠϑαΠΫϧ &"4FTTJPOͷ࡞ $PO fi HVSBUJPOͷઃఆ 4USFBNͷ։࢝ σʔλͷૹड৴ɾΠϕϯτॲཧ 4USFBNͷऴྃ ϨγʔτϓϦϯλʔͱͷ
ηογϣϯ͕ܧଓ͍ͯ͠Ε ʙ܁Γฦ࣮͠ߦͰ͖Δ
ʢ࠶ܝʣ4USFBN"1*ͱ 0VUQVU4USFBN Ҿ༻ɿIUUQTSFHJGBRTUPSFTKQIDKBBSUJDMFT *OQVU4USFBN ϨγʔτҹίϚϯυ ҹྃɾΤϥʔ௨
ϨγʔτϓϦϯλʔʹσʔλΛૹΔ
Ϩγʔτҹͷઆ໌Λऴ͑ͯ w 4%,ΛΘͣʹϨγʔτϓϦϯλʔͰҹ͢Δํ๏Λհ͠·ͨ͠ w ͜ΕʹΑΓෳͷϝʔΧʔΛαϙʔτ͢Δ͜ͱ͕ՄೳʹͳΓ·ͨ͠
͓͠·͍ ຊτʔΫɺʂ
͓͠·͍ʜͰͳ͍ʂ ຊτʔΫɺ·ͩ·͖ͩͭͮ·͢
ຊτʔΫͰ͢͜ͱ ϨγʔτϓϦϯλʔͷհ ෳͷϝʔΧʔΛαϙʔτ Ϩγʔτҹ్͕தͰࢭ·Δෆ۩߹ ·ͱΊ
Ϩγʔτҹ్͕தͰࢭ·Δෆ۩߹
Ϩγʔτҹͷෆ۩߹ ɾ4XJGUରԠͰϨγʔτҹॲཧͷվमΛߦ͍2"Λ࣮ࢪ ɾϨγʔτҹ్͕தͰఀࢭ͢Δෆ۩߹͕ൃੜ ɾվमલ·Ͱਖ਼ৗʹಈ࡞͠ ϨγʔτϓϦϯλʔͱͷଓྑ
Ϩγʔτҹͷෆ۩߹
ҹ͕ਖ਼ৗʹྃ ҹ్͕தͰఀࢭ Ϩγʔτҹͷෆ۩߹
ҹ͕ਖ਼ৗʹྃ ҹ్͕தͰఀࢭ Ϩγʔτҹͷෆ۩߹ ͍͍ͬͨͳͥఀࢭ͢Δʁ
ݪҼΛௐࠪ ɾෳͷϨγʔτϓϦϯλʔͰ࠶ݱ͢Δ͔ݕূ ɾϨγʔτҹ࣌ͷΤϥʔϩά͕ग़ྗ͞Ε͍ͯΔ͔֬ೝ ɾҹॲཧͷͲ͜Ͱఀࢭ͍ͯ͠Δ͔ௐࠪ
ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ɾෳͷϝʔΧʔϓϦϯλʔͰಉ༷ͷෆ۩߹͕ൃੜ ɾϓϦϯλʔͷϨγʔτσʔλͷૹ৴͕Ұ࣌ఀࢭ͍ͯ͠Δ͜ͱ͕ൃ֮
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ॻ͖ࠐΈΛϧʔϓͰॲཧ
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ॻ͖ࠐΈ͕#ZUFͷͨΊࣦഊ
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ճࣦഊͨͨ͠Ίϧʔϓऴྃ
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ճࣦഊͨͨ͠Ίϧʔϓऴྃ ॻ͖ࠐΈʹࣦഊ͠ଓ͚ͯ ϧʔϓ͕ऴྃ͠ ์ஔঢ়ଶʹͳ͍ͬͯͨ
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ͪͳΈʹҹ͕ఀࢭ͢Δͱʜ ॻ͖ࠐΈͨ͠ΛCZUFT͔Βআ
var bytes: [UInt8] = data.toByte() func write() { let session:
EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } ͪͳΈʹҹ͕ఀࢭ͢Δͱʜ ϧʔϓऴ͕ྃͨ͠σʔλଘ
ҹ͕ఀࢭͷঢ়ଶͰ͞ΒʹҹΛ͢Δͱʜ
ʢ࠶ܝʣௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ɾෳͷϝʔΧʔϓϦϯλʔͰಉ༷ͷෆ۩߹͕ൃੜ ɾϓϦϯλʔͷϨγʔτσʔλͷૹ৴͕Ұ࣌ఀࢭ͍ͯ͠Δ͜ͱ͕ൃ֮
ʢ࠶ܝʣௐࠪΛͯ͠Θ͔ͬͨ͜ͱ ɾෳͷϝʔΧʔϓϦϯλʔͰಉ༷ͷෆ۩߹͕ൃੜ ɾϓϦϯλʔͷϨγʔτσʔλͷૹ৴͕Ұ࣌ఀࢭ͍ͯ͠Δ͜ͱ͕ൃ֮ ͦͦͳͥ ॻ͖ࠐΈʹࣦഊ͢Δʁ
ϨγʔτҹͷσʔλྔΛϩάͰ֬ೝ Ϩγʔτσʔλ૯ྔɹɹ #ZUF ճͷॻ͖ࠐΈ #ZUF ʙճͷॻ͖ࠐΈ
#ZUF ճͷॻ͖ࠐΈ #ZUF ճҎ߱ͷॻ͖ࠐΈ #ZUF Γͷσʔλྔ #ZUF &QTPO5.Nͷ߹
ϨγʔτҹͷσʔλྔΛϩάͰ֬ೝ Ϩγʔτσʔλ૯ྔɹɹ #ZUF ճͷॻ͖ࠐΈ #ZUF ʙճͷॻ͖ࠐΈ
#ZUF ճͷॻ͖ࠐΈ #ZUF ճҎ߱ͷॻ͖ࠐΈ #ZUF Γͷσʔλྔ #ZUF &QTPO5.Nͷ߹ ɾճ ճͰॻ͖ࠐΈ༗ ɾॻ͖ࠐΈࣦഊཱ͕ͭ ɾ͕ॻ͖ࠐΈͰ͖ͣ
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾॻ͖ࠐΉσʔλྔͷཧతͳ੍ݶɿ #ZUF CJU ͷʣ ɾճͷ #ZUFͷॻ͖ࠐΈͰ੍ݶʹ౸ୡͯ͠͠·ͬͨ ɾ੍ݶʹ౸ୡ͢ΔओͳཁҼ ɾ&"4FTTJPOͷ0VUQVU4USFBNόοϑΝαΠζ੍ݶ
ɾϓϦϯλʔϋʔυΣΞଆͷड৴όοϑΝ੍ݶ ɾ#MVFUPPUI௨৴ϓϩτίϧͷ੍ݶ
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ Ϩγʔτσʔλ૯ྔɹɹ #ZUF ճͷॻ͖ࠐΈ #ZUF ʙճͷॻ͖ࠐΈ
#ZUF ճͷॻ͖ࠐΈ #ZUF ճҎ߱ͷॻ͖ࠐΈ #ZUF Γͷσʔλྔ #ZUF
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ Ϩγʔτσʔλ૯ྔɹɹ #ZUF ճͷॻ͖ࠐΈ #ZUF ʙճͷॻ͖ࠐΈ
#ZUF ճͷॻ͖ࠐΈ #ZUF ճҎ߱ͷॻ͖ࠐΈ #ZUF Γͷσʔλྔ #ZUF 🤔
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ 0VUQVU4USFBN
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾճɹɿ #ZUFॻ͖ࠐΈʢຬഋʣ 0VUQVU4USFBN
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾճɹɿ #ZUFॻ͖ࠐΈʢຬഋʣ ɾʙճɿຬഋͷͨΊॻ͖ࠐΈෆՄ 0VUQVU4USFBN
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾճɹɿ #ZUFॻ͖ࠐΈʢຬഋʣ ɾʙճɿຬഋͷͨΊॻ͖ࠐΈෆՄ ɾճɹɹϓϦϯλʔ͕Ұ෦σʔλΛॲཧ ɹɹɹɹɹɹۭ͖͕ൃੜ͠ #ZUFॻ͖ࠐΈ 0VUQVU4USFBN
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾճɹɿ #ZUFॻ͖ࠐΈʢຬഋʣ ɾʙճɿຬഋͷͨΊॻ͖ࠐΈෆՄ ɾճɹɹϓϦϯλʔ͕Ұ෦σʔλΛҹ ɹɹɹɹɹɹۭ͖͕ൃੜ͠ #ZUFॻ͖ࠐΈ ɾճʙɹ ϓϦϯλʔҹ͕σʔλॲཧʹ͍͔ͭͳ͍
ಉظతͳϙʔϦϯά XIJMFจ Ͱ 0VUQVU4USFBNͷۭ͖Λదʹݕग़Ͱ͖ͳ͍ 0VUQVU4USFBN
Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ɾճɹɿ #ZUFॻ͖ࠐΈʢຬഋʣ ɾʙճɿຬഋͷͨΊॻ͖ࠐΈෆՄ ɾճɹɹϓϦϯλʔ͕Ұ෦σʔλΛҹ ɹɹɹɹɹɹۭ͖͕ൃੜ͠ #ZUFॻ͖ࠐΈ ɾճʙɹ ϓϦϯλʔҹ͕σʔλॲཧʹ͍͔ͭͳ͍
ಉظతͳϙʔϦϯά XIJMFจ Ͱ 0VUQVU4USFBNͷۭ͖Λదʹݕग़Ͱ͖ͳ͍ 0VUQVU4USFBN
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } 0VUQVU4USFBNͷۭ͖Λݕग़Ͱ͖ͳ͍ཧ༝ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } 0VUQVU4USFBNͷۭ͖Λݕग़Ͱ͖ͳ͍ཧ༝ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢ ɾಉظతͳϧʔϓॲཧͰ0VUQVU4USFBNΛϙʔϦϯά ɾ0VUQVU4USFBNͷঢ়ଶมԽΛϦΞϧλΠϜͰࢹͰ͖ͳ͍ʂ ɾϓϦϯλʔͷॲཧͱΞϓϦؒͰಉظ͕औΕͳ͍
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢ ɾಉظతͳϧʔϓॲཧͰ0VUQVU4USFBNΛϙʔϦϯάʜ ɾ0VUQVU4USFBNͷঢ়ଶมԽΛϦΞϧλΠϜͰࢹͰ͖ͳ͍ʂ ɾϓϦϯλʔͷॲཧͱಉظ͕औΕͳ͍ 0VUQVU4USFBNͷ ঢ়ଶมԽΛࢹ͢Δ Έ͕ඞཁʂ
var bytes: [UInt8] = data.toByte() func write() { let
session: EASession let failedLimit: UInt = 10 var failedCount: UInt = 0 while let outputStream = session.outputStream, failedCount < failedLimit { let writtenBytes = outputStream.write(bytes, maxLength: bytes.count) if writtenBytes > 0 { let toRange = min(bytes.count, Int(writtenBytes)) bytes.removeSubrange(0 ..< toRange) } else { failedCount += 1 } } } Ϩγʔτσʔλͷॻ͖ࠐΈ͕ਐ·ͳ͍ݪҼ ʢ࠶ܝʣ%BUBܕΛ6*OUܕྻʹม͠Ҿʹ͢ ɾಉظతͳϧʔϓॲཧͰ0VUQVU4USFBNΛϙʔϦϯάʜ ɾ0VUQVU4USFBNͷঢ়ଶมԽΛϦΞϧλΠϜͰࢹͰ͖ͳ͍ʂ ɾϓϦϯλʔͷॲཧͱಉظ͕औΕͳ͍ 4USFBN&WFOUͷग़൪ʂ
0VUQVU4USFBNͷঢ়ଶมԽΛࢹ͢Δղܾࡦ final class PrinterStream: …, StreamDelegate { … func
stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: // OutputStream ͷϋϯυϦϯά default: break } }
0VUQVU4USFBNͷঢ়ଶมԽΛࢹ͢Δղܾࡦ final class PrinterStream: …, StreamDelegate { … func
stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: switch eventCode { case .hasSpaceAvailable: // OutputStreamͷॻ͖ࠐΈΛ࠶։ write() } default: break }
0VUQVU4USFBNͷঢ়ଶมԽΛࢹ͢Δղܾࡦ final class PrinterStream: …, StreamDelegate { … func
stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: switch eventCode { case .hasSpaceAvailable: // OutputStreamͷॻ͖ࠐΈΛ࠶։ write() } default: break } 0VUQVU4USFBNͷ ॻ͖ࠐΈ͕Մೳʹͳͬͨ
0VUQVU4USFBNͷঢ়ଶมԽΛࢹ͢Δղܾࡦ final class PrinterStream: …, StreamDelegate { … func
stream(_ aStream: Stream, handle eventCode: Stream.Event) { … switch aStream { case _ as OutputStream: switch eventCode { case .hasSpaceAvailable: // OutputStreamͷॻ͖ࠐΈΛ࠶։ write() } default: break }
ෆ۩߹ͷमਖ਼ޙʜ
ෆ۩߹ͷमਖ਼ޙʜ ϨγʔτҹͰ͖ͨ👏
ຊτʔΫͰ͢͜ͱ ϨγʔτϓϦϯλʔͷհ ෳϝʔΧʔΛαϙʔτ Ϩγʔτҹ్͕தͰࢭ·Δෆ۩߹ ·ͱΊ
·ͱΊ
·ͱΊ ɾ#MVFUPPUIଓͨ͠ϨγʔτϓϦϯλʔͷҹํ๏Λղઆ͠·ͨ͠ ɾ4USFBN"1*ͰෳϝʔΧʔϨγʔτϓϦϯλʔͷαϙʔτΛ࣮ݱ͠·ͨ͠ ɾϨγʔτҹ్͕தͰࢭ·Δෆ۩߹ͷݪҼௐࠪΛߦ͍·ͨ͠ ɾݪҼ0VUQVU4USFBNͷॻ͖ࠐΈʹ੍ݶ͕͋ͬͨ͜ͱ ɾղܾࡦ4USFBN&WFOUΛࢹ͠ҹॲཧΛ࠶࣮ߦ͢Δ͜ͱ
εϙϯαʔϒʔεʹͯϨγʔτҹମݧͰ͖·͢
࠷ޙʹͻͱ͜ͱ ϧʔϧΛकָͬͯ͘͠ ϨγʔτΛҹ͠Α͏ʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ ΞϑλʔΠϕϯτΓ·͢ʂͥͻ͝ࢀՃ͍ͩ͘͞ʂ