2 คะแนน โดย GN⁺ 2023-10-29 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • จากเป้าหมายที่จะลดการใช้บัตรพลาสติกของ Seattle Public Library และ King County Library System ทำให้ต้องจัดการโครงสร้าง JSON, รูปภาพ และลายเซ็นของ Wallet pass บน iPhone ด้วยตัวเอง
  • Wallet รองรับเฉพาะ QR code, PDF417, Aztec Code และ Code 128 จึงไม่สามารถใส่ Codabar ของบัตรห้องสมุดเป็นบาร์โค้ดพื้นฐานได้ และต้องใช้รูปภาพเป็นทางเลี่ยงสำหรับบาร์โค้ดที่ใช้สแกนจริง
  • pass ต้องถูกเซ็นด้วยคีย์ที่ Apple เชื่อถือ แต่แทนที่จะสมัคร Apple Developer ราคา 99 ดอลลาร์ต่อปี ก็ไปหาใบรับรองและคีย์จากแอป iOS สำหรับสร้าง pass ที่สร้างแบบออฟไลน์ได้มาใช้
  • ผสมผสานเลย์เอาต์ storeCard, โลโก้ตามความละเอียด, Codabar strip.png และรายการ PKBarcodeFormatCode128 ว่าง เพื่อให้หน้าจอแสดงบาร์โค้ดแบบรูปภาพ แต่ยังคงพฤติกรรม เพิ่มความสว่างหน้าจอ ของ iOS ไว้
  • .pkpass ที่เสร็จแล้วสามารถสร้างได้ด้วยการสร้าง manifest, เซ็นด้วย openssl smime และแพ็กเป็น ZIP และแม้ยังไม่ได้ทดสอบในห้องสมุดจริง แต่เครื่องสแกนแยกต่างหากอ่านบาร์โค้ดบนหน้าจอโทรศัพท์ได้

เป้าหมาย: ใช้บาร์โค้ดห้องสมุดโดยไม่ต้องมีบัตรพลาสติก

  • Seattle Public Library และ King County Library System ออก บัตรพลาสติกพิมพ์บาร์โค้ด ที่ผูกกับบัญชียืมหนังสือ
  • ณ ปี 2023 ฟังก์ชันส่วนใหญ่ของห้องสมุด Seattle เป็นแบบบริการตนเอง และโดยทั่วไปสามารถกรอกบาร์โค้ดห้องสมุดด้วยมือได้
  • ถึงอย่างนั้น การแสดงบาร์โค้ดขึ้นมาทันทีสะดวกกว่ามาก เป้าหมายจึงคือการไม่ต้องใส่บัตรพลาสติกที่แทบไม่ได้ใช้ไว้ในกระเป๋าสตางค์ แต่ใส่ไว้ใน แอป Wallet ของ iPhone แทน

Wallet pass ประกอบด้วย JSON, รูปภาพ และลายเซ็น

  • ปัจจุบันแอป Wallet จัดการบัตรชำระเงิน, ID, กุญแจ และอื่น ๆ แต่ตอนที่ Passbook เปิดตัวในปี 2012 นั้นจัดการเฉพาะ “pass” เท่านั้น
  • ตามเอกสาร pass ของ Apple pass เป็น ไฟล์ ZIP แบบรวมทุกอย่างในตัว ที่แจกจ่ายผ่านอีเมลหรือเว็บได้ และภายในมี JSON กับ PNG
  • องค์ประกอบหลักของไฟล์ .pkpass นั้นเรียบง่าย
    • pass.json: อธิบายเนื้อหาของ pass ที่ไม่ใช่รูปภาพ
    • manifest.json: รายการ เช็กซัม SHA-1 ของไฟล์อื่น ๆ
    • signature: ลายเซ็น S/MIME ของเนื้อหา manifest.json
    • ไฟล์รูปภาพที่รองรับ

