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

André Noel

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

Conforto de casa ou um reencontro pessoal: eventos híbridos fazem sentido

Eventos estão surgindo em modelo híbrido, ocorrendo ao mesmo tempo de forma presencial e à distância - Freepik
Eventos estão surgindo em modelo híbrido, ocorrendo ao mesmo tempo de forma presencial e à distância Imagem: Freepik

15/03/2022 04h00

A última viagem que fiz foi logo antes do início da quarentena. Foi uma viagem de um dia, mas muito boa, muito proveitosa. Aparentemente, faz uns 10 anos isso? Bom, pelo menos parece.

Agora estou me preparando para voltar a participar de eventos presenciais. Já falei aqui na coluna sobre como os eventos são importantes e também sobre o quanto ganhamos de vantagens e experiência ao nos adaptarmos ao online, mas a participação presencial tem uma magia sem igual.

Esta semana tenho minha primeira experiência depois de anos na caverna. Vai ser um evento bacana, mas interno de uma empresa, que vou poder participar (vou colocar várias fotos nas minhas redes). Junto com isso ainda vou aproveitar para rever amigos e gravar um podcast como convidado.

Parece que a vida está voltando ao seu ritmo, ao mesmo tempo em que parece a primeira viagem da vida. Minha cabeça foi bastante afetada pela pandemia.

Podemos pensar e planejar eventos presenciais, mas a vida de todo mundo mudou. Como ficam as coisas agora?

Ganhamos expertise com eventos online. Descobrimos que podemos, ao mesmo tempo, alcançar mais pessoas e também trazer para palestrar pessoas que não poderiam, seja por distância, custo ou problemas de agenda, já que online é mais fácil conseguir uma hora de alguém, sem os tempos de deslocamento.

Mas estamos com uma falta do presencial, aquela vontade ou necessidade de ver ao outro, de jogar conversa fora nos intervalos, de fazer networking durante o almoço. Como podemos aproveitar isso ao máximo?

Estão surgindo vários eventos num modelo híbrido, ocorrendo simultaneamente de forma presencial e à distância. Um desses eventos é o TDC —The Developer's Conference—, que quem me acompanha sabe que é um evento que eu carrego no coração.

Neste ano, o TDC terá quatro edições e a primeira delas, a edição Connections, vai acontecer de 22 a 24 de março num formato inovador: digital, híbrido e distribuído. Além de juntar as vantagens que eu falei acima, a parte presencial ocorrerá em duas cidades simultaneamente: em Recife e em Belo Horizonte.

Com isso, o evento pretende trazer mais conteúdo e alcançar mais pessoas tanto na forma digital quanto presencial.

Não quero repetir muito o que já falei em outro texto, mas eventos na área de tecnologia são muito importantes para o crescimento na carreira quanto no crescimento pessoal.

Se você tiver a oportunidade, participe. O TDC tem várias trilhas temáticas, onde alguma delas pode ser mais a sua área e também tem uma parte aberta, com inscrição gratuita.

Agora, então, podemos aproveitar o melhor dos mundos nos eventos de T.I.: podemos curtir um evento no aconchego de casa ou podemos ir e participar de toda aquela boa bagunça, reencontrando amigos e fazendo novas amizades, impulsionando muito mais nossa carreira.

Espero encontrá-los ainda em muitos eventos por aí! :)