1 pontos por GN⁺ 4 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • É uma crate Rust que detecta padrões de suástica que podem surgir por acaso em códigos QR e, opcionalmente, gera códigos QR sem esse padrão
  • Renderiza todos os 8 padrões de máscara do padrão QR, filtra os candidatos sem o padrão e escolhe a máscara com a menor penalidade segundo a ISO/IEC 18004
  • Exclui módulos de localizador, temporização, alinhamento, formato e versão da inspeção e considera o contraste ao redor para evitar confundir elementos funcionais ou formas invisíveis com o padrão
  • O detector padrão não tem dependências externas e proíbe código unsafe, além de oferecer suporte a várias bibliotecas de QR e à representação Vec<Vec<bool>>
  • O escopo de detecção se limita a formas de cruz gamada 5×5 e 7×7 alinhadas aos eixos, em ambas as direções e com duas polaridades de cor; formas a 45°, diagonais e rotações arbitrárias não são suportadas

Por que evitar padrões acidentais

  • qr-swastika-avoider detecta e evita padrões de suástica que podem aparecer aleatoriamente em códigos QR
  • Códigos QR escolhem entre 8 padrões de máscara intercambiáveis aquele com a melhor pontuação de legibilidade, mas não verificam símbolos que possam causar desconforto
  • Padrões pequenos e finos são difíceis de eliminar no processo de avaliação do padrão QR e podem permanecer por acaso no código final

Detecção considerando elementos funcionais e contraste

  • O detector padrão não tem dependências externas e aplica #![forbid(unsafe_code)]
  • Por meio de um pequeno trait QrModules, composto por dois métodos, é possível inspecionar vários formatos de representação de QR
  • Módulos de localizador, temporização, alinhamento, formato e versão são excluídos da detecção para não confundir cantos do localizador com uma suástica
  • Padrões que ficam embutidos em módulos da mesma cor e não são realmente visíveis são ignorados com base no contraste ao redor, e esse critério pode ser ajustado
  • Códigos QR existentes podem ser verificados com contains_swastika; se o padrão for encontrado, é possível gerar novamente ou alertar o usuário

Representações e bibliotecas de QR compatíveis

  • Os seguintes adaptadores são fornecidos como recursos do Cargo
    • qrcodegen: QrModules para qrcodegen::QrCode
    • qrcode: QrModules para qrcode::QrCode
    • fast_qr: QrModules para fast_qr::QRCode
  • A matriz bruta de módulos Vec<Vec<bool>> também é suportada sem adaptador separado, e true indica um módulo escuro

Geração de códigos QR sem o padrão

  • encode_safe, do recurso generate, recebe o conteúdo e o nível de correção de erro e retorna um código QR escaneável sem o padrão; se não for possível gerá-lo, retorna um erro explícito
  • Durante a geração, todas as 8 máscaras são renderizadas e apenas os candidatos sem o padrão detectado são mantidos
  • Entre os candidatos restantes, retorna a máscara com a menor penalidade ISO/IEC 18004, preservando a otimização de legibilidade do padrão
  • Com matrix() é possível obter a matriz de módulos retornada, e com mask() verificar a máscara selecionada

Configuração dos recursos do Cargo

  • Os recursos padrão incluem apenas o detector sem dependências
  • Os recursos qrcodegen, qrcode e fast_qr adicionam adaptadores para cada biblioteca
  • O recurso generate adiciona qrcodegen como dependência e fornece encode_safe

Escopo de detecção e licença

  • Detecta, com pequena tolerância, formas clássicas de cruz gamada alinhadas aos eixos, nos tamanhos 5×5 e 7×7, em ambas as direções e nas duas polaridades de cor, clara e escura
  • Formas a 45°, diagonais e formas rotacionadas em ângulos arbitrários não fazem parte do escopo de detecção
  • Distribuído sob a MIT License

