1 điểm bởi GN⁺ 4 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Đây là một crate Rust giúp phát hiện họa tiết swastika có thể vô tình xuất hiện trong mã QR và tùy chọn tạo mã QR không có họa tiết này
  • Render toàn bộ 8 mẫu mask của chuẩn QR để lọc ra các ứng viên không có họa tiết, rồi chọn mask có penalty ISO/IEC 18004 thấp nhất
  • Loại trừ các module finder, timing, alignment, format và version khỏi quá trình kiểm tra, đồng thời xét đến độ tương phản xung quanh để tránh nhận nhầm các yếu tố chức năng hoặc hình dạng không nhìn thấy được
  • Bộ phát hiện mặc định không có phụ thuộc bên ngoài và cấm mã unsafe, đồng thời hỗ trợ nhiều thư viện QR và biểu diễn Vec<Vec<bool>>
  • Phạm vi phát hiện giới hạn ở các dạng chữ thập móc 5×5 và 7×7 căn theo trục, theo cả hai hướng và hai cực tính màu; không hỗ trợ dạng 45 độ, đường chéo hoặc xoay tùy ý

Vì sao cần tránh các họa tiết vô tình xuất hiện

  • qr-swastika-avoider phát hiện và tránh mẫu swastika có thể xuất hiện ngẫu nhiên trong mã QR
  • Mã QR chọn mẫu có điểm khả đọc tốt nhất trong số 8 mẫu mask có thể thay thế lẫn nhau, nhưng không kiểm tra đến các biểu tượng có thể gây khó chịu
  • Các họa tiết nhỏ và mảnh khó bị lọc ra trong quy trình đánh giá của chuẩn QR, nên có thể vô tình còn lại trong mã cuối cùng

Phát hiện có xét đến yếu tố chức năng và độ tương phản

  • Bộ phát hiện mặc định không có phụ thuộc bên ngoài và áp dụng #![forbid(unsafe_code)]
  • Có thể kiểm tra nhiều dạng biểu diễn QR khác nhau thông qua trait QrModules nhỏ gồm hai method
  • Loại trừ các module finder, timing, alignment, format và version khỏi đối tượng phát hiện để không nhận nhầm góc của finder là swastika
  • Những họa tiết bị chìm trong các module cùng màu và thực tế không nhìn thấy sẽ bị bỏ qua dựa trên độ tương phản xung quanh; tiêu chí này có thể điều chỉnh
  • Mã QR hiện có có thể được kiểm tra bằng contains_swastika; nếu phát hiện họa tiết, có thể tạo lại hoặc cảnh báo người dùng

Các biểu diễn QR và thư viện được hỗ trợ

  • Cung cấp các adapter sau thông qua Cargo features
    • qrcodegen: QrModules cho qrcodegen::QrCode
    • qrcode: QrModules cho qrcode::QrCode
    • fast_qr: QrModules cho fast_qr::QRCode
  • Ma trận module thô Vec<Vec<bool>> cũng được hỗ trợ không cần adapter riêng; true nghĩa là module tối

Tạo mã QR không có họa tiết

  • encode_safe của feature generate nhận nội dung và mức sửa lỗi, rồi trả về mã QR có thể quét được và không có họa tiết; nếu không thể tạo, nó trả về lỗi rõ ràng
  • Trong quá trình tạo, công cụ render toàn bộ 8 mask rồi chỉ giữ lại các ứng viên không có họa tiết cần phát hiện
  • Trong số các ứng viên còn lại, công cụ trả về mask có penalty ISO/IEC 18004 thấp nhất để duy trì tối ưu hóa khả đọc theo chuẩn
  • Có thể lấy ma trận module bằng matrix() của giá trị trả về và kiểm tra mask đã chọn bằng mask()

Cấu hình Cargo features

  • Feature mặc định chỉ bao gồm bộ phát hiện không có phụ thuộc
  • Các feature qrcodegen, qrcode, fast_qr bổ sung adapter cho từng thư viện
  • Feature generate kéo qrcodegen vào làm phụ thuộc và cung cấp encode_safe

Phạm vi phát hiện và giấy phép

  • Phát hiện trong sai số nhỏ các dạng chữ thập móc cổ điển căn theo trục với kích thước 5×5 và 7×7, cả hai hướng, cùng hai cực tính màu sáng và tối
  • Các họa tiết 45 độ hoặc đường chéo, cũng như các dạng xoay ở góc tùy ý, không nằm trong phạm vi phát hiện
  • Được phân phối theo MIT License