ไม่รองรับ Codabar คืออุปสรรคแรก

  • บาร์โค้ดที่ Wallet pass รองรับมีเพียงสี่ชนิด
    • QR code
    • PDF417
    • Aztec Code
    • Code 128
  • บัตรห้องสมุดใช้รูปแบบ Codabar ซึ่งใช้กันอย่างแพร่หลายในห้องสมุด
  • เครื่องสแกนบาร์โค้ดของห้องสมุดอาจรองรับบาร์โค้ดเชิงเส้นแบบอื่น แต่รูปแบบเดียวที่คาดได้อย่างมั่นใจว่าจะทำงานได้ทุกสาขาคือ Codabar
  • สุดท้ายจึงต้องสร้างรูปภาพ Codabar ที่สแกนได้ แล้วใส่ไว้ใน pass แทนการใช้ฟังก์ชันบาร์โค้ดพื้นฐานของ Wallet

ปัญหาใบรับรองสำหรับเซ็น pass

  • Wallet pass ต้องมีลายเซ็นเข้ารหัส และต้องเซ็นด้วยคีย์ที่หนึ่งในหน่วยงานออกใบรับรองของ Apple เชื่อถือ
  • หากเป็นการใช้งานที่ผู้ขายอัปเดต pass อัตโนมัติ เช่น เปลี่ยนเกตหรือเปลี่ยนที่นั่งของตั๋วเครื่องบิน การมีลายเซ็นก็ดูสมเหตุสมผลอยู่บ้าง
  • หากเป็นนักพัฒนา Apple จะขอคีย์สำหรับเซ็น pass ได้ค่อนข้างง่าย แต่ไม่คิดจะจ่าย 99 ดอลลาร์ต่อปี เพื่อทำงานนี้

เหตุผลที่แอปสร้าง pass ที่มีอยู่ไม่เหมาะ

  • มีแอปออกแบบ pass หลายตัวที่สร้างโดยคนที่เป็นนักพัฒนา Apple อยู่แล้ว แต่ไม่ได้ให้การควบคุมในระดับที่ต้องการ
  • การควบคุมขนาดโลโก้

    • Apple อนุญาตให้โลโก้มุมซ้ายบนของ pass สูงได้สูงสุด 50 device-independent pixels
    • โลโก้สี่เหลี่ยมจัตุรัสที่วางข้างข้อความดูเหมาะที่สุดที่ความสูงประมาณ 40px
    • นักพัฒนาต้องจัดเตรียม logo.png, logo@2x.png, logo@3x.png แยกกัน แต่แอปเหล่านี้มักให้เลือกโลโก้เดียวและไม่ให้ควบคุมสเกล
  • พฤติกรรมความสว่างหน้าจอ

    • เมื่อเปิด pass ที่มีบาร์โค้ดที่รองรับตามปกติ หน้าจอจะสว่างขึ้นเพื่อให้เครื่องสแกนอ่านได้ชัด
    • หากต้องการให้ iOS เพิ่มความสว่างหน้าจอ โดยไม่แสดงบาร์โค้ดที่ใช้งานจริงไม่ได้ จำเป็นต้องจัดการ pass.json โดยตรง
    • แอปที่ดาวน์โหลดได้ฟรีบางตัวก็จำกัดจำนวน pass ที่บันทึกลง Wallet ได้และเรียกเก็บเงิน

หาคีย์เซ็นจากแอปสร้างแบบออฟไลน์

  • ดาวน์โหลดแอปสร้าง pass แบบเริ่มใช้ฟรีหลายตัว แล้วตรวจสอบว่าสร้าง pass แบบออฟไลน์ได้หรือไม่
  • จากการทดสอบในโหมดเครื่องบินและปิด Wi‑Fi พบว่าอย่างน้อยหนึ่งแอปสามารถสร้าง pass แบบออฟไลน์ได้
  • ไม่เปิดเผยชื่อแอปนั้นโดยตรง เพื่อหลีกเลี่ยงไม่ให้คีย์ถูกเพิกถอน
  • กระบวนการง่ายกว่าที่คาด
    • เนื่องจาก Mac ที่ใช้ Apple silicon สามารถรันแอป iOS ได้ จึงดาวน์โหลดแอปลงบน Mac
    • หาไฟล์ .p12 ที่เห็นได้ชัดในบันเดิลแอป iOS ที่ถูกห่อไว้
    • ไฟล์ PKCS#12 ต้องใช้รหัสผ่านสำหรับนำเข้า จึงรัน strings กับไบนารีหลักเพื่อหาสตริงที่ดูเหมือนรหัสผ่าน
  • เมื่อตรวจสอบข้อมูลใบรับรองด้วย openssl pkcs12 issuer ปรากฏเป็น Apple Worldwide Developer Relations Certification Authority
  • ต้องใช้เชนใบรับรองด้วย และใบรับรองตัวกลางอาจอยู่ในบันเดิลแอป หรือดาวน์โหลดได้จาก URL ในฟิลด์ส่วนขยาย X.509

