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

Pergunta pro Jokura

REPORTAGEM

Texto que relata acontecimentos, baseado em fatos e dados observados ou verificados diretamente pelo jornalista ou obtidos pelo o a fontes jornalísticas reconhecidas e confiáveis.

Qual foi o primeiro podcast? Rolou papo-cabeça sobre o inovador 'audioblog'

O termo "podcast" ainda não existia, e os conteúdos sonoros digitais e compartilháveis eram chamados de "audioblogs" - Dan LeFebvre/ Unsplash
O termo "podcast" ainda não existia, e os conteúdos sonoros digitais e compartilháveis eram chamados de "audioblogs" Imagem: Dan LeFebvre/ Unsplash

07/08/2023 04h00

Qual foi o primeiro podcast? - Pergunta de Jackson Orozco, de Sonora (MS) - quer enviar uma pergunta também? Clique aqui.

Caro sonorense, aumente o volume do seu fone de ouvido: um dos marcos mais aceitos como "ponto zero" dos podcasts, como conhecemos hoje, é uma entrevista do jornalista Christopher Lydon com o programador David Winer, em 9 de julho de 2003.

Trata-se de um podcast metalinguístico (cujo conteúdo é o próprio tema), já que a conversa gira em torno do pioneirismo de Winer ao viabilizar e distribuição de arquivos de áudio e de vídeo em feeds RSS.

À época, o termo "podcast" nem existia ainda e o mais comum era se referir a conteúdos sonoros digitais, compartilháveis online, como "audioblogs".

A expressão "podcasting" foi cunhada em 2004 pelo jornalista de tecnologia Ben Hammersley, num artigo para o jornal britânico "The Guardian". Trata-se de um trocadilho com a palavra broadcast (transmissão, em inglês) misturada com o "pod" de iPod, popularíssimo tocador portátil de música da Apple lançado em 2001 —e, de certa forma, precursor do iPhone.

Se considerarmos, contudo, programas de áudio com episódios distribuídos regularmente, como temos aos montes hoje nas mais diversas plataformas de áudio, um dos pioneiros foi o "Daily Source Code", que rodou entre 2004 e 2013 capitaneado pelo ex-VJ da MTV Adam Curry.

Mas a história de gravar um arquivo de som digitalmente e distribui-lo em rede para rodar em múltiplos tocadores é bem mais antiga, lá dos anos 1980 —e quem sabe volte como tema para uma próxima coluna.

No Brasil, o primeiro podcast foi o "Digital Minds", produzido por Danilo Medeiros entre 2004 e 2006. Como não encontrei o programa #1 nas redes, deixo com vocês um esporádico retorno gravado em 2018, caro sonorense.

Tem alguma pergunta? Deixe nos comentários ou mande para nós pelo WhatsApp.