1 bình luận

 
Các ý kiến trên Lobste.rs
  • Điều gây bối rối là dự án này tránh chữ vạn tôn giáo, nhưng lại không tránh chữ vạn mà Đức Quốc xã đã dùng. Biểu tượng của Đức Quốc xã là dạng xoay 45 độ, còn dự án nêu rõ “các motif 45 độ/đường chéo và xoay tùy ý nằm ngoài phạm vi”

    • Chữ vạn không xoay cũng vẫn bị nhìn nhận là biểu tượng Đức Quốc xã như nhau. Nếu không nghĩ vậy, cứ dán một hình xăm tạm thời chữ vạn không xoay ở chỗ dễ thấy rồi ra phố thử xem.
      Hình ảnh vô tình xuất hiện trong mã QR có độ phân giải thấp, nên ngược lại dạng không xoay có khả năng được nhận ra rõ là chữ vạn hơn, thay vì chỉ là một hoa văn pixel ngẫu nhiên. Tập trung vào điểm này là hợp lý.
    • Tôi cũng chú ý đến điểm đó. Tôi tự hỏi liệu thuật toán phát hiện có cấu trúc về bản chất chỉ xử lý các mẫu hình chữ nhật, giống như rolling checksum quét theo hàng và cột hay không.
      Ngoài ra, họ nói “loại trừ các module finder, timing, alignment, format và version để không nhận nhầm góc của finder thành chữ vạn”, nhưng khi con người thấy một biểu tượng khó chịu trong mã QR, phản ứng của họ sẽ không khác đi tùy theo pixel đó là dữ liệu hay timing pattern. Góc finder chỉ là hình vuông thôi, tôi cũng không hiểu vì sao nhất thiết phải loại khỏi phân tích; càng đào sâu càng thấy không khớp, nên tôi nghi đây là sản phẩm do AI tạo đại.
  • Thật buồn khi một dự án như thế này tồn tại. Tôi chưa từng nghĩ đến cả khả năng biểu tượng gây khó chịu có thể vô tình xuất hiện bên trong mã QR.

  • Tôi đã tự tính thử câu “rốt cuộc việc một biểu tượng Đức Quốc xã khổng lồ ngẫu nhiên xuất hiện khi tạo một mã QR đơn giản thường xảy ra đến mức nào?”. Mã QR không hoàn toàn ngẫu nhiên, nhưng ở đây bỏ qua điều đó.
    Nếu xét độc lập chữ vạn 5×5 và 7×7, mỗi loại có hai hướng trái/phải, hai cực tính, và dạng đảo/nguyên bản, tổng cộng 8 mẫu. Tổng số mẫu là 2^25 = 33 triệu với 5×5 và 2^49 = 562 nghìn tỷ với 7×7, nên xác suất chứa chữ vạn lần lượt là 2,38e-7 và 1,42e-14. Trong mã QR có 289 vùng 5×5 và 225 vùng 7×7, nên tổng xác suất để có ít nhất một chữ vạn trong một dạng mã QR ngẫu nhiên là khoảng 0,00006, tức 1 trên 14.500 mã. Có thể tính cả 9×9 trở lên, nhưng xác suất của tổ hợp pixel cụ thể quá thấp nên không ảnh hưởng đáng kể đến kết quả. Tiếc là nhìn mã nguồn thì dự án này có vẻ được làm bằng vibe coding, nhưng phép tính thì tôi tự làm bằng tay.

    • Nếu một hoa văn như vậy xuất hiện trong mã QR sẽ được dùng ở nơi dễ thấy, thì chỉ cần tô một vài pixel là mã vẫn hoạt động. Nếu đó là mã chỉ một người xem hoặc hầu như không có khả năng được quét thật, thì cũng chẳng có lý do gì phải bận tâm; và đa số sẽ hiểu rằng những mẫu như vậy có thể tình cờ xuất hiện trong mã QR.
  • Với một dự án cụ thể đến mức này, tôi tò mò không biết đằng sau có câu chuyện hay trò đùa nào không.
    Tuy vậy, nhìn vào tình trạng AI đầy lỗi đang được dùng, chẳng hạn perceptual hash của Microsoft photoDNA không xử lý tốt các lưới thumbnail CSAM đầy trong dữ liệu huấn luyện và dẫn đến việc khóa tài khoản người dùng Discord chỉ bằng ảnh chụp màn hình bảng tính và lưới chế tạo trong Minecraft, thì một công cụ tránh mẫu nguy hiểm tổng quát hơn trông khá hấp dẫn.

  • Nên giải quyết vấn đề trong thực tế thay vì lặp lại các vấn đề cũ theo cách mới. Trên đời có quá nhiều người quá nhạy cảm có thể thấy dự án kiểu này thú vị.

  • Dù mục đích là tránh chữ vạn trong mẫu dữ liệu, tôi tự hỏi liệu việc trang web tự hiển thị biểu tượng đó có thể trở thành bất hợp pháp ở Đức hay không.

    • Nếu nhằm mục đích cung cấp thông tin thì bản thân việc hiển thị đơn thuần không phải là bất hợp pháp. Ví dụ, trong phim tài liệu dùng tư liệu Thế chiến II, không cần kiểm duyệt chữ vạn, nhưng có một tuyên bố miễn trừ trách nhiệm thì có thể an toàn hơn.
    • Việc có bị cấm hay không về cơ bản phụ thuộc vào ngữ cảnh: https://bundesgerichtshof.de/SharedDocs/Pressemitteilungen/…
      Theo phán quyết đó của Tòa án Tư pháp Liên bang Đức, chữ vạn bị gạch bỏ được phép, và những trường hợp còn lại cũng được trình bày như mẫu của các pattern mà mã sẽ lọc, nên có vẻ ít khả năng phát sinh vấn đề.
    • Tôi không phải luật sư, nhưng câu trả lời ngắn là không bất hợp pháp; câu trả lời dài là còn tùy ngữ cảnh. Ngữ cảnh của trang này có vẻ không có vấn đề.
      https://en.wikipedia.org/wiki/Strafgesetzbuch_section_86a