การจัดเลย์เอาต์ของ pass

  • สไตล์ของ pass ต้องเลือกหนึ่งแบบจาก boarding pass, coupon, event ticket, generic, store card
  • หากต้องการใส่รูปภาพแนวนอนขนาดใหญ่ จำเป็นต้องใช้เลย์เอาต์ที่รองรับรูป strip
    • ตัวเลือกคือ coupon, event ticket, store card
    • เลือก store card เพราะรูปแบบใกล้เคียงกับบัตรห้องสมุดจริงที่สุด
  • pass.json มีค่าต่อไปนี้
    • passTypeIdentifier
    • teamIdentifier
    • formatVersion
    • serialNumber
    • organizationName
    • logoText
    • description
    • storeCard
    • backgroundColor
    • foregroundColor
    • sharingProhibited
  • passTypeIdentifier และ teamIdentifier ต้องตรงกับฟิลด์ UID และ OU ใน subject ของใบรับรอง Apple ตามลำดับ
  • แต่ละ pass ที่สร้างด้วย passTypeIdentifier เดียวกันต้องมี serialNumber ที่ไม่ซ้ำกัน
  • เตรียมรูปภาพตามการใช้งาน
    • icon.png เป็นไฟล์บังคับ แต่ไม่แสดงบนตัว pass
    • logo.png คือโลโก้ที่แสดงมุมซ้ายบน
    • สร้าง logo.png ขนาด 40×40, logo@2x.png ขนาด 80×80, logo@3x.png ขนาด 120×120
    • คัดลอก logo@3x.png เป็น icon.png
    • ใส่บาร์โค้ดที่สร้างไว้ล่วงหน้าใน strip.png

สร้างรูปภาพบาร์โค้ด Codabar

  • iOS จะสเกลและครอป strip.png ให้พอดีกับกล่องบนหน้าจออุปกรณ์ ดังนั้นจึงไม่จำเป็นต้องสร้าง strip.png 3 แบบตามความละเอียด
  • บัตรห้องสมุดทั้งสองใบใช้ A และ D เป็นสัญลักษณ์เริ่มต้นและสิ้นสุด
  • สัญลักษณ์เริ่มต้นและสิ้นสุดตรวจสอบได้ง่ายที่สุดถ้ามีเครื่องสแกนบาร์โค้ด หรือถ้าไม่มี ก็เทียบด้วยตากับตารางการเข้ารหัส Codabar บน Wikipedia ได้
  • ตัวสร้าง Codabar ที่ใช้งานได้ทันทีบนออนไลน์มีไม่มาก แต่ตัวรูปแบบเองเขียนใช้งานเองได้ง่าย
  • ในต้นแบบ ใช้ไลบรารี Barcoders สำหรับ Rust สร้าง SVG จากนั้นปรับ SVG แล้วส่งออกเป็น PNG
  • เลย์เอาต์สุดท้ายกำหนดโดยคำนึงถึงความสามารถในการสแกนและการแสดงผลแบบย่อของ iOS
    • ตั้งความสูงบาร์โค้ดเป็นหน่วย 2 เท่าของจำนวนสัญลักษณ์ทั้งหมดรวมสัญลักษณ์เริ่มต้นและสิ้นสุด
    • ตัวอย่างเช่น หมายเลขบาร์โค้ด 13 หลักจะมี 15 สัญลักษณ์ จึงตั้งความสูงเป็น 30 หน่วย
    • เว้น quiet space 15 หน่วย ก่อนเริ่มและหลังจบอย่างละด้าน
    • เว้น padding 50 หน่วย ด้านบนและล่างของบาร์โค้ดอย่างละด้าน
    • ขยายแต่ละหน่วยเป็น 8 พิกเซล เพื่อให้ iOS ย่อรูปภาพเสมอ
    • ในตัวอย่างบาร์โค้ด 15 สัญลักษณ์ รูปภาพสุดท้ายสูง 1040 พิกเซล และตัวบาร์โค้ดสูง 240 พิกเซล
  • เขียน เชลล์สคริปต์ 69 บรรทัด เพื่อสร้าง BMP ของ Codabar ตามเลย์เอาต์ข้างต้น แล้วแปลงเป็น PNG ด้วย sips
  • เมื่อบันทึกผลลัพธ์ของสคริปต์เป็น strip.png ก็ได้รูปภาพบาร์โค้ดสำหรับใส่ใน pass