1 comentários

 
GN⁺ 4 시간 전
Opiniões no Lobste.rs
  • É confuso que este projeto evite a suástica religiosa mas não a suástica usada pelos nazistas. O símbolo nazista é rotacionado em 45 graus, e o projeto declara explicitamente que “motivos diagonais/de 45 graus e rotações arbitrárias estão fora do escopo”

    • Uma suástica sem rotação também é recebida do mesmo jeito como símbolo nazista. Se você acha que não, basta colar uma suástica sem rotação como tatuagem temporária em um lugar visível e sair na rua
      A imagem que surge por acaso em um código QR tem baixa resolução, então é até mais provável que apenas a forma sem rotação seja reconhecida com clareza como uma suástica, em vez de parecer só um padrão aleatório de pixels. Faz sentido focar nisso
    • Isso também me chamou a atenção. Fico curioso se o algoritmo de detecção tem uma estrutura que, por essência, só consegue tratar padrões retangulares, como um checksum deslizante que varre linhas e colunas
      Também dizem que “módulos de finder, timing, alinhamento, formato e versão são excluídos para não confundir os cantos do finder com uma suástica”, mas quando uma pessoa vê um símbolo ofensivo em um código QR, a reação dela não vai mudar dependendo de aqueles pixels serem dados ou padrão de timing. Os cantos do finder são só quadrados, então também não entendo por que precisariam ser excluídos da análise; quanto mais se investiga, menos as coisas fazem sentido, a ponto de parecer um resultado gerado às pressas por IA
  • É triste que um projeto assim exista. Eu nunca nem tinha pensado que um símbolo ofensivo pudesse aparecer por acaso dentro de um código QR

  • Fiz as contas diretamente para a pergunta “com que frequência, afinal, um QR code simples gera aleatoriamente um enorme símbolo nazista?”. O código QR não é totalmente aleatório, mas aqui vou ignorar isso
    Considerando suásticas 5×5 e 7×7 de forma independente, em cada caso há duas orientações esquerda/direita, duas polaridades e formas normal/invertida, totalizando 8 padrões. O total de padrões possíveis é 2^25=33 milhões para 5×5 e 2^49=562 trilhões para 7×7, então a probabilidade de conter uma suástica é 2.38e-7 e 1.42e-14, respectivamente. Como há 289 regiões 5×5 e 225 regiões 7×7 dentro de um código QR, a probabilidade total de aparecer pelo menos uma suástica em um QR aleatório é de cerca de 0,00006, ou 1 em 14.500. Dá para calcular 9×9 ou maiores também, mas a probabilidade dessas combinações específicas de pixels é tão baixa que não afeta o resultado de forma significativa. Infelizmente, olhando o código-fonte, este projeto parece ter sido feito com vibe coding, mas as contas eu fiz à mão

    • Se esse padrão aparecer em um QR code usado de forma bem visível, basta pintar alguns pixels que o código continua funcionando. Se for um código visto por uma única pessoa ou com chance quase nula de ser escaneado de verdade, não há motivo para se preocupar, e a maioria das pessoas vai entender que esse tipo de padrão pode surgir por acaso em um QR code
  • Num projeto tão específico assim, fico curioso sobre que história ou piada existe por trás dele
    Ainda assim, vendo o uso de IAs defeituosas, como no caso em que o hash perceptual do Microsoft photoDNA não consegue lidar direito com grades de miniaturas de CSAM abundantes nos dados de treino e acaba suspendendo contas de usuários do Discord apenas com planilhas e capturas de tela de grades de construção do Minecraft, uma ferramenta mais genérica de evitar padrões de risco parece bem atraente

  • Em vez de repetir problemas do passado de um jeito novo, deveríamos resolver os problemas reais. Há gente sensível demais no mundo que vai achar esse tipo de projeto interessante

  • Mesmo que o objetivo seja evitar suásticas em padrões de dados, fico curioso se exibir o símbolo na própria página poderia ser ilegal na Alemanha

    • Se for para fins informativos, o simples ato de exibir não é ilegal. Por exemplo, em documentários que usam imagens de arquivo da Segunda Guerra Mundial, não é necessário censurar suásticas, embora possa ser mais seguro incluir um aviso legal
    • O que é proibido depende basicamente do contexto: https://bundesgerichtshof.de/SharedDocs/Pressemitteilungen/…
      Segundo essa decisão do Supremo Tribunal Federal da Alemanha, suásticas riscadas são permitidas, e o restante também parece ter baixa chance de causar problema, já que foi apresentado apenas como amostra dos padrões que o código pretende filtrar
    • Não sou advogado, mas a resposta curta é que não é ilegal, e a longa é que depende do contexto. O contexto desta página não parece problemático
      https://en.wikipedia.org/wiki/Strafgesetzbuch_section_86a