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

Seu computador pode ajudar cientistas a buscar a cura da covid; veja como

Seu computador pode ajudar pesquisadores que buscam medicamentos contra o novo coronavírus - Reprodução
Seu computador pode ajudar pesquisadores que buscam medicamentos contra o novo coronavírus Imagem: Reprodução

Rodrigo Trindade

De Tilt, em São Paulo

21/05/2020 04h00

Existe uma forma inovadora de você contribuir na luta contra o novo coronavírus, se você tiver um computador em casa. Trata-se do projeto Folding@home, que desde 2000 usa o poder de processamento de PCs conectados à internet para realizar simulações de enrolamentos de proteínas.

Essas simulações permitem que cientistas encontrem possíveis tratamentos a diversas doenças. Neste momento, os esforços estão direcionados para o Sars-CoV-2, nome do novo coronavírus.

"Queremos entender como essas proteínas virais funcionam e como podemos produzir medicações para pará-las", descreve o projeto.

As simulações feitas em computador criam uma imagem em ação das proteínas do coronavírus. As predições desta técnica encontraram pontos da estrutura do vírus do ebola que podem ser "atacados" por medicamentos — estes estão sendo pesquisados atualmente.

O vídeo a seguir dá uma demonstração visual das simulações:

Como usar no meu computador?

É neste processo que seu computador pode ajudar. Para isso, você precisa baixar e instalar um programa para Windows ou Mac.

Uma vez baixado o instalador (de 30 MB), clique nos botões "Next" (próximo) e "I Agree" (concordo) para escolher a modalidade de instalação. Após selecionar "Express Install" (instalação rápida), você deve clicar em "Next" (próximo) e, em alguns segundos, o programa Folding@home estará instalado em sua máquina.

Com o procedimento, o firewall (aquilo que protege seu computador) pode bloquear o funcionamento do aplicativo na sua máquina. Ao clicar em "Permitir o" à sua rede privada, você liberará o poder de processamento do seu PC ao projeto.

Você pode ajustar a intensidade que seu computador trabalhará, o que pode ser feito tanto pelo site client.foldingathome.org como pelos controles avançados do seu PC/notebook —olhe nos ícones no canto inferior direito da tela e clique em "Advanced Control" (controle avançado) no menu.

Controles avançados - Reprodução - Reprodução
Os controles avançados são ados por este menu
Imagem: Reprodução

Pelo site, um menu no topo da tela permite que você escolha a ajuda para uma destas pesquisas: covid-19 (o novo coronavírus), mal de Alzheimer, câncer, mal de Huntington ou de Parkinson.

Abaixo, você pode selecionar a quantidade de processamento emprestada ao projeto e quando ela será aproveitada: enquanto você trabalha ou quando o PC estiver ocioso. Um botão vermelho permite que você pare o procedimento.

 Folding@home - Reprodução - Reprodução
permite escolha da pesquisa a ser ajudada, assim como quanto processamento será doado
Imagem: Reprodução

Selecionando o ícone do programa no computador, em vez de apenas parar de ceder processamento, você pode fechar o programa completamente.