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
ハードウェア対応のリアル.pdf
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
たまねぎ
May 16, 2023
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ハードウェア対応のリアル.pdf
たまねぎ
May 16, 2023
More Decks by たまねぎ
See All by たまねぎ
個人への依存を、AIで分散させる
chocoyama
0
27
AIのAIによるAIのための出力評価と改善
chocoyama
3
1k
[FlutterKaigi2024] Effective Form 〜Flutterによる複雑なフォーム開発の実践〜
chocoyama
1
14k
iOSDC2023:聴いて話すiOS 現実世界の「音」との連携
chocoyama
1
460
20分でわかる!速習resultBuilder(iOSDC 2022)
chocoyama
7
4.1k
SwiftUIっぽくした話
chocoyama
1
770
SwiftUIとGraphQLでプロダクトの継続的な破壊に立ち向かう
chocoyama
6
3k
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1.1k
Test your architecture with Archunit
thirion
2
2.5k
Crafting Experiences
bethany
1
390
ラッコキーワード サービス紹介資料
rakko
4
5.5M
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
440
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
900
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
490
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Transcript
ϋʔυΣΞରԠͷϦΞϧ !@DIPDPZBNB &CJTVNPCJMF
ࣗݾհ w ͨ·Ͷ͗ʢ!@DIPDPZBNBʣ w 4503&4ϨδͷJ04ΞϓϦ։ൃ w ϋʔυΣΞରԠ ॳΊͯΓ࢝Ί͔ͯΒd
ࠓ͢͜ͱ w ϋʔυΣΞରԠͱʁ w ։ൃͷϦΞϧ w ӡ༻ͷϦΞϧ w ςΫϊϩδʔʹΑΔ՝ղܾ
˞શମతʹJ04دΓͷʹͳΓ·͢🙏
ϋʔυΣΞରԠͱʁ
ϝΠϯػͱผͷೖग़ྗͱ࿈ܞ͢ΔରԠ ܾࡁ υϩΞʔ όʔίʔυεΩϟφʔ ΧελϚʔσΟεϓϨΠ #FBDPO ϚΠΫ εϐʔΧʔ ϖϯγϧ Ϛε
ΩʔϘʔυ ΠϠϗϯ ೖྗ ग़ྗ ϓϦϯλʔ εϚʔτϑΥϯ୯ମͰ ղܾͰ͖ͳ͍՝ʹϦʔνͰ͖Δ
4503&4ϨδͷରԠϋʔυΣΞͱػೳ όʔίʔυεΩϟφʔͰɺΞΠςϜΛΧʔτʹՃ Ճͨ͠ΧʔτͷใΛɺΧελϚʔσΟεϓϨΠʹө ܾࡁͰɺܾࡁॲཧΛ࣮ߦ ܾࡁ͕ྃͨ͠จͷϨγʔτΛɺϓϦϯλʔͰग़ྗ
ར༻͍ͯ͠Δٕज़ ར༻ٕज़ ܾࡁ #MVFUPPUI ϓϦϯλʔ υϩΞʔ #MVFUPPUI όʔίʔυεΩϟφʔ #MVFUPPUI
ΧελϚʔσΟεϓϨΠ ʢεϚʔτϑΥϯʣ -PDBM/FUXPSL ղܾͰ͖Δ՝େ͖͍͕ɺ։ൃɾӡ༻ͷίετେ͖͍
։ൃͷϦΞϧ
࣮ϋʔυϧ͕ߴ͍ w ͱͷ࿈ܞ෦Ͱ ϨΠϠʔͳ࣮͕ඞཁ w ଓཧɾ௨৴ॲཧͰͷ ࡉ͔͍έΞ͕େม w
ඇಉظॲཧ͕ଟ͘ɺ ॲཧͷྲྀΕ͕௫ΈͮΒ͍ uint8_t *pos_papercut(cy_printer const printer, size_t *out_len) { if(printer & cy_paper_cut) { INIT_BUF(); size_t nl_len; uint8_t * const newlines = pos_cutter_newlines(printer, &nl_len); if(nl_len > 0) APPEND_BUF(newlines, nl_len); if(CY_PRINTER_TYPE(printer) == cy_sm_desktop_printer) APPEND_BUF_AUTO(POS_LM_CUTPAPER); else APPEND_BUF_AUTO(POS2_CUTPAPER); if(out_len) *out_len = BUF_LEN(); return BUF(); } else return pos_cutter_newlines(printer, out_len); } $ݴޠʹΑΔ࣮ίʔυ
ςετ͕ͮ͠Β͍ w ग़͕ࣾඞཁ w ࣗಈςετͰͷ୲อ͕ͮ͠Β͍ w 04ɾόʔδϣϯ͚ͩͰͳ͘ɺ ϝʔΧʔϋʔυΣΞछผͷ
ֻ͚߹Θͤ૿͑Δ
ӡ༻ͷϦΞϧ
༷ʑͳڥɾछྨͷରԠ͕େม w #MVFUPPUIͷׯব8J'JઃఆʹΑΔҟৗಈ࡞ w ϝʔΧʔʹґଘͨ͠ෆ۩߹ใࠂ w αϙʔτΛΓͮΒ͍
Ϋϥογϡෆ۩߹͕ൃੜ͍͢͠ w τοϓΫϥογϡϋʔυΣΞؔ࿈͕੮ר w ؆୯ʹݪҼΛಛఆͰ͖ͳ͍Ϋϥογϡϩά
ͭΒΈϙΠϯτ·ͱΊ w ࣮ɾอकͷϋʔυϧ͕ߴ͍ w ෆ۩߹͕ى͖ࠩ͋͘͢Δ w ςετίετ͕ߴࣗ͘ಈԽͮ͠Β͍ w αϙʔτΛΓͮΒ͍ ςΫϊϩδʔͰղܾ͠Α͏ʂ
࣮ɾอकͷϋʔυϧΛԼ͛ΔऔΓΈ w ࣄྫɿඇಉظॲཧΛ4XJGU$PODVSSFODZͰ୯७Խ w ࣄྫɿυΩϡϝϯτཧղΛ$IBU(15ͰߴԽ w ࣄྫɿ۪ͳ࣮Λ3FTVMU#VJMEFSͰநԽ
ࣄྫɿඇಉظॲཧΛ4XJGU$PODVSSFODZͰ୯७Խ w ՝ w %FMFHBUF$PNQMFUJPO)BOEMFSϕʔεͷ࣮͕ଟ͍ w ඇಉظॲཧΛ࿈ଓͰߦ͏έʔεଟ͍ w ίʔϧόοΫࠈʹͳΓɺॲཧϑϩʔ͕ಡΈऔΓͮΒ͍ w
5SZ w 4XJGU$PODVSSFODZΛ༻͍࣮ͨʹஔ͖͑ w ίʔυΛ୯७ʹ্͔ΒԼಡΉ͚ͩͰ͍͍ঢ়گʹվળ
detectPaperWidth { guard $0 != PaperWidth.unknown else { // Ϩγʔτ෯ͷऔಘʹࣦഊͨ͠߹ɺ1͚ͩϦτϥΠ͢Δ
_ = detectPaperWidth { update(paperWidth: $0) } return } update(paperWidth: $0) } var paperWidth = await paperWidthDetector.getWidth() if paperWidth == .unknown { // Ϩγʔτ෯ͷऔಘʹࣦഊͨ͠߹ɺ1͚ͩϦτϥΠ͢Δ paperWidth = await paperWidthDetector.getWidth() } update(paperWidth: paperWidth) ωετ͕গͳ͘ɺॲཧͷྲྀΕ͕௫Έ͘͢ͳͬͨ $PNQMFUJPO)BOEMFS%FMFHBUF 4XJGU$PODVSSFODZ ˞ཁΛߜΔͨΊσϑΥϧϝͯ͠·͢ XJUI$IFDLFE$POUJOVBUJPOͰɺ ڧ੍తʹ4XJGU$PODVSSFODZͷܗ
func getWidth() async -> PaperWidth { await withCheckedContinuation { (continuation:
CheckedContinuation<PaperWidth, Never>) in session.listen { inputStream, _ in var input: UInt8 = 0 let inputLength = inputStream.read(&input, maxLength: 4096) if inputLength > 0 { let paperWidth = getPaperWidth( printerModel: printerModel, fromResponseValue: Data(bytes: &input, count: inputLength).ex.toBytes() ) continuation.resume(returning: paperWidth) } } session.write(Data(bytes: cmd, count: cmdLength)) } } ֎͔Βݟͨ࣌BTZODBXBJUͷγϯϓϧͳ*' $PNQMFUJPO)BOEMFSϕʔεͷ۪ͳ࣮ ด͡ࠐΊͯநԽ͢Δ
let print = { printReceiptML(receiptML) _ = cutPaper() completion() }
let supportedVariableWidth = (printerType & cy_variable_paper_width) != 0 if supportedVariableWidth { let continuePrint = { (width: PrinterWidth) in paperWidth = width print() } detectPaperWidth { guard $0 != PrinterWidth.unknown else { _ = detectPaperWidth { continuePrint($0) } return } continuePrint($0) } } else { print() } guard let activePrinter, let receipt = PaymentReceipt(order: order, store: store)?.build(), let image = try? await receipt.image( width: CGFloat(await activePrinter.receiptWidth()) ) else { return } activePrinter.printReceiptImage(image) ϨΨγʔͳ෦ΛϞμϯͳٕज़Ͱϥοϓ ҹ໋ྩΛߦ͏ؔͷαϯϓϧ ॲཧͷྲྀΕ͕͍͘͢ͳΓɺίʔυͷݮͰ͖ͨ
ࣄྫɿυΩϡϝϯτཧղΛ$IBU(15ͰߴԽ ʮग़ྗ͞ΕΔ༻ࢴ෯ͷऔಘʯʹؔ͢ΔϓϦϯλʔͷެࣜυΩϡϝϯτ
ϋʔυΣΞؔ࿈ͷυΩϡϝϯτ w ՝ w ීஈࢀর͢Δ%PDͱ͔͚Εͨ༰ w αοͱཧղ͢Δʹϋʔυϧ͕ߴ͍ w ࣄྫ͕গͳ͘άάͬͯώοτͮ͠Β͍ w
5SZ w άάͬͯμϝͳΒδϐͬͯΈΑ͏
%PDͷҰ෦Λίϐϖͯ͠ ʮΑ͘Θ͔Βͳ͍ͷͰɺΘ͔ΔΑ͏ʹڭ͑ͯʯ ͬͯݴͬͯΈΔ ˠৄࡉͳղઆΛͯ͘͠ΕΔ $IBU(15ͷ׆༻
·ͩΑ͘Θ͔Βͳ͍ͷͰɺ υΩϡϝϯτʹهࡌͷͳ͍ύλʔϯΛྫʹ ༷ͷཧղΛਂΊΑ͏ͱ͢Δ ˠ%PDͷΑ͏ʹҰൠԽͨ͠༰Ͱͳ͘ɺ ʮ"ͷ߹ɺ#ʹͳΔʯͱ͍ͬͨ ۩ମతͳ༷Λڭ͑ͯ͘ΕΔ
ˠ۩ମతͳظ݁ՌΛڭ͑ͯ͘ΕΔ ੩తͳ%PDͰෆՄೳͳΠϯλϥΫςΟϒͳ2"ʹΑΓɺ ཧղ͕ઙ͍෦Λ໌֬ʹ͠ͳ͕Β༷ΛѲͰ͖ͨ ༷͕໌֬ʹͳͬͨͷͰɺ ࠓճͷϢʔεέʔεΛΠϯϓοτ͢Δ͜ͱͰ ͦͷ߹Ͳ͏ͳΔ͔Λฉ͘
ࣄྫɿ۪ͳ࣮Λ3FTVMU#VJMEFSͰநԽ 9.-จࣈྻͷੜΛɺ4XJGU6*ͷΑ͏ͳ*'ͰͰ͖ΔΑ͏ʹͨ͠ SFGʲJ04%$ʳͰΘ͔ΔʂशSFTVMU#VJMEFS
·ͱΊ w ਖ਼ϋʔυΣΞରԠΛͯ͠ΔͱɺͭΒ͍ہ໘ʹʑͿ͔ͭΔ w ϨΠϠʔͳ࣮ϨΨγʔͳ෦Λɺ Ϟμϯͳٕज़ͰิͰ͖Δָ͕͋͠͞Δ w ιϑτΣΞ͚ͩͰ࣮ݱͰ͖ͳ͍ϢʔβʔମݧΛఏڙͰ͖Δ
େม͚ͩͲɺ ໘ന͋͞ΔΑʂ