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

Ábaco (1) - A primeira máquina de calcular

Roberto Moisés e Luciano Castro Lima, Especial para a Página 3 Pedagogia & Comunicação

Os sistemas de numeração como o dos romanos foram inventados para registrar os números. Eles eram inúteis para fazer as operações de adição, subtração, multiplicação e divisão no papel, como fazemos hoje. Como fazer a adição de XXXVIII e MX? Para resolver esse tipo de problema, surgiu o ábaco.

O ábaco é uma tábua com divisões em linhas ou colunas paralelas, que separam as ordens de um sistema de numeração. A representação de quantidades se faz colocando-se sobre uma ordem a quantidade de pedras a ela correspondente.

A origem do ábaco está ligada à evolução dos conceitos de contagem.

Para representar o número 325, por exemplo, no ábaco, basta que coloquemos nos colunas tantas pedras quantas unidade têm em cada ordem:

 

 

 

O ábaco primitivo dos romanos era assim:

  •  

 

         

 

 

O algarismo hindu

A ideia do ábaco era simples: para cada ordem uma coluna. Com isto a ordem era fixada numa determinada posição. Essa ideia tão simples, inspirada pelo ábaco, iria determinar o nascimento daquela que seria a mais revolucionaria e importante escrita numérica: a escrita hindu.

Na Índia desse período iniciou-se um ciclo de produção matemática que marcaria, por sua riqueza e criatividade, quase todos os ramos do pensamento matemático.

O ábaco dizia para cada ordem uma só coluna. E os matemáticos hindus imaginaram: para cada ordem um só algarismo. E inventaram os algarismos que praticamente são os que usamos hoje. Dessa forma, a escrita numérica consegue, com apenas dez símbolos - 0,1,2,3,4,5,6,7,8,9 - escrever todos os infinitos números que o cérebro humano pode imaginar.

Escrita posicional

Trata-se da escrita posicional desenvolvida em sua máxima simplicidade, simplicidade esta que maravilharia o matemático francês Laplace, o grande matemático do império de Napoleão:

"Devemos à Índia o engenhoso método de exprimir todos os números por meio de dez símbolos, cada qual portador, tanto de um valor de posição, como de um valor absoluto, invenção tão notável, mas tão simples, que nem sempre lhe reconhecemos o mérito."