1 คะแนน โดย GN⁺ 4 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เป็น Rust crate ที่ตรวจจับลายสวัสดิกะซึ่งอาจเกิดขึ้นโดยบังเอิญใน QR โค้ด และสามารถสร้าง QR โค้ดที่ไม่มีลายดังกล่าวได้แบบเลือกใช้
  • เรนเดอร์มาสก์แพตเทิร์นทั้ง 8 แบบของมาตรฐาน QR เพื่อคัดตัวเลือกที่ไม่มีลายดังกล่าว จากนั้นเลือกมาสก์ที่มีค่าเพนัลตีตาม ISO/IEC 18004 ต่ำที่สุด
  • ยกเว้นโมดูล finder, timing, alignment, format และ version ออกจากการตรวจสอบ พร้อมคำนึงถึงคอนทราสต์โดยรอบ เพื่อไม่ให้เข้าใจผิดว่าองค์ประกอบการทำงานหรือรูปแบบที่มองไม่เห็นเป็นลายดังกล่าว
  • ตัวตรวจจับพื้นฐานนั้นไม่มี dependency ภายนอกและห้ามใช้ unsafe code พร้อมรองรับไลบรารี QR หลายตัวและการแสดงผลแบบ Vec<Vec<bool>>
  • ขอบเขตการตรวจจับจำกัดอยู่ที่รูปกางเขนตะขอแบบจัดแนวตามแกนขนาด 5×5 และ 7×7 ทั้งสองทิศทางและทั้งสองขั้วสี โดยไม่รองรับแบบ 45 องศา แบบทแยง หรือการหมุนตามมุมใดๆ

ทำไมจึงต้องหลีกเลี่ยงลายที่เกิดขึ้นโดยไม่ตั้งใจ

  • qr-swastika-avoider ตรวจจับและหลีกเลี่ยงแพตเทิร์นสวัสดิกะที่อาจปรากฏแบบสุ่มใน QR โค้ด
  • QR โค้ดจะเลือกจากมาสก์แพตเทิร์น 8 แบบที่สลับใช้แทนกันได้ โดยใช้ตัวที่มีคะแนนความอ่านง่ายดีที่สุด แต่ไม่ได้ตรวจสอบถึงสัญลักษณ์ที่อาจสร้างความไม่สบายใจ
  • ลายขนาดเล็กและบางอาจหลุดรอดจากกระบวนการประเมินของมาตรฐาน QR ได้ยาก จึงอาจคงอยู่ในโค้ดสุดท้ายโดยไม่ตั้งใจ

การตรวจจับที่คำนึงถึงองค์ประกอบการทำงานและคอนทราสต์

  • ตัวตรวจจับพื้นฐานไม่มี dependency ภายนอก และใช้ #![forbid(unsafe_code)]
  • สามารถตรวจสอบรูปแบบการแสดงผล QRได้หลากหลายผ่าน trait QrModules ขนาดเล็กที่มีสองเมธอด
  • ยกเว้นโมดูล finder, timing, alignment, format และ version ออกจากเป้าหมายการตรวจจับ เพื่อไม่ให้เข้าใจผิดว่ามุม finder เป็นลายสวัสดิกะ
  • ลายที่ถูกกลบอยู่ในโมดูลสีเดียวกันจนมองไม่เห็นจริงจะถูกละเว้นโดยอิงจากคอนทราสต์โดยรอบ และเกณฑ์นี้สามารถปรับได้
  • QR โค้ดที่มีอยู่แล้วสามารถตรวจสอบได้ด้วย contains_swastika และหากพบลายดังกล่าวก็สามารถสร้างใหม่หรือเตือนผู้ใช้ได้

รูปแบบ QR และไลบรารีที่รองรับ

  • มี adapter ต่อไปนี้ผ่าน Cargo feature
    • qrcodegen: qrcodegen::QrCode สำหรับ QrModules
    • qrcode: qrcode::QrCode สำหรับ QrModules
    • fast_qr: fast_qr::QRCode สำหรับ QrModules
  • รองรับเมทริกซ์โมดูลดิบแบบ Vec<Vec<bool>> ได้ด้วยโดยไม่ต้องมี adapter เพิ่มเติม โดย true หมายถึงโมดูลสีเข้ม

การสร้าง QR โค้ดที่ไม่มีลายดังกล่าว

  • encode_safe ของฟีเจอร์ generate รับเนื้อหาและระดับการแก้ไขข้อผิดพลาด แล้วคืนค่าเป็นQR โค้ดที่สแกนได้และไม่มีลายดังกล่าว หากสร้างไม่ได้จะคืนข้อผิดพลาดอย่างชัดเจน
  • ระหว่างกระบวนการสร้างจะเรนเดอร์มาสก์ทั้ง 8 แบบทั้งหมด จากนั้นคงไว้เฉพาะตัวเลือกที่ไม่มีลายเป้าหมายในการตรวจจับ
  • จากตัวเลือกที่เหลือจะคืนมาสก์ที่มีค่าเพนัลตีตาม ISO/IEC 18004 ต่ำที่สุด เพื่อคงการปรับความอ่านง่ายให้เหมาะสมตามมาตรฐาน
  • สามารถดึงเมทริกซ์โมดูลได้ด้วย matrix() และตรวจสอบมาสก์ที่เลือกได้ด้วย mask()

