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

Criado 'em insônia', código brasileiro revoluciona armazenamento de dados

Tecnologia tem capacidade de conter mais de 100 mil vezes mais dados do que um código gráfico bidimensional convencional, de acordo com a startup - iStock
Tecnologia tem capacidade de conter mais de 100 mil vezes mais dados do que um código gráfico bidimensional convencional, de acordo com a startup Imagem: iStock

Rodrigo Lara

Colaboração para Tilt, em São Paulo

27/07/2021 04h00Atualizada em 29/07/2021 17h45

O que você faz quando acorda no meio da madrugada e não consegue mais dormir? Uma noite de insônia rendeu ao brasileiro Ricardo Fioravante a ideia de uma tecnologia que pode mudar bastante a forma de armazenar um grande volume de dados em um espaço pequeno. Tudo envolve o avanço dos códigos bidimensionais, que tem no QR code um de seus exemplos mais populares.

De acordo com o brasileiro, que está com a tecnologia em processo de patente, uma das vantagens é a capacidade de armazenamento de mais de 100 mil vezes mais dados do que um código gráfico bidimensional convencional. Após a ideia, ele e um amigo fundaram uma startup para tirar a solução do papel.

"Em junho de 2019 eu acordei de madrugada, sentei na frente do computador com essa ideia, produzi um NDA [um termo de confidencialidade] e levei para o meu sócio. No dia seguinte, levei para ele e falei que se ele entendesse a minha ideia e conseguisse colocar em prática, a gente estaria antecipando em uns cem anos essa tecnologia", contou Fioravante, em entrevista exclusiva ao Tilt.

A empresa criada "no susto" é a Dric, cujo nome vem das iniciais de Digital Reprodução de Imagem Criptografada — esse também é o nome usado para definir a criação do brasileiro e de seus parceiros, o código Dric.

A resposta está nas cores

Uma forma relativamente simples de entendermos como ela funciona é pensarmos nos QR Codes. No caso do Dric, o que ocorre é que o código bidimensional em si ganha uma "outra" dimensão além do seu formato: as cores.

"O Dric é uma representação visual da estrutura de um arquivo, independentemente do seu formato. Ele funciona como uma simulação de dados", explica Rafael Sarmento, sócio de Fioravante, que trabalha há mais duas décadas na área de tecnologia.

Por meio de algoritmos, é possível simular qualquer arquivo de forma quase 100% exata. "É um princípio similar ao da criptografia, quando um arquivo só pode ser descriptografado quando há chaves públicas e privadas que 'conversem' entre si", acrescenta Sarmento.

Quando um dispositivo lê um código Dric, o que acontece é que o aplicativo destinado à leitura recebe uma série de instruções e, grosso modo, "monta" o arquivo localmente (como dá para ver no vídeo acima). Um exemplo: é possível que o código represente um arquivo de vídeo. Ao ser lido por um smartphone, esse arquivo é montado na memória do aparelho e, a partir daí, pode ser reproduzido na tela do celular.

"Para se ter uma ideia, um QR code pode ter algo em torno de 120 caracteres, enquanto o Dric é capaz de armazenar 2 bilhões", conta Sarmento. Isso permite "montar" localmente arquivos de até 2,1 GB, sem que haja necessidade de transmissão via internet ou outro tipo de rede.

A tecnologia está em fase de implementação de testes em aplicações, de acordo com os criadores. A expectativa é que em 2022 já existam produtos disponíveis no mercado.

Lado empreendedor nasceu das dificuldades da vida

O curioso é que, apesar de ter uma ideia dentro da tecnologia, Fioravante não possui formação técnica na área. E isso, no fim, se mostra uma vantagem, segundo o sócio do brasileiro. "O Ricardo não tem o conhecimento técnico, mas é capaz de juntar todas as peças e levar até quem tenha esse conhecimento. De início, foi algo inusitado. Falei para ele que isso era algo que não existia, mas que ele fez existir."

Boa parte dessa capacidade de ter ideias que fogem do comum, mas são capazes de resolver problemas práticos, tem referência nas vivências de Fioravante, conta o brasileiro. De infância humilde no Rio de Janeiro, ele trabalhou em diversas áreas e o lado empreendedor acabou surgindo diante da necessidade.

"Já trabalhei com carreto em feira e vendi churros na Quinta da Boa Vista quando criança. Quando completei 14 anos, consegui um emprego de office boy na TV Globo, e lá fui promovido a auxiliar de contabilidade. Depois comecei a empreender, no ramo de gráficas, onde fiquei até 2014", lembra.

ado esse período, Fioravante entrou para a área pública, inicialmente como diretor do Detran do Rio de Janeiro. Formado em direito, a primeira experiência com a área de tecnologia também foi no setor público, quando ele assumiu como diretor de Infraestrutura e Tecnologia do Estado.

"De início, recebemos um investimento [para desenvolver o Dric], mas conforme o tempo ou, o dinheiro também foi acabando. Foi um momento complicado, porque a gente tem família, tem custos e eu larguei tudo para me dedicar exclusivamente a isso", diz Fioravante.

Ricardo Fioravante desenvolveu sua habilidade empreendedora pela necessidade de "se virar nos 30" quando mais novo - Divulgação - Divulgação
Ricardo Fioravante desenvolveu sua habilidade empreendedora pela necessidade de "se virar nos 30" quando mais novo
Imagem: Divulgação

Variedade de aplicações

A característica de funcionamento do código Dric abre possibilidades tanto em termos de transferência de arquivos em si quanto de aplicações.

Um exemplo está na educação, quando a simples transmissão de um código do tipo — um arquivo de tamanho bem reduzido — poderia fazer com que uma aula inteira em vídeo fosse "montada" no aparelho receptor, deixando de lado a necessidade de uma conexão de banda larga para que conteúdos do tipo fossem visualizados.

Assim, mesmo pessoas que estivessem em áreas com cobertura de internet ruim poderiam ter o à informação. "Nós estamos fornecendo a API [a interface de programação da aplicação] para desenvolvedores e vai ser uma forma de vermos como o mercado vai encontrar soluções para o uso da tecnologia", explica Sarmento.

A fase de vacas magras virou coisa do ado: durante a pandemia, a empresa recebeu um aporte de US$ 3,5 milhões (equivalentes a R$ 17,9 milhões) de um grupo internacional, tendo Alec Oxenford — cofundador do Arremate.com, da OLX e da Letgo — como um dos investidores principais. A Dric, hoje, tem valor de mercado estimado em US$ 20 milhões.