;(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

Reconhecimento facial chega às pistas de show. Artistas protestam

Ticketmaster usará tecnologia de reconhecimento facial em shows - Reprodução/Fight for the Future
Ticketmaster usará tecnologia de reconhecimento facial em shows Imagem: Reprodução/Fight for the Future

Letícia Naísa

Do TAB, em São Paulo

11/09/2019 04h00

A empresa Ticketmaster anunciou que usará tecnologia de reconhecimento facial em shows nos Estados Unidos. Em resposta, o guitarrista Tom Morello, a cantora Amanda Palmer e outros artistas estão divulgando uma petição da ONG americana Fight for the Future para barrar a decisão.

As críticas ao novo método, no entanto, giram em torno de questões envolvendo privacidade e de falhas na tecnologia que podem gerar situações de desconforto.

"Reconhecimento facial funciona com coleta de dados biométricos que são dados sensíveis e, como tal, têm que ter uma maior proteção do que outros dados pessoais", explica Joana Varon, diretora executiva da Coding Rights, organização de defesa dos direitos humanos na internet.

A principal preocupação é a falta de transparência com o que será feito com esses dados, como eles serão armazenados e com quem serão compartilhados. "É uma tecnologia que aumenta vários riscos de proteção aos nossos dados e [compromete a] privacidade dos indivíduos", diz Varon.

"Não tem o mínimo de transparência", afirma Dennys Antonialli, diretor do InternetLab, centro independente de pesquisa em direito e tecnologia. "Nenhuma empresa deveria se aventurar a lançar um programa de reconhecimento facial sem deixar claro esse tipo de política."

No Brasil, recentemente foi desautorizado o uso desse tipo de tecnologia pela ViaQuatro, empresa privada que faz a gestão de uma das linhas de metrô na cidade de São Paulo. Algumas cidades nos Estados Unidos também baniram o reconhecimento facial para fins de segurança pública, por entender que fere o direito à privacidade. Em Salvador (BA), um homem foi preso durante o Carnaval por conta do uso de reconhecimento facial.

Segundo a empresa, o sistema deverá facilitar a entrada do público nas casas de show e fazer as filas andarem mais rápido. Ao invés de carregar o ingresso impresso ou no celular, a pessoa poderá apenas comparecer ao lugar do show e ter o rosto escaneado.

"Vale a pena, por conta de uma conveniência, submeter-se a isso de tecnologia?", questiona Antonialli. Para o especialista, a tecnologia pode apenas piorar o problema e criar situações de discriminação, uma vez que já é provado que o reconhecimento facial ainda é falho quando se trata de rostos de pessoas negras e mulheres.

"Os homens brancos vão ar muito mais fácil e rápido nas filas do que os negros; isso gera discriminação", afirma o diretor do InternetLab. "E como não se sabe para que esses dados serão usados, a ação pode trazer prejuízos. Eles podem começar a identificar pessoas que estão em situação irregular no país, por exemplo."

Varon concorda: "Pode acontecer o contrário, começar a dar erro no sistema e piorar as filas, não vai servir nem para os fins propostos", opina.

Para ela, assim como para a artista Amanda Palmer, shows de música são lugar de liberdade de expressão. "Não é um lugar de vigilância em massa que possa causar situações de discriminação e desconforto por erro das tecnologias ou por abuso dos dados que estão sendo coletados com essa tecnologia de vigilância", diz.