การจัดชุด Cargo feature

  • ฟีเจอร์พื้นฐานมีเฉพาะตัวตรวจจับที่ไม่มี dependency เท่านั้น
  • ฟีเจอร์ qrcodegen, qrcode, fast_qr จะเพิ่ม adapter สำหรับแต่ละไลบรารี
  • ฟีเจอร์ generate จะดึง qrcodegen มาเป็น dependency และให้ encode_safe

ขอบเขตการตรวจจับและไลเซนส์

  • ตรวจจับรูปกางเขนตะขอแบบดั้งเดิมที่จัดแนวตามแกนในขนาด 5×5 และ 7×7 ทั้งสองทิศทาง และทั้งสองขั้วสีสว่าง/มืด ภายในค่าความคลาดเคลื่อนเล็กน้อย
  • ลายแบบ 45 องศาหรือแบบทแยง และรูปแบบที่หมุนในมุมใดๆ ไม่รวมอยู่ในขอบเขตการตรวจจับ
  • เผยแพร่ภายใต้ MIT License

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

 
GN⁺ 4 시간 전
ความคิดเห็นจาก Lobste.rs
  • ที่น่าสับสนคือโปรเจกต์นี้หลีกเลี่ยง สวัสดิกะทางศาสนา แต่กลับไม่ได้หลีกเลี่ยงสวัสดิกะที่นาซีใช้จริง ๆ สัญลักษณ์นาซีเป็นรูปที่หมุน 45 องศา แต่โปรเจกต์ระบุชัดว่า “มอทิฟแบบ 45 องศา/แนวทแยง และการหมุนแบบใด ๆ อยู่นอกขอบเขต”

    • สวัสดิกะที่ไม่ได้หมุนก็ถูกมองว่าเป็น สัญลักษณ์นาซี เหมือนกัน ถ้าไม่คิดอย่างนั้น ก็ลองติดรอยสักชั่วคราวรูปสวัสดิกะที่ไม่ได้หมุนไว้ในจุดที่เห็นชัด ๆ แล้วออกไปเดินตามถนนดูได้
      ภาพที่เกิดขึ้นโดยบังเอิญใน QR code มีความละเอียดต่ำ ดังนั้นรูปที่ไม่ได้หมุนต่างหากที่มีโอกาสถูกมองเห็นเป็นสวัสดิกะอย่างชัดเจน มากกว่าจะเป็นลายพิกเซลสุ่ม การโฟกัสตรงนี้จึงสมเหตุสมผล
    • ผมก็สะดุดตาตรงนั้นเหมือนกัน สงสัยว่าอัลกอริทึมตรวจจับมีโครงสร้างที่โดยเนื้อแท้จัดการได้แค่แพตเทิร์นสี่เหลี่ยมผืนผ้า คล้าย rolling checksum ที่ไล่ตรวจตามแถวและคอลัมน์หรือเปล่า
      อีกอย่าง เขาบอกว่า “ยกเว้นโมดูล finder, timing, alignment, format และ version เพื่อไม่ให้เข้าใจผิดว่ามุมของ finder เป็นสวัสดิกะ” แต่เมื่อคนเห็นสัญลักษณ์ที่น่ารังเกียจใน QR code ปฏิกิริยาคงไม่ได้ต่างกันเพราะพิกเซลนั้นเป็นข้อมูลหรือเป็น timing pattern หรอก มุมของ finder ก็เป็นแค่สี่เหลี่ยมอยู่แล้ว ผมยังไม่เห็นเหตุผลว่าทำไมต้องตัดออกจากการวิเคราะห์ด้วย ยิ่งขุดลงไปก็ยิ่งไม่สมเหตุสมผล จนชวนสงสัยว่าเป็น ผลงานที่ AI สร้างแบบลวก ๆ หรือเปล่า
  • รู้สึกเศร้าที่มีโปรเจกต์แบบนี้อยู่ ไม่เคยแม้แต่คิดว่า สัญลักษณ์ที่น่ารังเกียจ อาจปรากฏขึ้นโดยบังเอิญใน QR code ได้

  • ผมลองคำนวณเองว่า “เวลาสร้าง QR code ง่าย ๆ แล้วเกิดสัญลักษณ์นาซีขนาดใหญ่ขึ้นมาแบบสุ่ม มันเกิดบ่อยแค่ไหนกันแน่?” QR code ไม่ได้สุ่มสมบูรณ์ แต่ในที่นี้จะมองข้ามไป
    ถ้าดู สวัสดิกะขนาด 5×5 และ 7×7 แบบเป็นอิสระกัน จะมีซ้าย-ขวา 2 ทิศทาง, polarity 2 แบบ, และแบบกลับด้าน/ปกติ รวมเป็น 8 แพตเทิร์น แพตเทิร์นทั้งหมดมี 2^25 = 33 ล้านแบบสำหรับ 5×5 และ 2^49 = 562 ล้านล้านแบบสำหรับ 7×7 ดังนั้นความน่าจะเป็นที่จะมีสวัสดิกะจึงเป็น 2.38e-7 และ 1.42e-14 ตามลำดับ ใน QR code มีพื้นที่ 5×5 จำนวน 289 ตำแหน่ง และพื้นที่ 7×7 จำนวน 225 ตำแหน่ง ดังนั้นความน่าจะเป็นรวมที่จะพบสวัสดิกะอย่างน้อยหนึ่งรูปใน QR code แบบสุ่มอยู่ที่ประมาณ 0.00006 หรือ 1 ใน 14,500 ส่วนขนาด 9×9 ขึ้นไปก็คำนวณได้ แต่ความน่าจะเป็นของชุดพิกเซลเฉพาะต่ำเกินไปจนไม่ส่งผลต่อผลลัพธ์อย่างมีนัยสำคัญ น่าเสียดายที่ดูซอร์สแล้วโปรเจกต์นี้เหมือนทำด้วย vibe coding แต่การคำนวณนี้ผมทำมือเอง

    • ถ้า QR code ที่จะใช้ในที่มองเห็นได้ชัดเกิดมีลายแบบนั้นขึ้นมา ก็แค่ ระบายพิกเซลบางส่วนทับ โค้ดก็ยังทำงานได้อยู่ ถ้าเป็นโค้ดที่มีคนเห็นแค่คนเดียวหรือแทบไม่มีโอกาสถูกสแกนจริง ก็ไม่มีเหตุผลต้องกังวล และคนส่วนใหญ่ก็คงเข้าใจว่าแพตเทิร์นแบบนั้นอาจเกิดขึ้นโดยบังเอิญใน QR code ได้
  • ถ้าเป็นโปรเจกต์ที่เฉพาะเจาะจงขนาดนี้ ก็อยากรู้ว่ามีเรื่องราวเบื้องหลังหรือมุกอะไรอยู่หรือเปล่า
    อย่างไรก็ตาม เมื่อดูสถานการณ์ที่ AI ซึ่งมีข้อบกพร่องมากถูกนำมาใช้ เช่น perceptual hash ของ Microsoft photoDNA รับมือกับกริด thumbnail ของ CSAM ที่เต็มอยู่ในข้อมูลฝึกได้ไม่ดี จนถึงขั้น ระงับบัญชีผู้ใช้ Discord ได้ด้วยแค่สกรีนช็อตสเปรดชีตและกริดคราฟต์ของ Minecraft เครื่องมือ หลีกเลี่ยงแพตเทิร์นอันตราย ที่ใช้ได้กว้างกว่านี้ก็ดูน่าสนใจทีเดียว

  • ควรแก้ ปัญหาในโลกจริง แทนที่จะทำซ้ำปัญหาในอดีตด้วยวิธีใหม่ ๆ โลกนี้มีคนอ่อนไหวเกินไปที่น่าจะสนใจโปรเจกต์แบบนี้อยู่มากเกินไปแล้ว

  • แม้จุดประสงค์จะเป็นการหลีกเลี่ยงสวัสดิกะในแพตเทิร์นข้อมูล แต่ตัวเว็บเพจเองแสดงสัญลักษณ์นั้น จึงสงสัยว่าอาจ ผิดกฎหมายในเยอรมนี หรือไม่

    • ถ้าเป็นเพื่อให้ข้อมูล การแสดงเฉย ๆ โดยตัวมันเองไม่ผิดกฎหมาย ตัวอย่างเช่น ในสารคดีที่ใช้ฟุตเทจบันทึกเหตุการณ์สงครามโลกครั้งที่สอง ไม่จำเป็นต้องเซ็นเซอร์สวัสดิกะ แต่การใส่ข้อความปฏิเสธความรับผิดไว้ก็อาจปลอดภัยกว่า
    • การถูกห้ามหรือไม่โดยพื้นฐานแล้ว ขึ้นอยู่กับบริบท: https://bundesgerichtshof.de/SharedDocs/Pressemitteilungen/…
      ตามคำพิพากษาดังกล่าวของศาลยุติธรรมแห่งสหพันธ์เยอรมนี สวัสดิกะที่ถูกขีดฆ่าด้วยเส้นทับได้รับอนุญาต และส่วนที่เหลือก็ถูกนำเสนอเป็นตัวอย่างของแพตเทิร์นที่โค้ดจะกรองออก ดังนั้นดูแล้วโอกาสเกิดปัญหาน่าจะต่ำ
    • ผมไม่ใช่นักกฎหมาย แต่ตอบสั้น ๆ คือไม่ผิดกฎหมาย ส่วนตอบยาว ๆ คือ ขึ้นอยู่กับบริบท บริบทของหน้านี้ดูไม่น่ามีปัญหา
      https://en.wikipedia.org/wiki/Strafgesetzbuch_section_86a