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

Empresa de IA tinha bilhões de fotos nossas, e agora hackers levaram tudo

Reconhecimento Facial -
Reconhecimento Facial

De Tilt, em São Paulo

26/02/2020 19h39

A "Clearview AI", startup de Nova York que compila bilhões de fotos para tecnologia de reconhecimento facial, afirmou nesta quarta-feira (26) ter perdido toda sua lista de clientes para hackers. Ou seja, uma infinidade de fotos pessoais de muita gente —incluindo talvez você, que está lendo isso agora— está nas mãos de quem não devia.

Em notificação enviada aos usuários, obtida pelo site "Daily Beast", a empresa informou que um intruso "conseguiu o não autorizado" à lista de clientes da companhia, que inclui forças policiais, forças de segurança e bancos. A empresa ainda afirmou que o hacker não obteve nenhum histórico de pesquisa dos clientes.

Tor Ekeland, advogado da Clearview AI, afirmou que a falha já foi consertada e que, ainda que segurança seja a prioridade da empresa, "infelizmente, brechas nos dados são parte da vida". Que coisa, não? Infelizmente para nós, a empresa afirma reunir mais de 3 bilhões de fotos da internet, incluindo imagens de plataformas como Facebook, Instagram, Twitter e YouTube.

A Clearview AI já havia sido alvo de controvérsia em janeiro. Uma investigação do New York Times revelou que a empresa permitia que forças de segurança usassem sua base de dados para associar fotos de rostos desconhecidos à de pessoas na internet. A tecnologia da empresa ainda retém as imagens mesmo quando deletadas de suas plataformas originais e contas privadas.

Em entrevista à CNN neste mês, o fundador e executivo-chefe da companhia, Hoan Ton-That, minimizou preocupações com sua ferramenta. Ele disse que quer construir uma "grande empresa americana", com "a melhor das intenções". O vietnamita ainda afirmou que não venderia seu produto ao Irã, Rússia ou China e alegou que sua tecnologia está "salvando crianças e resolvendo crimes".

Resta saber como a Justiça americana vai abordar esse caso e impor alguma sanção à empresa por esse "pequeno" vacilo.

SIGA TILT NAS REDES SOCIAIS