- เป็น Rust crate ที่ตรวจจับลายสวัสดิกะซึ่งอาจเกิดขึ้นโดยบังเอิญใน QR โค้ด และสามารถสร้าง QR โค้ดที่ไม่มีลายดังกล่าวได้แบบเลือกใช้
- เรนเดอร์มาสก์แพตเทิร์นทั้ง 8 แบบของมาตรฐาน QR เพื่อคัดตัวเลือกที่ไม่มีลายดังกล่าว จากนั้นเลือกมาสก์ที่มีค่าเพนัลตีตาม ISO/IEC 18004 ต่ำที่สุด
- ยกเว้นโมดูล finder, timing, alignment, format และ version ออกจากการตรวจสอบ พร้อมคำนึงถึงคอนทราสต์โดยรอบ เพื่อไม่ให้เข้าใจผิดว่าองค์ประกอบการทำงานหรือรูปแบบที่มองไม่เห็นเป็นลายดังกล่าว
- ตัวตรวจจับพื้นฐานนั้นไม่มี dependency ภายนอกและห้ามใช้
unsafecode พร้อมรองรับไลบรารี 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สำหรับQrModulesqrcode:qrcode::QrCodeสำหรับQrModulesfast_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 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
ที่น่าสับสนคือโปรเจกต์นี้หลีกเลี่ยง สวัสดิกะทางศาสนา แต่กลับไม่ได้หลีกเลี่ยงสวัสดิกะที่นาซีใช้จริง ๆ สัญลักษณ์นาซีเป็นรูปที่หมุน 45 องศา แต่โปรเจกต์ระบุชัดว่า “มอทิฟแบบ 45 องศา/แนวทแยง และการหมุนแบบใด ๆ อยู่นอกขอบเขต”
ภาพที่เกิดขึ้นโดยบังเอิญใน QR code มีความละเอียดต่ำ ดังนั้นรูปที่ไม่ได้หมุนต่างหากที่มีโอกาสถูกมองเห็นเป็นสวัสดิกะอย่างชัดเจน มากกว่าจะเป็นลายพิกเซลสุ่ม การโฟกัสตรงนี้จึงสมเหตุสมผล
อีกอย่าง เขาบอกว่า “ยกเว้นโมดูล 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 แต่การคำนวณนี้ผมทำมือเอง
ถ้าเป็นโปรเจกต์ที่เฉพาะเจาะจงขนาดนี้ ก็อยากรู้ว่ามีเรื่องราวเบื้องหลังหรือมุกอะไรอยู่หรือเปล่า
อย่างไรก็ตาม เมื่อดูสถานการณ์ที่ AI ซึ่งมีข้อบกพร่องมากถูกนำมาใช้ เช่น perceptual hash ของ Microsoft photoDNA รับมือกับกริด thumbnail ของ CSAM ที่เต็มอยู่ในข้อมูลฝึกได้ไม่ดี จนถึงขั้น ระงับบัญชีผู้ใช้ Discord ได้ด้วยแค่สกรีนช็อตสเปรดชีตและกริดคราฟต์ของ Minecraft เครื่องมือ หลีกเลี่ยงแพตเทิร์นอันตราย ที่ใช้ได้กว้างกว่านี้ก็ดูน่าสนใจทีเดียว
ควรแก้ ปัญหาในโลกจริง แทนที่จะทำซ้ำปัญหาในอดีตด้วยวิธีใหม่ ๆ โลกนี้มีคนอ่อนไหวเกินไปที่น่าจะสนใจโปรเจกต์แบบนี้อยู่มากเกินไปแล้ว
แม้จุดประสงค์จะเป็นการหลีกเลี่ยงสวัสดิกะในแพตเทิร์นข้อมูล แต่ตัวเว็บเพจเองแสดงสัญลักษณ์นั้น จึงสงสัยว่าอาจ ผิดกฎหมายในเยอรมนี หรือไม่
ตามคำพิพากษาดังกล่าวของศาลยุติธรรมแห่งสหพันธ์เยอรมนี สวัสดิกะที่ถูกขีดฆ่าด้วยเส้นทับได้รับอนุญาต และส่วนที่เหลือก็ถูกนำเสนอเป็นตัวอย่างของแพตเทิร์นที่โค้ดจะกรองออก ดังนั้นดูแล้วโอกาสเกิดปัญหาน่าจะต่ำ
https://en.wikipedia.org/wiki/Strafgesetzbuch_section_86a