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

Mapas de calor, apps: especialistas explicam uso de dados contra a covid-19

De Tilt, em São Paulo

29/04/2020 13h56

O uso de dados pode ser usado para o combate à pandemia do novo coronavírus, especialmente em medidas de isolamento social. E o UOL Debate de hoje ouviu especialistas para apresentar algumas possibilidades.

Segundo Rafael Zanatta, coordenador de pesquisa do Data Privacy Brasil, "existe uma variedade grande de técnicas e projetos de cooperação entre governos e empresas".

"Um primeiro modelo é uma análise cartográfica — mapas de calor identificando registro de informação de uma estação radiobase que infere quando houve um deslocamento", disse, esclarecendo o uso que pode ser feito. "Um advogado disse que não queria que soubessem se ele vai de noite à casa da amante. Isso mostra a desinformação em torno desse formato", comparou.

O programa reuniu ainda Laura Schertel, professora da Universidade de Brasília (UnB); Maria Cecília Gomes, pesquisadora em privacidade na Fundação Getúlio Vargas (FGV); Renato Vieira Caovilla, advogado especialista em proteção de dados; e André Ferraz, CEO da In Loco Media. E para Maria Cecília, é preciso discutir algumas questões antes de um consenso a respeito do uso de dados.

"Para a gente chegar ao consentimento, acho importante mencionar que qualquer tecnologia implementada precisa ter os riscos associados aos titulares de dados. São riscos jurídicos, éticos e técnicos", ressalvou.

Dados com consentimento

Não é segredo que apps atuais já coletam dados do usuário. Mas, no momento atual, é importante que esses dados ofereçam segurança a quem o usa em celulares e tablets.

É o que defende André Ferraz, da In Loco, que lembra que as medidas tomadas pelo usuário — como desligar o GPS, por exemplo — não são 100% eficientes.

"A tecnologia em si consegue funcionar sem o GPS, mas isso não significa que a gente coleta o dado se você desligar o GPS. A gente usa esse momento em que se ativa ou desativa a localização como um sinal de que o usuário não quer a coleta", explicou.

"Hoje, a In Loco tem uma tecnologia embarcada em apps, que usam para duas principais ações. A primeira é para personalizar a experiência do usuário com base no comportamento dele; do outro lado, a gente tem apps que usam isso para fins de segurança", acrescentou, indo além.

"Através dessas aplicações, a gente tem o a esses aplicativos. Esse serviço só é acionado caso o usuário dê o consentimento. E se a gente vai dar um novo fim para o dado, a gente precisa de um novo consentimento dessa pessoa."

Ainda segundo André, o chamado tracing — uma espécie de rastreamento dos dados do usuário — pode gerar informações contraditórias.

"Se for usado dados de GPS para fazer tracing no Brasil, um país que tem muitos prédios, vai apontar que você teve contato com todo mundo do lugar onde você mora, mesmo que você não tenha tinha contato com todo mundo", exemplificou.