การแสดงหมายเลขบาร์โค้ดและทางเลี่ยงเรื่องความสว่างหน้าจอ

  • แสดงหมายเลขบาร์โค้ดใต้บาร์โค้ดด้วย secondaryFields
    • key: number
    • label: CARD NUMBER
    • value: หมายเลขบัตร
  • iOS จะเพิ่มความสว่างหน้าจอเมื่อเลือก pass ที่มีบาร์โค้ด เพื่อช่วยเครื่องสแกน
  • Codabar ที่ใส่เป็นรูปภาพอย่างเดียวไม่ทำให้ iOS มองว่ามีบาร์โค้ด
  • ระบุ รายการบาร์โค้ดว่าง ที่ระดับบนสุดของ pass.json เพื่อเลี่ยงพฤติกรรมนี้
    • message เป็นสตริงว่าง
    • format เป็น PKBarcodeFormatCode128
    • messageEncoding เป็น iso-8859-1
  • วิธีนี้ไม่แสดงบาร์โค้ดที่ด้านล่างของ pass แต่ยังทำให้ iPhone เพิ่มความสว่างหน้าจอเหมือน pass ที่มีบาร์โค้ด

การเซ็นและแพ็กเกจ

  • หลังเตรียมไฟล์ทั้งหมดแล้ว ต้องสร้าง manifest.json
  • manifest.json เป็นอ็อบเจ็กต์ที่มีชื่อไฟล์เป็นคีย์ และเช็กซัม SHA-1 เป็นค่า
  • ใช้ sha1sum ร่วมกับ jq เพื่อสร้าง manifest ของไฟล์ PNG และ pass.json
  • เซ็น manifest ด้วยคำสั่ง openssl smime
    • ใบรับรองของผู้เซ็น
    • private key
    • ใบรับรองตัวกลาง Apple WWDR
    • อินพุต manifest.json
    • เอาต์พุต signature
  • ตัวเลือก -attime ของ openssl smime ใช้ระบุเวลาที่ต้องการสำหรับการเซ็นได้
    • ค่าของตัวเลือกเป็น UNIX epoch
    • แม้ใบรับรองที่ได้รับจาก Apple หรือค้นพบจะหมดอายุแล้ว ก็ยังเซ็นด้วยเวลานั้นได้
  • สุดท้ายบีบอัดไฟล์ต่อไปนี้เป็น ZIP เพื่อสร้าง .pkpass
    • รูปภาพ PNG
    • pass.json
    • manifest.json
    • signature

