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

Thiago Gonçalves

Mapa mais completo do universo já possui quase 2 bilhões de estrelas

Mapeamento Gaia mostrando a posição e o movimento de estrelas em nossa galáxia - ESA/Gaia/DPAC
Mapeamento Gaia mostrando a posição e o movimento de estrelas em nossa galáxia Imagem: ESA/Gaia/DPAC

10/12/2020 04h00

Na última semana, astrônomos divulgaram os resultados de dois levantamentos importantes para a comunidade científica: o atlas de estrelas Gaia e o mapeamento rápido do ASKAP, rede de radiotelescópios na Austrália.

Esse tipo de grande projeto é fundamental para a astrofísica contemporânea. Ao invés de estudar em detalhes um punhado de objetos já conhecidos, os telescópios fazem uma grande varredura do céu, catalogando tudo que conseguirem detectar.

No caso do Gaia, é o mais completo levantamento de estrelas já realizado pela humanidade. São quase 2 bilhões de estrelas observadas, muitas delas até em galáxias vizinhas como as Nuvens de Magalhães.

O Gaia consegue medir as distâncias às estrelas de forma extremamente precisa, efetivamente montando um mapa tridimensional de nossa própria galáxia, a Via Láctea.

Dessa vez, a equipe responsável pelo projeto se concentrou em particular na direção do anticentro galáctico, ou seja, olhando para a periferia da Via Láctea. Em muitos casos, as estrelas mais antigas se encontram nessa região, e o trabalho se assemelha ao de um arqueólogo buscando os fósseis galácticos que mostram a formação da nossa galáxia.

Já o ASKAP é um o intermediário para a implementação de um projeto ambicioso, a Rede de Quilômetro Quadrado, ou SKA na sigla em inglês, que será completado em 2027.

Ao observar as ondas de rádio emitidas por galáxias, os telescópios podem detectar a quantidade de gás hidrogênio ali presente, o que será usado no futuro como combustível para a formação de novas estrelas.

Nessa primeira etapa, foram 3 milhões de galáxias observadas, o que já é impressionante. No futuro, serão ainda mais objetos.

Em ambos os casos, não conseguimos muitos detalhes sobre cada estrela ou cada galáxia observada. Mas detectamos muitos objetos, o que nos permite um tipo de ciência diferente, baseado no que chamamos de "big data", ou seja, trabalhar com um grande volume de dados.

Podemos dividir as estrelas em grupos, analisar correlações entre elas. Com o ASKAP, podemos ver a quantidade de gás em cada tipo de galáxia.

Não é à toa que a astronomia hoje depende tanto de análise estatística avançada e técnicas de programação. Diversos pesquisadores utilizam métodos de aprendizado de máquina (machine learning) para analisar seus enormes bancos de dados.

E claro, se quisermos aprender mais sobre um tipo específico de estrela ou galáxia, podemos apontar outro telescópio para obter mais detalhes. Afinal, após o levantamento inicial temos um excelente ponto de partida, com milhares ou milhões de possíveis alvos para este novo estudo.

Esse tipo de trabalho só vai evoluir no futuro. Observatórios como o Vera Rubin, no Chile, e o telescópio espacial Nancy Roman oferecerão novos catálogos de bilhões de galáxias, estrelas e pequenos corpos no Sistema Solar, abrindo portas para uma série de novos estudos sobre o universo.

Serão petabytes de dados para analisarmos, com o auxílio de poderosos supercomputadores. A tecnologia é fundamental para avançarmos o conhecimento!