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
たまねぎ
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
19
AIのAIによるAIのための出力評価と改善
chocoyama
3
990
[FlutterKaigi2024] Effective Form 〜Flutterによる複雑なフォーム開発の実践〜
chocoyama
1
13k
iOSDC2023:聴いて話すiOS 現実世界の「音」との連携
chocoyama
1
440
20分でわかる!速習resultBuilder(iOSDC 2022)
chocoyama
7
4.1k
SwiftUIっぽくした話
chocoyama
1
760
SwiftUIとGraphQLでプロダクトの継続的な破壊に立ち向かう
chocoyama
6
2.9k
Featured
See All Featured
The Curious Case for Waylosing
cassininazir
1
510
Site-Speed That Sticks
csswizardry
13
1.5k
The Cost Of JavaScript in 2023
addyosmani
55
10k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
720
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
280
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
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 ιϑτΣΞ͚ͩͰ࣮ݱͰ͖ͳ͍ϢʔβʔମݧΛఏڙͰ͖Δ
େม͚ͩͲɺ ໘ന͋͞ΔΑʂ