ผลการทดสอบและสิ่งที่ยังน่าเสียดาย

  • macOS มีเครื่องมือพรีวิว pass ที่ใช้ตรวจสอบว่า pass ใช้ได้และโดยรวมแสดงผลถูกต้องหรือไม่
  • หากไม่ถูกต้อง สามารถหา error ได้ใน Console.app
  • เครื่องมือพรีวิวไม่ได้แม่นยำ 100% แต่มีปุ่มส่งไปยัง iPhone ผ่าน iCloud
  • pass ที่เสร็จแล้วนี้ยังไม่ได้ทดสอบในห้องสมุดจริง
  • เครื่องสแกนบาร์โค้ดแยกต่างหากสามารถอ่านบาร์โค้ดบนหน้าจอโทรศัพท์ได้เหมือนกับบัตรพลาสติกจริง
    • อย่างไรก็ตาม จะอ่านได้ดีเมื่อปรับความสว่างหน้าจอไปที่สูงสุด
    • ตั้งความสว่างไว้สูงกว่าความสว่างที่เพิ่มขึ้นจากทางเลี่ยงบาร์โค้ดว่าง
  • เป็นเรื่องดีที่สเปกของ pass แทบไม่เปลี่ยนในช่วง 10 ปี แต่ก็น่าเสียดายที่การเซ็น pass ที่ไม่เป็นอันตรายซึ่งประกอบด้วย PNG และ JSON ต้องใช้ Apple Developer Membership ราคา 99 ดอลลาร์ต่อปี
  • อาจถือได้ว่าฟีเจอร์บางอย่างของ pass จำเป็นต้องมีลายเซ็น แต่สิ่งที่ทำในงานนี้ไม่ควรจำเป็นต้องมีลายเซ็น
  • หาก Apple เพิ่ม การรองรับ Codabar ให้ Wallet ก็จะรองรับบัตรห้องสมุดดิจิทัลได้โดยไม่ต้องตรวจสอบว่าเครื่องสแกนทั้งระบบห้องสมุดรองรับ Code 128 หรือไม่

