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

CEOs da quebrada

Sem "serviço indisponível": quem são as pessoas que moram e empreendem na periferia

O motorista se retrai no banco. Aparentemente assustado, aperta o volante do carro e olha para os lados. Estamos chegando na Brasilândia, bairro da periferia da Zona Norte de São Paulo. Lá, o atendimento de aplicativos de transporte privado é limitado. É possível chegar partindo das regiões centrais, mas solicitar um carro de dentro do bairro é se deparar com uma mensagem de “serviço indisponível”. “Só ligo o aplicativo [para trabalhar] de novo quando sair daqui”, diz o motorista. Depois de alguns minutos, quem nos recebe ao fim da corrida é Alvimar Silva, 50. Ele é um dos criadores da Ubra, empresa de aplicativo de transporte privado que atua há cerca de um ano e meio no distrito.

A pouco mais de 20 quilômetros dali, em Osasco (SP), clientes levam suas roupas até a primeira unidade da Magic Clean Lavanderia, criada por Tatiana Lobato, 41. Em 2006, ela viu na periferia de uma das maiores cidades da Grande São Paulo a oportunidade de oferecer o serviço de lavagem, antes aos bairros nobres e áreas centrais. Hoje, a rede conta com quatro lojas.

Em Heliópolis, maior favela da capital paulista, trabalhadores guiam os carros identificados pelas faixas da Godnet Telecom. Ruas estreitas e inúmeros veículos estacionados nas vielas dificultam bastante a agem, mas a internet chega à casa de todos. A empresa foi criada em 2007 por Agostinho Souza.

Alvimar Silva, Tatiana Lobato e Agostinho Souza moram e empreendem na periferia. Todos são CEOs [chief executive officer, na sigla em inglês; em português, diretor executivo] da quebrada. Mas eles fazem mais do que isso: oferecem serviços até então negados aos seus bairros.

A ocasião faz o... CEO

A Godnet Telecom começou quase que por um acaso. Souza era montador e desmontador de móveis. Ao prestar um serviço durante a mudança de uma empresa, ele aceitou receber como pagamento os itens do imóvel que não seriam reaproveitados. Alguns objetos ele vendeu para reciclagem. Mas entre as inúmeras bugigangas havia metros de cabos de rede usados para conexões de internet. E foram eles que deram vida à Godnet. A empresa hoje tem uma receita bruta de R$ 200 mil mensais em média. Duas equipes atendem instalações e manutenções no bairro diariamente, e os funcionários almoçam ao lado da sede da empresa, em um restaurante adquirido, recentemente, por Souza.

Além de Heliópolis, a Godnet expandiu os negócios para Guarulhos, na Grande São Paulo, e começa a fazer os primeiros atendimentos para empresas na região de classe média do Brooklin, na Zona Sul paulistana.

“Eu não sabia mexer com nada disso de internet. Eu tive que aprender. Fiz um curso de fibra ótica porque no começo não tinha dinheiro para pagar ninguém para fazer isso por mim. Então me virei, mesmo sem saber muito de inglês, porque nessa área quase tudo é em inglês, né">

Colaborou nesta edição

Simone Freire, coordenação e edição, agência Énois Inteligência Jovem

Fale com o TAB

[email protected]

Publicado em 10 de setembro de 2018

Direção: Rodrigo Flores; Edição: Daniel Tozzi; Reportagem: Adriana Terra, Rodrigo Bertolotto; UX/Design: Marcelo Gerab, Solenn Robic; Vídeo: Mariah Kay, Ugo Soares;