;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Código morse de supermercado: veja como funcionam os códigos de barra

Rodrigo Lara

Colaboração para Tilt

14/05/2020 04h00

Imagine como seria se, na hora de ar no caixa do mercado, a pessoa responsável pelo atendimento tivesse que procurar em uma longa lista o preço de cada produto do seu carrinho. Esse é só um exemplo de como os códigos de barra facilitaram muito a nossa vida.

Esse sistema de representação de dados foi inventado por Norman Joseph Woodland e Bernard Silver e patenteado nos Estados Unidos em 1951. Eles se basearam no código Morse e no sistema binário para a sua criação.

Com o tempo, o sistema ganhou aprimoramentos e ficou mais complexo, mas o seu método básico de funcionamento continua o mesmo.

Em primeiro lugar, temos a definição básica de um código de barras tradicional, que é uma sequência horizontal de traços verticais de diferentes espessuras, cujo conteúdo pode ser "decifrado" por um leitor ótico.

Os códigos de barras, no final das contas, representam um numeral, e sua quantidade de dígitos pode variar. Os padrões mais comuns vão de 12 a 14 dígitos, e a cada dígito é dado um espaço idêntico dentro do comprimento do código de barras.

Um código de barras de 12 dígitos, portanto, terá uma representação gráfica composta por 12 segmentos de tamanhos iguais.

Cada um desses 12 segmentos é "fatiado" em sete partes. A combinação de quais partes serão preenchidas pela cor preta e quais ficarão em branco determinam qual numeral de 0 a 9 este segmento irá representar.

Feita a leitura, é gerado um número de identificação. Cruzando esse número com um banco de dados, é possível, por exemplo, associá-lo a um item. No caixa de um supermercado, serve não só para incluir o preço de um produto na conta do cliente, mas também para dar baixa do produto comprado no estoque da loja.

Como o código de barras é lido?

Isso fica a cargo de um aparelho que emite uma luz sobre o código. Essa luz é refletida de maneira diferente pelas porções brancas e pretas do código de barras e é captada pelo próprio leitor, que emite então um sinal analógico para um aparelho decodificar o que foi "visto" pelo aparelho.

Há padrões diferentes de códigos de barras?

Ainda que o conceito seja similar, há, sim, padrões distintos de códigos de barras. Eles podem variar em comprimento (e, consequentemente, no número de dígitos) e também em formato. Nesse último caso, há até variações mais radicais, como os QR codes.

Como funciona um QR code?

Sigla para Quick Response Code (ou Código de Resposta Rápida), trata-se de um código de barras de duas dimensões que surgiu em 1994 para ser usado pela indústria automotiva japonesa. Por causa do seu desenho, esse código pode abrigar muito mais informações do que um código de barras tradicional.

Isso o torna útil para diversas funções. Pode ser lido por uma câmera de celular para nos levar a uma página de internet, rastrear produtos, identificar itens e controlar documentos, entre outros.

Os códigos de barra são usados em todo o mundo?

Sim, mas há países que acabam usando outros formatos de códigos. Além disso, alguns setores industriais específicos, como o bancário e o automotivo, utilizam códigos proprietários, ou seja, com formatos exclusivos.

Fontes:

Fernando Madani, coordenador do curso de Engenharia de Controle e Automação do Instituto Mauá de Tecnologia
João Carlos de Oliveira, presidente da Associação Brasileira de Automação-GS1 Brasil
Paulo Sergio Rodrigues, do departamento de Ciência da Computação da FEI

Toda quinta, Tilt mostra que há tecnologia por trás de (quase) tudo que nos rodeia. Tem dúvida de algum objeto? Mande para a gente que vamos investigar.