1 ความคิดเห็น

 
GN⁺ 2023-10-29
ความคิดเห็นจาก Hacker News
  • ครั้งหน้าหวังว่าจะพูดถึง บัตร ORCA ด้วย Seattle เป็นหนึ่งในศูนย์กลางเทคโนโลยีของสหรัฐฯ แต่รถไฟใต้ดิน/ขนส่งสาธารณะเองก็ไม่ค่อยดีอยู่แล้ว แถมในเชิงเทคนิคยังล้าหลังกว่าระบบขนส่งสาธารณะของเมืองใหญ่แทบทุกเมืองที่ผมเคยใช้
    เทียบกับเมืองไหนก็ได้ในยุโรป, CDMX, Denver ก็ล้ำหน้า Seattle ไปมาก และโดยส่วนตัวคิดว่า Denver น่าจะดีที่สุด
    หน่วยงานหนึ่งที่ดูแล ORCA เคยลงบล็อกว่าจะเพิ่มการรองรับ NFC ในแอป Android แต่บทความนั้นหายไปแล้ว และผ่านมาหลายปีก็ยังไม่มีฟีเจอร์นั้น

    • มีโพสต์เมื่อไม่กี่วันก่อนว่า Google Wallet จะรองรับสิ่งนี้เร็ว ๆ นี้: https://blog.google/products/google-pay/commute-around-the-w...
    • ระบบขนส่งในพื้นที่ของเราเพิ่งเพิ่ม การจ่ายแบบแตะ ทำให้ใช้บัตรเครดิตใบไหนก็ได้ หรือ Apple Pay/Google Pay ก็ได้
      ถ้าใช้บัตรใบเดิมตลอด ระบบจะจัดการเรื่องการเปลี่ยนสาย พาสหลายวัน และอื่น ๆ ได้อย่างลื่นไหล และจะคิดค่าโดยสารที่ถูกต้องให้อัตโนมัติ เช่น ถ้านั่งเกินจำนวนครั้งที่กำหนดภายในช่วงเวลาหนึ่งก็จะไม่คิดเงินเพิ่ม
    • ผมสงสัยว่าระบบขนส่งสาธารณะส่วนใหญ่จะสูญเสียรายได้ไปเพียงบางส่วนถ้าเปลี่ยนเป็น ขึ้นฟรี แต่เมื่อเทียบกันแล้ว ค่าใช้จ่ายในการดูแลระบบเก็บค่าโดยสารนั้นสูงแค่ไหน
    • เกี่ยวกับเรื่องนี้ ไม่มีวิธี โคลนบัตร NFC ด้วย Android ที่รูทแล้วหรือ?
      ประตูออฟฟิศผมเปิดด้วยบัตร NFC เลยลองหาดูว่าทำบน iOS ได้ไหม แต่เท่าที่จำได้ Apple ควบคุมฮาร์ดแวร์ NFC เข้มงวดกว่า PassKit ทั่วไป จึงไม่น่าทำได้ด้วยแอปทั่วไป
    • https://info.myorca.com/news/can-i-use-my-phone-to-pay-for-a...
      ORCA บอกว่าการจ่ายแบบแตะจะมาในปี 2023 ดังนั้นถ้าจะให้เป็นจริงก็เหลืออีกประมาณสองเดือน
      Google โพสต์ว่า Google Wallet จะรองรับ ORCA เร็ว ๆ นี้ เลยยังมองในแง่ดีอยู่
  • ถ้าเป็นผู้ใช้ Android ที่ไม่ชอบเพราะ Google Wallet ใส่บาร์โค้ดอะไรก็ได้แบบ Apple Passbook ไม่ได้ บน F-Droid มีแอปดี ๆ ชื่อ Loyalty Card Keychain: https://f-droid.org/en/packages/protect.card_locker/
    สามารถกรอกตัวเลขเองหรือสแกนบาร์โค้ดที่มีอยู่ แล้วเลือกบันทึกเป็นรูปแบบบาร์โค้ดได้หลายแบบ รวมถึง Codabar เมื่อแตะรายการในหน้าหลักของแอป ก็จะแสดงบาร์โค้ดที่สร้างขึ้นและเพิ่มความสว่างหน้าจอให้ด้วย
    อาจเพราะมันแทบไม่ทำอะไรนอกจากแสดงบาร์โค้ด แอปจึงเปิดได้เร็วมาก ฟีเจอร์มีแค่อย่างเดียว แต่บางทีอาจเป็นแอปที่ผมชอบที่สุดก็ได้
    ช่วงนี้ดูเหมือนจะแนะนำให้ใช้ Catima กัน ลองใช้ครู่หนึ่งแล้วก็เรียบง่ายคล้ายกัน และดูเหมือนอิงจาก codebase เดียวกัน

    • บน Apple ผมใช้ Pass4Wallet สร้าง “บัตร” แล้วนำเข้า Apple Wallet
      ถึงจะไม่สะดวกนัก แต่ก็ทำได้ตามต้องการ และนโยบายความเป็นส่วนตัวก็ดี
    • มีแอปที่ให้ใส่บาร์โค้ดตามต้องการลงใน Google Wallet ได้ด้วย: https://play.google.com/store/apps/details?id=color.dev.com....
  • ผมไม่เข้าใจว่าทำไมพาสต้องถูกเซ็นเชิงเข้ารหัส และต้องเซ็นด้วยคีย์ที่หน่วยงานรับรองของ Apple รู้จักจึงจะสมเหตุสมผล สำหรับการใช้งานประเภทอัปเดตแบบนี้ก็มี HTTPS ที่รองรับดีอยู่แล้ว
    บางที Apple อาจต้องการให้พาสถูกตรวจสอบได้ไม่ใช่แค่ตอนอัปเดต แต่รวมถึงตอนออฟไลน์บนโทรศัพท์ด้วย ถึงอย่างนั้นก็ยังแปลกอยู่ดี ผู้ไม่หวังดีสามารถสับเปลี่ยนพาสทั้งใบแทนที่จะอัปเดตพาส

    • แค่ให้พาสแรกระบุ กุญแจสาธารณะ ที่อนุญาตให้ทำการอัปเดตก็น่าจะพอแล้ว
      ผมไม่เห็นเลยว่าการผูกกับบัญชีนักพัฒนา Apple จะช่วยเรื่องการอัปเดตอย่างไร
      เหตุผลที่พอนึกออกสำหรับข้อกำหนดว่าต้องเป็นผู้ที่ Apple อนุมัติ ก็คือการขายตั๋วปลอม แต่ไฟล์ pkpass ที่ชื่อ “ตั๋วคอนเสิร์ต X” จะเป็นของจริงหรือไม่นั้น ต่อให้มีข้อกำหนดนี้หรือไม่ก็ไม่มีทางรู้ได้
      อาจเป็นความพยายามรับมือโดยยกเลิกบัญชีนักพัฒนานั้นเมื่อมีรายงานการฉ้อโกงเข้ามา แต่แบบนี้ก็ดูไม่ใช่ทางแก้ ค่าใช้จ่ายของบัญชีนักพัฒนาน่าจะถูกกว่าเงินที่ทำได้จากการโกงก่อนถูกจับได้มาก
  • ผมก็แค่ส่ง ไฟล์ PNG บาร์โค้ด ที่มีหมายเลขบัตรห้องสมุดให้ตัวเองทางอีเมล แล้วเปิดด้วยแอป Photos หรือ Gmail ตอนอยู่หน้าตู้คีออสก์

    • Wallet pass สามารถกำหนด ตำแหน่งและช่วงเวลา ที่พาสนั้นจะขึ้นว่า “เกี่ยวข้อง” ได้
      ผมใช้แอป MakePass สร้างพาสที่ใส่โค้ดสมาชิก StarBucks ไว้ พอไปใกล้ร้านที่ไปบ่อย โทรศัพท์ก็จะแนะนำพาส StarBucks บนหน้าจอล็อกให้อัตโนมัติ
      ตั๋วอีเวนต์ก็เหมือนกัน ถ้ากำหนดตำแหน่งและช่วงเวลาไว้ เมื่อไปถึงหน้างาน ระบบจะแนะนำพาสให้อัตโนมัติโดยไม่ต้องไล่หา พออีเวนต์จบก็จะไม่แนะนำอีก และย้ายไปอยู่ในส่วน “Expired Passes” เพื่อไม่ให้รกหน้าจอหลัก
      MakePass: https://pvieito.com
    • ตอนอ่านผ่าน ๆ ผมก็มองหาอยู่ว่าทำไมถึงไม่แค่ ถ่ายรูป ไว้
  • เป็นบล็อกโพสต์ที่ดี แต่ตอนท้ายจบด้วยว่า “ยังไม่ได้ทดสอบพาสนี้ในห้องสมุดจริง”
    ผมเข้าใจว่าเป็นโปรเจกต์ทำเล่น ๆ แต่ไม่เข้าใจว่าทำไมถึงไม่ใช้เวลา 10 นาที ที่จำเป็นในการทดสอบวิธีแก้ขั้นสุดท้ายก่อนแชร์ผลงาน

    • ตรงนั้นทำให้บทความทั้งชิ้นหมดพลังไปเลย รู้สึกเหมือน “เรามีทฤษฎีทางวิทยาศาสตร์ที่ยอดเยี่ยมเกี่ยวกับการสูญเสียออกซิเจนระหว่างวิ่ง ยอมรับว่ายังไม่ได้เริ่มจ็อกกิ้งจริง ๆ แต่…”
    • สุดท้ายมันก็เป็นแค่ กลุ่มพิกเซล ที่แทนบาร์โค้ดซึ่งจะถูกสแกน ถ้าแสดงผลถูกต้องแล้วจะมีอะไรผิดพลาดได้ล่ะ?
    • ห้องสมุดอาจไม่เปิดวันเสาร์ก็ได้
  • ตอนสร้างบาร์โค้ด โดยส่วนตัวแล้วชอบ ตัวสร้างบาร์โค้ดที่เขียนด้วย PostScript
    https://bwipp.terryburton.co.uk/

  • ปัญหานี้แก้ด้วยการถ่ายรูปบัตรห้องสมุดไว้ เวลา借หนังสือก็เปิดรูปแล้วเอาไปจ่อกับสแกนเนอร์ได้เลย

    • เอารูปบาร์โค้ดไปใส่ไว้ใน การแจ้งเตือนตามตำแหน่งที่ตั้ง พอไปถึงห้องสมุดแถวบ้านก็จะเด้งขึ้นมาเป็นการแจ้งเตือน
    • ถ้าเป็นบาร์โค้ดแบบคงที่ แค่มีรูปก็พอแล้ว ประโยชน์ของการใส่ไว้ใน Wallet ไม่ได้มากนัก
      เก็บบัตรประจำตัวทั้งหมดไว้ในอัลบั้มรูปของโทรศัพท์
  • ถ้าอยากทำอะไรคล้าย ๆ กันบน Android มี Catima ใน Google Play และ F-Droid รองรับบาร์โค้ดหลายประเภท
    https://catima.app/

    • ใช้ Google Pay หรือ Samsung Pay ก็ได้
  • สแกนเนอร์บาร์โค้ด 1 มิติ แบบเลเซอร์ราคาถูกอ่านบาร์โค้ดจากหน้าจอไม่ได้ eInk อาจจะได้
    บัตรสมาชิกของซูเปอร์มาร์เก็ตที่ไปบ่อยเป็นแบบบาร์โค้ดเลยไม่สะดวก แต่โชคดีที่เครื่องอ่านบาร์โค้ดเลียนแบบคีย์บอร์ด ดังนั้นจึงพิมพ์โค้ดด้วยคีย์บอร์ดได้เลย

    • ตามที่ผมเข้าใจ เพราะระบบรุ่นเก่าไม่ได้สแกนด้วยเซ็นเซอร์ภาพดิจิทัล แต่ใช้ลำแสงเลเซอร์ที่หมุนอยู่กับโฟโตไดโอดแบบง่าย ๆ เพื่ออ่านการเปลี่ยนแปลงของความสว่างที่สะท้อนจากพื้นที่สีขาว/ดำของบาร์โค้ด
      สแกนเนอร์แบบกล้องไม่สนว่าแสงที่ส่องบาร์โค้ดจะเป็นแสงรอบข้าง ไฟ LED ของตัวเอง หรือหน้าจอมีแบ็กไลต์ แต่ระบบแบบเลเซอร์พึ่งพาแสงสะท้อนจากแสงของตัวเอง จึงใช้กับหน้าจอที่มีแบ็กไลต์แบบแอ็กทีฟไม่ได้เลย
      สงสัยว่าใช้กับ e-ink หรือจอ LCD แบบพาสซีฟได้ไหม
    • เคยทำเครื่องแสดงบาร์โค้ดราคาถูกด้วย Bluetooth MCU กับ จอ E-ink และใช้งานได้ดีทั้งหมดกับสแกนเนอร์บาร์โค้ดที่รองรับเฉพาะ 1 มิติ
    • ทุกครั้งที่เห็นสแกนเนอร์พกพาของ Costco อ่าน บาร์โค้ดสมาชิก ที่พิมพ์ไว้เล็กและแคบมากบนบัตรสมาชิกได้เร็วและง่ายแค่ไหน ก็ยังทึ่งอยู่เสมอ
      มองเผิน ๆ เหมือนเป็นแบบ 2D เส้นสีแดงธรรมดา ๆ แต่ดูเหมือนว่าฮาร์ดแวร์ก็สำคัญจริง ๆ
  • เลขบัญชี KCLS ผมจำเอาเลย น่าจะใช้เวลาจำแค่ประมาณ 30 วินาทีพอ แม้จะแล้วแต่คน แต่คิดว่าวิธีนี้น่าจะเร็วกว่า
    หลังจากนั้นก็แค่ป้อน เลขบัญชี แทนการสแกนบาร์โค้ด และมีโอกาสใช้เวลาน้อยกว่าการหยิบโทรศัพท์ออกมาเตรียมด้วยซ้ำ
    ไม่รู้ว่า SPL ใช้วิธีเดียวกันไหม ไม่ได้อยู่ใน Seattle เลยตรวจสอบไม่ได้

    • ถ้าไม่อยากจำ ก็เก็บไว้ใน ตัวจัดการรหัสผ่าน ที่ต้องการได้เลย