{
  "version": "1.0",
  "generated": "2026-04-06T15:33:05.068Z",
  "site": {
    "title": "DevPleno",
    "description": "Ajudando desenvolvedores a construir produtos de classe mundial.",
    "url": "https://devpleno.com"
  },
  "entries": [
    {
      "id": "0048afc9f96ef17b",
      "url": "https://devpleno.com/clt-ou-pj",
      "title": "CLT ou PJ em Software - O que vale mais a pena? - DevPleno (Part 1)",
      "content": "Carreira\n\n## CLT ou PJ em Software - O que vale mais a pena?\n\nT\nPor Tulio Faria • 30 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nHoje eu gostaria de mostrar uma continha que eu acho bastante interessante quando vamos analisar ofertas de emprego, que o pessoal fala sobre CLT ou PJ. Entenda qual o custo de cada uma delas e porque você deveria escolher uma ou outra.\n\nA primeira coisa que temos que definir é o salário (lembrando que eu não sou contador, essa é uma conta que eu geralmente faço caso alguém me ofereça um emprego). Vamos colocar, por exemplo, R$10 mil.\n\nQual o custo disso para a empresa que está empregando?\n\nO custo para ela vai ser na faixa de 13x esse valor, pois é acrescentado o décimo terceiro, férias, etc, mais um encargo em torno de 30%:\n\n10.000,00 x 13 x 1,3 = 169.000,00\nValor para a empresa: R$169.000,00\n\nEntão se você recebe R$10 mil por mês, em um ano você custa em torno de R$169 mil para a empresa. No meu caso, como eu sou Super Simples, eu acabo pagando meus funcionários todos juntos no CLT, então não dá pra ter uma ideia muito grande de quanto é.\n\nQuanto desses R$169 mil você vai levar efetivamente?\n\nLembrando que se você recebe R$10 mil, vai bater na alíquota máxima do imposto de renda, então temos que multiplicar também por 0,725\n\n10.000,00 x 13 x 0,725 = 94.250,00\nValor líquido: R$94.250,00\n\nPerceba que isso já é uma diferença de R$74.750,00 (isso é apenas uma comparação no caso da CLT). Agora, qual o custo como PJ para a empresa que está te contratando?\n\n10.000,00 x 12 = 120.000,00\n\nNo fim das contas a empresa não vai gastar mais nada, mas qual o líquido que você vai receber em cima desses R$120 mil? Você terá que pagar um imposto, que se for no Super Simples, por exemplo, pode cair em torno de 8%:\n\n10.000,00 x 12 x 0,93 = 111.600,00\nValor líquido: R$111.600,00",
      "description": "Hoje eu gostaria de mostrar uma continha que eu acho bastante interessante quando vamos analisar ofertas de emprego, que o pessoal fala sobre CLT ou PJ. En...",
      "keywords": [
        "para",
        "como",
        "empresa",
        "custo",
        "exemplo",
        "https",
        "mais",
        "valor",
        "isso",
        "qual"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/clt-ou-pj"
      }
    },
    {
      "id": "01286d9ac248a362",
      "url": "https://devpleno.com/blog/falsy-e-truthy-values/index",
      "title": "Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS (Part 2)",
      "content": "Irá retornar False, mas se fizermos isso:\n\n```jsx\nconsole.log(!!42 == true)\n```\n\nEstamos negando ele para ser true, então irá retornar true. Inicialmente ele não funcionou porque o == não faz essa conversão de tipos, já os &&, que é um operador booleano, força esse valor a ser convertido para truthy ou falsy value. Sempre for fazer comparações desse tipo, é bom fazer com === para que realmente fique idêntico e assim ele realmente verifica se os valores são os mesmos e isso evita qualquer problema no futuro.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/gQl0DCNImqw\" allowfullscreen></iframe>\n</div>\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "valores",
        "para",
        "true",
        "valor",
        "exemplo",
        "sobre",
        "https",
        "retornar",
        "false",
        "comments"
      ],
      "metadata": {
        "title": "Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS",
        "date": "2017-08-07",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "TRUTHY-VALUES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/falsy-e-truthy-values/index.md"
      }
    },
    {
      "id": "0150ec00071d21bf",
      "url": "https://devpleno.com/obesidade-mental",
      "title": "Você sofre de Obesidade Mental? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Você sofre de Obesidade Mental?\n\nT\nPor Tulio Faria • 17 de outubro de 2017\n\n[Carreira](/tag/carreira)\n\nHoje quero contar para você o que aconteceu comigo há mais ou menos 1 ano / 1 ano e meio, até mesmo antes de começar o DevPleno.\n\nEu comecei a perceber que eu queria lançar meus cursos e colocar o DevPleno no ar, porém eu fiquei apenas estudando, já que queria fazer da melhor forma possível.\n\nEstudei React, Angular, Node, JavaScript, Mongo, DevOps, etc, pois eu queria saber cada vez mais para conseguir compartilhar. Eu estava lendo o livro geração de Valor (que recomendo para quem quer pensar um pouco diferente) e comecei a refletir um pouco sobre a carreira.\n\nNesse livro tinha uma citação para o que eu estava fazendo, chamava-se “Obesidade mental”, ela acontece quando sabemos muito, mas executamos pouco.\n\nQuando a gente começa a estudar muito e não executa, parece que nunca vamos ser completos. Depois que começamos a executar, não conseguimos mais parar.\n\nDesde que eu coloquei meu primeiro vídeo no ar e compartilhei com todo mundo, eu comecei a executar cada vez mais.\n\nUma das coisas que eu acho fundamental para executar as coisas é seguir algum método, por exemplo, no Fullstack Master e no DevReactJS, temos uma linha de raciocínio, é muito mais fácil fazer os exercícios e ir executando. Além disso, é bem legal porque os alunos compartilham os repositórios deles no GitHub com todos os exercícios dos cursos.\n\nPor hoje é só, apenas queria deixar essa reflexão para vocês. Até a próxima.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje quero contar para você o que aconteceu comigo há mais ou menos 1 ano / 1 ano e meio, até mesmo antes de começar o DevPleno. Eu comecei a perceber que ...",
      "keywords": [
        "para",
        "https",
        "mais",
        "carreira",
        "mental",
        "devpleno",
        "queria",
        "come",
        "comecei",
        "pouco"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/obesidade-mental"
      }
    },
    {
      "id": "0254efd7d2c15cde",
      "url": "https://devpleno.com/blog/hands-on-jest/index",
      "title": "Jest - Como utilizar a ferramenta de testes criada pelo Facebook (Part 1)",
      "content": "O Jest foi criado pelo Facebook com o objetivo de rodar os testes de uma maneira eficiente e com menos configurações.\n\nAqui eu já tenho um diretório para o nosso teste chamado jest-handson, então vou rodar:\n\n```js\nyarn add jest --dev\n```\n\nVamos colocar como dependência de desenvolvimento, que é o que precisamos realmente e o yarn já vai resolver até mesmo a questão de criar um package.json.\n\nDentro do Package.json tem o código:\n\n```jsx\n{\n  \"devDependencies\": {\n  \"jest\": \"^19.0.2\"\n  }\n}\n```\n\nE vamos adicionar:\n\n```jsx\n{\n  \"devDependencies\": {\n    \"jest\": \"^19.0.2\"\n  },\n  \"scripts\":{\n    \"test\": \"jest\"\n  }\n}\n```\n\nSe rodarmos o yarn test agora, ele já sabe como rodar e retornou que não temos nenhum teste para rodar.\n\nEntão vamos criar um módulo chamado modulo1 para testarmos:\n\n```jsx\nconst modulo1 = {\n  func1: (a) => a + 1\n}\nmodule.exports = modulo1\n```\n\nUma coisa que acho muito interessante de fazer com os testes é criá-los juntos com a implementação, por exemplo, modulo1.js e modulo1.test.js. Até os testes ficam mais fáceis porque não é preciso navegar nos diretórios quando salvá-lo na mesma pasta do módulo. Dentro do modulo1.test, vamos importar o modulo1:\n\n```jsx\nconst modulo1 = require('./modulo1')\ndescribe('basic features', () => {\n  it('should return the right value', () => {\n    expect(modulo1.func1(10)).toBe(11)\n  })\n})\n```\n\nPerceba que o Jest tem as mesmas de outros test runners, como por exemplo, criar uma switch test e dentro usar um it. Vamos passar 10 e ele deve retornar o valor 11. Ao rodar o yarn, ele organiza dizendo que os testes deram certo. Lembrando que é sempre bom fazer o teste falhar, colocando 12, por exemplo, no lugar do 11, e rodar para ver se o teste em si está funcionando.\n\nAgora imagine que por algum motivo no local de 'a' deve rodar uma função em específico, vamos supor uma função 2:\n\n```jsx\nconst modulo1 = {\n  func1: (a) => a + 1,\n  func2: (a, cb) => a + cb(a)\n}\nmodule.exports = modulo1\n```",
      "keywords": [
        "modulo1",
        "jest",
        "para",
        "rodar",
        "vamos",
        "test",
        "const",
        "testes",
        "teste",
        "yarn"
      ],
      "metadata": {
        "title": "Jest - Como utilizar a ferramenta de testes criada pelo Facebook",
        "date": "2017-07-08",
        "tags": "['Javascript']",
        "thumbnail": "Jest2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-jest/index.md"
      }
    },
    {
      "id": "02807172200516fc",
      "url": "https://devpleno.com/blog/processo-seletivo-da-toptal/index",
      "title": "Processo Seletivo da Toptal – Série Trabalho Remoto",
      "content": "Seu objetivo é trabalhar remotamente por meio da Toptal? Neste vídeo, você vai entender como funciona o processo seletivo.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/YRWgZZ2j43Q\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog).\n\n[![Thumbnail](DevReact.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)",
      "keywords": [
        "embed",
        "blog",
        "responsive",
        "https",
        "mais",
        "profissionais",
        "toptal",
        "classname",
        "iframe",
        "reactjs"
      ],
      "metadata": {
        "title": "Processo Seletivo da Toptal – Série Trabalho Remoto",
        "date": "2018-02-21",
        "tags": "['Carreira']",
        "thumbnail": "ProcessoSeletivo.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/processo-seletivo-da-toptal/index.md"
      }
    },
    {
      "id": "03068fbf46cf6294",
      "url": "https://devpleno.com/lista-encadeada-adicionar-no",
      "title": "Lista encadeada - Adicionar nó - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Lista encadeada - Adicionar nó\n\nT\nPor Tulio Faria • 12 de julho de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nVamos explorar um pouco mais de estrutura de dados de algoritmos que são comuns na base curricular, principalmente em computação, e caem muito em competição de programação e em entrevistas de emprego. Quando falamos de entrevista no exterior, é muito comum fazer essa entrevista com esse tipo de questão.\n\nHoje vamos falar sobre lista, com questões do google. Isso mostra que você tem essa desenvoltura, mesmo que não use na prática, nas entrevistas o que eles procuram é essa capacidade de conseguir resolver o problema.\n\nA lista encadeada, também conhecida como Linked-List basicamente é composta por nós que têm dois valores dentro, sendo que o segundo valor aponta para o próximo nó, por esse motivo se chama lista encadeada. Podemos ter uma estrutura de dados que represente isso, para isso podemos, por exemplo, citar uma função em JavaScript que vai funcionar quase que igual a uma classe em orientação de objeto, mas vamos utilizar somente closure e travar o contexto dentro da função para fazer toda a operação na lista.\n\nEntão eu vou criar algumas variáveis dentro e retornar qual vai ser a interface pública dessa lista:\n\nfunction LinkedList() {\nlet head = null\nlength = 0\nreturn {\nlength: () => length\n}\n}\nPerceba que eu defini um head, que é o ponto inicial da nossa lista, e além disso eu defini o length, que é o tamanho da nossa lista. O legal é que estamos retornando um length, porém esse length vai ser uma função que retorna length. Nós não utilizamos o this, esse tipo de operação é o melhor possível porque não temos essa mistura de contexto. No JavaScript funcional, quanto mais utilizarmos dessa forma melhor vai ser.\n\nSe eu fizer:",
      "description": "Vamos explorar um pouco mais de estrutura de dados de algoritmos que são comuns na base curricular, principalmente em computação, e caem muito em competiçã...",
      "keywords": [
        "length",
        "head",
        "value",
        "list",
        "node",
        "lista",
        "para",
        "vamos",
        "return",
        "const"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/lista-encadeada-adicionar-no"
      }
    },
    {
      "id": "033c901d7471f280",
      "url": "https://devpleno.com/blog/14",
      "title": "Blog - Página 14 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 3 de jul. de 2017 Evite o this em JavaScript](/evite-o-this-em-js)\n\n[Carreira 3 de jul. de 2017 Freelancer no exterior: 7 dicas para ter sucesso na carreira](/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira)\n\n[Javascript 30 de jun. de 2017 High-order Function - Reduce](/reduce)\n\n[Javascript 29 de jun. de 2017 Generators Functions - o que acontece por baixo dos panos](/generators-functions)\n\n[Carreira 28 de jun. de 2017 Precificação de softwares: você sabe como fazer?](/precificacao-de-softwares-voce-sabe-como-fazer)\n\n[Javascript 28 de jun. de 2017 ReactJS Recursivo?](/renderizar-estruturas-em-formato-de-arvore)\n\n[Javascript 28 de jun. de 2017 Sleep em Generator](/sleep-em-generator)\n\n[Javascript 27 de jun. de 2017 High-order Function MAP](/map)\n\n[Javascript 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)\n\n[Javascript 26 de jun. de 2017 Como servir arquivos e expor servidor local com HTTPS](/servir-arquivos-e-expor-servidor)\n\n[Javascript 22 de jun. de 2017 Debug de código JavaScript no Navegador](/debug-no-navegador)\n\n[Carreira 22 de jun. de 2017 Qual é a sua desculpa?](/qual-a-sua-desculpa)\n\n[Anterior](/blog/13)14 / 26[Próxima](/blog/15)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "carreira",
        "para",
        "blog",
        "nodejs",
        "reactjs",
        "como",
        "todos",
        "algoritmos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/14"
      }
    },
    {
      "id": "0348e7a608dad934",
      "url": "https://devpleno.com/beatbox-manipulavel-com-js",
      "title": "Construindo um Beatbox Manipulável com JS - DevPleno (Part 2)",
      "content": "generateTrack(1)\ngenerateTrack(2)\ngenerateTrack(2)\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;html>\nO objetivo é que o usuário possa escolher quando quer que cada item toque, por exemplo, com o bumbo batendo em um ritmo e o prato nos intervalos. Para que isso aconteça, cada tick da música tem que checar se naquela linha aquele áudio está marcado.\n\n&#x3C;script>\n//gera o check-box\nconst numItems = 10\nfunction generationTrack(trackId){\nconst track = document.getElementById('track'+trackId)\n\nfor (let i=0; i&#x3C;10; i++){\ntrack.innerHTML += '&#x3C;input type=\"checkbox id=\"i-'+trackId+'-'+i+'\" />'\n}\n}\ngenerateTrack(1)\ngenerateTrack(2)\ngenerateTrack(2)\n//fim gerar check-box\n\nconst bpm = 90\nlet current = 0\nfunction tick(){\nconst currentItem = current++ % numItems\n\nconsole.log(currentItem)\n}\n\nsetInterval(tick, (60*1000)/bpm)\n&#x3C;/script>\nNote que ele está caminhando entre os itens, mas temos que andar entre os tracks e pegar os que vão ser tocados. Para isso vamos implementar o script criando um for com i iniciado em 1 e i menor ou igual a 3, então podemos checar se aquele item em especifico está marcado. Quando for true, daremos play, e por último ‘startar’ quando apertarmos no play:\n\n&#x3C;script>\nconst bpm = 90\nlet current = 0\nlet isPlaying = false\nlet timer = null\nfunction tick(){\nconst currentItem = current++ % numItems\nfor(let i=1; i&#x3C;=3; i++){\nconst item = document.getElementById('i-'+i+'-'+currentItem)\nconst track = document.getElementById('track' +i)\nif (item.checked){\nconst audio = document.getElementById(track.attributes.rel.value)\naudio.currentTime = 0\naudio.play()\n}\n}\n}\nconst play = document.getElementById('play')\nplay.addEventListener('click', function(){\nif (isPlaying){\nclearInterval(timer)\nplay.innerHTML = 'Play'\n} else {\ntimer = setInterval(tick, (60*1000)/bpm)\nplay.innerHTML = 'Stop'\n}",
      "description": "Agora que já entendemos como dar play em áudio com JS, como manipular para compor uma batida, faremos com que o usuário escolha a forma como seja tocado, o...",
      "keywords": [
        "play",
        "audio",
        "const",
        "prato",
        "https",
        "track",
        "script",
        "checkbox",
        "para",
        "trackid"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/beatbox-manipulavel-com-js"
      }
    },
    {
      "id": "03699ab3bb27d752",
      "url": "https://devpleno.com/minicurso-socket-io-parte-4",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms - DevPleno (Part 3)",
      "content": "Imagine que temos um servidor e cinco usuários, porém dois usuários estão no jogo um e três no jogo dois, eu poderia mandar essa informação para todos e separar no client, mas fazendo isso eu vou matar a performance na rede. Imagine mandar a atualização de um vídeo novo, se não estiver selecionando os usuários do jogo especifico, eu mandaria para três usuários de forma desnecessária e se pensarmos em escala perdemos muito recurso trafegando dado que não precisa.\n\nTambém temos a situação onde temos que gerar atualização para todo mundo, nesse caso já estamos consumindo o recurso necessário. O importante é conseguir segmentar isso caso a gente queira. Um conceito importante no Socket.IO é o ‘room’, que são as salas que nós temos, toda vez que um usuário conecta, ele está na sala geral, então já tem um room que engloba todos os usuários que estão conectados ao Socket.IO naquele momento, depois conseguimos criar novas rooms, por exemplo match-1 para o jogo 1, e quando eu quiser mandar uma informação para os usuários dessa sala específica, fica mais simples e é isso que vamos fazer agora. Dentro de js/match.js, vamos fazer uma modificação no código para falar para o servidor em qual sala estamos conectado, isso vai ser feito quando formos chamar o construtor do Socket.IO do client, vai ser passado uma string vazia como url e depois vamos passar um query, que será um objeto com match e dentro dele um MATCH_INDEX:\n\n$function(){\nconst socket = io('', { query: { match: MATCH_INDEX}});\n...\n}\nPerceba que agora no route/index.js, quando o usuário conectar, vamos colocar ele na sala:",
      "description": "Nesta etapa do nosso minicurso de Socket.IO, vamos fazer as atualizações específicas de cada jogo. Primeiro vamos fazer o gráfico da torcida se movimentar....",
      "keywords": [
        "match",
        "supporters",
        "team",
        "para",
        "porcentagem",
        "const",
        "socket",
        "vamos",
        "torcida",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-4"
      }
    },
    {
      "id": "039073b7ebfd35fc",
      "url": "https://devpleno.com/blog/teclado-com-webaudioapi/index",
      "title": "Criando um teclado com WebAudioAPI (Part 1)",
      "content": "Hoje quero continuar falando sobre [WebAudioAPI](https://www.devpleno.com/webaudioapi/). Vamos um pouco além do que já fizemos anteriormente. No nosso arquivo HTML, teremos dois scripts com função para ler qual tecla no teclado estamos apertando e outra para quando soltarmos a tecla:\n\n```jsx\n<html>\n  <body>\n    <script>\n      function onKeyDown(key){console.log(key)}\n      function onKeyUp(key){console.log(key)}\n      window.onkeydown = onKeyDown window.onkeyup = onKeyUp\n    </script>\n  </body>\n</html>\n```\n\nA partir disso, podemos utilizar o contexto para tocar um áudio, mas não podemos utilizar vários deles, por esse motivo temos que checar se já apertamos a tecla, mas antes disso vamos fazer um check para saber qual tecla estamos pressionando. Para isso, tenho o mapeamento das teclas:",
      "keywords": [
        "keycode",
        "para",
        "onkeydown",
        "onkeyup",
        "const",
        "function",
        "window",
        "maposc",
        "html",
        "tecla"
      ],
      "metadata": {
        "title": "Criando um teclado com WebAudioAPI",
        "date": "2017-10-18",
        "tags": "['Javascript']",
        "thumbnail": "TecladoComWebAudi.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/teclado-com-webaudioapi/index.md"
      }
    },
    {
      "id": "0409f31b222b53dd",
      "url": "https://devpleno.com/handlebars-template-html-simples",
      "title": "Template HTML simples - Hands-on Handlebars - DevPleno (Part 2)",
      "content": "&#x3C;script>\n$function(){\n$.get('dados.json't=' +new Date().getTime(), function(data){\n$(\"#people\").append('&#x3C;div>&#x3C;strong>Name: &#x3C;/strong> '+nome)\n$(\"#people\").append('&#x3C;div>&#x3C;strong>Last Name: &#x3C;/strong> '+last)\n}\n})\n&#x3C;/script>\nIsso dá muito trabalho, então vamos criar uma parte do template usando Script do handlebars. Ao invés de ficar concatenando Strings, vou colar a div dentro dele e onde eu quiser colocar o nome apenas coloco {{name}}:\n\n&#x3C;script type='text/x-handlebars-templete' id='person-templete'>\n&#x3C;div>\n&#x3C;strong>Name: &#x3C;/strong>\n{{ nome }}\n&#x3C;br />\n&#x3C;strong>Last Name: &#x3C;/strong>\n{{ lastName }}\n&#x3C;br />\n&#x3C;/div>\n&#x3C;/script>\nTemos, então, que pegar essa String de dentro do script, correto? Então vamos fazer o seguinte: pegar o html que está ali dentro, que é um template do Handlebars, ele vai trocar de forma automática. Depois disso, vamos criar um template do handlebars. Lembrando que o personTemplete você pode renderizar:\n\n&#x3C;script>\n$function(){\n$.get'dados.json't=' +new Date().getTime(), function(data){\nconst templeteString = $(\"#person-templete\").html();\nconst personTemplete = Handlebars.compile(templeteString);\nconst html = personTemplete({\nname: 'Tulio',\nlastName: 'Faria'\n})\n$(\"people\").html(html);\n}\n})\n&#x3C;/script>\nCom isso, o template já ficou bem mais fácil, pois apenas damos um append no html. Se funcionar, podemos até tirar a div da parte de cima do nosso HTML que vai funcionar perfeitamente.\n\nObviamente, para uma pessoa, só daria para fazer na mão, mas imagine se quisermos colocar várias pessoas, é possível fazer isso também por meio da linguagem de script e ao invés de passar uma pessoa só, vou passar a minha lista de pessoas.",
      "description": "O Handlebars é uma forma de lidarmos com template HTML. É algo simples, mas que possui diversas opções que podemos fazer. Vou mostrar um caso bem específic...",
      "keywords": [
        "script",
        "strong",
        "html",
        "name",
        "handlebars",
        "people",
        "https",
        "template",
        "lastname",
        "function"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/handlebars-template-html-simples"
      }
    },
    {
      "id": "042a48c85aabf388",
      "url": "https://devpleno.com/blog/toptal-serietrabalhoremoto/index",
      "title": "O que é a Toptal? | Série Trabalho Remoto",
      "content": "Você já conhece a Toptal? Entenda o papel desta empresa que é uma das principais referências quando falamos em trabalho remoto.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/xQ-K4MdagmQ\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS aqui.](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)\n\n[![Curso DevReactJS](DevReactCurso.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)",
      "keywords": [
        "embed",
        "blog",
        "responsive",
        "https",
        "mais",
        "profissionais",
        "devreactjs",
        "toptal",
        "classname",
        "iframe"
      ],
      "metadata": {
        "title": "O que é a Toptal? | Série Trabalho Remoto",
        "date": "2018-02-09",
        "tags": "['Carreira']",
        "thumbnail": "OQueEToptal.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/toptal-serietrabalhoremoto/index.md"
      }
    },
    {
      "id": "047529cc830a6b9e",
      "url": "https://devpleno.com/composicao-de-componentes-em-reactjs",
      "title": "Composição de componentes em ReactJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Composição de componentes em ReactJS\n\nT\nPor Tulio Faria • 1 de agosto de 2017\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nA dica de hoje é sobre o ReactJS, mais especificamente sobre como podemos criar composição de componentes em ReactJS de uma forma um pouco diferente, como podemos utilizar algumas áreas de um componente para ejetar outros componentes por exemplo. Na prática ficará mais simples de entender.\n\nEu criei um aplicativo básico utilizando o create react app e agora vou criar dois componentes para mostrar como podemos utilizar essa composição. No app.js, logo após o importe do React e do ’./app.css’; criarei um Panel, ele será um functional stateless component porque não temos o estado interno dele.\n\nconst Panel = (props) => {\nreturn(\n&#x3C;div>\n&#x3C;h1>header&#x3C;/h1>\n&#x3C;/div>\n&#x3C;p>Footer&#x3C;/p>\n)\n}\nEle me retorna duas coisas, uma div e tem header que pode ser um H1. Abaixo temos um P com um footer, isso para termos uma ideia de como podemos fazer. A primeira forma de composição é exatamente essa, eu posso trocar esse header e esse footer, por exemplo, ao invés de um texto chamar outra coisa:\n\nconst Panel = (props) => {\nreturn (\n&#x3C;div>\n&#x3C;h1>{props.header}&#x3C;/h1>\n&#x3C;p>{props.footer}&#x3C;/p>\n&#x3C;/div>\n)\n}\nSe eu pegar esse código e chamar mais abaixo, dentro do nosso app component:\n\n&#x3C;p className=\"App-intro\">\nTo get started, edit &#x3C;code>src/App.js&#x3C;/code>\n&#x3C;/p>\n\n&#x3C;Panel header='Olá mundo!' footer='rodape' />\nEntão onde eu mandar esse valor, ele vai escrever o texto, mas o interessante é que eu posso fazer algo diferente: ao invés de mandar dessa forma, posso mandar um JSX:",
      "description": "A dica de hoje é sobre o ReactJS, mais especificamente sobre como podemos criar composição de componentes em ReactJS de uma forma um pouco diferente, como ...",
      "keywords": [
        "header",
        "props",
        "para",
        "componentes",
        "composi",
        "podemos",
        "reactjs",
        "como",
        "panel",
        "footer"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/composicao-de-componentes-em-reactjs"
      }
    },
    {
      "id": "049d69ae29e2b198",
      "url": "https://devpleno.com/pensamentos-limitantes",
      "title": "Pensamentos limitantes - DevPleno",
      "content": "Carreira\n\n## Pensamentos limitantes\n\nT\nPor Tulio Faria • 18 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nHoje eu gostaria de dar uma dica de carreira de como ser um profissional melhor. Muitas vezes nos pegamos tendo, mesmo sem querer, o pensamento limitante. Toda vez que você for aprender algo novo ou tentar fazer algo, vai ter uma voz dizendo “não é agora” ou “você não nasceu pra isso”. Por exemplo, você tem a ideia de um software ou app novo e envolve um monte de coisa que você não sabe, a sua cabeça diz “desiste, você não vai conseguir fazer”, ai naturalmente sua parte física do corpo vai começar a responder de acordo. Seu corpo entra em um estado de se manter na zona de conforto e começa a poupar energia, então você terá menos energia para pensar nesse projeto, porque o seu pensamento te limitou nessa caixinha.\n\nA primeira que precisa pensar quando se quer ser um desenvolvedor pleno é estudar cada vez mais, conseguir coisas novas e não ter pensamento limitante.\n\nQuando vier esse pensamento, proteja-se contra isso. Responda esse pensamento de forma a mostrar que você realmente consegue e aquilo não passa de uma tentativa de seu corpo e sua mente de se proteger de algo que possa dar errado. Com isso você conseguirá realizar muito mais apenas estudando seu estado mental.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Pensamentos%20limitantes&url=https%3A%2F%2Fdevpleno.com%2Fpensamentos-limitantes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpensamentos-limitantes)",
      "description": "Hoje eu gostaria de dar uma dica de carreira de como ser um profissional melhor. Muitas vezes nos pegamos tendo, mesmo sem querer, o pensamento limitante. ...",
      "keywords": [
        "https",
        "pensamento",
        "carreira",
        "limitantes",
        "algo",
        "isso",
        "conseguir",
        "corpo",
        "pensamentos",
        "limitante"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/pensamentos-limitantes"
      }
    },
    {
      "id": "04a02f3d46c4e6fb",
      "url": "https://devpleno.com/escopos-e-closures",
      "title": "Escopos e Closures - NodeJS Primeiros Passos - DevPleno (Part 1)",
      "content": "Javascript\n\n## Escopos e Closures - NodeJS Primeiros Passos\n\nT\nPor Tulio Faria • 25 de maio de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nEntender Escopos e Closures do JavaScript é muito importante para conseguir avançar no NodeJS. Primeiramente tenho um diretório criado com nossos exemplos. Vou criar um arquivo novo e mostrar um exemplo básico:\n\nvar a = 10\n\nconsole.log(a)\nou simplesmente:\n\na = 10\n\nconsole.log(a)\nPerceba que tem apenas uma declaração de variável e o console.log para fazer a saída dela, ou seja, escrever a variável no console. Se rodarmos este script, teremos o retorno 10. Esse tipo de variável está sendo criada no escopo Global, mas o que é interessante nisso? Se eu fizer um function de incrementação a ela, terei um segundo escopo.\n\nvar a = 10\n\nfunction inc() {\na++\n}\n\ninc()\n\nconsole.log(a)\nEsse segundo escopo consegue enxergar o escopo de fora. Podemos manipular as variáveis do lado de fora. Embora pareça vantagem, em alguns momentos pode atrapalhar o escopo principal. Logo acima, fizemos uma versão sem a variável var. Quando não colocamos o var, não travamos o escopo dela.\n\nvar a = 10\n\nfunction inc() {\na++\n\nb = 11\n}\n\ninc()\n\nconsole.log(a, b)\nSe fizermos como no exemplo acima, o segundo escopo já morreu, mas mesmo assim vai sair o valor de b, pois conseguimos escrever o b fora do escopo definido a ele. Então, quando criamos arquivos JavaScript que fazem esse tipo de coisa, estamos sujando o escopo global, e isso não é algo que desejamos fazer.\n\n**Por que?** Vamos supor que exista um outro trecho de código que dependesse desse b, então a função ‘inc’ estaria alterando essa variável que está no contexto global podendo alterar o comportamento do código, isso para achar bug é extremamente difícil.\n\n**O que podemos fazer para isso não acontecer?** Uma das coisas que podemos utilizar é guardar a variável sendo válida apenas dentro do escopo, utilizando o var, por exemplo:\n\nfunction inc() {\na++",
      "description": "Entender Escopos e Closures do JavaScript é muito importante para conseguir avançar no NodeJS. Primeiramente tenho um diretório criado com nossos exemplos....",
      "keywords": [
        "escopo",
        "function",
        "console",
        "vari",
        "conta",
        "dentro",
        "javascript",
        "fazer",
        "podemos",
        "contador"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/escopos-e-closures"
      }
    },
    {
      "id": "05074579fac091c0",
      "url": "https://devpleno.com/modulo-co",
      "title": "Módulo Co - Organize o fluxo de seu código assíncrono - DevPleno (Part 3)",
      "content": "co(function* () {\nconst file = ['yarn.lock', 'package.json']\nconst filePromises = []\nfor (let i = 0; i &#x3C; file.length; i++) {\nfilePromises.push(readFile(file[i]))\n}\nconst contents = yield filePromises\nconsole.log(contents)\n})\nAgora colocamos o yield para baixo e ele está esperando uma lista de promises para serem resolvidas, já o contents é um vetor com todas as respostas dessas promises. Isso é muito legal quando você for fazer um script que precisava mover arquivo, movendo diretório, fazendo coisas recursivas, etc. Com o generator e ajuda do CO fica muito mais fácil de entender o processo.\n\nAgora entenda melhor sobre [Generators Functions e tudo que acontece “por baixo dos panos”.](https://www.devpleno.com/generators-functions/)\n\nConfira o Hands-on em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=M%C3%B3dulo%20Co%20-%20Organize%20o%20fluxo%20de%20seu%20c%C3%B3digo%20ass%C3%ADncrono&url=https%3A%2F%2Fdevpleno.com%2Fmodulo-co) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmodulo-co)",
      "description": "Neste handson, vamos utilizar uma ferramenta bastante útil no nosso dia a dia, o módulo CO, que é uma forma de controlar o fluxo das funções por meio de ge...",
      "keywords": [
        "function",
        "readfile",
        "file",
        "digo",
        "data",
        "fazer",
        "const",
        "contents",
        "https",
        "generator"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/modulo-co"
      }
    },
    {
      "id": "050b23dbcc347879",
      "url": "https://devpleno.com/tag/javascript/13",
      "title": "Javascript - Pagina 13 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 17 de abr. de 2017 Hands-on: Injeção de Dependência é bom mesmo?](/hands-injecao-de-dependencia-e-bom-mesmo)\n\n[Javascript 17 de abr. de 2017 Hands-on: Currying](/hands-on-currying)\n\n[Javascript 10 de abr. de 2017 Hands-on: Json-Server](/hands-json-server)\n\n[Javascript 7 de abr. de 2017 High-order Functions](/high-order-functions)\n\n[Javascript 4 de abr. de 2017 Dica: Debounce](/dica-debounce)\n\n[Javascript 4 de abr. de 2017 Dica: Injeção de Dependência no ReactJS](/dica-injecao-de-dependencia-no-reactjs)\n\n[Javascript 28 de mar. de 2017 Immutability e ImmutableJS](/immutability-e-immutablejs)\n\n[Javascript 23 de mar. de 2017 Dica: Self-Invoked Function (Self-invoking Function)](/dica-self-invoked-function-self-invoking-function)\n\n[Javascript 22 de mar. de 2017 Dica: Debug de NodeJS no VS Code](/dica-debug-de-nodejs-no-vs-code)\n\n[Javascript 9 de mar. de 2017 Apresentação em HTML](/apresentacao-em-html)\n\n[Javascript 9 de mar. de 2017 Hands-on: Creat-React-App](/hands-creat-react-app)\n\n[Javascript 7 de mar. de 2017 Dica: Injeção de dependência com Destructuring Assignament](/dica-injecao-de-dependencia-com-destructuring-assignament)\n\n[Anterior](/tag/javascript/12)13 / 16[Próxima](/tag/javascript/14)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "dica",
        "hands",
        "nodejs",
        "reactjs",
        "self",
        "function",
        "inje",
        "depend"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/13"
      }
    },
    {
      "id": "050f8b0c2c025549",
      "url": "https://devpleno.com/tag/javascript/10",
      "title": "Javascript - Pagina 10 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 19 de mai. de 2017 Postman - Como testar APIs - Hands-on](/postman-como-testar-apis)\n\n[Javascript 18 de mai. de 2017 Ctrl+C / Copy to Clipboard em JS](/copy-to-clipboard-em-js)\n\n[Javascript 18 de mai. de 2017 Criando componente mais simples e eficaz em React](/stateless-functional-component)\n\n[Javascript 17 de mai. de 2017 React-router-dom: como injetar props em rotas em ReactJS](/router-props-2)\n\n[Javascript 16 de mai. de 2017 Faker - Como gerar grandes massas de dados fictícios para testes](/dados-ficticios-para-testes)\n\n[Javascript 16 de mai. de 2017 3 dicas para NPM + 1 dica extra](/dicas-paranpm)\n\n[Javascript 15 de mai. de 2017 Fs-extra - Filesystem com Promises e mais funcionalidades](/fs-extra)\n\n[Javascript 15 de mai. de 2017 Hands-on - Socket.io Parte 3](/hands-on-socket-io-parte-3)\n\n[Javascript 15 de mai. de 2017 Servidor HTTP Básico - NodeJS Primeiros Passos](/servidor-http-basico-2)\n\n[Javascript 12 de mai. de 2017 Hands-on - Socket.io Parte 2](/socket-io-parte2)\n\n[Javascript 11 de mai. de 2017 Low-DB - Banco de dados para NodeJS baseado em JSON](/low-db)\n\n[Javascript 11 de mai. de 2017 Comunicação em tempo-real com Node e Socket.io](/socket-io-parte1)\n\n[Anterior](/tag/javascript/9)10 / 16[Próxima](/tag/javascript/11)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "socket",
        "nodejs",
        "como",
        "hands",
        "para",
        "reactjs",
        "dados",
        "extra"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/10"
      }
    },
    {
      "id": "05348f75fd352cea",
      "url": "https://devpleno.com/arvore-binaria",
      "title": "Árvore Binária em JavaScript - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Árvore Binária em JavaScript\n\nT\nPor Tulio Faria • 3 de julho de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nContinuando o assunto sobre alguns algoritmos que utilizamos em computação em geral, neste port falaremos sobre árvore binária, uma estrutura de dados que me fascina bastante pela versatilidade.\n\nEntão vamos implementar uma árvore, ainda não será uma árvore de busca, e vamos fazer o algoritmo base para navegar nessa árvore porque envolve recursividade. Por definição, a árvore binária tem o nó da esquerda, direita e o valor no elemento:\n\nlet arvore = {\nleft: undefined,\nright: undefined,\nvalue: 10\n}\nA regra de navegação que temos na árvore é baseada em como a gente passa nesses nós. Então vamos criar, por exemplo, uma função que chamamos de pré order. Ela imprime o valor, vai para a esquerda e depois para a direita.\n\nfunction preOrder(tree) {\nconsole.log(tree.value)\n\npreOrder(tree.left)\npreOrder(tree.right)\n}\nPerceba que passamos a tree recursivamente para o lado esquerdo e em seguida para o direito.\n\n**Por que ele se chama preOrder?**\n\nPorque ele vem primeiro de tudo. Por isso ele é diferente o inOrder e o poOrder que vem no meio e no final da navegação respectivamente. Podemos checar se o ‘preOrder(tree.left)’ e o ‘preOrder(tree.right)’ são vazios por exemplo:\n\nfunction preOrder(tree) {\nconsole.log(tree.value)\n\ntree.left &#x26;&#x26; preOrder(tree.left)\ntree.right &#x26;&#x26; preOrder(tree.right)\n}\n\nconsole.log('preOrder')\n\npreOrder(arvore)\nSe ele é um dos valores que é convertido para verdadeiro, consequentemente, tem algo dentro, então ele vai navegar para o lado esquerdo. Se acontecer o mesmo depois, ele navegará para o lado direito. Ao somar o preOrder e passar a árvore, ele imprime o valor 10.\n\nVamos colocar algum valor do lado esquerdo:",
      "description": "Continuando o assunto sobre alguns algoritmos que utilizamos em computação em geral, neste port falaremos sobre árvore binária, uma estrutura de dados que ...",
      "keywords": [
        "para",
        "tree",
        "preorder",
        "left",
        "right",
        "rvore",
        "inorder",
        "esquerda",
        "direita",
        "value"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/arvore-binaria"
      }
    },
    {
      "id": "053b3b5eb719d236",
      "url": "https://devpleno.com/claude-code-otimizacao-arquivos",
      "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente - DevPleno (Part 4)",
      "content": "[](https://twitter.com/intent/tweet?text=Como%20Usar%20o%20Claude%20Code%20Para%20Otimizar%20Seus%20Arquivos%20Automaticamente&url=https%3A%2F%2Fdevpleno.com%2Fclaude-code-otimizacao-arquivos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fclaude-code-otimizacao-arquivos)",
      "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
      "keywords": [
        "code",
        "claude",
        "otimiza",
        "para",
        "ferramenta",
        "como",
        "arquivos",
        "imagens",
        "projeto",
        "pngs"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/claude-code-otimizacao-arquivos"
      }
    },
    {
      "id": "054066100a266f2f",
      "url": "https://devpleno.com/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica",
      "title": "Por que fazer um curso de programação voltado para a prática? - DevPleno (Part 4)",
      "content": "Outra coisa importante são os padrões de projeto. Atualmente é muito utilizado o padrão MVC – Model View Controller para programação web. Nesse modelo, o desenvolvimento das camadas de banco de dados, interface, e do código que faz o meio de campo entre eles é claramente dividido. Há outros padrões como MMVC, MVP.\n\nSaber onde são encontradas bibliotecas, usar padrões de projetos e ferramentas para gerenciamento diminui o tempo para entrega e aumenta a performance. Isso melhora o relacionamento com o cliente, como veremos a seguir.\n\n## Para saber lidar com as necessidades dos clientes\n\nQuem desenvolve profissionalmente sabe como é lidar com as expectativas e, muitas vezes, despreparo do cliente para lidar com a criação de um projeto. Normalmente o programador tem que se virar para que possa, [com prazos e orçamentos apertados](https://www.devpleno.com/precificacao-em-software?utm_source=blog&#x26;utm_campaign=rc_blogpost), entregar projetos grandes.\n\nHá também aquelas mudanças que são solicitadas logo que o sistema é pronto. É comum que o programador tenha inclusive que informar ao cliente o que o próprio cliente quer.\n\nAssim, é importante que ao aprender a desenvolver receba orientações a respeito de como entregar o sistema em partes, apresentando versões mais simplificadas do sistema, com versões até a entrega do produto final. Isso aumenta a satisfação do cliente pois a chance de frustração cai e, consequentemente, aumenta-se o seu engajamento e o seu entendimento a respeito do que está sendo feito.\n\n## Para aumentar a qualidade do projeto\n\nAlém da questão da produtividade, para que um projeto seja bem-sucedido, ele não pode apresentar bugs ou desalinhamento em relação aos requisitos de negócio.\n\nExistem várias ferramentas gratuitas que podem ser encontradas na web que ajudam o desenvolvedor a debugar o sistema e, em um curso voltado para a prática, certamente haverá o contato com soluções assim.",
      "description": "A área de tecnologia da informação oferece muitas oportunidades e, para aproveitálas, o profissional deve se preparar continuamente. Para tanto, o desenvol...",
      "keywords": [
        "para",
        "como",
        "projeto",
        "https",
        "source",
        "blog",
        "campaign",
        "blogpost",
        "mais",
        "desenvolvimento"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica"
      }
    },
    {
      "id": "05a1b4a83f6fa847",
      "url": "https://devpleno.com/fsl-materialdeapoio",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /fsl-materialdeapoio to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "materialdeapoio"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsl-materialdeapoio"
      }
    },
    {
      "id": "05ece2fd50223b7b",
      "url": "https://devpleno.com/precificacao-de-softwares-voce-sabe-como-fazer",
      "title": "Precificação de softwares: você sabe como fazer? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Precificação de softwares: você sabe como fazer?\n\nT\nPor Tulio Faria • 28 de junho de 2017\n\n[Carreira](/tag/carreira)\n\nUm dos desafios de quem trabalha na área de tecnologia, especificamente em desenvolvimento de programas, é a precificação de softwares. Por envolver ativos imateriais, virtuais, esse processo acaba suscitando dúvidas no profissional ou na empresa desenvolvedora, que pode acabar por subestimar ou superestimar os valores.\n\nPara evitar a definição equivocada de preços que podem espantar clientes ou serem insuficientes para remunerar o trabalho envolvido, é importante ficar atento aos recursos e conhecimentos envolvidos no processo. Aliás, tais pontos são até comuns de serem avaliados em outros setores que envolvem serviços e produtos físicos, embora nem sempre sejam aplicados de maneira adequada na hora de [cobrar por software](https://www.devpleno.com/como-cobrar-por-software?utm_source=blog&#x26;utm_campaign=rc_blogpost).\n\nPortanto, se você quer saber o que considerar nesse processo, continue lendo e veja nossas dicas!\n\n## Como precificar um software?\n\nÉ importante precificar um software de modo inteligente, buscando valorizar o trabalho empregado mas sem perder o foco num valor atrativo, pois é necessário estar atento aos concorrentes e o mercado em geral.\n\nÉ preciso levar em consideração os custos fixos e os variáveis, bem como o valor necessário em cada projeto para a delimitação do seu salário. Também é indicado incluir uma porcentagem para a definição do seu lucro e de uma quantia caso deseje contratar um profissional para complementar o seu trabalho. Além disso, é vital acrescentar uma quantia para o pagamento de tributos, especialmente o Imposto de Renda (IR).",
      "description": "Um dos desafios de quem trabalha na área de tecnologia, especificamente em desenvolvimento de programas, é a precificação de softwares. Por envolver ativos...",
      "keywords": [
        "para",
        "como",
        "software",
        "valor",
        "mais",
        "ncia",
        "hora",
        "tamb",
        "seus",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/precificacao-de-softwares-voce-sabe-como-fazer"
      }
    },
    {
      "id": "05fa1fa5d9040c34",
      "url": "https://devpleno.com/blog/hands-on-readline/index",
      "title": "Hands-on: Readline (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "readline",
        "line",
        "console",
        "fazer",
        "podemos",
        "isso",
        "nome",
        "embed",
        "algo",
        "para"
      ],
      "metadata": {
        "title": "Hands-on: Readline",
        "date": "2017-05-08",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Readline2.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-readline/index.md"
      }
    },
    {
      "id": "0611936b107a5e73",
      "url": "https://devpleno.com/blog/seja-o-motorista-da-sua-vida/index",
      "title": "Você é passageiro ou motorista da sua vida? (Part 2)",
      "content": "Deixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "mais",
        "motorista",
        "vida",
        "quer",
        "fora",
        "embed",
        "sentido",
        "pelo",
        "coisas"
      ],
      "metadata": {
        "title": "Você é passageiro ou motorista da sua vida?",
        "date": "2017-08-09",
        "tags": "['Carreira']",
        "thumbnail": "MotoristaDaVida.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/seja-o-motorista-da-sua-vida/index.md"
      }
    },
    {
      "id": "06326d824ae65558",
      "url": "https://devpleno.com/find",
      "title": "High-order Function Find - DevPleno (Part 1)",
      "content": "Javascript\n\n## High-order Function Find\n\nT\nPor Tulio Faria • 2 de agosto de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nJá falamos sobre [map](https://www.devpleno.com/map/), [reduce](https://www.devpleno.com/reduce/) e [filter](https://www.devpleno.com/filter), hoje vou mostrar uma [high-order function](https://www.devpleno.com/high-order-functions/) bem parecida chamada de find. Vamos aproveitar o exemplo do reduce:\n\nconst carrinho = [{ id: 1, preco: 2, qtd: 2, estoque: 10 },\n{ id: 1, preco: 3, qtd: 5, estoque: 2 }]\n\nconst subtotal = (item) => item.preço * item.qtd\n\nconst filtroEmEstoque = (item) => item.estoque * item.qtd\n\nconst soma = (soma, subtotal) => subtotal + soma\n\nconst total = carrinho.filter(filtroEmEstoque).map(subtotal).reduce(soma, 0)\n\nconst produtoId1 = (item) => item.id === 1\n\nconst produtoId1Retorno = carrinho.find(produtoId1)\n\nconsole.log(produtoId1Retorno)\nPerceba que pedimos o produto com o id 1, mandamos procurar com o find no carrinho e buscamos esse ID 1. Uma coisa interessante e comum é fazermos como fizemos em cima, até meu filtro ser uma variável e apenas fazermos o retorno. Agora imaginem que a gente queira parametrizar ainda mais, um conceito bem legal é a seguinte:\n\nconst idEquals = (id, item) => item.id === id\n\nconst idEquals1 = carrinho.find(produtoId1)\n\nconsole.log(produtoId1Retorno)\nPerceba que eu fiz uma arrow function e nela estou passando o ID com o item que estou iterando. Quando for criar mais filtros, posso usar essa função de idEquals e fixar quem eu quero nesse primeiro parâmetro.\n\nconst idEquals = (id, item) => item.id === id\n\nconst idEquals1 = idEquals.bind(null, 1)\n\nconst idEquals1 = carrinho.find(produtoId1)\n\nconsole.log(produtoId1Retorno)\nEssa nova função que eu criei sempre terá um do ID fixo, então quando eu fizer:",
      "description": "Já falamos sobre map, reduce e filter, hoje vou mostrar uma highorder function bem parecida chamada de find. Vamos aproveitar o exemplo do reduce: Perceba ...",
      "keywords": [
        "item",
        "const",
        "https",
        "find",
        "carrinho",
        "devpleno",
        "mais",
        "high",
        "order",
        "reduce"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/find"
      }
    },
    {
      "id": "0644cb97cc597f77",
      "url": "https://devpleno.com/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript",
      "title": "Verificando o tempo para executar um trecho de código em Javascript - DevPleno (Part 1)",
      "content": "Javascript\n\n## Verificando o tempo para executar um trecho de código em Javascript\n\nT\nPor Tulio Faria • 1 de fevereiro de 2017\n\n[Javascript](/tag/javascript)\n\nUma tarefa que venho executando bastante nos últimos dias, principalmente por participar de alguns processos de seleção para projetos é em relação a performance de um trecho de código. Em muitas destas entrevistas, fui questionado sobre a complexidade de minha solução utilizando a notação big-o (sim, aquela que gera algo como O(n) ou O(n²) para uma dada complexidade - iremos falar mais sobre isso em outros posts). Fora do mundo acadêmico (ou destes testes), eu prefiro checar a complexidade através do tempo de execução de um trecho de código. Então, a ideia é a seguinte:\n\n- salvamos a data/hora atual\n\n- executamos o trecho de código\n\n- pegamos a data/hora atual e subtraímos o valor encontrado no item 1.\n\nSimples né? Vamos fazer agora em Javascritp:\n\nconst inicio = new Date().getTime()\n// trecho de código que queremos mensurar\nconst total = new Date().getTime() - inicio\nconsole.log('Foi executado em: ', total)\nO interessante é que em Javascript já temos uma maneira mais específica de fazer isso. Bastando apenas chamar console.time(“nome do timer”) no início, e console.endTime(“nome do timer”) no fim da execução. O código ficaria assim:",
      "description": "Uma tarefa que venho executando bastante nos últimos dias, principalmente por participar de alguns processos de seleção para projetos é em relação a perfor...",
      "keywords": [
        "trecho",
        "digo",
        "para",
        "javascript",
        "console",
        "tempo",
        "https",
        "executar",
        "execu",
        "complexidade"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript"
      }
    },
    {
      "id": "0647d5e61597e0f9",
      "url": "https://devpleno.com/blog/hands-on-readline/index",
      "title": "Hands-on: Readline (Part 1)",
      "content": "Neste post vamos fazer um hands-on é de um módulo padrão com o core do node: o readline.\n\n**O que temos que fazer?**\n\nVamos importar primeiro o readline e instanciar um novo readline.\n\n```jsx\nconst readline = require('readline')\nconst rl = readline.createInterface({\n  input: process.stdin,\n  output: process.stout\n})\n```\n\nComo o readline é um modulo que permite que lidemos com entrada e saída, podemos atrelar um readable stream no input e output padrão.\n\n**Pra que serve isso?**\n\nPodemos construir várias 'ferramentinhas' com o readline, a principal delas é a seguinte:\n\n```jsx\nrl.on('line', (line)==>{\n    console.log('line >>', line)\n})\n```\n\nE toda vez que eu digitar algo, ele irá retornar o que escrevi adicionando o que esta no line. Mas não é só isso. Podemos saber, por exemplo, se o usuário apertou Ctrl+C para fechar o prompt:\n\n```jsx\nrl.on('line', (line)==>{\n    console.log('line >>', line)\n})\nrl.on('SIGINT', () => {\n    console.log('bye'),\n    rl.pause()\n})\n```\n\nAo fazer isso, quando o usuário apertar Ctrl+C ele irá escrever 'bye' e irá sair, isso acontece, pois estamos chamando o rl.pause() já que estamos pausando e não pegando mais nada do stdin.\n\nPodemos criar várias formas de interação, vou dar mais um exemplo prático.\n\n```js\nrl.question('qual o seu nome?', (nome) => {\n  console.log('prazer ', nome)\n})\n```\n\nRodando o node, a pergunta irá aparecer e ao escrever o console.log vai ser retorndado: prazer mais o nome que você digitou.\n\nEm Java, temos algo bem semelhante. Conseguimos dar o readline no stream e ele devolve a linha digitada pelo usuário.\n\n**Conclusão**\n\nApenas com o realine já é possível construir uma ferramenta simples como ler dois arquivos e fazer algo apenas utilizando puramente o rl.on e o rl.question.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ebFK_aSxo2Y\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "readline",
        "line",
        "console",
        "fazer",
        "podemos",
        "isso",
        "nome",
        "embed",
        "algo",
        "para"
      ],
      "metadata": {
        "title": "Hands-on: Readline",
        "date": "2017-05-08",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Readline2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-readline/index.md"
      }
    },
    {
      "id": "0669e3a3aba87a24",
      "url": "https://devpleno.com/blog/closure-poo-para-js/index",
      "title": "Closure Série - POO para JS (Part 2)",
      "content": "Temos um contador que está usando todas as variáveis do lado de fora e temos um contador separado. Perceba que o setInterval está usando as variáveis de fora, isso cria um enclausuramento dessas variáveis. Outra coisa importante: esse código é assíncrono, então sempre que chamamos o setInterval, colocamos isso no event loop.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Iyp4F5TRjU8\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "function",
        "func1",
        "const",
        "name",
        "func1b",
        "isso",
        "vari",
        "esse",
        "contador",
        "embed"
      ],
      "metadata": {
        "title": "Closure Série - POO para JS",
        "date": "2017-11-07",
        "tags": "['Javascript']",
        "thumbnail": "CLOSURE-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/closure-poo-para-js/index.md"
      }
    },
    {
      "id": "06d62e3e03529c77",
      "url": "https://devpleno.com/blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! (Part 4)",
      "content": "Um conceito muito importante no momento de fazer um negócio decolar é o de [Valuation](https://endeavor.org.br/valuation-como-calcular-o-valor-da-sua-empresa?utm_source=blog&utm_campaign=rc_blogpost) (Valor). A partir dele, é possível calcular quanto vale o seu trabalho, se você for o empreendedor. Se você for o funcionário, esse valor já vem preestabelecido no momento da contratação.\n\nEssa questão é um pouco subjetiva, mas o que deve ter em mente é que quanto mais valoriza o que faz, mais as pessoas veem isso e estão dispostas a pagar pelo preço que você considera justo.\n\nTrabalhar a preços irrisórios só para conseguir clientes é, muitas vezes, um tiro no pé. Você se sente explorado e desmotivado no desempenho de suas funções, pois sabe que vale mais e o cliente pode exigir muito mais por isso. Dessa forma, é muito importante [aprender a dizer não](https://www.devpleno.com/aprenda-a-dizer-nao?utm_source=blog&utm_campaign=rc_blogpost) e buscar as condições que condizem com sua real capacidade.\n\nA partir desses questionamentos, certamente, você vai conseguir entender melhor se a decisão de abrir uma empresa é realmente a melhor para sua vida!\n\nPor falar em empreendedorismo, você pode gostar destes nossos 2 vídeos:\n\n- [3 dicas para empreender em software](https://www.youtube.com/watch?v=A5RgxkpJIrA&utm_source=blog&utm_campaign=rc_blogpost)\n- [Como negociar software (ou qualquer outra coisa)](https://www.youtube.com/watch?v=FszhDTUw2E0&utm_source=blog&utm_campaign=rc_blogpost)\n\nSe você gostou do conteúdo e deseja estar sempre atualizado com dicas e cursos para empreender como programador, [curta a nossa página no Facebook](https://www.facebook.com/devpleno?utm_source=blog&utm_campaign=rc_blogpost) e não fique de fora das novidades!",
      "keywords": [
        "para",
        "isso",
        "como",
        "muito",
        "empresa",
        "pode",
        "mais",
        "melhor",
        "https",
        "source"
      ],
      "metadata": {
        "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão!",
        "date": "2017-08-12",
        "tags": "['Carreira']",
        "thumbnail": "TrabalharOuEmpreender.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index.md"
      }
    },
    {
      "id": "0791c313e0177582",
      "url": "https://devpleno.com/blog/por-que-todo-dev-usa-mac/index",
      "title": "Por que todo Dev usa Mac? (Part 2)",
      "content": "Outro ponto muito importante é que existem muitos aplicativos exclusivos para Mac e outros exclusivos para Windows. Existe, por exemplo, um aplicativo chamado Sketch que te ajuda a criar um layout, esboçar o aplicativo, como um photoshop misturado com illustrator para criar interfaces, e ele existe apenas no Mac.\n\nMas no final das contas isso não importa muito, afinal eu programei minha vida inteira em Windows e não há vergonha nenhuma nisso. Minha mudança foi por causa da performance que eu precisava no Mac. Se algo está te atrasando, você deve mudar, não é natural gastar muito tempo por conta da sua máquina.\n\nCaso você ande com um notebook para cima e para baixo, o Mac te da a sensação de ser mais 'parrudo', é a única coisa que é MUITO diferente de um DELL, por exemplo. O Mac é melhor acabado. O maior empecilho é que no Brasil você terá que investir por volta de R$18.000,00 para ter um Mac, a não ser que você peça para alguém trazer do exterior, como foi o meu caso. :)\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "muito",
        "como",
        "poss",
        "isso",
        "quina",
        "aplicativos",
        "windows",
        "aplicativo",
        "algumas"
      ],
      "metadata": {
        "title": "Por que todo Dev usa Mac?",
        "date": "2017-05-15",
        "tags": "['Carreira']",
        "thumbnail": "TodoDevMac.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/por-que-todo-dev-usa-mac/index.md"
      }
    },
    {
      "id": "07b12c9ba48b6e04",
      "url": "https://devpleno.com/confira-4-dicas-de-ux-para-programadores",
      "title": "Confira 4 dicas de UX para programadores - DevPleno (Part 1)",
      "content": "Carreira\n\n## Confira 4 dicas de UX para programadores\n\nT\nPor Tulio Faria • 6 de outubro de 2017\n\n*\n\n[Carreira](/tag/carreira)\n\nVocê já tentou usar um aplicativo e desistiu porque não conseguia encontrar as informações corretas ou um botão não funcionava por não ser responsivo para celular? Em quanto tempo você desistiu? Você voltaria a usar essa marca ou indicaria para os seus amigos?\n\nNão é segredo que os consumidores estão cada vez mais exigentes, principalmente quando falamos dos mais jovens e conectados. A quantidade de opções faz com que o cliente deseje mais do que o básico; ele quer produtos simples de usar, intuitivos e que entregam mais do que prometem.\n\nNesse contexto, o termo UX (Experiência do Usuário) tem se destacado como um dos objetivos centrais que direcionam os produtos para atender a esse novo público. As empresas cada vez mais criam seus produtos para oferecer uma experiência completa para os clientes, a fim de conquistá-los e fidelizá-los.\n\nSe você é programador, deve estar se perguntando:mas o que eu tenho com isso? Eu só desenvolvo o produto, não sou responsável pela experiência.*\n\nÉ exatamente aí que você está enganado. Hoje,[profissionais completos](https://www.devpleno.com/desenvolvedor-full-stack-o-que-e-e-como-se-tornar?utm_source=blog&#x26;utm_campaign=rc_blogpost) de TI possuem pelo menos noções básicas de UX e as usam para entregar plataformas mais eficientes, que colaboram para uma boa experiência do usuário. Afinal, você contribui para criar um produto que pode ou não fornecer uma experiência única para os clientes.\n\nPensando nisso, reunimos todas as informações e dicas de UX, para que você seja um profissional mais completo e atinja suas [metas](https://www.devpleno.com/metas-na-carreira-de-desenvolvedor?utm_source=blog&#x26;utm_campaign=rc_blogpost). Vamos lá?\n\n## O que é UX?",
      "description": "Você já tentou usar um aplicativo e desistiu porque não conseguia encontrar as informações corretas ou um botão não funcionava por não ser responsivo para ...",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "https",
        "produto",
        "dicas",
        "informa",
        "source"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/confira-4-dicas-de-ux-para-programadores"
      }
    },
    {
      "id": "07b29f10f2b8ac10",
      "url": "https://devpleno.com/blog/comprometimento-com-suas-metas/index",
      "title": "Comprometimento com as suas metas (Part 1)",
      "content": "Hoje vamos tratar de um ponto muito importante para toda a carreira: o comprometimento com as suas metas. Quais são as suas? Aprender uma linguagem de programação por ano? Fazer algo diferente envolvendo tecnologia? Todos nós devemos definir metas para que a carreira evolua, afinal você define uma e então consegue conquistas novas cada vez mais.\n\nO mais importante após definir a meta é o quanto você está comprometido com ela. Para contextualizar, lembro que nas olimpíadas de 96 eu tinha 11 anos de idade e naquela época não existia a internet como ela é hoje (não existia Wikipedia nem nada do tipo) e uma tínhamos que fazer um trabalho na escola sobre as olimpíadas. Todo mundo procurava na enciclopédia e escrevia o que tinha lá, então no mínimo 4 anos atrasado porque ela não estava atualizada para os jogos da época. Eu coloquei uma meta para mim mesmo: além de colocar o conteúdo da enciclopédia, eu iria colocar também todos os países que participariam dos jogos e escrever algo sobre cada um deles.\n\nComecei a procurar como implementar essa meta, então decidi gravar em um vídeo cassete e descobri uma função nele que gravava por várias horas, com isso, gravei a abertura inteira, já que antigamente as aberturas demoravam horas e horas. Como eu era criança e sabia da minha limitação de não conseguir ficar acordado até tarde, defini que iria gravar.",
      "keywords": [
        "para",
        "meta",
        "como",
        "ponto",
        "embed",
        "hoje",
        "muito",
        "importante",
        "fazer",
        "mais"
      ],
      "metadata": {
        "title": "Comprometimento com as suas metas",
        "date": "2017-07-19",
        "tags": "['Carreira']",
        "thumbnail": "COMPROMETIMENTO-COM-SUAS-METAS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/comprometimento-com-suas-metas/index.md"
      }
    },
    {
      "id": "07bb3ec9cda3a091",
      "url": "https://devpleno.com/evite-o-this-em-js",
      "title": "Evite o this em JavaScript - DevPleno (Part 1)",
      "content": "Javascript\n\n## Evite o this em JavaScript\n\nT\nPor Tulio Faria • 3 de julho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nVenho programando cada vez mais de forma funcional e muitas coisas que víamos com preconceito começamos a entender o porque faz sentido ser da forma que é. Toda vez que você for pensar em utilizar o ‘this’ em JavaScript pense 10 vezes antes, porque toda vez que tem um ‘this’ você tem um estado interno nesse componente ou classe caso fossemos utilizar ES6.\n\n**Qual o problema disso?** Se eu estou utilizando o ‘this’, naturalmente esse método já não é mais puro.\n\n**O que é uma função pura?** É uma função que depende exclusivamente da entrada dela para ter um retorno. Então, ao utilizar o this dentro do seu componente, pense melhor, pois ele não é funcional e isso vai atrapalhar o seus testes. Por exemplo, podemos utilizar o exemplo que fizemos anteriormente do [React recursivo](https://www.devpleno.com/renderizar-estruturas-em-formato-de-arvore/), que fizemos utilizando uma functional stateless component, ou seja, um componente em React, que é uma closer. No exemplo, foi criado com uma arrow function e retorna JSX, nela eu não tenho ‘this’ e sim o contexto onde posso guardar algumas variáveis.\n\nconst Node = (props) => {\nreturn (\n&#x3C;span>\n{props.node.l &#x26;&#x26; props.node.r &#x26;&#x26; &#x3C;span>(&#x3C;/span>}\n\n{props.node.l &#x26;&#x26; &#x3C;Node node={props.node.l} />}\n\n{props.node.v}\n\n{props.node.l &#x26;&#x26; props.node.r &#x26;&#x26; &#x3C;span>)&#x3C;/span>}\n&#x3C;/span>\n)\n}\nCom isso, é possível saber qual o resultado esperado, ou seja, consigo testar esse componente de uma forma muito melhor. Prefira sempre utilizar uma closer, arrow function ou functional stateless component onde não se tem o ‘this’.\n\nUma coisa interessante é que quando você começa a ficar mais ciente para isso, naturalmente, no caso do React, você começa a construir os componentes dessa forma e evita alguns deslizes.",
      "description": "Venho programando cada vez mais de forma funcional e muitas coisas que víamos com preconceito começamos a entender o porque faz sentido ser da forma que é....",
      "keywords": [
        "this",
        "node",
        "props",
        "https",
        "utilizar",
        "componente",
        "span",
        "javascript",
        "mais",
        "forma"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/evite-o-this-em-js"
      }
    },
    {
      "id": "07d9d40d37b46128",
      "url": "https://devpleno.com/entrevista-carlos-drury-e-thiago-coelho",
      "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho - DevPleno (Part 4)",
      "content": "Compartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=DevPleno%20Entrevista%20-%20Carlos%20Drury%20e%20Thiago%20Coelho&url=https%3A%2F%2Fdevpleno.com%2Fentrevista-carlos-drury-e-thiago-coelho) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fentrevista-carlos-drury-e-thiago-coelho)",
      "description": "Carlos Drury e Thiago Coelho fazem parte do GDG Vale da Eletrônica. Essa entrevista aconteceu durante um evento organizado por eles no Vale da Eletrônica, ...",
      "keywords": [
        "para",
        "carlos",
        "ingl",
        "drury",
        "thiago",
        "carreira",
        "grande",
        "muito",
        "https",
        "coelho"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/entrevista-carlos-drury-e-thiago-coelho"
      }
    },
    {
      "id": "0871d0002557c574",
      "url": "https://devpleno.com/hands-on-jest",
      "title": "Jest - Como utilizar a ferramenta de testes criada pelo Facebook - DevPleno (Part 1)",
      "content": "Javascript\n\n## Jest - Como utilizar a ferramenta de testes criada pelo Facebook\n\nT\nPor Tulio Faria • 8 de julho de 2017\n\n[Javascript](/tag/javascript)\n\nO Jest foi criado pelo Facebook com o objetivo de rodar os testes de uma maneira eficiente e com menos configurações.\n\nAqui eu já tenho um diretório para o nosso teste chamado jest-handson, então vou rodar:\n\nyarn add jest --dev\nVamos colocar como dependência de desenvolvimento, que é o que precisamos realmente e o yarn já vai resolver até mesmo a questão de criar um package.json.\n\nDentro do Package.json tem o código:\n\n{\n\"devDependencies\": {\n\"jest\": \"^19.0.2\"\n}\n}\nE vamos adicionar:\n\n{\n\"devDependencies\": {\n\"jest\": \"^19.0.2\"\n},\n\"scripts\":{\n\"test\": \"jest\"\n}\n}\nSe rodarmos o yarn test agora, ele já sabe como rodar e retornou que não temos nenhum teste para rodar.\n\nEntão vamos criar um módulo chamado modulo1 para testarmos:\n\nconst modulo1 = {\nfunc1: (a) => a + 1\n}\nmodule.exports = modulo1\nUma coisa que acho muito interessante de fazer com os testes é criá-los juntos com a implementação, por exemplo, modulo1.js e modulo1.test.js. Até os testes ficam mais fáceis porque não é preciso navegar nos diretórios quando salvá-lo na mesma pasta do módulo. Dentro do modulo1.test, vamos importar o modulo1:\n\nconst modulo1 = require('./modulo1')\ndescribe('basic features', () => {\nit('should return the right value', () => {\nexpect(modulo1.func1(10)).toBe(11)\n})\n})\nPerceba que o Jest tem as mesmas de outros test runners, como por exemplo, criar uma switch test e dentro usar um it. Vamos passar 10 e ele deve retornar o valor 11. Ao rodar o yarn, ele organiza dizendo que os testes deram certo. Lembrando que é sempre bom fazer o teste falhar, colocando 12, por exemplo, no lugar do 11, e rodar para ver se o teste em si está funcionando.\n\nAgora imagine que por algum motivo no local de ‘a’ deve rodar uma função em específico, vamos supor uma função 2:",
      "description": "O Jest foi criado pelo Facebook com o objetivo de rodar os testes de uma maneira eficiente e com menos configurações. Aqui eu já tenho um diretório para o ...",
      "keywords": [
        "modulo1",
        "jest",
        "para",
        "rodar",
        "vamos",
        "test",
        "https",
        "testes",
        "const",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-on-jest"
      }
    },
    {
      "id": "08c84ead292d34d0",
      "url": "https://devpleno.com/mundo-de-abundancia",
      "title": "Sobreviver em um mundo de abundância - DevPleno (Part 1)",
      "content": "Carreira\n\n## Sobreviver em um mundo de abundância\n\nT\nPor Tulio Faria • 7 de novembro de 2017\n\n[Carreira](/tag/carreira)\n\nHoje eu gostaria de compartilhar uma lição que a minha mãe sempre falava pra mim quando estava em um momento de decidir algo em minha carreira.\n\nEla sempre falava de uma maneira bastante simples que as coisas podem ser melhores no futuro. Toda vez que eu vejo uma oportunidade, lembro disso. Vou contar uma história para vocês entenderem melhor.\n\nEu estava para decidir se eu iria trabalhar em uma empresa ou não, meu cenário na época era fazer faculdade de manhã e dar aula a noite, então eu tinha a tarde livre. Então eu recebi uma oferta de trabalho para ganhar mais ou menos 3 ou 4 vezes mais, porém trabalhando de manhã e à tarde, tendo que mudar meu horário da faculdade para noite. Estava nesse dilema e resolvi perguntar para minha mãe, ela disse o seguinte:\n\n“Você já está no terceiro ano de faculdade e já está aparecendo oportunidades como essa, se você continuar como está, vai poder se dedicar mais à faculdade para que, no futuro, quando você se formar, oportunidades ainda melhores apareçam.”\n\nIsso é uma visão que hoje eu vejo como uma visão de abundância. Se encararmos que a oportunidade que temos é única, não vamos evoluir nunca. Ela pode ser uma boa oportunidade, mas eu posso ter outras. Vivemos em um mundo de abundância de conhecimento e existe fartura.\n\nDepois que eu fiz isso, fiquei muito apertado financeiramente e você comecei a pensar na decisão que fiz de não aceitar a oportunidade, então minha mãe também me disse para não olhar mais para trás. Ela estava certa mais uma vez. Quando se toma uma decisão, é importante que não ficar se questionando sobre como poderia ter sido caso tivesse feito uma escolha diferente. Pense nisso.\n\nConfira o video:",
      "description": "Hoje eu gostaria de compartilhar uma lição que a minha mãe sempre falava pra mim quando estava em um momento de decidir algo em minha carreira. Ela sempre ...",
      "keywords": [
        "para",
        "https",
        "mais",
        "carreira",
        "minha",
        "estava",
        "oportunidade",
        "faculdade",
        "como",
        "abund"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/mundo-de-abundancia"
      }
    },
    {
      "id": "08de445a8be85195",
      "url": "https://devpleno.com/blog/claude-code-otimizacao-arquivos/index",
      "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente (Part 3)",
      "content": "Se você quer ir além e aprender a usar o Claude Code como ferramenta principal no seu fluxo de desenvolvimento, temos um curso bônus sobre IA e Claude Code dentro do **The Best Stack**. Lá você aprende na prática como integrar IA no seu dia a dia como dev.\n\n**[Acesse o The Best Stack e comece agora](https://do.devpleno.com/the-best-stack)**\n\n## FAQ\n\n### O Claude Code instala ferramentas sozinho?\n\nSim. Quando o Claude Code sugere uma ferramenta como o pngquant, ele pede sua aprovação e executa a instalação via gerenciador de pacotes (brew, npm, apt, etc.). Você mantém o controle — nada roda sem seu OK.\n\n### Funciona com qualquer tipo de arquivo?\n\nO Claude Code trabalha com qualquer arquivo que tenha uma ferramenta de otimização disponível via linha de comando. Imagens, vídeos, fontes, código minificado, containers Docker — se existe uma ferramenta para isso, ele consegue sugerir e rodar.\n\n### Preciso saber usar linha de comando?\n\nNão. Esse é justamente o ponto. Você descreve o que precisa em linguagem natural — \"otimize os PNGs\", \"reduza o tamanho do bundle\", \"comprima as imagens\" — e o Claude Code traduz isso em comandos técnicos. Ele explica o que vai fazer antes de executar.\n\n### É seguro rodar otimizações automáticas no meu projeto?\n\nSim, desde que você use Git. Crie um branch, rode a otimização, revise as mudanças no diff e só faça merge quando estiver satisfeito. É o mesmo fluxo de qualquer mudança de código.\n\n### Quanto de redução posso esperar?\n\nDepende do tipo de arquivo e do nível de otimização anterior. PNGs não otimizados costumam ter reduções de 50-80%. SVGs com código desnecessário podem cair 30-60%. O Claude Code mostra os resultados para você avaliar.",
      "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
      "keywords": [
        "claude",
        "code",
        "otimiza",
        "ferramenta",
        "type",
        "para",
        "imagens",
        "como",
        "arquivos",
        "otimizar"
      ],
      "metadata": {
        "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente",
        "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
        "date": "2026-04-05",
        "tags": "['Ferramentas']",
        "thumbnail": "feature-image.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/claude-code-otimizacao-arquivos/index.md"
      }
    },
    {
      "id": "093c548f774b573e",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-3/index",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol (Part 3)",
      "content": "Se o notify não existir, ele não vai ser enviado e eu mando zero para não notificar meus usuários. Agora está funcionando perfeitamente, se startarmos o servidor e dermos um f5, vai ser mostrado o valor enviado. Como eu tenho que dar f5 toda hora, tenho que receber no meu client a atualização que o jogo foi alterado, então vamos abrir na pasta js o arquivo match.js:\n\n```jsx\n$(function)(){\n    const socket = io();\n    socket.on('connect', function(){\n        console.log('conected');\n    })\n    socket.on('score', function(score){\n        console.log('score', score)\n    })\n})\n```\n\nPerceba que agora, ao atualizar o placar, o usuário recebe o objeto score, então precisamos checar se o jogo está na barra de cima e se é o jogo atual para atualizar na barra principal. Para isso vamos em match.ejs e na lista de jogo que fica na parte de cima, já temos um forEach que vai renderizar todos os jogos e temos para cada jogo um 'em' que tem o nome da class com uma referência para o jogo como um todo.\n\nVamos copiar esse trecho de código em negrito:\n\n```jsx\n<em class=\"match-<%- index %>-b\">\n```\n\nAgora vamos voltar para nosso match do client em js/match.js e fazer o seguinte:\n\n```jsx\n$(function)(){\n    const socket = io();\n    socket.on('connect', function(){\n        console.log('conected');\n    })\n    socket.on('score', function(score){\n        console.log('score', score)\n        //na lista de jogos\n        $(\". match-\"+score.match+\"-a\").html(score.scoreA)\n        $(\". match-\"+score.match+\"-b\").html(score.scoreb)\n    })\n})\n```\n\nPerceba que em A nós escrevemos o valor de score.scoreA e o mesmo no B. Agora temos que atualizar a parte de baixo também, então nós temos o score-team-A e o valor do score por exemplo, porém como eu vou saber se esse jogo é o que eu estou atualmente? Em match.ejs, lá no final, antes do include do footer, vamos fazer um script que define uma constante:\n\n```jsx\n<script>\nconst MATCH_INDEX = \"<%- id %>\";\n</script>\n```",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "vamos",
        "notify",
        "socket",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol",
        "date": "2017-07-07",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-3/index.md"
      }
    },
    {
      "id": "099099ad9eea39f2",
      "url": "https://devpleno.com/blog/hands-on-socket-io-parte-3/index",
      "title": "Hands-on - Socket.io Parte 3 (Part 1)",
      "content": "Nesta terceira parte sobre comunicação em tempo-real com NodeJS e Socket.io, vamos começar com algo muito interessante: como podemos agrupar usuários para o envio de notificações. Também será abordado o conceito de rooms, uma maneira de segmentar os usuários. Vamos lá?!\n\n```jsx\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\napp.get('/', (req, res)=>{\n    res.sendFile(__dirname+'/index.html')\n})\nio.on('connection', (socket)=>{\n    console.log('New connection', socket.id)\n    socket.on('msg', (msg)=>{\n        console.log(msg)\n        socket.broadcast.emit('msg', msg);\n    })\n    http.listen(3000, function(){\n        console.log('listening on port 3000')\n    })\n}\n```\n\nQuando mandamos mensagens neste nosso código, estamos emitindo para todos os usuários. Se formos criar um jogo online, chat, temos um conceito de sala ou seção de um jogo. Agora vamos imaginar o seguinte: O usuário se conecta e a partir disso vamos pegar seu Socket, que é a representação do seu ID de usuário entre em uma sala utilizando um join, no exemplo utilizado 'contador'. O join vai dizer que o usuário quer entrar na sala, ou canal, e a partir desse momento o usuário vai receber qualquer mensagem que for disparada neste canal.\n\n```jsx\n\nio.on('connection', (socket)=>{\n    console.log('New connection', socket.id)\n    socket.on('msg', (msg)=>{\n        console.log(msg)\n        socket.broadcast.emit('msg', msg);\n        socket.join('contador');\n    })\n```\n\nCom isso podemos, por exemplo, contar quantas pessoas existem na sala e emitir uma mensagem com o número de pessoas nela de tempos em tempos.\n\nVamos executar um exemplo rápido onde criamos um contador, um set interval utilizando um io.to (que é uma instância do socket.io), selecionamos a sala a qual queremos mandar a mensagem e enviaremos a mensagem a cada 1 segundo.",
      "keywords": [
        "socket",
        "para",
        "vamos",
        "sala",
        "mensagem",
        "console",
        "contador",
        "como",
        "rios",
        "http"
      ],
      "metadata": {
        "title": "Hands-on - Socket.io Parte 3",
        "date": "2017-05-15",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "HandsOnScocketIo3.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-socket-io-parte-3/index.md"
      }
    },
    {
      "id": "099e4e56edcbd9da",
      "url": "https://devpleno.com/blog/request-e-response/index",
      "title": "Request e Response (Part 2)",
      "content": "Lembrando que, quando temos um request/response, sempre temos um cabeçalho para cada. Dependendo da requisição. podemos ter o body ou não. Também há outros tipos de requisição, como é o caso do POST. Nele podemos fazer a mesma coisa, porém com uma diferença: não conseguimos fazer no mesmo nível do GET pelo navegador. Vou mostrar agora o Postman, que permite que a gente faça um POST. Vamos então fazer um POST em /users:\n\n```jsx\nvar express = require ('express');\nvar app express();\napp.post('/users', function(req,res){\n    res.send(req.headers);\n    req.on('data', function(chunk){\n        //res.send(chunk);\n    });\n});\n```\n\nVamos mandar para https://localhost:3000/users o tipo de requisição, no caso o POST, e um raw, ou seja, um texto puro.\n\n![Exemplo 5](RequestResponseEx5.png)\n\nEm Text, selecionamos JSON e ele já troca o cabeçalho de solicitação para JSON. Apertamos o Send, e a resposta que vem são os cabeçalhos do request.\n\n![Exemplo 6](RequestResponseEx6.png)\n\nNote que o content-length retornou 20 bytes, pois estou enviando 20 bytes de dados, diferente do anterior onde não estou enviando nada. Lembrando que no post eu tenho o body da minha requisição. O básico de uma aplicação WEB sempre funciona dessa forma, então o front-end faz uma request e recebe uma resposta.\n\nAssista ao vídeo da explicação:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/2Mv2ayJ3euA\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "requisi",
        "exemplo",
        "request",
        "temos",
        "para",
        "express",
        "send",
        "post",
        "https",
        "como"
      ],
      "metadata": {
        "title": "Request e Response",
        "date": "2017-05-22",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "RequestResponse.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/request-e-response/index.md"
      }
    },
    {
      "id": "09cdd5038e0befa7",
      "url": "https://devpleno.com/teclado-com-webaudioapi",
      "title": "Criando um teclado com WebAudioAPI - DevPleno (Part 3)",
      "content": "const mapOsc = {}\nfunction onKeyDown(key) {\nif (map[key.keyCode] &#x26;&#x26; !mapOsc[key.keyCode]) {\nconst osc = constext.createOscillator()\nosc.type = 'sine'\nosc.frequency.value = notes[map[key.keyCode]]\nosc.connect(contexto.destination)\nosc.start()\nmapOsc[key.keyCode] = osc\n}\n}\nfunction onKeyUp(key) {\nif (key.keyCode in mapOsc) {\nconst osc = mapOsc[key.keyCode]\nosc.stop(0)\nmapOsc[key.keyCode] = undefined\n}\n}\nAssim temos um teclado bem interessante. Além disso, utilizando a tabela de notas, podemos colocar, por exemplo, os sustenidos. Caso você queira treinar, pode transformar isso em forma visual utilizando uma imagem de teclas de piano e quando você clicar em cada uma delas, é gerado os áudios.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Criando%20um%20teclado%20com%20WebAudioAPI&url=https%3A%2F%2Fdevpleno.com%2Fteclado-com-webaudioapi) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fteclado-com-webaudioapi)",
      "description": "Hoje quero continuar falando sobre WebAudioAPI. Vamos um pouco além do que já fizemos anteriormente. No nosso arquivo HTML, teremos dois scripts com função...",
      "keywords": [
        "keycode",
        "para",
        "https",
        "onkeydown",
        "onkeyup",
        "const",
        "function",
        "window",
        "maposc",
        "webaudioapi"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/teclado-com-webaudioapi"
      }
    },
    {
      "id": "09e8c83f49c3a810",
      "url": "https://devpleno.com/stream-duplex",
      "title": "Hands-on: Streams Parte 03 - Duplex - DevPleno (Part 3)",
      "content": "Compartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Streams%20Parte%2003%20-%20Duplex&url=https%3A%2F%2Fdevpleno.com%2Fstream-duplex) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fstream-duplex)",
      "description": "Já falamos sobre Readable e Writable Streams, agora falaremos sobre o tipo Duplex. Ele nos permite tanto enviar quanto receber dados. Para testarmos este S...",
      "keywords": [
        "socket",
        "client",
        "para",
        "server",
        "data",
        "este",
        "porta",
        "duplex",
        "stream",
        "cliente"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/stream-duplex"
      }
    },
    {
      "id": "09f849893cccca36",
      "url": "https://devpleno.com/blog/promises/index",
      "title": "NodeJS Primeiros Passos - Promises (Part 1)",
      "content": "Continuando nosso assunto sobre NodeJS, vamos tratar sobre como podemos organizar o fluxo para que o código fique realmente organizado. Olhe esse exemplo:\n\n```jsx\nvar fs = require('fs')\nfs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {\n  fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {\n    fs.readFile('arquivo3.txt', arquivo1 + '\\\\n' + arquivo2, function (err) {\n      console.log('tudo certo')\n    })\n  })\n})\n```\n\nAqui faço três operações assíncronas e você pode perceber que o código vai crescendo para frente, porque os dois códigos estão dentro do callback do primeiro readFile, o terceiro está dentro do segundo e o console log está dentro do terceiro. Imagine se eu tivesse mais trechos de código assíncrono e estivesse tratando com IO, então o código iria crescendo cada vez mais para frente, deixando a manutenção muito complicada. Chamamos esse tipo de código de código hadouken. **Como podemos fazer para esse código saia dessa forma e comece a crescer para baixo?** Uma das alternativas é utilizar promises. Para isso, vamos utilizar um módulo hamado 'q'.\n\n```jsx\nnpm install q\n```\n\nNo meu caso, retornou um warning porque eu não tenho o package.json, mas como estamos apenas testando, está tudo bem. Então vamos lá:\n\n```jsx\nvar Q = require('q')\nvar fs = require('fs')\nfunction readArquivo1() {\n  fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {})\n}\nfunction readArquivo2() {\n  fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {})\n}\nfunction readArquivo3() {\n  fs.readFile('arquivo3.txt', arquivo1 + '\\\\n' + arquivo2, function (err) {})\n}\n```\n\nVamos salvar ele como com.promises.js. Apesar de estar com bastante texto, podemos perceber que o arquivo ficou mais fácil de ler. Se eu chamar esses arquivos, ele vai executar a linha 1, pular, executar a próxima e depois de um certo tempo vai executar o callback:",
      "keywords": [
        "function",
        "arquivo1",
        "deferred",
        "arquivo2",
        "readfile",
        "para",
        "arquivo",
        "digo",
        "then",
        "conteudo"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos - Promises",
        "date": "2017-06-27",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "Promises.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/promises/index.md"
      }
    },
    {
      "id": "0ab3cf96c249324f",
      "url": "https://devpleno.com/hands-on-threejs",
      "title": "Hands-on - Three.JS - DevPleno (Part 2)",
      "content": "&#x3C;html>\n&#x3C;body>\n&#x3C;script src=\"//cdnjs.cloudflare.com/ajax/libs/three.js/88/three.js\">\n&#x3C;/script>\n&#x3C;script>\nconst scene = new THREE.Scene()\nconst camera = new THREE.PerspectiveCamera(75, window.in\nnerWidth / window.innerHight, 0.1, 1000)\nconst renderer = new THREE.WebGLRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocumnet.body.appenChild(renderer.domElement)\nconst box = new THREE.BoxGeometry(1,1,1)\nconst material = new THREE.MeshBasicMaterial({ color: 0xff0000 })\nconst cube = new THREE.Mesh( box, material )\nscene.add( cube )\ncamera.position.z = 5\nconst animated = () => {\nrequestAnimationFrame( animate )\nrenderer.render( scene, camera)\n}\nanimate()\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nO renderizador pega uma câmera e renderiza a cena na câmera, com isso ele cria a imagem a partir disso.\n\nO animated fica renderizando a todo momento, então caso eu faça alguma alteração no meu objeto que está dentro da cena, vai ser atualizado na tela:\n\nconst animated = () => {\nrequestAnimationFrame(animate)\ncube.rotation.x += 0.01\ncube.rotation.y += 0.01\ncube.rotation.z += 0.01\nrenderer.render(scene, camera)\n}\nFazendo isso, nosso cubo começa a girar em todas as direções. Isso está sendo renderizado com o WebGL e 3D. Conseguimos carregar modelos 3d, etc.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%20-%20Three.JS&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-threejs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-threejs)",
      "description": "Hoje vamos falar um pouco sobre Three.JS, que é uma biblioteca muito interessante para conseguirmos fazer 3d no browser, melhor dizendo, ele faz essa compa...",
      "keywords": [
        "three",
        "const",
        "window",
        "script",
        "scene",
        "renderer",
        "body",
        "vamos",
        "isso",
        "https"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-on-threejs"
      }
    },
    {
      "id": "0b2377e18aa7eaa4",
      "url": "https://devpleno.com/blog/webaudioapi/index",
      "title": "WebAudioAPI - Gerando um som no browser (Part 2)",
      "content": "Assim já conseguimos criar um sintetizador de áudio, sem precisar de um arquivo de áudio. Podemos, por exemplo, pegar a frequência de cada nota e trabalhar em cima dela.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/H005spSyxeA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "contexto",
        "option",
        "value",
        "script",
        "vamos",
        "udio",
        "const",
        "window",
        "agora",
        "type"
      ],
      "metadata": {
        "title": "WebAudioAPI - Gerando um som no browser",
        "date": "2017-10-17",
        "tags": "['Javascript']",
        "thumbnail": "Webaudi.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/webaudioapi/index.md"
      }
    },
    {
      "id": "0b26d3207b46bd05",
      "url": "https://devpleno.com/entenda-a-importancia-de-cursos-para-desenvolvedores",
      "title": "Entenda a importância de cursos para desenvolvedores - DevPleno (Part 2)",
      "content": "Além disso, o colega do outro lado do computador pode ter uma ideia de negócio com você ou conhecer uma empresa que está contratando pessoas com seu perfil. É possível até mesmo que ele seja dono de uma empresa de informática com vagas abertas.\n\nO [network](https://www.devpleno.com/networking?utm_source=blog&#x26;utm_campaign=rc_blogpost) é essencial em qualquer área e no campo de desenvolvimento não é diferente. Quanto mais pessoas o conhecerem e souberem de suas habilidades, melhor.\n\n## Credibilidade\n\nTer credibilidade significa ser respeitado em sua área de atuação e, com o tempo e o acúmulo de conhecimentos, é possível tornar-se até mesmo uma referência. Para que isso aconteça, conviva e aprenda com quem sabe. Para isso, escolha cursos com grandes nomes da área.\n\n## Planejamento\n\nÉ imprescindível ter um plano de carreira. Comece definindo quais são seus pontos fracos e fortes. Um curso de capacitação ajudará a avaliar seu atual nível de conhecimento e compará-lo a outros profissionais da sua área. Estude para desenvolver seus pontos fracos e aprimorar os fortes.\n\n## Melhores cursos para desenvolvedores\n\nExistem algumas capacidades que todo desenvolvedor precisa ter e é nisso que você deve investir sua energia e dinheiro. As habilidades básicas sempre podem ser aprimoradas, por isso é importante não se acomodar.\n\nAlém disso, fique atento também às tendências do mercado. Identifique quais são as competências que estão em alta e escolha cursos para que possa aprendê-las.\n\nVeja algumas tendências atuais de desenvolvimento e programação:\n\n### ReactJS\n\nReactJS é uma biblioteca JavaScrips do Facebook para criar interfaces de usuários. O foco do React, ao contrário de outras bibliotecas, é a view, deixando de lado os demais componentes de uma aplicação front-end. O ReactJS estrutura a representação do HTML em objetos.",
      "description": "Você está pronto para atuar em uma grande empresa? O mercado de tecnologia está crescendo cada vez mais, e para conseguir se destacar no cenário atual, é p...",
      "keywords": [
        "para",
        "mais",
        "cursos",
        "https",
        "carreira",
        "desenvolvedores",
        "pode",
        "empresa",
        "habilidades",
        "poss"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/entenda-a-importancia-de-cursos-para-desenvolvedores"
      }
    },
    {
      "id": "0b561c15f5678afc",
      "url": "https://devpleno.com/minicurso-socket-io-parte-1",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto - DevPleno (Part 3)",
      "content": "yarn add lowdb\nEsse lowdb vai criar um banco novo onde iremos puxar os jogos de lá:\n\nvar express = require('express');\nvar router = express.Router();\n//definindo o bd\nconst low = require('lowdb')\nconst db = low(__dirname+'/../data/db.json')\nconst defaultData = require('../data/default-data.json')\ndb.defaults(defaultData).write()\n\n/\\*Get home page. \\*/\nrouter.get('/', function(req, res, next){\nres.render('index', {title: 'Express'});\n});\nmodule.exports = router;\nEstamos carregando o defaultData que tem um exemplo de jogo, com ele vamos definir para o db que o padrão dele, se não tiver nada, será o defaultData.\n\nPerceba que o db.json está vazio, mas ao darmos um yarn start ele será preenchido com as informações do defaultData.\n\nNosso próximo passo é carregar todos os jogos e enviar para nossa rota, com isso conseguimos exibir esses jogos na tela. Vamos criar um const matches. Vamos pegar do nosso db o value de matches e mandar ele para nosso view:\n\n;/\\*Get home page. \\*/\nrouter.get('/', function (req, res, next) {\nconst matches = db.get('matches').value()\nres.render('index', { matches })\n})\nmodule.exports = router\nAgora, dentro de index.js, vamos remover o title de todas as linhas de código e adicionar matches dentro do &#x3C;p>:\n\n&#x3C;p>Olá &#x3C;%= matches %>&#x3C;/p>\nPerceba que ele irá retornar dois objetos, ou seja, serão dois jogos. Agora vamos colocar o JSON.stringfy para sabermos o que está chegando realmente:\n\n&#x3C;p>Olá &#x3C;%= JSON.stringfy(matches) %>&#x3C;/p>\nEntão o jogo está funcionando perfeitamente.\n\nComo já temos nossa lista de jogos, vamos trazer nosso primeiro template. Nos arquivos de apoio, dentro de views, vou copiar o index.ejs e jogar para dentro da pasta views do projeto, substituindo o existente.",
      "description": "Essa é a primeira parte do nosso minicurso de Socket.IO. Nesta etapa, vamos começar o projeto e criar as primeiras páginas para dar o suporte à aplicação. ...",
      "keywords": [
        "vamos",
        "para",
        "dentro",
        "matches",
        "views",
        "express",
        "pasta",
        "index",
        "match",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-1"
      }
    },
    {
      "id": "0b5cc8f8d48cc0d8",
      "url": "https://devpleno.com/como-invocar-funcoes-dinamicamente-com-js",
      "title": "Como invocar funções dinamicas em JavaScript - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Como%20invocar%20fun%C3%A7%C3%B5es%20dinamicas%20em%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Fcomo-invocar-funcoes-dinamicamente-com-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-invocar-funcoes-dinamicamente-com-js)",
      "description": "Em programação, blocos de código que executam instruções específicas são chamadas de funções e, no Javascript, são conhecidas como métodos. Agora, imagine ...",
      "keywords": [
        "como",
        "console",
        "para",
        "todos",
        "valor",
        "javascript",
        "resultado",
        "https",
        "vari",
        "dinamicamente"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/como-invocar-funcoes-dinamicamente-com-js"
      }
    },
    {
      "id": "0bf2af8a4d4c120c",
      "url": "https://devpleno.com/blog/estudar-1-hora-por-dia-ou-8-horas-no-sabado/index",
      "title": "Estudar 1 hora por dia ou 8 horas no sábado? (Part 1)",
      "content": "O que é melhor, estudar 1 hora por dia ou 8 horas no fim de semana?\n\nPrimeiro depende da sua disponibilidade, se você tem 8 horas no sábado, então utilize esse tempo. Porém tudo que fazemos todos os dias acabamos tendo uma certa maestria, então se você programa todo dia, acaba programando melhor depois de 7 dias, você acaba programando melhor do que se ficar 8 horas de um sábado, que a carga horária é maior e teoricamente você está mais focado.\n\nEu acredito nisso por alguns motivos, primeiro que você cria o hábito de estudar. Quando você consegue reservar um pouquinho por dia, mesmo que seja 20 minutos, eu ainda acredito que seja melhor que juntar tudo em um sábado ou domingo.\n\nNo DevPleno, eu gero vídeo todo dia (antigamente eu gerava uma vez por semana), e uma coisa que eu percebi é que é muito mais difícil para mim sentar e gravar um vídeo por semana do que eu gravar um vídeo por dia, isso é bizarro mas é verdade, porque se eu gravo um vídeo por dia, eu gero um hábito de gravar, já se eu faço uma vez por semana, esse hábito não é tão forte. Se pensar que vai fazer algo só no fim de semana ou em um dia só, você acaba ficando mais preguiçoso e vai postergando. Fazendo todo dia, você cria esse hábito e percebe que não consegue parar mais, já fica mais fluido e assim consegue atingir mais resultados.\n\nÉ muito melhor você melhorar aos poucos do que dar saltos, por exemplos se você estudar 2 sábados seguidos, esses 5 dias que vão separar seus fins de semana vão te atrapalhar porque você vai esquecer as coisas que já estudou. Então é importante estar estudando sempre, quando você diminui o tempo, mas dilui durante sua semana melhor vai ser sua performance em aprender.",
      "description": "Descubra a melhor rotina de estudos para programadores: consistência diária ou maratonas no fim de semana? Dicas para organizar seus estudos.",
      "keywords": [
        "semana",
        "melhor",
        "mais",
        "estudar",
        "dias",
        "para",
        "horas",
        "esse",
        "todo",
        "bito"
      ],
      "metadata": {
        "title": "Estudar 1 hora por dia ou 8 horas no sábado?",
        "description": "Descubra a melhor rotina de estudos para programadores: consistência diária ou maratonas no fim de semana? Dicas para organizar seus estudos.",
        "date": "2017-07-18",
        "tags": "['Carreira']",
        "thumbnail": "ROTINA-DE-ESTUDOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/estudar-1-hora-por-dia-ou-8-horas-no-sabado/index.md"
      }
    },
    {
      "id": "0c324816cc7dc264",
      "url": "https://devpleno.com/comprometimento-com-suas-metas",
      "title": "Comprometimento com as suas metas - DevPleno (Part 1)",
      "content": "Carreira\n\n## Comprometimento com as suas metas\n\nT\nPor Tulio Faria • 19 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nHoje vamos tratar de um ponto muito importante para toda a carreira: o comprometimento com as suas metas. Quais são as suas? Aprender uma linguagem de programação por ano? Fazer algo diferente envolvendo tecnologia? Todos nós devemos definir metas para que a carreira evolua, afinal você define uma e então consegue conquistas novas cada vez mais.\n\nO mais importante após definir a meta é o quanto você está comprometido com ela. Para contextualizar, lembro que nas olimpíadas de 96 eu tinha 11 anos de idade e naquela época não existia a internet como ela é hoje (não existia Wikipedia nem nada do tipo) e uma tínhamos que fazer um trabalho na escola sobre as olimpíadas. Todo mundo procurava na enciclopédia e escrevia o que tinha lá, então no mínimo 4 anos atrasado porque ela não estava atualizada para os jogos da época. Eu coloquei uma meta para mim mesmo: além de colocar o conteúdo da enciclopédia, eu iria colocar também todos os países que participariam dos jogos e escrever algo sobre cada um deles.\n\nComecei a procurar como implementar essa meta, então decidi gravar em um vídeo cassete e descobri uma função nele que gravava por várias horas, com isso, gravei a abertura inteira, já que antigamente as aberturas demoravam horas e horas. Como eu era criança e sabia da minha limitação de não conseguir ficar acordado até tarde, defini que iria gravar.",
      "description": "Hoje vamos tratar de um ponto muito importante para toda a carreira: o comprometimento com as suas metas. Quais são as suas? Aprender uma linguagem de prog...",
      "keywords": [
        "para",
        "https",
        "carreira",
        "suas",
        "metas",
        "meta",
        "como",
        "comprometimento",
        "ponto",
        "hoje"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/comprometimento-com-suas-metas"
      }
    },
    {
      "id": "0c618201eec34b47",
      "url": "https://devpleno.com/blog/audio-com-js-puro/index",
      "title": "Tocando um Áudio com JS puro (Part 1)",
      "content": "Uma das coisas que utilizaremos na interface que vamos construir no Minicurso de Socket.io para que fique mais próximo do real são os efeitos sonoros. Por isso, essa dica é para você entender como dar play em um arquivo de áudio com JS puro, ou seja, usando somente HTML, sem usar nenhuma lib.\n\nA primeira coisa que vamos fazer é criar uma tag audio no HTML. Esse áudio vai representar um arquivo de som (lembrando que também há, em especificações mais novas, a tag vídeo, que é parecida com a tag audio, mas é um pouco mais complicada, pois temos várias 'camadas', como por exemplo vídeos específicos para celular).\n\n```jsx\n<html>\n  <head>\n    <tittle>Audio</tittle>\n  </head>\n\n  <body>\n    <h1>Audio</h1>\n\n    <audio></audio>\n  </body>\n</html>\n```\n\nNo caso do áudio, tenho um arquivo chamado clap.wav e, quando o coloco dentro da tag áudio, ele automaticamente coloca esse áudio quando a página carregar em memória.\n\nEm seguida, vamos criar um botão com o nome de Play e adicionar alguns scripts, um com uma instância desse botão e outro com um eventListener, assim, quando alguém clicar no botão vai ser ser pego esse áudio e dar um play.\n\n```jsx\n<html>\n  <head>\n    <tittle>Audio</tittle>\n  </head>\n\n  <body>\n    <h1>Audio</h1>\n\n    <audio></audio>\n    <button></button>\n\n    <script>\n      const button = document.querySelector('button')\n\n      button.addEventListener('click', function(){\n\n      cont audio = document.querySelector('audio')\n\n      audio.play\n\n      })\n    </script>\n  </body>\n</html>\n```\n\nOutra ponto interessante é que podemos começar a tocar o áudio a partir de um ponto específico,, por exemplo, aos 0.2 segundos. Para isso adicionamos apenas o código entre o querySelector e o audio.play:\n\n```jsx\naudio.currentTime = 0.1\n```\n\nDentro desse clap podemos fazer até alguns efeitos diferentes, pois à medida com que eu mexo o currentTime e dou o play, o efeito do áudio é um pouco diferente. Para fazer isso, usamos apenas o javaScript.",
      "keywords": [
        "audio",
        "udio",
        "para",
        "play",
        "html",
        "button",
        "head",
        "tittle",
        "body",
        "embed"
      ],
      "metadata": {
        "title": "Tocando um Áudio com JS puro",
        "date": "2017-05-24",
        "tags": "['Javascript']",
        "thumbnail": "AUDIO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/audio-com-js-puro/index.md"
      }
    },
    {
      "id": "0caa99d423100dbe",
      "url": "https://devpleno.com/lista-encadeada-retornar-um-item",
      "title": "Lista encadeada - Como retornar um item - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Lista%20encadeada%20-%20Como%20retornar%20um%20item&url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-retornar-um-item) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-retornar-um-item)",
      "description": "Hoje vamos continuar falando sobre algoritmos e também estrutura de dados. Vamos discutir um pouco sobre essas técnicas que aprendemos na base da computaçã...",
      "keywords": [
        "node",
        "retornar",
        "index",
        "return",
        "lista",
        "length",
        "value",
        "null",
        "ndice",
        "encadeada"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/lista-encadeada-retornar-um-item"
      }
    },
    {
      "id": "0cf1efb9ab22c1cc",
      "url": "https://devpleno.com/blog/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas/index",
      "title": "NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas",
      "content": "Neste vídeo da série NodeJS Primeiros Passou vamos conferir um módulo que nos auxilia muito no controle de operações assíncronas/async, principalmente, quando potencialmente poderão ser executadas em cascata.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Hllw7QKsJac\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "neste",
        "nodejs"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas",
        "date": "2016-08-12",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "Async.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas/index.md"
      }
    },
    {
      "id": "0d2b560b682687a1",
      "url": "https://devpleno.com/sua-carreira-pode-mudar-durante-o-carnaval",
      "title": "Sua carreira pode mudar durante o carnaval? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Sua carreira pode mudar durante o carnaval?\n\nT\nPor Tulio Faria • 1 de março de 2019\n\n[Carreira](/tag/carreira)\n\nGeralmente, acredita-se que não… Afinal de contas, carnaval, feriado, festas, bebedeira, ninguém quer se preocupar com carreira ou trabalho. Não é verdade?\n\nBom, pelo menos muita coisa mudou em minha carreira a partir de uma terça feira de carnaval. Estranho isso, né?\n\nToda essa mudança na minha carreira começou dia 9 de fev de 2016, às 14h18 - também conhecida como terça-feira de carnaval. :)\n\nSó para entender o cenário, eu já estava com alguns problemas financeiros e durante o carnaval (sem dinheiro) estava explorando formas de mudar minha carreira - pois a situação estava ficando insuportável…\n\nNeste carnaval de 2016, eu estava buscando e explorando possibilidades de negócios e realmente empenhado em dar uma mudança financeira na minha vida. Perto desta época, comecei a considerar trabalhos remotos e já havia enviado meu CV para dezenas de vagas sem ter nenhuma resposta. Mas a minha intenção já estava setada. ;)\n\nFoi quando recebi o e-mail desta foto:\n\nSim, uma pessoa que eu havia sido apresentado há 2 anos, lembrou-se de que eu poderia ajudá-la em um projeto.\n\nE apesar do e-mail estar em português, ela estava em Nova Iorque e precisava resolver um grande problema no projeto. Toda a negociação aconteceu durante a terça feira de carnaval e quarta-feira de cinzas. Ao final da quarta-feira de cinzas, eu estava contratado - com contrato assinado e tudo mais - e já tinha recebido um e-mail (em inglês) de um outro membro da equipe para falar com o CTO (eu havia sido contratado pela CEO).\n\nRelembrando este acontecimento, eu consegui desconstruir vários pontos interessantes que gostaria de compartilhar com vocês:\n\n**Network não acontece do dia para a noite!**",
      "description": "Geralmente, acreditase que não… Afinal de contas, carnaval, feriado, festas, bebedeira, ninguém quer se preocupar com carreira ou trabalho. Não é verdade? ...",
      "keywords": [
        "carreira",
        "carnaval",
        "para",
        "minha",
        "estava",
        "durante",
        "mudan",
        "feira",
        "isso",
        "havia"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/sua-carreira-pode-mudar-durante-o-carnaval"
      }
    },
    {
      "id": "0d2c6e1876efc939",
      "url": "https://devpleno.com/blog/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar/index",
      "title": "A habilidade mais importante que um programador deveria ter (e praticar) (Part 3)",
      "content": "**Maneira 4:** crie o hábito de questionar soluções trazidas por colegas de trabalho e por sua equipe. Importante você deixar claro o motivo das perguntas para não passar por \"cri-cri\" ou chato. Caso você prefira, você pode guardar as perguntas e potenciais respostas para você como uma forma de praticar esta habilidade (funciona muito bem em cenários que você - por questões hierárquicas não será ouvido - e está tudo bem).\n\n# Antes de encerrar, procure por perguntas de outras pessoas / empresas\n\nMuitas vezes consumimos conteúdos de casos de uso de uma tecnologia x. Ou como uma big tech começou a usar y. Entenda sempre as perguntas que eles fizeram até chegarem a aquelas respostas. Isso vai te ajudar a entender se é viável para todos os cenários ou somente para quando você tem um nível de escalada desta big tech.",
      "keywords": [
        "perguntas",
        "resultado",
        "para",
        "rios",
        "perguntar",
        "processo",
        "como",
        "solu",
        "muito",
        "crit"
      ],
      "metadata": {
        "title": "A habilidade mais importante que um programador deveria ter (e praticar)",
        "date": "2021-05-13",
        "tags": "['Carreira']",
        "thumbnail": "perguntas-thumb.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar/index.md"
      }
    },
    {
      "id": "0d2fa4e81d650ac0",
      "url": "https://devpleno.com/blog/como-aumentar-a-produtividade/index",
      "title": "Como aumentar a produtividade diminuindo a troca de contexto (Part 2)",
      "content": "Deixe seu comentário. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "como",
        "projetos",
        "tempo",
        "mudan",
        "forma",
        "vscode",
        "mais",
        "embed",
        "sublime",
        "isso"
      ],
      "metadata": {
        "title": "Como aumentar a produtividade diminuindo a troca de contexto",
        "date": "2017-05-23",
        "tags": "['Carreira']",
        "thumbnail": "PRODUTIVIDADE-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/como-aumentar-a-produtividade/index.md"
      }
    },
    {
      "id": "0d5302f739417644",
      "url": "https://devpleno.com/listar-arquivos-em-js",
      "title": "Listar arquivos em JS (async, await, promise e Promise.all) - DevPleno (Part 4)",
      "content": "const stats = paths.map(async (path) => await stat(path))\nconst stats = await Prmise.all(statsPromises)\nOnde concatena essas promises de volta, isso é muito importante para conseguirmos fazer esse exercício. Se você esta vendo esse exercício e não participou do Fullstack Academy, confira a gravação das aulas no nosso [Canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww/featured).\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Listar%20arquivos%20em%20JS%20(async%2C%20await%2C%20promise%20e%20Promise.all)&url=https%3A%2F%2Fdevpleno.com%2Flistar-arquivos-em-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flistar-arquivos-em-js)",
      "description": "Hoje eu quero corrigir um exercício que passei no FullStack Academy que gera muitas dúvidas, principalmente para quem está começando na linguagem e quer ap...",
      "keywords": [
        "stat",
        "path",
        "paths",
        "await",
        "const",
        "arquivos",
        "promise",
        "async",
        "readdir",
        "lista"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/listar-arquivos-em-js"
      }
    },
    {
      "id": "0d57ad0941fd42ae",
      "url": "https://devpleno.com/apresentacao-em-html",
      "title": "Apresentação em HTML - DevPleno",
      "content": "Javascript\n\n## Apresentação em HTML\n\nT\nPor Tulio Faria • 9 de março de 2017\n\n[Javascript](/tag/javascript)\n\nNeste vídeo, explico como você pode criar apresentação de slides em HTML, uma alternativa às apresentações tradicionais em Power Point!\n\n## Confira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Apresenta%C3%A7%C3%A3o%20em%20HTML&url=https%3A%2F%2Fdevpleno.com%2Fapresentacao-em-html) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fapresentacao-em-html)",
      "description": "Neste vídeo, explico como você pode criar apresentação de slides em HTML, uma alternativa às apresentações tradicionais em Power Point!  Confira o vídeo: <...",
      "keywords": [
        "https",
        "apresenta",
        "html",
        "javascript",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno",
        "2fapresentacao",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/apresentacao-em-html"
      }
    },
    {
      "id": "0d8e5c3918cc7156",
      "url": "https://devpleno.com/gerenciador-de-series-p1",
      "title": "Construindo um App gerenciador de séries com ReactJS - DevPleno (Part 5)",
      "content": "[](https://twitter.com/intent/tweet?text=Construindo%20um%20App%20gerenciador%20de%20s%C3%A9ries%20com%20ReactJS&url=https%3A%2F%2Fdevpleno.com%2Fgerenciador-de-series-p1) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fgerenciador-de-series-p1)",
      "description": "Nesta nova série, vamos construir um aplicativo na prática, mais especificamente um gerenciador de séries, para você nunca mais esquecer as séries que assi...",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/gerenciador-de-series-p1"
      }
    },
    {
      "id": "0e09f44d67a3d8e5",
      "url": "https://devpleno.com/hands-on-nodejs-pm2",
      "title": "Hands-on: NodeJS - PM2 - DevPleno",
      "content": "Javascript\n\n## Hands-on: NodeJS - PM2\n\nT\nPor Tulio Faria • 24 de fevereiro de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nVocê precisa deixar seu script rodando direto sem precisar iniciá-lo ou travando seu console? No hands-on deste post, vou mostrar o PM2, um gerenciador de processos que pode ser utilizado em node ou para outras linguagens e tecnologias também. Confira o vídeo-tutorial.:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20NodeJS%20-%20PM2&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-nodejs-pm2) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-nodejs-pm2)",
      "description": "Você precisa deixar seu script rodando direto sem precisar iniciálo ou travando seu console? No handson deste post, vou mostrar o PM2, um gerenciador de pr...",
      "keywords": [
        "https",
        "nodejs",
        "javascript",
        "hands",
        "para",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fhands",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-nodejs-pm2"
      }
    },
    {
      "id": "0e36090eebd5d293",
      "url": "https://devpleno.com/blog/integridade/index",
      "title": "Mantenha sua Integridade - Dica de carreira DevPleno",
      "content": "Você sabe o que é integridade?\n\nNa faculdade, eu tinha um professor que, pra mim, era um exemplo de integridade e honestidade. No último ano, eu estava fazendo meu TCC e uma parte seria corrigida por esse professor. Enviei meu trabalho por e-mail, porém sem essa parte que seria corrigida por ele, já não tive tempo de fazer. Quando recebeu, ele me respondeu o e-mail perguntando se eu havia esquecido de anexar alguma parte, pois estava incompleto.\n\nNesse momento, uma voz na minha cabeça ficava me dizendo para usar essa brecha e enviar depois que estivesse tudo certo, mas o detalhe é que existe algo que eu acredito cada vez mais e sempre fui criado com essa mentalidade, e naquele momento eu pensei \"nossa, por que eu vou enganá-lo se eu construí minha vida baseado em verdades?\" (ainda mais com um professor que é muito honesto). Acabei explicando a ele o que realmente tinha ocorrido.\n\nQuando você é íntegro, você acaba impactando outras pessoas, esse professor sempre foi íntegro comigo então no momento em que tive alguma chance de não ser com ele, eu pensei muito nisso. Imagine o efeito cascata que isso tem, a integridade gera integridade, assim como generosidade gera generosidade. A dica de carreira de hoje é: SEJA ÍNTEGRO, afinal você tem que proteger seu nome, pois ele é sua carreira.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/sJ2M_nkNRnw\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "integridade",
        "professor",
        "embed",
        "parte",
        "mail",
        "essa",
        "momento",
        "ntegro",
        "responsive",
        "https"
      ],
      "metadata": {
        "title": "Mantenha sua Integridade - Dica de carreira DevPleno",
        "date": "2017-07-26",
        "tags": "['Carreira']",
        "thumbnail": "Integridade.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/integridade/index.md"
      }
    },
    {
      "id": "0e7554b210dbd887",
      "url": "https://devpleno.com/azure-cognitive-service",
      "title": "Classificação de imagens com Azure - DevPleno (Part 2)",
      "content": "Agora vamos fazer uma requisição utilizando axios para que a gente consiga classificar essa imagem. Para isso precisamos colocar nossa chave do Azure e também uma instância do axios para passarmos o baseURL e o headers que é onde preciso mandar algumas coisas como content type:\n\n&#x3C;script>\nconst btn = document.getElementById('btn')\nconst imgInput = document.getElementById('imgInput')\nconst img = document.getElementById('img')\nconst key = 'keyDoAzure'\nconst azure = axios.create({\nbaseURL:\n'https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/analyze',\nheaders: {\n'Content-type': 'application/json',\n'Ocp-apim-Subscription-Key': key\n}\n})\n\nimgInput.addEventListener('blur', () => {\nimg.src = imgInput.value\n})\n\nbtn.addEventListener('click', () => {\nazure\n.post(\n'?visualFeactures=Categories,Description,Color&#x26;details=&#x26;language=en',\n{ url: imgInput.value }\n)\n.then((data) => {\nconsole.log(data)\n})\n})\n&#x3C;/script>\nAo rodar, perceba que ele consegue capturar várias tags, além de cores dominantes no background, na frente, etc. Podemos utilizar isso para classificar, por exemplo, se a foto tem algum tipo de violência.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Classifica%C3%A7%C3%A3o%20de%20imagens%20com%20Azure&url=https%3A%2F%2Fdevpleno.com%2Fazure-cognitive-service) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fazure-cognitive-service)",
      "description": "Na dica de hoje, vamos continuar falando sobre classificação de imagens de forma automática, mas será uma outra abordagem, a de utilizar um serviço de visã...",
      "keywords": [
        "https",
        "imagem",
        "imginput",
        "para",
        "axios",
        "script",
        "azure",
        "vamos",
        "const",
        "type"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/azure-cognitive-service"
      }
    },
    {
      "id": "0e7856a25bff18d4",
      "url": "https://devpleno.com/arrow-functions",
      "title": "Arrow Functions - Construindo funções anônimas de forma mais simplificada - DevPleno (Part 1)",
      "content": "Fundamentos\n\n## Arrow Functions - Construindo funções anônimas de forma mais simplificada\n\nT\nPor Tulio Faria • 2 de agosto de 2017\n\n[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)\n\nAs Arrow Functions são uma maneira mais simples ou menor de construir funções anônimas. foi uma novidade no ES6, e hoje todo mundo já está utilizando bastante. Então, no modo anterior, tínhamos:\n\nconst funct1 = function (param1) {}\nSe fossemos construir isso com uma Arrow Function, poderíamos fazer simplesmente isso:\n\nconst funct1 = (param) => {}\n**Por que ela se chama Arrow Function?**\n\nPorque a definimos utilizando uma arrow. É a mesma funcionalidade, mas com uma arrow, existe apenas uma particularidade que vou mostrar para você. Quando temos algo com um cenário acima, chamamos essa arrow function de statement, ou seja, ela tem instruções dentro do corpo dela, por isso ela tem a chave. Temos um outro tipo de arrow function que é a seguinte:\n\nconst2 = function (valor) {\nreturn valor * 2\n}\nSe quisermos criar uma Arrow Function nesse sentido, precisamos passar também o valor, mas podemos fazer apenas isso:\n\nconst funct2 = (valor) => valor * 2\nChamamos esse tipo de Expression Body, afinal o corpo dela é uma expressão. Perceba como fica bem mais simples. Vamos supor que eu tenha um vetor e eu quero fazer um map:\n\nconst vetor = [1, 2, 3]\n\nvetor.map((valor) => valor * 2)\nA única diferença em relação ao function, no primeiro caso quando criamos uma function, ele cria um contexto novo, então se eu tivesse uma variável dentro, o contexto é o da função. Caso eu use this, vou estar referenciando a function, quando eu faço this dentro de uma arrow function, estou referenciando um contexto externo. Então, se eu estiver com duas funções, uma dentro da outra, o this irá referenciar o contexto global, logo ela não tem esse this que é somente dela, e sim é atrelada ao contexto do pai. Vamos supor que existe um botão em react e ele está dentro de um render:",
      "description": "As Arrow Functions são uma maneira mais simples ou menor de construir funções anônimas. foi uma novidade no ES6, e hoje todo mundo já está utilizando basta...",
      "keywords": [
        "arrow",
        "function",
        "dentro",
        "this",
        "contexto",
        "valor",
        "isso",
        "https",
        "mais",
        "functions"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/arrow-functions"
      }
    },
    {
      "id": "0eab24097fd6b28b",
      "url": "https://devpleno.com/chocolatey",
      "title": "Chocolatey - Gerenciador de Pacotes para Windows - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Chocolatey%20-%20Gerenciador%20de%20Pacotes%20para%20Windows&url=https%3A%2F%2Fdevpleno.com%2Fchocolatey) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fchocolatey)",
      "description": "Essa dica é para você utiliza o windows para desenvolvimento: um package manenger chamado chocolatey, semelhante ao yum. Ele facilita bastante quando vamos...",
      "keywords": [
        "para",
        "https",
        "chocolatey",
        "instalar",
        "install",
        "nodejs",
        "javascript",
        "pacotes",
        "vamos",
        "depend"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/chocolatey"
      }
    },
    {
      "id": "0ec4f91381f3facf",
      "url": "https://devpleno.com/hands-on-pkg",
      "title": "PKG - Transforme seu aplicativo Node em executável - DevPleno (Part 2)",
      "content": "pkg . (pkg ponto)\nCom isso, solicitamos o node para empacotar a aplicação utilizando o package.json. Isso é legal porque podemos entregar este aplicativo para o cliente, demo, trial, etc, criando um instalador.\n\nLembrando que nós continuamos tendo acesso total ao código. Usando o express, podemos abrir em outra máquina e ler a faixa de IP que a máquina principal está rodando e na interface mostrar para o cliente “para acessar este aplicativo use o IP xxx.xxx.xxx.xxx em uma máquina de sua rede.”\n\nAssim, várias pessoas conseguem acessar o mesmo aplicativo. É possível utilizar o Package sem a necessidade do Package.json, por exemplo passando direto o ponto de entrada, mas eu prefiro usar o package.json para ficar documentado, deste modo não precisamos lembrar todos os parâmetros sempre.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=PKG%20-%20Transforme%20seu%20aplicativo%20Node%20em%20execut%C3%A1vel&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-pkg) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-pkg)",
      "description": "Use o PKG para compilar seu app Node.js em executável para Windows, Mac e Linux. Tutorial passo a passo com exemplos.",
      "keywords": [
        "para",
        "express",
        "aplicativo",
        "node",
        "https",
        "podemos",
        "este",
        "package",
        "execut",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-on-pkg"
      }
    },
    {
      "id": "0f6518d39cce4bab",
      "url": "https://devpleno.com/microfone-pelo-navegador",
      "title": "Capturando áudio do microfone pelo Navegador - DevPleno (Part 1)",
      "content": "Javascript\n\n## Capturando áudio do microfone pelo Navegador\n\nT\nPor Tulio Faria • 13 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje eu quero mostrar como podemos capturar um áudio do microfone pelo navegador.\n\nDa onde surgiu essa ideia?\n\nNós construímos um chat em tempo real no Curso Completo de Socket.io, que faz parte do Fullstack Master. Nele construímos um chat semelhante ao WhatsApp, onde conseguiríamos mandar uma mensagem de voz. Quero mostrar mais ou menos a ideia de como podemos capturar este áudio.\n\nPrimeiramente vamos acessar o jQuery CDN para conseguirmos copiar o link do jQuery.\n\nVamos criar um arquivo index.html bem rápido, apenas para começarmos o nosso exemplo:\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;script\nsrc='https://code.jquery.com/jquery-3.2.1.slim.js'\nintegrity='sha256-tA8y0XqiwnpwmOIl3SGAcFl2RvxHjA8qp0+1uCGmRmg='\ncrossorigin='anonymous'\n>&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nVou criar um script que vai dentro do próprio body, já que o que importa mesmo é o que estamos executando:\n\n&#x3C;script>\n$(function()\n{navigator.mediaDevices.getUserMedia({ audio: true }).then(\n(stream) => {\nconsole.log(stream)\n},\n(err) => {\nconsole.log(err)\n}\n)})\n&#x3C;/script>\nQuando temos o getUserMedia, temos uma promise e essa promise pode ser resolvida tendo o stream ou tendo um erro.\n\nRepare que ao rodar o navegador ele já está capturando o áudio e foi criado um stream para isso. Se formos fazer um sistema real, ao dar erro como acesso negado, precisamos avisar o porque não funcionou:\n\n}, err =>{\n$('body').append('&#x3C;p>Você deve permitir o áudio&#x3C;/p>')\n})\n\nEu sempre gosto de definir um mediaRecorder, assim, quando o stream for criado, é criado junto o mediaRecorder:",
      "description": "Hoje eu quero mostrar como podemos capturar um áudio do microfone pelo navegador. Da onde surgiu essa ideia? Nós construímos um chat em tempo real no Curso...",
      "keywords": [
        "mediarecorder",
        "para",
        "audio",
        "stream",
        "reader",
        "udio",
        "podemos",
        "script",
        "https",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/microfone-pelo-navegador"
      }
    },
    {
      "id": "0f8600826f0d0f19",
      "url": "https://devpleno.com/azure-cognitive-service",
      "title": "Classificação de imagens com Azure - DevPleno (Part 1)",
      "content": "Javascript\n\n## Classificação de imagens com Azure\n\nT\nPor Tulio Faria • 30 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nNa dica de hoje, vamos continuar falando sobre classificação de imagens de forma automática, mas será uma outra abordagem, a de utilizar um serviço de visão computacional para reconhecer e classificar essa imagem.\n\nVamos utilizar a API Azure Computer Vídeo. Como pegamos uma key dessa API?\n\nSe você colocar no Google Azure Cognitive Services, vamos ter serviços cognitivos, clique no link e você pode experimentar os serviços gratuitamente, apenas acessando ‘computer vision API’ para conseguir a Key.\n\nNovamente no Google, vamos procurar o ‘axios http’ e importá-lo utilizando a CDN:\n\n&#x3C;script src='https://unpkg.com/axios/dist/axios.min.js'>&#x3C;/script>\nAgora, no Visual Studio Code, vou criar um arquivo novo e salvar como azure-image.html. A ideia é a seguinte, vamos ter um input type text onde vamos por uma url para poder reconhecer a imagem:\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;title>Image&#x3C;/title>\n&#x3C;/head>\n\n&#x3C;body>\n&#x3C;input\ntype=\"text\"\nid=\"imgInput\"\nvalue=\"https://tudosobrecachorros.com.br/wp-content/uploads/precos-de-cachorro.png\"\n/>\n&#x3C;input type=\"button\" id=\"btn\" value=\"Analisar imagem\" />\n&#x3C;img src=\"\" id=\"img\" />\n\n&#x3C;script src=\"https://unpkg.com/axios/dist/axios.min.js\">&#x3C;/script>\n&#x3C;script>\nconst imgInput = document.getElementById('img')\nconst img = document.getElementById('img')\nimgInput.addEventListener('blur', () => (img.src = imgInput.value))\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nAssim podemos colocar a url de uma imagem e clicar em analisar imagem, mas temos também uma imagem padrão. Toda vez que essa imagem padrão for trocada, nós trocamos essa imagem.",
      "description": "Na dica de hoje, vamos continuar falando sobre classificação de imagens de forma automática, mas será uma outra abordagem, a de utilizar um serviço de visã...",
      "keywords": [
        "https",
        "imagem",
        "imginput",
        "para",
        "axios",
        "script",
        "azure",
        "vamos",
        "const",
        "type"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/azure-cognitive-service"
      }
    },
    {
      "id": "0f8d83239c56e714",
      "url": "https://devpleno.com/promises",
      "title": "NodeJS Primeiros Passos - Promises - DevPleno (Part 2)",
      "content": "function readArquivo1(){\n... &#x3C;linha1>\nfs.readFile('arquivo1.txt', 'utf8', function(err, arquivo1){\n});\n...&#x3C; linha 2>\n}\nNão é muito bem isso que queremos, afinal queremos um atrás do outro, então podemos fazer o seguinte:\n\nfunction readArquivo1() {\nvar deferred = '.defer()'\nfs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {\ndeferred.resolve(arquivo1)\n})\nreturn deferred.promise\n}\nPerceba que estou retornando uma promise avisando que vai ser retornado algo. Quando esse algo estiver pronto, ele devolve a promise, no caso o arquivo 1. Como eu chamo os arquivos agora usando promises? Valos ler os arquivos e quando ele estiver pronto vai ser chamado o then.function(arquivo1):\n\nfunction readArquivo1() {\nvar deferred = '.defer()'\nfs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {\ndeferred.resolve(arquivo1)\n})\nreturn deferred.promise\n}\nfunction readArquivo2() {\nvar deferred = '.defer()'\nfs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {\ndeferred.resolve(arquivo2)\n})\nreturn deferred.promise\n}\nfunction readArquivo3() {\nvar deferred = '.defer()'\nfs.readFile('arquivo3.txt', arquivo1 + '\\\\n' + arquivo2, function (err) {\ndeferred.resolve()\n})\nreturn deferred.promise\n}\nreadArquivo1().then(function (arquivo1) {\nconsole.log(arquivo1)\n})\nO readArquivo1 retorna uma promise dizendo que quando tiver essa operação IO disponível, eu chamo de volta para então executar o then. Ao executar o código, vai ser retornado o conteúdo do arquivo 1. Poderiamos fazer também:\n\nvar conteudo = ''\nreadArquivo1()\n.then(function (arquivo1) {\nconteudo += arquivo1\nreturn readArquivo2()\n})\n.then(function (arquivo2) {\nconteudo += arquivo2\nconsole.log(conteudo)\n})\nEntão vamos ler o arquivo 1, colocar no conteúdo, ler o arquivo 2 e então dar o console.log no conteúdo, a resposta será o conteúdo dos dois arquivos concatenados. Podemos chamar o arquivo 3 e passar o conteúdo nele.",
      "description": "Continuando nosso assunto sobre NodeJS, vamos tratar sobre como podemos organizar o fluxo para que o código fique realmente organizado. Olhe esse exemplo: ...",
      "keywords": [
        "function",
        "arquivo1",
        "deferred",
        "arquivo2",
        "readfile",
        "para",
        "arquivo",
        "digo",
        "then",
        "conteudo"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/promises"
      }
    },
    {
      "id": "0f918059334d3ef4",
      "url": "https://devpleno.com/blog/modulos/index",
      "title": "NodeJS Primeiros Passos: Módulo em NodeJS (Part 1)",
      "content": "**O que é Módulo em NodeJS?**\n\nÉ um script php no qual você consegue incluir em um outro script. É uma maneira bem tradicional de se organizar as partes funcionais do código.\n\nVamos fazer um teste simples apenas para testar o require, que é a forma de importar esse módulo.\n\nCrie um novo arquivo no Node e coloque um nome qualquer, o meu será modulo01.js, esse arquivo será meu módulo, dentro dele terá:\n\n```jsx\nconsole.log('Dentro do modulo')\n```\n\nSalve e crie um novo arquivo chamado app.js. Nele vamos fazer o seguinte:\n\n```jsx\nrequire('./modulo01')\n```\n\nAo executar o app.js, o require chama o modulo01 e apresenta a frase do nosso arquivo modulo01.js\n\nO interessante nessa forma de gerir os módulos no node é que seria como se ele estivesse em uma closer como uma self invoking, porque ele isola o nosso escopo inteiro.\n\nPara fazermos uma funcionalidade um pouco melhor, podemos falar para esse módulo exportar, por exemplo, um contar:\n\n```jsx\nvar contador = 0\nmodule.exports.contar = function () {\n  contador++\n  console.log(contador)\n}\n```\n\nCom isso estamos expondo um pedaço do nosso módulo para o que está externo, criando uma pequena interface chamada contar.\n\nQuando fizermos o require do módulo no app.js, podemos atribuir ele a uma variável:\n\n```jsx\nvar m1 = require('./modulo01')\nm1.contar()\n```\n\nAssim o m1 recebe uma self invoking e conseguimos ter acesso ao contar que expomos para o que está externo.\n\nUm exemplo que podemos fazer é o seguinte:\n\n```jsx\nvar m1 = require('./modulo01')\nm1.contar()\nvar m2 = require('./modulo01')\nm2.contar()\n```\n\nO require só é executado uma vez. Mesmo sendo executado duas vezes, a primeira vez que ele executar a self invoking function vai ser mantida. Esse comportamento é semelhante ao singleton do java e c#, por exemplo.",
      "keywords": [
        "function",
        "require",
        "dulo",
        "contar",
        "contador",
        "para",
        "modulo02",
        "modulo01",
        "isso",
        "vamos"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Módulo em NodeJS",
        "date": "2017-05-30",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Modulos.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/modulos/index.md"
      }
    },
    {
      "id": "0fa7046e18d054e4",
      "url": "https://devpleno.com/confira-4-dicas-de-ux-para-programadores",
      "title": "Confira 4 dicas de UX para programadores - DevPleno (Part 2)",
      "content": "Antes de mais nada, você precisa compreender o que é essa técnica e como ela se difere de UI (User Interface). Ambas as técnicas são confundidas, mesmo sendo coisas bem distintas. Confira!\n\n### User Experience (UX)\n\nTraduzindo na forma literal, UX significa Experiência do Usuário. Ela é definida como a sensação que o consumidor tem ao navegar por uma interface, seja ela de um aplicativo, site ou software.\n\nQuanto melhor a experiência, mais bem avaliado o produto é, aumentando as chances de fidelização de clientes.\n\n### User Interface (UI)\n\nPor outro lado, User Interface (UI) pode ser entendido como a interface do usuário, na tradução literal. Ela diz respeito a toda a parte que o usuário realmente utiliza: telas, botões, menus e formulários.\n\nPorém, o seu papel é muito mais do que construir esses elementos de layout. Profissionais que fazem UI são responsáveis por criar o caminho que determina a experiência do usuário, para que ele seja fácil e intuitivo.\n\nPortanto, podemos dizer que não existe uma agradável UX sem uma boa UI, uma vez que a interface do usuário é o objeto usado pela pessoa, que define a experiência. Isso diz que as duas devem ser trabalhadas em conjunto, buscando os melhores resultados para as soluções criadas.\n\n## Por que eu preciso entender de UX?\n\nApesar de naturalmente associada a área de design, a responsabilidade de fornecer uma experiência única para o usuário também é do programador. Além disso, a tendência é que essas áreas trabalhem cada vez mais próximas, com o surgimento de profissionais como designer Front-End e Back-end.\n\nMuitos designers estão se especializando em design de interfaces e assumindo atividades da área de desenvolvimento. É natural que as empresas busquem esse tipo de profissional para integrar o time, mais completo e interdisciplinar, podendo contribuir de forma ampla no produto.",
      "description": "Você já tentou usar um aplicativo e desistiu porque não conseguia encontrar as informações corretas ou um botão não funcionava por não ser responsivo para ...",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "https",
        "produto",
        "dicas",
        "informa",
        "source"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/confira-4-dicas-de-ux-para-programadores"
      }
    },
    {
      "id": "0fa967e39a9d009a",
      "url": "https://devpleno.com/blog/registros-do-mysql-no-nodejs/index",
      "title": "[SEGREDO] Muitos registros do MySQL no NodeJS (Part 3)",
      "content": "Veja o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/dCpXvk7Pngc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "query",
        "para",
        "connection",
        "console",
        "fazer",
        "mysql",
        "dados",
        "muito",
        "coisa",
        "isso"
      ],
      "metadata": {
        "title": "[SEGREDO] Muitos registros do MySQL no NodeJS",
        "date": "2017-08-18",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "RegistrosMYSQL.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/registros-do-mysql-no-nodejs/index.md"
      }
    },
    {
      "id": "0fe846c9194a8392",
      "url": "https://devpleno.com/blog/generators-functions/index",
      "title": "Generators Functions - o que acontece por baixo dos panos (Part 3)",
      "content": "```jsx\nconst gen = generator()\nconst iteration = gen.next()\niteration.value.then((val) => {\n  gen.next(val)\n})\n```\n\nAssim vai ser retornado o penúltimo com o valor 10. O CO faz exatamente isso, conseguimos transformar facilmente em uma função genérica que resolva qualquer generator, por isso é tão legal resolver com promise, porque se fosse com readFile comum a gente não tem esse retorno de valor. Confira a dica em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/H13rOIqFVPk\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "generator",
        "console",
        "next",
        "const",
        "iteration",
        "function",
        "para",
        "passo",
        "value",
        "valor"
      ],
      "metadata": {
        "title": "Generators Functions - o que acontece por baixo dos panos",
        "date": "2017-06-29",
        "tags": "['Javascript']",
        "thumbnail": "GENERATORS-FUNCTIONS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/generators-functions/index.md"
      }
    },
    {
      "id": "100898af1e053b31",
      "url": "https://devpleno.com/blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! (Part 1)",
      "content": "Nascidas nos anos 80, só vieram a ficar conhecidas depois dos anos 2000. Muito comuns no desenvolvimento de [softwares](https://www.devpleno.com/como-cobrar-por-software?utm_source=blog&utm_campaign=rc_blogpost), essas ferramentas ganharam espaço em um mercado concorrido que exige projetos rápidos, bem-feitos e sob medida para o cliente.\n\nEstamos falando sobre a metodologia ágil!\n\nMuito se fala sobre esse assunto, mas poucos entendem o que, de fato, são os métodos ágeis. Os equívocos acerca disso podem levar a uma aplicação equivocada e, em consequência, uma perda de produção e qualidade.\n\nPara evitar que isso aconteça com você, separamos neste artigo algumas informações úteis para o seu trabalho. Confira!\n\n## O que é uma metodologia ágil?\n\nAntes de sair gritando aos sete ventos sobre métodos ágeis, precisamos entender o que eles são. Concorda?\n\nMetodologias ágeis são uma alternativa para a gestão de projetos focado na [produtividade](https://www.devpleno.com/como-aumentar-a-produtividade?utm_source=blog&utm_campaign=rc_blogpost). Suas bases estão na relação entre os envolvidos no projeto. Isso inclui os gestores, a equipe de produção e o cliente.\n\nEsse método de trabalho é pautado no empirismo, ou seja: entre em contato, resolva na prática. Por esse motivo, as metodologias ágeis visam dividir as adversidades em problemas menores e resolver em etapas.\n\nAssim, diz-se que os projetos geridos por essas metodologias implicam em entregas incrementais — a entrega é apenas um incremento ao que já existe, e não um [software](https://www.devpleno.com/precificacao-em-software?utm_source=blog&utm_campaign=rc_blogpost) pronto, por exemplo — e ciclos interativos —, os trabalhos são divididos em ciclos e estes têm como objetivo melhorar os projetos anteriores.\n\nQuer um exemplo legal?",
      "keywords": [
        "mais",
        "para",
        "geis",
        "metodologia",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "title": "Metodologia ágil: entenda o que é e como se aplica para programadores!",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "Metodologia.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index.md"
      }
    },
    {
      "id": "101b0119a2798333",
      "url": "https://devpleno.com/express-generator",
      "title": "Gere seu projeto em Express - Hands-on: Express-Generator - DevPleno (Part 2)",
      "content": "Nessa linha de código, já é feito a tradução. Quando ele bate em um js, procura no SaSS e gera automaticamente os styles.css. O Express-Generator já configura tudo para nós. Quando quisermos dar esse bootstraping na aplicação nova, ele nos poupa muito trabalho. Confira a explicação em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Gere%20seu%20projeto%20em%20Express%20-%20Hands-on%3A%20Express-Generator&url=https%3A%2F%2Fdevpleno.com%2Fexpress-generator) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fexpress-generator)",
      "description": "Neste handson, vamos falar sobre o ExpressGenerator, um gerador de projetos em expressJS. Com ele conseguimos criar a base da nossa aplicação. Primeirament...",
      "keywords": [
        "para",
        "express",
        "generator",
        "sass",
        "https",
        "aplica",
        "podemos",
        "javascript",
        "projeto",
        "criar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/express-generator"
      }
    },
    {
      "id": "103a15a0fa0a7864",
      "url": "https://devpleno.com/blog/hands-on-pre-commit/index",
      "title": "Hands-on: Pre-Commit",
      "content": "O módulo testado neste post é o Pre-Commit, que nos permite executar tarefas antes de fazer Commit em seus repositórios Git.\n\nAssista o vídeo para entender como funciona:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Yf7uJuqjtTg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "youtube",
        "commit",
        "para",
        "classname",
        "iframe",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Hands-on: Pre-Commit",
        "date": "2017-02-24",
        "tags": "['Javascript']",
        "thumbnail": "PreCommit.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-pre-commit/index.md"
      }
    },
    {
      "id": "10633821adfebc62",
      "url": "https://devpleno.com/hands-on-socket-io-parte-3",
      "title": "Hands-on - Socket.io Parte 3 - DevPleno (Part 2)",
      "content": "let.counter = 0\nsetInterval(() => io.to('contador'))\nio.to('contador').emit('msg', counter++)\n}, 1000 )\nEssa é uma das formas que temos de criar aplicações sem criar uma instância do socket.io para cada sala, o que seria muito trabalhoso. Além disso, ainda temos outro problema: existem situações em que temos que enviar a mensagem para todos, como no caso anterior, onde enviamos um broadcast para todos os usuários, mas também existem situações onde precisamos enviar para apenas um grupo de pessoas, então com isso podemos saber como vamos mediar, ou seja qual o alcance a mensagem terá.\n\nExistem outras técnicas possíveis de aplicar no socket.io para ficar ainda mais rápido, como distribuir em mais máquinas por exemplo, mas isso já é um assunto avançado que vamos deixar para uma outra ocasião.\n\nConfira o hands-on desta terceira parte também em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%20-%20Socket.io%20Parte%203&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-socket-io-parte-3) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-socket-io-parte-3)",
      "description": "Nesta terceira parte sobre comunicação em temporeal com NodeJS e Socket.io, vamos começar com algo muito interessante: como podemos agrupar usuários para o...",
      "keywords": [
        "socket",
        "para",
        "vamos",
        "sala",
        "mensagem",
        "https",
        "parte",
        "console",
        "contador",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-on-socket-io-parte-3"
      }
    },
    {
      "id": "1066014b71ddc0b6",
      "url": "https://devpleno.com/blog/audio-com-js-puro/index",
      "title": "Tocando um Áudio com JS puro (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ESq1xOs2HsU\" allowfullscreen></iframe>\n</div>\n\nGostou dessa dica sobre áudio com JS puro? Deixe seu comentário! Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "audio",
        "udio",
        "para",
        "play",
        "html",
        "button",
        "head",
        "tittle",
        "body",
        "embed"
      ],
      "metadata": {
        "title": "Tocando um Áudio com JS puro",
        "date": "2017-05-24",
        "tags": "['Javascript']",
        "thumbnail": "AUDIO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/audio-com-js-puro/index.md"
      }
    },
    {
      "id": "10781d6d5011feab",
      "url": "https://devpleno.com/modulos",
      "title": "NodeJS Primeiros Passos: Módulo em NodeJS - DevPleno (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20M%C3%B3dulo%20em%20NodeJS&url=https%3A%2F%2Fdevpleno.com%2Fmodulos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmodulos)",
      "description": "O que é Módulo em NodeJS? É um script php no qual você consegue incluir em um outro script. É uma maneira bem tradicional de se organizar as partes funcion...",
      "keywords": [
        "function",
        "dulo",
        "require",
        "contar",
        "contador",
        "para",
        "modulo02",
        "modulo01",
        "nodejs",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/modulos"
      }
    },
    {
      "id": "10b2bd8352d7cd09",
      "url": "https://devpleno.com/blog/request/index",
      "title": "Request - Requisições HTTP de forma rápida e simples (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/elOGmIL7qws\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.",
      "keywords": [
        "request",
        "para",
        "https",
        "http",
        "require",
        "site",
        "embed",
        "vamos",
        "const",
        "body"
      ],
      "metadata": {
        "title": "Request - Requisições HTTP de forma rápida e simples",
        "date": "2017-08-14",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Request.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/request/index.md"
      }
    },
    {
      "id": "10df236730260a9d",
      "url": "https://devpleno.com/blog/qual-seu-maior-desafio/index",
      "title": "Qual é o seu maior desafio nesse momento? (Part 1)",
      "content": "Há um tempo venho ajudando desenvolvedores e profissionais de outras áreas e isso vem me proporcionando muita felicidade. É algo que faz parte do meu propósito de vida. Por isso também quero te ajudar a resolver o seu desafio.\n\n**O que você precisa fazer**\n\nEscreva um e-mail para tuliofaria@devpleno.com contando um pouco da sua trajetória de vida (como trabalha, quando começou a programar, etc), me diga também qual é o seu maior desafio (qual o seu objetivo e em que exatamente precisa de ajuda) e como você pode ajudar outras pessoas.\n\nPode ficar tranquilo quanto à privacidade, somente eu tenho acesso a este e-mail\n\n**O projeto**\n\nDepois de ler os e-mails recebidos e fazer uma triagem para descobrir quem no grupo pode se ajudar. Inicialmente não vai ser público porque ainda não consegui achar uma ferramenta que possa fazer isso de uma maneira ótima. Um grupo no facebook seria uma opção, mas eu não gosto de usar esse formato, já que as informações se perdem lá dentro, então quero achar uma forma de ter mais privacidade para os dados já que estamos lidando com informações sensíveis.\n\nEntão, por enquanto, eu mesmo irei fazer este roteamento manualmente para apresentar as pessoas (ou eu mesmo vou ajudar se for o caso). A ideia é que a gente cresça junto.\n\nPosteriormente, provavelmente, vamos transformar isso em um sistema, mas quero ver como vai funcionar primeiro nessa forma manual. Acredito que quando desenvolvemos um sistema, temos que conhecer como ele funcionaria manualmente antes de tentar automatizar algo que não existia.\n\nVenho fazendo esse projeto localmente com alguns profissionais de outras áreas (discutimos negócios, como podemos melhorar as pessoas…) e isso está sendo fantástico, então quero aplicar isso aos desenvolvedores que acompanham o DevPleno. Acredito muito no resultado disso, podemos tornar o mundo melhor começando por onde temos forças: ajudando as pessoas de alguma forma.\n\nAceita entrar nesse desafio? Mande seu e-mail!",
      "keywords": [
        "isso",
        "para",
        "como",
        "quero",
        "ajudar",
        "fazer",
        "mail",
        "devpleno",
        "pessoas",
        "outras"
      ],
      "metadata": {
        "title": "Qual é o seu maior desafio nesse momento?",
        "date": "2017-05-24",
        "tags": "['Carreira']",
        "thumbnail": "MaiorDesafio.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/qual-seu-maior-desafio/index.md"
      }
    },
    {
      "id": "1122a8f4a8fb9c57",
      "url": "https://devpleno.com/devreactjs-lp1",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-lp1 to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-lp1"
      }
    },
    {
      "id": "1138191c33128b87",
      "url": "https://devpleno.com/blog/termos-de-uso/index",
      "title": "Termos de uso (Part 5)",
      "content": "Este site é controlado e operado pela We Dev Ideas – Eirelli – ME a partir de seu escritório no endereço Rua Maria das Dores, 49 – Esplanada, Pouso Alegre, MG e não garante que o conteúdo ou materiais estejam disponíveis para uso em outras localidades. Seu acesso é proibido em territórios onde o conteúdo seja considerado ilegal. Aqueles que optarem por acessar este site a partir de outras localidades o farão por iniciativa própria e serão responsáveis pelo cumprimento das leis locais aplicáveis. Os materiais não deverão ser usados ou exportados em descumprimento das leis brasileiras sobre exportação. Qualquer pendência com relação aos materiais será dirimida pelas leis brasileiras.  \nO acesso ao DevPleno representa a aceitação expressa e irrestrita dos termos de uso acima descritos.",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "acesso",
        "termos",
        "servi",
        "website",
        "para",
        "direitos"
      ],
      "metadata": {
        "title": "Termos de uso",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "blog/termos-de-uso/index.md"
      }
    },
    {
      "id": "1140580af64f1be8",
      "url": "https://devpleno.com/blog/closures-e-escopos/index",
      "title": "NodeJS Primeiros Passos: Closures e Escopos",
      "content": "Neste vídeo é abordado mais sobre closures e escopos em javascript, conceitos bastante importantes para a criação futura de módulos.\n\n[Código fonte:](https://gist.github.com/tuliofaria/72953c6c4b898561aee5e8d91dd589ab)\n\n## Confira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Xexyc2J-Di0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "https",
        "embed",
        "responsive",
        "youtube",
        "para",
        "class",
        "iframe",
        "devpleno",
        "facebook",
        "neste"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Closures e Escopos",
        "date": "2016-07-26",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "ESCOPUS-E-CLOSURES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/closures-e-escopos/index.md"
      }
    },
    {
      "id": "1147c4502dc5fd31",
      "url": "https://devpleno.com/blog/termos-de-uso/index",
      "title": "Termos de uso (Part 4)",
      "content": "Os documentos, conteúdos e criações contidos neste website pertencem aos seus criadores e colaboradores. A autoria dos conteúdo, material e imagens exibidos no DevPleno é protegida por leis nacionais e internacionais. Não podem ser copiados, reproduzidos, modificados, publicados, atualizados, postados, transmitidos ou distribuídos de qualquer maneira sem autorização prévia e por escrito do DevPleno.  \nAs imagens contidas neste website são aqui incorporadas apenas para fins de visualização, e, salvo autorização expressa por escrito, não podem ser gravadas ou baixadas via download. A reprodução ou armazenamento de materiais recuperados a partir deste serviço sujeitará os infratores às penas da lei.  \nO nome do site DevPleno seu logotipo, o nome de domínio para acesso na Internet, bem como todos os elementos característicos da tecnologia desenvolvida e aqui apresentada, sob a forma da articulação de bases de dados, constituem marcas registradas e propriedades intelectuais privadas e todos os direitos decorrentes de seu registro são assegurados por lei. Alguns direitos de uso podem ser cedidos por DevPleno em contrato ou licença especial, que pode ser cancelada a qualquer momento se não cumpridos os seus termos.  \nAs marcas registradas do DevPleno só podem ser usadas publicamente com autorização expressa. O uso destas marcas registradas em publicidade e promoção de produtos deve ser adequadamente informado.\n\n## Reclamações sobre violação de direitos autorais\n\nO DevPleno respeita a propriedade intelectual de outras pessoas ou empresas e solicitamos aos nossos membros que façam o mesmo. Toda e qualquer violação de direitos autorais deverá ser notificada ao DevPleno e acompanhada dos documentos e informações que confirmam a autoria. A notificação poderá ser enviada pelos e-mails constantes do site ou via postal para o endereço do site.\n\n## Leis aplicáveis",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "acesso",
        "termos",
        "servi",
        "website",
        "para",
        "direitos"
      ],
      "metadata": {
        "title": "Termos de uso",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "blog/termos-de-uso/index.md"
      }
    },
    {
      "id": "11d2aef49dacbafa",
      "url": "https://devpleno.com/blog/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar/index",
      "title": "A habilidade mais importante que um programador deveria ter (e praticar) (Part 2)",
      "content": "Agora o grande poder: caso alguém te questione sobre o motivo de não ter usado o processo para chegar ao Resultado 3, você sabe baseado nos seus critérios.\n\nIsso ainda vai te ajudar a solucionar problemas de uma maneira bastante inteligente, visto que cada nova decisão estará pautada.\n\n# Como exercitar \"perguntar\" na prática?\n\n**Maneira 1:** sempre questione como tudo é resolvido. Sempre que vejo alguma solução, ferramenta ou até mesmo slogan de um produto de software eu me questiono:\n\n- Qual o motivo de fazerem desta maneira?\n- Será que fazem o que estão dizendo?\n\n**Maneira 2:** revisite suas perguntas (e suas respostas). Muitas perguntas, critérios e respostas podem ser temporárias ou atemporais. E bastante interessante revisitá-las, pois tudo pode mudar.\n\nA muito tempo atrás, eu havia testado uma placa para IoT chamada NodeMCU (validado inclusive com várias perguntas). Na época, ela não havia passado nos critérios de uma solução que estava desenvolvendo. Refiz as perguntas recentemente, e tudo havia mudado - e agora ela é uma solução viável.\n\n**Maneira 3:** faça provas de conceitos (proof of concept) (famosas PoCs) daquele aspecto/pergunta que você está buscando uma solução. Qual banco seria o mais adequado para uma aplicação x? Faça uma prova de conceito com seus bancos de dados candidatos respondendo a perguntas que te ajudem a desenvolver sua aplicação e critérios para avaliar os resultados.\n\nFazemos muitas provas de conceitos dentro da [Formação Fullstack Master](https://go.devpleno.com/fsm?sck=blog) para explorar esta habilidade. Em breve vamos aplicar em todos os nossos treinamentos - pois é uma ferramenta muito poderosa de aprendizado, masterização e argumentativo.",
      "keywords": [
        "perguntas",
        "resultado",
        "para",
        "rios",
        "perguntar",
        "processo",
        "como",
        "solu",
        "muito",
        "crit"
      ],
      "metadata": {
        "title": "A habilidade mais importante que um programador deveria ter (e praticar)",
        "date": "2021-05-13",
        "tags": "['Carreira']",
        "thumbnail": "perguntas-thumb.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar/index.md"
      }
    },
    {
      "id": "1205d7f82fe92aab",
      "url": "https://devpleno.com/blog/tenha-cicatrizes/index",
      "title": "Tenha cicatrizes (Part 1)",
      "content": "Na dica de carreira de hoje, eu quero explicar porque é tão bom e útil pra gente ter 'cicatrizes de guerra', obviamente não na forma literal :)\n\nEssa é uma expressão que eu ouvi em um evento e que faz total sentido.\n\nO que significa ter cicatrizes?\n\nÉ você ter se permitido cometer um erro ou ter ido para o 'campo de batalha', afinal só quem conhece o campo sabe como ele é. Você deve ter percebido que em quase todas as vezes que falo sobre carreira, eu digo que só conheço e sei construir algo com determinada tecnologia quando eu coloco em produção, porque aquilo vai me deixar cicatrizes.\n\nArrisque colocar em produção, dar um passo a mais além da sua zona de descanso, nem que gere algum probleminha, afinal nada pode ficar 100%. Por exemplo, ao construir um projeto tente colocar 1% a mais do que você está acostumado para que realmente tenha um pouco mais de dificuldade, assim esse projeto te dará uma cicatriz, isso vai te deixar mais calejado.\n\nQuando mais você passa por essas situações, mais você vai se transformar em um profissional melhor, isso é muito importante para nossa carreira. Invente maneiras novas de fazer algo, tanto para te motivar quanto para aprender. Lembrando que é no erro que nós aprendemos. Um desenvolvedor pleno tem que ter essa visão de que percorrer caminhos difíceis é o que vai fazer ele se transformar em um desenvolvedor melhor, mais preparado e mais calejado. Se você conseguir construir um sistema que mil pessoas utilizam, aquilo te da uma força para saber que você pode construir um de dez mil.\n\nEssas cicatrizes que marcam sua carreira é o que vai fazer você crescer cada vez mais. Sempre levar cicatrizes para que você realmente evolua na sua carreira. Eu ouvi isso em um processo seletivo onde disseram que precisam de gente que tem cicatrizes, ou seja, tenham passado por esses problemas, virado madrugada, batido no teto da zona de conforto e teve que se destacar de alguma maneira.",
      "keywords": [
        "mais",
        "para",
        "cicatrizes",
        "carreira",
        "construir",
        "embed",
        "isso",
        "fazer",
        "responsive",
        "https"
      ],
      "metadata": {
        "title": "Tenha cicatrizes",
        "date": "2017-09-05",
        "tags": "['Carreira']",
        "thumbnail": "Cicatrizes.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/tenha-cicatrizes/index.md"
      }
    },
    {
      "id": "1234956ee5e84569",
      "url": "https://devpleno.com/currying",
      "title": "Currying -  Uma técnica interessante usada em programação funcional - DevPleno (Part 1)",
      "content": "Javascript\n\n## Currying - Uma técnica interessante usada em programação funcional\n\nT\nPor Tulio Faria • 26 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nO Currying é basicamente uma forma de informar para uma função os parâmetros de forma parcial. Você pode pegar uma função qualquer que recebe, por exemplo, três parâmetros, mandar um por vez e no fim obter o resultado. Assim, você injeta os parâmetros à medida que estiverem disponíveis. Um exemplo usando JavaScript puro e Currying (lembrando que ele é uma função normal. Nele teremos os valores 1 e 2).*\n\nfunction func(valor1, valor2) {\nreturn valor1 + valor2\n}\n\nconsole.log('normal', func1(1, 2))\nA única forma que temos de chamar essa função é passando os valores para ele, mas o ideal é passarmos o 1, e o valor 2 só quando ele estiver disponível. Vamos criar agora uma função 2 onde isso seja possível.\n\nEssa função não vai receber os dois valores, apenas um e dar um return em uma função que recebe o segundo valor e essa, por sua vez, retorna valor 1 mais valor 2.\n\nfunction func2(valor1){\nreturn function(valor2){\nreturn valor1+valor2\n}\n}\n\nconst func2Valor1 = func2(10)\n\nconsole.log('curried', func2Valor1(20)\nSuponhamos que quero fazer um read de um arquivo curried e cada hora que eu ler ele será passado um callback diferente, deixando apenas o primeiro parâmetro fixo. Isso é o Currying.\n\nVamos preenchendo os parâmetros à medida com que vamos executando o código e, quando chegamos no passo final, estará disponível todos os valores que passamos.\n\nQuando fazemos isso, precisamos retornar a função e guardar em uma variável, e uma segunda função espera que você passe o segundo valor. Podemos também executar de uma vez fazendo assim:",
      "description": "O Currying é basicamente uma forma de informar para uma função os parâmetros de forma parcial. Você pode pegar uma função qualquer que recebe, por exemplo,...",
      "keywords": [
        "function",
        "valor1",
        "valor2",
        "curried",
        "https",
        "currying",
        "valores",
        "return",
        "valor",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/currying"
      }
    },
    {
      "id": "123ca768cfd8cbd5",
      "url": "https://devpleno.com/blog/evite-o-this-em-js/index",
      "title": "Evite o this em JavaScript (Part 2)",
      "content": "Obviamente tem algumas situações que não conseguimos não utilizar, inclusive temos alguns exemplos anteriores que criamos utilizamos o 'this' dentro de um componente só e depois replicamos esse state do componente para frente através de uma passagem props.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ACZi0KRIsoc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "node",
        "props",
        "this",
        "utilizar",
        "componente",
        "span",
        "mais",
        "forma",
        "para",
        "isso"
      ],
      "metadata": {
        "title": "Evite o this em JavaScript",
        "date": "2017-07-03",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "javascript-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/evite-o-this-em-js/index.md"
      }
    },
    {
      "id": "1291c370b4167877",
      "url": "https://devpleno.com/2-tipos-de-solucoes-de-software-que-voce-pode-entregar",
      "title": "2 Tipos de Soluções de Software que você pode entregar - DevPleno (Part 2)",
      "content": "Reflita sobre essas duas formas, quando um cliente te pedir um software, você está entregando o que o cliente quer ou o que ele precisa?\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=2%20Tipos%20de%20Solu%C3%A7%C3%B5es%20de%20Software%20que%20voc%C3%AA%20pode%20entregar&url=https%3A%2F%2Fdevpleno.com%2F2-tipos-de-solucoes-de-software-que-voce-pode-entregar) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2F2-tipos-de-solucoes-de-software-que-voce-pode-entregar)",
      "description": "Hoje quero falar com vocês um pouco sobre venda de software. É um conceito bastante interessante sobre as possibilidades que nós temos de entrega para o cl...",
      "keywords": [
        "cliente",
        "entregar",
        "software",
        "quer",
        "para",
        "precisa",
        "https",
        "mais",
        "quando",
        "solu"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/2-tipos-de-solucoes-de-software-que-voce-pode-entregar"
      }
    },
    {
      "id": "12a77d6bd25159df",
      "url": "https://devpleno.com/blog/javascript-apply/index",
      "title": "JavaScript: Apply (Part 1)",
      "content": "Hoje vou falar um pouco sobre o Apply em JavaScript e mostrar um exemplo de como podemos utilizá-lo para calcular o menor e o maior valor em um conjunto de dados. Primeiramente vamos fazer um teste: criar uma função e se chamar a funTeste junto com o this, virá o contexto de onde a função está sendo executada.\n\n```jsx\nfunction funTeste(at1, at2) {\n  console.log(this, at1, at2)\n}\nfunTeste(1, 2)\n```\n\nPorém, ao invés defazer funTeste e executar, podemos fazer um apply, e dentro dele podemos fazer, por exemplo:\n\n```jsx\nfunTeste.apply(1, [2, 3])\n```\n\nO primeiro atributo do apply (um), é o que eu quero para o this, ou seja, em qual contexto eu quero que essa função seja executada, e o segundo atributo são os valores que eu quero dar para os parâmetros que a função espera.\n\nSe executarmos novamente, o resultado virá: [Number: 1] 2 3, referente ao número 1, e o 2 e 3 referentes aos atributos 1 e 2.\n\nMais alguns testes seguindo essa ideia:\n\n```jsx\nfunction funTeste(at1, at2) {\n  console.log(this, at1, at2)\n}\nconsole.log(Math.min(98, 78, 50))\n```\n\nAo executar o número retornado, será 50, pois 50 é o menor valor daquele conjunto de dados.\n\n**O interessante no apply**\n\nNote que não estamos passando um vetor de valores e sim com vírgula, como se fossem vários atributos. Podemos utilizar o apply para que possamos passar um vetor onde tiver uma função que recebe uma lista de parâmetros.\n\nExemplo: Vamos passar um vetor em que quero descobrir o menor dos valores. A forma mais fácil é utilizando o apply.\n\n```jsx\nfunction funTeste(at1, at2) {\n  console.log(this, at1, at2)\n}\nconst vetor1 = [89, 70, 50, 48]\nconsole.log(Math.min.apply(Math, vetor1))\n```\n\nO Math é o meu this, pois o que estiver dentro dele como contexto está ótimo.\n\nPodemos fazer a mesma coisa com o valor máximo apenas trocando o min por max:\n\n```jsx\nconsole.log(Math.max.apply(Math, vetor1))\n```",
      "keywords": [
        "apply",
        "funteste",
        "como",
        "podemos",
        "para",
        "this",
        "console",
        "math",
        "fazer",
        "contexto"
      ],
      "metadata": {
        "title": "JavaScript: Apply",
        "date": "2017-05-24",
        "tags": "['Javascript']",
        "thumbnail": "Apply.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/javascript-apply/index.md"
      }
    },
    {
      "id": "13477f7e872d3161",
      "url": "https://devpleno.com/carreira-voce-e-o-passageiro-da-sua-vida",
      "title": "Carreira: Você é o passageiro da sua Vida? - DevPleno",
      "content": "Carreira\n\n## Carreira: Você é o passageiro da sua Vida?\n\nT\nPor Tulio Faria • 27 de março de 2017\n\n[Carreira](/tag/carreira)\n\nVocê está levando sua vida para alcançar seus objetivos?\n\nVocê está sendo o motorista ou passageiro na sua própria vida?\n\nConfira o vídeo:\n\nNão esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Um abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Carreira%3A%20Voc%C3%AA%20%C3%A9%20o%20passageiro%20da%20sua%20Vida%3F&url=https%3A%2F%2Fdevpleno.com%2Fcarreira-voce-e-o-passageiro-da-sua-vida) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcarreira-voce-e-o-passageiro-da-sua-vida)",
      "description": "Você está levando sua vida para alcançar seus objetivos? Você está sendo o motorista ou passageiro na sua própria vida? Confira o vídeo: <div className=&#34;em...",
      "keywords": [
        "https",
        "carreira",
        "vida",
        "passageiro",
        "para",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fcarreira",
        "voce"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/carreira-voce-e-o-passageiro-da-sua-vida"
      }
    },
    {
      "id": "1368d22c9a6eedaf",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-3/index",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol (Part 2)",
      "content": "Agora precisamos enviar isso para o express para ele distribuir via Socket.IO para todos os clients. Ao invés de mandar essa atualização via Socket.IO, eu posso mandar via API, salvar essa informação no banco e aí sim notificar _(eu prefiro usar sempre essa forma para eu garantir que eu só envie essa notificação para todo mundo)._\n\n```jsx\n$(function)(){\n    $(\"#update-score\").click(function(){\n        const scoreA = $(\"#score-a\").val();\n        const scoreB = $(\"#score-b\").val();\n        const notify = $(\"#score-notify\").val();\n        $.post(\"/admin/match/0/score\", post {\n            scoreA, scoreB, notify\n        }, function(data){\n            console.log(data)\n        })\n        return false;\n    })\n});\n```\n\nEle não vai conseguir, pois não achou, mas se olharmos a conexão os dados já estão sendo enviados, então temos que receber esses dados lá. Vamos voltar em routes/admin.js e criar novo router:\n\n```jsx\nrouter.post('/match/:id/score', function (req, res) {\n  res.send(req.body)\n})\n```\n\nFizemos isso para termos certeza que os dados estão chegando aqui, então vamos parar o servidor e a resposta do score vai ser exatamente o que eu enviei para ele, agora podemos processar esses dados. Vamos setar o valor no placar do banco de dados. Uma das formas que temos de fazer isso no low-db é pegando o índice do jogo e setar lá dentro falando qual o valor vou enviar para ele. Essa informação vai para todos os jogos, então eu devo emitir para todos que estão conectados no Socket.IO:\n\n```jsx\nrouter.post('/match/:id/score', function (req, res) {\n  db.set(\n    'matches[' + req.params.id + '].team-a.score',\n    parseInt(req.body.scoreA)\n  ).write()\n  db.set(\n    'matches[' + req.params.id + '].team-b.score',\n    parseInt(req.body.scoreB)\n  ).write()\n  io.emit('score', {\n    match: req.params.id,\n    scoreA: req.body.scoreA,\n    scoreB: req.body.scoreB,\n    notify: req.body.notify || 0\n  })\n  res.send(req.body)\n})\n```",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "vamos",
        "notify",
        "socket",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol",
        "date": "2017-07-07",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-3/index.md"
      }
    },
    {
      "id": "136b2f1acb2c72fc",
      "url": "https://devpleno.com/pare-de-pensar-em-classes",
      "title": "Pare de pensar em classes!  Série - POO para JS - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Pare%20de%20pensar%20em%20classes!%20%20S%C3%A9rie%20-%20POO%20para%20JS&url=https%3A%2F%2Fdevpleno.com%2Fpare-de-pensar-em-classes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpare-de-pensar-em-classes)",
      "description": "Nesta nova série do DevPleno, mostro como podemos passar de programação orientadaobjetos para JavaScript mais funcional. A primeira coisa (que é muito impo...",
      "keywords": [
        "num2",
        "this",
        "num1",
        "javascript",
        "para",
        "https",
        "pensar",
        "classes",
        "mais",
        "funcional"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/pare-de-pensar-em-classes"
      }
    },
    {
      "id": "13a0568d5088ae5c",
      "url": "https://devpleno.com/blog/grandes-quantidades-de-dados-com-menos-recursos/index",
      "title": "Grandes quantidades de dados com menos recursos (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "const",
        "data",
        "para",
        "dados",
        "require",
        "contents",
        "line",
        "vamos",
        "console",
        "entrada"
      ],
      "metadata": {
        "title": "Grandes quantidades de dados com menos recursos",
        "date": "2017-10-17",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "MAIS-DADOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/grandes-quantidades-de-dados-com-menos-recursos/index.md"
      }
    },
    {
      "id": "13b1e15fcc39ac87",
      "url": "https://devpleno.com/blog/beatbox-com-javascript/index",
      "title": "Como construir um beatbox com JavaScript (Part 2)",
      "content": "```jsx\nfunction tick(){\n  const audioID = (music[(currentAudio++)%music.length]\n\n  const audio = document.getElementById(audioID)\n\n  audio.play()\n}\n```\n\nConseguimos tocar uma trilha, mas para a música ficar legal, podemos colocar essa trilha de uma forma diferente, por exemplo:\n\n```jsx\n<script>\n  const  play = constGetElementById('play')\n\n  let timer = null\n\n  let currentAudio = 0\n\n  const bpm = 90\n\n  const music = \\[\n    \\['bumbo', 'bumbo', 'bumbo', 'bumbo', \\],\n    \\['prato', 'prato-fechado', 'boca', 'caixa'\\]\n   \\]\n\n  function tick(){\n    const current = (music\\[(currentAudio++)%music\\[0\\].length\\]\n\n    const audioID1 = music\\[0\\]\\[current\\]\n\n    const audioID2 = music\\[1\\]\\[current\\]\n\n    const audio1 = document.getElementById(audioID1)\n\n    audio1.play()\n\n    audio1.currentTime = 0\n\n    const audio2 = document.getElementById(audioID2)\n\n    audio2.play()\n\n    audio2.currentTime = 0\n  }\n\n  play.addEventListener('click', function(){\n    timer = setInterval(tick, (60*1000/bpm)\n  })\n</script>\n```\n\nVocê pode baixar os arquivos de áudio aqui: [Download](https://goo.gl/zHKuad)\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/01iPnENtCiQ\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "play",
        "const",
        "audio",
        "music",
        "para",
        "prato",
        "bumbo",
        "tick",
        "currentaudio",
        "vamos"
      ],
      "metadata": {
        "title": "Como construir um beatbox com JavaScript",
        "date": "2017-05-29",
        "tags": "['Javascript']",
        "thumbnail": "BEATBOX-MANIPULÁVEL-COM-JS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/beatbox-com-javascript/index.md"
      }
    },
    {
      "id": "14035503dd1426a2",
      "url": "https://devpleno.com/hr2",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /hr2 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hr2"
      }
    },
    {
      "id": "1431601bdfb6ece5",
      "url": "https://devpleno.com/hands-injecao-de-dependencia-e-bom-mesmo",
      "title": "Hands-on: Injeção de Dependência é bom mesmo? - DevPleno",
      "content": "Javascript\n\n## Hands-on: Injeção de Dependência é bom mesmo?\n\nT\nPor Tulio Faria • 17 de abril de 2017\n\n[Javascript](/tag/javascript)\n\nMuitas pessoas ainda me perguntam se injeção de dependência é realmente bom. Você também ainda não está convencido sobre isso? Neste vídeo, crio um mock e um teste com injeção de dependência para te convencer ainda mais sobre a importância desta técnica.\n\nConfira o video:\n\nNão esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Inje%C3%A7%C3%A3o%20de%20Depend%C3%AAncia%20%C3%A9%20bom%20mesmo%3F&url=https%3A%2F%2Fdevpleno.com%2Fhands-injecao-de-dependencia-e-bom-mesmo) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-injecao-de-dependencia-e-bom-mesmo)",
      "description": "Muitas pessoas ainda me perguntam se injeção de dependência é realmente bom. Você também ainda não está convencido sobre isso? Neste vídeo, crio um mock e ...",
      "keywords": [
        "https",
        "ncia",
        "javascript",
        "inje",
        "depend",
        "mesmo",
        "ainda",
        "hands",
        "sobre",
        "para"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-injecao-de-dependencia-e-bom-mesmo"
      }
    },
    {
      "id": "145e1e460e10db59",
      "url": "https://devpleno.com/handsonreact-wpp",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /handsonreact-wpp to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "handsonreact"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/handsonreact-wpp"
      }
    },
    {
      "id": "147340c00e21979d",
      "url": "https://devpleno.com/nodejs-primeiros-passos-async-map",
      "title": "NodeJS Primeiros Passos: Async - Map - DevPleno",
      "content": "Javascript\n\n## NodeJS Primeiros Passos: Async - Map\n\nT\nPor Tulio Faria • 17 de agosto de 2016\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nNeste vídeo, vou mostrar uma outra forma de organizar códigos assíncrono, neste caso, executando a mesma operação assíncrona em uma lista de dados e agrupando o resultado no fim.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20Async%20-%20Map&url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-map) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-map)",
      "description": "Neste vídeo, vou mostrar uma outra forma de organizar códigos assíncrono, neste caso, executando a mesma operação assíncrona em uma lista de dados e agrupa...",
      "keywords": [
        "https",
        "nodejs",
        "javascript",
        "primeiros",
        "passos",
        "async",
        "fundamentos",
        "neste",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/nodejs-primeiros-passos-async-map"
      }
    },
    {
      "id": "147c857382a73432",
      "url": "https://devpleno.com/standard-parte-1",
      "title": "Standard - Padronize o código fonte JavaScript da sua equipe - DevPleno (Part 1)",
      "content": "Javascript\n\n## Standard - Padronize o código fonte JavaScript da sua equipe\n\nT\nPor Tulio Faria • 24 de julho de 2017\n\n[Javascript](/tag/javascript)\n\nO módulo Standard é uma ferramenta bastante útil no nosso dia a dia, ele aplica algumas regras para você manter seu código fonte. Por exemplo, se você vai fazer um ‘if’, tem que deixar um espaço porque facilita a leitura:\n\nif (i === 1) {\n}\nCom o tempo você sente que seu código precisa melhorar, tanto em performance quanto em organização. Quando começamos temos que resolver um código, depois de um tempo isso já não é o suficiente. Precisa ser feito de forma que outras pessoas entendam e que fique bem organizado, que é algo que levo pra minha carreira hoje, procuro resolver o problema da melhor forma possível. Uma das formas que temos para aumentar a qualidade de um código é mantendo um padrão de escrita. Em Java, é muito comum utilizarmos o Java Cult, em JavaScript temos algumas opções como o Standard.\n\nNo caso do Standart, ele tem uma ferramente que checa o código. Para usar, primeiramente tem que dar um npm:\n\nnpm install -g standard\nQuando você roda o módulo, ele procura todos os arquivos JS dentro do seu diretório atual e vê se está faltando alguma coisa, por exemplo no meu ele achou alguns erros:\n\nEntão o ‘i’ em nosso ‘if’ não foi definido, com isso conseguimos pegar um bug antes mesmo dele acontecer, então vamos resolver o primeiro bug:\n\nlet i = 0\nif (i === 1) {\n}\nAo rodar, percebam que já diminuiu um bug:\n\nAgora temos um espaço vazio na linha 3\n\nlet i = 0\nif (i === 1) {\nconsole.log(1)\n}\nE por fim, adicionar uma nova linha no final do arquivo. Quando fazemos isso não retorna nenhum erro no nosso código. Se eu der um ‘tab’ a mais, por exemplo, no console.log, ele vai retornar que está identado errado.\n\nUma coisa que dá bastante discussão é onde colocar a abertura da chave. Se você colocar na linha de baixo, ele irá dar um erro:\n\nif (i === 1) {\nconsole.log(1)\n}",
      "description": "O módulo Standard é uma ferramenta bastante útil no nosso dia a dia, ele aplica algumas regras para você manter seu código fonte. Por exemplo, se você vai ...",
      "keywords": [
        "digo",
        "javascript",
        "standard",
        "para",
        "https",
        "temos",
        "nosso",
        "resolver",
        "isso",
        "linha"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/standard-parte-1"
      }
    },
    {
      "id": "14cee0dcb76fe516",
      "url": "https://devpleno.com/renderizar-estruturas-em-formato-de-arvore",
      "title": "ReactJS Recursivo? - DevPleno (Part 3)",
      "content": "const Node = (props) => {\nreturn (\n&#x3C;span>\n{props.node.l &#x26;&#x26; props.node.r &#x26;&#x26; &#x3C;span>(&#x3C;/span>}\n{props.node.l &#x26;&#x26; &#x3C;Node node={props.node.l} />}\n{props.node.v}\n{props.node.l &#x26;&#x26; props.node.r &#x26;&#x26; &#x3C;span>)&#x3C;/span>}\n&#x3C;/span>\n)\n}\nUma coisa interessante é que se fizermos um inspect no browser e usar o react dev tools é possível ver toda a estrutura sendo criada.\n\nFizemos aqui um forma de renderizar expressões, mas poderíamos utilizar para renderizar uma árvore, lista de diretórios, etc. Tudo isso utilizando essa simples estrutura.\n\nConfira todos os passos no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=ReactJS%20Recursivo%3F&url=https%3A%2F%2Fdevpleno.com%2Frenderizar-estruturas-em-formato-de-arvore) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frenderizar-estruturas-em-formato-de-arvore)",
      "description": "Hoje vamos fazer algo que é bastante convencional em sistemas: renderizar estruturas de dados em formato de árvore. No exemplo, será uma árvore binária, ma...",
      "keywords": [
        "node",
        "props",
        "span",
        "lado",
        "vamos",
        "para",
        "renderizar",
        "fazer",
        "isso",
        "react"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/renderizar-estruturas-em-formato-de-arvore"
      }
    },
    {
      "id": "1512f5b6468a84a5",
      "url": "https://devpleno.com/blog/como-gerar-um-array-populado-em-javascript/index",
      "title": "Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos (Part 1)",
      "content": "É muito comum durante a solução de alguns problems com algorítmos de precisarmos de um array com valores padrão já inseridos.\n\nInclusive para gerar dados de testes. E podemos gerar o array com os mais diversos valores, como números, strings e até mesmo objetos.\n\n## O bom e velho `for`\n\nA forma mais tradicional de fazer esta tarefa é utilizar o bom e velho `for`. Sem muitos segredos, podemos fazer o seguinte:\n\n```javascript\nconst array = []\nconst size = 10\nfor (let i = 0; i < size; i++) {\n  array.push(i)\n}\n// array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n```\n\nDesta maneira podemos inclusive criar valores diferentes de inteiros, por exemplo:\n\n```javascript\nconst names = []\nconst size = 7\nfor (let i = 0; i < size; i++) {\n  names.push({\n    id: i,\n    name: `Name ${i}`\n  })\n}\n/*\nnames = \n    0: {id: 0, name: \"Name 0\"}\n    1: {id: 1, name: \"Name 1\"}\n    2: {id: 2, name: \"Name 2\"}\n    3: {id: 3, name: \"Name 3\"}\n    4: {id: 4, name: \"Name 4\"}\n    5: {id: 5, name: \"Name 5\"}\n    6: {id: 6, name: \"Name 6\"}\n*/\n```\n\nUma versão alternativa:\n\n```javascript\nconst size = 7\nconst names = new Array(size)\n\nfor (let i = 0; i < size; i++) {\n  names[i] = {\n    id: i,\n    name: `Name ${i}`\n  }\n}\n/*\nnames = \n    0: {id: 0, name: \"Name 0\"}\n    1: {id: 1, name: \"Name 1\"}\n    2: {id: 2, name: \"Name 2\"}\n    3: {id: 3, name: \"Name 3\"}\n    4: {id: 4, name: \"Name 4\"}\n    5: {id: 5, name: \"Name 5\"}\n    6: {id: 6, name: \"Name 6\"}\n*/\n```\n\n## Array.fill\n\nOutra forma de gerar o array com valores é utilizando o `Array.fill`. Nesta forma, criamos um array com o tamanho desejado e informamos o valor para qual queremos preenchê-lo.\n\n```javascript\nconst array = new Array(15).fill('valor')\n// array = [\"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\"]\n```",
      "description": "Aprenda 5 formas de gerar arrays populados em JavaScript: Array.from, fill, spread, map e mais. Exemplos práticos para copiar e usar.",
      "keywords": [
        "name",
        "array",
        "valor",
        "person",
        "const",
        "javascript",
        "fill",
        "people",
        "forma",
        "size"
      ],
      "metadata": {
        "title": "Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos",
        "description": "Aprenda 5 formas de gerar arrays populados em JavaScript: Array.from, fill, spread, map e mais. Exemplos práticos para copiar e usar.",
        "date": "2021-07-25",
        "tags": "['Javascript']",
        "thumbnail": "array-javascript.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/como-gerar-um-array-populado-em-javascript/index.md"
      }
    },
    {
      "id": "1537b3ddead20344",
      "url": "https://devpleno.com/blog/modulos/index",
      "title": "NodeJS Primeiros Passos: Módulo em NodeJS (Part 3)",
      "content": "Confira a explicação completa em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/IXsxtIZuY90\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "function",
        "require",
        "dulo",
        "contar",
        "contador",
        "para",
        "modulo02",
        "modulo01",
        "isso",
        "vamos"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Módulo em NodeJS",
        "date": "2017-05-30",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Modulos.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/modulos/index.md"
      }
    },
    {
      "id": "153e7cc8794bb84b",
      "url": "https://devpleno.com/blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index",
      "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador (Part 1)",
      "content": "A demanda por programadores freelancers nunca foi tão alta. Com o crescimento do trabalho remoto nos últimos anos, cada vez mais empresas ao redor do mundo contratam desenvolvedores de qualquer lugar — e o Brasil tem se destacado como um dos maiores exportadores de talento tech.\n\nTrabalhar como freelancer oferece vantagens reais: você monta seus próprios horários, pratica inglês no dia a dia, ganha em moeda forte e constrói uma [carreira](https://www.devpleno.com/carreira-tomar-decisoes) com experiência internacional. E o melhor: você não precisa ser sênior para começar.\n\n> Se você já trabalha ou pretende trabalhar para empresas do exterior, precisa legalizar seus recebimentos no Brasil. A [Conta49](https://www.conta49.com.br) é uma contabilidade especializada em programadores que atuam remotamente para o exterior. Eles entendem as particularidades de receber em dólar, abrir PJ para tech e lidar com a tributação de serviços exportados. Acesse [www.conta49.com.br](https://www.conta49.com.br) e conheça os serviços.\n\nReuni 7 plataformas onde você pode encontrar trabalhos freelance como programador — desde opções para quem está começando até redes que pagam em dólar para os mais experientes.\n\n## 1. Toptal\n\nA [Toptal](https://www.toptal.com) é uma rede que seleciona apenas os top 3% dos freelancers do mundo por meio de um processo seletivo rigoroso. Eu trabalho por meio da Toptal e posso dizer que, uma vez aprovado, você tem acesso a projetos de grandes empresas e multinacionais, com pagamento em dólar.\n\nOs projetos variam entre tempo integral, meio período e por hora. A grande vantagem é a qualidade dos clientes e a estabilidade — muitos contratos duram meses ou anos. O processo seletivo é puxado (envolve entrevista técnica, live coding e projeto teste), mas compensa pelo nível dos projetos e da remuneração.\n\n**Ideal para:** devs com experiência sólida que querem projetos de alto nível pagos em dólar.\n\n## 2. Upwork",
      "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
      "keywords": [
        "para",
        "projetos",
        "mais",
        "https",
        "plataforma",
        "come",
        "freelancer",
        "ideal",
        "como",
        "experi"
      ],
      "metadata": {
        "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador",
        "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
        "date": "2026-04-04",
        "tags": "['Carreira']",
        "thumbnail": "Freelancers.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index.md"
      }
    },
    {
      "id": "1587a2474fbd0270",
      "url": "https://devpleno.com/injecao-de-dependencia",
      "title": "Injeção de dependência - Aumente a testabilidade do seu código - DevPleno (Part 2)",
      "content": "Vamos fazer o seguinte teste: imagine que temos um código que valida, e essa função vai haver um if que se for maior que 100 ela mostrará ERROR e retorna false:\n\nfunction valina(um) {\nif (num > 100) {\nalert('erro')\nreturn false\n}\nreturn true\n}\nSe rodarmos isso no node, teremos um erro, já que o alert não está no contexto do Node, pois o alert é um window.alert que faz parte do browser. Então, mesmo que eu chame ele direto no navegador, em qualquer lugar que eu chamar vai ser como um global, ou seja, ele pega de qualquer lugar que executarmos no browser, mas quando formos fazer um teste unitário, não vai funcionar porque ele não tem o alert, isso é um problema. Outro problema é que o alert não está sendo usado mais por exemplo. Então como trocamos ele? Isso gera muita dependência.\n\nO que podemos fazer?\n\nSe transformarmos ele em uma injeção de dependência, podemos passar o alert. Quando formos utilizar no browser, manda um window.alert e quando formos testar nossa função, se ela retornar false e erro caso o número for maior que 100.\n\nfunction valina(um) {\nif (num > 100) {\nalert('erro')\nreturn false\n}\nreturn true\n}\n\nconst assert = require('assert')\ndescribe('validations', () => {\nit('should return false and an error if num gt 100', () => {\nconst fakeAlert = (msg) => {\nassert.equal(msg, 'erro')\n}\nconst returnedValue = valida(fakeAlert, 101)\nassert.equal(returnedValue, false)\n})\n})\nPerceba que adicionamos um fakeAlert, que é uma função, e dentro dela quero checar se a mensagem que vai chamar é igual a mensagem que eu espero. Para fazer isso, usamos o const assert, que é do próprio node, ele verifica se a msg é igual a erro e quando formos chamar o valida, vamos passar esse fake Alert. Fizemos dois testes. Para o primeiro, passar os dois assert tem que valer, lembrando que vamos rodar ele com mocha.\n\nVamos supor que agora você vai dar manutenção neste código e a mensagem mudou, então vamos apenas no alert e corrigimos que está tudo certo.",
      "description": "Pode parecer besteira, mas eu sempre ouvia sobre injeção de dependência. porém nunca tinha refletido tanto sobre ela. Quando passei a testar mais o meu cód...",
      "keywords": [
        "alert",
        "para",
        "digo",
        "model",
        "depend",
        "quando",
        "ncia",
        "vamos",
        "temos",
        "return"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/injecao-de-dependencia"
      }
    },
    {
      "id": "158b0c16dfac7106",
      "url": "https://devpleno.com/blog/aplicacao-web/index",
      "title": "Aplicação Web - Entendendo Back-end e Front-end (Part 1)",
      "content": "Uma Aplicação Web sempre é composta por dois \"blocos\": o front-end e o back-end. Podemos classificar nossas tecnologias, arquiteturas, etc baseado nessas duas separações. É comum ouvir dizer também que o beck-end é Server Side, e o front-end Client Side.\n\n**O que é back-end?**\n\nSão todas as tecnologias que rodam em um \"Servidor\", uma ou mais maquinas.\n\n**E o front-end?**\n\nEle é tudo que roda do lado cliente, ou seja, o que o usuário final vê.\n\nPara a parte do cliente, geralmente temos o Navegador (browser), ele faz o Request para o servidor ou tecnologia back-end. (\\_Apenas esclarecendo, o request é o front-end pedindo alguma coisa ao back-end, por exemplo, uma página, uma imagem, por aí vai).\n\nA primeira comunicação sempre é feita do Front-end para o Beck-end. Por exemplo, ao entrar no site [www.devpleno.com]\n(https://www.devpleno.com) seu navegador faz uma requisição à máquina que está o servidor devpleno, com isso o server irá mandar uma resposta (response) para o navegador, que é nosso front-end. Essa comunicação é chamada de request-response, pois tudo é baseado nisso, entre a requisição do front, resposta do server.\n\n**Quais tecnologias temos para cada tipo?**\n\nAlgumas tecnologias front-end são: HTML, Javascript, CSS. Temos tembem alguns assets como imagem e PDF, eles são alguns arquivos que precisamos para funcionar o front-end. Antigamente existia o Flash e o Java Applet, mas hoje em dia estão em desuso por causa do HTML5.\n\nJa do lado Server side temos N tecnologias, tais como: PHP, ASP, JAVA, NodeJS, C#, Python, C++, etc. Além disso, podemos também ter banco de dados.",
      "keywords": [
        "front",
        "para",
        "tecnologias",
        "server",
        "side",
        "back",
        "lado",
        "temos",
        "devpleno",
        "https"
      ],
      "metadata": {
        "title": "Aplicação Web - Entendendo Back-end e Front-end",
        "date": "2017-05-12",
        "tags": "['Fundamentos']",
        "thumbnail": "APLICAÇÃO-WEB-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/aplicacao-web/index.md"
      }
    },
    {
      "id": "15bca93eb38b1474",
      "url": "https://devpleno.com/precificacao-de-softwares-voce-sabe-como-fazer",
      "title": "Precificação de softwares: você sabe como fazer? - DevPleno (Part 2)",
      "content": "Após isso, você pode definir a forma como pretende trabalhar, se por projeto independente, com começo, meio e fim, ou por meio da criação e manutenção de softwares. Nesse primeiro caso entram os pacotes mensais. Nesse segundo caso, os serviços de atualização, manutenção e prestação de suporte contínuo devem entra na conta.\n\n## Quais os critérios para precificar um software?\n\nAlém dos pontos mencionados acima, há critérios mais específicos que ajudam a compor o valor final a ser cobrado, seja por software ou por pacotes mensais. São eles:\n\n### Tempo\n\nA primeira coisa a pensar é o tempo gasto para a produção de um programa. Isso geralmente é calculado em valor/hora, pois facilita a mensuração de quanto o profissional deve ganhar por dia e semana para compor o seu salário. Além disso, durante a produção de uma solução, você basicamente comercializará o seu tempo e seus conhecimentos.\n\nPara definir o seu valor/hora você precisa avaliar o seu nível de experiência e seus conhecimentos. Por exemplo, um profissional júnior pode produzir até três vezes menos do que um de nível pleno, o que significa que o segundo poderá ganhar o triplo dele.\n\nAlém disso, é preciso contabilizar o grau de urgência do projeto a ser desenvolvido, pois quanto menor o prazo, maior é o valor a ser cobrado por hora.\n\n### Disponibilidade\n\nA sua disponibilidade também deve entrar na conta, principalmente se você é constantemente requisitado para muitos projetos. É a chamada lei de oferta e demanda: se há grande procura pelos seus serviços, você consegue aumentar mais o seu preço. Quando houver baixa demanda, então é indicado reduzir um pouco seus valores.\n\nNesse ponto, há um porém: existem momentos em que há poucos projetos, mas porque são períodos de transição de trabalhos.\n\n### Nível de experiência",
      "description": "Um dos desafios de quem trabalha na área de tecnologia, especificamente em desenvolvimento de programas, é a precificação de softwares. Por envolver ativos...",
      "keywords": [
        "para",
        "como",
        "software",
        "valor",
        "mais",
        "ncia",
        "hora",
        "tamb",
        "seus",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/precificacao-de-softwares-voce-sabe-como-fazer"
      }
    },
    {
      "id": "1631753c7eb0c674",
      "url": "https://devpleno.com/algoritmo-campo-minado-minesweeper",
      "title": "Algoritmos: Campo Minado (Minesweeper) - DevPleno (Part 2)",
      "content": "do{\nline = lines\\[current++\\]\nlet nums = line.split(' ')\nif(nums.length===2){\nconst numLines = parseInt(nums\\[0\\])\nconst numCols = parseInt(nums\\[1\\])\nif(numLines!==0 &#x26;&#x26; numCols!==0){\nconsole.log('Field #'+currentField+':')\nminesweeper(lines.slice(current, current+numLines), numCols)\ncurrentField++\n}\n}\n}while(line !== '0 0')\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Algoritmos%3A%20Campo%20Minado%20(Minesweeper)&url=https%3A%2F%2Fdevpleno.com%2Falgoritmo-campo-minado-minesweeper) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Falgoritmo-campo-minado-minesweeper)",
      "description": "Continuando nossa série sobre algoritmos que são utilizados em questões de competições/maratonas de programação e em entrevistas, neste post, iremos tratar...",
      "keywords": [
        "filledfield",
        "numcols",
        "minesweeper",
        "line",
        "algoritmos",
        "https",
        "campo",
        "minado",
        "const",
        "current"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/algoritmo-campo-minado-minesweeper"
      }
    },
    {
      "id": "1682f6d565c026c3",
      "url": "https://devpleno.com/devreactjs-espera",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-espera to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from",
        "espera"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-espera"
      }
    },
    {
      "id": "1693eed7fa4972ba",
      "url": "https://devpleno.com/participacao-em-eventos-e-comunidades",
      "title": "Participação em Eventos e Comunidades - DevPleno (Part 1)",
      "content": "Carreira\n\n## Participação em Eventos e Comunidades\n\nT\nPor Tulio Faria • 19 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nHoje eu vou comentar um pouco sobre a participação em eventos e em comunidades, esse tema foi sugerido pelo Ian Magalhães que comentou no nosso [canal do YouTube](https://www.youtube.com/deplenocom), e se você quiser fazer isso pode ficar à vontade, mande sua dúvida ou pergunta no e-mail ou pelo YouTube, estamos abertos para novos questionamentos.\n\nO que eu acho sobre comunidades e participação em eventos?\n\nQualquer comunidade que você participar eu acho muito importante, desde a do seu bairro ou de algum tema específico (seja de tecnologia ou não). É importante porque você tem a oportunidade de se conectar com pessoas e muitas vezes a gente esquece disso, não adianta desenvolver um software bem se não tem pessoas querendo utilizar isso, por exemplo, e as comunidades são uma grande oportunidade para fazer isso.\n\nAqui temos a associação de bairro, associação comercial e coisas do gênero que são pessoas reunidas tentando resolver um problema do assunto. Nada melhor que isso para conseguirmos trocar experiências com as pessoas.\n\nO DevPleno é uma comunidade em que estamos construindo, trocando experiências, utilizando até mesmo as informações que vocês passam para mim para passar para mais pessoas. Então se você não tem uma comunidade para discutir tecnologia na sua cidade, é muito importante você dar o passo rumo a isso.",
      "description": "Hoje eu vou comentar um pouco sobre a participação em eventos e em comunidades, esse tema foi sugerido pelo Ian Magalhães que comentou no nosso canal do Yo...",
      "keywords": [
        "isso",
        "para",
        "eventos",
        "pessoas",
        "evento",
        "comunidades",
        "https",
        "comunidade",
        "sobre",
        "importante"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/participacao-em-eventos-e-comunidades"
      }
    },
    {
      "id": "16ee44889d40d84c",
      "url": "https://devpleno.com/orientacao-objeto",
      "title": "Sou contra a orientação-objetos (OO)? - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Sou%20contra%20a%20orienta%C3%A7%C3%A3o-objetos%20(OO)%3F&url=https%3A%2F%2Fdevpleno.com%2Forientacao-objeto) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Forientacao-objeto)",
      "description": "Hoje eu queria responder uma pergunta que sempre me fazem: “Tulio, você é contra orientaçãoobjetos?” Primeiramente, eu não sou contra orientaçãoobjetos. Se...",
      "keywords": [
        "orienta",
        "https",
        "javascript",
        "objetos",
        "contra",
        "objeto",
        "come",
        "dentro",
        "funcional",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/orientacao-objeto"
      }
    },
    {
      "id": "1720928bc9b0b825",
      "url": "https://devpleno.com/fullstacklab-whatsapp",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstacklab-whatsapp to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstacklab",
        "whatsapp"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstacklab-whatsapp"
      }
    },
    {
      "id": "172e6cc3995b478f",
      "url": "https://devpleno.com/blog/17",
      "title": "Blog - Página 17 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 24 de mai. de 2017 JavaScript: Apply](/javascript-apply)\n\n[Carreira 24 de mai. de 2017 Qual é o seu maior desafio nesse momento?](/qual-seu-maior-desafio)\n\n[Carreira 23 de mai. de 2017 Como aumentar a produtividade diminuindo a troca de contexto](/como-aumentar-a-produtividade)\n\n[Carreira 23 de mai. de 2017 Como fazer Networking corretamente](/networking)\n\n[Javascript 23 de mai. de 2017 Servidores Web - Um pouco mais do back-end de uma Aplicação Web](/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web)\n\n[Fundamentos 22 de mai. de 2017 Animação basica em CSS3](/animacao-basica-css3)\n\n[Carreira 22 de mai. de 2017 Metas na carreira de desenvolvedor](/metas-na-carreira-de-desenvolvedor)\n\n[Algoritmos 22 de mai. de 2017 Once N vezes](/once-n-vezes)\n\n[Javascript 22 de mai. de 2017 Request e Response](/request-e-response)\n\n[Fundamentos 19 de mai. de 2017 Formatos de troca de dados em Aplicações Web](/formatos-de-troca-de-dados)\n\n[Javascript 19 de mai. de 2017 Postman - Como testar APIs - Hands-on](/postman-como-testar-apis)\n\n[Javascript 18 de mai. de 2017 Ctrl+C / Copy to Clipboard em JS](/copy-to-clipboard-em-js)\n\n[Anterior](/blog/16)17 / 26[Próxima](/blog/18)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "carreira",
        "como",
        "fundamentos",
        "blog",
        "algoritmos",
        "troca",
        "todos",
        "ferramentas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/17"
      }
    },
    {
      "id": "1742e833b1e68a34",
      "url": "https://devpleno.com/lista-encadeada-adicionar-com-o1",
      "title": "Lista encadeada - Adicionar com O(1) - DevPleno (Part 2)",
      "content": "list.add2(1)\nlist.add2(2)\nlist.add2(3)\nlist.print()\nPerceba que retornou 0 e 1 e nossa lista, a diferença que guardamos uma referência para o tail e utilizou apenas dele para checar e adicionar novos itens. Pode ser que consigamos otimizar esse código, a grande questão é que agora nosso algoritmo tem complexidade 0(1), a vantagem é que independente do tamanho da minha lista, adicionar a ela sempre custará uma constante.\n\nO único detalhe é que guardamos dois valores, vamos pensar que esses valores variam dependendo do tamanho da lista, geralmente pensaríamos o seguinte: se ele variasse muito seria um um temporal 2,mas ele sempre será 0(1) mesmo com o resultado 2 porque não faz diferença quando nós falamos em escala.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Lista%20encadeada%20-%20Adicionar%20com%20O(1)&url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-adicionar-com-o1) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-adicionar-com-o1)",
      "description": "Hoje vamos continuar falando mais um pouco sobre algoritmos que principalmente caem ou em listas de emprego ou competições de programação, mas vai ser um p...",
      "keywords": [
        "head",
        "tail",
        "adicionar",
        "lista",
        "vamos",
        "https",
        "para",
        "add2",
        "value",
        "node"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/lista-encadeada-adicionar-com-o1"
      }
    },
    {
      "id": "174f8f553ba43efd",
      "url": "https://devpleno.com/blog/async-await/index",
      "title": "ES6 - Async/Await (Part 2)",
      "content": "Com isso, podemos, por exemplo, ler 2 arquivos seguidos apenas adicionando um novo Await no código. Dois detalhes importantes: 1. Se formos usar o Await dentro de uma função, eu tenho que marcar esta function como Async. 2. Caso haja uma rejeição da promise, o node irá retornar o erro, mas com o código quebrado, com isso temos uma maneira correta de checar os erros com o Async/Await, usando o try catch:\n\n```jsx\ntry {\n    async function read(){\n    const contents = await readFilePromise ('arquivo.js')\n    console.log(contents.toString())\n  } catch(e){\n    console.log('erro', e)\n  }\n}\n```\n\n**Conclusão**\nUma coisa que percebemos muito nessa evolução do javaScript é que está ficando cada vez mais fácil de escrever código assincrono, que realmente era o calcanhar de Aquiles da linguagem, pois temos callBack hell e vários outros erros, atrapalhando a qualidade do código, então essas features novas que vem sendo adicionadas simplifica muito nossa forma de construir códigos.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/D01xWkT2W7c\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "await",
        "para",
        "arquivo",
        "async",
        "promise",
        "function",
        "digo",
        "const",
        "node",
        "readfilepromise"
      ],
      "metadata": {
        "title": "ES6 - Async/Await",
        "date": "2017-05-05",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Await-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/async-await/index.md"
      }
    },
    {
      "id": "17586f76491e96f7",
      "url": "https://devpleno.com/tag/javascript/2",
      "title": "Javascript - Pagina 2 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 10 de nov. de 2017 Chainability com Javascript](/chainability-com-javascript)\n\n[Javascript 10 de nov. de 2017 Entenda o que é Patternite](/patternite)\n\n[Javascript 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)\n\n[Javascript 7 de nov. de 2017 Closure Série - POO para JS](/closure-poo-para-js)\n\n[Javascript 7 de nov. de 2017 Pegadinha #1 de entrevistas em JavaScript](/pegadinha-de-entrevistas-de-javascript)\n\n[Javascript 6 de nov. de 2017 Mono ou multi thread - POO para JS](/mono-ou-multi-thread-poo-para-js)\n\n[Javascript 25 de out. de 2017 Pare de pensar em classes! Série - POO para JS](/pare-de-pensar-em-classes)\n\n[Javascript 18 de out. de 2017 Criando um teclado com WebAudioAPI](/teclado-com-webaudioapi)\n\n[Javascript 17 de out. de 2017 FS-Watch - Checando mudanças em um arquivo-diretório](/fs-watch)\n\n[Javascript 17 de out. de 2017 Grandes quantidades de dados com menos recursos](/grandes-quantidades-de-dados-com-menos-recursos)\n\n[Javascript 17 de out. de 2017 WebAudioAPI - Gerando um som no browser](/webaudioapi)\n\n[Javascript 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)\n\n[Anterior](/tag/javascript)2 / 16[Próxima](/tag/javascript/3)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "para",
        "webaudioapi",
        "arquivo",
        "algoritmos",
        "carreira",
        "ferramentas",
        "fundamentos",
        "nodejs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/2"
      }
    },
    {
      "id": "1761fa4557aa7a97",
      "url": "https://devpleno.com/es6-default-parameters",
      "title": "Javascript - ES6 Default Parameters - DevPleno (Part 2)",
      "content": "Imposto = typeof imposto === 'undefined' ? 0.07 : imposto\nAinda podemos fazer de uma outra forma, com o ES6:\n\nfunction aplicarImpostES6(valor, imposto = 0.07) {\nreturn valor + valor * imposto\n}\n\nconsole.log(aplicarImpostoES6(100, 0.1))\n\nconsole.log(aplicarImpostoES6(200))\n\nconsole.log(aplicarImpostoES6(300, 0))\nCom isso fica um pouco mais simples, porém podemos ir um além. Vamos supor que eu tenha um adicional, posso colocar esse adicional passando um valor, ou ele é um valor vezes o imposto mais porcentagem:\n\nfunction aplicarImpostES6(\nvalor,\nimposto = 0.07,\nadicional = valor * (imposto + 0.1)\n) {\nreturn valor + valor * imposto + adicional\n}\n\nconsole.log(aplicarImpostoES6(100, 0.1, 0))\n\nconsole.log(aplicarImpostoES6(200))\n\nconsole.log(aplicarImpostoES6(300, 0, 0))\nNo primeiro e último setei adicional como 0, então apenas no 200 ele vai aplicar os 10% além dos 7% já colocados antes. Essas são possibilidades interessantes de utilizar o default parameters no ES6, isso aumenta muito as possibilidades no nosso código.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Javascript%20-%20ES6%20Default%20Parameters&url=https%3A%2F%2Fdevpleno.com%2Fes6-default-parameters) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fes6-default-parameters)",
      "description": "Hoje vou falar um pouquinho de JavaScript, mais especificamente sobre como podemos fazer o parâmetro padrão para uma função e as alternativas que a gente t...",
      "keywords": [
        "imposto",
        "valor",
        "console",
        "aplicarimposto",
        "isso",
        "javascript",
        "para",
        "aplicarimpostoes6",
        "https",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/es6-default-parameters"
      }
    },
    {
      "id": "17f26634494d9e26",
      "url": "https://devpleno.com/navigator-geolocation",
      "title": "Navigator Geolocation API - Sabendo a localização do usuário - DevPleno (Part 1)",
      "content": "Javascript\n\n## Navigator Geolocation API - Sabendo a localização do usuário\n\nT\nPor Tulio Faria • 5 de outubro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje quero dar uma dica para vocês sobre geolocalização no navegador. É uma API que está cada vez mais disponível nos navegadores. O interessante é que conseguimos fazer aplicações WEB que tenham esse senso de localização.\n\nAlguns dos métodos que eles têm:\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;script>\nif('geolocation' in navigator){} else {Alert('ops')}\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nA partir disso, conseguiríamos checar a nossa localização. Podemos, por exemplo, fazer:\n\nif ('geolocation' in navigator) {\nnavigator.geolocation.getCurrentPosition(\nfunction (position) {\nconsole.log(position)\n},\nfunction (error) {\nConsole.log(error)\n}\n)\n} else {\nAlert('ops')\n}\nAo rodar o código e inspecionar, perceba que ele retorna a nossa posição.\n\nSe sua aplicação necessita ter essa possibilidade de checar a posição, é importante checar se não retornou um erro caso o usuário não aceite a verificação.\n\nOutra coisa bem interessante é que podemos checar, de tempos em tempos, a posição do usuário, fazendo um tracker, por exemplo:\n\nwatcher: navigator.geolocation.watchPosition(function (position) {\nconsole.log(position)\n})\nAgora, à medida que essa coordenada ficar mais precisa, vai ser melhor, pois ela vai nos trazendo essas informações.\n\nConseguimos aumentar essa precisão também utilizando o enableHighAccuracy:\n\nwatcher: navigator.geolocation.watchPosition(\nfunction (position) {\nconsole.log(position)\n},\nfunction (error) {\nconsole.log(error)\n},\n{ enableHighAccuracy: true, maximumAge: 30000, timeout: 30000 }\n)\nNo caso do watcher, podemos apagar, equivalente ao que podemos fazer com o clear interval:\n\nGeolocation.clearWatch(watcher)\nEsse é um pouco do geolocation. Eu trouxe essa dica pois a utilizamos no Fullstack Academy e eu já construí algumas aplicações utilizando isso também.",
      "description": "Hoje quero dar uma dica para vocês sobre geolocalização no navegador. É uma API que está cada vez mais disponível nos navegadores. O interessante é que con...",
      "keywords": [
        "geolocation",
        "navigator",
        "position",
        "https",
        "function",
        "console",
        "checar",
        "podemos",
        "error",
        "essa"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/navigator-geolocation"
      }
    },
    {
      "id": "1859e3467ecc57dd",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-2/index",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO (Part 1)",
      "content": "Na [primeira aula do minicurso de Sockt.IO](https://www.devpleno.com/minicurso-socket-io-parte-1/), fizemos a listagem dos jogos puxando do banco de dados baseado em json e quando clicamos conseguimos visualizar os dados dos jogos. Agora vamos adicionar o Socket.IO realmente a essa interface, configurando a parte do client e do server. Vamos começar pela parte do servidor, primeiramente vamos adicionar o Socket.IO:\n\n```jsx\nyarn add socket.io\n```\n\nDepois que ele adicionar, vou abrir o app.js do express e fazer algumas alterações, a primeira delas é adicionar um app.io e dar um require no Socket.IO já chamando o construtor dele. Como não temos o servidor, deixamos por enquanto, como se fosse uma promise que vamos criar o servidor depois.\n\n```jsx\napp.io = require('socket.io')()\n```\n\nFeito isso, eu vou alterar o www para poder anexar ao Socket.IO. Abrindo o www, perceba que temos um server e uma instancia daquele app, vamos adicionar à instancia desse app a instancia do Socket.IO passando o server que definimos\n\n```jsx\nvar server = http.createServer(app)\napp.io.attach(server)\n```\n\nAgora ele vai conseguir responder nesse server. De alguma forma, precisamos conectar as coisas, então vamos no partials que já tem algo pronto:\n\n```jsx\n<script src='/socket.io/socket.io.js'></script>\n```\n\nPerceba que eu já deixei a inclusão do /socket.io, que é o JavaScript que faz a parte client do Socket.IO. Vamos olhar na rede se o JavaScript está realmente sendo carregado corretamente. Ao clicar nele, perceba que ele já mostra o font do Socket.IO:\n\nEsta tudo correto, estamos com o Socket.IO conectado ao express. Agora temos que fazer o client conectar no server, vamos criar mais um JavaScript e incluir diretamente no app. Em public/js vamos criar um arquivo novo chamado match.js, dentro dele vai ter o um jQuery para simplificarmos um pouco e dentro dele terá um alert:\n\n```jsx\n$(function)(){\n    alert(1)\n})\n```",
      "keywords": [
        "vamos",
        "socket",
        "para",
        "index",
        "admin",
        "const",
        "criar",
        "dentro",
        "fazer",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO",
        "date": "2017-07-06",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-2/index.md"
      }
    },
    {
      "id": "18735bf0e69e2b41",
      "url": "https://devpleno.com/algoritmos-xor-swap",
      "title": "Vídeo sobre Algoritmos: XOR Swap - DevPleno",
      "content": "Algoritmos\n\n## Vídeo sobre Algoritmos: XOR Swap\n\nT\nPor Tulio Faria • 31 de março de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nO XOR é um operador bem versátil e uma coisa que gosto bastante é de estudar e analisar formas alternativas de utilização destes operadores. Neste vídeo mostro como é possível usar o XOR para trocar variáveis de lugar além de explorar o porquê isso acontece. Confira!\n\n## Confira o vídeo:\n\nE Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=V%C3%ADdeo%20sobre%20Algoritmos%3A%20XOR%20Swap&url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-xor-swap) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-xor-swap)",
      "description": "O XOR é um operador bem versátil e uma coisa que gosto bastante é de estudar e analisar formas alternativas de utilização destes operadores. Neste vídeo mo...",
      "keywords": [
        "https",
        "algoritmos",
        "swap",
        "para",
        "confira",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2falgoritmos",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/algoritmos-xor-swap"
      }
    },
    {
      "id": "187a411926a53514",
      "url": "https://devpleno.com/tag/carreira/7",
      "title": "Carreira - Pagina 7 - DevPleno",
      "content": "Carreira\n\n## Arquivo de Insights\n\n93 posts encontrados com a tag Carreira\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 23 de mai. de 2017 Como fazer Networking corretamente](/networking)\n\n[Carreira 22 de mai. de 2017 Metas na carreira de desenvolvedor](/metas-na-carreira-de-desenvolvedor)\n\n[Carreira 17 de mai. de 2017 Como organizar os estudos em tecnologia](/como-organizar-os-estudos-em-tecnologia)\n\n[Carreira 15 de mai. de 2017 Como cobrar por Software](/como-cobrar-por-software)\n\n[Carreira 15 de mai. de 2017 Por que todo Dev usa Mac?](/por-que-todo-dev-usa-mac)\n\n[Carreira 8 de mai. de 2017 Novas Skills: O preço que tem que ser pago](/nova-skills-preco-que-tem-que-ser-pago)\n\n[Carreira 8 de mai. de 2017 Racionalização: Tomando decisões racionais](/racionalizacao)\n\n[Carreira 3 de mai. de 2017 Como ser MUITO mais produtivo?](/como-ser-muito-mais-produtivo)\n\n[Carreira 2 de mai. de 2017 Carreira: Preço que tem que ser pago](/carreira-preco-que-tem-que-ser-pago)\n\n[Carreira 24 de abr. de 2017 Dica: Precificação em Software](/precificacao-em-software)\n\n[Carreira 4 de abr. de 2017 Carreira: Tomar decisões](/carreira-tomar-decisoes)\n\n[Carreira 27 de mar. de 2017 Carreira: Você é o passageiro da sua Vida?](/carreira-voce-e-o-passageiro-da-sua-vida)\n\n[Anterior](/tag/carreira/6)7 / 8[Próxima](/tag/carreira/8)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "2017",
        "como",
        "software",
        "pago",
        "algoritmos",
        "ferramentas",
        "fundamentos",
        "javascript",
        "nodejs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/carreira/7"
      }
    },
    {
      "id": "18b23d41c91a29d1",
      "url": "https://devpleno.com/gerenciador-de-series-p1",
      "title": "Construindo um App gerenciador de séries com ReactJS - DevPleno (Part 4)",
      "content": "import React, { Component } from 'react'\n\nclass Ola extends Component {\nrender() {\nreturn &#x3C;span>Olá DevPleno!&#x3C;/span>\n}\n}\n\nexport default Ola\nEsse componente está preso ali, temos que avisar o ‘mundo externo’ que esse componente existe para podemos utilizá-lo, por isso utilizamos o export. Agora dentro de app.js, por exemplo, podemos fazer o seguinte:\n\nimport Ola from './Ola'\nPodemos depois colocar no final:\n\n&#x3C;Ola>&#x3C;/Ola>\ne o resultado é o seguinte:\n\nAcabamos de criar um componente. Outra coisa importante é que conseguimos injetar dados, como por exemplo:\n\n&#x3C;Ola name='Tulio' />\nE dentro do Ola.js fazer o seguinte:\n\nimport React, { Component } from 'react'\nclass Ola extends Component {\nrender() {\nreturn &#x3C;span>Olá {this.props.name}!&#x3C;/span>\n}\n}\nexport default Ola\nEssa é uma forma de enviar dados do componente pai para o filho, afinal estamos passando propriedades (ou props) para o componente.\n\nDurante a execução do projeto que vamos fazer, utilizaremos bastante isso.\n\nPor fim, vou mostrar como vamos criar o banco de dados que vamos utilizar com o Json Server. Vou criar dentro de src mesmo, apenas para teste, chamado db.json.\n\nEsse db.json vai ter o seguinte formato:\n\n{\n\"series\":[{\n\"id\": 1,\n\"name\": \"How I met your mother\"\n},\n{\n\"id\": 2,\n\"name\": \"Friends\"\n}]\n}\nVamos salvar e dentro do diretório colocar\n\njson-server --watch db.json\nCom isso, temos um resource Séries dentro do nosso localhost. Então, se acessarmos o código via browser, temos acesso ao Json preparado para podermos assumir dentro da aplicação, apenas utilizando a url.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Nesta nova série, vamos construir um aplicativo na prática, mais especificamente um gerenciador de séries, para você nunca mais esquecer as séries que assi...",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/gerenciador-de-series-p1"
      }
    },
    {
      "id": "19019aa5af8c2401",
      "url": "https://devpleno.com/blog/aprenda-a-aprender/index",
      "title": "Aprenda a aprender (Part 1)",
      "content": "Nesta dica de carreira, vou contar como podemos aprender mais. O ponto mais importante de quando estamos aprendendo algo novo, seja uma tecnologia, uma linguagem ou qualquer outra coisa, é tentar achar a melhor forma para aprender.\n\nMuita gente me diz “eu não consigo ler um livro e entender o que está no livro”, existe uma teoria que se chama a teoria das múltiplas inteligências, na qual diz que cada um tem uma combinação de tipos de inteligência, então você pode ter facilidade para algumas coisas e dificuldades para outras, isso é normal e você consegue praticar uma ou outra.\n\nQuando você aprende o jeito que você aprende fica muito mais fácil. Por exemplo, para eu aprender algo, preciso fazer um paralelo com a aplicação prática disso, se eu quero aprender uma teoria sobre algo, tento trazer para qual a aplicação prática eu tenho e como eu posso aplicar isso na prática. No ensino médio, quando estava aprendendo geometria, eu já programava, então tentava trazer para o mundo que eu gostava, programava jogo, por exemplo, aplicando isso. São coisas que não esqueço mais porque eu aprendi como aprender de uma forma mais efetiva.\n\nVamos supor que você tenha uma facilidade maior de aprender ouvindo, então tudo que você tem que aprender, leia e grave em um gravador, depois ouça sua própria voz lendo esse conteúdo. Gosta de vídeos? Então ache vídeos no YouTube e assista para absorver da melhor forma possível.\n\nUma outra forma que me ajuda bastante é, ao invés de eu ler um texto longo, separar por tópicos, organizar em causa e efeito, com isso uma mapa mental me ajuda bastante a organizar a informação.\n\nA dica de hoje é experimente formatos diferentes quando você está aprendendo algo, pode ser que você está tentando aprender da maneira que não é bom para você. Cada um aprende de uma maneira, encontre a sua!\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/srvQS8G_rx4\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "para",
        "aprender",
        "mais",
        "quando",
        "algo",
        "forma",
        "isso",
        "como",
        "aprendendo",
        "outra"
      ],
      "metadata": {
        "title": "Aprenda a aprender",
        "date": "2017-07-12",
        "tags": "['Carreira']",
        "thumbnail": "APRENDA-A-APRENDER-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/aprenda-a-aprender/index.md"
      }
    },
    {
      "id": "1901a94a1297a9d3",
      "url": "https://devpleno.com/dica-n-vezes",
      "title": "Dica: Once n vezes - DevPleno",
      "content": "Javascript\n\n## Dica: Once n vezes\n\nT\nPor Tulio Faria • 17 de abril de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste vídeo. iremos implementar em Javascript uma função utilitária que permite uma função ser executada apenas uma vez (once) e também modificamos um pouco este exemplo para que possa ser limitado a n-vezes.\n\nDependendo da regra de negócio, poderia ser utilizado para permitir que uma ação seja executada apenas x vezes.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Once%20n%20vezes&url=https%3A%2F%2Fdevpleno.com%2Fdica-n-vezes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-n-vezes)",
      "description": "Neste vídeo. iremos implementar em Javascript uma função utilitária que permite uma função ser executada apenas uma vez (once) e também modificamos um pouc...",
      "keywords": [
        "https",
        "vezes",
        "javascript",
        "para",
        "dica",
        "once",
        "nodejs",
        "executada",
        "apenas",
        "este"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-n-vezes"
      }
    },
    {
      "id": "1910f8eaedfb9213",
      "url": "https://devpleno.com/blog/bind/index",
      "title": "Bind - Altere comportamento e contexto de execução de suas funções (Part 1)",
      "content": "O que é um bind em JavaScript? Para mostrar uma das utilidades do bind, eu criei um pequeno exemplo:\n\n```jsx\n;(function () {\n  this.valor = 10\n\n  const modulo = {\n    valor: 20,\n\n    getValor: function () {\n      return this.valor\n    }\n  }\n\n  console.log(modulo.getValor())\n\n  const getValor = modulo.getValor\n\n  console.log(getValor())\n})()\n```\n\nEu tenho um objeto literal que cria um contexto novo. Para esse contexto, o this.valor vai ser igual a 20 e quando eu der um getValor, ele irá retornar o this.valor. Logo acima temos um this.valor que faz referência a primeira função e ao colocarmos o console.log = modulo.getValor ele vai executar referente ao pai dele.\n\nSe criarmos uma nova constante e pegamos só a função extraindo desse objeto literal de cima, quando eu dou console.log(getvalor()), ele trás 20 e 10. 20 é o valor que está dentro do módulo e a segunda vez está pegando o 10 que está fora do módulo.\n\nIsso acontece porque quando eu criei a cópia dele e não especifiquei nada, ele vai utilizar o this na chamada de onde ele está, então acabamos criando um cenário meio inconsistente.\n\nUma das coisas que o bind permite é exatamente isso, quando eu crio essa cópia, eu posso passar um bind onde eu falo em qual contexto eu quero que ele execute. Por exemplo, eu quero que ele execute no contexto do módulo:\n\n```jsx\nconst getValor = modulo.getValor.bind(modulo)\n```\n\nisso é bastante útil quando criamos as classes em ES6 porque naturalmente ele não tem o bind para o contexto da classe, então podemos fazer no construtor.\n\nA outra utilidade que temos para o bind é, por exemplo, criar uma função que recebe dois parâmetros e criar uma função2, que é a função1 com bind fixando o parâmetro:\n\n```jsx\nfunction func1(param1, param2) {\n  console.log(param1, param2)\n}\n\nconst funct2 = func1.bind(null, 'paramfixo')\n\nconsole.log(func2('param2'))\n```",
      "keywords": [
        "bind",
        "getvalor",
        "quando",
        "para",
        "valor",
        "this",
        "modulo",
        "console",
        "contexto",
        "isso"
      ],
      "metadata": {
        "title": "Bind - Altere comportamento e contexto de execução de suas funções",
        "date": "2017-07-27",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "BIND-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/bind/index.md"
      }
    },
    {
      "id": "19618d849a102f9c",
      "url": "https://devpleno.com/blog/split-em-strings/index",
      "title": "Dicas utilizando o Split em Strings",
      "content": "Na dica de hoje quero mostrar alguns 'macetes' que podemos fazer com o Split, uma função de uma String em JavaScript.\n\nPrimeiramente o que é Split? Ele divide uma String em partes, por exemplo:\n\n```jsx\nconst str = 'Tulio Faria'\nconst parts = str.split(' ')\nconsole.log(parts)\n```\n\nCom isso, criamos um vetor com o nome e o sobrenome. O interessante disso é que podemos combinar ele com algumas coisas, por exemplo, com o join:\n\n```jsx\nconst parts = str.split(' ').join('====')\n```\n\nAssim o resultado seria Tulio===Faria. Em algumas situações, é possível fazer alguns processamentos mais inteligentes com essa técnica.\n\nAlém disso podemos parar de utilizar expressão regular, afinal aqui usamos somente a string pura. Outra coisa interessante é que podemos utilizar até mesmo arrow functions, vamos supor que eu quisesse, por exemplo, fazer o seguinte:\n\n```jsx\nconst str = 'Tulio 0 Faria'\nconst parts = str.split(' ').filter((p) => p != '0')\n```\n\nAssim conseguimos remover o zero do meio da String. São algumas combinações bastante legais, principalmente quando começamos a cascatear ou fazer um link de uma para outra.\n\nOutro 'macete' interessante é o seguinte: se eu der um Split em espaço, ele divide letra a letra:\n\n```jsx\n.split(' ')\n```\n\nAssim poderíamos, por exemplo, tirar as vogais:\n\n```jsx\nconst vogais = 'aeiou'\n  .plit(' ')\n  .split(' ')\n  .filter((letra) => vogais.indexOf(letra) < 0)\n```\n\nCom isso retornamos apenas as consoantes do meu nome.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/3d-wAbwJKtk\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "split",
        "const",
        "podemos",
        "fazer",
        "string",
        "exemplo",
        "parts",
        "letra",
        "embed",
        "tulio"
      ],
      "metadata": {
        "title": "Dicas utilizando o Split em Strings",
        "date": "2017-10-05",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "SplitString.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/split-em-strings/index.md"
      }
    },
    {
      "id": "1964dc3bcb529057",
      "url": "https://devpleno.com/projeto-certo-para-estudar-programacao",
      "title": "Qual o projeto certo para estudar programação? - DevPleno (Part 3)",
      "content": "Colocar o seu programa em produção é muito importante para você, desenvolvedor, porque ao disponibilizar suas aplicações em seu Github, por exemplo, um recrutador terá mais facilidade de avaliar o seu trabalho e saber se você é o profissional que ele procura para uma vaga de emprego. Além disso, você exercita como publicar os seus projetos.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Qual%20o%20projeto%20certo%20para%20estudar%20programa%C3%A7%C3%A3o%3F&url=https%3A%2F%2Fdevpleno.com%2Fprojeto-certo-para-estudar-programacao) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprojeto-certo-para-estudar-programacao)",
      "description": "Ao iniciar a jornada de estudos sobre programação, livros, vídeos, tutoriais e dicas em sites são os principais recursos para aprender como desenvolver um ...",
      "keywords": [
        "para",
        "https",
        "projeto",
        "devpleno",
        "estudar",
        "programa",
        "como",
        "mais",
        "aplica",
        "aprender"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/projeto-certo-para-estudar-programacao"
      }
    },
    {
      "id": "19caddba42a180a6",
      "url": "https://devpleno.com/blog/falta-de-tempo/index",
      "title": "Falta tempo para realizar aquele projeto? (Part 1)",
      "content": "Você sempre diz para as pessoas que não tem tempo para realizar um projeto? Quando te perguntam se conseguiu implementar aquela ideia, você responde “Sabe como é, eu não tenho tempo”…?\n\nSe você é uma pessoa que fala sempre que não tem tempo para alguma coisa, na verdade você não tem prioridade para aquela coisa. Achei uma frase bastante interessante e se encaixa bem aqui: “se tudo dependesse de tempo, desocupado teria sucesso”.\n\nA minha dica de hoje para você é: pegue aquele projeto que você sempre quis implementar e dedique um pouco de tempo, todos os dias, para aquele projeto. Isso é o suficiente para você perceber que ele está andando, mas que não vai te sacrificar tanto e vai fazer muita diferença no final de um mês ou no final de um ano.\n\nSe você reclama muito que não tem tempo, avalie suas prioridades, será que você está dando prioridade para a coisa certa? Será que não está deixando um tempinho escapar assistindo televisão, por exemplo?\n\nÉ engraçado pensar nisso porque eu até mudei a forma como falo atualmente. Não falo mais que não tenho tempo para realizar alguns projetos, mas sim que eles não são prioridades no momento. Uma das coisas que fiz quando tirei o DevPleno do papel é que não existiria mais essa de tempo, o DevPleno era (e ainda é) prioridade, e assim engavetei outros projetos e foquei no DevPleno.\n\nÉ muito mais maduro dizer que você priorizou algum projeto em comparação a outros do que dizer que não tem tempo, porque muitas vezes você vai usar seu tempo para um hobby, por exemplo. Então é muito melhor dizer que não tem prioridade.\n\nEssa é uma pequena reflexão sobre o tempo que eu faço diariamente sobre minha carreira, sobre minha vida. Será que eu estou empregando o tempo da maneira correta? Quanto mais eu reflito sobre isso, mais fico racional e isso é muito bom porque consigo performar mais.",
      "keywords": [
        "tempo",
        "para",
        "mais",
        "muito",
        "devpleno",
        "sempre",
        "projeto",
        "prioridade",
        "isso",
        "sobre"
      ],
      "metadata": {
        "title": "Falta tempo para realizar aquele projeto?",
        "date": "2017-09-19",
        "tags": "['Carreira']",
        "thumbnail": "FALTA-DE-TEMPO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/falta-de-tempo/index.md"
      }
    },
    {
      "id": "1a15123212944c9a",
      "url": "https://devpleno.com/blog/fetch-hands-on/index",
      "title": "Fetch - Uma nova forma de fazer requisições HTTP (Part 2)",
      "content": "Caso a URL esteja errada, ele vai retornar que não foi encontrada. Fica muito mais fácil de fazer essas requisições em HTTP. Como é uma promise, nós conseguimos fazer várias ao mesmo tempo, utilizar com generator, await async e por ai vai, fica bem mais organizado.\n\nEu mostrei essas duas formas, post e get, mas é simples fazer as outras formas também. Uma última coisa interessante é que, nos navegadores, ele já está disponível como window.fetch\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/z3GOk4nOf7g\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "fetch",
        "para",
        "fazer",
        "json",
        "como",
        "http",
        "then",
        "post",
        "interessante",
        "muito"
      ],
      "metadata": {
        "title": "Fetch - Uma nova forma de fazer requisições HTTP",
        "date": "2017-07-27",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "FETCH-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/fetch-hands-on/index.md"
      }
    },
    {
      "id": "1a209ddd1b1f1b2f",
      "url": "https://devpleno.com/blog/ferramentas-par-layouts-com-flexbox/index",
      "title": "Hands-on: Ferramentas visuais para Flexbox",
      "content": "Flexbox é uma nova forma de criar layouts em CSS. Neste hands-on, mostro algumas ferramentas que ajudam bastante na hora de ver o impacto de cada propriedade visualmente.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Puz6RHPQ_uM\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "flexbox",
        "nova"
      ],
      "metadata": {
        "title": "Hands-on: Ferramentas visuais para Flexbox",
        "date": "2017-05-02",
        "tags": "['Javascript']",
        "thumbnail": "maxresdefault-11-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/ferramentas-par-layouts-com-flexbox/index.md"
      }
    },
    {
      "id": "1a9d0662c931fe3b",
      "url": "https://devpleno.com/empreender-na-area-de-software",
      "title": "3 dicas para começar a empreender na área de software - DevPleno (Part 2)",
      "content": "Vender é algo necessário para qualquer empresa e negociação é a base que você tem para alinhar as expectativas. Você tem que estar cobrando um valor justo e seu cliente deve sair com a sensação que você está pagando um valor justo.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=3%20dicas%20para%20come%C3%A7ar%20a%20empreender%20na%20%C3%A1rea%20de%20software&url=https%3A%2F%2Fdevpleno.com%2Fempreender-na-area-de-software) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fempreender-na-area-de-software)",
      "description": "Hoje quero dar três dicas para você que está começando a empreender na área de software. Vou aproveitar uma dúvida e comentário do João Henrique, em um víd...",
      "keywords": [
        "para",
        "vender",
        "https",
        "come",
        "dica",
        "carreira",
        "software",
        "duas",
        "empreender",
        "ando"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/empreender-na-area-de-software"
      }
    },
    {
      "id": "1af555b9a69bb72e",
      "url": "https://devpleno.com/streams-parte-1",
      "title": "Hands-on: Streams - Parte 1 - DevPleno (Part 2)",
      "content": "const fs = require('fs')\nconst readable = sf.crateReadStream('arquivo.txt')\nreadable.on('data', (data) => {\nconsole.log(data.toString())\n})\nQuando colocamos o readable.on, ele ‘ouve’ o tipo data e o readable entra em modo flowing, também conhecido como modo push. Este modo é muito utilizado em operações de rede, como por exemplo ler um upload de um arquivo de um usuário (javaScritp client side), com isso vamos tratando estes dados na medida que vai sendo enviado.\n\nPodemos criar, também, uma forma em que o readable nos envie a leitura de tempo em tempo usando readable.pause e readable.resume, da seguinte forma:\n\nconst fs = require('fs')\nconst readable = sf.crateReadStream('arquivo.txt')\nreadable.on('data', (data) => {\nconsole.log(data.toString())\nreadable.pause()\nsetTimeout(() => readable.resume(), 2000)\n})\nNo exemplo acima, o readable nos retorna partes do arquivo a cada 2 segundos. A segunda forma que podemos fazer é usando o paused mode. Quando o arquivo tiver um evento readable (consegue ler dados do Stream), eu solicito o envio desses dados ao invés dele me enviar de tempo em tempo. Fazemos isso usando o chunk.\n\nconst fs = require('fs')\nconst readable = sf.crateReadStream('arquivo.txt')\nreadable.on('readable', () => {\nwhile ((chunk = readable.read())) {\nconsole.log(chunk.toString())\n}\n})\n**Qual a vantagem do modo paused?**\n\nEu posso ir processando uma pequena quantia de dados de acordo com o que eu quero.\n\n**Conclusão**\n\nEssa foi uma noção inicial dos readable Streams, vamos passar por todos os outros modos, mas dentro do readable temos os 2 modos, o pause e o flowing. Confira o hands-on completo no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Olá! Neste post, vamos falar sobre Streams, um conceito utilizando em JavaScript mas que pode ser aplicado em outras linguagens. Nele temos uma grande quan...",
      "keywords": [
        "readable",
        "dados",
        "arquivo",
        "stream",
        "data",
        "para",
        "vamos",
        "const",
        "https",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/streams-parte-1"
      }
    },
    {
      "id": "1b825fce01016b3e",
      "url": "https://devpleno.com/blog/falta-de-tempo/index",
      "title": "Falta tempo para realizar aquele projeto? (Part 2)",
      "content": "Avalie se você não está perdendo tempo em algumas tarefas ou coisas que não deveria fazer. Isso é muito importante para sempre conseguir objetivos cada vez maiores.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/B9o6PCw9I58\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "tempo",
        "para",
        "mais",
        "muito",
        "devpleno",
        "sempre",
        "projeto",
        "prioridade",
        "isso",
        "sobre"
      ],
      "metadata": {
        "title": "Falta tempo para realizar aquele projeto?",
        "date": "2017-09-19",
        "tags": "['Carreira']",
        "thumbnail": "FALTA-DE-TEMPO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/falta-de-tempo/index.md"
      }
    },
    {
      "id": "1bb08de4386342de",
      "url": "https://devpleno.com/blog",
      "title": "Blog - DevPleno (Part 2)",
      "content": "[Javascript 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)\n\nAnterior\n1 / 26[Próxima](/blog/2)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "como",
        "para",
        "javascript",
        "programador",
        "2018",
        "ferramentas",
        "claude",
        "code",
        "sites"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/blog"
      }
    },
    {
      "id": "1bd3ef02164b773a",
      "url": "https://devpleno.com/devreactjs-carta",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-carta to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from",
        "carta"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-carta"
      }
    },
    {
      "id": "1c00910fcc9ca0f8",
      "url": "https://devpleno.com/blog/injecao-de-dependencia/index",
      "title": "Injeção de dependência - Aumente a testabilidade do seu código (Part 2)",
      "content": "```jsx\nfunction valina(um) {\n  if (num > 100) {\n    alert('erro')\n    return false\n  }\n  return true\n}\n```\n\nSe rodarmos isso no node, teremos um erro, já que o alert não está no contexto do Node, pois o alert é um window.alert que faz parte do browser. Então, mesmo que eu chame ele direto no navegador, em qualquer lugar que eu chamar vai ser como um global, ou seja, ele pega de qualquer lugar que executarmos no browser, mas quando formos fazer um teste unitário, não vai funcionar porque ele não tem o alert, isso é um problema. Outro problema é que o alert não está sendo usado mais por exemplo. Então como trocamos ele? Isso gera muita dependência.\n\nO que podemos fazer?\n\nSe transformarmos ele em uma injeção de dependência, podemos passar o alert. Quando formos utilizar no browser, manda um window.alert e quando formos testar nossa função, se ela retornar false e erro caso o número for maior que 100.\n\n```jsx\nfunction valina(um) {\n  if (num > 100) {\n    alert('erro')\n    return false\n  }\n  return true\n}\n\nconst assert = require('assert')\ndescribe('validations', () => {\n  it('should return false and an error if num gt 100', () => {\n    const fakeAlert = (msg) => {\n      assert.equal(msg, 'erro')\n    }\n    const returnedValue = valida(fakeAlert, 101)\n    assert.equal(returnedValue, false)\n  })\n})\n```\n\nPerceba que adicionamos um fakeAlert, que é uma função, e dentro dela quero checar se a mensagem que vai chamar é igual a mensagem que eu espero. Para fazer isso, usamos o const assert, que é do próprio node, ele verifica se a msg é igual a erro e quando formos chamar o valida, vamos passar esse fake Alert. Fizemos dois testes. Para o primeiro, passar os dois assert tem que valer, lembrando que vamos rodar ele com mocha.\n\nVamos supor que agora você vai dar manutenção neste código e a mensagem mudou, então vamos apenas no alert e corrigimos que está tudo certo.",
      "keywords": [
        "alert",
        "para",
        "model",
        "quando",
        "digo",
        "depend",
        "vamos",
        "temos",
        "return",
        "ncia"
      ],
      "metadata": {
        "title": "Injeção de dependência - Aumente a testabilidade do seu código",
        "date": "2017-06-01",
        "tags": "['Javascript']",
        "thumbnail": "InjecaoDependenciaPrin.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/injecao-de-dependencia/index.md"
      }
    },
    {
      "id": "1c38370f2266f4e2",
      "url": "https://devpleno.com/blog/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira/index",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira (Part 4)",
      "content": "Nos Estados Unidos e nos países da Europa, a média de qualificação dos profissionais freelancers pode ser superior à média do Brasil. Como se sobressair diante de tamanha concorrência? [Atualize-se, esteja em constante capacitação](https://www.devpleno.com/carreira-tomar-decisoes?utm_source=blog&utm_campaign=rc_blogpost).\n\n## 7. Conheça as especificidades de seu campo de atuação no exterior\n\nUma mudança para outro país sempre requer um período de adaptação. No que se refere, especificamente, a questões ligadas ao trabalho freelancer, não é diferente.\n\nAs exigências para um [desenvolvedor no Brasil](https://www.youtube.com/watch?v=vOoqJ7l2ng8&utm_source=blog&utm_campaign=rc_blogpost), por exemplo, podem ser diferentes daquelas existentes no Reino Unido. Antes de iniciar uma trajetória profissional fora do país é importante se ater a questões como essa.\n\nSer um freelancer no exterior pode ser uma experiência incrível. Muitas pessoas conseguem combinar a oportunidade de trabalho com uma rotina de viagens muito interessante. Ou, simplesmente, conseguem se estabelecer naquele país em que sempre sonharam viver.\n\nPara alcançar esses objetivos, o freelancer deve priorizar a realização de uma etapa de preparação. Nesse sentido, todas as dicas apresentadas aqui não podem ser deixadas de lado.\n\nGostou das nossas dicas sobre ser freelancer no exterior? Siga compartilhando nossos conteúdos nas redes sociais!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "trabalho",
        "freelancer",
        "exterior",
        "pode",
        "mais",
        "isso",
        "como",
        "brasil",
        "pessoas"
      ],
      "metadata": {
        "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira",
        "date": "2017-07-03",
        "tags": "['Carreira']",
        "thumbnail": "101429-freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira/index.md"
      }
    },
    {
      "id": "1c8410d6bce37c53",
      "url": "https://devpleno.com/blog/arrow-functions/index",
      "title": "Arrow Functions - Construindo funções anônimas de forma mais simplificada (Part 1)",
      "content": "As Arrow Functions são uma maneira mais simples ou menor de construir funções anônimas. foi uma novidade no ES6, e hoje todo mundo já está utilizando bastante. Então, no modo anterior, tínhamos:\n\n```jsx\nconst funct1 = function (param1) {}\n```\n\nSe fossemos construir isso com uma Arrow Function, poderíamos fazer simplesmente isso:\n\n```jsx\nconst funct1 = (param) => {}\n```\n\n**Por que ela se chama Arrow Function?**\n\nPorque a definimos utilizando uma arrow. É a mesma funcionalidade, mas com uma arrow, existe apenas uma particularidade que vou mostrar para você. Quando temos algo com um cenário acima, chamamos essa arrow function de statement, ou seja, ela tem instruções dentro do corpo dela, por isso ela tem a chave. Temos um outro tipo de arrow function que é a seguinte:\n\n```jsx\nconst2 = function (valor) {\n  return valor * 2\n}\n```\n\nSe quisermos criar uma Arrow Function nesse sentido, precisamos passar também o valor, mas podemos fazer apenas isso:\n\n```jsx\nconst funct2 = (valor) => valor * 2\n```\n\nChamamos esse tipo de Expression Body, afinal o corpo dela é uma expressão. Perceba como fica bem mais simples. Vamos supor que eu tenha um vetor e eu quero fazer um map:\n\n```jsx\nconst vetor = [1, 2, 3]\n\nvetor.map((valor) => valor * 2)\n```\n\nA única diferença em relação ao function, no primeiro caso quando criamos uma function, ele cria um contexto novo, então se eu tivesse uma variável dentro, o contexto é o da função. Caso eu use this, vou estar referenciando a function, quando eu faço this dentro de uma arrow function, estou referenciando um contexto externo. Então, se eu estiver com duas funções, uma dentro da outra, o this irá referenciar o contexto global, logo ela não tem esse this que é somente dela, e sim é atrelada ao contexto do pai. Vamos supor que existe um botão em react e ele está dentro de um render:\n\n```jsx\nclass Componente extends Component{\n\n  loadData(){\n    //anything\n  }\n\n  render(){\n    return(\n      <button onClick={() => this.loadData()}\n    )\n  }\n}\n```",
      "keywords": [
        "function",
        "arrow",
        "dentro",
        "this",
        "contexto",
        "valor",
        "isso",
        "mais",
        "const",
        "fazer"
      ],
      "metadata": {
        "title": "Arrow Functions - Construindo funções anônimas de forma mais simplificada",
        "date": "2017-08-02",
        "tags": "['Fundamentos', 'Javascript']",
        "thumbnail": "ARROW-FUNCTIONS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/arrow-functions/index.md"
      }
    },
    {
      "id": "1caa5cfe6c67d276",
      "url": "https://devpleno.com/minicurso-socket-io-parte-4",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms - DevPleno (Part 1)",
      "content": "Javascript\n\n## Minicurso Socket.IO Parte 4 - Separando notificações por Rooms\n\nT\nPor Tulio Faria • 10 de julho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNesta etapa do nosso minicurso de Socket.IO, vamos fazer as atualizações específicas de cada jogo. Primeiro vamos fazer o gráfico da torcida se movimentar.\n\nDentro de match.ejs, vamos mudar para refletir realmente os valores da porcentagem, se olharmos as barras, vamos ver que na torcida está apenas uma barra fixa:\n\n&#x3C;div class=\"bar-team-a\" style=\"width: 80%\">&#x3C;/div>\n&#x3C;div class=\"bar-team-b\" style=\"width: 20%\">&#x3C;/div>\nPrecisamos alterar esse valor, vamos em routes/index.js e quando pegarmos um jogo vamos calcular a porcentagem da torcida. Se pegarmos nosso banco, para cada time nós temos um **‘supporters’,** que é o número de pessoas que clicaram na torcida para aquele time em específico, então vamos pegar os dois times e calcular a porcentagem:\n\nconst supportersA = match['team-a'].supporters\nconst supportersB = match['team-b'].supporters\nconst total = supportersA + supportersB\nconst porcentagem = {\nteamA: 50,\nteamB: 50\n}\nif (total > 0) {\nporcentagem.teamA = ((supportersA / total) * 100).toFixed(0)\nporcentagem.teamB = ((supportersB / total) * 100).toFixed(0)\n}\nmatch.porcentagem = porcentagem\nEntão temos como padrão 50/50, e se for maior que zero, o time A vai ser igual ao número de votos que o time A tem dividido pelo total e multiplicado por 100. Fizemos a mesma coisa para o time B. Por fim, enviamos o objeto porcentagem dentro de match.\n\nVoltando ao match.ejs, temos que colocar os valores lá dentro:\n\n&#x3C;div class=\"bar-team-a\" style=\"width: &#x3C;%- JSON.stringfy(match.porcentagem.teamA) %>%\">&#x3C;/div>\n&#x3C;div class=\"bar-team-b\" style=\"width: &#x3C;%- JSON.stringfy(match.porcentagem.teamB) %>%\">&#x3C;/div>\nPronto, agora nossa barra está 50/50, quando eu clicar na torcida do time A, vou somar 1 e preciso retornar via Socket.IO a atualização na torcida para a barra.",
      "description": "Nesta etapa do nosso minicurso de Socket.IO, vamos fazer as atualizações específicas de cada jogo. Primeiro vamos fazer o gráfico da torcida se movimentar....",
      "keywords": [
        "match",
        "supporters",
        "team",
        "para",
        "porcentagem",
        "const",
        "socket",
        "vamos",
        "torcida",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-4"
      }
    },
    {
      "id": "1cc6c65c12d493bc",
      "url": "https://devpleno.com/preview-de-imagens-antes-do-upload",
      "title": "Preview de imagens antes do upload - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Preview%20de%20imagens%20antes%20do%20upload&url=https%3A%2F%2Fdevpleno.com%2Fpreview-de-imagens-antes-do-upload) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpreview-de-imagens-antes-do-upload)",
      "description": "Hoje vamos fazer o preview da imagem que está sendo selecionada para fazer upload, isso é bastante interessante de se fazer quando o usuário está seleciona...",
      "keywords": [
        "filereader",
        "upload",
        "script",
        "function",
        "https",
        "file",
        "preview",
        "vamos",
        "this",
        "const"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/preview-de-imagens-antes-do-upload"
      }
    },
    {
      "id": "1cd857b1912ffcb1",
      "url": "https://devpleno.com/blog/complexidade-de-um-algoritmo/index",
      "title": "Como saber a complexidade de um algoritmo (Part 2)",
      "content": "Por isso em algumas entrevistas em inglês eles vão te questionar se essa é a melhor solução, se você sabe que ela é O(n²), pode ser que não seja a melhor.\n\nExiste ainda um outro cenário, no qual passamos o for para fora:\n\n```jsx\nfunction calculo(vetor) {\n  const n = vetor.lenght\n\n  for (let i = 0; i < n; i++) {}\n\n  for (let k = 0; k < n; k++) {\n    console.log(n * k)\n  }\n}\n```\n\nEsse algoritmo volta a ser O(2n), pois ele vai rodar N depois rodar novamente o N. Ele não é nada comparado a 1000, por exemplo, porque ele varia muito pouco. O grande problema então é o N e não o 2, por isso consideramos a complexidade O(n) porque somamos os dois.\n\nAgora vamos supor que esse algoritmo faça uma ordenação de sort:\n\n```jsx\nfuncton(vetor){\n  vetor = vetor.sort()\n}\n```\n\nO quick sort na média é N log N, ou seja, ele tem uma complexidade boa e qualquer coisa que fizermos, além disso temos que multiplicar ou somar, então provavelmente vai predominar o N log N.\n\nNo codelite, ele vai usar algo muito interessante que é uma estimativa do tempo que demorou para rodar o seu algoritmo para descobrir a complexidade, por isso quando você roda o algoritmo para ser avaliado, toda complexidade que ele descobre é estimada e não a real, por isso se tivermos essa noção de como evolui o algoritmo já é muito importante para resolvermos os problemas.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/f--A1FK6KK4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "vetor",
        "para",
        "complexidade",
        "algoritmo",
        "porque",
        "rodar",
        "console",
        "isso",
        "esse",
        "muito"
      ],
      "metadata": {
        "title": "Como saber a complexidade de um algoritmo",
        "date": "2017-07-11",
        "tags": "['Algoritmos', 'Fundamentos']",
        "thumbnail": "COMPLEXIDADE-DE-UM-ALGORITMO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/complexidade-de-um-algoritmo/index.md"
      }
    },
    {
      "id": "1cfce15e93cdf9d0",
      "url": "https://devpleno.com/politica-de-privacidade",
      "title": "Política de Privacidade - DevPleno (Part 1)",
      "content": "Blog\n\n## Política de Privacidade\n\nT\nPor Tulio Faria • 14 de março de 2017\n\nEsta Política de Privacidade foi formulada com o intuito de manter a privacidade e a segurança das informações coletadas de nossos clientes e usuários.\n\nPolítica de privacidade para **DevPleno**.\n\nTodas as suas informações pessoais recolhidas, serão usadas para o ajudar a tornar a sua visita no nosso site o mais produtiva e agradável possível.\n\nA garantia da confidencialidade dos dados pessoais dos utilizadores do nosso site é importante para o **DevPleno**.\n\nTodas as informações pessoais relativas a membros, assinantes, clientes ou visitantes que usem o **DevPleno** serão tratadas em concordância com a Lei da Proteção de Dados Pessoais de 26 de outubro de 1998 (Lei n.º 67/98).\n\nA informação pessoal recolhida pode incluir o seu nome, e-mail, número de telefone e/ou telemóvel, morada, data de nascimento e/ou outros.\n\nO uso do **DevPleno** pressupõe a aceitação deste Acordo de privacidade. A equipe do **DevPleno** reserva-se ao direito de alterar este acordo sem aviso prévio. Deste modo, recomendamos que consulte esta página com regularidade de forma a estar sempre atualizado.\n\nOs anúncios\n\nTal como outros websites, coletamos e utilizamos informação contida nos anúncios. A informação contida nos anúncios, inclui o seu endereço IP (Internet Protocol), o seu ISP (Internet Service Provider, como o Sapo, Clix, ou outro), o browser que utilizou ao visitar o nosso website (como o Internet Explorer ou o Firefox), o tempo da sua visita e que páginas visitou dentro do nosso website.\n\nOs Cookies e Web Beacons\n\nUtilizamos cookies para armazenar informação, tais como as suas preferências pessoas quando visita o nosso website. Isto poderá incluir um simples popup, ou uma ligação em vários serviços que providenciamos, tais como fóruns.",
      "description": "Esta Política de Privacidade foi formulada com o intuito de manter a privacidade e a segurança das informações coletadas de nossos clientes e usuários. Pol...",
      "keywords": [
        "como",
        "privacidade",
        "nosso",
        "informa",
        "para",
        "tica",
        "devpleno",
        "website",
        "sites",
        "outros"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/politica-de-privacidade"
      }
    },
    {
      "id": "1d27792aeec4e1f2",
      "url": "https://devpleno.com/loopsrepeticoesiteracoes-no-jsx-do-react",
      "title": "Loops/Repetições/Iterações no JSX do React - DevPleno (Part 2)",
      "content": "class Loop2 extends React.Component {\nrenderRow(row) {\nreturn &#x3C;li>Num: {row}&#x3C;/li>\n}\nrender() {\nlet rows = []\nfor (let i = 0; i &#x3C; 5; i++) {\nrows.push(i)\n}\nreturn (\n&#x3C;div>\n&#x3C;h1>Loop 2:&#x3C;/h1>\n&#x3C;ul>{rows.map(this.renderRow)}&#x3C;/ul>\n&#x3C;/div>\n)\n}\n}\nEsta forma é a minha favorita para renderizar lista de dados, pois mantem o código bem organizado e permite tratar quando a lista é vazia. Veja este exemplo:\n\nclass Loop3 extends React.Component {\nrenderRow(row) {\nreturn &#x3C;li>Num: {row}&#x3C;/li>\n}\nrender() {\nlet rows = []\nfor (let i = 0; i &#x3C; 5; i++) {\nrows.push(i)\n}\nif (rows.length == 0) {\nreturn &#x3C;p>Nenhum item&#x3C;/p>\n}\nreturn (\n&#x3C;div>\n&#x3C;h1>Loop 3:&#x3C;/h1>\n&#x3C;ul>{rows.map(this.renderRow)}&#x3C;/ul>\n&#x3C;/div>\n)\n}\n}\nSe a lista for vazia, ele retorna uma mensagem e não renderiza o loop :)\n\nVocê pode ver estes exemplos rodando aqui: [https://codepen.io/tuliofaria/pen/NbZgqK](https://codepen.io/tuliofaria/pen/NbZgqK)\n\nBom pessoal, estas são algumas ideias para utilizar loops em JSX. Como sempre, fiquem a vontade para comentar e até a próxima!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Loops%2FRepeti%C3%A7%C3%B5es%2FItera%C3%A7%C3%B5es%20no%20JSX%20do%20React&url=https%3A%2F%2Fdevpleno.com%2Floopsrepeticoesiteracoes-no-jsx-do-react) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Floopsrepeticoesiteracoes-no-jsx-do-react)",
      "description": "JSX é a sintaxe que permite escrevermos HTML dentro do Javascript (sim, isso parece estranho, rs) em componentes ReactJS. E um fator muito interessante do ...",
      "keywords": [
        "rows",
        "para",
        "https",
        "react",
        "escopo",
        "return",
        "javascript",
        "loop",
        "html",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/loopsrepeticoesiteracoes-no-jsx-do-react"
      }
    },
    {
      "id": "1d29e7e8f135b0d1",
      "url": "https://devpleno.com/blog/desenvolvedor-full-stack-o-que-e-e-como-se-tornar/index",
      "title": "Desenvolvedor Full Stack: o que é e como se tornar? (Part 2)",
      "content": "Para se tornar um desenvolvedor Full Stack é preciso, naturalmente, estudar muito. O profissional que opta por esse tipo de carreira deve ser ávido por novos conhecimentos. Ele precisa se sentir confortável com o desafio de encarar uma linguagem desconhecida como parte da sua rotina de trabalho. Esse perfil de desenvolvedor também costuma ser chamado de profissional com conhecimento em forma de 'T'. A linha vertical da letra representa a área em que o dev é um especialista, que pode ser algo dentro do front-end ou do back-end. Já a linha horizontal simboliza que, além de ser especializado em algo, esse profissional expande suas competências em diversas áreas, sem se aprofundar tanto nelas. Em essência, o desenvolvedor Full Stack compreende todo o processo de desenvolvimento do produto. Portanto, para conseguir se capacitar nesse perfil, o dev precisa, antes de tudo, conhecer um pouco sobre quase tudo dos processos de criação de um software.\n\n## O que preciso saber para ser um desenvolvedor Full Stack?\n\nEm essência, podemos dizer que o desenvolvedor Full Stack precisa dominar toda a estrutura de produção do software, do back-end ao front-end. Esses conhecimentos vão variar de acordo com cada empresa, pois times diferentes trabalham com tecnologias e técnicas diversas. Logo, é importante que o dev que pretende se tornar Full Stack tenha a consciência de que ele precisa ser aberto a novos conhecimentos sempre. Também é essencial que ele não tente ser um especialista em todas as áreas, pois além de ser inviável, isso atrapalharia a ampliação dos seus horizontes. Dito isso, vale a pena listar algumas técnicas e tecnologias que o desenvolvedor Full Stack deve conhecer melhor:",
      "keywords": [
        "full",
        "stack",
        "desenvolvedor",
        "como",
        "front",
        "back",
        "para",
        "profissional",
        "tornar",
        "mais"
      ],
      "metadata": {
        "title": "Desenvolvedor Full Stack: o que é e como se tornar?",
        "date": "2017-06-07",
        "tags": "['Carreira']",
        "thumbnail": "95467-desenvolvedor-full-stack-o-que-e-e-como-se-tornar-atencao-redator-entregar-ate-18h-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/desenvolvedor-full-stack-o-que-e-e-como-se-tornar/index.md"
      }
    },
    {
      "id": "1d4c5c50c35bc1bd",
      "url": "https://devpleno.com/sobre-a-devpleno",
      "title": "Redirecting to: /sobre-o-devpleno",
      "content": "Redirecting to: /sobre-o-devpleno [Redirecting from /sobre-a-devpleno to /sobre-o-devpleno](/sobre-o-devpleno)",
      "keywords": [
        "sobre",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/sobre-a-devpleno"
      }
    },
    {
      "id": "1d90ec3204bdf44e",
      "url": "https://devpleno.com/lista-encadeada-adicionar-no",
      "title": "Lista encadeada - Adicionar nó - DevPleno (Part 2)",
      "content": "const list = LinkedList()\nconsole.log(list.length())\nEle irá retornar o objeto length, como é uma função, ela será executada. Ao executar será retornado o valor 0, então temos que implementar todas as operações dentro de LinkedList, por exemplo, eu quero fazer a operação Add para adicionar um valor novo:\n\nfunction LinkedList(){\nlet head = null\nlength = 0\nconst add (value) =>{\nif(!head){\n}\n}\nreturn{\nlength: () => length\n}\n}\nconst list = LinkedList()\nconsole.log(list.length())\nA lógica é que o head seria a cabeça de nossa lista, por isso utilizamos o if, então se existe um nó no head, eu tenho que andar até o final para poder colocar esse valor, se não existe eu vou poder criar um valor dentro do próprio head.\n\nComo eu tenho que criar um novo nó, vamos criar um const Node que vai retornar um outro nó:\n\nfunction LinkedList(){\nlet head = null\nlength = 0\nconst Node = (value) => {\nreturn {\nvalue,\nnext: null\n}\n}\nconst add (value) =>{\nif(!head){\n}\n}\nreturn {\nlength: () => length\n}\n}\nconst list = LinkedList()\nconsole.log(list.length())\nEntão criamos uma outra função, que é uma arrow function, ela vai receber um value e retornar um objeto composto por esse value e um next igual a null. Voltando ao nosso if, se o head não existir ou false, vamos fazer o head ser igual a Node, passar nosso value e podemos retornar o head:\n\nconst add (value) =>{\nif(!head){\nhead = Node(value)\nlength++\nreturn head\n}\n}\nreturn{\nlength: () => length\nadd: (value) => add(value)\n}\nLembrando que o return é a interface pública desse método, então tudo que eu quero mostrar para o exterior é passado ali. Vamos fazer um teste adicionando um valor 1:\n\nconst list = LinkedList()\nconsole.log(list.length())\nlist.add(1)\nconsole.log(list.length())\nA lista estava vazia eu adicionei um valor e ele retornou uma lista igual a 1. Para escrever a lista, vamos escrever um método print que vai escrever head:",
      "description": "Vamos explorar um pouco mais de estrutura de dados de algoritmos que são comuns na base curricular, principalmente em computação, e caem muito em competiçã...",
      "keywords": [
        "length",
        "head",
        "value",
        "list",
        "node",
        "lista",
        "para",
        "vamos",
        "return",
        "const"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/lista-encadeada-adicionar-no"
      }
    },
    {
      "id": "1da5bc878dd630b9",
      "url": "https://devpleno.com/escopos-e-closures",
      "title": "Escopos e Closures - NodeJS Primeiros Passos - DevPleno (Part 3)",
      "content": "conta.out();\nComplicando um pouco mais, podemos fazer essa Self Invoking function retornar um objeto com duas funções dentro. Então ele contou a primeira, deu um out, contou a segunda e deu outro out.\n\nPodemos fazer algumas composições e organizações de código muito interessantes apenas utilizando esse tipo de construção. Confira a explicação em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Escopos%20e%20Closures%20-%20NodeJS%20Primeiros%20Passos&url=https%3A%2F%2Fdevpleno.com%2Fescopos-e-closures) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fescopos-e-closures)",
      "description": "Entender Escopos e Closures do JavaScript é muito importante para conseguir avançar no NodeJS. Primeiramente tenho um diretório criado com nossos exemplos....",
      "keywords": [
        "escopo",
        "function",
        "console",
        "vari",
        "conta",
        "dentro",
        "javascript",
        "fazer",
        "podemos",
        "contador"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/escopos-e-closures"
      }
    },
    {
      "id": "1e128942b24c56b0",
      "url": "https://devpleno.com/blog/aprenda-a-dizer-nao/index",
      "title": "Aprenda a dizer NÃO! (Part 2)",
      "content": "Outra coisa interessante também é você comemorar seus ”nãos”. Se você conseguiu dar um não em algo que não te fazia bem ou não era o seu objetivo, comemore essa escolha. Uma lição que eu aprendi com a minha mãe é que quando você diz não, não fique remoendo isso. Se teve uma chance de ir para uma empresa e se recusou, não fique olhando mais para trás, afinal você tomou a decisão e acabou.\n\nA alguns meses atrás eu disse não para morar em Amsterdã, eu tinha passado no processo seletivo do Booking e disse não porque não estava alinhado com o meu objetivo de vida para aquele momento, mesmo tendo uma oportunidade de vida no exterior. Essa foi uma lição que mudou muito a minha vida, hoje minha empresa fatura 6 vezes mais do que estava quando eu fiz essa transformação.\n\nEntão pense nisso. Essa dica pode mudar a sua vida!\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/ldtqxsz22xg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "minha",
        "empresa",
        "vida",
        "quando",
        "mais",
        "dizer",
        "estava",
        "porque",
        "falar"
      ],
      "metadata": {
        "title": "Aprenda a dizer NÃO!",
        "date": "2017-07-07",
        "tags": "['Carreira']",
        "thumbnail": "DIZER-NÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/aprenda-a-dizer-nao/index.md"
      }
    },
    {
      "id": "1e1a82aef3af9976",
      "url": "https://devpleno.com/10-dicas-de-produtividade-para-programadores",
      "title": "10 dicas de produtividade para programadores - DevPleno (Part 1)",
      "content": "Carreira\n\n## 10 dicas de produtividade para programadores\n\nT\nPor Tulio Faria • 24 de julho de 2017\n\n*\n\n[Carreira](/tag/carreira)\n\nSer um profissional produtivo é uma exigência do mercado de trabalho no cenário altamente competitivo em que vivemos. Os resultados são requisitados cada vez mais rapidamente e sempre com a melhor qualidade. E aqueles profissionais que conseguem atender a essa demanda são muito valorizados.\n\nNa era digital, porém, há muitas distrações que podem fazer os níveis de [produtividade](https://www.devpleno.com/como-aumentar-a-produtividade?utm_source=blog&#x26;utm_campaign=rc_blogpost) despencar. É assim em todas as áreas, inclusive no mundo do desenvolvimento de software*. Contudo, existem soluções e comportamentos que podem ajudar a melhorar isso. Apresentamos algumas dicas de produtividade na lista a seguir.\n\n## 1. Escolha a ferramenta certa\n\nHá diversas ferramentas que podem ser utilizadas para organizar os fluxos de trabalho e, assim, melhorar a sua produtividade. Elas auxiliam em diferentes atividades. Confira:\n\n### Gestão de projetos\n\nPlanejamento e produtividade sempre andam de mãos dadas. Um bom planejamento aumenta a produtividade, mas a falta dele pode fazer com que algumas tarefas sejam adiadas caso haja atrasos em atividades das quais dependem. Com essa quebra de sequência e os constantes retornos aos processos anteriores, a produtividade cai.\n\nEntre os programas que podem ajudar você em seus projetos estão o [Gantter](https://gantter.com?utm_source=blog&#x26;utm_campaign=rc_blogpost) (integrável ao Drive do Google), e o [MS Project](https://products.office.com/pt-br/project/project-management?utm_source=blog&#x26;utm_campaign=rc_blogpost), da Microsoft. Com eles, é possível definir o cronograma detalhado do projeto, com prazos para cada atividade e relação de dependência entre elas. Enquanto o Project apresenta mais funcionalidades que o Gantter, este último é gratuito e online — e eles são compatíveis.\n\n### Gestão de tarefas",
      "description": "Ser um profissional produtivo é uma exigência do mercado de trabalho no cenário altamente competitivo em que vivemos. Os resultados são requisitados cada v...",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "produtividade",
        "para",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/10-dicas-de-produtividade-para-programadores"
      }
    },
    {
      "id": "1e1ceae6c5e4df6c",
      "url": "https://devpleno.com/beatbox-manipulavel-com-js",
      "title": "Construindo um Beatbox Manipulável com JS - DevPleno (Part 3)",
      "content": "isPlaying = !isPlaying\n}\n&#x3C;/script>\nTodo check ativo irá gerar um som e os inativos serão ignorados. No botão, sempre que estiver tocando vai ter o stop e quando tiver parado vai ter play. Assim geramos um beat-box que o usuário escolhe a forma em que vai ser tocado utilizando o checkbox.\n\nPoderíamos transformar esses checkbox em caixinhas e isso deixaria muito mais parecido com softwares como fruitLoops, que são bem simples de criar batidas.\nEsse código está bastante flexível, se quisermos colocar mais itens só aumentar o número de itens no ‘numItems’.\n\nBaixe os arquivos de áudio aqui: [download](https://goo.gl/zHKuad)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Construindo%20um%20Beatbox%20Manipul%C3%A1vel%20com%20JS&url=https%3A%2F%2Fdevpleno.com%2Fbeatbox-manipulavel-com-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fbeatbox-manipulavel-com-js)",
      "description": "Agora que já entendemos como dar play em áudio com JS, como manipular para compor uma batida, faremos com que o usuário escolha a forma como seja tocado, o...",
      "keywords": [
        "play",
        "audio",
        "const",
        "prato",
        "https",
        "track",
        "script",
        "checkbox",
        "para",
        "trackid"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/beatbox-manipulavel-com-js"
      }
    },
    {
      "id": "1e21f84b23d15a7f",
      "url": "https://devpleno.com/minicurso-socket-io-parte-3",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol - DevPleno (Part 5)",
      "content": "if(score.notify=='1'){\nconsole.log('notificar')\n$('#audio-gol')[0].currentTime=0;\n$('audio-gol')[0].play();\n$('.goooolllll')addClass('goooolllll-anim')\n$('.goooolllll-text')addClass('goooolllll-text-anim')\n$('.goooolllll-text')on('transitionend webkitTransitionEnd oTransitionEnd', function(){\n$('.goooolllll')removeClass('goooolllll-anim')\n$('.goooolllll-text')removeClass('goooolllll-text-anim')\n})\n}\nPara testar temos que notificar em uma outra aba. Ao clicar, aparece duas classes com essa animação, quando a animação terminar nós removemos essa animação.\n\nNa próxima aula vamos colocar a comunicação do lance a lance e dos vídeos, além de colocar o projeto em um servidor no digitalhost para conseguirmos acessar externamente.\n\nConfira o passo a passo em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Minicurso%20Socket.IO%20-%20Parte%203%20-%20Recebendo%20a%20notifica%C3%A7%C3%A3o%20de%20Gol&url=https%3A%2F%2Fdevpleno.com%2Fminicurso-socket-io-parte-3) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fminicurso-socket-io-parte-3)",
      "description": "Nas aulas anteriores do minicurso de Socket.IO, já preparamos o ambiente, conectamos o websocket do client para o servidor e agora vamos começar a emitir r...",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "socket",
        "vamos",
        "notify",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-3"
      }
    },
    {
      "id": "1e3a68d7f2d9b60a",
      "url": "https://devpleno.com/blog/como-cobrar-por-software/index",
      "title": "Como cobrar por Software (Part 2)",
      "content": "Precisa pensar também quais são os custos que algumas vezes você não enxerga: Internet, telefone, luz ou algum outro serviço. Quais são os custos que impactam nesse valor da sua hora? Quais os impostos deve pagar? (Sua hora pode R$100,00, mas você esquece de que, dependendo da situação, precisa pagar de 7 a 18% de imposto, então acaba recebendo R$82,oo. Concorda?)\nÉ importante que defina uma porcentagem de lucro. Quando você vai conseguir contratar alguém? Quando você tiver uma hora bem paga, conseguirá pagar o funcionário e ter um lucro não envolvendo sua hora?\n\nFaça estimativas das horas gastas no projeto, por exemplo, sua hora custa R$100,00 e o projeto tem uma estimativa de 40 horas, então o projeto custará em torno de R$4.ooo,oo. A partir disso, avalie se esse valor realmente irá trazer o resultado esperado desta hora. (Já teve casos que deixei de passar o orçamento para o cliente porque ficaria muito caro, de acordo com minha disponibilidade, experiência e o que o projeto exigia, não valeria a pena para ele, já que ele não teria o retorno tão rápido disso).\nAvalie se você não está superestimando o valor. A margem de lucro muito alta pode assustar o cliente, já que ele não vai ver seu cálculo sobre o valor.\n\n**Como saber a base para a hora de acordo com o seu nível?**",
      "keywords": [
        "hora",
        "para",
        "valor",
        "mais",
        "horas",
        "muito",
        "projeto",
        "ncia",
        "exemplo",
        "deve"
      ],
      "metadata": {
        "title": "Como cobrar por Software",
        "date": "2017-05-15",
        "tags": "['Carreira']",
        "thumbnail": "PRECIFICAÇÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/como-cobrar-por-software/index.md"
      }
    },
    {
      "id": "1e575dcba9f5368f",
      "url": "https://devpleno.com/blog/apresentacao-em-html/index",
      "title": "Apresentação em HTML",
      "content": "Neste vídeo, explico como você pode criar apresentação de slides em HTML, uma alternativa às apresentações tradicionais em Power Point!\n\n## Confira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/OuVn4M8Ea-A\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "https",
        "youtube",
        "apresenta",
        "responsive",
        "iframe",
        "devpleno",
        "facebook",
        "neste",
        "explico"
      ],
      "metadata": {
        "title": "Apresentação em HTML",
        "date": "2017-03-09",
        "tags": "['Javascript']",
        "thumbnail": "APRESENTAÇÃO-HTML-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/apresentacao-em-html/index.md"
      }
    },
    {
      "id": "1e6a7e87b4eeaf21",
      "url": "https://devpleno.com/fullstackacademy-aula-1",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy-aula-1 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstackacademy",
        "aula"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstackacademy-aula-1"
      }
    },
    {
      "id": "1e842b0849c2d6fa",
      "url": "https://devpleno.com/quanto-ganha-quem-trabalha-por-meio-da-toptal",
      "title": "Quanto ganha quem trabalha por meio da Toptal? - DevPleno",
      "content": "Carreira\n\n## Quanto ganha quem trabalha por meio da Toptal?\n\nT\nPor Tulio Faria • 16 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nA pergunta que não quer calar: Quanto se ganha trabalhando por meio da Toptal?\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Quanto%20ganha%20quem%20trabalha%20por%20meio%20da%20Toptal%3F&url=https%3A%2F%2Fdevpleno.com%2Fquanto-ganha-quem-trabalha-por-meio-da-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fquanto-ganha-quem-trabalha-por-meio-da-toptal)",
      "description": "A pergunta que não quer calar: Quanto se ganha trabalhando por meio da Toptal? <div className=&#34;embedresponsive embedresponsive16by9&#34;   <iframe className=&#34;e...",
      "keywords": [
        "toptal",
        "https",
        "ganha",
        "meio",
        "carreira",
        "quanto",
        "quem",
        "trabalha",
        "profissionais",
        "reactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/quanto-ganha-quem-trabalha-por-meio-da-toptal"
      }
    },
    {
      "id": "1e9fa0cb6cb17312",
      "url": "https://devpleno.com/blog/copy-to-clipboard-em-js/index",
      "title": "Ctrl+C / Copy to Clipboard em JS",
      "content": "Essa é uma dica bem rápida de como podemos mandar algo com o clipboard, ou seja, o equivalente a dar um CTRL + C em um texto na sua página.\n\nPara fazer este exemplo, vamos usar o jQuery por que escrevemos pouquíssimas linhas de código. Então temos uma página bem simples, apenas com algumas tags, e vamos criar um input type text com um ID url e um value:\n\n```jsx\n<html>\n  <head>\n    <title>Copy to Clipboard</title>\n    <style>\n      #url{\n        text-align: center;\n        padding: 40px;\n      }\n    </style>\n  </head>\n  <body>\n    <input type=\"text\" id=\"url\" value=\"https://devpleno.com\" />\n    <script src=\"https://code.jquery.com/jquery-3.2.1.min.js\">\n    </script>\n  </body>\n</html>\n```\n\nCom isso teremos o input, e a ideia é que quando clicarmos nele. já ser copiado para a área de transferência, apenas precisando dar CTRL + V para funcionar.\n\nLembrando que já importamos o jQuery da CDN. Vamos então abrir no body um novo Script. Nele, quando clicar na URL, quero que selecione e depois execute o comando copy.\n\n```jsx\n<script>\n  $(\"url\").click(function(){\n    $(this).select();\n\n    document.execCommand('copy');\n  })\n</script>\n```\n\nAlgumas pessoas colocam um Botão para copiar e deixam apenas o select quando clicarmos no texto. Isso é muito útil quando temos URL's para compartilhar e é legal para deixar essa facilidade na experiência do usuário quando ele estiver utilizando o seu sistema.\n\nUm exemplo de onde isso é muito útil é na URL do github, pois poupamos a tarefa de copiar do usuário. Confira a explicação em vídeo para entender melhor.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/K7r2-hBydBE\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "https",
        "script",
        "quando",
        "jquery",
        "embed",
        "vamos",
        "apenas",
        "input",
        "text"
      ],
      "metadata": {
        "title": "Ctrl+C / Copy to Clipboard em JS",
        "date": "2017-05-18",
        "tags": "['Javascript']",
        "thumbnail": "Copy-to-Clipboard-em-JS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/copy-to-clipboard-em-js/index.md"
      }
    },
    {
      "id": "1f208ab4562e08f3",
      "url": "https://devpleno.com/blog/sua-carreira-pode-mudar-durante-o-carnaval/index",
      "title": "Sua carreira pode mudar durante o carnaval? (Part 2)",
      "content": "**Quanto você está comprometido com a mudança que quer?**\n\nEu queria uma mudança na minha carreira. Eu não sabia que ia acontecer no carnaval, mas mesmo assim, eu estava usando esse feriado para, de alguma forma, achar uma solução para a época. E isso me fez estar presente, disponível e apto a responder prontamente a uma oportunidade bastante interessante.\n\n**Quanto você se coloca em risco?**\n\nUma preocupação da pessoa pelos e-mails sempre foi a comunicação em inglês. E mesmo não estando preparado, eu mantive a clareza de dizer que talvez não conseguiria mas que eu estaria preparado em um prazo determinado. Da última vez que você foi questionado sobre algo que não domina, você respondeu com um prazo para isso acontecer? No meu caso, respondi que em 3-4 meses eu iria conduzir/liderar uma reunião toda em inglês. Na época eu nunca havia feito isso, muito menos tinha conversado com alguém em inglês. Como eu sabia que 3-4 meses era o suficiente? Na verdade, o que eu sabia era que eu FARIA esse período ser o suficiente para alcançar isso. Independente do que acontecesse, eu ia dar o meu jeito. Sem desculpas! Durante o projeto, destravei meu inglês, aprendi a negociar e a resolver muitos problemas em equipes extremamente diversas. Mas o mais importante: descobri que eu era capaz de contribuir em projetos mundiais e o Brasil já não era mais o meu limite. Depois disso veio a Toptal e vários outros projetos de grande impacto no mundo e na minha carreira… Mas é interessante pensar que tudo começou com uma troca de e-mails no carnaval. E a minha reflexão aqui é: será que a mudança que você quer não está onde você menos espera? Será que você não poderia usar seu carnaval para aprender React ou estudar um tema que vai te proporcionar a mudança que você tanto quer para sua vida? Chega de desculpas!\n\n[![DevReactJS](DevReact.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)",
      "keywords": [
        "para",
        "carnaval",
        "minha",
        "estava",
        "carreira",
        "mudan",
        "feira",
        "isso",
        "havia",
        "ingl"
      ],
      "metadata": {
        "title": "Sua carreira pode mudar durante o carnaval?",
        "date": "2019-03-01",
        "tags": "['Carreira']",
        "thumbnail": "TulioEscada.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/sua-carreira-pode-mudar-durante-o-carnaval/index.md"
      }
    },
    {
      "id": "1f360ab36edfe2fd",
      "url": "https://devpleno.com/blog/convertendo-timestamps/index",
      "title": "Módulo MS - Convertendo timestamps",
      "content": "O hands-on de hoje é bem curto, apenas para mostrar um módulo que achei bastante interessante e funciona tanto para Node quanto para Browser. Esse módulo se chama MS e faz a conversão de qualquer formato para milissegundo e vice-versa. Primeiramente precisamos adicionar as dependências:\n\n```jsx\nyarn add ms\n```\n\nEm um arquivo qualquer, no meu caso criei um chamado timestamp, vamos fazer alguns testes:\n\n```jsx\nconst ms = require('ms')\n```\n\nA forma como ele funciona é bastante interessante porque, por exemplo, se passarmos um valor inteiro para ele, ele já converte para uma string:\n\n```jsx\nconsole.log(ms(100000))\n```\n\nVai ser retornado o valor de 2m. Lembrando que ao contrário ele também faz:\n\n```jsx\nconsole.log(ms('1d'))\n```\n\nO resultado será 86400000. Além disso, ainda podemos fazer algo bem interessante:\n\n```jsx\nconsole.log(ms(100000){\n  long: true\n})\n```\n\nAssim, ao invés de falar a inicial, ele trará o nome completo 'minutes'. Isso é muito útil principalmente quando queremos saber delta de tempo, quando temos dois timestamps com milissegundos e queremos achar a diferença entre eles.\n\nUma coisa bastante comum é utilizar o timestamp desde a era linux, tudo que fazemos é em relação a essa data. Só por curiosidade, eu achei o MS quando estava procurando coisas sobre JWT e uma das formas de passar a validação do token é através de uma string curta.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/30WpotUCUso\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "embed",
        "bastante",
        "interessante",
        "console",
        "quando",
        "responsive",
        "https",
        "100000",
        "dulo"
      ],
      "metadata": {
        "title": "Módulo MS - Convertendo timestamps",
        "date": "2017-09-05",
        "tags": "['Javascript']",
        "thumbnail": "MS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/convertendo-timestamps/index.md"
      }
    },
    {
      "id": "1f4828515ec0d8f3",
      "url": "https://devpleno.com/blog/racionalizacao/index",
      "title": "Racionalização: Tomando decisões racionais (Part 1)",
      "content": "Hoje gostaria de dar uma dica bem rápida para você sobre o que eu chamo de Racionalização, que é basicamente olharmos o que estamos fazendo de uma maneira mais racional.\n\n**Como assim?**\n\nPor exemplo, você está criando sua empresa do zero e faz uma ação totalmente no \"achismo\", então se não foi racionalizado esta ação, não temos o feedback de que foi acertado ou não.\n\nUsando o próprio devPleno como exemplo: Se uma postagem X foi bem recebida, por que ela foi bem recebida? Então fazemos uma racionalização analisando tudo o que os dados nos dizem para saber o motivo.\n\nQuanto mais racionalizamos, melhor ficamos nesta área. Caso olhamos para um projeto que não está performando como queríamos e tentamos racionalizar o que esta acontecendo, começamo a olhar de uma maneira muito diferente.\n\n**Como fazer isso?**\n\nComece a olhar outros projetos de outros 'lugares' e ache razão neles, trazendo para o seu projeto.\n\nPodemos usar como exemplo o Youtube. Existe uma forma de aplicar uma alteração em lot, fazendo tudo via interface, então você olha para seu projeto e pensa: por que estou tentando fazer uma operação em lot no servidor se eu posso criar uma ação em lot no react que chama varias requests para cada alteração no servidor? Assim você começa a analisar melhor e achar solução olhando estes exemplos externos, outro aplicativo, outra empresa, etc.\n\nÉ muito interessante fazer a Racionalização para tudo que esta ao nosso redor, não só como empreendedor, mas também como desenvolvedor ou até mesmo cidadão.\n\nEntão a dica de hoje é: Racionalize sobre as coisas. Tomou uma decisão? Por que você fez isso? Por que retornou aquele resultado? Entenda, ache as razões do motivo por ter acontecido, e não apenas deixe as ideias 'voando'.",
      "keywords": [
        "para",
        "como",
        "racionaliza",
        "exemplo",
        "esta",
        "devpleno",
        "tudo",
        "projeto",
        "fazer",
        "hoje"
      ],
      "metadata": {
        "title": "Racionalização: Tomando decisões racionais",
        "date": "2017-05-08",
        "tags": "['Carreira']",
        "thumbnail": "Racionalizacao.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/racionalizacao/index.md"
      }
    },
    {
      "id": "1f96bd78ceffc4cc",
      "url": "https://devpleno.com/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! - DevPleno (Part 5)",
      "content": "Se a sua resposta é “sim”, agora é hora de colocar a mão na massa. Dê uma lida mais aprofundada sobre cada metodologia — [existem vários tutoriais espalhados pela internet](https://www.youtube.com/devplenocom?utm_source=blog&#x26;utm_campaign=rc_blogpost), principalmente sobre o Scrum, e dá para aprender a usar cada metodologia passo a passo. Depois de escolher a metodologia ágil que melhor se encaixa no seu trabalho, coloque ela em ação e veja os resultados. Você não vai se arrepender!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e",
      "description": "Nascidas nos anos 80, só vieram a ficar conhecidas depois dos anos 2000. Muito comuns no desenvolvimento de softwares, essas ferramentas ganharam espaço em...",
      "keywords": [
        "mais",
        "metodologia",
        "para",
        "geis",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores"
      }
    },
    {
      "id": "1fe54cdd218eb085",
      "url": "https://devpleno.com/blog/azure-cognitive-service/index",
      "title": "Classificação de imagens com Azure (Part 1)",
      "content": "Na dica de hoje, vamos continuar falando sobre classificação de imagens de forma automática, mas será uma outra abordagem, a de utilizar um serviço de visão computacional para reconhecer e classificar essa imagem.\n\nVamos utilizar a API Azure Computer Vídeo. Como pegamos uma key dessa API?\n\nSe você colocar no Google Azure Cognitive Services, vamos ter serviços cognitivos, clique no link e você pode experimentar os serviços gratuitamente, apenas acessando 'computer vision API' para conseguir a Key.\n\nNovamente no Google, vamos procurar o 'axios http' e importá-lo utilizando a CDN:\n\n```jsx\n<script src='https://unpkg.com/axios/dist/axios.min.js'></script>\n```\n\nAgora, no Visual Studio Code, vou criar um arquivo novo e salvar como azure-image.html. A ideia é a seguinte, vamos ter um input type text onde vamos por uma url para poder reconhecer a imagem:\n\n```html\n<html>\n  <head>\n    <title>Image</title>\n  </head>\n\n  <body>\n    <input\n      type=\"text\"\n      id=\"imgInput\"\n      value=\"https://tudosobrecachorros.com.br/wp-content/uploads/precos-de-cachorro.png\"\n    />\n    <input type=\"button\" id=\"btn\" value=\"Analisar imagem\" />\n    <img src=\"\" id=\"img\" />\n\n    <script src=\"https://unpkg.com/axios/dist/axios.min.js\"></script>\n    <script>\n      const imgInput = document.getElementById('img')\n      const img = document.getElementById('img')\n      imgInput.addEventListener('blur', () => (img.src = imgInput.value))\n    </script>\n  </body>\n</html>\n```\n\nAssim podemos colocar a url de uma imagem e clicar em analisar imagem, mas temos também uma imagem padrão. Toda vez que essa imagem padrão for trocada, nós trocamos essa imagem.\n\nAgora vamos fazer uma requisição utilizando axios para que a gente consiga classificar essa imagem. Para isso precisamos colocar nossa chave do Azure e também uma instância do axios para passarmos o baseURL e o headers que é onde preciso mandar algumas coisas como content type:",
      "keywords": [
        "imagem",
        "imginput",
        "para",
        "axios",
        "script",
        "vamos",
        "https",
        "const",
        "azure",
        "html"
      ],
      "metadata": {
        "title": "Classificação de imagens com Azure",
        "date": "2017-11-30",
        "tags": "['Javascript']",
        "thumbnail": "classificação-de-IMAGENS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/azure-cognitive-service/index.md"
      }
    },
    {
      "id": "200ddd8d4eead28b",
      "url": "https://devpleno.com/termos-de-uso",
      "title": "Termos de uso - DevPleno (Part 4)",
      "content": "Os documentos, conteúdos e criações contidos neste website pertencem aos seus criadores e colaboradores. A autoria dos conteúdo, material e imagens exibidos no DevPleno é protegida por leis nacionais e internacionais. Não podem ser copiados, reproduzidos, modificados, publicados, atualizados, postados, transmitidos ou distribuídos de qualquer maneira sem autorização prévia e por escrito do DevPleno.\n\nAs imagens contidas neste website são aqui incorporadas apenas para fins de visualização, e, salvo autorização expressa por escrito, não podem ser gravadas ou baixadas via download. A reprodução ou armazenamento de materiais recuperados a partir deste serviço sujeitará os infratores às penas da lei.\n\nO nome do site DevPleno seu logotipo, o nome de domínio para acesso na Internet, bem como todos os elementos característicos da tecnologia desenvolvida e aqui apresentada, sob a forma da articulação de bases de dados, constituem marcas registradas e propriedades intelectuais privadas e todos os direitos decorrentes de seu registro são assegurados por lei. Alguns direitos de uso podem ser cedidos por DevPleno em contrato ou licença especial, que pode ser cancelada a qualquer momento se não cumpridos os seus termos.\n\nAs marcas registradas do DevPleno só podem ser usadas publicamente com autorização expressa. O uso destas marcas registradas em publicidade e promoção de produtos deve ser adequadamente informado.\n\n## Reclamações sobre violação de direitos autorais\n\nO DevPleno respeita a propriedade intelectual de outras pessoas ou empresas e solicitamos aos nossos membros que façam o mesmo. Toda e qualquer violação de direitos autorais deverá ser notificada ao DevPleno e acompanhada dos documentos e informações que confirmam a autoria. A notificação poderá ser enviada pelos e-mails constantes do site ou via postal para o endereço do site.\n\n## Leis aplicáveis",
      "description": "Estes termos de serviço regulam o uso deste site. Ao acessálo você concorda com estes termos. Por favor, consulte regularmente os nossos termos de serviço....",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "termos",
        "servi",
        "website",
        "acesso",
        "para",
        "direitos"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/termos-de-uso"
      }
    },
    {
      "id": "20101988ded1b2b9",
      "url": "https://devpleno.com/dica-bind",
      "title": "Redirecting to: /bind",
      "content": "Redirecting to: /bind [Redirecting from /dica-bind to /bind](/bind)",
      "keywords": [
        "bind",
        "redirecting",
        "from",
        "dica"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-bind"
      }
    },
    {
      "id": "2059116d1da4c175",
      "url": "https://devpleno.com/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste",
      "title": "Promise Constante - como criar situações assíncronas de teste - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Promise%20Constante%20-%20como%20criar%20situa%C3%A7%C3%B5es%20ass%C3%ADncronas%20de%20teste&url=https%3A%2F%2Fdevpleno.com%2Fpromise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpromise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste)",
      "description": "A dica de hoje é bastante interessante porque ela nos ajuda a criar algumas situações de teste, principalmente envolvendo promises, que é uma forma de lida...",
      "keywords": [
        "promise",
        "readdir",
        "path",
        "https",
        "teste",
        "const",
        "resolve",
        "javascript",
        "constante",
        "criar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste"
      }
    },
    {
      "id": "207308209601f2e8",
      "url": "https://devpleno.com/blog/animacao-basica-css3/index",
      "title": "Animação basica em CSS3 (Part 1)",
      "content": "Recentemente eu estava planejando e desenvolvendo a interface para o curso de Socket.io, e como ela terá algumas animações à medida em que os dados chegam em tempo real, resolvi voltar a estudar CSS3, algo que há tempos não utilizo.\n\nÀs vezes ficamos focando em um navegador mais novo e esquecemos que algumas coisas podemos utilizar sem o Javascript, apenas com CSS. Vou criar uma pequena página HTML, um pouco de CSS e Javascript apenas para poder controlar a class:\n\n```js\n.hello{\n  border:2px solid grey;\n  transition: all 3s;\n}\n.hello-active{\n  border:2px solid red;\n  background: grey;\n}\n<body>\n  <div class=\"hello\">\n    Olá!\n  </div>\n  <script>\n    const node = document.querySelector('.hello')\n    node.addEventListener('click', function(){\n      this.classList.add('hello-active');\n    })\n  </script>\n</body>\n```\n\nO que o transition faz? Ele fala basicamente assim, \"qualquer transição que você fizer envolvendo essa classe vai ter uma animação de X segundos\". Apenas a propriedade transition já é possível fazer muita coisa.\n\nNo caso acima, ao clicar, a borda grey muda para red e o background grey em uma transição que dura 3 segundos. Também podemos fazer uma animação 'ao contrário', fazendo ele voltar ao estado original adicionando ao script a seguinte linha:\n\n```js\n<script>\n  const node = document.querySelector('.hello')\n  node.addEventListener('click', function(){\n    this.classList.add('hello-active');\n  })\n  node.addEventLiestener('transitionend', function(){\n    this.classList.remove('hello-active');\n  })\n</script>\n```\n\nO evento transitionend faz com que, ao terminar o tempo determinado, remova do classList a class. Isso faz com que o CSS volte ao seu estado inicial em uma transição de 'vai e volta'. Podemos também adicionar animação em hover:\n\n```js\n.hello.hover{\n  background: green;\n}\n```",
      "keywords": [
        "hello",
        "class",
        "script",
        "node",
        "para",
        "anima",
        "apenas",
        "grey",
        "transition",
        "active"
      ],
      "metadata": {
        "title": "Animação basica em CSS3",
        "date": "2017-05-22",
        "tags": "['Fundamentos', 'Javascript']",
        "thumbnail": "CSS3-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/animacao-basica-css3/index.md"
      }
    },
    {
      "id": "20885d88c3711fc5",
      "url": "https://devpleno.com/falsy-e-truthy-values",
      "title": "Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS - DevPleno (Part 2)",
      "content": "{\ncomments &#x26;&#x26; comments.map()\n}\nVai retornar true porque ele é um object, já que podemos iterar sobre os comments, porém se comments for undefined ou algum valor falso que a gente não consiga iterar no Map, ele não executa a instrução. Por esse motivo é interessante que a gente saiba os valores possíveis. Uma observação importante, se nós fizemos a conversão para apenas um, por exemplo:\n\nconsole.log(42 == true)\nIrá retornar False, mas se fizermos isso:\n\nconsole.log(!!42 == true)\nEstamos negando ele para ser true, então irá retornar true. Inicialmente ele não funcionou porque o == não faz essa conversão de tipos, já os &#x26;&#x26;, que é um operador booleano, força esse valor a ser convertido para truthy ou falsy value. Sempre for fazer comparações desse tipo, é bom fazer com === para que realmente fique idêntico e assim ele realmente verifica se os valores são os mesmos e isso evita qualquer problema no futuro.\n\nConfira o video:\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Falsy%20e%20Truthy%20Values%20-%20Valores%20considerados%20verdadeiro%20e%20falso%20em%20JS&url=https%3A%2F%2Fdevpleno.com%2Ffalsy-e-truthy-values) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffalsy-e-truthy-values)",
      "description": "Hoje eu gostaria de falar sobre um assunto que surgiu nos comentários do vídeo sobre shortcircuit e valores padrão. Eu não comentei sobre que valores são c...",
      "keywords": [
        "valores",
        "para",
        "true",
        "https",
        "valor",
        "truthy",
        "exemplo",
        "javascript",
        "falsy",
        "values"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/falsy-e-truthy-values"
      }
    },
    {
      "id": "20b635fffe769313",
      "url": "https://devpleno.com/blog/webaudioapi/index",
      "title": "WebAudioAPI - Gerando um som no browser (Part 1)",
      "content": "Hoje eu quero falar um pouco sobre WebAudioAPI e como podemos gerar sons dinamicamente no browser. Vamos começar fazendo uma função que toca um som e depois vamos fazer uma variação do formato de onda. Todo som que eu quiser reproduzir aqui eu preciso de um contexto de áudio. Eu consigo trazer ele de duas formas: utilizando o áudio contexto ou nos browser de webkit, webkit audiocontext:\n\n```jsx\n<html>\n  <head>\n    <tittle>WebAudioAPI</tittle>\n  </head>\n  <body>\n    <script>\n      const contexto = (window.AudioContext || window.webkitAudioContext)\n    </script>\n  </body>\n</html>\n```\n\nAgora, com o contexto pronto, precisamos criar um oscilador, que é uma forma de gerar essa onda dinâmica:\n\n```jsx\nconst osc = contexto.createOscillator()\n```\n\nCom isso conseguimos começar a brincar com o oscilador, por exemplo:\n\n```jsx\nosc.type = 'sine'\n\nosc.frequency.value = 440\n```\n\nNo exemplo, colocamos ele em uma frequência de 440 hertz e agora vamos linkar com o destino do contexto e iniciar o oscilador e depois pedimos para ele pausar depois de dois segundos:\n\n```jsx\nosc.connect(context.destination)\n\nosc.start()\n\nosc.stop(contexto.currentTime + 2)\n```\n\nAo rodar por dois segundos, ele emitirá um som. Agora vamos criar um select, dentro dele podemos variar o tipo de onda:\n\n```jsx\n<select id=”type” onchange=”play()”>\n    <option>-</option>\n    <option value=”sine”>Sine</option>\n    <option value=”square”>Square</option>\n    <option value=”sawtooth”> Sawtooth </option>\n    <option value=”triangle”> Triangle </option>\n</select>\n```\n\nAgora, dentro de script, colocaremos uma function play:\n\n```jsx\n<script>\n\n    function play(){\n        const contexto = (window.AudioContext || window.webkitAudioContex)t\n        const osc =  contexto.createOscillator()\n        osc.type = document.getElementById('type').value\n        osc.frequency.value = 440\n        osc.connect(context.destination)\n        osc.start()\n        osc.stop(contexto.currentTime +2)\n    }\n</script>\n```",
      "keywords": [
        "contexto",
        "option",
        "value",
        "script",
        "vamos",
        "udio",
        "const",
        "window",
        "agora",
        "type"
      ],
      "metadata": {
        "title": "WebAudioAPI - Gerando um som no browser",
        "date": "2017-10-17",
        "tags": "['Javascript']",
        "thumbnail": "Webaudi.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/webaudioapi/index.md"
      }
    },
    {
      "id": "20bd57cf3f7a216e",
      "url": "https://devpleno.com/fs-extra",
      "title": "Fs-extra - Filesystem com Promises e mais funcionalidades - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Fs-extra%20-%20Filesystem%20com%20Promises%20e%20mais%20funcionalidades&url=https%3A%2F%2Fdevpleno.com%2Ffs-extra) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffs-extra)",
      "description": "O Fsextra é uma forma de otimizar as funcionalidades do SF normal do node. Primeiramente, temos que executar o comando yarn sfextra. Uma utilidade interess...",
      "keywords": [
        "extra",
        "https",
        "arquivo",
        "file",
        "javascript",
        "promises",
        "mais",
        "then",
        "console",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/fs-extra"
      }
    },
    {
      "id": "20df81e9ce978daa",
      "url": "https://devpleno.com/como-ser-muito-mais-produtivo",
      "title": "Como ser MUITO mais produtivo? - DevPleno",
      "content": "Carreira\n\n## Como ser MUITO mais produtivo?\n\nT\nPor Tulio Faria • 3 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nVenho aplicando 2 técnicas bastante interessantes: medir o tempo que gasto em cada tarefa e fazer pausas durante as mesmas. Neste vídeo, falo destas técnicas e mostro ferramentas que podem te ajudar a fazer isso e tornar-se mais produtivo no seu dia-a-dia.\n\nPomodoro: [https://cirillocompany.de/pages/pomodo…](https://cirillocompany.de/pages/pomodoro-technique)\n\nToggl (não esquece de baixar o Toggl Desktop): [https://toggl.com](https://toggl.com/)\n\nPomodoro para windows: [https://tomighty.org/](https://tomighty.org/)\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20ser%20MUITO%20mais%20produtivo%3F&url=https%3A%2F%2Fdevpleno.com%2Fcomo-ser-muito-mais-produtivo) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-ser-muito-mais-produtivo)",
      "description": "Venho aplicando 2 técnicas bastante interessantes: medir o tempo que gasto em cada tarefa e fazer pausas durante as mesmas. Neste vídeo, falo destas técnic...",
      "keywords": [
        "https",
        "mais",
        "produtivo",
        "toggl",
        "carreira",
        "muito",
        "pomodoro",
        "como",
        "cnicas",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/como-ser-muito-mais-produtivo"
      }
    },
    {
      "id": "20e38f0381025f11",
      "url": "https://devpleno.com/es6-default-parameters",
      "title": "Javascript - ES6 Default Parameters - DevPleno (Part 1)",
      "content": "Javascript\n\n## Javascript - ES6 Default Parameters\n\nT\nPor Tulio Faria • 10 de outubro de 2017\n\n*\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje vou falar um pouquinho de JavaScript, mais especificamente sobre como podemos fazer o parâmetro padrão para uma função e as alternativas que a gente tem atualmente com ES6 para esse tipo de atividade.\n\nO que é um parâmetro padrão?\n\nVamos supor que temos uma função aplicarImposto, um valor e o quanto de imposto que queremos aplicar para esse valor:\n\nfunction aplicarImposto(valor, imposto) {\nreturn valor + valor * imposto\n}\n\nconsole.log(aplicarImposto(100, 0.1))\nEntão estamos aplicando o imposto nesse valor. Agora vamos supor que eu não quero deixar o imposto ser obrigatório, deixando um valor padrão para ele:\n\nfunction aplicarImposto(valor, imposto) {\nconsole.log(imposto)\n\nreturn valor + valor * imposto\n}\n\nconsole.log(aplicarImposto(100, 0.1))\n\nconsole.log(aplicarImposto(200))\nAo retornarmos apenas isso vai ser retornado NaN (not a number). Isso acontece porque se tentarmos checar o imposto como boolean, sabemos que ele é um falsy por ser undefined. Para corrigir isso, podemos fazer o seguinte:\n\nfunction aplicarImposto(valor, imposto) {\nImposto = imposto || 0.07\n\nreturn valor + valor * imposto\n}\n\nconsole.log(aplicarImposto(100, 0.1))\n\nconsole.log(aplicarImposto(200))\nSe rodarmos novamente, temos o 7% em cima do 200. Mas temos um outro problema. Vamos supor que eu não queira aplicar um imposto (por algum milagre o produto não cobre imposto):*\n\nconsole.log(aplicarImposto(100, 0.1))\n\nconsole.log(aplicarImposto(200))\n\nconsole.log(aplicarImposto(300, 0))\nRepare que ele retorna 321 ao invés de 300, mesmo colocando 0 de imposto. Isso acontece porque checamos **Imposto = imposto || 0.07** como falsy, e como zero é false, ele retorna o imposto. Poderíamos contornar isso checando se o tipo da variável não é uma undefined:",
      "description": "Hoje vou falar um pouquinho de JavaScript, mais especificamente sobre como podemos fazer o parâmetro padrão para uma função e as alternativas que a gente t...",
      "keywords": [
        "imposto",
        "valor",
        "console",
        "aplicarimposto",
        "isso",
        "javascript",
        "para",
        "aplicarimpostoes6",
        "https",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/es6-default-parameters"
      }
    },
    {
      "id": "21373abf7bd5bba5",
      "url": "https://devpleno.com/investimento-para-executar-ideias",
      "title": "Preciso de investimento para minha ideia? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Preciso de investimento para minha ideia?\n\nT\nPor Tulio Faria • 6 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nHoje eu gostaria de falar com vocês sobre como executar uma ideia de forma mais efetiva. Uma coisa que eu vejo com recorrência é que as pessoas costumam ter boas ideias, começam a montar um projeto, mas quando chega em uma certa parte, principalmente quando fica ligada nesse mundo de startups, logo pensam que só conseguirão executar com o auxílio de um investidor.\n\nNa verdade, você não precisa de um investidor para colocar sua ideia no ar, precisa acreditar na sua ideia! Hoje eu acredito muito mais nas minhas ideias do que antes; contrato pessoas para trabalhar em meus projetos e tenho um caminho definido para trilhar para conseguir pelo menos fazer as primeiras vendas e aí sim, se eu precisar escalar isso ou pensar em uma escala que eu precise de um parceiro ou investidor mais forte, eu procuro esse tipo de ajuda, mas o grande detalhe é não deixar que seu projeto morra por falta de investimento, invista você mesmo! Quando você investe na sua ideia, é um ponto a mais para o investidor vir e pensar “esse cara está levando a sério, afinal você não depende de alguém externo para executar.” Isso é muito importante porque hoje há muitas startups na cena e está todo mundo em busca de investimento, mas ninguém querendo investir na própria ideia.\n\nUma coisa que eu pensei muito, isso aconteceu comigo, eu já tive investimento em uma empresa minha, na verdade eu não tive a ideia, mas eu entrei como CTO e era responsável pela área técnica e uma das coisa que percebi é que a gente perde um pouco da noção de como usar o dinheiro quando ele entra muito “fácil”. Pelo menos quando você começa com um investimento próprio, tem uma visão diferente.\n\nEnfim, Se você não acredita na sua ideia, vai ser difícil encontrar alguém que acredite. Muitas vezes a ideia que vai te dar dinheiro é a que você realmente acredita e coloca seu coração.\n\nConfira o video:",
      "description": "Hoje eu gostaria de falar com vocês sobre como executar uma ideia de forma mais efetiva. Uma coisa que eu vejo com recorrência é que as pessoas costumam te...",
      "keywords": [
        "para",
        "ideia",
        "https",
        "investimento",
        "executar",
        "quando",
        "mais",
        "ideias",
        "investidor",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/investimento-para-executar-ideias"
      }
    },
    {
      "id": "2143944a53933a4f",
      "url": "https://devpleno.com/blog/lista-encadeada-adicionar-no/index",
      "title": "Lista encadeada - Adicionar nó (Part 3)",
      "content": "```jsx\nreturn{\n    length: () => length\n    add: (value) => add(value)\n    print: () => console.log(head)\n}\nconst list = LinkedList()\nconsole.log(list.length())\nlist.add(1)\nconsole.log(list.length())\nlist.print()\n```\n\nPerceba que é retornado 0, 1 e em seguida **value:1 next: null**, mas tem um detalhe: se eu chamar novamente um add e adicionar um valor dois, não vai acontecer nada; vamos continuar apenas com um porque agora o head não é mais um false. Agora eu preciso descobrir qual o nó que o next vai ser null para aí sim adicionar nesse null:\n\n```jsx\nconst add (value) =>{\n    if(!head){\n        head = Node(value)\n        length++\n        return head\n    }\n    let node = head\n    while(node.next){\n        node = node.next\n    }\n    node.next = Node(value)\n    length++\n    return node.next\n    console.log(node)\n}\n```\n\nEntão conseguimos chegar no nó, começa com o head e enquanto o node.next for verdadeiro vai andar para frente, quando ele for falso o nó vai ter a representação do último item, então podemos colocar o nó igual a node(value), novamente dou um length++ e um return no next, já que estou retornando o nó que foi adicionado.\n\nVamos recapitular o que fizemos: se minha lista está vazia, eu vou adicionar no head um novo nó, incremento o length. Se isso não acontecer eu vou pegar o head, coloco em uma variável node e enquanto esse nó for verdadeiro, eu vou para o próximo, quando chegar no próximo, que está com null, pego ele e adiciono um novo nó, incremento e retorno esse nó.\n\nA ideia é a gente conseguir adicionar novos nós infinitamente. Quando pensamos isso em uma estrutura de dados sem ser JavaScript, conseguimos adicionar nós dinamicamente, podemos alocar esses espaço de memória e ir adicionando de forma dinâmica, por exemplo, em linguagens como C é um pouco mais utilizado.",
      "keywords": [
        "length",
        "head",
        "value",
        "list",
        "node",
        "para",
        "lista",
        "vamos",
        "return",
        "const"
      ],
      "metadata": {
        "title": "Lista encadeada - Adicionar nó",
        "date": "2017-07-12",
        "tags": "['Algoritmos']",
        "thumbnail": "AdicionarNo.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/lista-encadeada-adicionar-no/index.md"
      }
    },
    {
      "id": "215aecd01a4072b8",
      "url": "https://devpleno.com/blog/algoritmo-campo-minado-minesweeper/index",
      "title": "Algoritmos: Campo Minado (Minesweeper) (Part 1)",
      "content": "Continuando nossa série sobre algoritmos que são utilizados em questões de competições/maratonas de programação e em entrevistas, neste post, iremos tratar sobre o algoritmo campo minado (minesweeper), retirado do livro Programming Challenges de Miguel Skiena. No vídeo, explico detalhadamente sobre o algoritmo e como resolvê-lo.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/lJbqOpm2WGg\" allowfullscreen></iframe>\n</div>\n\n```jsx\nconst input = \\`4 4\n\\*...\n....\n.\\*..\n....\n3 5\n\\*\\*...\n.....\n.\\*...\n0 0\\`\n\nlet lines = input.split('\\\\n')\n\nlet current = 0\nlet currentField = 1\n\nfunction minesweeper(field, numCols){\n  let filledField = \\[\\]\n  const len = field.length\n  for(let i = 0; i<len; i++){\n    let line = \\[\\]\n    for(let k=0; k<numCols; k++){\n      if(field\\[i\\].charAt(k)==='\\*'){\n        line.push('\\*')\n      }else{\n        line.push(0)\n      }\n    }\n    filledField.push(line)\n  }\n  for(let i = 0; i<len; i++){\n    for(let k=0; k<numCols; k++){\n      if(filledField\\[i\\]\\[k\\]!=='\\*'){\n        if(i>0){\n          if(k>0){\n            if(filledField\\[i-1\\]\\[k-1\\]==='\\*'){\n              filledField\\[i\\]\\[k\\]++\n            }\n          }\n          if(filledField\\[i-1\\]\\[k\\]==='\\*'){\n            filledField\\[i\\]\\[k\\]++\n          }\n          if(k+1<numCols){\n            if(filledField\\[i-1\\]\\[k+1\\]==='\\*'){\n              filledField\\[i\\]\\[k\\]++\n            }\n          }\n        }\n\n        if(k>0){\n          if(filledField\\[i\\]\\[k-1\\]==='\\*'){\n            filledField\\[i\\]\\[k\\]++\n          }\n        }\n        if(k+1<numCols){\n          if(filledField\\[i\\]\\[k+1\\]==='\\*'){\n            filledField\\[i\\]\\[k\\]++\n          }\n        }",
      "keywords": [
        "filledfield",
        "numcols",
        "line",
        "const",
        "current",
        "field",
        "nums",
        "sobre",
        "minesweeper",
        "embed"
      ],
      "metadata": {
        "title": "Algoritmos: Campo Minado (Minesweeper)",
        "date": "2017-02-24",
        "tags": "['Algoritmos']",
        "thumbnail": "ALG.-CAMPO-MINADO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/algoritmo-campo-minado-minesweeper/index.md"
      }
    },
    {
      "id": "216af3636a9a9ac6",
      "url": "https://devpleno.com/blog/entenda-a-importancia-de-cursos-para-desenvolvedores/index",
      "title": "Entenda a importância de cursos para desenvolvedores (Part 3)",
      "content": "Não se pode negar que o ReactJS está em alta, especialmente por ter sido desenvolvido pelo Facebook e Instagram. Porém, mais do que uma moda, ele veio para ficar.\n\nA novidade facilita a escrita em Javascript, é eficiente, excelente para SEO, tem suporte da equipe do Facebook (apesar de ser opensource) e funciona muito bem em aplicativos mobile.\n\n### Firebase\n\nPor falar em mobile, não dá para não mencionar o Firebase como uma ferramenta em alta. Trata-se de uma plataforma móvel do Google que ajuda o desenvolvedor a criar aplicativos, aumentar a base de usuários e obter mais conversões.\n\nCom APIs intuitivas em um único SDK, o Firebase permite a criação de apps sem a necessidade de infraestrutura complexa, facilitando o ensino e a aprendizagem de desenvolvimento. Assim, dê preferência para cursos que usem esta ferramenta. Há uma grande chance de você continuar utilizando-a nos desafios futuros.\n\n### Integração contínua\n\nOs desenvolvedores estão se unindo cada vez mais. Aprender a trabalhar em integração contínua é fundamental para sua carreira. No “Continuous Integration” os membros da equipe integram seu trabalho com frequência.\n\nNesse caso, “integração” é uma fase do desenvolvimento de software em que todo o trabalho do time é agregado, validado e testado. Desta forma, é possível identificar rapidamente possíveis falhas. A técnica reduz o prazo para a entrada em operação do aplicativo que está sendo projetado.\n\n### Continous-deployment\n\nSegurança nunca é demais. Por isso outra prática em alta é a realização de continuous deployment — processo de inserção de um novo código em um brench ou trunk. A técnica permite testar rapidamente um código por meio de testes automatizados. Isso pode acelerar o desenvolvimento do aplicativo.\n\n### Redux",
      "keywords": [
        "para",
        "mais",
        "cursos",
        "pode",
        "empresa",
        "habilidades",
        "poss",
        "desenvolvimento",
        "isso",
        "reactjs"
      ],
      "metadata": {
        "title": "Entenda a importância de cursos para desenvolvedores",
        "date": "2017-07-07",
        "tags": "['Carreira']",
        "thumbnail": "102980-entenda-a-importancia-de-cursos-para-desenvolvedores-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/entenda-a-importancia-de-cursos-para-desenvolvedores/index.md"
      }
    },
    {
      "id": "218f784af6ac7f8f",
      "url": "https://devpleno.com/ferias-e-feriados-trabalhando-por-meio-da-toptal",
      "title": "Férias e feriados trabalhando por meio da toptal - DevPleno",
      "content": "Carreira\n\n## Férias e feriados trabalhando por meio da toptal\n\nT\nPor Tulio Faria • 16 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nMuita gente me pergunta sobre a questão das férias e dos feriados quando se trabalha por meio da Toptal. Explico tudo neste vídeo:\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS aqui](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog).\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=F%C3%A9rias%20e%20feriados%20trabalhando%20por%20meio%20da%20toptal&url=https%3A%2F%2Fdevpleno.com%2Fferias-e-feriados-trabalhando-por-meio-da-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fferias-e-feriados-trabalhando-por-meio-da-toptal)",
      "description": "Muita gente me pergunta sobre a questão das férias e dos feriados quando se trabalha por meio da Toptal. Explico tudo neste vídeo: <div className=&#34;embedres...",
      "keywords": [
        "https",
        "toptal",
        "feriados",
        "meio",
        "carreira",
        "trabalhando",
        "mais",
        "profissionais",
        "devpleno",
        "rias"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/ferias-e-feriados-trabalhando-por-meio-da-toptal"
      }
    },
    {
      "id": "22088193f31827d6",
      "url": "https://devpleno.com/blog/empreender-na-area-de-software/index",
      "title": "3 dicas para começar a empreender na área de software (Part 1)",
      "content": "Hoje quero dar três dicas para você que está começando a empreender na área de software. Vou aproveitar uma dúvida e comentário do João Henrique, em um vídeo nosso, dizendo que ele está começando na área, gosta de programar, está começando a empreender na área e qual dica eu daria a ele.\n\n**Dica #1 – Comece simples**\n\nNão tente pegar o maior sistema que você puder de primeira porque você não tem experiência. Eu aconselho a começar com um site com uma parte mais dinâmica, por exemplo, e vai aumentando gradativamente à medida que você for ganhando experiência. Isso é muito importante para que você consiga ir melhorando cada vez mais.\n\n**Dica #2 – Tenha um portfólio**\n\nSe você não tem nada para mostrar, eu aconselho que faça um projeto social. Vá em um asilo/creche e crie um projeto para ajudar alguma dessas instituições. O portfólio vai te mostrar duas coisas: a primeira é mostrar para um potencial cliente e a segunda é aprender com um projeto em produção, além de ajudar outras pessoas, claro.\n\n**Dica #3 – Aprenda a vender**\n\nSe você quer realmente continuar nessa carreira, aprenda a vender, foi uma das melhores coisas que eu aprendi. Estude muito como fazer marketing. Já cheguei a vender sistemas de R$150 mil porque eu aprendi a vender.\n\nNa primeira venda tente tirar todas as lições disso, o que você aprendeu e o que você errou. Eu faço isso em toda reunião que faço para vender algo.\n\n**Dica #4 (bônus) – Negociar é deixar as duas partes alinhadas**\n\nNegociação não é pra sugar a outra parte e sim para deixar as duas partes alinhadas. Você não tem que explorar o seu cliente, mas sim alinhar o valor cobrado. Não é aquilo de baixar R$5,00 ou R$1.000,00, negociação de verdade é quando as duas partes saem de um contrato muito felizes por terem feito um bom negócio.",
      "keywords": [
        "para",
        "vender",
        "dica",
        "come",
        "duas",
        "embed",
        "ando",
        "primeira",
        "muito",
        "mostrar"
      ],
      "metadata": {
        "title": "3 dicas para começar a empreender na área de software",
        "date": "2017-08-16",
        "tags": "['Carreira']",
        "thumbnail": "COMEÇAR-A-EMPREENDER-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/empreender-na-area-de-software/index.md"
      }
    },
    {
      "id": "2240b72b5ab9ed20",
      "url": "https://devpleno.com/tag/javascript/15",
      "title": "Javascript - Pagina 15 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 27 de dez. de 2016 Loops/Repetições/Iterações no JSX do React](/loopsrepeticoesiteracoes-no-jsx-do-react)\n\n[Javascript 23 de nov. de 2016 ReactJS: comentários em JSX](/reactjs-comentarios-em-jsx)\n\n[Javascript 13 de out. de 2016 cmder: Turbine seu cmd no Windows](/cmder-turbine-seu-cmd-no-windows)\n\n[Javascript 4 de out. de 2016 Como converter uma string em Base64 em JavaScript (Navegador e NodeJS)](/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs)\n\n[Javascript 3 de out. de 2016 Mongoose: corrigindo \"Cannot overwrite 'Model' model once compiled\"](/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose)\n\n[Javascript 17 de ago. de 2016 NodeJS Primeiros Passos: Async - Map](/nodejs-primeiros-passos-async-map)\n\n[Javascript 15 de ago. de 2016 NodeJS Primeiros Passos: Async - Waterfall](/nodejs-primeiros-passos-async-waterfall)\n\n[Javascript 12 de ago. de 2016 NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas](/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas)\n\n[Javascript 7 de ago. de 2016 Servidor de arquivos e sistemas locais com HTTPS](/servidor-de-arquivos)\n\n[Javascript 5 de ago. de 2016 NodeJS Primeiros Passos Assíncrono](/assincrono)\n\n[Javascript 27 de jul. de 2016 NodeJS Primeiros Passos: Módulos](/nodejs-primeiros-passos-modulos)\n\n[Javascript 26 de jul. de 2016 NodeJS Primeiros Passos: Closures e Escopos](/closures-e-escopos)\n\n[Anterior](/tag/javascript/14)15 / 16[Próxima](/tag/javascript/16)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "nodejs",
        "2016",
        "primeiros",
        "passos",
        "async",
        "reactjs",
        "como",
        "model",
        "algoritmos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/15"
      }
    },
    {
      "id": "22b9a27725934006",
      "url": "https://devpleno.com/fullstack-master-listadeespera",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master-listadeespera to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstack",
        "master",
        "listadeespera"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstack-master-listadeespera"
      }
    },
    {
      "id": "233eabe6ec57eea4",
      "url": "https://devpleno.com",
      "title": "DevPleno - Ajudando desenvolvedores a construir produtos de classe mundial (Part 1)",
      "content": "Você pode tudo\n\n## Code Hard. **\nLive Free.\n\nAjudo desenvolvedores a construir produtos de classe mundial mantendo o estilo de vida que os fez começar a programar.\n\n[Assistir no YouTube](https://youtube.com/@devpleno) [Ver Programas](#programas)\n[](https://youtube.com/@devpleno)[](https://github.com/tuliofaria)[](https://x.com/devpleno)[](https://instagram.com/devpleno)\n\nEm Desenvolvimento\n\nproximo-projeto.ts\n\n<div className=\"hero-container\">\n<Developer profile={tulio} />\n<Life style=\"coding\" />\n</div>\n\n## // Trilhas Curadas\n\n### Escolha Seu Programa de Crescimento\n\nExperiências de aprendizado personalizadas para cada estágio da sua jornada como desenvolvedor, da primeira linha de código ao seu próprio SaaS.\n\nIniciante\n\n#### Fullstack Master 101\n\nO plano definitivo para quem quer entrar na área de tecnologia com uma base sólida.\n\nEm Breve\n\nAvançado\n\n#### Fullstack Master Pro\n\nEleve suas habilidades para liderar times e entregar produtos de alto desempenho.\n\n[Conhecer Programa](https://go.devpleno.com/fsm)\n\nMentoria\n\n#### TheSiders\n\nMentoria exclusiva 1:1 focada em construir e escalar seus produtos de software.\n\n[Conhecer Programa](https://do.devpleno.com/thesiders)\n\nEmpreendedorismo\n\n#### Simple SaaS\n\nDa validação à escala. Uma jornada completa para transformar ideias em negócios.\n\nEm Breve\n\nArquitetura\n\n#### TheBestStack\n\nPrepare sua arquitetura para o futuro. Aprenda a preparar sua stack para a velocidade da IA.\n\n[Conhecer Programa](https://do.devpleno.com/the-best-stack)\n\nProdutividade\n\n#### My AI Way\n\nOs bastidores do meu workflow pessoal com IA para entregar 10x mais em metade do tempo.\n\n[Conhecer Programa](https://do.devpleno.com/the-best-stack)\n\n[Finanças Conta49 Contabilidade Trabalha como PJ? Quer receber do seu SaaS de forma correta? A Conta49 é a minha contabil](https://www.conta49.com.br)\n\n#### Origem\n\nComecei como dev ainda adolescente, entregando projetos às 3 da manhã (para aproveitar a internet discada mais barata).\n\n#### Filosofia",
      "description": "Cursos, mentorias e conteudo para desenvolvedores que querem evoluir na carreira e construir produtos incriveis.",
      "keywords": [
        "para",
        "https",
        "como",
        "devpleno",
        "programa",
        "code",
        "construir",
        "conhecer",
        "claude",
        "2026"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/"
      }
    },
    {
      "id": "234d8feb1060b6d7",
      "url": "https://devpleno.com/validade",
      "title": "Validade de um projeto/ideia/ação - DevPleno (Part 1)",
      "content": "Carreira\n\n## Validade de um projeto/ideia/ação\n\nT\nPor Tulio Faria • 6 de setembro de 2017\n\n[Carreira](/tag/carreira)\n\nNa dica de hoje, eu quero mostrar pra você que nem sempre a gente tem que ir até o fim com as coisas, é algo que eu estou passando nesse momento e sempre repenso sobre a minha empresa, sobre as coisas que estamos fazendo e se estamos indo pelo caminho certo.\n\nQuando você cria um projeto novo e está em uma empreitada nova, além do empenho e tudo que você precisa para executar, uma das coisas que a gente esquece de definir é quando parar, qual o prazo de validade do projeto ou do atendimento a um cliente específico.\n\nPor exemplo, coisas que já errei na minha vida: eu já tive empresas que não defini um prazo para acabar. Se ela não conseguiu ter X de faturamento, precisava fechar as portas. Isso é muito importante para que a gente consiga alinhar se estamos indo para um caminho certo ou não.\n\nQuando você for atender um cliente é a mesma coisa, muitas vezes um projeto começa sobre uma perspectiva e, à medida que ele vai evoluindo, você começa a mudar esse rumo. Se você não consegue chegar ao fim e bate na validade do projeto que definiu, pode ser contratual ou uma meta pessoal, principalmente se o resultado é importante para você assim como é para mim e você não está conseguindo entregar resultado, isso é um indício de que a validade com ele acabou.\n\nOutra coisa que pode acontecer quando está atendendo um cliente é ele não ficar lucrativo. Às vezes você está gastando muito mais energia para atender esse cliente do que você está tendo de lucro, então esse projeto que está “empatando”, é prejuízo. Eu considero que se você está muito próximo de ter uma margem de lucro, às vezes esse lucro não vale a pena e isso é um indício de que você precisa ou renegociar ou simplesmente expirar e não atender mais esse cliente. São pontos muito importantes que temos que definir para nosso negócio ou carreira.",
      "description": "Na dica de hoje, eu quero mostrar pra você que nem sempre a gente tem que ir até o fim com as coisas, é algo que eu estou passando nesse momento e sempre r...",
      "keywords": [
        "validade",
        "para",
        "quando",
        "projeto",
        "cliente",
        "https",
        "isso",
        "muito",
        "esse",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/validade"
      }
    },
    {
      "id": "2354763275eae13e",
      "url": "https://devpleno.com/spread-operator",
      "title": "Testando o Spread Operator: Novidade do ES6 - DevPleno (Part 1)",
      "content": "Javascript\n\n## Testando o Spread Operator: Novidade do ES6\n\nT\nPor Tulio Faria • 5 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nOlá!\n\nNeste post, vou mostrar uma novidade do ES6: o Spread Operator.\n\nVocê deve estar se perguntando agora (ou não)*:\n\n**Para que serve o Spread Operator?**\n\nO Spread Operator é usado com bastante frequência principalmente quando queremos utilizar a imutabilidade, ou seja, criar um objeto novo a partir de um objeto existente.\n\n**Mãos na massa**\n\nEle é bastante simples, vou criar um exemplo utilizando Array.\n\nPrimeiramente temos que criar o Array:\n\nconst arr = [0, 1, 2]\nEntão, se eu quisesse criar um novo vetor eu faria:\n\nconstNewArr = [...arr, 3]\nSomente esses 3 pontinhos já é o Spread Operator.\n\n**E o que ele faz?**\n\nVai ficar bem claro quando fizermos um teste com funções. Se eu pedir para rodar:\n\nconsole.log(newArr)\nEle nos retornará um vetor novo com o 0,1,2,3.\n\nEu adicionei o item 3 no final e posso manipulá-lo em qualquer posição, por exemplo\n\nconst NewArr = [3, ...arr]\nEle irá aparecer 3,0,1,2. Não ficou claro? Então vamos para outro exemplo e ficará mais fácil de entender. Quando colocamos …arr é basicamente o mesmo que colocarmos o que está dentro do Array, por esse motivo se chama Spread Operator, pois é um operador que espalha os valores.\n\nSe pensarmos assim, podemos fazer o seguinte:\n\nfunction soma(a, b, c) {\nreturna + b + c\n}\nAo mandar rodar o\n\nconsole.log(soma(...arr))\nEle irá espalhar estes valores em a, b e c e vamos conseguir somar esses valores.\n\nPodemos utilizar isso de várias maneiras, como por exemplo tirando um valor do arr\n\nconst arr = [0, 1, 2]\ndeixando\n\nconst arr = [0, 2]\nE passando para o\n\nconsole.log(soma(1, ...arr))\n**Dica**\n\nUma dica fácil é lembrar que ele espalha os valores colocando virgula entre eles. Isso é bastante útil, principalmente quando a gente quer duplicar um vetor.\n\nVocê pode conferir o Hands-on também pelo vídeo:",
      "description": "Olá! Neste post, vou mostrar uma novidade do ES6: o Spread Operator. Você deve estar se perguntando agora (ou não): Para que serve o Spread Operator? O Spr...",
      "keywords": [
        "operator",
        "spread",
        "para",
        "https",
        "quando",
        "criar",
        "exemplo",
        "const",
        "valores",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/spread-operator"
      }
    },
    {
      "id": "235c359ad51a2db1",
      "url": "https://devpleno.com/blog/preview-de-imagens-antes-do-upload/index",
      "title": "Preview de imagens antes do upload (Part 1)",
      "content": "Hoje vamos fazer o preview da imagem que está sendo selecionada para fazer upload, isso é bastante interessante de se fazer quando o usuário está selecionando uma foto.\n\nVamos criar inicialmente um html, em seguida criar um input type do tipo file e um img:\n\n```jsx\n<html>\n  <head>Preview Upload</head>\n  <body>\n    <input type='file' id='upload' />\n    <img id='img' />\n    <script\n      src='https://code.jquery.com/jquery-3.2.1.slim.js'\n      integrity='sha256-tA8y0XqiwnpwmOIl3SGAcFl2RvxHjA8qp0+1uCGmRmg='\n      crossorigin='anonymous'\n    ></script>\n  </body>\n</html>\n```\n\nAgora vamos abrir uma tag script nele. Quando o documento estiver pronto e for feito um change, vamos fazer um console.log this:\n\n```jsx\n<script>\n  $(function()\n  {$('#upload').change(function () {\n    console.log($(this)[0].files)\n  })})\n</script>\n```\n\nAssim estamos pegando o arquivo na posição zero. A partir disso, vamos criar um const que vai ser igual a this na posição 0. Já que ele é uma instância de files, conseguimos utilizar um fileReader e ler e processar esse arquivo:\n\n```jsx\n<script>\n  $(function()\n  {$('#upload').change(function () {\n    const file = $(this)[0].files[0]\n    const fileReader = new fileReader()\n    fileReader.onLoadend = function () {\n      console.log(fileReader.result)\n    }\n    fileReader.readAsDataURL(file)\n  })})\n</script>\n```\n\nComo a imagem gera uma URL válida, se eu colocá-lo como source da imagem, ele vai dar um preview.\n\n```jsx\n<script>\n    $(function(){\n        $('#upload').change(function(){\n            const file = $(this)[0].files[0]\n            const fileReader = new fileReader()\n            fileReader.onLoadend = function(){\n                $('#img')attrib('src', .fileReader.result)\n            }\n            fileReader.readAsDataURL(file)\n        })\n    })\n</script>\n```\n\nIsso é muito interessante para a experiência do usuário como um todo. Imagine se eu estivesse selecionando um documento, seria muito mais fácil se eu estivesse prevendo ele.",
      "keywords": [
        "filereader",
        "script",
        "function",
        "upload",
        "file",
        "vamos",
        "this",
        "const",
        "fazer",
        "https"
      ],
      "metadata": {
        "title": "Preview de imagens antes do upload",
        "date": "2017-11-13",
        "tags": "['Javascript']",
        "thumbnail": "PreviewDeImagens.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/preview-de-imagens-antes-do-upload/index.md"
      }
    },
    {
      "id": "237a9d447c1fd35e",
      "url": "https://devpleno.com/javascript-apply",
      "title": "JavaScript: Apply - DevPleno (Part 2)",
      "content": "console.log(Math.max.apply(Math, vetor1))\nCom o apply, podemos adaptar como vamos executar a função e também é uma forma de manipular em qual contexto essa função está sendo executada, assim como o bind. Ela é muito útil quando precisamos converter ou passar atributos para a função como vetor ao invés de individualmente.\n\nConfira o vídeo:\n\nDeixe seu comentário. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=JavaScript%3A%20Apply&url=https%3A%2F%2Fdevpleno.com%2Fjavascript-apply) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fjavascript-apply)",
      "description": "Hoje vou falar um pouco sobre o Apply em JavaScript e mostrar um exemplo de como podemos utilizálo para calcular o menor e o maior valor em um conjunto de ...",
      "keywords": [
        "apply",
        "funteste",
        "javascript",
        "como",
        "podemos",
        "para",
        "this",
        "console",
        "math",
        "https"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/javascript-apply"
      }
    },
    {
      "id": "237fea40eba09e78",
      "url": "https://devpleno.com/teclado-com-webaudioapi",
      "title": "Criando um teclado com WebAudioAPI - DevPleno (Part 1)",
      "content": "Javascript\n\n## Criando um teclado com WebAudioAPI\n\nT\nPor Tulio Faria • 18 de outubro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje quero continuar falando sobre [WebAudioAPI](https://www.devpleno.com/webaudioapi/). Vamos um pouco além do que já fizemos anteriormente. No nosso arquivo HTML, teremos dois scripts com função para ler qual tecla no teclado estamos apertando e outra para quando soltarmos a tecla:\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;script>\nfunction onKeyDown(key){console.log(key)}\nfunction onKeyUp(key){console.log(key)}\nwindow.onkeydown = onKeyDown window.onkeyup = onKeyUp\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nA partir disso, podemos utilizar o contexto para tocar um áudio, mas não podemos utilizar vários deles, por esse motivo temos que checar se já apertamos a tecla, mas antes disso vamos fazer um check para saber qual tecla estamos pressionando. Para isso, tenho o mapeamento das teclas:",
      "description": "Hoje quero continuar falando sobre WebAudioAPI. Vamos um pouco além do que já fizemos anteriormente. No nosso arquivo HTML, teremos dois scripts com função...",
      "keywords": [
        "keycode",
        "para",
        "https",
        "onkeydown",
        "onkeyup",
        "const",
        "function",
        "window",
        "maposc",
        "webaudioapi"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/teclado-com-webaudioapi"
      }
    },
    {
      "id": "23a2831895260c93",
      "url": "https://devpleno.com/blog/microfone-pelo-navegador/index",
      "title": "Capturando áudio do microfone pelo Navegador (Part 3)",
      "content": "Porque geralmente o protocolo HTTP em si não lida bem com binário, principalmente quando precisamos misturar binário com conteúdo em texto. Por esse motivo usamos essa codificação dos dados binários para algo e transferimos isso como texto.\n\nAlém disso, temos uma outra vantagem, podemos, por exemplo, utilizar a url para dar play no body:\n\n```jsx\nmediaRecorder.onstop = () => {\n  const blob = new Blob(chunks, { type: 'audio/ogg; code=opus' })\n  const reader = new window.fileReader()\n  reader.readAsDtaURL(blob)\n  reader.onloadend = () => {\n    const audio = document.createElement('audio')\n    audio.src = reader.result\n    audio.controls = true\n    $('body').append(audio)\n  }\n}\n```\n\nA partir disso podemos por exemplo mandar o áudio em um post, ou fazer o start e o stop baseado em um botão, assim cada vez que apertarmos um botão vai ser feito a ação. Isso abre um leque de possibilidades muito grande.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/80giIJkO5V8\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "mediarecorder",
        "para",
        "audio",
        "stream",
        "reader",
        "podemos",
        "udio",
        "script",
        "isso",
        "blob"
      ],
      "metadata": {
        "title": "Capturando áudio do microfone pelo Navegador",
        "date": "2017-11-13",
        "tags": "['Javascript']",
        "thumbnail": "Microfone.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/microfone-pelo-navegador/index.md"
      }
    },
    {
      "id": "23ce4d3b4a1230ce",
      "url": "https://devpleno.com/blog/se-sujar-faz-bem/index",
      "title": "Porque se sujar faz bem! (Part 1)",
      "content": "Uma coisa que sempre marcou a minha infância foram as propagandas do sabão em pó OMO que via na TV. O slogan era “Se sujar faz bem” e mostrava as crianças pulando e brincando na lama sem medo de se sujar.\n\nSe fossemos trazer esse ensinamento para o nosso meio profissional, percebemos que tem muita gente que, por mais que queira fazer algo, tem medo de errar, medo de se sujar. Muitas vezes você tem medo de assumir um compromisso em um projeto com um pouco a mais de conhecimento que você não tem por de falhar e nisso o slogan da OMO tem todo sentido, você errar, dar esse passo a mais faz bem mesmo quando você se suja, o risco é grande mas você aprende muito com isso.\n\nSempre que você puder fazer algum projeto que tem algo a mais ou precisa tomar alguma atitude que vai um pouco além da sua zona de descanso, se realmente almeja uma carreira melhor, arrisque-se. Muitas vezes você vai errar e esse erro irá fazer você ficar cada vez melhor.\n\nOutra coisa bastante importante é não achar que tem que dar certo de primeira, por exemplo, sua empresa tem que dar certo de primeira, arriscar uma tecnologia nova e tem que dar certo de primeira e por aí vai... Eu sempre gosto de primar é fazer até dar certo, não importa se vai ser de primeira, segunda. Se você acredita naquilo, tem que correr o risco. Não fique com medo de testar uma tecnologia nova ou pegar algum projeto novo porque isso vai te trazer muito aprendizado.",
      "keywords": [
        "muito",
        "mais",
        "medo",
        "sujar",
        "para",
        "fazer",
        "errar",
        "certo",
        "primeira",
        "embed"
      ],
      "metadata": {
        "title": "Porque se sujar faz bem!",
        "date": "2017-08-09",
        "tags": "['Carreira']",
        "thumbnail": "SeSujar.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/se-sujar-faz-bem/index.md"
      }
    },
    {
      "id": "244ce3ff63a6aa11",
      "url": "https://devpleno.com/mono-ou-multi-thread-poo-para-js",
      "title": "Mono ou multi thread - POO para JS - DevPleno (Part 3)",
      "content": "const stock = \\[\\]\nfunction producer(){\nconsole.log('producer')\nsetTimeOut(producer, Math.ceil(Math.random()\\*3000))\n}\nfunction consumer(){\nconsole.log('consumer')\nsetTimeOut(consumer, Math.ceil(Math.random()\\*3000))\n}\nLembrando que o math.random retorna um número de 0 a 1, em seguida vamos multiplicar pelo valor máximo e arredonda para cima.\n\nCom isso vamos mandar produzir pelo menos um e começar a consumir:\n\nproducer()\nconsumer()\nAgora, quando quisermos produzir, vamos colocar no stock:\n\nconst stock = \\[\\]\nfunction producer(){\nconsole.log('producer', stock.length)\nstock.push(Math.random()\\*100)\nsetTimeOut(producer, Math.ceil(Math.random()\\*3000))\n}\nAgora eu preciso consumir esse valor:\n\nfunction consumer(){\nconst item = stock\\[stock.length-1\\]\nstock.splice(stock.length-1, 1)\nconsole.log('consumer', stock.length)\nsetTimeOut(consumer, Math.ceil(Math.random()\\*3000))\n}\nSe tentarmos consumir e não tiver no estoque, não vai dar certo, então podemos fazer o seguinte:\n\nfunction consumer(){\nif(stock.length===0){\nconsole.log('não foi possível consumir')\n} else {\nconst item = stock\\[stock.length-1\\]\nstock.splice(stock.length-1, 1)\nconsole.log('consumer', stock.length)\n}\nsetTimeOut(consumer, Math.ceil(Math.random()\\*3000))\n}\nCom isso temos uma sensação de que estão trabalhando separadamente, mas na verdade estamos empilhando e depois desempilhando após um tempo aproximado.\n\nPor que é importante saber que isso acontece?\n\nPorque basicamente qualquer operação pesada acontece de forma assíncrona.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje vou continuar falando um pouco mais sobre como podemos fazer a transição de uma linguagem orientadaobjeto, como PHP ou Java, para JavaScript cada vez ...",
      "keywords": [
        "stock",
        "para",
        "const",
        "consumer",
        "math",
        "isso",
        "console",
        "javascript",
        "producer",
        "length"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/mono-ou-multi-thread-poo-para-js"
      }
    },
    {
      "id": "24513684ed170c01",
      "url": "https://devpleno.com/injecao-de-dependencia",
      "title": "Injeção de dependência - Aumente a testabilidade do seu código - DevPleno (Part 3)",
      "content": "O que eu quero ressaltar é o seguinte: fica mais claro para nós o que o valida faz, assim que expomos as dependências dele, o nosso código começa a criar essa auto documentação, o que gera uma qualidade de código muito grande.\n\nConfira a explicação em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Inje%C3%A7%C3%A3o%20de%20depend%C3%AAncia%20-%20Aumente%20a%20testabilidade%20do%20seu%20c%C3%B3digo&url=https%3A%2F%2Fdevpleno.com%2Finjecao-de-dependencia) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Finjecao-de-dependencia)",
      "description": "Pode parecer besteira, mas eu sempre ouvia sobre injeção de dependência. porém nunca tinha refletido tanto sobre ela. Quando passei a testar mais o meu cód...",
      "keywords": [
        "alert",
        "para",
        "digo",
        "model",
        "depend",
        "quando",
        "ncia",
        "vamos",
        "temos",
        "return"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/injecao-de-dependencia"
      }
    },
    {
      "id": "24519a7dbc8cbf3e",
      "url": "https://devpleno.com/blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index",
      "title": "As vantagens do Javascript em todas as camadas de uma aplicação (Part 4)",
      "content": "É possível receber a entrada no navegador com JavaScript, transportar a demanda para o back end ainda com a linguagem e, por fim, salvar um objeto no MongoDB ainda com o JavaScript. Naturalmente, o fluxo reverso também será tão prático quanto.\n\nE você, já está pronto para trabalhar com o JavaScript e se tornar um desenvolvedor full stack? Entre em [contato com a gente](https://www.devpleno.com/contato?utm_source=blog&utm_campaign=rc_blogpost) para aprender mais sobre essa possibilidade e potencializar seu currículo para o mercado! Esperamos você!",
      "keywords": [
        "javascript",
        "para",
        "aplica",
        "linguagem",
        "mais",
        "camadas",
        "node",
        "todas",
        "back",
        "front"
      ],
      "metadata": {
        "title": "As vantagens do Javascript em todas as camadas de uma aplicação",
        "date": "2017-10-06",
        "tags": "['Javascript']",
        "thumbnail": "VantagensUsarJS.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index.md"
      }
    },
    {
      "id": "24699334834c7e5e",
      "url": "https://devpleno.com/blog/precificacao-de-softwares-voce-sabe-como-fazer/index",
      "title": "Precificação de softwares: você sabe como fazer? (Part 4)",
      "content": "Não se esqueça de incluir no seu preço uma porcentagem a mais para pagar impostos que podem variar de 7,5% a 27,5% dependendo da quantia envolvida. Isso é ainda mais importante para quem possui uma empresa, pois há diferentes tributos.\n\n## Como explicar o valor do software para o cliente?\n\nA precificação de software precisa, antes de mais nada, ser justa e, mais do que isso, ser entendida como justa pelo cliente. Caso contrário, será difícil você obter consumidores dispostos a pagar pelo valor cobrado, pois dificilmente terão noção de todos os recursos e habilidades empregadas no desenvolvimento do programa.\n\nÉ preciso também esclarecer qual o valor que o software terá para o consumidor, o que é diferente de preço. Esse se baseia em dados “palpáveis”, podendo ser quantificado com base nos recursos empregados num produto. Já o valor tem a ver com algo subjetivo, variando de indivíduo para indivíduo. Dependendo da necessidade da pessoa, seu software poderá ter menor ou maior valor.\n\nTambém é importante literalmente abrir o jogo com o cliente, sendo honesto e apresentando as razões reais da quantia cobrada pelo programa. Para isso, fale sobre:\n\n- os preços praticados pelo mercado;\n\n- os gastos com mão de obra não só sua, mas de outros profissionais caso tenha sido preciso contratá-los;\n\n- a experiência necessária para o desenvolvimento do software;\n\n- o tempo de trabalho exigido, especialmente se foi necessário trabalhar em feriados e fins de semana, até mesmo de noite;\n\n- o grau de complexidade do programa e os [estudos sobre tecnologia](https://www.devpleno.com/como-organizar-os-estudos-em-tecnologia?utm_source=blog&utm_campaign=rc_blogpost) necessários etc.\n\n## Qual a diferença entre precificação de softwares e de outros tipos de produto?\n\nPara convencer um cliente, é preciso utilizar a racionalização em cima dos recursos necessários, mesmo que subjetivos. Aliás, isso é um dos fatores que diferenciam um produto convencional de um software.",
      "keywords": [
        "para",
        "software",
        "valor",
        "como",
        "mais",
        "tamb",
        "seus",
        "ncia",
        "trabalho",
        "hora"
      ],
      "metadata": {
        "title": "Precificação de softwares: você sabe como fazer?",
        "date": "2017-06-28",
        "tags": "['Carreira']",
        "thumbnail": "Precificacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "blog/precificacao-de-softwares-voce-sabe-como-fazer/index.md"
      }
    },
    {
      "id": "24715fe5e838d2b7",
      "url": "https://devpleno.com/blog/teclado-com-webaudioapi/index",
      "title": "Criando um teclado com WebAudioAPI (Part 2)",
      "content": "```jsx\n<html>\n    <body>\n        <script>\n            const notes = { 'C3': 130.81,\n                'C#3': 138.59,\n                'D3': 146.83,\n                'D#3': 155.56,\n                'E3': 164.81,\n                'F3': 174.61,\n                'F#3': 185.00,\n                'G3': 196.00,\n                'G#3': 207.65,\n                'A3': 220.00,\n                'A#3': 233.08,\n                'B3': 246.94,\n                'C4': 261.63,\n                'C#4': 277.18,\n                'D4': 293.66,\n                'D#4': 311.13,\n                'E4': 329.63,\n                'F4': 349.23,\n                'F#4': 369.99,\n                'G4': 392.00,\n                'G#4': 415.30,\n                'A4': 440.00,\n                'A#4': 466.16,\n                'B4': 493.88,\n                'C5': 523.25,\n                'C#5': 554.37,\n                'D5': 587.33,\n                'D#5': 622.25,\n                'E5': 659.25,\n                'F5': 698.46,\n                'F#5': 739.99,\n                'G5': 783.99,\n                'G#5': 830.61,\n                'A5': 880.00,\n                'A#5': 932.33,\n                'B5': 987.77\n            }\n            const map = {\n                65 = 'C3',\n                83 = 'D3',\n                68 = 'E3',\n                70 = 'F3',\n                71 = 'G3',\n                72 = 'A3',\n                74 = 'B3'\n            }\n            const context = new (window.AudioContext || window.webkitAudioContext)()\n            function onKeyDown(key){\n                if(key.keyCode in map){\n                    const osc = constext.createOscillator()\n                    osc.type = 'sine'\n                    osc.frequency.value = notes[map[key.keyCode]]\n                    osc.connect(contexto.destination)\n                    osc.start()\n                    osc.stop(contexto.currentTime+2)\n                }\n            }\n            function onKeyUp(key){\n                console.log(key)\n            }\n            window.onkeydown = onKeyDown\n            window.onkeyup = onKeyUp\n        </script>\n    </body>\n</html>\n```",
      "keywords": [
        "keycode",
        "para",
        "onkeydown",
        "onkeyup",
        "const",
        "function",
        "window",
        "maposc",
        "html",
        "tecla"
      ],
      "metadata": {
        "title": "Criando um teclado com WebAudioAPI",
        "date": "2017-10-18",
        "tags": "['Javascript']",
        "thumbnail": "TecladoComWebAudi.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/teclado-com-webaudioapi/index.md"
      }
    },
    {
      "id": "24bc5ee1eefc08fb",
      "url": "https://devpleno.com/ensino-formal-ou-cursos-livres",
      "title": "Ensino Formal ou Cursos Livres - Por qual optar? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Ensino Formal ou Cursos Livres - Por qual optar?\n\nT\nPor Tulio Faria • 13 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nQue tipo de ensino e de novos estudos devemos buscar: o ensino formaL (curso técnico, faculdade, pós graduação, etc) ou cursos livres (cursos pela internet ou presenciais sem vínculo com o MEC ou CAPES)?\n\nHoje sou mestre em Sistema de Informações pela USP, ou seja, fui pelo ensino formal também, mas tenho muito conhecimento através de cursos livres. Terminei minha graduação e sempre pesquisei e estudei muito por cursos livres, conhecimento gratuito, livros, etc, mas eu precisava ser desafiado e sair da minha zona de conforto, por isso acabei indo para o Mestrado, podendo também contribuir um pouco com a sociedade por meio do meu projeto.\n\nO grande detalhe que costumo analisar é o custo-benefício. Se o que eu preciso necessariamente vai ser suprido com o curso. Por exemplo, eu quero aprender a fazer deploy de sistemas de forma contínua, mas não existe uma faculdade disso, então preciso fazer um curso livre. Se quero aprender um pouco mais sobre o meio acadêmico e fugir um pouco do que estou acostumado, então vou para o formal.\n\nDepende muito de qual o seu objetivo ou necessidade. Muitas vezes você vai precisar do título (mesmo sabendo que às vezes não quer dizer nada). Se for lecionar para ensino superior, por exemplo, você precisa de no mínimo um mestrado (em instituições públicas, precisa de doutorado), então sua titulação também depende do seu objetivo. Se ele precisa de titulação, busque uma formação que te dê isso, mas se não precisa e onde você for atuar não exige, vá em cursos livres e prove na prática. Tudo que fiz até hoje não precisei de titulação para mostrar apesar de tê-la.\n\nÉ importante ressaltar que geralmente o ensino formal é um pouco mais teórico que o ensino livre, pois um foca no conhecimento geral enquanto o outro em pontos específicos.",
      "description": "Que tipo de ensino e de novos estudos devemos buscar: o ensino formaL (curso técnico, faculdade, pós graduação, etc) ou cursos livres (cursos pela internet...",
      "keywords": [
        "ensino",
        "cursos",
        "formal",
        "livres",
        "para",
        "https",
        "precisa",
        "pouco",
        "carreira",
        "qual"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/ensino-formal-ou-cursos-livres"
      }
    },
    {
      "id": "24be549c9b5786b0",
      "url": "https://devpleno.com/como-encadear-promises",
      "title": "Como encadear promises - DevPleno (Part 1)",
      "content": "Javascript\n\n## Como encadear promises\n\nT\nPor Tulio Faria • 31 de agosto de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nNa dica de hoje, vamos continuar falando sobre promises. Vou mostrar um detalhe na promise que é bastante interessante: como podemos encadear promises, ou seja, vincular uma promise à outra.\n\nPara poder fazer isso funcionar, vamos começar importando nosso tão usado FS, já que ele é sempre uma chave para isso e em seguida vamos criar uma função readFile, que vai ser uma arrow function. Nós passamos para ele um path de um arquivo e ele vai retornar uma promise nova:\n\nconst fs = require('fs')\n\nconst readFile = (file) => {\nreturn new Promise((resolve, reject) => {\nfs.readFile(file, (err, contents) => {\nif (err) {\nreject(err)\n} else {\nresolve(contents.toString())\n}\n})\n})\n}\nConsideramos que quem vai receber o conteúdo da nova promise queira esse conteúdo em string. Vamos fazer também um writeFile, que também irá passar um file, e um contents, que vai retornar uma nova promise:\n\nconst writeFile = (file, contents) => {\nreturn new Promise((resolve, reject) => {\nfs.writeFile((file, contents), (err) => {\nif (err) {\nreject(err)\n} else {\nresolve()\n}\n})\n})\n}\nO nosso problema agora é que precisamos ler um arquivo e passar para o write, então precisamos fazer o seguinte:\n\nreadFile('promises.js').then((contents) => console.log(contents))\nAo mandar rodar o arquivo, perceba que ele retorna o nosso código em string, a vantagem disso é que agora conseguimos ‘encavalar’ uma promise depois da outra. A primeira alternativa que temos é utilizar o then dessa forma, então precisamos colocar o próprio writeFile:\n\nreadFile('promises.js').then((contents) => writeFile('tst.js', contents))\nEssa é a primeira maneira que temos de encadear as promises. Ao rodar o arquivo, perceba que foi criado um tst.js como queríamos. A segunda forma é colocarmos encadeado realmente:",
      "description": "Na dica de hoje, vamos continuar falando sobre promises. Vou mostrar um detalhe na promise que é bastante interessante: como podemos encadear promises, ou ...",
      "keywords": [
        "promises",
        "contents",
        "promise",
        "para",
        "fazer",
        "then",
        "readfile",
        "writefile",
        "como",
        "encadear"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/como-encadear-promises"
      }
    },
    {
      "id": "24ff9d61db5c6427",
      "url": "https://devpleno.com/blog/metas-na-carreira-de-desenvolvedor/index",
      "title": "Metas na carreira de desenvolvedor (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "metas",
        "aprender",
        "muito",
        "meta",
        "pois",
        "vida",
        "minha",
        "como",
        "nossa"
      ],
      "metadata": {
        "title": "Metas na carreira de desenvolvedor",
        "date": "2017-05-22",
        "tags": "['Carreira']",
        "thumbnail": "Metas.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/metas-na-carreira-de-desenvolvedor/index.md"
      }
    },
    {
      "id": "25257a34de5d1b50",
      "url": "https://devpleno.com/blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! (Part 3)",
      "content": "Adquirir disciplina é uma questão de prática. Reflita melhor sobre as coisas que fazem você vibrar e aprenda a realizá-las da melhor forma, a partir do seu jeito. Não existem caminhos certos na vida empreendedora: existem ferramentas que auxiliam. O modo como você vai aplicá-las pode ser único e até então impensado, e essa é a maior graça disso tudo.\n\n**Como é a sua relação com o dinheiro?**\n\nEsse é um dos pontos muito importantes nessa história. Muito do que falamos até agora pode ser uma questão apenas de mudança de comportamento. Porém, como diria o velho ditado \"é pelo bolso que se pega o sujeito\".\n\nVocê seria capaz de injetar seu dinheiro em um projeto**,** sem garantias alguma de que dará certo? E mais: sendo você o maior responsável por fazer tudo acontecer? Um funcionário de uma empresa prefere ter o salário dele garantido ao final do mês, a ter que arriscar perder tudo. Por isso, muitas vezes, os empreendedores são chamados de \"loucos\".\n\nUm ponto importante em se abrir uma empresa é estar preparado para os altos e baixos financeiros, principalmente no início. Se você não se considera apto para isso, também pode buscar ajuda de profissionais ou ir atrás de maior conhecimento sobre gestão de dinheiro e de negócios.\n\n**Como medir o sucesso?**\n\nUm funcionário de uma grande companhia recebe orientações sobre medidas de sucesso e formas de recompensa para os que melhor colaborarem. Por exemplo: prêmios, bonificação salarial, reconhecimentos etc.\n\nQuando se é empresário, essas medidas já são estabelecidas e internalizadas no momento que se escolhe o próprio padrão de excelência. Muitas vezes, a depender do objetivo, não é somente o dinheiro o que importa, mas pode ser fortalecimento da marca, reconhecimento e/ou feedbacks espontâneos.\n\n**Quanto vale o seu trabalho?**",
      "keywords": [
        "para",
        "isso",
        "como",
        "muito",
        "empresa",
        "pode",
        "mais",
        "melhor",
        "https",
        "source"
      ],
      "metadata": {
        "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão!",
        "date": "2017-08-12",
        "tags": "['Carreira']",
        "thumbnail": "TrabalharOuEmpreender.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index.md"
      }
    },
    {
      "id": "2577e5407b841651",
      "url": "https://devpleno.com/microfone-pelo-navegador",
      "title": "Capturando áudio do microfone pelo Navegador - DevPleno (Part 2)",
      "content": "&#x3C;script>\n$(function(){\nlet mediaRecorder\nnavigator\n.mediaDevices\n.getUserMedia({audio: true})\n.then( stream => {\nmediaRecorder = new MediaRecorder(stream)\nmediaRecorder.ondataavailable = data => {\nconsole.log(data)\n}\nmediaRecorder.onstop = () => {\nconsole.log('stop')\n}\nmediaRecorder.start()\nsetTimeOut(() => mediaRecorder.stop(), 3000)\n}, err =>{\nconsole.log(err)\n})\n})\n&#x3C;/script>\nFeito isso, ele vai começar a gravar e três segundos depois ele da um stop e diz que tem dados disponíveis para ser utilizados.\n\nDepois que terminamos de gravar, pode ser que seja interessante fazer alguma coisa com esse áudio, mandar para algum lugar ou coisa nesse sentido. Caso o evento seja muito longo, podemos definir que algumas partes desse áudio vão ser colocados em um vetor e no ondataavailable à medida que formos recebendo os dados do stream vai ser organizado dentro de chunks que são grupos de informação:\n\nmediaRecorder = new MediaRecorder(stream)\nlet chunks = []\nmediaRecorder.ondataavailable = (data) => {\nchunks.push(data.data)\n}\nAgora, no Stop, podemos fazer algo para transformar isso em algum dado que podemos utilizar de alguma forma:\n\nmediaRecorder.onstop = () => {\nconst blob = new Blob(chunks, { type: 'audio/ogg; code=opus' })\nconst reader = new window.fileReader()\nreader.readAsDtaURL(blob)\nreader.onloadend = () => {\nconsole.log(reader.result)\n}\n}\nCom isso, ele junta os dados em binário em um só chamado blob. Além disso, utilizamos um reader para gerar um URL.\n\nAo rodar, perceba que ele converteu para um base 64, que é um texto, ou seja, ele transformou o que era binário em texto.\n\nPor que isso é importante?\n\nPorque geralmente o protocolo HTTP em si não lida bem com binário, principalmente quando precisamos misturar binário com conteúdo em texto. Por esse motivo usamos essa codificação dos dados binários para algo e transferimos isso como texto.\n\nAlém disso, temos uma outra vantagem, podemos, por exemplo, utilizar a url para dar play no body:",
      "description": "Hoje eu quero mostrar como podemos capturar um áudio do microfone pelo navegador. Da onde surgiu essa ideia? Nós construímos um chat em tempo real no Curso...",
      "keywords": [
        "mediarecorder",
        "para",
        "audio",
        "stream",
        "reader",
        "udio",
        "podemos",
        "script",
        "https",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/microfone-pelo-navegador"
      }
    },
    {
      "id": "257cd7cd1b6bb616",
      "url": "https://devpleno.com/blog/ha-e-as/index",
      "title": "HA e AS em Aplicação Web - Web Basic (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-ynU21-FPFY\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "disponibilidade",
        "muito",
        "alta",
        "sistema",
        "grande",
        "auto",
        "embed",
        "escala",
        "duas"
      ],
      "metadata": {
        "title": "HA e AS em Aplicação Web - Web Basic",
        "date": "2017-06-16",
        "tags": "['Fundamentos']",
        "thumbnail": "HaeAs.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/ha-e-as/index.md"
      }
    },
    {
      "id": "258fe70d22142472",
      "url": "https://devpleno.com/blog/clt-ou-pj/index",
      "title": "CLT ou PJ em Software - O que vale mais a pena? (Part 2)",
      "content": "Esse é um cálculo bem por cima, mas recebendo como PJ, você teria um custo menor para a empresa e seu lucro também seria muito maior. Obviamente as pessoas se perguntam sobre os benefícios de ser registrado, mas esquecem que o seguro desemprego, por exemplo, tem um teto salarial, então se você ganha R$10 mil por mês, não vai ganhar isso de seguro desemprego então, nos seus 6 primeiros meses de PJ, você pode e deve, por exemplo, fazer uma reserva de segurança. Agora é a grande vantagem do que eu vejo em pensar como uma pessoa PJ, mesmo você sendo CLT.\n\nComo PJ, você não tem algumas seguranças como o seguro desemprego, a vantagem que eu vejo é que você vai ter mais consciência das coisas, quanto custa um plano de saúde, plano B caso aconteça algo e por fim não vai ser enganado pelo décimo terceiro, porque você acha que está ganhando a mais quando, na verdade, o custo que você tem vai ser maior como CLT.\n\nSe a empresa tiver R$169 mil para pagar um profissional ao invés de R$10 mil, seu salário poderia ser 169000/12 que daria uma quantia de R$ 14.083,33.\nIsso é apenas um apanhado sobre tributações. Existem vários trâmites, se é legal ou não… isso não é o mérito dessa aula, e sim mostrar a diferença efetiva dos dois lados.\n\nNa parte do PJ, pode ser, por exemplo, que precise pagar um contador. Vamos colocar um valor de R$300,00/mês como exemplo, então seria R$3600,00 por ano, mesmo assim a diferença é muito gritante. Falando em valores finais, ainda vale a pena ser PJ. Se você tiver que escolher, pense com calma o que realmente quer, faça os cálculos.\n\n## Confira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/kvu_JVO3BYE\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "para",
        "como",
        "empresa",
        "custo",
        "exemplo",
        "valor",
        "isso",
        "qual",
        "caso",
        "mais"
      ],
      "metadata": {
        "title": "CLT ou PJ em Software - O que vale mais a pena?",
        "date": "2017-08-30",
        "tags": "['Carreira']",
        "thumbnail": "CLT-OU-PJ-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/clt-ou-pj/index.md"
      }
    },
    {
      "id": "25acab78378a1abc",
      "url": "https://devpleno.com/tag/algoritmos",
      "title": "Algoritmos - DevPleno",
      "content": "Algoritmos\n\n## Arquivo de Insights\n\n23 posts encontrados com a tag Algoritmos\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Algoritmos 16 de nov. de 2017 code fights - Metro Card](/code-fights-metro-card)\n\n[Algoritmos 13 de nov. de 2017 Resolvendo Expressão Aritmética do CodeFights](/expressao-aritmetica-codefights)\n\n[Algoritmos 29 de ago. de 2017 Busca Binária](/busca-binaria)\n\n[Algoritmos 4 de ago. de 2017 Algoritmos: XOR Swap](/algoritmos-xoe-swap)\n\n[Algoritmos 25 de jul. de 2017 Lista encadeada - Adicionar com O(1)](/lista-encadeada-adicionar-com-o1)\n\n[Algoritmos 25 de jul. de 2017 Lista encadeada - Como remover um nó](/lista-encadeada-remover-um-no)\n\n[Algoritmos 25 de jul. de 2017 Lista encadeada - Como retornar um item](/lista-encadeada-retornar-um-item)\n\n[Algoritmos 12 de jul. de 2017 Lista encadeada - Adicionar nó](/lista-encadeada-adicionar-no)\n\n[Algoritmos 11 de jul. de 2017 Como saber a complexidade de um algoritmo](/complexidade-de-um-algoritmo)\n\n[Algoritmos 4 de jul. de 2017 Árvore Binária de Busca - Operação de Busca](/operacao-de-busca)\n\n[Algoritmos 3 de jul. de 2017 Árvore Binária em JavaScript](/arvore-binaria)\n\n[Algoritmos 3 de jul. de 2017 Árvore Binária de Busca em JavaScript](/arvore-binaria-de-busca)\n\nAnterior\n1 / 2[Próxima](/tag/algoritmos/2)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "algoritmos",
        "2017",
        "lista",
        "encadeada",
        "busca",
        "javascript",
        "adicionar",
        "binaria",
        "como",
        "rvore"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/algoritmos"
      }
    },
    {
      "id": "25af5e02d286bb03",
      "url": "https://devpleno.com/blog/lista-encadeada-retornar-um-item/index",
      "title": "Lista encadeada - Como retornar um item (Part 2)",
      "content": "Temos que pensar o seguinte, se o length for igual a zero ou o índice que queremos é maior do que o length, então temos que retornar null:\n\n```jsx\nconst getByIndex = (index) => {\n  if (length === 0 || index >= length) {\n    return null\n  }\n  let node = head\n  let count = 0\n  while (count < index && node.next) {\n    node = node.next\n    count++\n  }\n  return node\n}\n```\n\nNovamente essa complexidade é 0(n), porque em meu pior cenário eu não tenho índice ou vou pegar o último. Esse é o algoritmo para pegar o índice, caso a gente queira pegar por valor conseguimos também, com a única diferença que temos que checar se o valor é igual e retornar caso seja:\n\n```jsx\nconst getByValue = (value) => {\n  if (length === 0) {\n    return null\n  }\n  let node = head\n  if (node.value === value) {\n    return node\n  }\n  while (node.net) {\n    node = node.next\n    if (node.value === value) {\n      return node\n    }\n  }\n  return null\n}\n```\n\nLembrando que temos que exportar ele também:\n\n```jsx\ngetByValue (value) => getByValue(value)\n```\n\nNo teste **console.log(list.getByValue(2))** ele funcionará, agora caso pegarmos um valor que não existe, vai ser retornado null. Fizemos duas abordagens, uma voltando por valor e outra pelo índice. Lembrando que o segundo IF que fizemos não altera a complexidade do algoritmo, então ela também será 0(n), então no pior cenário ele vai passar em todos os nós e não encontrar. Esses são os exemplos de como podemos retornar um nó em lista encadeada, uma dica final é: resolva da forma que você conseguir e depois vai discutindo como chegar com o melhor desempenho possível, mas sempre resolva primeiro.\n\nConfira todos os passos em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/yUz6MlTPAfU\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "node",
        "index",
        "return",
        "length",
        "value",
        "null",
        "ndice",
        "vamos",
        "para",
        "lista"
      ],
      "metadata": {
        "title": "Lista encadeada - Como retornar um item",
        "date": "2017-07-25",
        "tags": "['Algoritmos']",
        "thumbnail": "ListaEncadeada.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/lista-encadeada-retornar-um-item/index.md"
      }
    },
    {
      "id": "25fb3506f8796889",
      "url": "https://devpleno.com/operacao-de-busca",
      "title": "Árvore Binária de Busca - Operação de Busca - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Árvore Binária de Busca - Operação de Busca\n\nT\nPor Tulio Faria • 4 de julho de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nAgora que você já entendeu sobre [Árvore Binária](https://www.devpleno.com/arvore-binaria/) e [Árvore Binária de Busca](https://www.devpleno.com/arvore-binaria-de-busca/), vamos falar sobre a operação de busca.\n\nEstou utilizando o exemplo do exercício anterior de árvores binárias. Nós sabemos que a árvore binária tem uma regra de inserção, então podemos esperar algumas coisas dela, por exemplo:\n\ninsert(arvore, 10)\n//console.log(arvore)\ninsert(arvore, 11)\n//console.log(arvore)\ninsert(arvore, 9)\n//console.log(arvore)\n//insert(arvore, 8)\nconsole.log(arvore)\nfunction seach(tree, value){\nif(!tree.value || tree.value === value){\nreturn tree.value\n}\nif(tree.value &#x3C; value){\nreturn search(tree.left, value)\n}\nreturn serach (tree.right, value)\n\n}\nconsole.log(search(arvore, 10)\nCriamos um search onde passamos uma árvore para ela e quero buscar um valor. Sabemos que se o valor dessa árvore não existir, temos que retornar undefined ou se a árvore for igual ao valor que estou buscando, vou retornar o valor. Caso contrário, se o valor que estou buscando for menor que o nó atual, ele deve estar do lado esquerdo, então vamos buscar o valor apenas no lado esquerdo e por último, se for maior, procuramos do lado direito.\n\nPerceba que encontrou o 10, pois ele tinha na árvore. Se procurarmos um valor que não está na árvore, será retornado o undefined.",
      "description": "Agora que você já entendeu sobre Árvore Binária e Árvore Binária de Busca, vamos falar sobre a operação de busca. Estou utilizando o exemplo do exercício a...",
      "keywords": [
        "arvore",
        "rvore",
        "busca",
        "value",
        "https",
        "tree",
        "valor",
        "console",
        "devpleno",
        "insert"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/operacao-de-busca"
      }
    },
    {
      "id": "26062345c08c719a",
      "url": "https://devpleno.com/fsmrelampago-fbads",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-fbads to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fsmrelampago",
        "fbads"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsmrelampago-fbads"
      }
    },
    {
      "id": "260fff9b3b67732b",
      "url": "https://devpleno.com/dados-ficticios-para-testes",
      "title": "Faker - Como gerar grandes massas de dados fictícios para testes - DevPleno (Part 2)",
      "content": "Depois de utilizar o Faker, você perceberá que vai ajudar muito na hora de criar novos dados para testes de forma rápida. Confira o hands-on em vídeo.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Faker%20-%20Como%20gerar%20grandes%20massas%20de%20dados%20fict%C3%ADcios%20para%20testes&url=https%3A%2F%2Fdevpleno.com%2Fdados-ficticios-para-testes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdados-ficticios-para-testes)",
      "description": "O Faker é um módulo do Node que usamos para gerar dados fictícios para testes, como para popular um banco de dados, por exemplo. Isso é muito útil quando q...",
      "keywords": [
        "faker",
        "dados",
        "para",
        "gerar",
        "https",
        "como",
        "testes",
        "nome",
        "exemplo",
        "console"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/dados-ficticios-para-testes"
      }
    },
    {
      "id": "26181d01c26d97fa",
      "url": "https://devpleno.com/blog/empreender-na-area-de-software/index",
      "title": "3 dicas para começar a empreender na área de software (Part 2)",
      "content": "Vender é algo necessário para qualquer empresa e negociação é a base que você tem para alinhar as expectativas. Você tem que estar cobrando um valor justo e seu cliente deve sair com a sensação que você está pagando um valor justo.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/A5RgxkpJIrA\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.",
      "keywords": [
        "para",
        "vender",
        "dica",
        "come",
        "duas",
        "embed",
        "ando",
        "primeira",
        "muito",
        "mostrar"
      ],
      "metadata": {
        "title": "3 dicas para começar a empreender na área de software",
        "date": "2017-08-16",
        "tags": "['Carreira']",
        "thumbnail": "COMEÇAR-A-EMPREENDER-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/empreender-na-area-de-software/index.md"
      }
    },
    {
      "id": "261fa4c8340f0ee4",
      "url": "https://devpleno.com/blog/dica-debug-nodejs-com-chrome-devtools/index",
      "title": "Dica: Debug NodeJS com Chrome DevTools (Part 2)",
      "content": "Percebam que eu não tenho nada de assíncrono no meu algoritmo, mas mesmo assim ele deu uma URL para depurar:\n\n![Visualizando a url](adef2276-d1ab-49b9-b0b9-b47206147e10.png)\n\nEntão vamos colocar essa URL no Chrome e ele já para na primeira linha do meu código executável. Vamos colocar um break point e dar um resume para ver o que acontece: Como é uma função executável ele mostra para mim algo muito semelhante ao teste de mesa que é executar passo a passo o algoritmo.\n\n![Mostrando o uso](6e6bf58c-e02f-4b14-901e-18d430290ffc.png)\n\nE eu posso também ir passando linha a linha apenas clicando no botão usado anteriormente e ele vai mostrar como está o valor que foi alterado.\n\n![Mostrando o uso](87d4a952-c3fd-4122-871b-588a19e64db3.png)\n\nCom isso nós conseguimos saber exatamente oque está acontecendo no nosso algoritmo, fazer a depuração do script de uma forma mais precisa, ainda mais quando é uma função pura porque conseguimos injetar os valores e ir testando passo a passo.\n\n# Confira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/mNTPo_9FEKU\" allowfullscreen></iframe>\n</div>\n\nNão esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder nenhuma atualização.",
      "keywords": [
        "para",
        "digo",
        "como",
        "script",
        "linha",
        "isso",
        "devtools",
        "posso",
        "quando",
        "vamos"
      ],
      "metadata": {
        "title": "Dica: Debug NodeJS com Chrome DevTools",
        "date": "2017-09-11",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Debug.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/dica-debug-nodejs-com-chrome-devtools/index.md"
      }
    },
    {
      "id": "265b0ee68504df7b",
      "url": "https://devpleno.com/tag/javascript/7",
      "title": "Javascript - Pagina 7 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 7 de jul. de 2017 Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol](/minicurso-socket-io-parte-3)\n\n[Javascript 6 de jul. de 2017 Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO](/minicurso-socket-io-parte-2)\n\n[Javascript 5 de jul. de 2017 Minicurso Socket.IO - Parte 01 - Começando o projeto](/minicurso-socket-io-parte-1)\n\n[Javascript 5 de jul. de 2017 NPM e Módulos de Terceiros - NodeJS](/npm-e-modulos-de-terceiros)\n\n[Javascript 3 de jul. de 2017 Evite o this em JavaScript](/evite-o-this-em-js)\n\n[Javascript 30 de jun. de 2017 High-order Function - Reduce](/reduce)\n\n[Javascript 29 de jun. de 2017 Generators Functions - o que acontece por baixo dos panos](/generators-functions)\n\n[Javascript 28 de jun. de 2017 ReactJS Recursivo?](/renderizar-estruturas-em-formato-de-arvore)\n\n[Javascript 28 de jun. de 2017 Sleep em Generator](/sleep-em-generator)\n\n[Javascript 27 de jun. de 2017 High-order Function MAP](/map)\n\n[Javascript 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)\n\n[Javascript 26 de jun. de 2017 Como servir arquivos e expor servidor local com HTTPS](/servir-arquivos-e-expor-servidor)\n\n[Anterior](/tag/javascript/6)7 / 16[Próxima](/tag/javascript/8)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "socket",
        "minicurso",
        "parte",
        "nodejs",
        "reactjs",
        "algoritmos",
        "carreira",
        "ferramentas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/7"
      }
    },
    {
      "id": "26ddc34ec1cdcc47",
      "url": "https://devpleno.com/blog/eu-ja-sei-carreira/index",
      "title": "Eu já sei! Evite uma mentalidade que não te deixa evoluir",
      "content": "Evite uma mentalidade que não te deixa evoluir e aprender sempre.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/eNVCYzdiirk\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "youtube",
        "classname",
        "iframe",
        "devpleno",
        "facebook",
        "evite",
        "mentalidade"
      ],
      "metadata": {
        "title": "Eu já sei! Evite uma mentalidade que não te deixa evoluir",
        "date": "2016-07-30",
        "tags": "['Carreira']",
        "thumbnail": "Miniatura-vídeo-EU-JÁ-SEI-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/eu-ja-sei-carreira/index.md"
      }
    },
    {
      "id": "26ee42bf1a7d8400",
      "url": "https://devpleno.com/blog/funcionalidades-do-console/index",
      "title": "4 funcionalidades do Console no DevTools que você não conhece (Part 1)",
      "content": "O console no DevTools do Chrome apresenta algumas funcionalidades que muitos utilizam raramente ou até mesmo nem sabem que existem.\n\nPara fazer este teste, vamos criar um HTML simples com um script começando com o console.log normal.\n\n```jsx\n<html>\n  <body>\n    <script>console.log('este é um log')</script>\n  </body>\n</html>\n```\n\nNele temos apenas uma saída e nada além disso. Agora vamos falar sobre alguns que quase não utilizamos. **#1 error**\n\n```jsx\nconsole.error('um erro')\n```\n\nCaso tenha algum erro no console, você pode marcá-lo de vermelho, assim, ele te mostra onde ocorreu esse erro. Quando estiver debugando o código e quiser achar algo, pode usar o console.error e ele irá pegar o stack trace também.\n\n**#2 time** Com ele você pode checar quanto tempo foi gasto para executar uma dada função.\n\n```jsx\nconsole.time('nomeCounter')\nconsole.log('este é um log')\nconsole.log('este é um log')\nconsole.timeEnd('nomeCounter')\n```\n\nEm muitos testes que fazemos, o console.log consome recurso da máquina pois ele tem que lidar com o IO. **#3 count**\n\n```jsx\nconsole.count(contador)\n```\n\nEle conta quantas vezes uma string foi chamada ou quantas você passou em um trecho específico de código, o que é muito bom para fazer algum check.\n\n**#4 table** Nele você pode colocar uma lista de nomes e ele monta uma tabela no auto do console. Isso facilita bastante na hora de depurar o código, pois pode mostrar os dados em forma de tabela se quiser.\n\n```jsx\nconsole.table([\n{nome: 'Tulio'};\n{nome: 'Faria'};\n])\n```\n\nTodos eles, se bem utilizados, podem ajudar muito na melhora de desempenho do código ou simplesmente ajudar a depurar mais facilmente.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/v4GFy72sIR8\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "console",
        "pode",
        "para",
        "este",
        "digo",
        "embed",
        "html",
        "script",
        "error",
        "erro"
      ],
      "metadata": {
        "title": "4 funcionalidades do Console no DevTools que você não conhece",
        "date": "2017-05-25",
        "tags": "['Javascript']",
        "thumbnail": "CONSOLE-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/funcionalidades-do-console/index.md"
      }
    },
    {
      "id": "26fcbd02ddf5a618",
      "url": "https://devpleno.com/handsonreactjs",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /handsonreactjs to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "handsonreactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/handsonreactjs"
      }
    },
    {
      "id": "275e237fa6f6e6c2",
      "url": "https://devpleno.com/decisoes-baseadas-apenas-na-questao-financeira",
      "title": "Decisões baseadas apenas na questão financeira - DevPleno (Part 1)",
      "content": "Carreira\n\n## Decisões baseadas apenas na questão financeira\n\nT\nPor Tulio Faria • 25 de outubro de 2017\n\n[Carreira](/tag/carreira)\n\nPare de tomar todas as decisões da sua carreira única e exclusivamente baseadas na parte financeira! Isso mudou a forma como eu atuo no mercado hoje.\n\nQuando você coloca isso na sua cabeça, você começa a fazer naturalmente. Eu fazia isso desde meu primeiro emprego, onde ganhava R$100,00 por mês, era muito pouco pelo montante que eu fazia, porém foi a maior escola que eu tive. Se eu tivesse tomado a decisão de ir pelo dinheiro, eu não teria feito uma grande escolha para minha vida, afinal foi de lá eu tirei toda a minha base de Web.\n\nÉ muito comum olharmos apenas para o valor que vamos receber, mas quando quando você para de olhar para o dinheiro, ele acaba aparecendo. O financeiro não vai te trazer a felicidade na profissão, isso é o ponto mais importante para nós como desenvolvedores e profissionais.\n\nAtualmente muitos amigos meus que fizeram escolhas parecidas também tiveram muito sucesso. Um deles deixou de ir trabalhar em uma empresa que pagaria muito dinheiro para trabalhar em uma outra que lhe daria apenas experiência, e essa experiência foi o que permitiu que ele morasse um tempo na alemanha.\n\nPense mais estrategicamente em sua carreira. Quais os pontos que te motivam? Qual tecnologia vai trazer mais felicidade?\n\nPor exemplo, hoje eu poderia programar em JAVA, mas eu não programo porque não é uma linguagem que eu gosto.\n\nSe você não focar em dinheiro e sim na sua formação e na sua satisfação profissional, mais oportunidades vão aparecer para você.\n\nApesar de ser importante, o dinheiro não é tudo. Pense melhor sobre isso.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Pare de tomar todas as decisões da sua carreira única e exclusivamente baseadas na parte financeira! Isso mudou a forma como eu atuo no mercado hoje. Quand...",
      "keywords": [
        "para",
        "https",
        "carreira",
        "apenas",
        "isso",
        "dinheiro",
        "decis",
        "baseadas",
        "financeira",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/decisoes-baseadas-apenas-na-questao-financeira"
      }
    },
    {
      "id": "2792d459e248d4fc",
      "url": "https://devpleno.com/blog/streams-parte-1/index",
      "title": "Hands-on: Streams - Parte 1 (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "readable",
        "dados",
        "arquivo",
        "stream",
        "data",
        "para",
        "vamos",
        "const",
        "exemplo",
        "isso"
      ],
      "metadata": {
        "title": "Hands-on: Streams - Parte 1",
        "date": "2017-05-08",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/streams-parte-1/index.md"
      }
    },
    {
      "id": "28253b5dc116adc1",
      "url": "https://devpleno.com/validade",
      "title": "Validade de um projeto/ideia/ação - DevPleno (Part 2)",
      "content": "Muitas pessoas dizem “mas você não quer ganhar dinheiro?, mas esquecem que tem várias contas que você tem que fazer e pensar por fora além disso. Um exemplo interessante: eu já recebi várias propostas de trabalho no exterior, muitas vezes é para receber um salário inferior ao que eu consigo gerar de resultado aqui no Brasil, então temos que ver o custo dessa oportunidade, que é a validade. Quando eu tiver uma estabilidade financeira, posso arriscar mais e ter essa nova experiência. Isso é muito importante, pois quando você chegar nesse ponto não vai ser a dor que vai fazer você tomar a decisão e sim a validade que você colocou quando estava confortável para decidir aquilo.\n\nQuando você está fazendo sua empresa dar certo, por exemplo, se você definir a validade no momento em que você está passando aperto, não é a validade que está fazendo você tomar a decisão e sim a dor, por isso é importante fazer a validade antes que você passe por aquela situação.\n\nEntão toda vez que você for começar um projeto novo, uma empreitada nova, atender um cliente novo, qualquer coisa que dependa da sua energia, defina uma validade.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Validade%20de%20um%20projeto%2Fideia%2Fa%C3%A7%C3%A3o&url=https%3A%2F%2Fdevpleno.com%2Fvalidade) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fvalidade)",
      "description": "Na dica de hoje, eu quero mostrar pra você que nem sempre a gente tem que ir até o fim com as coisas, é algo que eu estou passando nesse momento e sempre r...",
      "keywords": [
        "validade",
        "para",
        "quando",
        "projeto",
        "cliente",
        "https",
        "isso",
        "muito",
        "esse",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/validade"
      }
    },
    {
      "id": "2839976e242fb3fd",
      "url": "https://devpleno.com/aplicacao-web",
      "title": "Aplicação Web - Entendendo Back-end e Front-end - DevPleno (Part 1)",
      "content": "Fundamentos\n\n## Aplicação Web - Entendendo Back-end e Front-end\n\nT\nPor Tulio Faria • 12 de maio de 2017\n\n[Fundamentos](/tag/fundamentos)\n\nUma Aplicação Web sempre é composta por dois “blocos”: o front-end e o back-end. Podemos classificar nossas tecnologias, arquiteturas, etc baseado nessas duas separações. É comum ouvir dizer também que o beck-end é Server Side, e o front-end Client Side.\n\n**O que é back-end?**\n\nSão todas as tecnologias que rodam em um “Servidor”, uma ou mais maquinas.\n\n**E o front-end?**\n\nEle é tudo que roda do lado cliente, ou seja, o que o usuário final vê.\n\nPara a parte do cliente, geralmente temos o Navegador (browser), ele faz o Request para o servidor ou tecnologia back-end. (_Apenas esclarecendo, o request é o front-end pedindo alguma coisa ao back-end, por exemplo, uma página, uma imagem, por aí vai).\n\nA primeira comunicação sempre é feita do Front-end para o Beck-end. Por exemplo, ao entrar no site [[www.devpleno.com](http://www.devpleno.com)]\n([https://www.devpleno.com](https://www.devpleno.com)) seu navegador faz uma requisição à máquina que está o servidor devpleno, com isso o server irá mandar uma resposta (response) para o navegador, que é nosso front-end. Essa comunicação é chamada de request-response, pois tudo é baseado nisso, entre a requisição do front, resposta do server.\n\n**Quais tecnologias temos para cada tipo?**\n\nAlgumas tecnologias front-end são: HTML, Javascript, CSS. Temos tembem alguns assets como imagem e PDF, eles são alguns arquivos que precisamos para funcionar o front-end. Antigamente existia o Flash e o Java Applet, mas hoje em dia estão em desuso por causa do HTML5.\n\nJa do lado Server side temos N tecnologias, tais como: PHP, ASP, JAVA, NodeJS, C#, Python, C++, etc. Além disso, podemos também ter banco de dados.",
      "description": "Uma Aplicação Web sempre é composta por dois &#34;blocos&#34;: o frontend e o backend. Podemos classificar nossas tecnologias, arquiteturas, etc baseado nessas dua...",
      "keywords": [
        "front",
        "para",
        "https",
        "devpleno",
        "back",
        "tecnologias",
        "server",
        "side",
        "lado",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/aplicacao-web"
      }
    },
    {
      "id": "285998fc5e0b2c0c",
      "url": "https://devpleno.com/blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index",
      "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador (Part 4)",
      "content": "- **Está começando?** Comece pelo 99Freelas ou Workana para construir reputação sem a barreira do idioma.\n- **Tem inglês intermediário?** Crie perfil no Upwork e no Freelancer.com para acessar o mercado internacional.\n- **Tem experiência sólida?** Invista no processo seletivo da Toptal ou Scalable Path — os projetos e a remuneração compensam.\n- **Quer diversificar?** Mantenha perfis em 2-3 plataformas e veja onde consegue mais tração.\n\nO mais importante é começar. Não espere estar \"pronto\" — muitos freelancers de sucesso começaram com projetos simples e foram evoluindo conforme ganhavam experiência e avaliações positivas.\n\nAproveite para [saber mais sobre trabalho remoto](https://www.youtube.com/watch?v=37Jxj1DhSjg) e o que é necessário para trabalhar para empresas nacionais e internacionais!",
      "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
      "keywords": [
        "para",
        "projetos",
        "mais",
        "https",
        "plataforma",
        "come",
        "freelancer",
        "ideal",
        "como",
        "experi"
      ],
      "metadata": {
        "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador",
        "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
        "date": "2026-04-04",
        "tags": "['Carreira']",
        "thumbnail": "Freelancers.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index.md"
      }
    },
    {
      "id": "2880c25671e1b166",
      "url": "https://devpleno.com/pilha",
      "title": "Estruturas de Dados - Pilhas - DevPleno (Part 2)",
      "content": "} else {\nconst itemToReturn = data[top]\ndata.splice(top, 1)\ntop--\nreturn itemToReturn\n}\nO splice já faz essa fatia, cortando nosso array no item top.\n\nAcabamos de implementar uma pilha. É muito interessante conhecer o que é pilha, faz mais sentido quando recebemos os erro stack overflow, acontece que as estruturas de dados vão se empilhando tanto que não aguenta mais o tamanho, por esse motivo é um erro bem comum.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Estruturas%20de%20Dados%20-%20Pilhas&url=https%3A%2F%2Fdevpleno.com%2Fpilha) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpilha)",
      "description": "Hoje vamos falar um pouco sobre uma estrutura de dados que é muito comum em computação, principalmente em sua base, a Pilha. O primeiro conceito que temos ...",
      "keywords": [
        "const",
        "data",
        "vetor",
        "push",
        "stack",
        "console",
        "return",
        "https",
        "pilha",
        "item"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/pilha"
      }
    },
    {
      "id": "2895d8f22091ff44",
      "url": "https://devpleno.com/minicurso-socket-io-parte-4",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms - DevPleno (Part 4)",
      "content": "io.on('connect', function (socket) {\nif (socket.handshake.query.match) {\nconsole.log('user connnected on match', socket.handshake.query.match)\nsocket.join('match-' + socket.handshake.query.match)\n} else {\nconsole.log('a new client connected')\n}\n})\nAgora nosso usuário está na sala especifica do jogo e também na geral. Caso queira que ele receba só a notificação da sala, eu consigo e também consigo que ele receba a atualização de geral como a atualização de placar, por exemplo. Lembrando que não difere em nada para o cliente, afinal ele já vai receber a informação já filtrada.\n\nContinuando em routes/index.js, na hora de atualizar nossos supporters vamos pegar a nossa porcentagem e mandar via Socket.IO:\n\nrouter.post('/match/:id/supporters', function(req, res, next){\nconst match = db.get('matches['+req.params.id+']').value()\nif(req.body.team==='a'){\nconst newValue = match['team-a'].supporters+1\ndb.set('matches['+req.params.id+'].team-a.supporters', newValue).write()\n}\nif(req.body.team==='b'){\nconst newValue = match['team-b'].supporters+1\ndb.set('matches['+req.params.id+'].team-b.supporters', newValue).write()\n}\nconst supportersA = match.['team-a'].supporters\nconst supportersB = match.['team-b'].supporters\nconst total = supportersA+supportersB\nconst porcentagem = {\nteamA: 50,\nteamB: 50\n}\nif(total > 0){\nporcentagem.teamA = ((supportersA / total) * 100).toFixed(0)\nporcentagem.teamB = ((supportersB/ total) * 100).toFixed(0)\n}\nio.to('match-'+req.paramns.id).emit('supporters'), porcentagem)\nres.send({ ok: true })\n})\nComo vamos emitir uma atualização ‘supporters’, temos que ir no js/match.js e falar para o Socket que ele precisa esperar um evento chama supporters:\n\nsocke.on('supporters', function (supporters) {\nconsole.log(supporters)\n})\nCom isso sempre que clicar em “na torcida” ele já irá mostrar o novo valor de supporters, agora eu preciso aplicar isso nas barras, quando chegar esse evento em supporters eu preciso atualizar:",
      "description": "Nesta etapa do nosso minicurso de Socket.IO, vamos fazer as atualizações específicas de cada jogo. Primeiro vamos fazer o gráfico da torcida se movimentar....",
      "keywords": [
        "match",
        "supporters",
        "team",
        "para",
        "porcentagem",
        "const",
        "socket",
        "vamos",
        "torcida",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-4"
      }
    },
    {
      "id": "28b53e4e3bb02de2",
      "url": "https://devpleno.com/blog/dica-injecao-de-dependencia-com-destructuring-assignament/index",
      "title": "Dica: Injeção de dependência com Destructuring Assignament",
      "content": "Uma maneira de injetar dependências, que permite uma organização ainda maior do código, é utilizando o Destructuring Assignament. Neste vídeo mostro como utilizar as 2 técnicas.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/T6-QKo3ACBQ\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "maneira",
        "injetar"
      ],
      "metadata": {
        "title": "Dica: Injeção de dependência com Destructuring Assignament",
        "date": "2017-03-07",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "DI-DA-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-injecao-de-dependencia-com-destructuring-assignament/index.md"
      }
    },
    {
      "id": "28ca719e61d5a698",
      "url": "https://devpleno.com/reduce",
      "title": "High-order Function - Reduce - DevPleno (Part 2)",
      "content": "const subtotal = (item) => item.preço * item.qtd\nconst total = carrinho\n.map(subtotal)\n.reduce((soma, subtotal) => subtotal + soma, 0)\nconsole.log(total)\nEssa é uma forma bem fácil de se fazer em teste unitários, utilizando bastante funções puras no Map, Reduce, etc. Isso ajuda muito a aumentar a testabilidade do código e consequentemente a qualidade dele.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=High-order%20Function%20-%20Reduce&url=https%3A%2F%2Fdevpleno.com%2Freduce) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freduce)",
      "description": "Hoje vamos continuar falando sobre high order functions, principalmente as que estão disponíveis nos vetores em JavaScript. Vamos falar mais especificament...",
      "keywords": [
        "reduce",
        "item",
        "carrinho",
        "soma",
        "subtotal",
        "https",
        "const",
        "total",
        "fazer",
        "preco"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/reduce"
      }
    },
    {
      "id": "28eb4996adbc7033",
      "url": "https://devpleno.com/handsonreact",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /handsonreact to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "handsonreact"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/handsonreact"
      }
    },
    {
      "id": "291069621246a2c8",
      "url": "https://devpleno.com/lista-encadeada-adicionar-com-o1",
      "title": "Lista encadeada - Adicionar com O(1) - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Lista encadeada - Adicionar com O(1)\n\nT\nPor Tulio Faria • 25 de julho de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nHoje vamos continuar falando mais um pouco sobre [algoritmos](https://www.devpleno.com/tag/algoritmos/) que principalmente caem ou em listas de emprego ou competições de programação, mas vai ser um pouco diferente. Estamos falando sobre listas encadeadas e já fizemos uma forma de [adicionar um nó em que a complexidade é 0(n)](https://www.devpleno.com/lista-encadeada-adicionar-no/), pois precisamos navegar até o final da lista toda vez que vamos adicionar um item novo. Porém uma das pessoas que acompanham a gente no YouTube comentou que podemos fazer com o O(1), ou seja, um valor constante, desde que a gente armazene além da cabeça da lista, o rabo, então eu decidi fazer dessa forma também para ficar bem claro as duas formas. A primeira coisa que temos que fazer no algoritmo é, além de utilizar o head, utilizar também o tail:\n\nlet head = null\nlet tail = null\nAgora vamos fazer um add e, caso estivermos adicionando pela primeira vez, vamos seguir a mesma regra utilizada anteriormente:\n\nconst add2 = (value) => {\nif (!head) {\nhead = Node(value)\ntail = head\nlength++\nreturn head\n}\n}\nPerceba que tail é igual a head, afinal se não tivermos nenhum nó, ao adicionar, o início e o fim serão o mesmo.\n\nAgora, caso o Head não for nulo, temos que fazer o Tail que será o nosso último. Para isso vamos criar um nó e pegar o tail.next e apontar para o novo nó:\n\nconst add2 = (value) => {\nif (!head) {\nhead = Node(value)\ntail = head\nlength++\nreturn head\n}\nlet node = Node(value)\ntail.next = node\ntail = node\nreturn node\n}\nQuando a lista não está vazia criamos um novo nó, vamos nesse último nó e colocamos no ultimo, logo nosso tail será o novo nó. Para checar se isso funciona no return, temos que adicionar:\n\nadd2: (value) => add2(value)\nVamos fazer um teste:",
      "description": "Hoje vamos continuar falando mais um pouco sobre algoritmos que principalmente caem ou em listas de emprego ou competições de programação, mas vai ser um p...",
      "keywords": [
        "head",
        "tail",
        "adicionar",
        "lista",
        "vamos",
        "https",
        "para",
        "add2",
        "value",
        "node"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/lista-encadeada-adicionar-com-o1"
      }
    },
    {
      "id": "291e67f2372d92cc",
      "url": "https://devpleno.com/minicurso-socket-io-parte-2",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO - DevPleno (Part 4)",
      "content": "const { db, io } = dependencies\nIsso é um destructor assignment, ele cria variáveis novas a partir de propriedades das dependências. Ainda dentro da função, abaixo do const que acabamos de criar, vamos fazer o seguinte:\n\nio.on('connect', function (socket) {\nconsole.log('a new client conected')\n})\nUma coisa interessante do Socket.IO é que ele já tenta a conexão automaticamente.\n\nO último objetivo desta etapa é criar uma rota administrativa para que a gente consiga gerenciar esses jogos. Primeiramente vou copiar o index.js do routes e colar no mesmo diretório, em seguida vamos renomear a cópia para admin.js e no admin vou tirar esse conect que acabamos de criar. Em seguida, vamos trocar o nome da função de indexRouter para adminRouter, lembrando que ao final do código temos que exportar adminRouter também.\n\nEm app.js vamos vamos importar o admin nele:\n\nvar admin = require('./routes/admin')({ io: app.io, bd })\nem seguida vamos linkar ele na aplicação:\n\napp.use('/admin', admin)\nLembrando que estou apenas colocando abaixo do original, que é index. Esse use no express fala que a partir de ’/’ você vai rotear para index, e quando eu falo ‘/admin’ ele vai prefixa isso, então terei /admin/ e /admin/match com o ide do jogo.\n\nApenas por curiosidade, o app.use é conhecido como middleware. Esse middleware só vai checar as rotas se são administrativas ou não se ela começar com /admin. Nós não temos o administrativo ainda, ele é um clone do administrador, vamos fazer algumas alterações. Dentro do diretório views, vamos criar uma pasta nova chamada admin. Se voltar aos arquivos de apoio, você pode perceber que dentro da pasta view tem uma pasta admin com dois layouts, copie esses dois e cole na pasta do projeto que acabamos de criar.\n\nDentro desses dois itens, vamos olhar primeiro o index, ele é igual o index anterior com a diferença que estamos importando um header diferente. Já dentro do admin, quando formos dar um render, temos que colocar admin/:",
      "description": "Na primeira aula do minicurso de Sockt.IO, fizemos a listagem dos jogos puxando do banco de dados baseado em json e quando clicamos conseguimos visualizar ...",
      "keywords": [
        "vamos",
        "socket",
        "admin",
        "index",
        "para",
        "const",
        "dentro",
        "temos",
        "criar",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-2"
      }
    },
    {
      "id": "2930752eb6c7eb80",
      "url": "https://devpleno.com/blog/shelljs/index",
      "title": "ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/7ICR9KhNTGo\" allowfullscreen></iframe>\n</div>\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "shelljs",
        "shell",
        "exemplo",
        "isso",
        "arquivo",
        "fazer",
        "embed",
        "mais",
        "linux"
      ],
      "metadata": {
        "title": "ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux",
        "date": "2017-08-06",
        "tags": "['Javascript']",
        "thumbnail": "ShellJS.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/shelljs/index.md"
      }
    },
    {
      "id": "29328109b803b031",
      "url": "https://devpleno.com/fs-watch",
      "title": "FS-Watch - Checando mudanças em um arquivo-diretório - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=FS-Watch%20-%20Checando%20mudan%C3%A7as%20em%20um%20arquivo-diret%C3%B3rio&url=https%3A%2F%2Fdevpleno.com%2Ffs-watch) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffs-watch)",
      "description": "Hoje eu quero mostrar duas funcionalidades que nós temos no FS padrão no Node e que podem ajudar bastante em alguns tipos de situações, como por exemplo ch...",
      "keywords": [
        "arquivo",
        "watch",
        "temos",
        "https",
        "diret",
        "file",
        "checar",
        "fazer",
        "watchfile",
        "curr"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/fs-watch"
      }
    },
    {
      "id": "29697ebb7eef8945",
      "url": "https://devpleno.com/ser-devpleno",
      "title": "Redirecting to: /sobre",
      "content": "Redirecting to: /sobre [Redirecting from /ser-devpleno to /sobre](/sobre)",
      "keywords": [
        "sobre",
        "redirecting",
        "from",
        "devpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/ser-devpleno"
      }
    },
    {
      "id": "2996309e4394e208",
      "url": "https://devpleno.com/metronomo-com-javascript",
      "title": "Metrônomo com JavaScript - DevPleno (Part 2)",
      "content": "&#x3C;script>\nconst bpm = document.getElementById('bpm')\nconst h1 = document.querySelector('h1')\nconst play = document.getElementByld('play')\nconst.audio = document.querySelector('audio')\nlet currentBpm = 40\nfunction tick(){\naudio.currentTime= 0\naudio.play()\n}\nbpm.addEventListener('change', function(){\nh1.innerHTML = this.value + ' bpm'\ncurrentBpm = parseInt(this.value)\n})\nplay.addEventListener('click', function(){\nconst timer = setInterval(tick, 100)\n})\n&#x3C;/script>\nAgora vamos pensar um pouco: Se precisamos ter 40 batimentos por minuto e o minuto tem 60 segundos, 60 segundos tem 60 mil milissegundos, temos que distribuir 40 batidas dentro de 60 mil, então vamos dividir isso no valor do Bpm, ficando assim:\n\nplay.addEventListener('click', function () {\nconst timer = setInterval(tick, (60 * 1000) / currentBpm)\n})\nPrecisamos agora de uma forma para desligar essa batida, para isso vamos usar declarar o let isPlaying, o timer, e um if para, caso ele estiver tocando, darmos um clearInterval nesse timer.\n\n&#x3C;script>\nconst bpm = document.getElementById('bpm')\nconst h1 = document.querySelector('h1')\nconst play = document.getElementByld('play')\nconst.audio = document.querySelector('audio')\nlet currentBpm = 40\nlet isPlaying = false\nlet timer = null\nfunction tick(){\naudio.currentTime= 0\naudio.play()\n}\nbpm.addEventListener('change', function(){\nh1.innerHTML = this.value + ' bpm'\ncurrentBpm = parseInt(this.value)\n})\nplay.addEventListener('click', function(){\nif(isPlaying){\nclearInterval(timer)\n} else {\nconst timer = setInterval(tick, (60*1000)/currentBpm)\n}\nisPlaying = !isPlaying\n})\n&#x3C;/script>\nUma vez que estartamos o timer, ele começa a tocar. Ao clicar novamente, ele para, pois carrega na página com valor null. Ao clicarmos, damos um valor para ele e clicando de novo ele cai no isPlaying = !isPlaying que faz ele voltar a Null. Chamamos isso de toggle.",
      "description": "O metrônomo um dispositivo que deixa uma batida constante e ajuda os músicos a manterem um ritmo quando estão treinando. Esse ritmo pode aumentar ou diminu...",
      "keywords": [
        "play",
        "tick",
        "para",
        "const",
        "timer",
        "vamos",
        "isplaying",
        "valor",
        "audio",
        "currentbpm"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/metronomo-com-javascript"
      }
    },
    {
      "id": "29e1522db1def4ab",
      "url": "https://devpleno.com/blog/vantagens-da-injecao-de-depencia/index",
      "title": "Vantagens da Injeção de dependência para a testabilidade do código (Part 2)",
      "content": "Perceba que criei um Mock para o alert. **O que é um Mock?** Uma função que está no nosso controle e que usamos apenas para retornar um valor. Assim é possível testar o nosso código. Temos, então, que garantir que o alert faça o que ele deveria fazer, que é passar a mensagem. Note que se passarmos o alertMock.mock.calls, sabemos exatamente que o alert foi chamado. Se quisermos deixar o código mais organizado, sem aquele aspecto de gambiarra, podemos fazer o seguinte:\n\n```jsx\nconst alertUser = require('./alert-user')\ntest('it calls alert', () => {\n    const alertMock = jest.fn()\n    const msg = 'message'\n    alertUser.alert(alertMock, msg)\n    expect(alertMock.mock.calls [0][0]).toBe('msg')\n}\n```\n\nAgora vamos supor que nosso código tem algum erro, então ele não chama o alert, apenas retorna\n\n```jsx\nconst alerts = {\n  alerts: (alert, message) => 1\n}\nmodule.exports = alerts\n```\n\nPerceba que ele daria um erro, pois o mock não foi chamado. Quando 'mockamos' temos um controle ainda maior dos nossos testes, sem depender de nada externo ou gambiarra de injetar no módulo. O grande detalhe é o seguinte: quando vamos chamar o alertUser no visual studio, ele já mostra o alert e qual message eu quero, assim fica muito mais claro o que precisa para ele rodar. Portanto, a vantagem de injetarmos dependência é ter essa facilidade de testar sem depender desse load dinâmico das dependências. Simplesmente mockamos a dependência que temos e nosso código vai funcionar. Além disso, fica mais fácil de ler. Confira o hands-on em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Yujkc1YpTtE\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "alert",
        "alerts",
        "message",
        "const",
        "browser",
        "alertmock",
        "depend",
        "temos",
        "digo",
        "para"
      ],
      "metadata": {
        "title": "Vantagens da Injeção de dependência para a testabilidade do código",
        "date": "2017-06-01",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "VantagemInejcao.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/vantagens-da-injecao-de-depencia/index.md"
      }
    },
    {
      "id": "29f70b5d76b071ef",
      "url": "https://devpleno.com/blog/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs/index",
      "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS) (Part 3)",
      "content": "Em NodeJS você pode utilizar Buffers para converter de uma codificação para outra. Por exemplo:\n\n```js\nvar string = 'DevPleno'\nvar emBase64 = new Buffer(string).toString('base64')\nconsole.log(emBase64) // Saída: RGV2UGxlbm8=\n\nvar deBase64 = new Buffer(emBase64, 'base64').toString('ascii')\nconsole.log(deBase64) // Saída: DevPleno\n```",
      "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
      "keywords": [
        "string",
        "base64",
        "fromcharcode",
        "embase64",
        "keystr",
        "para",
        "charcodeat",
        "this",
        "charat",
        "console"
      ],
      "metadata": {
        "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS)",
        "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
        "date": "2016-10-04",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "javascript-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs/index.md"
      }
    },
    {
      "id": "2a0357c23fbb80fb",
      "url": "https://devpleno.com/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar",
      "title": "A habilidade mais importante que um programador deveria ter (e praticar) - DevPleno (Part 1)",
      "content": "Carreira\n\n## A habilidade mais importante que um programador deveria ter (e praticar)\n\nT\nPor Tulio Faria • 13 de maio de 2021\n\n[Carreira](/tag/carreira)\n\nÉ muito comum na área de programação todos pensarem que a habilidade mais importante esteja relacionada ao pensamento lógico e a capacidade de resolver problemas. E não que estas habilidades não sejam importantes, mas existe uma habilidade que potencializa o resultados delas: **perguntar**.\n\nSim, exatamente. Perguntar é uma habilidade importantíssima. E antes que você ache isso muito estranho, vamos entender melhor.\n\nO ato de perguntar é relacionado inclusive ao processo científico. Você já deve ter ouvido algo como “o que move o mundo são as perguntas e não as respostas”. Perguntar destrava caminhos alternativos. Perguntar te leva a caminhos que talvez nem havia pensado sobre.\n\nNeste cenário hipotético da imagem anterior, o seu processo te leva a um resultado 1. E questionamentos e perguntas podem gerar no mínimo 3 novas opções de cenários:\n\n- Um resultado pior (neste caso, o resultado 2)\n\n- Nenhum resultado\n\n- Um resultado melhor (neste caso, o resultado 3)\n\n## Qual seria a vantagem de explorar o resultado com mais perguntas?\n\nO grande ganho deste tipo de pensamento e processo é a exploração de potenciais resultados melhores, re-afirmar o resultado obtido como um resultado bom e ainda aumentar a possibilidade argumentativa dos motivos por qual processo ter sido melhor.\n\n## Mas como saberei qual resultado seria o melhor?\n\nNeste caso, para todo problema que você esteja buscando uma solução é importante ter em mente quais critérios essa solução deverá ser mensurada. Ainda usando o cenário anterior, o resultado 3, poderia ser melhor sobre um critério que não era o seu objetivo inicial, e inclusive ter sido descartado.\n\nTrazendo para algo mais próximo do cotidiano de programação: você pode chegar em um resultado em que a performance é muito boa, porém a manutenção fica mais complexa.",
      "description": "É muito comum na área de programação todos pensarem que a habilidade mais importante esteja relacionada ao pensamento lógico e a capacidade de resolver pro...",
      "keywords": [
        "resultado",
        "perguntas",
        "para",
        "habilidade",
        "mais",
        "rios",
        "como",
        "solu",
        "importante",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar"
      }
    },
    {
      "id": "2a29637f29446d71",
      "url": "https://devpleno.com/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar",
      "title": "A habilidade mais importante que um programador deveria ter (e praticar) - DevPleno (Part 2)",
      "content": "Agora o grande poder: caso alguém te questione sobre o motivo de não ter usado o processo para chegar ao Resultado 3, você sabe baseado nos seus critérios.\n\nIsso ainda vai te ajudar a solucionar problemas de uma maneira bastante inteligente, visto que cada nova decisão estará pautada.\n\n## Como exercitar “perguntar” na prática?\n\n**Maneira 1:** sempre questione como tudo é resolvido. Sempre que vejo alguma solução, ferramenta ou até mesmo slogan de um produto de software eu me questiono:\n\n- Qual o motivo de fazerem desta maneira?\n\n- Será que fazem o que estão dizendo?\n\n**Maneira 2:** revisite suas perguntas (e suas respostas). Muitas perguntas, critérios e respostas podem ser temporárias ou atemporais. E bastante interessante revisitá-las, pois tudo pode mudar.\n\nA muito tempo atrás, eu havia testado uma placa para IoT chamada NodeMCU (validado inclusive com várias perguntas). Na época, ela não havia passado nos critérios de uma solução que estava desenvolvendo. Refiz as perguntas recentemente, e tudo havia mudado - e agora ela é uma solução viável.\n\n**Maneira 3:** faça provas de conceitos (proof of concept) (famosas PoCs) daquele aspecto/pergunta que você está buscando uma solução. Qual banco seria o mais adequado para uma aplicação x? Faça uma prova de conceito com seus bancos de dados candidatos respondendo a perguntas que te ajudem a desenvolver sua aplicação e critérios para avaliar os resultados.\n\nFazemos muitas provas de conceitos dentro da [Formação Fullstack Master](https://go.devpleno.com/fsm?sck=blog) para explorar esta habilidade. Em breve vamos aplicar em todos os nossos treinamentos - pois é uma ferramenta muito poderosa de aprendizado, masterização e argumentativo.",
      "description": "É muito comum na área de programação todos pensarem que a habilidade mais importante esteja relacionada ao pensamento lógico e a capacidade de resolver pro...",
      "keywords": [
        "resultado",
        "perguntas",
        "para",
        "habilidade",
        "mais",
        "rios",
        "como",
        "solu",
        "importante",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar"
      }
    },
    {
      "id": "2a31662198fccbdd",
      "url": "https://devpleno.com/blog/standard-parte-1/index",
      "title": "Standard - Padronize o código fonte JavaScript da sua equipe (Part 1)",
      "content": "O módulo Standard é uma ferramenta bastante útil no nosso dia a dia, ele aplica algumas regras para você manter seu código fonte. Por exemplo, se você vai fazer um 'if', tem que deixar um espaço porque facilita a leitura:\n\n```jsx\nif (i === 1) {\n}\n```\n\nCom o tempo você sente que seu código precisa melhorar, tanto em performance quanto em organização. Quando começamos temos que resolver um código, depois de um tempo isso já não é o suficiente. Precisa ser feito de forma que outras pessoas entendam e que fique bem organizado, que é algo que levo pra minha carreira hoje, procuro resolver o problema da melhor forma possível. Uma das formas que temos para aumentar a qualidade de um código é mantendo um padrão de escrita. Em Java, é muito comum utilizarmos o Java Cult, em JavaScript temos algumas opções como o Standard.\n\nNo caso do Standart, ele tem uma ferramente que checa o código. Para usar, primeiramente tem que dar um npm:\n\n```jsx\nnpm install -g standard\n```\n\nQuando você roda o módulo, ele procura todos os arquivos JS dentro do seu diretório atual e vê se está faltando alguma coisa, por exemplo no meu ele achou alguns erros:\n\n![Exemplo](standardUExUm.png)\n\nEntão o 'i' em nosso 'if' não foi definido, com isso conseguimos pegar um bug antes mesmo dele acontecer, então vamos resolver o primeiro bug:\n\n```jsx\nlet i = 0\nif (i === 1) {\n}\n```\n\nAo rodar, percebam que já diminuiu um bug:\n\n![Exemplo 2](standardUExD.png)\n\nAgora temos um espaço vazio na linha 3\n\n```jsx\nlet i = 0\nif (i === 1) {\n  console.log(1)\n}\n```\n\nE por fim, adicionar uma nova linha no final do arquivo. Quando fazemos isso não retorna nenhum erro no nosso código. Se eu der um 'tab' a mais, por exemplo, no console.log, ele vai retornar que está identado errado.\n\nUma coisa que dá bastante discussão é onde colocar a abertura da chave. Se você colocar na linha de baixo, ele irá dar um erro:\n\n```jsx\nif (i === 1) {\n  console.log(1)\n}\n```\n\n![Exemplo 3](standardUExT.png)",
      "keywords": [
        "digo",
        "para",
        "exemplo",
        "temos",
        "standard",
        "nosso",
        "resolver",
        "isso",
        "linha",
        "embed"
      ],
      "metadata": {
        "title": "Standard - Padronize o código fonte JavaScript da sua equipe",
        "date": "2017-07-24",
        "tags": "['Javascript']",
        "thumbnail": "StandarPart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/standard-parte-1/index.md"
      }
    },
    {
      "id": "2a32aa39b8170992",
      "url": "https://devpleno.com/blog/10-dicas-de-produtividade-para-programadores/index",
      "title": "10 dicas de produtividade para programadores (Part 6)",
      "content": "Adiar compromissos pode ter um impacto negativo na produtividade. Assim, definir metas e estipular prazos para a conclusão de cada atividade ajuda a evitar atrasos.\n\nCom tudo organizado, haverá tempo para a diversão, com atividades relaxantes e prazerosas (praticar esportes, assistir filmes e ler), que podem tornar a rotina mais leve. Ser produtivo não é o mesmo que trabalhar compulsivamente; o descanso é essencial para recuperar as energias.\n\nGostou destas dicas de produtividade? Então venha [conhecer](https://www.devpleno.com/qual-a-sua-desculpa?utm_source=blog&utm_campaign=rc_blogpost) um pouco mais dos nossos conteúdos.",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "para",
        "produtividade",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "title": "10 dicas de produtividade para programadores",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "106696-10-dicas-de-produtividade-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "revisor": "['Renato Siqueira']",
        "chunkIndex": 5,
        "totalChunks": 6,
        "sourcePath": "blog/10-dicas-de-produtividade-para-programadores/index.md"
      }
    },
    {
      "id": "2a3ac11aa4d522dd",
      "url": "https://devpleno.com/blog/template-strings/index",
      "title": "ES6 - Template Strings (Part 1)",
      "content": "Como já citei em outros posts, (como em: [ES6 Spread Operator](https://www.devpleno.com/spread-operator/), [Async/await](https://devpleno.com/async-await), [Destructuring Assignment](https://devpleno.com/dica-es6-destructuring-assignament)) o ES6 apresenta algumas novidades, uma delas é o Template Strings, uma forma de declarar uma string em JavaScript.\n\n```javascript\nconst str1 = `teste`\nconsole.log(str1)\n```\n\nEla será o mesmo que se fizermos uma String convencional, porém podemos fazer algumas coisas extras. Exemplo: Se eu quisesse uma String multilinha, teria que fazer o seguinte:\n\n```javascript\nconst str1 = `teste`\nconst strMultiLinha = 'linha1 \\n linha2'\nconsole.log(strMultiLinha)\n```\n\nOu seja, teria que utilizar o contra barra (ou scape) em todas as linhas, o que é um tanto chato.\n\n### O que pode ser feito?\n\nCom o Template String é possível fazer simplesmente isso:\n\n```javascript\nconst strMultiLinha = `linha1\nlinha meio\nlinha2`\nconsole.log(strMultiLinha)\n```\n\nNão é mais necessário utilizar o \\\\n, isso deixa o código mais limpo. Outra coisa do Template String é que podemos criar uma string interpolada, ou seja, misturar uma expressão com a string que vai ser avaliada e depois colocar ela entre pólos, ao invés de concatenar. Fazemos isso apenas abrindo um `\\$ {expressão}`, por exemplo:\n\n```javascript\nconst str = `Ola \\$ {1 + 1} !`\nconsole.log(str)\n```\n\nObviamente também podemos colocar variáveis dentro:\n\n```javascript\nconst a = 10\nconst str = `Ola \\$ {a + 1} !`\nconsole.log(str)\n```\n\nExiste ainda uma outra funcionalidade interessante: utilizar algumas tags com o Template String. Exemplo: Vamos criar uma tag e ela vai receber strings e values.\n\n```javascript\nfunction tag(strings, ...values) {\n  console.log(strings, values)\n  return 'opa'\n}\nconst str = tag`Olá \\$ {10} mundo!`\n```",
      "keywords": [
        "string",
        "javascript",
        "const",
        "strings",
        "console",
        "https",
        "devpleno",
        "isso",
        "template",
        "podemos"
      ],
      "metadata": {
        "title": "ES6 - Template Strings",
        "date": "2017-05-30",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "TemplateStrings.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/template-strings/index.md"
      }
    },
    {
      "id": "2a5a301369df1221",
      "url": "https://devpleno.com/participacao-em-eventos-e-comunidades",
      "title": "Participação em Eventos e Comunidades - DevPleno (Part 3)",
      "content": "Se você tem um evento na sua cidade que você não esteja alinhado com ele, converse com a coordenação desse evento para palestrar ao invés de criar outro evento. Eu faço muito disso, esse ano dei por volta de três palestras e principalmente na região.\n\nEntão fortaleça as comunidades e eventos que estão perto de você. Nós vivemos em comunidade, trabalhamos em comunidade, então porque não aprender em comunidade?\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Participa%C3%A7%C3%A3o%20em%20Eventos%20e%20Comunidades&url=https%3A%2F%2Fdevpleno.com%2Fparticipacao-em-eventos-e-comunidades) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fparticipacao-em-eventos-e-comunidades)",
      "description": "Hoje eu vou comentar um pouco sobre a participação em eventos e em comunidades, esse tema foi sugerido pelo Ian Magalhães que comentou no nosso canal do Yo...",
      "keywords": [
        "isso",
        "para",
        "eventos",
        "pessoas",
        "evento",
        "comunidades",
        "https",
        "comunidade",
        "sobre",
        "importante"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/participacao-em-eventos-e-comunidades"
      }
    },
    {
      "id": "2a63da99992be238",
      "url": "https://devpleno.com/clt-ou-pj",
      "title": "CLT ou PJ em Software - O que vale mais a pena? - DevPleno (Part 2)",
      "content": "Esse é um cálculo bem por cima, mas recebendo como PJ, você teria um custo menor para a empresa e seu lucro também seria muito maior. Obviamente as pessoas se perguntam sobre os benefícios de ser registrado, mas esquecem que o seguro desemprego, por exemplo, tem um teto salarial, então se você ganha R$10 mil por mês, não vai ganhar isso de seguro desemprego então, nos seus 6 primeiros meses de PJ, você pode e deve, por exemplo, fazer uma reserva de segurança. Agora é a grande vantagem do que eu vejo em pensar como uma pessoa PJ, mesmo você sendo CLT.\n\nComo PJ, você não tem algumas seguranças como o seguro desemprego, a vantagem que eu vejo é que você vai ter mais consciência das coisas, quanto custa um plano de saúde, plano B caso aconteça algo e por fim não vai ser enganado pelo décimo terceiro, porque você acha que está ganhando a mais quando, na verdade, o custo que você tem vai ser maior como CLT.\n\nSe a empresa tiver R$169 mil para pagar um profissional ao invés de R$10 mil, seu salário poderia ser 169000/12 que daria uma quantia de R$ 14.083,33.\nIsso é apenas um apanhado sobre tributações. Existem vários trâmites, se é legal ou não… isso não é o mérito dessa aula, e sim mostrar a diferença efetiva dos dois lados.\n\nNa parte do PJ, pode ser, por exemplo, que precise pagar um contador. Vamos colocar um valor de R$300,00/mês como exemplo, então seria R$3600,00 por ano, mesmo assim a diferença é muito gritante. Falando em valores finais, ainda vale a pena ser PJ. Se você tiver que escolher, pense com calma o que realmente quer, faça os cálculos.\n\n## Confira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje eu gostaria de mostrar uma continha que eu acho bastante interessante quando vamos analisar ofertas de emprego, que o pessoal fala sobre CLT ou PJ. En...",
      "keywords": [
        "para",
        "como",
        "empresa",
        "custo",
        "exemplo",
        "https",
        "mais",
        "valor",
        "isso",
        "qual"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/clt-ou-pj"
      }
    },
    {
      "id": "2adc07df18781672",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-1/index",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto (Part 5)",
      "content": "Ao final, renderizamos o view match e mandamos uma lista para la, matches, match e id.\n\nEle não vai encontrar o view match, então vamos novamente nos arquivos de apoio, pegamos o arquivo match.ejs dentro do diretório views e colamos dentro de views do projeto. Agora já temos os dados sendo jogados na tela.\n\n**Como ele está colocando esses dados na tela?**\n\nDentro do view/match.ejs importamos o head, header como de praxe, e a parte de cima temos um forEach novamente com todos os jogos em que eu repito um div, onde mostro a abreviação do campeonato que ele está, o time a, b e score desses times.\n\nAo continuar o template, temos as informações do jogo em match-info, por exemplo qual campeonato, rodada, nome do time, o escudo dele (e repare que já estamos redirecionando ele para public). Temos também a lista de suportes, que é a torcida, nós ainda não fizemos essa parte, vamos fazer mais a frente. Uma lista de vídeos que pegamos do db, fazemos um embed do youtube e o lance a lance. Uma coisa que você pode ter percebido é que esse lance a lance está ao contrário, geralmente os lances entram em cima e vão empurrando os lances mais antigos para baixo. Para ordenar esses lances, vamos em index.ejs, importar o lodash e importar o próprio match e ordenar pelo half e o tempo em minutos de forma descendente:\n\n```jsx\nconst _ = require('lodash')\nrouter.get('/match', function(req, res, next){\n    const matches =  db.get('matches').value()\n    const match = db.get('matches['+req.params.id+']').value()\n    match.bids = _.orderBy(match.bids,['half', 'time']), ['desc' , 'desc'])\n    res.render('match', { matches, match, id: req.param.id });\n});\n```",
      "keywords": [
        "vamos",
        "para",
        "match",
        "matches",
        "dentro",
        "views",
        "express",
        "index",
        "temos",
        "pasta"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 4,
        "totalChunks": 6,
        "sourcePath": "blog/minicurso-socket-io-parte-1/index.md"
      }
    },
    {
      "id": "2b2166b4992ad779",
      "url": "https://devpleno.com/blog/beatbox-manipulavel-com-js/index",
      "title": "Construindo um Beatbox Manipulável com JS (Part 1)",
      "content": "Agora que já entendemos [como dar play em áudio com JS](https://www.devpleno.com/audio-com-js-puro/), [como manipular para compor uma batida](https://www.devpleno.com/beatbox-com-javascript/), faremos com que o usuário escolha a forma como seja tocado, ou seja, um Beatbox Manipulável com JS\n\nVamos começar utilizando um pouco da estrutura do HTML usado anteriormente (os áudios importados e o play) e implementar esse código. Criaremos um div.\n\nA ideia é ter vários checkbox para cada instrumento, por exemplo, temos um prato e vários checkbox, os quais podemos marcar. Onde estiver marcado será tocado o áudio e onde não estiver não será tocado. Para não precisarmos criar manualmente todo os inputs, podemos criar um script JS que terá um contador que gera vários checkbox.\n\n```jsx\n<html>\n  <head>\n    <tittle>beat-box</tittle>\n  </head>\n  <body>\n    <button id=\"play\">Play</button>\n\n    <audio src=\"prato.wav\" id=\"prato\"></audio>\n    <audio src=\"prato-fechado.wav\" id=\"prato-fechado\"></audio>\n    <audio src=\"bumbo.wav\" id=\"bumbo\"></audio>\n    <audio src=\"boca.wav\" id=\"boca\"></audio>\n    <audio src=\"caixa.wav\" id=\"caixa\"></audio>\n\n    <div id=\"track1\" rel=\"prato\">\n      <h2>Prato</h2>\n    </div>\n    <div id=\"track2\" rel=\"prato-fechado\">\n      <h2>Prato-fechado</h2>\n    </div>\n    <div id=\"track3\" rel=\"bumbo\">\n      <h2>Bumbo</h2>\n    </div>\n\n    <script>\n      const numItems = 10\n      function generationTrack(trackId){\n        const track = document.getElementById('track'+trackId)\n\n        for (let i=0; i<10; i++){\n          track.innerHTML += '<input type=\"checkbox id=\"i-'+trackId+'-'+i+'\" />'\n        }\n      }\n\n      generateTrack(1)\n      generateTrack(2)\n      generateTrack(2)\n    </script>\n  </body>\n<html>\n```",
      "keywords": [
        "play",
        "audio",
        "const",
        "prato",
        "track",
        "script",
        "checkbox",
        "https",
        "para",
        "trackid"
      ],
      "metadata": {
        "title": "Construindo um Beatbox Manipulável com JS",
        "date": "2017-05-29",
        "tags": "['Javascript']",
        "thumbnail": "BEATBOX-COM-JS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/beatbox-manipulavel-com-js/index.md"
      }
    },
    {
      "id": "2b784c0dc31dee60",
      "url": "https://devpleno.com/blog/reconhecimento-facial-com-js/index",
      "title": "Reconhecimento facial com JS (Part 1)",
      "content": "Hoje vamos fazer um hands-on em uma biblioteca que eu achei muito interessante chamada TrackingJS. Ela nos ajuda a trabalhar com visão computacional.\n\nVisão computacional é uma forma que temos de processar imagens para extrair alguma coisa delas, nesse exemplo vamos fazer um tracking facial, reconhecer a face em uma imagem.\n\nUm exemplo prático seria por exemplo, se a pessoa subir uma foto para o perfil dela, esse tracking facial poderia te ajudar a centralizar e realizar o crop da foto.\n\nA primeira coisa que vamos fazer é acessar o site \"trackingjs.com\" e baixar um pacote com todos os arquivos. Vamos pegar a pasta build e deixar dentro do diretório em que vamos criar a aplicação. Além disso, vou rodar também o HTTP server na pasta que eu estou criando os arquivos.\n\nVamos criar um arquivo index.html. O trackingjs já vem com várias coisas que podemos reaproveitar,uma delas é reconhecer o vídeo da webcam. Para fazer isso, vamos importar da pasta build o traking-min.js e o data/face-min.js:\n\n```jsx\n<html>\n    <head>\n        <title>Face Traking</title>\n        <style>\n            video, canvas {\n            position: absolute;\n            border: 1px solid red;\n            }\n        </style>\n    </head>\n    <body>\n        <script rsc=\"tracking-min.js\"></script>\n        <script rsc=\"data/face-min.js\"></script>\n    </body>\n</html>\n```\n\nO reconhecimento de faces funciona basicamente por meio de um treinamento, onde fazemos em uma rede neural e precisamos desse arquivo de dados, que é o treinamento realizado.\n\nAgora vamos criar dois itens, um deles é uma tag víde. Vamos definir uma largura e altura. O outro é um canvas para podermos desenhar em cima desse vídeo e mostrar onde está sendo reconhecido realmente o rosto:",
      "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
      "keywords": [
        "rect",
        "canvas",
        "vamos",
        "para",
        "script",
        "context",
        "video",
        "width",
        "const",
        "event"
      ],
      "metadata": {
        "title": "Reconhecimento facial com JS",
        "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
        "date": "2017-11-24",
        "tags": "['Javascript']",
        "thumbnail": "ReconhecimentoFacial.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/reconhecimento-facial-com-js/index.md"
      }
    },
    {
      "id": "2b9f3b6d6cad38d9",
      "url": "https://devpleno.com/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web",
      "title": "Servidores Web -  Um pouco mais do back-end de uma Aplicação Web - DevPleno (Part 1)",
      "content": "Javascript\n\n## Servidores Web - Um pouco mais do back-end de uma Aplicação Web\n\nT\nPor Tulio Faria • 23 de maio de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nServidores Web são um serviço usado no servidor que fornece páginas ou algum asset para o front-end. Dentro de uma máquina, configuramos uma pasta (/site por exemplo) e quando a pessoa tenta acessar, por exemplo, na porta 80 dessa máquina, o servidor aponta para ela e essa pasta vai ser ‘servida’ para o front-end.\n\nEste tipo de arquitetura ainda é muito comum. Atualmente temos algumas outras alternativas, mas esse formato ainda é o mais utilizado.\n\nQuando o front-end solicita um .php, por exemplo, o servidor não sabe o que tem que fazer com esse .php, mas na configuração ele sabe que tem um php.exe que sabe o que deve ser feito, então ele envia o script php para o php.exe e este manda a resposta para o APACHE HTTPD. Por fim, o APACHE envia para o cliente. Essa estrutura acontece em grande parte dos sites em que acessamos, como nos que são feitos em Wordpress.\n\nGeralmente, quando é um arquivo como uma IMG ou um CSS, o APACHE já envia diretamente, pois ele já sabe que não precisa pré-processar esses arquivos.\n\n**Quais as opções disponíveis no mercado?**\n\nO APACHE HTTPD - mais conhecido e utilizado para o PHP - o HAProxy, NgineX e o IIS da Microsoft. Podemos escolher qualquer um desses e configurar o site para rodar.\n\nAntigamente comparavam linguagens dizendo coisas como: “O PHP é mais lento que o NodeJS”, mas essa comparação é um pouco injusta, já que o PHP precisa do APACHE, que se não for configurado para ser apto a receber muita requisição, pode atrapalhar os acessos do site. Para compararmos as duas, temos que desconsiderar o APACHE ou colocá-lo na frente do Node também.",
      "description": "Servidores Web são um serviço usado no servidor que fornece páginas ou algum asset para o frontend. Dentro de uma máquina, configuramos uma pasta (/site po...",
      "keywords": [
        "para",
        "mais",
        "servidor",
        "apache",
        "https",
        "pouco",
        "servidores",
        "sabe",
        "como",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web"
      }
    },
    {
      "id": "2bc0813099e0bce8",
      "url": "https://devpleno.com/como-escolher-linguagem-de-tecnologia",
      "title": "Como escolher uma linguagem de tecnologia? - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Como%20escolher%20uma%20linguagem%20de%20tecnologia%3F&url=https%3A%2F%2Fdevpleno.com%2Fcomo-escolher-linguagem-de-tecnologia) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-escolher-linguagem-de-tecnologia)",
      "description": "Eu sou uma pessoa que sempre tem que estar conhecendo coisas novas e estar confortável com essas coisas, por isso resolvi compartilhar como escolher uma li...",
      "keywords": [
        "linguagem",
        "https",
        "como",
        "para",
        "escolher",
        "tecnologia",
        "coisas",
        "carreira",
        "isso",
        "resultado"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/como-escolher-linguagem-de-tecnologia"
      }
    },
    {
      "id": "2bd3c3156d83ce16",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-2/index",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO (Part 5)",
      "content": "```jsx\nrouter.get('/, function(req, res, next){\n    const matches = db.get('matches').value()\n    res.render('admin/index, { matches});\n});\n\nrouter.get('/match', function(req, res, next){\n    const matches = db.get('matches').value()\n    const match = db.get('matches['+req.params.id+']').value()\n    res.render('admin/match', { matches, match, id: req.param.id });\n});\n```\n\nFazemos isso para ele saber que o view não vai ser um view comum, ele vai ser do admin. As únicas diferenças que temos no index é a cor do header, troquei o nome do botão para gerenciar e foi adicionado um botão \"gerar jogo\", que é onde vai criar um jogo aleatório apenas para não precisarmos adicionar a lista de jogadores, etc. Não fizemos esse código ainda, vamos fazer na próxima aula.\n\nConfira a aula em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/QX-0mjQOV2U\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "vamos",
        "socket",
        "para",
        "index",
        "admin",
        "const",
        "criar",
        "dentro",
        "fazer",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO",
        "date": "2017-07-06",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart2.png",
        "author": "Tulio Faria",
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-2/index.md"
      }
    },
    {
      "id": "2c1747e90505bc50",
      "url": "https://devpleno.com/blog/hands-on-faker/index",
      "title": "Hands-on: Faker",
      "content": "Você já precisou gerar dados fictícios para seus projetos? As chances são que sim, e de forma bem recorrente, né? Neste vídeo, um hands-on do Faker, uma ferramenta que facilita bastante este processo de geração de dados de testes.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/bvfHQHgVzG8\" allowfullscreen></iframe>\n</div>\n\nNão esqueça de deixe suas dúvidas e sugestões nos comentários, curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "dados",
        "para",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Hands-on: Faker",
        "date": "2017-04-24",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Faker.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-faker/index.md"
      }
    },
    {
      "id": "2c2eb3cbf13a058e",
      "url": "https://devpleno.com/modulos",
      "title": "NodeJS Primeiros Passos: Módulo em NodeJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## NodeJS Primeiros Passos: Módulo em NodeJS\n\nT\nPor Tulio Faria • 30 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\n**O que é Módulo em NodeJS?**\n\nÉ um script php no qual você consegue incluir em um outro script. É uma maneira bem tradicional de se organizar as partes funcionais do código.\n\nVamos fazer um teste simples apenas para testar o require, que é a forma de importar esse módulo.\n\nCrie um novo arquivo no Node e coloque um nome qualquer, o meu será modulo01.js, esse arquivo será meu módulo, dentro dele terá:\n\nconsole.log('Dentro do modulo')\nSalve e crie um novo arquivo chamado app.js. Nele vamos fazer o seguinte:\n\nrequire('./modulo01')\nAo executar o app.js, o require chama o modulo01 e apresenta a frase do nosso arquivo modulo01.js\n\nO interessante nessa forma de gerir os módulos no node é que seria como se ele estivesse em uma closer como uma self invoking, porque ele isola o nosso escopo inteiro.\n\nPara fazermos uma funcionalidade um pouco melhor, podemos falar para esse módulo exportar, por exemplo, um contar:\n\nvar contador = 0\nmodule.exports.contar = function () {\ncontador++\nconsole.log(contador)\n}\nCom isso estamos expondo um pedaço do nosso módulo para o que está externo, criando uma pequena interface chamada contar.\n\nQuando fizermos o require do módulo no app.js, podemos atribuir ele a uma variável:\n\nvar m1 = require('./modulo01')\nm1.contar()\nAssim o m1 recebe uma self invoking e conseguimos ter acesso ao contar que expomos para o que está externo.\n\nUm exemplo que podemos fazer é o seguinte:\n\nvar m1 = require('./modulo01')\nm1.contar()\nvar m2 = require('./modulo01')\nm2.contar()\nO require só é executado uma vez. Mesmo sendo executado duas vezes, a primeira vez que ele executar a self invoking function vai ser mantida. Esse comportamento é semelhante ao singleton do java e c#, por exemplo.",
      "description": "O que é Módulo em NodeJS? É um script php no qual você consegue incluir em um outro script. É uma maneira bem tradicional de se organizar as partes funcion...",
      "keywords": [
        "function",
        "dulo",
        "require",
        "contar",
        "contador",
        "para",
        "modulo02",
        "modulo01",
        "nodejs",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/modulos"
      }
    },
    {
      "id": "2c40b9f6060df0f8",
      "url": "https://devpleno.com/beatbox-com-javascript",
      "title": "Como construir um beatbox com JavaScript - DevPleno (Part 1)",
      "content": "Javascript\n\n## Como construir um beatbox com JavaScript\n\nT\nPor Tulio Faria • 29 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nContinuando nossos experimentos utilizando áudio no HTML (você deve ter percebido que me empolguei com este assunto), vamos mudar o exemplo do metrônomo para construir uma ‘bateria’ e poder criar uma música somente dando ‘plays’ de forma ordenada em alguns trechos. Então vamos lá!\n\nVamos ter um botão que será um play/stop. Ao dar o play, será tocado uma sequência de áudios para simular uma bateria em loop. Para que isso ocorra, temos que ter alguns áudios e também tratar isso em javaScript.\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;tittle>beat-box&#x3C;/tittle>\n&#x3C;/head>\n\n&#x3C;body>\n&#x3C;button id=\"play\">Play&#x3C;/button>\n&#x3C;audio src=\"prato.wav\" id=\"prato\">&#x3C;/audio>\n&#x3C;audio src=\"prato-fechado.wav\" id=\"prato-fechado\">&#x3C;/audio>\n&#x3C;audio src=\"bumbo.wav\" id=\"bumbo\">&#x3C;/audio>\n&#x3C;audio src=\"boca.wav\" id=\"boca\">&#x3C;/audio>\n&#x3C;audio src=\"caixa.wav\" id=\"caixa\">&#x3C;/audio>\n\n&#x3C;script>&#x3C;/script>\n&#x3C;/body>\n&#x3C;html>\nDentro do Script, vamos tratar como fizemos no exemplo do metrônomo, então vamos criar o mesmo timer, criar uma função tick, porém fazer ela rodar a 90bpm (60*1000/90), isso dá a distância entre uma batida e outra.\n\nA ideia é que a cada interação do tick, toque um áudio. Exemplo: Supondo que nossa música seja prato, bumbo, boca e caixa, o tick vai tocar essas 4 coisas para cada repetição que fizer. Para isso vamos pegar o music na posição currentAudio++.\n\n&#x3C;script>\nconst play = constGetElementById('play')\n\nlet timer = null\n\nlet currentAudio = 0\n\nconst bpm = 90\n\nconst music = ['prato', 'bumbo', 'boca', 'caixa']\n\nfunction tick(){\nconsole.log(music[(currentAudio++)%music.length])\n}",
      "description": "Continuando nossos experimentos utilizando áudio no HTML (você deve ter percebido que me empolguei com este assunto), vamos mudar o exemplo do metrônomo pa...",
      "keywords": [
        "play",
        "const",
        "audio",
        "music",
        "para",
        "prato",
        "bumbo",
        "tick",
        "currentaudio",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/beatbox-com-javascript"
      }
    },
    {
      "id": "2c7bfffaf6d7af84",
      "url": "https://devpleno.com/blog/dica-debounce/index",
      "title": "Dica: Debounce",
      "content": "Debounce é uma técnica bastante útil para restringir o tempo entre a chamada de uma mesma função. Por exemplo, se um usuário clicar 6x em um botão em menos de 2s, apenas a última vez será contada. Neste vídeo, construiremos uma forma genérica de controlar isso.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/X8wo1b2Eem0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "para",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "debounce"
      ],
      "metadata": {
        "title": "Dica: Debounce",
        "date": "2017-04-04",
        "tags": "['Javascript']",
        "thumbnail": "Debounce-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-debounce/index.md"
      }
    },
    {
      "id": "2cce7377267e4232",
      "url": "https://devpleno.com/blog/sobre-o-devpleno/index",
      "title": "Sobre o DevPleno (Part 4)",
      "content": "<iframe width=\"790\" height=\"444\" src=\"https://www.youtube.com/embed/vOoqJ7l2ng8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\"></iframe>\n\n## O DevPleno é diferente\n\nO meu grande propósito e objetivo com o DevPleno é trazer conteúdo relevante. E para conseguir mostrar realmente como é o dia-a-dia de um desenvolvedor, eu atuo na minha própria empresa e também como funcionário em outras (inclusive fora do Brasil). Então espere muitos insights direto do campo de batalha, seja empreendendo no meu próprio negócio ou como funcionário 🙂.",
      "keywords": [
        "para",
        "como",
        "mais",
        "minha",
        "devpleno",
        "muito",
        "isso",
        "cada",
        "meus",
        "projetos"
      ],
      "metadata": {
        "title": "Sobre o DevPleno",
        "date": "2017-03-15",
        "tags": "['Carreira']",
        "thumbnail": "tulio.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/sobre-o-devpleno/index.md"
      }
    },
    {
      "id": "2cdcbf8afd9f66c0",
      "url": "https://devpleno.com/blog/float-e-precisao/index",
      "title": "Float e precisão (Part 2)",
      "content": "Quando fazemos essa conversão para inteiro, não temos mais esse problema de precisão. Um exemplo para ficar mais claro: vamos supor que você quer armazenar uma camisa que custa R\\$10.99, ao invés de armazenar 10.99, armazena 1099 centavos, com um centavo não é divisível fica muito mais simples de fazermos essa conta.\n\nSe você passar por esse problema, agora já sabe como resolver. :)\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/CnmcnS70Soc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "const",
        "problema",
        "para",
        "precis",
        "como",
        "temos",
        "esse",
        "meros",
        "vamos",
        "num1"
      ],
      "metadata": {
        "title": "Float e precisão",
        "date": "2017-07-28",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "FLOAT-E-PRECISAO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/float-e-precisao/index.md"
      }
    },
    {
      "id": "2d074af100932d78",
      "url": "https://devpleno.com/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira - DevPleno (Part 4)",
      "content": "Nos Estados Unidos e nos países da Europa, a média de qualificação dos profissionais freelancers pode ser superior à média do Brasil. Como se sobressair diante de tamanha concorrência? [Atualize-se, esteja em constante capacitação](https://www.devpleno.com/carreira-tomar-decisoes?utm_source=blog&#x26;utm_campaign=rc_blogpost).\n\n## 7. Conheça as especificidades de seu campo de atuação no exterior\n\nUma mudança para outro país sempre requer um período de adaptação. No que se refere, especificamente, a questões ligadas ao trabalho freelancer, não é diferente.\n\nAs exigências para um [desenvolvedor no Brasil](https://www.youtube.com/watch?v=vOoqJ7l2ng8&#x26;utm_source=blog&#x26;utm_campaign=rc_blogpost), por exemplo, podem ser diferentes daquelas existentes no Reino Unido. Antes de iniciar uma trajetória profissional fora do país é importante se ater a questões como essa.\n\nSer um freelancer no exterior pode ser uma experiência incrível. Muitas pessoas conseguem combinar a oportunidade de trabalho com uma rotina de viagens muito interessante. Ou, simplesmente, conseguem se estabelecer naquele país em que sempre sonharam viver.\n\nPara alcançar esses objetivos, o freelancer deve priorizar a realização de uma etapa de preparação. Nesse sentido, todas as dicas apresentadas aqui não podem ser deixadas de lado.\n\nGostou das nossas dicas sobre ser freelancer no exterior? Siga compartilhando nossos conteúdos nas redes sociais!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "O trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho. No entanto, a maiori...",
      "keywords": [
        "para",
        "freelancer",
        "trabalho",
        "exterior",
        "https",
        "carreira",
        "pode",
        "mais",
        "isso",
        "como"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira"
      }
    },
    {
      "id": "2d090415f1960618",
      "url": "https://devpleno.com/blog/currying/index",
      "title": "Currying -  Uma técnica interessante usada em programação funcional (Part 2)",
      "content": "console.log(functArrow(1)(2)(3))\n```\n\nPerceba que isso deixa ainda mais simplificado uma curried function e vamos compondo cada vez mais nossas funções. Isso deixa mais fácil de ser testado, pois, à medida que a parte elementar dela é testada, só precisamos passar os valores corretamente que não vai ter problema. Confira a explicação em vídeo.\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/rec4I8zfYjc\" allowfullscreen></iframe>\n</div>\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "function",
        "valor1",
        "valor2",
        "curried",
        "valores",
        "return",
        "valor",
        "isso",
        "metros",
        "console"
      ],
      "metadata": {
        "title": "Currying -  Uma técnica interessante usada em programação funcional",
        "date": "2017-05-26",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "CURRYING-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/currying/index.md"
      }
    },
    {
      "id": "2d4b30f05c38eaf3",
      "url": "https://devpleno.com/composicao-de-componentes-em-reactjs",
      "title": "Composição de componentes em ReactJS - DevPleno (Part 2)",
      "content": "&#x3C;Panel\nheader={\n&#x3C;span>\n'Olá &#x3C;u>mundo!&#x3C;/u>\n&#x3C;/span>\n}\n/>\nCom isso fizemos uma composição porque eu posso passar outro componente para ele, como é um JSX eu posso passar o html ou passar efetivamente um outro componente. Por exemplo, podemos passar um componente que depende de dois outros componentes, um que fica só no header e um no footer e qualquer coisa que você quiser colocar você pode, como um mapa por exemplo.\n\nIsso facilita bastante criar essa composição. Podemos criar componentes mais genéricos, principalmente os estilo containers e injetamos duas informações dentro. Outra coisa que podemos fazer o é o seguinte:\n\nconst Panel = (props) => {\nreturn (\n&#x3C;div>\n&#x3C;h1>{props.header}&#x3C;/h1>\n\n&#x3C;p>{props.footer}&#x3C;/p>\n&#x3C;/div>\n)\n}\n\nconst Header = (props) => {\nreturn &#x3C;div>.....&#x3C;/div>\n}\nO que passarem para ele eu vou colocar dentro do div. Como assim? Imagine que isso é meu header:\n\n&#x3C;Panel\nheader={\n&#x3C;span>\n'Olá &#x3C;u>mundo!&#x3C;/u>\n&#x3C;/span>\n}\n/>\nE eu vou dizer para ele que é um header com as coisas dentro:\n\n&#x3C;Header>\n&#x3C;span>\n'Olá &#x3C;u>mudo!&#x3C;/u>\n&#x3C;/span>\n&#x3C;/Header>\nPara utilizar o que está dentro do header e o /header utilizamos uma outra propriedade chamada props.children:\n\nconst Header = (props) => {\nreturn &#x3C;div>{props.children}&#x3C;/div>\n}\nEssas duas formas são bastante interessantes de se criar uma composição, ou com uma props normal ou se eu passar no corpo desse componente podemos gerar o props.children, com isso consigo pensar em componentes cada vez mais genéricos, porque eu posso fazer um header, por exemplo, para todas as minhas páginas e se eu quiser aplicar um class diferente, aplico no div.\n\nIsso libera um potencial para o React muito grande, porque a gente consegue reutilizar muito código a partir dessa componentização.\n\nConfira o vídeo:",
      "description": "A dica de hoje é sobre o ReactJS, mais especificamente sobre como podemos criar composição de componentes em ReactJS de uma forma um pouco diferente, como ...",
      "keywords": [
        "header",
        "props",
        "para",
        "componentes",
        "composi",
        "podemos",
        "reactjs",
        "como",
        "panel",
        "footer"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/composicao-de-componentes-em-reactjs"
      }
    },
    {
      "id": "2d688f5a9b17f2f8",
      "url": "https://devpleno.com/reconhecimento-facial-com-js",
      "title": "Reconhecimento facial com JS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Reconhecimento facial com JS\n\nT\nPor Tulio Faria • 24 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vamos fazer um hands-on em uma biblioteca que eu achei muito interessante chamada TrackingJS. Ela nos ajuda a trabalhar com visão computacional.\n\nVisão computacional é uma forma que temos de processar imagens para extrair alguma coisa delas, nesse exemplo vamos fazer um tracking facial, reconhecer a face em uma imagem.\n\nUm exemplo prático seria por exemplo, se a pessoa subir uma foto para o perfil dela, esse tracking facial poderia te ajudar a centralizar e realizar o crop da foto.\n\nA primeira coisa que vamos fazer é acessar o site “trackingjs.com” e baixar um pacote com todos os arquivos. Vamos pegar a pasta build e deixar dentro do diretório em que vamos criar a aplicação. Além disso, vou rodar também o HTTP server na pasta que eu estou criando os arquivos.\n\nVamos criar um arquivo index.html. O trackingjs já vem com várias coisas que podemos reaproveitar,uma delas é reconhecer o vídeo da webcam. Para fazer isso, vamos importar da pasta build o traking-min.js e o data/face-min.js:\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;title>Face Traking&#x3C;/title>\n&#x3C;style>\nvideo, canvas {\nposition: absolute;\nborder: 1px solid red;\n}\n&#x3C;/style>\n&#x3C;/head>\n&#x3C;body>\n&#x3C;script rsc=\"tracking-min.js\">&#x3C;/script>\n&#x3C;script rsc=\"data/face-min.js\">&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nO reconhecimento de faces funciona basicamente por meio de um treinamento, onde fazemos em uma rede neural e precisamos desse arquivo de dados, que é o treinamento realizado.\n\nAgora vamos criar dois itens, um deles é uma tag víde. Vamos definir uma largura e altura. O outro é um canvas para podermos desenhar em cima desse vídeo e mostrar onde está sendo reconhecido realmente o rosto:",
      "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
      "keywords": [
        "rect",
        "canvas",
        "vamos",
        "para",
        "script",
        "context",
        "video",
        "width",
        "const",
        "event"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/reconhecimento-facial-com-js"
      }
    },
    {
      "id": "2d6c75d310cf832c",
      "url": "https://devpleno.com/blog/como-vender-software/index",
      "title": "negociação - Como vender um Software (Part 1)",
      "content": "Hoje vou complementar um pouco sobre como vender software, mais especificamente sobre negociação.\n\nO primeiro ponto que temos que desconstruir é que negociação não é uma briga, e sim um consenso. Lembrando que a gente negocia o tempo todo, se você quer convencer seu amigo a ir em uma festa com você, precisa negociar e vender isso para ele. Isso é o que fazemos também para fechar contrato, precisamos negociar para mostrar para a outra pessoa que isso é bom e vai trazer resultado para ela ou para a empresa dela.\n\nO primeiro ponto que eu acho muito importante, até mesmo antes da negociação, é o quanto o projeto vai trazer de resultados, isso vai te dar insumo de até onde pode negociar. Um dos projetos que eu fechei (e foi um dos mais altos em valor) eu sabia que o prazo estava muito curto, então não tinha tempo para combinar, nem mesmo para reunião. Eles iriam inaugurar uma estrutura muito grande e precisavam do software funcionando em quarenta dias e nós éramos os únicos que eles conseguiram conversar no Brasil inteiro que topariam fazer isso. Quando a gente sabe disso e assume alguns riscos, a coisa se torna um pouco mais complexa.\n\nGeralmente, quando o risco é muito alto, o preço sobe. Isso fica muito claro porque quanto mais curto o prazo, mais você tem que trabalhar sem um período de descanso, imagine que você precise virar quase 40 noites para entregar a tempo.",
      "keywords": [
        "para",
        "isso",
        "muito",
        "cliente",
        "mais",
        "negocia",
        "algo",
        "outra",
        "fazer",
        "tempo"
      ],
      "metadata": {
        "title": "negociação - Como vender um Software",
        "date": "2017-08-16",
        "tags": "['Carreira']",
        "thumbnail": "NEGOCIAÇÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/como-vender-software/index.md"
      }
    },
    {
      "id": "2d7a33ffde3c8563",
      "url": "https://devpleno.com/modulo-co",
      "title": "Módulo Co - Organize o fluxo de seu código assíncrono - DevPleno (Part 2)",
      "content": "Esse código funcionou igual o anterior, mas perceba que ainda está muito chato. Imagine se tivermos que ler 10 arquivos, como faríamos? Vamos melhorar isso usando o CO:\n\nfunction readFile(file) {\nreturn new promise(function (resolve, reject) {\nfs.readFile(file, 'utf-8', function (err, data) {\nif (err) {\nreject(err)\n} else {\nresolve(data)\n}\n})\n})\n}\nco(function* () {\nconst contents = yield readFile('yarn.lock')\nconsole.log(contents)\n})\nComo tem um * ele é um generator, e podemos interromper a execução dele com yield e por baixo dos panos ele retorna um iterator que consegue voltar depois, o código continua sendo assíncrono, mas a única diferença é que ele mostra o código de uma forma mais fácil de entender.\n\nNós transformamos um código que era assíncrono com callBack, o transformamos em uma promise e quando usamos o CO conseguimos fazer que essa função seja executada de uma forma que parece que ela é síncrona, mas na verdade é assíncrona. Podemos, por exemplo, ler dois arquivos ao invés de um:\n\nco(function* () {\nconst file = ['yarn.lock', 'package.json']\nfor (let i = 0; i &#x3C; file.length; i++) {\nlet contents = yield readFile(file[i])\nconsole.log(contents)\n}\n})\nExecutando esse código ele conseguiu carregar todos os arquivos em sequência. Imagine o quanto você consegue simplificar o seu fluxo de um programa assíncrono só utilizando o próprio CO e o generator function. Podemos também fazer uma lista de promises e depois retornar todos os arrays processados segurando o código com o yield. A vantagem disso é que criamos um paralelismo, fazendo com que as promises sejam executadas de forma paralela.",
      "description": "Neste handson, vamos utilizar uma ferramenta bastante útil no nosso dia a dia, o módulo CO, que é uma forma de controlar o fluxo das funções por meio de ge...",
      "keywords": [
        "function",
        "readfile",
        "file",
        "digo",
        "data",
        "fazer",
        "const",
        "contents",
        "https",
        "generator"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/modulo-co"
      }
    },
    {
      "id": "2d928d777cc86374",
      "url": "https://devpleno.com/blog/stateless-functional-component/index",
      "title": "Criando componente mais simples e eficaz em React (Part 2)",
      "content": "class App extends Component {\n    render() {\n        return (\n            <div className=\"App\">\n            <div className=\"App-header\">\n            <img src={logo} className=\"App-logo\" alt=\"logo\" />\n            <h2>Welcome to React</h2>\n            </div>\n            <div className=\"App-intro\">\n            <home name='Tulio' />\n            </div>\n        );\n    }\n}\n```\n\nPerceba que passei um props chamado name, e então fiz o destructor assignment, extraindo do objeto apenas o que eu quero. Também poderia colocar Props e props.name, funcionaria normalmente, mas como temos uma forma mais simplificada, não é necessário.\n\nPodemos fazer também alguma checagem. Não tem problema nenhum o componente ter uma condicional, desde que retorne o JSX.\n\nExiste uma premissa no React que quanto mais você utiliza o Stateless Functional Component, mais seu código vai estar otimizado.\n\nAssista o passo a passo desse hands-on:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/LA80dqopg1M\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "react",
        "home",
        "component",
        "import",
        "mais",
        "classname",
        "stateless",
        "functional",
        "from",
        "props"
      ],
      "metadata": {
        "title": "Criando componente mais simples e eficaz em React",
        "date": "2017-05-18",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "StatellesFunctional.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/stateless-functional-component/index.md"
      }
    },
    {
      "id": "2da7c70158090bea",
      "url": "https://devpleno.com/factory-function",
      "title": "Factory Function em JavaScript - DevPleno (Part 2)",
      "content": "console.log(tulio.count())\nAssim, conseguimos manter um estado para esse objeto porque temos uma closure sem nenhum this ou coisa desse sentido, com isso não temos problema nenhum de localização. Muita gente vai falar que não conseguimos o isolamento das variáveis, só que, na verdade, conseguimos sim utilizando closure. Vamos fazer um outro teste só que ao invés de chamar de count vou chamar de opa:\n\nfunction personFactory(name) {\nlet count = 0\n\nreturn {\nopa () => count++,\nname: name,\ntype: 'person'\n}\n}\n\nconst tulio = personFactory('Tulio')\n\nconst joao = personFactory('João')\n\nconsole.log(tulio.opa())\n\nconsole.log(tulio.opa())\nContinua funcionando normalmente, porém se eu tentar fazer um console.log(tulio.count), que teoricamente seria o count de fora, ele apareceria undefined porque está dentro da closure.\n\nQuando retornado, ele cria uma nova interface publica para o objeto e as únicas que temos é o opa, name e type. Então podemos utilizar para gerar como se fosse uma classe de uma maneira mais funcional ou quando queremos retornar um objeto com várias propriedades que queremos deixar um ou dois dinâmicos apenas, construindo uma factory de um objeto que é um pouco mais complexo.\n\nO factory em outras linguagens segue mais ou menos a mesma linha, a única diferença é que ele instancia realmente uma classe. Uma dica é que quando for pensar em programação funcional comece a restringir o uso do this, quanto mais longe estamos do this, mais próximo estamos da programação funcional.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Aprenda como usar Factory Functions em JavaScript para criar objetos sem classes. Exemplos práticos com closures e estado privado.",
      "keywords": [
        "tulio",
        "count",
        "name",
        "personfactory",
        "factory",
        "objeto",
        "para",
        "console",
        "javascript",
        "function"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/factory-function"
      }
    },
    {
      "id": "2db59c7cb35a060a",
      "url": "https://devpleno.com/blog/html-estatico-com-templates-ejs/index",
      "title": "Gerando HTML estáticos a partir de templates – EJS (Part 1)",
      "content": "Hoje quero mostrar como podemos utilizar os Templates Engines, que já temos no Express como EJS, PUG, etc, para gerar arquivos HTML estáticos. Com esse processo, conseguimos fazer um gerador de site estático tranquilamente. Obviamente já existem alguns sistemas que fazem isso, mas quero mostrar que também é possível utilizando somente essas linguagens de template. Eu já tenho um diretório criado, vou utilizar o EJS por ser mais parecido com JavaScript e fica mais fácil de utilizar:\n\n```jsx\nyarn add ejs\n```\n\nFeito isso, vamos criar um arquivo novo index.js. A ideia é criar um template de teste. Vamos supor que ele tenha o seguinte:\n\n```jsx\n<h1>Teste</h1>\n<p>Teste de paragrafo</p>\n```\n\nEntão, se eu colocar uma variável, como uma lista, eu posso fazer essa lista baseado em valores que eu mandei do meu script. A maneira mais comum de se utilizar o EJS é plugado-o dentro do express, porém nós também conseguimos utilizá-lo de forma independente, assim podemos simplesmente importar o EJS e, de alguma forma, dar um render nele:\n\n```jsx\nconst ejs = require('ejs')\nconst html = ejs.render('<h1><%= teste %></h1> ', { teste: 1234 })\nconsole.log(html)\n```\n\nSe rodarmos isso, nós temos o nosso html. Nós processamos o html dentro dele, que era uma variável e gerou uma string a partir disso. Isso é bastante poderoso porque se formos pensar, as páginas de um site estático nada mais são do que strings processadas. Vamos fazer outro teste:\n\n```jsx\nconst ejs = require('ejs')\nejs.renderFile(\n  './templete.ejs',\n  {\n    items: ['Tulio', 'Faria']\n  },\n  (err, html) => {\n    console.log(html)\n  }\n)\n```\n\nEntão estamos passando uma lista para items para ele jogar dentro do template, ao final disso, retorna um callback. Como estamos utilizando o items, podemos fazer o seguinte no nosso arquivo template.ejs:\n\n```jsx\n<h1>Teste</h1>\n<p>Teste de paragrafo</p>\n<ul>\n    <% items.forEach(i => {%>\n    <li><%= i %></li>\n    <% }) %>\n</ul>\n```",
      "keywords": [
        "html",
        "teste",
        "para",
        "template",
        "como",
        "podemos",
        "utilizar",
        "isso",
        "const",
        "items"
      ],
      "metadata": {
        "title": "Gerando HTML estáticos a partir de templates – EJS",
        "date": "2017-09-22",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "HtmlEstatico.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/html-estatico-com-templates-ejs/index.md"
      }
    },
    {
      "id": "2db96be4876e3fb3",
      "url": "https://devpleno.com/o-que-e-restful",
      "title": "Web Basic - RESTful - DevPleno (Part 1)",
      "content": "Fundamentos\n\n## Web Basic - RESTful\n\nT\nPor Tulio Faria • 15 de maio de 2017\n\n[Fundamentos](/tag/fundamentos)\n\nApenas para lembrar o que vimos no post anterior sobre arquitetura Web, existem as duas pontas da aplicação: o back-end e o frond-end e uma troca de mensagens entre eles.\n\nEntre essas duas camadas, há um padrão que é a forma que eles trocam essa mensagem. Quando o cliente fala com o server, temos o protocolo HTTP, o method diz algo como por exemplo “servidor, altere algo no servidor” (POST), mas temos outros tipos como Delete, Get, Put, etc.\nHá algum tempo, usávamos bastante o POST e o GET, que seria um formulário com POST ou um link com o GET (praticamente não usávamos os outros dois) mas com o tempo a aplicação foi evoluindo até que chegou em um ponto que começou a voltar um padrão para não precisarmos mais passar informação na URL que estamos chamando, pois o método já faz isso.\nAntigamente era comum, por exemplo, fazer um Script que se chamava usuários/save. Este save acaba não precisando ser assim, pois o POST já era feito para isso, com isso estávamos sendo redundantes. Assim, começamos a adotar um padrão chamado RESTful\n\n**O que é o RESTful?**",
      "description": "Apenas para lembrar o que vimos no post anterior sobre arquitetura Web, existem as duas pontas da aplicação: o backend e o frondend e uma troca de mensagen...",
      "keywords": [
        "para",
        "restful",
        "post",
        "https",
        "padr",
        "exemplo",
        "pois",
        "isso",
        "todos",
        "queremos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/o-que-e-restful"
      }
    },
    {
      "id": "2e22521b8c8f41a2",
      "url": "https://devpleno.com/npm-e-modulos-de-terceiros",
      "title": "NPM e Módulos de Terceiros - NodeJS - DevPleno (Part 2)",
      "content": "Note que quando formos instalar uma dependência, não precisa falar para todo mundo ‘olha, ele depende do String’, senão toda vez que for copiar o projeto para alguém e não copiar as dependências, tem que avisar qual vamos usar. Para evitar de ter que fazer isso, conseguimos colocar um Descriptor, onde já dizemos todas as dependências que tem no projeto.\n\nUma maneira bem fácil de fazer isso é utilizando o:\n\nnpm init\nEle irá perguntar qual o nome do projeto, qual o description, qual o entry point (que no nosso caso é o test.js), password, author, etc. No fim, ele gera um JSON e pergunta se eu quero salvar. Então ele gera as informações do projeto ali.\n\n**Qual a vantagem quando eu tenho um package.json?**\n\nVamos supor que eu fiz um teste com a minha lib. Se ele funcionar, então o inserimos como dependência.\n\n**Como fazemos isso?***\n\nnpm install string --save\nAlém de eu instalar a dependência, também estamos salvando ele no package.json. Se abrirmos ele na área e dependência vamos ver o módulo String.\n\nPerceba que ele tenta achar o major version e o mantém, por exemplo ‘3.3.1’ e pode atualizar para ‘3.4.1’. Ele faz isso para manter seu projeto estável. Isso serve para que quando for comitar esse código no git, você não coloque os módulos, pois caso você esteja rodando no Windows, quando fizer um npm install, alguns módulos compilam algumas coisas a mais como código em C.\n\nQuando baixar esse código em outra máquina, você só vai rodar o NPM install. O próprio NPM vai resolver os módulos e instalar as dependências. Por isso é importante termos as dependências dentro do package.json.\n\nTempos atrás, as pessoas programavam em Java e ainda não tinham tão definido alguns repositórios de dependência, então tinham que sair caçando as dependências. Atualmente, apenas com esses gerenciadores conseguimos fazer isso adicionando um descritor e isso deixa seu projeto muito mais organizado e independente de plataformas, já que não têm módulos extremamente dependentes de arquitetura.",
      "description": "O Node já vem com um gerenciador de pacotes chamado NPM (Node Package Mananger), com o qual é possível gerenciar todas as dependências de pacotes, então el...",
      "keywords": [
        "depend",
        "string",
        "dulos",
        "isso",
        "projeto",
        "para",
        "quando",
        "node",
        "qual",
        "ncias"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/npm-e-modulos-de-terceiros"
      }
    },
    {
      "id": "2e4580a8d97094de",
      "url": "https://devpleno.com/blog/ferias-e-feriados-trabalhando-por-meio-da-toptal/index",
      "title": "Férias e feriados trabalhando por meio da toptal",
      "content": "Muita gente me pergunta sobre a questão das férias e dos feriados quando se trabalha por meio da Toptal. Explico tudo neste vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/qfBXpVbPkhM\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais <a href=\"https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog\">sobre o DevReactJS aqui</a>.\n\n![DevReact](8aa14ebd-12a1-4290-90b2-f4906f1f1811.png)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "https",
        "responsive",
        "youtube",
        "mais",
        "profissionais",
        "devpleno",
        "sobre",
        "toptal",
        "classname"
      ],
      "metadata": {
        "title": "Férias e feriados trabalhando por meio da toptal",
        "date": "2018-02-16",
        "tags": "['Carreira']",
        "thumbnail": "FERIAS-E-FERIADOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/ferias-e-feriados-trabalhando-por-meio-da-toptal/index.md"
      }
    },
    {
      "id": "2e571634a59528bf",
      "url": "https://devpleno.com/clt-ou-pj",
      "title": "CLT ou PJ em Software - O que vale mais a pena? - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=CLT%20ou%20PJ%20em%20Software%20-%20O%20que%20vale%20mais%20a%20pena%3F&url=https%3A%2F%2Fdevpleno.com%2Fclt-ou-pj) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fclt-ou-pj)",
      "description": "Hoje eu gostaria de mostrar uma continha que eu acho bastante interessante quando vamos analisar ofertas de emprego, que o pessoal fala sobre CLT ou PJ. En...",
      "keywords": [
        "para",
        "como",
        "empresa",
        "custo",
        "exemplo",
        "https",
        "mais",
        "valor",
        "isso",
        "qual"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/clt-ou-pj"
      }
    },
    {
      "id": "2e6319d23f38fd5a",
      "url": "https://devpleno.com/codility",
      "title": "Codility: Como Resolver os Desafios e Passar nos Testes de Código - DevPleno (Part 2)",
      "content": "Ele não consegue fazer isso igual fazemos manualmente, ele tem uma estimativa de qual o custo desse algoritmo, ou seja, uma estimativa baseada no que ele percebe que você definiu de variáveis por causa da complexidade de espaço e, no caso de tempo, mede o tempo, então isso pode variar bastante. Isso é bom para ficarmos atentos para reduzirmos esse tempo de consumo, tanto de processador quanto de memória. Também em lessons, temos os materiais para ler e entender o assunto daquela lição especifica. É recomendável ler os materiais também, pois muita das técnicas computacionais mostradas ali são interessantes para relembrar.\n\nO Codility é tão simples quanto isso que eu mostrei. Quando você for fazer uma prova, alguém vai te mandar um link, você vai clicar e cair em uma prova específica da empresa, então ele escolhe a dificuldade das questões e define o tempo da prova inteira ou para cada questão.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Codility%3A%20Como%20Resolver%20os%20Desafios%20e%20Passar%20nos%20Testes%20de%20C%C3%B3digo&url=https%3A%2F%2Fdevpleno.com%2Fcodility) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcodility)",
      "description": "Guia prático para resolver desafios do Codility. Dicas, estratégias e exemplos de soluções para testes técnicos de programação.",
      "keywords": [
        "para",
        "codility",
        "fazer",
        "https",
        "temos",
        "lessons",
        "isso",
        "tempo",
        "algoritmos",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/codility"
      }
    },
    {
      "id": "2e731b9fd2da805e",
      "url": "https://devpleno.com/algoritmo-3n-1",
      "title": "Algoritmos: Problema 3n+1 - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Algoritmos: Problema 3n+1\n\nT\nPor Tulio Faria • 19 de fevereiro de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nCriando a solução em Javascript para o Problema 3n+1.Neste post continuamos a série de conteúdos sobre algoritmos. Principalmente sobre tipos de algoritmos que são utilizados em competições de programação e em entrevistas de emprego. O Problema 3n+1 foi retirado do livro Programming Challenges de Miguel Skiena. O objetivo do algoritmo é, dado i e j, como um intervalo de início e fim, achar o maior ciclo. O processo começa processando os valores de n. Se n é um número par, o próximo valor de n será n /2. Caso n seja impar, o próximo valor de n será 3 * n + 1. O algoritmo termina em n = 1. A ideia é calcular o número de passos até que n seja 1. Fazendo este processo entre i e j, e achando o maior número. Neste vídeo, explico um pouco melhor como funciona o algoritmo e como ele foi resolvido.\n\n[Veja no meu Gist](https://gist.github.com/tuliofaria/a92d387b68931d1294fddb1c4e259723)\n\nNão deixe de comentar com sua opinião, sugestão ou dúvida! E cadastre seu e-mail para receber nossas últimas novidades. Abraços!\n\nE aqui o algoritmo completo:\n\n{\nfunction cycleLen(n) {\nlet steps = 1\nwhile (n !== 1) {\nif (n % 2 === 0) {\nn = n / 2\n} else {\nn = 3 * n + 1\n}\nsteps++\n}\nreturn steps\n}\nfunction maxCycle(i, j) {\nlet max = cycleLen(i)\nfor (let k = i + 1; k &#x3C;= j; k++) {\nlet currentCycle = cycleLen(k)\nif (currentCycle > max) {\nmax = currentCycle\n}\n}\nreturn i + ' ' + j + ' ' + max\n}\nconsole.log(maxCycle(1, 10))\nconsole.log(maxCycle(100, 200))\nconsole.log(maxCycle(201, 210))\nconsole.log(maxCycle(900, 1000))\n}\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Criando a solução em Javascript para o Problema 3n+1.Neste post continuamos a série de conteúdos sobre algoritmos. Principalmente sobre tipos de algoritmos...",
      "keywords": [
        "algoritmos",
        "https",
        "maxcycle",
        "algoritmo",
        "console",
        "problema",
        "para",
        "como",
        "mero",
        "cyclelen"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/algoritmo-3n-1"
      }
    },
    {
      "id": "2e79cdb618b48786",
      "url": "https://devpleno.com/dotenv-e-variaveis-de-ambiente",
      "title": "Dotenv e variáveis de ambiente no NodeJS - DevPleno (Part 2)",
      "content": "require('dotenv').config()\nif (process.env.NODE_ENV !== 'production') {\nconsole.log('Desenvolvimento')\n} else {\nconsole.log('Produção')\n}\n\n// Retorno: Desenvolvimento\nQuando começamos a utilizar essas técnicas, a nossa aplicação fica muito mais independente, rodando em qualquer lugar, basta que você informe qual a configuração de banco de dados, Mongo, SQL, etc e ela vai se moldar para cada ambiente.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dotenv%20e%20vari%C3%A1veis%20de%20ambiente%20no%20NodeJS&url=https%3A%2F%2Fdevpleno.com%2Fdotenv-e-variaveis-de-ambiente) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdotenv-e-variaveis-de-ambiente)",
      "description": "Hoje eu tenho duas dicas, como podemos configurar uma aplicação sem precisar alterar o código fonte. Essa é uma boa prática, apesar de muita gente ainda nã...",
      "keywords": [
        "ambiente",
        "vari",
        "dotenv",
        "desenvolvimento",
        "https",
        "node",
        "arquivo",
        "veis",
        "podemos",
        "gente"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/dotenv-e-variaveis-de-ambiente"
      }
    },
    {
      "id": "2e91a18cd1226905",
      "url": "https://devpleno.com/programacao-assincrona",
      "title": "Programação Assíncrona - NodeJS Primeiros Passos - DevPleno (Part 1)",
      "content": "Javascript\n\n## Programação Assíncrona - NodeJS Primeiros Passos\n\nT\nPor Tulio Faria • 16 de junho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nContinuando nossa série sobre NodeJS, falando um pouco sobre como funciona a Programação Assíncrona do JS, vamos fazer alguns testes para você ver a diferença de como o JavaScript (e nesse caso alguns módulos do NodeJS) trabalham esse assincronismo.\n\n**Por que o assíncrono é tão interessante?**\n\nQuando temos uma tarefa ou alguma instrução que vamos fazer e ela pode ser demorada demais, por exemplo, se ela for um pouco diferente de qualquer estrutura de dados que estamos acostumados como IF e por ai vai, ele simplesmente deixa para executar quando os dados dessas operações estiverem disponíveis.\n\nComo exemplo, vamos ler um arquivo texto de modo síncrono e um de modo assíncrono e mostrar as vantagens disso. Em um novo arquivo, vamos criar um arquivo de texto ‘dados.txt’ e colocar dentro uma frase, “Conteúdo do arquivo texto.” Agora criamos um novo arquivoJS, importamos o FS, um módulo padrão no Node para manipulação do file system.\n\nvar fs = require('fs')\nvar contents = fs.readFileSyinc('dados.txt', 'utf8')\nconsole.log(contents)\nVamos salvar como Sync.js e mandar rodar usando o comando\n\nnode sync.js\nPerceba o seguinte: como a linha **“var contents = fs.readFileSyinc(‘dados.txt’, ‘utf8’);“**é síncrona, enquanto arquivo não for lido por completo ela não passa para a linha seguinte, isso pode ser legal ou não, dependendo do ponto de vista. Em linguagens que não são assíncronas como no JAVA ou PHP abrimos uma tread nova, ou seja uma linha de execução nova para caso chegue uma outra requisição não fique demorando muito para essa resposta demorar para o usuário. Na escala, isso é muito ruim. Imagine que apenas um usuário está usando, teremos pouco de prejuízo, mas se temos um sistema com 10 mil usuários ao mesmo tempo fazendo operações como essa, isso é muito problemático.",
      "description": "Continuando nossa série sobre NodeJS, falando um pouco sobre como funciona a Programação Assíncrona do JS, vamos fazer alguns testes para você ver a difere...",
      "keywords": [
        "para",
        "como",
        "vamos",
        "fazer",
        "dados",
        "opera",
        "ncrona",
        "ncrono",
        "contents",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/programacao-assincrona"
      }
    },
    {
      "id": "2ecc8668a348e4bc",
      "url": "https://devpleno.com/blog",
      "title": "Blog - DevPleno (Part 1)",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Ferramentas 5 de abr. de 2026 Como Usar o Describe Session do Claude Code para Conectar Projetos](/claude-code-describe-session)\n\n[Ferramentas 5 de abr. de 2026 Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente](/claude-code-otimizacao-arquivos)\n\n[Carreira 4 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)\n\n[Carreira 5 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)\n\n[Javascript 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)\n\n[Carreira 13 de mai. de 2021 A habilidade mais importante que um programador deveria ter (e praticar)](/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar)\n\n[Carreira 19 de mar. de 2019 Como as maratonas de programação da faculdade impactaram a minha carreira](/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira)\n\n[Carreira 1 de mar. de 2019 Sua carreira pode mudar durante o carnaval?](/sua-carreira-pode-mudar-durante-o-carnaval)\n\n[Carreira 21 de fev. de 2018 Primeiros passos na Toptal – Série Trabalho Remoto](/primeiros-passos-na-toptal)\n\n[Carreira 21 de fev. de 2018 Processo Seletivo da Toptal – Série Trabalho Remoto](/processo-seletivo-da-toptal)\n\n[Carreira 20 de fev. de 2018 Qual o projeto certo para estudar programação?](/projeto-certo-para-estudar-programacao)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "como",
        "para",
        "javascript",
        "programador",
        "2018",
        "ferramentas",
        "claude",
        "code",
        "sites"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/blog"
      }
    },
    {
      "id": "2f3fe119cd1c125a",
      "url": "https://devpleno.com/streams-parte-3-transform",
      "title": "Hands-on: Streams Parte 4 - Transform - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on: Streams Parte 4 - Transform\n\nT\nPor Tulio Faria • 10 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nContinuando nossa série sobre Streams, iremos falar sobre como podemos ligar um readable em um writable e vice-versa, e como criamos o tipo Transform. Primeiramente, para linkarmos um stream a outro, temos que importar o fs. Em seguida, criamos os Streams que vão ser linkados, por exemplo:\n\nconst fs = require('fs')\nconst readable = fs.createReadStream('arquivo.txt')\nconst writable = fs.createWritableStream('arquivo-2.txt')\nreadable.pipe(writable)\nCom isso, estamos vinculando o on data do Readable com o Write do Stream Writable. Ao executar o código acima, criaremos uma cópia do arquivo.txt.\n\n**Para que serve o Pipe?**\n\nO Pipe permite criar a saída de um Stream com a entrada de outro, o readable, que somente envia dados com o writable, que apenas recebe dados. Podemos utilizar vários Pipes de uma vez, como por exemplo:\n\nconst fs = require('fs')\nconst zlib = require('zlib')\nconst readable = fs.createReadStream('arquivo.txt')\nconst writable = fs.createWritableStream('arquivo-2.txt')\nconst zipper = zlib.createGzip()\nreadable.pipe(zipper).pipe(writable)\nCom a execução do código, iremos pegar esta saída do readable, jogar na entrada do zipper e a saída do zipper adicionando em writable. Lembrando que zlib já faz parte do core do Node, com isso é possível compactar usando apenas o mesmo.\n\n**O que o Zipper faz?**\n\nO Zipper é um Stream do tipo Transform, basicamente ele transforma a entrada em uma saída utilizando pipe. Podemos transformar estes dados a medida que utilizamos este pipe. É interessante que o readable seja a entrada e o Writable seja a saída. Vamos a outro exemplo para que fique mais claro:",
      "description": "Continuando nossa série sobre Streams, iremos falar sobre como podemos ligar um readable em um writable e viceversa, e como criamos o tipo Transform. Prime...",
      "keywords": [
        "transform",
        "const",
        "readable",
        "writable",
        "para",
        "stream",
        "pipe",
        "arquivo",
        "zipper",
        "criamos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/streams-parte-3-transform"
      }
    },
    {
      "id": "2f4b29add7c9c767",
      "url": "https://devpleno.com/blog/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs/index",
      "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS) (Part 2)",
      "content": "```jsx\n// Criar objeto Base64\nvar Base64={\\_keyStr:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",encode:function\n(e){var t=\"\";var n,r,i,s,o,u,a;var f=0;e=Base64.\\_utf8\\_encode(e);while(f<e.length){n=e.charCodeAt(f++);\nr=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}\nelse if(isNaN(i)){a=64}t=t+this.\\_keyStr.charAt(s)+this.\\_keyStr.charAt(o)+this.\\_keyStr.charAt(u)\n+this.\\_keyStr.charAt(a)}return t},decode:function(e){var t=\"\";var n,r,i;var s,o,u,a;var f=0;e=e.replace\n(/\\[^A-Za-z0-9+/=\\]/g,\"\");while(f<e.length){s=this.\\_keyStr.indexOf(e.charAt(f++));o=this.\\_keyStr.indexOf\n(e.charAt(f++));u=this.\\_keyStr.indexOf(e.charAt(f++));a=this.\\_keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=\n(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64)\n{t=t+String.fromCharCode(i)}}t=Base64.\\_utf8\\_decode(t);return t},\\_utf8\\_encode:function(e){e=e.replace\n(/rn/g,\"n\");var t=\"\";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}\nelse if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else\n{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}\nreturn t},\\_utf8\\_decode:function(e){var t=\"\";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);\nif(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode\n((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode\n((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}\n\n// Uma string qualquer\nvar string = 'DevPleno';\n\n// Convertendo para Base64\nvar emBase64 = Base64.encode(string);\nconsole.log(emBase64); // Saída: \"RGV2UGxlbm8=\"\n\n// Decode the String\nvar deBase64 = Base64.decode(emBase64);\nconsole.log(deBase64); // Saída: \"DevPleno\"\n```\n\n## Em NodeJS:",
      "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
      "keywords": [
        "string",
        "base64",
        "fromcharcode",
        "embase64",
        "keystr",
        "para",
        "charcodeat",
        "this",
        "charat",
        "console"
      ],
      "metadata": {
        "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS)",
        "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
        "date": "2016-10-04",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "javascript-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs/index.md"
      }
    },
    {
      "id": "2f56fb73c6dc70d6",
      "url": "https://devpleno.com/algoritmos-contar-numeros-negativos",
      "title": "Algoritmos: Contar números negativos - DevPleno",
      "content": "Algoritmos\n\n## Algoritmos: Contar números negativos\n\nT\nPor Tulio Faria • 3 de março de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nContinuando nossa série sobre algoritmos que caem em entrevistas e competições, neste vídeo falo sobre Contar Números Negativos, que já caiu em entrevistas da Amazon. Então fique ligado no vídeo:\n\nconfira o codigo abaixo:\n\nconst input = [[-3, -2, -1, 1],\n[-2, 2, 3, 4],\n[4, 5, 7, 8]]\n\nfunction countNegative(input) {\nlet line = 0\nlet column = input[line].length - 1\nlet count = 0\nwhile (line &#x3C; input.length &#x26;&#x26; column >= 0) {\nif (input[line][column] &#x3C; 0) {\ncount += column + 1\nline++\n} else {\ncolumn--\n}\n}\nconsole.log(input[line][column])\n}\n\ncountNegative(input[line][column])\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Algoritmos%3A%20Contar%20n%C3%BAmeros%20negativos&url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-contar-numeros-negativos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-contar-numeros-negativos)",
      "description": "Continuando nossa série sobre algoritmos que caem em entrevistas e competições, neste vídeo falo sobre Contar Números Negativos, que já caiu em entrevistas...",
      "keywords": [
        "input",
        "line",
        "column",
        "algoritmos",
        "https",
        "contar",
        "negativos",
        "meros",
        "sobre",
        "entrevistas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/algoritmos-contar-numeros-negativos"
      }
    },
    {
      "id": "2f571d146a0d1de0",
      "url": "https://devpleno.com/blog/expressoes-regulares/index",
      "title": "3 Padrões para Iniciar com Expressões Regulares (RegExp) (Part 1)",
      "content": "Hoje venho trazer três padrões de expressões regulares que você pode utilizar para checar se uma string parece com algo. O que é expressão regular? É uma forma que temos de tentar achar um padrão dentro de um texto.\n\nAgora vou mostrar como funciona uma expressão regular utilizando três formas que são muito úteis para checar se uma string começa com alguma coisa, se ela termina com alguma coisa ou se no meio dela tem algo que pode ser alternado:\n\n```jsx\nconst str1 = 'Olá DevPleno'\n\nconst pattern1 = new RegExp('^Ol')\n\nconsole.log(pattern1.test(str1))\n```\n\nToda vez que eu uso, dentro da expressão regular, o circunflexo, eu indico que estou travando o início da string. Por exemplo, se eu quero saber se a string começa com “Olá” basta criar a expressão baseada em “Ol”. Nesse nosso caso será retornado True, pois ele começa com “Ol”. O segundo padrão que vou mostrar é quando terminamos com outro padrão:\n\n```jsx\nconst pattern2 = new RegExp('DevPleno$')\n\nconsole.log(pattern2.test(str1))\n```\n\nAssim ele irá retornar o True novamente, pois ele termina com “DevPleno”, caso a gente modifique e coloque, por exemplo, um 's' no fim da string vai ser retornado false. Lembrando que travamos o fim da string utilizando o $.\n\nAgora o último padrão. Imagine o seguinte: se quiséssemos encontrar um padrão no meio, utilizando ou um ou outro:\n\n```jsx\nconst str1 = 'Olá oi DevPleno'\n\nconst pattern3 =  new RegExp('Olá (oi|tchau) DevPleno')\n\nconsole.log(\n  '====' ,\n  pattern3.test('Olá Mundo')\n  pattern3.test('Olá oi DevPleno')\n  pattern3.test('Olá tchau DevPleno')\n  pattern3.test('Olá opa DevPleno')\n)\n```\n\nPerceba que temos false para o primeiro, true para o segundo, true para o terceiro e false para o último. Esses são padrões que já podemos combinar entre eles, por exemplo, começar com o “Olá” e terminar com o “DevPleno”.\n\nIsso é algo muito poderoso. Essas são dicas para dar os primeiros passos se você nunca ouviu falar de expressão regular.\n\nConfira o video:",
      "keywords": [
        "devpleno",
        "para",
        "padr",
        "express",
        "string",
        "test",
        "const",
        "pattern3",
        "regular",
        "come"
      ],
      "metadata": {
        "title": "3 Padrões para Iniciar com Expressões Regulares (RegExp)",
        "date": "2017-08-21",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "EXPRESSÕES-REGULARES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/expressoes-regulares/index.md"
      }
    },
    {
      "id": "2fbc822c29607a65",
      "url": "https://devpleno.com/blog/confira-4-dicas-de-ux-para-programadores/index",
      "title": "Confira 4 dicas de UX para programadores (Part 1)",
      "content": "Você já tentou usar um aplicativo e desistiu porque não conseguia encontrar as informações corretas ou um botão não funcionava por não ser responsivo para celular? Em quanto tempo você desistiu? Você voltaria a usar essa marca ou indicaria para os seus amigos?\n\nNão é segredo que os consumidores estão cada vez mais exigentes, principalmente quando falamos dos mais jovens e conectados. A quantidade de opções faz com que o cliente deseje mais do que o básico; ele quer produtos simples de usar, intuitivos e que entregam mais do que prometem.\n\nNesse contexto, o termo UX (Experiência do Usuário) tem se destacado como um dos objetivos centrais que direcionam os produtos para atender a esse novo público. As empresas cada vez mais criam seus produtos para oferecer uma experiência completa para os clientes, a fim de conquistá-los e fidelizá-los.\n\nSe você é programador, deve estar se perguntando:_mas o que eu tenho com isso? Eu só desenvolvo o produto, não sou responsável pela experiência._\n\nÉ exatamente aí que você está enganado. Hoje,[ profissionais completos](https://www.devpleno.com/desenvolvedor-full-stack-o-que-e-e-como-se-tornar?utm_source=blog&utm_campaign=rc_blogpost) de TI possuem pelo menos noções básicas de UX e as usam para entregar plataformas mais eficientes, que colaboram para uma boa experiência do usuário. Afinal, você contribui para criar um produto que pode ou não fornecer uma experiência única para os clientes.\n\nPensando nisso, reunimos todas as informações e dicas de UX, para que você seja um profissional mais completo e atinja suas [metas](https://www.devpleno.com/metas-na-carreira-de-desenvolvedor?utm_source=blog&utm_campaign=rc_blogpost). Vamos lá?\n\n## O que é UX?\n\nAntes de mais nada, você precisa compreender o que é essa técnica e como ela se difere de UI (User Interface). Ambas as técnicas são confundidas, mesmo sendo coisas bem distintas. Confira!\n\n### User Experience (UX)",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "produto",
        "informa",
        "https",
        "source",
        "blog"
      ],
      "metadata": {
        "title": "Confira 4 dicas de UX para programadores",
        "date": "2017-10-06",
        "tags": "['Carreira']",
        "thumbnail": "117637-confira-4-dicas-de-ux-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/confira-4-dicas-de-ux-para-programadores/index.md"
      }
    },
    {
      "id": "30293c087fc4d82f",
      "url": "https://devpleno.com/blog/hands-on-yarn/index",
      "title": "Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM) (Part 2)",
      "content": "Uma coisa que chateia bastante em projetos grandes é a ordem em que os pacotes são instalados. No NPM, ele segue uma forma não determinística, se rodarmos duas vezes com as mesmas circunstâncias, pode acontecer dos pacotes serem instalados em uma ordem diferente, o yarn resolve isso e ainda gera um checkson para cada dependência, então ele checa realmente se você está instalando a mesma versão que você travou no projeto. Além disso, é muito simples de verificar o yarn.lock, afinal é um arquivo texto bem simples.\n\nTambém podemos colocar:\n\n```jsx\nyarn global add nome-do-pacote\n```\n\nCom isso ele deixa em escopo global.\n\nEntão ele é muito bom para aumentar a velocidade de instalação, principalmente no servidor de continuous integration porque, a medida que o servidor vai cacheando os módulos, é possível fazer o build da sua aplicação muito mais rápido.\n\nApenas por curiosidade, o Yarn foi desenvolvido pelo facebook em parceria com o google porque eles perceberam exatamente isso, quando você começa a escalar o projeto e aumentar o número de dependências, o npm começa a atrapalhar um pouco.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/3BPfDo4arHc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "yarn",
        "isso",
        "fazer",
        "projeto",
        "para",
        "temos",
        "instala",
        "depend",
        "mais",
        "package"
      ],
      "metadata": {
        "title": "Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM)",
        "date": "2017-08-10",
        "tags": "['Javascript']",
        "thumbnail": "Yarn.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-yarn/index.md"
      }
    },
    {
      "id": "3033a1f7d490083a",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-5/index",
      "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar (Part 2)",
      "content": "Quando trabalhamos em escala, pensamos exatamente isso, máquinas menores, mas trabalhando juntas, com isso conseguimos ligar e desligá-las de maneira mais satisfatória, então se você tiver um pico de acesso é possível aumentar o número de máquinas e diminuir caso caia o número de acesso.\n\nEm seguida, escolhemos qual a região que queremos, eles não têm na América do Sul, então obviamente eu deixo no padrão de New York, não mexo em mais nada, apenas ativo o monitoramento.\n\n![Exemplo 3](socketpart5Ex3.png)\n\nE no nome vou colocar placar-online.\n\nEm seguida vou dar um Create (o legal do digital ocean é que ele é muito rápido para criar). Terminando, ele vai enviar um email com os dados do servidor, nome de usuário e senha.\n\nVamos fazer alguns testes, primeiro precisamos acessar a máquina com o ssh primeiro para poder depois enviar os arquivos, então vamos copiar o ip - no caso do Mac, a gente consegue acessar o ssh direto. No caso do Windows, vou mandar um e-mail para você de como fazemos esse acesso usando o putty.\n\nSe você estiver utilizando o comander no Windows, é possível fazer da mesma forma que vamos fazer agora.\n\nVamos lá, primeiro damos o comando:\n\n```jsx\nSSH root@IpDoServidor\n```\n\nLembrando que é muito importante que coloquei **root@**, porque senão ele vai tentar logar com o usuário da sua máquina. Em seguida, ele pede a senha (basta só colocar a senha, ele irá pedir para trocar a senha no primeiro acesso).\n\nAgora já estou no placar online, vamos **em cd/opt/** e aqui já temos uma pasta digital ocean, vamos criar outra com **mkdir placar-online** e dar um cd nela.\n\nPor enquanto, essa parte eu vou parar por aqui e vou abrir o fileZilla que será um processo igual para os dois, tanto Mac quanto Windows e colocar o ip do meu servidor, login root e senha:\n\n![Exemlplo 4](socketpart5Ex4.png)",
      "keywords": [
        "para",
        "vamos",
        "como",
        "fazer",
        "isso",
        "quina",
        "agora",
        "temos",
        "colocar",
        "projeto"
      ],
      "metadata": {
        "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar",
        "date": "2017-07-11",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "SocketIOpart5.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/minicurso-socket-io-parte-5/index.md"
      }
    },
    {
      "id": "306c32a07e41f36e",
      "url": "https://devpleno.com/minicurso-socket-io-parte-2",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO - DevPleno (Part 1)",
      "content": "Javascript\n\n## Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO\n\nT\nPor Tulio Faria • 6 de julho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNa [primeira aula do minicurso de Sockt.IO](https://www.devpleno.com/minicurso-socket-io-parte-1/), fizemos a listagem dos jogos puxando do banco de dados baseado em json e quando clicamos conseguimos visualizar os dados dos jogos. Agora vamos adicionar o Socket.IO realmente a essa interface, configurando a parte do client e do server. Vamos começar pela parte do servidor, primeiramente vamos adicionar o Socket.IO:\n\nyarn add socket.io\nDepois que ele adicionar, vou abrir o app.js do express e fazer algumas alterações, a primeira delas é adicionar um app.io e dar um require no Socket.IO já chamando o construtor dele. Como não temos o servidor, deixamos por enquanto, como se fosse uma promise que vamos criar o servidor depois.\n\napp.io = require('socket.io')()\nFeito isso, eu vou alterar o www para poder anexar ao Socket.IO. Abrindo o www, perceba que temos um server e uma instancia daquele app, vamos adicionar à instancia desse app a instancia do Socket.IO passando o server que definimos\n\nvar server = http.createServer(app)\napp.io.attach(server)\nAgora ele vai conseguir responder nesse server. De alguma forma, precisamos conectar as coisas, então vamos no partials que já tem algo pronto:\n\n&#x3C;script src='/socket.io/socket.io.js'>&#x3C;/script>\nPerceba que eu já deixei a inclusão do /socket.io, que é o JavaScript que faz a parte client do Socket.IO. Vamos olhar na rede se o JavaScript está realmente sendo carregado corretamente. Ao clicar nele, perceba que ele já mostra o font do Socket.IO:",
      "description": "Na primeira aula do minicurso de Sockt.IO, fizemos a listagem dos jogos puxando do banco de dados baseado em json e quando clicamos conseguimos visualizar ...",
      "keywords": [
        "vamos",
        "socket",
        "admin",
        "index",
        "para",
        "const",
        "dentro",
        "temos",
        "criar",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-2"
      }
    },
    {
      "id": "30a2fd0cf38eb875",
      "url": "https://devpleno.com/por-que-todo-dev-usa-mac",
      "title": "Por que todo Dev usa Mac? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Por que todo Dev usa Mac?\n\nT\nPor Tulio Faria • 15 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nUma pergunta comum que sempre me fazem é: Por que a maioria dos desenvolvedores usa Mac?\n\nBom, vou comentar algumas coisas que eu vejo. O primeiro motivo é moda, afinal é uma máquina que te garante um status. Se você chega em uma reunião com um notebook ruim, não transmite a autoridade que precisa, uma vez que, como desenvolvedores, lidamos com máquinas o dia todo, o que pressupõe-se que temos uma máquina boa.\n\n**Por que eu uso MAC?**\n\nEu uso Mac hoje porque sou programador IOS a maior parte do tempo. Crio aplicativos utilizando o React native para Android e para IOS, e não é possível fazer isso no Windows ou Linux. Já tentei todos os hacks possíveis, como rodar em uma maquina virtual, comprei até uma maquina melhor para isso, com 32GB de ram e rodar um Mac virtual com 16gb, mesmo assim não é a mesma experiência, pois na hora de testar algumas animações, o emulador do IOS não fica tão bem quanto na máquina nativa. Outra coisa que acontece é que, quando vamos tentar emular o android dentro do emulador do IOS, já não funciona mais, não é possível emular dentro de um emulador. Isso começou a me atrasar muito.\n\nSe você faz aplicativos para IOS, tem algumas saídas como alguns serviços em que é possível alugar um Mac online para publicar seu aplicativo através dele, ou então contratar um serviço de build, mas isso só funciona quando estamos fazendo algum aplicativo utilizando o ionics ou react-native, não é possível fazer com objetive C sem ter um Mac, afinal como você vai emular?\n\nOutro motivo é que o Mac é unix like, ou seja, ele é baseado em unix, então muitas coisas feitas no servidor e aplicativos no shell funcionam muito bem, já que ele é muito parecido com o Linux. Por isso quando existe a migração de Windows para o Mac, você sente muita diferença, pois com ele é possível automatizar mais coisas.",
      "description": "Uma pergunta comum que sempre me fazem é: Por que a maioria dos desenvolvedores usa Mac? Bom, vou comentar algumas coisas que eu vejo. O primeiro motivo é ...",
      "keywords": [
        "para",
        "muito",
        "como",
        "poss",
        "isso",
        "https",
        "todo",
        "quina",
        "aplicativos",
        "windows"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/por-que-todo-dev-usa-mac"
      }
    },
    {
      "id": "30c43b538defc405",
      "url": "https://devpleno.com/blog/fs-watch/index",
      "title": "FS-Watch - Checando mudanças em um arquivo-diretório (Part 1)",
      "content": "Hoje eu quero mostrar duas funcionalidades que nós temos no FS padrão no Node e que podem ajudar bastante em alguns tipos de situações, como por exemplo checar se algum arquivo de log foi gerado em um diretório ou, às vezes, um arquivo de exportação.\n\nPrimeiramente temos uma pasta criada, nele vou criar um arquivo novo chamado fs-watch.js e fazer o seguinte:\n\n```jsx\nconst fs = require('fs')\n```\n\nDentro do próprio FS eu tenho duas possibilidades: o watchFile, onde eu posso checar se um arquivo está sendo alterado:\n\n```jsx\nfs.watchFile('file.txt', (curr, next) => {\n  console.log(curr, next)\n})\n```\n\nBasicamente ele vai mostrar para o que mudou em cada alteração do arquivo, por exemplo, se rodarmos ele, editar o arquivo file.txt e salvar, vai ser mostrado o que foi mudado. Se colocarmos apenas o size, podemos ver como era atualmente e anteriormente esse mesmo arquivo:\n\n```jsx\nfs.watchFile('file.txt', (curr, prev) => {\n  console.log(curr.size, prev.size)\n})\n```\n\nAssim, sempre que mudarmos o número de caracteres do arquivo, ele vai mostrar o quanto nós temos agora e o quanto tinha anteriormente.\n\nEssa é uma das formas que temos de saber se o arquivo foi ou não alterado. O que podemos fazer com isso? Podemos, por exemplo, fazer um WatchFile simplesmente para saber se o atual é maior que o anterior, pensando em arquivos de log, geralmente colocamos no final para caso haja algum incremento no arquivo, com isso é possível saber quantos bytes foram adicionados.\n\nOutra forma que temos de fazer é utilizando o fs.watch(). Com ele podemos checar um diretório contra mudanças:\n\n```jsx\nfs.watch('./', (changeType, file) => {\n  console.log('change', changeType, file)\n})\n```\n\nAo fazermos isso, ele vai checar nesse diretório qualquer arquivo que foi alterado, assim temos bastante precisão neste tipo de operação.\n\nConfira o video:",
      "keywords": [
        "arquivo",
        "temos",
        "file",
        "checar",
        "fazer",
        "watchfile",
        "curr",
        "para",
        "podemos",
        "embed"
      ],
      "metadata": {
        "title": "FS-Watch - Checando mudanças em um arquivo-diretório",
        "date": "2017-10-17",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "FS-WATCH-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/fs-watch/index.md"
      }
    },
    {
      "id": "30ff63e75ec668ff",
      "url": "https://devpleno.com/confira-4-dicas-de-ux-para-programadores",
      "title": "Confira 4 dicas de UX para programadores - DevPleno (Part 3)",
      "content": "Portanto, se você quer ser um profissional de destaque no mercado e não ficar para trás, ou até mesmo ser um [empreendedor](https://www.devpleno.com/empreender-na-area-de-software?utm_source=blog&#x26;utm_campaign=rc_blogpost), você precisa ter pelo menos noções básicas de UX e colocá-las em seus projetos.\n\nAbaixo, listamos quatro dicas para você começar esse processo.\n\n### 1. Entenda o seu consumidor\n\nVocê claramente não constrói um software para uso próprio na empresa, certo? Toda solução é construída para resolver algum problema para um público específico, e você, como programador responsável pelo produto, deve conhecer quem são essas pessoas, para criar uma solução que faça sentido para elas.\n\nSaiba quem é o usuário ideal do seu produto, quais são seus gostos, qual o problema que ele está solucionando e como se comporta dentro de plataformas. Descubra informações sobre como ele usaria a sua solução e utilize esses dados como base para desenvolver o produto.\n\nÉ garantido que as áreas de marketing e vendas podem fornecer todas as informações sobre quem são os clientes que utilizam o produto, e aqui introduzimos nossa próxima dica.\n\n### 2. Trabalhe com as demais áreas de empresa\n\nSe a experiência do usuário não depende só de marketing ou vendas, ela é responsabilidade de toda a empresa e deve ser pensada em conjunto. É óbvio que você deve trabalhar com as demais áreas para desenvolver a solução com a melhor experiência para os clientes, certo?\n\nUma boa dica é, antes de começar a desenvolver, fazer uma reunião de alinhamento com as áreas de marketing, vendas e design para definir um road map do produto, que considera o que é mais importante para impactar a experiência do usuário de forma positiva.",
      "description": "Você já tentou usar um aplicativo e desistiu porque não conseguia encontrar as informações corretas ou um botão não funcionava por não ser responsivo para ...",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "https",
        "produto",
        "dicas",
        "informa",
        "source"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/confira-4-dicas-de-ux-para-programadores"
      }
    },
    {
      "id": "317f49f484a633ef",
      "url": "https://devpleno.com/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples",
      "title": "Json-server - Como criar uma REST API para testes de forma simples - DevPleno (Part 1)",
      "content": "Javascript\n\n## Json-server - Como criar uma REST API para testes de forma simples\n\nT\nPor Tulio Faria • 31 de julho de 2017\n\n[Javascript](/tag/javascript)\n\nNeste hands-on onde vou mostrar uma ferramenta que é bastante interessante no dia a dia, o Json-server.\n\nPrimeiro vamos instalar:\n\nnpm install -g json-server\n**O que ele faz?**\n\nMuitas vezes estamos criando uma aplicação apenas front-end, como React ou Angular e ele é uma rest API para podermos testar, trazer dados, alterar esses dados, etc. Ele permite que a gente faça isso de uma forma muito simples.\n\nVou criar um novo arquivo, por exemplo db.json, e dentro dele vou colocar o seguinte:\n\n{\n\"produtos\": [{\"id\": 1, \"name\": \"bike\"}]\n}\nCriamos uma base de produtos onde tenho uma bicicleta com o ID 1. Com isso posso ir por exemplo no Shell e escrever:\n\njson-server --watch db.json\nEle retorna que já temos um recurso, que é:\n\nhttps://localhost:3000/produtos\nEsse produto é o key que foi criado, que seria como se fosse nosso banco de dados. Se abrirmos o [Postman](https://www.devpleno.com/postman-como-testar-apis/) para testar, podemos colar essa url e dar um get, ele irá retornar nosso json.\n\nEntão podemos fazer uma requisição em jQuery, por exemplo, que ele já baixa. O mais legal é que podemos criar um produto novo copiamos o retorno do nosso get:\n\n{\n\"id\": 1,\n\"name\": \"bike\"\n}\nE depois mudamos o parâmetro para post e vamos postar um produto com ID 2. No body, temos que colocar que ele será em Raw\n\n{\n\"id\": 2,\n\"name\": \"carrinho\"\n}\nSe clicarmos em Send e voltarmos a dar um Get, ele retorna os dois produtos, então eu consigo criar um registro e retornar esse registro apenas fazendo isso. Podemos também fazer com um ID direto dessa maneira:\n\nhttps://localhost:3000/produtos/1\nEle retornará apenas o ID 1.\n\nPerceba que ele transforma um Json em um banquinho de dados para podermos testar. À medida que vamos trocando, percebemos que o Json vai mudando também, então podemos criar essas alterações de uma forma persistida.",
      "description": "Neste handson onde vou mostrar uma ferramenta que é bastante interessante no dia a dia, o Jsonserver. Primeiro vamos instalar: O que ele faz? Muitas vezes ...",
      "keywords": [
        "para",
        "json",
        "https",
        "server",
        "criar",
        "como",
        "forma",
        "podemos",
        "produtos",
        "rest"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples"
      }
    },
    {
      "id": "3185e69fb5e643d9",
      "url": "https://devpleno.com/hands-low-db",
      "title": "Hands-on: Low-db - DevPleno",
      "content": "Javascript\n\n## Hands-on: Low-db\n\nT\nPor Tulio Faria • 24 de abril de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste hands-on, um módulo muito interessante para termos um banco de dados bem simples baseado em Json. Uma boa alternativa para aplicações desktop/electron e para guardar configurações de aplicações.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Low-db&url=https%3A%2F%2Fdevpleno.com%2Fhands-low-db) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-low-db)",
      "description": "Neste handson, um módulo muito interessante para termos um banco de dados bem simples baseado em Json. Uma boa alternativa para aplicações desktop/electron...",
      "keywords": [
        "https",
        "para",
        "javascript",
        "hands",
        "nodejs",
        "aplica",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fhands"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-low-db"
      }
    },
    {
      "id": "324e9313e344baad",
      "url": "https://devpleno.com/blog/validade/index",
      "title": "Validade de um projeto/ideia/ação (Part 2)",
      "content": "Muitas pessoas dizem \"mas você não quer ganhar dinheiro?, mas esquecem que tem várias contas que você tem que fazer e pensar por fora além disso. Um exemplo interessante: eu já recebi várias propostas de trabalho no exterior, muitas vezes é para receber um salário inferior ao que eu consigo gerar de resultado aqui no Brasil, então temos que ver o custo dessa oportunidade, que é a validade. Quando eu tiver uma estabilidade financeira, posso arriscar mais e ter essa nova experiência. Isso é muito importante, pois quando você chegar nesse ponto não vai ser a dor que vai fazer você tomar a decisão e sim a validade que você colocou quando estava confortável para decidir aquilo.\n\nQuando você está fazendo sua empresa dar certo, por exemplo, se você definir a validade no momento em que você está passando aperto, não é a validade que está fazendo você tomar a decisão e sim a dor, por isso é importante fazer a validade antes que você passe por aquela situação.\n\nEntão toda vez que você for começar um projeto novo, uma empreitada nova, atender um cliente novo, qualquer coisa que dependa da sua energia, defina uma validade.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Yujkc1YpTtE\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "validade",
        "quando",
        "projeto",
        "cliente",
        "isso",
        "muito",
        "esse",
        "coisas",
        "importante"
      ],
      "metadata": {
        "title": "Validade de um projeto/ideia/ação",
        "date": "2017-09-06",
        "tags": "['Carreira']",
        "thumbnail": "Validade.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/validade/index.md"
      }
    },
    {
      "id": "327dddaf209438e7",
      "url": "https://devpleno.com/devreactjs-li3",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-li3 to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-li3"
      }
    },
    {
      "id": "32d7649ea4d79d10",
      "url": "https://devpleno.com/blog/es6-default-parameters/index",
      "title": "Javascript - ES6 Default Parameters (Part 2)",
      "content": "```jsx\nfunction aplicarImpostES6(valor, imposto = 0.07) {\n  return valor + valor * imposto\n}\n\nconsole.log(aplicarImpostoES6(100, 0.1))\n\nconsole.log(aplicarImpostoES6(200))\n\nconsole.log(aplicarImpostoES6(300, 0))\n```\n\nCom isso fica um pouco mais simples, porém podemos ir um além. Vamos supor que eu tenha um adicional, posso colocar esse adicional passando um valor, ou ele é um valor vezes o imposto mais porcentagem:\n\n```jsx\nfunction aplicarImpostES6(\n  valor,\n  imposto = 0.07,\n  adicional = valor * (imposto + 0.1)\n) {\n  return valor + valor * imposto + adicional\n}\n\nconsole.log(aplicarImpostoES6(100, 0.1, 0))\n\nconsole.log(aplicarImpostoES6(200))\n\nconsole.log(aplicarImpostoES6(300, 0, 0))\n```\n\nNo primeiro e último setei adicional como 0, então apenas no 200 ele vai aplicar os 10% além dos 7% já colocados antes. Essas são possibilidades interessantes de utilizar o default parameters no ES6, isso aumenta muito as possibilidades no nosso código.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/1QiaCrc-fms\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "imposto",
        "valor",
        "console",
        "aplicarimposto",
        "isso",
        "para",
        "aplicarimpostoes6",
        "como",
        "function",
        "return"
      ],
      "metadata": {
        "title": "Javascript - ES6 Default Parameters",
        "date": "2017-10-10",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Default-Parameters-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/es6-default-parameters/index.md"
      }
    },
    {
      "id": "32f66efe2b7b958e",
      "url": "https://devpleno.com/blog/como-criar-e-reutilizando-seus-proprios-modulos/index",
      "title": "Como criar e reutilizar seus módulos no NodeJS com Git (Part 2)",
      "content": "Agora vamos dar um commit e push. Se formos agora em meu repositório, ele já vai estar lá. Nós podemos utilizar a URL do repositório como dependência do projeto. Para isso, vamos voltar um diretório e criar um novo diretório 'meuprojeto', acessamos ele e damos um npm init, em seguida um install passando o link do github:\n\n```jsx\nnpm install --save <url-copiado-aqui>\n```\n\n![Package.json](b77e70a1-ca40-4c94-ad2e-65b8b2a1016b.png)\n\nEm uma próxima aula vamos criar um repositório e publicar no NPM. Primeiramente queria apenas mostrar que podemos publicar um módulo sem ser pelo npm.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/t24_DGvUa30\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "reposit",
        "vamos",
        "para",
        "criar",
        "podemos",
        "como",
        "agora",
        "embed",
        "depend",
        "ncia"
      ],
      "metadata": {
        "title": "Como criar e reutilizar seus módulos no NodeJS com Git",
        "date": "2017-11-29",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "criar-e-reutilizar-seus-próprios-módulos-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/como-criar-e-reutilizando-seus-proprios-modulos/index.md"
      }
    },
    {
      "id": "331fca412490c14e",
      "url": "https://devpleno.com/blog/high-order-functions/index",
      "title": "High-order Functions (Part 2)",
      "content": "High-order functions é um conceito muito importante para podermos injetar comportamento em uma função, esse é o grande ponto delas. Podemos compor funções que são muito mais simples, e isso é muito importante não só em programação funcional mas principalmente para simplificar as funções.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/yST5SzsFXZI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "num2",
        "num1",
        "order",
        "high",
        "function",
        "para",
        "functions",
        "console",
        "exemplo",
        "mathoperator"
      ],
      "metadata": {
        "title": "High-order Functions",
        "date": "2017-04-07",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "HighrOrder.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/high-order-functions/index.md"
      }
    },
    {
      "id": "3333d91121bd6f52",
      "url": "https://devpleno.com/blog/shelljs/index",
      "title": "ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux (Part 1)",
      "content": "Neste hands-on, vou falar mais especificamente sobre o ShellJS, uma implementação do Shell do linux em JavaScript.\n\nQual a vantagem do ShellJS?\n\nA grande vantagem é que ele é multiplataforma, então podemos criar nossos códigos independente da plataforma. Caso a gente queira, por exemplo, criar um catch no arquivo para ver o conteúdo dele, podemos fazer isso tanto no Mac, quanto no Windows ou no Linux da mesma forma. Isso é muito legal para construir um sincronizador de log, por exemplo, ou alguma ferramenta que é só para uso interno.\n\nPara utilizar o ShellJS precisamos primeiro instalar a ferramenta:\n\n```jsx\nyarn add shelljs\n```\n\nVou criar um arquivo novo teste1.js, e importar o o shell e usar o cat para ver o arquivo, por exemplo:\n\n```jsx\nconst sh = require('shelljs')\nconst contents = sh.cat('arq1.txt')\nconsole.log(contents.toString())\n```\n\nLembrando que estamos fazendo isso em multiplataforma, então se eu rodar o cat direto, pode ser que eu não consiga o mesmo resultado. Isso vale para todos os outros comandos, por exemplo copiar um arquivo:\n\n```jsx\nconst sh = require('shelljs')\nsh.cp('arq1.txt', 'arq2.txt')\n```\n\nÉ muito legal quando conseguimos fazer esse tipo de código que funciona em todas as plataformas, isso gera mais liberdade para construir nossos scripts que dependem de algum IO ou Shell virtual. Vamos supor que eu quisesse copiar um diretório de forma recursiva:\n\n```jsx\nsh.cp('-R', 'node_modules', 'mods')\n```\n\nEle replicou exatamente como nós queremos fazer no Shell do Linux. Uma curiosidade é que ele transforma esse código em síncrono, ele usa por baixo dos panos assíncrono, mas a interface que o Shell lida pra gente é síncrona, o que deixa muito mais fácil de fazer e construir os scripts.\n\nNós utilizamos bastante em alguns projetos para, por exemplo, transformar dados, conectar no banco, atualizar o banco, manipular grandes quantidades de dados, etc.",
      "keywords": [
        "para",
        "shelljs",
        "shell",
        "exemplo",
        "isso",
        "arquivo",
        "fazer",
        "embed",
        "mais",
        "linux"
      ],
      "metadata": {
        "title": "ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux",
        "date": "2017-08-06",
        "tags": "['Javascript']",
        "thumbnail": "ShellJS.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/shelljs/index.md"
      }
    },
    {
      "id": "3336587778663cd1",
      "url": "https://devpleno.com/minicurso-socket-io-parte-1",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto - DevPleno (Part 4)",
      "content": "Perceba que existe um parcial, que é uma técnica muito legal que ao invés de ficarmos fazendo e repetindo o cabeçalho, criamos alguns elementos que só importamos e ele já resolve esses arquivos. Então, também dentro dos arquivos de apoio, vamos copiar a pasta partials e adicionar nos arquivos de apoio. Por exemplo dentro de partials/head temos apenas os links do css e etc, isso deixa mais fácil pois vamos importar em todos os arquivos.\n\nAo atualizar, já temos dois jogos funcionando.\n\n**Como funciona esse template?**\n\nNós definimos que vamos renderizar o index enviando matches para lá, quando vamos no template existe um matches e utilizamos tudo em javaScript normal, então estamos usando um forEach para fazer essa iteração, ou seja, estou repetindo esse div várias vezes (esse div nada mais é que o template que eu criei com algumas classes).\n\nSe voltarmos ao bd, a gente percebe que existe um team-a, team-b e todos os dados dentro dele, no index puxamos esse time a e time b:\n\n&#x3C;div class=\"text-block-5\">\n&#x3C;%- match['team-a'].name %>\n&#x3C;%- match['team-b'].name %>\n&#x3C;/div>\nUm ponto importante é que estamos utilizando o db mapeado por índices, ou seja, pegamos o jogo na primeira posição e que depois nós poderíamos fazer com um banco de dados de verdade, linkar para uma chave primária. No link, vamos passar o indice com o parâmetro para ele saber qual o jogo que vai ter que renderizar.\n\nSe clicarmos em acompanhar agora, ele vai dar um erro, porque não encontrou, obviamente, já que não construímos essa página ainda.\n\nAgora vamos em index.js, dentro de routes, falar que queremos responder quando o entramos em match e tiver um ID nesse jogos e também vamos pegar o jogo em especifico:",
      "description": "Essa é a primeira parte do nosso minicurso de Socket.IO. Nesta etapa, vamos começar o projeto e criar as primeiras páginas para dar o suporte à aplicação. ...",
      "keywords": [
        "vamos",
        "para",
        "dentro",
        "matches",
        "views",
        "express",
        "pasta",
        "index",
        "match",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-1"
      }
    },
    {
      "id": "3338f7ecd2550987",
      "url": "https://devpleno.com/blog/router-props/index",
      "title": "Dica: Router Props",
      "content": "Como passar props para rotas (em react-router) em uma app react?\n\nDica interessante para injetarmos dependências nos componentes que são dinamicamente renderizados pelo router.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/VD7ojK3deWE\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "para",
        "responsive",
        "https",
        "react",
        "router",
        "classname",
        "iframe",
        "youtube",
        "devpleno"
      ],
      "metadata": {
        "title": "Dica: Router Props",
        "date": "2017-04-24",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "RoutersProps.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/router-props/index.md"
      }
    },
    {
      "id": "3380467270162972",
      "url": "https://devpleno.com/blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! (Part 2)",
      "content": "Quando estamos jogando um MMORPG, por exemplo, não montamos o set do personagem de uma vez só. Em vez disso farmamos as partes dele, individualmente. Cada parte é um incremento ao personagem e facilita a aquisição de novos itens, mas só ao fim de todo o ciclo de farm é que temos o modelo pronto.\n\nE é exatamente assim que é o desenvolvimento de softwares com a metodologia ágil. Em vez de estruturar um sistema inteiro de uma vez, faz-se partes de um módulo, integra-se esse módulo e depois outro, e outro e assim por diante, até finalizar todas as funcionalidades que o programa precisa.\n\nFicou claro o que é uma metodologia ágil? Então vamos adiante!\n\n## Quais são os valores fundamentais da metodologia ágil?\n\nEm 2001 um grupo de 17 desenvolvedores criaram o [Manifesto Para o Desenvolvimento Ágil de Softwares](https://www.manifestoagil.com.br?utm_source=blog&utm_campaign=rc_blogpost). Esse manifesto aponta 4 bases para a aplicação de métodos ágeis. Confira:\n\n**Indivíduos e interações** mais que processos e ferramentas\n\n**Software em funcionamento** mais que documentação abrangente\n\n**Colaboração com o cliente** mais que negociação de contratos\n\n**Responder a mudanças** mais que seguir um plano\n\nDe um modo geral, esse manifesto só comprova para o que falamos que é a metodologia ágil. Ela prioriza o contato da equipe entre si e com o cliente, assim como o empirismo no lugar da teorização.\n\nLogo, é mais importante fazer o trabalho, deixá-lo como o cliente quer e se adaptar às mudanças do que seguir rígidos processos e usar ferramentas definidas.\n\n## Quais são os benefícios dos métodos ágeis em TI?\n\nAlém de tornar o trabalho muito mais divertido de ser feito, e desafiador, os métodos ágeis apresentam uma série de vantagens para a área da tecnologia da informação. Dá só uma olhada:",
      "keywords": [
        "mais",
        "para",
        "geis",
        "metodologia",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "title": "Metodologia ágil: entenda o que é e como se aplica para programadores!",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "Metodologia.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index.md"
      }
    },
    {
      "id": "3384c283624adf3a",
      "url": "https://devpleno.com/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! - DevPleno (Part 4)",
      "content": "Quando se é empresário, essas medidas já são estabelecidas e internalizadas no momento que se escolhe o próprio padrão de excelência. Muitas vezes, a depender do objetivo, não é somente o dinheiro o que importa, mas pode ser fortalecimento da marca, reconhecimento e/ou feedbacks espontâneos.\n\n**Quanto vale o seu trabalho?**\n\nUm conceito muito importante no momento de fazer um negócio decolar é o de [Valuation](https://endeavor.org.br/valuation-como-calcular-o-valor-da-sua-empresa?utm_source=blog&#x26;utm_campaign=rc_blogpost) (Valor). A partir dele, é possível calcular quanto vale o seu trabalho, se você for o empreendedor. Se você for o funcionário, esse valor já vem preestabelecido no momento da contratação.\n\nEssa questão é um pouco subjetiva, mas o que deve ter em mente é que quanto mais valoriza o que faz, mais as pessoas veem isso e estão dispostas a pagar pelo preço que você considera justo.\n\nTrabalhar a preços irrisórios só para conseguir clientes é, muitas vezes, um tiro no pé. Você se sente explorado e desmotivado no desempenho de suas funções, pois sabe que vale mais e o cliente pode exigir muito mais por isso. Dessa forma, é muito importante [aprender a dizer não](https://www.devpleno.com/aprenda-a-dizer-nao?utm_source=blog&#x26;utm_campaign=rc_blogpost) e buscar as condições que condizem com sua real capacidade.\n\nA partir desses questionamentos, certamente, você vai conseguir entender melhor se a decisão de abrir uma empresa é realmente a melhor para sua vida!\n\nPor falar em empreendedorismo, você pode gostar destes nossos 2 vídeos:\n\n- [3 dicas para empreender em software](https://www.youtube.com/watch?v=A5RgxkpJIrA&#x26;utm_source=blog&#x26;utm_campaign=rc_blogpost)\n\n- [Como negociar software (ou qualquer outra coisa)](https://www.youtube.com/watch?v=FszhDTUw2E0&#x26;utm_source=blog&#x26;utm_campaign=rc_blogpost)",
      "description": "Todo profissional já deve ter se perguntado as reais vantagens de se trabalhar em uma grande empresa ou de se criar um negócio próprio. E isso não é difere...",
      "keywords": [
        "para",
        "empresa",
        "isso",
        "como",
        "muito",
        "https",
        "pode",
        "mais",
        "melhor",
        "source"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao"
      }
    },
    {
      "id": "34b6da55fa7a7aa5",
      "url": "https://devpleno.com/tag/nodejs/3",
      "title": "NodeJS - Pagina 3 - DevPleno",
      "content": "NodeJS\n\n## Arquivo de Insights\n\n58 posts encontrados com a tag NodeJS\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 6 de jun. de 2017 Gere seu projeto em Express - Hands-on: Express-Generator](/express-generator)\n\n[Javascript 30 de mai. de 2017 NodeJS Primeiros Passos: Módulo em NodeJS](/modulos)\n\n[Javascript 29 de mai. de 2017 Chocolatey - Gerenciador de Pacotes para Windows](/chocolatey)\n\n[Javascript 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)\n\n[Javascript 16 de mai. de 2017 Faker - Como gerar grandes massas de dados fictícios para testes](/dados-ficticios-para-testes)\n\n[Javascript 16 de mai. de 2017 3 dicas para NPM + 1 dica extra](/dicas-paranpm)\n\n[Javascript 15 de mai. de 2017 Fs-extra - Filesystem com Promises e mais funcionalidades](/fs-extra)\n\n[Javascript 15 de mai. de 2017 Hands-on - Socket.io Parte 3](/hands-on-socket-io-parte-3)\n\n[Javascript 15 de mai. de 2017 Servidor HTTP Básico - NodeJS Primeiros Passos](/servidor-http-basico-2)\n\n[Javascript 11 de mai. de 2017 Low-DB - Banco de dados para NodeJS baseado em JSON](/low-db)\n\n[Javascript 9 de mai. de 2017 PKG - Transforme seu aplicativo Node em executável](/hands-on-pkg)\n\n[Javascript 8 de mai. de 2017 Hands-on: Ler arquivo linha a linha](/hands-ler-arquivo-linha-linha)\n\n[Anterior](/tag/nodejs/2)3 / 5[Próxima](/tag/nodejs/4)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "nodejs",
        "hands",
        "para",
        "linha",
        "arquivo",
        "express",
        "primeiros",
        "passos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/nodejs/3"
      }
    },
    {
      "id": "34e4a19de0ede9a5",
      "url": "https://devpleno.com/blog/investimento-para-executar-ideias/index",
      "title": "Preciso de investimento para minha ideia? (Part 1)",
      "content": "Hoje eu gostaria de falar com vocês sobre como executar uma ideia de forma mais efetiva. Uma coisa que eu vejo com recorrência é que as pessoas costumam ter boas ideias, começam a montar um projeto, mas quando chega em uma certa parte, principalmente quando fica ligada nesse mundo de startups, logo pensam que só conseguirão executar com o auxílio de um investidor.\n\nNa verdade, você não precisa de um investidor para colocar sua ideia no ar, precisa acreditar na sua ideia! Hoje eu acredito muito mais nas minhas ideias do que antes; contrato pessoas para trabalhar em meus projetos e tenho um caminho definido para trilhar para conseguir pelo menos fazer as primeiras vendas e aí sim, se eu precisar escalar isso ou pensar em uma escala que eu precise de um parceiro ou investidor mais forte, eu procuro esse tipo de ajuda, mas o grande detalhe é não deixar que seu projeto morra por falta de investimento, invista você mesmo! Quando você investe na sua ideia, é um ponto a mais para o investidor vir e pensar \"esse cara está levando a sério, afinal você não depende de alguém externo para executar.” Isso é muito importante porque hoje há muitas startups na cena e está todo mundo em busca de investimento, mas ninguém querendo investir na própria ideia.\n\nUma coisa que eu pensei muito, isso aconteceu comigo, eu já tive investimento em uma empresa minha, na verdade eu não tive a ideia, mas eu entrei como CTO e era responsável pela área técnica e uma das coisa que percebi é que a gente perde um pouco da noção de como usar o dinheiro quando ele entra muito \"fácil”. Pelo menos quando você começa com um investimento próprio, tem uma visão diferente.\n\nEnfim, Se você não acredita na sua ideia, vai ser difícil encontrar alguém que acredite. Muitas vezes a ideia que vai te dar dinheiro é a que você realmente acredita e coloca seu coração.\n\nConfira o video:",
      "keywords": [
        "ideia",
        "para",
        "quando",
        "mais",
        "investidor",
        "muito",
        "investimento",
        "embed",
        "hoje",
        "como"
      ],
      "metadata": {
        "title": "Preciso de investimento para minha ideia?",
        "date": "2017-07-06",
        "tags": "['Carreira']",
        "thumbnail": "Investimento.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/investimento-para-executar-ideias/index.md"
      }
    },
    {
      "id": "3594a5e0e91c5113",
      "url": "https://devpleno.com/reconhecimento-de-nudez-com-js",
      "title": "Reconhecimento de nudez com js - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Reconhecimento%20de%20nudez%20com%20js&url=https%3A%2F%2Fdevpleno.com%2Freconhecimento-de-nudez-com-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freconhecimento-de-nudez-com-js)",
      "description": "Hoje quero complementar aquela dica passada sobre reconhecimento facial. Outra atividade que fazemos bastante quando permitimos que um usuário envie uma fo...",
      "keywords": [
        "nude",
        "https",
        "nudez",
        "foto",
        "para",
        "script",
        "reconhecimento",
        "checar",
        "imagem",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/reconhecimento-de-nudez-com-js"
      }
    },
    {
      "id": "35a3c546743d7514",
      "url": "https://devpleno.com/blog/debug-no-navegador/index",
      "title": "Debug de código JavaScript no Navegador (Part 2)",
      "content": "Uma das coisas que acho fantástico no Chrome é o counter estar com o valor zero. Se eu quiser prever quanto ele vai ficar, posso selecionar o pedaço de código que quero e ele já faz um preview do valor que essa variável vai retornar. Isso é muito bom para quando vamos debugar um código mais extenso. O problema é que quando continuamos apertando o step over, vai entrar em uma parte de um código jQuery, se eu der um step over de novo, ele irá para dentro desse jQuery, então para evitar isso, eu coloco o meu break point dentro da função anônima que vai ser chamada de forma assíncrona.\n\n![Visualizando o scripts.js](b12bc8e3-839e-40f4-9188-a1c31dd1f04d.png)\n\nSe deixarmos no 7, ele nunca vai fazer nada porque nunca vai passar pelo console.log, então vamos no botão resume ![Ícone de resume](727e6c6e-cbd2-45f7-aa41-bf42b4550573.png) para continuar executando.Ele executou tudo que podia de forma síncrona e como coloquei o break point dentro da função anônima, vamos clicar em test para ver o que acontece. Perceba que agora podemos selecionar e checar o preview normalmente como fizemos anteriormente.\n\nEsse tipo de debug ajuda muito quando precisamos achar algum erro de lógica, afinal é equivalente a fazer aquela execução passo a passo. Confira o vídeo.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/I6RCJ6BDHz0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "digo",
        "fazer",
        "script",
        "counter",
        "isso",
        "como",
        "podemos",
        "vamos",
        "jquery"
      ],
      "metadata": {
        "title": "Debug de código JavaScript no Navegador",
        "date": "2017-06-22",
        "tags": "['Javascript']",
        "thumbnail": "DEBUG-NO-NAVEGADOR-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/debug-no-navegador/index.md"
      }
    },
    {
      "id": "35caca0b1735f699",
      "url": "https://devpleno.com/injecao-de-dependencia-em-reactjs",
      "title": "Injeção de Dependência em ReactJS - DevPleno (Part 2)",
      "content": "import React from 'react'\nimport reactDOM from 'react-dom'\nimport App from './App'\n//dependencias\nimport axios from 'axios'\nComo o index monta a aplicação React no HTML, vou trazer o axios. Podemos fazer uma lista de dependências para injetar no componente.\n\nQual a diferença?\n\nAo invés de utilizar o axios direto, vou passar essa dependência via props:\n\nReactDOM.render(\n&#x3C;App axios={axios}/>\ndocument.getElementById('root')\n)\nO App vai ter acesso a propriedade axios, que é o que eu importei.\n\nPodemos, então, ir no componente em si e fazer o seguinte:\n\ncomponentDiMount(){\nconst url = 'https://httpbin.org/ip'\nthis.props.axios.get(url)\n.then((res)=>{\nthis.setState({\nip: res.data.origin\n})\n})\n}\nE fazemos a requisição normal. Se quiser fazer um teste unitário desse componente, posso fazer tranquilamente porque, quando for renderizar este componente para testar, eu crio um mock ou um axios fake e vejo se esse componente chama o axios falso, da mesma forma que fizemos anteriormente.\n\nO mais importante aqui é lembrarmos que o props é uma forma que temos de injetar dependência, por isso que muitas vezes construímos aplicação com o estado todo da aplicação em um app e passamos as funções para os próximos componentes, assim ele pode ser executado em qualquer ambiente.\n\nEm toda a arquitetura, seja ela em React, em Node, etc, vai ter um lugar com uma cola (ou um ponto de montagem) e eu acredito que estes pontos são interessantes para analisar como potenciais locais de adicionar dependências.\n\nConfira o vídeo-tutorial:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Como estávamos comentando anteriormente sobre injeção de dependência, achei relevante mostrar como podemos fazer Injeção de Dependência em ReactJS. Para il...",
      "keywords": [
        "axios",
        "react",
        "import",
        "from",
        "https",
        "componente",
        "depend",
        "para",
        "fazer",
        "ncia"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/injecao-de-dependencia-em-reactjs"
      }
    },
    {
      "id": "35cec776e64f9e6a",
      "url": "https://devpleno.com/blog/html-estatico-com-templates-ejs/index",
      "title": "Gerando HTML estáticos a partir de templates – EJS (Part 2)",
      "content": "Se rodarmos novamente o script podemos ver ele processando isso:\n\n![Visualizando o terminal](05a4fe0f-9a7f-4375-ae8b-d333bc7a6714.png)\n\nPerceba que é muito melhor gerar dessa forma porque deixamos o template isolado. Podemos também importar, por exemplo, o file system e escrever o código em um novo html:\n\n```jsx\nconst ejs = require('ejs')\nconst fs = require('fs')\nejs.renderFile(\n  './templete.ejs',\n  {\n    items: ['Tulio', 'Faria']\n  },\n  (err, html) => {\n    fs.writeFile('templete.html', html, (err) => {\n      console.log('ok')\n    })\n    console.log(html)\n  }\n)\n```\n\nAo rodar, ele gerará um template.html com o código. Caso você queira gerar seu site estático no gitHub, por exemplo, você pode criar alguns templates, configurar um script que manda essas informações para ele, como um json de configuração, depois disso criar um outro script que chama o ghpages, que publica esse site.\n\nEssas são algumas dicas para utilizar no portfólio, sem usar um módulo ou um sistema já existente. Deixe suas dúvidas e sugestões nos comentários.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/l09qRMEq_7U\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "html",
        "teste",
        "para",
        "template",
        "como",
        "podemos",
        "utilizar",
        "isso",
        "const",
        "items"
      ],
      "metadata": {
        "title": "Gerando HTML estáticos a partir de templates – EJS",
        "date": "2017-09-22",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "HtmlEstatico.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/html-estatico-com-templates-ejs/index.md"
      }
    },
    {
      "id": "35e73143113fec48",
      "url": "https://devpleno.com/blog/desenvolvedor-full-stack-o-que-e-e-como-se-tornar/index",
      "title": "Desenvolvedor Full Stack: o que é e como se tornar? (Part 3)",
      "content": "- **usabilidade**: é um engano achar que a experiência do usuário está apenas nas mãos dos devs front-end. A visão de usabilidade deve começar já na hora que uma funcionalidade é concebida, portanto, esse conhecimento deve fazer parte do repertório de um desenvolvedor Full Stack;\n- **controle de versão**: é básico que qualquer desenvolvedor domine tecnologias como o Git e o SVN, seja ele Full Stack ou não;\n- **linguagens de programação back-end**: além de estudar a noção de lógica do back-end, o Full Stack precisa saber pelo menos uma linguagem como JavaScript, Java, C# ou PHP;\n- **banco de dados**: muitos devs se amedrontam com o degrau de aprendizado que são os banco de dados. Mas para se tornar Full Stack, é preciso conhecer bem esses mecanismos;\n- **mobile**: a abordagem padrão hoje é o 'mobile first'. Devs oriundos do front-end costumam ter essa visão, mas quem vem do back-end pode se aprofundar mais;\n- **infraestrutura e nuvem:** conhecimentos como virtualização de máquinas, infraestrutura de redes e serviços de nuvem são muito bem-vindos para o desenvolvedor Full Stack;\n- **linguagens de programação Front-End**: Javascript e HTML, por exemplo, são algumas das habilidades básicas de qualquer desenvolvedor Full Stack.\n\nDepois de dominar todos esses conhecimentos listados acima, um desenvolvedor pode até se dar por satisfeito e adotar o sufixo “Full Stack” no seu cartão de visitas. Mas é preciso que ele tenha plena consciência de que, na verdade, sua evolução como profissional será contínua e ele nunca deixará de aprender. As tecnologias e linguagens de programação estão sempre se transformando. Para não correr o risco de se tornar obsoleto em alguma das suas competências, o desenvolvedor precisa estudar cada vez mais e incluir a busca por novos conhecimentos como parte da sua rotina.\n\n## Um desenvolvedor Full Stack precisa conhecer também do negócio?",
      "keywords": [
        "full",
        "stack",
        "desenvolvedor",
        "como",
        "front",
        "back",
        "para",
        "profissional",
        "tornar",
        "mais"
      ],
      "metadata": {
        "title": "Desenvolvedor Full Stack: o que é e como se tornar?",
        "date": "2017-06-07",
        "tags": "['Carreira']",
        "thumbnail": "95467-desenvolvedor-full-stack-o-que-e-e-como-se-tornar-atencao-redator-entregar-ate-18h-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/desenvolvedor-full-stack-o-que-e-e-como-se-tornar/index.md"
      }
    },
    {
      "id": "364592cc51ec881c",
      "url": "https://devpleno.com/hands-on-shelljs",
      "title": "Hands-on: ShellJS - DevPleno",
      "content": "Javascript\n\n## Hands-on: ShellJS\n\nT\nPor Tulio Faria • 3 de março de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nUma tarefa que faço bastante no meu dia a dia é a construção de ferramentas para transformar dados, fazer algum processamento ou até mesmo copiar montantes de dados.\n\nEstas ferramentas quando precisam de algum comando do shell do linux, acabam restringindo a execução destas ferramentas a uma só plataforma. O ShellJS é um módulo que implementa comandos do shell do linux em Javascript multi-plataforma.\n\nAssim seu script pode utilizar recursos do shell e ainda ser multiplataforma.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20ShellJS&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-shelljs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-shelljs)",
      "description": "Uma tarefa que faço bastante no meu dia a dia é a construção de ferramentas para transformar dados, fazer algum processamento ou até mesmo copiar montantes...",
      "keywords": [
        "https",
        "javascript",
        "shelljs",
        "ferramentas",
        "shell",
        "hands",
        "nodejs",
        "para",
        "dados",
        "algum"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-shelljs"
      }
    },
    {
      "id": "36501ee4aa354dac",
      "url": "https://devpleno.com/blog/dica-self-invoked-function-self-invoking-function/index",
      "title": "Dica: Self-Invoked Function (Self-invoking Function)",
      "content": "Self-invoked Functions é uma técnica bastante interessante no Javascript, e pode resolver alguns problemas de conflito de contexto (que já estão sendo reduzidos pelo ES6/ES7). Nesta dica, mostro o que é esta técnica e onde você pode utilizá-la.\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/GErCwWAFheA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno/), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "cnica",
        "pode",
        "class",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Dica: Self-Invoked Function (Self-invoking Function)",
        "date": "2017-03-23",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "SELF-INVOKED-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-self-invoked-function-self-invoking-function/index.md"
      }
    },
    {
      "id": "365fe72ac9dc54a3",
      "url": "https://devpleno.com/generators-functions",
      "title": "Generators Functions - o que acontece por baixo dos panos - DevPleno (Part 3)",
      "content": "const gen = generator()\nconst iteration = gen.next()\niteration.value.then((val) => {\ngen.next(val)\n})\nAssim vai ser retornado o penúltimo com o valor 10. O CO faz exatamente isso, conseguimos transformar facilmente em uma função genérica que resolva qualquer generator, por isso é tão legal resolver com promise, porque se fosse com readFile comum a gente não tem esse retorno de valor. Confira a dica em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Generators%20Functions%20-%20o%20que%20acontece%20por%20baixo%20dos%20panos&url=https%3A%2F%2Fdevpleno.com%2Fgenerators-functions) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fgenerators-functions)",
      "description": "Hoje vamos continuar falando sobre Generators Functions em JavaScript. O que é Generator? É uma função que podemos pausar ou iterar sobre ela. Já falamos s...",
      "keywords": [
        "generator",
        "console",
        "next",
        "const",
        "iteration",
        "function",
        "para",
        "passo",
        "value",
        "valor"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/generators-functions"
      }
    },
    {
      "id": "3670520f0f569e0a",
      "url": "https://devpleno.com/hands-on-nodemon",
      "title": "Nodemon: Monitore alterações e reinicie automaticamente seus scripts - DevPleno (Part 1)",
      "content": "Javascript\n\n## Nodemon: Monitore alterações e reinicie automaticamente seus scripts\n\nT\nPor Tulio Faria • 28 de julho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste hands-on, vamos falar mais especificamente sobre o Nodemon. Primeiramente vamos instalar:\n\nnpm install -g nodemon\nEu poderia instalar localmente também apenas tirando o -g, assim ele não ficaria disponível no sistema inteiro. Mas, o que o nodemon faz?\n\nEle permite que a gente rode um script em node e que ele fique monitorando os arquivos. Caso você altere, ele restarta automaticamente o servidor, isso é muito interessante principalmente quando vamos fazer algo com o express. Eu tenho um server.js:\n\nconst express = require('express');\n\nconst = express();\napp.get('/', function (req, res){\nconsole.log('>> here...' +new Date().getTime())\nres.send('Hello World');\n})\napp.listen(3000, function() {\nconsole.log('Example app listening on port 3000!');\n});\nCaso eu modifique alguma linha, por exemplo:\n\nconsole.log('Example app listening on port 3000!****')\nEle restarta o server e já me diz o server foi reiniciado devido a mudanças:\n\nVamos supor que por algum motivo eu não quero alguns arquivos, então eu posso fazer ele ignorar esses arquivos. Vou fazer o teste na pasta lib:\n\nnodemon --ignore lib/ server.js\nAssim nada que modificarmos dentro dessa pasta vai fazer o server ser restartado.\n\nOutra coisa interessante é que se digitarmos rs e dermos um enter, conseguimos forçar um restart dele também.\n\nEssa ferramenta ajuda bastante a agilizar o processo de desenvolvimento recarregando os arquivos sempre que precisarmos. Tem outras opções, por exemplo, conseguimos criar um arquivo de configuração, mas se usarmos apenas para restartar o servidor, já é muito útil e aumenta muito a produtividade.\n\nConfira o vídeo:",
      "description": "Neste handson, vamos falar mais especificamente sobre o Nodemon. Primeiramente vamos instalar: Eu poderia instalar localmente também apenas tirando o g, as...",
      "keywords": [
        "nodemon",
        "https",
        "server",
        "vamos",
        "arquivos",
        "fazer",
        "express",
        "3000",
        "javascript",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-on-nodemon"
      }
    },
    {
      "id": "3682b84e8817b553",
      "url": "https://devpleno.com/devreactjslistadeespera",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjslistadeespera to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "https",
        "devpleno",
        "devreactjs",
        "redirecting",
        "from",
        "devreactjslistadeespera"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjslistadeespera"
      }
    },
    {
      "id": "36b331d4439c8051",
      "url": "https://devpleno.com/blog/spread-operator/index",
      "title": "Testando o Spread Operator: Novidade do ES6 (Part 1)",
      "content": "Olá!\n\nNeste post, vou mostrar uma novidade do ES6: o Spread Operator.\n\nVocê deve estar se perguntando agora _(ou não)_:\n\n**Para que serve o Spread Operator?**\n\nO Spread Operator é usado com bastante frequência principalmente quando queremos utilizar a imutabilidade, ou seja, criar um objeto novo a partir de um objeto existente.\n\n**Mãos na massa**\n\nEle é bastante simples, vou criar um exemplo utilizando Array.\n\nPrimeiramente temos que criar o Array:\n\n```jsx\nconst arr = [0, 1, 2]\n```\n\nEntão, se eu quisesse criar um novo vetor eu faria:\n\n```jsx\nconstNewArr = [...arr, 3]\n```\n\nSomente esses 3 pontinhos já é o Spread Operator.\n\n**E o que ele faz?**\n\nVai ficar bem claro quando fizermos um teste com funções. Se eu pedir para rodar:\n\n```jsx\nconsole.log(newArr)\n```\n\nEle nos retornará um vetor novo com o 0,1,2,3.\n\nEu adicionei o item 3 no final e posso manipulá-lo em qualquer posição, por exemplo\n\n```jsx\nconst NewArr = [3, ...arr]\n```\n\nEle irá aparecer 3,0,1,2. Não ficou claro? Então vamos para outro exemplo e ficará mais fácil de entender. Quando colocamos ...arr é basicamente o mesmo que colocarmos o que está dentro do Array, por esse motivo se chama Spread Operator, pois é um operador que espalha os valores.\n\nSe pensarmos assim, podemos fazer o seguinte:\n\n```jsx\nfunction soma(a, b, c) {\n  returna + b + c\n}\n```\n\nAo mandar rodar o\n\n```jsx\nconsole.log(soma(...arr))\n```\n\nEle irá espalhar estes valores em a, b e c e vamos conseguir somar esses valores.\n\nPodemos utilizar isso de várias maneiras, como por exemplo tirando um valor do arr\n\n```jsx\nconst arr = [0, 1, 2]\n```\n\ndeixando\n\n```jsx\nconst arr = [0, 2]\n```\n\nE passando para o\n\n```jsx\nconsole.log(soma(1, ...arr))\n```\n\n**Dica**\n\nUma dica fácil é lembrar que ele espalha os valores colocando virgula entre eles. Isso é bastante útil, principalmente quando a gente quer duplicar um vetor.\n\nVocê pode conferir o Hands-on também pelo vídeo:",
      "keywords": [
        "para",
        "spread",
        "operator",
        "quando",
        "criar",
        "exemplo",
        "const",
        "valores",
        "embed",
        "bastante"
      ],
      "metadata": {
        "title": "Testando o Spread Operator: Novidade do ES6",
        "date": "2017-05-05",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "SpreadOperator.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/spread-operator/index.md"
      }
    },
    {
      "id": "36c06f75d53736e3",
      "url": "https://devpleno.com/blog/async-await/index",
      "title": "ES6 - Async/Await (Part 1)",
      "content": "Olá!\nNeste post, falo sobre o Async/Await, uma funcionalidade que vem com o ES6 e é possível ser utilizada no Node, permitindo o aumento da qualidade do nosso código.\nObs: A versão do Node que estou rodando é a 7.7.3.\nO Async/Await, assim como um generator, depende de uma promise para funcionar.\n\n```jsx\nconst fs = require('fs')\nconst readFilePromise = (filename) => new Promise((resolve, (reject = {})))\n```\n\nCom isso, transformamos uma função callBack, que segue a forma do Node tradicional, em uma promise, criando uma Arrow Funciton Filename, que retornará uma new Promise, passando uma nova Arrow Function para ela com resolve e reject.\n\n**Como fazemos isso?**\n\nChamaremos então um readFile comum no Node, passando o nome do arquivo desejado. Em seguida, recebemos o callBack passando uma arrow function e, caso existir um erro e não for vazio, ele irá rejeitar e envia esse erro. Caso tenha dado tudo certo, será enviado o data para o solicitante:\n\n```jsx\nconst fs = require('fs')\nconst readFilePromise = (filename) => new Promise((resolve, reject = {\n  fs.readFile(filename, (err, data) => {\n    if(err){\n      reject(err)\n    } else {\n      resolve(data)\n    }\n  }\n}))\n```\n\nCom o Arrow Function, fica muito mais simples como vocês podem ver. Para verificarmos se esta tudo OK fazemos:\n\n```jsx\nreadFilePromise('arquivo.js').then((data) => console.log(data.toString()))\n```\n\nDepois de testado, vamos lá. Crie uma function que terá um Async, ele irá ler o conteúdo do arquivo, e este arquivo vai ter um Await que lerá o arquivo.js:\n\n```jsx\nasync function read() {\n  const contents = await readFilePromise('arquivo.js')\n  console.log(contents.toString())\n}\n```\n\nQuando o código for executado, ele vai chegar até o await e vai parar até a promise ser resolvida, então vai retornar o que tiver dentro do arquivo para dentro do contents.\n\n**Para que serve?**",
      "keywords": [
        "await",
        "para",
        "arquivo",
        "async",
        "promise",
        "function",
        "digo",
        "const",
        "node",
        "readfilepromise"
      ],
      "metadata": {
        "title": "ES6 - Async/Await",
        "date": "2017-05-05",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Await-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/async-await/index.md"
      }
    },
    {
      "id": "36cdd7b27440fc87",
      "url": "https://devpleno.com/blog/pensamentos-limitantes/index",
      "title": "Pensamentos limitantes",
      "content": "Hoje eu gostaria de dar uma dica de carreira de como ser um profissional melhor. Muitas vezes nos pegamos tendo, mesmo sem querer, o pensamento limitante. Toda vez que você for aprender algo novo ou tentar fazer algo, vai ter uma voz dizendo \"não é agora\" ou \"você não nasceu pra isso\". Por exemplo, você tem a ideia de um software ou app novo e envolve um monte de coisa que você não sabe, a sua cabeça diz \"desiste, você não vai conseguir fazer\", ai naturalmente sua parte física do corpo vai começar a responder de acordo. Seu corpo entra em um estado de se manter na zona de conforto e começa a poupar energia, então você terá menos energia para pensar nesse projeto, porque o seu pensamento te limitou nessa caixinha.\n\nA primeira que precisa pensar quando se quer ser um desenvolvedor pleno é estudar cada vez mais, conseguir coisas novas e não ter pensamento limitante.\n\nQuando vier esse pensamento, proteja-se contra isso. Responda esse pensamento de forma a mostrar que você realmente consegue e aquilo não passa de uma tentativa de seu corpo e sua mente de se proteger de algo que possa dar errado. Com isso você conseguirá realizar muito mais apenas estudando seu estado mental.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/bNfNxpoKApY\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "pensamento",
        "embed",
        "algo",
        "isso",
        "conseguir",
        "corpo",
        "responsive",
        "https",
        "limitante",
        "novo"
      ],
      "metadata": {
        "title": "Pensamentos limitantes",
        "date": "2017-07-18",
        "tags": "['Carreira']",
        "thumbnail": "PensamentosLimitantes.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/pensamentos-limitantes/index.md"
      }
    },
    {
      "id": "373810ac604d4b16",
      "url": "https://devpleno.com/chaves-dinamicas",
      "title": "CHAVES DINÂMICAS - DevPleno",
      "content": "Javascript\n\n## CHAVES DINÂMICAS\n\nT\nPor Tulio Faria • 23 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje eu quero comentar uma novidade no ES6, mostrando a forma de como faríamos isso anteriormente. A partir do ES6, conseguimos inicializar um objeto JavaScript passando uma Key dinâmica, mas anteriormente nós conseguiamos fazer isso apenas posteriormente, ou seja, tínhamos que criar o objeto para depois conseguir alterá-lo.\n\nAnteriormente fazíamos dessa forma:\n\nconst obj = {\na: 1\n}\n\nobj['b'] = 2\n\nconsole.log(obj)\nPorém, assim não tínhamos um jeito de fazer dinamicamente. Inspirado por essa forma de construir, o ES6 trouxe essa novidade, onde podemos fazer isso já de começo. Se eu quisesse colocar esse 2 na inicialização do objeto, eu poderia fazer simplesmente:\n\nconst obj = {\na: 1,\n['b']: 2\n}\n\nconsole.log(obj)\nAssim já inicializamos esse objeto com o key dinâmico, coisa que não era possível no ES6. É muito interessante eles aproveitarem o property accessor já na inicialização.\n\nConfira o vídeo:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=CHAVES%20DIN%C3%82MICAS&url=https%3A%2F%2Fdevpleno.com%2Fchaves-dinamicas) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fchaves-dinamicas)",
      "description": "Hoje eu quero comentar uma novidade no ES6, mostrando a forma de como faríamos isso anteriormente. A partir do ES6, conseguimos inicializar um objeto JavaS...",
      "keywords": [
        "https",
        "javascript",
        "objeto",
        "fazer",
        "forma",
        "isso",
        "anteriormente",
        "chaves",
        "novidade",
        "amos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/chaves-dinamicas"
      }
    },
    {
      "id": "373bfa41af05263d",
      "url": "https://devpleno.com/arrow-functions",
      "title": "Arrow Functions - Construindo funções anônimas de forma mais simplificada - DevPleno (Part 2)",
      "content": "class Componente extends Component{\n\nloadData(){\n//anything\n}\n\nrender(){\nreturn(\n&#x3C;button onClick={() => this.loadData()}\n)\n}\n}\nSe eu quisesse chamar o loadData dentro do render, eu posso fazer um this dentro sem problema algum. Reparem que estou utilizando uma arrow function e existe um this dentro dela, mas esse this referencia o component de fora. Isso é muito útil porque reduz muito. Anteriormente tínhamos que travar uma variável no contexto de cima para depois poder referenciar dentro da função anônima:\n\nrender(){\n\nvar that = this\n\nreturn(\n&#x3C;button onClick={() => that.loadData()}\n)\n}\nJá com a Arrow Function não é mais necessário porque o contexto já é o contexto do pai e isso facilitou bastante na construção de códigos mais legíveis. Lembrando que nós temos as Expression Body, que são funções com apenas uma expressão no corpo e a Statement Body, em que existem instruções dentro do corpo. Confira a explicação em vídeo:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Arrow%20Functions%20-%20Construindo%20fun%C3%A7%C3%B5es%20an%C3%B4nimas%20de%20forma%20mais%20simplificada&url=https%3A%2F%2Fdevpleno.com%2Farrow-functions) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Farrow-functions)",
      "description": "As Arrow Functions são uma maneira mais simples ou menor de construir funções anônimas. foi uma novidade no ES6, e hoje todo mundo já está utilizando basta...",
      "keywords": [
        "arrow",
        "function",
        "dentro",
        "this",
        "contexto",
        "valor",
        "isso",
        "https",
        "mais",
        "functions"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/arrow-functions"
      }
    },
    {
      "id": "374144f6219be28a",
      "url": "https://devpleno.com/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador",
      "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador - DevPleno (Part 4)",
      "content": "- **Tem inglês intermediário?** Crie perfil no Upwork e no Freelancer.com para acessar o mercado internacional.\n\n- **Tem experiência sólida?** Invista no processo seletivo da Toptal ou Scalable Path — os projetos e a remuneração compensam.\n\n- **Quer diversificar?** Mantenha perfis em 2-3 plataformas e veja onde consegue mais tração.\n\nO mais importante é começar. Não espere estar “pronto” — muitos freelancers de sucesso começaram com projetos simples e foram evoluindo conforme ganhavam experiência e avaliações positivas.\n\nAproveite para [saber mais sobre trabalho remoto](https://www.youtube.com/watch?v=37Jxj1DhSjg) e o que é necessário para trabalhar para empresas nacionais e internacionais!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Trabalhar%20como%20freelancer%3A%207%20sites%20para%20conseguir%20jobs%20como%20programador&url=https%3A%2F%2Fdevpleno.com%2Ftrabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftrabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)",
      "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
      "keywords": [
        "para",
        "projetos",
        "https",
        "mais",
        "como",
        "freelancer",
        "plataforma",
        "come",
        "ideal",
        "trabalhar"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador"
      }
    },
    {
      "id": "3764b87816dd0adc",
      "url": "https://devpleno.com/blog/listar-arquivos-em-js/index",
      "title": "Listar arquivos em JS (async, await, promise e Promise.all) (Part 1)",
      "content": "Hoje eu quero corrigir um exercício que passei no FullStack Academy que gera muitas dúvidas, principalmente para quem está começando na linguagem e quer aprender a lidar melhor com assincronia.\n\nEntão o exercício passado foi o seguinte: Dado uma lista de arquivos e diretórios retornada de uma função que lista o que tem no diretório, precisamos mostrar quais delas são arquivos. Para isso usamos uma função FS.stat.\n\nPrimeiramente precisamos saber a lista de arquivos que tem em um diretório, então vamos importar o nosso 'fs' e testar a função de ler um diretório retornando o nosso callback:\n\n```jsx\nconst fs = require('fs')\nfs.readdir('./', (err, paths) => {\n  console.log(paths)\n})\n```\n\nAo executar esse código, ele irá trazer um monte de nomes, alguns com extensão, outros sem. Podemos concluir então que esse diretório tem arquivos e diretórios misturados. Agora como eu vou checar se cada um desses arquivos são ou não arquivos? Precisamos criar uma versão em promise desse fs.readdir e, baseado nesse readdir, podemos resolver a promise ou recusar essa promise:\n\n```jsx\nfunction readdir(path){\n    return new Promise((resolve, reject) => {\n        fs.readdir(path, (err, paths) =>{\n            if(err){\n                reject(err)\n            } else {\n                resolve(paths)\n            }\n        }\n    }\n}\n```\n\nSimplesmente estou retornando uma promise desse readdir, o que muda é que agora eu posso chamar o readdir passando o ./ com o then:\n\n```jsx\nreaddir('./')then((paths) => console.log(paths))\n```\n\nDo ponto de vista de assincronismo, continua tendo a mesma coisa, usufruindo das vantagens da parte assíncrona do JavaScript e no nosso caso, no Node. Agora a função que eu tenho para saber se um arquivo é arquivo mesmo é o fs.stat, eu falo qual o path que eu quero e nesse path ele vai retornar stat desse arquivo:\n\n```jsx\nfs.stat(path, (err, stat) => {\n  console.log(stat.isFile())\n})\n```",
      "keywords": [
        "stat",
        "path",
        "paths",
        "const",
        "await",
        "readdir",
        "lista",
        "promise",
        "para",
        "arquivos"
      ],
      "metadata": {
        "title": "Listar arquivos em JS (async, await, promise e Promise.all)",
        "date": "2017-05-08",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ListarArquivos.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/listar-arquivos-em-js/index.md"
      }
    },
    {
      "id": "3766b37a7dd1599c",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-1/index",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto (Part 3)",
      "content": "```jsx\nvar express = require('express');\nvar router = express.Router();\n//definindo o bd\nconst low  = require('lowdb')\nconst db = low(__dirname+'/../data/db.json')\nconst defaultData = require('../data/default-data.json')\ndb.defaults(defaultData).write()\n\n/\\*Get home page. \\*/\nrouter.get('/', function(req, res, next){\n    res.render('index', {title: 'Express'});\n});\nmodule.exports = router;\n```\n\nEstamos carregando o defaultData que tem um exemplo de jogo, com ele vamos definir para o db que o padrão dele, se não tiver nada, será o defaultData.\n\nPerceba que o db.json está vazio, mas ao darmos um yarn start ele será preenchido com as informações do defaultData.\n\nNosso próximo passo é carregar todos os jogos e enviar para nossa rota, com isso conseguimos exibir esses jogos na tela. Vamos criar um const matches. Vamos pegar do nosso db o value de matches e mandar ele para nosso view:\n\n```jsx\n;/\\*Get home page. \\*/\nrouter.get('/', function (req, res, next) {\n  const matches = db.get('matches').value()\n  res.render('index', { matches })\n})\nmodule.exports = router\n```\n\nAgora, dentro de index.js, vamos remover o title de todas as linhas de código e adicionar matches dentro do `<p>`:\n\n```jsx\n<p>Olá <%= matches %></p>\n```\n\nPerceba que ele irá retornar dois objetos, ou seja, serão dois jogos. Agora vamos colocar o JSON.stringfy para sabermos o que está chegando realmente:\n\n```jsx\n<p>Olá <%= JSON.stringfy(matches) %></p>\n```\n\nEntão o jogo está funcionando perfeitamente.\n\nComo já temos nossa lista de jogos, vamos trazer nosso primeiro template. Nos arquivos de apoio, dentro de views, vou copiar o index.ejs e jogar para dentro da pasta views do projeto, substituindo o existente.",
      "keywords": [
        "vamos",
        "para",
        "match",
        "matches",
        "dentro",
        "views",
        "express",
        "index",
        "temos",
        "pasta"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 6,
        "sourcePath": "blog/minicurso-socket-io-parte-1/index.md"
      }
    },
    {
      "id": "37849e7180b07ffd",
      "url": "https://devpleno.com/blog/10",
      "title": "Blog - Página 10 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 2 de ago. de 2017 High-order Function Find](/find)\n\n[Javascript 1 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)\n\n[Carreira 1 de ago. de 2017 Ensinar algo a alguém todos os dias](/ensinar-algo)\n\n[Javascript 31 de jul. de 2017 Json-server - Como criar uma REST API para testes de forma simples](/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples)\n\n[Carreira 31 de jul. de 2017 Por que fazer um curso de programação voltado para a prática?](/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica)\n\n[Javascript 30 de jul. de 2017 Async - Como Controlar Operações Assíncronas](/async)\n\n[Javascript 29 de jul. de 2017 Módulo Co - Organize o fluxo de seu código assíncrono](/modulo-co)\n\n[Javascript 28 de jul. de 2017 Float e precisão](/float-e-precisao)\n\n[Javascript 28 de jul. de 2017 Nodemon: Monitore alterações e reinicie automaticamente seus scripts](/hands-on-nodemon)\n\n[Javascript 27 de jul. de 2017 Bind - Altere comportamento e contexto de execução de suas funções](/bind)\n\n[Javascript 27 de jul. de 2017 Fetch - Uma nova forma de fazer requisições HTTP](/fetch-hands-on)\n\n[Carreira 26 de jul. de 2017 Mantenha sua Integridade - Dica de carreira DevPleno](/integridade)\n\n[Anterior](/blog/9)10 / 26[Próxima](/blog/11)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "carreira",
        "para",
        "reactjs",
        "todos",
        "blog",
        "como",
        "forma",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/10"
      }
    },
    {
      "id": "379cd1175df5f047",
      "url": "https://devpleno.com/blog/listar-arquivos-em-js/index",
      "title": "Listar arquivos em JS (async, await, promise e Promise.all) (Part 3)",
      "content": "Se dermos um console.log no stats, vamos ter uma lista de promises pendentes, então esse código roda síncronamente, até mesmo o map, toda vez que tenho um async tenho uma promises disfarçada e como ele retorna uma outra promise, eu tenho várias sem resolver. Com isso eu precisaria pensar em uma forma de resolver todas essas promises. Para resolver, podemos utilizar o promises.all que também retorna uma promise e retornar todas as promises que estão pendentes:\n\n```jsx\nasync function lista() {\n  const paths = await readdir('./')\n  const stats = paths.map(async (path) => await stat(path))\n  const stats = await Prmise.all(statsPromises)\n  console.log(paths)\n}\nlista()\n```\n\nAgrupamos então todas essas promises em uma, o await vai esperar a promise retornada do promise.all, se rodarmos o código agora, teremos os resultados de todos os arquivos.\n\nAgora como eu vou saber qual caminho é o que?\n\nNa minha função stat, ao invés de retornar só o stat, vou retornar o path também para sabermos que arquivo é esse:\n\n```jsx\nfunction stat(path){\n    return new Promise((resolve, reject) => {\n        fs.stat(path, (err, stat) =>{\n        if(err){\n            reject(err)\n            } else {\n                resolve({path, stat })\n            }\n        })\n    }\n}\n```\n\nAgora precisamos filtrar qual desses caras são realmente arquivos, para isso vamos fazer o seguinte:\n\n```jsx\nasync function lista() {\n  const paths = await readdir('./')\n  const stats = paths.map(async (path) => await stat(path))\n  const stats = await Prmise.all(statsPromises)\n  const pathsWithIsFile = stats.map((path) => ({\n    path: path,\n    isFile: path.stat.isFile()\n  }))\n  const files = pathsWithIsFile.filter((path) => path.isFile)\n  console.log(files)\n}\n\nlista()\n```\n\nAgora ele irá retornar apenas os caminhos que são arquivos, o grande segredo de tudo é essa parte:\n\n```jsx\nconst stats = paths.map(async (path) => await stat(path))\nconst stats = await Prmise.all(statsPromises)\n```",
      "keywords": [
        "stat",
        "path",
        "paths",
        "const",
        "await",
        "readdir",
        "lista",
        "promise",
        "para",
        "arquivos"
      ],
      "metadata": {
        "title": "Listar arquivos em JS (async, await, promise e Promise.all)",
        "date": "2017-05-08",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ListarArquivos.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/listar-arquivos-em-js/index.md"
      }
    },
    {
      "id": "37c5d325939db3d6",
      "url": "https://devpleno.com/blog/10-dicas-de-produtividade-para-programadores/index",
      "title": "10 dicas de produtividade para programadores (Part 2)",
      "content": "Saber definir prioridades entre as tarefas é crucial para a produtividade. Ferramentas como o [Trello](https://trello.com?utm_source=blog&utm_campaign=rc_blogpost) e o [Asana](https://asana.com?utm_source=blog&utm_campaign=rc_blogpost) ajudam a gerenciar tarefas, definindo responsáveis e prazos para cada uma. Desta forma, visualizar as diversas atividades que compõem o projeto fica mais simples, possibilitando elencar a prioridade entre elas.\n\n### Editores de texto\n\nEntre os editores de texto mais usados pelos programadores estão o [Notepad++](https://notepad-plus-plus.org?utm_source=blog&utm_campaign=rc_blogpost), [Sublime Text](https://www.sublimetext.com?utm_source=blog&utm_campaign=rc_blogpost) e o VS Code. Todos são leves e aceitam _plugins/extensões_ que agregam funcionalidades ao _software_. [Na hora de utilizar o editor, uma dica é reduzir a troca de contextos em prol da produtividade](https://www.devpleno.com/como-aumentar-a-produtividade?utm_source=blog&utm_campaign=rc_blogpost).\n\n### Versionamento\n\nQuando se está criando um _software_, é essencial não perder linhas de código já desenvolvidas. Uma das melhores formas de prevenir que um trecho de código seja sobrescrito ou que ocorra um _bug_ causado por alguma alteração no código-fonte é usar o sistema de versionamento [git](https://git-scm.com?utm_source=blog&utm_campaign=rc_blogpost), disponível nas plataformas [Bitbucket](https://bitbucket.org?utm_source=blog&utm_campaign=rc_blogpost) e [Github](https://github.com?utm_source=blog&utm_campaign=rc_blogpost).\n\n### Qualidade do código",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "para",
        "produtividade",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "title": "10 dicas de produtividade para programadores",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "106696-10-dicas-de-produtividade-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "revisor": "['Renato Siqueira']",
        "chunkIndex": 1,
        "totalChunks": 6,
        "sourcePath": "blog/10-dicas-de-produtividade-para-programadores/index.md"
      }
    },
    {
      "id": "37d789e7be38ecb4",
      "url": "https://devpleno.com/short-circuit-e-valores-padrao",
      "title": "Short-circuit e valores padrão - DevPleno (Part 2)",
      "content": "let a = null\nlet b = a || 'padrão'\nSe o ‘a’ for iniciado com algo, como por exemplo a= ‘valor de a’, a atribuição de ‘b’ será o valor de ‘a’, com isso conseguimos fazer uma leitura de dados de formulário e utilizar esse valor padrão utilizando o ||.\n\nTemos dois usos alternativos dos operadores &#x26;&#x26; e ||, posso usar o ‘ou’ para o valor padrão e o &#x26;&#x26; para um short-circuit e evitar que a linha continue sendo executada.\n\nConfira o video:\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Short-circuit%20e%20valores%20padr%C3%A3o&url=https%3A%2F%2Fdevpleno.com%2Fshort-circuit-e-valores-padrao) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fshort-circuit-e-valores-padrao)",
      "description": "Essa dica pode ser utilizada tanto em JavaScript quanto em outras linguagens de programação, apenas com um pouco de adaptação. Vamos falar primeiramente so...",
      "keywords": [
        "debug",
        "circuit",
        "short",
        "padr",
        "valor",
        "https",
        "console",
        "para",
        "javascript",
        "valores"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/short-circuit-e-valores-padrao"
      }
    },
    {
      "id": "37e9699c5612ba35",
      "url": "https://devpleno.com/blog/metronomo-com-javascript/index",
      "title": "Metrônomo com JavaScript (Part 1)",
      "content": "O metrônomo um dispositivo que deixa uma batida constante e ajuda os músicos a manterem um ritmo quando estão treinando. Esse ritmo pode aumentar ou diminuir de acordo com a escolha do músico.\n\nTeremos um HTML simples, e primeiro vamos criar um input type range para gerar uma barra que será onde vamos controlar a velocidade do nosso metrônomo. Nele conseguimos colocar qual o valor mínimo e qual o valor máximo. Vamos pegar o do google como exemplo, o mínimo será 40 e o máximo 218. Um value inicial e um ID para conseguirmos recuperar este valor.\n\nEm seguida, vamos colocar o áudio que será tocado _(no meu caso tenho um clap.wav e um botão play para controlar o metrônomo)._\n\n```jsx\n<html>\n    <head>\n        <tittle>Metronomo</tittle>\n    </head>\n    <body>\n        <input type=\"range\"  min=\"40\" max=\"218\" value=\"40\" id=\"bpm\"/>\n        <audio src=\"clap.wav\"></audio>\n        <button id=\"play\">Play</button>\n    </body>\n<html>\n```\n\nEle ficará assim:\n\n![Exemplo 1](AudioEx.png)\n\nTambém é interessante colocarmos antes do input um H1 com o número inicial de batida que está configurado.\n\n```jsx\n<h1>40bpm</h1>\n```\n\nFeito isso, podemos começar a adicionar um pouco de comportamento. Vamos colocar o script no corpo do HTML mesmo, pois a intenção no exemplo é só demonstrar como poderíamos reconstruir o metrônomo.\n\nToda vez que trocar o valor do range tem que ser trocado o que está escrito em H1. Então vamos pegar o BPM e o H1. Toda vez que o BPM mudar, ou seja, dar um change, o h1 tem que mudar também. Lembrando que essa técnica de colocar todos os seletores em cima é chamada de cash.\n\nPrimeiro faremos um teste com um valor fixo criando uma função que faz o play. Vamos chamá-la de tick e um intervalo fixo, que em sequência vamos resolver.\n\nNessa função tick, temos que pegar o áudio",
      "keywords": [
        "play",
        "tick",
        "para",
        "const",
        "timer",
        "vamos",
        "isplaying",
        "valor",
        "audio",
        "currentbpm"
      ],
      "metadata": {
        "title": "Metrônomo com JavaScript",
        "date": "2017-05-26",
        "tags": "['Javascript']",
        "thumbnail": "Metronomo.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/metronomo-com-javascript/index.md"
      }
    },
    {
      "id": "38030bf6401eb66b",
      "url": "https://devpleno.com/fsm-reservar-fbads",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsm-reservar-fbads to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "reservar",
        "fbads"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsm-reservar-fbads"
      }
    },
    {
      "id": "38355927f5dafaf7",
      "url": "https://devpleno.com/mono-ou-multi-thread-poo-para-js",
      "title": "Mono ou multi thread - POO para JS - DevPleno (Part 2)",
      "content": "Principalmente no navegador, essa característica do JavaScript permite que a gente não bloqueie a tela. É muito comum em Java por exemplo, se você não criar uma thread nova e clicar em um botão swing, ao passar o mouse em cima da interface, ela fica com loading. Em JavaScript isso não acontece porque um dos stacks que ele tem é o de processamento gráfico, então ele não deixa acontecer se utilizarmos as boas práticas.\n\nPara evitar que nosso programa trave no tempo que está executando uma linha de código, podemos utilizar o seguinte:\n\nconst fs = require('fs')\nconst a = 1\nconst b = 2\nconsole.log('inicio')\nfs.readdir('./', (err, files) => console.log(files))\nconsole.log('fim')\nCom isso o resultado é que o início e fim virão antes do readdir. Ela vai ser empilhada no event loop e quando acabar a execução, vai sair da pilha.\n\nAgora vamos supor que eu tenho uma operação um pouco pesada, temos uma forma de mandar para o event loop utilizando o setTimeOut(() => console.log(‘event loop’), 0) e ao invés de passar um tempo, se passarmos zero vamos empilhar isso dentro do event loop.\n\nPara fechar, vamos fazer um problema conhecido como Produtor-Consumidor, esse é um problema muito recorrente que utilizamos para aprender essa forma de lidar com várias threads em Java.\n\nTemos uma função producer, que é a que produz, e uma função consumer, onde consome algo:\n\nconst stock = \\[\\]\nfunction producer() {}\nfunction consumer() {}\nEntão, quando eu produzo, jogo em stock e o consumidor irá consumir do stock. O problema é que essas duas functions rodam separadamente, se fossemos fazer isso em Java, teríamos que ter duas threads. Para simular essa questão em JavaScript:",
      "description": "Hoje vou continuar falando um pouco mais sobre como podemos fazer a transição de uma linguagem orientadaobjeto, como PHP ou Java, para JavaScript cada vez ...",
      "keywords": [
        "stock",
        "para",
        "const",
        "consumer",
        "math",
        "isso",
        "console",
        "javascript",
        "producer",
        "length"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/mono-ou-multi-thread-poo-para-js"
      }
    },
    {
      "id": "383abaacb0559452",
      "url": "https://devpleno.com/blog/lista-encadeada-remover-um-no/index",
      "title": "Lista encadeada - Como remover um nó (Part 2)",
      "content": "```js\nlet currentNode = head\nwhile (currentNode.next && currentNode.next != node) {\n  currentNode = currentNode.next\n}\ncurrentNode.next = node.next\n```\n\nFizemos o currentNode ser igual ao head, logo ele será o nosso nó 1, em seguida fiz uma condição: se eu tenho um próximo para andar e esse próximo não é o node, vou fazer o currentNode igual a currentNode.next, com isso vou caminhar para frente. Porém, na primeira vez que roda, ele já descobre que o Nó 1 já é o next, então precisamos fazer mais um caso de teste. Vamos adicionar uma posição 4 e em seguida remover a posição 3:\n\n```js\nlist.add2(4)\nlet node = list.getByValue(3)\nconsole.log(node)\nlist.remove(node)\nlist.print()\n```\n\nLembrando que eu estou mostrando o que eu geralmente faço de testes, afinal o teste seria bastante viciado caso eu testasse apenas com o nó 1. Então conseguimos fazer ele caminhar nos nós e só depois então caminhar nele de verdade.\n\nA complexidade desse código é O(n), não tem como ser diferente, pois temos que passar em todos os nós, basicamente é quase o mesmo cenário de adicionar com O(n).\n\nAssista ao vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/tVl7Z-FnQ50\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "node",
        "currentnode",
        "next",
        "remove",
        "lista",
        "head",
        "agora",
        "temos",
        "para",
        "return"
      ],
      "metadata": {
        "title": "Lista encadeada - Como remover um nó",
        "date": "2017-07-25",
        "tags": "['Algoritmos']",
        "thumbnail": "RemoverNo.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/lista-encadeada-remover-um-no/index.md"
      }
    },
    {
      "id": "3848e252803138c8",
      "url": "https://devpleno.com/ferramentas-visuais-para-flexbox",
      "title": "Ferramentas Visuais para Flexbox - DevPleno (Part 2)",
      "content": "[https://demos.scotch.io/visual-guide-to-css3-flexb](https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/)\n\n[ox-flexbox-playground/demos/](https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/)\n\nNele, podemos mudar a largura de todos os Box, e também modificar dentro de cada Box, mais ou menos como nas outras duas ferramentas.\n\nConfira mais detalhes no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Ferramentas%20Visuais%20para%20Flexbox&url=https%3A%2F%2Fdevpleno.com%2Fferramentas-visuais-para-flexbox) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fferramentas-visuais-para-flexbox)",
      "description": "Há um tempo passei por uma situação onde precisava criar algumas coisas com Flexbox (uma nova forma de display do CSS) na parte de layout do react native (...",
      "keywords": [
        "flexbox",
        "https",
        "como",
        "ferramentas",
        "para",
        "demos",
        "layout",
        "isso",
        "temos",
        "ferramenta"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/ferramentas-visuais-para-flexbox"
      }
    },
    {
      "id": "38602661646c0d22",
      "url": "https://devpleno.com/hands-on-node-js-request",
      "title": "Hands-on: Node JS - Request - DevPleno",
      "content": "Javascript\n\n## Hands-on: Node JS - Request\n\nT\nPor Tulio Faria • 24 de fevereiro de 2017\n\n[Javascript](/tag/javascript)\n\nNesta nova série, experimento módulos, pacotes ou ferramentas. O pacote demonstrado neste vídeo é o request, que nos permite fazer requisições HTTP de maneira simples.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Node%20JS%20-%20Request&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-node-js-request) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-node-js-request)",
      "description": "Nesta nova série, experimento módulos, pacotes ou ferramentas. O pacote demonstrado neste vídeo é o request, que nos permite fazer requisições HTTP de mane...",
      "keywords": [
        "https",
        "request",
        "javascript",
        "node",
        "hands",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fhands",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-node-js-request"
      }
    },
    {
      "id": "38cfa451aaa3d7be",
      "url": "https://devpleno.com/beatbox-manipulavel-com-js",
      "title": "Construindo um Beatbox Manipulável com JS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Construindo um Beatbox Manipulável com JS\n\nT\nPor Tulio Faria • 29 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nAgora que já entendemos [como dar play em áudio com JS](https://www.devpleno.com/audio-com-js-puro/), [como manipular para compor uma batida](https://www.devpleno.com/beatbox-com-javascript/), faremos com que o usuário escolha a forma como seja tocado, ou seja, um Beatbox Manipulável com JS\n\nVamos começar utilizando um pouco da estrutura do HTML usado anteriormente (os áudios importados e o play) e implementar esse código. Criaremos um div.\n\nA ideia é ter vários checkbox para cada instrumento, por exemplo, temos um prato e vários checkbox, os quais podemos marcar. Onde estiver marcado será tocado o áudio e onde não estiver não será tocado. Para não precisarmos criar manualmente todo os inputs, podemos criar um script JS que terá um contador que gera vários checkbox.\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;tittle>beat-box&#x3C;/tittle>\n&#x3C;/head>\n&#x3C;body>\n&#x3C;button id=\"play\">Play&#x3C;/button>\n\n&#x3C;audio src=\"prato.wav\" id=\"prato\">&#x3C;/audio>\n&#x3C;audio src=\"prato-fechado.wav\" id=\"prato-fechado\">&#x3C;/audio>\n&#x3C;audio src=\"bumbo.wav\" id=\"bumbo\">&#x3C;/audio>\n&#x3C;audio src=\"boca.wav\" id=\"boca\">&#x3C;/audio>\n&#x3C;audio src=\"caixa.wav\" id=\"caixa\">&#x3C;/audio>\n\n&#x3C;div id=\"track1\" rel=\"prato\">\n&#x3C;h2>Prato&#x3C;/h2>\n&#x3C;/div>\n&#x3C;div id=\"track2\" rel=\"prato-fechado\">\n&#x3C;h2>Prato-fechado&#x3C;/h2>\n&#x3C;/div>\n&#x3C;div id=\"track3\" rel=\"bumbo\">\n&#x3C;h2>Bumbo&#x3C;/h2>\n&#x3C;/div>\n\n&#x3C;script>\nconst numItems = 10\nfunction generationTrack(trackId){\nconst track = document.getElementById('track'+trackId)\n\nfor (let i=0; i&#x3C;10; i++){\ntrack.innerHTML += '&#x3C;input type=\"checkbox id=\"i-'+trackId+'-'+i+'\" />'\n}\n}",
      "description": "Agora que já entendemos como dar play em áudio com JS, como manipular para compor uma batida, faremos com que o usuário escolha a forma como seja tocado, o...",
      "keywords": [
        "play",
        "audio",
        "const",
        "prato",
        "https",
        "track",
        "script",
        "checkbox",
        "para",
        "trackid"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/beatbox-manipulavel-com-js"
      }
    },
    {
      "id": "3944ab6f06175cba",
      "url": "https://devpleno.com/blog/reconhecimento-facial-com-js/index",
      "title": "Reconhecimento facial com JS (Part 3)",
      "content": "```jsx\nevent.data.foEach((rect) => {\n  context.strokeStyle = '#ff0000'\n  context.lineWidth = 2\n  context.strokeRect(rect.x, rect.y, rect.width, rect.height)\n})\n```\n\nCom isso já conseguimos ver o reconhecimento do meu rosto. Em uma aplicação real, eu poderia, por exemplo, reconhecer o rosto, dar um freeze e cortar a imagem um pouco para cima e para os lados para ajudar no crop.\n\nAlém disso ainda podemos mostrar uma informação de onde está sendo reconhecido esse retângulo:\n\n```jsx\nevent.data.foEach((rect) => {\n  context.strokeStyle = '#ff0000'\n  context.lineWidth = 2\n  context.strokeRect(rect.x, rect.y, rect.width, rect.height)\n  context.fillText(\n    `x: ${rect.x}`,\n    `w: $:{rect.width}`,\n    rect.x + rect.width + 20,\n    rect.y + 20\n  )\n  context.fillText(\n    `y: ${rect.y}`,\n    `h: $:{rect.height}`,\n    rect.x + rect.width + 20,\n    rect.y + 40\n  )\n})\n```\n\nAssim temos a informação precisa de onde foi encontrado o nosso rosto. Poderíamos utilizar isso para fazer o crop.\n\nComo colocamos isso em um vetor, é possível reconhecer mais de um rosto no vetor, a partir disso podemos fazer, por exemplo, um sistema de tag para marcar os amigos.\n\nVeja o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/KV7mZc3D93Y\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
      "keywords": [
        "rect",
        "canvas",
        "vamos",
        "para",
        "script",
        "context",
        "video",
        "width",
        "const",
        "event"
      ],
      "metadata": {
        "title": "Reconhecimento facial com JS",
        "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
        "date": "2017-11-24",
        "tags": "['Javascript']",
        "thumbnail": "ReconhecimentoFacial.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/reconhecimento-facial-com-js/index.md"
      }
    },
    {
      "id": "3945e04e155200e2",
      "url": "https://devpleno.com/blog/handlebars-template-html-simples/index",
      "title": "Template HTML simples - Hands-on Handlebars (Part 1)",
      "content": "O Handlebars é uma forma de lidarmos com template HTML. É algo simples, mas que possui diversas opções que podemos fazer. Vou mostrar um caso bem específico dele. Podemos utilizar com NodeJS, ExpressJS, mas eu vou mostrar em conjunto com jQuery para um tipo de solução que eu venho utilizando para fazer algumas coisas mais rápidas.\n\nTenho aqui um arquivo dados.json que vai servir para simular o consumo de uma EPI, vamos carregar os dados via AJAX para o html:\n\n```jsx\n;[\n  {\n    name: 'Tulio',\n    lastName: 'Faria'\n  },\n  {\n    name: 'Vitor',\n    lastName: 'Machado'\n  }\n]\n```\n\nNo HTML, vamos importar da CDN o jQuery e o Handlebars e testar se estão carregando os nomes do Json:\n\n```jsx\n<html>\n    <body>\n        <div id=\"people\">\n         people\n        </div>\n        <script  src=\"https://code.jquery.com/jquery-3.2.1.slim.min.js\"></script>\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/handleba\n        rs.js/4.0.10/handlebars.amd.js\"</script>\n        <script>\n            $function(){\n                $.get('dados.json't=' +new Date().getTime(),  function(data){\n                    console.log(data);\n                }\n            })\n        </script>\n    </body>\n</html>\n```\n\nSe eu quiser criar uma lista com esses nomes para colocar na DIV 'people' e que seja da seguinte forma:\n\n```jsx\n<div id='people'>\n  <div>\n    <strong>Name: </strong>nome\n    <br />\n    <strong>Last Name: </strong>last\n    <br />\n  </div>\n</div>\n```\n\nSe fossemos fazer isso com jquery teríamos que interpolar a string dentro da function, como por exemplo:\n\n```jsx\n<script>\n    $function(){\n            $.get('dados.json't=' +new Date().getTime(), function(data){\n                $(\"#people\").append('<div><strong>Name: </strong> '+nome)\n                $(\"#people\").append('<div><strong>Last Name: </strong> '+last)\n            }\n        })\n</script>\n```",
      "keywords": [
        "script",
        "strong",
        "html",
        "name",
        "people",
        "handlebars",
        "lastname",
        "function",
        "para",
        "dados"
      ],
      "metadata": {
        "title": "Template HTML simples - Hands-on Handlebars",
        "date": "2017-06-13",
        "tags": "['Javascript']",
        "thumbnail": "HandleBars.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/handlebars-template-html-simples/index.md"
      }
    },
    {
      "id": "398e706a47482510",
      "url": "https://devpleno.com/blog/contato/index",
      "title": "Devpleno - Como entrar em Contato?",
      "content": "Surgiu alguma dúvida durante as aulas? Gostaria de conversar sobre algum assunto específico?\nEntre em contato conosco através do email contato@devpleno.com ou enviando uma mensagem em nosso Whatsapp: (35) 999 090 011",
      "keywords": [
        "contato",
        "surgiu",
        "alguma",
        "vida",
        "durante",
        "aulas",
        "gostaria",
        "conversar",
        "sobre",
        "algum"
      ],
      "metadata": {
        "title": "Devpleno - Como entrar em Contato?",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/contato/index.md"
      }
    },
    {
      "id": "39a4d9e3ebb61245",
      "url": "https://devpleno.com/blog/find/index",
      "title": "High-order Function Find (Part 2)",
      "content": "Eu já sei que estou travando o ID em um, criando uma nova função a partir da função que eu já tinha. A vantagem disso é que vamos saindo de funções mais genéricas para funções mais específicas que também são fáceis de testar, deixando o código cada vez mais legível. Óbvio que esse exemplo é bem simples, mas poderíamos travar uma dependência com um banco, por exemplo.\n\nPodemos usar o bind junto com find e qualquer outra função para travar algumas variáveis criando funções novas que travam alguns desses valores.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/q1rIICZaxTI\" allowfullscreen></iframe>\n</div>\n\no [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "item",
        "const",
        "https",
        "find",
        "carrinho",
        "devpleno",
        "mais",
        "reduce",
        "subtotal",
        "soma"
      ],
      "metadata": {
        "title": "High-order Function Find",
        "date": "2017-08-02",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "FIND-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/find/index.md"
      }
    },
    {
      "id": "39ba7efb7313c2b8",
      "url": "https://devpleno.com/blog/npm-e-modulos-de-terceiros/index",
      "title": "NPM e Módulos de Terceiros - NodeJS (Part 2)",
      "content": "Uma maneira bem fácil de fazer isso é utilizando o:\n\n```jsx\nnpm init\n```\n\nEle irá perguntar qual o nome do projeto, qual o description, qual o entry point (que no nosso caso é o test.js), password, author, etc. No fim, ele gera um JSON e pergunta se eu quero salvar. Então ele gera as informações do projeto ali.\n\n**Qual a vantagem quando eu tenho um package.json?**\n\nVamos supor que eu fiz um teste com a minha lib. Se ele funcionar, então o inserimos como dependência.\n\n**Como fazemos isso?\\***\n\n```jsx\nnpm install string --save\n```\n\nAlém de eu instalar a dependência, também estamos salvando ele no package.json. Se abrirmos ele na área e dependência vamos ver o módulo String.\n\nPerceba que ele tenta achar o major version e o mantém, por exemplo '3.3.1' e pode atualizar para '3.4.1'. Ele faz isso para manter seu projeto estável. Isso serve para que quando for comitar esse código no git, você não coloque os módulos, pois caso você esteja rodando no Windows, quando fizer um npm install, alguns módulos compilam algumas coisas a mais como código em C.\n\nQuando baixar esse código em outra máquina, você só vai rodar o NPM install. O próprio NPM vai resolver os módulos e instalar as dependências. Por isso é importante termos as dependências dentro do package.json.\n\nTempos atrás, as pessoas programavam em Java e ainda não tinham tão definido alguns repositórios de dependência, então tinham que sair caçando as dependências. Atualmente, apenas com esses gerenciadores conseguimos fazer isso adicionando um descritor e isso deixa seu projeto muito mais organizado e independente de plataformas, já que não têm módulos extremamente dependentes de arquitetura.\n\nConfira a explicação em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/p6XThe7spdE\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "depend",
        "string",
        "isso",
        "dulos",
        "projeto",
        "para",
        "quando",
        "node",
        "qual",
        "ncias"
      ],
      "metadata": {
        "title": "NPM e Módulos de Terceiros - NodeJS",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "NpmEModulos.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/npm-e-modulos-de-terceiros/index.md"
      }
    },
    {
      "id": "39d1345d18957a34",
      "url": "https://devpleno.com/blog/abaixar-a-guarda/index",
      "title": "Porque você não deve abaixar a guarda",
      "content": "A dica de carreira de hoje é sobre apoio. Muitas vezes você está fazendo um projeto na faculdade, por exemplo, e todo mundo fica dizendo coisas boas sobre ele, dizendo que você vai ficar muito rico e coisas do tipo… É muito legal quando as pessoas te motivam e você quando recebe essa energia, mas dependendo do tipo de apoio, você vai abaixar sua guarda. Isso significa que você fica mais suscetível a errar e não estar preparado a entrar no mercado.\n\nVamos supor que você está criando um App e todo mundo só fala bem, o risco disso é você começar a parar de ser crítico com você mesmo. O grande exercício que eu gosto de fazer quando eu estou criando algo é o **“what if”**, e se a opinião dessas pessoas não está viciada, ou e se eles estão querendo me agradar? Esse é o perigo, quando você abaixa a guarda, está desprotegido e para de fazer o **“what if”** porque todos a sua volta estão aprovando essa ideia, porém elas não são o mercado como um todo e sim uma parte muito pequena.\n\nEntão minha dica é, independente se você está recebendo menos ou mais apoio, valide bastante sua ideia, pesquise com pessoas que não tem o viés, ou seja, não tem essa opinião muito pessoal sobre o assunto, assim você não abaixa a guarda e não entra despreparado para o mercado de trabalho.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/zxYkrgMZ_Us\" allowfullscreen></iframe>\n</div>\n\nCurta o DevPleno no <a href=\"https://www.facebook.com/devpleno\">Facebook</a>,<a href=\"https://www.youtube.com/devplenocom\">inscreva-se no canal</a> e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "muito",
        "quando",
        "sobre",
        "apoio",
        "todo",
        "pessoas",
        "essa",
        "guarda",
        "mercado",
        "para"
      ],
      "metadata": {
        "title": "Porque você não deve abaixar a guarda",
        "date": "2017-07-11",
        "tags": "['Carreira']",
        "thumbnail": "ABAIXAR-A-GUARDA-790x400.png",
        "author": "Tulio Faria",
        "noindex": "true",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/abaixar-a-guarda/index.md"
      }
    },
    {
      "id": "39d4808a6554f2ab",
      "url": "https://devpleno.com/carreira-preciso-de-investimento-para-minha-ideia",
      "title": "Carreira: Preciso de investimento para minha ideia? - DevPleno",
      "content": "Carreira\n\n## Carreira: Preciso de investimento para minha ideia?\n\nT\nPor Tulio Faria • 22 de março de 2017\n\n[Carreira](/tag/carreira)\n\nNa hora de planejar suas ideias, a maioria das pessoas logo pensa em um investidor. Mas será que ele realmente é preciso para executar sua ideia? Neste vídeo, dou dicas sobre esse assunto baseado em experiências próprias. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações.\n\n## Confira o vídeo:\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Carreira%3A%20Preciso%20de%20investimento%20para%20minha%20ideia%3F&url=https%3A%2F%2Fdevpleno.com%2Fcarreira-preciso-de-investimento-para-minha-ideia) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcarreira-preciso-de-investimento-para-minha-ideia)",
      "description": "Na hora de planejar suas ideias, a maioria das pessoas logo pensa em um investidor. Mas será que ele realmente é preciso para executar sua ideia? Neste víd...",
      "keywords": [
        "para",
        "https",
        "carreira",
        "preciso",
        "ideia",
        "investimento",
        "minha",
        "suas",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/carreira-preciso-de-investimento-para-minha-ideia"
      }
    },
    {
      "id": "3a25c1a092a42723",
      "url": "https://devpleno.com/na-toptal-ou-por-meio-da-toptal",
      "title": "Trabalhar na Toptal ou por meio da Toptal? - DevPleno",
      "content": "Carreira\n\n## Trabalhar na Toptal ou por meio da Toptal?\n\nT\nPor Tulio Faria • 9 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nQual a diferença de trabalhar na Toptal e por meio da Toptal? Sim, existe diferença! Entenda tudo que precisa saber neste vídeo:\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\nSaiba mais em [https://go.devpleno.com/fsm/](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Trabalhar%20na%20Toptal%20ou%20por%20meio%20da%20Toptal%3F&url=https%3A%2F%2Fdevpleno.com%2Fna-toptal-ou-por-meio-da-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fna-toptal-ou-por-meio-da-toptal)",
      "description": "Qual a diferença de trabalhar na Toptal e por meio da Toptal? Sim, existe diferença! Entenda tudo que precisa saber neste vídeo: <div className=&#34;embedrespo...",
      "keywords": [
        "toptal",
        "https",
        "devpleno",
        "meio",
        "blog",
        "carreira",
        "trabalhar",
        "mais",
        "profissionais",
        "diferen"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/na-toptal-ou-por-meio-da-toptal"
      }
    },
    {
      "id": "3a310d4afd474d1c",
      "url": "https://devpleno.com/melhoria-continua",
      "title": "Melhoria Contínua - DevPleno (Part 1)",
      "content": "Carreira\n\n## Melhoria Contínua\n\nT\nPor Tulio Faria • 5 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nA dica de carreira de hoje é sempre tentar melhorar, ou seja, aplicar a melhoria contínua em seu processo de desenvolvimento de software, tecnologia que você domina e em tudo que você faz.\n\nVou contar uma história rapidinho para vocês terem uma ideia de onde eu quero chegar e porque essa dica é tão importante.\n\nTemos um cliente que pegamos um projeto já caminhando e sempre acontecia um problema. Iamos migrar o código de um servidor de desenvolvimento para um servidor de production e acontecia um monte de problemas, então entrava uma pessoa no servidor de produção e fazia uma alteração. Tudo que acontece eu anoto ou presto atenção para tentar uma forma melhor de fazer. Por exemplo, neste cliente conseguimos achar que o grande problema era que o código não passava de versões. Com isso, um dos primeiros itens que trabalhei foi organizar a ‘casa’, obviamente entramos para corrigir um monte de bugs emergenciais e agora estamos em uma melhoria contínua.\n\nA melhoria pode ter estágios, não precisa melhorar para o software dos sonhos de primeira. Quando um processo está complicado, é importante para a sua carreira que você consiga resolver o problema. Isso é até um treino, afinal, para treinar resolver problemas, você tem que resolvê-los, mesmo se você não tem autoridade para alterar o projeto, imagine as soluções que você poderia aplicar.\n\nEntão, a melhoria contínua é dar soluções novas para problemas que estão acontecendo no software. É uma obrigação, pois mostra que você é um DEVPLENO, ou seja, que tem a capacidade além do que você foi designado.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "A dica de carreira de hoje é sempre tentar melhorar, ou seja, aplicar a melhoria contínua em seu processo de desenvolvimento de software, tecnologia que vo...",
      "keywords": [
        "para",
        "melhoria",
        "https",
        "carreira",
        "cont",
        "software",
        "problema",
        "servidor",
        "problemas",
        "devpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/melhoria-continua"
      }
    },
    {
      "id": "3a612d02c49c95f2",
      "url": "https://devpleno.com/blog/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira/index",
      "title": "Como as maratonas de programação da faculdade impactaram a minha carreira (Part 4)",
      "content": "PS 2: Nas competições que citei, eu não estava sozinho. Obrigado aos meus amigos Luana Lima e Herick Ferreira, pela companhia na equipe Bender. Nós fizemos um ótimo trabalho em equipe.\n\nPS 3: Obrigado, professor Roberto Porto, pelo apoio e incentivo às competições.\n\nPS 4: Na segunda foto, Roberto Porto, eu, Luana Lima e Herick Ferreira.",
      "keywords": [
        "mais",
        "competi",
        "para",
        "como",
        "minha",
        "equipe",
        "muito",
        "isso",
        "programa",
        "pascal"
      ],
      "metadata": {
        "title": "Como as maratonas de programação da faculdade impactaram a minha carreira",
        "date": "2019-03-19",
        "tags": "['Carreira']",
        "thumbnail": "top-tal-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira/index.md"
      }
    },
    {
      "id": "3b09a46566dfd3ec",
      "url": "https://devpleno.com/vantagens-da-injecao-de-depencia",
      "title": "Vantagens da Injeção de dependência para a testabilidade do código - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Vantagens%20da%20Inje%C3%A7%C3%A3o%20de%20depend%C3%AAncia%20para%20a%20testabilidade%20do%20c%C3%B3digo&url=https%3A%2F%2Fdevpleno.com%2Fvantagens-da-injecao-de-depencia) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fvantagens-da-injecao-de-depencia)",
      "description": "Já havia falado por aqui sobre injeção de dependência, disse que muitas vezes não temos acesso ao que estamos testando. Desta vez, falo sobre as vantagens ...",
      "keywords": [
        "alert",
        "alerts",
        "message",
        "const",
        "depend",
        "para",
        "digo",
        "https",
        "browser",
        "alertmock"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/vantagens-da-injecao-de-depencia"
      }
    },
    {
      "id": "3b17af08039534da",
      "url": "https://devpleno.com/blog/escopos-e-closures/index",
      "title": "Escopos e Closures - NodeJS Primeiros Passos (Part 3)",
      "content": "return {\n    contar = function(){\n      contador++;\n    },\n    out: function(){\n      console.log(contador);\n    }\n  }\n}();\n\nconta.contar();\n\nconta.out();\n\nconta.contar();\n\nconta.out();\n```\n\nComplicando um pouco mais, podemos fazer essa Self Invoking function retornar um objeto com duas funções dentro. Então ele contou a primeira, deu um out, contou a segunda e deu outro out.\n\nPodemos fazer algumas composições e organizações de código muito interessantes apenas utilizando esse tipo de construção. Confira a explicação em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Xexyc2J-Di0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "escopo",
        "function",
        "console",
        "vari",
        "conta",
        "dentro",
        "fazer",
        "podemos",
        "contador",
        "para"
      ],
      "metadata": {
        "title": "Escopos e Closures - NodeJS Primeiros Passos",
        "date": "2017-05-25",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "ESCOPUS-E-CLOSURES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/escopos-e-closures/index.md"
      }
    },
    {
      "id": "3b7c7465be96d01f",
      "url": "https://devpleno.com/Curta",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /Curta to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "curta"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/Curta"
      }
    },
    {
      "id": "3b9915e083277e5d",
      "url": "https://devpleno.com/sobre-abrir-excecoes",
      "title": "Sobre abrir exceções e como lidar quando elas dão errado - DevPleno",
      "content": "Carreira\n\n## Sobre abrir exceções e como lidar quando elas dão errado\n\nT\nPor Tulio Faria • 27 de outubro de 2017\n\n[Carreira](/tag/carreira)\n\nPor que devemos ser mais rígidos com as decisões e com os objetivos que a gente define tanto para nossa carreira quanto para nossa vida?\n\nNessa semana, voltei a focar ainda mais no meu objetivo, pois eu tinha aberto uma exceção para uma situação. Qual o problema nisso?\n\nToda vez que você abre uma exceção e ela gera um problema para você, vem na sua cabeça uma sensação muito ruim, afinal não era para você ter feito aquilo.\n\nA lição que eu tiro disso é que lá atrás eu deveria ser mais rígido. Aprendi duas coisas com isso,eu não deveria ter fugido do meu objetivo e a não ficar remoendo uma decisão mal tomada e sim quando voltar a ter foco.\n\nMuitas vezes, tomamos decisões que não podemos acertar, mas pode ser que no futuro tudo converta novamente no foco. É isso que eu estou fazendo atualmente, cada vez mais estou focando no DevPleno e escolhendo a dedo os clientes que vou atender.\n\nEntão, não tome decisões visando apenas ajudar se tiver que fugir do seu objetivo.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Sobre%20abrir%20exce%C3%A7%C3%B5es%20e%20como%20lidar%20quando%20elas%20d%C3%A3o%20errado&url=https%3A%2F%2Fdevpleno.com%2Fsobre-abrir-excecoes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsobre-abrir-excecoes)",
      "description": "Por que devemos ser mais rígidos com as decisões e com os objetivos que a gente define tanto para nossa carreira quanto para nossa vida? Nessa semana, volt...",
      "keywords": [
        "para",
        "https",
        "carreira",
        "mais",
        "decis",
        "abrir",
        "exce",
        "objetivo",
        "devpleno",
        "sobre"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/sobre-abrir-excecoes"
      }
    },
    {
      "id": "3badccc22bc47500",
      "url": "https://devpleno.com/por-que-todo-dev-usa-mac",
      "title": "Por que todo Dev usa Mac? - DevPleno (Part 2)",
      "content": "Outro ponto muito importante é que existem muitos aplicativos exclusivos para Mac e outros exclusivos para Windows. Existe, por exemplo, um aplicativo chamado Sketch que te ajuda a criar um layout, esboçar o aplicativo, como um photoshop misturado com illustrator para criar interfaces, e ele existe apenas no Mac.\n\nMas no final das contas isso não importa muito, afinal eu programei minha vida inteira em Windows e não há vergonha nenhuma nisso. Minha mudança foi por causa da performance que eu precisava no Mac. Se algo está te atrasando, você deve mudar, não é natural gastar muito tempo por conta da sua máquina.\n\nCaso você ande com um notebook para cima e para baixo, o Mac te da a sensação de ser mais ‘parrudo’, é a única coisa que é MUITO diferente de um DELL, por exemplo. O Mac é melhor acabado. O maior empecilho é que no Brasil você terá que investir por volta de R$18.000,00 para ter um Mac, a não ser que você peça para alguém trazer do exterior, como foi o meu caso. :)\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Por%20que%20todo%20Dev%20usa%20Mac%3F&url=https%3A%2F%2Fdevpleno.com%2Fpor-que-todo-dev-usa-mac) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpor-que-todo-dev-usa-mac)",
      "description": "Uma pergunta comum que sempre me fazem é: Por que a maioria dos desenvolvedores usa Mac? Bom, vou comentar algumas coisas que eu vejo. O primeiro motivo é ...",
      "keywords": [
        "para",
        "muito",
        "como",
        "poss",
        "isso",
        "https",
        "todo",
        "quina",
        "aplicativos",
        "windows"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/por-que-todo-dev-usa-mac"
      }
    },
    {
      "id": "3bc2e8ce3e91a8ea",
      "url": "https://devpleno.com/blog/aprenda-a-aprender/index",
      "title": "Aprenda a aprender (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "aprender",
        "mais",
        "quando",
        "algo",
        "forma",
        "isso",
        "como",
        "aprendendo",
        "outra"
      ],
      "metadata": {
        "title": "Aprenda a aprender",
        "date": "2017-07-12",
        "tags": "['Carreira']",
        "thumbnail": "APRENDA-A-APRENDER-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/aprenda-a-aprender/index.md"
      }
    },
    {
      "id": "3bf15bc22311066a",
      "url": "https://devpleno.com/blog/hands-on-nodemon/index",
      "title": "Nodemon: Monitore alterações e reinicie automaticamente seus scripts (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "server",
        "vamos",
        "nodemon",
        "arquivos",
        "fazer",
        "express",
        "embed",
        "3000",
        "muito",
        "console"
      ],
      "metadata": {
        "title": "Nodemon: Monitore alterações e reinicie automaticamente seus scripts",
        "date": "2017-07-28",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Nodemon.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-nodemon/index.md"
      }
    },
    {
      "id": "3c81533a0b70c319",
      "url": "https://devpleno.com/blog/carreira-preco-que-tem-que-ser-pago/index",
      "title": "Carreira: Preço que tem que ser pago",
      "content": "Neste vídeo, faço uma análise de como aprendemos novas skills. Confira!\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/_yWmWVqKnAg\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "embed",
        "https",
        "responsive",
        "confira",
        "devpleno",
        "facebook",
        "youtube",
        "classname",
        "iframe",
        "neste"
      ],
      "metadata": {
        "title": "Carreira: Preço que tem que ser pago",
        "date": "2017-05-02",
        "tags": "['Carreira']",
        "thumbnail": "NOVAS-SKILLS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/carreira-preco-que-tem-que-ser-pago/index.md"
      }
    },
    {
      "id": "3cb5000b91df2797",
      "url": "https://devpleno.com/minicurso-socket-io-parte-1",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto - DevPleno (Part 5)",
      "content": "router.get('/match', function (req, res, next) {\nconst matches = db.get('matches').value()\nconst match = db.get('matches[' + req.params.id + ']').value()\nres.render('match', { matches, match, id: req.param.id })\n})\nAo final, renderizamos o view match e mandamos uma lista para la, matches, match e id.\n\nEle não vai encontrar o view match, então vamos novamente nos arquivos de apoio, pegamos o arquivo match.ejs dentro do diretório views e colamos dentro de views do projeto. Agora já temos os dados sendo jogados na tela.\n\n**Como ele está colocando esses dados na tela?**\n\nDentro do view/match.ejs importamos o",
      "description": "Essa é a primeira parte do nosso minicurso de Socket.IO. Nesta etapa, vamos começar o projeto e criar as primeiras páginas para dar o suporte à aplicação. ...",
      "keywords": [
        "vamos",
        "para",
        "dentro",
        "matches",
        "views",
        "express",
        "pasta",
        "index",
        "match",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-1"
      }
    },
    {
      "id": "3d0216a28d7c8ee2",
      "url": "https://devpleno.com/blog/javascript-streams-p-4-transform/index",
      "title": "Javascript: Streams (P-4: Transform)",
      "content": "Na quarta parte sobre Streams, falo sobre Transform. Confira!\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/gp7sB7-bPAg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "sobre",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "para"
      ],
      "metadata": {
        "title": "Javascript: Streams (P-4: Transform)",
        "date": "2017-04-28",
        "tags": "['Javascript']",
        "thumbnail": "JSStreamPart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/javascript-streams-p-4-transform/index.md"
      }
    },
    {
      "id": "3d1bac690b5d2966",
      "url": "https://devpleno.com/blog/hands-on-jest/index",
      "title": "Jest - Como utilizar a ferramenta de testes criada pelo Facebook (Part 2)",
      "content": "Podemos fazer o seguinte para testar essa função:\n\n```jsx\nconst modulo1 = require('./modulo1')\ndescribe('basic features', () => {\n  it('should return the right value', () => {\n    expect(modulo1.func1(10)).toBe(11)\n  })\n  it('func2', () => {\n    const cb = jest.fn()\n    cb.mockReturnValue(1)\n    expet(modulo1.func2(10, cb)).toBe(11)\n  })\n})\n```\n\nNão implementamos ali a função 2, mas passamos um mock para ele, ou seja, passamos uma função falsa para essa função 2 usando o jest.fn, que serve exatamente para mockar funções. Dentro do mock, queremos que ele retorne 1.\n\nSe colocarmos um\n\n```js\nconsole.log(cb.mock.calls)\n```\n\nvamos conseguir até mesmo inspecionar se a chamada foi com o valor correto.\n\nO Jest é muito interessante, pois já vem com esquema de mock, a parte de axceptions, parte de test runner e é um pouco mais rápido, principalmente quando formos testar componentes em React, e ainda tem um esquema chamado SnapShot, que tira 'fotos' dos componentes que você fizer no React para ele perceber se precisa ou não executar aquele componente. Por exemplo, renderizamos esse componente usando o JSDom e, se falhar, comparando essas fotos do componente de antes e depois, você será avisado.\n\nConfira:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/uRTKUjeua3g\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "modulo1",
        "jest",
        "para",
        "rodar",
        "vamos",
        "test",
        "const",
        "testes",
        "teste",
        "yarn"
      ],
      "metadata": {
        "title": "Jest - Como utilizar a ferramenta de testes criada pelo Facebook",
        "date": "2017-07-08",
        "tags": "['Javascript']",
        "thumbnail": "Jest2.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-jest/index.md"
      }
    },
    {
      "id": "3d340a824b4b8972",
      "url": "https://devpleno.com/desenvolvedor-full-stack-o-que-e-e-como-se-tornar",
      "title": "Desenvolvedor Full Stack: o que é e como se tornar? - DevPleno (Part 4)",
      "content": "Em boa parte das empresas, os desenvolvedores Full Stack são vistos como representantes da área de desenvolvimento, capazes de responder questionamentos sobre toda a estrutura de produção do setor. Mas para se comunicar claramente e compreender as demandas e dúvidas externas, é necessário que ele conheça também a regra do negócio.\n\nAlém disso, com uma visão que englobe também a parte de negócios, o dev será capaz de enxergar quais são as funcionalidades que vão agregar valor efetivo ao software, facilitando a priorização delas.\n\nOu seja, mesmo depois de expandir seus horizontes aprendendo tudo sobre front-end e back-end, é desejável que o desenvolvedor Full Stack amplie ainda mais o seu conhecimento em ‘T’. Além de aprender sobre essa parte de negócios, ele também pode desbravar outras áreas, como o desenvolvimento ágil de projetos, networking e habilidades de liderança.\n\nE você, o que considera essencial e desejável para se tornar um desenvolvedor Full Stack e dominar o processo de produção de softwares?\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Desenvolvedor%20Full%20Stack%3A%20o%20que%20%C3%A9%20e%20como%20se%20tornar%3F&url=https%3A%2F%2Fdevpleno.com%2Fdesenvolvedor-full-stack-o-que-e-e-como-se-tornar) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdesenvolvedor-full-stack-o-que-e-e-como-se-tornar)",
      "description": "Cada vez mais a figura do desenvolvedor Full Stack ganha espaço em empresas de TI e desenvolvimento de software. Esse perfil profissional que combina as ha...",
      "keywords": [
        "full",
        "stack",
        "desenvolvedor",
        "como",
        "tornar",
        "front",
        "back",
        "para",
        "profissional",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/desenvolvedor-full-stack-o-que-e-e-como-se-tornar"
      }
    },
    {
      "id": "3d393adbf812e983",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-2/index",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO (Part 3)",
      "content": "```jsx\n    function indexRouter(dependecies){\n        //definindo o bd\n        const low = require('lowdb')\n        const db = low(__dirname+'/../data/db.json')\n        const defaultData = require('../data/default-data.json')\n        db.defaults(defaultData).write()\n        ....\n    });\n    return router;\n}\n```\n\nEntão tiramos todo o código que estava dentro do index, criamos uma função indexRouter, fizemos todo o código rodar normal e ao fim retornamos esse router, passando a referencia dessa função para quem chamar ele, exatamente a mesma coisa que o construtor do Socket.IO faz.\n\nAgora temos acesso a essas dependências:\n\n```jsx\nfunction indexRouter(dependecies){\n    console.log(dependencies)\n    //definindo o bd\n    ...\n}\n```\n\nVoltando ao app.js vamos fazer o seguinte:\n\n```jsx\nvar index = require('./routes/index')({ io: app.io })\n```\n\nO require irá retornar uma função, não a execução dessa função e sim a função em si, já o io:app.io fala para executar esse função e eu passo um parâmetro para ele, que são as dependências que eu quero injetar nesse router.\n\nAo executar o código, perceba que agora temos uma instancia de IO dentro do indexRouter. Voltando ao index, vamos trocar o BD de lugar também, recortamos ele do index.js e vamos colar em app.js. Como o app está na raiz, eu preciso concertar os caminhos:\n\n```jsx\n//definindo o bd\nconst low = require('lowdb')\nconst db = low(__dirname + '/data/db.json')\nconst defaultData = require('./data/default-data.json')\ndb.defaults(defaultData).write()\n```\n\nEle vai quebrar o código, mas fique tranquilo, era para isso acontecer mesmo. Agora vamos enviar o banco para o index.js também\n\n```jsx\nvar index = require('./routes/index')({ io: app.io, db })\n```\n\nAgora vocês podem perceber que ao startar o projeto temos a dependência do DB. Como construímos um projeto todo dependendo de DB, eu posso apagar o console.log que colocamos dentro da função indexRouter e colocar o seguinte:\n\n```jsx\nconst { db, io } = dependencies\n```",
      "keywords": [
        "vamos",
        "socket",
        "para",
        "index",
        "admin",
        "const",
        "criar",
        "dentro",
        "fazer",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO",
        "date": "2017-07-06",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart2.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-2/index.md"
      }
    },
    {
      "id": "3d6c7c018a266fd9",
      "url": "https://devpleno.com/dica-es6-destructuring-assignament",
      "title": "Dica: ES6 - Destructuring Assignament - DevPleno",
      "content": "Javascript\n\n## Dica: ES6 - Destructuring Assignament\n\nT\nPor Tulio Faria • 30 de maio de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nNesta dica, comento sobre uma novidade que veio com o ES6: o Destructuring Assignament, que permite uma grande organização e aumento de legibilidade do código. Confira!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20ES6%20-%20Destructuring%20Assignament&url=https%3A%2F%2Fdevpleno.com%2Fdica-es6-destructuring-assignament) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-es6-destructuring-assignament)",
      "description": "Nesta dica, comento sobre uma novidade que veio com o ES6: o Destructuring Assignament, que permite uma grande organização e aumento de legibilidade do cód...",
      "keywords": [
        "https",
        "destructuring",
        "assignament",
        "javascript",
        "dica",
        "fundamentos",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fdica"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-es6-destructuring-assignament"
      }
    },
    {
      "id": "3da424d960ea9266",
      "url": "https://devpleno.com/sobre-o-devpleno",
      "title": "Sobre o DevPleno - DevPleno (Part 2)",
      "content": "Bingo! Nunca estive tão motivado a começar algo como o DevPleno que impacta diretamente a vida de tantas pessoas!\n\n### Tecnologia+Processos+Negócios = DevPleno – um profissional que entrega resultados\n\n## Um pouco da minha história até virar DevPleno\n\nEu fui criado em uma família humilde. Meus pais não possuem curso superior. Porém, eles fizeram muito por mim e meus irmãos: eles investiram toda a energia e recursos possíveis para que tivéssemos chances de estudar nos melhores colégios (claro que neste ponto também fazíamos nossa parte – por exemplo, do ensino fundamental ao médio – sempre estudei com bolsas de estudo por mérito).\n\nNeste caminho pude assistir e participar da superação deles para financeiramente prover uma educação de qualidade para mim e meus irmãos. Vi a trajetória da minha mãe, saindo de dona de casa a criar uma mercearia/quitanda que mantinha muitas das contas da casa. Além de meu pai, que era funcionário e fora do horário comercial e nos fim de semana estendia a mercearia para virar também um bar. Isso foi muito importante para a minha formação como pessoa: pois eu pude aprender o valor da persistência e do empreendedorismo. Assisti inúmeras vezes meu pai literalmente caindo de sono nas suas empreitadas fora do horário comercial. Porém, totalmente alinhado e comprometido com seu objetivo. As lições de empreendedorismo que aprendi com minha mãe são incontáveis e bastante surpreendentes! Ela sabia exatamente como agregar valor aos seus produtos (na época minha mãe chegou a vender cheiro-verde (cebolinha e salsinha) e couve picadas, pois percebeu que algumas clientes não gostavam de fazer isso. Então ela fazia e cobrava mais caro\n\nNesta época, ajudávamos como podíamos. Eu fui entregador, atendente e garçom. Além de ajudar a realizar as compras nos centro de abastecimentos. Isso foi muito importante para a minha formação!",
      "description": "Olá, tudo bem? Meu nome é Tulio Faria e sou o criador do DevPleno, e com certeza você já se perguntou:  Como posso ser um desenvolvedor melhor?  Como apren...",
      "keywords": [
        "para",
        "como",
        "mais",
        "devpleno",
        "minha",
        "muito",
        "isso",
        "cada",
        "carreira",
        "meus"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/sobre-o-devpleno"
      }
    },
    {
      "id": "3df087c73dc2b90c",
      "url": "https://devpleno.com/blog/entenda-a-importancia-de-cursos-para-desenvolvedores/index",
      "title": "Entenda a importância de cursos para desenvolvedores (Part 4)",
      "content": "Por fim, mas não menos importante, vale a pena considerar o aprendizado em Redux, uma nova forma de controle e organização do estado da aplicação. O Redux oferece ganhos de qualidade e estabilidade e saber usá-lo é um grande diferencial para qualquer profissional.\n\nCada capacitação é como evoluir um nível e pode lhe deixar mais perto do seu sonho.\n\nO ideal é que os cursos tenham aulas práticas para que você possa colocar a mão na massa. O DevPleno oferece um excelente curso de ReactJS para que você possa se aprimorar e manter-se bem qualificado no mercado de trabalho. Conheça o [devReactJS](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog).",
      "keywords": [
        "para",
        "mais",
        "cursos",
        "pode",
        "empresa",
        "habilidades",
        "poss",
        "desenvolvimento",
        "isso",
        "reactjs"
      ],
      "metadata": {
        "title": "Entenda a importância de cursos para desenvolvedores",
        "date": "2017-07-07",
        "tags": "['Carreira']",
        "thumbnail": "102980-entenda-a-importancia-de-cursos-para-desenvolvedores-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/entenda-a-importancia-de-cursos-para-desenvolvedores/index.md"
      }
    },
    {
      "id": "3e17c1b50b645231",
      "url": "https://devpleno.com/se-sujar-faz-bem",
      "title": "Porque se sujar faz bem! - DevPleno (Part 2)",
      "content": "Para eu conseguir negociar um serviço atualmente, eu tive que errar muito lá atrás. Existe uma possibilidade. Se você acompanha nosso trabalho, tem uma chance e uma oportunidade muito legal, quando você consome os conteúdos, é a chance que você tem de aprender com os erros que eu já cometi. Quando eu construo algo com em ReactJS ou Socket.IO, já errei muito nisso, seja aprendendo ou na aplicação em si, e aqui você tem uma oportunidade muito legal de conhecer um pouco mais disso sem precisar se sujar tanto, afinal estamos passando um caminho mais confortável para você trilhar na sua carreira. Então se você está aqui, já tem uma vantagem muito grande competitivamente no mercado de trabalho.\n\nConfira o video:\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Porque%20se%20sujar%20faz%20bem!&url=https%3A%2F%2Fdevpleno.com%2Fse-sujar-faz-bem) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fse-sujar-faz-bem)",
      "description": "Uma coisa que sempre marcou a minha infância foram as propagandas do sabão em pó OMO que via na TV. O slogan era “Se sujar faz bem” e mostrava as crianças ...",
      "keywords": [
        "sujar",
        "muito",
        "mais",
        "https",
        "carreira",
        "medo",
        "para",
        "fazer",
        "errar",
        "certo"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/se-sujar-faz-bem"
      }
    },
    {
      "id": "3e200ab1f653b23a",
      "url": "https://devpleno.com/tag/fundamentos/3",
      "title": "Fundamentos - Pagina 3 - DevPleno",
      "content": "Fundamentos\n\n## Arquivo de Insights\n\n56 posts encontrados com a tag Fundamentos\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)\n\n[Fundamentos 16 de jun. de 2017 HA e AS em Aplicação Web - Web Basic](/ha-e-as)\n\n[Javascript 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)\n\n[Fundamentos 6 de jun. de 2017 Autenticação e Autorização - Entenda os termos](/autenticacao-e-autorizacao)\n\n[Javascript 1 de jun. de 2017 Vantagens da Injeção de dependência para a testabilidade do código](/vantagens-da-injecao-de-depencia)\n\n[Javascript 30 de mai. de 2017 Dica: ES6 - Destructuring Assignament](/dica-es6-destructuring-assignament)\n\n[Javascript 30 de mai. de 2017 ES6 - Template Strings](/template-strings)\n\n[Javascript 26 de mai. de 2017 Currying - Uma técnica interessante usada em programação funcional](/currying)\n\n[Javascript 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)\n\n[Javascript 23 de mai. de 2017 Servidores Web - Um pouco mais do back-end de uma Aplicação Web](/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web)\n\n[Fundamentos 22 de mai. de 2017 Animação basica em CSS3](/animacao-basica-css3)\n\n[Javascript 22 de mai. de 2017 Request e Response](/request-e-response)\n\n[Anterior](/tag/fundamentos/2)3 / 5[Próxima](/tag/fundamentos/4)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "fundamentos",
        "nodejs",
        "primeiros",
        "passos",
        "algoritmos",
        "carreira",
        "ferramentas",
        "reactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/fundamentos/3"
      }
    },
    {
      "id": "3e4e2b50ba51f3f8",
      "url": "https://devpleno.com/como-encadear-promises",
      "title": "Como encadear promises - DevPleno (Part 2)",
      "content": "readFile('promises.js').then(writeFile('tst.js', contents))\nVamos dizer a ele para ler o nosso arquivo e em seguida escrever um outro arquivo, o problema é que se fizermos dessa forma, quando ele passar ‘parseando’ o código, ele já vai executar esse primeiro writeFile, se não estivéssemos passando um file, poderíamos fazer isso direto, mas como isso não acontece, temos que utilizar o bind, pois ele vai criar uma nova função, a onde eu posso passar o contexto que eu quero executar essa função e fazer um curring fixando alguns atributos da esquerda para a direita:\n\nreadFile('promises.js').then(writeFile.bind(null, 'tst2.js'))\nA grande dica é entender como funciona isso. Podemos colocar um then após o outro, podemos fazer um novo teste:\n\nconst out (contents) => {\nreturn new Promise(resolve =>{\nsetTimeout(() => {\nconsole.log(contents)\n\nresolve()\n}, 2000)\n})\n}\nCom isso, caso a gente queira fazer um teste no then, podemos fazer o seguinte:\n\nreadFile('promises.js')\n.then(out)\n.then(() => console.log('final'))\nRetornando as promises nós conseguimos encadear, essa é uma grande vantagem em relação a um callback, afinal conseguimos fazer o código crescer para baixo ao invés de crescer para frente, evitamos o callback hell.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20encadear%20promises&url=https%3A%2F%2Fdevpleno.com%2Fcomo-encadear-promises) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-encadear-promises)",
      "description": "Na dica de hoje, vamos continuar falando sobre promises. Vou mostrar um detalhe na promise que é bastante interessante: como podemos encadear promises, ou ...",
      "keywords": [
        "promises",
        "contents",
        "promise",
        "para",
        "fazer",
        "then",
        "readfile",
        "writefile",
        "como",
        "encadear"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/como-encadear-promises"
      }
    },
    {
      "id": "3e5e88cfe1bb2f13",
      "url": "https://devpleno.com/blog/hands-on-shelljs/index",
      "title": "Hands-on: ShellJS",
      "content": "Uma tarefa que faço bastante no meu dia a dia é a construção de ferramentas para transformar dados, fazer algum processamento ou até mesmo copiar montantes de dados.\n\nEstas ferramentas quando precisam de algum comando do shell do linux, acabam restringindo a execução destas ferramentas a uma só plataforma. O ShellJS é um módulo que implementa comandos do shell do linux em Javascript multi-plataforma.\n\nAssim seu script pode utilizar recursos do shell e ainda ser multiplataforma.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/7ICR9KhNTGo\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "ferramentas",
        "shell",
        "responsive",
        "https",
        "youtube",
        "para",
        "dados",
        "algum",
        "linux"
      ],
      "metadata": {
        "title": "Hands-on: ShellJS",
        "date": "2017-03-03",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "ShelJS.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-shelljs/index.md"
      }
    },
    {
      "id": "3eba3d569f75c17d",
      "url": "https://devpleno.com/blog/once-n-vezes/index",
      "title": "Once N vezes (Part 1)",
      "content": "Essa dica é sobre uma técnica em JavaScript de uma função utilitária que permite que uma outra função só seja executada uma única vez (Once).\n\n**Para que fazer isso?**\n\nVamos supor que você carregou uma página ou algo via AJAX e deve fazer alguma operação,mas essa operação só pode acontecer uma única vez (e você pode ter mais de uma operação) então se colocar no final de cada uma, a que acontecer primeiro não deixa as posteriores acontecerem. isso evita algum tipo de concorrência.\n\nVamos criar uma função func1. Ela só vai poder ser chamada uma vez, mesmo sendo chamada duas vezes. Para isso, vou criar uma função once, essa vai ser a função que permitirá que uma outra função qualquer (que no caso vai ser a fn) seja executada somente uma vez. Para isso, precisamos de uma variável resultado e uma return function.\n\n```jsx\nfunction once(fn, context){\n    let result\n        return function(){\n    }\n}\nconst func1 = once(function){\n    console.log('opah')\n})\nfunc1()\nfunc1()\n```\n\nQuando chamamos o once e passamos a function\n\n```jsx\n'console.log('opah')'\n```\n\nestamos passando ele para dentro de fn, então ela vai retornar uma outra função. O detalhe é que essa função que estamos retornando volta e fica dentro de func1, porém o contexto **let result** fica travado, então é possível saber quantas vezes essa função foi chamada.\n\n```jsx\nfunction once(fn, context) {\n  let result\n  let contador = 0\n  return function () {\n    contador++\n    console.log(contador)\n  }\n}\n```\n\nChamando o arquivo.js será mostrado o número de vezes que foi chamada a função (no caso, 2 vezes).\n\nAgora vamos fazer com que ele bloqueie as próximas chamadas usando um if. Se o contador for igual a 0, chamamos a função. Caso já tenha sido executada uma vez, ela vai parar.\n\nPara isso, chamaremos a função fn, o contexto – caso não venha contexto nenhum, ele mandará o da própria função – guardamos isso dentro de result e por fim incrementamos o contador e damos o retorno do result.",
      "keywords": [
        "contador",
        "function",
        "result",
        "once",
        "para",
        "isso",
        "return",
        "essa",
        "func1",
        "vezes"
      ],
      "metadata": {
        "title": "Once N vezes",
        "date": "2017-05-22",
        "tags": "['Algoritmos']",
        "thumbnail": "OnceNVezes.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/once-n-vezes/index.md"
      }
    },
    {
      "id": "3eca9fb4de612d37",
      "url": "https://devpleno.com/blog/nodejs-primeiros-passos-modulos/index",
      "title": "NodeJS Primeiros Passos: Módulos",
      "content": "Neste vídeo vamos abordar organização de código em NodeJS através de módulos.\n\nCódigo fonte criado no vídeo: https://github.com/devpleno/nodejs-modulos\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/9yX4ifWa0YU\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "https",
        "embed",
        "devpleno",
        "responsive",
        "digo",
        "nodejs",
        "classname",
        "iframe",
        "youtube",
        "facebook"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Módulos",
        "date": "2016-07-27",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "NPMModulos.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/nodejs-primeiros-passos-modulos/index.md"
      }
    },
    {
      "id": "3eccb6e0a8a5370e",
      "url": "https://devpleno.com/blog/renderizar-estruturas-em-formato-de-arvore/index",
      "title": "ReactJS Recursivo? (Part 1)",
      "content": "Hoje vamos fazer algo que é bastante convencional em sistemas: renderizar estruturas de dados em formato de árvore. No exemplo, será uma árvore binária, mas como poderíamos renderizar no ReactJS.\n\nEm que isso é útil?\n\nVamos supor que você tenha uma interface com um menu lateral e esse menu tem formato de uma pasta dentro da outra, seria muito útil, pois você poderia fazer um item dentro do outro sendo renderizado de forma 'infinita'. Recursividade é algo muito importante para qualquer sistema, e podemos fazer isso dentro do React utilizando alguns conceitos de recursividade.\n\nEu já tenho um projeto criado, apenas com create React App, nada além disso. Primeiro vamos criar uma estrutura chamada nodes que vai ser nossa árvore em si. Teremos o lado direito, esquerdo e o valor que será uma multiplicação. Do lado esquerdo, vamos ter um valor 1, do lado direito, um outro valor 2 e o 'v' dele vai ser uma divisão.\n\n```jsx\nclass App extends Component {\n    render(){\n        const nodes = {\n        l:{ l:{ v: 1 }, r:{v: 2},\n        v: '/'},\n\n        r:{v: 10}\n        v:'*'\n        }\n        return(\n            <div>\n                <h1> welcome to React</h1>\n            </div>\n        )\n    }\n}\n```\n\nPerceba que do lado direito temos somente um valor 10. Vamos colocar como se fosse um parênteses do lado esquerdo e depois colocar multiplicado por 10 do lado direito, temos que renderizar os itens do lado esquerdo e depois do lado direito de forma recursiva, então não preciso fazer nenhum _for_.\n\nComo fazemos isso de forma recursiva?\n\nA primeira coisa que vamos fazer é criar um outro arquivo chamado node.js, importar o react para usarmos o JSX e, para ficar simples, vamos fazer com functional stateless component:\n\n```jsx\nimport React from 'react'\n\nconst Node = (props) => {\n  return <p> Node </p>\n}\nexport default Node\n```\n\nVoltando ao App.js vamos importar o node e ao invés de colocarmos o H2 vamos colocar o nó dentro dele:",
      "keywords": [
        "node",
        "props",
        "span",
        "lado",
        "vamos",
        "para",
        "renderizar",
        "fazer",
        "isso",
        "react"
      ],
      "metadata": {
        "title": "ReactJS Recursivo?",
        "date": "2017-06-28",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "ReactRecursivo.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/renderizar-estruturas-em-formato-de-arvore/index.md"
      }
    },
    {
      "id": "3ed2fdec4cb78cae",
      "url": "https://devpleno.com/streams-parte-1",
      "title": "Hands-on: Streams - Parte 1 - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Streams%20-%20Parte%201&url=https%3A%2F%2Fdevpleno.com%2Fstreams-parte-1) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fstreams-parte-1)",
      "description": "Olá! Neste post, vamos falar sobre Streams, um conceito utilizando em JavaScript mas que pode ser aplicado em outras linguagens. Nele temos uma grande quan...",
      "keywords": [
        "readable",
        "dados",
        "arquivo",
        "stream",
        "data",
        "para",
        "vamos",
        "const",
        "https",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/streams-parte-1"
      }
    },
    {
      "id": "3edb9881ea154e6b",
      "url": "https://devpleno.com/hands-on-socket-io-parte-3",
      "title": "Hands-on - Socket.io Parte 3 - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on - Socket.io Parte 3\n\nT\nPor Tulio Faria • 15 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNesta terceira parte sobre comunicação em tempo-real com NodeJS e Socket.io, vamos começar com algo muito interessante: como podemos agrupar usuários para o envio de notificações. Também será abordado o conceito de rooms, uma maneira de segmentar os usuários. Vamos lá?!\n\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\napp.get('/', (req, res)=>{\nres.sendFile(__dirname+'/index.html')\n})\nio.on('connection', (socket)=>{\nconsole.log('New connection', socket.id)\nsocket.on('msg', (msg)=>{\nconsole.log(msg)\nsocket.broadcast.emit('msg', msg);\n})\nhttp.listen(3000, function(){\nconsole.log('listening on port 3000')\n})\n}\nQuando mandamos mensagens neste nosso código, estamos emitindo para todos os usuários. Se formos criar um jogo online, chat, temos um conceito de sala ou seção de um jogo. Agora vamos imaginar o seguinte: O usuário se conecta e a partir disso vamos pegar seu Socket, que é a representação do seu ID de usuário entre em uma sala utilizando um join, no exemplo utilizado ‘contador’. O join vai dizer que o usuário quer entrar na sala, ou canal, e a partir desse momento o usuário vai receber qualquer mensagem que for disparada neste canal.\n\nio.on('connection', (socket)=>{\nconsole.log('New connection', socket.id)\nsocket.on('msg', (msg)=>{\nconsole.log(msg)\nsocket.broadcast.emit('msg', msg);\nsocket.join('contador');\n})\nCom isso podemos, por exemplo, contar quantas pessoas existem na sala e emitir uma mensagem com o número de pessoas nela de tempos em tempos.\n\nVamos executar um exemplo rápido onde criamos um contador, um set interval utilizando um io.to (que é uma instância do socket.io), selecionamos a sala a qual queremos mandar a mensagem e enviaremos a mensagem a cada 1 segundo.",
      "description": "Nesta terceira parte sobre comunicação em temporeal com NodeJS e Socket.io, vamos começar com algo muito interessante: como podemos agrupar usuários para o...",
      "keywords": [
        "socket",
        "para",
        "vamos",
        "sala",
        "mensagem",
        "https",
        "parte",
        "console",
        "contador",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-on-socket-io-parte-3"
      }
    },
    {
      "id": "3f36e9edc5deeb11",
      "url": "https://devpleno.com/blog/generators-functions/index",
      "title": "Generators Functions - o que acontece por baixo dos panos (Part 2)",
      "content": "```jsx\nfunction* generator() {\n  console.log('Entrou no generator')\n  console.log('Segundo passo')\n  yield 'outro valor'\n  console.log('Penultimo passo')\n  console.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\ngen.next()\n```\n\nPerceba que ele fez os dois primeiros passos, pausou para retornar o yeild, e por fim fez os dois últimos passos, por isso é chamada de função pausavel.\n\nNo yeild, podemos por exemplo retornar uma promise:\n\n```jsx\nfunction* generator(){\n    console.log('Entrou no generator')\n    console.log('Segundo passo')\n    yield new Promise((resolve, reject) => {\n        setTimeout(() => resolve(10),  2000\n    })\n    console.log('Penultimo passo')\n    console.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\niteration.value.then(() => {\n    gen.next()\n})\n```\n\nImagine que estamos buscando no banco de dados alguma informação; quando fazemos isso, estamos fazendo uma operação assíncrona e ela vai demorar mais tempo porque é um IO, o yeild está simulando essa busca e o iteration.value.then está esperando essa 'busca' para retornar as próximas informações.\n\nEntão o que o CO faz é o controle de chamar o next e executar o then de forma organizada. Vamos supor que esse código fosse um function ReadFilePromise:\n\n```jsx\nfunction ReadFilePromise () {\n    return new Promise((resolve, reject) => {\n        setTimeout(() => resolve(10),  2000\n    )})\n}\nfunction* generator(){\n    console.log('Entrou no generator')\n    console.log('Segundo passo')\n    const value = yield readFilePromise()\n    console.log('Penultimo passo' value)\n    console.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\niteration.value.then(()=>{\n    gen.next()\n})\n```\n\nAo fazer isso, ele vai chamar a nossa function ReadFilePromise e esperar. Para aproximar mais do CO o value tem que vir preenchido, mas perceba que ele veio com undefined porque não aproveitamos o value no then. Então vamos aproveitar:",
      "keywords": [
        "generator",
        "console",
        "next",
        "const",
        "iteration",
        "function",
        "para",
        "passo",
        "value",
        "valor"
      ],
      "metadata": {
        "title": "Generators Functions - o que acontece por baixo dos panos",
        "date": "2017-06-29",
        "tags": "['Javascript']",
        "thumbnail": "GENERATORS-FUNCTIONS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/generators-functions/index.md"
      }
    },
    {
      "id": "3f60414d395ebfb4",
      "url": "https://devpleno.com/blog/standard-parte-2/index",
      "title": "Standard Parte 2",
      "content": "Para complementar o hands-on que fizemos sobre [Standard](https://www.devpleno.com/standard-parte-1/), vou passar mais duas dicas sobre a ferramenta. A primeira é uma biblioteca que se chama Snazzy e a segunda é uma forma de automatizar a formatação do código fonte.\n\nImagine o seguinte, você tem um código gigante que precisa passar para o Standard, o que podemos fazer? Vamos lá:\n\n```jsx\nstandard --fix script.js\n```\n\nCom isso ele já corrigiu o arquivo fonte. Podemos utilizar para formatar automaticamente, eu não uso tanto para formatar dependendo do arquivo porque eu gosto de corrigir para não errar novamente. O segundo módulo se chama Snazzy. Primeiramente vamos instalar:\n\n```jsx\nnpm install -g snazzy\n```\n\nSe rodarmos Standard no nosso código, percebemos que é bem difícil de entender ou achar onde está o problema, então se fizermos:\n\n```jsx\nstandard | snazzy\n```\n\nEle vai organizar os erros da seguinte forma:\n\n![Exemplo](standardDExU.png)\n\nEle formata as saídas falando os problemas do código de forma organizada, então temos um erro na linha 1 no caracter 6, na linha 2 também, no caracter 6; e na linha 3, o caracter 1, todos eles explicando os erros.\n\nEu geralmente uso o Snazzy, dou uma olhada no arquivo, se não for nada muito grave, uso o --fix para corrigir o arquivo. Recomendo que façam isso também, porque talvez alguma alteração pode atrapalhar seu código.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ISVp1mlB1BA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "standard",
        "snazzy",
        "digo",
        "https",
        "arquivo",
        "embed",
        "devpleno",
        "forma",
        "linha"
      ],
      "metadata": {
        "title": "Standard Parte 2",
        "date": "2017-07-24",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "StandardPart2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/standard-parte-2/index.md"
      }
    },
    {
      "id": "3f6c3cefe4d56096",
      "url": "https://devpleno.com/coisas-ruins-normais",
      "title": "Coisas ruins normais - DevPleno",
      "content": "Carreira\n\n## Coisas ruins normais\n\nT\nPor Tulio Faria • 28 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nEssa dica de carreira é bem rápida, mas muito importante. Uma coisa que eu vejo acontecer com frequência é o fato das pessoas acharem que certas coisas ruins são normais. Por exemplo, vamos supor que você vá colocar o seu site ou uma atualização do seu sistema no ar e aquilo demora muito tempo… Quando está muito trabalhoso de se fazer, não está bom porque deve ser natural. Imagine que você tem que lembrar uma sequência de 50 pastas para colocar o sistema no ar.\n\nSempre que você perceber algumas situações como essa, verifique se não há uma maneira melhor de fazer isso. Já aconteceu de eu entrar em algumas equipes, nas quais algumas pessoas falavam algo do tipo: “isso funciona muito bem, só precisamos fazer isso, ou aquilo e depois isso.” No fim das contas, você tinha 50 processos para fazer em cada coisa. Se você organizasse, aquilo funcionaria muito melhor. Então não ache que está tudo normal se você está tendo muito trabalho para fazer algo.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Coisas%20ruins%20normais&url=https%3A%2F%2Fdevpleno.com%2Fcoisas-ruins-normais) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcoisas-ruins-normais)",
      "description": "Essa dica de carreira é bem rápida, mas muito importante. Uma coisa que eu vejo acontecer com frequência é o fato das pessoas acharem que certas coisas rui...",
      "keywords": [
        "muito",
        "https",
        "fazer",
        "carreira",
        "ruins",
        "normais",
        "para",
        "isso",
        "coisas",
        "aquilo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/coisas-ruins-normais"
      }
    },
    {
      "id": "3f834f654fab3acd",
      "url": "https://devpleno.com/como-gerar-um-array-populado-em-javascript",
      "title": "Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos - DevPleno (Part 1)",
      "content": "Javascript\n\n## Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos\n\nT\nPor Tulio Faria • 25 de julho de 2021\n\n[Javascript](/tag/javascript)\n\nÉ muito comum durante a solução de alguns problems com algorítmos de precisarmos de um array com valores padrão já inseridos.\n\nInclusive para gerar dados de testes. E podemos gerar o array com os mais diversos valores, como números, strings e até mesmo objetos.\n\n## O bom e velho for\n\nA forma mais tradicional de fazer esta tarefa é utilizar o bom e velho for. Sem muitos segredos, podemos fazer o seguinte:\n\nconst array = []\nconst size = 10\nfor (let i = 0; i &#x3C; size; i++) {\narray.push(i)\n}\n// array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\nDesta maneira podemos inclusive criar valores diferentes de inteiros, por exemplo:\n\nconst names = []\nconst size = 7\nfor (let i = 0; i &#x3C; size; i++) {\nnames.push({\nid: i,\nname: `Name ${i}`\n})\n}\n/*\nnames =\n0: {id: 0, name: \"Name 0\"}\n1: {id: 1, name: \"Name 1\"}\n2: {id: 2, name: \"Name 2\"}\n3: {id: 3, name: \"Name 3\"}\n4: {id: 4, name: \"Name 4\"}\n5: {id: 5, name: \"Name 5\"}\n6: {id: 6, name: \"Name 6\"}\n*/\nUma versão alternativa:\n\nconst size = 7\nconst names = new Array(size)\n\nfor (let i = 0; i &#x3C; size; i++) {\nnames[i] = {\nid: i,\nname: `Name ${i}`\n}\n}\n/*\nnames =\n0: {id: 0, name: \"Name 0\"}\n1: {id: 1, name: \"Name 1\"}\n2: {id: 2, name: \"Name 2\"}\n3: {id: 3, name: \"Name 3\"}\n4: {id: 4, name: \"Name 4\"}\n5: {id: 5, name: \"Name 5\"}\n6: {id: 6, name: \"Name 6\"}\n*/\n\n## Array.fill\n\nOutra forma de gerar o array com valores é utilizando o Array.fill. Nesta forma, criamos um array com o tamanho desejado e informamos o valor para qual queremos preenchê-lo.",
      "description": "Aprenda 5 formas de gerar arrays populados em JavaScript: Array.from, fill, spread, map e mais. Exemplos práticos para copiar e usar.",
      "keywords": [
        "name",
        "array",
        "valor",
        "person",
        "const",
        "fill",
        "javascript",
        "gerar",
        "people",
        "forma"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/como-gerar-um-array-populado-em-javascript"
      }
    },
    {
      "id": "400d4a0f7577a233",
      "url": "https://devpleno.com/blog/falta-de-apoio/index",
      "title": "Falta de apoio (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/CLtuFdthvz0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "apoio",
        "pessoas",
        "fazer",
        "falta",
        "relev",
        "ncia",
        "essa",
        "embed",
        "quando"
      ],
      "metadata": {
        "title": "Falta de apoio",
        "date": "2017-08-28",
        "tags": "['Carreira']",
        "thumbnail": "FALTA-DE-APOIO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/falta-de-apoio/index.md"
      }
    },
    {
      "id": "407f22e4c847c08c",
      "url": "https://devpleno.com/blog/pegadinha-de-entrevistas-de-javascript/index",
      "title": "Pegadinha #1 de entrevistas em JavaScript (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ODBoaezEfMo\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "settimeout",
        "console",
        "como",
        "undefined",
        "embed",
        "dentro",
        "isso",
        "essa",
        "function",
        "responsive"
      ],
      "metadata": {
        "title": "Pegadinha #1 de entrevistas em JavaScript",
        "date": "2017-11-07",
        "tags": "['Javascript']",
        "thumbnail": "Pegadinha.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/pegadinha-de-entrevistas-de-javascript/index.md"
      }
    },
    {
      "id": "4095bdcf802f4958",
      "url": "https://devpleno.com/seja-o-motorista-da-sua-vida",
      "title": "Você é passageiro ou motorista da sua vida? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Você é passageiro ou motorista da sua vida?\n\nT\nPor Tulio Faria • 9 de agosto de 2017\n\n*\n\n[Carreira](/tag/carreira)\n\nVocê é passageiro ou motorista da sua vida? Eu vou contar uma história para vocês e acho que faz bastante sentido pelo momento que passei.\n\nEu estava no embalo de deixar as coisas me levarem. Estava trabalhando, mas com algo que eu não gostava, fazia coisas muito repetidas e projetos que não achava interessantes, já não tinha mais propósito naquilo e, consequentemente, a qualidade começou a cair. A decisão de mudança ocorreu no ano passado, mas Isso vinha me incomodando há pelo menos três anos.\n\nQuando você passa por uma situação como essa e passa a refletir sobre isso, percebe que precisa mudar, cai a ficha de que você não é mais o motorista da sua vida, afinal não está mais conduzindo para onde você quer chegar, logo você é um passageiro.\n\nUma coisa que venho aplicando desde o ano passado é criar as próprias oportunidades. Por exemplo, se você quer trabalhar fora do Brasil, não adianta continuar mandando CV aqui, não vai surgir uma oportunidade para fora do nada (na verdade, para mim aconteceu porque eu conhecia uma pessoa e fui indicado, mas é raro)*. Tem coisas que são tão simples que basta você começar a refletir sobre o que quer para realmente tomar as rédeas e voltar a ser o motorista da sua vida.\n\nMude um pouco sua percepção! É o que venho fazendo e faz muito sentido, pelo menos para mim. Depois que eu destravei, percebi que trabalhar para fora era algo que eu queria fazer, então comecei a distribuir currículo e fazer mais contatos nesse sentido e hoje eu atuo lá fora também.\n\nQuando você toma as rédeas da sua vida, começa a dar os passos na direção certa. Eu comecei a fazer isso em tudo, se você quer chegar em algum lugar sem depender de fatores de sorte e etc, comece a ser mais motorista.\n\nConfira o video:",
      "description": "Você é passageiro ou motorista da sua vida? Eu vou contar uma história para vocês e acho que faz bastante sentido pelo momento que passei. Eu estava no emb...",
      "keywords": [
        "para",
        "motorista",
        "vida",
        "https",
        "mais",
        "quer",
        "fora",
        "carreira",
        "passageiro",
        "sentido"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/seja-o-motorista-da-sua-vida"
      }
    },
    {
      "id": "40be68328d7005d0",
      "url": "https://devpleno.com/blog/o-que-e-o-app-use-no-nodejsexpressjs/index",
      "title": "O que é o app.use no NodeJS/ExpressJS? (Part 1)",
      "content": "Você já reparou que praticamente qualquer módulo que plugamos no Express atualmente é feito através do uso do app.use? Mas afinal, o que é o app.use?\n\nPs: você pode ver este material em vídeo também no fim do post 🙂\n\nA partir da versão 4 do Express, a extensibilidade é realizada por meio do uso de middlewares. Middleware é um bloco de código que é executado em todas as requisições ou nas que respeitam um certo padrão. E é respeitado a ordem de adição de cada um deles.\n\nPara adicionarmos um middleware em nosso app (ou router):\n\n```jsx\nconst express = require('express')\nconst app = express()\n\n// middleware\napp.use(function (req, res, next) {\n  console.log('middleware 1')\n  next()\n})\n\napp.get('/', function (req, res) {\n  console.log('requisição')\n  res.send('Requisição!')\n})\n\napp.listen(3001, function () {\n  console.log('Example app listening on port 3000!')\n})\n```\n\nAlguns pontos importantes:\n\n- Este middleware será aplicado antes da execução de qualquer rota que vier depois dele;\n- Caso não adicionamos o next(), as rotas subsequentes nem serão executadas. Por isso, middleware é uma ótima forma de fazer controle de acesso a rotas.\n\nVamos analisar este outro exemplo:\n\n```jsx\nconst express = require('express')\nconst app = express()\n\napp.use(function (req, res, next) {\n  console.log('middleware 1')\n  next()\n})\napp.use(function (req, res, next) {\n  console.log('middleware 2')\n  next()\n})\napp.get('/', function (req, res) {\n  console.log('requisição')\n  res.send('Requisição!')\n})\n\napp.use(function (req, res, next) {\n  res.send('nada encontrado')\n})\napp.get('/url', function (req, res) {\n  console.log('requisição')\n  res.send('Requisição!')\n})\n\napp.listen(3001, function () {\n  console.log('Example app listening on port 3000!')\n})\n```\n\nQuando fizermos uma requisição para /, passaremos pelos 2 primeiros middlewares mas não pelo terceiro. O res.send (que envia a resposta ao browser) encerra a pilha de execução.",
      "description": "Entenda o que é o app.use no Express.js, como funciona o sistema de middlewares e como usá-lo para organizar sua aplicação Node.js.",
      "keywords": [
        "function",
        "requisi",
        "next",
        "console",
        "middleware",
        "express",
        "send",
        "admin",
        "const",
        "este"
      ],
      "metadata": {
        "title": "O que é o app.use no NodeJS/ExpressJS?",
        "description": "Entenda o que é o app.use no Express.js, como funciona o sistema de middlewares e como usá-lo para organizar sua aplicação Node.js.",
        "date": "2016-12-28",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Nodejs.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/o-que-e-o-app-use-no-nodejsexpressjs/index.md"
      }
    },
    {
      "id": "411e11dd035b587f",
      "url": "https://devpleno.com/blog/como-cobrar-por-software/index",
      "title": "Como cobrar por Software (Part 3)",
      "content": "Você está atuando como PJ? Se sim, pense o seguinte: R$30,00 por hora para um Junior é um valor interessante, pensando que um Junior rende mais ou menos um terço de uma pessoa com experiência. E para um pleno R$100,00 é um valor muito alto, pois pouquíssimos projetos justificariam este valor, a não ser que sua disponibilidade seja muito pequena e sua especialidade muito grande (em casos de consultorias, por exemplo, poderia subir mais).\nMuitas vezes as pessoas olham no sindicato. Lá as horas são totalmente desproporcionais e não servem de referência. O ideal é ir ajustando, por exemplo, o projeto você estimou que demoraria 40 horas, mas terminou antes, então entrega um pouco mais ao cliente e no próximo você ajusta essa hora. O mesmo vale para o inverso: deu mais tempo? Então ajuste para mais.\nO mais importante é colocar um valor que você ache justo, mas não justo para ficar milionário no primeiro projeto. (Quando eu comecei, cobrava meus sites em torno de R$2.000,00. Fazia o site muito rápido, mas era péssimo de layout, então contratava alguém por R$1.000,00, então minhas 4 horas valiam R$250,00. Assim, conseguia entregar muitos sites, pois terceirizava uma parte do processo).\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "hora",
        "para",
        "valor",
        "mais",
        "horas",
        "muito",
        "projeto",
        "ncia",
        "exemplo",
        "deve"
      ],
      "metadata": {
        "title": "Como cobrar por Software",
        "date": "2017-05-15",
        "tags": "['Carreira']",
        "thumbnail": "PRECIFICAÇÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/como-cobrar-por-software/index.md"
      }
    },
    {
      "id": "41393afe0bb45e9c",
      "url": "https://devpleno.com/blog/3",
      "title": "Blog - Página 3 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)\n\n[Javascript 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)\n\n[Javascript 24 de nov. de 2017 Reconhecimento de nudez com js](/reconhecimento-de-nudez-com-js)\n\n[Javascript 24 de nov. de 2017 Reconhecimento facial com JS](/reconhecimento-facial-com-js)\n\n[Javascript 23 de nov. de 2017 CHAVES DINÂMICAS](/chaves-dinamicas)\n\n[Algoritmos 16 de nov. de 2017 code fights - Metro Card](/code-fights-metro-card)\n\n[Javascript 16 de nov. de 2017 Hands-on - Three.JS](/hands-on-threejs)\n\n[Algoritmos 13 de nov. de 2017 Resolvendo Expressão Aritmética do CodeFights](/expressao-aritmetica-codefights)\n\n[Javascript 13 de nov. de 2017 Capturando áudio do microfone pelo Navegador](/microfone-pelo-navegador)\n\n[Javascript 13 de nov. de 2017 Preview de imagens antes do upload](/preview-de-imagens-antes-do-upload)\n\n[Javascript 10 de nov. de 2017 Chainability com Javascript](/chainability-com-javascript)\n\n[Carreira 10 de nov. de 2017 O que fazer para dar certo?](/o-que-fazer-para-dar-certo)\n\n[Anterior](/blog/2)3 / 26[Próxima](/blog/4)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "nodejs",
        "algoritmos",
        "upload",
        "imagens",
        "reconhecimento",
        "para",
        "blog",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/3"
      }
    },
    {
      "id": "41626d07f9a1a6b5",
      "url": "https://devpleno.com/blog/entrevista-carlos-drury-e-thiago-coelho/index",
      "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho (Part 1)",
      "content": "Carlos Drury e Thiago Coelho fazem parte do GDG Vale da Eletrônica. Essa entrevista aconteceu durante um evento organizado por eles no Vale da Eletrônica, em Santa Rita do Sapucaí.\n\nO Carlos é desenvolvedor JavaScript e atualmente trabalha no INATEL, em um projeto da Ericsson, uma das empresas que o INATEL presta serviço.\n\nO Thiago é especialista em JavaScript e trabalha no INATEL com desenvolvimento WEB. Tem experiência de mais de 10 anos em São Paulo e hoje atua em um projeto chamado OSS da Ericcsson.\n\nO Vale da Eletrônica é uma região que tem muita empresa tecnológica que atende clientes gigantescos lá fora e em projetos totalmente distintos, e o mais bacana é que não é em um grande centro, então temos uma certa facilidade de ter esses eventos contando com gente que tem atuação internacional e de grande porte.\n\nO que é o GDG (Grupo de Desenvolvedores Google) em si de maneira geral?\n\n**Carlos Drury**: “O GDG surge através de uma comunidade de desenvolvedores dentro de uma localidade, geralmente são desenvolvedores que têm interesse em difundir conhecimento ou aumentar seu network, com isso o Google libera algum material e suporte para esses grupos, onde podemos ter esses materiais para ministrar palestras e convidar alguns palestrantes. Lembrando que o GDG é aberto para todos.”\n\nExistem outros GDG's espalhados, eu gostaria de saber como uma pessoa pode participar de um GDG específico, se existe uma formalização do seu membro e quais as desvantagens de participar do GDG como um participante comum?\n\n**Carlos Drury**: “Uma pessoa que quer se envolver com o GDG pode primeiramente ir no site do Google de diretórios de group developers tool e lá ela consegue encontrar um GDG mais próximo. O benefício para a pessoa que participa do GDG é a forma de compartilhar conhecimento, o GDG não está aqui para ganhar dinheiro, nem promover uma pessoa e sim para ajudar projetos.”",
      "keywords": [
        "para",
        "ingl",
        "grande",
        "muito",
        "carlos",
        "javascript",
        "mais",
        "conhecimento",
        "como",
        "pessoa"
      ],
      "metadata": {
        "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho",
        "date": "2017-08-03",
        "tags": "['Carreira']",
        "thumbnail": "entrevista-gdg-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/entrevista-carlos-drury-e-thiago-coelho/index.md"
      }
    },
    {
      "id": "41873156148df02a",
      "url": "https://devpleno.com/tag/fundamentos",
      "title": "Fundamentos - DevPleno",
      "content": "Fundamentos\n\n## Arquivo de Insights\n\n56 posts encontrados com a tag Fundamentos\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)\n\n[Javascript 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)\n\n[Javascript 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)\n\n[Javascript 5 de out. de 2017 Dicas utilizando o Split em Strings](/split-em-strings)\n\n[Javascript 3 de out. de 2017 Promise Constante - como criar situações assíncronas de teste](/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste)\n\n[Javascript 26 de set. de 2017 Promise Race - Qual promise resolve/rejeita primeiro](/promise-race)\n\n[Fundamentos 15 de set. de 2017 Como testar domínios localmente](/como-testar-dominios-localmente)\n\n[Fundamentos 6 de set. de 2017 Entenda sobre CORS - Cross Origin Resource Sharing](/entenda-sobre-cors-cross-origin-resource-sharing)\n\n[Javascript 31 de ago. de 2017 Como encadear promises](/como-encadear-promises)\n\n[Javascript 21 de ago. de 2017 3 Padrões para Iniciar com Expressões Regulares (RegExp)](/expressoes-regulares)\n\n[Javascript 21 de ago. de 2017 Estruturas de Dados - Pilhas](/pilha)\n\n[Javascript 7 de ago. de 2017 Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS](/falsy-e-truthy-values)\n\nAnterior\n1 / 5[Próxima](/tag/fundamentos/2)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "fundamentos",
        "promise",
        "como",
        "para",
        "algoritmos",
        "carreira",
        "ferramentas",
        "nodejs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/fundamentos"
      }
    },
    {
      "id": "418e054541e3c597",
      "url": "https://devpleno.com/blog/networking-da-maneira-certa-carreira/index",
      "title": "Networking da maneira certa",
      "content": "É muito comum e difundido que temos que fazer networking custe o que custar. Mas veja como fazer isso da maneira que te dê mais resultados e a forma que venho fazendo em minha vida.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/wWiB2ojkaRA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "fazer",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "muito"
      ],
      "metadata": {
        "title": "Networking da maneira certa",
        "date": "2016-07-23",
        "tags": "['Carreira']",
        "thumbnail": "Networking.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/networking-da-maneira-certa-carreira/index.md"
      }
    },
    {
      "id": "41910b66b766f6b8",
      "url": "https://devpleno.com/blog/code-fights-metro-card/index",
      "title": "code fights - Metro Card (Part 2)",
      "content": "Agora podemos criar um key utilizando o número do dia e retornar o nosso object com as keys. Além disso, essa chave trás strings, precisamos retornar inteiros para garantir que o sort vai ordenar ele como queríamos:\n\n```js\nconst days = {\n  months.forEach((elem, index) => {\n    if(elem === lastNumberOfDays) {\n      days[months[(index+1)%12] = 1]\n    }\n  })\n\n  return Object\n    .keys(days)\n    .map( item => parseInt(item))\n    .sort()\n}\n\n```\n\nEle é uma estrutura de dados muito comum. Além disso, vimos a estratégia de como resolver a parte cíclica. Quanto mais olharmos abordagens diferentes, mais preparados vamos estar para resolver esses problemas.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/d8K0xTGb014\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "months",
        "lastnumberofdays",
        "elem",
        "index",
        "problema",
        "retornar",
        "como",
        "days",
        "vamos",
        "mais"
      ],
      "metadata": {
        "title": "code fights - Metro Card",
        "date": "2017-11-16",
        "tags": "['Algoritmos']",
        "thumbnail": "metro-card-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/code-fights-metro-card/index.md"
      }
    },
    {
      "id": "419257e95c944110",
      "url": "https://devpleno.com/blog/promise-race/index",
      "title": "Promise Race - Qual promise resolve/rejeita primeiro",
      "content": "Hoje quero mostrar uma funcionalidade que chamada Promise.race. Ela vai receber uma lista de promises no JavaScript e ele vai retornar apenas uma dessas promise: a que rejeitar ou resolver primeiro. Vamos criar uma função que é uma promise:\n\n```jsx\nconst p = (time, name) => {\n  return new Promise((resolve, reject) => {\n    setTimeOut(() => resolve(time + ' ' + name), time)\n  })\n}\np(100, 'opa').then((e) => console.log(e))\n```\n\nAo rodar esse código, ele retorna opa depois de 100ms. Agora vamos criar uma lista chamada de OS, e dentro dela faremos uma lista de promises:\n\n```jsx\nconst os = [P(100, 'opa'), P(200, 'opa2')]\nPromise.race(os).then((e) => console.log(e))\n```\n\nAo rodar, vai trazer a primeira promise, isso não quer dizer que ele pare a operação do outro. Ele continua executando, porém não retorna para o resultado, mesmo se rejeitarmos. Obviamente é o contrário do Promise.all, que é quando retornamos todos:\n\n```jsx\nPromise.all(os).then((e) => console.log(e))\n```\n\nAssim vamos ter todos os retornos, ao contrário do race.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Z_paUYXjqCI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "promise",
        "embed",
        "race",
        "lista",
        "vamos",
        "time",
        "then",
        "console",
        "responsive",
        "https"
      ],
      "metadata": {
        "title": "Promise Race - Qual promise resolve/rejeita primeiro",
        "date": "2017-09-26",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "PromiseRace.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/promise-race/index.md"
      }
    },
    {
      "id": "4195cf588774023d",
      "url": "https://devpleno.com/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira",
      "title": "8 dicas de organização para freelancers se darem bem na carreira - DevPleno (Part 1)",
      "content": "Carreira\n\n## 8 dicas de organização para freelancers se darem bem na carreira\n\nT\nPor Tulio Faria • 14 de julho de 2017\n\n*\n\n[Carreira](/tag/carreira)\n\nNada melhor do que ter uma rotina flexível, com a possibilidade de trabalhar nos seus próprios horários, não é mesmo? Não à toa, ser freelancer é uma alternativa cada vez mais atrativa para os desenvolvedores de software.\n\nContudo, é preciso ter muita disciplina para atuar nessa modalidade. Afinal, o seu rendimento no final do mês será proporcional à sua dedicação e produtividade.\n\nPara ajudá-lo a ter um melhor desempenho, compilamos algumas dicas de organização. Ao segui-las, você com certeza se sairá muito bem nessa [carreira](https://www.devpleno.com/carreira-preco-que-tem-que-ser-pago?utm_source=blog&#x26;utm_campaign=rc_blogpost). Confira:\n\n## 1. Tenha um fundo de reserva\n\nAqueles que já estão há algum tempo atuando em formas alternativas de trabalho sabem que no início é mais complicado. Como a pessoa ainda é nova nesse universo, será necessário fazer o nome dela como freelancer. Além do mais, é preciso conhecer bem o mercado para encontrar boas propostas de projetos.\n\nNo entanto, isso requer tempo. Portanto, é essencial ter uma reserva financeira, que dará o devido suporte até que você se estabilize.\n\nO ideal nesse caso é ter uma quantia suficiente para todas as suas despesas por pelo menos três meses. Nesse período, você conseguirá ampliar sua carteira de clientes e ampliar suas possibilidades de jobs.\n\n## 2. Faça um planejamento\n\nDiferente do emprego fixo, em que o profissional possui carteira assinada com um valor específico, no mundo dos freelancers a remuneração pode ser bastante diversificada. Em um mês, por exemplo, você pode tirar um valor muito alto, já em outro a remuneração pode ser menor — devido à baixa demanda.",
      "description": "Nada melhor do que ter uma rotina flexível, com a possibilidade de trabalhar nos seus próprios horários, não é mesmo? Não à toa, ser freelancer é uma alter...",
      "keywords": [
        "para",
        "mais",
        "como",
        "https",
        "carreira",
        "freelancer",
        "pode",
        "freelancers",
        "dicas",
        "afinal"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira"
      }
    },
    {
      "id": "41afa55273c47e53",
      "url": "https://devpleno.com/dica-como-saber-complexidade-de-um-algoritmo",
      "title": "Dica: Como saber a complexidade de um algoritmo - DevPleno",
      "content": "Algoritmos\n\n## Dica: Como saber a complexidade de um algoritmo\n\nT\nPor Tulio Faria • 10 de abril de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nNos últimos vídeos e na última live, comentei sobre o Codility. Ele tem uma característica de avaliar a complexidade do algoritmo que você respondeu. Neste vídeo, dou uma dica rápida de como avaliar e ter uma ideia da complexidade. Confira:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Como%20saber%20a%20complexidade%20de%20um%20algoritmo&url=https%3A%2F%2Fdevpleno.com%2Fdica-como-saber-complexidade-de-um-algoritmo) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-como-saber-complexidade-de-um-algoritmo)",
      "description": "Nos últimos vídeos e na última live, comentei sobre o Codility. Ele tem uma característica de avaliar a complexidade do algoritmo que você respondeu. Neste...",
      "keywords": [
        "https",
        "complexidade",
        "como",
        "algoritmo",
        "algoritmos",
        "dica",
        "saber",
        "avaliar",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-como-saber-complexidade-de-um-algoritmo"
      }
    },
    {
      "id": "421e67258743bcbd",
      "url": "https://devpleno.com/minicurso-socket-io-parte-5",
      "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar - DevPleno (Part 3)",
      "content": "Agora irei na mesma pasta que eu estava no shell, que é a /opt/, dentro dela temos o placar online, vamos fazer o upload dos nossos arquivos dentro dessa pasta, mais especificamente as pastas **bin, data, public, routes, views** e os arquivos **package.json, app.js e yarn.lock**. A única pasta que não vamos subir é a node_modules. Sempre que formos instalar dependências, temos que fazer isso dentro da máquina que vamos rodar, isso é uma boa prática porque às vezes têm alguns módulos do node que são compilados de acordo com a plataforma.\n\nVoltando ao shell, depois que todos os arquivos forem upados, vou dar um **npm install** apenas para instalar as dependências.\n\nAgora já temos o projeto rodando, vamos checar se ele está rodando realmente:\n\nnode bin/www\ncomo ele está com a saída vazia vamos fazer:\n\nPORT= 80 npm start\nAgora vou abrir o navegador e verificar se está realmente rodando:\n\nEstá rodando perfeitamente! Perceba que eu coloquei PORT= 80, isso significa que eu defini uma variável de ambiente antes de iniciar o servidor. Não seria interessante deixar o shell aberto para que nosso serviço fique online, então vamos fazer o seguinte:\n\nnpm install -g pm2\nO pm2 é um pacote do npm que permite startar serviços como serviços do linux.\n\nAgora vou dar um **vi start.json**, quando nós vamos startar uma aplicação pelo pm2 temos que definir para ele algumas variáveis de ambiente, igual o port que colocamos logo acima, porque ele não reconhece automaticamente essas variáveis do ambiente:\n\n{\n\"script\": \"bin/www\",\n\"env\":{\n\"PORT\": 80,\n\"NODE_ENV\": \"production\"\n}}\nEntão vou criar um Json com um script que é um env com duas propriedades dentro.\n\nAgora faremos **pm2 start start.json**, perceba que ele já startou o próprio json:\n\nA vantagem é que pelo pm2 eu consigo ver como ele está utilizando o **pm2 status**\n\nUma dica adicional: se quiser parar o serviço, digite:",
      "description": "Chegamos à última etapa do nosso Minicurso de Socket.IO. Nessa aula, nós vamos colocar o projeto no ar para que você possa utilizálo como um projeto de por...",
      "keywords": [
        "para",
        "vamos",
        "como",
        "fazer",
        "isso",
        "quina",
        "projeto",
        "agora",
        "temos",
        "https"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/minicurso-socket-io-parte-5"
      }
    },
    {
      "id": "42491c4238650a00",
      "url": "https://devpleno.com/blog/carreira-voce-e-o-passageiro-da-sua-vida/index",
      "title": "Carreira: Você é o passageiro da sua Vida?",
      "content": "Você está levando sua vida para alcançar seus objetivos?\n\nVocê está sendo o motorista ou passageiro na sua própria vida?\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/o0VuFJPKZnU\" allowfullscreen></iframe>\n</div>\n\nNão esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Um abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "vida",
        "para",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Carreira: Você é o passageiro da sua Vida?",
        "date": "2017-03-27",
        "tags": "['Carreira']",
        "thumbnail": "MINIATURA-PASSAGEIRO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/carreira-voce-e-o-passageiro-da-sua-vida/index.md"
      }
    },
    {
      "id": "425d3784e7190317",
      "url": "https://devpleno.com/operacao-de-busca",
      "title": "Árvore Binária de Busca - Operação de Busca - DevPleno (Part 2)",
      "content": "Ela sempre dividirá o problema em dois, então ao pensarmos na complexidade do código, é o contrário de termos um ‘for’ dentro do outro. Como ele sempre divide em dois, no pior caso, o nosso algoritmo é 0(raiz(n)) então se tivermos 25 elementos, teremos mais ou menos 5 comparações, no nosso caso que temos 4, vamos ter 2 comparações. É algo muito rápido, logo a complexidade do algoritmo é 0(log n) que é uma performance muito boa para um algoritmo de busca. O search é o mais importante das árvores, não é atoa que se chama de busca.\n\nFinalizamos todas as operações em árvore, visitar em pré order, in order e pós order, inserção e a busca em si que é muito utilizada.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=%C3%81rvore%20Bin%C3%A1ria%20de%20Busca%20-%20Opera%C3%A7%C3%A3o%20de%20Busca&url=https%3A%2F%2Fdevpleno.com%2Foperacao-de-busca) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Foperacao-de-busca)",
      "description": "Agora que você já entendeu sobre Árvore Binária e Árvore Binária de Busca, vamos falar sobre a operação de busca. Estou utilizando o exemplo do exercício a...",
      "keywords": [
        "arvore",
        "rvore",
        "busca",
        "value",
        "https",
        "tree",
        "valor",
        "console",
        "devpleno",
        "insert"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/operacao-de-busca"
      }
    },
    {
      "id": "4270e63691051ca2",
      "url": "https://devpleno.com/blog/precificacao-de-softwares-voce-sabe-como-fazer/index",
      "title": "Precificação de softwares: você sabe como fazer? (Part 5)",
      "content": "O primeiro demanda insumos mais concretos, físicos, enquanto que o segundo necessita de conhecimentos e insumos intangíveis, que exigem muito tempo de experiência e estudo para serem adquiridos.\n\nPor fim, lembre-se de ser correto na definição de seus preços, alertando seus clientes caso o custo de um software fique alto demais e o programa não traga retornos a eles. Dessa forma, você reforça o comprometimento com a satisfação dos seus consumidores, além de destacar a integridade do seu trabalho.\n\nTambém evite superestimar projetos, para que não perca clientes caso se sintam enganados. E se você avaliou equivocadamente o valor de um software, cobrando a mais, tente oferecer adicionais para compensar. Caso o preço tenha sido menor do que o necessário, ajuste isso nos projetos seguintes.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "software",
        "valor",
        "como",
        "mais",
        "tamb",
        "seus",
        "ncia",
        "trabalho",
        "hora"
      ],
      "metadata": {
        "title": "Precificação de softwares: você sabe como fazer?",
        "date": "2017-06-28",
        "tags": "['Carreira']",
        "thumbnail": "Precificacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "blog/precificacao-de-softwares-voce-sabe-como-fazer/index.md"
      }
    },
    {
      "id": "427c1678f8b68060",
      "url": "https://devpleno.com/tag/ferramentas",
      "title": "Ferramentas - DevPleno",
      "content": "Ferramentas\n\n## Arquivo de Insights\n\n2 posts encontrados com a tag Ferramentas\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Ferramentas 5 de abr. de 2026 Como Usar o Describe Session do Claude Code para Conectar Projetos](/claude-code-describe-session)\n\n[Ferramentas 5 de abr. de 2026 Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente](/claude-code-otimizacao-arquivos)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "ferramentas",
        "claude",
        "code",
        "2026",
        "algoritmos",
        "carreira",
        "fundamentos",
        "javascript",
        "nodejs",
        "reactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/ferramentas"
      }
    },
    {
      "id": "427f3de3addf4999",
      "url": "https://devpleno.com/blog/servidor-json-simples-em-php-parte-1/index",
      "title": "Servidor JSON simples em PHP (parte 1) (Part 1)",
      "content": "Hoje quero mostrar para vocês como criar um servidor JSON utilizando o PHP. Mas por que PHP e não JavaScript? Porque ainda é uma linguagem que tem hospedagem muito fácil de achar até mesmo gratuitamente. Se você já tiver um WordPress ou um site que suporte PHP já vai conseguir rodar isso, assim é possível rodar, por exemplo, projetos de teste como nosso Minhas Séries, que foi feito em ReactJS. A ideia é bem simples, apenas dois métodos por enquanto. Então vamos criar um arquivo chamado db.JSON e dentro dele vamos colocar assim:\n\n```jsx\n{\n    “series”: [],\n    “genres”:[]\n}\n```\n\nEsse é nosso banco de dados. Feito isso, vou criar um index.php e adicionar alguns detalhes, primeiro dividir o que vier como get na variável e em seguida carregar o banco:\n\n```jsx\n<?php\n$path = explode('/', $_GET['path']);\n$contents = file_get_contents('bd.json');\n$json = json_decode($contents, true);\n$method = $_SERVER['REQUEST_METHOD'];\nheader('Content-type: application/json');\n$body = file_get_contents('php://input');\n```\n\nAgora que já lemos tudo, temos que adicionar um if. Caso o method for get, vamos apenas retornar o Json:\n\n```jsx\nif($method === 'GET'){\n    if($json[$path[0]]){\n    echo json_encode($json[$path[0]]);\n    }else{\n        echo '[]';\n    }\n}\n```\n\nCom isso, caso tivermos uma série dentro do campo séries, ele retornará essa série. Além disso, podemos inserir também:\n\n```jsx\nif($method === 'POST'){\n    $jsonBody = json_decode($body, true);\n    $jsonBody[id] = time();\n    if(!$json[$path[0]]){\n        $json[$path[0]] =  [];\n    }\n    $json[$path[0]][] = $jsonBody;\n    echo json_encode($jsonBody);\n    file_put_contents('db.json', json_encode($json));\n}\n```",
      "keywords": [
        "json",
        "path",
        "contents",
        "method",
        "caso",
        "criar",
        "vamos",
        "jsonbody",
        "embed",
        "para"
      ],
      "metadata": {
        "title": "Servidor JSON simples em PHP (parte 1)",
        "date": "2017-09-08",
        "tags": "['Javascript']",
        "thumbnail": "ServidorJson.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/servidor-json-simples-em-php-parte-1/index.md"
      }
    },
    {
      "id": "4281da0be2977815",
      "url": "https://devpleno.com/chainability-com-javascript",
      "title": "Chainability com Javascript - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Chainability%20com%20Javascript&url=https%3A%2F%2Fdevpleno.com%2Fchainability-com-javascript) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fchainability-com-javascript)",
      "description": "Hoje eu quero mostrar como podemos construir um pattern que é muito utilizado no Jquery. Apesar de não ser um pattern que muita gente gosta, é bastante int...",
      "keywords": [
        "javascript",
        "total",
        "return",
        "para",
        "https",
        "fazer",
        "como",
        "podemos",
        "const",
        "initial"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/chainability-com-javascript"
      }
    },
    {
      "id": "429859823a4cd916",
      "url": "https://devpleno.com/blog/claude-code-otimizacao-arquivos/index",
      "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente (Part 2)",
      "content": "## Outros Tipos de Otimização Que Você Pode Pedir\n\nPNG é só o começo. O Claude Code consegue sugerir e executar otimizações para praticamente qualquer tipo de arquivo ou recurso do seu projeto:\n\n- **Imagens (SVG, JPEG, WebP)** — ferramentas como svgo, mozjpeg ou cwebp, escolhidas automaticamente conforme o formato\n- **Bundles JavaScript e CSS** — minificação, tree-shaking, análise de tamanho com ferramentas como esbuild ou terser\n- **Dockerfiles** — redução de camadas, multi-stage builds, imagens base menores\n- **Queries SQL** — reescrita de consultas lentas, sugestão de índices\n- **Fontes** — subsetting para incluir apenas os caracteres usados\n\nO padrão é sempre o mesmo: você descreve o problema, o Claude Code encontra a ferramenta, explica o que vai fazer e executa com sua aprovação.\n\n## Erros Comuns ao Otimizar Arquivos com IA\n\nMesmo com uma ferramenta inteligente, alguns cuidados são importantes:\n\n**Não revisar a qualidade visual.** Compressão de imagem sempre envolve trade-offs. Mesmo com 80% de redução, revise as imagens mais importantes. O GitHub facilita isso — o diff de imagens mostra o antes e depois lado a lado.\n\n**Não versionar antes de otimizar.** Sempre rode otimizações em um branch separado no Git. Se algo der errado, você volta ao estado anterior em um comando. Sem versionamento, uma otimização agressiva pode destruir assets originais.\n\n**Aceitar tudo sem entender.** O Claude Code explica o que vai fazer antes de rodar. Leia a sugestão. Entenda se a ferramenta proposta faz compressão com perda (lossy) ou sem perda (lossless). Para ícones e screenshots, lossy geralmente funciona bem. Para assets de design que serão editados depois, prefira lossless.\n\n**Otimizar uma vez e esquecer.** Novos arquivos entram no projeto o tempo todo. Considere criar um script ou hook de CI que rode a otimização automaticamente em cada PR.\n\n## Quer dominar o Claude Code e IA na prática?",
      "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
      "keywords": [
        "claude",
        "code",
        "otimiza",
        "ferramenta",
        "type",
        "para",
        "imagens",
        "como",
        "arquivos",
        "otimizar"
      ],
      "metadata": {
        "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente",
        "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
        "date": "2026-04-05",
        "tags": "['Ferramentas']",
        "thumbnail": "feature-image.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/claude-code-otimizacao-arquivos/index.md"
      }
    },
    {
      "id": "42bf0ce8b8e75c04",
      "url": "https://devpleno.com/blog/metronomo-com-javascript/index",
      "title": "Metrônomo com JavaScript (Part 3)",
      "content": "Uma vez que estartamos o timer, ele começa a tocar. Ao clicar novamente, ele para, pois carrega na página com valor null. Ao clicarmos, damos um valor para ele e clicando de novo ele cai no isPlaying = !isPlaying que faz ele voltar a Null. Chamamos isso de toggle.\n\nTambém podemos trocar o texto do botão para play caso esteja tocando e Stop para quando estiver parado. Perceba que, ao apertar o play, ele começa a tocar apenas no próximo tick, pois o setInterval demora esse tick. Podemos fazer ele começar já com esse tick.\n\n```jsx\nplay.addEventListener('click', function () {\n  if (isPlaying) {\n    play.innerHTML = 'Play'\n    clearInterval(timer)\n  } else {\n    tick()\n    play.innerHTML = 'Stop'\n    const timer = setInterval(tick, (60 * 1000) / currentBpm)\n  }\n  isPlaying = !isPlaying\n})\n```\n\nPara esse valor atualizar sempre que mudamos o range, temos que fazer um if, que vai limpar o intervalo e começar um novo valor baseado no cálculo.\n\n```jsx\nbpm.addEventListener('change', function () {\n  h1.innerHTML = this.value + ' bpm'\n  currentBpm = parseInt(this.value)\n  if (isPlaying) {\n    clearInterval(timer)\n    timer = setInterval(tick, (60 * 1000) / currentBpm)\n  }\n})\n```\n\nCom isso, acabamos de construir um metrônomo.\n\nEssa é uma ideia do que se pode construir com javaScript e HTML. Algumas outras ideias faremos posteriormente.\n\nConfira o passo a passo em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/9M7OY47OFzg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "play",
        "tick",
        "para",
        "const",
        "timer",
        "vamos",
        "isplaying",
        "valor",
        "audio",
        "currentbpm"
      ],
      "metadata": {
        "title": "Metrônomo com JavaScript",
        "date": "2017-05-26",
        "tags": "['Javascript']",
        "thumbnail": "Metronomo.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/metronomo-com-javascript/index.md"
      }
    },
    {
      "id": "42d4826d925c65b2",
      "url": "https://devpleno.com/o-que-e-o-app-use-no-nodejsexpressjs",
      "title": "O que é o app.use no NodeJS/ExpressJS? - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=O%20que%20%C3%A9%20o%20app.use%20no%20NodeJS%2FExpressJS%3F&url=https%3A%2F%2Fdevpleno.com%2Fo-que-e-o-app-use-no-nodejsexpressjs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fo-que-e-o-app-use-no-nodejsexpressjs)",
      "description": "Entenda o que é o app.use no Express.js, como funciona o sistema de middlewares e como usá-lo para organizar sua aplicação Node.js.",
      "keywords": [
        "function",
        "requisi",
        "next",
        "console",
        "middleware",
        "express",
        "send",
        "admin",
        "const",
        "https"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/o-que-e-o-app-use-no-nodejsexpressjs"
      }
    },
    {
      "id": "42f9efdd926f34ed",
      "url": "https://devpleno.com/entenda-a-importancia-de-cursos-para-desenvolvedores",
      "title": "Entenda a importância de cursos para desenvolvedores - DevPleno (Part 1)",
      "content": "Carreira\n\n## Entenda a importância de cursos para desenvolvedores\n\nT\nPor Tulio Faria • 7 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nVocê está pronto para atuar em uma grande empresa? O mercado de tecnologia está crescendo cada vez mais, e para conseguir se destacar no cenário atual, é preciso desenvolver habilidades essenciais à profissão. A melhor maneira é se capacitando por meio de cursos para desenvolvedores.\n\nDescubra as principais vantagens de investir em sua capacitação nesta área!\n\n## Empregabilidade\n\nEmpregabilidade é o conjunto de técnicas e habilidades que um profissional precisa ter para ser desejado pelas empresas. Ao estudar e aprender novas técnicas ou aprimorar as já existentes, você começa a ser disputado pelas empresas e pode até mesmo ser chamado para colaborar naquela desenvolvedora dos seus [sonhos](https://www.devpleno.com/metas-na-carreira-de-desenvolvedor?utm_source=blog&#x26;utm_campaign=rc_blogpost).\n\nJá pensou poder contribuir com o próximo UBER, Airbnb, Netflix ou Angry Birds?\n\n## Oportunidades\n\nEssa é uma vantagem que anda de mãos dadas com a empregabilidade. Quanto maior a sua empregabilidade, mais portas se abrirão. Capacitação significa oportunidades melhores e salários maiores. A qualidade das oportunidades é proporcional à qualidade dos profissionais.\n\n## Crescimento\n\nVocê é “o cara” da programação e ama a empresa em que trabalha? Neste caso é ainda mais importante fazer um curso. Apenas desenvolvendo novas habilidades é que você poderá crescer dentro da empresa e ser promovido.\n\n## Networking\n\nÉ possível crescer profissionalmente sem contar com o apoio de ninguém? Sim. Porém, este é o caminho mais difícil. Com uma boa rede de networking os resultados aparecem mais rapidamente e de maneira mais fácil.\n\nAo se capacitar você faz contato com pessoas que estão na mesma área. Essa interação – que pode ser tanto presencial quanto online (em fóruns e grupos) – ampliará sua visão da profissão.",
      "description": "Você está pronto para atuar em uma grande empresa? O mercado de tecnologia está crescendo cada vez mais, e para conseguir se destacar no cenário atual, é p...",
      "keywords": [
        "para",
        "mais",
        "cursos",
        "https",
        "carreira",
        "desenvolvedores",
        "pode",
        "empresa",
        "habilidades",
        "poss"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/entenda-a-importancia-de-cursos-para-desenvolvedores"
      }
    },
    {
      "id": "436edc319657137e",
      "url": "https://devpleno.com/listavip-devreactjs",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /listavip-devreactjs to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from",
        "listavip"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/listavip-devreactjs"
      }
    },
    {
      "id": "437418092d667e81",
      "url": "https://devpleno.com/short-circuit-e-valores-padrao",
      "title": "Short-circuit e valores padrão - DevPleno (Part 1)",
      "content": "Javascript\n\n## Short-circuit e valores padrão\n\nT\nPor Tulio Faria • 7 de agosto de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nEssa dica pode ser utilizada tanto em JavaScript quanto em outras linguagens de programação, apenas com um pouco de adaptação. Vamos falar primeiramente sobre o short-circuit.\n\nImagine que temos uma constante que se chama debug, que eu posso ligar e desligar esse debug. Quando o debug estiver ligado, eu quero que ele tenha mais saídas no console.log, por exemplo, caso ele não esteja ativado, não vai escrever nada:\n\nconst DEBUG = true\nconsole.log(1)\nGeralmente as pessoas fariam algo assim:\nif(DEBUG)\nconsole.log(1)\nO detalhe é que existe outra forma de fazer isso, chamada de short-circuit, onde deixamos o DEBUG na frente e colocamos &#x26;&#x26; (‘e’ comercial). Vai acontecer a mesma coisa:\n\nDEBUG &#x26;&#x26; console.log(1)\nSe colocarmos o false em DEBUG, o console.log não irá rodar. Isso acontece porque quando fazemos os ‘E’s comerciais, temos uma precedência, ou seja, ele depende que tudo seja verdade para que retorne verdadeiro, se DEBUG é false, ele nem valida o restante do código, por esse motivo chamamos de short-circuit (curto-circuito), afinal nós cortamos esse circuito e isso evita de executarmos o restante das operações. Eu posso definir todas as minhas linhas de DEBUG dessa forma por exemplo.\n\nEssa variável pode vir de uma variável de ambiente, podemos rodar nosso script em modo DEBUG e setar algumas coisas a mais, como definir um banco diferente ou coisas no sentido que funcionaria normalmente.\n\nA segunda dica que quero mostrar é o uso do operador || (‘ou’), que usamos para valores padrão. Vamos supor que ‘a’ eu não defina nada dentro dele e em ‘b’ eu quero colocar o valor de ‘a’ ou um valor padrão caso o ‘a’ seja vazio.",
      "description": "Essa dica pode ser utilizada tanto em JavaScript quanto em outras linguagens de programação, apenas com um pouco de adaptação. Vamos falar primeiramente so...",
      "keywords": [
        "debug",
        "circuit",
        "short",
        "padr",
        "valor",
        "https",
        "console",
        "para",
        "javascript",
        "valores"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/short-circuit-e-valores-padrao"
      }
    },
    {
      "id": "437d0d082a1b1adb",
      "url": "https://devpleno.com/hands-on-yarn",
      "title": "Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM) - DevPleno (Part 2)",
      "content": "Uma coisa que chateia bastante em projetos grandes é a ordem em que os pacotes são instalados. No NPM, ele segue uma forma não determinística, se rodarmos duas vezes com as mesmas circunstâncias, pode acontecer dos pacotes serem instalados em uma ordem diferente, o yarn resolve isso e ainda gera um checkson para cada dependência, então ele checa realmente se você está instalando a mesma versão que você travou no projeto. Além disso, é muito simples de verificar o yarn.lock, afinal é um arquivo texto bem simples.\n\nTambém podemos colocar:\n\nyarn global add nome-do-pacote\nCom isso ele deixa em escopo global.\n\nEntão ele é muito bom para aumentar a velocidade de instalação, principalmente no servidor de continuous integration porque, a medida que o servidor vai cacheando os módulos, é possível fazer o build da sua aplicação muito mais rápido.\n\nApenas por curiosidade, o Yarn foi desenvolvido pelo facebook em parceria com o google porque eles perceberam exatamente isso, quando você começa a escalar o projeto e aumentar o número de dependências, o npm começa a atrapalhar um pouco.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Yarn%20(uma%20alternativa%20ao%20gerenciador%20de%20pacotes%2Fdepend%C3%AAncias%20NPM)&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-yarn) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-yarn)",
      "description": "O ",
      "keywords": [
        "yarn",
        "isso",
        "https",
        "depend",
        "fazer",
        "projeto",
        "para",
        "javascript",
        "ncias",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-on-yarn"
      }
    },
    {
      "id": "43dc14124f2ba23c",
      "url": "https://devpleno.com/fs-extra",
      "title": "Fs-extra - Filesystem com Promises e mais funcionalidades - DevPleno (Part 1)",
      "content": "Javascript\n\n## Fs-extra - Filesystem com Promises e mais funcionalidades\n\nT\nPor Tulio Faria • 15 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nO Fs-extra é uma forma de otimizar as funcionalidades do SF normal do node. Primeiramente, temos que executar o comando yarn sf-extra. Uma utilidade interessante do SF-extra é que, importando o outputFile, é possível criar um arquivo, um TXT, por exemplo. Ele funciona tanto com callback quanto com promises.\n\nfs.outputFile('file.txt', 'olá').then(() => console.log('ok'))\nCom isso, ele irá criar um arquivo file.txt com o texto olá* dentro e o console nos enviará uma mensagem *ok*. Isso possibilita usarmos mais facilmente com async await, generator e por aí vai. Outra coisa interessante é que ele trás alguns métodos que não são comuns no FS como o fs.copy, que é possível copiar o arquivo diretamente por ele usando uma versão ‘promiseficada’.\n\nfs.copy('file.txt', 'file2.txt').then(() => console.log('ok'))\nAssim. será criado um arquivo file2.txt copiando o arquivo file.txt Este foi apenas uma pequena apresentação do FS-extra, ele permite utilizarmos mais tranquilamente essas novidades do ES6, ES7, async await e por ai vai, isso fica muito legal para usarmos com promises.\n\nEle também agiliza bastante, já que com generator poderíamos, por exemplo, só usar o yield fs.copy sem mesmo usar o then, e já resolveria a promise tranquilamente.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "O Fsextra é uma forma de otimizar as funcionalidades do SF normal do node. Primeiramente, temos que executar o comando yarn sfextra. Uma utilidade interess...",
      "keywords": [
        "extra",
        "https",
        "arquivo",
        "file",
        "javascript",
        "promises",
        "mais",
        "then",
        "console",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/fs-extra"
      }
    },
    {
      "id": "44143a0ec4939004",
      "url": "https://devpleno.com/listar-arquivos-em-js",
      "title": "Listar arquivos em JS (async, await, promise e Promise.all) - DevPleno (Part 1)",
      "content": "Javascript\n\n## Listar arquivos em JS (async, await, promise e Promise.all)\n\nT\nPor Tulio Faria • 8 de maio de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje eu quero corrigir um exercício que passei no FullStack Academy que gera muitas dúvidas, principalmente para quem está começando na linguagem e quer aprender a lidar melhor com assincronia.\n\nEntão o exercício passado foi o seguinte: Dado uma lista de arquivos e diretórios retornada de uma função que lista o que tem no diretório, precisamos mostrar quais delas são arquivos. Para isso usamos uma função FS.stat.\n\nPrimeiramente precisamos saber a lista de arquivos que tem em um diretório, então vamos importar o nosso ‘fs’ e testar a função de ler um diretório retornando o nosso callback:\n\nconst fs = require('fs')\nfs.readdir('./', (err, paths) => {\nconsole.log(paths)\n})\nAo executar esse código, ele irá trazer um monte de nomes, alguns com extensão, outros sem. Podemos concluir então que esse diretório tem arquivos e diretórios misturados. Agora como eu vou checar se cada um desses arquivos são ou não arquivos? Precisamos criar uma versão em promise desse fs.readdir e, baseado nesse readdir, podemos resolver a promise ou recusar essa promise:\n\nfunction readdir(path){\nreturn new Promise((resolve, reject) => {\nfs.readdir(path, (err, paths) =>{\nif(err){\nreject(err)\n} else {\nresolve(paths)\n}\n}\n}\n}\nSimplesmente estou retornando uma promise desse readdir, o que muda é que agora eu posso chamar o readdir passando o ./ com o then:\n\nreaddir('./')then((paths) => console.log(paths))\nDo ponto de vista de assincronismo, continua tendo a mesma coisa, usufruindo das vantagens da parte assíncrona do JavaScript e no nosso caso, no Node. Agora a função que eu tenho para saber se um arquivo é arquivo mesmo é o fs.stat, eu falo qual o path que eu quero e nesse path ele vai retornar stat desse arquivo:",
      "description": "Hoje eu quero corrigir um exercício que passei no FullStack Academy que gera muitas dúvidas, principalmente para quem está começando na linguagem e quer ap...",
      "keywords": [
        "stat",
        "path",
        "paths",
        "await",
        "const",
        "arquivos",
        "promise",
        "async",
        "readdir",
        "lista"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/listar-arquivos-em-js"
      }
    },
    {
      "id": "442238730c52a877",
      "url": "https://devpleno.com/preview-de-imagens-antes-do-upload",
      "title": "Preview de imagens antes do upload - DevPleno (Part 1)",
      "content": "Javascript\n\n## Preview de imagens antes do upload\n\nT\nPor Tulio Faria • 13 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vamos fazer o preview da imagem que está sendo selecionada para fazer upload, isso é bastante interessante de se fazer quando o usuário está selecionando uma foto.\n\nVamos criar inicialmente um html, em seguida criar um input type do tipo file e um img:\n\n&#x3C;html>\n&#x3C;head>Preview Upload&#x3C;/head>\n&#x3C;body>\n&#x3C;input type='file' id='upload' />\n&#x3C;img id='img' />\n&#x3C;script\nsrc='https://code.jquery.com/jquery-3.2.1.slim.js'\nintegrity='sha256-tA8y0XqiwnpwmOIl3SGAcFl2RvxHjA8qp0+1uCGmRmg='\ncrossorigin='anonymous'\n>&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nAgora vamos abrir uma tag script nele. Quando o documento estiver pronto e for feito um change, vamos fazer um console.log this:\n\n&#x3C;script>\n$(function()\n{$('#upload').change(function () {\nconsole.log($(this)[0].files)\n})})\n&#x3C;/script>\nAssim estamos pegando o arquivo na posição zero. A partir disso, vamos criar um const que vai ser igual a this na posição 0. Já que ele é uma instância de files, conseguimos utilizar um fileReader e ler e processar esse arquivo:\n\n&#x3C;script>\n$(function()\n{$('#upload').change(function () {\nconst file = $(this)[0].files[0]\nconst fileReader = new fileReader()\nfileReader.onLoadend = function () {\nconsole.log(fileReader.result)\n}\nfileReader.readAsDataURL(file)\n})})\n&#x3C;/script>\nComo a imagem gera uma URL válida, se eu colocá-lo como source da imagem, ele vai dar um preview.\n\n&#x3C;script>\n$(function(){\n$('#upload').change(function(){\nconst file = $(this)[0].files[0]\nconst fileReader = new fileReader()\nfileReader.onLoadend = function(){\n$('#img')attrib('src', .fileReader.result)\n}\nfileReader.readAsDataURL(file)\n})\n})\n&#x3C;/script>\nIsso é muito interessante para a experiência do usuário como um todo. Imagine se eu estivesse selecionando um documento, seria muito mais fácil se eu estivesse prevendo ele.",
      "description": "Hoje vamos fazer o preview da imagem que está sendo selecionada para fazer upload, isso é bastante interessante de se fazer quando o usuário está seleciona...",
      "keywords": [
        "filereader",
        "upload",
        "script",
        "function",
        "https",
        "file",
        "preview",
        "vamos",
        "this",
        "const"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/preview-de-imagens-antes-do-upload"
      }
    },
    {
      "id": "44b3f57e4dfe2e91",
      "url": "https://devpleno.com/entrevista-carlos-drury-e-thiago-coelho",
      "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho - DevPleno (Part 3)",
      "content": "**Thiago Coelho**: “Como tinha dito antes, eu vim de São Paulo, sou formado pela FAI, tenho cursos técnicos em Pouso Alegre, minha paixão por desenvolvimento começou no SENAI e no IMPETTECC que foi onde eu tive o primeiro contato com tecnologia em si, quando eu comecei a fazer faculdade, o mundo era Desktop e JAVA, nesse momento eu estava começando a aprender um pouco de PHP, HTML e JavaScript, na época eu enxerguei um nicho muito grande nessas tecnologias. Trabalhei na faculdade por 4 anos na parte de desenvolvimento WEB, nessa época eu decidi ir para São Paulo pelo fator oportunidade. Mas como você disse, hoje a vida no interior tem uma qualidade de vida muito melhor, por isso eu voltei. Agora em termo de carreira, uma dica que eu posso dar para as pessoas é o Inglês, no meu caso para entrar na INATEL eu deveria ter o inglês, o que me salvou foi o JavaScript, meu conhecimento é avançado em JavaScript, mas não sou muito avançado em inglês.”\n\nPara complementar uma informação, estávamos conversando anteriormente, o inglês é o que mata, porque a gente acha que tem o inglês, mas quando está em uma chamada onde tem um indiano, um alemão e um argentino é muito complicado conversar com o pessoal. Então o inglês as vezes atrapalha a gente a conseguir algo melhor na carreira. Eu tive o mesmo teto que o Thiago teve, os clientes que eu tinha cheguei no meu limite de testar e enfrentar desafios, foi quando eu comecei a tentar coisas fora e eu não sabia inglês, o que me salvou também foi o conhecimento técnico. Enfim, Obrigado pela participação de vocês e por me receberem, sempre que puder eu vou convidar vocês para compartilhar conhecimento porque é algo muito válido.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?",
      "description": "Carlos Drury e Thiago Coelho fazem parte do GDG Vale da Eletrônica. Essa entrevista aconteceu durante um evento organizado por eles no Vale da Eletrônica, ...",
      "keywords": [
        "para",
        "carlos",
        "ingl",
        "drury",
        "thiago",
        "carreira",
        "grande",
        "muito",
        "https",
        "coelho"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/entrevista-carlos-drury-e-thiago-coelho"
      }
    },
    {
      "id": "44d24e7a7075c818",
      "url": "https://devpleno.com/handsonreact-gg",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /handsonreact-gg to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "handsonreact"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/handsonreact-gg"
      }
    },
    {
      "id": "44ff4736cc50c365",
      "url": "https://devpleno.com/hands-on-pre-commit",
      "title": "Hands-on: Pre-Commit - DevPleno",
      "content": "Javascript\n\n## Hands-on: Pre-Commit\n\nT\nPor Tulio Faria • 24 de fevereiro de 2017\n\n[Javascript](/tag/javascript)\n\nO módulo testado neste post é o Pre-Commit, que nos permite executar tarefas antes de fazer Commit em seus repositórios Git.\n\nAssista o vídeo para entender como funciona:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Pre-Commit&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-pre-commit) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-pre-commit)",
      "description": "O módulo testado neste post é o PreCommit, que nos permite executar tarefas antes de fazer Commit em seus repositórios Git. Assista o vídeo para entender c...",
      "keywords": [
        "commit",
        "https",
        "javascript",
        "hands",
        "para",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno",
        "2fhands"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-pre-commit"
      }
    },
    {
      "id": "4555ace546318fe8",
      "url": "https://devpleno.com/blog/decisao-tecnica/index",
      "title": "Decisão técnica não precisa ser eterna (Part 1)",
      "content": "Muitas pessoas, principalmente na época em que dava aulas presenciais, costumavam me perguntar qual tecnologia estudar. Geralmente as pessoas colocam a linguagem ou a tecnologia como se fosse uma decisão exclusiva que não pode ser mudada nunca mais. Não existe isso, se você é um profissional desse tipo, eu sinto lhe informar que está fadado ao fracasso, pois suas decisões devem estar sempre evoluindo, sua melhor decisão tem que ser a melhor decisão para aquele momento. Decisão técnica não precisa ser eterna!\n\nEu já fiz muito projeto em Angular por exemplo, e hoje para mim o React acaba sendo mais interessante, mas não que o Angular seja ruim, é que para mim o React é melhor no momento.\n\nJá aconteceu de eu dizer que ASP é ruim porque estava começando minha carreira com ASP e comparei com o PHP, que eu já era bem melhor, nesse caso óbvio que ASP vai ser pior que PHP, pois os meus parâmetros eram diferentes. Então precisamos tomar cuidado com esse tipo de pensamento porque essas decisões não vão ser para o resto da vida, você pode e até deve mudar de opinião e se reciclar sempre. Quando for tomar uma decisão, como criar um projeto novo, meu conselho é conhecer mais opções, não precisa tomar a decisão final com a linguagem e pronto… Aprenda Angular e React, por exemplo, e veja qual você se sente mais confortável para fazer aquele projeto e não para todos os projetos da sua vida. Isso vai permitir que você evolua na sua carreira.\n\nComigo aconteceu várias coisas nesse sentido, antes eu achava que a HS era cara, ai eu hospedava tudo na Digital Ocean, hoje eu uso a HS e ela não custa caro, tudo depende do ponto de vista.",
      "keywords": [
        "decis",
        "para",
        "melhor",
        "qual",
        "mais",
        "angular",
        "react",
        "tomar",
        "embed",
        "tecnologia"
      ],
      "metadata": {
        "title": "Decisão técnica não precisa ser eterna",
        "date": "2017-08-08",
        "tags": "['Carreira']",
        "thumbnail": "DECISÃO-TÉCNICA-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/decisao-tecnica/index.md"
      }
    },
    {
      "id": "4566b423e4dffc7f",
      "url": "https://devpleno.com/como-criar-e-reutilizando-seus-proprios-modulos",
      "title": "Como criar e reutilizar seus módulos no NodeJS com Git - DevPleno (Part 1)",
      "content": "Javascript\n\n## Como criar e reutilizar seus módulos no NodeJS com Git\n\nT\nPor Tulio Faria • 29 de novembro de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nHoje quero mostrar um recurso que nós temos na ferramenta NPM e que poucas pessoas sabem que existem. Com ela, podemos criar nossos próprios módulos sem precisar registrar no repositório do NPM.\n\nUma coisa interessante do yarn e NPM é que podemos colocar como dependência do nosso projeto um repositório GIT, inclusive um commit específico ou tag especifica.\n\nQual a vantagem dessa situação?\n\nMuita gente não utiliza reaproveitamento de código, nem cria seus próprios módulos e bibliotecas porque não tem como compartilhar isso de forma privada. Aqui vamos fazer um exemplo utilizando o repositório do Github.\n\nNós poderíamos utilizar um repositório privado desde que, na máquina que estiver utilizando, esse repositório tivéssemos uma chave para baixar essa dependência.\n\nPara simplificar esse processo, vou criar um repositório novo e deixar inicializando com o README e dar um create repository:\n\nEle vai conter meu código e que vai ser compartilhado com outros projetos. Primeiramente vamos copiar o link que ele nos gera:\n\nVamos agora clonar na máquina. Como ela já está com o tortoise git e a chave atrelada, então eu consigo dar um ok e ele já baixa.\n\nAgora eu posso ir para minha pasta e dar um NPM init nessa pasta para iniciar meu módulo.\n\nCom o package.json aberto, o mais importante é o arquivo main, ele é o que vai ser nosso arquivo principal, ou seja, o ponto de entrada do nosso módulo.\n\nVamos criar então um index.js e exportar uma função que retorna uma string:",
      "description": "Hoje quero mostrar um recurso que nós temos na ferramenta NPM e que poucas pessoas sabem que existem. Com ela, podemos criar nossos próprios módulos sem pr...",
      "keywords": [
        "reposit",
        "criar",
        "vamos",
        "como",
        "para",
        "https",
        "seus",
        "podemos",
        "agora",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/como-criar-e-reutilizando-seus-proprios-modulos"
      }
    },
    {
      "id": "45986bfcc9f5b1dd",
      "url": "https://devpleno.com/blog/hands-on-threejs/index",
      "title": "Hands-on - Three.JS (Part 2)",
      "content": "```jsx\n<html>\n    <body>\n        <script src=\"//cdnjs.cloudflare.com/ajax/libs/three.js/88/three.js\">\n        </script>\n        <script>\n            const scene = new THREE.Scene()\n            const camera = new THREE.PerspectiveCamera(75, window.in\n            nerWidth / window.innerHight, 0.1, 1000)\n            const renderer = new THREE.WebGLRenderer()\n            renderer.setSize(window.innerWidth, window.innerHeight)\n            documnet.body.appenChild(renderer.domElement)\n            const box = new THREE.BoxGeometry(1,1,1)\n            const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })\n            const cube = new THREE.Mesh( box, material )\n            scene.add( cube )\n            camera.position.z = 5\n            const animated = () => {\n                requestAnimationFrame( animate )\n                renderer.render( scene, camera)\n            }\n            animate()\n        </script>\n    </body>\n</html>\n```\n\nO renderizador pega uma câmera e renderiza a cena na câmera, com isso ele cria a imagem a partir disso.\n\nO animated fica renderizando a todo momento, então caso eu faça alguma alteração no meu objeto que está dentro da cena, vai ser atualizado na tela:\n\n```jsx\nconst animated = () => {\n  requestAnimationFrame(animate)\n  cube.rotation.x += 0.01\n  cube.rotation.y += 0.01\n  cube.rotation.z += 0.01\n  renderer.render(scene, camera)\n}\n```\n\nFazendo isso, nosso cubo começa a girar em todas as direções. Isso está sendo renderizado com o WebGL e 3D. Conseguimos carregar modelos 3d, etc.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/WMFNaTFkVyg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "three",
        "const",
        "window",
        "script",
        "scene",
        "renderer",
        "body",
        "vamos",
        "isso",
        "html"
      ],
      "metadata": {
        "title": "Hands-on - Three.JS",
        "date": "2017-11-16",
        "tags": "['Javascript']",
        "thumbnail": "ThreeJS.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-threejs/index.md"
      }
    },
    {
      "id": "459d50f5433fcfee",
      "url": "https://devpleno.com/nova-skills-preco-que-tem-que-ser-pago",
      "title": "Novas Skills: O preço que tem que ser pago - DevPleno (Part 1)",
      "content": "Carreira\n\n## Novas Skills: O preço que tem que ser pago\n\nT\nPor Tulio Faria • 8 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nRecentemente ministrei uma palestra e passei a refletir o quanto de tempo nós que investir para conseguir realizar alguma coisa. Conhecimento ou Skills são como se fosse uma conta bancaria. Por exemplo, se você quer aprender a programar alguma uma certa linguagem, tem que depositar tempo nessa linguagem. Quando se quer uma nova Skill, você entra devendo nesta conta.\n\nPor exemplo, quero ter uma Skill que é saber a complexidade de um algoritmo, como não sei nada sobre este algoritmo começo negativo, e, na medida que estuda esta linguagem, você vai se aproximando de não dever nada, ou seja, conhecer o algoritmo. E quando você começa a tirar lucro disso podemos fazer a analogia de dinheiro investido, ou positivo nesta conta.\n\n**Sempre começamos no negativo.**\n\nComo a música do Mr Big, Price you gonna pay, se você quer aprender algo novo, é o preço que você tem que pagar. Muitas vezes, com alguns treinamentos, você pode reduzir esse tempo gasto, mas estaria trocando menos tempo por dinheiro investido.\n\nIsso é muito interessante para refletirmos sobre nossa vida, às vezes estamos empolgados para fazer algo, mas não queremos pagar o preço.\n\n“Eu quero ter uma empresa milionária, mas não quero pagar o preço”\n\n“Quero fazer meu aplicativo funcionar, mas não quero pagar o preço”\n\nÉ importante termos essa ciência de que tudo tem um preço para se pagar: seu tempo, dinheiro… Algo deve ser depositado para trazer resultados.\n\n**Meu conselho:**\n\nSe você já está dedicando seu tempo a estudar alguma coisa, estude de um jeito que não vai precisar se dedicar novamente. Da mesma forma que ficamos negativos em uma Skill por não ter nenhuma experiencia, com o tempo vamos ficando cada vez mais positivos.\n\n**Qual o intuito disso?**",
      "description": "Recentemente ministrei uma palestra e passei a refletir o quanto de tempo nós que investir para conseguir realizar alguma coisa. Conhecimento ou Skills são...",
      "keywords": [
        "para",
        "tempo",
        "pagar",
        "https",
        "quero",
        "carreira",
        "skills",
        "alguma",
        "skill",
        "come"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/nova-skills-preco-que-tem-que-ser-pago"
      }
    },
    {
      "id": "45c8818c99fcacf1",
      "url": "https://devpleno.com/blog/algoritmos-odd-occurrences-array/index",
      "title": "Algoritmos: Odd Occurrences in Array",
      "content": "Neste vídeo, comento sobre o algoritmo Odd Occurrences in Array, disponível no Codility. O interessante deste algorítimo é mantermos a complexidade em O(n). Confira no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/bgaUjbQ8NsQ\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "https",
        "responsive",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "neste",
        "comento",
        "sobre"
      ],
      "metadata": {
        "title": "Algoritmos: Odd Occurrences in Array",
        "date": "2017-03-13",
        "tags": "['Algoritmos']",
        "thumbnail": "ALG.-Ponteiros-IN-ARRAY-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/algoritmos-odd-occurrences-array/index.md"
      }
    },
    {
      "id": "460586cba2cef853",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-5/index",
      "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar (Part 1)",
      "content": "Chegamos à última etapa do nosso Minicurso de Socket.IO. Nessa aula, nós vamos colocar o projeto no ar para que você possa utilizá-lo como um projeto de portfólio e também mostrar as atualizações em tempo real para um potencial cliente. Além disso, eu vou mostrar como a gente pode deixar ele mais resiliente a falhas, como podemos gerar auto scalling, como aumentar a disponibilidade desse projeto. Além disso, vamos falar sobre outras melhorias que são muito importantes quando colocadas em produção.\n\nA primeira coisa é que vamos colocar o projeto para rodar no digital ocean, se você ainda não colocou nada no ar, ele é a melhor experiência para fazer isso porque ele é bastante simples e também barato, custa em torno de 5 dólares por mês por uma máquina que tem 512mb de ram, então se você for rodar um site de portfólio já é o suficiente.\n\nEu já estou logado na minha conta, nela já tenho o cartão de crédito atrelado então já consigo criar um droplet aqui sem nenhum problema, eu aconselho a entrar em digitalocean.com e colocar os seus dados bancários também porque eles vão pedir.\n\nVou dar um create Droplet. Uma coisa que é muito legal do digital ocean é que podemos começar uma máquina do zero, instalar o node e etc, ou ir em One-click apps e escolher uma máquina já preparada para isso, ali já tem o Node em uma versão boa, que é a 6.10.3 e no Ubunto 16.04. Então eu vou clicar em NodeJS 6.10.3:\n\n![Exemplo 1](socketpart5Ex1.png)\n\nE no tamanho da máquina eu vou escolher a de 5 colares:\n\n![Exemplo 2](socketpart5Ex2.png)\n\nEu já rodei aplicações production read e, em uma máquina de 10 dólares. tivemos 100 conexões simultâneas no Socket.IO, então não é uma escala muito grande, mas já deu para medir bastante e não teve quase nada de uso de memória.",
      "keywords": [
        "para",
        "vamos",
        "como",
        "fazer",
        "isso",
        "quina",
        "agora",
        "temos",
        "colocar",
        "projeto"
      ],
      "metadata": {
        "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar",
        "date": "2017-07-11",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "SocketIOpart5.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/minicurso-socket-io-parte-5/index.md"
      }
    },
    {
      "id": "461bf2ae17d100e7",
      "url": "https://devpleno.com/hands-on-jest",
      "title": "Jest - Como utilizar a ferramenta de testes criada pelo Facebook - DevPleno (Part 2)",
      "content": "const modulo1 = {\nfunc1: (a) => a + 1,\nfunc2: (a, cb) => a + cb(a)\n}\nmodule.exports = modulo1\nPodemos fazer o seguinte para testar essa função:\n\nconst modulo1 = require('./modulo1')\ndescribe('basic features', () => {\nit('should return the right value', () => {\nexpect(modulo1.func1(10)).toBe(11)\n})\nit('func2', () => {\nconst cb = jest.fn()\ncb.mockReturnValue(1)\nexpet(modulo1.func2(10, cb)).toBe(11)\n})\n})\nNão implementamos ali a função 2, mas passamos um mock para ele, ou seja, passamos uma função falsa para essa função 2 usando o jest.fn, que serve exatamente para mockar funções. Dentro do mock, queremos que ele retorne 1.\n\nSe colocarmos um\n\nconsole.log(cb.mock.calls)\nvamos conseguir até mesmo inspecionar se a chamada foi com o valor correto.\n\nO Jest é muito interessante, pois já vem com esquema de mock, a parte de axceptions, parte de test runner e é um pouco mais rápido, principalmente quando formos testar componentes em React, e ainda tem um esquema chamado SnapShot, que tira ‘fotos’ dos componentes que você fizer no React para ele perceber se precisa ou não executar aquele componente. Por exemplo, renderizamos esse componente usando o JSDom e, se falhar, comparando essas fotos do componente de antes e depois, você será avisado.\n\nConfira:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Jest%20-%20Como%20utilizar%20a%20ferramenta%20de%20testes%20criada%20pelo%20Facebook&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-jest) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-jest)",
      "description": "O Jest foi criado pelo Facebook com o objetivo de rodar os testes de uma maneira eficiente e com menos configurações. Aqui eu já tenho um diretório para o ...",
      "keywords": [
        "modulo1",
        "jest",
        "para",
        "rodar",
        "vamos",
        "test",
        "https",
        "testes",
        "const",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-on-jest"
      }
    },
    {
      "id": "46507b7af824ecf8",
      "url": "https://devpleno.com/dica-self-invoked-function-self-invoking-function",
      "title": "Dica: Self-Invoked Function (Self-invoking Function) - DevPleno",
      "content": "Javascript\n\n## Dica: Self-Invoked Function (Self-invoking Function)\n\nT\nPor Tulio Faria • 23 de março de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nSelf-invoked Functions é uma técnica bastante interessante no Javascript, e pode resolver alguns problemas de conflito de contexto (que já estão sendo reduzidos pelo ES6/ES7). Nesta dica, mostro o que é esta técnica e onde você pode utilizá-la.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno/), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Self-Invoked%20Function%20(Self-invoking%20Function)&url=https%3A%2F%2Fdevpleno.com%2Fdica-self-invoked-function-self-invoking-function) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-self-invoked-function-self-invoking-function)",
      "description": "Selfinvoked Functions é uma técnica bastante interessante no Javascript, e pode resolver alguns problemas de conflito de contexto (que já estão sendo reduz...",
      "keywords": [
        "self",
        "function",
        "https",
        "invoked",
        "javascript",
        "invoking",
        "dica",
        "fundamentos",
        "cnica",
        "pode"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-self-invoked-function-self-invoking-function"
      }
    },
    {
      "id": "46a46abbd4d66a1c",
      "url": "https://devpleno.com/modulos",
      "title": "NodeJS Primeiros Passos: Módulo em NodeJS - DevPleno (Part 2)",
      "content": "Vamos criar um novo arquivo modulo02 e um app02, no módulo 2 terá um exemplo um pouco diferente, ao invés de deixar ele criar o escopo como quiser, eu vou criar o modulo02 dentro de uma variável e criar minha própria function, ou seja, vou criar um escopo só para esse módulo:\n\nvar modulo02 = function (initialValue) {\nvar contador = initialValue\nreturn {\ncontar: function () {\ncontador++\n},\nescrever: function () {\nconsole.log(contador)\n}\n}\n}\nmodule.exports = modulo02\nEssa variável contador é semelhante a um atributo da classe de forma privada, ou seja, não está disponível de forma global, com isso podemos ‘explicitar’ uma interface que queremos que todos os outros enxerguem, retornando um objeto com duas funções.\n\nA primeira vai só incrementar, a segunda function só escreve e finalmente vamos expor o nosso módulo todo para o ‘mundo’.\n\nAgora, indo para o app02.js, faremos o seguinte:\n\nvar m1 = require('./modulo02')\nSe fizermos apenas isso, perceba que a function será retornada mas não vai executar a função, então temos que passar o valor inicial que eu quero:\n\nvar m1 = require('./modulo02')(1)\nvar m2 = require('./modulo02')(2)\nm1.contar()\nm2.escrever()\nFazendo isso, isolamos os 2 módulos através de uma closer, que é muito semelhante a uma classe.\n\nTeríamos atributos, métodos públicos e métodos privados, pois como eu não exponho ele, então seria visível em um mesmo escopo.\n\nvar modulo02 = function (initialValue) {\n//atributos\nvar contador = initialValue\n//metodo privado\nvar ooo = function () {}\n//metodos publicos\nreturn {\ncontar: function () {\ncontador++\n},\nescrever: function () {\nconsole.log(contador)\n}\n}\n}\nIsso seria um constructor porque ele consegue definir os valores iniciais e seria executado quando instanciamos o módulo.\n\nEssa é uma das maneiras que temos de organizar módulos, vamos falar mais sobre isso posteriormente.\n\nConfira a explicação completa em vídeo:",
      "description": "O que é Módulo em NodeJS? É um script php no qual você consegue incluir em um outro script. É uma maneira bem tradicional de se organizar as partes funcion...",
      "keywords": [
        "function",
        "dulo",
        "require",
        "contar",
        "contador",
        "para",
        "modulo02",
        "modulo01",
        "nodejs",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/modulos"
      }
    },
    {
      "id": "46aa3232dc358da3",
      "url": "https://devpleno.com/listar-arquivos-em-js",
      "title": "Listar arquivos em JS (async, await, promise e Promise.all) - DevPleno (Part 3)",
      "content": "async function lista() {\nconst paths = await readdir('./')\nconst stats = paths.map(async (path) => await stat(path))\nconsole.log(paths)\n}\nlista()\nSe dermos um console.log no stats, vamos ter uma lista de promises pendentes, então esse código roda síncronamente, até mesmo o map, toda vez que tenho um async tenho uma promises disfarçada e como ele retorna uma outra promise, eu tenho várias sem resolver. Com isso eu precisaria pensar em uma forma de resolver todas essas promises. Para resolver, podemos utilizar o promises.all que também retorna uma promise e retornar todas as promises que estão pendentes:\n\nasync function lista() {\nconst paths = await readdir('./')\nconst stats = paths.map(async (path) => await stat(path))\nconst stats = await Prmise.all(statsPromises)\nconsole.log(paths)\n}\nlista()\nAgrupamos então todas essas promises em uma, o await vai esperar a promise retornada do promise.all, se rodarmos o código agora, teremos os resultados de todos os arquivos.\n\nAgora como eu vou saber qual caminho é o que?\n\nNa minha função stat, ao invés de retornar só o stat, vou retornar o path também para sabermos que arquivo é esse:\n\nfunction stat(path){\nreturn new Promise((resolve, reject) => {\nfs.stat(path, (err, stat) =>{\nif(err){\nreject(err)\n} else {\nresolve({path, stat })\n}\n})\n}\n}\nAgora precisamos filtrar qual desses caras são realmente arquivos, para isso vamos fazer o seguinte:\n\nasync function lista() {\nconst paths = await readdir('./')\nconst stats = paths.map(async (path) => await stat(path))\nconst stats = await Prmise.all(statsPromises)\nconst pathsWithIsFile = stats.map((path) => ({\npath: path,\nisFile: path.stat.isFile()\n}))\nconst files = pathsWithIsFile.filter((path) => path.isFile)\nconsole.log(files)\n}\n\nlista()\nAgora ele irá retornar apenas os caminhos que são arquivos, o grande segredo de tudo é essa parte:",
      "description": "Hoje eu quero corrigir um exercício que passei no FullStack Academy que gera muitas dúvidas, principalmente para quem está começando na linguagem e quer ap...",
      "keywords": [
        "stat",
        "path",
        "paths",
        "await",
        "const",
        "arquivos",
        "promise",
        "async",
        "readdir",
        "lista"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/listar-arquivos-em-js"
      }
    },
    {
      "id": "46c640ad5513e2db",
      "url": "https://devpleno.com/promisify-node",
      "title": "Promisify-Node: Convertendo funções clássicas do Node em Promises - DevPleno (Part 1)",
      "content": "Javascript\n\n## Promisify-Node: Convertendo funções clássicas do Node em Promises\n\nT\nPor Tulio Faria • 4 de maio de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nNeste post, vamos fazer um hands-on do Promisify-Node, uma forma de converter as funções clássicas do Node em JavaScript que retornam callback em promises. Existem vários módulos que já fazem isso, como em módulos utilitários de promises, o q, bluebird, por exemplo.\n\n**Então por que usar o Promisify-Node?**\n\nEle tem uma funcionalidade bastante relevante que vou mostrar durante o hands-on, vamos lá. Para instalar e adicionar como dependência o Promisify-Node:\n\nyarn add promisify-node\nVamos importar o promisify e o fs(file system) para termos uma função com o callBack.\n\nconst promisify = require('promisify-node')\nconst fs = require('fs')\nSe fossemos utilizar o fs normalmente, iriamos fazer o seguinte:\n\nfs.readFile('arquivo.js', (err, data) => console.log(data.toString()))\nEntão ele retorna um callBack, onde eu consigo escrever o conteúdo do arquivo. Então vamos converter essa função em promise para, por exemplo, usar o then dentro de um generator ou com async/await.\n\nPodemos pegar essa função fs.readFile, criar uma nova readFile e passar para promisify, assim:\n\nconst readFile = promisyfy(fs.readFile)\n**Qual a diferença?**\n\nAgora eu posso chamar a readFile, falar qual arquivo eu quero (no caso o arquivo.js) e chamar ele no modo promisify.\n\nreadFile('arquivo.js').then((data) => console.log(data.toString()))\n**Qual a vantagem?**\n\nAlém da promisify ser mais fácil de manipular, evitamos o callback hell ou código hadouken, que faz uma barrigona de tanto callback que tem um dentro do outro.\n\nTambém podemos utilizar com generator e com async/await. Outra coisa legal é que, se quisermos usar todas as funções do fs como uma promise, podemos mudar o Const fs = require(‘fs’) assim:\n\nconst fs = promisify('fs')\nE, assim, qualquer função que eu for utilizar, como por exemplo:",
      "description": "Neste post, vamos fazer um handson do PromisifyNode, uma forma de converter as funções clássicas do Node em JavaScript que retornam callback em promises. E...",
      "keywords": [
        "promisify",
        "node",
        "readfile",
        "para",
        "data",
        "callback",
        "arquivo",
        "https",
        "const",
        "promise"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/promisify-node"
      }
    },
    {
      "id": "46db784c20af8822",
      "url": "https://devpleno.com/lista-encadeada-retornar-um-item",
      "title": "Lista encadeada - Como retornar um item - DevPleno (Part 2)",
      "content": "O que podemos fazer para corrigir?\n\nTemos que pensar o seguinte, se o length for igual a zero ou o índice que queremos é maior do que o length, então temos que retornar null:\n\nconst getByIndex = (index) => {\nif (length === 0 || index >= length) {\nreturn null\n}\nlet node = head\nlet count = 0\nwhile (count &#x3C; index &#x26;&#x26; node.next) {\nnode = node.next\ncount++\n}\nreturn node\n}\nNovamente essa complexidade é 0(n), porque em meu pior cenário eu não tenho índice ou vou pegar o último. Esse é o algoritmo para pegar o índice, caso a gente queira pegar por valor conseguimos também, com a única diferença que temos que checar se o valor é igual e retornar caso seja:\n\nconst getByValue = (value) => {\nif (length === 0) {\nreturn null\n}\nlet node = head\nif (node.value === value) {\nreturn node\n}\nwhile (node.net) {\nnode = node.next\nif (node.value === value) {\nreturn node\n}\n}\nreturn null\n}\nLembrando que temos que exportar ele também:\n\ngetByValue (value) => getByValue(value)\nNo teste **console.log(list.getByValue(2))** ele funcionará, agora caso pegarmos um valor que não existe, vai ser retornado null. Fizemos duas abordagens, uma voltando por valor e outra pelo índice. Lembrando que o segundo IF que fizemos não altera a complexidade do algoritmo, então ela também será 0(n), então no pior cenário ele vai passar em todos os nós e não encontrar. Esses são os exemplos de como podemos retornar um nó em lista encadeada, uma dica final é: resolva da forma que você conseguir e depois vai discutindo como chegar com o melhor desempenho possível, mas sempre resolva primeiro.\n\nConfira todos os passos em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje vamos continuar falando sobre algoritmos e também estrutura de dados. Vamos discutir um pouco sobre essas técnicas que aprendemos na base da computaçã...",
      "keywords": [
        "node",
        "retornar",
        "index",
        "return",
        "lista",
        "length",
        "value",
        "null",
        "ndice",
        "encadeada"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/lista-encadeada-retornar-um-item"
      }
    },
    {
      "id": "46f983e164b0e417",
      "url": "https://devpleno.com/blog/debug-no-navegador/index",
      "title": "Debug de código JavaScript no Navegador (Part 1)",
      "content": "Hoje vou dar uma dica rápida de como podemos fazer o debug de código JavaScript no navegador. É bastante simples, se você já trabalha com Java ou alguma ID, já deve ter uma ideia de como fazer isso na ID.\n\nPodemos fazer isso também no front-end com JavaScript. Para ilustrar, vamos usar o seguinte código, que apenas inclui o jQuery e fiz um scripts.js:\n\n```jsx\n<html>\n  <body>\n    <button id='btn'>Test</button>\n    <script src='jquery-3.1.0.js'></script>\n    <script src='scripts.js'></script>\n  </body>\n</html>\n```\n\nO script em si tem um contador e duas funções assíncronas:\n\n```jsx\nvar counter = 0;\n\ncounter = counter+1;\n\n$(function)(){\n  $(\"btn\").click(function(){\n    counter+=1;\n\n    console.log(counter);\n  });\n});\n```\n\nProvavelmente quando você executar esse código no browser ele não vai fazer nada, pois estamos passando um console.log O que fazer?\n\nNo Windows, aperte F12 para abrir o developer toolbar:\n\n![Developer toolbar](14bf19f2-ae82-4643-90af-9c8d5902e607.png)\n\nUma dica interessante: podemos dar CTRL + e CTRL – dentro da toolbar, com isso ele aumenta e diminui o zoom.\n\nHá vários painéis e no sourse vemos todos nossos arquivos fontes. Nele você escolhe, na barra lateral, qual o arquivo quer visualizar e ele mostrará o código. Também é possível saber o que está acontecendo no script, por exemplo, clicar no número 2 da linha 2, voltar no script e dar F5. Ele pausou para podermos debugar o código.\n\n![Inspecionando o resultado](961d454d-4e91-4b8a-8bf8-2fcfcadc36b8.png)\n\nSe passar o mouse em cima da variável, ele mostra que ela não foi definida ainda, se clicar em step over  ![Icone step over](d1fe7ef8-44cd-465d-9df9-90f065f223b8.png)\n\nele executa a instrução e passa para a próxima linha. Ao passar o mouse em counter, ele recebeu 0 porque agora foi atribuído o valor a ele.",
      "keywords": [
        "para",
        "digo",
        "fazer",
        "script",
        "counter",
        "isso",
        "como",
        "podemos",
        "vamos",
        "jquery"
      ],
      "metadata": {
        "title": "Debug de código JavaScript no Navegador",
        "date": "2017-06-22",
        "tags": "['Javascript']",
        "thumbnail": "DEBUG-NO-NAVEGADOR-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/debug-no-navegador/index.md"
      }
    },
    {
      "id": "4717c2b32f917d43",
      "url": "https://devpleno.com/blog/es6-default-parameters/index",
      "title": "Javascript - ES6 Default Parameters (Part 1)",
      "content": "Hoje vou falar um pouquinho de JavaScript, mais especificamente sobre como podemos fazer o parâmetro padrão para uma função e as alternativas que a gente tem atualmente com ES6 para esse tipo de atividade.\n\nO que é um parâmetro padrão?\n\nVamos supor que temos uma função aplicarImposto, um valor e o quanto de imposto que queremos aplicar para esse valor:\n\n```jsx\nfunction aplicarImposto(valor, imposto) {\n  return valor + valor * imposto\n}\n\nconsole.log(aplicarImposto(100, 0.1))\n```\n\nEntão estamos aplicando o imposto nesse valor. Agora vamos supor que eu não quero deixar o imposto ser obrigatório, deixando um valor padrão para ele:\n\n```jsx\nfunction aplicarImposto(valor, imposto) {\n  console.log(imposto)\n\n  return valor + valor * imposto\n}\n\nconsole.log(aplicarImposto(100, 0.1))\n\nconsole.log(aplicarImposto(200))\n```\n\nAo retornarmos apenas isso vai ser retornado NaN (not a number). Isso acontece porque se tentarmos checar o imposto como boolean, sabemos que ele é um falsy por ser undefined. Para corrigir isso, podemos fazer o seguinte:\n\n```jsx\nfunction aplicarImposto(valor, imposto) {\n  Imposto = imposto || 0.07\n\n  return valor + valor * imposto\n}\n\nconsole.log(aplicarImposto(100, 0.1))\n\nconsole.log(aplicarImposto(200))\n```\n\nSe rodarmos novamente, temos o 7% em cima do 200. Mas temos um outro problema. Vamos supor que eu não queira aplicar um imposto _(por algum milagre o produto não cobre imposto):_\n\n```jsx\nconsole.log(aplicarImposto(100, 0.1))\n\nconsole.log(aplicarImposto(200))\n\nconsole.log(aplicarImposto(300, 0))\n```\n\nRepare que ele retorna 321 ao invés de 300, mesmo colocando 0 de imposto. Isso acontece porque checamos **Imposto = imposto || 0.07** como falsy, e como zero é false, ele retorna o imposto. Poderíamos contornar isso checando se o tipo da variável não é uma undefined:\n\n```jsx\nImposto = typeof imposto === 'undefined' ? 0.07 : imposto\n```\n\nAinda podemos fazer de uma outra forma, com o ES6:",
      "keywords": [
        "imposto",
        "valor",
        "console",
        "aplicarimposto",
        "isso",
        "para",
        "aplicarimpostoes6",
        "como",
        "function",
        "return"
      ],
      "metadata": {
        "title": "Javascript - ES6 Default Parameters",
        "date": "2017-10-10",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Default-Parameters-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/es6-default-parameters/index.md"
      }
    },
    {
      "id": "47610deeacc3d703",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-3/index",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol (Part 5)",
      "content": "Confira o passo a passo em vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ZJqDWCfxrVw\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "vamos",
        "notify",
        "socket",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol",
        "date": "2017-07-07",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-3/index.md"
      }
    },
    {
      "id": "477e68dd834bfcac",
      "url": "https://devpleno.com/blog/converter-markdown-para-html/index",
      "title": "Como converter Markdown para HTML usando Marked (Part 1)",
      "content": "O Markdown é uma forma de escrevermos documentação que foi popularizada pelo Github (e que é uma mão na roda, diga-se de passagem). Com ele, podemos pegar um texto e criar algumas marcações, o que gera uma interface mais organizada, sem perigo de existir sujeiras provenientes do Word por exemplo.\n\n**1 – Usando o módulo Marked**\n\nPara entender como o Markdown funciona, vamos fazer um hands-on no módulo chamado Marked, que tem a função de converter Markdown para HTML.\n\nPrimeiro, vamos criar um arquivo novo para testarmos (vou chamar o meu de teste.js)\n\n**2 – Importando o Marked**\n\nCom o arquivo aberto, vamos dar um Require chamando o módulo Marked\n\n```jsx\nconst marked = require('marked')\n\nconsole.log(marked('# teste'))\n```\n\n**3 – Rodando o arquivo**\n\nAo dar node no arquivo teste.js, perceba que ele vai retornar\n\n```jsx\n<h1> id='teste'>Teste</h1>\n\n\nO # trás pra gente a tag H1, podemos usar 2 # por exemplo e ele nos retornaria a tag H2\n\nconsole.log(marked('## teste'))\n\n<h2> id=\"teste\">Teste</h2>\n```\n\n**4 – Por que usar o Markdown?**\n\nCom ele, conseguimos colocar esses textos de forma mais limpa e também plugarmos renderes nele.\n\nPor exemplo, quando renderizar o H1, quero que seja um pouco diferente. Se colocarmos um texto formatado, poderia converter isso em view no react native, text, HTML, etc.\n\nExemplo:\n\n```jsx\nconstmarked = requie('marked')\n\nconstrenderer = new marked.Renderer()\n\nrenderer.heading = function (Text, level) {\n  return 'Text: ' + text + ' Level: ' + level\n}\n\nconsole.log(marked('# teste', { renderer: renderer }))\n```\n\nLembrando que ao criar um renderer temos que avisar o marked que estamos criando um renderer diferente. Neste caso, como ele é um Heading, vamos chamar o renderer.heading. Novamente, para visualizarmos o que foi feito, vamos dar um node teste.js e ele vai retornar pra gente:\n\n```jsx\nText: Teste Level: 2\n```",
      "keywords": [
        "marked",
        "teste",
        "para",
        "level",
        "text",
        "renderer",
        "markdown",
        "exemplo",
        "vamos",
        "html"
      ],
      "metadata": {
        "title": "Como converter Markdown para HTML usando Marked",
        "date": "2017-05-03",
        "tags": "['Javascript']",
        "thumbnail": "MARKED-POST-2-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/converter-markdown-para-html/index.md"
      }
    },
    {
      "id": "478c55a24fff4d4e",
      "url": "https://devpleno.com/termos-de-uso",
      "title": "Termos de uso - DevPleno (Part 1)",
      "content": "Blog\n\n## Termos de uso\n\nT\nPor Tulio Faria • 14 de março de 2017\n\nEstes termos de serviço regulam o uso deste site. Ao acessá-lo você concorda com estes termos. Por favor, consulte regularmente os nossos termos de serviço.\n\nO website DevPleno (gerenciado e mantido por We Dev Ideas – Eirelli – ME) é um serviço interativo oferecido em por meio de página eletrônica na internet que oferece informações sobre negócios, cultura, etc, e serviços relacionados a desenvolvedores a partir da integração de diversas fontes de informação. O acesso ao DevPleno representa a aceitação expressa e irrestrita dos termos de uso abaixo descritos. Se você não concorda com os termos, por favor, não acesse nem utilize este website.\n\nO visitante poderá usar este site apenas para finalidades lícitas. Este espaço não poderá ser utilizado para para publicar, enviar, distribuir ou divulgar conteúdos ou informação de caráter difamatório, obsceno ou ilícito, inclusive informações de propriedade exclusiva pertencentes a outras pessoas ou empresas, bem como marcas registradas ou informações protegidas por direitos autorais, sem a expressa autorização do detentor desses direitos. Ainda, o visitante não poderá usar o site DevPleno para obter ou divulgar informações pessoais, inclusive endereços na Internet, sobre os usuários do site.\n\nO DevPleno empenha-se em manter a qualidade, atualidade e autenticidade das informações do site, mas seus criadores e colaboradores não se responsabilizam por eventuais falhas nos serviços ou inexatidão das informações oferecidas. O usuário não deve ter como pressuposto que tais serviços e informações são isentos de erros ou serão adequados aos seus objetivos particulares. Os criadores e colaboradores tampouco assumem o compromisso de atualizar as informações, e reservam-se o direito de alterar as condições de uso ou preços dos serviços e produtos oferecidos no site a qualquer momento.",
      "description": "Estes termos de serviço regulam o uso deste site. Ao acessálo você concorda com estes termos. Por favor, consulte regularmente os nossos termos de serviço....",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "termos",
        "servi",
        "website",
        "acesso",
        "para",
        "direitos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/termos-de-uso"
      }
    },
    {
      "id": "47da9f2831cc797a",
      "url": "https://devpleno.com/blog/standard-parte-1/index",
      "title": "Standard - Padronize o código fonte JavaScript da sua equipe (Part 2)",
      "content": "Porque temos que colocar o nosso curly brace na mesma linha do controlador. Se você criar um projeto e seguir esse padrão, as chances do seu código ter menos erros é maior, além disso, ele fica bem mais legível.\n\nEle também tem algumas coisas de lint também, o próprio Standard utiliza o ES Lint para resolver isso. A ideia é que você comece a utilizar algum padrão de código em JavaScript, em todas as linguagens tem alguma recomendação para utilizar as melhores práticas.\n\nConfira o hands-on em vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/H005spSyxeA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "digo",
        "para",
        "exemplo",
        "temos",
        "standard",
        "nosso",
        "resolver",
        "isso",
        "linha",
        "embed"
      ],
      "metadata": {
        "title": "Standard - Padronize o código fonte JavaScript da sua equipe",
        "date": "2017-07-24",
        "tags": "['Javascript']",
        "thumbnail": "StandarPart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/standard-parte-1/index.md"
      }
    },
    {
      "id": "47dea16adc50ea9c",
      "url": "https://devpleno.com/mono-ou-multi-thread-poo-para-js",
      "title": "Mono ou multi thread - POO para JS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Mono ou multi thread - POO para JS\n\nT\nPor Tulio Faria • 6 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vou continuar falando um pouco mais sobre como podemos fazer a transição de uma linguagem orientada-objeto, como PHP ou Java, para JavaScript cada vez mais funcional.\n\nMais especificamente vamos falar sobre “processamento concorrente”, entre aspas, porque hoje, com vários núcleos, nós conseguimos ter um processamento praticamente concorrente. Quero mostrar um problema que é muito comum quando a gente quer exercitar concorrência em linguagens POO. Principalmente em Java, trabalhamos muito com isso para mostrar essa concorrência.\n\nO que fazemos com concorrência em Java?\n\nNós criamos o que chamamos de threads, que é uma linha de execução. Por exemplo, se eu criar algo\n\ncomo:\n\nconst a = 1\nconst b = 10\nEssa linha de execução em Java, por ser uma linguagem síncrona, então eu posso travar a linha de execução. Para evitar que isso aconteça, nós criamos uma nova thread.\n\nÉ muito comum nessas linguagens termos um while(true) checando se algo chegou, como por exemplo conexão de socket. Ela tem suas vantagens e suas desvantagens, mas ela tem um limite onde acabamos tendo alguns problemas para gerenciar essas threads.\n\nJá o JavaScript é mono-thread, com isso ele não mantém várias linhas de execução em paralelo, e sim mantém uma estrutura que vai ser executada depois. Por exemplo:\n\nconst a = 1\nconst b = 2\nQuando executamos essa linha de código em JavaScript, ele entra em algo que chamamos de event loop. É como se fosse uma caixa onde colocamos coisas lá dentro, tudo que vai para ela podemos desempilhar depois. É assim que ele consegue lidar com várias coisas ao mesmo tempo.\n\nPor que isso é tão importante?",
      "description": "Hoje vou continuar falando um pouco mais sobre como podemos fazer a transição de uma linguagem orientadaobjeto, como PHP ou Java, para JavaScript cada vez ...",
      "keywords": [
        "stock",
        "para",
        "const",
        "consumer",
        "math",
        "isso",
        "console",
        "javascript",
        "producer",
        "length"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/mono-ou-multi-thread-poo-para-js"
      }
    },
    {
      "id": "47e1b79983da7a2b",
      "url": "https://devpleno.com/sua-carreira-pode-mudar-durante-o-carnaval",
      "title": "Sua carreira pode mudar durante o carnaval? - DevPleno (Part 3)",
      "content": "Uma preocupação da pessoa pelos e-mails sempre foi a comunicação em inglês. E mesmo não estando preparado, eu mantive a clareza de dizer que talvez não conseguiria mas que eu estaria preparado em um prazo determinado. Da última vez que você foi questionado sobre algo que não domina, você respondeu com um prazo para isso acontecer? No meu caso, respondi que em 3-4 meses eu iria conduzir/liderar uma reunião toda em inglês. Na época eu nunca havia feito isso, muito menos tinha conversado com alguém em inglês. Como eu sabia que 3-4 meses era o suficiente? Na verdade, o que eu sabia era que eu FARIA esse período ser o suficiente para alcançar isso. Independente do que acontecesse, eu ia dar o meu jeito. Sem desculpas! Durante o projeto, destravei meu inglês, aprendi a negociar e a resolver muitos problemas em equipes extremamente diversas. Mas o mais importante: descobri que eu era capaz de contribuir em projetos mundiais e o Brasil já não era mais o meu limite. Depois disso veio a Toptal e vários outros projetos de grande impacto no mundo e na minha carreira… Mas é interessante pensar que tudo começou com uma troca de e-mails no carnaval. E a minha reflexão aqui é: será que a mudança que você quer não está onde você menos espera? Será que você não poderia usar seu carnaval para aprender React ou estudar um tema que vai te proporcionar a mudança que você tanto quer para sua vida? Chega de desculpas!\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Sua%20carreira%20pode%20mudar%20durante%20o%20carnaval%3F&url=https%3A%2F%2Fdevpleno.com%2Fsua-carreira-pode-mudar-durante-o-carnaval) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsua-carreira-pode-mudar-durante-o-carnaval)",
      "description": "Geralmente, acreditase que não… Afinal de contas, carnaval, feriado, festas, bebedeira, ninguém quer se preocupar com carreira ou trabalho. Não é verdade? ...",
      "keywords": [
        "carreira",
        "carnaval",
        "para",
        "minha",
        "estava",
        "durante",
        "mudan",
        "feira",
        "isso",
        "havia"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/sua-carreira-pode-mudar-durante-o-carnaval"
      }
    },
    {
      "id": "4841ae2cf7d45e66",
      "url": "https://devpleno.com/registros-do-mysql-no-nodejs",
      "title": "[SEGREDO] Muitos registros do MySQL no NodeJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## [SEGREDO] Muitos registros do MySQL no NodeJS\n\nT\nPor Tulio Faria • 18 de agosto de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nHoje quero contar um segredo para você: como utilizar o driver padrão do MySQL no Node para lidar com grandes quantidades de dados.\n\nA primeira coisa que vamos fazer é instalar o driver padrão:\n\nyarn add mysql\nTudo que formos fazer em Node e envolve grandes quantidades de dados, temos que pensar em Stream (fique com isso na cabeça). Precisamos utilizar o Stream de alguma forma:\n\nconst mysql = require('mysql')\nconst connection = mysql.createConnection({\nhost: '127.0.0.1',\nuser: 'root',\npassword: '',\ndatabase: 'cadastro'\n})\nconnection.connect(() => console.log('connected'))\nLembrando que eu já tenho um banco de dados para testes. Fizemos algo bem rápido para chegar logo na parte que interessa :)\n\nDepois que conectamos, temos que fazer uma busca. Imagine que você tem que retornar um milhão de registros, a primeira coisa é que você não vai conseguir retornar isso em interface nenhuma, então provavelmente terá que gerar um arquivo xml, json ou qualquer coisa desse tipo.\n\nconnection.connect(() => {\nconsole.log('connected')\nconnection.query('select * from pessoas', (err, results) => {\nconsole.log(results)\n})\n})\nCom isso ele vai mostrar todas as pessoas que estão cadastradas; no meu caso, tenho mais de 900 itens. Isso já é muito peso para ser lidado dessa forma porque a query vai pro banco e volta de uma vez dentro de “results”. Nesse ponto, estamos matando as duas pontas porque precisamos fazer o banco inteiro trazer todos os registros e depois processando todos. Pensando em uma escala de milhão, quando trouxermos para o Node, teremos problema de memória.\n\nPrecisamos então fazer essa query de uma outra maneira:",
      "description": "Hoje quero contar um segredo para você: como utilizar o driver padrão do MySQL no Node para lidar com grandes quantidades de dados. A primeira coisa que va...",
      "keywords": [
        "query",
        "para",
        "connection",
        "mysql",
        "console",
        "fazer",
        "registros",
        "dados",
        "muito",
        "https"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/registros-do-mysql-no-nodejs"
      }
    },
    {
      "id": "484bbee362b3ca3d",
      "url": "https://devpleno.com/blog/quantas-linguagens-programar/index",
      "title": "Quantas linguagens devo programar? (Part 2)",
      "content": "Sabemos que projetos simples de estudo não dão os mesmos problemas que quando colocamos em produção, então, esse processo é muito importante para o aprendizado. Quando você coloca seu software para usuários normais usarem, estão testando pra valer. Eu acredito bastante que quando fazemos isso pensamos diferente, a segurança como um todo, conexão externa e por aí vai. É por isso que uma das características que eu venho trazendo para os cursos do DevPleno é essa característica de trazer processos que usamos no mercado. O nosso curso de ReactJS traz essa bagagem porque quero trazer esse caminho das pedras, o React sozinho é muito legal, mas faltam coisas para colocar em produção, afinal essa é a última milha da experiência que precisamos. Então eu programo com várias linguagens, mas o principal é definir o critério que você vai definir se você conhece ou não essa linguagem. O meu critério é colocar ele em produção.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/jPaKem2zhxI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "essa",
        "para",
        "linguagens",
        "isso",
        "definir",
        "quando",
        "muito",
        "como",
        "produ",
        "embed"
      ],
      "metadata": {
        "title": "Quantas linguagens devo programar?",
        "date": "2017-06-20",
        "tags": "['Carreira']",
        "thumbnail": "QuantasLinguagensProgramar.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/quantas-linguagens-programar/index.md"
      }
    },
    {
      "id": "486c47e491d1e804",
      "url": "https://devpleno.com/chocolatey",
      "title": "Chocolatey - Gerenciador de Pacotes para Windows - DevPleno (Part 1)",
      "content": "Javascript\n\n## Chocolatey - Gerenciador de Pacotes para Windows\n\nT\nPor Tulio Faria • 29 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nEssa dica é para você utiliza o windows para desenvolvimento: um package manenger chamado chocolatey, semelhante ao yum. Ele facilita bastante quando vamos instalar algumas dependências ou pacotes de software como o NodeJS.\n\n**Como instalar o chocolatey?**\n\nA primeira coisa é entrar em [https://www.chocolatey.org/install](https://www.chocolatey.org/install){:rel=“nofollow”}, rodar o CMD.exe como administrador e copiar esse trecho de código:\n\n@powershell -NoProfile -ExecutionPolicy Bypass -Command \"iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))\" &#x26;&#x26; SET \"PATH=%PATH%;%ALLUSERSPROFILE%\\\\chocolatey\\\\bin\"\nCole no CMD, dê enter e espere a instalação. Pronto! Agora vamos fazer um teste para instalar alguma dependência.\nNote que no site há uma aba Packeges, nele temos todos os pacotes disponíveis para instalação. Vamos tentar instalar o 7zip. Selecione a linha de código referente ao programa e cole no CMD:\n\nchoco install 7zip.install\nAparecerá uma mensagem para aceitar as licenças do pacote e, em seguida, que o pacote foi aprovado. Então perguntará se quer rodar o script, aperte Y para continuar. Pronto, o 7Zip está instalado na sua máquina.\n\nEste é um utilitário muito interessante, pois podemos instalar Java, NodeJS, Python… Tudo a partir desse gerador de dependência. Facilita bastante para nós que sempre temos que ficar instalando algumas coisas no ambiente de desenvolvimento.\n\nConfira os passos no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Essa dica é para você utiliza o windows para desenvolvimento: um package manenger chamado chocolatey, semelhante ao yum. Ele facilita bastante quando vamos...",
      "keywords": [
        "para",
        "https",
        "chocolatey",
        "instalar",
        "install",
        "nodejs",
        "javascript",
        "pacotes",
        "vamos",
        "depend"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/chocolatey"
      }
    },
    {
      "id": "488c9d773239b295",
      "url": "https://devpleno.com/como-organizar-os-estudos-em-tecnologia",
      "title": "Como organizar os estudos em tecnologia - DevPleno (Part 1)",
      "content": "Carreira\n\n## Como organizar os estudos em tecnologia\n\nT\nPor Tulio Faria • 17 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nO inscrito Leonardo Oliveira deixou uma pergunta no canal e achei interessante compartilhar a resposta, afinal pode ser a dúvida de outras pessoas, inclusive a sua. A pergunta é a seguinte:\n\n“Gostei das dicas! Eu curso sistema de informação, já aprendi um bocado de coisa mas tenho um problema em não conseguir definir prioridades. Sempre quero aprender muita coisa e, no fim, acabo ficando perdido. Queria achar uma técnica que me ajude a ser mais produtivo.”\n\nÉ muito legal estar aprendendo bastante na faculdade, pois vai te dar uma bagagem muito boa e permitir que você comece a dar seus primeiros passos. Acontece que atualmente vivemos com um overload de informações, ou seja, temos muita informação, mas sem saber para onde ir, que curso fazer, o que estudar primeiro, etc.\n\nO que eu costumo fazer é priorizar o que tenho mais experiência ou mais conhecimento sobre o assunto. Se tenho 5 tecnologias que quero aprender, tento filtrar e ver em qual delas estou mais perto de ficar bom. Por exemplo, se estou entre Mongo, Express, React e Node, então verei qual eu estou mais próximo de dominar.\n\n**Por que fazer isso?**\n\nPara conseguir ter mais motivação para começar as demais. Supondo que você está bom em React, então você vai treinar mais para chegar em um nível mais alto e o React não será mais um problema. Depois de ter dominado essa primeira tecnologia, então você vai para a segunda que tinha mais experiência, depois a terceira, e por ai vai. Isso é muito bom para cuidar da sua motivação.",
      "description": "O inscrito Leonardo Oliveira deixou uma pergunta no canal e achei interessante compartilhar a resposta, afinal pode ser a dúvida de outras pessoas, inclusi...",
      "keywords": [
        "mais",
        "para",
        "tecnologia",
        "https",
        "muito",
        "essa",
        "fazer",
        "react",
        "isso",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/como-organizar-os-estudos-em-tecnologia"
      }
    },
    {
      "id": "491f022c64f52e83",
      "url": "https://devpleno.com/blog/multer-upload-de-imagens-com-nodejs-e-express/index",
      "title": "Multer upload de imagens com nodejs e express (Part 1)",
      "content": "Hoje vou mostrar uma dica rápida de como podemos fazer upload no NodeJS utilizando o Express. Para isso vamos utilizar o Multer.\n\nA primeira coisa que vamos fazer é o seguinte:\n\n```jsx\nyarn add express ejs multer\n```\n\nAgora, com o Visual Studio Code aberto, vamos criar um arquivo novo index.js e também uma pasta view com um arquivo home.ejs dentro dele, em seguida faremos o seguinte em index.js:\n\n```jsx\nconst express = require('express')\nconst app = express()\napp.set('view-engine', 'ejs')\napp.get('/', (req, res) => res.render('home'))\napp.post('/', (req, res) => {\n  console.log(req.body, req.files)\n  res.send('ok')\n})\napp.listen(3000, () => console.log('running...'))\n```\n\nJá dentro de home.ejs vai ter o seguinte:\n\n```jsx\n<h1>Upload</h1>\n\n<form method=\"post\" ectype=\"multipart/form-data\">\n    <input type=\"file\" name=\"img\" />\n    <button type=\"submit\">Enviar</button>\n</form>\n```\n\nO 'enctype=”multipart/form-data”' significa que vamos mandar os campos em vários formatos.\n\nQuando enviamos uma foto, por exemplo, vai retornar dois undefined, isso significa que não estamos tratando nem o file e nem o body, por isso precisamos do multer.\n\nO multer é um middleware, por esse motivo conseguimos rodar antes da requisição:\n\n```jsx\nconst express = require('express')\nconst app = express()\nconst multer = require('multer')\nconst upload = multer({ dest: 'uploads/' })\napp.set('view-engine', 'ejs')\napp.get('/', (req, res) => res.render('home'))\napp.post('/', upload.single('img'), (req, res) => {\n  console.log(req.body, req.file)\n  res.send('ok')\n})\napp.listen(3000, () => console.log('running...'))\n```\n\nReparem que agora temos no body um arquivo vazio e o outro undefined traz informações sobre a imagem juntamente com onde foi salva a imagem.\n\nNós conseguimos controlar também qual o nome que vamos dar para essa imagem.\n\nPodemos criar um diskStorage, ele é um objeto que tem duas keys, destination que é onde eu vou salvar. Além disso, posso pegar um filename:",
      "keywords": [
        "express",
        "multer",
        "const",
        "file",
        "upload",
        "vamos",
        "require",
        "para",
        "home",
        "console"
      ],
      "metadata": {
        "title": "Multer upload de imagens com nodejs e express",
        "date": "2017-11-29",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Multer.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/multer-upload-de-imagens-com-nodejs-e-express/index.md"
      }
    },
    {
      "id": "4949b7d89aa793b0",
      "url": "https://devpleno.com/blog/multer-upload-de-imagens-com-nodejs-e-express/index",
      "title": "Multer upload de imagens com nodejs e express (Part 2)",
      "content": "```jsx\nconst express = require('express')\nconst app = express()\nconst multer = require('multer')\nconst storage = multer.diskStorage({\n  destination: (req, file, cb) => {\n    cb(null, 'uploads/')\n  },\n  filename: (req, file, cb) => {\n    cb(null, Date.now() + '-' + file.ogirinalname)\n  }\n})\nconst upload = multer({ storage })\n```\n\nNós conseguimos controlar como vamos fazer o upload através do storage. Além disso, podemos criar um memory storage, onde ele vai retornar para nós um buffer dentro do file. É aconselhável utilizar ele exatamente onde você precisa, nunca coloque esse middleware como global.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/FKnDvu_eODY\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "express",
        "multer",
        "const",
        "file",
        "upload",
        "vamos",
        "require",
        "para",
        "home",
        "console"
      ],
      "metadata": {
        "title": "Multer upload de imagens com nodejs e express",
        "date": "2017-11-29",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Multer.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/multer-upload-de-imagens-com-nodejs-e-express/index.md"
      }
    },
    {
      "id": "4956109578cdb8e4",
      "url": "https://devpleno.com/blog/por-que-a-toptal-e-tao-valorizada/index",
      "title": "Por que a Toptal é tão valorizada no mercado?",
      "content": "Você sabe porque a Toptal é tão valorizada no mercado? Neste vídeo, você vai entender melhor sobre o top 3%.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/F521oI7g83k\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS.](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)\n\n[![Curso](CursoReact.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)",
      "keywords": [
        "embed",
        "blog",
        "responsive",
        "https",
        "mais",
        "profissionais",
        "toptal",
        "mercado",
        "sobre",
        "classname"
      ],
      "metadata": {
        "title": "Por que a Toptal é tão valorizada no mercado?",
        "date": "2018-02-09",
        "tags": "['Carreira']",
        "thumbnail": "Top3Tal.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/por-que-a-toptal-e-tao-valorizada/index.md"
      }
    },
    {
      "id": "497b5f2134b700f9",
      "url": "https://devpleno.com/como-criar-e-reutilizando-seus-proprios-modulos",
      "title": "Como criar e reutilizar seus módulos no NodeJS com Git - DevPleno (Part 2)",
      "content": "module.exports = function (str) {\nreturn str + ' - DevPleno!'\n}\nAgora vamos dar um commit e push. Se formos agora em meu repositório, ele já vai estar lá. Nós podemos utilizar a URL do repositório como dependência do projeto. Para isso, vamos voltar um diretório e criar um novo diretório ‘meuprojeto’, acessamos ele e damos um npm init, em seguida um install passando o link do github:\n\nnpm install --save &#x3C;url-copiado-aqui>\n\nEm uma próxima aula vamos criar um repositório e publicar no NPM. Primeiramente queria apenas mostrar que podemos publicar um módulo sem ser pelo npm.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20criar%20e%20reutilizar%20seus%20m%C3%B3dulos%20no%20NodeJS%20com%20Git&url=https%3A%2F%2Fdevpleno.com%2Fcomo-criar-e-reutilizando-seus-proprios-modulos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-criar-e-reutilizando-seus-proprios-modulos)",
      "description": "Hoje quero mostrar um recurso que nós temos na ferramenta NPM e que poucas pessoas sabem que existem. Com ela, podemos criar nossos próprios módulos sem pr...",
      "keywords": [
        "reposit",
        "criar",
        "vamos",
        "como",
        "para",
        "https",
        "seus",
        "podemos",
        "agora",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/como-criar-e-reutilizando-seus-proprios-modulos"
      }
    },
    {
      "id": "497d5da6149affc3",
      "url": "https://devpleno.com/confira-4-dicas-de-ux-para-programadores",
      "title": "Confira 4 dicas de UX para programadores - DevPleno (Part 5)",
      "content": "Essas são as dicas de UX para programadores que você deve seguir para se tornar um profissional mais completo e entregar melhores resultados na sua empresa. E para se manter atualizado sobre experiência do usuário, acompanhe o canal [UXNOW](https://www.youtube.com/channel/UCgfaifzmqadwKyCd0lagylQ?utm_source=blog&#x26;utm_campaign=rc_blogpost) e receba novidades sobre essa técnica tão importante!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Confira%204%20dicas%20de%20UX%20para%20programadores&url=https%3A%2F%2Fdevpleno.com%2Fconfira-4-dicas-de-ux-para-programadores) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fconfira-4-dicas-de-ux-para-programadores)",
      "description": "Você já tentou usar um aplicativo e desistiu porque não conseguia encontrar as informações corretas ou um botão não funcionava por não ser responsivo para ...",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "https",
        "produto",
        "dicas",
        "informa",
        "source"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/confira-4-dicas-de-ux-para-programadores"
      }
    },
    {
      "id": "498e8e65e9b8d142",
      "url": "https://devpleno.com/tecnica-para-alcancar-seus-objetivos",
      "title": "Técnica para eliminar o que não te faz alcançar seus objetivos - DevPleno (Part 1)",
      "content": "Carreira\n\n## Técnica para eliminar o que não te faz alcançar seus objetivos\n\nT\nPor Tulio Faria • 29 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nHoje eu gostaria de compartilhar uma dica bem rápida, basicamente de como você pode, de uma maneira bem fácil, evoluir na sua vida, seja ela financeira, organização ou saúde e alcançar seus objetivos.\n\nEu venho fazendo isso há algum tempo, mas não tinha racionalizado sobre esse processo. É algo muito simples: vamos supor que você trabalha como freelancer e quer melhorar sua parte financeira, então você vai organizar isso como projeto 1, projeto 2, empresa 1, empresa 2, horas gastas e quanto isso vai dar de retorno financeiro. Feito isso, você vai ordenar do que te dá mais lucro para o que dá menos lucro.\n\nO passo primordial é que depois de ordenado, você vai pegar 20% dessas atividades que não te dão o resultado que você quer e vai cortar da lista para abrir espaço na sua agenda para que coisas novas e melhores possam acontecer.\n\nEu venho fazendo isso de forma irracional há mais ou menos 8 meses, o resultado é muito bom. Além disso, podemos usar como exemplo para complementar essa ideia, a dica sobre falar NÃO quando necessário. Por exemplo, um projeto que pague bem, mas não te dá lucro é puro risco, imagine um projeto que te pague R$10mil por mês e você tem que contratar uma pessoa, pagar gastos e no final esse projeto te gera 500 reais de lucro… Ele te dá prejuízo pelo fato do lucro ser pequeno e o risco ser grande.\n\nHoje em dia, temos que escolher como queremos viver, escolher o que queremos fazer, o que dá mais resultado, e pessoas que nos agregam coisas boas. Pessoas tóxicas sugam a nossa energia, comece a listar esse tipo de pessoa e corte da sua vida também.",
      "description": "Hoje eu gostaria de compartilhar uma dica bem rápida, basicamente de como você pode, de uma maneira bem fácil, evoluir na sua vida, seja ela financeira, or...",
      "keywords": [
        "para",
        "isso",
        "como",
        "projeto",
        "https",
        "fazendo",
        "lucro",
        "seus",
        "objetivos",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/tecnica-para-alcancar-seus-objetivos"
      }
    },
    {
      "id": "49c5fa1949a39a7f",
      "url": "https://devpleno.com/claude-code-otimizacao-arquivos",
      "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente - DevPleno (Part 1)",
      "content": "Ferramentas\n\n## Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente\n\nT\nPor Tulio Faria • 5 de abril de 2026\n\n[Ferramentas](/tag/ferramentas)\n\nVocê sabia que pode simplesmente pedir para o Claude Code otimizar os arquivos do seu projeto — e ele faz tudo sozinho? Sem pesquisar ferramenta, sem ler documentação, sem configurar nada. Em um teste real com PNGs, conseguimos **reduzir 80% do tamanho dos arquivos** com um único pedido.\n\nSe você trabalha com projetos que têm imagens, assets ou bundles pesados, essa é uma das formas mais rápidas de ganhar performance sem esforço manual.\n\n## O Claude Code Otimiza Arquivos Por Você\n\nA ideia é simples: você abre o Claude Code no terminal, descreve o que precisa, e ele cuida do resto.\n\nQuando pedimos “otimize os PNGs deste projeto”, o Claude Code:\n\n- **Analisou o projeto** e identificou os arquivos PNG\n\n- **Sugeriu a ferramenta certa** — no caso, o pngquant, uma das melhores opções para compressão de PNG com perda controlada\n\n- **Perguntou se queríamos rodar automaticamente** — sem impor nada\n\n- **Executou a otimização** em todos os arquivos de uma vez\n\nNenhuma etapa exigiu que soubéssemos qual ferramenta usar ou como configurá-la. O Claude Code trouxe o conhecimento técnico e a execução.\n\n## Exemplo Prático — 80% de Redução em PNGs\n\nEm um projeto real, pedimos para o Claude Code otimizar as imagens PNG. Ele escolheu o **pngquant**, uma ferramenta de linha de comando que reduz o tamanho de PNGs usando quantização de cores com canal alfa.\n\n**Os resultados:**\n\nMétrica\n\nAntes\n\nDepois\n\nTamanho total dos PNGs\n\n100%\n\n~20%\n\nRedução média\n\n—\n\n**~80%**\n\nQualidade visual\n\nOriginal\n\nPraticamente idêntica\n\nO Claude Code ainda ofereceu criar uma comparação lado a lado para checar a qualidade de cada imagem. Como estávamos usando **Git e GitHub**, conseguimos revisar o antes e depois diretamente no pull request — cada alteração de imagem ficava visível no diff.",
      "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
      "keywords": [
        "code",
        "claude",
        "otimiza",
        "para",
        "ferramenta",
        "como",
        "arquivos",
        "imagens",
        "projeto",
        "pngs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/claude-code-otimizacao-arquivos"
      }
    },
    {
      "id": "49dde67dd79eaa03",
      "url": "https://devpleno.com/blog/assincrono/index",
      "title": "NodeJS Primeiros Passos Assíncrono",
      "content": "Uma das grandes características do Javascript/NodeJS é seu assincronismo. Isso é muito importante, pois há um grande ganho de performance principalmente quando temos aplicações IO Intensive (praticamente todas atualmente são assim). Veja neste vídeo um exemplo entre um script síncrono e um assíncrono!\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/wKqEwKP-E1E\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "ncrono",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "para"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos Assíncrono",
        "date": "2016-08-05",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Miniatura.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/assincrono/index.md"
      }
    },
    {
      "id": "49fc182f0ca0dec3",
      "url": "https://devpleno.com/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs",
      "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS) - DevPleno (Part 3)",
      "content": "// Decode the String\nvar deBase64 = Base64.decode(emBase64);\nconsole.log(deBase64); // Saída: \"DevPleno\"\n\n## Em NodeJS:\n\nEm NodeJS você pode utilizar Buffers para converter de uma codificação para outra. Por exemplo:\n\nvar string = 'DevPleno'\nvar emBase64 = new Buffer(string).toString('base64')\nconsole.log(emBase64) // Saída: RGV2UGxlbm8=\n\nvar deBase64 = new Buffer(emBase64, 'base64').toString('ascii')\nconsole.log(deBase64) // Saída: DevPleno\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20converter%20uma%20string%20em%20Base64%20em%20JavaScript%20(Navegador%20e%20NodeJS)&url=https%3A%2F%2Fdevpleno.com%2Fcomo-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs)",
      "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
      "keywords": [
        "string",
        "base64",
        "fromcharcode",
        "embase64",
        "keystr",
        "nodejs",
        "para",
        "charcodeat",
        "this",
        "charat"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs"
      }
    },
    {
      "id": "49ff36e49c0b5a1c",
      "url": "https://devpleno.com/algoritmo-campo-minado-minesweeper",
      "title": "Algoritmos: Campo Minado (Minesweeper) - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Algoritmos: Campo Minado (Minesweeper)\n\nT\nPor Tulio Faria • 24 de fevereiro de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nContinuando nossa série sobre algoritmos que são utilizados em questões de competições/maratonas de programação e em entrevistas, neste post, iremos tratar sobre o algoritmo campo minado (minesweeper), retirado do livro Programming Challenges de Miguel Skiena. No vídeo, explico detalhadamente sobre o algoritmo e como resolvê-lo.\n\nconst input = \\`4 4\n\\*...\n....\n.\\*..\n....\n3 5\n\\*\\*...\n.....\n.\\*...\n0 0\\`\n\nlet lines = input.split('\\\\n')\n\nlet current = 0\nlet currentField = 1\n\nfunction minesweeper(field, numCols){\nlet filledField = \\[\\]\nconst len = field.length\nfor(let i = 0; i&#x3C;len; i++){\nlet line = \\[\\]\nfor(let k=0; k&#x3C;numCols; k++){\nif(field\\[i\\].charAt(k)==='\\*'){\nline.push('\\*')\n}else{\nline.push(0)\n}\n}\nfilledField.push(line)\n}\nfor(let i = 0; i&#x3C;len; i++){\nfor(let k=0; k&#x3C;numCols; k++){\nif(filledField\\[i\\]\\[k\\]!=='\\*'){\nif(i>0){\nif(k>0){\nif(filledField\\[i-1\\]\\[k-1\\]==='\\*'){\nfilledField\\[i\\]\\[k\\]++\n}\n}\nif(filledField\\[i-1\\]\\[k\\]==='\\*'){\nfilledField\\[i\\]\\[k\\]++\n}\nif(k+1&#x3C;numCols){\nif(filledField\\[i-1\\]\\[k+1\\]==='\\*'){\nfilledField\\[i\\]\\[k\\]++\n}\n}\n}\n\nif(k>0){\nif(filledField\\[i\\]\\[k-1\\]==='\\*'){\nfilledField\\[i\\]\\[k\\]++\n}\n}\nif(k+1&#x3C;numCols){\nif(filledField\\[i\\]\\[k+1\\]==='\\*'){\nfilledField\\[i\\]\\[k\\]++\n}\n}\n\nif(i+1&#x3C;len){\nif(k>0){\nif(filledField\\[i+1\\]\\[k-1\\]==='\\*'){\nfilledField\\[i\\]\\[k\\]++\n}\n}\nif(filledField\\[i+1\\]\\[k\\]==='\\*'){\nfilledField\\[i\\]\\[k\\]++\n}\nif(k+1&#x3C;numCols){\nif(filledField\\[i+1\\]\\[k+1\\]==='\\*'){\nfilledField\\[i\\]\\[k\\]++\n}\n}\n}\n}\n}\n}\nfor(let i=0; i&#x3C;len; i++){\nconsole.log(filledField\\[i\\].join(''))\n}\nconsole.log('')\n}",
      "description": "Continuando nossa série sobre algoritmos que são utilizados em questões de competições/maratonas de programação e em entrevistas, neste post, iremos tratar...",
      "keywords": [
        "filledfield",
        "numcols",
        "minesweeper",
        "line",
        "algoritmos",
        "https",
        "campo",
        "minado",
        "const",
        "current"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/algoritmo-campo-minado-minesweeper"
      }
    },
    {
      "id": "4a29a1c1bf47be5a",
      "url": "https://devpleno.com/algoritmos-xoe-swap",
      "title": "Algoritmos: XOR Swap - DevPleno (Part 2)",
      "content": "E Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Algoritmos%3A%20XOR%20Swap&url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-xoe-swap) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-xoe-swap)",
      "description": "A dica de hoje é sobre o operador XOR, que eu achei bem interessante. Estava estudando outra coisa e apareceu essa informação, então resolvi checar e realm...",
      "keywords": [
        "https",
        "algoritmos",
        "amos",
        "vari",
        "fazer",
        "mesmo",
        "agora",
        "swap",
        "essa",
        "colocar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/algoritmos-xoe-swap"
      }
    },
    {
      "id": "4a4bff420cd56de2",
      "url": "https://devpleno.com/factory-function",
      "title": "Factory Function em JavaScript - DevPleno (Part 1)",
      "content": "Javascript\n\n## Factory Function em JavaScript\n\nT\nPor Tulio Faria • 20 de julho de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vou dar uma dica de JavaScript, mais especificamente como implementar o Patern Factory. Factory é bastante conhecido em Java, C# e outras linguagens com orientação a objeto. Nessas linguagens, retornamos uma instancia de uma classe, no JavaScript, poderíamos também, mas para ser mais funcional, podemos retornar um objeto de forma literal, ou seja, já em JavaScript. Vamos supor que eu tenha um Person Factory onde é passado o name:\n\nfunction personFactory(name) {\nreturn {\nname: name,\n\ntype: 'person'\n}\n}\n\nconsole.log(personFactory('Tulio'))\n\nconsole.log(personFactory('João'))\nQuando executarmos o código, ele vai criar um objeto novo com o nome Tulio e outro com o nome João. Então uma das funcionalidades que temos para factory é criar objetos novos. Outra coisa bacana, mas bem especifico de linguagens funcionais e até da característica do JavaScript, é que temos uma closure, então acabamos conseguindo fazer um contador, por exemplo, com um count retornando uma arrow function..\n\nfunction personFactory(name) {\nlet count = 0\n\nreturn {\ncount () => count++,\nname: name,\ntype: 'person'\n}\n}\n\nconst tulio = personFactory('Tulio')\n\nconst joao = personFactory('João')\n\nconsole.log(tulio)\n\nconsole.log(joao)\nO primeiro count não é o mesmo que o de dentro, o de dentro é o que retornamos para a factory. Quando eu chamo o Person Factory passando o nome ‘Tulio’, ele vai criar um escopo novo que vai retornar somente esses dados, e junto com ele vai travar o contexto. O count vai ter o valor 0 para o objeto Tulio e depois para o objeto João, então se fizermos o seguinte:\n\nconst tulio = personFactory('Tulio')\n\nconst joao = personFactory('João')\n\nconsole.log(tulio.count())",
      "description": "Aprenda como usar Factory Functions em JavaScript para criar objetos sem classes. Exemplos práticos com closures e estado privado.",
      "keywords": [
        "tulio",
        "count",
        "name",
        "personfactory",
        "factory",
        "objeto",
        "para",
        "console",
        "javascript",
        "function"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/factory-function"
      }
    },
    {
      "id": "4a508112534c11af",
      "url": "https://devpleno.com/reconhecimento-de-nudez-com-js",
      "title": "Reconhecimento de nudez com js - DevPleno (Part 1)",
      "content": "Javascript\n\n## Reconhecimento de nudez com js\n\nT\nPor Tulio Faria • 24 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje quero complementar aquela dica passada sobre [reconhecimento facial](https://www.devpleno.com/reconhecimento-facial-com-js/). Outra atividade que fazemos bastante quando permitimos que um usuário envie uma foto é checar por nudez. Isso também é conhecido como feature detection.\n\nO mais comum é checar o quanto de pele ou roupa tem naquela foto.\n\nPara fazer isso vamos utilizar o nude.js, primeiramente vamos baixar as versões compressas, nude.min.js e worker.nude.min.js.\n\nAgora em um html faremos o seguinte:\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;title>Nude&#x3C;/title>\n&#x3C;/head>\n&#x3C;body>\n&#x3C;img src='imgsemnudez.jpg' />\n&#x3C;script src='nude.min.js'>&#x3C;/script>\n&#x3C;script>\nconst img = document.getElementById('img') nude.load(img) nude.scan(\nresult => {console.log(result)})\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nO próprio worker vai arrumar e carregar. Simplesmente temos que carregar essa foto nele e em seguida dar um scan.\n\nNo exemplo acima, eu coloquei uma imagem sem nudez, ao retornar o result percebam que será um false. Caso mudemos para uma imagem de uma pessoa nua ele vai retornar um true, com isso poderíamos negar essa foto. Por exemplo, quando o usuário tentar utilizar a foto podemos pegar a imagem quando selecionarmos, jogar em um canvas e passar pelo nude.js\n\nToda vez que for colocar uma imagem que você tenha medo, por exemplo, por serem desnecessárias, poderíamos rodar esse script para checar e ver se tem indícios de nudez. Outra coisa comum é checar. Se der falso, tudo bem, se der verdadeiro, você manda para uma checagem manual.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje quero complementar aquela dica passada sobre reconhecimento facial. Outra atividade que fazemos bastante quando permitimos que um usuário envie uma fo...",
      "keywords": [
        "nude",
        "https",
        "nudez",
        "foto",
        "para",
        "script",
        "reconhecimento",
        "checar",
        "imagem",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/reconhecimento-de-nudez-com-js"
      }
    },
    {
      "id": "4abb4a7011b53ad3",
      "url": "https://devpleno.com/blog/como-publicar-seu-site-no-github/index",
      "title": "GH-Pages e como publicar seu site no Github (Part 2)",
      "content": "Estamos instalando esse módulo que consegue fazer isso para nós. Depois de instalado vamos construir o diretório que eu quero colocar os arquivos:\n\n```jsx\n./node_modules/.bin/gh-pages -d build\n```\n\nEle já está se conectando ao github. Agora se irmos em branch, podemos visualizar o gh-pages, ao olharmos o conteúdo, é exatamente a pasta que foi definida: ![Visualizando o resultado](f1a10ca7-82b1-47c9-8409-12031a9eab15.png)\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/qItPnwBbj2s\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "pages",
        "isso",
        "vamos",
        "site",
        "agora",
        "nosso",
        "fazer",
        "colocar",
        "arquivos"
      ],
      "metadata": {
        "title": "GH-Pages e como publicar seu site no Github",
        "date": "2017-10-06",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "GH-PAGES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/como-publicar-seu-site-no-github/index.md"
      }
    },
    {
      "id": "4ac257b90c385545",
      "url": "https://devpleno.com/javascript-streams-p-2-writable-streams",
      "title": "Javascript: Streams (P-2: Writable Streams) - DevPleno",
      "content": "Javascript\n\n## Javascript: Streams (P-2: Writable Streams)\n\nT\nPor Tulio Faria • 24 de abril de 2017\n\n[Javascript](/tag/javascript)\n\nNeste vídeo, um assunto bastante interessante para ser utilizado no dia-a-dia: Streams. A primeira parte fala sobre writable streams ou streams de gravação.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Javascript%3A%20Streams%20(P-2%3A%20Writable%20Streams)&url=https%3A%2F%2Fdevpleno.com%2Fjavascript-streams-p-2-writable-streams) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fjavascript-streams-p-2-writable-streams)",
      "description": "Neste vídeo, um assunto bastante interessante para ser utilizado no diaadia: Streams. A primeira parte fala sobre writable streams ou streams de gravação. ...",
      "keywords": [
        "streams",
        "https",
        "javascript",
        "writable",
        "para",
        "devpleno",
        "facebook",
        "20streams",
        "2fdevpleno",
        "2fjavascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/javascript-streams-p-2-writable-streams"
      }
    },
    {
      "id": "4addc8943d9dadf2",
      "url": "https://devpleno.com/blog/politica-de-privacidade/index",
      "title": "Política de Privacidade (Part 1)",
      "content": "Esta Política de Privacidade foi formulada com o intuito de manter a privacidade e a segurança das informações coletadas de nossos clientes e usuários.\n\nPolítica de privacidade para **DevPleno**.\n\nTodas as suas informações pessoais recolhidas, serão usadas para o ajudar a tornar a sua visita no nosso site o mais produtiva e agradável possível.\n\nA garantia da confidencialidade dos dados pessoais dos utilizadores do nosso site é importante para o **DevPleno**.\n\nTodas as informações pessoais relativas a membros, assinantes, clientes ou visitantes que usem o **DevPleno** serão tratadas em concordância com a Lei da Proteção de Dados Pessoais de 26 de outubro de 1998 (Lei n.º 67/98).\n\nA informação pessoal recolhida pode incluir o seu nome, e-mail, número de telefone e/ou telemóvel, morada, data de nascimento e/ou outros.\n\nO uso do **DevPleno** pressupõe a aceitação deste Acordo de privacidade. A equipe do **DevPleno** reserva-se ao direito de alterar este acordo sem aviso prévio. Deste modo, recomendamos que consulte esta página com regularidade de forma a estar sempre atualizado.\n\nOs anúncios\n\nTal como outros websites, coletamos e utilizamos informação contida nos anúncios. A informação contida nos anúncios, inclui o seu endereço IP (Internet Protocol), o seu ISP (Internet Service Provider, como o Sapo, Clix, ou outro), o browser que utilizou ao visitar o nosso website (como o Internet Explorer ou o Firefox), o tempo da sua visita e que páginas visitou dentro do nosso website.\n\nOs Cookies e Web Beacons\n\nUtilizamos cookies para armazenar informação, tais como as suas preferências pessoas quando visita o nosso website. Isto poderá incluir um simples popup, ou uma ligação em vários serviços que providenciamos, tais como fóruns.",
      "keywords": [
        "como",
        "nosso",
        "informa",
        "para",
        "privacidade",
        "devpleno",
        "website",
        "sites",
        "tica",
        "poder"
      ],
      "metadata": {
        "title": "Política de Privacidade",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/politica-de-privacidade/index.md"
      }
    },
    {
      "id": "4aed5be50d2cf9d4",
      "url": "https://devpleno.com/blog/lista-encadeada-adicionar-no/index",
      "title": "Lista encadeada - Adicionar nó (Part 2)",
      "content": "```jsx\nfunction LinkedList(){\n    let head = null\n    length =  0\n    const add (value) =>{\n        if(!head){\n        }\n    }\n    return{\n        length: () => length\n    }\n}\nconst list = LinkedList()\nconsole.log(list.length())\n```\n\nA lógica é que o head seria a cabeça de nossa lista, por isso utilizamos o if, então se existe um nó no head, eu tenho que andar até o final para poder colocar esse valor, se não existe eu vou poder criar um valor dentro do próprio head.\n\nComo eu tenho que criar um novo nó, vamos criar um const Node que vai retornar um outro nó:\n\n```jsx\nfunction LinkedList(){\n    let head = null\n    length =  0\n    const Node = (value) => {\n        return {\n            value,\n            next: null\n        }\n    }\n    const add (value) =>{\n        if(!head){\n        }\n    }\n    return {\n        length: () => length\n    }\n}\nconst list = LinkedList()\nconsole.log(list.length())\n```\n\nEntão criamos uma outra função, que é uma arrow function, ela vai receber um value e retornar um objeto composto por esse value e um next igual a null. Voltando ao nosso if, se o head não existir ou false, vamos fazer o head ser igual a Node, passar nosso value e podemos retornar o head:\n\n```jsx\nconst add (value) =>{\n    if(!head){\n        head = Node(value)\n        length++\n        return head\n    }\n}\nreturn{\n    length: () => length\n    add: (value) => add(value)\n}\n```\n\nLembrando que o return é a interface pública desse método, então tudo que eu quero mostrar para o exterior é passado ali. Vamos fazer um teste adicionando um valor 1:\n\n```jsx\nconst list = LinkedList()\nconsole.log(list.length())\nlist.add(1)\nconsole.log(list.length())\n```\n\nA lista estava vazia eu adicionei um valor e ele retornou uma lista igual a 1. Para escrever a lista, vamos escrever um método print que vai escrever head:",
      "keywords": [
        "length",
        "head",
        "value",
        "list",
        "node",
        "para",
        "lista",
        "vamos",
        "return",
        "const"
      ],
      "metadata": {
        "title": "Lista encadeada - Adicionar nó",
        "date": "2017-07-12",
        "tags": "['Algoritmos']",
        "thumbnail": "AdicionarNo.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/lista-encadeada-adicionar-no/index.md"
      }
    },
    {
      "id": "4bd2be83659244d3",
      "url": "https://devpleno.com/curso-js",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /curso-js to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "curso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/curso-js"
      }
    },
    {
      "id": "4be21a8c5d4f7774",
      "url": "https://devpleno.com/blog/currying/index",
      "title": "Currying -  Uma técnica interessante usada em programação funcional (Part 1)",
      "content": "O Currying é basicamente uma forma de informar para uma função os parâmetros de forma parcial. Você pode pegar uma função qualquer que recebe, por exemplo, três parâmetros, mandar um por vez e no fim obter o resultado. Assim, você injeta os parâmetros à medida que estiverem disponíveis. Um exemplo usando JavaScript puro e Currying _(lembrando que ele é uma função normal. Nele teremos os valores 1 e 2)._\n\n```jsx\nfunction func(valor1, valor2) {\n  return valor1 + valor2\n}\n\nconsole.log('normal', func1(1, 2))\n```\n\nA única forma que temos de chamar essa função é passando os valores para ele, mas o ideal é passarmos o 1, e o valor 2 só quando ele estiver disponível. Vamos criar agora uma função 2 onde isso seja possível.\n\nEssa função não vai receber os dois valores, apenas um e dar um return em uma função que recebe o segundo valor e essa, por sua vez, retorna valor 1 mais valor 2.\n\n```jsx\nfunction func2(valor1){\n  return function(valor2){\n    return valor1+valor2\n  }\n}\n\nconst func2Valor1 = func2(10)\n\nconsole.log('curried', func2Valor1(20)\n```\n\nSuponhamos que quero fazer um read de um arquivo curried e cada hora que eu ler ele será passado um callback diferente, deixando apenas o primeiro parâmetro fixo. Isso é o Currying.\n\nVamos preenchendo os parâmetros à medida com que vamos executando o código e, quando chegamos no passo final, estará disponível todos os valores que passamos.\n\nQuando fazemos isso, precisamos retornar a função e guardar em uma variável, e uma segunda função espera que você passe o segundo valor. Podemos também executar de uma vez fazendo assim:\n\n```jsx\nconsole.log('curried', func2(10)(20))\n```\n\nNa versão curried, precisamos lembrar que a primeira parte retorna uma função e então conseguimos chamar a segunda função com o segundo parâmetro que queremos. Uma outra coisa que podemos fazer é uma curried function só com arrow function, por exemplo:\n\n```jsx\nconst functArrow = (valor1) => (valor2) => (valor3) => {\n  return valor1 + valor2 + valor3\n}",
      "keywords": [
        "function",
        "valor1",
        "valor2",
        "curried",
        "valores",
        "return",
        "valor",
        "isso",
        "metros",
        "console"
      ],
      "metadata": {
        "title": "Currying -  Uma técnica interessante usada em programação funcional",
        "date": "2017-05-26",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "CURRYING-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/currying/index.md"
      }
    },
    {
      "id": "4c07076501172561",
      "url": "https://devpleno.com/blog/hands-on-pkg/index",
      "title": "PKG - Transforme seu aplicativo Node em executável (Part 1)",
      "content": "Neste post, faremos um hands-on do módulo PKG, que serve basicamente para transformarmos nosso aplicativo node em executável, ou seja, podemos distribuir esta aplicação sem precisar instalar o ambiente do node ou até mesmo mandar o mesmo dentro deste executável.\n\n**Qual a vantagem disso?**\n\nCom isso, podemos, por exemplo, efetuar demonstrações ou distribuir o software em si. Uma das ideias que vou mostrar aqui é distribuir uma aplicação em express, podendo enviar este arquivo a um cliente apenas dentro de um executável.\n\nPrimeiramente vamos instalar este módulo:\n\n```jsx\nnpm install -g pkg\n```\n\nEm seguida vamos adicionar um express:\n\n```jsx\nyarn add express\n```\n\nDepois iremos no Visual Studio Code e criamos um index.js\n\n```jsx\nconst express = require('express')\nconst app =  express()\napp.get('/', (req, res)=>{\n    res.send('Bem vindo ao meu-app')\n)}\napp.listen(3000, ()=>{\n    console.log('Running meu-app')\n}\n```\n\nEle irá 'ouvir' a porta 3000 e, se tudo ocorrer bem, mostrará a mensagem \"running meu-app\"\n\nOriginalmente o package virá assim:\n\n```jsx\n{\n    \"dependencies\": {\n        \"express\": \"^4.15.2\"\n    }\n}\n```\n\nMas iremos fazer algumas modificações. A primeira coisa que devemos fazer é adicionar o nome do nosso aplicativo (\"name\": \"meuapp\"), precisamos também dizer quem é nosso ponto de entrada (\"bin\": \"index.js\")\n\ne a última modificação é opcional, pois nele podemos dizer se queremos mandar algum diretório além do module e qual target, ou seja, quais versões do Node quero 'empacotar' neste aplicativo.\n\n```jsx\n{\n    name\": \"meuapp\",\n    \"dependencies\": {\n        \"express\": \"^4.15.2\"\n    },\n    \"bin\": \"index.js\",\n    \"pkg\":{\n        \"assets\":[\n            \"view/\\*\\*/\\*\"\n        ],\n        \"target\": [\n            \"node7\"\n        ]\n    }\n}\n```\n\nPara executarmos isso, vamos no Node e colocamos:\n\n```jsx\npkg . (pkg ponto)\n```",
      "description": "Use o PKG para compilar seu app Node.js em executável para Windows, Mac e Linux. Tutorial passo a passo com exemplos.",
      "keywords": [
        "para",
        "express",
        "aplicativo",
        "node",
        "podemos",
        "package",
        "isso",
        "este",
        "embed",
        "nosso"
      ],
      "metadata": {
        "title": "PKG - Transforme seu aplicativo Node em executável",
        "description": "Use o PKG para compilar seu app Node.js em executável para Windows, Mac e Linux. Tutorial passo a passo com exemplos.",
        "date": "2017-05-09",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Pkg.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-pkg/index.md"
      }
    },
    {
      "id": "4c1a1dd3ffa39c32",
      "url": "https://devpleno.com/ensinar-algo",
      "title": "Ensinar algo a alguém todos os dias - DevPleno (Part 1)",
      "content": "Carreira\n\n## Ensinar algo a alguém todos os dias\n\nT\nPor Tulio Faria • 1 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nVocê já ensinou algo a alguém hoje? Quando estamos na faculdade, por exemplo, as pessoas tendem a nos perguntar dicas sobre de computação/informática ou pedir ajuda em algumas situações como configurar o roteador, e nós algumas vezes pensamos “Esse cara acha que eu sou o que? Sou analista,mas não mexo com rede”.\n\nA dica de hoje é fazer exatamente o contrário disso. Uma das coisas que venho tentando aplicar na minha vida é que se as pessoas me perguntam sobre isso, eu falo algo como “eu não sou especialista em rede, mas, se você quiser, eu tento te ajudar”.\n\nQuando você está ajudando ou ensinando uma pessoa, mesmo sem querer nada em troca, a gente gera algo bem interessante que é uma sensação de gratidão nessa pessoa com você. Isso gera uma positividade muito boa para a sua carreira e vida.\n\nO detalhe é que a pessoa se sente em débito com você, sempre que ela precisar ou lembrar de alguém, ela vai lembrar de você. É muito legal se você puder ensinar as pessoas ou ajudar pelo menos uma vez por dia, por exemplo “hoje eu consigo ensinar alguém a programar tal coisa”, “eu consigo ensinar a minha mãe a mexer no controle remoto” e por aí vai. Toda vez que você ensina algo, está praticando o que falamos de doar conhecimento aos outros e com certeza você vai receber muito mais que você doa.\n\nA conclusão de hoje é sempre doe mais do que você pretende receber, ajude as pessoas a vencer alguma barreira. Eu tenho certeza que isso vai gerar muitos frutos legais para a sua carreira e pra sua vida pessoal, pois as pessoas não vão lembrar de você apenas com coisas vinculadas a dinheiro e profissional, quando tiramos o olho do dinheiro ele aparece no bolso. Quando você pratica gerar valor às pessoas, o dinheiro vem por consequência.",
      "description": "Você já ensinou algo a alguém hoje? Quando estamos na faculdade, por exemplo, as pessoas tendem a nos perguntar dicas sobre de computação/informática ou pe...",
      "keywords": [
        "algo",
        "pessoas",
        "https",
        "carreira",
        "ensinar",
        "algu",
        "hoje",
        "quando",
        "vida",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/ensinar-algo"
      }
    },
    {
      "id": "4c1e2882d2bdd1ff",
      "url": "https://devpleno.com/blog/hands-on-chalkjs/index",
      "title": "ChalkJS - Deixe as saídas de seu console.log coloridas e com estilo",
      "content": "O ChalkJS é um módulo que basicamente permite uma saída colorida no console. Primeiramente vamos importar o módulo:\n\n```jsx\nyarn add chalk\n```\n\nAgora, no editor, vamos escrever um código. Eu criei um arquivo chalk.js e dentro dele vamos colocar o seguinte:\n\n```jsx\nconst chalk = require('chalk')\n\nconsole.log('DevPleno')\n```\n\nAo mandarmos rodar o código, a resposta sairá normalmente, mas agora vamos utilizar de uma forma diferente:\n\n```jsx\nconsole.log(chalk.red('DevPleno'))\n```\n\nAgora, se rodarmos o código, ele vira da seguinte forma:\n\n![Exemplo 1](ff4477ba-6ca8-499f-a918-a0e050e3c9e0.png)\n\nO interessante é que podemos combinar as seguintes variações:\n\n![Exemplo 2](60e315f1-a434-41cf-86f3-9594b082c0fc.png)\n\nAo aparecer um erro ou um alerta, por exemplo, podemos colocar um 'bgRed':\n\n![Exemplo 3](5a2daeac-aeb9-4fb7-8562-b3ecfbd14709.png)\n\nUma outra coisa interessante é que podemos abrir o estilo, por exemplo:\n\n```jsx\nconsole.log(chalk.styles.red.open + 'Vermelho' + chalk.style.red.close)\n```\n\n![Exemplo 4](6ceda996-cfda-4626-939c-7dba360c3262.png)\n\nEntão podemos estilizar todos os console.log que tiverem entre o open e o close, isso é muito legal, pois podemos, por exemplo, printar uma mensagem em vermelho que é grande, podemos dar só um open e um close. Vale muito a pena dar uma olhada na documentação até para saber quais são os parâmetros que ele aceita.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-ikx1d25Efw\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "chalk",
        "exemplo",
        "podemos",
        "console",
        "vamos",
        "devpleno",
        "embed",
        "agora",
        "digo",
        "open"
      ],
      "metadata": {
        "title": "ChalkJS - Deixe as saídas de seu console.log coloridas e com estilo",
        "date": "2017-09-11",
        "tags": "['Javascript']",
        "thumbnail": "ChalkJS.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-chalkjs/index.md"
      }
    },
    {
      "id": "4c2f0c0cf6db3239",
      "url": "https://devpleno.com/reduce",
      "title": "High-order Function - Reduce - DevPleno (Part 1)",
      "content": "Javascript\n\n## High-order Function - Reduce\n\nT\nPor Tulio Faria • 30 de junho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje vamos continuar falando sobre high order functions, principalmente as que estão disponíveis nos vetores em JavaScript. Vamos falar mais especificamente do Reduce. É muito comum utilizarmos o [Map](https://www.devpleno.com/map/) junto com o Reduce, ele existe em algumas outras formas como no mongoDB que é o map.reduce, uma técnica bastante utilizada para concatenar dados de forma distribuída.\n\nSuponhamos que nossa ideia é ter um carrinho de compras e somar esse carrinho, para isso podemos utilizar o Reduce e passamos uma função que vai ser responsável por reduzir esse vetor em um valor só.\n\nComo fazer isso?\n\nPrimeiramente podemos fazer com uma Arrow Function:\n\nconst carrinho = [{ id: 1, preco: 2, qtd: 2 },\n{ id: 1, preco: 3, qtd: 1 }]\n\ncarrinho.reduce()\n\nconst total = carrinho.reduce((soma, item) => item.preco + soma, 0)\n\nconsole.log(total)\nPerceba que dentro de item e soma retornamos como queremos somar esse valor e ela começa a soma com 0. Podemos fazer de uma forma mais interessante.\n\nVocê se lembra que o MAP transforma de um valor para outro? Então poderíamos fazer o seguinte:\n\nconst carrinho = [{ id: 1, preco: 2, qtd: 2 },\n{ id: 1, preco: 3, qtd: 1 }]\n\ncarrinho.reduce()\nconst total = carrinho\n.map((item) => item.preço * item.qtd)\n.reduce((soma, subtotal) => subtotal + soma, 0)\nconsole.log(total)\nCom isso, o Map vai transformar o item em um subtotal e meu Reduce vai somar esses valores transformados. Perceba que são funções bem simples, então é bem tranquilo de testarmos essas funções.\n\nPoderíamos, por exemplo, colocar o item em uma const e passar apenas o subtotal:",
      "description": "Hoje vamos continuar falando sobre high order functions, principalmente as que estão disponíveis nos vetores em JavaScript. Vamos falar mais especificament...",
      "keywords": [
        "reduce",
        "item",
        "carrinho",
        "soma",
        "subtotal",
        "https",
        "const",
        "total",
        "fazer",
        "preco"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/reduce"
      }
    },
    {
      "id": "4c53c02249e87a79",
      "url": "https://devpleno.com/blog/lista-encadeada-adicionar-no/index",
      "title": "Lista encadeada - Adicionar nó (Part 4)",
      "content": "A última observação importante é que como estamos falando bastante de entrevistas, é importante sabermos qual a [complexidade do algoritmo](https://www.devpleno.com/complexidade-de-um-algoritmo/), para isso temos que avaliar como ele cresce. Se pensarmos em proporção, ela crescer mais ou menos em **0(length)**, quando é do tamanho, geralmente o pessoal chama de **0(n)** porque n seria o número máximo de itens que você tem que colocar. Vamos imaginar que temos 2 whiles ao invés de apenas um, teoricamente um while fora do outro seria 0(2n), mas o 2 perto do N não é nada, então continua 0(n). Já se o while fosse dentro, caminhando até o final do nó ai sim teriamos um 0(n²), como não temos, ele está crescendo baseado no tamanho da lista. A complexidade de espaço também será 0(n) porque eu vou ocupar espaços de memória baseado no tamanho de N.\n\nVamos continuar esse algoritmo comparando e comentando a complexidade de cada uma delas, lembrando que estou resolvendo em JavaScript para mostrar como podemos fazer isso em uma entrevista, afinal meu propósito é ajudar você a se recolocar no mercado ou achar sua vaga sonhada. Em qualquer cenário isso é muito importante para treinar algoritmo.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ANrh76RUvHs\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "length",
        "head",
        "value",
        "list",
        "node",
        "para",
        "lista",
        "vamos",
        "return",
        "const"
      ],
      "metadata": {
        "title": "Lista encadeada - Adicionar nó",
        "date": "2017-07-12",
        "tags": "['Algoritmos']",
        "thumbnail": "AdicionarNo.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/lista-encadeada-adicionar-no/index.md"
      }
    },
    {
      "id": "4c64fac6d43297e5",
      "url": "https://devpleno.com/async",
      "title": "Async - Como Controlar Operações Assíncronas - DevPleno (Part 1)",
      "content": "Javascript\n\n## Async - Como Controlar Operações Assíncronas\n\nT\nPor Tulio Faria • 30 de julho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nO Async é um módulo que nos ajuda a controlar processamento assíncrono. Primeiramente temos que instalar o async:\n\nnpm install async\nOutro detalhe é que eu tenho 2 arquivos de texto, um escrito “arquivo 1” e o outro “arquivo 2”, vamos usá-los posteriormente.\n\nSe você lembra bem, no exemplo de promises, nós escrevemos 2 arquivos e concatenou o conteúdo desses arquivos. Aqui vou fazer um exemplo um pouquinho diferente. Vou criar um vetor com o nome dos arquivos dentro:\n\nvar fs = require('fs')\n\nvar async = require('async')\n\nvar files = ['arquivo1.txt', 'arquivo2.txt']\nVamos supor que eu tenha que ler 100 arquivos de log e processá-los, então são 100 arquivos, um atrás do outro, de operações assíncronas, esse é o grande detalhe do que vamos fazer agora. Se fosse uma linguagem síncrona, seria muito fácil.\n\nasync.each(files, function (file, callback) {\nfs.readFile(file, 'utf-8', function (err, contents) {\nconsole.log(contents)\n\ncallback(null)\n})\n})\nPara cada arquivo, ele irá executar uma vez o código acima, quando ele retornar o conteúdo vou escrever na tela e o async espera que você o avise quando terminou esse processamento, então temos que chamar esse callback. Nele passamos null, mas também podemos passar um error, que é o padrão de callback no Node, se esse Error for Null significa que não deu erro nenhum.\n\nAo rodar o arquivo, vai ser retornado arquivo1 e arquivo2. Pode acontecer do arquivo 1 terminar mais rápido que o arquivo 2 porque não estamos impondo nenhuma ordem. Para o async não importa, ele vai executar todos, mas vai respeitar a ordem das operações de IO que vão sendo resolvidas.\n\nUm detalhe é que ele abre isso de forma paralela, então o ‘each’ é para otimizar pode abrir ao mesmo tempo. Para forçar a abrir um de cada vez, faremos o seguinte:",
      "description": "O Async é um módulo que nos ajuda a controlar processamento assíncrono. Primeiramente temos que instalar o async: Outro detalhe é que eu tenho 2 arquivos d...",
      "keywords": [
        "async",
        "arquivos",
        "arquivo",
        "esse",
        "callback",
        "para",
        "https",
        "outro",
        "processamento",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/async"
      }
    },
    {
      "id": "4c9694e10866edb2",
      "url": "https://devpleno.com/categoria/node-js",
      "title": "Redirecting to: /tag/nodejs",
      "content": "Redirecting to: /tag/nodejs [Redirecting from /categoria/node-js to /tag/nodejs](/tag/nodejs)",
      "keywords": [
        "nodejs",
        "redirecting",
        "from",
        "categoria",
        "node"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/categoria/node-js"
      }
    },
    {
      "id": "4ca06bea05cb8fdd",
      "url": "https://devpleno.com/blog/arrow-functions/index",
      "title": "Arrow Functions - Construindo funções anônimas de forma mais simplificada (Part 2)",
      "content": "Se eu quisesse chamar o loadData dentro do render, eu posso fazer um this dentro sem problema algum. Reparem que estou utilizando uma arrow function e existe um this dentro dela, mas esse this referencia o component de fora. Isso é muito útil porque reduz muito. Anteriormente tínhamos que travar uma variável no contexto de cima para depois poder referenciar dentro da função anônima:\n\n```jsx\nrender(){\n\n  var that = this\n\n  return(\n    <button onClick={() => that.loadData()}\n  )\n}\n```\n\nJá com a Arrow Function não é mais necessário porque o contexto já é o contexto do pai e isso facilitou bastante na construção de códigos mais legíveis. Lembrando que nós temos as Expression Body, que são funções com apenas uma expressão no corpo e a Statement Body, em que existem instruções dentro do corpo. Confira a explicação em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/AgOwGKB8D2M\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "function",
        "arrow",
        "dentro",
        "this",
        "contexto",
        "valor",
        "isso",
        "mais",
        "const",
        "fazer"
      ],
      "metadata": {
        "title": "Arrow Functions - Construindo funções anônimas de forma mais simplificada",
        "date": "2017-08-02",
        "tags": "['Fundamentos', 'Javascript']",
        "thumbnail": "ARROW-FUNCTIONS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/arrow-functions/index.md"
      }
    },
    {
      "id": "4cfcebca866eff3c",
      "url": "https://devpleno.com/como-receber-de-empresas-estrangeiras",
      "title": "Impostos e como receber de empresas estrangeiras - DevPleno (Part 1)",
      "content": "Carreira\n\n## Impostos e como receber de empresas estrangeiras\n\nT\nPor Tulio Faria • 18 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nVocê sabe como receber de empresas estrangeiras (Toptal, Crossover, Scalable Path e outras)?\n\nCada empresa dessa tem a possibilidade de enviar o dinheiro de uma forma específica, como o Paypal, Payoneer, no caso da Toptal eles têm uma parceria com a Hyper Wallet, ou seja, cada um tem um gateway.\n\nPara o governo brasileiro, independente de como foi recebido, é preciso declarar esse dinheiro. Quando receber, por exemplo, $1000,00 pela Hyper Wallet, vai ser descontado uma taxa, algo em torno de $13,00, ou seja, vai receber $987,00. Depois o valor é multiplicado pelo câmbio atual, vamos supor que esteja R$3,00, o resultado final será em torno de R$2961,00.\n\n**\nAntes de continuar, preciso te contar uma novidade. Nós conseguimos te ajudar a legalizar o seu dinheiro aqui no Brasil - sim, eu criei um serviço de contabilidade e assessoria jurídica/tributária com esse objetivo. A [Conta49 é uma contabilidade e assessoria jurídica](https://www.conta49.com.br) que entende as especificidades vividas pelos programadores, principalmente os que atuam no exterior. Inclusive temos serviços específicos com esse objetivo (caso você precise legalizar somente uma vez o recebimento ou ainda se possui dúvidas sobre este processo). Acesse o [site:](https://www.conta49.com.br)[www.conta49.com.br](http://www.conta49.com.br) e conheça todos os serviços.\n\n[](https://www.conta49.com.br)\n\n.",
      "description": "Você sabe como receber de empresas estrangeiras (Toptal, Crossover, Scalable Path e outras)? Cada empresa dessa tem a possibilidade de enviar o dinheiro de...",
      "keywords": [
        "para",
        "esse",
        "como",
        "receber",
        "empresa",
        "dinheiro",
        "https",
        "pessoa",
        "isso",
        "pagar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/como-receber-de-empresas-estrangeiras"
      }
    },
    {
      "id": "4d1d4b98b529f8fa",
      "url": "https://devpleno.com/servidores-web-entendo-back-end",
      "title": "Vídeo sobre Servidores Web - o back-end de uma aplicação web - DevPleno",
      "content": "Javascript\n\n## Vídeo sobre Servidores Web - o back-end de uma aplicação web\n\nT\nPor Tulio Faria • 24 de julho de 2016\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nNeste vídeo, vamos “entrar” um pouco mais a fundo no back-end, entendendo servidores web. O que são e como eles recebem as requisições.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=V%C3%ADdeo%20sobre%20Servidores%20Web%20-%20o%20back-end%20de%20uma%20aplica%C3%A7%C3%A3o%20web&url=https%3A%2F%2Fdevpleno.com%2Fservidores-web-entendo-back-end) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidores-web-entendo-back-end)",
      "description": "Neste vídeo, vamos &#34;entrar&#34; um pouco mais a fundo no backend, entendendo servidores web. O que são e como eles recebem as requisições. <div className=&#34;embe...",
      "keywords": [
        "back",
        "https",
        "javascript",
        "servidores",
        "fundamentos",
        "20web",
        "2fdevpleno",
        "2fservidores",
        "entendo",
        "2016"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/servidores-web-entendo-back-end"
      }
    },
    {
      "id": "4d5b0c12034b99ff",
      "url": "https://devpleno.com/10-dicas-de-produtividade-para-programadores",
      "title": "10 dicas de produtividade para programadores - DevPleno (Part 5)",
      "content": "Além disso, pausas para usar as redes sociais no *smartphone* tornam as pessoas mais dispostas para trabalhar, segundo um [estudo](https://www.k-state.edu/media/newsreleases/jul14/smartphone7714.html?utm_source=blog&#x26;utm_campaign=rc_blogpost) da Universidade do Kansas, nos EUA.\n\n## 7. Pense rápido\n\nA capacidade de tomar decisões rápidas é útil para qualquer profissional. Algumas estratégias podem ajudar nisso.\n\n- planejamento: vai nortear as ações e fundamentar a tomada de decisões. Se for bem feito, aumenta as chances de ajudar no acerto das escolhas;\n\n- criatividade: a coragem para inovar pode ser a chave do sucesso em um processo de desenvolvimento de *so",
      "description": "Ser um profissional produtivo é uma exigência do mercado de trabalho no cenário altamente competitivo em que vivemos. Os resultados são requisitados cada v...",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "produtividade",
        "para",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/10-dicas-de-produtividade-para-programadores"
      }
    },
    {
      "id": "4d6e8f49c7439f14",
      "url": "https://devpleno.com/convertendo-timestamps",
      "title": "Módulo MS - Convertendo timestamps - DevPleno (Part 1)",
      "content": "Javascript\n\n## Módulo MS - Convertendo timestamps\n\nT\nPor Tulio Faria • 5 de setembro de 2017\n\n[Javascript](/tag/javascript)\n\nO hands-on de hoje é bem curto, apenas para mostrar um módulo que achei bastante interessante e funciona tanto para Node quanto para Browser. Esse módulo se chama MS e faz a conversão de qualquer formato para milissegundo e vice-versa. Primeiramente precisamos adicionar as dependências:\n\nyarn add ms\nEm um arquivo qualquer, no meu caso criei um chamado timestamp, vamos fazer alguns testes:\n\nconst ms = require('ms')\nA forma como ele funciona é bastante interessante porque, por exemplo, se passarmos um valor inteiro para ele, ele já converte para uma string:\n\nconsole.log(ms(100000))\nVai ser retornado o valor de 2m. Lembrando que ao contrário ele também faz:\n\nconsole.log(ms('1d'))\nO resultado será 86400000. Além disso, ainda podemos fazer algo bem interessante:\n\nconsole.log(ms(100000){\nlong: true\n})\nAssim, ao invés de falar a inicial, ele trará o nome completo ‘minutes’. Isso é muito útil principalmente quando queremos saber delta de tempo, quando temos dois timestamps com milissegundos e queremos achar a diferença entre eles.\n\nUma coisa bastante comum é utilizar o timestamp desde a era linux, tudo que fazemos é em relação a essa data. Só por curiosidade, eu achei o MS quando estava procurando coisas sobre JWT e uma das formas de passar a validação do token é através de uma string curta.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "O handson de hoje é bem curto, apenas para mostrar um módulo que achei bastante interessante e funciona tanto para Node quanto para Browser. Esse módulo se...",
      "keywords": [
        "para",
        "https",
        "timestamps",
        "javascript",
        "dulo",
        "bastante",
        "interessante",
        "console",
        "quando",
        "100000"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/convertendo-timestamps"
      }
    },
    {
      "id": "4dbd36bcb887c73b",
      "url": "https://devpleno.com/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira - DevPleno (Part 1)",
      "content": "Carreira\n\n## Freelancer no exterior: 7 dicas para ter sucesso na carreira\n\nT\nPor Tulio Faria • 3 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nO trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho.\n\nNo entanto, a maioria das pessoas têm pouco conhecimento sobre a preparação que envolve essa empreitada fora do Brasil.\n\nQuer saber tudo sobre trabalho de freelancer no exterior? Acompanhe, nesse post, 7 dicas fundamentais que preparamos para você!\n\n## 1. Conquiste uma demanda constante de trabalho\n\nUma questão central no dia a dia de qualquer freelancer é fidelizar certo número de clientes para, assim, manter uma demanda mais ou menos estável de trabalho. Ter sucesso em relação a isso significa conseguir estabelecer uma previsão de ganho mensal, algo muito importante para quem não tem um salário fixo.\n\nQuando se trata de freelancer no exterior, esse ponto ganha uma centralidade ainda maior. Isso porque, morar fora demanda um esforço significativo de [planejamento financeiro](https://www.devpleno.com/carreira-preciso-de-investimento-para-minha-ideia?utm_source=blog&#x26;utm_campaign=rc_blogpost). Atrasar as contas do mês, por exemplo, a depender do país, pode ser um desconforto muito maior do que no Brasil.\n\nAlém disso, uma vida financeira estável fora do país contribui para uma adaptação sem contratempos. Isso é, você poderá desfrutar de uma vida mais confortável e de outras possibilidades que o lugar ofereça, como opções de lazer e viagens.\n\n## 2. Incorpore hábitos de freelancers de excelência\n\nExistem muitos hábitos virtuosos que freelancers de excelência devem incorporar a seu dia a dia. Esses hábitos dizem respeito a uma rotina de trabalho cujo foco é propiciar maior produtividade e otimizar seus ganhos.\n\nQuanto a isso, podemos falar de uma “cartilha” de sucesso para pessoas que trabalham em casa:",
      "description": "O trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho. No entanto, a maiori...",
      "keywords": [
        "para",
        "freelancer",
        "trabalho",
        "exterior",
        "https",
        "carreira",
        "pode",
        "mais",
        "isso",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira"
      }
    },
    {
      "id": "4dcf2eed6b666143",
      "url": "https://devpleno.com/socket-io-parte2",
      "title": "Hands-on - Socket.io Parte 2 - DevPleno (Part 2)",
      "content": "Quando o cliente se conectar, podemos mandar uma mensagem para o servidor, por exemplo, que o ID especifico está conectado. Adicionando no lado do cliente um socket emit dentro da function e mandamos escrever a msg gerado do lado servidor.\n\n&#x3C;script>\nconst socket = io()\nsocket.on('connect', function(){\n$(\"msgs\").append('connected with id: '+socket.id+'&#x3C;br>'\nsocket.emit('msg', 'I am connected '+socket.id);\n)}\nsocket.on('msg', function(msg){\n$(\"#msgs\")append(msg+' &#x3C;br>')\n}\n&#x3C;/script>\nE do lado servidor adicionando um gerenciador de evento para que, quando ele receber uma mensagem,possa só escrever por enquanto (apenas modificamos esta linha de código).\n\nio.on('connection', (socket)=>{\nconsole.log('New connection', socket.id)\n}\nsocket.on('msg', (msg)=>{\nconsole.log(msg)\nsocket.broadcast.emit('msg', socket.id+' connected');\n})\nSe reiniciarmos o servidor e gerarmos uma nova conexão do lado cliente, irá aparecer a mensagem de “I am connected + ID” do lado servidor, já que o Socket representa o cliente que está conectado. Depois com o broadcast estamos avisando todos que o ID específico foi conectado.\n\n**Não aconteceu nada. Está dando erro?**\n\nNo lado cliente, abra uma nova aba, copie o link da sessão e rode, então verá que ele irá se conectar, mostrar um novo id, e na sessão anterior vai ser emitida uma mensagem que aquele ID foi conectado, como queríamos, afinal estávamos enviando para todos quando algum novo ID se conectasse.\n\n**Por que isso aconteceu?**\n\nIsso acontece porque o broadcast não manda a mensagem para o próprio Socket. Isso é feito para não permitir que não receba mensagens duplicadas.\n\nPerceba que com isso já é possível criar um chat. Precisamos apenas adicionar ao lado cliente um input type text e criar um function keyDown, em seguida gerar um if dizendo que se o keyCode for igual ao número que representa o enter (no caso 13), vamos disparar a mensagem com o valor dentro do text.",
      "description": "Continuando nossa série sobre Socket.io, vamos aprofundar um pouco mais no assunto. Lembrando nosso código do lado server: Simplesmente estávamos tratando ...",
      "keywords": [
        "socket",
        "script",
        "cliente",
        "lado",
        "function",
        "msgs",
        "para",
        "https",
        "connected",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/socket-io-parte2"
      }
    },
    {
      "id": "4e7f7ce9096af5b8",
      "url": "https://devpleno.com/dica-e-algoritmo-xor-e-odd-occurences-array",
      "title": "Dica e Algoritmo: XOR e Odd Occurences in Array - DevPleno",
      "content": "Algoritmos\n\n## Dica e Algoritmo: XOR e Odd Occurences in Array\n\nT\nPor Tulio Faria • 27 de março de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nNeste vídeo você vai entender como melhorar a performance do algoritmo Odd Occurrences in Array com o operador XOR. Confira! Deixe suas dúvidas e sugestões nos comentários.\n\nNão se esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno/), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder as novidades. Abraços!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%20e%20Algoritmo%3A%20XOR%20e%20Odd%20Occurences%20in%20Array&url=https%3A%2F%2Fdevpleno.com%2Fdica-e-algoritmo-xor-e-odd-occurences-array) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-e-algoritmo-xor-e-odd-occurences-array)",
      "description": "Neste vídeo você vai entender como melhorar a performance do algoritmo Odd Occurrences in Array com o operador XOR. Confira! Deixe suas dúvidas e sugestões...",
      "keywords": [
        "https",
        "algoritmo",
        "array",
        "algoritmos",
        "occurences",
        "dica",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fdica"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-e-algoritmo-xor-e-odd-occurences-array"
      }
    },
    {
      "id": "4e8f03afd3d93fd4",
      "url": "https://devpleno.com/blog/dados-ficticios-para-testes/index",
      "title": "Faker - Como gerar grandes massas de dados fictícios para testes (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/bvfHQHgVzG8\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "faker",
        "dados",
        "para",
        "gerar",
        "nome",
        "como",
        "exemplo",
        "console",
        "name",
        "embed"
      ],
      "metadata": {
        "title": "Faker - Como gerar grandes massas de dados fictícios para testes",
        "date": "2017-05-16",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "FAKER-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/dados-ficticios-para-testes/index.md"
      }
    },
    {
      "id": "4e9575809a423e3f",
      "url": "https://devpleno.com/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira",
      "title": "8 dicas de organização para freelancers se darem bem na carreira - DevPleno (Part 4)",
      "content": "Organize bem a sua agenda e estabeleça uma ordem de prioridade nos seus trabalhos. Comece por aqueles que têm a data de entrega mais próxima — afinal, você não quer correr o risco de perder o prazo, certo? Simples assim: verifique a urgência de cada projeto e produza primeiro aqueles que são emergenciais.\n\n## 7. Seja focado\n\nWhatsApp, redes sociais, músicas e televisão: são várias as fontes de distrações que fazem a sua produtividade reduzir substancialmente.\n\nUma paradinha aqui para olhar o Facebook, outra para assistir aquele seriado bacana e, quando se der conta, o dia já está quase acabando e você não fez o que pretendia (ou deveria) fazer.\n\nEsse é um cenário familiar? Então, provavelmente, você não está destinando a devida atenção para as suas obrigações. Para focar no seu trabalho, elimine todos os focos de distração. Desligue o celular ou faça o que for preciso para ficar concentrado.\n\nNão existe uma regra aqui. O importante é saber como se manter compenetrado com a atividade que está sendo executada. Afinal, somente você sabe o que desvia sua atenção.\n\n## 8. Crie rituais\n\nRealizar sistematicamente determinadas atividades pode ajudá-lo a se habituar com a vida de freelancer. O que você fazia antes de ir para a empresa em que trabalhava? Tomava café, lia algumas notícias e via um pouco de TV? Saiba, então, que você pode continuar tendo tais hábitos. Na verdade, você não só pode como deve, pois, assim, quando finalizá-los, a sua mente vai entender que é horário de pegar no batente.\n\nComo em todo trabalho, existe alguns desafios que precisam ser superados no mundo dos freelancers. Mas pode apostar: não há nada mais gratificante — afinal, poder controlar seus horários e trabalhar com aquilo que se ama já é motivo o suficiente para curtir essa opção.\n\nE você, já coloca essas dicas de organização em prática? Tem mais alguma sugestão que ajuda a lidar com a rotina de freelancer? Deixe um comentário!",
      "description": "Nada melhor do que ter uma rotina flexível, com a possibilidade de trabalhar nos seus próprios horários, não é mesmo? Não à toa, ser freelancer é uma alter...",
      "keywords": [
        "para",
        "mais",
        "como",
        "https",
        "carreira",
        "freelancer",
        "pode",
        "freelancers",
        "dicas",
        "afinal"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira"
      }
    },
    {
      "id": "4ea6f4556a955b9e",
      "url": "https://devpleno.com/como-organizar-os-estudos-em-tecnologia",
      "title": "Como organizar os estudos em tecnologia - DevPleno (Part 2)",
      "content": "Uma outra forma de priorizar o que estudar, essa um pouco mais arriscada, é entregar um projeto com essa tecnologia. Eu fiz isso ano passado, pois queria ficar muito bom em React. Defini que iria fazer o projeto com ele e entreguei, mas isso é perigoso, apesar de bom, porque você definirá um projeto que tem uma contrapartida muito grande, afinal você vai ter um deadline e precisa entregar de alguma forma, o que vai te motivar ainda mais a estudar essa tecnologia.\n\nEssas são algumas dicas para você lidar com essa grande quantidade de tecnologia e não ficar perdido nas prioridades de linguagens ou tecnologias que quer aprender. Eu me organizo assim e tem dado certo, portanto acredito que seja efetivo.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20organizar%20os%20estudos%20em%20tecnologia&url=https%3A%2F%2Fdevpleno.com%2Fcomo-organizar-os-estudos-em-tecnologia) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-organizar-os-estudos-em-tecnologia)",
      "description": "O inscrito Leonardo Oliveira deixou uma pergunta no canal e achei interessante compartilhar a resposta, afinal pode ser a dúvida de outras pessoas, inclusi...",
      "keywords": [
        "mais",
        "para",
        "tecnologia",
        "https",
        "muito",
        "essa",
        "fazer",
        "react",
        "isso",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/como-organizar-os-estudos-em-tecnologia"
      }
    },
    {
      "id": "4f01b36b3243964b",
      "url": "https://devpleno.com/hands-on-pkg",
      "title": "PKG - Transforme seu aplicativo Node em executável - DevPleno (Part 1)",
      "content": "Javascript\n\n## PKG - Transforme seu aplicativo Node em executável\n\nT\nPor Tulio Faria • 9 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste post, faremos um hands-on do módulo PKG, que serve basicamente para transformarmos nosso aplicativo node em executável, ou seja, podemos distribuir esta aplicação sem precisar instalar o ambiente do node ou até mesmo mandar o mesmo dentro deste executável.\n\n**Qual a vantagem disso?**\n\nCom isso, podemos, por exemplo, efetuar demonstrações ou distribuir o software em si. Uma das ideias que vou mostrar aqui é distribuir uma aplicação em express, podendo enviar este arquivo a um cliente apenas dentro de um executável.\n\nPrimeiramente vamos instalar este módulo:\n\nnpm install -g pkg\nEm seguida vamos adicionar um express:\n\nyarn add express\nDepois iremos no Visual Studio Code e criamos um index.js\n\nconst express = require('express')\nconst app = express()\napp.get('/', (req, res)=>{\nres.send('Bem vindo ao meu-app')\n)}\napp.listen(3000, ()=>{\nconsole.log('Running meu-app')\n}\nEle irá ‘ouvir’ a porta 3000 e, se tudo ocorrer bem, mostrará a mensagem “running meu-app”\n\nOriginalmente o package virá assim:\n\n{\n\"dependencies\": {\n\"express\": \"^4.15.2\"\n}\n}\nMas iremos fazer algumas modificações. A primeira coisa que devemos fazer é adicionar o nome do nosso aplicativo (“name”: “meuapp”), precisamos também dizer quem é nosso ponto de entrada (“bin”: “index.js”)\n\ne a última modificação é opcional, pois nele podemos dizer se queremos mandar algum diretório além do module e qual target, ou seja, quais versões do Node quero ‘empacotar’ neste aplicativo.\n\n{\nname\": \"meuapp\",\n\"dependencies\": {\n\"express\": \"^4.15.2\"\n},\n\"bin\": \"index.js\",\n\"pkg\":{\n\"assets\":[\"view/\\*\\*/\\*\"],\n\"target\": [\"node7\"]\n}\n}\nPara executarmos isso, vamos no Node e colocamos:",
      "description": "Use o PKG para compilar seu app Node.js em executável para Windows, Mac e Linux. Tutorial passo a passo com exemplos.",
      "keywords": [
        "para",
        "express",
        "aplicativo",
        "node",
        "https",
        "podemos",
        "este",
        "package",
        "execut",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-on-pkg"
      }
    },
    {
      "id": "4f1a29451d74da19",
      "url": "https://devpleno.com/claude-code-otimizacao-arquivos",
      "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente - DevPleno (Part 3)",
      "content": "**Otimizar uma vez e esquecer.** Novos arquivos entram no projeto o tempo todo. Considere criar um script ou hook de CI que rode a otimização automaticamente em cada PR.\n\n## Quer dominar o Claude Code e IA na prática?\n\nSe você quer ir além e aprender a usar o Claude Code como ferramenta principal no seu fluxo de desenvolvimento, temos um curso bônus sobre IA e Claude Code dentro do **The Best Stack**. Lá você aprende na prática como integrar IA no seu dia a dia como dev.\n\n**[Acesse o The Best Stack e comece agora](https://do.devpleno.com/the-best-stack)**\n\n## FAQ\n\n### O Claude Code instala ferramentas sozinho?\n\nSim. Quando o Claude Code sugere uma ferramenta como o pngquant, ele pede sua aprovação e executa a instalação via gerenciador de pacotes (brew, npm, apt, etc.). Você mantém o controle — nada roda sem seu OK.\n\n### Funciona com qualquer tipo de arquivo?\n\nO Claude Code trabalha com qualquer arquivo que tenha uma ferramenta de otimização disponível via linha de comando. Imagens, vídeos, fontes, código minificado, containers Docker — se existe uma ferramenta para isso, ele consegue sugerir e rodar.\n\n### Preciso saber usar linha de comando?\n\nNão. Esse é justamente o ponto. Você descreve o que precisa em linguagem natural — “otimize os PNGs”, “reduza o tamanho do bundle”, “comprima as imagens” — e o Claude Code traduz isso em comandos técnicos. Ele explica o que vai fazer antes de executar.\n\n### É seguro rodar otimizações automáticas no meu projeto?\n\nSim, desde que você use Git. Crie um branch, rode a otimização, revise as mudanças no diff e só faça merge quando estiver satisfeito. É o mesmo fluxo de qualquer mudança de código.\n\n### Quanto de redução posso esperar?\n\nDepende do tipo de arquivo e do nível de otimização anterior. PNGs não otimizados costumam ter reduções de 50-80%. SVGs com código desnecessário podem cair 30-60%. O Claude Code mostra os resultados para você avaliar.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
      "keywords": [
        "code",
        "claude",
        "otimiza",
        "para",
        "ferramenta",
        "como",
        "arquivos",
        "imagens",
        "projeto",
        "pngs"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/claude-code-otimizacao-arquivos"
      }
    },
    {
      "id": "4f52da2f9b328750",
      "url": "https://devpleno.com/blog/nodejs-primeiros-passos-async-waterfall/index",
      "title": "NodeJS Primeiros Passos: Async - Waterfall",
      "content": "Neste vídeo, vou mostrar uma outra forma de organizar códigos assíncrono, neste caso, executando em cascata (um após o outro).\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/p_CxjcgovRc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "neste",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "mostrar"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Async - Waterfall",
        "date": "2016-08-15",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "AsyncWaterfall.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/nodejs-primeiros-passos-async-waterfall/index.md"
      }
    },
    {
      "id": "4f66938223073e91",
      "url": "https://devpleno.com/closure-poo-para-js",
      "title": "Closure Série - POO para JS - DevPleno (Part 2)",
      "content": "contador(5)\nTemos um contador que está usando todas as variáveis do lado de fora e temos um contador separado. Perceba que o setInterval está usando as variáveis de fora, isso cria um enclausuramento dessas variáveis. Outra coisa importante: esse código é assíncrono, então sempre que chamamos o setInterval, colocamos isso no event loop.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Closure%20S%C3%A9rie%20-%20POO%20para%20JS&url=https%3A%2F%2Fdevpleno.com%2Fclosure-poo-para-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fclosure-poo-para-js)",
      "description": "Hoje vou continuar a falar sobre como passar de Programação Orientadaobjetos para JavaScript cada vez mais funcional. Uma outra coisa bastante diferente pa...",
      "keywords": [
        "javascript",
        "para",
        "https",
        "closure",
        "function",
        "func1",
        "const",
        "name",
        "func1b",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/closure-poo-para-js"
      }
    },
    {
      "id": "4f7e779d5b598310",
      "url": "https://devpleno.com/cheerio",
      "title": "Cheerio: Uma implementação jQuery para Node - DevPleno (Part 1)",
      "content": "Javascript\n\n## Cheerio: Uma implementação jQuery para Node\n\nT\nPor Tulio Faria • 14 de agosto de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nCheerio é um módulo muito interessante porque é uma implementação do jQuery para Node. Vou criar um arquivo novo para ilustrar melhor. Vou salvar como cheereio.js e colocá-lo como dependência, mas para isso é preciso instalar ele primeiro:\n\nnpm install cheerio\ne dentro do arquivo faremos o seguinte:\n\nconst cheerio = require('cheereio')\n\nlet $ = cheerio.load('&#x3C;ul>&#x3C;li>1&#x3C;/li>&#x3C;li>2&#x3C;/li>&#x3C;/ul>')\nA partir desse momento, o Cheerio vai carregar esse HTML que coloquei dentro e permitir que eu navegue ou faça tudo que eu faria com jQuery no HTML. Por exemplo, eu posso pedir para pegar todos os li e caminhar por eles, depois escrever na tela:\n\n$('li').each(function () {\nconsole.log($(this).html())\n})\nAo rodar, ele irá retornar o 1 e 2. Podemos alterar o HTML também, vamos supor que eu queira adicionar mais um li:\n\n$('ul').append('&#x3C;li>3&#x3C;/li>')\n\n$('li').each(function () {\nconsole.log($(this).html())\n})\nCom isso eu consigo manipular o HTML exatamente como se estivesse no jQuery ou no browser. Eu poderia pegar esse código, voltar para o request e, ao invés de escrever o site da UOL na tela, jogar o Body dentro. Vamos supor que eu quero saber qual o título do site:\n\nconst request = require('request')\nconst cheerio = require('cheerio')\n\nrequest('https://www.uol.com.br', function (err, res, body) {\nif (!err &#x26;&#x26; res.statusCode == 200) {\nlet $ = cheerio.load(body)\n\n$('title').each(function () {\nconsole.log($(this).html())\n})\n}\n})\n\n// Resposta: UOL - Seu universo online\nEntão o request buscou o HTML, trouxe para o Cheerio, mandei ele carregar e fizemos um transversing e caminhei pelo HTML. Posso fazer ele trazer todos os p’s do site da uol:\n\nconst request = require('request')\nconst cheerio = require('cheerio')",
      "description": "Cheerio é um módulo muito interessante porque é uma implementação do jQuery para Node. Vou criar um arquivo novo para ilustrar melhor. Vou salvar como chee...",
      "keywords": [
        "cheerio",
        "html",
        "para",
        "request",
        "https",
        "function",
        "jquery",
        "const",
        "require",
        "body"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/cheerio"
      }
    },
    {
      "id": "4fc33d6fd2d835c4",
      "url": "https://devpleno.com/blog/politica-de-privacidade/index",
      "title": "Política de Privacidade (Part 2)",
      "content": "Em adição também utilizamos publicidade de terceiros no nosso website para suportar os custos de manutenção. Alguns destes publicitários, poderão utilizar tecnologias como os cookies e/ou web beacons quando publicitam no nosso website, o que fará com que esses publicitários (como o Google através do Google AdSense) também recebam a sua informação pessoal, como o endereço IP, o seu ISP, o seu browser, etc. Esta função é geralmente utilizada para geotargeting (mostrar publicidade de Lisboa apenas aos leitores oriundos de Lisboa por ex.) ou apresentar publicidade direcionada a um tipo de utilizador (como mostrar publicidade de restaurante a um utilizador que visita sites de culinária regularmente, por ex.).\n\nVocê detém o poder de desligar os seus cookies, nas opções do seu browser, ou efetuando alterações nas ferramentas de programas Anti-Virus, como o Norton Internet Security. No entanto, isso poderá alterar a forma como interage com o nosso website, ou outros websites. Isso poderá afetar ou não permitir que faça logins em programas, sites ou fóruns da nossa e de outras redes.\n\nLigações a Sites de terceiros\n\nO **DevPleno** possui ligações para outros sites, os quais, a nosso ver, podem conter informações / ferramentas úteis para os nossos visitantes. A nossa política de privacidade não é aplicada a sites de terceiros, pelo que, caso visite outro site a partir do nosso deverá ler a política de privacidade do mesmo.\n\nNão nos responsabilizamos pela política de privacidade ou conteúdo presente nesses mesmos sites.",
      "keywords": [
        "como",
        "nosso",
        "informa",
        "para",
        "privacidade",
        "devpleno",
        "website",
        "sites",
        "tica",
        "poder"
      ],
      "metadata": {
        "title": "Política de Privacidade",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/politica-de-privacidade/index.md"
      }
    },
    {
      "id": "4fc526085d2988cd",
      "url": "https://devpleno.com/request-e-response",
      "title": "Request e Response - DevPleno (Part 2)",
      "content": "Lembrando que, quando temos um request/response, sempre temos um cabeçalho para cada. Dependendo da requisição. podemos ter o body ou não. Também há outros tipos de requisição, como é o caso do POST. Nele podemos fazer a mesma coisa, porém com uma diferença: não conseguimos fazer no mesmo nível do GET pelo navegador. Vou mostrar agora o Postman, que permite que a gente faça um POST. Vamos então fazer um POST em /users:\n\nvar express = require ('express');\nvar app express();\napp.post('/users', function(req,res){\nres.send(req.headers);\nreq.on('data', function(chunk){\n//res.send(chunk);\n});\n});\nVamos mandar para [https://localhost:3000/users](https://localhost:3000/users) o tipo de requisição, no caso o POST, e um raw, ou seja, um texto puro.\n\nEm Text, selecionamos JSON e ele já troca o cabeçalho de solicitação para JSON. Apertamos o Send, e a resposta que vem são os cabeçalhos do request.\n\nNote que o content-length retornou 20 bytes, pois estou enviando 20 bytes de dados, diferente do anterior onde não estou enviando nada. Lembrando que no post eu tenho o body da minha requisição. O básico de uma aplicação WEB sempre funciona dessa forma, então o front-end faz uma request e recebe uma resposta.\n\nAssista ao vídeo da explicação:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Request%20e%20Response&url=https%3A%2F%2Fdevpleno.com%2Frequest-e-response) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frequest-e-response)",
      "description": "Nos posts anteriores já falamos sobre backend, frontend, como eles se comunicam através de uma requisição, e agora você verá um exemplo prático de um reque...",
      "keywords": [
        "requisi",
        "https",
        "request",
        "response",
        "temos",
        "para",
        "express",
        "send",
        "post",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/request-e-response"
      }
    },
    {
      "id": "4fdd62bbac1a87ff",
      "url": "https://devpleno.com/blog/como-invocar-funcoes-dinamicamente-com-js/index",
      "title": "Como invocar funções dinamicas em JavaScript (Part 1)",
      "content": "Em programação, blocos de código que executam instruções específicas são chamadas de funções e, no Javascript, são conhecidas como métodos. Agora, imagine o seguinte cenário: como desenvolvedor, você não conhece o nome do método que quer chamar mas sabe que existe o nome dele em uma variável. Então, como faremos para chamá-lo?\n\nOs métodos são muito úteis em casos onde queremos uma programação mais dinâmica, por exemplo: você tem um serviço e não sabe os nomes dos métodos disponíveis e é possível programar a forma como serão chamados ou se você tem uma forma de integrar módulos com pontos de entrada na aplicação para importar o módulo baseado nessa variável, chamando seus métodos dinamicamente.\n\nImagine o seguinte cenário em temos um console como o da imagem abaixo, onde deixamos para o usuário a opção de escolher o método **log** ou o **debug**:\n\n![Console](ee3e4af7-e305-4b07-b8dc-6b89ad845b2b.png)\n\nAo executarmos o código acima (dinamicamente.js) no prompt de comando, vemos o resultado a seguir com destaque para o “opa” que foi impresso:\n\n![Console](f1479302-5455-4de5-992a-b2895a8fc040.png)\n\nAo criar um objeto obj, definindo valores para suas variáveis a e b, tal qual a imagem abaixo:\n\n![Console](b5a5732c-9784-490c-8689-aa0ca2d9c0f2.png)\n\nPodemos pegar o valor da variável a do objeto obj com a instrução `console.log(obj.a)` e mostrar o conteúdo de a como um resultado:\n\n![Console](8b328403-f896-4bd5-84f1-c8d290947dfa.png)\n\nOutra forma de obter o valor de a consiste em definirmos uma constante (variável com valor fixo) que chamaremos de key e com a instrução `console.log(obj[key])` conseguimos o valor de a como resultado:\n\n![Console](d9b43f66-b423-47d3-affa-1d3e0e59f3e0.png)\n\nCom os métodos, o processo é semelhante. Alteremos o código acima para deixar apenas a definição da constante key como 'log' e, como não sabemos a posição do método que iremos chamar, colocamos `console[key]`.\n\n![Console](f07b0ccb-43c2-4b32-ab41-329b91806f31.png)",
      "keywords": [
        "console",
        "como",
        "para",
        "todos",
        "valor",
        "resultado",
        "navegador",
        "vari",
        "constante",
        "instru"
      ],
      "metadata": {
        "title": "Como invocar funções dinamicas em JavaScript",
        "date": "2018-02-19",
        "tags": "['Javascript']",
        "thumbnail": "INVOCAR-FUNÇÕES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/como-invocar-funcoes-dinamicamente-com-js/index.md"
      }
    },
    {
      "id": "4fdea68ee478916e",
      "url": "https://devpleno.com/ha-e-as",
      "title": "HA e AS em Aplicação Web - Web Basic - DevPleno (Part 1)",
      "content": "Fundamentos\n\n## HA e AS em Aplicação Web - Web Basic\n\nT\nPor Tulio Faria • 16 de junho de 2017\n\n[Fundamentos](/tag/fundamentos)\n\nHoje vamos continuar com mais alguns conceitos de uma Aplicação WEB que são muito importantes quando falamos de Startups, onde temos um poder de escala muito grande. São duas siglas, HA e AS:\n\nHA = High Availabilty (alta disponibilidade);\n\nAS = Auto Scale (Escala automática).\n\n**O que esses conceitos querem dizer na prática?**\n\nA alta disponibilidade quer dizer que o sistema praticamente não cai ou vai ter a disponibilidade mais alta possível, assim o sistema não fica offline nenhum segundo sequer porque caso tenhamos uma escala de clientes muito grande, se ficarmos 10 segundos fora, o prejuízo financeiro que isso vai gerar é muito grande, então a disponibilidade traz dinheiro.\n\nOutro fator para termos essa disponibilidade é o quanto a arquitetura que planejamos tem de elasticidade para suportar o sistema. Vamos supor que eu tenho um servidor que suporte 100 usuários, se tivermos uma carga de 300 usuários, precisamos de 3 servers, então o Auto Scale é uma forma de você escalar a aplicação para termos alta disponibilidade.\n\nEssas duas palavras combinadas é o que nós desejamos para todo o sistema, principalmente em uma startup, que o sistema fique online 100% do tempo e quando se tem picos de acesso o Auto Scaling suporte a elasticidade tanto para cima quanto para baixo, por exemplo, se eu tenho 100 usuários eu uso apenas um servidor, se subir eu aumento o numero de servidores e se baixar novamente, volto para um servidor, aumentando e diminuindo meus recursos computacionais de forma dinâmica. Isso é muito famoso usando a AMAZON, ela já tem ferramentas para esse tipo de dinamismo.",
      "description": "Hoje vamos continuar com mais alguns conceitos de uma Aplicação WEB que são muito importantes quando falamos de Startups, onde temos um poder de escala mui...",
      "keywords": [
        "para",
        "disponibilidade",
        "muito",
        "https",
        "alta",
        "sistema",
        "grande",
        "auto",
        "fundamentos",
        "aplica"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/ha-e-as"
      }
    },
    {
      "id": "502fbc7d9f3b2d35",
      "url": "https://devpleno.com/networking",
      "title": "Como fazer Networking corretamente - DevPleno (Part 1)",
      "content": "Carreira\n\n## Como fazer Networking corretamente\n\nT\nPor Tulio Faria • 23 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nNetworking é uma palavra muito utilizada atualmente. A maioria acha que deve ser feito o tempo todo, em todo lugar, e tenta forçar isso.\n\n**O que é problemático?**\n\nÉ exatamente esse networking forçado, no qual você não tem uma sinergia tão grande, então pega cartão por pegar, entrega por entregar, faz por fazer.\n\n**Como fazer Networking?**\n\nA resposta mais simples é: NÃO faça networking! Se você tem na sua cabeça que precisa fazer isso, você não está fazendo.\n\nA maneira mais interessante capaz de te gerar valor ao longo do tempo é ajudar as pessoas. Gere valor a elas, esse é o primeiro ponto. Na faculdade, você tem facilidade em programação? Ajude colegas com os exercícios. Tem facilidade em gestão de projetos? Ajude as pessoas em gestão de projetos.\n\nUm outro ponto interessante é fazer o que você se propôs de uma maneira muito bem feita e entregue o seu melhor, assim você deixa claro que é muito bom.\n\nPor exemplo, se você entregou algo a um cliente, ele é um ponto de networking. Eu tenho vários clientes antigos, para os quais eu entregava tanto valor, que até hoje nos encontramos e ficamos conversando por horas. Eles não são mais cliente, mas eu ainda mantenho contato.\n\nIsso é networking! Gerar valor, não tentar fazer networking pedindo algo à pessoa logo após entregar um cartão.\n\nNão se esqueça de que o networking é gerar amizades. Não é legal querer ter contatos puramente por resultados financeiros. Reflita sobre isso, você está mesmo fazendo networking do jeito certo?\n\nDeixe suas sugestões nos comentários.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Networking é uma palavra muito utilizada atualmente. A maioria acha que deve ser feito o tempo todo, em todo lugar, e tenta forçar isso. O que é problemáti...",
      "keywords": [
        "networking",
        "fazer",
        "https",
        "isso",
        "valor",
        "carreira",
        "como",
        "muito",
        "mais",
        "gerar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/networking"
      }
    },
    {
      "id": "5079b2a82d2e6771",
      "url": "https://devpleno.com/blog/dica-debug-nodejs-com-chrome-devtools/index",
      "title": "Dica: Debug NodeJS com Chrome DevTools (Part 1)",
      "content": "A dica de hoje é sobre como podemos fazer o debug dos nossos scripts em Node (de um script que fica rodando direto como o express e de um script simples) utilizando o chrome. Eu tenho em minha máquina um servidor em express e no meu shell eu vou rodar esse servidor:\n\n```jsx\nnode -- inspect server.js\n```\n\nPerceba que ele mostra um link:\n\n![link gerado](37aa5d6c-532e-4a51-a147-613d2eea808d.png)\n\nEsse link eu vou copiar e colar no navegador. Com isso ele abre para mim o devTools do Chrome e eu posso ir em Source, por exemplo, apertar CTRL+P e colocar o nome do arquivo, no caso o meu se chama servser.js:\n\n![Visualizando o devtools](f1e7e4ad-efcb-4224-b20b-8a382ea9d542.png)\n\nAgora eu quero que ele pare a execução quando passar no primeiro console.log:\n\n![Trecho do código](c67620e0-32e1-4c86-97d9-cb15d01b0bf1.png)\n\nÉ muito comum em algumas ferramentas como o visual studio fazer o debug dessa forma, setando um break point e quando o script for executar, ele vai parar nesse ponto que marcamos.\n\nAgora vamos rodar nosso localhost:3000 e quando voltamos para o devtools, perceba que ele parou e nós conseguimos checar o que tem dentro do req, res:\n\n![Analizando o devtools](160a9ae0-d734-4a17-9e08-5a61858f3c69.png)\n\nEu posso pedir para ele ir para a próxima linha ou mandar continuar o script utilizando os botões:\n\n![(73aa926e-a947-4d9d-8c54-4f3920ba916b.png)\n\nVamos supor que eu queira saber o que vai sair em uma expressão, eu posso selecionar e passar o mouse em cima que ele mostra sendo executado. Isso é muito útil para achar alguma inconsistência no código.\n\nSempre que você for testar, principalmente código assíncrono, coloque um break point onde você quer que pare, principalmente para call back.\n\nOutra forma que temos de depurar um código é depurar desde a primeira linha, para isso vou utilizar um algoritmo que já fizemos em outra aula:\n\n![Depurando o código](d13fda26-e1b3-4b5d-afeb-5c48b0f5a2e7.png)\n\n```jsx\nnode --inspect --debug-brk cyclic_rotation.js\n```",
      "keywords": [
        "para",
        "digo",
        "como",
        "script",
        "linha",
        "isso",
        "devtools",
        "posso",
        "quando",
        "vamos"
      ],
      "metadata": {
        "title": "Dica: Debug NodeJS com Chrome DevTools",
        "date": "2017-09-11",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Debug.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/dica-debug-nodejs-com-chrome-devtools/index.md"
      }
    },
    {
      "id": "509d9626fd301d3b",
      "url": "https://devpleno.com/algoritmos-cyclic-rotation",
      "title": "Algoritmos: Cyclic Rotation - DevPleno",
      "content": "Algoritmos\n\n## Algoritmos: Cyclic Rotation\n\nT\nPor Tulio Faria • 14 de março de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nEste é mais um vídeo da série algoritmos, na qual explico sobre algoritmos que frequentemente caem em entrevistas de emprego e competições de programação. Desta vez, comento sobre o Cyclic Rotation.\n\n## Confira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Algoritmos%3A%20Cyclic%20Rotation&url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-cyclic-rotation) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-cyclic-rotation)",
      "description": "Este é mais um vídeo da série algoritmos, na qual explico sobre algoritmos que frequentemente caem em entrevistas de emprego e competições de programação. ...",
      "keywords": [
        "algoritmos",
        "https",
        "cyclic",
        "rotation",
        "este",
        "sobre",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2falgoritmos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/algoritmos-cyclic-rotation"
      }
    },
    {
      "id": "50ced715bb96f078",
      "url": "https://devpleno.com/racionalizacao",
      "title": "Racionalização: Tomando decisões racionais - DevPleno (Part 1)",
      "content": "Carreira\n\n## Racionalização: Tomando decisões racionais\n\nT\nPor Tulio Faria • 8 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nHoje gostaria de dar uma dica bem rápida para você sobre o que eu chamo de Racionalização, que é basicamente olharmos o que estamos fazendo de uma maneira mais racional.\n\n**Como assim?**\n\nPor exemplo, você está criando sua empresa do zero e faz uma ação totalmente no “achismo”, então se não foi racionalizado esta ação, não temos o feedback de que foi acertado ou não.\n\nUsando o próprio devPleno como exemplo: Se uma postagem X foi bem recebida, por que ela foi bem recebida? Então fazemos uma racionalização analisando tudo o que os dados nos dizem para saber o motivo.\n\nQuanto mais racionalizamos, melhor ficamos nesta área. Caso olhamos para um projeto que não está performando como queríamos e tentamos racionalizar o que esta acontecendo, começamo a olhar de uma maneira muito diferente.\n\n**Como fazer isso?**\n\nComece a olhar outros projetos de outros ‘lugares’ e ache razão neles, trazendo para o seu projeto.\n\nPodemos usar como exemplo o Youtube. Existe uma forma de aplicar uma alteração em lot, fazendo tudo via interface, então você olha para seu projeto e pensa: por que estou tentando fazer uma operação em lot no servidor se eu posso criar uma ação em lot no react que chama varias requests para cada alteração no servidor? Assim você começa a analisar melhor e achar solução olhando estes exemplos externos, outro aplicativo, outra empresa, etc.\n\nÉ muito interessante fazer a Racionalização para tudo que esta ao nosso redor, não só como empreendedor, mas também como desenvolvedor ou até mesmo cidadão.\n\nEntão a dica de hoje é: Racionalize sobre as coisas. Tomou uma decisão? Por que você fez isso? Por que retornou aquele resultado? Entenda, ache as razões do motivo por ter acontecido, e não apenas deixe as ideias ‘voando’.",
      "description": "Hoje gostaria de dar uma dica bem rápida para você sobre o que eu chamo de Racionalização, que é basicamente olharmos o que estamos fazendo de uma maneira ...",
      "keywords": [
        "para",
        "como",
        "https",
        "racionaliza",
        "carreira",
        "exemplo",
        "esta",
        "devpleno",
        "tudo",
        "projeto"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/racionalizacao"
      }
    },
    {
      "id": "50ed05f9e206a221",
      "url": "https://devpleno.com/blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! (Part 2)",
      "content": "Então, você prefere a comodidade de receber e executar tarefas ou o desafio de buscar mudanças de pensamento que podem trazer grandes impactos para as pessoas e para a sociedade?\n\n**Você se sente capaz de definir metas e atingi-las?**\n\nNa vida empreendedora, é muito importante que exista [comprometimento com as metas](https://www.devpleno.com/comprometimento-com-suas-metas?utm_source=blog&utm_campaign=rc_blogpost). Como citado, o ato de realizar é o que diferencia um empreendedor de um criador. De pouco vale ser muito criativo, mas viver cheio de ideias dentro da sua mente. Isso não vai criar algo realmente transformador.\n\nPortanto, saber definir objetivos acaba tendo um papel fundamental. Onde você quer chegar? Como pretende alcançar isso e em quanto tempo? Trabalhando dentro de uma empresa você estará cumprindo metas de outras pessoas, e não as suas.\n\nSe você quer ser o dono de suas metas, deve responder também pelo planejamento, comercialização e fiscalização do andamento de todos os processos de seu negócio. Nesse caso, a medida do sucesso é saber não só criar um plano de ação eficaz, como executá-lo da melhor forma a partir dos recursos disponíveis.\n\n**Você se considera uma pessoa disciplinada?**\n\nUm empreendedor está sempre atarefado com muitas coisas, realizando e gerenciando várias atividades ao mesmo tempo, sem que ninguém peça para que ele faça isso. Ele sabe a verdadeira importância de realizá-las. Diferente de um colaborador que, basicamente, deve cumprir tarefas e uma quantidade de horas de trabalho indicadas por um gerente.\n\nUm grande passo para a auto-disciplina é [aprender a aprender.](https://www.devpleno.com/aprenda-a-aprender?utm_source=blog&utm_campaign=rc_blogpost) Encontre o jeito que você absorve os conhecimentos de forma mais eficaz e se apaixone por isso. Aprender é sempre muito gratificante**.** Portanto, saber o que realmente mobiliza você e desperta o seu interesse pode ser o ponto crucial para uma mudança de comportamento.",
      "keywords": [
        "para",
        "isso",
        "como",
        "muito",
        "empresa",
        "pode",
        "mais",
        "melhor",
        "https",
        "source"
      ],
      "metadata": {
        "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão!",
        "date": "2017-08-12",
        "tags": "['Carreira']",
        "thumbnail": "TrabalharOuEmpreender.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index.md"
      }
    },
    {
      "id": "5126e6d1e2885103",
      "url": "https://devpleno.com/tag/javascript/11",
      "title": "Javascript - Pagina 11 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 10 de mai. de 2017 Hands-on: Streams Parte 03 - Duplex](/stream-duplex)\n\n[Javascript 10 de mai. de 2017 Hands-on: Streams Parte 4 - Transform](/streams-parte-3-transform)\n\n[Javascript 9 de mai. de 2017 PKG - Transforme seu aplicativo Node em executável](/hands-on-pkg)\n\n[Javascript 9 de mai. de 2017 Hands-on: Streams Parte 2 - Writable](/stream-parte-2-writable)\n\n[Javascript 8 de mai. de 2017 Generators: O que há \"por baixo dos panos\"](/generators-o-que-ha-por-baixo-dos-panos)\n\n[Javascript 8 de mai. de 2017 Hands-on: Ler arquivo linha a linha](/hands-ler-arquivo-linha-linha)\n\n[Javascript 8 de mai. de 2017 Hands-on: Readline](/hands-on-readline)\n\n[Javascript 8 de mai. de 2017 Listar arquivos em JS (async, await, promise e Promise.all)](/listar-arquivos-em-js)\n\n[Javascript 8 de mai. de 2017 Hands-on: Streams - Parte 1](/streams-parte-1)\n\n[Javascript 5 de mai. de 2017 ES6 - Async/Await](/async-await)\n\n[Javascript 5 de mai. de 2017 Ferramentas Visuais para Flexbox](/ferramentas-visuais-para-flexbox)\n\n[Javascript 5 de mai. de 2017 Testando o Spread Operator: Novidade do ES6](/spread-operator)\n\n[Anterior](/tag/javascript/10)11 / 16[Próxima](/tag/javascript/12)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "hands",
        "parte",
        "streams",
        "ferramentas",
        "linha",
        "arquivo",
        "async",
        "await"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/11"
      }
    },
    {
      "id": "512c0c6f03cc2e46",
      "url": "https://devpleno.com/como-testar-dominios-localmente",
      "title": "Como testar domínios localmente - DevPleno",
      "content": "Fundamentos\n\n## Como testar domínios localmente\n\nT\nPor Tulio Faria • 15 de setembro de 2017\n\n[Fundamentos](/tag/fundamentos)\n\nHoje quero dar uma dica bem rapidinha de como você pode testar o seu site local com domínios válidos para sua máquina. Com isso você consegue, por exemplo, fazer um domínio que você ainda não publicou ou registrou funcionar somente na sua máquina para testes. Outra coisa bastante útil é se você precisa, no seu sistema, lidar com diferentes domínios. É possível fazer essa configuração local na sua máquina para fazer esse teste.\n\nNós vamos fazer no Mac, mas vou deixar logo o caminho do arquivo para o Linux e para o Windows:\n\n- Mac OS: /etc/hosts\n\n- Linux: /etc/hosts\n\n- Windows: c:\\\\windows\\\\system32\\\\drivers\\\\etc\\\\hosts\nCom o Shell aberto vou dar um ‘sudo’ para fazer algo como super user, como estamos mexendo em uma configuração do sistema operacional, precisamos ser administrador para fazer isso:\n\nsudo nano/etc/host\nVocê pode perceber que eu já tenho dois servers mapeando para o mesmo IP:\n\nAgora podemos digitar nesse arquivo e adicionar um novo IP e mapear para o site que eu quero, por exemplo:\n\n127.0.0.1 devpleno.local\nEu já tenho uma aplicação para teste rodando no localhost, vamos testar agora mudando o url:\n\nPerceba que ele está mapeando normalmente. Lembrando que isso não vale para máquinas externas.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20testar%20dom%C3%ADnios%20localmente&url=https%3A%2F%2Fdevpleno.com%2Fcomo-testar-dominios-localmente) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-testar-dominios-localmente)",
      "description": "Hoje quero dar uma dica bem rapidinha de como você pode testar o seu site local com domínios válidos para sua máquina. Com isso você consegue, por exemplo,...",
      "keywords": [
        "para",
        "fazer",
        "https",
        "como",
        "testar",
        "fundamentos",
        "nios",
        "localmente",
        "local",
        "quina"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/como-testar-dominios-localmente"
      }
    },
    {
      "id": "5190486dacf21ca3",
      "url": "https://devpleno.com/blog/o-que-e-restful/index",
      "title": "Web Basic - RESTful (Part 1)",
      "content": "Apenas para lembrar o que vimos no post anterior sobre arquitetura Web, existem as duas pontas da aplicação: o back-end e o frond-end e uma troca de mensagens entre eles.\n\nEntre essas duas camadas, há um padrão que é a forma que eles trocam essa mensagem. Quando o cliente fala com o server, temos o protocolo HTTP, o method diz algo como por exemplo “servidor, altere algo no servidor” (POST), mas temos outros tipos como Delete, Get, Put, etc.\nHá algum tempo, usávamos bastante o POST e o GET, que seria um formulário com POST ou um link com o GET (praticamente não usávamos os outros dois) mas com o tempo a aplicação foi evoluindo até que chegou em um ponto que começou a voltar um padrão para não precisarmos mais passar informação na URL que estamos chamando, pois o método já faz isso.\nAntigamente era comum, por exemplo, fazer um Script que se chamava usuários/save. Este save acaba não precisando ser assim, pois o POST já era feito para isso, com isso estávamos sendo redundantes. Assim, começamos a adotar um padrão chamado RESTful\n\n**O que é o RESTful?**",
      "keywords": [
        "para",
        "post",
        "padr",
        "exemplo",
        "pois",
        "isso",
        "todos",
        "queremos",
        "users",
        "comunica"
      ],
      "metadata": {
        "title": "Web Basic - RESTful",
        "date": "2017-05-15",
        "tags": "['Fundamentos']",
        "thumbnail": "Restful.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/o-que-e-restful/index.md"
      }
    },
    {
      "id": "519e75d517a439fd",
      "url": "https://devpleno.com/blog/sua-carreira-pode-mudar-durante-o-carnaval/index",
      "title": "Sua carreira pode mudar durante o carnaval? (Part 1)",
      "content": "Geralmente, acredita-se que não… Afinal de contas, carnaval, feriado, festas, bebedeira, ninguém quer se preocupar com carreira ou trabalho. Não é verdade?\n\nBom, pelo menos muita coisa mudou em minha carreira a partir de uma terça feira de carnaval. Estranho isso, né?\n\nToda essa mudança na minha carreira começou dia 9 de fev de 2016, às 14h18 - também conhecida como terça-feira de carnaval. :)\n\nSó para entender o cenário, eu já estava com alguns problemas financeiros e durante o carnaval (sem dinheiro) estava explorando formas de mudar minha carreira - pois a situação estava ficando insuportável...\n\nNeste carnaval de 2016, eu estava buscando e explorando possibilidades de negócios e realmente empenhado em dar uma mudança financeira na minha vida. Perto desta época, comecei a considerar trabalhos remotos e já havia enviado meu CV para dezenas de vagas sem ter nenhuma resposta. Mas a minha intenção já estava setada. ;)\n\nFoi quando recebi o e-mail desta foto:\n\n![Email](EmailUm.png)\n\nSim, uma pessoa que eu havia sido apresentado há 2 anos, lembrou-se de que eu poderia ajudá-la em um projeto.\n\nE apesar do e-mail estar em português, ela estava em Nova Iorque e precisava resolver um grande problema no projeto. Toda a negociação aconteceu durante a terça feira de carnaval e quarta-feira de cinzas. Ao final da quarta-feira de cinzas, eu estava contratado - com contrato assinado e tudo mais - e já tinha recebido um e-mail (em inglês) de um outro membro da equipe para falar com o CTO (eu havia sido contratado pela CEO).\n\n![Email 2](EmaiDois.png)\n\n![Email 3](EmailTres.png)\n\nRelembrando este acontecimento, eu consegui desconstruir vários pontos interessantes que gostaria de compartilhar com vocês:\n\n**Network não acontece do dia para a noite!**\n\nEu conheci a pessoa 2 anos antes deste e-mail. Sim, 2 anos! E pasmem, quem me apresentou a ela foi um colega que havia estudado comigo 13 anos antes. Network é um jogo de longo prazo e tem que ser cultivado o tempo todo!",
      "keywords": [
        "para",
        "carnaval",
        "minha",
        "estava",
        "carreira",
        "mudan",
        "feira",
        "isso",
        "havia",
        "ingl"
      ],
      "metadata": {
        "title": "Sua carreira pode mudar durante o carnaval?",
        "date": "2019-03-01",
        "tags": "['Carreira']",
        "thumbnail": "TulioEscada.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/sua-carreira-pode-mudar-durante-o-carnaval/index.md"
      }
    },
    {
      "id": "51f57ae119ca4acc",
      "url": "https://devpleno.com/fullstacklab-ytad",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstacklab-ytad to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstacklab",
        "ytad"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstacklab-ytad"
      }
    },
    {
      "id": "527bb64a9c7f6da1",
      "url": "https://devpleno.com/preconceito-com-js-nao-preparado-para-corporativo",
      "title": "Preconceito com JS? Não preparado para corporativo? - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Preconceito%20com%20JS%3F%20N%C3%A3o%20preparado%20para%20corporativo%3F&url=https%3A%2F%2Fdevpleno.com%2Fpreconceito-com-js-nao-preparado-para-corporativo) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpreconceito-com-js-nao-preparado-para-corporativo)",
      "description": "Hoje quero falar mais um pouco sobre o POO para JavaScript. Basicamente as últimas considerações sobre essa transição e o preconceito que o JavaScript enfr...",
      "keywords": [
        "javascript",
        "para",
        "https",
        "preconceito",
        "muito",
        "hoje",
        "mais",
        "linguagem",
        "preparado",
        "corporativo"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/preconceito-com-js-nao-preparado-para-corporativo"
      }
    },
    {
      "id": "52cdd284dd2739de",
      "url": "https://devpleno.com/hands-on-rimraf",
      "title": "Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios - DevPleno (Part 1)",
      "content": "Javascript\n\n## Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios\n\nT\nPor Tulio Faria • 10 de agosto de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nDurante a semana fizemos diversos procedimentos em lot, e uma das coisas que nós fizemos foi apagar um diretório de maneira recursiva (pegar o diretório completo e apagar).\n\nSeria mais ou menos o seguinte: tenho um diretório no VS Code e dentro desse diretório tivesse um dir1, dentro dele um dir2, dentro um dir3 e por aí vai. Precisamos apagar a estrutura toda.\n\nA forma que temos para fazer isso no padrão do node usando o FS é ter que apagar um por um, mas vamos utilizar um módulo chamado Rimraf para que ele faça esse processo.\n\nyarn add rimraf\nEle é um pacote bem simples. Ao adicionar, o [Yarn](https://www.devpleno.com/hands-on-yarn/) já cria o package.json e o yarn.lock para travar as versões. Agora vamos criar um arquivo que vai apagar o diretório. Esse arquivo vai se chamar apagar.js:\n\nconst rimraf = require('rimraf')\nrimraf('dir1', function () {\nconsole.log('done')\n})\nAo rodar, o código perceba que ele apagou o diretório. É muito legal utilizar isso porque o filesystem padrão do node não permite que a gente apague diretório de forma recursiva, isso é muito importante para conseguir agilizar, já que não precisamos criar nada recursivamente.\n\nO Rimraf tem outra coisa muito interessante que é apagar diretórios que não estão vazios, temos algumas limitações como, por exemplo, se pegarmos os rmdir que só apaga diretório vazio.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Durante a semana fizemos diversos procedimentos em lot, e uma das coisas que nós fizemos foi apagar um diretório de maneira recursiva (pegar o diretório co...",
      "keywords": [
        "rimraf",
        "diret",
        "apagar",
        "https",
        "para",
        "yarn",
        "javascript",
        "dentro",
        "isso",
        "devpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-on-rimraf"
      }
    },
    {
      "id": "52d2c8607f84bd00",
      "url": "https://devpleno.com/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica",
      "title": "Por que fazer um curso de programação voltado para a prática? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Por que fazer um curso de programação voltado para a prática?\n\nT\nPor Tulio Faria • 31 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nA área de tecnologia da informação oferece muitas oportunidades e, para aproveitá-las, o profissional deve se preparar continuamente. Para tanto, o desenvolvedor pode encontrar na web uma grande diversidade de vídeos e tutoriais a respeito de diversas tecnologias, principalmente em blogs, redes sociais, fóruns, youtube e nos [cursos gratuitos](https://www.devpleno.com/ensino-formal-ou-cursos-livres?utm_source=blog&#x26;utm_campaign=rc_blogpost) em plataformas de ensino.\n\nPorém, uma capacitação mais sólida, encontrada em um bom curso de programação deve ser considerada para quem quer se destacar, especialmente em um momento tão favorável para o desenvolvedor profissional.\n\nO uso de smartphones e plataformas de serviços aumenta diariamente. Já dentro das empresas, sistemas mais complexos são usados para o controle de produção e analise de dados para melhoria da performance nos negócios.\n\nPara se ter uma ideia, mesmo com a crise no Brasil, os gastos com tecnologia, pessoais e corporativos só crescem. [Segundo a Fundação Getúlio Vargas](https://link.estadao.com.br/noticias/gadget,ate-o-fim-de-2017-brasil-tera-um-smartphone-por-habitante-diz-pesquisa-da-fgv,70001744407?utm_source=blog&#x26;utm_campaign=rc_blogpost), o Brasil terá um smartphone por habitante até o final de 2017.\n\nOuto [estudo](https://www.valor.com.br/empresas/4943024/crise-nao-afeta-investimento-das-empresas-em-tecnologia-diz-fgv?utm_source=blog&#x26;utm_campaign=rc_blogpost) feito pela mesma instituição mostra que a TI foi uma das áreas que mantiveram níveis de investimentos estáveis pelas empresas em 2016, com uma taxa média de 7,6% da receita aplicado em novas tecnologias.",
      "description": "A área de tecnologia da informação oferece muitas oportunidades e, para aproveitálas, o profissional deve se preparar continuamente. Para tanto, o desenvol...",
      "keywords": [
        "para",
        "como",
        "projeto",
        "https",
        "source",
        "blog",
        "campaign",
        "blogpost",
        "mais",
        "desenvolvimento"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica"
      }
    },
    {
      "id": "5309343d539abbcd",
      "url": "https://devpleno.com/blog/renderizar-estruturas-em-formato-de-arvore/index",
      "title": "ReactJS Recursivo? (Part 2)",
      "content": "```jsx\nimport Node from './node'\nreturn (\n  <div>\n    <h2>\n      {' '}\n      <Node node={nodes} />\n    </h2>\n  </div>\n)\n```\n\nEntão ele escreveu o node, que é o que está dentro do nó.\n\nVamos mudar, colocar um span em node.js e colocar um JSON com um props.node para sabermos o que tem ali dentro:\n\n```jsx\nconst Node = (props) =>{\n    return(\n        <span> {JSON.stringfy(props.node) </span>\n    )\n}\n```\n\nPerceba que é retornado o nó inteiro. Se eu tiver o lado esquerdo, tenho que renderizar esse nó, para isso podemos pedir para o node renderizar do lado esquerdo.\n\n```jsx\nconst Node = (props) => {\n  return (\n    <span>\n      {props.node.l && <Node node={props.node.l} />}\n      {props.node.v}\n    </span>\n  )\n}\n```\n\nCom isso ele andou apenas para o lado esquerdo. Podemos adicionar também, por exemplo, apenas o lado direito:\n\n```jsx\n{\n  props.node.r && <Node node={props.node.r} />\n}\n```\n\nAgora eu quero saber quando eu renderizar um nó colocar um parênteses para saber quando foi realizado uma conta:\n\n```jsx\nconst Node = (props) => {\n  return (\n    <span>\n      ({props.node.l && <Node node={props.node.l} />}\n      {props.node.v})\n    </span>\n  )\n}\n```\n\nCom isso conseguimos reparar como foi feito a conta, afinal ele mantém as precedências dos parênteses, ou seja, ele está entrando realmente na árvore.\n\nPerceba que fizemos recursividade sem utilizar nada de repetição, apenas mandamos renderizar a função, que nada mais é do que um componente chamando ele mesmo. Uma coisa importante é sabermos que ele tem um nó base, então toda vez que ele for um V não tem nel left nem right, logo ele é o passo base, onde eu paro a recursividade.\n\nPoderíamos fazer o parênteses não aparecer nos valores, deixando o resultado muito mais simples.",
      "keywords": [
        "node",
        "props",
        "span",
        "lado",
        "vamos",
        "para",
        "renderizar",
        "fazer",
        "isso",
        "react"
      ],
      "metadata": {
        "title": "ReactJS Recursivo?",
        "date": "2017-06-28",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "ReactRecursivo.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/renderizar-estruturas-em-formato-de-arvore/index.md"
      }
    },
    {
      "id": "53611cf5e2bb1622",
      "url": "https://devpleno.com/4-novos-metodos",
      "title": "4 novos Métodos Strings que você precisa conhecer - DevPleno (Part 2)",
      "content": "Compartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=4%20novos%20M%C3%A9todos%20Strings%20que%20voc%C3%AA%20precisa%20conhecer&url=https%3A%2F%2Fdevpleno.com%2F4-novos-metodos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2F4-novos-metodos)",
      "description": "Quatro novas funções foram adicionadas às Strings no ES6 e são bastante interessantes para usarmos no dia a dia. Veja só:  startsWith Nela temos uma string...",
      "keywords": [
        "tulio",
        "faria",
        "console",
        "https",
        "string",
        "para",
        "startswith",
        "endswith",
        "javascript",
        "novos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/4-novos-metodos"
      }
    },
    {
      "id": "53acba2f2b466888",
      "url": "https://devpleno.com/estudar-1-hora-por-dia-ou-8-horas-no-sabado",
      "title": "Estudar 1 hora por dia ou 8 horas no sábado? - DevPleno (Part 2)",
      "content": "Uma coisa que eu fazia na faculdade que funcionava muito bem para mim era relembrar todo o conteúdo da aula anterior antes de assistir outra aula. Se minhas aulas eram na terça e quinta, na segunda eu relembrava as aulas da terça e na quarta o de quinta, então dos 7 dias eu já estava estudando 4 dias, isso facilitou e eu evolui muito rápido em programação, sem contar os outros dias que eu brincava um pouco.\n\nÉ muito importante manter esse ritmo de estudo para gerar um hábito. Então meu conselho para você é: estude um pouco todo dia ao invés de fazer uma vez só no fim de semana. Se você pegar 20 minutos focado em um dia, é mais fácil de cumprir do que 4 ou até 8 horas seguidas, é mais fácil desfocar quando a carga horária é maior.\n\nPor esse motivo, quando vamos estudar para prova e damos aquele gás, ele pode parecer efetivo, mas na verdade pouquíssimo do tempo que você estudou é realmente efetivo, porque o estudo que dura é a prática e o conhecimento que você faz de forma recorrente, e isso vai levar você a performar melhor.\n\nPorém, se você não tem tempo durante a semana, ainda é melhor estudar 8 horas no sábado do que não estudar nada nunca, nem que sua frequência de estudo seja menor ainda sim é bom ter uma frequência de estudo, mas o ideal é manter uma frequência e enraíze seu dia a dia.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Estudar%201%20hora%20por%20dia%20ou%208%20horas%20no%20s%C3%A1bado%3F&url=https%3A%2F%2Fdevpleno.com%2Festudar-1-hora-por-dia-ou-8-horas-no-sabado) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Festudar-1-hora-por-dia-ou-8-horas-no-sabado)",
      "description": "Descubra a melhor rotina de estudos para programadores: consistência diária ou maratonas no fim de semana? Dicas para organizar seus estudos.",
      "keywords": [
        "semana",
        "estudar",
        "horas",
        "melhor",
        "mais",
        "dias",
        "para",
        "https",
        "bado",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/estudar-1-hora-por-dia-ou-8-horas-no-sabado"
      }
    },
    {
      "id": "53b2e951348a29c6",
      "url": "https://devpleno.com/tomar-decisoes",
      "title": "Tomar decisões - DevPleno (Part 2)",
      "content": "Um exemplo interessante: prestavamos consultoria para um cliente, e teve um dia em que chegamos lá para conversar sobre outro assunto e uma das sócias estava extremamente estressada, perguntamos o que estava acontecendo e ela respondeu “esses funcionários não resolvem nada. Pra comprar um café eles tem que me pedir dinheiro!” Então perguntamos porque eles tinham que pedir a ela. Ela respondeu que era porque eles não tinham acesso ao dinheiro. Ou seja, ela não deixava os funcionários tomarem decisão, por mais que eles quisessem tomar. A sugestão que demos foi deixar uma caixa com o dinheiro, avisar para quando precisar de dinheiro para comprar algo para a empresa pegue lá e devolva a nota na caixa com o nome da pessoa que comprou. Uma coisa simples que desenrola tudo.\n\nEntão, caso você seja subordinado, comece a tomar decisões menores, em que o impacto não atrapalhe e a medida que você vai acostumando com isso, comece a ajudar seu líder a tomar decisões, isso vai gerar uma produtividade muito grande para sua equipe.\n\nJá se você é um líder, dê poder às pessoas da sua equipe para que elas te ajudem, caso a decisão seja um pouco mais de risco deixe claro que você tem que estar envolvido ou peçam para a equipe manter você informado.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Tomar%20decis%C3%B5es&url=https%3A%2F%2Fdevpleno.com%2Ftomar-decisoes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftomar-decisoes)",
      "description": "Você costuma tomar decisões necessárias ou espera ter tudo na sua mão? Independente se você está em um cargo de liderança ou se é liderado, é muito importa...",
      "keywords": [
        "decis",
        "para",
        "tomar",
        "mais",
        "equipe",
        "porque",
        "https",
        "empresa",
        "isso",
        "pessoas"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/tomar-decisoes"
      }
    },
    {
      "id": "53e3b9a6526d9993",
      "url": "https://devpleno.com/desenvolvedor-full-stack-o-que-e-e-como-se-tornar",
      "title": "Desenvolvedor Full Stack: o que é e como se tornar? - DevPleno (Part 3)",
      "content": "- **controle de versão**: é básico que qualquer desenvolvedor domine tecnologias como o Git e o SVN, seja ele Full Stack ou não;\n\n- **linguagens de programação back-end**: além de estudar a noção de lógica do back-end, o Full Stack precisa saber pelo menos uma linguagem como JavaScript, Java, C# ou PHP;\n\n- **banco de dados**: muitos devs se amedrontam com o degrau de aprendizado que são os banco de dados. Mas para se tornar Full Stack, é preciso conhecer bem esses mecanismos;\n\n- **mobile**: a abordagem padrão hoje é o ‘mobile first’. Devs oriundos do front-end costumam ter essa visão, mas quem vem do back-end pode se aprofundar mais;\n\n- **infraestrutura e nuvem:** conhecimentos como virtualização de máquinas, infraestrutura de redes e serviços de nuvem são muito bem-vindos para o desenvolvedor Full Stack;\n\n- **linguagens de programação Front-End**: Javascript e HTML, por exemplo, são algumas das habilidades básicas de qualquer desenvolvedor Full Stack.\n\nDepois de dominar todos esses conhecimentos listados acima, um desenvolvedor pode até se dar por satisfeito e adotar o sufixo “Full Stack” no seu cartão de visitas. Mas é preciso que ele tenha plena consciência de que, na verdade, sua evolução como profissional será contínua e ele nunca deixará de aprender. As tecnologias e linguagens de programação estão sempre se transformando. Para não correr o risco de se tornar obsoleto em alguma das suas competências, o desenvolvedor precisa estudar cada vez mais e incluir a busca por novos conhecimentos como parte da sua rotina.\n\n## Um desenvolvedor Full Stack precisa conhecer também do negócio?\n\nO objetivo do desenvolvedor Full Stack é ter a visão holística sobre o processo de desenvolvimento de um produto. Logo, apesar de não ser uma exigência básica, é muito recomendável que esse profissional busque conhecimentos também na área de negócios.",
      "description": "Cada vez mais a figura do desenvolvedor Full Stack ganha espaço em empresas de TI e desenvolvimento de software. Esse perfil profissional que combina as ha...",
      "keywords": [
        "full",
        "stack",
        "desenvolvedor",
        "como",
        "tornar",
        "front",
        "back",
        "para",
        "profissional",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/desenvolvedor-full-stack-o-que-e-e-como-se-tornar"
      }
    },
    {
      "id": "54358f0726c94a55",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-4/index",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms (Part 7)",
      "content": "```jsx\nsocket.on('video', function (video) {\n  console.log(video)\n  $('videos-wrapper').append(videoTemplete({ video }))\n})\n```\n\nCom isso, não precisamos mais escrever html, apenas compilamos o templete. Agora precisamos fazer o mesmo para o lance a lance, e aproveitando que estamos em js/match.js, vamos fazer o seguinte:\n\n```jsx\nsocket.on('bid'), function(bid){\n    $(\"#bids-wrapper\").prepend(bidTemplete)(bid))\n})\n```\n\nLembrando que temos que compilar o template lá em cima do código:\n\n```jsx\nconst bidTemplete =  Handlebars.compile($(\"#bid-templete).html())\n```\n\nVamos voltar em nosso js/admin.js e quando eu clicar em enviar lance que tem o ID bid-new, vou fazer um post para /admin/match/\"+MATCH_INDEX+\"/videos\n\n```jsx\n$('#video-new').click(function () {\n  $.post(\n    '/admin/match/' + MATCH_INDEX + '/videos',\n    { video: $('#video-id').val() },\n    function (data) {}\n  )\n})\n\n$('bid-new').click(function () {\n  $.post(\n    '/admin/match/' + MATCH_INDEX + '/bids',\n    {\n      time: $('#bit-time').val(),\n      half: $('#bid-half').val(),\n      team: $('#bid-team').val(),\n      subjct: $('bid-subject').val(),\n      description: $('bid-description').val()\n    },\n    function (data) {}\n  )\n})\n```\n\nEnviamos todos esses dados para lá o admin.js e criar a mesma coisa que o router.post do vídeo com a diferença que temos que criar um objeto bid, mudar os nomes e enviar o bid via Socket.IO.\n\n```jsx\nrouter.post('/match/:id/bids', function (req, res, next) {\n  const bid = {\n    time: req.body.time,\n    half: req.body.half,\n    team: req.body.team,\n    subject: req.body.subject,\n    description: req.body.description\n  }\n  db.get('matches[' + req.params.id + ']'.bids)\n    .push(bid)\n    .write()\n  io.to('match-' + req.params.id).emit('bid', bid)\n  res.send(req.body)\n})\n```",
      "keywords": [
        "match",
        "para",
        "supporters",
        "vamos",
        "team",
        "function",
        "video",
        "socket",
        "const",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms",
        "date": "2017-07-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 6,
        "totalChunks": 8,
        "sourcePath": "blog/minicurso-socket-io-parte-4/index.md"
      }
    },
    {
      "id": "548bb6e8b0dc433b",
      "url": "https://devpleno.com/map",
      "title": "High-order Function MAP - DevPleno (Part 2)",
      "content": "console.log(vetor2)\nEssas são algumas ideias do que podemos fazer com o MAP, é bastante interessante utilizar isso porque a gente consegue fazer uma sequência de transformações dos dados que provavelmente consiga resolver boa parte dos problemas nos sistemas convencionais. Lembrando que no caso acima ela é uma função pura porque depende exclusivamente dos parâmetros que vêm pra ela, então isso a deixa mais fácil de ser testada, consequentemente a qualidade do código aumenta.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=High-order%20Function%20MAP&url=https%3A%2F%2Fdevpleno.com%2Fmap) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmap)",
      "description": "Hoje vamos continuar falando sobre programação funcional e High Order Functions, alguns tipos específicos que já vêm com o JavaScript, o primeiro que vamos...",
      "keywords": [
        "item",
        "vetor",
        "nome",
        "mais",
        "categoria",
        "fazer",
        "vetor2",
        "https",
        "para",
        "const"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/map"
      }
    },
    {
      "id": "54b5ca1c4cf21e3e",
      "url": "https://devpleno.com/streams-parte-3-transform",
      "title": "Hands-on: Streams Parte 4 - Transform - DevPleno (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Streams%20Parte%204%20-%20Transform&url=https%3A%2F%2Fdevpleno.com%2Fstreams-parte-3-transform) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fstreams-parte-3-transform)",
      "description": "Continuando nossa série sobre Streams, iremos falar sobre como podemos ligar um readable em um writable e viceversa, e como criamos o tipo Transform. Prime...",
      "keywords": [
        "transform",
        "const",
        "readable",
        "writable",
        "para",
        "stream",
        "pipe",
        "arquivo",
        "zipper",
        "criamos"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/streams-parte-3-transform"
      }
    },
    {
      "id": "54baa532bfbafac8",
      "url": "https://devpleno.com/preconceito-com-js-nao-preparado-para-corporativo",
      "title": "Preconceito com JS? Não preparado para corporativo? - DevPleno (Part 1)",
      "content": "Javascript\n\n## Preconceito com JS? Não preparado para corporativo?\n\nT\nPor Tulio Faria • 10 de novembro de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje quero falar mais um pouco sobre o POO para JavaScript. Basicamente as últimas considerações sobre essa transição e o preconceito que o JavaScript enfrenta.\n\nPor que isso acontece?\n\nPrincipalmente porque o JavaScript já foi muito simples, mas estamos entrando em um mundo onde está sendo padronizado o JavaScript como linguagem front-end e isso é muito bom. Quando falamos do Servidor, também temos essa maturidade da linguagem, principalmente quando grandes empresas como Wallmart começaram a utilizar do javaScript.\n\nOutra coisa que está quebrando essa barreira é o tooling, muitas das ferramentas que utilizamos hoje é construído com o NODE e baseado no NPM.\n\nMas o grande detalhe é, se você está vindo de JAVA, PHP ou qualquer outra linguagem, tente não ter esse preconceito do JavaScript. Não se leve pela simplicidade da linguagem porque ela é bem poderosa.\n\nUma vantagem do que eu vejo hoje e ajuda a quebrar o preconceito é que muitas empresas estão preferindo desenvolvedores JavaScript do que em outras stacks. Um ponto que gostaria de deixar realçado é que o conceito de melhor, pior, certo e errado é muito relativo. Eu aprendi muito isso durante meu mestrado. Hoje eu acredito que algum paradigma mais funcional fica mais elegante dentro do JavaScript, mas é muito difícil colocar pontos. Quanto mais a gente conseguir pensar que essas ferramentas e o que a gente conhece, aumenta a nossa bagagem para saber o que é melhor ou pior naquela situação específica.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje quero falar mais um pouco sobre o POO para JavaScript. Basicamente as últimas considerações sobre essa transição e o preconceito que o JavaScript enfr...",
      "keywords": [
        "javascript",
        "para",
        "https",
        "preconceito",
        "muito",
        "hoje",
        "mais",
        "linguagem",
        "preparado",
        "corporativo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/preconceito-com-js-nao-preparado-para-corporativo"
      }
    },
    {
      "id": "54be41f05a8b0715",
      "url": "https://devpleno.com/blog/termos-de-uso/index",
      "title": "Termos de uso (Part 2)",
      "content": "Os criadores e colaboradores do DevPleno poderão a seu exclusivo critério e em qualquer tempo, modificar ou desativar o site, bem como limitar, cancelar ou suspender seu uso ou o acesso. Também estes Termos de Uso poderão ser alterados a qualquer tempo. Visite regularmente esta página e consulte os Termos então vigentes. Algumas disposições destes Termos podem ser substituídas por termos ou avisos legais expressos localizados em determinadas páginas deste site.\n\n## Erros e falhas\n\nOs documentos, informações, imagens e gráficos publicados neste site podem conter imprecisões técnicas ou erros tipográficos. Em nenhuma hipótese o DevPleno e/ou seus respectivos fornecedores serão responsáveis por qualquer dano direto ou indireto decorrente da impossibilidade de uso, perda de dados ou lucros, resultante do acesso e desempenho do site, dos serviços oferecidos ou de informações disponíveis neste site. O acesso aos serviços, materiais, informações e facilidades contidas neste website não garante a sua qualidade.\n\n## Limitação da responsabilidade\n\nOs materiais são fornecidos neste website sem nenhuma garantia explícita ou implícita de comercialização ou adequação a qualquer objetivo específico. Em nenhum caso o DevPleno ou os seus colaboradores serão responsabilizados por quaisquer danos, incluindo lucros cessantes, interrupção de negócio, ou perda de informação que resultem do uso ou da incapacidade de usar os materiais. O DevPleno não garante a precisão ou integridade das informações, textos, gráficos, links e outros itens dos materiais.  \nODevPleno não se responsabiliza pelo conteúdo dos artigos e informações aqui publicadas, uma vez que os textos são de autoria de terceiros e não traduzem, necessariamente, a opinião do website.  \nO DevPleno tampouco é responsável pela violação de direitos autorais decorrente de informações, documentos e materiais publicados neste website, comprometendo-se a retirá-los do ar assim que notificado da infração.",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "acesso",
        "termos",
        "servi",
        "website",
        "para",
        "direitos"
      ],
      "metadata": {
        "title": "Termos de uso",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "blog/termos-de-uso/index.md"
      }
    },
    {
      "id": "54d4cb2b1a8394d1",
      "url": "https://devpleno.com/blog/falsy-e-truthy-values/index",
      "title": "Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS (Part 1)",
      "content": "Hoje eu gostaria de falar sobre um assunto que surgiu nos comentários do vídeo sobre [short-circuit e valores padrão](https://www.devpleno.com/short-circuit-e-valores-padrao/).\n\nEu não comentei sobre que valores são convertidos para verdadeiro ou falso porque, na verdade, eu não sabia que eram chamados de falsy e truthy values, então quero trazer essa racionalização. O exemplo que tínhamos feito era:\n\n```jsx\nlet a = null\n\nlet b = a || 'teste'\n```\n\nQuando eu passo o valor e o operador ou é atribuído o valor padrão. Existe uma série de valores que fazem ele retornar false e consequentemente ele traria o valor padrão 'teste', alguns desses valores são 'null', uma string vazia ' ', o 'false' em si, undefined, que seria o caso de uma entrada no express, outro valor considerado ou convertido para false é o Zero 'o' e um último é o NaN.\n\nExiste uma situação, que está documentada no site da mozilla, que é o (document.all)[1]. Ele é bastante utilizado para verificar navegadores antigos, mas vamos focar nos anteriores principalmente para o Node.\n\nEm contrapartida, temos tudo que não são valores passados anteriormente, nesse caso seria retornado o valor 'true', por exemplo:\n\n```jsx\nlet c = true\n```\n\nOutros valores considerados truthy seriam por exemplo {}, que seria um objetct, um array [], um número qualquer, uma string com algo dentro 'test' , um new Date(), um número negativo, float e uma constant em JavaScript (Infinity), que também retornaria True. Por esse motivo em alguns condicionais, como por exemplo:\n\n```jsx\n{\n  comments && comments.map()\n}\n```\n\nVai retornar true porque ele é um object, já que podemos iterar sobre os comments, porém se comments for undefined ou algum valor falso que a gente não consiga iterar no Map, ele não executa a instrução. Por esse motivo é interessante que a gente saiba os valores possíveis. Uma observação importante, se nós fizemos a conversão para apenas um, por exemplo:\n\n```jsx\nconsole.log(42 == true)\n```",
      "keywords": [
        "valores",
        "para",
        "true",
        "valor",
        "exemplo",
        "sobre",
        "https",
        "retornar",
        "false",
        "comments"
      ],
      "metadata": {
        "title": "Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS",
        "date": "2017-08-07",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "TRUTHY-VALUES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/falsy-e-truthy-values/index.md"
      }
    },
    {
      "id": "54ebac1cd710a324",
      "url": "https://devpleno.com/como-cobrar-por-software",
      "title": "Como cobrar por Software - DevPleno (Part 2)",
      "content": "Também precisa em sua disponibilidade. Hoje você tem tempo disponível para executar o projeto? Por exemplo, se você trabalha com HTML e todas suas horas estão ocupadas, isso significa que você é bom nesta especialidade (oferta e demanda), logo esta sua hora é um pouco mais cara, pois ao invés de jogar videogame em suas poucas horas disponíveis, você vai estar programando. Porém é preciso tomar cuidado com o viés da sobrevivência, às vezes sua disponibilidade está alta, mas não porque você é ruim, mas sim porque você está entre um projeto e outro.\nQual o valor agregado desta sua hora?\nQuanto sua hora rende? Às vezes você é muito bom e cobra, por exemplo. R$100,00 e um profissional mediano que não renderia tanto cobra R$150,00, neste caso sua hora está desvalorizada, pois sua ela rende mais que a dele. Se você tem experiência e consegue resolver mais rápido e com mais eficiência, então o valor agregado à sua hora é maior. Ao final qual o resultado dessa sua hora aplicada? Vai fazer uma diferença muito grande no projeto? Se sim, sua hora também vai ser mais cara.\n\n**Isso é tudo?**\n\nPrecisa pensar também quais são os custos que algumas vezes você não enxerga: Internet, telefone, luz ou algum outro serviço. Quais são os custos que impactam nesse valor da sua hora? Quais os impostos deve pagar? (Sua hora pode R$100,00, mas você esquece de que, dependendo da situação, precisa pagar de 7 a 18% de imposto, então acaba recebendo R$82,oo. Concorda?)\nÉ importante que defina uma porcentagem de lucro. Quando você vai conseguir contratar alguém? Quando você tiver uma hora bem paga, conseguirá pagar o funcionário e ter um lucro não envolvendo sua hora?",
      "description": "Para precificar software, alguns fatores devem ser levados em consideração e você deve responder algumas perguntas a si mesmo. Confira: O que você está ven...",
      "keywords": [
        "hora",
        "para",
        "valor",
        "mais",
        "horas",
        "muito",
        "projeto",
        "ncia",
        "exemplo",
        "https"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/como-cobrar-por-software"
      }
    },
    {
      "id": "553a8f6d51d4ce6f",
      "url": "https://devpleno.com/blog/ferramentas-visuais-para-flexbox/index",
      "title": "Ferramentas Visuais para Flexbox (Part 2)",
      "content": "E a terceira e ultima ferramenta é o visual **Guide to CSS3 flexbox.**\n\n[https://demos.scotch.io/visual-guide-to-css3-flexb](https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/)\n\n[ox-flexbox-playground/demos/](https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/)\n\n![Resultados](3bae047d-f9c3-4f6f-958e-cb024ac769e2.png)\n\nNele, podemos mudar a largura de todos os Box, e também modificar dentro de cada Box, mais ou menos como nas outras duas ferramentas.\n\nConfira mais detalhes no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Puz6RHPQ_uM\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "flexbox",
        "https",
        "como",
        "demos",
        "layout",
        "isso",
        "temos",
        "ferramentas",
        "ferramenta",
        "mudar"
      ],
      "metadata": {
        "title": "Ferramentas Visuais para Flexbox",
        "date": "2017-05-05",
        "tags": "['Javascript']",
        "thumbnail": "FerramentasVisuais.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/ferramentas-visuais-para-flexbox/index.md"
      }
    },
    {
      "id": "553f86e4c46b8972",
      "url": "https://devpleno.com/code-fights-metro-card",
      "title": "code fights - Metro Card - DevPleno (Part 2)",
      "content": "const days = {\nmonths.forEach((elem, index) => {\nif(elem === lastNumberOfDays){\nconsole.log(months[(index+1)%12])\n}\n})\n}\nAgora podemos criar um key utilizando o número do dia e retornar o nosso object com as keys. Além disso, essa chave trás strings, precisamos retornar inteiros para garantir que o sort vai ordenar ele como queríamos:\n\nconst days = {\nmonths.forEach((elem, index) => {\nif(elem === lastNumberOfDays) {\ndays[months[(index+1)%12] = 1]\n}\n})\n\nreturn Object\n.keys(days)\n.map( item => parseInt(item))\n.sort()\n}\n\nEle é uma estrutura de dados muito comum. Além disso, vimos a estratégia de como resolver a parte cíclica. Quanto mais olharmos abordagens diferentes, mais preparados vamos estar para resolver esses problemas.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=code%20fights%20-%20Metro%20Card&url=https%3A%2F%2Fdevpleno.com%2Fcode-fights-metro-card) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcode-fights-metro-card)",
      "description": "Hoje vamos resolver mais um problema que está disponível no Code Fights. Esse problema é chamado de metro card. Pode parecer simples, mas tem algumas coisa...",
      "keywords": [
        "months",
        "metro",
        "lastnumberofdays",
        "elem",
        "index",
        "https",
        "card",
        "problema",
        "retornar",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/code-fights-metro-card"
      }
    },
    {
      "id": "55abd421fc8d3859",
      "url": "https://devpleno.com/blog/tomar-decisoes/index",
      "title": "Tomar decisões (Part 1)",
      "content": "Você costuma tomar decisões necessárias ou espera ter tudo na sua mão?\n\nIndependente se você está em um cargo de liderança ou se é liderado, é muito importante tomar algumas decisões, nem que sejam microdecisões.\n\nSe você for um liderado, precisa ajudar o seu líder, mesmo que sejam microdecisões. Estudar as alternativas e explicar o porquê delas serem as melhores para sua equipe facilita para seu líder tomar a decisão correta.\n\nNa minha empresa, somos o braço direito em algumas outras empresas, ajudamos a desenrolar essa parte tecnológica, então elas acham que qualquer decisão que envolvam um software depende da gente, com isso a empresa inteira fica enroscada porque as pessoas não querem tomar decisão, tem medo ou algo do tipo. A postura que eu acredito que funcione mais é se a decisão está no seu ambiente, se você sabe resolver, tem a informação para resolver e consigue fazer, por que não faz?\n\nÀs vezes é algo muito simples, mas as pessoas complicam, com isso a produtividade da empresa como um todo vai para baixo.\n\nPara uma empresa mais produtiva, as pessoas têm que assumir mais esses riscos. Quando você é liderado, assuma mais riscos, não precisa ser inconsequente, mas comece a tomar decisões.\n\nQuanto mais decisões você tomar, mais treinado você vai estar para tomar decisões. Já se você é o líder, existe a contrapartida, às vezes você concentra em você e não quer que sua equipe tome decisões porque você tem medo de algo dar errado e você ser o responsável, aí vem a outra dica: você tem que treinar sua equipe a tomar decisões também, ajudar você a organizar isso, porque se concentrar tudo em você, vai ser o cara que vai atrasar a equipe, afinal vai ser tanta decisão para se tomar que as microdecisões, que as pessoas poderiam tomar, não vão ser feitas porque você não deixa.",
      "keywords": [
        "decis",
        "para",
        "tomar",
        "mais",
        "equipe",
        "porque",
        "empresa",
        "isso",
        "pessoas",
        "algo"
      ],
      "metadata": {
        "title": "Tomar decisões",
        "date": "2017-08-08",
        "tags": "['Carreira']",
        "thumbnail": "TomarDecisao.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/tomar-decisoes/index.md"
      }
    },
    {
      "id": "560af05084d9a8ad",
      "url": "https://devpleno.com/blog/entrevista-com-edy-segura/index",
      "title": "DevPleno Entrevista - Edy Segura (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "gradua",
        "cnico",
        "isso",
        "fazer",
        "fora",
        "ingl",
        "embed",
        "tamb",
        "come"
      ],
      "metadata": {
        "title": "DevPleno Entrevista - Edy Segura",
        "date": "2017-08-03",
        "tags": "['Carreira']",
        "thumbnail": "entrevista-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/entrevista-com-edy-segura/index.md"
      }
    },
    {
      "id": "560e5ecd5f3234bc",
      "url": "https://devpleno.com/blog/streams-parte-3-transform/index",
      "title": "Hands-on: Streams Parte 4 - Transform (Part 1)",
      "content": "Continuando nossa série sobre Streams, iremos falar sobre como podemos ligar um readable em um writable e vice-versa, e como criamos o tipo Transform. Primeiramente, para linkarmos um stream a outro, temos que importar o fs. Em seguida, criamos os Streams que vão ser linkados, por exemplo:\n\n```jsx\nconst fs = require('fs')\nconst readable = fs.createReadStream('arquivo.txt')\nconst writable = fs.createWritableStream('arquivo-2.txt')\nreadable.pipe(writable)\n```\n\nCom isso, estamos vinculando o on data do Readable com o Write do Stream Writable. Ao executar o código acima, criaremos uma cópia do arquivo.txt.\n\n**Para que serve o Pipe?**\n\nO Pipe permite criar a saída de um Stream com a entrada de outro, o readable, que somente envia dados com o writable, que apenas recebe dados. Podemos utilizar vários Pipes de uma vez, como por exemplo:\n\n```jsx\nconst fs = require('fs')\nconst zlib = require('zlib')\nconst readable = fs.createReadStream('arquivo.txt')\nconst writable = fs.createWritableStream('arquivo-2.txt')\nconst zipper = zlib.createGzip()\nreadable.pipe(zipper).pipe(writable)\n```\n\nCom a execução do código, iremos pegar esta saída do readable, jogar na entrada do zipper e a saída do zipper adicionando em writable. Lembrando que zlib já faz parte do core do Node, com isso é possível compactar usando apenas o mesmo.\n\n**O que o Zipper faz?**\n\nO Zipper é um Stream do tipo Transform, basicamente ele transforma a entrada em uma saída utilizando pipe. Podemos transformar estes dados a medida que utilizamos este pipe. É interessante que o readable seja a entrada e o Writable seja a saída. Vamos a outro exemplo para que fique mais claro:",
      "keywords": [
        "const",
        "readable",
        "transform",
        "writable",
        "para",
        "stream",
        "pipe",
        "arquivo",
        "zipper",
        "criamos"
      ],
      "metadata": {
        "title": "Hands-on: Streams Parte 4 - Transform",
        "date": "2017-05-10",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/streams-parte-3-transform/index.md"
      }
    },
    {
      "id": "564ebc93ef24ba22",
      "url": "https://devpleno.com/blog/algoritmos-xor-swap/index",
      "title": "Vídeo sobre Algoritmos: XOR Swap",
      "content": "O XOR é um operador bem versátil e uma coisa que gosto bastante é de estudar e analisar formas alternativas de utilização destes operadores. Neste vídeo mostro como é possível usar o XOR para trocar variáveis de lugar além de explorar o porquê isso acontece. Confira!\n\n## Confira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/5E_1usjXc_E\" allowfullscreen></iframe>\n</div>\n\nE Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "https",
        "para",
        "confira",
        "responsive",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "operador"
      ],
      "metadata": {
        "title": "Vídeo sobre Algoritmos: XOR Swap",
        "date": "2017-03-31",
        "tags": "['Algoritmos']",
        "thumbnail": "MINIATURA-ALGORITMOS-XOR-SWAP-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/algoritmos-xor-swap/index.md"
      }
    },
    {
      "id": "565b2439940545c1",
      "url": "https://devpleno.com/handlebars-template-html-simples",
      "title": "Template HTML simples - Hands-on Handlebars - DevPleno (Part 4)",
      "content": "[](https://twitter.com/intent/tweet?text=Template%20HTML%20simples%20-%20Hands-on%20Handlebars&url=https%3A%2F%2Fdevpleno.com%2Fhandlebars-template-html-simples) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhandlebars-template-html-simples)",
      "description": "O Handlebars é uma forma de lidarmos com template HTML. É algo simples, mas que possui diversas opções que podemos fazer. Vou mostrar um caso bem específic...",
      "keywords": [
        "script",
        "strong",
        "html",
        "name",
        "handlebars",
        "people",
        "https",
        "template",
        "lastname",
        "function"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/handlebars-template-html-simples"
      }
    },
    {
      "id": "566cc6d3cd8d2f47",
      "url": "https://devpleno.com/expressoes-regulares",
      "title": "3 Padrões para Iniciar com Expressões Regulares (RegExp) - DevPleno (Part 1)",
      "content": "Javascript\n\n## 3 Padrões para Iniciar com Expressões Regulares (RegExp)\n\nT\nPor Tulio Faria • 21 de agosto de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje venho trazer três padrões de expressões regulares que você pode utilizar para checar se uma string parece com algo. O que é expressão regular? É uma forma que temos de tentar achar um padrão dentro de um texto.\n\nAgora vou mostrar como funciona uma expressão regular utilizando três formas que são muito úteis para checar se uma string começa com alguma coisa, se ela termina com alguma coisa ou se no meio dela tem algo que pode ser alternado:\n\nconst str1 = 'Olá DevPleno'\n\nconst pattern1 = new RegExp('^Ol')\n\nconsole.log(pattern1.test(str1))\nToda vez que eu uso, dentro da expressão regular, o circunflexo, eu indico que estou travando o início da string. Por exemplo, se eu quero saber se a string começa com “Olá” basta criar a expressão baseada em “Ol”. Nesse nosso caso será retornado True, pois ele começa com “Ol”. O segundo padrão que vou mostrar é quando terminamos com outro padrão:\n\nconst pattern2 = new RegExp('DevPleno$')\n\nconsole.log(pattern2.test(str1))\nAssim ele irá retornar o True novamente, pois ele termina com “DevPleno”, caso a gente modifique e coloque, por exemplo, um ‘s’ no fim da string vai ser retornado false. Lembrando que travamos o fim da string utilizando o $.\n\nAgora o último padrão. Imagine o seguinte: se quiséssemos encontrar um padrão no meio, utilizando ou um ou outro:\n\nconst str1 = 'Olá oi DevPleno'\n\nconst pattern3 = new RegExp('Olá (oi|tchau) DevPleno')\n\nconsole.log(\n'====' ,\npattern3.test('Olá Mundo')\npattern3.test('Olá oi DevPleno')\npattern3.test('Olá tchau DevPleno')\npattern3.test('Olá opa DevPleno')\n)\nPerceba que temos false para o primeiro, true para o segundo, true para o terceiro e false para o último. Esses são padrões que já podemos combinar entre eles, por exemplo, começar com o “Olá” e terminar com o “DevPleno”.",
      "description": "Hoje venho trazer três padrões de expressões regulares que você pode utilizar para checar se uma string parece com algo. O que é expressão regular? É uma f...",
      "keywords": [
        "devpleno",
        "para",
        "padr",
        "express",
        "string",
        "test",
        "https",
        "regexp",
        "const",
        "pattern3"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/expressoes-regulares"
      }
    },
    {
      "id": "56b24f26886a2dcd",
      "url": "https://devpleno.com/orientacao-objeto",
      "title": "Sou contra a orientação-objetos (OO)? - DevPleno (Part 1)",
      "content": "Javascript\n\n## Sou contra a orientação-objetos (OO)?\n\nT\nPor Tulio Faria • 19 de setembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje eu queria responder uma pergunta que sempre me fazem: “Tulio, você é contra orientação-objetos?”\n\nPrimeiramente, eu não sou contra orientação-objetos. Se pegarmos linguagens como JAVA, é um paradigma interessante.\n\nCoisas que eu não gosto em orientação-objeto:\n\nNós temos muito Pattern. A “Patternite”, como eu costumo brincar, faz com a a gente utilize o Pattern às vezes antes do tempo, aplicamos de forma prematura. E quando você começa a usar muito isso sem ter a concepção do seu sistema bem definida, pode ser que você comece a ter problemas de abstração, então sempre vai ter algo que não encaixa direito dentro da arquitetura.\n\nVoltando para a programação funcional, quando trazemos muitos Patterns e conceitos para a programação funcional, também temos esse problema, já que estamos abstraindo demais no começo. É Interessante lembrar que a menor unidade de código que temos dentro do JavaScript é a função. Quando a gente replica uma característica de orientação-objeto dentro de uma programação funcional é o que eu acho estranho, já que não precisamos necessariamente criar uma classe dentro do JavaScript, apesar de conseguirmos.\n\nEntão eu não sou contra a orientação-objetos em si, e sim aplicá-la demais em cima de uma linguagem funcional. A minha dica pra você é: tente não organizar demais de começo, senão vai começar a classificar coisas de maneira errada, já que vão ser classificadas em um estágio muito prematuro do projeto.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje eu queria responder uma pergunta que sempre me fazem: “Tulio, você é contra orientaçãoobjetos?” Primeiramente, eu não sou contra orientaçãoobjetos. Se...",
      "keywords": [
        "orienta",
        "https",
        "javascript",
        "objetos",
        "contra",
        "objeto",
        "come",
        "dentro",
        "funcional",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/orientacao-objeto"
      }
    },
    {
      "id": "57228e3d761aa9c4",
      "url": "https://devpleno.com/tenha-cicatrizes",
      "title": "Tenha cicatrizes - DevPleno (Part 2)",
      "content": "Essas cicatrizes que marcam sua carreira é o que vai fazer você crescer cada vez mais. Sempre levar cicatrizes para que você realmente evolua na sua carreira. Eu ouvi isso em um processo seletivo onde disseram que precisam de gente que tem cicatrizes, ou seja, tenham passado por esses problemas, virado madrugada, batido no teto da zona de conforto e teve que se destacar de alguma maneira.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Tenha%20cicatrizes&url=https%3A%2F%2Fdevpleno.com%2Ftenha-cicatrizes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftenha-cicatrizes)",
      "description": "Na dica de carreira de hoje, eu quero explicar porque é tão bom e útil pra gente ter ",
      "keywords": [
        "cicatrizes",
        "mais",
        "carreira",
        "para",
        "https",
        "construir",
        "tenha",
        "isso",
        "fazer",
        "porque"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/tenha-cicatrizes"
      }
    },
    {
      "id": "5796f64ca6e62774",
      "url": "https://devpleno.com/blog/19",
      "title": "Blog - Página 19 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 12 de mai. de 2017 Hands-on - Socket.io Parte 2](/socket-io-parte2)\n\n[Javascript 11 de mai. de 2017 Low-DB - Banco de dados para NodeJS baseado em JSON](/low-db)\n\n[Javascript 11 de mai. de 2017 Comunicação em tempo-real com Node e Socket.io](/socket-io-parte1)\n\n[Javascript 10 de mai. de 2017 Hands-on: Streams Parte 03 - Duplex](/stream-duplex)\n\n[Javascript 10 de mai. de 2017 Hands-on: Streams Parte 4 - Transform](/streams-parte-3-transform)\n\n[Javascript 9 de mai. de 2017 PKG - Transforme seu aplicativo Node em executável](/hands-on-pkg)\n\n[Javascript 9 de mai. de 2017 Hands-on: Streams Parte 2 - Writable](/stream-parte-2-writable)\n\n[Javascript 8 de mai. de 2017 Generators: O que há \"por baixo dos panos\"](/generators-o-que-ha-por-baixo-dos-panos)\n\n[Javascript 8 de mai. de 2017 Hands-on: Ler arquivo linha a linha](/hands-ler-arquivo-linha-linha)\n\n[Javascript 8 de mai. de 2017 Hands-on: Readline](/hands-on-readline)\n\n[Javascript 8 de mai. de 2017 Listar arquivos em JS (async, await, promise e Promise.all)](/listar-arquivos-em-js)\n\n[Carreira 8 de mai. de 2017 Novas Skills: O preço que tem que ser pago](/nova-skills-preco-que-tem-que-ser-pago)\n\n[Anterior](/blog/18)19 / 26[Próxima](/blog/20)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "hands",
        "parte",
        "socket",
        "streams",
        "linha",
        "arquivo",
        "blog",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/19"
      }
    },
    {
      "id": "57cbf0a63e4a45ad",
      "url": "https://devpleno.com/hands-on-yarn",
      "title": "Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM) - DevPleno (Part 1)",
      "content": "Javascript\n\n## Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM)\n\nT\nPor Tulio Faria • 10 de agosto de 2017\n\n[Javascript](/tag/javascript)\n\nO ‘Yarn’ é uma maneira que temos de agilizar a instalação de algumas dependências. É uma alternativa ao NPM, um pouco mais rápido. A primeira coisa que temos que fazer é instalar:\n\nnpm install -g yarn\nO Yarn usa o mesmo package.json que já temos no projeto em JavaScript e não adiciona nenhuma outra dependência, vai ser usado exatamente o mesmo repositório que o NPM já roda.\n\n**Qual a vantagem do Yarn?** Uma das vantagens do Yarn é ele ser mais rápido, tende a resolver alguns conflitos de versão de módulo, cria um cash local para, por exemplo, caso você já tenha utilizado algum módulo qualquer com Yarn, aquela versão específica do módulo fica salva na sua máquina, caso você precise usar em outro projeto, ele utiliza do cash e não precisa baixar um novo. Além disso, ele resolve algumas coisas interessantes, por exemplo, é muito comum fazermos:\n\nnpm install nome-do-pacote\nQuando fazemos isso, não adicionamos o pacote no package.json e isso gera um problema, nós podemos fazer um comid e em seguida um push para o git e quebrar na máquina de um outro desenvolvedor ou servidor porque na sua máquina vai rodar e quando chegar em outro computador, vai dar erro. Uma das coisas que o Yarn resolve é exatamente isso, não temos essa distinção de save ou não, se você adicionou um pacote, ele vai entrar no package.json. Vamos fazer um teste de velocidade. Eu criei um projeto onde só tem o package.json e só adiciona o async, primeiramente vamos fazer o npm:\n\nnpm install\nA instalação demorou mais ou menos 6 segundos, não demorou tanto, agora vou deletar o node_modules e instalar via yarn:\n\nyarn\nO tempo de instalação foi de 3.39 segundos",
      "description": "O ",
      "keywords": [
        "yarn",
        "isso",
        "https",
        "depend",
        "fazer",
        "projeto",
        "para",
        "javascript",
        "ncias",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-on-yarn"
      }
    },
    {
      "id": "57ebee9e38409e8a",
      "url": "https://devpleno.com/blog/operacao-de-busca/index",
      "title": "Árvore Binária de Busca - Operação de Busca (Part 2)",
      "content": "Finalizamos todas as operações em árvore, visitar em pré order, in order e pós order, inserção e a busca em si que é muito utilizada.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/UqM6GFlnaOE\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "arvore",
        "rvore",
        "value",
        "tree",
        "valor",
        "busca",
        "https",
        "console",
        "devpleno",
        "insert"
      ],
      "metadata": {
        "title": "Árvore Binária de Busca - Operação de Busca",
        "date": "2017-07-04",
        "tags": "['Algoritmos']",
        "thumbnail": "ArvoreBinaria.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/operacao-de-busca/index.md"
      }
    },
    {
      "id": "5825a1f72c9c0a11",
      "url": "https://devpleno.com/blog/sobre-o-devpleno/index",
      "title": "Sobre o DevPleno (Part 1)",
      "content": "Olá, tudo bem? Meu nome é Tulio Faria e sou o criador do DevPleno, e com certeza você já se perguntou:\n\n- Como posso ser um desenvolvedor melhor?\n- Como aprender as tecnologias que fazem a diferença para sua carreira?\n- Como posso cada vez ser mais valorizado em minha profissão?\n- Como viver de desenvolvimento de software mesmo morando no interior?\n- Como entregar resultados através de meus projetos?\n\nSe você já se fez pelo menos uma destas perguntas, você está no lugar certo!\n\n## Agora, leia a seguir como o DevPleno irá lhe ajudar a melhorar sua vida e sua carreira\n\nComo você bem sabe, uma das carreiras mais cobiçadas atualmente envolvem trabalhar com tecnologia. Toda empresa já é dependente de software em algum ponto de suas atividades. Tornando o desenvolvedor uma peça chave em todo modelo de negócios.\n\n### Mas sabe o que eu vejo como o mais problemático para a profissão?\n\nO ensino convencional ainda não consegue preparar um desenvolvedor 100% para o mercado de trabalho. Seja para trabalhar em outras empresas, seja para abrir o seu próprio negócio. Ainda falta alguns pontos muito importantes para a formação ser plena:\n\n- Conhecimento e prática em tecnologias de mercado\n- Uso de processos que ajudam a entregar mais qualidade e resultados\n- Conhecimento de mercado para alavancar a carreira e projetos\n- E essa lista só está começando, vou aprofundar mais a respeito durante o restante do texto.\n\nAnalisando este cenário, vi que precisava fazer algo. Afinal, eu mesmo já aprendi muito na prática. Já é mais de uma década sofrendo e aprendendo com meus próprios erros e eu seria muito egoísta se guardasse isso apenas para mim. Foi aí que reacendeu um vontade muito forte e que acabou virando meu propósito de vida: Preciso ajudar as pessoas a passarem mais facilmente por tudo que já passei! E serem felizes como hoje me considero ser 🙂\n\nBingo! Nunca estive tão motivado a começar algo como o DevPleno que impacta diretamente a vida de tantas pessoas!",
      "keywords": [
        "para",
        "como",
        "mais",
        "minha",
        "devpleno",
        "muito",
        "isso",
        "cada",
        "meus",
        "projetos"
      ],
      "metadata": {
        "title": "Sobre o DevPleno",
        "date": "2017-03-15",
        "tags": "['Carreira']",
        "thumbnail": "tulio.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/sobre-o-devpleno/index.md"
      }
    },
    {
      "id": "584fa5e54c96b0eb",
      "url": "https://devpleno.com/blog/socket-io-parte1/index",
      "title": "Comunicação em tempo-real com Node e Socket.io (Part 2)",
      "content": "```jsx\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\napp.get('/', (req, res) => {\n  res.sendFile(\n    \\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_dirname + '/index.html'\n  )\n})\n```\n\nMas não temos o index.html, certo? Então vamos criar um novo arquivo index.html, dentro dele você vai perceber algo interessante do socket.io, ele é um módulo que já vem com a parte server e a parte client, com isso é possível fazer um src chamando o socket.io. Irá funcionar porque já injetamos no http para disponibilizar na aplicação. Em seguida vamos instanciar o módulo\n\n```jsx\n<html>\n  <body>\n    <h1>Socket.io</h1>\n    <script src='/socket.io/socket.io.js'></script>\n    <script>const socket = io()</script>\n  </body>\n</html>\n```\n\nSe olharmos no inspect do browser e irmos em network, podemos perceber que ele já começou uma conexão e websocket. Assim, podemos saber, por exemplo, se algum cliente conectou apenas adicionando no server.js um callback para quando ele se conectar:\n\n```jsx\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\napp.get('/', (req, res) => {\n  res.sendFile(\n    \\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_dirname + '/index.html'\n  )\n})\nio.on('connection', (socket) => {\n  console.log('New connection', socket)\n})\n```\n\n**O que aconteceu?**\n\nO Socket.io tem o socket que é uma instância da conexão que criamos para o usuário, com isso podemos mandar uma mensagem de volta, logar o usuário por exemplo. Basicamente se eu mandar algo para este socket, esse algo irá somente para este cliente. Mas temos opções no socket.io de mandar só para um cliente ou vários.",
      "keywords": [
        "socket",
        "para",
        "http",
        "const",
        "require",
        "vamos",
        "html",
        "express",
        "temos",
        "conex"
      ],
      "metadata": {
        "title": "Comunicação em tempo-real com Node e Socket.io",
        "date": "2017-05-11",
        "tags": "['Javascript']",
        "thumbnail": "Socket.IO1.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/socket-io-parte1/index.md"
      }
    },
    {
      "id": "586151c15b77c7df",
      "url": "https://devpleno.com/nodejs-primeiros-passos-promises",
      "title": "Vídeo sobre NodeJS com Promises - DevPleno",
      "content": "Javascript\n\n## Vídeo sobre NodeJS com Promises\n\nT\nPor Tulio Faria • 12 de julho de 2016\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nNeste vídeo vamos organizar o código assíncrono para facilitar a manutenção posterior do código. Evitando que o código “cresça para frente” :)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=V%C3%ADdeo%20sobre%20NodeJS%20com%20Promises&url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-promises) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-promises)",
      "description": "Neste vídeo vamos organizar o código assíncrono para facilitar a manutenção posterior do código. Evitando que o código &#34;cresça para frente&#34; :) <div classNa...",
      "keywords": [
        "https",
        "javascript",
        "nodejs",
        "promises",
        "digo",
        "para",
        "fundamentos",
        "devpleno",
        "facebook",
        "2fdevpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/nodejs-primeiros-passos-promises"
      }
    },
    {
      "id": "5885989b059362ec",
      "url": "https://devpleno.com/dica-injecao-de-dependencia-com-destructuring-assignament",
      "title": "Dica: Injeção de dependência com Destructuring Assignament - DevPleno",
      "content": "Javascript\n\n## Dica: Injeção de dependência com Destructuring Assignament\n\nT\nPor Tulio Faria • 7 de março de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nUma maneira de injetar dependências, que permite uma organização ainda maior do código, é utilizando o Destructuring Assignament. Neste vídeo mostro como utilizar as 2 técnicas.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Inje%C3%A7%C3%A3o%20de%20depend%C3%AAncia%20com%20Destructuring%20Assignament&url=https%3A%2F%2Fdevpleno.com%2Fdica-injecao-de-dependencia-com-destructuring-assignament) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-injecao-de-dependencia-com-destructuring-assignament)",
      "description": "Uma maneira de injetar dependências, que permite uma organização ainda maior do código, é utilizando o Destructuring Assignament. Neste vídeo mostro como u...",
      "keywords": [
        "https",
        "destructuring",
        "assignament",
        "javascript",
        "dica",
        "depend",
        "fundamentos",
        "nodejs",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-injecao-de-dependencia-com-destructuring-assignament"
      }
    },
    {
      "id": "58c6e13a500f1583",
      "url": "https://devpleno.com/abaixar-a-guarda",
      "title": "Porque você não deve abaixar a guarda - DevPleno",
      "content": "Carreira\n\n## Porque você não deve abaixar a guarda\n\nT\nPor Tulio Faria • 11 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nA dica de carreira de hoje é sobre apoio. Muitas vezes você está fazendo um projeto na faculdade, por exemplo, e todo mundo fica dizendo coisas boas sobre ele, dizendo que você vai ficar muito rico e coisas do tipo… É muito legal quando as pessoas te motivam e você quando recebe essa energia, mas dependendo do tipo de apoio, você vai abaixar sua guarda. Isso significa que você fica mais suscetível a errar e não estar preparado a entrar no mercado.\n\nVamos supor que você está criando um App e todo mundo só fala bem, o risco disso é você começar a parar de ser crítico com você mesmo. O grande exercício que eu gosto de fazer quando eu estou criando algo é o **“what if”**, e se a opinião dessas pessoas não está viciada, ou e se eles estão querendo me agradar? Esse é o perigo, quando você abaixa a guarda, está desprotegido e para de fazer o **“what if”** porque todos a sua volta estão aprovando essa ideia, porém elas não são o mercado como um todo e sim uma parte muito pequena.\n\nEntão minha dica é, independente se você está recebendo menos ou mais apoio, valide bastante sua ideia, pesquise com pessoas que não tem o viés, ou seja, não tem essa opinião muito pessoal sobre o assunto, assim você não abaixa a guarda e não entra despreparado para o mercado de trabalho.\n\nCurta o DevPleno no [Facebook](https://www.facebook.com/devpleno),[inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Porque%20voc%C3%AA%20n%C3%A3o%20deve%20abaixar%20a%20guarda&url=https%3A%2F%2Fdevpleno.com%2Fabaixar-a-guarda) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fabaixar-a-guarda)",
      "description": "A dica de carreira de hoje é sobre apoio. Muitas vezes você está fazendo um projeto na faculdade, por exemplo, e todo mundo fica dizendo coisas boas sobre ...",
      "keywords": [
        "guarda",
        "https",
        "carreira",
        "muito",
        "quando",
        "porque",
        "sobre",
        "apoio",
        "todo",
        "pessoas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/abaixar-a-guarda"
      }
    },
    {
      "id": "58d0318cbda6dd81",
      "url": "https://devpleno.com/termos-de-uso",
      "title": "Termos de uso - DevPleno (Part 2)",
      "content": "O acesso ao site DevPleno é gratuito. O DevPleno poderá criar áreas de acesso exclusivo aos seus clientes ou para terceiros especialmente autorizados.\n\nOs criadores e colaboradores do DevPleno poderão a seu exclusivo critério e em qualquer tempo, modificar ou desativar o site, bem como limitar, cancelar ou suspender seu uso ou o acesso. Também estes Termos de Uso poderão ser alterados a qualquer tempo. Visite regularmente esta página e consulte os Termos então vigentes. Algumas disposições destes Termos podem ser substituídas por termos ou avisos legais expressos localizados em determinadas páginas deste site.\n\n## Erros e falhas\n\nOs documentos, informações, imagens e gráficos publicados neste site podem conter imprecisões técnicas ou erros tipográficos. Em nenhuma hipótese o DevPleno e/ou seus respectivos fornecedores serão responsáveis por qualquer dano direto ou indireto decorrente da impossibilidade de uso, perda de dados ou lucros, resultante do acesso e desempenho do site, dos serviços oferecidos ou de informações disponíveis neste site. O acesso aos serviços, materiais, informações e facilidades contidas neste website não garante a sua qualidade.\n\n## Limitação da responsabilidade\n\nOs materiais são fornecidos neste website sem nenhuma garantia explícita ou implícita de comercialização ou adequação a qualquer objetivo específico. Em nenhum caso o DevPleno ou os seus colaboradores serão responsabilizados por quaisquer danos, incluindo lucros cessantes, interrupção de negócio, ou perda de informação que resultem do uso ou da incapacidade de usar os materiais. O DevPleno não garante a precisão ou integridade das informações, textos, gráficos, links e outros itens dos materiais.\n\nODevPleno não se responsabiliza pelo conteúdo dos artigos e informações aqui publicadas, uma vez que os textos são de autoria de terceiros e não traduzem, necessariamente, a opinião do website.",
      "description": "Estes termos de serviço regulam o uso deste site. Ao acessálo você concorda com estes termos. Por favor, consulte regularmente os nossos termos de serviço....",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "termos",
        "servi",
        "website",
        "acesso",
        "para",
        "direitos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/termos-de-uso"
      }
    },
    {
      "id": "58edb218540b9e5a",
      "url": "https://devpleno.com/blog/10-dicas-de-produtividade-para-programadores/index",
      "title": "10 dicas de produtividade para programadores (Part 4)",
      "content": "Um [estudo](https://www.uq.edu.au/news/article/2014/09/leafy-green-better-lean?utm_source=blog&utm_campaign=rc_blogpost) da Universidade de Queensland, na Austrália, descobriu que a presença de plantas no ambiente de trabalho aumenta a produtividade em até 15%.\n\n### Pausas\n\nEmbora pareçam difíceis de encaixar na rotina, segundo Tony Schwartz, autor de [The Way We’re Working Isn’t Working](https://www.amazon.com/Way-Were-Working-Isnt-Performance/dp/1439127662/ref=sr_1_1?ie=UTF8&s=books&qid=1273182790&sr=1-1&utm_source=blog&utm_campaign=rc_blogpost), pausas de 20 minutos a cada 90 minutos trabalhados aumentam a atenção, o foco e a energia.\n\nUm [estudo](https://www.health.harvard.edu/newsletter_article/napping-may-not-be-such-a-no-no?utm_source=blog&utm_campaign=rc_blogpost) da Universidade de Harvard, também mostra que cochilar de 20 a 30 minutos toda tarde incentiva o hipotálamo a funcionar melhor. Você pode ainda gerenciar seu tempo utilizando o Pomodoro, falamos mais disso [neste post](https://www.devpleno.com/como-ser-muito-mais-produtivo?utm_source=blog&utm_campaign=rc_blogpost).\n\n## 5\\. Alimentação saudável\n\nDados da [Organização Mundial da Saúde](https://www.mindflash.com/blog/2011/09/does-the-food-we-eat-affect-our-productivity?utm_source=blog&utm_campaign=rc_blogpost) (OMS) demonstram que uma alimentação adequada também pode aumentar a produtividade em 20%.\n\n## 6\\. Música e redes sociais\n\nAs suas músicas preferidas ajudam na concentração, segundo [Teresa Lesiuk](https://graphics8.nytimes.com/packages/pdf/business/LESIUKarticle2005.pdf?utm_source=blog&utm_campaign=rc_blogpost), professora de terapia musical da Universidade de Miami. Com elas, é possível fazer as tarefas mais rapidamente e ter ideias melhores, já que ouvir sons melodiosos libera dopamina, um hormônio relacionado ao prazer.",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "para",
        "produtividade",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "title": "10 dicas de produtividade para programadores",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "106696-10-dicas-de-produtividade-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "revisor": "['Renato Siqueira']",
        "chunkIndex": 3,
        "totalChunks": 6,
        "sourcePath": "blog/10-dicas-de-produtividade-para-programadores/index.md"
      }
    },
    {
      "id": "59147e1dbf6a27ba",
      "url": "https://devpleno.com/stream-parte-2-writable",
      "title": "Hands-on: Streams Parte 2 - Writable - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on: Streams Parte 2 - Writable\n\nT\nPor Tulio Faria • 9 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nVamos continuar falando sobre o Stream em node, mais especificamente sobre o Writable, lembrando que podemos usar estes conceitos em outras linguagens. Se você ainda não viu a parte 1, clique [AQUI](https://www.devpleno.com/streams-parte-1/).\n\n**O que é Writable Stream?**\n\nSão Stream’s onde podemos escrever algo neles, diferente do Readable que apenas lemos os dados. Dizemos que o Writable é um stream de destination. Podemos utiliza-los, por exemplo, em operações em rede, escrever em arquivos, etc. Hoje vamos trabalhar fazendo testes em um arquivo por ser mais simples.\n\n**Qual a vantagem em relação ao modo sem Stream?**\n\nDo mesmo modo que o readable Stream, iremos escrever ‘parcelado’ neste arquivo, sem necessidade de termos ele inteiro em memória.\n\n**Como ulizamos o Writable Stream?**\n\nPrimeiro vamos chamar o fs para ter acesso a ele e em seguida chamar o WritableStream, lembrando que no Writable temos algumas opões, como flags, que irá indicar como eu vou escrever este arquivo e o encoding para setar o tipo de codificação (UTF8 é o mais consolidado).\n\nconst sf = require('sf')\nconst writable = sf.createWriteStream('arquivo.txt', {\nflags: 'w',\nencoding: 'utf8'\n})\nwritable.write('exemplo\\\\n')\nwritable.write('acabou')\nTemos então o Writable Stream, dizendo onde eu quero gravar meu arquivo e qual flag quero utilizar, neste caso utilizamos o W que é somente para escrever criando um novo arquivo ou sobrescrevendo um já existente por completo.\n\nAo trocar o W pelo A entramos no modo append, ou seja, ele acrescenta a escrita no final do arquivo, somando o anterior com as novas adições.\n\n**Por que utilizamos o Writable Stream?**\n\nPodemos construir um arquivo nosso com stream parcialmente e, a medida em que temos acesso a novos dados para serem escritos, podemos adiciona-los.\n\n**Concluindo**",
      "description": "Vamos continuar falando sobre o Stream em node, mais especificamente sobre o Writable, lembrando que podemos usar estes conceitos em outras linguagens. Se ...",
      "keywords": [
        "writable",
        "stream",
        "arquivo",
        "https",
        "podemos",
        "para",
        "parte",
        "escrever",
        "como",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/stream-parte-2-writable"
      }
    },
    {
      "id": "592832d043888907",
      "url": "https://devpleno.com/blog/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples/index",
      "title": "Json-server - Como criar uma REST API para testes de forma simples (Part 2)",
      "content": "Use bastante, é uma ótima forma para poder ilustrar que está havendo uma comunicação com o servidor, e ele também é muito flexível, já vem com os métodos do HTTP implementados, então se quisermos excluir, podemos também. Não dá para usar em produção, seria muito inseguro, mas é possível para prototiparmos uma interface ou quem sabe um aplicativo móvel.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/VrPByfYy9PE\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "json",
        "para",
        "https",
        "podemos",
        "produtos",
        "testar",
        "dados",
        "criar",
        "tamb",
        "embed"
      ],
      "metadata": {
        "title": "Json-server - Como criar uma REST API para testes de forma simples",
        "date": "2017-07-31",
        "tags": "['Javascript']",
        "thumbnail": "JsonServer.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples/index.md"
      }
    },
    {
      "id": "592c1c6a5e892b86",
      "url": "https://devpleno.com/blog/claude-code-otimizacao-arquivos/index",
      "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente (Part 1)",
      "content": "Você sabia que pode simplesmente pedir para o Claude Code otimizar os arquivos do seu projeto — e ele faz tudo sozinho? Sem pesquisar ferramenta, sem ler documentação, sem configurar nada. Em um teste real com PNGs, conseguimos **reduzir 80% do tamanho dos arquivos** com um único pedido.\n\nSe você trabalha com projetos que têm imagens, assets ou bundles pesados, essa é uma das formas mais rápidas de ganhar performance sem esforço manual.\n\n## O Claude Code Otimiza Arquivos Por Você\n\nA ideia é simples: você abre o Claude Code no terminal, descreve o que precisa, e ele cuida do resto.\n\nQuando pedimos \"otimize os PNGs deste projeto\", o Claude Code:\n\n1. **Analisou o projeto** e identificou os arquivos PNG\n2. **Sugeriu a ferramenta certa** — no caso, o pngquant, uma das melhores opções para compressão de PNG com perda controlada\n3. **Perguntou se queríamos rodar automaticamente** — sem impor nada\n4. **Executou a otimização** em todos os arquivos de uma vez\n\nNenhuma etapa exigiu que soubéssemos qual ferramenta usar ou como configurá-la. O Claude Code trouxe o conhecimento técnico e a execução.\n\n## Exemplo Prático — 80% de Redução em PNGs\n\nEm um projeto real, pedimos para o Claude Code otimizar as imagens PNG. Ele escolheu o **pngquant**, uma ferramenta de linha de comando que reduz o tamanho de PNGs usando quantização de cores com canal alfa.\n\n**Os resultados:**\n\n| Métrica | Antes | Depois |\n|---------|-------|--------|\n| Tamanho total dos PNGs | 100% | ~20% |\n| Redução média | — | **~80%** |\n| Qualidade visual | Original | Praticamente idêntica |\n\nO Claude Code ainda ofereceu criar uma comparação lado a lado para checar a qualidade de cada imagem. Como estávamos usando **Git e GitHub**, conseguimos revisar o antes e depois diretamente no pull request — cada alteração de imagem ficava visível no diff.\n\n**Dica:** sempre faça a otimização em um branch separado. Assim você compara visualmente no GitHub antes de fazer o merge, sem risco de perder qualidade sem perceber.",
      "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
      "keywords": [
        "claude",
        "code",
        "otimiza",
        "ferramenta",
        "type",
        "para",
        "imagens",
        "como",
        "arquivos",
        "otimizar"
      ],
      "metadata": {
        "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente",
        "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
        "date": "2026-04-05",
        "tags": "['Ferramentas']",
        "thumbnail": "feature-image.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/claude-code-otimizacao-arquivos/index.md"
      }
    },
    {
      "id": "59959b251c712843",
      "url": "https://devpleno.com/postman-como-testar-apis",
      "title": "Postman - Como testar APIs - Hands-on - DevPleno (Part 1)",
      "content": "Javascript\n\n## Postman - Como testar APIs - Hands-on\n\nT\nPor Tulio Faria • 19 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)\n\nO Postman é uma ferramenta indispensável para o desenvolvimento de aplicativos API, principalmente Rest API, pois ele é um client para uma API em Rest. Existem outras ferramentas para isso, mas o Postman é o mais conhecido no mercado.\n\nO primeiro ponto interessante é que o Postman é uma extensão do Google Chrome, então ele segue uma tendência de aplicações que são desenvolvidas como extensões, e à medida com que elas vão tendo propriedades a mais, você pode adicionar como um aplicativo na sua máquina.\n\nPrimeiro precisamos criar uma conta para ser possível salvar links. Você vai encontrar uma tela parecida com essa:\n\nComo eu já havia criado e feito alguns testes, já tem um histórico do lado, mas o seu estará vazio.\n\nPerceba que existe o History e o Collections. No Collections, há alguns exemplos de como fazer algumas requisições, como mudar o tipo de request, mas também é possível criar uma Collection nossa.\n\nIsso nada mais é que um conjunto de requisições que criamos. Por exemplo, suponhamos que vou criar um projeto DevReactJS, eu crio então uma Collection e dentro da Collection é possível criar uma pasta (folder).\n\nPodemos criar, por exemplo, uma pasta Users e salvar a requisição dentro.\n\nVou colocar em GET [https://httpbin.org/ip](https://httpbin.org/ip), ir em Save (ao lado de Send), Save as (podemos dar um nome, como GetIP),* escolher o projeto e a pasta que queremos e pronto. Note que vai ficar salvo dentro da pasta, o que é muito legal pois posso compartilhar depois, clicando em share, collection link. Assim, posso mandar o link para outra pessoa testar o sistema que estou fazendo.",
      "description": "O Postman é uma ferramenta indispensável para o desenvolvimento de aplicativos API, principalmente Rest API, pois ele é um client para uma API em Rest. Exi...",
      "keywords": [
        "para",
        "como",
        "https",
        "criar",
        "poss",
        "requisi",
        "podemos",
        "todos",
        "postman",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/postman-como-testar-apis"
      }
    },
    {
      "id": "59c767458e5a666d",
      "url": "https://devpleno.com/blog/desenvolvedor-full-stack-o-que-e-e-como-se-tornar/index",
      "title": "Desenvolvedor Full Stack: o que é e como se tornar? (Part 4)",
      "content": "O objetivo do desenvolvedor Full Stack é ter a visão holística sobre o processo de desenvolvimento de um produto. Logo, apesar de não ser uma exigência básica, é muito recomendável que esse profissional busque conhecimentos também na área de negócios.\n\nEm boa parte das empresas, os desenvolvedores Full Stack são vistos como representantes da área de desenvolvimento, capazes de responder questionamentos sobre toda a estrutura de produção do setor. Mas para se comunicar claramente e compreender as demandas e dúvidas externas, é necessário que ele conheça também a regra do negócio.\n\nAlém disso, com uma visão que englobe também a parte de negócios, o dev será capaz de enxergar quais são as funcionalidades que vão agregar valor efetivo ao software, facilitando a priorização delas.\n\nOu seja, mesmo depois de expandir seus horizontes aprendendo tudo sobre front-end e back-end, é desejável que o desenvolvedor Full Stack amplie ainda mais o seu conhecimento em 'T'. Além de aprender sobre essa parte de negócios, ele também pode desbravar outras áreas, como o desenvolvimento ágil de projetos, networking e habilidades de liderança.\n\nE você, o que considera essencial e desejável para se tornar um desenvolvedor Full Stack e dominar o processo de produção de softwares?\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "full",
        "stack",
        "desenvolvedor",
        "como",
        "front",
        "back",
        "para",
        "profissional",
        "tornar",
        "mais"
      ],
      "metadata": {
        "title": "Desenvolvedor Full Stack: o que é e como se tornar?",
        "date": "2017-06-07",
        "tags": "['Carreira']",
        "thumbnail": "95467-desenvolvedor-full-stack-o-que-e-e-como-se-tornar-atencao-redator-entregar-ate-18h-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/desenvolvedor-full-stack-o-que-e-e-como-se-tornar/index.md"
      }
    },
    {
      "id": "59d34f8c34482025",
      "url": "https://devpleno.com/blog/stream-parte-2-writable/index",
      "title": "Hands-on: Streams Parte 2 - Writable (Part 2)",
      "content": "Percebam que quando usamos xpress, a requisição tem um Readable Stream e a saída é um Writable Stream, então já podemos imaginar que é possível criar algumas coisas no próprio xpress, isso acontece por que o xpress implementa stream.\n\nOutras comunicações que utilizam streams como socket io também seguem a mesma sintaxe. Confira o hands-on completo no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/elOGmIL7qws\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "stream",
        "writable",
        "arquivo",
        "podemos",
        "para",
        "escrever",
        "https",
        "como",
        "embed",
        "vamos"
      ],
      "metadata": {
        "title": "Hands-on: Streams Parte 2 - Writable",
        "date": "2017-05-09",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart2.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/stream-parte-2-writable/index.md"
      }
    },
    {
      "id": "59e4e2e9c00197dd",
      "url": "https://devpleno.com/como-vender-software",
      "title": "negociação - Como vender um Software - DevPleno (Part 3)",
      "content": "Uma outra coisa que eu parei de fazer, a não ser nesses modelos que comentei acima, é evitar fazer muita transação de preço na frente do cliente porque você pode cometer erros gravíssimos à medida que começar a pegar projetos maiores. Se você fazer uma conta errada na frente do cliente e assumir o compromisso de uma proposta, vai assumir um risco muito grande. Pode ser que você combine algo ali e, posteriormente, perceba que vai dar mais trabalho do que foi imaginado. Por esse motivo, sempre peça um tempo para pensar, não dê a resposta final sem que você tenha refletido sobre isso. A negociação dá uma adrenalina e no ímpeto de querer fechar, pode ser que acabe fazendo algo sem pensar e isso te prejudique futuramente.\n\nUma última dica: eu nunca dou mais que 5% de desconto. Imagine que você cobrou R$10 mil de um cliente e do nada baixou para R$5 mil. A sensação que o cliente vai ter é que aquilo não valia R$10 mil, e sim 5 mil, então a empresa é taxada como uma empresa que queria extorquir dinheiro. Isso acaba com a credibilidade.\n\nSe você fizer essas dicas que eu passei, tenho certeza que vai se dar bem, eu utilizo elas sempre\n\nConfira o video:\n\nCurta o DevPleno no [Facebook](https://www.facebook.com/devpleno),[inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=negocia%C3%A7%C3%A3o%20-%20Como%20vender%20um%20Software&url=https%3A%2F%2Fdevpleno.com%2Fcomo-vender-software) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-vender-software)",
      "description": "Hoje vou complementar um pouco sobre como vender software, mais especificamente sobre negociação. O primeiro ponto que temos que desconstruir é que negocia...",
      "keywords": [
        "para",
        "isso",
        "negocia",
        "muito",
        "cliente",
        "mais",
        "algo",
        "software",
        "outra",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/como-vender-software"
      }
    },
    {
      "id": "59f3b542f1bdfe99",
      "url": "https://devpleno.com/carreira-tomar-decisoes",
      "title": "Carreira: Tomar decisões - DevPleno",
      "content": "Carreira\n\n## Carreira: Tomar decisões\n\nT\nPor Tulio Faria • 4 de abril de 2017\n\n[Carreira](/tag/carreira)\n\nVocê toma decisões na sua equipe? Mesmo não sendo o líder?\n\nVocê líder deixa as pessoas tomarem decisões?\n\nNeste vídeo faço uma pequena reflexão sobre como decisões podem desenrolar e deixar equipes e empresas muito mais produtivas.\n\nConfira o vídeo:\n\nNão esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Um abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Carreira%3A%20Tomar%20decis%C3%B5es&url=https%3A%2F%2Fdevpleno.com%2Fcarreira-tomar-decisoes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcarreira-tomar-decisoes)",
      "description": "Você toma decisões na sua equipe? Mesmo não sendo o líder? Você líder deixa as pessoas tomarem decisões? Neste vídeo faço uma pequena reflexão sobre como d...",
      "keywords": [
        "https",
        "carreira",
        "decis",
        "tomar",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fcarreira",
        "decisoes",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/carreira-tomar-decisoes"
      }
    },
    {
      "id": "5a054085b757a894",
      "url": "https://devpleno.com/fullstack-master-li2",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master-li2 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstack",
        "master"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstack-master-li2"
      }
    },
    {
      "id": "5a3f008099514687",
      "url": "https://devpleno.com/blog/promises/index",
      "title": "NodeJS Primeiros Passos - Promises (Part 2)",
      "content": "```jsx\nfunction readArquivo1(){\n    ... <linha1>\n    fs.readFile('arquivo1.txt', 'utf8', function(err, arquivo1){\n    });\n    ...< linha 2>\n}\n```\n\nNão é muito bem isso que queremos, afinal queremos um atrás do outro, então podemos fazer o seguinte:\n\n```jsx\nfunction readArquivo1() {\n  var deferred = '.defer()'\n  fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {\n    deferred.resolve(arquivo1)\n  })\n  return deferred.promise\n}\n```\n\nPerceba que estou retornando uma promise avisando que vai ser retornado algo. Quando esse algo estiver pronto, ele devolve a promise, no caso o arquivo 1. Como eu chamo os arquivos agora usando promises? Valos ler os arquivos e quando ele estiver pronto vai ser chamado o then.function(arquivo1):\n\n```jsx\nfunction readArquivo1() {\n  var deferred = '.defer()'\n  fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {\n    deferred.resolve(arquivo1)\n  })\n  return deferred.promise\n}\nfunction readArquivo2() {\n  var deferred = '.defer()'\n  fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {\n    deferred.resolve(arquivo2)\n  })\n  return deferred.promise\n}\nfunction readArquivo3() {\n  var deferred = '.defer()'\n  fs.readFile('arquivo3.txt', arquivo1 + '\\\\n' + arquivo2, function (err) {\n    deferred.resolve()\n  })\n  return deferred.promise\n}\nreadArquivo1().then(function (arquivo1) {\n  console.log(arquivo1)\n})\n```\n\nO readArquivo1 retorna uma promise dizendo que quando tiver essa operação IO disponível, eu chamo de volta para então executar o then. Ao executar o código, vai ser retornado o conteúdo do arquivo 1. Poderiamos fazer também:\n\n```jsx\nvar conteudo = ''\nreadArquivo1()\n  .then(function (arquivo1) {\n    conteudo += arquivo1\n    return readArquivo2()\n  })\n  .then(function (arquivo2) {\n    conteudo += arquivo2\n    console.log(conteudo)\n  })\n```",
      "keywords": [
        "function",
        "arquivo1",
        "deferred",
        "arquivo2",
        "readfile",
        "para",
        "arquivo",
        "digo",
        "then",
        "conteudo"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos - Promises",
        "date": "2017-06-27",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "Promises.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/promises/index.md"
      }
    },
    {
      "id": "5a6963bff086204c",
      "url": "https://devpleno.com/blog/orientacao-objetos-imperativa-e-funcional/index",
      "title": "Diferença entre as programações Orientação-objetos, Imperativa e Funcional (Part 2)",
      "content": "Fazendo isso, nós começamos a classificar as coisas cedo demais. Algo que eu acho muito legal da programação funcional é que conseguimos construir pequenos blocos, que são as funções, podemos passar elas como parâmetros, por exemplo. O legal disso é que não assumimos nenhuma classificação inicial para isso. Caso a gente queira fazer tudo em um arquivo só e depois ir quebrando em funções, é possível. Fazendo isso nós podemos amadurecer e estabilizar melhor para depois organizar. Não precisamos ter isso de começo, porque muitas vezes uma arquitetura te impõe erros, pois temos uma arquitetura muito bem definida mas tem coisas que não se encaixam em nem um lugar nem em outro.\n\nPara não acontecer isso em programação funcional, é interessante não trazer esses conceitos e apenas a ideia desse pattern.\n\nMas o maior problema que eu vejo hoje em orientação-objetos é exatamente a questão de que, quando ele começa a crescer, existem coisas que não se encaixam em nenhum lugar dentro da arquitetura.\n\nEntão a grande vantagem para as três abstrações é saber utilizar elas do jeito delas e não tentar aplicar esse paradigma em outro.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/JDSglOBvhw8\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "objetos",
        "isso",
        "orienta",
        "funcional",
        "como",
        "problema",
        "essa",
        "programa",
        "paradigma"
      ],
      "metadata": {
        "title": "Diferença entre as programações Orientação-objetos, Imperativa e Funcional",
        "date": "2017-09-21",
        "tags": "['Javascript']",
        "thumbnail": "OO-imperativa.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/orientacao-objetos-imperativa-e-funcional/index.md"
      }
    },
    {
      "id": "5a83c9dc471a68e9",
      "url": "https://devpleno.com/voce-precisa-ter-dom-para-ser-um-bom-profissional",
      "title": "Você precisa ter DOM para ser um bom profissional? - DevPleno",
      "content": "Carreira\n\n## Você precisa ter DOM para ser um bom profissional?\n\nT\nPor Tulio Faria • 22 de março de 2017\n\n[Carreira](/tag/carreira)\n\nVocê acredita que as pessoas realmente só aprendem se têm DOM? Neste vídeo, comento a opinião sobre este assunto e explico porque não acredito em dom. Confira!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastra seu e-mail para não perder as novidades. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Voc%C3%AA%20precisa%20ter%20DOM%20para%20ser%20um%20bom%20profissional%3F&url=https%3A%2F%2Fdevpleno.com%2Fvoce-precisa-ter-dom-para-ser-um-bom-profissional) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fvoce-precisa-ter-dom-para-ser-um-bom-profissional)",
      "description": "Você acredita que as pessoas realmente só aprendem se têm DOM? Neste vídeo, comento a opinião sobre este assunto e explico porque não acredito em dom. Conf...",
      "keywords": [
        "https",
        "para",
        "carreira",
        "precisa",
        "profissional",
        "este",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fvoce"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/voce-precisa-ter-dom-para-ser-um-bom-profissional"
      }
    },
    {
      "id": "5ab0e978ebff0745",
      "url": "https://devpleno.com/fs-watch",
      "title": "FS-Watch - Checando mudanças em um arquivo-diretório - DevPleno (Part 1)",
      "content": "Javascript\n\n## FS-Watch - Checando mudanças em um arquivo-diretório\n\nT\nPor Tulio Faria • 17 de outubro de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nHoje eu quero mostrar duas funcionalidades que nós temos no FS padrão no Node e que podem ajudar bastante em alguns tipos de situações, como por exemplo checar se algum arquivo de log foi gerado em um diretório ou, às vezes, um arquivo de exportação.\n\nPrimeiramente temos uma pasta criada, nele vou criar um arquivo novo chamado fs-watch.js e fazer o seguinte:\n\nconst fs = require('fs')\nDentro do próprio FS eu tenho duas possibilidades: o watchFile, onde eu posso checar se um arquivo está sendo alterado:\n\nfs.watchFile('file.txt', (curr, next) => {\nconsole.log(curr, next)\n})\nBasicamente ele vai mostrar para o que mudou em cada alteração do arquivo, por exemplo, se rodarmos ele, editar o arquivo file.txt e salvar, vai ser mostrado o que foi mudado. Se colocarmos apenas o size, podemos ver como era atualmente e anteriormente esse mesmo arquivo:\n\nfs.watchFile('file.txt', (curr, prev) => {\nconsole.log(curr.size, prev.size)\n})\nAssim, sempre que mudarmos o número de caracteres do arquivo, ele vai mostrar o quanto nós temos agora e o quanto tinha anteriormente.\n\nEssa é uma das formas que temos de saber se o arquivo foi ou não alterado. O que podemos fazer com isso? Podemos, por exemplo, fazer um WatchFile simplesmente para saber se o atual é maior que o anterior, pensando em arquivos de log, geralmente colocamos no final para caso haja algum incremento no arquivo, com isso é possível saber quantos bytes foram adicionados.\n\nOutra forma que temos de fazer é utilizando o fs.watch(). Com ele podemos checar um diretório contra mudanças:\n\nfs.watch('./', (changeType, file) => {\nconsole.log('change', changeType, file)\n})\nAo fazermos isso, ele vai checar nesse diretório qualquer arquivo que foi alterado, assim temos bastante precisão neste tipo de operação.\n\nConfira o video:",
      "description": "Hoje eu quero mostrar duas funcionalidades que nós temos no FS padrão no Node e que podem ajudar bastante em alguns tipos de situações, como por exemplo ch...",
      "keywords": [
        "arquivo",
        "watch",
        "temos",
        "https",
        "diret",
        "file",
        "checar",
        "fazer",
        "watchfile",
        "curr"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/fs-watch"
      }
    },
    {
      "id": "5af8f704fe85ca45",
      "url": "https://devpleno.com/blog/tomar-decisoes/index",
      "title": "Tomar decisões (Part 2)",
      "content": "Um exemplo interessante: prestavamos consultoria para um cliente, e teve um dia em que chegamos lá para conversar sobre outro assunto e uma das sócias estava extremamente estressada, perguntamos o que estava acontecendo e ela respondeu \"esses funcionários não resolvem nada. Pra comprar um café eles tem que me pedir dinheiro!\" Então perguntamos porque eles tinham que pedir a ela. Ela respondeu que era porque eles não tinham acesso ao dinheiro. Ou seja, ela não deixava os funcionários tomarem decisão, por mais que eles quisessem tomar. A sugestão que demos foi deixar uma caixa com o dinheiro, avisar para quando precisar de dinheiro para comprar algo para a empresa pegue lá e devolva a nota na caixa com o nome da pessoa que comprou. Uma coisa simples que desenrola tudo.\n\nEntão, caso você seja subordinado, comece a tomar decisões menores, em que o impacto não atrapalhe e a medida que você vai acostumando com isso, comece a ajudar seu líder a tomar decisões, isso vai gerar uma produtividade muito grande para sua equipe.\n\nJá se você é um líder, dê poder às pessoas da sua equipe para que elas te ajudem, caso a decisão seja um pouco mais de risco deixe claro que você tem que estar envolvido ou peçam para a equipe manter você informado.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/0xSnZSKiAu4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "decis",
        "para",
        "tomar",
        "mais",
        "equipe",
        "porque",
        "empresa",
        "isso",
        "pessoas",
        "algo"
      ],
      "metadata": {
        "title": "Tomar decisões",
        "date": "2017-08-08",
        "tags": "['Carreira']",
        "thumbnail": "TomarDecisao.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/tomar-decisoes/index.md"
      }
    },
    {
      "id": "5b0b58c557beaea4",
      "url": "https://devpleno.com/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs",
      "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS) - DevPleno (Part 2)",
      "content": "// Criar objeto Base64\nvar Base64={\\_keyStr:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",encode:function\n(e){var t=\"\";var n,r,i,s,o,u,a;var f=0;e=Base64.\\_utf8\\_encode(e);while(f&#x3C;e.length){n=e.charCodeAt(f++);\nr=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&#x26;3)&#x3C;&#x3C;4|r>>4;u=(r&#x26;15)&#x3C;&#x3C;2|i>>6;a=i&#x26;63;if(isNaN(r)){u=a=64}\nelse if(isNaN(i)){a=64}t=t+this.\\_keyStr.charAt(s)+this.\\_keyStr.charAt(o)+this.\\_keyStr.charAt(u)\n+this.\\_keyStr.charAt(a)}return t},decode:function(e){var t=\"\";var n,r,i;var s,o,u,a;var f=0;e=e.replace\n(/\\[^A-Za-z0-9+/=\\]/g,\"\");while(f&#x3C;e.length){s=this.\\_keyStr.indexOf(e.charAt(f++));o=this.\\_keyStr.indexOf\n(e.charAt(f++));u=this.\\_keyStr.indexOf(e.charAt(f++));a=this.\\_keyStr.indexOf(e.charAt(f++));n=s&#x3C;&#x3C;2|o>>4;r=\n(o&#x26;15)&#x3C;&#x3C;4|u>>2;i=(u&#x26;3)&#x3C;&#x3C;6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64)\n{t=t+String.fromCharCode(i)}}t=Base64.\\_utf8\\_decode(t);return t},\\_utf8\\_encode:function(e){e=e.replace\n(/rn/g,\"n\");var t=\"\";for(var n=0;n&#x3C;e.length;n++){var r=e.charCodeAt(n);if(r&#x3C;128){t+=String.fromCharCode(r)}\nelse if(r>127&#x26;&#x26;r&#x3C;2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&#x26;63|128)}else\n{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&#x26;63|128);t+=String.fromCharCode(r&#x26;63|128)}}\nreturn t},\\_utf8\\_decode:function(e){var t=\"\";var n=0;var r=c1=c2=0;while(n&#x3C;e.length){r=e.charCodeAt(n);\nif(r&#x3C;128){t+=String.fromCharCode(r);n++}else if(r>191&#x26;&#x26;r&#x3C;224){c2=e.charCodeAt(n+1);t+=String.fromCharCode\n((r&#x26;31)&#x3C;&#x3C;6|c2&#x26;63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode\n((r&#x26;15)&#x3C;&#x3C;12|(c2&#x26;63)&#x3C;&#x3C;6|c3&#x26;63);n+=3}}return t}}\n\n// Uma string qualquer\nvar string = 'DevPleno';\n\n// Convertendo para Base64\nvar emBase64 = Base64.encode(string);\nconsole.log(emBase64); // Saída: \"RGV2UGxlbm8=\"",
      "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
      "keywords": [
        "string",
        "base64",
        "fromcharcode",
        "embase64",
        "keystr",
        "nodejs",
        "para",
        "charcodeat",
        "this",
        "charat"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs"
      }
    },
    {
      "id": "5b135ec1e65b52a4",
      "url": "https://devpleno.com/blog/25",
      "title": "Blog - Página 25 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 13 de out. de 2016 cmder: Turbine seu cmd no Windows](/cmder-turbine-seu-cmd-no-windows)\n\n[Javascript 4 de out. de 2016 Como converter uma string em Base64 em JavaScript (Navegador e NodeJS)](/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs)\n\n[Javascript 3 de out. de 2016 Mongoose: corrigindo \"Cannot overwrite 'Model' model once compiled\"](/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose)\n\n[Javascript 17 de ago. de 2016 NodeJS Primeiros Passos: Async - Map](/nodejs-primeiros-passos-async-map)\n\n[Javascript 15 de ago. de 2016 NodeJS Primeiros Passos: Async - Waterfall](/nodejs-primeiros-passos-async-waterfall)\n\n[Carreira 14 de ago. de 2016 Por que tudo na vida acontece 2x?](/por-que-tudo-na-vida-acontece-2x)\n\n[Javascript 12 de ago. de 2016 NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas](/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas)\n\n[Fundamentos 9 de ago. de 2016 HA (High Availability) e AS (Auto Scale)](/ha-high-availability-e-as-auto-scale)\n\n[Javascript 7 de ago. de 2016 Servidor de arquivos e sistemas locais com HTTPS](/servidor-de-arquivos)\n\n[Javascript 5 de ago. de 2016 NodeJS Primeiros Passos Assíncrono](/assincrono)\n\n[Carreira 2 de ago. de 2016 Como está seu inglês?](/como-esta-seu-ingles-carreira)\n\n[Carreira 1 de ago. de 2016 Morro de vontade...](/morro-de-vontade)\n\n[Anterior](/blog/24)25 / 26[Próxima](/blog/26)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2016",
        "javascript",
        "nodejs",
        "primeiros",
        "passos",
        "carreira",
        "como",
        "async",
        "model",
        "blog"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/25"
      }
    },
    {
      "id": "5b6a69cb8cb17011",
      "url": "https://devpleno.com/blog/programacao-assincrona/index",
      "title": "Programação Assíncrona - NodeJS Primeiros Passos (Part 3)",
      "content": "Se criarmos uma aplicação em node com 100 usuários usando ao mesmo tempo, ele consegue responder os 100 usuários com apenas uma linha de código. Para quem já programou em JAVA sabe que o minimo seriam 100 treads se não tivesse nenhuma otimização. O node é muito baseado em assíncrono, praticamente tudo que vamos fazer é feito de forma assíncrona e a única coisa que você precisa tomar cuidado é de não achar que o console.log de dentro do callback executaria antes do que está fora, as vezes a pessoa fica atentada a querer fazer uma operação atrás da outra mas são várias operações assíncronas, logo não vai funcionar porque vão retornar em tempos diferentes. Existe algumas estruturas que utilizamos para controlar esse fluxo e vamos falar mais a frente.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/wKqEwKP-E1E\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "como",
        "vamos",
        "fazer",
        "dados",
        "opera",
        "ncrono",
        "contents",
        "isso",
        "ncrona"
      ],
      "metadata": {
        "title": "Programação Assíncrona - NodeJS Primeiros Passos",
        "date": "2017-06-16",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "ProgramacaoAssincrona.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/programacao-assincrona/index.md"
      }
    },
    {
      "id": "5be2e3db29fbf4fb",
      "url": "https://devpleno.com/blog/como-receber-de-empresas-estrangeiras/index",
      "title": "Impostos e como receber de empresas estrangeiras (Part 2)",
      "content": "Agora imagine o seguinte: você declarou esse valor, caso receba como pessoa física, precisa baixar um programa chamado Carnê Leão, esse programa da Receita calcula baseado no valor que você recebeu naquele mês (lembrando que tem a opção para dinheiro vindo do exterior), ele vai gerar uma guia que você deve pagar. Você é obrigado a recolher o Carnê Leão de forma mensal, geralmente não achamos essa informação tão facilmente na internet, então é bom lembrar isso, devemos pagar ele no mês que recebemos. Eu acredito que isso seja muito bom, porque você não esquece de guardar esse dinheiro, imagine você receber R$100mil em um ano em 12x e esquecer de recolher e guardar esses 27,5%, depois vai faltar dinheiro para pagar o imposto. Pagando corretamente você pode ter restituição de imposto de renda.\n\n**Mas qual valor declarar?**\n\nEu declaro o valor que caiu na minha conta, porque a empresa lá de fora não tem essa informação para a receita daqui, então só é validado quando cai no banco da sua conta.\n\nOutra opção é com pessoa jurídica. Vamos utilizar os mesmos R$100mil como exemplo. Nesse caso, você vai pagar mais ou menos 10%, a minha alíquota hoje no simples nacional está mais ou menos 7%.\n\nNessa opção então não vamos pagar os 27,5% de imposto, mas em compensação temos que emitir uma nota fiscal para uma empresa do exterior como pessoa jurídica. A unica diferença é que quando ela está no exterior, ela não tem CNPJ. Feito isso, a transferência vai para a conta corrente da pessoa jurídica. No caso do Simples Nacional, eles vão mandar uma DARF só por mês, já coletando esse imposto. Caso você não for enquadrado como Super Simples, provavelmente você vai receber umas quatro ou cinco guias.",
      "keywords": [
        "para",
        "esse",
        "como",
        "empresa",
        "dinheiro",
        "pessoa",
        "receber",
        "isso",
        "pagar",
        "eles"
      ],
      "metadata": {
        "title": "Impostos e como receber de empresas estrangeiras",
        "date": "2017-08-18",
        "tags": "['Carreira']",
        "thumbnail": "COMO-RECEBER-DE-EMPRESAS-ESTRANGERAS-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/como-receber-de-empresas-estrangeiras/index.md"
      }
    },
    {
      "id": "5bfeca6f254b9cf7",
      "url": "https://devpleno.com/blog/listar-arquivos-em-js/index",
      "title": "Listar arquivos em JS (async, await, promise e Promise.all) (Part 2)",
      "content": "Com isso conseguimos saber se é um arquivo ou não através do isFile, por exemplo, se eu passasse o diretório atual e executar o código, ele vai passar false, Isso acontece porque ele não é um arquivo:\n\n```jsx\nfs.stat('./', (err, stat) => {\n  console.log(stat.isFile())\n})\n```\n\nAgora precisamos transformar o fs.stat também em uma função:\n\n```jsx\nfunction stat(path){\n    return new Promise((resolve, reject) => {\n        fs.stat(path, (err, stat) =>{\n            if(err){\n                reject(err)\n            } else {\n                resolve(stat)\n            }\n        })\n    }\n}\n```\n\nAgora podermos fazer uma nova versão:\n\n```jsx\nfs.stat('./').then,\n  (stat) => {\n    console.log(stat.isFile())\n  }\n```\n\nAgora precisamos de um jeito de unir os dois para ter o resultado que queremos.No exercício no Fullstack Academy, utilizamos a função assíncrona 'async', então fizemos o seguinte:\n\n```jsx\nasync function lista() {\n  const paths = await readdir('./')\n  console.log(paths)\n}\nlista()\n```\n\nLembrando que descobrimos durante o Fullstack Academy que se utilizarmos o 'await' para uma promise, essa função continua sendo assíncrona, porém visualmente quando estamos construindo o código, podemos garantir que embaixo só vai ser executado quando o readdir terminar.\n\nPerceba que vai continuar retornando a listagem, então na verdade o 'await' seria como fazermos um then com paths com a única diferença que eu posso fazer meu próximo passo, que será checar todos os arquivos se eles são ou não realmente arquivos. Para isso vamos fazer um const stats que vai utilizar um map para passar por todos os caminhos e utilizar um async passando um path e dar um await no stat.path:\n\n```jsx\nasync function lista() {\n  const paths = await readdir('./')\n  const stats = paths.map(async (path) => await stat(path))\n  console.log(paths)\n}\nlista()\n```",
      "keywords": [
        "stat",
        "path",
        "paths",
        "const",
        "await",
        "readdir",
        "lista",
        "promise",
        "para",
        "arquivos"
      ],
      "metadata": {
        "title": "Listar arquivos em JS (async, await, promise e Promise.all)",
        "date": "2017-05-08",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ListarArquivos.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/listar-arquivos-em-js/index.md"
      }
    },
    {
      "id": "5c40e5f1227c27ca",
      "url": "https://devpleno.com/claude-code-otimizacao-arquivos",
      "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente - DevPleno (Part 2)",
      "content": "**Dica:** sempre faça a otimização em um branch separado. Assim você compara visualmente no GitHub antes de fazer o merge, sem risco de perder qualidade sem perceber.\n\n## Outros Tipos de Otimização Que Você Pode Pedir\n\nPNG é só o começo. O Claude Code consegue sugerir e executar otimizações para praticamente qualquer tipo de arquivo ou recurso do seu projeto:\n\n- **Imagens (SVG, JPEG, WebP)** — ferramentas como svgo, mozjpeg ou cwebp, escolhidas automaticamente conforme o formato\n\n- **Bundles JavaScript e CSS** — minificação, tree-shaking, análise de tamanho com ferramentas como esbuild ou terser\n\n- **Dockerfiles** — redução de camadas, multi-stage builds, imagens base menores\n\n- **Queries SQL** — reescrita de consultas lentas, sugestão de índices\n\n- **Fontes** — subsetting para incluir apenas os caracteres usados\n\nO padrão é sempre o mesmo: você descreve o problema, o Claude Code encontra a ferramenta, explica o que vai fazer e executa com sua aprovação.\n\n## Erros Comuns ao Otimizar Arquivos com IA\n\nMesmo com uma ferramenta inteligente, alguns cuidados são importantes:\n\n**Não revisar a qualidade visual.** Compressão de imagem sempre envolve trade-offs. Mesmo com 80% de redução, revise as imagens mais importantes. O GitHub facilita isso — o diff de imagens mostra o antes e depois lado a lado.\n\n**Não versionar antes de otimizar.** Sempre rode otimizações em um branch separado no Git. Se algo der errado, você volta ao estado anterior em um comando. Sem versionamento, uma otimização agressiva pode destruir assets originais.\n\n**Aceitar tudo sem entender.** O Claude Code explica o que vai fazer antes de rodar. Leia a sugestão. Entenda se a ferramenta proposta faz compressão com perda (lossy) ou sem perda (lossless). Para ícones e screenshots, lossy geralmente funciona bem. Para assets de design que serão editados depois, prefira lossless.",
      "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
      "keywords": [
        "code",
        "claude",
        "otimiza",
        "para",
        "ferramenta",
        "como",
        "arquivos",
        "imagens",
        "projeto",
        "pngs"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/claude-code-otimizacao-arquivos"
      }
    },
    {
      "id": "5cf306d90f33903e",
      "url": "https://devpleno.com/algoritmos-permmissingelement",
      "title": "Algoritmos: PermMissingElement - DevPleno",
      "content": "Algoritmos\n\n## Algoritmos: PermMissingElement\n\nT\nPor Tulio Faria • 15 de março de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nContinuando nossa série sobre algoritmos que caem em entrevistas de emprego e competições de programação, neste vídeo, explico sobre o Algoritmo PermMissingElement.\n\n## Confira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Algoritmos%3A%20PermMissingElement&url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-permmissingelement) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-permmissingelement)",
      "description": "Continuando nossa série sobre algoritmos que caem em entrevistas de emprego e competições de programação, neste vídeo, explico sobre o Algoritmo PermMissin...",
      "keywords": [
        "algoritmos",
        "https",
        "permmissingelement",
        "sobre",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno",
        "2falgoritmos",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/algoritmos-permmissingelement"
      }
    },
    {
      "id": "5d25a36c001d6c9d",
      "url": "https://devpleno.com/servidor-http-basico-2",
      "title": "Servidor HTTP Básico - NodeJS Primeiros Passos - DevPleno (Part 2)",
      "content": "var http: require('http');\nhttp.createServer(function(req, res){\nres.end('DevPleno.com');\n});\nUma coisa interessante de se notar é que esta função é uma função anonima e também é executada de forma assíncrona. Isso quer dizer que o servidor fica ‘ouvindo’ uma porta, mas só irá executar a função quando um evento acontecer, ou seja, quando um cliente fizer uma requisição para o servidor. Qual a vantagem disso? Chamamos isso de não blocking, ou seja, o servidor não fica esperando chegar uma requisição. Quando um evento de requisição chegar, ele irá executar o trecho do código. Depois de criado o servidor, precisamos ouvir a porta *(a porta diferencia que vai receber a solicitação dentro da máquina).*\n\nvar http: require('http');\nhttp.createServer(function(req, res){\nres.end('DevPleno.com');\n}).listen(3000);\nVamos salvá-lo como server.js, abrir o prompt de comando e executar o seguinte comando:\n\nNode server.js\nIsso vai ‘Startar’ nosso servidor. Quando abrirmos o browser e escrevermos localhost:3000, recebemos a mensagem DevPleno.com, assim, é possível ver que o servidor está rodando normalmente. O bom disso é que não precisamos importar bibliotecas de terceiros, já que o HTTP é um módulo que faz parte do core do node. O que podemos fazer a mais? Podemos, por exemplo, importar um módulo que lida com FileSystem, criar uma var contents que receberá um readFileSync *(lembrando que não é muito bom usar o Sync, mas estou fazendo apenas com intuíto de demonstração).*\n\nvar http: require('http');\nvar fs = require('fs');\nvar contents = fs.readFileSync('contents.html')\nhttp.createServer(function(req, res){\nres.end(contents);\n}).listen(3000);\nEm seguida, criar um HTML com o nome contents\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;h1>DevPleno.com&#x3C;/h1>\n&#x3C;/body>\n&#x3C;html>\nAperte Ctrl C para parar o servidor. Vamos reiniciar o servidor com node server.js, recarregar o browser e ele irá requisitar o contents.html do jeito que criamos.",
      "description": "Na série NodeJS Primeiros Passos, você poderá os conceitos básicos de Javascript e NodeJS e, assim, poder colocar a mão na massa. Neste primeiro post, conf...",
      "keywords": [
        "http",
        "servidor",
        "node",
        "nodejs",
        "https",
        "devpleno",
        "para",
        "contents",
        "javascript",
        "criar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/servidor-http-basico-2"
      }
    },
    {
      "id": "5d25d8e41d0994a2",
      "url": "https://devpleno.com/blog/aprenda-a-dizer-nao/index",
      "title": "Aprenda a dizer NÃO! (Part 1)",
      "content": "Uma das coisas que eu aprendi ultimamente é dizer NÃO. Se alguma coisa não me agrada, não faz bem para minha empresa ou não está de acordo com o que eu quero para minha vida, eu simplesmente digo não. Por exemplo, eu me nego a pegar um serviço que não está alinhado ao meu objetivo maior e isso fez uma diferença muito grande para minha empresa. Ao invés de pegar projetos igual um louco, eu pego somente os projetos que fazem sentido para minha empresa.\n\nMuitas vezes a gente pega algumas coisas para estudar que não faz sentido para nós, temos que dizer não para nós mesmos. Se você tem N projetos que acha que não vai dar em nada, precisa dizer não, afinal está perdendo tempo e energia.\n\nUma coisa que achei muito interessante foi uma das conversas que eu tive no mestrado com alguns colegas. Um deles estava reclamando que não gostava do tema do mestrado dele e que não sabia o que fazer porque não estava produzindo, já que não se dava bem com o tema. O que foi unânime na mesa foi dizer “Você não está na idade de falar sim para tudo, se você não gostou desse tema, está na hora de falar que não quer continuar.”\n\nQuando eu era mais novo, por exemplo, não gostava de balada, então quando as pessoas me convidavam eu não sabia falar não e ia porque simplesmente não me aceitava como eu era, e me sentia péssimo, porque não era algo que eu gostava ou queria fazer. Quando você vai ficando um pouco mais velho, começa a aprender a falar não.\n\nJá está mais do que na hora de aprender e descobrir o que você gosta, chega de aceitar tudo, se algo não está indo bem, fale, se seu chefe faz algo que você não gosta fale para ele, converse e explique.",
      "keywords": [
        "para",
        "minha",
        "empresa",
        "vida",
        "quando",
        "mais",
        "dizer",
        "estava",
        "porque",
        "falar"
      ],
      "metadata": {
        "title": "Aprenda a dizer NÃO!",
        "date": "2017-07-07",
        "tags": "['Carreira']",
        "thumbnail": "DIZER-NÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/aprenda-a-dizer-nao/index.md"
      }
    },
    {
      "id": "5d3ab0749baf0230",
      "url": "https://devpleno.com/socket-io-parte2",
      "title": "Hands-on - Socket.io Parte 2 - DevPleno (Part 3)",
      "content": "&#x3C;html>\n&#x3C;body>\n&#x3C;h1>Socket.io&#x3C;/h1>\n&#x3C;script src=\"/socket.io/socket.io.js\">&#x3C;/script>\n&#x3C;script src=\"https://code.jquery.com/jquery-3.2.1.min.js\"> &#x3C;/script>\n&#x3C;div id=\"msgs\">&#x3C;/div>\n&#x3C;input type=\"text\" />\n&#x3C;script>\nconst socket = io()\nsocket.on('connect', function(){\n$(\"msgs\").append('connected with id: '+socket.id+'&#x3C;br>'\nsocket.emit('msg', 'I am connected '+socket.id);\n)}\nsocket.on('msg', function(msg){\n$(\"#msgs\")append(msg+' &#x3C;br>')\n}\n$(function(){\n$(\"imput\").keyDown(function(key){\nif(key.keyCode===13){\nsocket.emit('msg', $(this).val());\n}\n})\n})\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nJá do lado servidor, temos que pedir para enviar a mensagem do campo texto ao invés do socket.id, substituindo:\n\nsocket.broadcast.emit('msg', socket.id + ' connected')\nPor:\n\nsocket.broadcast.emit('msg', msg)\nConfira todos os detalhes no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%20-%20Socket.io%20Parte%202&url=https%3A%2F%2Fdevpleno.com%2Fsocket-io-parte2) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsocket-io-parte2)",
      "description": "Continuando nossa série sobre Socket.io, vamos aprofundar um pouco mais no assunto. Lembrando nosso código do lado server: Simplesmente estávamos tratando ...",
      "keywords": [
        "socket",
        "script",
        "cliente",
        "lado",
        "function",
        "msgs",
        "para",
        "https",
        "connected",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/socket-io-parte2"
      }
    },
    {
      "id": "5d7e086bb3bcf7d2",
      "url": "https://devpleno.com/blog/fake-api/index",
      "title": "Fake API - Como testar seus projetos front-end (Part 1)",
      "content": "Hoje eu trago uma dica que eu utilizo bastante com a minha equipe que é quando temos ainda uma fonte de dados para fornecer para um front-end, por exemplo, quando estamos construindo um SPA (geralmente essa aplicação precisa consumir dados) e quando não temos uma API pronta, temos uma possibilidade para trabalhar sem depender do back-end.\n\nNós utilizamos algumas API's falsas para trazer os dados, porque basicamente se a gente executar uma interface qualquer de um sistema, é possível baixar uma lista de clientes, pedidos etc. Se a aplicação for construída da maneira correta, vai ser só uma questão de trocar a camada que faz esse carregamento para refletir os dados reais da sua aplicação. Esse tipo de coisa é muito bom para acelerar o desenvolvimento e deixar um pouco mais flexível a parte do front-end.\n\nEu vou mostrar dois exemplos: primeiramente temos o Json Place Holder e também temos o SWAP, eu criei um arquivo index apenas para testarmos, a ideia é que ao invés de consultarmos os dados no nosso servidor que ainda não existe ou não está pronto, nós vamos consultar dados desses sites:\n\n```jsx\n<html>\n  <body>\n    <h1> testing API</h1>\n\n    <pre id='contents'></pre>\n\n    <script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>\n\n    <script>\n      $(function()\n      {$.get('https://jsonplaceholder.typicode.com/posts', function (data) {\n        $('#contents').html(JSON.stringfy(data))\n      })})\n    </script>\n  </body>\n</html>\n```\n\nCom isso ele já retorna todos os posts. Se olharmos em network, ele já foi lá, bateu no servidor deles e retornou a lista de posts. Eu posso trabalhar essa lista de posts por exemplo:\n\n```jsx\n<html>\n  <body>\n    <h1> testing API</h1>\n\n    <div id='contents'></div>",
      "keywords": [
        "para",
        "dados",
        "script",
        "https",
        "body",
        "contents",
        "temos",
        "html",
        "function",
        "posts"
      ],
      "metadata": {
        "title": "Fake API - Como testar seus projetos front-end",
        "date": "2017-08-04",
        "tags": "['Javascript']",
        "thumbnail": "FAKE-API-790x400 (1).png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/fake-api/index.md"
      }
    },
    {
      "id": "5e5fe3bd0d9a5d45",
      "url": "https://devpleno.com/minicurso-socket-io-parte-3",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol - DevPleno (Part 3)",
      "content": "router.post('/match/:id/score', function (req, res) {\ndb.set(\n'matches[' + req.params.id + '].team-a.score',\nparseInt(req.body.scoreA)\n).write()\ndb.set(\n'matches[' + req.params.id + '].team-b.score',\nparseInt(req.body.scoreB)\n).write()\nio.emit('score', {\nmatch: req.params.id,\nscoreA: req.body.scoreA,\nscoreB: req.body.scoreB,\nnotify: req.body.notify || 0\n})\nres.send(req.body)\n})\nSe o notify não existir, ele não vai ser enviado e eu mando zero para não notificar meus usuários. Agora está funcionando perfeitamente, se startarmos o servidor e dermos um f5, vai ser mostrado o valor enviado. Como eu tenho que dar f5 toda hora, tenho que receber no meu client a atualização que o jogo foi alterado, então vamos abrir na pasta js o arquivo match.js:\n\n$(function)(){\nconst socket = io();\nsocket.on('connect', function(){\nconsole.log('conected');\n})\nsocket.on('score', function(score){\nconsole.log('score', score)\n})\n})\nPerceba que agora, ao atualizar o placar, o usuário recebe o objeto score, então precisamos checar se o jogo está na barra de cima e se é o jogo atual para atualizar na barra principal. Para isso vamos em match.ejs e na lista de jogo que fica na parte de cima, já temos um forEach que vai renderizar todos os jogos e temos para cada jogo um ‘em’ que tem o nome da class com uma referência para o jogo como um todo.\n\nVamos copiar esse trecho de código em negrito:\n\n&#x3C;em class=\"match-&#x3C;%- index %>-b\">\nAgora vamos voltar para nosso match do client em js/match.js e fazer o seguinte:",
      "description": "Nas aulas anteriores do minicurso de Socket.IO, já preparamos o ambiente, conectamos o websocket do client para o servidor e agora vamos começar a emitir r...",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "socket",
        "vamos",
        "notify",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-3"
      }
    },
    {
      "id": "5e75ce39d0550c77",
      "url": "https://devpleno.com/programacao-assincrona",
      "title": "Programação Assíncrona - NodeJS Primeiros Passos - DevPleno (Part 2)",
      "content": "Vamos fazer um exemplo com Assíncrono para que fique mais claro:\n\nvar fs = require('fs');\nfs.readFile('dados.txt', 'utf8'), function (err, contents){\nconsole.log(contents)\n});\nconsole.log('continuar...')\nVamos salvar como async.js. Note que eu passo como parâmetro para essa instrução um callback.\n\n**O que faz uma função de callback?**\n\nEssa operação de IO demora um pouco para finalizar, então como é assíncrono, ele vai rodar e vai passar reto enquanto os dados não estiverem prontos e não pararem nela como no sync.js. Quando ele bater na linha ReadFile ele vai passar todas as camadas do SO pedindo para fazer esse IO e, internamente, vai gerenciar avisando quando estiver pronto para leitura ou dado um erro, vai ser chamado o callback.\n\nNo async, repare o seguinte: o ‘continuar…’ apareceu antes do conteúdo do contents. Imagine se fossemos ler mil arquivos, não teria problema nenhum porque os arquivos vão lendo a medida que vão chegando. Por exemplo, se eu mandei 10 arquivos, não significa que os 10 vão ser lidos ao mesmo tempo, pode ser que o primeiro esteja disponível primeiro, depois o quinto, depois o terceiro e por ai vai. Enfim, de forma assíncrona não consegue saber quando vai ser retornado mas isso é legal porque não travamos o nosso programa principal apenas para fazer uma leitura de IO.\n\nIsso é fantástico porque qualquer aplicação mais robusta hoje em dia é uma aplicação que chamamos de IO intensive, ou seja, eles usam muita entrada e saída. Se você for pensar, por exemplo, no facebook, a parte de chat e autorizações automáticas são muitas operações de IO acontecendo ao mesmo tempo, então se temos uma engine como o node que consegue lidar com isso de uma forma muito boa, podemos lidar com essas operações de IO intensive de forma assíncrona e não vai travar a tread principal.",
      "description": "Continuando nossa série sobre NodeJS, falando um pouco sobre como funciona a Programação Assíncrona do JS, vamos fazer alguns testes para você ver a difere...",
      "keywords": [
        "para",
        "como",
        "vamos",
        "fazer",
        "dados",
        "opera",
        "ncrona",
        "ncrono",
        "contents",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/programacao-assincrona"
      }
    },
    {
      "id": "5e958ec282cd3b4e",
      "url": "https://devpleno.com/blog/stream-duplex/index",
      "title": "Hands-on: Streams Parte 03 - Duplex (Part 1)",
      "content": "Já falamos sobre Readable e Writable Streams, agora falaremos sobre o tipo Duplex. Ele nos permite tanto enviar quanto receber dados. Para testarmos este Stream, vamos utilizar a classe net.Socket, que implementa um Socket, o que permite fazer uma comunicação em rede no Node. Vale lembrar que o Socket é muito comum em outras linguagens como Java.\n\n**O que o Socket faz?**\n\nBasicamente um Socket abre uma porta na rede e fica 'ouvindo' essa porta, possibilitando que um cliente a acesse e feche uma conexão. Lembrando que Socket é um tipo Duplex, pois é possível ler e escrever dados deste Stream.\n\n**Vamos ao exemplo:**\n\nSe a última posição do process.argv for igual a server, teremos que rodar duas versões: a server, que irá ouvir e receber este Sockt, e uma versão client, que irá se conectar a este Socket.\n\n```jsx\nconst net = require('net');\nconst readLine = require('readLine')\nif(process.argv\\[ process.argv.length-1\\] === 'server'){\n//server\n    const server =  net.creatServer((socket) =>{\n    socket.on('data'), (data) => {\n        socket.write(data)\n        console.log('Receive from client ' + data)\n    })\n})\nserver.listen(1337, '127.0.0.1')\n\n}else{\n    //client\n    const rl = readLine.createInterface({\n        input: process.stdin,\n        output:process.stdout\n    })\n    const client = new.net.Socket()\n    client.connect(1337, '127.0.0.1', () => {\n        console.log('Connected');\n        cliente.write('Hello, server!');\n        rl.addListener('Line', (line) => client.write(line))\n    })\nclient.on('data', (data) => console.log('Received: ' + data))\nclient.on('close', ()=> console.log('Connection clesed'))\n```\n\nQuando criamos o servidor, iremos criar um callBack que retorna o Socket, ou seja, sempre que houver uma conexão nova ele irá chamar a arrow function que terá as duas funções do socket, socket.on que é equivalente ao readable Stream e o socket.write, que é equivalente ao writable Stream.\n\n**O que acontece neste código?**\n\n**No Server:**",
      "keywords": [
        "socket",
        "client",
        "para",
        "server",
        "data",
        "porta",
        "este",
        "stream",
        "cliente",
        "console"
      ],
      "metadata": {
        "title": "Hands-on: Streams Parte 03 - Duplex",
        "date": "2017-05-10",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/stream-duplex/index.md"
      }
    },
    {
      "id": "5efdb7bac4fec863",
      "url": "https://devpleno.com/blog/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web/index",
      "title": "Servidores Web -  Um pouco mais do back-end de uma Aplicação Web (Part 1)",
      "content": "Servidores Web são um serviço usado no servidor que fornece páginas ou algum asset para o front-end. Dentro de uma máquina, configuramos uma pasta (/site por exemplo) e quando a pessoa tenta acessar, por exemplo, na porta 80 dessa máquina, o servidor aponta para ela e essa pasta vai ser 'servida' para o front-end.\n\nEste tipo de arquitetura ainda é muito comum. Atualmente temos algumas outras alternativas, mas esse formato ainda é o mais utilizado.\n\nQuando o front-end solicita um .php, por exemplo, o servidor não sabe o que tem que fazer com esse .php, mas na configuração ele sabe que tem um php.exe que sabe o que deve ser feito, então ele envia o script php para o php.exe e este manda a resposta para o APACHE HTTPD. Por fim, o APACHE envia para o cliente. Essa estrutura acontece em grande parte dos sites em que acessamos, como nos que são feitos em Wordpress.\n\nGeralmente, quando é um arquivo como uma IMG ou um CSS, o APACHE já envia diretamente, pois ele já sabe que não precisa pré-processar esses arquivos.\n\n**Quais as opções disponíveis no mercado?**\n\nO APACHE HTTPD - mais conhecido e utilizado para o PHP - o HAProxy, NgineX e o IIS da Microsoft. Podemos escolher qualquer um desses e configurar o site para rodar.\n\nAntigamente comparavam linguagens dizendo coisas como: \"O PHP é mais lento que o NodeJS\", mas essa comparação é um pouco injusta, já que o PHP precisa do APACHE, que se não for configurado para ser apto a receber muita requisição, pode atrapalhar os acessos do site. Para compararmos as duas, temos que desconsiderar o APACHE ou colocá-lo na frente do Node também.\n\nHoje temos algumas linguagens que não precisam de servidor WEB como é o caso do NodeJS, pois ele já é um servidor embutido, já consegue abrir uma porta e responder solicitações por si só, e por esse motivo ele acaba sendo um pouco mais rápido e visível.",
      "keywords": [
        "para",
        "servidor",
        "apache",
        "mais",
        "sabe",
        "como",
        "front",
        "site",
        "exemplo",
        "quando"
      ],
      "metadata": {
        "title": "Servidores Web -  Um pouco mais do back-end de uma Aplicação Web",
        "date": "2017-05-23",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ServidorWeb.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web/index.md"
      }
    },
    {
      "id": "5f0967e73af96aea",
      "url": "https://devpleno.com/blog/spread-operator/index",
      "title": "Testando o Spread Operator: Novidade do ES6 (Part 2)",
      "content": "<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Uft_UkXtqT0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades.\n\nAh, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "spread",
        "operator",
        "quando",
        "criar",
        "exemplo",
        "const",
        "valores",
        "embed",
        "bastante"
      ],
      "metadata": {
        "title": "Testando o Spread Operator: Novidade do ES6",
        "date": "2017-05-05",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "SpreadOperator.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/spread-operator/index.md"
      }
    },
    {
      "id": "5f33201258c21668",
      "url": "https://devpleno.com/blog/pegadinha-de-entrevistas-de-javascript/index",
      "title": "Pegadinha #1 de entrevistas em JavaScript (Part 1)",
      "content": "Hoje quero comentar uma questão muito comum em entrevistas de JavaScript.\n\nQual é a saída desse código?\n\n```jsx\nconst arr = ['a', 'b', 'c', 'd']\nfor (var i = 0; i < arr.length; i++) {\n  setTimeOut(() => {\n    console.log(i, arr[i])\n  }, 0)\n}\nconsole.log('out', i)\n```\n\nDetalhe que estamos utilizando um setTimeOut com um zero, mas poderia ser qualquer valor.\n\nO primeiro detalhe é que percebemos que o out saiu primeiro com o número 4. O 'var' foi definido dentro do for, porém eu consegui dar um console log lá é baixo. Podemos chegar a conclusão que ele não respeitou o escopo. Outro ponto importante é que ele aconteceu antes do restante, isso acontece porque sempre que utilizamos o setTimeOut, ele leva essa execução da arrow function para dentro do event loop.\n\nComo o i já está com 4, ele não é um número válido, pois nosso array inicia-se em zero e termina em 3. Por esse motivo virá o seguinte:\n\n```jsx\nout 4\n\n4 undefined\n4 undefined\n4 undefined\n4 undefined\n```\n\nComo arrumamos essa função?\n\nTemos algumas formas de arrumar isso. Existe uma bem simples e algumas que podemos brincar um pouco mais.\n\nA primeira bem simples é trocar o var por let:\n\n```jsx\nfor (let i=0; i<arr.length; i++){\n    setTimeOut(() => {\n    console.log(i, arr[i])\n    },0)\n\n```\n\nAgora funcionou perfeitamente:\n\n```jsx\n0 'a'\n1 'b'\n2 'c'\n3 'd'\n\n```\n\nPor que essa diferença?\n\nQuando estamos com o var, seria equivalente a quando ele estiver executando o código ele puxa todos os vars pra cima, isso é conhecido como hoisting.\n\nPor esse motivo, sempre que possível, utilize let e const.\n\nOutra maneira seria transformar em setTimeOut em uma maneira que eu consiga injetar as variáveis dentro dele mesmo, como uma self invoked:\n\n```jsx\nsetTimeOut(\n  (function (ii) {\n    return () => {\n      console.log(ii, arr[ii])\n    }\n  })(i),\n  0\n)\n```\n\nIremos executar a função e a partir da function o ii vai estar válido. Assim funcionará também do jeito que esperávamos.\n\nConfira o video:",
      "keywords": [
        "settimeout",
        "console",
        "como",
        "undefined",
        "embed",
        "dentro",
        "isso",
        "essa",
        "function",
        "responsive"
      ],
      "metadata": {
        "title": "Pegadinha #1 de entrevistas em JavaScript",
        "date": "2017-11-07",
        "tags": "['Javascript']",
        "thumbnail": "Pegadinha.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/pegadinha-de-entrevistas-de-javascript/index.md"
      }
    },
    {
      "id": "5f64c24ceaffbc20",
      "url": "https://devpleno.com/o-que-e-o-app-use-no-nodejsexpressjs",
      "title": "O que é o app.use no NodeJS/ExpressJS? - DevPleno (Part 1)",
      "content": "Javascript\n\n## O que é o app.use no NodeJS/ExpressJS?\n\nT\nPor Tulio Faria • 28 de dezembro de 2016\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nVocê já reparou que praticamente qualquer módulo que plugamos no Express atualmente é feito através do uso do app.use? Mas afinal, o que é o app.use?\n\nPs: você pode ver este material em vídeo também no fim do post\n\nA partir da versão 4 do Express, a extensibilidade é realizada por meio do uso de middlewares. Middleware é um bloco de código que é executado em todas as requisições ou nas que respeitam um certo padrão. E é respeitado a ordem de adição de cada um deles.\n\nPara adicionarmos um middleware em nosso app (ou router):\n\nconst express = require('express')\nconst app = express()\n\n// middleware\napp.use(function (req, res, next) {\nconsole.log('middleware 1')\nnext()\n})\n\napp.get('/', function (req, res) {\nconsole.log('requisição')\nres.send('Requisição!')\n})\n\napp.listen(3001, function () {\nconsole.log('Example app listening on port 3000!')\n})\nAlguns pontos importantes:\n\n- Este middleware será aplicado antes da execução de qualquer rota que vier depois dele;\n\n- Caso não adicionamos o next(), as rotas subsequentes nem serão executadas. Por isso, middleware é uma ótima forma de fazer controle de acesso a rotas.\n\nVamos analisar este outro exemplo:\n\nconst express = require('express')\nconst app = express()\n\napp.use(function (req, res, next) {\nconsole.log('middleware 1')\nnext()\n})\napp.use(function (req, res, next) {\nconsole.log('middleware 2')\nnext()\n})\napp.get('/', function (req, res) {\nconsole.log('requisição')\nres.send('Requisição!')\n})\n\napp.use(function (req, res, next) {\nres.send('nada encontrado')\n})\napp.get('/url', function (req, res) {\nconsole.log('requisição')\nres.send('Requisição!')\n})",
      "description": "Entenda o que é o app.use no Express.js, como funciona o sistema de middlewares e como usá-lo para organizar sua aplicação Node.js.",
      "keywords": [
        "function",
        "requisi",
        "next",
        "console",
        "middleware",
        "express",
        "send",
        "admin",
        "const",
        "https"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/o-que-e-o-app-use-no-nodejsexpressjs"
      }
    },
    {
      "id": "5f6725523db87484",
      "url": "https://devpleno.com/tag/carreira/6",
      "title": "Carreira - Pagina 6 - DevPleno",
      "content": "Carreira\n\n## Arquivo de Insights\n\n93 posts encontrados com a tag Carreira\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 6 de jul. de 2017 Você precisar ter DOM para ser um bom profissional?](/dom)\n\n[Carreira 6 de jul. de 2017 Preciso de investimento para minha ideia?](/investimento-para-executar-ideias)\n\n[Carreira 5 de jul. de 2017 Como escolher uma linguagem de tecnologia?](/como-escolher-linguagem-de-tecnologia)\n\n[Carreira 5 de jul. de 2017 Melhoria Contínua](/melhoria-continua)\n\n[Carreira 3 de jul. de 2017 Freelancer no exterior: 7 dicas para ter sucesso na carreira](/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira)\n\n[Carreira 28 de jun. de 2017 Precificação de softwares: você sabe como fazer?](/precificacao-de-softwares-voce-sabe-como-fazer)\n\n[Carreira 22 de jun. de 2017 Qual é a sua desculpa?](/qual-a-sua-desculpa)\n\n[Carreira 20 de jun. de 2017 Quantas linguagens devo programar?](/quantas-linguagens-programar)\n\n[Carreira 8 de jun. de 2017 Por que o Salário em TI é baixo? DevPleno Reponde](/salario-em-ti)\n\n[Carreira 7 de jun. de 2017 Desenvolvedor Full Stack: o que é e como se tornar?](/desenvolvedor-full-stack-o-que-e-e-como-se-tornar)\n\n[Carreira 24 de mai. de 2017 Qual é o seu maior desafio nesse momento?](/qual-seu-maior-desafio)\n\n[Carreira 23 de mai. de 2017 Como aumentar a produtividade diminuindo a troca de contexto](/como-aumentar-a-produtividade)\n\n[Anterior](/tag/carreira/5)6 / 8[Próxima](/tag/carreira/7)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "2017",
        "como",
        "para",
        "qual",
        "algoritmos",
        "ferramentas",
        "fundamentos",
        "javascript",
        "nodejs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/carreira/6"
      }
    },
    {
      "id": "5f81c4756805a355",
      "url": "https://devpleno.com/ensino-formal-ou-cursos-livres",
      "title": "Ensino Formal ou Cursos Livres - Por qual optar? - DevPleno (Part 2)",
      "content": "Portanto, a dica é analisar o custo-benefício. O que você precisa no momento? Qual o seu objetivo para o futuro?\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Ensino%20Formal%20ou%20Cursos%20Livres%20-%20Por%20qual%20optar%3F&url=https%3A%2F%2Fdevpleno.com%2Fensino-formal-ou-cursos-livres) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fensino-formal-ou-cursos-livres)",
      "description": "Que tipo de ensino e de novos estudos devemos buscar: o ensino formaL (curso técnico, faculdade, pós graduação, etc) ou cursos livres (cursos pela internet...",
      "keywords": [
        "ensino",
        "cursos",
        "formal",
        "livres",
        "para",
        "https",
        "precisa",
        "pouco",
        "carreira",
        "qual"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/ensino-formal-ou-cursos-livres"
      }
    },
    {
      "id": "5ffc7dab32e3ff98",
      "url": "https://devpleno.com/blog/chainability-com-javascript/index",
      "title": "Chainability com Javascript (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/L3dyVrLP6Ic\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "total",
        "return",
        "para",
        "fazer",
        "como",
        "podemos",
        "const",
        "initial",
        "embed",
        "jquery"
      ],
      "metadata": {
        "title": "Chainability com Javascript",
        "date": "2017-11-10",
        "tags": "['Javascript']",
        "thumbnail": "CHAINABILITY-790x400.png",
        "author": "Tulio Faria",
        "keywords": "dicas",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/chainability-com-javascript/index.md"
      }
    },
    {
      "id": "603963044fd8288f",
      "url": "https://devpleno.com/blog/gerenciador-de-series-p1/index",
      "title": "Construindo um App gerenciador de séries com ReactJS (Part 2)",
      "content": "Já o Yarn é bom instalar porque o Create React-App usa muito o Yarn, que é uma NPM com mais coisas, isso faz com que o Create React-App rode mais rápido.\n\nDepois podemos criar realmente nosso projeto:\n\n```jsx\ncreate-react-app primeiro-projeto\n```\n\nPerceba que ele está instalando o React, react-dom, and react-scripts. Quando criamos um projeto com o Create React-App, ele coloca dependência apenas para esses três módulos, isso deixa o projeto mais leve e fica mais claro quais dependências estamos colocando.\n\nCom isso, ele vai criar dentro do diretório 'primeiro-projeto' e vamos acessar esse diretório utilizando cd e depois startando o yarn:\n\n```jsx\ncd primeiro-projeto/\nyarn start\n```\n\nele irá abrir o projeto: Se você conseguiu acessar, tem um projeto em React funcionando. Vou parar o servidor um pouco e fazer o seguinte:\n\n![React iniciado](4f8e92c7-838a-4fc8-b230-fb889b56f0cd.png)\n\n```jsx\ncode./\n```\n\nEle vai abrir o Visual Studio Code com esse diretório aberto. Note que ao criar nosso primeiro projeto, ele já criou algumas coisas como o package.json e dentro dele as dependências são muito curtas.\n\nVamos entrar em index, já que ele é nosso ponto de entrada, ele instancia um componente chamado app e renderiza isso no elemento root que está em public/index.html.\n\n![index reactjs](ccd333e3-f2ee-497c-afe2-4626167a0273.png)\n\nEle irá trocar esse div root pelo componente app. Falando em componente, o React usa componentes como sua base mínima de código.\n\n**O que é um componente?**\n\nUm componente no React é uma junção de um 'template' mais um pouco de comportamento e, dependendo de como organizamos isso, podemos ter mais ou menos elementos. Essa forma de utilizar componentes permite uma reutilização de códigos muito grande. Por exemplo, se abrir o app.js, você vai perceber que há um class app extends component, que é do próprio React que estamos estendendo.\n\nTambém é possível perceber que temos um método Render que renderiza algo na tela. Temos como se fosse um HTML:",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "title": "Construindo um App gerenciador de séries com ReactJS",
        "date": "2017-07-19",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "ReactJS-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/gerenciador-de-series-p1/index.md"
      }
    },
    {
      "id": "609dc6916c0498a6",
      "url": "https://devpleno.com/gerenciador-de-series-p1",
      "title": "Construindo um App gerenciador de séries com ReactJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Construindo um App gerenciador de séries com ReactJS\n\nT\nPor Tulio Faria • 19 de julho de 2017\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nNesta nova série, vamos construir um aplicativo na prática, mais especificamente um gerenciador de séries, para você nunca mais esquecer as séries que assistiu no Netflix e também as que você tem para assistir que algum amigo te indicou. Para isso, vamos utilizar o ReactJS, a tecnologia que eu utilizo no meu dia a dia nos projetos para uma empresa americana e nos que a minha empresa desenvolve. É um potencial muito grande para o mercado conhecer e saber desenvolver projetos com o ReactJS.\n\nAtualmente dizemos que o ReactJS é unanimidade em todos os lugares, pois podemos desenvolver para WEB, aplicativos nativos para celular, Windows… basicamente tudo. Por esse motivo, está muito em alta e é importante aprender essa biblioteca neste momento.\n\nHoje vamos preparar a máquina para criar o projeto, configurando como vamos armazenar esses dados para podemos fazer as quatro operações que são inserir um registro novo nesse banco, retornar esses registros do banco, atualizá-los e excluir os registros.\n\nNo fim disso, vamos fazer um primeiro projetinho para que você saiba como é um componente em React, ver funcionando e falar um pouco sobre JSX, que é a linguagem que o React usa para conseguir manipular as coisas na tela. Nas próximas aulas, vamos começar realmente a construir essa aplicação com navegação e tudo mais. Outro ponto legal é que você pode utilizar essa aplicação como portfólio.\n\nVAMOS LÁ!\n\nPara construir esse projeto, vamos precisar de três módulos:",
      "description": "Nesta nova série, vamos construir um aplicativo na prática, mais especificamente um gerenciador de séries, para você nunca mais esquecer as séries que assi...",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/gerenciador-de-series-p1"
      }
    },
    {
      "id": "61b3b2d4cbd88b0d",
      "url": "https://devpleno.com/blog/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira/index",
      "title": "Como as maratonas de programação da faculdade impactaram a minha carreira (Part 3)",
      "content": "Mas agora vem uma parte mais importante de toda essa história: a competição foi muito legal, ser premiado melhor ainda. Porém, naquele momento, eu não sabia o quanto ter vivenciado tudo isso teria de impacto na minha carreira.\n\n## Como as maratonas de programação da faculdade me ajudaram a prosperar na carreira de Dev\n\nMuitas vezes, os alunos ignoram atividades extracurriculares durante a faculdade e não dão a importância que elas realmente merecem. No meu caso, foi justamente nessas maratonas que eu passei a treinar programação e, sem dúvidas, isso fez toda a diferença na minha carreira e impactou (positivamente) na criação do DevPleno.\n\nQuase 9 anos depois, fui participar do processo seletivo da Toptal, e adivinhem: em uma das fases (por sinal uma das que mais reprovam) o objetivo era resolver o máximo de problemas em 1 hora. Além do formato parecer muito com a maratona de programação, os tipos de problemas também eram bem semelhantes… Eu já tinha feito isso antes! 🙂\n\n![Tulio Faria](35b9725c-0bb4-414a-8ecd-760771c84d88.jpg)\n\nE deu certo! Não passei de primeira – e está tudo bem. Mas o melhor foi que, mesmo não tendo passando de primeira, a mentalidade já vinha sendo preparada para conseguir passar na segunda tentativa.\n\n## Aproveite as oportunidades\n\nMais importante do que ter oportunidades é saber aproveitar cada uma delas ao máximo. Às vezes, estamos com a “faca e o queijo na mão” e não enxergamos o quão preciosas são as chances que aparecem na nossa vida.\n\nPor isso, agarre cada oportunidade que surgir na sua vida, seja na faculdade, no trabalho, nas viagens, nos estudos… Veja cada momento como uma chance de se dedicar e explorar os conhecimentos ao máximo. Isso pode te levar a outro patamar e com certeza vai te fazer crescer. Muito.\n\nTalvez não agora… Talvez daqui 10 ou 20 anos, mas a semente vai estar plantada. Aproveite!\n\nPs 1: Aqui fiz uma brincadeira sobre utilizar Pascal, mas é notório que toda linguagem bem utilizada traz resultados.",
      "keywords": [
        "mais",
        "competi",
        "para",
        "como",
        "minha",
        "equipe",
        "muito",
        "isso",
        "programa",
        "pascal"
      ],
      "metadata": {
        "title": "Como as maratonas de programação da faculdade impactaram a minha carreira",
        "date": "2019-03-19",
        "tags": "['Carreira']",
        "thumbnail": "top-tal-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira/index.md"
      }
    },
    {
      "id": "61edb8869859b035",
      "url": "https://devpleno.com/blog/metronomo-com-javascript/index",
      "title": "Metrônomo com JavaScript (Part 2)",
      "content": "```jsx\n<script>\n    const bpm = document.getElementById('bpm')\n    const h1 = document.querySelector('h1')\n    const play = document.getElementByld('play')\n    const.audio = document.querySelector('audio')\n    let currentBpm = 40\n    function tick(){\n        audio.currentTime= 0\n        audio.play()\n    }\n    bpm.addEventListener('change', function(){\n        h1.innerHTML = this.value + ' bpm'\n        currentBpm = parseInt(this.value)\n    })\n    play.addEventListener('click', function(){\n        const timer = setInterval(tick, 100)\n    })\n    </script>\n```\n\nAgora vamos pensar um pouco: Se precisamos ter 40 batimentos por minuto e o minuto tem 60 segundos, 60 segundos tem 60 mil milissegundos, temos que distribuir 40 batidas dentro de 60 mil, então vamos dividir isso no valor do Bpm, ficando assim:\n\n```jsx\nplay.addEventListener('click', function () {\n  const timer = setInterval(tick, (60 * 1000) / currentBpm)\n})\n```\n\nPrecisamos agora de uma forma para desligar essa batida, para isso vamos usar declarar o let isPlaying, o timer, e um if para, caso ele estiver tocando, darmos um clearInterval nesse timer.\n\n```jsx\n<script>\n    const bpm = document.getElementById('bpm')\n    const h1 = document.querySelector('h1')\n    const play = document.getElementByld('play')\n    const.audio = document.querySelector('audio')\n    let currentBpm = 40\n    let isPlaying = false\n    let timer = null\n    function tick(){\n        audio.currentTime= 0\n        audio.play()\n    }\n    bpm.addEventListener('change', function(){\n        h1.innerHTML = this.value + ' bpm'\n        currentBpm = parseInt(this.value)\n    })\n    play.addEventListener('click', function(){\n        if(isPlaying){\n            clearInterval(timer)\n        } else {\n            const timer = setInterval(tick, (60*1000)/currentBpm)\n        }\n        isPlaying = !isPlaying\n    })\n</script>\n```",
      "keywords": [
        "play",
        "tick",
        "para",
        "const",
        "timer",
        "vamos",
        "isplaying",
        "valor",
        "audio",
        "currentbpm"
      ],
      "metadata": {
        "title": "Metrônomo com JavaScript",
        "date": "2017-05-26",
        "tags": "['Javascript']",
        "thumbnail": "Metronomo.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/metronomo-com-javascript/index.md"
      }
    },
    {
      "id": "6208e9053e480f84",
      "url": "https://devpleno.com/mono-ou-multi-thread-poo-para-js",
      "title": "Mono ou multi thread - POO para JS - DevPleno (Part 4)",
      "content": "[](https://twitter.com/intent/tweet?text=Mono%20ou%20multi%20thread%20-%20POO%20para%20JS&url=https%3A%2F%2Fdevpleno.com%2Fmono-ou-multi-thread-poo-para-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmono-ou-multi-thread-poo-para-js)",
      "description": "Hoje vou continuar falando um pouco mais sobre como podemos fazer a transição de uma linguagem orientadaobjeto, como PHP ou Java, para JavaScript cada vez ...",
      "keywords": [
        "stock",
        "para",
        "const",
        "consumer",
        "math",
        "isso",
        "console",
        "javascript",
        "producer",
        "length"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/mono-ou-multi-thread-poo-para-js"
      }
    },
    {
      "id": "6216b6065584d497",
      "url": "https://devpleno.com/blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! (Part 4)",
      "content": "O MFS tende a ser usado por equipes reduzidas. Ele é pautado na diminuição de riscos e na qualidade do produto final. O objetivo é identificar as falhas mais comuns e evitá-las.\n\n### 4. Dynamic System Development Model (DSDM)\n\nO DSDM pode ser chamado de pai dos métodos ágeis. Ele é destinado ao desenvolvimento de projetos com [orçamento fixo](https://www.devpleno.com/precificacao-em-software?utm_source=blog&utm_campaign=rc_blogpost), assim como prazos curtos e bem definidos. O DSDM se difere das demais metodologias ágeis pois é composto por processos interligados de modelagem e é restrito no tempo. Assim, ele é um método um pouco mais rígido que os outros.\n\n### 5. Scrum\n\nMais conhecido atualmente, algumas pessoas acreditam que Scrum é a definição de metodologia ágil. Sua grande fama não veio ao acaso: o Scrum tem uma estrutura de planejamento e divisão de tarefas em ciclos que permitem que outros métodos ágeis sejam implementadas no próprio Scrum.\n\nExistem diversos tutoriais sobre como funciona o Scrum. Mas, de uma maneira mais simples: é criado um Product Sprint Backlog, nele são listadas as funcionalidades que precisam ser mantidas no programa. Cria-se, em cima disso, ciclos de implementação chamados sprints. Entre as definições e trabalhos de cada sprint existem reuniões de equipe.\n\nAssim, a medida que cada sprint é feito, outro se inicia. E esse ciclo continua até a conclusão do projeto.\n\n## Gostou das metodologias? Então implemente-as!\n\nAgora você já entendeu o que é uma metodologia ágil, como funciona, o que a rege, quais são seus principais norteadores e quais as principais representantes dessa forma de trabalhar. Toda a informação ficou clara?",
      "keywords": [
        "mais",
        "para",
        "geis",
        "metodologia",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "title": "Metodologia ágil: entenda o que é e como se aplica para programadores!",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "Metodologia.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index.md"
      }
    },
    {
      "id": "621da243842ae646",
      "url": "https://devpleno.com/blog/hands-on-slack/index",
      "title": "Hands-on: Slack",
      "content": "Neste hands-on iremos fazer um bot simples que envia notificações utilizando o Slack.\n\nO Slack vem sendo bastante utilizado para comunicação corporativa (eu mesmo uso bastante). E concentrar informações a respeito da sua empresa ou projeto nele é bem interessante.\n\n[Para criar um bot no slack entre aqui.](https://my.slack.com/apps/A0F7YS25R-bots)\n\n```jsx\nconst token = 'xoxb-....'\nconst Api = require('@slack/client').WebClient\nconst api = new Api(token)\nconst RtmClient = require('@slack/client').RtmClient\nconst rtm = new RtmClient(token)\nconst RTM_EVENTS = require('@slack/client').RTM_EVENTS\napi.channels.list(function (err, info) {\n  const channelId = info.channels\n    .filter((channel) => channel.name === 'general')\n    .map((channel) => channel.id)[0]\n  rtm.on(RTM_EVENTS.MESSAGE, (msg) => {\n    rtm.sendMessage(msg.text, channelId)\n  })\n\n  rtm.start()\n})\n```\n\nJá pensou o que você vai criar notificar no Slack para sua equipe de forma automática?\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/dfM5ZPETIEI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "slack",
        "const",
        "para",
        "https",
        "channel",
        "embed",
        "token",
        "require",
        "client",
        "rtmclient"
      ],
      "metadata": {
        "title": "Hands-on: Slack",
        "date": "2017-03-06",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Hands0nSlack.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-slack/index.md"
      }
    },
    {
      "id": "627b132003446cd5",
      "url": "https://devpleno.com/servidor-http-basico-2",
      "title": "Servidor HTTP Básico - NodeJS Primeiros Passos - DevPleno (Part 3)",
      "content": "Claro que para criarmos uma aplicação mais avançada, iremos utilizar alguns módulos de terceiros para que esse processo todo fique um pouco mais fácil e mais robusto, mas essa é só uma parte introdutória.\n\nConfira o passo a passo no vídeo:\n\nFique à vontade para deixar suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Servidor%20HTTP%20B%C3%A1sico%20-%20NodeJS%20Primeiros%20Passos&url=https%3A%2F%2Fdevpleno.com%2Fservidor-http-basico-2) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidor-http-basico-2)",
      "description": "Na série NodeJS Primeiros Passos, você poderá os conceitos básicos de Javascript e NodeJS e, assim, poder colocar a mão na massa. Neste primeiro post, conf...",
      "keywords": [
        "http",
        "servidor",
        "node",
        "nodejs",
        "https",
        "devpleno",
        "para",
        "contents",
        "javascript",
        "criar"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/servidor-http-basico-2"
      }
    },
    {
      "id": "62caa1c654bd0b68",
      "url": "https://devpleno.com/blog/cheerio/index",
      "title": "Cheerio: Uma implementação jQuery para Node (Part 2)",
      "content": "$('p').each(function () {\n      console.log($(this).html())\n    })\n  }\n})\n```\n\nO Cheerio não é um browser completo, então vai permitir que você apenas navegue pelo HTML, isso é muito legal para fazermos um crawler, por exemplo, podemos acessar um outro site como se fosse um navegador e escolher a informação que a gente quer, usando seletores do próprio jQuery.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/j6dSq6k5Q6g\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.",
      "keywords": [
        "cheerio",
        "html",
        "para",
        "request",
        "function",
        "const",
        "require",
        "body",
        "https",
        "jquery"
      ],
      "metadata": {
        "title": "Cheerio: Uma implementação jQuery para Node",
        "date": "2017-08-14",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "CHEEERIO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/cheerio/index.md"
      }
    },
    {
      "id": "62e75f3fa0d61b5a",
      "url": "https://devpleno.com/precificacao-de-softwares-voce-sabe-como-fazer",
      "title": "Precificação de softwares: você sabe como fazer? - DevPleno (Part 3)",
      "content": "Cada tipo de projeto exige um nível de experiência para que seja conduzido corretamente. Por exemplo, uma página de HTML pode necessitar de um profissional com menos experiência do que um software que exija um analista de dados, o qual terá de empregar estatística, matemática, programação e outros conhecimentos no projeto.\n\nSe você domina mais de um tipo de [linguagem](https://www.devpleno.com/como-escolher-linguagem-de-tecnologia?utm_source=blog&#x26;utm_campaign=rc_blogpost) de programação, sabe trabalhar com análises especiais, entre outras competências, você poderá elevar o seu preço desde que esses conhecimentos sejam necessários nos projetos assumidos. Ou que possam entregar um adicional, otimizando-os.\n\nAlém disso, profissionais com maior experiência podem entregar serviços mais bem-acabados, justificando o valor a mais que cobram, mesmo que seja numa área com muita concorrência. Aqueles que possuem capacitação para consultoria também podem cobrar valores ainda maiores.\n\n### Valor agregado\n\nPara definir seu preço, você também precisa mensurar o quanto o seu trabalho rende. Por exemplo, se você cobra R$ 80,00 por hora, é importante que o seu trabalho renda para o cliente acima desse valor, como R$ 100,00 ou R$ 120,00 reais por hora.\n\nÉ importante também que você entregue um adicional que os seus concorrentes não façam, como um atendimento mais personalizado, possibilidade de maior número de ajustes, entre outros benefícios. Esses pontos possibilitam que você eleve o seu preço.\n\n### Os custos envolvidos\n\nComo mencionado acima, você precisa considerar seus custos, como a quantia paga com internet e telefone. É preciso pegar os valores de ambas e dividir pelas horas trabalhadas, para que você some esse número ao seu preço cobrado por hora, mesmo que existam momentos em que você utilize esses serviços para fins diferentes do trabalho. Afinal, você está compondo a sua remuneração para pagá-los também.",
      "description": "Um dos desafios de quem trabalha na área de tecnologia, especificamente em desenvolvimento de programas, é a precificação de softwares. Por envolver ativos...",
      "keywords": [
        "para",
        "como",
        "software",
        "valor",
        "mais",
        "ncia",
        "hora",
        "tamb",
        "seus",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/precificacao-de-softwares-voce-sabe-como-fazer"
      }
    },
    {
      "id": "630aef8fb2fe41d5",
      "url": "https://devpleno.com/blog/streams-parte-1/index",
      "title": "Hands-on: Streams - Parte 1 (Part 2)",
      "content": "```jsx\nconst fs = require('fs')\nconst readable = sf.crateReadStream('arquivo.txt')\nreadable.on('data', (data) => {\n  console.log(data.toString())\n})\n```\n\nQuando colocamos o readable.on, ele 'ouve' o tipo data e o readable entra em modo flowing, também conhecido como modo push. Este modo é muito utilizado em operações de rede, como por exemplo ler um upload de um arquivo de um usuário (javaScritp client side), com isso vamos tratando estes dados na medida que vai sendo enviado.\n\nPodemos criar, também, uma forma em que o readable nos envie a leitura de tempo em tempo usando readable.pause e readable.resume, da seguinte forma:\n\n```jsx\nconst fs = require('fs')\nconst readable = sf.crateReadStream('arquivo.txt')\nreadable.on('data', (data) => {\n  console.log(data.toString())\n  readable.pause()\n  setTimeout(() => readable.resume(), 2000)\n})\n```\n\nNo exemplo acima, o readable nos retorna partes do arquivo a cada 2 segundos. A segunda forma que podemos fazer é usando o paused mode. Quando o arquivo tiver um evento readable (consegue ler dados do Stream), eu solicito o envio desses dados ao invés dele me enviar de tempo em tempo. Fazemos isso usando o chunk.\n\n```jsx\nconst fs = require('fs')\nconst readable = sf.crateReadStream('arquivo.txt')\nreadable.on('readable', () => {\n  while ((chunk = readable.read())) {\n    console.log(chunk.toString())\n  }\n})\n```\n\n**Qual a vantagem do modo paused?**\n\nEu posso ir processando uma pequena quantia de dados de acordo com o que eu quero.\n\n**Conclusão**\n\nEssa foi uma noção inicial dos readable Streams, vamos passar por todos os outros modos, mas dentro do readable temos os 2 modos, o pause e o flowing. Confira o hands-on completo no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/PcvJm2QqSS4\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "readable",
        "dados",
        "arquivo",
        "stream",
        "data",
        "para",
        "vamos",
        "const",
        "exemplo",
        "isso"
      ],
      "metadata": {
        "title": "Hands-on: Streams - Parte 1",
        "date": "2017-05-08",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/streams-parte-1/index.md"
      }
    },
    {
      "id": "64876d7e04f51969",
      "url": "https://devpleno.com/blog/handlebars-template-html-simples/index",
      "title": "Template HTML simples - Hands-on Handlebars (Part 3)",
      "content": "<script  src=\"https://code.jquery.com/jquery-3.2.1.slim.min.js\"></script>\n\n        <script src=\"https://cdnjs.cloudflare.com/ajax/libs/handleb\n        ars.js/4.0.10/handlebars.amd.js\"</script>\n\n        <script>\n            $function(){\n                $.get('dados.json't=' +new Date().getTime(), function(data){\n                    const templeteString = $(\"#person-templete\").html();\n                    const personTemplete = Handlebars.compile(templeteString);\n                    const html = personTemplete({ people: data })\n                    $(\"people\").html(html);\n                }\n            })\n        </script>\n    </body>\n</html>\n```\n\nPerceba que o Name e o lastName ele pega de dentro do contexto do people do dados.json. Outra coisa legal é que se eu colocar algo dentro de dados.json:\n\n```jsx\n[{\n    \"name\": \"Tulio\",\n    \"lastName\": \"Faria\",\n    \"adress\": {\n        \"city\": \"Pouso Alegre\"\n    }\n},{\n    \"name\": \"Vitor\",\n    \"lastName\": \"Machado\"\n    \"adress\": {\n        \"city\": \"São Paulo\"\n    }\n}]\n```\n\nPodemos utilizar a seguinte estrutura:\n\n```jsx\n{{#earch people}}\n    <div>\n        <strong>Name: </strong>{{nome}}<br />\n        <strong>Last Name: </strong>{{lastName}}<br />\n        <strong>City: </strong>{{adress.city}}<br />\n        <hr />\n    </div>\n{{/each}}\n```\n\nPerceba que estamos pegando o adress e o que tem dentro dele. Isso é bem bacana, podemos fazer muitas coisas com Handlebars.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-bJl1zBJbFU\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "script",
        "strong",
        "html",
        "name",
        "people",
        "handlebars",
        "lastname",
        "function",
        "para",
        "dados"
      ],
      "metadata": {
        "title": "Template HTML simples - Hands-on Handlebars",
        "date": "2017-06-13",
        "tags": "['Javascript']",
        "thumbnail": "HandleBars.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/handlebars-template-html-simples/index.md"
      }
    },
    {
      "id": "648773617c11b98a",
      "url": "https://devpleno.com/blog/o-que-fazer-para-dar-certo/index",
      "title": "O que fazer para dar certo?",
      "content": "Hoje eu gostaria de responder uma coisa que eu ouço muito. As pessoas sempre me perguntam como que eu faço para dar certo. Como dar certo para trabalhar no exterior, nos projetos, no emprego novo, etc.\n\nUma coisa que eu venho refletindo de tudo que eu venho fazendo e coincidiu com o que um mentor meu me disse e eu achei fantástica é a seguinte:\n\nA primeira coisa é mudar de pensar e trocar o PARA por ATÉ. Comece a pensar nas coisas ATÈ conseguir alcançar seus objetivos, assim elas vão dar certo.\n\nPode parecer besteira, mas quando colocamos isso na cabeça, mudamos a forma de pensar e tudo muda. Faça as coisas até elas darem certo. Se você fizer isso, pode ter certeza que vai fazer muita diferença no seu mind-set.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/k1PaQVoV3Z4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "certo",
        "embed",
        "coisa",
        "pensar",
        "responsive",
        "https",
        "youtube",
        "como",
        "venho"
      ],
      "metadata": {
        "title": "O que fazer para dar certo?",
        "date": "2017-11-10",
        "tags": "['Carreira']",
        "thumbnail": "FazerPraDarCerto.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/o-que-fazer-para-dar-certo/index.md"
      }
    },
    {
      "id": "64ca391df80cc904",
      "url": "https://devpleno.com/fsl",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsl to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsl"
      }
    },
    {
      "id": "64cad928cd0c1ba7",
      "url": "https://devpleno.com/claude-code-describe-session",
      "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos - DevPleno (Part 1)",
      "content": "Ferramentas\n\n## Como Usar o Describe Session do Claude Code para Conectar Projetos\n\nT\nPor Tulio Faria • 5 de abril de 2026\n\n*\n\n[Ferramentas](/tag/ferramentas)\n\nO **describe session** é uma funcionalidade do Claude Code que permite que uma sessão descreva seu próprio contexto de forma estruturada — como se estivesse gerando um briefing para outro agente ou sessão.\n\nNa prática, você pede para o Claude explicar o que está acontecendo no projeto atual, e ele gera uma descrição completa: o que foi feito, qual é o estado atual e o que a próxima sessão precisa saber para continuar o trabalho.\n\nIsso é especialmente útil quando você trabalha com **dois ou mais projetos que precisam se comunicar**, como um back-end e um front-end separados.\n\n## Por que isso é útil ao trabalhar com múltiplos projetos\n\nQuem desenvolve com projetos separados conhece o problema: você está no projeto A e precisa que o projeto B entenda exatamente o que mudou, quais endpoints estão disponíveis ou como uma integração deve funcionar.\n\nSem o describe session, a alternativa seria:\n\n- Escrever manualmente um resumo do que foi feito\n\n- Copiar trechos de código entre sessões\n\n- Tentar explicar o contexto do zero em cada nova sessão\n\nCom o describe session, o próprio Claude gera essa passagem de contexto de forma automática e estruturada. Ele entende o projeto, sabe o que foi implementado e consegue descrever isso como outro agente faria.\n\n## Como usar na prática\n\nVeja um caso real: um **CMS** criado com Claude Code que possui um **front-end** separado fazendo a integração.\n\nO front-end começou a ter dificuldades para consumir a API do CMS. Em vez de abrir a sessão do front-end e tentar explicar tudo manualmente, o caminho foi diferente:\n\n- **Abra a sessão do Claude Code no projeto do CMS** (o projeto que tem o contexto que você quer compartilhar)",
      "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
      "keywords": [
        "claude",
        "para",
        "sess",
        "como",
        "session",
        "describe",
        "contexto",
        "code",
        "outro",
        "projeto"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/claude-code-describe-session"
      }
    },
    {
      "id": "64dc88a58459d2cd",
      "url": "https://devpleno.com/salario-em-ti",
      "title": "Por que o Salário em TI é baixo? DevPleno Reponde - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Por%20que%20o%20Sal%C3%A1rio%20em%20TI%20%C3%A9%20baixo%3F%20DevPleno%20Reponde&url=https%3A%2F%2Fdevpleno.com%2Fsalario-em-ti) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsalario-em-ti)",
      "description": "Uma pergunta que ouço com frequência, principalmente dos profissionais da área de T.I, é: &#34;Por que o salário em TI é baixo?&#34;. A primeira coisa que eu acho ...",
      "keywords": [
        "isso",
        "carreira",
        "baixo",
        "para",
        "mais",
        "https",
        "devpleno",
        "alto",
        "muito",
        "essa"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/salario-em-ti"
      }
    },
    {
      "id": "64f78ee2cc586f54",
      "url": "https://devpleno.com/loopsrepeticoesiteracoes-no-jsx-do-react",
      "title": "Loops/Repetições/Iterações no JSX do React - DevPleno (Part 1)",
      "content": "Javascript\n\n## Loops/Repetições/Iterações no JSX do React\n\nT\nPor Tulio Faria • 27 de dezembro de 2016\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nJSX é a sintaxe que permite escrevermos HTML dentro do Javascript (sim, isso parece estranho, rs) em componentes ReactJS. E um fator muito interessante do JSX é que ele não permite trocar o escopo, assim como é possível fazer um loop/repetição em PHP. Onde apenas deixamos o for/foreach/while dentro do escopo do PHP e o HTML fora do escopo seria repetido.\n\nAlgo como:\n\n&#x3C;ul>&#x3C;!-- aqui temos HTML normalmente -->\n&#x3C;?php for($i=0; $i&#x3C;10; $i++){ // trocamos o escopo para PHP ?>\n&#x3C;li>&#x3C;?php echo $x ?>&#x3C;/li>&#x3C;!-- aqui alternamos o escopo entre HTML/PHP -->\n&#x3C;?php } ?>\n&#x3C;/ul>\nPerceba que no exemplo anterior, sempre que queremos alternar para PHP, apenas usamos o &#x3C;?php. Em JSX podemos tentar fazer algo semelhante, porém isso não funcionaria. Pois JSX é Javascript, então não tem como alternarmos o escopo. :(\n\n## Forma 1:\n\nNesta maneira geramos fragmentos de JSX dentro de um array e escrevemos este array onde desejamos a nossa saída. Olhando o código fica mais simples entender:\n\nclass Loop1 extends React.Component {\nrender() {\nlet rows = []\nfor (let i = 0; i &#x3C; 5; i++) {\nrows.push(&#x3C;li>Num: {i}&#x3C;/li>)\n}\nreturn (\n&#x3C;div>\n&#x3C;h1>Loop 1:&#x3C;/h1>\n&#x3C;ul>{rows}&#x3C;/ul>\n&#x3C;/div>\n)\n}\n}\nApesar de funcionar bem, esta maneira acaba ficando um pouco confusa em componentes um pouco mais complexos.\n\n## Forma 2:\n\nNesta maneira utilizamos um método separado para renderizar cada linha e o método array.map para iterar sobre os valores. Na verdade, poderíamos até mesmo utilizar outro componente na renderização.",
      "description": "JSX é a sintaxe que permite escrevermos HTML dentro do Javascript (sim, isso parece estranho, rs) em componentes ReactJS. E um fator muito interessante do ...",
      "keywords": [
        "rows",
        "para",
        "https",
        "react",
        "escopo",
        "return",
        "javascript",
        "loop",
        "html",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/loopsrepeticoesiteracoes-no-jsx-do-react"
      }
    },
    {
      "id": "651847ec361ace90",
      "url": "https://devpleno.com/blog/13",
      "title": "Blog - Página 13 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 7 de jul. de 2017 Entenda a importância de cursos para desenvolvedores](/entenda-a-importancia-de-cursos-para-desenvolvedores)\n\n[Javascript 7 de jul. de 2017 Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol](/minicurso-socket-io-parte-3)\n\n[Carreira 6 de jul. de 2017 Você precisar ter DOM para ser um bom profissional?](/dom)\n\n[Carreira 6 de jul. de 2017 Preciso de investimento para minha ideia?](/investimento-para-executar-ideias)\n\n[Javascript 6 de jul. de 2017 Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO](/minicurso-socket-io-parte-2)\n\n[Carreira 5 de jul. de 2017 Como escolher uma linguagem de tecnologia?](/como-escolher-linguagem-de-tecnologia)\n\n[Carreira 5 de jul. de 2017 Melhoria Contínua](/melhoria-continua)\n\n[Javascript 5 de jul. de 2017 Minicurso Socket.IO - Parte 01 - Começando o projeto](/minicurso-socket-io-parte-1)\n\n[Javascript 5 de jul. de 2017 NPM e Módulos de Terceiros - NodeJS](/npm-e-modulos-de-terceiros)\n\n[Algoritmos 4 de jul. de 2017 Árvore Binária de Busca - Operação de Busca](/operacao-de-busca)\n\n[Algoritmos 3 de jul. de 2017 Árvore Binária em JavaScript](/arvore-binaria)\n\n[Algoritmos 3 de jul. de 2017 Árvore Binária de Busca em JavaScript](/arvore-binaria-de-busca)\n\n[Anterior](/blog/12)13 / 26[Próxima](/blog/14)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "carreira",
        "socket",
        "para",
        "minicurso",
        "parte",
        "algoritmos",
        "busca",
        "blog"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/13"
      }
    },
    {
      "id": "651c0e2edcf7fcb3",
      "url": "https://devpleno.com/algoritmos-odd-occurrences-array",
      "title": "Algoritmos: Odd Occurrences in Array - DevPleno",
      "content": "Algoritmos\n\n## Algoritmos: Odd Occurrences in Array\n\nT\nPor Tulio Faria • 13 de março de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nNeste vídeo, comento sobre o algoritmo Odd Occurrences in Array, disponível no Codility. O interessante deste algorítimo é mantermos a complexidade em O(n). Confira no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Algoritmos%3A%20Odd%20Occurrences%20in%20Array&url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-odd-occurrences-array) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Falgoritmos-odd-occurrences-array)",
      "description": "Neste vídeo, comento sobre o algoritmo Odd Occurrences in Array, disponível no Codility. O interessante deste algorítimo é mantermos a complexidade em O(n)...",
      "keywords": [
        "https",
        "algoritmos",
        "occurrences",
        "array",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2falgoritmos",
        "2017",
        "tulio"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/algoritmos-odd-occurrences-array"
      }
    },
    {
      "id": "652568ff6ad0e57e",
      "url": "https://devpleno.com/falta-de-tempo",
      "title": "Falta tempo para realizar aquele projeto? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Falta tempo para realizar aquele projeto?\n\nT\nPor Tulio Faria • 19 de setembro de 2017\n\n[Carreira](/tag/carreira)\n\nVocê sempre diz para as pessoas que não tem tempo para realizar um projeto? Quando te perguntam se conseguiu implementar aquela ideia, você responde “Sabe como é, eu não tenho tempo”…?\n\nSe você é uma pessoa que fala sempre que não tem tempo para alguma coisa, na verdade você não tem prioridade para aquela coisa. Achei uma frase bastante interessante e se encaixa bem aqui: “se tudo dependesse de tempo, desocupado teria sucesso”.\n\nA minha dica de hoje para você é: pegue aquele projeto que você sempre quis implementar e dedique um pouco de tempo, todos os dias, para aquele projeto. Isso é o suficiente para você perceber que ele está andando, mas que não vai te sacrificar tanto e vai fazer muita diferença no final de um mês ou no final de um ano.\n\nSe você reclama muito que não tem tempo, avalie suas prioridades, será que você está dando prioridade para a coisa certa? Será que não está deixando um tempinho escapar assistindo televisão, por exemplo?\n\nÉ engraçado pensar nisso porque eu até mudei a forma como falo atualmente. Não falo mais que não tenho tempo para realizar alguns projetos, mas sim que eles não são prioridades no momento. Uma das coisas que fiz quando tirei o DevPleno do papel é que não existiria mais essa de tempo, o DevPleno era (e ainda é) prioridade, e assim engavetei outros projetos e foquei no DevPleno.\n\nÉ muito mais maduro dizer que você priorizou algum projeto em comparação a outros do que dizer que não tem tempo, porque muitas vezes você vai usar seu tempo para um hobby, por exemplo. Então é muito melhor dizer que não tem prioridade.\n\nEssa é uma pequena reflexão sobre o tempo que eu faço diariamente sobre minha carreira, sobre minha vida. Será que eu estou empregando o tempo da maneira correta? Quanto mais eu reflito sobre isso, mais fico racional e isso é muito bom porque consigo performar mais.",
      "description": "Você sempre diz para as pessoas que não tem tempo para realizar um projeto? Quando te perguntam se conseguiu implementar aquela ideia, você responde “Sabe ...",
      "keywords": [
        "tempo",
        "para",
        "mais",
        "https",
        "projeto",
        "muito",
        "devpleno",
        "carreira",
        "sempre",
        "prioridade"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/falta-de-tempo"
      }
    },
    {
      "id": "65306d7305cffa32",
      "url": "https://devpleno.com/blog/stateless-functional-component/index",
      "title": "Criando componente mais simples e eficaz em React (Part 1)",
      "content": "Vamos começar esse hands-on Stateless Functional Component com um projeto do zero criado com Create-react-app. Primeiro vamos criar um arquivo novo chamado home.js _(iremos importar o React, pois ainda vamos usar JSX)._\n\nUm Stateless Functional Component, na verdade, é apenas uma arrow function, então iremos fazê-lo desta forma:\n\n```jsx\nimport React from 'react'\nconst Home = () => <p>Olá</p>\nexport default home\n```\n\nEste const home = () => <p>Olá</p> já é o nosso Stateless Functional Component. Ele é uma função, mas perceba que não tem classe, o que o deixa muito mais simples. Essa é a primeira vantagem se comparado com a outra forma de criar componente, afinal é muito simples para saber o que há dentro dele. Outra coisa bacana é que ele é mais rápido, já que não tem todo aquele overload de classe.\n\n**Por que ele é Stateless Functional?**\n\nEle é uma função pura, ou seja, é mais fácil de ser testado e a qualidade do código é maior. Outro ponto interessante é que não usamos o this, pois se temos uma função pura, não temos um estado interno. Ela também só depende das entradas, que são os props.\n\n**Quando usamos esse component?**\n\nQuando temos um componente de apresentação, como por exemplo um componente que só é responsável por renderizar algo na tela. Isso faz com que ele não tenha um comportamento muito complexo. Podemos passar Props para ele também:\n\n```jsx\nimport React from 'react'\nconst Home = ({ name }) => <p>Olá {name}</p>\nexport default home\n```\n\nE no nosso arquivo App.js, faremos o seguinte:\n\n```jsx\nimport React,{ Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\nimport Home from './Home'",
      "keywords": [
        "react",
        "home",
        "component",
        "import",
        "mais",
        "classname",
        "stateless",
        "functional",
        "from",
        "props"
      ],
      "metadata": {
        "title": "Criando componente mais simples e eficaz em React",
        "date": "2017-05-18",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "StatellesFunctional.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/stateless-functional-component/index.md"
      }
    },
    {
      "id": "658864f9b37eb82b",
      "url": "https://devpleno.com/blog/10-dicas-de-produtividade-para-programadores/index",
      "title": "10 dicas de produtividade para programadores (Part 5)",
      "content": "Além disso, pausas para usar as redes sociais no _smartphone_ tornam as pessoas mais dispostas para trabalhar, segundo um [estudo](https://www.k-state.edu/media/newsreleases/jul14/smartphone7714.html?utm_source=blog&utm_campaign=rc_blogpost) da Universidade do Kansas, nos EUA.\n\n## 7\\. Pense rápido\n\nA capacidade de tomar decisões rápidas é útil para qualquer profissional. Algumas estratégias podem ajudar nisso.\n\n- planejamento: vai nortear as ações e fundamentar a tomada de decisões. Se for bem feito, aumenta as chances de ajudar no acerto das escolhas;\n- criatividade: a coragem para inovar pode ser a chave do sucesso em um processo de desenvolvimento de _software_;\n- plano B: quando algo não sai como previsto, é preciso ter um plano B para que as decisões sejam mais automáticas;\n- pense rápido: pensar de forma ágil é essencial para não comprometer o andamento das atividades;\n- experiência: expertise, conhecimento de mundo, _know how_ de executivo, informações da vida acadêmica, livros lidos e desafios enfrentados formam um repertório importante na tomada de decisões;\n- fundamentação: fatos, relatórios, documentos, planilhas, gráficos e projeções financeiras tornam as decisões mais consistentes.\n\n## 8\\. Home office\n\nUma [pesquisa](https://web.stanford.edu/~nbloom/WFH.pdf?utm_source=blog&utm_campaign=rc_blogpost) da Universidade de Stanford, nos EUA, indica que trabalhar em casa pode tornar o profissional 12% mais produtivo. Os fatores responsáveis por isso são o silêncio do ambiente e o fato de não haver colegas para tirarem sua atenção.\n\n## 9\\. Uma coisa de cada vez\n\nUm [estudo](https://www.nber.org/papers/w16502?utm_source=blog&utm_campaign=rc_blogpost) do Bureau Nacional de Pesquisas Econômicas dos EUA revelou que aqueles profissionais que fazem muitas tarefas ao mesmo tempo são menos produtivos. Isso acontece porque o cérebro não consegue se concentrar em duas atividades cognitivas de uma só vez.\n\n## 10\\. Evite procrastinar",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "para",
        "produtividade",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "title": "10 dicas de produtividade para programadores",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "106696-10-dicas-de-produtividade-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "revisor": "['Renato Siqueira']",
        "chunkIndex": 4,
        "totalChunks": 6,
        "sourcePath": "blog/10-dicas-de-produtividade-para-programadores/index.md"
      }
    },
    {
      "id": "66310ef234297a37",
      "url": "https://devpleno.com/blog/request/index",
      "title": "Request - Requisições HTTP de forma rápida e simples (Part 1)",
      "content": "O Request é um pacote que permite que façamos requisições HTTP. Uma coisa interessante sobre ele é que é uma ferramenta muito simples, conseguimos fazer requisições em algum ambiente ou servidor HTTP de uma forma rápida.\n\nPrimeiramente vamos instalar:\n\n```jsx\nnpm install request\n```\n\nAgora vamos criar um novo arquivo e fazer um require no nosso request e pegar o site da UOL por exemplo:\n\n```jsx\nconst request = require('request')\nrequest('https://www.uol.com.br', function (err, res, body) {\n  if (!err && res.statusCode === 200) {\n    console.log(body)\n  }\n})\n```\n\nEntão se não retornar nenhum erro e a resposta for um http 200, ele retorna o body, que é um parâmetro da nossa function.\n\nAo rodar o código, perceba que retornará todo o HTML da página principal do UOL, isso é útil, pois sempre que quisermos consumir uma API, podemos usar o request, lembrando que ele permite outros métodos HTTP também, como um post e principalmente para baixar dados.\n\nVamos supor que eu quisesse salvar o site da UOL (pode ser um site, um arquivo, uma imagem, mas vou salvar o site todo para demonstrar):\n\n```jsx\nconst request = require('request')\nconst fs = require('fs')\nrequest('https://www.uol.com.br').pipe(fs.createWriteStream('home.html'))\n```\n\n_(Lembrando que o 'fs' já faz parte do core do Node, então não precisamos instalar nada)._ Então ele vai ligar o output stream do request com o writeStream do 'fs' que acabamos de criar, no fim das contas ele vai salvar em um home.html.\n\nUm caso de uso que eu já fiz com esse pacote foi a seguinte: eu tinha um serviço em que agregava os logs entre as minhas aplicações, então ela estava distribuída em servidores distintos e esse serviço que utilizava o request para baixar os arquivos de log e depois de baixado ele fazia o processamento das informações. Isso era bastante útil para poder importar os dados, mas lembrando que podemos usá-lo para muitas outras coisas além disso.\n\nConfira o video:",
      "keywords": [
        "request",
        "para",
        "https",
        "http",
        "require",
        "site",
        "embed",
        "vamos",
        "const",
        "body"
      ],
      "metadata": {
        "title": "Request - Requisições HTTP de forma rápida e simples",
        "date": "2017-08-14",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Request.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/request/index.md"
      }
    },
    {
      "id": "663e7c5ef7a5e835",
      "url": "https://devpleno.com/render-condicional-em-reactjs",
      "title": "Render condicional em ReactJS - DevPleno (Part 2)",
      "content": "// para renderizarmos este componente\n// &#x3C;CondComOp condicao={true} />\n**Importante:** o trecho de template que vem após o &#x26;&#x26; deve seguir a mesma regra do return do render. Ou seja, temos que retornar sempre um nó filho (no caso do exemplo um span).\n\nA combinação destas técnicas nos permite chegar a componentes muito bem organizados. Pois se precisarmos renderizar algo totalmente diferente, podemos usar o if. Caso desejamos apenas mostrar/ocultar trechos menores dentro do render, a segunda opção é muito viável.\n\nNão deixe de comentar e nos seguir em todo lugar :) Ah, e para você que quer aprender ReactJS mais rapidamente, temos o nosso curso completo!*\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Render%20condicional%20em%20ReactJS&url=https%3A%2F%2Fdevpleno.com%2Frender-condicional-em-reactjs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frender-condicional-em-reactjs)",
      "description": "Durante a criação de componentes em ReactJS é muito comum que dado um estado do componente, renderizarmos uma estrutura ou outra. Para fazermos isso no Rea...",
      "keywords": [
        "para",
        "condicao",
        "reactjs",
        "render",
        "condicional",
        "https",
        "este",
        "span",
        "javascript",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/render-condicional-em-reactjs"
      }
    },
    {
      "id": "665998132bfac7da",
      "url": "https://devpleno.com/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira",
      "title": "Como as maratonas de programação da faculdade impactaram a minha carreira - DevPleno (Part 2)",
      "content": "No quesito preparação, foi basicamente a mesma coisa, sempre me preparei. Fiz um aquecimento resolvendo vários problemas semelhantes nas semanas que antecederam a competição…\n\nMas havia algo a mais. Foi aí que lembrei que perdíamos por tempo e não por assertividade. Em maratonas de competição, o primeiro critério é o número de problemas resolvidos: quem resolve mais, vence e em caso de empate, quem os resolve mais rápido. Reparei que como a outra equipe entregava muito rápido (sim, os caras eram muito rápidos em Pascal e eram bem assertivos), tínhamos que vencer de outra forma: na quantidade.\n\nNa minha última participação, faltando 30 minutos para acabar a competição, estávamos perdendo de novo – por tempo. Mesmo número de problemas resolvidos, porém, a equipe Pascal era rápida, tsc.\n\nRestavam problemas cabeludos para resolver… Bom, dá para imaginar que fiquei nervoso e ansioso, mas foquei em fazer passar mais uma solução de problema. Tenta que tenta que tenta… Passamos! \\o/\n\nCaramba! Que alívio! Agora, era esperar que o Pascal Team não fizesse mais um – pois perderíamos no desempate por tempo. Lembro que fui embora da sala de competição e brinquei com a equipe do Pascal: “Agora é com vocês”.\n\nÉ, desta vez foi! Vencemos! Conseguimos encerrar a graduação com mais uma vitória.\n\n## Algumas lições que tirei durante os quatro anos de competição\n\nO que mais aprendi durante a minha última vez competindo foi: precisamos repetir o que dá certo e mudar o que não dá. Parece simples, mas na prática é um pouco mais complicado.\n\nOutro ponto importante: como manter a cabeça no lugar sob pressão. Daqueles 30 minutos finais, 20 passaram como se fosse 1 segundo (até que conseguimos resolver o problema). já os 10 minutos esperando, na ansiedade para descobrir se a outra equipe conseguiria resolver, pareciam dias. Isso me ensinou na prática como controlar o máximo que dava meu emocional.",
      "description": "A história do post de hoje já tem mais de 10 anos e faz parte de lembranças que eu tenho de quando ainda estava na faculdade, mais precisamente, de quando ...",
      "keywords": [
        "mais",
        "competi",
        "como",
        "para",
        "minha",
        "carreira",
        "faculdade",
        "maratonas",
        "muito",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira"
      }
    },
    {
      "id": "66ce27ba7db6717d",
      "url": "https://devpleno.com/blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index",
      "title": "8 dicas de organização para freelancers se darem bem na carreira (Part 2)",
      "content": "Como você não mais possuirá benefícios empresariais como plano de saúde, vale-transporte e vale-alimentação, é preciso colocar tudo isso na ponta do lápis. Somente assim você conseguirá chegar a um valor real. Afinal, você não quer ser pego de surpresa por uma despesa extra e não ter o dinheiro necessário.\n\nLembre-se de que você não tem uma garantia de renda. Isso significa que, ao surgir imprevistos, impossibilitando-o de trabalhar, você não receberá. Por isso, é importante sempre poupar uma certa quantia da renda, fator que proporcionará mais segurança.\n\n## 3\\. Invista em cursos de capacitação\n\nO mundo está em constante mudança e os profissionais que buscam se destacar devem apostar em cursos de capacitação. Essa premissa também vale para os freelancers: o que te diferencia dos demais profissionais? Por que o contratante deve escolher você e não o seu colega?\n\nPerceba, nesse aspecto, que é preciso ter habilidades e características singulares que vão agregar valor ao serviço. São tais aptidões que vão te deixar na frente dos concorrentes, facilitando a conquista de mais jobs.\n\nSendo assim, não tenha medo em investir na sua área, realizando cursos que vão torná-lo um freelancer mais competente.\n\n## 4\\. Organize o seu ambiente de trabalho\n\nAo ser freelancer, nada mais natural do que fazer _home office_, que é a possibilidade de trabalhar em casa. Mas isso não significa que você não precisa ter um local apropriado para executar as tarefas.\n\nPelo contrário: o mais indicado é que você organize um ambiente específico para o serviço. Essa simples ação evitará a dispersão, o que contribuirá com o seu rendimento. E, é claro, maior [produtividade](https://www.devpleno.com/como-ser-muito-mais-produtivo?utm_source=blog&utm_campaign=rc_blogpost) é garantia de maior remuneração.\n\nPara não ter erro, separe um espaço do seu lar e transforme em uma mini-escritório, que precisará apenas de uma mesinha adequada, uma cadeira e os devidos objetos de trabalho.\n\n## 5\\. Honre os prazos",
      "keywords": [
        "para",
        "mais",
        "como",
        "freelancer",
        "pode",
        "afinal",
        "isso",
        "preciso",
        "https",
        "devpleno"
      ],
      "metadata": {
        "title": "8 dicas de organização para freelancers se darem bem na carreira",
        "date": "2017-07-14",
        "tags": "['Carreira']",
        "thumbnail": "105725-8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index.md"
      }
    },
    {
      "id": "66d4a1ddb6ce973a",
      "url": "https://devpleno.com/como-vender-software",
      "title": "negociação - Como vender um Software - DevPleno (Part 1)",
      "content": "Carreira\n\n## negociação - Como vender um Software\n\nT\nPor Tulio Faria • 16 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nHoje vou complementar um pouco sobre como vender software, mais especificamente sobre negociação.\n\nO primeiro ponto que temos que desconstruir é que negociação não é uma briga, e sim um consenso. Lembrando que a gente negocia o tempo todo, se você quer convencer seu amigo a ir em uma festa com você, precisa negociar e vender isso para ele. Isso é o que fazemos também para fechar contrato, precisamos negociar para mostrar para a outra pessoa que isso é bom e vai trazer resultado para ela ou para a empresa dela.\n\nO primeiro ponto que eu acho muito importante, até mesmo antes da negociação, é o quanto o projeto vai trazer de resultados, isso vai te dar insumo de até onde pode negociar. Um dos projetos que eu fechei (e foi um dos mais altos em valor) eu sabia que o prazo estava muito curto, então não tinha tempo para combinar, nem mesmo para reunião. Eles iriam inaugurar uma estrutura muito grande e precisavam do software funcionando em quarenta dias e nós éramos os únicos que eles conseguiram conversar no Brasil inteiro que topariam fazer isso. Quando a gente sabe disso e assume alguns riscos, a coisa se torna um pouco mais complexa.\n\nGeralmente, quando o risco é muito alto, o preço sobe. Isso fica muito claro porque quanto mais curto o prazo, mais você tem que trabalhar sem um período de descanso, imagine que você precise virar quase 40 noites para entregar a tempo.",
      "description": "Hoje vou complementar um pouco sobre como vender software, mais especificamente sobre negociação. O primeiro ponto que temos que desconstruir é que negocia...",
      "keywords": [
        "para",
        "isso",
        "negocia",
        "muito",
        "cliente",
        "mais",
        "algo",
        "software",
        "outra",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/como-vender-software"
      }
    },
    {
      "id": "66d62fb43b3cb5b8",
      "url": "https://devpleno.com/blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index",
      "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador (Part 2)",
      "content": "O [Upwork](https://www.upwork.com) é a maior plataforma de freelance do mundo. Você cria um perfil, anexa seu portfólio e se candidata a projetos de clientes internacionais. Há trabalhos pagos por hora e por projeto, em áreas como JavaScript, Python, React, Node.js, mobile e muito mais.\n\nA plataforma funciona com um sistema de propostas — você encontra um projeto, envia sua oferta com preço e prazo, e o cliente escolhe. Conforme você acumula avaliações positivas, fica mais fácil conseguir projetos melhores. O pagamento é em dólar.\n\n**Ideal para:** qualquer nível de experiência, especialmente quem quer começar a trabalhar para o exterior.\n\n## 3. Freelancer.com\n\nO [Freelancer.com](https://www.br.freelancer.com) é um dos maiores marketplaces do mundo, com milhões de usuários. A plataforma oferece projetos em diversas áreas — programação, desenvolvimento de apps, HTML, processamento de dados e mais.\n\nVocê se cadastra, participa de testes que certificam suas habilidades e se candidata aos projetos disponíveis. Há também categorias de concursos e programas de freelancer preferencial com comissões menores.\n\n**Ideal para:** quem está começando e quer construir um portfólio com projetos variados.\n\n## 4. Workana\n\nO [Workana](https://www.workana.com/pt) tem foco na América Latina e oferece milhares de projetos, desde desenvolvimento web e mobile até tradução e design. Uma vez cadastrado, você pesquisa projetos que se encaixam nas suas habilidades, compara os que pagam por hora vs. preço fixo, e envia propostas.\n\nA plataforma é bastante usada no Brasil e em toda a América Latina, o que facilita a comunicação — muitos projetos são em português ou espanhol.\n\n**Ideal para:** devs que preferem projetos em português/espanhol e querem começar no mercado freelancer latino-americano.\n\n## 5. 99Freelas",
      "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
      "keywords": [
        "para",
        "projetos",
        "mais",
        "https",
        "plataforma",
        "come",
        "freelancer",
        "ideal",
        "como",
        "experi"
      ],
      "metadata": {
        "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador",
        "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
        "date": "2026-04-04",
        "tags": "['Carreira']",
        "thumbnail": "Freelancers.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index.md"
      }
    },
    {
      "id": "66e34084b912ae81",
      "url": "https://devpleno.com/grandes-quantidades-de-dados-com-menos-recursos",
      "title": "Grandes quantidades de dados com menos recursos - DevPleno (Part 2)",
      "content": "fs.readFile('data.csv', (err, contents) =>{\nconst lines = contents.toString().split('\\\\n')\nline.forEach(line, i) => {\nsaveDB(line).then(() => console.log(i))\n})\n})\nPerceba que ao rodar o código, ele trará os registros lentamente e fora de ordem. Estamos empilhando de forma gigantesca, gastando muita memória, porque carregamos todos os registros, fizemos um split e depois ainda mandei salvar tudo de uma vez, além do banco tendo que lidar com todas as requisições ao mesmo tempo.\n\n**Mas qual a maneira ideal de fazer isso?**\n\nDeixar que esses dados passem pelo aplicativo, nós resolvemos o que tem que resolver e vamos para o próximo.\n\nVou criar um arquivo otimizado.js para fazer da maneira correta e vou utilizar o fast-csv:\n\nyarn add fast-csv\nEm seguida, no código, faremos algo um pouco diferente. Vamos importar o fast-csv e criar um readStream para a entrada e outro construtor para essa entrada:\n\nconst fs = require('fs')\nconst csv = require('fast-csv')\nconst entrada = fs.createReadStream('data.csv')\nconst csvStream = csv\n.fromStream(entrada, {\nheaders: true\n})\n.on('data', (data) => {\nconsole.log(data)\n})\nAgora imagine que temos a mesma função de salvar, o caminho mais interessante é passar os dados, porém, enquanto não terminarmos de salvar esses dados, não manda mais nada:\n\nconst fs = require('fs')\nconst csv =require('fast-csv')\nconst entrada = fs.createReadStream('data.csv')\nconst saveDB = record => {\nreturn new Promise((resolve, reject) =>{\nsetTimeOut(resolve, Math.ceil(Math.random()*4000))\n})\n}\nconst csvStream = csv.fromStream(entrada, {\nheaders: true\n}).on('data', data => {\ncsvStream.pause()\nsaveDB(data).then((){\nconsole.log(data)\ncsvStream.resume\n})\n})\nDessa maneira, utilizando o pause, não jogamos tudo na memória para processar. Resolvido o problema no banco de dados, vamos mandar mais informações.\n\nConfira o video:",
      "description": "A dica de hoje é um ponto bastante importante para performance em NodeJS. Eu já comentei um pouquinho sobre esse assunto, mas vou reforçar esse cuidado que...",
      "keywords": [
        "const",
        "data",
        "dados",
        "para",
        "require",
        "contents",
        "line",
        "vamos",
        "console",
        "entrada"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/grandes-quantidades-de-dados-com-menos-recursos"
      }
    },
    {
      "id": "675fc5cabdf2ede6",
      "url": "https://devpleno.com/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! - DevPleno (Part 2)",
      "content": "Quando estamos jogando um MMORPG, por exemplo, não montamos o set do personagem de uma vez só. Em vez disso farmamos as partes dele, individualmente. Cada parte é um incremento ao personagem e facilita a aquisição de novos itens, mas só ao fim de todo o ciclo de farm é que temos o modelo pronto.\n\nE é exatamente assim que é o desenvolvimento de softwares com a metodologia ágil. Em vez de estruturar um sistema inteiro de uma vez, faz-se partes de um módulo, integra-se esse módulo e depois outro, e outro e assim por diante, até finalizar todas as funcionalidades que o programa precisa.\n\nFicou claro o que é uma metodologia ágil? Então vamos adiante!\n\n## Quais são os valores fundamentais da metodologia ágil?\n\nEm 2001 um grupo de 17 desenvolvedores criaram o [Manifesto Para o Desenvolvimento Ágil de Softwares](https://www.manifestoagil.com.br?utm_source=blog&#x26;utm_campaign=rc_blogpost). Esse manifesto aponta 4 bases para a aplicação de métodos ágeis. Confira:\n\n**Indivíduos e interações** mais que processos e ferramentas\n\n**Software em funcionamento** mais que documentação abrangente\n\n**Colaboração com o cliente** mais que negociação de contratos\n\n**Responder a mudanças** mais que seguir um plano\n\nDe um modo geral, esse manifesto só comprova para o que falamos que é a metodologia ágil. Ela prioriza o contato da equipe entre si e com o cliente, assim como o empirismo no lugar da teorização.\n\nLogo, é mais importante fazer o trabalho, deixá-lo como o cliente quer e se adaptar às mudanças do que seguir rígidos processos e usar ferramentas definidas.\n\n## Quais são os benefícios dos métodos ágeis em TI?\n\nAlém de tornar o trabalho muito mais divertido de ser feito, e desafiador, os métodos ágeis apresentam uma série de vantagens para a área da tecnologia da informação. Dá só uma olhada:",
      "description": "Nascidas nos anos 80, só vieram a ficar conhecidas depois dos anos 2000. Muito comuns no desenvolvimento de softwares, essas ferramentas ganharam espaço em...",
      "keywords": [
        "mais",
        "metodologia",
        "para",
        "geis",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores"
      }
    },
    {
      "id": "6767fe54f208620f",
      "url": "https://devpleno.com/copy-to-clipboard-em-js",
      "title": "Ctrl+C / Copy to Clipboard em JS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Ctrl+C / Copy to Clipboard em JS\n\nT\nPor Tulio Faria • 18 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nEssa é uma dica bem rápida de como podemos mandar algo com o clipboard, ou seja, o equivalente a dar um CTRL + C em um texto na sua página.\n\nPara fazer este exemplo, vamos usar o jQuery por que escrevemos pouquíssimas linhas de código. Então temos uma página bem simples, apenas com algumas tags, e vamos criar um input type text com um ID url e um value:\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;title>Copy to Clipboard&#x3C;/title>\n&#x3C;style>\n#url{\ntext-align: center;\npadding: 40px;\n}\n&#x3C;/style>\n&#x3C;/head>\n&#x3C;body>\n&#x3C;input type=\"text\" id=\"url\" value=\"https://devpleno.com\" />\n&#x3C;script src=\"https://code.jquery.com/jquery-3.2.1.min.js\">\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nCom isso teremos o input, e a ideia é que quando clicarmos nele. já ser copiado para a área de transferência, apenas precisando dar CTRL + V para funcionar.\n\nLembrando que já importamos o jQuery da CDN. Vamos então abrir no body um novo Script. Nele, quando clicar na URL, quero que selecione e depois execute o comando copy.\n\n&#x3C;script>\n$(\"url\").click(function(){\n$(this).select();\n\ndocument.execCommand('copy');\n})\n&#x3C;/script>\nAlgumas pessoas colocam um Botão para copiar e deixam apenas o select quando clicarmos no texto. Isso é muito útil quando temos URL’s para compartilhar e é legal para deixar essa facilidade na experiência do usuário quando ele estiver utilizando o seu sistema.\n\nUm exemplo de onde isso é muito útil é na URL do github, pois poupamos a tarefa de copiar do usuário. Confira a explicação em vídeo para entender melhor.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Essa é uma dica bem rápida de como podemos mandar algo com o clipboard, ou seja, o equivalente a dar um CTRL + C em um texto na sua página. Para fazer este...",
      "keywords": [
        "para",
        "https",
        "clipboard",
        "script",
        "quando",
        "ctrl",
        "copy",
        "jquery",
        "text",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/copy-to-clipboard-em-js"
      }
    },
    {
      "id": "6790bf8f68bcc1d0",
      "url": "https://devpleno.com/blog/nivel-de-ingles-para-a-toptal/index",
      "title": "Qual o nível de inglês para trabalhar por meio da Toptal?",
      "content": "O inglês é um fator importante para ingressar na Toptal, já que toda comunicação é feita nesse idioma. Mas qual o nível de inglês necessário? Descubra neste vídeo.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/BJbXYqUYxBg\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\nSaiba mais [sobre o DevReactJS aqui.](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)\n\n[![Curso](DevReact.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "https",
        "embed",
        "devpleno",
        "blog",
        "para",
        "responsive",
        "mais",
        "profissionais",
        "ingl",
        "toptal"
      ],
      "metadata": {
        "title": "Qual o nível de inglês para trabalhar por meio da Toptal?",
        "date": "2018-02-15",
        "tags": "['Carreira']",
        "thumbnail": "NivelDeIngles.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/nivel-de-ingles-para-a-toptal/index.md"
      }
    },
    {
      "id": "67cafb8d30fb3c6e",
      "url": "https://devpleno.com/codility",
      "title": "Codility: Como Resolver os Desafios e Passar nos Testes de Código - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Codility: Como Resolver os Desafios e Passar nos Testes de Código\n\nT\nPor Tulio Faria • 7 de junho de 2017\n\n[Algoritmos](/tag/algoritmos)[Javascript](/tag/javascript)\n\nO Codility é uma plataforma que pode ser utilizada para treinar programação e, no caso de recrutadores, para selecionar programadores para a equipe. No meu caso. utilizei o Codility para passar em uma das provas da Toptal e já aproveitei para estudar um pouco mais sobre programação.\n\n**Vamos ao hands-on**\n\nDepois de logado no Codility, já caímos em Codility Programers, que é o ambiente para programadores. Na parte superior, temos duas abas: as Lessons e os Challenges. Lessons são as lições que ele tem sobre assuntos de programação, conceitos básicos como iterações, vetores, etc. Já Challenges, são ‘competições’ que podemos participar. Ele é um ambiente completo. Conseguimos rodar baseados nas entradas, desenvolver normalmente utilizando a ferramenta.\n\n**Como me preparei para a Toptal?**\n\nFui em lessons e fiz tudo que tinha para fazer, deixando tudo em 100%. Eu gosto de fazer na minha máquina depois submeter a solução, mas é possível fazer diretamente no Codility.\n\nVamos fazer um exemplo. Vou entrar em Iterations e dar o Start na lição. Vai aparecer a mensagem que eu tenho 120 minutos para concluir. Ao começar, é possível mudar de linguagem na aba superior.\n\nO problema vem escrito do lado esquerdo e temos que resolver do lado direito. Ele já cria uma função solução.\n\nConseguimos dar um run para fazermos alguns casos de teste que rodarmos diretamente pelo Codility. Temos também o submit this task, aí sim ele vai passar por todos os processos de qualidade. É preciso ficar atento ao fato de que o Codility considera a complexidade. Na lesson escolhida, por exemplo, ele espera que o pior cenário a complexidade seja O(log(N));",
      "description": "Guia prático para resolver desafios do Codility. Dicas, estratégias e exemplos de soluções para testes técnicos de programação.",
      "keywords": [
        "para",
        "codility",
        "fazer",
        "https",
        "temos",
        "lessons",
        "isso",
        "tempo",
        "algoritmos",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/codility"
      }
    },
    {
      "id": "67cfe9e65e9d51d0",
      "url": "https://devpleno.com/fake-api",
      "title": "Fake API - Como testar seus projetos front-end - DevPleno (Part 2)",
      "content": "&#x3C;script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'>&#x3C;/script>\n&#x3C;script>\n$(function()\n{$.get('https://jsonplaceholder.typicode.com/posts', function (data) {\ndata.forEach(function (post) {\n$('#contents').append('&#x3C;h1>' + post.title + '&#x3C;/h1>')\n})\n})})\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nLembrando que isso não é uma boa prática, mas como é apenas para intuito de aprendizado, então estou fazendo dessa forma. Perceba que ele tem um body também caso queira:\n\n$('#contents').append('&#x3C;h2>' + post.title + '&#x3C;/h2>')\n\n$('#contents').append('&#x3C;div>' + post.body + '&#x3C;/div>')\nPor exemplo, caso você esteja fazendo uma lista de pedidos ou clientes, pode utilizar esses dados para simular como a aplicação vai se comportar com os dados. Deve haver outras opções mas essas são duas que eu utilizo bastante, funciona muito bem e agiliza muito o desenvolvimento no front-end.\n\nConfira o video:\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Fake%20API%20-%20Como%20testar%20seus%20projetos%20front-end&url=https%3A%2F%2Fdevpleno.com%2Ffake-api) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffake-api)",
      "description": "Hoje eu trago uma dica que eu utilizo bastante com a minha equipe que é quando temos ainda uma fonte de dados para fornecer para um frontend, por exemplo, ...",
      "keywords": [
        "para",
        "https",
        "dados",
        "script",
        "body",
        "contents",
        "temos",
        "html",
        "function",
        "posts"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/fake-api"
      }
    },
    {
      "id": "67e1456771cd191d",
      "url": "https://devpleno.com/formas-de-trabalho-por-meio-da-toptal",
      "title": "Formas de trabalho na Toptal - DevPleno",
      "content": "Carreira\n\n## Formas de trabalho na Toptal\n\nT\nPor Tulio Faria • 15 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nVocê sabe quais as formas de trabalho quando se atua por meio da Toptal? Confira neste vídeo:\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS aqui](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog).\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Formas%20de%20trabalho%20na%20Toptal&url=https%3A%2F%2Fdevpleno.com%2Fformas-de-trabalho-por-meio-da-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fformas-de-trabalho-por-meio-da-toptal)",
      "description": "Você sabe quais as formas de trabalho quando se atua por meio da Toptal? Confira neste vídeo: <div className=&#34;embedresponsive embedresponsive16by9&#34;   <ifra...",
      "keywords": [
        "toptal",
        "https",
        "trabalho",
        "carreira",
        "formas",
        "meio",
        "mais",
        "profissionais",
        "reactjs",
        "devreactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/formas-de-trabalho-por-meio-da-toptal"
      }
    },
    {
      "id": "6816eacc0e5403f3",
      "url": "https://devpleno.com/sobre-o-devpleno",
      "title": "Sobre o DevPleno - DevPleno (Part 4)",
      "content": "O meu grande propósito e objetivo com o DevPleno é trazer conteúdo relevante. E para conseguir mostrar realmente como é o dia-a-dia de um desenvolvedor, eu atuo na minha própria empresa e também como funcionário em outras (inclusive fora do Brasil). Então espere muitos insights direto do campo de batalha, seja empreendendo no meu próprio negócio ou como funcionário .\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Sobre%20o%20DevPleno&url=https%3A%2F%2Fdevpleno.com%2Fsobre-o-devpleno) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsobre-o-devpleno)",
      "description": "Olá, tudo bem? Meu nome é Tulio Faria e sou o criador do DevPleno, e com certeza você já se perguntou:  Como posso ser um desenvolvedor melhor?  Como apren...",
      "keywords": [
        "para",
        "como",
        "mais",
        "devpleno",
        "minha",
        "muito",
        "isso",
        "cada",
        "carreira",
        "meus"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/sobre-o-devpleno"
      }
    },
    {
      "id": "68365800b71c91bb",
      "url": "https://devpleno.com/termos-de-uso",
      "title": "Termos de uso - DevPleno (Part 3)",
      "content": "O DevPleno tampouco é responsável pela violação de direitos autorais decorrente de informações, documentos e materiais publicados neste website, comprometendo-se a retirá-los do ar assim que notificado da infração.\n\n## Informações enviadas pelos usuários e colaboradores\n\nQualquer material, informação, artigos ou outras comunicações que forem transmitidas, enviadas ou publicadas neste site serão considerados informação não confidencial, e qualquer violação aos direitos dos seus criadores não será de responsabilidade do DevPleno. É terminantemente proibido transmitir, trocar ou publicar, através deste website, qualquer material de cunho obsceno, difamatório ou ilegal, bem como textos ou criações de terceiros sem a autorização do autor. O DevPleno reserva-se o direito de restringir o acesso às informações enviadas por terceiros aos seus usuários.\n\nO DevPleno poderá, mas não é obrigado, a monitorar, revistar e restringir o acesso a qualquer área no site onde usuários transmitem e trocam informações entre si, incluindo, mas não limitado a, salas de chat, centro de mensagens ou outros fóruns de debates, podendo retirar do ar ou retirar o acesso a qualquer destas informações ou comunicações. Porém, o DevPleno não é responsável pelo conteúdo de qualquer uma das informações trocadas entre os usuários, sejam elas lícitas ou ilícitas.\n\n## Links para sites de terceiros\n\nOs sites apontados não estão sob o controle do DevPleno que não é responsável pelo conteúdo de qualquer outro website indicado ou acessado por meio do DevPleno reserva-se o direito de eliminar qualquer link ou direcionamento a outros sites ou serviços a qualquer momento. O DevPleno não endossa firmas ou produtos indicados, acessados ou divulgados através deste website, tampouco pelos anúncios aqui publicados, reservando-se o direito de publicar este alerta em suas páginas eletrônicas sempre que considerar necessário.\n\n## Direitos autorais e propriedade intelectual",
      "description": "Estes termos de serviço regulam o uso deste site. Ao acessálo você concorda com estes termos. Por favor, consulte regularmente os nossos termos de serviço....",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "termos",
        "servi",
        "website",
        "acesso",
        "para",
        "direitos"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/termos-de-uso"
      }
    },
    {
      "id": "68688129316d97e3",
      "url": "https://devpleno.com/hrn0012019aula3",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /hrn0012019aula3 to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "https",
        "devpleno",
        "devreactjs",
        "redirecting",
        "from",
        "hrn0012019aula3"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hrn0012019aula3"
      }
    },
    {
      "id": "687d656cbc57640c",
      "url": "https://devpleno.com/blog/cmder-turbine-seu-cmd-no-windows/index",
      "title": "cmder: Turbine seu cmd no Windows (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "cmder",
        "windows",
        "bastante",
        "copiar",
        "muito",
        "interface",
        "basta",
        "colar",
        "dica"
      ],
      "metadata": {
        "title": "cmder: Turbine seu cmd no Windows",
        "date": "2016-10-13",
        "tags": "['Javascript']",
        "thumbnail": "cmder-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/cmder-turbine-seu-cmd-no-windows/index.md"
      }
    },
    {
      "id": "689e2c957b084684",
      "url": "https://devpleno.com/blog/mundo-de-abundancia/index",
      "title": "Sobreviver em um mundo de abundância (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "mais",
        "minha",
        "estava",
        "oportunidade",
        "faculdade",
        "como",
        "embed",
        "quando",
        "responsive"
      ],
      "metadata": {
        "title": "Sobreviver em um mundo de abundância",
        "date": "2017-11-07",
        "tags": "['Carreira']",
        "thumbnail": "MundoAbundancia.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/mundo-de-abundancia/index.md"
      }
    },
    {
      "id": "68c3693edd98d201",
      "url": "https://devpleno.com/blog/beatbox-manipulavel-com-js/index",
      "title": "Construindo um Beatbox Manipulável com JS (Part 3)",
      "content": "Todo check ativo irá gerar um som e os inativos serão ignorados. No botão, sempre que estiver tocando vai ter o stop e quando tiver parado vai ter play. Assim geramos um beat-box que o usuário escolhe a forma em que vai ser tocado utilizando o checkbox.\n\nPoderíamos transformar esses checkbox em caixinhas e isso deixaria muito mais parecido com softwares como fruitLoops, que são bem simples de criar batidas.\nEsse código está bastante flexível, se quisermos colocar mais itens só aumentar o número de itens no 'numItems'.\n\nBaixe os arquivos de áudio aqui: [download](https://goo.gl/zHKuad)\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/01iPnENtCiQ/uqRtwdxH9-s\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "play",
        "audio",
        "const",
        "prato",
        "track",
        "script",
        "checkbox",
        "https",
        "para",
        "trackid"
      ],
      "metadata": {
        "title": "Construindo um Beatbox Manipulável com JS",
        "date": "2017-05-29",
        "tags": "['Javascript']",
        "thumbnail": "BEATBOX-COM-JS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/beatbox-manipulavel-com-js/index.md"
      }
    },
    {
      "id": "68e5273de0fe22ce",
      "url": "https://devpleno.com/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador",
      "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador - DevPleno (Part 1)",
      "content": "Carreira\n\n## Trabalhar como freelancer: 7 sites para conseguir jobs como programador\n\nT\nPor Tulio Faria • 4 de abril de 2026\n\n[Carreira](/tag/carreira)\n\nA demanda por programadores freelancers nunca foi tão alta. Com o crescimento do trabalho remoto nos últimos anos, cada vez mais empresas ao redor do mundo contratam desenvolvedores de qualquer lugar — e o Brasil tem se destacado como um dos maiores exportadores de talento tech.\n\nTrabalhar como freelancer oferece vantagens reais: você monta seus próprios horários, pratica inglês no dia a dia, ganha em moeda forte e constrói uma [carreira](https://www.devpleno.com/carreira-tomar-decisoes) com experiência internacional. E o melhor: você não precisa ser sênior para começar.\n\n**\nSe você já trabalha ou pretende trabalhar para empresas do exterior, precisa legalizar seus recebimentos no Brasil. A [Conta49](https://www.conta49.com.br) é uma contabilidade especializada em programadores que atuam remotamente para o exterior. Eles entendem as particularidades de receber em dólar, abrir PJ para tech e lidar com a tributação de serviços exportados. Acesse [www.conta49.com.br](https://www.conta49.com.br) e conheça os serviços.\n\nReuni 7 plataformas onde você pode encontrar trabalhos freelance como programador — desde opções para quem está começando até redes que pagam em dólar para os mais experientes.\n\n## 1. Toptal\n\nA [Toptal](https://www.toptal.com) é uma rede que seleciona apenas os top 3% dos freelancers do mundo por meio de um processo seletivo rigoroso. Eu trabalho por meio da Toptal e posso dizer que, uma vez aprovado, você tem acesso a projetos de grandes empresas e multinacionais, com pagamento em dólar.\n\nOs projetos variam entre tempo integral, meio período e por hora. A grande vantagem é a qualidade dos clientes e a estabilidade — muitos contratos duram meses ou anos. O processo seletivo é puxado (envolve entrevista técnica, live coding e projeto teste), mas compensa pelo nível dos projetos e da remuneração.",
      "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
      "keywords": [
        "para",
        "projetos",
        "https",
        "mais",
        "como",
        "freelancer",
        "plataforma",
        "come",
        "ideal",
        "trabalhar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador"
      }
    },
    {
      "id": "68eb62927cac8e7a",
      "url": "https://devpleno.com/blog/entrevista-com-edy-segura/index",
      "title": "DevPleno Entrevista - Edy Segura (Part 1)",
      "content": "Edy Segura é professor da graduação da UNIVAS e da pós-graduação do INATEL e também trabalha com desenvolvimento de software, além de ser um grande amigo meu.\n\nUma das coisas que nós compartilhamos é que você é uma das poucas pessoas que, assim como eu, tem uma formação completa, ou seja, começamos juntos no técnico, fizemos uma graduação e temos uma pós graduação também, mas eu gostaria de saber do início, o que foi o curso técnico para você e o que ele influenciou na sua carreira?\n\n“Ele foi a porta de entrada, até então nós só mexíamos em casa, tentando desenvolver algo, montando e desmontando computadores e com isso eu senti que era aquilo que eu queria fazer, então pesquisei e descobri o curso técnico que nós dois fizemos, cheguei para o meu pai e pedi o que chamamos de “paitrocinio”. Eu já trabalhava com formatação e montagem de computadores mas gostaria de saber o que mais dava pra fazer com eles. Isso abriu portas para podermos desenvolver.”\n\nUma coisa muito interessante é que começamos a programar WEB no curso técnico, no meu caso estágio do técnico e do Edy já na graduação. Nós tocavamos um provedor de internet só com estagiário e lá conseguimos nos “destravar”, ele permitiu que entrássemos realmente na área e na graduação sem medo. Conte pra gente com que tipo de projeto você lida em linhas gerais.\n\n“Hoje eu sou desenvolvedor FullStack Sênior no INATEL. Desenvolvemos soluções de mídia, em vários projetos de IPTV, OTT, soluções como Netflix que foram projetos legais onde trabalhamos para fora do país. Hoje trabalho com soluções para telecomunicações. Tem um misto de tecnologias bem interessante.”\n\nHá uma diferença dos profissionais brasileiros e os estrangeiros, não só americanos, mas alemães entre outros. Você sente essa diferença? O brasileiro tem uma vantagem ou desvantagem em relação ao pessoal de fora?",
      "keywords": [
        "para",
        "gradua",
        "cnico",
        "isso",
        "fazer",
        "fora",
        "ingl",
        "embed",
        "tamb",
        "come"
      ],
      "metadata": {
        "title": "DevPleno Entrevista - Edy Segura",
        "date": "2017-08-03",
        "tags": "['Carreira']",
        "thumbnail": "entrevista-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/entrevista-com-edy-segura/index.md"
      }
    },
    {
      "id": "68f37bf91ae6d435",
      "url": "https://devpleno.com/qual-seu-maior-desafio",
      "title": "Qual é o seu maior desafio nesse momento? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Qual é o seu maior desafio nesse momento?\n\nT\nPor Tulio Faria • 24 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nHá um tempo venho ajudando desenvolvedores e profissionais de outras áreas e isso vem me proporcionando muita felicidade. É algo que faz parte do meu propósito de vida. Por isso também quero te ajudar a resolver o seu desafio.\n\n**O que você precisa fazer**\n\nEscreva um e-mail para [tuliofaria@devpleno.com](mailto:tuliofaria@devpleno.com) contando um pouco da sua trajetória de vida (como trabalha, quando começou a programar, etc), me diga também qual é o seu maior desafio (qual o seu objetivo e em que exatamente precisa de ajuda) e como você pode ajudar outras pessoas.\n\nPode ficar tranquilo quanto à privacidade, somente eu tenho acesso a este e-mail\n\n**O projeto**\n\nDepois de ler os e-mails recebidos e fazer uma triagem para descobrir quem no grupo pode se ajudar. Inicialmente não vai ser público porque ainda não consegui achar uma ferramenta que possa fazer isso de uma maneira ótima. Um grupo no facebook seria uma opção, mas eu não gosto de usar esse formato, já que as informações se perdem lá dentro, então quero achar uma forma de ter mais privacidade para os dados já que estamos lidando com informações sensíveis.\n\nEntão, por enquanto, eu mesmo irei fazer este roteamento manualmente para apresentar as pessoas (ou eu mesmo vou ajudar se for o caso). A ideia é que a gente cresça junto.\n\nPosteriormente, provavelmente, vamos transformar isso em um sistema, mas quero ver como vai funcionar primeiro nessa forma manual. Acredito que quando desenvolvemos um sistema, temos que conhecer como ele funcionaria manualmente antes de tentar automatizar algo que não existia.",
      "description": "Há um tempo venho ajudando desenvolvedores e profissionais de outras áreas e isso vem me proporcionando muita felicidade. É algo que faz parte do meu propó...",
      "keywords": [
        "desafio",
        "isso",
        "https",
        "para",
        "devpleno",
        "como",
        "qual",
        "maior",
        "quero",
        "ajudar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/qual-seu-maior-desafio"
      }
    },
    {
      "id": "691796c9e35cd680",
      "url": "https://devpleno.com/blog/7",
      "title": "Blog - Página 7 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 6 de set. de 2017 Validade de um projeto/ideia/ação](/validade)\n\n[Javascript 5 de set. de 2017 Módulo MS - Convertendo timestamps](/convertendo-timestamps)\n\n[Carreira 5 de set. de 2017 Tenha cicatrizes](/tenha-cicatrizes)\n\n[Javascript 31 de ago. de 2017 Como encadear promises](/como-encadear-promises)\n\n[Carreira 30 de ago. de 2017 CLT ou PJ em Software - O que vale mais a pena?](/clt-ou-pj)\n\n[Algoritmos 29 de ago. de 2017 Busca Binária](/busca-binaria)\n\n[Carreira 29 de ago. de 2017 Técnica para eliminar o que não te faz alcançar seus objetivos](/tecnica-para-alcancar-seus-objetivos)\n\n[Carreira 28 de ago. de 2017 Coisas ruins normais](/coisas-ruins-normais)\n\n[Carreira 28 de ago. de 2017 Falta de apoio](/falta-de-apoio)\n\n[Javascript 23 de ago. de 2017 Dotenv e variáveis de ambiente no NodeJS](/dotenv-e-variaveis-de-ambiente)\n\n[Javascript 23 de ago. de 2017 O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express](/morgan)\n\n[Javascript 21 de ago. de 2017 3 Padrões para Iniciar com Expressões Regulares (RegExp)](/expressoes-regulares)\n\n[Anterior](/blog/6)7 / 26[Próxima](/blog/8)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "carreira",
        "javascript",
        "para",
        "blog",
        "algoritmos",
        "nodejs",
        "todos",
        "ferramentas",
        "fundamentos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/7"
      }
    },
    {
      "id": "691a73ff3fa026a6",
      "url": "https://devpleno.com/ferramentas-par-layouts-com-flexbox",
      "title": "Hands-on: Ferramentas visuais para Flexbox - DevPleno",
      "content": "Javascript\n\n## Hands-on: Ferramentas visuais para Flexbox\n\nT\nPor Tulio Faria • 2 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nFlexbox é uma nova forma de criar layouts em CSS. Neste hands-on, mostro algumas ferramentas que ajudam bastante na hora de ver o impacto de cada propriedade visualmente.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Ferramentas%20visuais%20para%20Flexbox&url=https%3A%2F%2Fdevpleno.com%2Fferramentas-par-layouts-com-flexbox) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fferramentas-par-layouts-com-flexbox)",
      "description": "Flexbox é uma nova forma de criar layouts em CSS. Neste handson, mostro algumas ferramentas que ajudam bastante na hora de ver o impacto de cada propriedad...",
      "keywords": [
        "https",
        "flexbox",
        "javascript",
        "hands",
        "layouts",
        "ferramentas",
        "para",
        "devpleno",
        "facebook",
        "2fdevpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/ferramentas-par-layouts-com-flexbox"
      }
    },
    {
      "id": "692accbc9ef42c03",
      "url": "https://devpleno.com/minicurso-socket-io-parte-3",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol - DevPleno (Part 1)",
      "content": "Javascript\n\n## Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol\n\nT\nPor Tulio Faria • 7 de julho de 2017\n\n*\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNas [aulas anteriores do minicurso de Socket.IO](https://www.devpleno.com/minicurso-socket-io-parte-2/), já preparamos o ambiente, conectamos o websocket do client para o servidor e agora vamos começar a emitir realmente as notificações.\n\nA primeira coisa que vamos fazer é enviar o placar, vamos abrir o template match.ejs dentro de admin. A única coisa que temos de diferente é o time e os gols, nós vamos pegar esses dados e quando o usuário clicar em atualizar placar, iremos enviar isso ao servidor e ele vai disparar via socket.io para todos os clients.\n\nPrimeiramente lá no final, após incluir o footer, vamos adicionar um script:\n\n&#x3C;script src='/js/admin.js'>&#x3C;/script>\nEsse script ainda não existe, vamos criar agora no diretório public/js, primeiro temos que descobrir qual o ID do botão do formulário, que é update-score e quando o usuário clicar nesse botão, eu quero dar um alert apenas para saber se está rodando:\n\n$(function)(){\n$(\"#update-score\").click(function(){\nalert(1)\nreturn false;\n})\n});\nAgora precisamos pegar os dois valores do jogo nos ID’s score, e score-b, o notify-score e damos um console.log para saber se está tudo correto:\n\n$(function)(){\n$(\"#update-score\").click(function(){\nconst scoreA = $(\"#score-a\").val();\nconst scoreB = $(\"#score-b\").val();\nconst notify = $(\"#score-notify\").val();\nconsole.log(scoreA, scoreB, notofy)\nreturn false;\n})\n});\nPerceba que o notify continuou com o value 1, isso acontece porque não está checando se esta checked ou não, então fazemos isso:",
      "description": "Nas aulas anteriores do minicurso de Socket.IO, já preparamos o ambiente, conectamos o websocket do client para o servidor e agora vamos começar a emitir r...",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "socket",
        "vamos",
        "notify",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-3"
      }
    },
    {
      "id": "6943bce96713d6f3",
      "url": "https://devpleno.com/blog/como-invocar-funcoes-dinamicamente-com-js/index",
      "title": "Como invocar funções dinamicas em JavaScript (Part 2)",
      "content": "Para entender o que `console[key]` retornaria, escreveremos a instrução `console.log(console[key])` para observar o valor de retorno:\n\n![Console](7251b686-324c-4117-96bb-201286874331.png)\n\nPelo resultado, notamos uma coisa muito legal no Javascript: as funções também são valores – o que nos permite escrever `console[key]('valor1')` e obter seu resultado no prompt:\n\n![Console](2ad70e26-f38f-4062-833a-0fd88cc4c07c.png)\n\nO resultado anterior permite que façamos coisas como imprimir com `console[key]('valor')`, a partir de um vetor de constantes key, o valor associado a cada constante:\n\n![Console](7aa0a9d1-88e8-4e33-be22-de062373704f.png)\n\n![Console](494afd56-2b54-4a03-9d1c-b9f63285910a.png)\n\nModificando a definição de const keys, podemos obter todos os métodos de console:\n\n![Console](0b5a79bb-db9b-4f8b-9cc8-e594cce81b86.png)\n\n![Console](24e5a378-262f-42ac-ae02-32e7ef04be24.png)\n\nou então passar a constante key como um valor:\n\n![Console](69e0b8c0-c0a3-473c-8e0a-259c7b6d288f.png)\n\n![Console](0176837b-d7d6-402d-874e-7fa2162e7866.png)\n\nSe você seguiu os passos até aqui, então conseguiu chamar métodos de uma forma dinâmica – algo muito poderoso no Javascript. Outra coisa que podemos fazer está no Web Console do navegador (Ctrl+Shift+I no Google Chrome). Nesse `console`, temos um objeto chamado window que traz as mesmas funcionalidades para chamada dinâmica de métodos, assim como fizemos com `console`, vide o exemplo abaixo:\n\n![Navegador](a6593685-2ae7-4c45-8819-2d884be791d1.png)\n\nE assim, surge uma mensagem “opa” na tela do navegador:\n\n![Navegador](541d05d0-a49f-4719-8e9c-dc40e883e8e2.png)\n\nPodemos, ainda, guardar uma função dentro de uma constante alertOpa:\n\n![Navegador](a189c254-1702-49c8-b6b0-8677939c9626.png)\n\nE, ao acessarmos alertOpa como um objeto, faremos a chamada da função com o texto 'lopa' que escrevemos como valor:\n\n![Navegador](2cdbbd23-6e5f-4ea2-b635-387c58d698a9.png)",
      "keywords": [
        "console",
        "como",
        "para",
        "todos",
        "valor",
        "resultado",
        "navegador",
        "vari",
        "constante",
        "instru"
      ],
      "metadata": {
        "title": "Como invocar funções dinamicas em JavaScript",
        "date": "2018-02-19",
        "tags": "['Javascript']",
        "thumbnail": "INVOCAR-FUNÇÕES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/como-invocar-funcoes-dinamicamente-com-js/index.md"
      }
    },
    {
      "id": "6962531255ce3f5f",
      "url": "https://devpleno.com/relampagofsm",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /relampagofsm to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "relampagofsm"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/relampagofsm"
      }
    },
    {
      "id": "69715a931683631d",
      "url": "https://devpleno.com/blog/injecao-de-dependencia-em-reactjs/index",
      "title": "Injeção de Dependência em ReactJS (Part 1)",
      "content": "Como estávamos comentando anteriormente sobre [injeção de dependência](https://www.devpleno.com/vantagens-da-injecao-de-depencia/), achei relevante mostrar como podemos fazer Injeção de Dependência em ReactJS.\n\nPara ilustrar, temos o exemplo abaixo, que quando carregamos o componente, utilizamos o axios para fazer uma requisição http e pegar o IP da origem e seta no estado atual do componente mostrando o IP na tela.\n\n```jsx\nimport React, { Component } from 'react'\nimport axios from 'axios'\n\nclass App extends Component {\n  constructor(props) {\n    super(props)\n    this.state = {\n      ip: ' '\n    }\n  }\n  componentDiMount() {\n    const url = 'https://httpbin.org/ip'\n    axios.get(url).then((res) => {\n      this.setState({\n        ip: res.data.origin\n      })\n    })\n  }\n  render() {\n    return <div>Your IP adress is: {this.state.ip}</div>\n  }\n}\n```\n\nO problema aqui é que se fossemos testar esse app, teríamos que contornar o axios de alguma forma,pois estamos importando ele direto. Assim, o componente está muito dependente do axios. Se quisermos rodar o componente ou testar com o Indesign, por exemplo, não vai ser possível.\n\nO que podemos fazer?\n\nUma coisa que às vezes esquecemos com o ReactJS: ele tem um ponto de montagem. Temos um index.js que faz a montagem inicial.\n\n```jsx\nimport React from 'react'\nimport reactDOM from 'react-dom'\nimport App from './App'\n\nReactDOM.render(\n    <App />\n    document.getElementById('root')\n)\n```\n\nPerceba que temos o App e ele faz a montagem em si do html.\n\nCom isso, podemos simplesmente passar a dependência do código anterior para o nosso index.js, já que podemos colocá-las em lugares onde não vamos testar códigos.\n\nEntão, ao invés de importarmos o axios no nosso app.js, por exemplo, vamos colocar no ponto de montagem\n\n```jsx\napp.js:\n\nimport React, { Component } from 'react'\n\n\nindex.js:\n\n\nimport React from 'react'\nimport reactDOM from 'react-dom'\nimport App from './App'\n//dependencias\nimport axios from 'axios'\n```",
      "keywords": [
        "axios",
        "react",
        "import",
        "from",
        "componente",
        "para",
        "depend",
        "fazer",
        "https",
        "podemos"
      ],
      "metadata": {
        "title": "Injeção de Dependência em ReactJS",
        "date": "2017-06-05",
        "tags": "['Javascript']",
        "thumbnail": "InjecaoDependencia.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/injecao-de-dependencia-em-reactjs/index.md"
      }
    },
    {
      "id": "698b2a3b110f5188",
      "url": "https://devpleno.com/blog/reactjs-comentarios-em-jsx/index",
      "title": "ReactJS: comentários em JSX",
      "content": "Estes dias passei por uma situação engraçada: queria apenas comentar uma parte de um JSX. JSX é a sintaxe utilizada para renderizar HTML do ReactJS. Porém, isso não foi tão simples :)\n\nA primeira tentativa seria fazer como um comentário em HTML:\n\n```jsx\nrender(){\n   return (\n       <div>\n          <!-- isso não vai funcionar :) -->\n       </div>\n    )\n}\n```\n\nPorém, rapidamente iremos perceber que isso não funciona :)\n\nA segunda tentativa (já que JSX é meio HTML meio JS) seria tentar:\n\n```jsx\nrender(){\n   return (\n       <div>\n          { <-- isso não vai funcionar :) ---> }\n       </div>\n    )\n}\n```\n\nHum, mas não funcionou :(\n\nBom, mas aí que está o pulo do gato. Precisamos avisar o JSX que ele tem que renderizar este trecho de código como javascript e não como JSX.\n\nE aí está o motivo do qual temos que usar { }.\n\n```jsx\nrender(){\n   return (\n       <div>\n          { /* isso vai funcionar :) */ }\n       </div>\n    )\n}\n```\n\nNeste caso, quando utilizamos as chaves, estamos alternando o contexto entre JSX e JS, e por isso,o comentário agora irá funcionar. Basta lembrar que quando queremos \"escrever\" algo no JSX utilizamos { nomeDaVariavel }.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "isso",
        "funcionar",
        "html",
        "como",
        "render",
        "return",
        "para",
        "renderizar",
        "tentativa",
        "seria"
      ],
      "metadata": {
        "title": "ReactJS: comentários em JSX",
        "date": "2016-11-23",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "React.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/reactjs-comentarios-em-jsx/index.md"
      }
    },
    {
      "id": "69c883f4f5b58823",
      "url": "https://devpleno.com/blog/orientacao-objetos-imperativa-e-funcional/index",
      "title": "Diferença entre as programações Orientação-objetos, Imperativa e Funcional (Part 1)",
      "content": "Hoje eu quero explicar um pouco melhor essa diferença entre Programação Funcional, Orientação-objetos e Imperativa.\n\nPrimeiro, todos os paradigmas são interessantes e importantes, mas antes de falarmos sobre cada um deles, o que é um paradigma?\n\nEle vai dizer como você abstrai seu problema do “mundo real” para a computação. Por exemplo, se você vende doces, como você transformar essa venda em uma forma computadorizada. O problema é que na primeira abordagem, que foi a 'Imperativa', nós simplesmente executávamos códigos, como comandos diretos, mas foi chegando em uma situação onde ficava muito complexo para entender, não existia uma forma de classificar esse código que deixasse ele um pouco mais fácil de dar manutenção.\n\nUma das formas que surgiram para resolver isso foi a orientação-objetos. Ela tenta abstrair os objetos que estão envolvidas nos problemas e então agrupamos essas funções e dados dentro desses objetos. Por exemplo, eu quero modelar um produto, ele é uma classe, quando eu quiser instanciar essa classe eu vou ter um objeto, que são os valores dentro dessa classe. O problema é que para você programar com orientação-objetos, você tem que conhecer algumas regras ou boas práticas, como patterns, mas o problema maior é quando o pessoal programa em uma linguagem orientada objeto, porém ainda faz imperativa. Para dominar o orientado objeto demora para conseguir fazer essa abstração de maneira interessante.\n\nQuando pegamos uma linguagem funcional, o pessoal aplica o mesmo conceito de orientação-objetos dentro do funcional, isso é algo que não me agrada. Você trazer muita coisa de orientação-objeto para um paradigma diferente. Cada paradigma tem suas próprias características.",
      "keywords": [
        "para",
        "objetos",
        "isso",
        "orienta",
        "funcional",
        "como",
        "problema",
        "essa",
        "programa",
        "paradigma"
      ],
      "metadata": {
        "title": "Diferença entre as programações Orientação-objetos, Imperativa e Funcional",
        "date": "2017-09-21",
        "tags": "['Javascript']",
        "thumbnail": "OO-imperativa.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/orientacao-objetos-imperativa-e-funcional/index.md"
      }
    },
    {
      "id": "69f614f4c9f000a3",
      "url": "https://devpleno.com/blog/se-sujar-faz-bem/index",
      "title": "Porque se sujar faz bem! (Part 2)",
      "content": "Para eu conseguir negociar um serviço atualmente, eu tive que errar muito lá atrás. Existe uma possibilidade. Se você acompanha nosso trabalho, tem uma chance e uma oportunidade muito legal, quando você consome os conteúdos, é a chance que você tem de aprender com os erros que eu já cometi. Quando eu construo algo com em ReactJS ou Socket.IO, já errei muito nisso, seja aprendendo ou na aplicação em si, e aqui você tem uma oportunidade muito legal de conhecer um pouco mais disso sem precisar se sujar tanto, afinal estamos passando um caminho mais confortável para você trilhar na sua carreira. Então se você está aqui, já tem uma vantagem muito grande competitivamente no mercado de trabalho.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/HROPkaKONWY\" allowfullscreen></iframe>\n</div>\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "muito",
        "mais",
        "medo",
        "sujar",
        "para",
        "fazer",
        "errar",
        "certo",
        "primeira",
        "embed"
      ],
      "metadata": {
        "title": "Porque se sujar faz bem!",
        "date": "2017-08-09",
        "tags": "['Carreira']",
        "thumbnail": "SeSujar.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/se-sujar-faz-bem/index.md"
      }
    },
    {
      "id": "6a28b28daf7e16be",
      "url": "https://devpleno.com/grandes-quantidades-de-dados-com-menos-recursos",
      "title": "Grandes quantidades de dados com menos recursos - DevPleno (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Grandes%20quantidades%20de%20dados%20com%20menos%20recursos&url=https%3A%2F%2Fdevpleno.com%2Fgrandes-quantidades-de-dados-com-menos-recursos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fgrandes-quantidades-de-dados-com-menos-recursos)",
      "description": "A dica de hoje é um ponto bastante importante para performance em NodeJS. Eu já comentei um pouquinho sobre esse assunto, mas vou reforçar esse cuidado que...",
      "keywords": [
        "const",
        "data",
        "dados",
        "para",
        "require",
        "contents",
        "line",
        "vamos",
        "console",
        "entrada"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/grandes-quantidades-de-dados-com-menos-recursos"
      }
    },
    {
      "id": "6a5047c62da8b6ea",
      "url": "https://devpleno.com/blog/pure-functions-funcoes-puras/index",
      "title": "Pure Functions (Funções Puras)",
      "content": "Uma forma de construir funções muito difundido pela programação é usar funções puras. Veja neste vídeo as vantagens dessas funções ao construir aplicações com Javascript.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/1OrEqycGoiM\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "construir",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "forma"
      ],
      "metadata": {
        "title": "Pure Functions (Funções Puras)",
        "date": "2017-03-03",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "FuncoesPuras.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/pure-functions-funcoes-puras/index.md"
      }
    },
    {
      "id": "6a8567a6b35496e4",
      "url": "https://devpleno.com/listar-arquivos-em-js",
      "title": "Listar arquivos em JS (async, await, promise e Promise.all) - DevPleno (Part 2)",
      "content": "fs.stat(path, (err, stat) => {\nconsole.log(stat.isFile())\n})\nCom isso conseguimos saber se é um arquivo ou não através do isFile, por exemplo, se eu passasse o diretório atual e executar o código, ele vai passar false, Isso acontece porque ele não é um arquivo:\n\nfs.stat('./', (err, stat) => {\nconsole.log(stat.isFile())\n})\nAgora precisamos transformar o fs.stat também em uma função:\n\nfunction stat(path){\nreturn new Promise((resolve, reject) => {\nfs.stat(path, (err, stat) =>{\nif(err){\nreject(err)\n} else {\nresolve(stat)\n}\n})\n}\n}\nAgora podermos fazer uma nova versão:\n\nfs.stat('./').then,\n(stat) => {\nconsole.log(stat.isFile())\n}\nAgora precisamos de um jeito de unir os dois para ter o resultado que queremos.No exercício no Fullstack Academy, utilizamos a função assíncrona ‘async’, então fizemos o seguinte:\n\nasync function lista() {\nconst paths = await readdir('./')\nconsole.log(paths)\n}\nlista()\nLembrando que descobrimos durante o Fullstack Academy que se utilizarmos o ‘await’ para uma promise, essa função continua sendo assíncrona, porém visualmente quando estamos construindo o código, podemos garantir que embaixo só vai ser executado quando o readdir terminar.\n\nPerceba que vai continuar retornando a listagem, então na verdade o ‘await’ seria como fazermos um then com paths com a única diferença que eu posso fazer meu próximo passo, que será checar todos os arquivos se eles são ou não realmente arquivos. Para isso vamos fazer um const stats que vai utilizar um map para passar por todos os caminhos e utilizar um async passando um path e dar um await no stat.path:",
      "description": "Hoje eu quero corrigir um exercício que passei no FullStack Academy que gera muitas dúvidas, principalmente para quem está começando na linguagem e quer ap...",
      "keywords": [
        "stat",
        "path",
        "paths",
        "await",
        "const",
        "arquivos",
        "promise",
        "async",
        "readdir",
        "lista"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/listar-arquivos-em-js"
      }
    },
    {
      "id": "6ab5f0daee0e3954",
      "url": "https://devpleno.com/blog/short-circuit-e-valores-padrao/index",
      "title": "Short-circuit e valores padrão (Part 1)",
      "content": "Essa dica pode ser utilizada tanto em JavaScript quanto em outras linguagens de programação, apenas com um pouco de adaptação. Vamos falar primeiramente sobre o short-circuit.\n\nImagine que temos uma constante que se chama debug, que eu posso ligar e desligar esse debug. Quando o debug estiver ligado, eu quero que ele tenha mais saídas no console.log, por exemplo, caso ele não esteja ativado, não vai escrever nada:\n\n```jsx\nconst DEBUG = true\nconsole.log(1)\nGeralmente as pessoas fariam algo assim:\nif(DEBUG)\nconsole.log(1)\n```\n\nO detalhe é que existe outra forma de fazer isso, chamada de short-circuit, onde deixamos o DEBUG na frente e colocamos && ('e' comercial). Vai acontecer a mesma coisa:\n\n```jsx\nDEBUG && console.log(1)\n```\n\nSe colocarmos o false em DEBUG, o console.log não irá rodar. Isso acontece porque quando fazemos os 'E's comerciais, temos uma precedência, ou seja, ele depende que tudo seja verdade para que retorne verdadeiro, se DEBUG é false, ele nem valida o restante do código, por esse motivo chamamos de short-circuit (curto-circuito), afinal nós cortamos esse circuito e isso evita de executarmos o restante das operações. Eu posso definir todas as minhas linhas de DEBUG dessa forma por exemplo.\n\nEssa variável pode vir de uma variável de ambiente, podemos rodar nosso script em modo DEBUG e setar algumas coisas a mais, como definir um banco diferente ou coisas no sentido que funcionaria normalmente.\n\nA segunda dica que quero mostrar é o uso do operador || ('ou'), que usamos para valores padrão. Vamos supor que 'a' eu não defina nada dentro dele e em 'b' eu quero colocar o valor de 'a' ou um valor padrão caso o 'a' seja vazio.\n\n```jsx\nlet a = null\nlet b = a || 'padrão'\n```\n\nSe o 'a' for iniciado com algo, como por exemplo a= 'valor de a', a atribuição de 'b' será o valor de 'a', com isso conseguimos fazer uma leitura de dados de formulário e utilizar esse valor padrão utilizando o ||.",
      "keywords": [
        "debug",
        "valor",
        "console",
        "para",
        "padr",
        "short",
        "circuit",
        "esse",
        "isso",
        "embed"
      ],
      "metadata": {
        "title": "Short-circuit e valores padrão",
        "date": "2017-08-07",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ShortCircuit.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/short-circuit-e-valores-padrao/index.md"
      }
    },
    {
      "id": "6abd98549c23c092",
      "url": "https://devpleno.com/defina-metas",
      "title": "Defina metas - DevPleno",
      "content": "Carreira\n\n## Defina metas\n\nT\nPor Tulio Faria • 21 de julho de 2016\n\n[Carreira](/tag/carreira)\n\nA carreira de um desenvolvedor é bastante agitada, principalmente, por termos que nos manter sempre atualizados e antenados no mercado. Para isso, nada mais interessante que definir metas profissionais e pessoais. Veja neste vídeo mais dicas e sacadas sobre esse assunto.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Defina%20metas&url=https%3A%2F%2Fdevpleno.com%2Fdefina-metas) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdefina-metas)",
      "description": "A carreira de um desenvolvedor é bastante agitada, principalmente, por termos que nos manter sempre atualizados e antenados no mercado. Para isso, nada mai...",
      "keywords": [
        "https",
        "carreira",
        "metas",
        "defina",
        "para",
        "mais",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/defina-metas"
      }
    },
    {
      "id": "6acb7a80f1333ae2",
      "url": "https://devpleno.com/aprenda-a-aprender",
      "title": "Aprenda a aprender - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Aprenda%20a%20aprender&url=https%3A%2F%2Fdevpleno.com%2Faprenda-a-aprender) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Faprenda-a-aprender)",
      "description": "Nesta dica de carreira, vou contar como podemos aprender mais. O ponto mais importante de quando estamos aprendendo algo novo, seja uma tecnologia, uma lin...",
      "keywords": [
        "aprender",
        "para",
        "https",
        "mais",
        "carreira",
        "quando",
        "algo",
        "forma",
        "isso",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/aprenda-a-aprender"
      }
    },
    {
      "id": "6b11af1ce838348c",
      "url": "https://devpleno.com/blog/2-tipos-de-solucoes-de-software-que-voce-pode-entregar/index",
      "title": "2 Tipos de Soluções de Software que você pode entregar (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/0u63cCONX-Y\" allowFullScreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "cliente",
        "quer",
        "para",
        "entregar",
        "precisa",
        "software",
        "mais",
        "quando",
        "sobre",
        "solu"
      ],
      "metadata": {
        "title": "2 Tipos de Soluções de Software que você pode entregar",
        "date": "2017-10-13",
        "tags": "['Carreira']",
        "thumbnail": "imagem.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/2-tipos-de-solucoes-de-software-que-voce-pode-entregar/index.md"
      }
    },
    {
      "id": "6b49f07e27200dc9",
      "url": "https://devpleno.com/blog/participacao-em-eventos-e-comunidades/index",
      "title": "Participação em Eventos e Comunidades (Part 1)",
      "content": "Hoje eu vou comentar um pouco sobre a participação em eventos e em comunidades, esse tema foi sugerido pelo Ian Magalhães que comentou no nosso [canal do YouTube](https://www.youtube.com/deplenocom), e se você quiser fazer isso pode ficar à vontade, mande sua dúvida ou pergunta no e-mail ou pelo YouTube, estamos abertos para novos questionamentos.\n\nO que eu acho sobre comunidades e participação em eventos?\n\nQualquer comunidade que você participar eu acho muito importante, desde a do seu bairro ou de algum tema específico (seja de tecnologia ou não). É importante porque você tem a oportunidade de se conectar com pessoas e muitas vezes a gente esquece disso, não adianta desenvolver um software bem se não tem pessoas querendo utilizar isso, por exemplo, e as comunidades são uma grande oportunidade para fazer isso.\n\nAqui temos a associação de bairro, associação comercial e coisas do gênero que são pessoas reunidas tentando resolver um problema do assunto. Nada melhor que isso para conseguirmos trocar experiências com as pessoas.\n\nO DevPleno é uma comunidade em que estamos construindo, trocando experiências, utilizando até mesmo as informações que vocês passam para mim para passar para mais pessoas. Então se você não tem uma comunidade para discutir tecnologia na sua cidade, é muito importante você dar o passo rumo a isso.\n\nJá sobre a participação em eventos, eu acho extremamente importante. Novamente o mais importante é fazer conexões com pessoas, vá em eventos para conversar com as pessoas. Uma das coisas que eu faço sempre é ir sozinho aos eventos, porque as dinâmicas se você está com alguém fará com essa pessoa e isso é uma grande perda de chance de conhecer novas pessoas, trocar contato e talvez perder uma parceria que pode mudar sua vida. Pode ser que você converse com alguém sobre um tema e isso mude sua vida ou perspectiva de como enxergar as coisas.",
      "keywords": [
        "isso",
        "para",
        "eventos",
        "pessoas",
        "evento",
        "comunidade",
        "sobre",
        "importante",
        "youtube",
        "muito"
      ],
      "metadata": {
        "title": "Participação em Eventos e Comunidades",
        "date": "2017-07-19",
        "tags": "['Carreira']",
        "thumbnail": "ParticipacaoEventos.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/participacao-em-eventos-e-comunidades/index.md"
      }
    },
    {
      "id": "6c24a913ad833a15",
      "url": "https://devpleno.com/blog/anotacoes-em-eventos/index",
      "title": "Como fazer anotações em eventos",
      "content": "Quando vamos em um evento é muito legal que vamos anotando tudo, então tem várias ideias, conteúdo, etc, coisas que você nem sabe como vai converter isso em execução. A dica de hoje é uma maneira sobre como anotar o que ouvir durante um evento para que possa aproveitar melhor isso depois.\n\nEu fui a um evento um tempo atrás e recebi essa dica, e ela mudou totalmente a forma de como tomei nota das coisas, hoje eu basicamente trago as anotações e conteúdo já com as ideias separadas.\n\nQuando você for tomar nota em eventos ou até mesmo em uma aula, ao invés de anotar ideias que você tem durante a aulas e o conteúdo junto, você fará o seguinte, se for um caderno por exemplo, você vai pegar a página esquerda e anotar somente o conteúdo e na página direita, vai anotar as ideias que teve a partir do conteúdo da página da esquerda.\n\nEssa dica é tão simples quanto isso, mas o efeito prático disso é enorme, afinal quando você voltar para sua casa para relembrar as notas, você sabe que de um lado é só conteúdo. Se alguém te pedir as anotações da palestra você passa apenas o lado esquerdo, já que do outro lado são coisas que você pode aplicar no seu dia a dia ou no dia a dia da sua empresa.\n\nIsso é muito poderoso, antigamente eu misturava tudo e quando eu voltava para casa eu tinha que garimpar as anotações para achar algo de valor e esse tempo perdido me serve para outras coisas.\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/qLI9gm8CQQg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "conte",
        "quando",
        "ideias",
        "coisas",
        "isso",
        "anotar",
        "embed",
        "evento",
        "como"
      ],
      "metadata": {
        "title": "Como fazer anotações em eventos",
        "date": "2017-07-19",
        "tags": "['Carreira']",
        "thumbnail": "ANOTAÇÕES-EM-EVENTOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/anotacoes-em-eventos/index.md"
      }
    },
    {
      "id": "6c289866f896f0c9",
      "url": "https://devpleno.com/injecao-de-dependencia-em-reactjs",
      "title": "Injeção de Dependência em ReactJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Injeção de Dependência em ReactJS\n\nT\nPor Tulio Faria • 5 de junho de 2017\n\n[Javascript](/tag/javascript)\n\nComo estávamos comentando anteriormente sobre [injeção de dependência](https://www.devpleno.com/vantagens-da-injecao-de-depencia/), achei relevante mostrar como podemos fazer Injeção de Dependência em ReactJS.\n\nPara ilustrar, temos o exemplo abaixo, que quando carregamos o componente, utilizamos o axios para fazer uma requisição http e pegar o IP da origem e seta no estado atual do componente mostrando o IP na tela.\n\nimport React, { Component } from 'react'\nimport axios from 'axios'\n\nclass App extends Component {\nconstructor(props) {\nsuper(props)\nthis.state = {\nip: ' '\n}\n}\ncomponentDiMount() {\nconst url = 'https://httpbin.org/ip'\naxios.get(url).then((res) => {\nthis.setState({\nip: res.data.origin\n})\n})\n}\nrender() {\nreturn &#x3C;div>Your IP adress is: {this.state.ip}&#x3C;/div>\n}\n}\nO problema aqui é que se fossemos testar esse app, teríamos que contornar o axios de alguma forma,pois estamos importando ele direto. Assim, o componente está muito dependente do axios. Se quisermos rodar o componente ou testar com o Indesign, por exemplo, não vai ser possível.\n\nO que podemos fazer?\n\nUma coisa que às vezes esquecemos com o ReactJS: ele tem um ponto de montagem. Temos um index.js que faz a montagem inicial.\n\nimport React from 'react'\nimport reactDOM from 'react-dom'\nimport App from './App'\n\nReactDOM.render(\n&#x3C;App />\ndocument.getElementById('root')\n)\nPerceba que temos o App e ele faz a montagem em si do html.\n\nCom isso, podemos simplesmente passar a dependência do código anterior para o nosso index.js, já que podemos colocá-las em lugares onde não vamos testar códigos.\n\nEntão, ao invés de importarmos o axios no nosso app.js, por exemplo, vamos colocar no ponto de montagem\n\napp.js:\n\nimport React, { Component } from 'react'\n\nindex.js:",
      "description": "Como estávamos comentando anteriormente sobre injeção de dependência, achei relevante mostrar como podemos fazer Injeção de Dependência em ReactJS. Para il...",
      "keywords": [
        "axios",
        "react",
        "import",
        "from",
        "https",
        "componente",
        "depend",
        "para",
        "fazer",
        "ncia"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/injecao-de-dependencia-em-reactjs"
      }
    },
    {
      "id": "6c3a5167e7d9f4e0",
      "url": "https://devpleno.com/blog/obesidade-mental/index",
      "title": "Você sofre de Obesidade Mental?",
      "content": "Hoje quero contar para você o que aconteceu comigo há mais ou menos 1 ano / 1 ano e meio, até mesmo antes de começar o DevPleno.\n\nEu comecei a perceber que eu queria lançar meus cursos e colocar o DevPleno no ar, porém eu fiquei apenas estudando, já que queria fazer da melhor forma possível.\n\nEstudei React, Angular, Node, JavaScript, Mongo, DevOps, etc, pois eu queria saber cada vez mais para conseguir compartilhar. Eu estava lendo o livro geração de Valor (que recomendo para quem quer pensar um pouco diferente) e comecei a refletir um pouco sobre a carreira.\n\nNesse livro tinha uma citação para o que eu estava fazendo, chamava-se “Obesidade mental”, ela acontece quando sabemos muito, mas executamos pouco.\n\nQuando a gente começa a estudar muito e não executa, parece que nunca vamos ser completos. Depois que começamos a executar, não conseguimos mais parar.\n\nDesde que eu coloquei meu primeiro vídeo no ar e compartilhei com todo mundo, eu comecei a executar cada vez mais.\n\nUma das coisas que eu acho fundamental para executar as coisas é seguir algum método, por exemplo, no Fullstack Master e no DevReactJS, temos uma linha de raciocínio, é muito mais fácil fazer os exercícios e ir executando. Além disso, é bem legal porque os alunos compartilham os repositórios deles no GitHub com todos os exercícios dos cursos.\n\nPor hoje é só, apenas queria deixar essa reflexão para vocês. Até a próxima.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/b9JA-JCXRmY\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "mais",
        "devpleno",
        "queria",
        "embed",
        "come",
        "comecei",
        "pouco",
        "muito",
        "executar"
      ],
      "metadata": {
        "title": "Você sofre de Obesidade Mental?",
        "date": "2017-10-17",
        "tags": "['Carreira']",
        "thumbnail": "ObesidadeMental.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/obesidade-mental/index.md"
      }
    },
    {
      "id": "6c42114b3dc3fc2b",
      "url": "https://devpleno.com/arvore-binaria",
      "title": "Árvore Binária em JavaScript - DevPleno (Part 2)",
      "content": "let arvore = {\nleft: {\nleft: undefined,\nright: {\nvalue: 3\n},\nvalue: 2\n},\nright: undefined,\nvalue: 10\n}\nEle imprimirá 10,2 e 3, o que está correto porque ele imprimiu o nó principal que é 10, depois ele foi para a esquerda, imprime o 2, como na esquerda não tem nada. ele vai para a direita e imprime o 3, depois vai para a próxima direita e não imprime nada pois esta como undefined. Esse é o preOrder, agora vamos testar o inOrder:\n\nfunction inOrder(tree) {\ntree.left &#x26;&#x26; inOrder(tree.left)\n\nconsole.log(tree.value)\n\ntree.right &#x26;&#x26; inOrder(tree.right)\n}\n\nconsole.log('inOrder')\n\ninOrder(arvore)\nA diferença é que o console.log virá no meio.\n\nPerceba que o inOrder vai para a esquerda primeiro, tenta ir novamente para a esquerda, não acha nada, ai ele visita o nó 2, vai para a direita, tenta ir para a esquerda e não consegue, visita o nó 3, vai para a direita e não tem nada, volta, imprime o nó 10 e por fim tenta ir para a direita e está undefined.\n\nO mais importante é que guardamos os tipos de navegação da seguinte forma, preOrder escreve primeiro, inOrder escreve no meio e o posOrder escreve no final.\n\nOutra coisa importante é que como ele é recursivo eu preciso saber qual o meu passo base, que é o passo onde nenhum dos dois vão ser executados, ou seja, quando chegar no left e no right não ter mais ninguém para navegar.\n\nCom JavaScript fica muito simples a navegação em árvore, perceba que construímos a navegação com um Object normal, posteriormente vamos ver inserção e tudo mais em árvores de busca, onde colocamos o elemento menor para o lado esquerdo e o maior para o lado direito.\n\nConfira todo a explicação no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Continuando o assunto sobre alguns algoritmos que utilizamos em computação em geral, neste port falaremos sobre árvore binária, uma estrutura de dados que ...",
      "keywords": [
        "para",
        "tree",
        "preorder",
        "left",
        "right",
        "rvore",
        "inorder",
        "esquerda",
        "direita",
        "value"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/arvore-binaria"
      }
    },
    {
      "id": "6cab3e68a4a6f58f",
      "url": "https://devpleno.com/blog/sleep-em-generator/index",
      "title": "Sleep em Generator (Part 1)",
      "content": "Hoje quero mostrar como podemos recriar o famoso sleep, que temos em algumas linguagens que não são assíncronas como JAVA e PHP, quando queremos usar dentro de um Generator function. Eu cheguei nessa função porque queria fazer testes de algumas operações e naquele dado momento que queria rodar a Generator, queria pausar um pouco entre elas para ver um detalhe acontecer a fim de depurar o código. Então acabei refletindo como poderia criar esse sleep para conseguir fazer esse teste.\n\nPara fazer o teste vamos utilizar o CO, que é uma forma de rodarmos uma Generator Function. Lembrando que uma Generator Function é uma função que pode ser pausada e retornada posteriormente, com isso podemos escrever uma função síncrona, porém continua tendo os benefícios da função assíncrona.\n\nVamos lá, a primeira coisa que vou fazer é importar o CO.\n\n```jsx\nconst co = require('co')\n```\n\nSe fossemos escrever realmente uma Generator Function iriamos fazer o seguinte:\n\n```jsx\nco(function* () {\n  console.log('Step 1')\n  sleep(1000)\n  console.log('Step 2')\n})\n```\n\nEm JavaScript não temos sleep, obviamente, porque não faz muito sentido porque temos o setTimeout.\n\nComo transformamos o setTimeout em um sleep?\n\nPrimeiro vamos criar uma função chamada sleep e para transformar esse setTimeOut em um sleep. Eu teria que transformá-la em uma [promise](https://www.devpleno.com/promises/) e para essa promise passar uma função que vai receber 2 parâmetros, o resolve e o reject, ou seja, dois callBacks:\n\n```jsx\nfunction sleep(time){\n    return new Promise((resolve, reject) =>\n    setTimeout(resolve, time)\n})\n```\n\nCom isso, quando chamar o sleep eu consigo utilizar o then para saber que ele rodou depois de um segundo:\n\n```jsx\nsleep(1000).then(() => console.log('Depois de um segundo'))\n```\n\nMas queremos utilizar dentro do CO porque quero essa 'cara' de assíncrona, então ao invés de utilizar apenas o sleep, vou utilizar o yield sleep, pausando entre os steps.",
      "keywords": [
        "sleep",
        "function",
        "para",
        "generator",
        "fazer",
        "utilizar",
        "console",
        "como",
        "porque",
        "step"
      ],
      "metadata": {
        "title": "Sleep em Generator",
        "date": "2017-06-28",
        "tags": "['Javascript']",
        "thumbnail": "SleepGenerator.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/sleep-em-generator/index.md"
      }
    },
    {
      "id": "6cdf09a036cbc3a0",
      "url": "https://devpleno.com/desenvolvedor-full-stack-o-que-e-e-como-se-tornar",
      "title": "Desenvolvedor Full Stack: o que é e como se tornar? - DevPleno (Part 2)",
      "content": "Para se tornar um desenvolvedor Full Stack é preciso, naturalmente, estudar muito. O profissional que opta por esse tipo de carreira deve ser ávido por novos conhecimentos. Ele precisa se sentir confortável com o desafio de encarar uma linguagem desconhecida como parte da sua rotina de trabalho. Esse perfil de desenvolvedor também costuma ser chamado de profissional com conhecimento em forma de ‘T’. A linha vertical da letra representa a área em que o dev é um especialista, que pode ser algo dentro do front-end ou do back-end. Já a linha horizontal simboliza que, além de ser especializado em algo, esse profissional expande suas competências em diversas áreas, sem se aprofundar tanto nelas. Em essência, o desenvolvedor Full Stack compreende todo o processo de desenvolvimento do produto. Portanto, para conseguir se capacitar nesse perfil, o dev precisa, antes de tudo, conhecer um pouco sobre quase tudo dos processos de criação de um software.\n\n## O que preciso saber para ser um desenvolvedor Full Stack?\n\nEm essência, podemos dizer que o desenvolvedor Full Stack precisa dominar toda a estrutura de produção do software, do back-end ao front-end. Esses conhecimentos vão variar de acordo com cada empresa, pois times diferentes trabalham com tecnologias e técnicas diversas. Logo, é importante que o dev que pretende se tornar Full Stack tenha a consciência de que ele precisa ser aberto a novos conhecimentos sempre. Também é essencial que ele não tente ser um especialista em todas as áreas, pois além de ser inviável, isso atrapalharia a ampliação dos seus horizontes. Dito isso, vale a pena listar algumas técnicas e tecnologias que o desenvolvedor Full Stack deve conhecer melhor:\n\n- **usabilidade**: é um engano achar que a experiência do usuário está apenas nas mãos dos devs front-end. A visão de usabilidade deve começar já na hora que uma funcionalidade é concebida, portanto, esse conhecimento deve fazer parte do repertório de um desenvolvedor Full Stack;",
      "description": "Cada vez mais a figura do desenvolvedor Full Stack ganha espaço em empresas de TI e desenvolvimento de software. Esse perfil profissional que combina as ha...",
      "keywords": [
        "full",
        "stack",
        "desenvolvedor",
        "como",
        "tornar",
        "front",
        "back",
        "para",
        "profissional",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/desenvolvedor-full-stack-o-que-e-e-como-se-tornar"
      }
    },
    {
      "id": "6d0eb47b4315dccd",
      "url": "https://devpleno.com/blog/complexidade-de-um-algoritmo/index",
      "title": "Como saber a complexidade de um algoritmo (Part 1)",
      "content": "Hoje eu gostaria de dar uma dica rápida, principalmente para o pessoal que estiver fazendo alguns testes no codelite, porque ele considera a complexidade de um algoritmo quando vai avaliar, obviamente depende muito de enunciado de problema.\n\nO grande problema que eu vejo é saber se a notação big-O, que usamos para saber a complexidade do algoritmo, é uma solução boa ou não. Uma ideia que gosto bastante de usar é a seguinte: se você tem uma função qualquer, e você passa um vetor para essa função:\n\n```jsx\nfunction calculo(vetor) {}\n```\n\nComo saber a complexidade desse cálculo? Temos que olhar as coisas que podem variar no cálculo, no caso acima, o tamanho do vetor. Geralmente o tamanho do vetor seria um const n por exemplo:\n\n```jsx\nfunction calculo(vetor) {\n  const n = vetor.lenght\n\n  for (let i = 0; i < n; i++) {\n    console.log(n)\n  }\n}\n```\n\nEntão ela poderia variar de acordo com N. Se considerarmos que o tamanho do vetor é N (geralmente no problema eles falam isso) logo esse é um algoritmo O(n) porque ele vai rodar a coisa mais pesada dele e vai iterar N vezes, quanto maior for esse N, mais vezes vamos rodar esse pedaço de código.\n\nSe tivermos outra função, por exemplo um outro _for,_ e tivermos que fazer um cálculo baseado no N:\n\n```jsx\nfunction calculo(vetor, m) {\n  const n = vetor.lenght\n\n  for (let i = 0; i < n; i++) {\n    console.log(n)\n    for (let k = 0; k < m; k++) {\n      console.log(n * k)\n    }\n  }\n}\n```\n\nNesse cenário, sabemos que tem dois for, um dentro do outro, o de cima varia em N e o de baixo varia em M. Se o M for um valor diferente, a complexidade dele é O(n*m), porque ele depende de dois fatores de entrada para saber a complexidade e o número de vezes que vai rodar o segundo console.log vai ser n*m.\n\nSe por algum propósito do algoritmo o M for N, então teremos uma complexidade O(n²) que é o pior algoritmo que temos, porque ele cresce de forma exponencial.",
      "keywords": [
        "vetor",
        "para",
        "complexidade",
        "algoritmo",
        "porque",
        "rodar",
        "console",
        "isso",
        "esse",
        "muito"
      ],
      "metadata": {
        "title": "Como saber a complexidade de um algoritmo",
        "date": "2017-07-11",
        "tags": "['Algoritmos', 'Fundamentos']",
        "thumbnail": "COMPLEXIDADE-DE-UM-ALGORITMO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/complexidade-de-um-algoritmo/index.md"
      }
    },
    {
      "id": "6d38196c50150e6b",
      "url": "https://devpleno.com/blog/escopos-e-closures/index",
      "title": "Escopos e Closures - NodeJS Primeiros Passos (Part 2)",
      "content": "Com isso, travamos a variável apenas para o escopo definido. Temos um tipo de escopo que chamamos de Self involking function, onde temos um parenteses e colocamos uma função anônima dentro.\n\n```jsx\n;(function () {\n  var a,\n    b = 1\n\n  console.log(1)\n})()\n```\n\nPerceba que existe um abrir e fechar parênteses no fim, assim, estamos 'chamando' a função. Sem isso, nada acontece.\n\n**Qual a vantagem de fazermos códigos dentro de uma Self Involking function?** Tudo que fizer lá dentro, como var a, b = 1, não estará sujando o escopo global, além disso, caso eu queira alterar o escopo dentro não consiguirá, as únicas que conseguem são as que estiverem dentro do self involking. Uma outra coisa interessante no JavaScript é que podemos fazer é a seguinte:\n\n```jsx\n;(function () {\n  var a = 10\n\n  function inc() {\n    a++\n  }\n\n  inc()\n\n  console.log(a)\n})()\n```\n\nAssim o escopo é realmente isolado. Note que o escopo filho (a++) busca o valor do escopos pai. Isso nos permite fazer, por exemplo, um contador tentando imitar um comportamento de singleton, ou seja, mantendo uma função só de uma classe. Como não temos classe, podemos simular algo semelhante.\n\n```jsx\nvar conta = (function() {\n\n  var contador = 0;\n\n  return function(){\n    contador++; console.log(contador);\n  }\n}();\n\nconta();\n\nconta();\n\nconta();\n```\n\nPegamos essa função e jogamos dentro de uma variável.\n\n**O que aconteceu ali?** A var 'conta' vai receber a self invoking function, que retorna automaticamente uma outra function, e como ela está dentro do escopo, é possível acessar o escopo pai. O javaScript mantém esse escopo mesmo quando a função deixou de ser executada, e então temos um comportamento parecido com o singleton. Quando uma função tem acesso a uma variável do escopo pai mesmo depois que acabou de ser executada, chamamos de Closer. Mais um exemplo:\n\n```jsx\nvar conta = (function() {\n  var contador = 0;",
      "keywords": [
        "escopo",
        "function",
        "console",
        "vari",
        "conta",
        "dentro",
        "fazer",
        "podemos",
        "contador",
        "para"
      ],
      "metadata": {
        "title": "Escopos e Closures - NodeJS Primeiros Passos",
        "date": "2017-05-25",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "ESCOPUS-E-CLOSURES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/escopos-e-closures/index.md"
      }
    },
    {
      "id": "6dd7b4c4956a5683",
      "url": "https://devpleno.com/tecnica-para-alcancar-seus-objetivos",
      "title": "Técnica para eliminar o que não te faz alcançar seus objetivos - DevPleno (Part 2)",
      "content": "Você vai perceber que isso faz muito sentido. Novamente, eu venho fazendo isso de forma consistente e o resultado é incrível. Coisas que eu não pensava que eu ia fazer agora eu estou fazendo como por exemplo pedir para sair de projeto por estar me dando muito estresse ou financeiramente inviável.\n\nUma coisa interessante, fazendo isso, ou vai entrar coisas melhores na sua vida ou você foca na lista menor, afinal os projetos que ficaram vão ter mais energia.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=T%C3%A9cnica%20para%20eliminar%20o%20que%20n%C3%A3o%20te%20faz%20alcan%C3%A7ar%20seus%20objetivos&url=https%3A%2F%2Fdevpleno.com%2Ftecnica-para-alcancar-seus-objetivos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftecnica-para-alcancar-seus-objetivos)",
      "description": "Hoje eu gostaria de compartilhar uma dica bem rápida, basicamente de como você pode, de uma maneira bem fácil, evoluir na sua vida, seja ela financeira, or...",
      "keywords": [
        "para",
        "isso",
        "como",
        "projeto",
        "https",
        "fazendo",
        "lucro",
        "seus",
        "objetivos",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/tecnica-para-alcancar-seus-objetivos"
      }
    },
    {
      "id": "6de4bee0466bdadf",
      "url": "https://devpleno.com/servidor-http-basico-2",
      "title": "Servidor HTTP Básico - NodeJS Primeiros Passos - DevPleno (Part 1)",
      "content": "Javascript\n\n## Servidor HTTP Básico - NodeJS Primeiros Passos\n\nT\nPor Tulio Faria • 15 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNa série NodeJS Primeiros Passos, você poderá os conceitos básicos de Javascript e NodeJS e, assim, poder colocar a mão na massa. Neste primeiro post, confira como criar um Servidor HTTP básico.\n\nPrimeira coisa que temos que fazer é acessar o [www.nodejs.org](https://www.nodejs.org) e fazer o download (não vou entrar nessa parte, pois depende da plataforma que você está utilizando, mas de modo geral é bem simples de se fazer)*.\n\nVocê precisa conseguir pelo menos escrever no Shell (prompt de comando) o seguinte:\n\nnpm - v\nCom isso, conseguimos ver a versão do node package mananger.\n\nE se colocarmos:\n\nnode - v\nAparecerá a versão do node que estamos usando. Se aparecer normalmente a versão deles, significa que estão no path do seu sistema e você conseguirá executá-los diretamente. Se ele não estiver no path do sistema, recomendo que coloque a pasta de instalação do Node no path.\n\nComo Node é JavaScript, no sublime vou criar um arquivo novo e importar um módulo do node chamado http, ele permite que manipulemos requisições http. Também vamos criar um servidor com uma função request e response, assim, tudo que entrar no meu servidor, vou devolver o texto “devpleno.com”:",
      "description": "Na série NodeJS Primeiros Passos, você poderá os conceitos básicos de Javascript e NodeJS e, assim, poder colocar a mão na massa. Neste primeiro post, conf...",
      "keywords": [
        "http",
        "servidor",
        "node",
        "nodejs",
        "https",
        "devpleno",
        "para",
        "contents",
        "javascript",
        "criar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/servidor-http-basico-2"
      }
    },
    {
      "id": "6deed3bbd30badd7",
      "url": "https://devpleno.com/anotacoes-em-eventos",
      "title": "Como fazer anotações em eventos - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Como%20fazer%20anota%C3%A7%C3%B5es%20em%20eventos&url=https%3A%2F%2Fdevpleno.com%2Fanotacoes-em-eventos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fanotacoes-em-eventos)",
      "description": "Quando vamos em um evento é muito legal que vamos anotando tudo, então tem várias ideias, conteúdo, etc, coisas que você nem sabe como vai converter isso e...",
      "keywords": [
        "conte",
        "para",
        "https",
        "como",
        "anota",
        "eventos",
        "quando",
        "ideias",
        "coisas",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/anotacoes-em-eventos"
      }
    },
    {
      "id": "6e83f008f4df95a8",
      "url": "https://devpleno.com/salario-em-ti",
      "title": "Por que o Salário em TI é baixo? DevPleno Reponde - DevPleno (Part 2)",
      "content": "Isso se aplica em todas as áreas. Existe personal trainer que ganha menos de um salário mínimo, mas também existe personal que ganha R$100mil por mês. O mesmo acontece com TI.\n\nEntão avalie esse tipo de coisa. Você está gerando faturamento ou é só um custo para a empresa? Obviamente, em algumas empresas, você não está diretamente relacionado com a área ou gerando faturamento, mas é bom avaliar nesse sentido que citei acima. Assim, você conseguirá saber se seu salário está baixo ou alto, essa é uma boa métrica.\n\nOutra métrica é saber se você está qualificado. Se você está lendo isso, é porque quer se qualificar, já que está procurando conhecimento, quer melhorar sua carreira e isso me deixa mais tranquilo. Por mais que você sofra essa dor de achar que o salário é baixo, está buscando melhorar sua carreira e isso já é uma boa coisa. Para você ganhar mais, tem que se dedicar à sua carreira. “Seja quente ou seja frio.” Quem é morno não tem previsão de evoluir. Se quiser destacar na área, faça com garra, com amor, vontade, faça dar resultados, um código limpo com processo cada vez melhor, dê seu sangue, gere ideias, ajude seu chefe, faça tudo. Claro, não precisa deixar de curtir a vida, mas não seja comum.\n\nExiste um treinamento de um grande mentor meu que trabalha mais sobre essa mentalidade.\n\nSe tiver interesse, mande um e-mail para [tuliofaria@devpleno.com](mailto:tuliofaria@devpleno.com). Irei te passar o link.\n\nConfira minha fala em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Uma pergunta que ouço com frequência, principalmente dos profissionais da área de T.I, é: &#34;Por que o salário em TI é baixo?&#34;. A primeira coisa que eu acho ...",
      "keywords": [
        "isso",
        "carreira",
        "baixo",
        "para",
        "mais",
        "https",
        "devpleno",
        "alto",
        "muito",
        "essa"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/salario-em-ti"
      }
    },
    {
      "id": "6ef5300904d7cbef",
      "url": "https://devpleno.com/blog/streams-parte-3-transform/index",
      "title": "Hands-on: Streams Parte 4 - Transform (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "const",
        "readable",
        "transform",
        "writable",
        "para",
        "stream",
        "pipe",
        "arquivo",
        "zipper",
        "criamos"
      ],
      "metadata": {
        "title": "Hands-on: Streams Parte 4 - Transform",
        "date": "2017-05-10",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/streams-parte-3-transform/index.md"
      }
    },
    {
      "id": "6f2cb3b3556dbcd4",
      "url": "https://devpleno.com/request",
      "title": "Request - Requisições HTTP de forma rápida e simples - DevPleno (Part 1)",
      "content": "Javascript\n\n## Request - Requisições HTTP de forma rápida e simples\n\nT\nPor Tulio Faria • 14 de agosto de 2017\n\n*\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nO Request é um pacote que permite que façamos requisições HTTP. Uma coisa interessante sobre ele é que é uma ferramenta muito simples, conseguimos fazer requisições em algum ambiente ou servidor HTTP de uma forma rápida.\n\nPrimeiramente vamos instalar:\n\nnpm install request\nAgora vamos criar um novo arquivo e fazer um require no nosso request e pegar o site da UOL por exemplo:\n\nconst request = require('request')\nrequest('https://www.uol.com.br', function (err, res, body) {\nif (!err &#x26;&#x26; res.statusCode === 200) {\nconsole.log(body)\n}\n})\nEntão se não retornar nenhum erro e a resposta for um http 200, ele retorna o body, que é um parâmetro da nossa function.\n\nAo rodar o código, perceba que retornará todo o HTML da página principal do UOL, isso é útil, pois sempre que quisermos consumir uma API, podemos usar o request, lembrando que ele permite outros métodos HTTP também, como um post e principalmente para baixar dados.\n\nVamos supor que eu quisesse salvar o site da UOL (pode ser um site, um arquivo, uma imagem, mas vou salvar o site todo para demonstrar):\n\nconst request = require('request')\nconst fs = require('fs')\nrequest('https://www.uol.com.br').pipe(fs.createWriteStream('home.html'))\n(Lembrando que o ‘fs’ já faz parte do core do Node, então não precisamos instalar nada).* Então ele vai ligar o output stream do request com o writeStream do ‘fs’ que acabamos de criar, no fim das contas ele vai salvar em um home.html.",
      "description": "O Request é um pacote que permite que façamos requisições HTTP. Uma coisa interessante sobre ele é que é uma ferramenta muito simples, conseguimos fazer re...",
      "keywords": [
        "request",
        "https",
        "para",
        "http",
        "require",
        "site",
        "javascript",
        "requisi",
        "vamos",
        "const"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/request"
      }
    },
    {
      "id": "6f684c85ddda221e",
      "url": "https://devpleno.com/blog/8",
      "title": "Blog - Página 8 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 21 de ago. de 2017 Estruturas de Dados - Pilhas](/pilha)\n\n[Carreira 18 de ago. de 2017 Impostos e como receber de empresas estrangeiras](/como-receber-de-empresas-estrangeiras)\n\n[Javascript 18 de ago. de 2017 [SEGREDO] Muitos registros do MySQL no NodeJS](/registros-do-mysql-no-nodejs)\n\n[Javascript 17 de ago. de 2017 Hands-on: Request-promise](/request-promise)\n\n[Carreira 16 de ago. de 2017 negociação - Como vender um Software](/como-vender-software)\n\n[Carreira 16 de ago. de 2017 3 dicas para começar a empreender na área de software](/empreender-na-area-de-software)\n\n[Javascript 14 de ago. de 2017 Cheerio: Uma implementação jQuery para Node](/cheerio)\n\n[Javascript 14 de ago. de 2017 Request - Requisições HTTP de forma rápida e simples](/request)\n\n[Carreira 12 de ago. de 2017 Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão!](/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao)\n\n[Javascript 10 de ago. de 2017 Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios](/hands-on-rimraf)\n\n[Javascript 10 de ago. de 2017 Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM)](/hands-on-yarn)\n\n[Carreira 9 de ago. de 2017 Porque se sujar faz bem!](/se-sujar-faz-bem)\n\n[Anterior](/blog/7)8 / 26[Próxima](/blog/9)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "carreira",
        "nodejs",
        "como",
        "request",
        "software",
        "empresa",
        "para",
        "blog"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/8"
      }
    },
    {
      "id": "6f8175fd07752bfe",
      "url": "https://devpleno.com/blog/low-db/index",
      "title": "Low-DB - Banco de dados para NodeJS baseado em JSON (Part 2)",
      "content": "```jsx\nbd.get('noticias').find({ id: '1' }).write()\n```\n\nEsta é uma ótima ferramenta para utilizarmos em projetos pequenos, não vamos utilizar um banco de dados expansive ou até mesmo para armazenar settings de sua aplicação.\n\nConfira o Hands-on no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Zej3O0o7v4o\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "banco",
        "para",
        "podemos",
        "json",
        "mais",
        "exemplo",
        "vamos",
        "lowdb",
        "noticias",
        "write"
      ],
      "metadata": {
        "title": "Low-DB - Banco de dados para NodeJS baseado em JSON",
        "date": "2017-05-11",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Low-db.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/low-db/index.md"
      }
    },
    {
      "id": "6fd585a884644094",
      "url": "https://devpleno.com/fsmrelampago-wpp",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-wpp to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fsmrelampago"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsmrelampago-wpp"
      }
    },
    {
      "id": "6fe1c8aee4521824",
      "url": "https://devpleno.com/blog/nodejs-primeiros-passos-promises/index",
      "title": "Vídeo sobre NodeJS com Promises",
      "content": "Neste vídeo vamos organizar o código assíncrono para facilitar a manutenção posterior do código. Evitando que o código \"cresça para frente\" :)\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ogg4mDfgGHg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "digo",
        "para",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Vídeo sobre NodeJS com Promises",
        "date": "2016-07-12",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "NodePromises.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/nodejs-primeiros-passos-promises/index.md"
      }
    },
    {
      "id": "6fe3a2fa64f16704",
      "url": "https://devpleno.com/blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index",
      "title": "As vantagens do Javascript em todas as camadas de uma aplicação (Part 2)",
      "content": "Com a união de todos esses, é possível fazer algo com o JavaScript do começo ao fim. E, se hoje essa linguagem é utilizada de ponta a ponta, isso se deve ao trabalho brilhante do programador Ryan Dahl, que apresentou o [Node.js](https://www.devpleno.com/modulos?utm_source=blog&utm_campaign=rc_blogpost) durante uma conferência JSConf na Europa e foi aplaudido de pé na ocasião.\n\nO node.js é uma plataforma que permite a interpretação de código JavaScript do lado do servidor. Ou seja, com o node.js, é possível levar o JavaScript ao back-end.\n\nQuando uma equipe de programadores começa a criar um ambiente de desenvolvimento e instala o node.js, também é instalada uma ferramenta chamada [NPM](https://www.devpleno.com/npm-e-modulos-de-terceiros?utm_source=blog&utm_campaign=rc_blogpost), sigla para Node Package Manager.\n\nO NPM é utilizado para instalação e gerenciamento de módulos no Node.js. Muitas pessoas preferem utilizar, para o mesmo trabalho, o [Yarn](https://www.devpleno.com/hands-on-yarn?utm_source=blog&utm_campaign=rc_blogpost), que é mais rápido e eficaz, mas independentemente da opção escolhida, é com o gerenciador de módulos que será feita a instalação do Express, um framework para o Node.js.\n\nO Express é ao mesmo tempo minimalista e robusto: com ele, é possível criar com mais facilidade qualquer tipo de aplicação web. Ele permite a passagem facilitada do navegador para back-end e economiza trabalho de programação.\n\nJá o EJS é a sigla para Embedded JavaScript templates, que é uma linguagem de templates que permite a criação de HTML com apenas JavaScript. A utilização do EJS simplifica a vida do desenvolvedor, que poderá realmente utilizar essa linguagem em todo o desenvolvimento do produto.\n\nCom isso, o processo de desenvolvimento é mais rápido e o código completo fica mais integrado e padronizado, pois apenas JavaScript é utilizado, ainda que o EJS emita o resultado em HTML.",
      "keywords": [
        "javascript",
        "para",
        "aplica",
        "linguagem",
        "mais",
        "camadas",
        "node",
        "todas",
        "back",
        "front"
      ],
      "metadata": {
        "title": "As vantagens do Javascript em todas as camadas de uma aplicação",
        "date": "2017-10-06",
        "tags": "['Javascript']",
        "thumbnail": "VantagensUsarJS.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index.md"
      }
    },
    {
      "id": "70006d85bd122fda",
      "url": "https://devpleno.com/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! - DevPleno (Part 4)",
      "content": "O MFS tende a ser usado por equipes reduzidas. Ele é pautado na diminuição de riscos e na qualidade do produto final. O objetivo é identificar as falhas mais comuns e evitá-las.\n\n### 4. Dynamic System Development Model (DSDM)\n\nO DSDM pode ser chamado de pai dos métodos ágeis. Ele é destinado ao desenvolvimento de projetos com [orçamento fixo](https://www.devpleno.com/precificacao-em-software?utm_source=blog&#x26;utm_campaign=rc_blogpost), assim como prazos curtos e bem definidos. O DSDM se difere das demais metodologias ágeis pois é composto por processos interligados de modelagem e é restrito no tempo. Assim, ele é um método um pouco mais rígido que os outros.\n\n### 5. Scrum\n\nMais conhecido atualmente, algumas pessoas acreditam que Scrum é a definição de metodologia ágil. Sua grande fama não veio ao acaso: o Scrum tem uma estrutura de planejamento e divisão de tarefas em ciclos que permitem que outros métodos ágeis sejam implementadas no próprio Scrum.\n\nExistem diversos tutoriais sobre como funciona o Scrum. Mas, de uma maneira mais simples: é criado um Product Sprint Backlog, nele são listadas as funcionalidades que precisam ser mantidas no programa. Cria-se, em cima disso, ciclos de implementação chamados sprints. Entre as definições e trabalhos de cada sprint existem reuniões de equipe.\n\nAssim, a medida que cada sprint é feito, outro se inicia. E esse ciclo continua até a conclusão do projeto.\n\n## Gostou das metodologias? Então implemente-as!\n\nAgora você já entendeu o que é uma metodologia ágil, como funciona, o que a rege, quais são seus principais norteadores e quais as principais representantes dessa forma de trabalhar. Toda a informação ficou clara?",
      "description": "Nascidas nos anos 80, só vieram a ficar conhecidas depois dos anos 2000. Muito comuns no desenvolvimento de softwares, essas ferramentas ganharam espaço em...",
      "keywords": [
        "mais",
        "metodologia",
        "para",
        "geis",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores"
      }
    },
    {
      "id": "7005286fc3cb8240",
      "url": "https://devpleno.com/blog/formas-de-trabalho-por-meio-da-toptal/index",
      "title": "Formas de trabalho na Toptal",
      "content": "Você sabe quais as formas de trabalho quando se atua por meio da Toptal? Confira neste vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/BqwZploELyA\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais <a href=\"https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog\">sobre o DevReactJS aqui</a>.\n\n![DevReact](295333ff-cec1-4499-a626-c5101ff9c5f5.png)",
      "keywords": [
        "embed",
        "responsive",
        "mais",
        "profissionais",
        "toptal",
        "classname",
        "iframe",
        "https",
        "reactjs",
        "devreactjs"
      ],
      "metadata": {
        "title": "Formas de trabalho na Toptal",
        "date": "2018-02-15",
        "tags": "['Carreira']",
        "thumbnail": "FORMAS-DE-TRABALHO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/formas-de-trabalho-por-meio-da-toptal/index.md"
      }
    },
    {
      "id": "700fab6ae7f034a6",
      "url": "https://devpleno.com/blog/javascript-apply/index",
      "title": "JavaScript: Apply (Part 2)",
      "content": "Com o apply, podemos adaptar como vamos executar a função e também é uma forma de manipular em qual contexto essa função está sendo executada, assim como o bind. Ela é muito útil quando precisamos converter ou passar atributos para a função como vetor ao invés de individualmente.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/_IiC50zIUlY\" allowfullscreen></iframe>\n</div>\n\nDeixe seu comentário. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "apply",
        "funteste",
        "como",
        "podemos",
        "para",
        "this",
        "console",
        "math",
        "fazer",
        "contexto"
      ],
      "metadata": {
        "title": "JavaScript: Apply",
        "date": "2017-05-24",
        "tags": "['Javascript']",
        "thumbnail": "Apply.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/javascript-apply/index.md"
      }
    },
    {
      "id": "70a81e02370e76f1",
      "url": "https://devpleno.com/blog/socket-io-parte2/index",
      "title": "Hands-on - Socket.io Parte 2 (Part 1)",
      "content": "Continuando nossa série sobre Socket.io, vamos aprofundar um pouco mais no assunto. Lembrando nosso código do lado server:\n\n```jsx\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\napp.get('/', (req, res) => {\n  res.sendFile(__dirname + '/index.html')\n})\nio.on('connection', (socket) => {\n  console.log('New connection', socket.id)\n})\nhttp.listen(3000, function () {\n  console.log('listening on port 3000')\n})\n```\n\nSimplesmente estávamos tratando a conexão, então se o cliente conectou, isso nos era mostrado, além do ID da conexão. _(Lembrando que cada Socket criado tem um ID diferente. Mesmo que o cliente abra duas abas com links da mesma sessão, elas são tratadas separadamente)._\n\nVamos abrir o cliente e adicionar o Jquery \\_(apenas procure no Google jquery CDN, copiar a url e adicionar em source) e e_m seguida adicionar um socket.on. Com isso, sabemos do lado do cliente que foi conectado.\n\n```jsx\n<html>\n  <body>\n    <h1>Socket.io</h1>\n    <script src='/socket.io/socket.io.js'></script>\n    <script src='https://code.jquery.com/jquery-3.2.1.min.js'> </script>\n    <div id='msgs'></div>\n    <script>\n      const socket = io() socket.on('connect', function()\n      {$('msgs').append('connected with id: ' + socket.id + '<br>')}\n    </script>\n  </body>\n</html>\n```\n\n**E como isso será notificado?**\n\nPerceba que criamos uma DIV msgs para podermos colocar as mensagens dentro a medida que recebemos. Quando o cliente conectar nosso div msgs, irá chamar o append e mostrar a conexão com o ID utilizado. Assim, podemos, por exemplo, identificar o usuário baseado nesta conexão.\n\n**O que podemos fazer?**\n\nQuando o cliente se conectar, podemos mandar uma mensagem para o servidor, por exemplo, que o ID especifico está conectado. Adicionando no lado do cliente um socket emit dentro da function e mandamos escrever a msg gerado do lado servidor.",
      "keywords": [
        "socket",
        "script",
        "cliente",
        "lado",
        "function",
        "msgs",
        "para",
        "connected",
        "isso",
        "mensagem"
      ],
      "metadata": {
        "title": "Hands-on - Socket.io Parte 2",
        "date": "2017-05-12",
        "tags": "['Javascript']",
        "thumbnail": "Socket.IO2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/socket-io-parte2/index.md"
      }
    },
    {
      "id": "70b223b00acc6d72",
      "url": "https://devpleno.com/blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index",
      "title": "Por que fazer um curso de programação voltado para a prática? (Part 4)",
      "content": "Outra coisa importante são os padrões de projeto. Atualmente é muito utilizado o padrão MVC – Model View Controller para programação web. Nesse modelo, o desenvolvimento das camadas de banco de dados, interface, e do código que faz o meio de campo entre eles é claramente dividido. Há outros padrões como MMVC, MVP.\n\nSaber onde são encontradas bibliotecas, usar padrões de projetos e ferramentas para gerenciamento diminui o tempo para entrega e aumenta a performance. Isso melhora o relacionamento com o cliente, como veremos a seguir.\n\n## Para saber lidar com as necessidades dos clientes\n\nQuem desenvolve profissionalmente sabe como é lidar com as expectativas e, muitas vezes, despreparo do cliente para lidar com a criação de um projeto. Normalmente o programador tem que se virar para que possa, [com prazos e orçamentos apertados](https://www.devpleno.com/precificacao-em-software?utm_source=blog&utm_campaign=rc_blogpost), entregar projetos grandes.\n\nHá também aquelas mudanças que são solicitadas logo que o sistema é pronto. É comum que o programador tenha inclusive que informar ao cliente o que o próprio cliente quer.\n\nAssim, é importante que ao aprender a desenvolver receba orientações a respeito de como entregar o sistema em partes, apresentando versões mais simplificadas do sistema, com versões até a entrega do produto final. Isso aumenta a satisfação do cliente pois a chance de frustração cai e, consequentemente, aumenta-se o seu engajamento e o seu entendimento a respeito do que está sendo feito.\n\n## Para aumentar a qualidade do projeto\n\nAlém da questão da produtividade, para que um projeto seja bem-sucedido, ele não pode apresentar bugs ou desalinhamento em relação aos requisitos de negócio.\n\nExistem várias ferramentas gratuitas que podem ser encontradas na web que ajudam o desenvolvedor a debugar o sistema e, em um curso voltado para a prática, certamente haverá o contato com soluções assim.",
      "keywords": [
        "para",
        "como",
        "https",
        "projeto",
        "mais",
        "desenvolvimento",
        "devpleno",
        "source",
        "blog",
        "campaign"
      ],
      "metadata": {
        "title": "Por que fazer um curso de programação voltado para a prática?",
        "date": "2017-07-31",
        "tags": "['Carreira']",
        "thumbnail": "CursoProgramacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index.md"
      }
    },
    {
      "id": "70fbbf3c32b78962",
      "url": "https://devpleno.com/busca-binaria",
      "title": "Busca Binária - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Busca Binária\n\nT\nPor Tulio Faria • 29 de agosto de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nHoje vamos falar um pouco mais sobre algoritmos, que são as bases da computação. Especificamente sobre um tipo de busca que eu já utilizei em um projeto e nunca imaginei que iria utilizar, a busca binária.\n\nOs algoritmos de busca inicialmente parecem teóricos demais, mas, na verdade, podemos usar bastante em projetos. Há algum tempo, antes de termos o Android e IOS, era comum termos os Palmtops, eles tinham memória péssima e precisávamos fazer uma busca que nem era tão grande (essa busca demorava demais de forma sequencial) a partir disso, assumimos uma restrição nos dados, deixando-os ordenados para a busca binária e assim conseguimos resolver o problema.\n\nVou dar um exemplo de um problema com um vetor de 5 itens. Deixávamos o vetor de forma sequencial e salvavamos esses slots de dados sequencialmente, mas isolados, com isso era possível saber que quando fossemos naquele ponto de memória, teria poucas iterações.\n\nA estratégia era a seguinte: tentamos acertar primeiro o item do meio, por exemplo, o número 3, se o número 3 é igual ao número que eu estou buscando, ele é retornado, caso eu esteja procurando o 2 por exemplo, eu sei que ele é menor que o 3, então meu próximo espaço de busca será 1 ou 2, com isso é tentado de novo, se acertar, ele retorna, caso contrário tentará de novo e por aí vai.\n\nPor esse motivo é chamado de busca binária, porque sempre vamos dividir em dois espaços. O pior dos casos é ele dividir todos pela metade. Vamos implementar agora:\n\nconst vetor = [1, 2, 3, 4, 5]\n\nconst binSearch = (vetor, left, right, valor) => {\nif (right >= left) {\nconst indice = parseInt(left + (right - left) / 2)\n\nif (vetor[indice] === valor) {\nreturn valor\n}\n\nif (vetor[indice] > valor) {\nreturn binSearch(vetor, left, indice - 1, valor)\n}\n\nreturn binSearch(vetor, indice + 1, right, valor)\n}\n\nreturn -1\n}\n\nconsole.log(binSearch(vetor, 0, vetor.length - 1, 20))",
      "description": "Hoje vamos falar um pouco mais sobre algoritmos, que são as bases da computação. Especificamente sobre um tipo de busca que eu já utilizei em um projeto e ...",
      "keywords": [
        "vetor",
        "valor",
        "busca",
        "left",
        "indice",
        "vamos",
        "binsearch",
        "right",
        "const",
        "return"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/busca-binaria"
      }
    },
    {
      "id": "7123207631cf0f25",
      "url": "https://devpleno.com/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao",
      "title": "As vantagens do Javascript em todas as camadas de uma aplicação - DevPleno (Part 2)",
      "content": "Para compreender melhor como exatamente o JavaScript pode ser utilizado em todas as camadas de uma aplicação, é preciso conhecer também alguns outros nomes: Node JS, Express, EJS e MongoDB.\n\nCom a união de todos esses, é possível fazer algo com o JavaScript do começo ao fim. E, se hoje essa linguagem é utilizada de ponta a ponta, isso se deve ao trabalho brilhante do programador Ryan Dahl, que apresentou o [Node.js](https://www.devpleno.com/modulos?utm_source=blog&#x26;utm_campaign=rc_blogpost) durante uma conferência JSConf na Europa e foi aplaudido de pé na ocasião.\n\nO node.js é uma plataforma que permite a interpretação de código JavaScript do lado do servidor. Ou seja, com o node.js, é possível levar o JavaScript ao back-end.\n\nQuando uma equipe de programadores começa a criar um ambiente de desenvolvimento e instala o node.js, também é instalada uma ferramenta chamada [NPM](https://www.devpleno.com/npm-e-modulos-de-terceiros?utm_source=blog&#x26;utm_campaign=rc_blogpost), sigla para Node Package Manager.\n\nO NPM é utilizado para instalação e gerenciamento de módulos no Node.js. Muitas pessoas preferem utilizar, para o mesmo trabalho, o [Yarn](https://www.devpleno.com/hands-on-yarn?utm_source=blog&#x26;utm_campaign=rc_blogpost), que é mais rápido e eficaz, mas independentemente da opção escolhida, é com o gerenciador de módulos que será feita a instalação do Express, um framework para o Node.js.\n\nO Express é ao mesmo tempo minimalista e robusto: com ele, é possível criar com mais facilidade qualquer tipo de aplicação web. Ele permite a passagem facilitada do navegador para back-end e economiza trabalho de programação.\n\nJá o EJS é a sigla para Embedded JavaScript templates, que é uma linguagem de templates que permite a criação de HTML com apenas JavaScript. A utilização do EJS simplifica a vida do desenvolvedor, que poderá realmente utilizar essa linguagem em todo o desenvolvimento do produto.",
      "description": "As muitas vantagens de usar JavaScript fizeram com que ela se tornasse a linguagem de programação mais popular do mundo. Extremamente versátil, o JavaScrip...",
      "keywords": [
        "javascript",
        "para",
        "aplica",
        "camadas",
        "linguagem",
        "mais",
        "todas",
        "node",
        "back",
        "https"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao"
      }
    },
    {
      "id": "713e397ef6fdd829",
      "url": "https://devpleno.com/blog/vagas-de-emprego-no-brasil-e-no-exterior/index",
      "title": "Descrição das vagas de emprego no Brasil x no exterior (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "embed",
        "mail",
        "pessoas",
        "pessoa",
        "isso",
        "engenheiros",
        "responsive",
        "https",
        "youtube"
      ],
      "metadata": {
        "title": "Descrição das vagas de emprego no Brasil x no exterior",
        "date": "2017-09-26",
        "tags": "['Carreira']",
        "thumbnail": "VagasEmprego.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/vagas-de-emprego-no-brasil-e-no-exterior/index.md"
      }
    },
    {
      "id": "71cc8609fe3c348c",
      "url": "https://devpleno.com/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica",
      "title": "Por que fazer um curso de programação voltado para a prática? - DevPleno (Part 2)",
      "content": "São muitas as razões para se [profissionalizar em TI](https://www.devpleno.com/integridade?utm_source=blog&#x26;utm_campaign=rc_blogpost) não é mesmo? Vamos mostrar no artigo de hoje a importância de escolher um curso que valorize a prática. Isso leva o profissional a apresentar resultados com maior rapidez ao ser contratado ou mesmo o favorece em processos de seleção, especialmente nas entrevistas! Preparado? Então vamos lá!\n\n## Para conhecer as tecnologias usadas pelas empresas\n\nQuando uma empresa contrata ou um desenvolvedor, seja para um emprego fixo, seja para um [freela](https://www.devpleno.com/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira?utm_source=blog&#x26;utm_campaign=rc_blogpost), exige-se, fundamentalmente, conhecimentos e habilidades específicas das tecnologias relacionadas ao projeto ou que são mais usadas na empresa. Geralmente, é necessário que tenha capacidade de trabalhar com múltiplas tecnologias, especialmente em projetos para web.\n\nEntre as competências que se pode exigir de um desenvolvedor para que entre um projeto, normalmente podemos encontrar:\n\n### Para desenvolvimento de front-end:\n\n-\nconhecimento em html5, css3 e javascprit;\n\n-\nconhecimentos em algum framework para trabalhar com as linguagens acima, como [ReactJs](https://www.devpleno.com/renderizar-estruturas-em-formato-de-arvore?utm_source=blog&#x26;utm_campaign=rc_blogpost), AngularJs, CanJs, jQuery, Bootstrap etc.\n\n-\npelo menos um conhecimento básico de sistemas para tratamento de imagens e criação de vetores.\n\n### Já para o desenvolvimento de back-end:\n\n-\nconhecimento aprofundado em pelo menos uma linguagens de back-end, como NodeJS, Java, Python, PHP, C# etc;\n\n-\nem relação à linguagem que será trabalhada, é importante ter pelo menos um Framework , como Spring, Django, Laravel, ExpressJS;\n\n-\nbancos de dados SQL e NoSql;\n\n-\nsistemas operacionais.",
      "description": "A área de tecnologia da informação oferece muitas oportunidades e, para aproveitálas, o profissional deve se preparar continuamente. Para tanto, o desenvol...",
      "keywords": [
        "para",
        "como",
        "projeto",
        "https",
        "source",
        "blog",
        "campaign",
        "blogpost",
        "mais",
        "desenvolvimento"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica"
      }
    },
    {
      "id": "71e2f81ed422bd64",
      "url": "https://devpleno.com/blog/gerenciador-de-series-p1/index",
      "title": "Construindo um App gerenciador de séries com ReactJS (Part 4)",
      "content": "```jsx\n<Ola></Ola>\n```\n\ne o resultado é o seguinte:\n\n![componente em ReactJS](4177607c-e413-43a6-bcaa-129d3a163cba.png)\n\nAcabamos de criar um componente. Outra coisa importante é que conseguimos injetar dados, como por exemplo:\n\n```jsx\n<Ola name='Tulio' />\n```\n\nE dentro do Ola.js fazer o seguinte:\n\n```jsx\nimport React, { Component } from 'react'\nclass Ola extends Component {\n  render() {\n    return <span>Olá {this.props.name}!</span>\n  }\n}\nexport default Ola\n```\n\nEssa é uma forma de enviar dados do componente pai para o filho, afinal estamos passando propriedades (ou props) para o componente.\n\nDurante a execução do projeto que vamos fazer, utilizaremos bastante isso.\n\nPor fim, vou mostrar como vamos criar o banco de dados que vamos utilizar com o Json Server. Vou criar dentro de src mesmo, apenas para teste, chamado db.json.\n\nEsse db.json vai ter o seguinte formato:\n\n```jsx\n{\n  \"series\":[\n    {\n    \"id\": 1,\n    \"name\": \"How I met your mother\"\n    },\n    {\n    \"id\": 2,\n    \"name\": \"Friends\"\n    }\n  ]\n}\n```\n\nVamos salvar e dentro do diretório colocar\n\n```jsx\njson-server --watch db.json\n```\n\nCom isso, temos um resource Séries dentro do nosso localhost. Então, se acessarmos o código via browser, temos acesso ao Json preparado para podermos assumir dentro da aplicação, apenas utilizando a url.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Ckp23FEAVQ8\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "title": "Construindo um App gerenciador de séries com ReactJS",
        "date": "2017-07-19",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "ReactJS-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/gerenciador-de-series-p1/index.md"
      }
    },
    {
      "id": "7210cbfab1c69056",
      "url": "https://devpleno.com/cta",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /cta to /](/)",
      "keywords": [
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/cta"
      }
    },
    {
      "id": "72340f05c8a97010",
      "url": "https://devpleno.com/promises",
      "title": "NodeJS Primeiros Passos - Promises - DevPleno (Part 1)",
      "content": "Javascript\n\n## NodeJS Primeiros Passos - Promises\n\nT\nPor Tulio Faria • 27 de junho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nContinuando nosso assunto sobre NodeJS, vamos tratar sobre como podemos organizar o fluxo para que o código fique realmente organizado. Olhe esse exemplo:\n\nvar fs = require('fs')\nfs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {\nfs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {\nfs.readFile('arquivo3.txt', arquivo1 + '\\\\n' + arquivo2, function (err) {\nconsole.log('tudo certo')\n})\n})\n})\nAqui faço três operações assíncronas e você pode perceber que o código vai crescendo para frente, porque os dois códigos estão dentro do callback do primeiro readFile, o terceiro está dentro do segundo e o console log está dentro do terceiro. Imagine se eu tivesse mais trechos de código assíncrono e estivesse tratando com IO, então o código iria crescendo cada vez mais para frente, deixando a manutenção muito complicada. Chamamos esse tipo de código de código hadouken. **Como podemos fazer para esse código saia dessa forma e comece a crescer para baixo?** Uma das alternativas é utilizar promises. Para isso, vamos utilizar um módulo hamado ‘q’.\n\nnpm install q\nNo meu caso, retornou um warning porque eu não tenho o package.json, mas como estamos apenas testando, está tudo bem. Então vamos lá:\n\nvar Q = require('q')\nvar fs = require('fs')\nfunction readArquivo1() {\nfs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {})\n}\nfunction readArquivo2() {\nfs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {})\n}\nfunction readArquivo3() {\nfs.readFile('arquivo3.txt', arquivo1 + '\\\\n' + arquivo2, function (err) {})\n}\nVamos salvar ele como com.promises.js. Apesar de estar com bastante texto, podemos perceber que o arquivo ficou mais fácil de ler. Se eu chamar esses arquivos, ele vai executar a linha 1, pular, executar a próxima e depois de um certo tempo vai executar o callback:",
      "description": "Continuando nosso assunto sobre NodeJS, vamos tratar sobre como podemos organizar o fluxo para que o código fique realmente organizado. Olhe esse exemplo: ...",
      "keywords": [
        "function",
        "arquivo1",
        "deferred",
        "arquivo2",
        "readfile",
        "para",
        "arquivo",
        "digo",
        "then",
        "conteudo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/promises"
      }
    },
    {
      "id": "72351caa98066850",
      "url": "https://devpleno.com/html-estatico-com-templates-ejs",
      "title": "Gerando HTML estáticos a partir de templates – EJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Gerando HTML estáticos a partir de templates – EJS\n\nT\nPor Tulio Faria • 22 de setembro de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nHoje quero mostrar como podemos utilizar os Templates Engines, que já temos no Express como EJS, PUG, etc, para gerar arquivos HTML estáticos. Com esse processo, conseguimos fazer um gerador de site estático tranquilamente. Obviamente já existem alguns sistemas que fazem isso, mas quero mostrar que também é possível utilizando somente essas linguagens de template. Eu já tenho um diretório criado, vou utilizar o EJS por ser mais parecido com JavaScript e fica mais fácil de utilizar:\n\nyarn add ejs\nFeito isso, vamos criar um arquivo novo index.js. A ideia é criar um template de teste. Vamos supor que ele tenha o seguinte:\n\n&#x3C;h1>Teste&#x3C;/h1>\n&#x3C;p>Teste de paragrafo&#x3C;/p>\nEntão, se eu colocar uma variável, como uma lista, eu posso fazer essa lista baseado em valores que eu mandei do meu script. A maneira mais comum de se utilizar o EJS é plugado-o dentro do express, porém nós também conseguimos utilizá-lo de forma independente, assim podemos simplesmente importar o EJS e, de alguma forma, dar um render nele:\n\nconst ejs = require('ejs')\nconst html = ejs.render('&#x3C;h1>&#x3C;%= teste %>&#x3C;/h1> ', { teste: 1234 })\nconsole.log(html)\nSe rodarmos isso, nós temos o nosso html. Nós processamos o html dentro dele, que era uma variável e gerou uma string a partir disso. Isso é bastante poderoso porque se formos pensar, as páginas de um site estático nada mais são do que strings processadas. Vamos fazer outro teste:\n\nconst ejs = require('ejs')\nejs.renderFile(\n'./templete.ejs',\n{\nitems: ['Tulio', 'Faria']\n},\n(err, html) => {\nconsole.log(html)\n}\n)\nEntão estamos passando uma lista para items para ele jogar dentro do template, ao final disso, retorna um callback. Como estamos utilizando o items, podemos fazer o seguinte no nosso arquivo template.ejs:",
      "description": "Hoje quero mostrar como podemos utilizar os Templates Engines, que já temos no Express como EJS, PUG, etc, para gerar arquivos HTML estáticos. Com esse pro...",
      "keywords": [
        "html",
        "teste",
        "para",
        "template",
        "https",
        "templates",
        "como",
        "podemos",
        "utilizar",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/html-estatico-com-templates-ejs"
      }
    },
    {
      "id": "723e3fb404742fed",
      "url": "https://devpleno.com/cta-1",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /cta-1 to /](/)",
      "keywords": [
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/cta-1"
      }
    },
    {
      "id": "7247e7d75c542c9f",
      "url": "https://devpleno.com/multer-upload-de-imagens-com-nodejs-e-express",
      "title": "Multer upload de imagens com nodejs e express - DevPleno (Part 2)",
      "content": "Podemos criar um diskStorage, ele é um objeto que tem duas keys, destination que é onde eu vou salvar. Além disso, posso pegar um filename:\n\nconst express = require('express')\nconst app = express()\nconst multer = require('multer')\nconst storage = multer.diskStorage({\ndestination: (req, file, cb) => {\ncb(null, 'uploads/')\n},\nfilename: (req, file, cb) => {\ncb(null, Date.now() + '-' + file.ogirinalname)\n}\n})\nconst upload = multer({ storage })\nNós conseguimos controlar como vamos fazer o upload através do storage. Além disso, podemos criar um memory storage, onde ele vai retornar para nós um buffer dentro do file. É aconselhável utilizar ele exatamente onde você precisa, nunca coloque esse middleware como global.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Multer%20upload%20de%20imagens%20com%20nodejs%20e%20express&url=https%3A%2F%2Fdevpleno.com%2Fmulter-upload-de-imagens-com-nodejs-e-express) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmulter-upload-de-imagens-com-nodejs-e-express)",
      "description": "Hoje vou mostrar uma dica rápida de como podemos fazer upload no NodeJS utilizando o Express. Para isso vamos utilizar o Multer. A primeira coisa que vamos...",
      "keywords": [
        "express",
        "multer",
        "const",
        "upload",
        "file",
        "nodejs",
        "vamos",
        "https",
        "require",
        "para"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/multer-upload-de-imagens-com-nodejs-e-express"
      }
    },
    {
      "id": "724fc5af187b9051",
      "url": "https://devpleno.com/racionalizacao",
      "title": "Racionalização: Tomando decisões racionais - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Racionaliza%C3%A7%C3%A3o%3A%20Tomando%20decis%C3%B5es%20racionais&url=https%3A%2F%2Fdevpleno.com%2Fracionalizacao) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fracionalizacao)",
      "description": "Hoje gostaria de dar uma dica bem rápida para você sobre o que eu chamo de Racionalização, que é basicamente olharmos o que estamos fazendo de uma maneira ...",
      "keywords": [
        "para",
        "como",
        "https",
        "racionaliza",
        "carreira",
        "exemplo",
        "esta",
        "devpleno",
        "tudo",
        "projeto"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/racionalizacao"
      }
    },
    {
      "id": "728cb26f3a535547",
      "url": "https://devpleno.com/ensinar-algo",
      "title": "Ensinar algo a alguém todos os dias - DevPleno (Part 2)",
      "content": "Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Ensinar%20algo%20a%20algu%C3%A9m%20todos%20os%20dias&url=https%3A%2F%2Fdevpleno.com%2Fensinar-algo) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fensinar-algo)",
      "description": "Você já ensinou algo a alguém hoje? Quando estamos na faculdade, por exemplo, as pessoas tendem a nos perguntar dicas sobre de computação/informática ou pe...",
      "keywords": [
        "algo",
        "pessoas",
        "https",
        "carreira",
        "ensinar",
        "algu",
        "hoje",
        "quando",
        "vida",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/ensinar-algo"
      }
    },
    {
      "id": "729036b236024931",
      "url": "https://devpleno.com/blog/composicao-de-componentes-em-reactjs/index",
      "title": "Composição de componentes em ReactJS (Part 1)",
      "content": "A dica de hoje é sobre o ReactJS, mais especificamente sobre como podemos criar composição de componentes em ReactJS de uma forma um pouco diferente, como podemos utilizar algumas áreas de um componente para ejetar outros componentes por exemplo. Na prática ficará mais simples de entender.\n\nEu criei um aplicativo básico utilizando o create react app e agora vou criar dois componentes para mostrar como podemos utilizar essa composição. No app.js, logo após o importe do React e do './app.css'; criarei um Panel, ele será um functional stateless component porque não temos o estado interno dele.\n\n```jsx\nconst Panel = (props) => {\n  return(\n    <div>\n      <h1>header</h1>\n    </div>\n    <p>Footer</p>\n  )\n}\n```\n\nEle me retorna duas coisas, uma div e tem header que pode ser um H1. Abaixo temos um P com um footer, isso para termos uma ideia de como podemos fazer. A primeira forma de composição é exatamente essa, eu posso trocar esse header e esse footer, por exemplo, ao invés de um texto chamar outra coisa:\n\n```jsx\nconst Panel = (props) => {\n  return (\n    <div>\n      <h1>{props.header}</h1>\n      <p>{props.footer}</p>\n    </div>\n  )\n}\n```\n\nSe eu pegar esse código e chamar mais abaixo, dentro do nosso app component:\n\n```jsx\n<p className=\"App-intro\">\n  To get started, edit <code>src/App.js</code>\n</p>\n\n<Panel header='Olá mundo!' footer='rodape' />\n```\n\nEntão onde eu mandar esse valor, ele vai escrever o texto, mas o interessante é que eu posso fazer algo diferente: ao invés de mandar dessa forma, posso mandar um JSX:\n\n```jsx\n<Panel\n  header={\n    <span>\n      'Olá <u>mundo!</u>\n    </span>\n  }\n/>\n```\n\nCom isso fizemos uma composição porque eu posso passar outro componente para ele, como é um JSX eu posso passar o html ou passar efetivamente um outro componente. Por exemplo, podemos passar um componente que depende de dois outros componentes, um que fica só no header e um no footer e qualquer coisa que você quiser colocar você pode, como um mapa por exemplo.",
      "keywords": [
        "header",
        "props",
        "para",
        "podemos",
        "como",
        "panel",
        "footer",
        "composi",
        "componentes",
        "isso"
      ],
      "metadata": {
        "title": "Composição de componentes em ReactJS",
        "date": "2017-08-01",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "COMPOSIÇÃO-REACTJS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/composicao-de-componentes-em-reactjs/index.md"
      }
    },
    {
      "id": "7299ef93bcbdf741",
      "url": "https://devpleno.com/shelljs",
      "title": "ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux - DevPleno (Part 1)",
      "content": "Javascript\n\n## ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux\n\nT\nPor Tulio Faria • 6 de agosto de 2017\n\n[Javascript](/tag/javascript)\n\nNeste hands-on, vou falar mais especificamente sobre o ShellJS, uma implementação do Shell do linux em JavaScript.\n\nQual a vantagem do ShellJS?\n\nA grande vantagem é que ele é multiplataforma, então podemos criar nossos códigos independente da plataforma. Caso a gente queira, por exemplo, criar um catch no arquivo para ver o conteúdo dele, podemos fazer isso tanto no Mac, quanto no Windows ou no Linux da mesma forma. Isso é muito legal para construir um sincronizador de log, por exemplo, ou alguma ferramenta que é só para uso interno.\n\nPara utilizar o ShellJS precisamos primeiro instalar a ferramenta:\n\nyarn add shelljs\nVou criar um arquivo novo teste1.js, e importar o o shell e usar o cat para ver o arquivo, por exemplo:\n\nconst sh = require('shelljs')\nconst contents = sh.cat('arq1.txt')\nconsole.log(contents.toString())\nLembrando que estamos fazendo isso em multiplataforma, então se eu rodar o cat direto, pode ser que eu não consiga o mesmo resultado. Isso vale para todos os outros comandos, por exemplo copiar um arquivo:\n\nconst sh = require('shelljs')\nsh.cp('arq1.txt', 'arq2.txt')\nÉ muito legal quando conseguimos fazer esse tipo de código que funciona em todas as plataformas, isso gera mais liberdade para construir nossos scripts que dependem de algum IO ou Shell virtual. Vamos supor que eu quisesse copiar um diretório de forma recursiva:\n\nsh.cp('-R', 'node_modules', 'mods')\nEle replicou exatamente como nós queremos fazer no Shell do Linux. Uma curiosidade é que ele transforma esse código em síncrono, ele usa por baixo dos panos assíncrono, mas a interface que o Shell lida pra gente é síncrona, o que deixa muito mais fácil de fazer e construir os scripts.",
      "description": "Neste handson, vou falar mais especificamente sobre o ShellJS, uma implementação do Shell do linux em JavaScript. Qual a vantagem do ShellJS? A grande vant...",
      "keywords": [
        "para",
        "shelljs",
        "shell",
        "https",
        "exemplo",
        "isso",
        "javascript",
        "linux",
        "arquivo",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/shelljs"
      }
    },
    {
      "id": "72b1e7ff63fd53d0",
      "url": "https://devpleno.com/fullstacklab-fborg",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /fullstacklab-fborg to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "fullstacklab",
        "fborg"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstacklab-fborg"
      }
    },
    {
      "id": "731acb211c64c376",
      "url": "https://devpleno.com/blog/como-publicar-seu-site-no-github/index",
      "title": "GH-Pages e como publicar seu site no Github (Part 1)",
      "content": "Hoje quero mostrar para vocês como a gente pode postar o nosso site no GitHub utilizando o GH-Pages, sem precisar trocar ou fazer qualquer trâmite com o Git, tudo isso de uma maneira bastante fácil. Além disso, integrar isso em um WorkFlow ou em um processo junto no Node.\n\nA primeira coisa que vou fazer é criar um repositório chamado gh-pages-teste só para termos um lugar para testar. Vou deixar de forma pública:\n\n![Criando Repositório](3a0355e2-7bf9-4e69-934f-b1f8ba766c75.png)\n![Permissões](acc06856-5b96-4e3b-b657-ac35205c3091.png)\n\nAgora vamos no SHELL e dar um create-react-app apenas para criar uma aplicação em React, que vai ser nosso site. Lembrando que não é necessário ser em React, é apenas para mostrar como a gente poderia criar algo estático e hospedar dentro do GitHub.\n\nUma coisa bastante interessante: o Git permite que a gente mantenha um site estático, basta colocar os arquivos estáticos dentro de um branch chamado GH-Pages, feito isso ele já vai conseguir manter o nosso site.\n\nAgora vou abrir o visual studio code e vamos trocar apenas o que está escrito no App.js, ao invés de Welcome, vou colocar GH-Pages DevPleno.\n\nAgora um detalhe, se no próprio React dermos um yarn build ou npm run build, ele vai gerar os arquivos compilados dentro do diretório build que já tem nosso site todo, agora temos que colocar esses arquivos dentro do Branch do GH-Pages.\n\nFeito isso vamos dar um git init no shell e adicionar os arquivos, lembrando que já iniciamos o repositório:\n\n![Git init](3666a984-c0f2-4f87-8b29-64ae21f78843.png)\n\nVamos também dar um git remote add origin e add o ssh que no meu caso é:\n\n![Git remote](6e5872fe-0494-4784-8ce6-79fc8cba6791.png)\n\nTambém vamos adicionar o upstream:\n![Adicionando dependências](0a87d57f-27b0-493b-b84b-be444a75c3d5.png)\n\nFeito isso ele subiu, então temos nosso fonte do master. Agora temos que fazer uma forma de criar um brait novo para colocar o site lá. Para isso vamos fazer o seguinte:\n\n```jsx\nyarn add --dev gh-pages\n```",
      "keywords": [
        "para",
        "pages",
        "isso",
        "vamos",
        "site",
        "agora",
        "nosso",
        "fazer",
        "colocar",
        "arquivos"
      ],
      "metadata": {
        "title": "GH-Pages e como publicar seu site no Github",
        "date": "2017-10-06",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "GH-PAGES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/como-publicar-seu-site-no-github/index.md"
      }
    },
    {
      "id": "7335fd1c4049030b",
      "url": "https://devpleno.com/blog/grandes-quantidades-de-dados-com-menos-recursos/index",
      "title": "Grandes quantidades de dados com menos recursos (Part 1)",
      "content": "A dica de hoje é um ponto bastante importante para performance em NodeJS. Eu já comentei um pouquinho sobre esse assunto, mas vou reforçar esse cuidado que a gente pode ter aqui para poupar memória quando estamos processando grandes quantidades de dados.\n\nPrimeiramente eu baixei um arquivo com mil registros em CSV, eu quero então processar esses arquivos. Vou criar um arquivo sem-otimizar.js:\n\n```jsx\nconst fs = require('fs')\nfs.readFile('data.csv', (err, contents) => {\n  console.log(contentes.toString())\n})\n```\n\nUma outra abordagem seria, por exemplo:\n\n```jsx\nconst fs = require('fs')\nfs.readFile('data.csv', (err, contents) => {\n  const lines = contents.toString().split('\\\\n')\n  line.forEach((line) => console.log(lines.split(',')))\n})\n```\n\nAgora imagine o seguinte, ao invés de colocar da forma anterior, vamos imaginar que vai ser salva a linha no banco de dados:\n\n```jsx\nconst fs = require('fs')\n\nfs.readFile('data.csv', (err, contents) => {\n  const lines = contents.toString().split('\\\\n')\n  line.forEach((line) => {\n    console.log()\n  })\n})\n```\n\nNosso primeiro erro é fazer essa operação sem se preocupar muito se ela retornou algo ou não. Para simular isso, vamos fazer um record e retornar uma promise:\n\n```jsx\nconst saveDB = (record) => {\n  return new Promise((resolve, reject) => {\n    setTimeOut(resolve, Math.ceil(Math.random() * 4000))\n  })\n}\n```\n\nCom isso vamos simular um save no banco de dados, variando o tempo de resposta não ultrapassando 4 segundos. Agora vamos fazer algumas modificações no código readFiles:\n\n```jsx\nfs.readFile('data.csv', (err, contents) =>{\n    const lines = contents.toString().split('\\\\n')\n    line.forEach(line, i) => {\n        saveDB(line).then(() => console.log(i))\n    })\n})\n```",
      "keywords": [
        "const",
        "data",
        "para",
        "dados",
        "require",
        "contents",
        "line",
        "vamos",
        "console",
        "entrada"
      ],
      "metadata": {
        "title": "Grandes quantidades de dados com menos recursos",
        "date": "2017-10-17",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "MAIS-DADOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/grandes-quantidades-de-dados-com-menos-recursos/index.md"
      }
    },
    {
      "id": "739e3bfa9680b459",
      "url": "https://devpleno.com/blog/confira-4-dicas-de-ux-para-programadores/index",
      "title": "Confira 4 dicas de UX para programadores (Part 4)",
      "content": "O ideal é que teste alguma solução concorrente ao seu projeto, que seja bem avaliada pelos consumidores, para entender como é sua usabilidade. Faça uma avaliação de como as informações são dispostas, como os elementos interagem, quais funções são essenciais e quais não tão necessárias.\n\nEssa análise, juntamente com as informações do seu usuário, vai te direcionar na criação de uma solução mais otimizada, em função não só de técnica, mas também da experiência que proporcionará.\n\n### 4. Mantenha-se atualizado\n\nAssim como você busca novas informações e [cursos ](https://www.devpleno.com/entenda-a-importancia-de-cursos-para-desenvolvedores?utm_source=blog&utm_campaign=rc_blogpost)sobre linguagens, técnicas e métodos de programação, é preciso também se atualizar sobre as novidades de UX, como conhecimentos que simplificam processos ou podem deixar o seu sistema mais eficiente no front-end.\n\nExistem diversos meios em que você encontra dicas de como se manter atualizado e [aprendendo sempre](https://www.devpleno.com/aprenda-a-aprender?utm_source=blog&utm_campaign=rc_blogpost).\n\nEssas são as dicas de UX para programadores que você deve seguir para se tornar um profissional mais completo e entregar melhores resultados na sua empresa. E para se manter atualizado sobre experiência do usuário, acompanhe o canal [UXNOW](https://www.youtube.com/channel/UCgfaifzmqadwKyCd0lagylQ?utm_source=blog&utm_campaign=rc_blogpost) e receba novidades sobre essa técnica tão importante!",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "produto",
        "informa",
        "https",
        "source",
        "blog"
      ],
      "metadata": {
        "title": "Confira 4 dicas de UX para programadores",
        "date": "2017-10-06",
        "tags": "['Carreira']",
        "thumbnail": "117637-confira-4-dicas-de-ux-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/confira-4-dicas-de-ux-para-programadores/index.md"
      }
    },
    {
      "id": "73a2d14274fb954b",
      "url": "https://devpleno.com/como-aumentar-a-produtividade",
      "title": "Como aumentar a produtividade diminuindo a troca de contexto - DevPleno (Part 2)",
      "content": "#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20aumentar%20a%20produtividade%20diminuindo%20a%20troca%20de%20contexto&url=https%3A%2F%2Fdevpleno.com%2Fcomo-aumentar-a-produtividade) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-aumentar-a-produtividade)",
      "description": "Você sente que não está sendo tão produtivo quanto poderia? Após fazer algumas mudanças na forma como desenvolvo projetos, estou aumentando a minha produti...",
      "keywords": [
        "como",
        "https",
        "produtividade",
        "projetos",
        "tempo",
        "contexto",
        "mudan",
        "forma",
        "vscode",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/como-aumentar-a-produtividade"
      }
    },
    {
      "id": "73cd20d5e5a3f325",
      "url": "https://devpleno.com/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! - DevPleno (Part 3)",
      "content": "Um grande passo para a auto-disciplina é [aprender a aprender.](https://www.devpleno.com/aprenda-a-aprender?utm_source=blog&#x26;utm_campaign=rc_blogpost) Encontre o jeito que você absorve os conhecimentos de forma mais eficaz e se apaixone por isso. Aprender é sempre muito gratificante**.** Portanto, saber o que realmente mobiliza você e desperta o seu interesse pode ser o ponto crucial para uma mudança de comportamento.\n\nAdquirir disciplina é uma questão de prática. Reflita melhor sobre as coisas que fazem você vibrar e aprenda a realizá-las da melhor forma, a partir do seu jeito. Não existem caminhos certos na vida empreendedora: existem ferramentas que auxiliam. O modo como você vai aplicá-las pode ser único e até então impensado, e essa é a maior graça disso tudo.\n\n**Como é a sua relação com o dinheiro?**\n\nEsse é um dos pontos muito importantes nessa história. Muito do que falamos até agora pode ser uma questão apenas de mudança de comportamento. Porém, como diria o velho ditado “é pelo bolso que se pega o sujeito”.\n\nVocê seria capaz de injetar seu dinheiro em um projeto**,** sem garantias alguma de que dará certo? E mais: sendo você o maior responsável por fazer tudo acontecer? Um funcionário de uma empresa prefere ter o salário dele garantido ao final do mês, a ter que arriscar perder tudo. Por isso, muitas vezes, os empreendedores são chamados de “loucos”.\n\nUm ponto importante em se abrir uma empresa é estar preparado para os altos e baixos financeiros, principalmente no início. Se você não se considera apto para isso, também pode buscar ajuda de profissionais ou ir atrás de maior conhecimento sobre gestão de dinheiro e de negócios.\n\n**Como medir o sucesso?**\n\nUm funcionário de uma grande companhia recebe orientações sobre medidas de sucesso e formas de recompensa para os que melhor colaborarem. Por exemplo: prêmios, bonificação salarial, reconhecimentos etc.",
      "description": "Todo profissional já deve ter se perguntado as reais vantagens de se trabalhar em uma grande empresa ou de se criar um negócio próprio. E isso não é difere...",
      "keywords": [
        "para",
        "empresa",
        "isso",
        "como",
        "muito",
        "https",
        "pode",
        "mais",
        "melhor",
        "source"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao"
      }
    },
    {
      "id": "73e65a7dcbab8336",
      "url": "https://devpleno.com/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs",
      "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS) - DevPleno (Part 1)",
      "content": "Javascript\n\n## Como converter uma string em Base64 em JavaScript (Navegador e NodeJS)\n\nT\nPor Tulio Faria • 4 de outubro de 2016\n\n*\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nA codificação em Base64 é uma maneira de converter qualquer texto/conteúdo para uma codificação que utiliza apenas 64 caracteres. Provavelmente você já deve ter se deparado com uma string destas por aí. Muitos sites e aplicações web utilizam esta códificação para trocar dados entre páginas “ocultando” informações na URL. Porém, é bom lembrar que Base64 não é uma forma segura de criptografia. Mas se ele não é seguro quais as vantagens de utilizá-la? Bom, algumas:\n\n- Você pode converter caracteres que geram problemas na URL (ou em algum protocolo), como por exemplo: ?, &#x26; e ”\n\n- Você pode simplesmente atrapalhar um pouco pessoas ficarem chutando* ids em suas URLs\n\n- Você pode transferir dados binários codificados em Base64. Aliás, é assim que o protocolo HTTP lida com o upload de arquivos.\n\n## Utilizando Base64 no navegador (Internet Explorer 10 e acima):\n\nO código abaixo pode ser copiado e colado dentro do Console do Chrome, para vê-lo executando.\n\n// Uma string qualquer\nvar string = 'DevPleno'\n\n// Convertendo para Base64\nvar emBase64 = btoa(string)\nconsole.log(emBase64) // Saída: \"RGV2UGxlbm8=\"\n\n// Voltando para string\nvar deBase64 = atob(emBase64)\nconsole.log(deBase64) // Outputs: \"DevPleno\"\n\n## Método cross-browser (pode ser utilizado no NodeJS também):",
      "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
      "keywords": [
        "string",
        "base64",
        "fromcharcode",
        "embase64",
        "keystr",
        "nodejs",
        "para",
        "charcodeat",
        "this",
        "charat"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs"
      }
    },
    {
      "id": "73f918d97d7005f2",
      "url": "https://devpleno.com/blog/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs/index",
      "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS) (Part 1)",
      "content": "A codificação em Base64 é uma maneira de converter qualquer texto/conteúdo para uma codificação que utiliza apenas 64 caracteres. Provavelmente você já deve ter se deparado com uma string destas por aí. Muitos sites e aplicações web utilizam esta códificação para trocar dados entre páginas \"ocultando\" informações na URL. Porém, é bom lembrar que Base64 não é uma forma segura de criptografia. Mas se ele não é seguro quais as vantagens de utilizá-la? Bom, algumas:\n\n- Você pode converter caracteres que geram problemas na URL (ou em algum protocolo), como por exemplo: ?, & e \"\n- Você pode simplesmente atrapalhar um pouco pessoas ficarem _chutando_ ids em suas URLs\n- Você pode transferir dados binários codificados em Base64. Aliás, é assim que o protocolo HTTP lida com o upload de arquivos.\n\n## Utilizando Base64 no navegador (Internet Explorer 10 e acima):\n\nO código abaixo pode ser copiado e colado dentro do Console do Chrome, para vê-lo executando.\n\n```js\n// Uma string qualquer\nvar string = 'DevPleno'\n\n// Convertendo para Base64\nvar emBase64 = btoa(string)\nconsole.log(emBase64) // Saída: \"RGV2UGxlbm8=\"\n\n// Voltando para string\nvar deBase64 = atob(emBase64)\nconsole.log(deBase64) // Outputs: \"DevPleno\"\n```\n\n## Método cross-browser (pode ser utilizado no NodeJS também):",
      "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
      "keywords": [
        "string",
        "base64",
        "fromcharcode",
        "embase64",
        "keystr",
        "para",
        "charcodeat",
        "this",
        "charat",
        "console"
      ],
      "metadata": {
        "title": "Como converter uma string em Base64 em JavaScript (Navegador e NodeJS)",
        "description": "Aprenda a converter strings em Base64 no JavaScript com btoa/atob no navegador e Buffer no Node.js. Exemplos práticos de encode e decode.",
        "date": "2016-10-04",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "javascript-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs/index.md"
      }
    },
    {
      "id": "74127643edeafbcf",
      "url": "https://devpleno.com/blog/sobre-abrir-excecoes/index",
      "title": "Sobre abrir exceções e como lidar quando elas dão errado",
      "content": "Por que devemos ser mais rígidos com as decisões e com os objetivos que a gente define tanto para nossa carreira quanto para nossa vida?\n\nNessa semana, voltei a focar ainda mais no meu objetivo, pois eu tinha aberto uma exceção para uma situação. Qual o problema nisso?\n\nToda vez que você abre uma exceção e ela gera um problema para você, vem na sua cabeça uma sensação muito ruim, afinal não era para você ter feito aquilo.\n\nA lição que eu tiro disso é que lá atrás eu deveria ser mais rígido. Aprendi duas coisas com isso,eu não deveria ter fugido do meu objetivo e a não ficar remoendo uma decisão mal tomada e sim quando voltar a ter foco.\n\nMuitas vezes, tomamos decisões que não podemos acertar, mas pode ser que no futuro tudo converta novamente no foco. É isso que eu estou fazendo atualmente, cada vez mais estou focando no DevPleno e escolhendo a dedo os clientes que vou atender.\n\nEntão, não tome decisões visando apenas ajudar se tiver que fugir do seu objetivo.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-VfSsqafasc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "mais",
        "decis",
        "embed",
        "objetivo",
        "devpleno",
        "responsive",
        "https",
        "youtube",
        "nossa"
      ],
      "metadata": {
        "title": "Sobre abrir exceções e como lidar quando elas dão errado",
        "date": "2017-10-27",
        "tags": "['Carreira']",
        "thumbnail": "AbreExcessoes.png",
        "author": "Tulio Faria",
        "noindex": "true",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/sobre-abrir-excecoes/index.md"
      }
    },
    {
      "id": "741b78cf2ed36333",
      "url": "https://devpleno.com/blog/26",
      "title": "Blog - Página 26 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 30 de jul. de 2016 Eu já sei! Evite uma mentalidade que não te deixa evoluir](/eu-ja-sei-carreira)\n\n[Javascript 27 de jul. de 2016 NodeJS Primeiros Passos: Módulos](/nodejs-primeiros-passos-modulos)\n\n[Javascript 26 de jul. de 2016 NodeJS Primeiros Passos: Closures e Escopos](/closures-e-escopos)\n\n[Javascript 25 de jul. de 2016 NodeJS Primeiros Passos: Servidor HTTP Básico](/servidor-http-basico)\n\n[Javascript 24 de jul. de 2016 Vídeo sobre Servidores Web - o back-end de uma aplicação web](/servidores-web-entendo-back-end)\n\n[Carreira 23 de jul. de 2016 Networking da maneira certa](/networking-da-maneira-certa-carreira)\n\n[Carreira 21 de jul. de 2016 Defina metas](/defina-metas)\n\n[Fundamentos 20 de jul. de 2016 Vídeo sobre Formatos de troca de dados em Aplicações Web](/formatos-de-troca-de-dados-em-aplicacoes-web)\n\n[Javascript 12 de jul. de 2016 Vídeo sobre NodeJS com Promises](/nodejs-primeiros-passos-promises)\n\n[Anterior](/blog/25)26 / 26\nPróxima",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2016",
        "nodejs",
        "carreira",
        "javascript",
        "primeiros",
        "passos",
        "fundamentos",
        "sobre",
        "todos",
        "blog"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/26"
      }
    },
    {
      "id": "743a124420a40ce8",
      "url": "https://devpleno.com/hands-json-server",
      "title": "Hands-on: Json-Server - DevPleno",
      "content": "Javascript\n\n## Hands-on: Json-Server\n\nT\nPor Tulio Faria • 10 de abril de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nTodo mundo já passou pela situação onde precisava fazer um teste com front-end e precisou de uma API funcionando. Não seria interessante ter uma forma de acessar um formato de dados simples, sem muita configuração? Veja como é simples criar uma REST API para testes com o Json-server.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Json-Server&url=https%3A%2F%2Fdevpleno.com%2Fhands-json-server) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-json-server)",
      "description": "Todo mundo já passou pela situação onde precisava fazer um teste com frontend e precisou de uma API funcionando. Não seria interessante ter uma forma de ac...",
      "keywords": [
        "https",
        "server",
        "json",
        "javascript",
        "hands",
        "nodejs",
        "simples",
        "para",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-json-server"
      }
    },
    {
      "id": "747d6c74f4ac1fa1",
      "url": "https://devpleno.com/streams-parte-1",
      "title": "Hands-on: Streams - Parte 1 - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on: Streams - Parte 1\n\nT\nPor Tulio Faria • 8 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)\n\nOlá!\n\nNeste post, vamos falar sobre Streams, um conceito utilizando em JavaScript mas que pode ser aplicado em outras linguagens. Nele temos uma grande quantidade de conteúdo para explorar.\n\n**O que é um Stream?**\n\nÉ um Fluxo de dados. Quando queremos ler um arquivo muito grande, por exemplo, ele permite que façamos um fluxo de dados na leitura deste arquivo.\n\n**Qual a vantagem de existir este fluxo de dados?**\n\nPrimeiramente isso permite lermos arquivos gigantescos e transformar os dados na medida que vamos lendo estes dados.\n\nOutra coisa interessante sobre o Stream é que podemos fazer o Pipe (uma ligação) de um Stream com outro, como por exemplo um Stream de leitura com um Stream de escrita integrando os dois de forma fluída. Isso é muito bom para trabalharmos com movimento de dados, tratando pedaços deste arquivo à medida que eu vou lendo, sem precisar colocar ele todo na memória.\n\nNo JavaScript, temos quatro tipos de Stream: Readable (leitura), Writable (escrita), Duplex(ambos os anteriores juntos) e Transform (permite transformação de dados).\n\n**Readable**\n\nPrimeiro vamos pegar um arquivo grande, por exemplo arquivo.txt e vamos ler ele com Stream. Vamos chamar o fs para ter acesso a isso.\n\nUma curiosidade: o Stream no Node é implementável, ou seja, quando algum módulo implementa o Stream, podemos tratá-lo da mesma forma, podendo utilizar os mesmos métodos em outros Streams.*\n\nconst fs = require('fs')\nconst readable = sf.crateReadStream('arquivo.txt')\nNós temos dois tipos de readable Stream: o paused mode, onde ele para e eu solicito os dados, e o flowing mode, em que a medida que ele consegue ler os arquivos já vai devolvendo os dados.\n\nPara fazermos o Flowing mode, vamos criar uma arrow function data passando o data para dentro. Lembrando que o data é um buffer, então precisamos adicionar um toString para sabermos o que tem dentro dele.",
      "description": "Olá! Neste post, vamos falar sobre Streams, um conceito utilizando em JavaScript mas que pode ser aplicado em outras linguagens. Nele temos uma grande quan...",
      "keywords": [
        "readable",
        "dados",
        "arquivo",
        "stream",
        "data",
        "para",
        "vamos",
        "const",
        "https",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/streams-parte-1"
      }
    },
    {
      "id": "74ebed670698c918",
      "url": "https://devpleno.com/lista-encadeada-remover-um-no",
      "title": "Lista encadeada - Como remover um nó - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Lista encadeada - Como remover um nó\n\nT\nPor Tulio Faria • 25 de julho de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nNós já falamos sobre alguns métodos, adicionamos itens na lista, criamos nó com [complexidade O(n)](https://www.devpleno.com/lista-encadeada-adicionar-no/) e [O(1)](https://www.devpleno.com/lista-encadeada-adicionar-com-o1/) e agora vamos remover um nó desse nosso algoritmo.\n\nPrimeiro temos que criar um método remove, vamos passar um nó para ele e, baseado nesse nó, ele vai excluir da lista.\n\nconst remove = (node) => {}\nLembrando que em return temos que adicionar o remove:\n\nreturn{\nremove(node) => remove(node)\n}\nO primeiro cenário que temos é se a lista for igual a null:\n\nconst remove = (node) => {\nif (lenght === 0) return\n}\nAgora, se o nó for igual ao primeiro nó da minha lista, eu simplesmente vou fazer meu head ser o node.next\n\nconst remove = (node) => {\nif (lenght === 0) return\nif (node === head) {\nhead = node.next\nreturn\n}\n}\nAgora temos a parte complexa, afinal já cobrimos a situação em que nossa lista está vazia, remover o primeiro item e agora precisamos remover o item que escolhermos. Vamos imaginar que queremos, por exemplo, excluir o nó 2, temos que pegar o next do nó 1 e apontar para o nó 3, então temos que descobrir quem é o nó 1 para fazermos esse mapeamento:\n\nconst remove = (node) => {\nif (lenght === 0) return\nif (node === head) {\nhead = node.next\nreturn\n}\nlet currentNode = head\nwhile (currentNode.next &#x26;&#x26; currentNode.next != node) {\ncurrentNode = currentNode.next\n}\nconsole.log(currentNode)\n}\nAgora eu quero pegar o valor 2 da nossa lista e checar se eu peguei realmente esse valor:\n\nlet node = list.getByValue(2)\nconsole.log(node)\nAgora eu preciso mandar excluir esse nó 2:\n\nlist.remove(node)\nPronto, conseguimos excluir, agora precisamos pegar nosso currentNode, que é nosso nó 1 e apontar para o nó 3, já que ele seria nosso next a partir do momento em que excluímos o nó 2:",
      "description": "Nós já falamos sobre alguns métodos, adicionamos itens na lista, criamos nó com complexidade O(n) e O(1) e agora vamos remover um nó desse nosso algoritmo....",
      "keywords": [
        "node",
        "currentnode",
        "next",
        "lista",
        "remove",
        "https",
        "head",
        "remover",
        "agora",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/lista-encadeada-remover-um-no"
      }
    },
    {
      "id": "751fb33916097ac4",
      "url": "https://devpleno.com/request-promise",
      "title": "Hands-on: Request-promise - DevPleno (Part 2)",
      "content": "O interessante é que poderiamos criar um Request-Promise se a gente quisesse, não é tão complicado, podemos importar ele direto e, utilizando com Async/await, podemos fazer várias operações de rede. Um detalhe importante, como sempre falo, o Async await não vai transformar esse código em síncrono, ele continua sendo assíncrono e tendo as mesmas vantagens.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Request-promise&url=https%3A%2F%2Fdevpleno.com%2Frequest-promise) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frequest-promise)",
      "description": "Este handson vai ser complementar a outro módulo que eu já mostrei por aqui, o Request. O módulo de hoje é o RequestPromise, que é basicamente o Resquest ",
      "keywords": [
        "request",
        "promise",
        "https",
        "await",
        "fazer",
        "async",
        "const",
        "podemos",
        "httpbin",
        "pegarip"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/request-promise"
      }
    },
    {
      "id": "7543df45b45b17d4",
      "url": "https://devpleno.com/anotacoes-em-eventos",
      "title": "Como fazer anotações em eventos - DevPleno (Part 1)",
      "content": "Carreira\n\n## Como fazer anotações em eventos\n\nT\nPor Tulio Faria • 19 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nQuando vamos em um evento é muito legal que vamos anotando tudo, então tem várias ideias, conteúdo, etc, coisas que você nem sabe como vai converter isso em execução. A dica de hoje é uma maneira sobre como anotar o que ouvir durante um evento para que possa aproveitar melhor isso depois.\n\nEu fui a um evento um tempo atrás e recebi essa dica, e ela mudou totalmente a forma de como tomei nota das coisas, hoje eu basicamente trago as anotações e conteúdo já com as ideias separadas.\n\nQuando você for tomar nota em eventos ou até mesmo em uma aula, ao invés de anotar ideias que você tem durante a aulas e o conteúdo junto, você fará o seguinte, se for um caderno por exemplo, você vai pegar a página esquerda e anotar somente o conteúdo e na página direita, vai anotar as ideias que teve a partir do conteúdo da página da esquerda.\n\nEssa dica é tão simples quanto isso, mas o efeito prático disso é enorme, afinal quando você voltar para sua casa para relembrar as notas, você sabe que de um lado é só conteúdo. Se alguém te pedir as anotações da palestra você passa apenas o lado esquerdo, já que do outro lado são coisas que você pode aplicar no seu dia a dia ou no dia a dia da sua empresa.\n\nIsso é muito poderoso, antigamente eu misturava tudo e quando eu voltava para casa eu tinha que garimpar as anotações para achar algo de valor e esse tempo perdido me serve para outras coisas.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Quando vamos em um evento é muito legal que vamos anotando tudo, então tem várias ideias, conteúdo, etc, coisas que você nem sabe como vai converter isso e...",
      "keywords": [
        "conte",
        "para",
        "https",
        "como",
        "anota",
        "eventos",
        "quando",
        "ideias",
        "coisas",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/anotacoes-em-eventos"
      }
    },
    {
      "id": "7589434e3d6a9fb8",
      "url": "https://devpleno.com/como-esta-seu-ingles-carreira",
      "title": "Como está seu inglês? - DevPleno",
      "content": "Carreira\n\n## Como está seu inglês?\n\nT\nPor Tulio Faria • 2 de agosto de 2016\n\n[Carreira](/tag/carreira)\n\nNa carreira de um DevPleno que lida com tecnologia o dia todo é muito importante saber se comunicar em inglês. Veja algumas dicas de como melhorar seu inglês técnico e do cotidiano.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20est%C3%A1%20seu%20ingl%C3%AAs%3F&url=https%3A%2F%2Fdevpleno.com%2Fcomo-esta-seu-ingles-carreira) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-esta-seu-ingles-carreira)",
      "description": "Na carreira de um DevPleno que lida com tecnologia o dia todo é muito importante saber se comunicar em inglês. Veja algumas dicas de como melhorar seu ingl...",
      "keywords": [
        "carreira",
        "https",
        "como",
        "ingl",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno",
        "2fcomo",
        "esta"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/como-esta-seu-ingles-carreira"
      }
    },
    {
      "id": "75928bec5ccb1937",
      "url": "https://devpleno.com/tag/javascript/14",
      "title": "Javascript - Pagina 14 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 7 de mar. de 2017 Hands-on: CO](/hands-on-co)\n\n[Javascript 6 de mar. de 2017 Hands-on: Slack](/hands-on-slack)\n\n[Javascript 3 de mar. de 2017 Hands-on: Benchmark](/hands-on-benchmark)\n\n[Javascript 3 de mar. de 2017 Hands-on: ShellJS](/hands-on-shelljs)\n\n[Javascript 3 de mar. de 2017 Hands-on: Standard](/hands-on-standard)\n\n[Javascript 3 de mar. de 2017 Pure Functions (Funções Puras)](/pure-functions-funcoes-puras)\n\n[Javascript 24 de fev. de 2017 Hands-on: Node JS - Request](/hands-on-node-js-request)\n\n[Javascript 24 de fev. de 2017 Hands-on: NodeJS - PM2](/hands-on-nodejs-pm2)\n\n[Javascript 24 de fev. de 2017 Hands-on: Pre-Commit](/hands-on-pre-commit)\n\n[Javascript 1 de fev. de 2017 Verificando o tempo para executar um trecho de código em Javascript](/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript)\n\n[Javascript 25 de jan. de 2017 Render condicional em ReactJS](/render-condicional-em-reactjs)\n\n[Javascript 28 de dez. de 2016 O que é o app.use no NodeJS/ExpressJS?](/o-que-e-o-app-use-no-nodejsexpressjs)\n\n[Anterior](/tag/javascript/13)14 / 16[Próxima](/tag/javascript/15)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "hands",
        "2017",
        "nodejs",
        "reactjs",
        "algoritmos",
        "carreira",
        "ferramentas",
        "fundamentos",
        "slack"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/14"
      }
    },
    {
      "id": "75fcd11193123c22",
      "url": "https://devpleno.com/servidor-de-arquivos",
      "title": "Servidor de arquivos e sistemas locais com HTTPS - DevPleno",
      "content": "Javascript\n\n## Servidor de arquivos e sistemas locais com HTTPS\n\nT\nPor Tulio Faria • 7 de agosto de 2016\n\n[Javascript](/tag/javascript)\n\nNeste vídeo, vou mostrar como servir arquivos estáticos de forma simples e ainda como expor um servidor local de testes para a internet utilizando uma conexão segura (HTTPS).\n\nPerfeito para testes de webhooks ou de APIs do HTML5 que precisam de HTTPS para funcionar.\n\nPara baixar o ngrok: [https://ngrok.com](https://ngrok.com)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Servidor%20de%20arquivos%20e%20sistemas%20locais%20com%20HTTPS&url=https%3A%2F%2Fdevpleno.com%2Fservidor-de-arquivos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidor-de-arquivos)",
      "description": "Neste vídeo, vou mostrar como servir arquivos estáticos de forma simples e ainda como expor um servidor local de testes para a internet utilizando uma cone...",
      "keywords": [
        "https",
        "para",
        "arquivos",
        "javascript",
        "servidor",
        "ngrok",
        "como",
        "testes",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/servidor-de-arquivos"
      }
    },
    {
      "id": "76008eecab7db899",
      "url": "https://devpleno.com/float-e-precisao",
      "title": "Float e precisão - DevPleno (Part 2)",
      "content": "Quando fazemos essa conversão para inteiro, não temos mais esse problema de precisão. Um exemplo para ficar mais claro: vamos supor que você quer armazenar uma camisa que custa R$10.99, ao invés de armazenar 10.99, armazena 1099 centavos, com um centavo não é divisível fica muito mais simples de fazermos essa conta.\n\nSe você passar por esse problema, agora já sabe como resolver. :)\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Float%20e%20precis%C3%A3o&url=https%3A%2F%2Fdevpleno.com%2Ffloat-e-precisao) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffloat-e-precisao)",
      "description": "Hoje quero dar uma dica e também mostrar um problema que acontece em várias linguagens que é quanto à precisão de número ",
      "keywords": [
        "const",
        "precis",
        "problema",
        "para",
        "precisao",
        "https",
        "como",
        "temos",
        "float",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/float-e-precisao"
      }
    },
    {
      "id": "765ce93e496afb5a",
      "url": "https://devpleno.com/tenha-cicatrizes",
      "title": "Tenha cicatrizes - DevPleno (Part 1)",
      "content": "Carreira\n\n## Tenha cicatrizes\n\nT\nPor Tulio Faria • 5 de setembro de 2017\n\n[Carreira](/tag/carreira)\n\nNa dica de carreira de hoje, eu quero explicar porque é tão bom e útil pra gente ter ‘cicatrizes de guerra’, obviamente não na forma literal :)\n\nEssa é uma expressão que eu ouvi em um evento e que faz total sentido.\n\nO que significa ter cicatrizes?\n\nÉ você ter se permitido cometer um erro ou ter ido para o ‘campo de batalha’, afinal só quem conhece o campo sabe como ele é. Você deve ter percebido que em quase todas as vezes que falo sobre carreira, eu digo que só conheço e sei construir algo com determinada tecnologia quando eu coloco em produção, porque aquilo vai me deixar cicatrizes.\n\nArrisque colocar em produção, dar um passo a mais além da sua zona de descanso, nem que gere algum probleminha, afinal nada pode ficar 100%. Por exemplo, ao construir um projeto tente colocar 1% a mais do que você está acostumado para que realmente tenha um pouco mais de dificuldade, assim esse projeto te dará uma cicatriz, isso vai te deixar mais calejado.\n\nQuando mais você passa por essas situações, mais você vai se transformar em um profissional melhor, isso é muito importante para nossa carreira. Invente maneiras novas de fazer algo, tanto para te motivar quanto para aprender. Lembrando que é no erro que nós aprendemos. Um desenvolvedor pleno tem que ter essa visão de que percorrer caminhos difíceis é o que vai fazer ele se transformar em um desenvolvedor melhor, mais preparado e mais calejado. Se você conseguir construir um sistema que mil pessoas utilizam, aquilo te da uma força para saber que você pode construir um de dez mil.",
      "description": "Na dica de carreira de hoje, eu quero explicar porque é tão bom e útil pra gente ter ",
      "keywords": [
        "cicatrizes",
        "mais",
        "carreira",
        "para",
        "https",
        "construir",
        "tenha",
        "isso",
        "fazer",
        "porque"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/tenha-cicatrizes"
      }
    },
    {
      "id": "769497b3f941eda9",
      "url": "https://devpleno.com/converter-markdown-para-html",
      "title": "Como converter Markdown para HTML usando Marked - DevPleno (Part 2)",
      "content": "Text: Teste Level: 2\nCom isso, o Marked sabe que o texto que eu quero é o Teste, e o level que eu quero é o 2, ou no caso a heading tag H2. Eu consigo retornar uma fontSize maior como no exemplo abaixo:\n\nrenderer.heading = function (Text, level) {\nreturn&#x3C;Textstyle={{fontSize: }}>'Text: ' +text+' Level: '+level\n}\nChecando obviamente o level e por aí vai. Assim podemos gerar uma interface que vai ser reproduzida de forma igual tanto no react native quanto na Web, já que é possível converter para HTML e estaria tudo rodando normalmente.\n\n**5 – Concluindo**\n\nVenho usando bastante Markdown para documentação. Uma outra ideia interessante seria pegar esse HTML gerado pelo Markdown e, a partir dele, gerar um PDF para salvar isso para outros desenvolvedores.\n\nMarked é uma forma que temos no Node de converter o Markdown em HTML, mas também podemos utilizá-lo no browser.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20converter%20Markdown%20para%20HTML%20usando%20Marked&url=https%3A%2F%2Fdevpleno.com%2Fconverter-markdown-para-html) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fconverter-markdown-para-html)",
      "description": "O Markdown é uma forma de escrevermos documentação que foi popularizada pelo Github (e que é uma mão na roda, digase de passagem). Com ele, podemos pegar u...",
      "keywords": [
        "marked",
        "para",
        "teste",
        "markdown",
        "text",
        "level",
        "html",
        "renderer",
        "https",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/converter-markdown-para-html"
      }
    },
    {
      "id": "76d942199fdad74e",
      "url": "https://devpleno.com/blog/como-manter-se-motivado/index",
      "title": "Como manter-se motivado (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "isso",
        "manter",
        "motivado",
        "fazer",
        "objetivo",
        "para",
        "embed",
        "motiva",
        "perceber",
        "responsive"
      ],
      "metadata": {
        "title": "Como manter-se motivado",
        "date": "2017-11-30",
        "tags": "['Carreira']",
        "author": "Tulio Faria",
        "thumbnail": "Como.png",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/como-manter-se-motivado/index.md"
      }
    },
    {
      "id": "772a453e660462b5",
      "url": "https://devpleno.com/blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index",
      "title": "Por que fazer um curso de programação voltado para a prática? (Part 5)",
      "content": "## Para conhecer ferramentas de configuração do ambiente de desenvolvimento\n\nPara que uma linguagem seja usada, normalmente são necessários sistemas que dão suporte ao seu funcionamento, como drivers e bibliotecas para que possam se integrar a outros tipos tecnologias.\n\nQuer um exemplo? O desenvolvimento de aplicações web completas com Javascript pode ser acelerado e feito como mais qualidade usando o framewark ReactJs. No server-side é necessário instalar o NodeJs. A aplicação pode usar o MongoDB como base de dados e o Mongoose como biblioteca para modelagem do banco por exemplo.\n\nOutro exemplo é a programação para Android ou o uso de cordova para a criação de aplicativos híbridos. Deve-se instalar o Java, configurar o ambiente de desenvolvimento para que se possa começar a desenvolver.\n\nEm ambos os casos, seja mobile, seja web, um desenvolvedor profissional trará dicas importantes para desenvolver com mais produtividade e encontrar os atalhos para lançar o seu projeto com maior velocidade.\n\nVimos assim que aprender a programar, na prática, é uma excelente escolha para quem quer entrar no mercado ou para quem já atua e quer diversificar seus conhecimentos. Um curso de programação com quem tem experiência e no qual se põe a mão na massa, faz com que o aluno não apenas aprenda a desenvolver em uma linguagem, mas também a se encaixar em uma equipe e em projetos reais.\n\nAté a próxima :)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "como",
        "https",
        "projeto",
        "mais",
        "desenvolvimento",
        "devpleno",
        "source",
        "blog",
        "campaign"
      ],
      "metadata": {
        "title": "Por que fazer um curso de programação voltado para a prática?",
        "date": "2017-07-31",
        "tags": "['Carreira']",
        "thumbnail": "CursoProgramacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index.md"
      }
    },
    {
      "id": "772cb173104cd538",
      "url": "https://devpleno.com/blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index",
      "title": "8 dicas de organização para freelancers se darem bem na carreira (Part 1)",
      "content": "Nada melhor do que ter uma rotina flexível, com a possibilidade de trabalhar nos seus próprios horários, não é mesmo? Não à toa, ser freelancer é uma alternativa cada vez mais atrativa para os desenvolvedores de software.\n\nContudo, é preciso ter muita disciplina para atuar nessa modalidade. Afinal, o seu rendimento no final do mês será proporcional à sua dedicação e produtividade.\n\nPara ajudá-lo a ter um melhor desempenho, compilamos algumas dicas de organização. Ao segui-las, você com certeza se sairá muito bem nessa [carreira](https://www.devpleno.com/carreira-preco-que-tem-que-ser-pago?utm_source=blog&utm_campaign=rc_blogpost). Confira:\n\n## 1\\. Tenha um fundo de reserva\n\nAqueles que já estão há algum tempo atuando em formas alternativas de trabalho sabem que no início é mais complicado. Como a pessoa ainda é nova nesse universo, será necessário fazer o nome dela como freelancer. Além do mais, é preciso conhecer bem o mercado para encontrar boas propostas de projetos.\n\nNo entanto, isso requer tempo. Portanto, é essencial ter uma reserva financeira, que dará o devido suporte até que você se estabilize.\n\nO ideal nesse caso é ter uma quantia suficiente para todas as suas despesas por pelo menos três meses. Nesse período, você conseguirá ampliar sua carteira de clientes e ampliar suas possibilidades de jobs.\n\n## 2\\. Faça um planejamento\n\nDiferente do emprego fixo, em que o profissional possui carteira assinada com um valor específico, no mundo dos freelancers a remuneração pode ser bastante diversificada. Em um mês, por exemplo, você pode tirar um valor muito alto, já em outro a remuneração pode ser menor — devido à baixa demanda.\n\nDiante desse cenário, o profissional precisa ter um planejamento bem estruturado. O recomendado é que ele estabeleça [metas](https://www.devpleno.com/comprometimento-com-suas-metas?utm_source=blog&utm_campaign=rc_blogpost) semanais e/ou mensais, certificando-se de cumpri-las. Afinal, a sua renda depende diretamente da sua produção.",
      "keywords": [
        "para",
        "mais",
        "como",
        "freelancer",
        "pode",
        "afinal",
        "isso",
        "preciso",
        "https",
        "devpleno"
      ],
      "metadata": {
        "title": "8 dicas de organização para freelancers se darem bem na carreira",
        "date": "2017-07-14",
        "tags": "['Carreira']",
        "thumbnail": "105725-8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index.md"
      }
    },
    {
      "id": "77902676f7b758ee",
      "url": "https://devpleno.com/blog/melhoria-continua/index",
      "title": "Melhoria Contínua",
      "content": "A dica de carreira de hoje é sempre tentar melhorar, ou seja, aplicar a melhoria contínua em seu processo de desenvolvimento de software, tecnologia que você domina e em tudo que você faz.\n\nVou contar uma história rapidinho para vocês terem uma ideia de onde eu quero chegar e porque essa dica é tão importante.\n\nTemos um cliente que pegamos um projeto já caminhando e sempre acontecia um problema. Iamos migrar o código de um servidor de desenvolvimento para um servidor de production e acontecia um monte de problemas, então entrava uma pessoa no servidor de produção e fazia uma alteração. Tudo que acontece eu anoto ou presto atenção para tentar uma forma melhor de fazer. Por exemplo, neste cliente conseguimos achar que o grande problema era que o código não passava de versões. Com isso, um dos primeiros itens que trabalhei foi organizar a 'casa', obviamente entramos para corrigir um monte de bugs emergenciais e agora estamos em uma melhoria contínua.\n\nA melhoria pode ter estágios, não precisa melhorar para o software dos sonhos de primeira. Quando um processo está complicado, é importante para a sua carreira que você consiga resolver o problema. Isso é até um treino, afinal, para treinar resolver problemas, você tem que resolvê-los, mesmo se você não tem autoridade para alterar o projeto, imagine as soluções que você poderia aplicar.\n\nEntão, a melhoria contínua é dar soluções novas para problemas que estão acontecendo no software. É uma obrigação, pois mostra que você é um DEVPLENO, ou seja, que tem a capacidade além do que você foi designado.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Ybqweo5aKc0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "melhoria",
        "embed",
        "cont",
        "software",
        "problema",
        "servidor",
        "problemas",
        "devpleno",
        "responsive"
      ],
      "metadata": {
        "title": "Melhoria Contínua",
        "date": "2017-07-05",
        "tags": "['Carreira']",
        "thumbnail": "MelhoriaContinua.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/melhoria-continua/index.md"
      }
    },
    {
      "id": "77adb3c1ed8ba0e9",
      "url": "https://devpleno.com/blog/confira-4-dicas-de-ux-para-programadores/index",
      "title": "Confira 4 dicas de UX para programadores (Part 3)",
      "content": "Abaixo, listamos quatro dicas para você começar esse processo.\n\n### 1. Entenda o seu consumidor\n\nVocê claramente não constrói um software para uso próprio na empresa, certo? Toda solução é construída para resolver algum problema para um público específico, e você, como programador responsável pelo produto, deve conhecer quem são essas pessoas, para criar uma solução que faça sentido para elas.\n\nSaiba quem é o usuário ideal do seu produto, quais são seus gostos, qual o problema que ele está solucionando e como se comporta dentro de plataformas. Descubra informações sobre como ele usaria a sua solução e utilize esses dados como base para desenvolver o produto.\n\nÉ garantido que as áreas de marketing e vendas podem fornecer todas as informações sobre quem são os clientes que utilizam o produto, e aqui introduzimos nossa próxima dica.\n\n### 2. Trabalhe com as demais áreas de empresa\n\nSe a experiência do usuário não depende só de marketing ou vendas, ela é responsabilidade de toda a empresa e deve ser pensada em conjunto. É óbvio que você deve trabalhar com as demais áreas para desenvolver a solução com a melhor experiência para os clientes, certo?\n\nUma boa dica é, antes de começar a desenvolver, fazer uma reunião de alinhamento com as áreas de marketing, vendas e design para definir um road map do produto, que considera o que é mais importante para impactar a experiência do usuário de forma positiva.\n\nAlém disso, busque feedbacks constantes com essas áreas que fazem contato direto com o consumidor, para direcionar e aprimorar suas demandas, focando em UX. Mantenha o contato com esse novo [network](https://www.devpleno.com/networking?utm_source=blog&utm_campaign=rc_blogpost).\n\n### 3. Estude o mercado\n\nQuantas vezes você recebeu a tarefa de desenvolver um software e programa e só buscou referências técnicas para criá-lo? Se costuma fazer isso, você não considera a experiência do usuário em seus projetos.",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "produto",
        "informa",
        "https",
        "source",
        "blog"
      ],
      "metadata": {
        "title": "Confira 4 dicas de UX para programadores",
        "date": "2017-10-06",
        "tags": "['Carreira']",
        "thumbnail": "117637-confira-4-dicas-de-ux-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/confira-4-dicas-de-ux-para-programadores/index.md"
      }
    },
    {
      "id": "77eb64761882ed47",
      "url": "https://devpleno.com/tag/carreira/3",
      "title": "Carreira - Pagina 3 - DevPleno",
      "content": "Carreira\n\n## Arquivo de Insights\n\n93 posts encontrados com a tag Carreira\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 6 de out. de 2017 Confira 4 dicas de UX para programadores](/confira-4-dicas-de-ux-para-programadores)\n\n[Carreira 26 de set. de 2017 Descrição das vagas de emprego no Brasil x no exterior](/vagas-de-emprego-no-brasil-e-no-exterior)\n\n[Carreira 19 de set. de 2017 Falta tempo para realizar aquele projeto?](/falta-de-tempo)\n\n[Carreira 8 de set. de 2017 Tudo na vida acontece duas vezes!](/tudo-acontece-duas-vezes)\n\n[Carreira 6 de set. de 2017 Validade de um projeto/ideia/ação](/validade)\n\n[Carreira 5 de set. de 2017 Tenha cicatrizes](/tenha-cicatrizes)\n\n[Carreira 30 de ago. de 2017 CLT ou PJ em Software - O que vale mais a pena?](/clt-ou-pj)\n\n[Carreira 29 de ago. de 2017 Técnica para eliminar o que não te faz alcançar seus objetivos](/tecnica-para-alcancar-seus-objetivos)\n\n[Carreira 28 de ago. de 2017 Coisas ruins normais](/coisas-ruins-normais)\n\n[Carreira 28 de ago. de 2017 Falta de apoio](/falta-de-apoio)\n\n[Carreira 18 de ago. de 2017 Impostos e como receber de empresas estrangeiras](/como-receber-de-empresas-estrangeiras)\n\n[Carreira 16 de ago. de 2017 negociação - Como vender um Software](/como-vender-software)\n\n[Anterior](/tag/carreira/2)3 / 8[Próxima](/tag/carreira/4)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "2017",
        "para",
        "falta",
        "como",
        "software",
        "algoritmos",
        "ferramentas",
        "fundamentos",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/carreira/3"
      }
    },
    {
      "id": "77ebe7522a622a62",
      "url": "https://devpleno.com/blog/stream-duplex/index",
      "title": "Hands-on: Streams Parte 03 - Duplex (Part 3)",
      "content": "Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "socket",
        "client",
        "para",
        "server",
        "data",
        "porta",
        "este",
        "stream",
        "cliente",
        "console"
      ],
      "metadata": {
        "title": "Hands-on: Streams Parte 03 - Duplex",
        "date": "2017-05-10",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/stream-duplex/index.md"
      }
    },
    {
      "id": "7886d909e23c6eae",
      "url": "https://devpleno.com/blog/arvore-binaria/index",
      "title": "Árvore Binária em JavaScript (Part 2)",
      "content": "Ele imprimirá 10,2 e 3, o que está correto porque ele imprimiu o nó principal que é 10, depois ele foi para a esquerda, imprime o 2, como na esquerda não tem nada. ele vai para a direita e imprime o 3, depois vai para a próxima direita e não imprime nada pois esta como undefined. Esse é o preOrder, agora vamos testar o inOrder:\n\n```js\nfunction inOrder(tree) {\n  tree.left && inOrder(tree.left)\n\n  console.log(tree.value)\n\n  tree.right && inOrder(tree.right)\n}\n\nconsole.log('inOrder')\n\ninOrder(arvore)\n```\n\nA diferença é que o console.log virá no meio.\n\nPerceba que o inOrder vai para a esquerda primeiro, tenta ir novamente para a esquerda, não acha nada, ai ele visita o nó 2, vai para a direita, tenta ir para a esquerda e não consegue, visita o nó 3, vai para a direita e não tem nada, volta, imprime o nó 10 e por fim tenta ir para a direita e está undefined.\n\nO mais importante é que guardamos os tipos de navegação da seguinte forma, preOrder escreve primeiro, inOrder escreve no meio e o posOrder escreve no final.\n\nOutra coisa importante é que como ele é recursivo eu preciso saber qual o meu passo base, que é o passo onde nenhum dos dois vão ser executados, ou seja, quando chegar no left e no right não ter mais ninguém para navegar.\n\nCom JavaScript fica muito simples a navegação em árvore, perceba que construímos a navegação com um Object normal, posteriormente vamos ver inserção e tudo mais em árvores de busca, onde colocamos o elemento menor para o lado esquerdo e o maior para o lado direito.\n\nConfira todo a explicação no vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/_jBCy4VX4C4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "tree",
        "preorder",
        "left",
        "right",
        "inorder",
        "rvore",
        "esquerda",
        "direita",
        "value"
      ],
      "metadata": {
        "title": "Árvore Binária em JavaScript",
        "date": "2017-07-03",
        "tags": "['Algoritmos']",
        "thumbnail": "Arvores.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/arvore-binaria/index.md"
      }
    },
    {
      "id": "79092d964fe8e6dc",
      "url": "https://devpleno.com/blog/como-invocar-funcoes-dinamicamente-com-js/index",
      "title": "Como invocar funções dinamicas em JavaScript (Part 3)",
      "content": "A principal ideia do que aprendemos é criar funções dinâmicas e facilitar o uso de módulos de extensões de uma aplicação com essa abordagem, tanto para carregar um módulo dinâmico quanto para executar algo dentro desse módulo dinamicamente.\n\nE essa é a dica de hoje. Confira o passo a passo no vídeo abaixo.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/c6C5j1_Xwig\" allowfullscreen></iframe>\n</div>\n\nAté a próxima!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "console",
        "como",
        "para",
        "todos",
        "valor",
        "resultado",
        "navegador",
        "vari",
        "constante",
        "instru"
      ],
      "metadata": {
        "title": "Como invocar funções dinamicas em JavaScript",
        "date": "2018-02-19",
        "tags": "['Javascript']",
        "thumbnail": "INVOCAR-FUNÇÕES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/como-invocar-funcoes-dinamicamente-com-js/index.md"
      }
    },
    {
      "id": "7912ecf012847e0a",
      "url": "https://devpleno.com/2-tipos-de-solucoes-de-software-que-voce-pode-entregar",
      "title": "2 Tipos de Soluções de Software que você pode entregar - DevPleno (Part 1)",
      "content": "Carreira\n\n## 2 Tipos de Soluções de Software que você pode entregar\n\nT\nPor Tulio Faria • 13 de outubro de 2017\n\n[Carreira](/tag/carreira)\n\nHoje quero falar com vocês um pouco sobre venda de software. É um conceito bastante interessante sobre as possibilidades que nós temos de entrega para o cliente.\n\nBasicamente temos duas opções para entregar uma solução para nosso cliente.\n\n## 1 - Entregar exatamente o que o cliente quer\n\nEssa é a opção mais simples, geralmente é a mais utilizada por quem está começando na área. A vantagem desse tipo de solução é que entregamos o serviço muito mais facilmente. O problema é que quando o cliente quer algo e é entregue da forma que ele quer, não necessariamente dá o resultado que ele espera.\n\n## 2 - Entregar o que o cliente realmente precisa\n\nÀ medida que vai ganhando experiência, você começa a perceber que o que o cliente quer nem sempre é o que ele precisa. O problema nisso é que você precisa convencer o seu cliente que o que ele precisa é diferente do que ele quer.\n\nQuando entregamos o que ele precisa, geralmente estamos focados no resultado final, porém isso não necessariamente significa entregar um software para o cliente.\n\nPor exemplo, já aconteceu comigo de um potencial cliente querer mensurar algumas informações, mas na verdade, ele não precisava de um software para fazer isso, apenas um formulário de papel resolveria o problema, e foi o que fizemos.\n\nDessa forma, muitas vezes você não entrega software e não consegue cobrar por aquilo.\n\nQuando estamos começando na área, com projetos menores, a chance do cliente se frustrar é menor, por esse motivo é mais seguro entregar o que o cliente quer.\n\nQuando vamos entregar uma solução eficaz para o cliente, muitas vezes não é desenvolver um software, porém tem clientes que não estão abertos a isso (atualmente eu tento entregar o máximo que o cliente precisa, mas não brigo se o cliente fala o que ele quer mais de três vezes.",
      "description": "Hoje quero falar com vocês um pouco sobre venda de software. É um conceito bastante interessante sobre as possibilidades que nós temos de entrega para o cl...",
      "keywords": [
        "cliente",
        "entregar",
        "software",
        "quer",
        "para",
        "precisa",
        "https",
        "mais",
        "quando",
        "solu"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/2-tipos-de-solucoes-de-software-que-voce-pode-entregar"
      }
    },
    {
      "id": "79553b8aa73892cc",
      "url": "https://devpleno.com/hands-on-chalkjs",
      "title": "ChalkJS - Deixe as saídas de seu console.log coloridas e com estilo - DevPleno",
      "content": "Javascript\n\n## ChalkJS - Deixe as saídas de seu console.log coloridas e com estilo\n\nT\nPor Tulio Faria • 11 de setembro de 2017\n\n[Javascript](/tag/javascript)\n\nO ChalkJS é um módulo que basicamente permite uma saída colorida no console. Primeiramente vamos importar o módulo:\n\nyarn add chalk\nAgora, no editor, vamos escrever um código. Eu criei um arquivo chalk.js e dentro dele vamos colocar o seguinte:\n\nconst chalk = require('chalk')\n\nconsole.log('DevPleno')\nAo mandarmos rodar o código, a resposta sairá normalmente, mas agora vamos utilizar de uma forma diferente:\n\nconsole.log(chalk.red('DevPleno'))\nAgora, se rodarmos o código, ele vira da seguinte forma:\n\nO interessante é que podemos combinar as seguintes variações:\n\nAo aparecer um erro ou um alerta, por exemplo, podemos colocar um ‘bgRed’:\n\nUma outra coisa interessante é que podemos abrir o estilo, por exemplo:\n\nconsole.log(chalk.styles.red.open + 'Vermelho' + chalk.style.red.close)\n\nEntão podemos estilizar todos os console.log que tiverem entre o open e o close, isso é muito legal, pois podemos, por exemplo, printar uma mensagem em vermelho que é grande, podemos dar só um open e um close. Vale muito a pena dar uma olhada na documentação até para saber quais são os parâmetros que ele aceita.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=ChalkJS%20-%20Deixe%20as%20sa%C3%ADdas%20de%20seu%20console.log%20coloridas%20e%20com%20estilo&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-chalkjs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-chalkjs)",
      "description": "O ChalkJS é um módulo que basicamente permite uma saída colorida no console. Primeiramente vamos importar o módulo: Agora, no editor, vamos escrever um cód...",
      "keywords": [
        "chalk",
        "console",
        "podemos",
        "https",
        "chalkjs",
        "vamos",
        "devpleno",
        "javascript",
        "agora",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-chalkjs"
      }
    },
    {
      "id": "797a5dce7f7f7f96",
      "url": "https://devpleno.com/blog/gerenciador-de-series-p1/index",
      "title": "Construindo um App gerenciador de séries com ReactJS (Part 1)",
      "content": "Nesta nova série, vamos construir um aplicativo na prática, mais especificamente um gerenciador de séries, para você nunca mais esquecer as séries que assistiu no Netflix e também as que você tem para assistir que algum amigo te indicou. Para isso, vamos utilizar o ReactJS, a tecnologia que eu utilizo no meu dia a dia nos projetos para uma empresa americana e nos que a minha empresa desenvolve. É um potencial muito grande para o mercado conhecer e saber desenvolver projetos com o ReactJS.\n\nAtualmente dizemos que o ReactJS é unanimidade em todos os lugares, pois podemos desenvolver para WEB, aplicativos nativos para celular, Windows… basicamente tudo. Por esse motivo, está muito em alta e é importante aprender essa biblioteca neste momento.\n\nHoje vamos preparar a máquina para criar o projeto, configurando como vamos armazenar esses dados para podemos fazer as quatro operações que são inserir um registro novo nesse banco, retornar esses registros do banco, atualizá-los e excluir os registros.\n\nNo fim disso, vamos fazer um primeiro projetinho para que você saiba como é um componente em React, ver funcionando e falar um pouco sobre JSX, que é a linguagem que o React usa para conseguir manipular as coisas na tela. Nas próximas aulas, vamos começar realmente a construir essa aplicação com navegação e tudo mais. Outro ponto legal é que você pode utilizar essa aplicação como portfólio.\n\nVAMOS LÁ!\n\nPara construir esse projeto, vamos precisar de três módulos:\n\n```jsx\nnpm install -g json-server\nnpm install -g create-react-app\nnpm install -g yarn\n```\n\nO Create React App é uma forma de iniciar o projeto em React de forma muito rápida e sem 'briga', afinal, quando temos que configurar muito webpack, gastamos muito tempo porque dá muito problema, então o Create React App já é uma forma muito boa de começarmos um projeto, pois diminuímos muito o número de dependências diretas do projeto deixando ele mais limpo.",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "title": "Construindo um App gerenciador de séries com ReactJS",
        "date": "2017-07-19",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "ReactJS-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/gerenciador-de-series-p1/index.md"
      }
    },
    {
      "id": "7989c3573b30b86d",
      "url": "https://devpleno.com/blog/dica-como-saber-complexidade-de-um-algoritmo/index",
      "title": "Dica: Como saber a complexidade de um algoritmo",
      "content": "Nos últimos vídeos e na última live, comentei sobre o Codility. Ele tem uma característica de avaliar a complexidade do algoritmo que você respondeu. Neste vídeo, dou uma dica rápida de como avaliar e ter uma ideia da complexidade. Confira:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/f--A1FK6KK4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "avaliar",
        "complexidade",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Dica: Como saber a complexidade de um algoritmo",
        "date": "2017-04-10",
        "tags": "['Algoritmos']",
        "thumbnail": "maxresdefault-2-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-como-saber-complexidade-de-um-algoritmo/index.md"
      }
    },
    {
      "id": "7a130ddb70f60a2c",
      "url": "https://devpleno.com/minicurso-socket-io-parte-1",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto - DevPleno (Part 1)",
      "content": "Javascript\n\n## Minicurso Socket.IO - Parte 01 - Começando o projeto\n\nT\nPor Tulio Faria • 5 de julho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nEssa é a primeira parte do nosso minicurso de Socket.IO. Nesta etapa, vamos começar o projeto e criar as primeiras páginas para dar o suporte à aplicação.\n\nA primeira coisa que temos que fazer é garantir que o express generator está instalado.\n\nnpm install -g express-generator\nEsse express generator instala um gerador de aplicações em expressJS que é o que vamos utilizar. Escrevendo **express -h** ele mostra o nosso help, com isso consigo criar um projeto do zero já falando as especificidades que eu quero para ele. Por exemplo, vamos fazer o seguinte:\n\nexpress placar-online --ejs\nEntão colocamos o express, o nome do diretório que queremos e —ejs porque queremos utilizá-lo como engine para template. Nos arquivos de apoio ([https://www.devpleno.com/minicurso-socket-io-parte-1/](https://www.devpleno.com/minicurso-socket-io-parte-1/)) já estão em EJS, mas nada te impede usar o —pug ou —handlesbar por exemplo.\n\nInstalamos depois o yarn:\n\nyarn\nAo dar enter, ele já cria todos nossos arquivos, agora precisamos entrar no diretório do placar-online e damos um start no yarn:\n\nyarn start\nPara acessarmos a aplicação, entramos em **localhost:3000**. Nela temos nossa aplicação.\n\nVamos abrir esse diretório no Visual Code, perceba que o express generator já criou uma pasta bin, code_modules, publc, routes e uma pasta views. Dentro desse views, teremos nossos templates, no routes teremos nossas rotas e em public nossa pasta pública, ou seja, o que conseguimos acessar publicamente nesse servidor.\n\nPara começar, vamos deletar da pasta **public** os diretórios **images, javascript e stylesheets** e, na pasta **routes,** deletar o arquivo **users.js**. Lembrando que estamos deletando apenas o que não precisamos.\n\nAgora vamos abrir o **app.js** e remover o users, já que apagamos o diretório:",
      "description": "Essa é a primeira parte do nosso minicurso de Socket.IO. Nesta etapa, vamos começar o projeto e criar as primeiras páginas para dar o suporte à aplicação. ...",
      "keywords": [
        "vamos",
        "para",
        "dentro",
        "matches",
        "views",
        "express",
        "pasta",
        "index",
        "match",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-1"
      }
    },
    {
      "id": "7a1ca2619126f5f8",
      "url": "https://devpleno.com/complexidade-de-um-algoritmo",
      "title": "Como saber a complexidade de um algoritmo - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Como%20saber%20a%20complexidade%20de%20um%20algoritmo&url=https%3A%2F%2Fdevpleno.com%2Fcomplexidade-de-um-algoritmo) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomplexidade-de-um-algoritmo)",
      "description": "Hoje eu gostaria de dar uma dica rápida, principalmente para o pessoal que estiver fazendo alguns testes no codelite, porque ele considera a complexidade d...",
      "keywords": [
        "vetor",
        "algoritmo",
        "complexidade",
        "para",
        "porque",
        "rodar",
        "https",
        "saber",
        "console",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/complexidade-de-um-algoritmo"
      }
    },
    {
      "id": "7a4a839689399ece",
      "url": "https://devpleno.com/blog/loopsrepeticoesiteracoes-no-jsx-do-react/index",
      "title": "Loops/Repetições/Iterações no JSX do React (Part 2)",
      "content": "Esta forma é a minha favorita para renderizar lista de dados, pois mantem o código bem organizado e permite tratar quando a lista é vazia. Veja este exemplo:\n\n```jsx\nclass Loop3 extends React.Component {\n  renderRow(row) {\n    return <li>Num: {row}</li>\n  }\n  render() {\n    let rows = []\n    for (let i = 0; i < 5; i++) {\n      rows.push(i)\n    }\n    if (rows.length == 0) {\n      return <p>Nenhum item</p>\n    }\n    return (\n      <div>\n        <h1>Loop 3:</h1>\n        <ul>{rows.map(this.renderRow)}</ul>\n      </div>\n    )\n  }\n}\n```\n\nSe a lista for vazia, ele retorna uma mensagem e não renderiza o loop :)\n\nVocê pode ver estes exemplos rodando aqui: [https://codepen.io/tuliofaria/pen/NbZgqK](https://codepen.io/tuliofaria/pen/NbZgqK)\n\nBom pessoal, estas são algumas ideias para utilizar loops em JSX. Como sempre, fiquem a vontade para comentar e até a próxima!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "rows",
        "para",
        "escopo",
        "return",
        "loop",
        "html",
        "como",
        "renderrow",
        "https",
        "permite"
      ],
      "metadata": {
        "title": "Loops/Repetições/Iterações no JSX do React",
        "date": "2016-12-27",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "Lops.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/loopsrepeticoesiteracoes-no-jsx-do-react/index.md"
      }
    },
    {
      "id": "7a7723d528741448",
      "url": "https://devpleno.com/blog/hands-on-marked/index",
      "title": "Hands-on: Marked",
      "content": "Neste vídeo, faço um hands-on do módulo Marked, que tem a função de converter Markdown para HTML.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/bXOCbvSkdEg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "para",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "neste"
      ],
      "metadata": {
        "title": "Hands-on: Marked",
        "date": "2017-05-02",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Marked.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-marked/index.md"
      }
    },
    {
      "id": "7ad3697892028546",
      "url": "https://devpleno.com/o-que-e-restful",
      "title": "Web Basic - RESTful - DevPleno (Part 2)",
      "content": "Basicamente seria usarmos estes métodos de uma forma que ele já indique que tipo de alteração queremos fazer no servidor, por exemplo:\nPOST(enviar dados) para /users, o back-end irá entender que queremos criar um usuário novo;\nGET no /users ele nos passará todos os users;\nGET em /users/tulio, quero apenas o usuário especifico; PUT (também submetemos dados para lá) e dizemos que queremos alterar os dados do user/tulio.\nCom isso, ficou muito mais simples, pois não precisamos, por exemplo, passar na URL que tipo de operação queremos fazer, simplesmente fazemos no método. E com a evolução dos navegadores e a chegada de novos frameworks, conseguimos construir uma forma de comunicação que chamamos então de RESTful, conseguindo usar todos os métodos da especificação HTTP para essa comunicação entre front-end e back-end.\nGraças ao HTTP e algumas padronizações que temos na comunicação, a internet é o que é hoje, pois sem padronização não teríamos comunicação, já que cada um faria seu próprio padrão.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Web%20Basic%20-%20RESTful&url=https%3A%2F%2Fdevpleno.com%2Fo-que-e-restful) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fo-que-e-restful)",
      "description": "Apenas para lembrar o que vimos no post anterior sobre arquitetura Web, existem as duas pontas da aplicação: o backend e o frondend e uma troca de mensagen...",
      "keywords": [
        "para",
        "restful",
        "post",
        "https",
        "padr",
        "exemplo",
        "pois",
        "isso",
        "todos",
        "queremos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/o-que-e-restful"
      }
    },
    {
      "id": "7b04049edf258a3b",
      "url": "https://devpleno.com/generators-functions",
      "title": "Generators Functions - o que acontece por baixo dos panos - DevPleno (Part 1)",
      "content": "Javascript\n\n## Generators Functions - o que acontece por baixo dos panos\n\nT\nPor Tulio Faria • 29 de junho de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vamos continuar falando sobre Generators Functions em JavaScript.\n\n**O que é Generator?**\n\nÉ uma função que podemos pausar ou iterar sobre ela. Já falamos sobre generators no hands-on do Módulo CO, que resolve um generator, mas hoje vamos falar como ele funciona ‘por baixo dos panos’ e até mesmo como o CO foi construído.\n\nA primeira coisa que temos que saber é que a sintaxe do generator é criada com uma function e um asterisco. Se fizermos isso, dizemos que é uma função generator, então é possível pausar essa função com CO, o que deixa o código mais linear:\n\nfunction* generator() {\nconsole.log('Entrou no generator')\n}\nconst gen = generator()\nAo executar o código, perceba que não saiu nada. Primeiro precisamos iterar sobre ele para que consigamos ter um valor, para isso criamos um:\n\nconst iteration = gen.next()\nO next é muito comum em outras linguagens, nas quais temos algumas estruturas que são iteráveis. Enquanto você utilizar o .next significa que você ainda tem dados para iterar.\n\nAgora executamos para ver o que acontece novamente. Perceba que aparece a mensagem (‘Entrou no generator’) porque ele depende do next para entrar na primeira linha.\n\nAgora vamos fazer algo diferente:\n\nfunction* generator() {\nconsole.log('Entrou no generator')\nconsole.log('Segundo passo')\nconsole.log('Penultimo passo')\nconsole.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\nEle executou tudo de uma vez. Agora vamos fazer o seguinte:\n\nyield 'outro valor'\nOlha que interessante, ele parou agora no segundo passo, se eu der um console.log no iteration ele retorna um objeto com um value ‘outro valor’ dentro e um done: false. Ele parou e retornou esse valor, então ela é uma função que além de iterável, conseguimos ter vários retorno de valor. Se eu quisesse continuar executando, tenho que chamar novamente gen. next:",
      "description": "Hoje vamos continuar falando sobre Generators Functions em JavaScript. O que é Generator? É uma função que podemos pausar ou iterar sobre ela. Já falamos s...",
      "keywords": [
        "generator",
        "console",
        "next",
        "const",
        "iteration",
        "function",
        "para",
        "passo",
        "value",
        "valor"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/generators-functions"
      }
    },
    {
      "id": "7b568e8e12971315",
      "url": "https://devpleno.com/blog/aviso-legal/index",
      "title": "Aviso legal",
      "content": "Você deve saber que todos os produtos e materiais produzidos pela We Dev Ideas – Eirelli – ME, são feitos para fins educacionais e informacionais e por isso, a We Dev Ideas não garante que você conseguirá obter quaisquer resultados ou ganhar algum dinheiro usando qualquer uma de nossas ideias, ferramentas, estratégias e recomendações, e nada em nossos Sites é uma promessa ou garantia para você de ganhos futuros.\n\nVOCÊ CONCORDA QUE O USO OU INCAPACIDADE DE USO DOS PRODUTOS DA WE DEV IDEAS É POR SUA CONTA E RISCO. Ao adquirir um produto de nossa empresa, você aceita, concorda e entende que você é totalmente responsável por seu progresso e resultados de sua participação e que nós não oferecemos nenhuma representação, garantia ou garantias verbalmente ou por escrito sobre seus ganhos, o lucro do negócio, o desempenho do marketing, o crescimento da audiência ou resultados de qualquer tipo.\n\nQualquer dado presente no site **DevPleno** ou de seus produtos, são somente ilustrativos e não devem ser considerados como um ganho comum, ganho exato ou promessa de renda no futuro.\n\nVocê é totalmente responsável pelas suas decisões, ações e resultados na vida, e através dos seus registros no site, você concorda em não nos responsabilizar por qualquer decisão, ações ou resultados a qualquer momento, em nenhuma circunstância.\n\nQuaisquer declarações descritas no nosso website, conteúdos e ofertas são simplesmente nossa opinião e, portanto, não são garantias ou promessas de desempenho real. Nós não oferecemos assessoria jurídica, médica, psicológica ou financeira profissional.",
      "keywords": [
        "resultados",
        "qualquer",
        "produtos",
        "ideas",
        "concorda",
        "seus",
        "para",
        "quaisquer",
        "promessa",
        "garantia"
      ],
      "metadata": {
        "title": "Aviso legal",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/aviso-legal/index.md"
      }
    },
    {
      "id": "7b576ed2c97523a9",
      "url": "https://devpleno.com/blog/o-que-e-restful/index",
      "title": "Web Basic - RESTful (Part 2)",
      "content": "Basicamente seria usarmos estes métodos de uma forma que ele já indique que tipo de alteração queremos fazer no servidor, por exemplo:\nPOST(enviar dados) para /users, o back-end irá entender que queremos criar um usuário novo;\nGET no /users ele nos passará todos os users;\nGET em /users/tulio, quero apenas o usuário especifico; PUT (também submetemos dados para lá) e dizemos que queremos alterar os dados do user/tulio.\nCom isso, ficou muito mais simples, pois não precisamos, por exemplo, passar na URL que tipo de operação queremos fazer, simplesmente fazemos no método. E com a evolução dos navegadores e a chegada de novos frameworks, conseguimos construir uma forma de comunicação que chamamos então de RESTful, conseguindo usar todos os métodos da especificação HTTP para essa comunicação entre front-end e back-end.\nGraças ao HTTP e algumas padronizações que temos na comunicação, a internet é o que é hoje, pois sem padronização não teríamos comunicação, já que cada um faria seu próprio padrão.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "post",
        "padr",
        "exemplo",
        "pois",
        "isso",
        "todos",
        "queremos",
        "users",
        "comunica"
      ],
      "metadata": {
        "title": "Web Basic - RESTful",
        "date": "2017-05-15",
        "tags": "['Fundamentos']",
        "thumbnail": "Restful.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/o-que-e-restful/index.md"
      }
    },
    {
      "id": "7b77c701e3668416",
      "url": "https://devpleno.com/dicas-paranpm",
      "title": "3 dicas para NPM + 1 dica extra - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=3%20dicas%20para%20NPM%20%2B%201%20dica%20extra&url=https%3A%2F%2Fdevpleno.com%2Fdicas-paranpm) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdicas-paranpm)",
      "description": "Se você acompanha o DevPleno há algum tempo. deve ter percebido que eu utilizo bastante o learn, mas o repositório onde ficam esses módulos é o NPM. Esse r...",
      "keywords": [
        "para",
        "express",
        "https",
        "dulo",
        "pode",
        "reposit",
        "javascript",
        "devpleno",
        "instalar",
        "exemplo"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/dicas-paranpm"
      }
    },
    {
      "id": "7b9a51091640aea9",
      "url": "https://devpleno.com/javascript-apply",
      "title": "JavaScript: Apply - DevPleno (Part 1)",
      "content": "Javascript\n\n## JavaScript: Apply\n\nT\nPor Tulio Faria • 24 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vou falar um pouco sobre o Apply em JavaScript e mostrar um exemplo de como podemos utilizá-lo para calcular o menor e o maior valor em um conjunto de dados. Primeiramente vamos fazer um teste: criar uma função e se chamar a funTeste junto com o this, virá o contexto de onde a função está sendo executada.\n\nfunction funTeste(at1, at2) {\nconsole.log(this, at1, at2)\n}\nfunTeste(1, 2)\nPorém, ao invés defazer funTeste e executar, podemos fazer um apply, e dentro dele podemos fazer, por exemplo:\n\nfunTeste.apply(1, [2, 3])\nO primeiro atributo do apply (um), é o que eu quero para o this, ou seja, em qual contexto eu quero que essa função seja executada, e o segundo atributo são os valores que eu quero dar para os parâmetros que a função espera.\n\nSe executarmos novamente, o resultado virá: [Number: 1] 2 3, referente ao número 1, e o 2 e 3 referentes aos atributos 1 e 2.\n\nMais alguns testes seguindo essa ideia:\n\nfunction funTeste(at1, at2) {\nconsole.log(this, at1, at2)\n}\nconsole.log(Math.min(98, 78, 50))\nAo executar o número retornado, será 50, pois 50 é o menor valor daquele conjunto de dados.\n\n**O interessante no apply**\n\nNote que não estamos passando um vetor de valores e sim com vírgula, como se fossem vários atributos. Podemos utilizar o apply para que possamos passar um vetor onde tiver uma função que recebe uma lista de parâmetros.\n\nExemplo: Vamos passar um vetor em que quero descobrir o menor dos valores. A forma mais fácil é utilizando o apply.\n\nfunction funTeste(at1, at2) {\nconsole.log(this, at1, at2)\n}\nconst vetor1 = [89, 70, 50, 48]\nconsole.log(Math.min.apply(Math, vetor1))\nO Math é o meu this, pois o que estiver dentro dele como contexto está ótimo.\n\nPodemos fazer a mesma coisa com o valor máximo apenas trocando o min por max:",
      "description": "Hoje vou falar um pouco sobre o Apply em JavaScript e mostrar um exemplo de como podemos utilizálo para calcular o menor e o maior valor em um conjunto de ...",
      "keywords": [
        "apply",
        "funteste",
        "javascript",
        "como",
        "podemos",
        "para",
        "this",
        "console",
        "math",
        "https"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/javascript-apply"
      }
    },
    {
      "id": "7b9ba4983bae025a",
      "url": "https://devpleno.com/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira",
      "title": "8 dicas de organização para freelancers se darem bem na carreira - DevPleno (Part 2)",
      "content": "Diante desse cenário, o profissional precisa ter um planejamento bem estruturado. O recomendado é que ele estabeleça [metas](https://www.devpleno.com/comprometimento-com-suas-metas?utm_source=blog&#x26;utm_campaign=rc_blogpost) semanais e/ou mensais, certificando-se de cumpri-las. Afinal, a sua renda depende diretamente da sua produção.\n\nComo você não mais possuirá benefícios empresariais como plano de saúde, vale-transporte e vale-alimentação, é preciso colocar tudo isso na ponta do lápis. Somente assim você conseguirá chegar a um valor real. Afinal, você não quer ser pego de surpresa por uma despesa extra e não ter o dinheiro necessário.\n\nLembre-se de que você não tem uma garantia de renda. Isso significa que, ao surgir imprevistos, impossibilitando-o de trabalhar, você não receberá. Por isso, é importante sempre poupar uma certa quantia da renda, fator que proporcionará mais segurança.\n\n## 3. Invista em cursos de capacitação\n\nO mundo está em constante mudança e os profissionais que buscam se destacar devem apostar em cursos de capacitação. Essa premissa também vale para os freelancers: o que te diferencia dos demais profissionais? Por que o contratante deve escolher você e não o seu colega?\n\nPerceba, nesse aspecto, que é preciso ter habilidades e características singulares que vão agregar valor ao serviço. São tais aptidões que vão te deixar na frente dos concorrentes, facilitando a conquista de mais jobs.\n\nSendo assim, não tenha medo em investir na sua área, realizando cursos que vão torná-lo um freelancer mais competente.\n\n## 4. Organize o seu ambiente de trabalho\n\nAo ser freelancer, nada mais natural do que fazer home office*, que é a possibilidade de trabalhar em casa. Mas isso não significa que você não precisa ter um local apropriado para executar as tarefas.",
      "description": "Nada melhor do que ter uma rotina flexível, com a possibilidade de trabalhar nos seus próprios horários, não é mesmo? Não à toa, ser freelancer é uma alter...",
      "keywords": [
        "para",
        "mais",
        "como",
        "https",
        "carreira",
        "freelancer",
        "pode",
        "freelancers",
        "dicas",
        "afinal"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira"
      }
    },
    {
      "id": "7b9be127ec635bdf",
      "url": "https://devpleno.com/fullstack-master-li1",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master-li1 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstack",
        "master"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstack-master-li1"
      }
    },
    {
      "id": "7bd241404dbc3c4c",
      "url": "https://devpleno.com/blog/dica-debug-de-nodejs-no-vs-code/index",
      "title": "Dica: Debug de NodeJS no VS Code",
      "content": "Neste dica, vamos ver como depurar nosso código NodeJS utilizando o VS Code.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/7YJxKgflboE\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), i[nscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre se e-mail para não perder as novidades. Deixe suas sugestões e dúvidas nos comentários. Abraços!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "neste",
        "dica"
      ],
      "metadata": {
        "title": "Dica: Debug de NodeJS no VS Code",
        "date": "2017-03-22",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Debugs.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-debug-de-nodejs-no-vs-code/index.md"
      }
    },
    {
      "id": "7bfa59ecd36cd053",
      "url": "https://devpleno.com/integridade",
      "title": "Mantenha sua Integridade - Dica de carreira DevPleno - DevPleno",
      "content": "Carreira\n\n## Mantenha sua Integridade - Dica de carreira DevPleno\n\nT\nPor Tulio Faria • 26 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nVocê sabe o que é integridade?\n\nNa faculdade, eu tinha um professor que, pra mim, era um exemplo de integridade e honestidade. No último ano, eu estava fazendo meu TCC e uma parte seria corrigida por esse professor. Enviei meu trabalho por e-mail, porém sem essa parte que seria corrigida por ele, já não tive tempo de fazer. Quando recebeu, ele me respondeu o e-mail perguntando se eu havia esquecido de anexar alguma parte, pois estava incompleto.\n\nNesse momento, uma voz na minha cabeça ficava me dizendo para usar essa brecha e enviar depois que estivesse tudo certo, mas o detalhe é que existe algo que eu acredito cada vez mais e sempre fui criado com essa mentalidade, e naquele momento eu pensei “nossa, por que eu vou enganá-lo se eu construí minha vida baseado em verdades?” (ainda mais com um professor que é muito honesto). Acabei explicando a ele o que realmente tinha ocorrido.\n\nQuando você é íntegro, você acaba impactando outras pessoas, esse professor sempre foi íntegro comigo então no momento em que tive alguma chance de não ser com ele, eu pensei muito nisso. Imagine o efeito cascata que isso tem, a integridade gera integridade, assim como generosidade gera generosidade. A dica de carreira de hoje é: SEJA ÍNTEGRO, afinal você tem que proteger seu nome, pois ele é sua carreira.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Mantenha%20sua%20Integridade%20-%20Dica%20de%20carreira%20DevPleno&url=https%3A%2F%2Fdevpleno.com%2Fintegridade) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fintegridade)",
      "description": "Você sabe o que é integridade? Na faculdade, eu tinha um professor que, pra mim, era um exemplo de integridade e honestidade. No último ano, eu estava faze...",
      "keywords": [
        "carreira",
        "https",
        "integridade",
        "professor",
        "devpleno",
        "parte",
        "mail",
        "essa",
        "momento",
        "ntegro"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/integridade"
      }
    },
    {
      "id": "7c07d390ceed3ea4",
      "url": "https://devpleno.com/morro-de-vontade",
      "title": "Morro de vontade... - DevPleno",
      "content": "Carreira\n\n## Morro de vontade...\n\nT\nPor Tulio Faria • 1 de agosto de 2016\n\n[Carreira](/tag/carreira)\n\nVocê sempre morre de vontade de aprender alguma tecnologia ou algo novo? Saiba que isso na área de tecnologia da informação não é muito desculpa…\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Morro%20de%20vontade...&url=https%3A%2F%2Fdevpleno.com%2Fmorro-de-vontade) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmorro-de-vontade)",
      "description": "Você sempre morre de vontade de aprender alguma tecnologia ou algo novo? Saiba que isso na área de tecnologia da informação não é muito desculpa.... Confir...",
      "keywords": [
        "https",
        "vontade",
        "carreira",
        "morro",
        "tecnologia",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fmorro",
        "2016"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/morro-de-vontade"
      }
    },
    {
      "id": "7c0db7a0e44416bd",
      "url": "https://devpleno.com/generators-o-que-ha-por-baixo-dos-panos",
      "title": "Generators: O que há &quot;por baixo dos panos&quot; - DevPleno (Part 1)",
      "content": "Javascript\n\n## Generators: O que há \"por baixo dos panos\"\n\nT\nPor Tulio Faria • 8 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nNeste post, continuo falando sobre Generatiors em javaScript e como funciona ‘por baixo dos panos’.\n\n**O que é um Generator?**\n\nÉ uma função que podemos pausar (ou iteravel). A primeira coisa que temos que saber é que a sintaxe do generator é criada com um function e um asterisco, com isso é possível pausar esta função. Se for utilizado com CO, por exemplo, é possível transforma-la em uma função mais linear.\n\nPrimeiro vamos criar uma function generator e em seguida criar uma variavel denominada gen e chamar um generator.\n\nfunction* generator() {\nconsole.log('entrou no generator')\n}\nconst gen = generator()\nPercebam que nada aconteceu, por isso eu gosto de dizer que ela é iteravel, pois precisamos iterar sobre ele para que a gente consiga ter um valor e comece a executar.\n\n**Como fazemos isso?**\n\nPrecisamos criar um const = iteration no código.\n\nLembrando que o next é bastante comum em outras linguagens como java que existe algumas estruturas que são iteraveis (no Java, Iterator). Enquanto você conseguir ter um .next significa que você ainda tem dados para iterar.\n\nfunction* generator() {\nconsole.log('entrou no generator')\nconsole.log('segundo passo')\nconsole.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\nCom isso é possível entrar no Generator. Perceba que ele executou tudo de uma vez. Agora vamos fazer da seguinte forma:\n\nfunction* generator() {\nconsole.log('entrou no generator')\nconsole.log('segundo passo')\nyield 'outro valor'\nconsole.log('penultimo')\nconsole.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\nAo testar o código, note que ele parou em ‘segundo passo’. Se dermos um console.log(iteration) ele irá retornar um value: ‘outro valor’ e um done: false, ou seja, é uma função que além de iteravel conseguimos ter vários retornos de valor.",
      "description": "Neste post, continuo falando sobre Generatiors em javaScript e como funciona ",
      "keywords": [
        "generator",
        "console",
        "const",
        "function",
        "next",
        "iteration",
        "valor",
        "https",
        "isso",
        "entrou"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/generators-o-que-ha-por-baixo-dos-panos"
      }
    },
    {
      "id": "7c5a57d86f05d84a",
      "url": "https://devpleno.com/eu-ja-sei-carreira",
      "title": "Eu já sei! Evite uma mentalidade que não te deixa evoluir - DevPleno",
      "content": "Carreira\n\n## Eu já sei! Evite uma mentalidade que não te deixa evoluir\n\nT\nPor Tulio Faria • 30 de julho de 2016\n\n[Carreira](/tag/carreira)\n\nEvite uma mentalidade que não te deixa evoluir e aprender sempre.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Eu%20j%C3%A1%20sei!%20Evite%20uma%20mentalidade%20que%20n%C3%A3o%20te%20deixa%20evoluir&url=https%3A%2F%2Fdevpleno.com%2Feu-ja-sei-carreira) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Feu-ja-sei-carreira)",
      "description": "Evite uma mentalidade que não te deixa evoluir e aprender sempre. Confira o video: <div className=&#34;embedresponsive embedresponsive16by9&#34;   <iframe classNam...",
      "keywords": [
        "https",
        "carreira",
        "evite",
        "mentalidade",
        "deixa",
        "evoluir",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/eu-ja-sei-carreira"
      }
    },
    {
      "id": "7c6690729409338e",
      "url": "https://devpleno.com/render-condicional-em-reactjs",
      "title": "Render condicional em ReactJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Render condicional em ReactJS\n\nT\nPor Tulio Faria • 25 de janeiro de 2017\n\n*\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nDurante a criação de componentes em ReactJS é muito comum que dado um estado do componente, renderizarmos uma estrutura ou outra. Para fazermos isso no ReactJS/JSX temos algumas alternativas.\n\n## Primeira maneira: utilizando if´s\n\nJSX é basicamente um Javascript disfarçado de HTML (sim, apenas para facilitar a criação de templates). Então, podemos utilizar JS para renderizar ou não um treco de template.\n\nimport React, { Component } from 'react'\n\nclass CondComIf extends Component {\nrender() {\nif (this.props.condicao) {\nreturn &#x3C;p>Condicao é verdadeira&#x3C;/p>\n}\nreturn &#x3C;p>Condicao é falsa&#x3C;/p>\n}\n}\n\n// para renderizarmos este componente\n// &#x3C;CondComIf condicao={true} />\n**Importante:** sempre o método render precisa retornar algo e que este algo seja apenas uma tag.\n\n## Segunda maneira: condicional com operador lógico\n\nEste formato utiliza a precedência de operadores para funcionar como uma condicional. Por exemplo, se fizermos isso:\n\na === 10 &#x26;&#x26; b === 20\nTemos uma característica interessante. Caso a===10 retorne falso, na grande maioria das linguagens (por termos um &#x26;&#x26;) não ira nem executar a comparação de b===20.\n\nIsso nos permite fazer o seguinte:\n\nconst a = 10\nconst b = 20\n\na===b &#x26;&#x26; console.log('A eh igual a B)\nClaro que neste exemplo, nunca o console.log será executado, mas creio que fez sentido para você.\n\nUtilizando a mesma ideia, podemos fazer o seguinte:\n\nimport React, { Component } from 'react'\n\nclass CondComOp extends Component {\nrender() {\nreturn (\n&#x3C;p>\n&#x3C;h2>Vamos fazer o condicional: &#x3C;/h2>\n{this.props.condicao &#x26;&#x26; &#x3C;span>Condicao é verdadeira&#x3C;/span>}\n{!this.props.condicao &#x26;&#x26; &#x3C;span>Condicao é falsa&#x3C;/span>}\n&#x3C;/p>\n)\n}\n}",
      "description": "Durante a criação de componentes em ReactJS é muito comum que dado um estado do componente, renderizarmos uma estrutura ou outra. Para fazermos isso no Rea...",
      "keywords": [
        "para",
        "condicao",
        "reactjs",
        "render",
        "condicional",
        "https",
        "este",
        "span",
        "javascript",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/render-condicional-em-reactjs"
      }
    },
    {
      "id": "7c7c150bc471d550",
      "url": "https://devpleno.com/tag/carreira/5",
      "title": "Carreira - Pagina 5 - DevPleno",
      "content": "Carreira\n\n## Arquivo de Insights\n\n93 posts encontrados com a tag Carreira\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 24 de jul. de 2017 Metodologia ágil: entenda o que é e como se aplica para programadores!](/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores)\n\n[Carreira 19 de jul. de 2017 Como fazer anotações em eventos](/anotacoes-em-eventos)\n\n[Carreira 19 de jul. de 2017 Comprometimento com as suas metas](/comprometimento-com-suas-metas)\n\n[Carreira 19 de jul. de 2017 Participação em Eventos e Comunidades](/participacao-em-eventos-e-comunidades)\n\n[Carreira 18 de jul. de 2017 Estudar 1 hora por dia ou 8 horas no sábado?](/estudar-1-hora-por-dia-ou-8-horas-no-sabado)\n\n[Carreira 18 de jul. de 2017 Pensamentos limitantes](/pensamentos-limitantes)\n\n[Carreira 14 de jul. de 2017 8 dicas de organização para freelancers se darem bem na carreira](/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira)\n\n[Carreira 13 de jul. de 2017 Ensino Formal ou Cursos Livres - Por qual optar?](/ensino-formal-ou-cursos-livres)\n\n[Carreira 12 de jul. de 2017 Aprenda a aprender](/aprenda-a-aprender)\n\n[Carreira 11 de jul. de 2017 Porque você não deve abaixar a guarda](/abaixar-a-guarda)\n\n[Carreira 7 de jul. de 2017 Aprenda a dizer NÃO!](/aprenda-a-dizer-nao)\n\n[Carreira 7 de jul. de 2017 Entenda a importância de cursos para desenvolvedores](/entenda-a-importancia-de-cursos-para-desenvolvedores)\n\n[Anterior](/tag/carreira/4)5 / 8[Próxima](/tag/carreira/6)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "2017",
        "para",
        "entenda",
        "eventos",
        "cursos",
        "aprenda",
        "como",
        "algoritmos",
        "ferramentas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/carreira/5"
      }
    },
    {
      "id": "7c97eb320be12a84",
      "url": "https://devpleno.com/blog/desenvolvedor-full-stack-o-que-e-e-como-se-tornar/index",
      "title": "Desenvolvedor Full Stack: o que é e como se tornar? (Part 1)",
      "content": "Cada vez mais a figura do desenvolvedor Full Stack ganha espaço em empresas de TI e desenvolvimento de software. Esse perfil profissional que combina as habilidades de front end e back end é cada vez mais procurado porque, além de poder cobrir qualquer espaço em um time de desenvolvimento, ele é capaz de enxergar o processo de produção como um todo. Se tornar um desenvolvedor Full Stack pode parecer um desafio tão grande que às vezes é até desencorajador: se já não é fácil ser um dev front-end ou back-end, dominar as duas camadas então seria impossível. Mas na verdade, ter visão holística do Full Stack não é tão complicado quanto parece: neste artigo, vamos explicar melhor o que é um dev Full Stack e o que é preciso fazer para se tornar um deles. Boa leitura!\n\n## O que é um desenvolvedor Full Stack?\n\nEm algumas empresas ainda é muito usual dividir os desenvolvedores de softwares em duas categorias: os especialistas em front-end, que lidam com interfaces e a experiência do usuário e os de back end que trabalham com a camada mais profunda do código, além de outras tarefas como as integrações com bancos de dados. Só que essa especialização intensa começou a ser problemática em alguns casos, porque como os devs eram muito especializados nas funções específicas dos seus times, faltava alguém capaz de enxergar toda a produção como algo único e integrar melhor essas duas camadas do desenvolvimento. E é aí que entra o desenvolvedor Full Stack: um profissional capaz de trabalhar tanto no front-end quanto no back-end, com uma visão holística do processo. Esse perfil profissional é útil tanto em organizações que não dividem os times de forma tão direta quanto em empresas mais modernas, que esperam dos seus colaboradores um conjunto de competências variadas e versatilidade.\n\n## Como se tornar um desenvolvedor Full Stack?",
      "keywords": [
        "full",
        "stack",
        "desenvolvedor",
        "como",
        "front",
        "back",
        "para",
        "profissional",
        "tornar",
        "mais"
      ],
      "metadata": {
        "title": "Desenvolvedor Full Stack: o que é e como se tornar?",
        "date": "2017-06-07",
        "tags": "['Carreira']",
        "thumbnail": "95467-desenvolvedor-full-stack-o-que-e-e-como-se-tornar-atencao-redator-entregar-ate-18h-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/desenvolvedor-full-stack-o-que-e-e-como-se-tornar/index.md"
      }
    },
    {
      "id": "7d11df72baa07826",
      "url": "https://devpleno.com/blog/claude-code-describe-session/index",
      "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos (Part 3)",
      "content": "### Preciso usar algum comando específico?\n\nVocê pode simplesmente pedir em linguagem natural para o Claude descrever a sessão atual. Use instruções claras sobre para quem é a descrição (outro agente, outro projeto, outro modelo) para obter o melhor resultado.\n\n### Funciona com outros modelos além do Claude?\n\nSim. Como o output é texto estruturado, você pode usar a descrição gerada como prompt para qualquer outro modelo ou ferramenta de IA.\n\n### Qual a diferença entre describe session e os arquivos CLAUDE.md?\n\nOs arquivos CLAUDE.md são instruções persistentes que você escreve manualmente para dar contexto ao Claude em todas as sessões de um projeto. O describe session é uma descrição gerada sob demanda do estado atual de uma sessão específica — útil para passagens pontuais de contexto.",
      "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
      "keywords": [
        "claude",
        "para",
        "sess",
        "como",
        "session",
        "describe",
        "contexto",
        "projeto",
        "outro",
        "descri"
      ],
      "metadata": {
        "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos",
        "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
        "date": "2026-04-05",
        "tags": "['Ferramentas']",
        "thumbnail": "feature-image.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/claude-code-describe-session/index.md"
      }
    },
    {
      "id": "7d49d4391c458bd8",
      "url": "https://devpleno.com/webaudioapi",
      "title": "WebAudioAPI - Gerando um som no browser - DevPleno (Part 1)",
      "content": "Javascript\n\n## WebAudioAPI - Gerando um som no browser\n\nT\nPor Tulio Faria • 17 de outubro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje eu quero falar um pouco sobre WebAudioAPI e como podemos gerar sons dinamicamente no browser. Vamos começar fazendo uma função que toca um som e depois vamos fazer uma variação do formato de onda. Todo som que eu quiser reproduzir aqui eu preciso de um contexto de áudio. Eu consigo trazer ele de duas formas: utilizando o áudio contexto ou nos browser de webkit, webkit audiocontext:\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;tittle>WebAudioAPI&#x3C;/tittle>\n&#x3C;/head>\n&#x3C;body>\n&#x3C;script>\nconst contexto = (window.AudioContext || window.webkitAudioContext)\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nAgora, com o contexto pronto, precisamos criar um oscilador, que é uma forma de gerar essa onda dinâmica:\n\nconst osc = contexto.createOscillator()\nCom isso conseguimos começar a brincar com o oscilador, por exemplo:\n\nosc.type = 'sine'\n\nosc.frequency.value = 440\nNo exemplo, colocamos ele em uma frequência de 440 hertz e agora vamos linkar com o destino do contexto e iniciar o oscilador e depois pedimos para ele pausar depois de dois segundos:\n\nosc.connect(context.destination)\n\nosc.start()\n\nosc.stop(contexto.currentTime + 2)\nAo rodar por dois segundos, ele emitirá um som. Agora vamos criar um select, dentro dele podemos variar o tipo de onda:\n\n&#x3C;select id=”type” onchange=”play()”>\n&#x3C;option>-&#x3C;/option>\n&#x3C;option value=”sine”>Sine&#x3C;/option>\n&#x3C;option value=”square”>Square&#x3C;/option>\n&#x3C;option value=”sawtooth”> Sawtooth &#x3C;/option>\n&#x3C;option value=”triangle”> Triangle &#x3C;/option>\n&#x3C;/select>\nAgora, dentro de script, colocaremos uma function play:\n\n&#x3C;script>",
      "description": "Hoje eu quero falar um pouco sobre WebAudioAPI e como podemos gerar sons dinamicamente no browser. Vamos começar fazendo uma função que toca um som e depoi...",
      "keywords": [
        "contexto",
        "option",
        "value",
        "https",
        "script",
        "webaudioapi",
        "vamos",
        "udio",
        "const",
        "window"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/webaudioapi"
      }
    },
    {
      "id": "7d790ddaf3512f96",
      "url": "https://devpleno.com/fsm-inscricao",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsm-inscricao to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "inscricao"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsm-inscricao"
      }
    },
    {
      "id": "7d92a70e01ca7228",
      "url": "https://devpleno.com/blog/async/index",
      "title": "Async - Como Controlar Operações Assíncronas (Part 2)",
      "content": "callback(null)\n  })\n})\n```\n\nAgora garantimos que ele vai abrir um após o outro.\n\nO async é muito bom para fazermos esse tipo de processamento, por exemplo, podemos fazer uma busca no banco, retornar uma sequência de registros e fazer um outro processamento com esse resultado de forma assíncrona.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Hllw7QKsJac\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "async",
        "arquivos",
        "arquivo",
        "esse",
        "callback",
        "para",
        "outro",
        "processamento",
        "fazer",
        "function"
      ],
      "metadata": {
        "title": "Async - Como Controlar Operações Assíncronas",
        "date": "2017-07-30",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ASYNC-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/async/index.md"
      }
    },
    {
      "id": "7df8aab1e9fb2c69",
      "url": "https://devpleno.com/precificacao-de-softwares-voce-sabe-como-fazer",
      "title": "Precificação de softwares: você sabe como fazer? - DevPleno (Part 4)",
      "content": "Se você recebe por Paypal, por exemplo, é preciso acrescentar as taxas e porcentagem cobrados pelo serviço nas transferências. O mesmo vale na hora de receber por transferências bancárias, como DOCs ou TEDs.\n\n### Os impostos\n\nNão se esqueça de incluir no seu preço uma porcentagem a mais para pagar impostos que podem variar de 7,5% a 27,5% dependendo da quantia envolvida. Isso é ainda mais importante para quem possui uma empresa, pois há diferentes tributos.\n\n## Como explicar o valor do software para o cliente?\n\nA precificação de software precisa, antes de mais nada, ser justa e, mais do que isso, ser entendida como justa pelo cliente. Caso contrário, será difícil você obter consumidores dispostos a pagar pelo valor cobrado, pois dificilmente terão noção de todos os recursos e habilidades empregadas no desenvolvimento do programa.\n\nÉ preciso também esclarecer qual o valor que o software terá para o consumidor, o que é diferente de preço. Esse se baseia em dados “palpáveis”, podendo ser quantificado com base nos recursos empregados num produto. Já o valor tem a ver com algo subjetivo, variando de indivíduo para indivíduo. Dependendo da necessidade da pessoa, seu software poderá ter menor ou maior valor.\n\nTambém é importante literalmente abrir o jogo com o cliente, sendo honesto e apresentando as razões reais da quantia cobrada pelo programa. Para isso, fale sobre:\n\n-\nos preços praticados pelo mercado;\n\n-\nos gastos com mão de obra não só sua, mas de outros profissionais caso tenha sido preciso contratá-los;\n\n-\na experiência necessária para o desenvolvimento do software;\n\n-\no tempo de trabalho exigido, especialmente se foi necessário trabalhar em feriados e fins de semana, até mesmo de noite;\n\n-\no grau de complexidade do programa e os [estudos sobre tecnologia](https://www.devpleno.com/como-organizar-os-estudos-em-tecnologia?utm_source=blog&#x26;utm_campaign=rc_blogpost) necessários etc.\n\n## Qual a diferença entre precificação de softwares e de outros tipos de produto?",
      "description": "Um dos desafios de quem trabalha na área de tecnologia, especificamente em desenvolvimento de programas, é a precificação de softwares. Por envolver ativos...",
      "keywords": [
        "para",
        "como",
        "software",
        "valor",
        "mais",
        "ncia",
        "hora",
        "tamb",
        "seus",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/precificacao-de-softwares-voce-sabe-como-fazer"
      }
    },
    {
      "id": "7e1e2ce4c21b378b",
      "url": "https://devpleno.com/blog/socket-io-parte1/index",
      "title": "Comunicação em tempo-real com Node e Socket.io (Part 3)",
      "content": "Perceba que o módulo já descobriu qual a melhor forma de se conectar, no caso websocket, o interessante é que, se caso a conexão pare ao voltar, ele irá se reconectar sozinho, então não precisamos nos preocupar se o usuário está conectado ou não, pois tratamos na interface a medida que novas conexões vão surgindo. A única preocupação que temos é de checar se o estado da conexão que o usuário deixou continua valendo.\n\nCada socket que temos é gerado um ID da conexão para cada usuário, vamos escrever o ID para saber qual é:\n\n```jsx\nio.on('connection', (socket) => {\n  console.log('New connection', socket.id)\n})\n```\n\n**Conclusão**\n\nJá deu para termos uma ideia do que é o Socket.io, e este é um assunto que rende muito conteúdo, pois é muito extenso, temos vários desafios para fazê-lo funcionar bem, mas agora já temos uma base de como ele funciona.\n\nEm breve tem a parte 2 deste hands-on.\n\nEnquanto isso confira o também o vídeo dessa primeira parte:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/qZUDuBcbJ9A\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "socket",
        "para",
        "http",
        "const",
        "require",
        "vamos",
        "html",
        "express",
        "temos",
        "conex"
      ],
      "metadata": {
        "title": "Comunicação em tempo-real com Node e Socket.io",
        "date": "2017-05-11",
        "tags": "['Javascript']",
        "thumbnail": "Socket.IO1.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/socket-io-parte1/index.md"
      }
    },
    {
      "id": "7e7aae98c983a6d5",
      "url": "https://devpleno.com/blog/algoritmos-cyclic-rotation/index",
      "title": "Algoritmos: Cyclic Rotation",
      "content": "Este é mais um vídeo da série algoritmos, na qual explico sobre algoritmos que frequentemente caem em entrevistas de emprego e competições de programação. Desta vez, comento sobre o Cyclic Rotation.\n\n## Confira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/qzurtPlVjFc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "https",
        "algoritmos",
        "sobre",
        "responsive",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "este"
      ],
      "metadata": {
        "title": "Algoritmos: Cyclic Rotation",
        "date": "2017-03-14",
        "thumbnail": "ALG.-Ponteiros-CYCLIC-790x400.png",
        "author": "Tulio Faria",
        "tags": "['Algoritmos']",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/algoritmos-cyclic-rotation/index.md"
      }
    },
    {
      "id": "7e97ac5548910343",
      "url": "https://devpleno.com/como-receber-de-empresas-estrangeiras",
      "title": "Impostos e como receber de empresas estrangeiras - DevPleno (Part 3)",
      "content": "Nessa opção então não vamos pagar os 27,5% de imposto, mas em compensação temos que emitir uma nota fiscal para uma empresa do exterior como pessoa jurídica. A unica diferença é que quando ela está no exterior, ela não tem CNPJ. Feito isso, a transferência vai para a conta corrente da pessoa jurídica. No caso do Simples Nacional, eles vão mandar uma DARF só por mês, já coletando esse imposto. Caso você não for enquadrado como Super Simples, provavelmente você vai receber umas quatro ou cinco guias.\n\nO interessante é que, como a nota fiscal pode ser emitida para uma empresa que não tem CNPJ, o que eu declaro geralmente são alguns serviços que estão dentro da área, mas que são incluídos no Simples Nacional. (Lembrando que é importante conversar com seu contador para fazer um planejamento tributário para que você pague menos impostos).\n\nObviamente se você colocar que seu Pró-labore é de R$8mil por mês, você irá pagar mais alguns impostos.\n\n**O que é Pró-labore?**\n\nSeria mais ou menos o mesmo que a sua empresa te contratar para trabalhar para ela; essa empresa que você usa para receber vai te pagar um salário.\n\nOs contadores geralmente já indicam fazer o seguinte: colocar um Pró-labore de um salário mínimo, depois vai pegar o restante e colocar como retirada de lucro. A retirada de lucro não tem impostos, então quando você vai declarar esse dinheiro no seu imposto de renda de pessoa física, vai ter um campo que você vai declarar o quanto de retirada de lucro teve.\n\n**Por que estamos falando de tudo isso?**\n\nPorque não adianta nada você receber R$100mil do exterior e não declarar. Imagine que você vai lá e compra um carro, então você não vai ter renda nenhuma declarada na receita, então eles virão atrás.\n\nObviamente pode ser que no primeiro ano passe, o segundo passe, mas depois de um tempo eles vão achar você e descobrir o que está acontecendo.",
      "description": "Você sabe como receber de empresas estrangeiras (Toptal, Crossover, Scalable Path e outras)? Cada empresa dessa tem a possibilidade de enviar o dinheiro de...",
      "keywords": [
        "para",
        "esse",
        "como",
        "receber",
        "empresa",
        "dinheiro",
        "https",
        "pessoa",
        "isso",
        "pagar"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/como-receber-de-empresas-estrangeiras"
      }
    },
    {
      "id": "7ec2f298b6a1dfb9",
      "url": "https://devpleno.com/blog/seja-o-motorista-da-sua-vida/index",
      "title": "Você é passageiro ou motorista da sua vida? (Part 1)",
      "content": "Você é passageiro ou motorista da sua vida? Eu vou contar uma história para vocês e acho que faz bastante sentido pelo momento que passei.\n\nEu estava no embalo de deixar as coisas me levarem. Estava trabalhando, mas com algo que eu não gostava, fazia coisas muito repetidas e projetos que não achava interessantes, já não tinha mais propósito naquilo e, consequentemente, a qualidade começou a cair. A decisão de mudança ocorreu no ano passado, mas Isso vinha me incomodando há pelo menos três anos.\n\nQuando você passa por uma situação como essa e passa a refletir sobre isso, percebe que precisa mudar, cai a ficha de que você não é mais o motorista da sua vida, afinal não está mais conduzindo para onde você quer chegar, logo você é um passageiro.\n\nUma coisa que venho aplicando desde o ano passado é criar as próprias oportunidades. Por exemplo, se você quer trabalhar fora do Brasil, não adianta continuar mandando CV aqui, não vai surgir uma oportunidade para fora do nada _(na verdade, para mim aconteceu porque eu conhecia uma pessoa e fui indicado, mas é raro)_. Tem coisas que são tão simples que basta você começar a refletir sobre o que quer para realmente tomar as rédeas e voltar a ser o motorista da sua vida.\n\nMude um pouco sua percepção! É o que venho fazendo e faz muito sentido, pelo menos para mim. Depois que eu destravei, percebi que trabalhar para fora era algo que eu queria fazer, então comecei a distribuir currículo e fazer mais contatos nesse sentido e hoje eu atuo lá fora também.\n\nQuando você toma as rédeas da sua vida, começa a dar os passos na direção certa. Eu comecei a fazer isso em tudo, se você quer chegar em algum lugar sem depender de fatores de sorte e etc, comece a ser mais motorista.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/o0VuFJPKZnU\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "para",
        "mais",
        "motorista",
        "vida",
        "quer",
        "fora",
        "embed",
        "sentido",
        "pelo",
        "coisas"
      ],
      "metadata": {
        "title": "Você é passageiro ou motorista da sua vida?",
        "date": "2017-08-09",
        "tags": "['Carreira']",
        "thumbnail": "MotoristaDaVida.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/seja-o-motorista-da-sua-vida/index.md"
      }
    },
    {
      "id": "7ec854f6f1225445",
      "url": "https://devpleno.com/servir-arquivos-e-expor-servidor",
      "title": "Como servir arquivos e expor servidor local com HTTPS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Como servir arquivos e expor servidor local com HTTPS\n\nT\nPor Tulio Faria • 26 de junho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNesta dica, vou mostrar como servir arquivos estáticos de forma simples, além disso, como expor um servidor local de testes para a internet e ainda utilizando uma conexão segura (HTTPS).\n\nPressupondo que a gente já tenha o NodeJS e o NPM instalado vamos fazer o seguinte no cmd:\n\nnpm install -g http-server\nEle vai instalar o HTTP server, que é mais ou menos parecido com o APACHE, porém mais simples porque podemos servir qualquer pasta, geralmente de forma temporária e não startado como serviço.\n\nEntão vamos lá. Já estou na minha pasta, na qual tenho o HTML, e vou colocar:\n\nhttp - server\nEle me mostra alguns endereços, disponibilizando para um servidor e ouve as placas de rede.\n\nVamos pegar o primeiro, abrir uma aba nova no browser e mandar rodar. A partir daí, estamos acessando via um servidor. Algumas API’s do JavaScript e HTML eu já conseguiria acessar por estar no servidor, mas algumas delas eu preciso estar em uma conexão segura para esse endereço, e como faço isso?\n\nUma das maneiras que eu acho interessante é usando uma ferramenta chamada [ngrok](https://ngrok.com/download). É um arquivo zip com um .exe dentro. Podemos colocar ele dentro de uma pasta e colocar a pasta no path. No meu caso, sempre coloco ele na área de trabalho, abro outro CMD e faço:\n\nngrok http 8080\n8080 representa a porta que estamos utilizando. Com isso, ele libera dois endereços, um https e um http, abrindo um túnel pela internet.\n\nSe copiarmos o endereço https e colar no browser, a conexão para o mesmo arquivo vai ser com https, assim podemos testar muito mais coisas da API do HTML5.\n\nUma vantagem do ngrok é que como ele é um túnel, o endereço vai estar disponível na internet, logo você pode enviar esse endereço para seu cliente por exemplo, que vai acessar normalmente.",
      "description": "Nesta dica, vou mostrar como servir arquivos estáticos de forma simples, além disso, como expor um servidor local de testes para a internet e ainda utiliza...",
      "keywords": [
        "https",
        "servidor",
        "para",
        "endere",
        "como",
        "ngrok",
        "vamos",
        "http",
        "webhook",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/servir-arquivos-e-expor-servidor"
      }
    },
    {
      "id": "7eccf7abd9eef72e",
      "url": "https://devpleno.com/minicurso-socket-io-parte-4",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms - DevPleno (Part 5)",
      "content": "socke.on('supporters', function (supporters) {\nconsole.log(supporters)\n$('.bar-team-a').css('width', supporters.teamA + '%')\n$('.bar-team-b').css('width', supporters.teamB + '%')\n})\nPerceba que as atualizações de jogo 1 não chegam em jogo 2, isso significa que já estamos filtrando o que vai chegar em cada um dos jogos.\n\nAgora precisamos fazer a atualização dos vídeos e do lance a lance.\n\nSe abrir o match, você vai perceber que temos vários formulários, como atualizar placar, embaixo temos um formulário de novo lance e por último o vídeo. Vamos começar pelo vídeo, mas os dois são a mesma coisa,",
      "description": "Nesta etapa do nosso minicurso de Socket.IO, vamos fazer as atualizações específicas de cada jogo. Primeiro vamos fazer o gráfico da torcida se movimentar....",
      "keywords": [
        "match",
        "supporters",
        "team",
        "para",
        "porcentagem",
        "const",
        "socket",
        "vamos",
        "torcida",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-4"
      }
    },
    {
      "id": "7f05c4363dd051b5",
      "url": "https://devpleno.com/o-que-e-o-app-use-no-nodejsexpressjs",
      "title": "O que é o app.use no NodeJS/ExpressJS? - DevPleno (Part 2)",
      "content": "app.listen(3001, function () {\nconsole.log('Example app listening on port 3000!')\n})\nQuando fizermos uma requisição para /, passaremos pelos 2 primeiros middlewares mas não pelo terceiro. O res.send (que envia a resposta ao browser) encerra a pilha de execução.\n\nJá quando executamos qualquer outra url diferente de /, o terceiro middleware é executado. E como ele não tem next(), ele não deixa nada abaixo dele ser executado. Ou seja, neste exemplo, ele está ocultando a última rota.\n\n**Aplicando um middleware a um conjunto de URLs específicas**\n\nVeja o seguinte exemplo:\n\nconst express = require('express')\nconst app = express()\n\napp.use(function (req, res, next) {\nconsole.log('middleware 1')\nnext()\n})\napp.use(function (req, res, next) {\nconsole.log('middleware 2')\nnext()\n})\napp.get('/', function (req, res) {\nconsole.log('requisição')\nres.send('Requisição!')\n})\n\napp.use('/admin', function (req, res, next) {\nconsole.log('checar se tem permissao')\nnext()\n})\napp.get('/admin', function (req, res) {\nconsole.log('requisição admin')\nres.send('Requisição admin!')\n})\napp.get('/admin/teste', function (req, res) {\nconsole.log('requisição admin')\nres.send('Requisição admin!')\n})\n\napp.use(function (req, res, next) {\nres.send('nada encontrado')\n})\napp.get('/url', function (req, res) {\nconsole.log('requisição')\nres.send('Requisição!')\n})\n\napp.listen(3001, function () {\nconsole.log('Example app listening on port 3000!')\n})\nRepare que adicionamos um middleware passando uma URL base. Nestes casos, apenas se a URL iniciar, no exemplo, por /admin, o middleware será executado. Isso também é muito útil para autenticação e autorização.\n\n## Veja este material em vídeo\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Entenda o que é o app.use no Express.js, como funciona o sistema de middlewares e como usá-lo para organizar sua aplicação Node.js.",
      "keywords": [
        "function",
        "requisi",
        "next",
        "console",
        "middleware",
        "express",
        "send",
        "admin",
        "const",
        "https"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/o-que-e-o-app-use-no-nodejsexpressjs"
      }
    },
    {
      "id": "7f0ca8d705b6c71c",
      "url": "https://devpleno.com/blog/modulo-co/index",
      "title": "Módulo Co - Organize o fluxo de seu código assíncrono (Part 3)",
      "content": "Agora colocamos o yield para baixo e ele está esperando uma lista de promises para serem resolvidas, já o contents é um vetor com todas as respostas dessas promises. Isso é muito legal quando você for fazer um script que precisava mover arquivo, movendo diretório, fazendo coisas recursivas, etc. Com o generator e ajuda do CO fica muito mais fácil de entender o processo.\n\nAgora entenda melhor sobre [Generators Functions e tudo que acontece \"por baixo dos panos\".](https://www.devpleno.com/generators-functions/)\n\nConfira o Hands-on em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/IXsxtIZuY90\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "function",
        "readfile",
        "file",
        "data",
        "fazer",
        "digo",
        "const",
        "contents",
        "generator",
        "yarn"
      ],
      "metadata": {
        "title": "Módulo Co - Organize o fluxo de seu código assíncrono",
        "date": "2017-07-29",
        "tags": "['Javascript']",
        "thumbnail": "CO.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/modulo-co/index.md"
      }
    },
    {
      "id": "7f270de48805aab2",
      "url": "https://devpleno.com/blog/injecao-de-dependencia-em-reactjs/index",
      "title": "Injeção de Dependência em ReactJS (Part 2)",
      "content": "Como o index monta a aplicação React no HTML, vou trazer o axios. Podemos fazer uma lista de dependências para injetar no componente.\n\nQual a diferença?\n\nAo invés de utilizar o axios direto, vou passar essa dependência via props:\n\n```jsx\nReactDOM.render(\n    <App  axios={axios}/>\n    document.getElementById('root')\n)\n```\n\nO App vai ter acesso a propriedade axios, que é o que eu importei.\n\nPodemos, então, ir no componente em si e fazer o seguinte:\n\n```jsx\ncomponentDiMount(){\n    const url = 'https://httpbin.org/ip'\n    this.props.axios.get(url)\n    .then((res)=>{\n        this.setState({\n            ip: res.data.origin\n        })\n    })\n}\n```\n\nE fazemos a requisição normal. Se quiser fazer um teste unitário desse componente, posso fazer tranquilamente porque, quando for renderizar este componente para testar, eu crio um mock ou um axios fake e vejo se esse componente chama o axios falso, da mesma forma que fizemos anteriormente.\n\nO mais importante aqui é lembrarmos que o props é uma forma que temos de injetar dependência, por isso que muitas vezes construímos aplicação com o estado todo da aplicação em um app e passamos as funções para os próximos componentes, assim ele pode ser executado em qualquer ambiente.\n\nEm toda a arquitetura, seja ela em React, em Node, etc, vai ter um lugar com uma cola (ou um ponto de montagem) e eu acredito que estes pontos são interessantes para analisar como potenciais locais de adicionar dependências.\n\nConfira o vídeo-tutorial:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/tQ80uAP_B_M\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "axios",
        "react",
        "import",
        "from",
        "componente",
        "para",
        "depend",
        "fazer",
        "https",
        "podemos"
      ],
      "metadata": {
        "title": "Injeção de Dependência em ReactJS",
        "date": "2017-06-05",
        "tags": "['Javascript']",
        "thumbnail": "InjecaoDependencia.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/injecao-de-dependencia-em-reactjs/index.md"
      }
    },
    {
      "id": "7f6144fdd2f82e29",
      "url": "https://devpleno.com/blog/salario-em-ti/index",
      "title": "Por que o Salário em TI é baixo? DevPleno Reponde (Part 2)",
      "content": "Então avalie esse tipo de coisa. Você está gerando faturamento ou é só um custo para a empresa? Obviamente, em algumas empresas, você não está diretamente relacionado com a área ou gerando faturamento, mas é bom avaliar nesse sentido que citei acima. Assim, você conseguirá saber se seu salário está baixo ou alto, essa é uma boa métrica.\n\nOutra métrica é saber se você está qualificado. Se você está lendo isso, é porque quer se qualificar, já que está procurando conhecimento, quer melhorar sua carreira e isso me deixa mais tranquilo. Por mais que você sofra essa dor de achar que o salário é baixo, está buscando melhorar sua carreira e isso já é uma boa coisa. Para você ganhar mais, tem que se dedicar à sua carreira. “Seja quente ou seja frio.\" Quem é morno não tem previsão de evoluir. Se quiser destacar na área, faça com garra, com amor, vontade, faça dar resultados, um código limpo com processo cada vez melhor, dê seu sangue, gere ideias, ajude seu chefe, faça tudo. Claro, não precisa deixar de curtir a vida, mas não seja comum.\n\nExiste um treinamento de um grande mentor meu que trabalha mais sobre essa mentalidade.\n\nSe tiver interesse, mande um e-mail para tuliofaria@devpleno.com. Irei te passar o link.\n\nConfira minha fala em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/mw_pfPv-DlE\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "isso",
        "para",
        "mais",
        "baixo",
        "alto",
        "muito",
        "essa",
        "cidade",
        "carreira",
        "ganha"
      ],
      "metadata": {
        "title": "Por que o Salário em TI é baixo? DevPleno Reponde",
        "date": "2017-06-08",
        "tags": "['Carreira']",
        "thumbnail": "SalarioEmTI.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/salario-em-ti/index.md"
      }
    },
    {
      "id": "7f6b5d0d9a2861fe",
      "url": "https://devpleno.com/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web",
      "title": "Servidores Web -  Um pouco mais do back-end de uma Aplicação Web - DevPleno (Part 2)",
      "content": "Hoje temos algumas linguagens que não precisam de servidor WEB como é o caso do NodeJS, pois ele já é um servidor embutido, já consegue abrir uma porta e responder solicitações por si só, e por esse motivo ele acaba sendo um pouco mais rápido e visível.\n\nSempre que for utilizar PHP ou ASP precisa utilizar servidores web, mas em alguns casos, que chamamos servidor de aplicação, ainda existem umas coisas a mais, muito comum no mundo JAVA, mas isso fica para uma próxima vez.\n\nDeixe suas dúvidas e sugestões nos comentários.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Servidores%20Web%20-%20%20Um%20pouco%20mais%20do%20back-end%20de%20uma%20Aplica%C3%A7%C3%A3o%20Web&url=https%3A%2F%2Fdevpleno.com%2Fservidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web)",
      "description": "Servidores Web são um serviço usado no servidor que fornece páginas ou algum asset para o frontend. Dentro de uma máquina, configuramos uma pasta (/site po...",
      "keywords": [
        "para",
        "mais",
        "servidor",
        "apache",
        "https",
        "pouco",
        "servidores",
        "sabe",
        "como",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web"
      }
    },
    {
      "id": "7fc44501183686c7",
      "url": "https://devpleno.com/blog/template-strings/index",
      "title": "ES6 - Template Strings (Part 2)",
      "content": "Perceba que a strings vai ter olá e mundo e o value terá o 10. Ele está entre as strings, por isso o nome interpolação. Com isso podemos criar uma tag em HTML sem grandes problemas. Uma última coisa que conseguimos fazer é checar o valor raw das variáveis apenas adicionando:\n\n```javascript\nconsole.log(strings.raw[0])\n```\n\nEstamos pegando o raw da posição zero neste exemplo. Quando colocamos o raw, ele mostra exatamente como foi definido, então se você colocar um \\\\n, será mostrado realmente o raw disso, o \\\\n.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Ooqm6jUCD6E\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "string",
        "javascript",
        "const",
        "strings",
        "console",
        "https",
        "devpleno",
        "isso",
        "template",
        "podemos"
      ],
      "metadata": {
        "title": "ES6 - Template Strings",
        "date": "2017-05-30",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "TemplateStrings.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/template-strings/index.md"
      }
    },
    {
      "id": "801a23c2e7b64878",
      "url": "https://devpleno.com/blog/reduce/index",
      "title": "High-order Function - Reduce (Part 1)",
      "content": "Hoje vamos continuar falando sobre high order functions, principalmente as que estão disponíveis nos vetores em JavaScript. Vamos falar mais especificamente do Reduce. É muito comum utilizarmos o [Map](https://www.devpleno.com/map/) junto com o Reduce, ele existe em algumas outras formas como no mongoDB que é o map.reduce, uma técnica bastante utilizada para concatenar dados de forma distribuída.\n\nSuponhamos que nossa ideia é ter um carrinho de compras e somar esse carrinho, para isso podemos utilizar o Reduce e passamos uma função que vai ser responsável por reduzir esse vetor em um valor só.\n\nComo fazer isso?\n\nPrimeiramente podemos fazer com uma Arrow Function:\n\n```jsx\nconst carrinho = [\n  { id: 1, preco: 2, qtd: 2 },\n  { id: 1, preco: 3, qtd: 1 }\n]\n\ncarrinho.reduce()\n\nconst total = carrinho.reduce((soma, item) => item.preco + soma, 0)\n\nconsole.log(total)\n```\n\nPerceba que dentro de item e soma retornamos como queremos somar esse valor e ela começa a soma com 0. Podemos fazer de uma forma mais interessante.\n\nVocê se lembra que o MAP transforma de um valor para outro? Então poderíamos fazer o seguinte:\n\n```jsx\nconst carrinho = [\n  { id: 1, preco: 2, qtd: 2 },\n  { id: 1, preco: 3, qtd: 1 }\n]\n\ncarrinho.reduce()\nconst total = carrinho\n  .map((item) => item.preço * item.qtd)\n  .reduce((soma, subtotal) => subtotal + soma, 0)\nconsole.log(total)\n```\n\nCom isso, o Map vai transformar o item em um subtotal e meu Reduce vai somar esses valores transformados. Perceba que são funções bem simples, então é bem tranquilo de testarmos essas funções.\n\nPoderíamos, por exemplo, colocar o item em uma const e passar apenas o subtotal:\n\n```jsx\nconst subtotal = (item) => item.preço * item.qtd\nconst total = carrinho\n  .map(subtotal)\n  .reduce((soma, subtotal) => subtotal + soma, 0)\nconsole.log(total)\n```",
      "keywords": [
        "item",
        "reduce",
        "carrinho",
        "soma",
        "subtotal",
        "const",
        "total",
        "fazer",
        "preco",
        "https"
      ],
      "metadata": {
        "title": "High-order Function - Reduce",
        "date": "2017-06-30",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Reduce.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/reduce/index.md"
      }
    },
    {
      "id": "801ed4b826aafd61",
      "url": "https://devpleno.com/hands-on-faker",
      "title": "Hands-on: Faker - DevPleno",
      "content": "Javascript\n\n## Hands-on: Faker\n\nT\nPor Tulio Faria • 24 de abril de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nVocê já precisou gerar dados fictícios para seus projetos? As chances são que sim, e de forma bem recorrente, né? Neste vídeo, um hands-on do Faker, uma ferramenta que facilita bastante este processo de geração de dados de testes.\n\nConfira o video:\n\nNão esqueça de deixe suas dúvidas e sugestões nos comentários, curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Faker&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-faker) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-faker)",
      "description": "Você já precisou gerar dados fictícios para seus projetos? As chances são que sim, e de forma bem recorrente, né? Neste vídeo, um handson do Faker, uma fer...",
      "keywords": [
        "https",
        "faker",
        "javascript",
        "hands",
        "nodejs",
        "dados",
        "para",
        "este",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-faker"
      }
    },
    {
      "id": "8035d9e9f36dc02f",
      "url": "https://devpleno.com/tag/nodejs",
      "title": "NodeJS - DevPleno",
      "content": "NodeJS\n\n## Arquivo de Insights\n\n58 posts encontrados com a tag NodeJS\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 30 de nov. de 2017 Normalizar-email](/normalizar-email)\n\n[Javascript 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)\n\n[Javascript 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)\n\n[Javascript 17 de out. de 2017 FS-Watch - Checando mudanças em um arquivo-diretório](/fs-watch)\n\n[Javascript 17 de out. de 2017 Grandes quantidades de dados com menos recursos](/grandes-quantidades-de-dados-com-menos-recursos)\n\n[Javascript 22 de set. de 2017 Gerando HTML estáticos a partir de templates – EJS](/html-estatico-com-templates-ejs)\n\n[Javascript 11 de set. de 2017 Dica: Debug NodeJS com Chrome DevTools](/dica-debug-nodejs-com-chrome-devtools)\n\n[Javascript 23 de ago. de 2017 Dotenv e variáveis de ambiente no NodeJS](/dotenv-e-variaveis-de-ambiente)\n\n[Javascript 23 de ago. de 2017 O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express](/morgan)\n\n[Javascript 18 de ago. de 2017 [SEGREDO] Muitos registros do MySQL no NodeJS](/registros-do-mysql-no-nodejs)\n\n[Javascript 14 de ago. de 2017 Cheerio: Uma implementação jQuery para Node](/cheerio)\n\n[Javascript 14 de ago. de 2017 Request - Requisições HTTP de forma rápida e simples](/request)\n\nAnterior\n1 / 5[Próxima](/tag/nodejs/2)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "nodejs",
        "2017",
        "express",
        "arquivo",
        "algoritmos",
        "carreira",
        "ferramentas",
        "fundamentos",
        "reactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/nodejs"
      }
    },
    {
      "id": "807cba9418bb26a5",
      "url": "https://devpleno.com/blog/lista-encadeada-retornar-um-item/index",
      "title": "Lista encadeada - Como retornar um item (Part 1)",
      "content": "Hoje vamos continuar falando sobre algoritmos e também estrutura de dados. Vamos discutir um pouco sobre essas técnicas que aprendemos na base da computação e que é bastante útil tanto para entrevistas de emprego quanto para competições em programação, pois geralmente aplicam esse tipo de teste para saber se você sabe gerenciar uma lista encadeada, por exemplo. Vamos continuar falando sobre [lista encadeada](https://www.devpleno.com/lista-encadeada-adicionar-no/) que é um assunto bastante interessante, nós já fizemos a adição de itens nessa lista, agora vamos criar um método para retornar um item que eu quero.\n\n```jsx\nconst getByIndex = (index) => {\n  if (index < length) {\n  }\n}\n```\n\nPerceba o seguinte, se eu quiser pegar o item 0 e minha lista estiver vazia ou seja, o length for igual a zero, temos que adicionar ao return primeiramente:\n\n```jsx\nreturn {\n  length: () => add(value),\n  print: () => console.log(head),\n  getByIndex: (index) => getByIndex(index)\n}\n```\n\nEm seguida faremos o seguinte:\n\n```jsx\nconst getByIndex = (index) => {\n  if (length === 0) {\n    return null\n  }\n  let node = head\n  let count = 0\n  while (count < index && node.next) {\n    node = node.next\n    count++\n  }\n  return node\n}\n```\n\nTeoricamente, ao retomarmos o node, já temos nosso método. Vamos recapitular o que fizemos: se a minha lista estiver vazia eu retorno null; se não eu pego o primeiro nó e coloco em node, minha contagem está em zero; caso meu count for zero e meu index for zero, ele irá retornar o nó.\n\nVamos fazer o teste:\n\n```jsx\nconsole.log(list.getByIndex(0))\n```\n\nPerceba que o índice zero tem toda a estrutura montada anteriormente, em um segundo caso de teste vamos fazer o seguinte:\n\n```jsx\nconsole.log(list.getByIndex(1))\n```\n\nJá o resultado do índice um retorna o 2 e o 3. Se pegarmos o índice 2 irá retornar apenas o 3, agora se tentarmos pegar o índice 3, ele irá retornar null, porque o 3 não existe.\n\nO que podemos fazer para corrigir?",
      "keywords": [
        "node",
        "index",
        "return",
        "length",
        "value",
        "null",
        "ndice",
        "vamos",
        "para",
        "lista"
      ],
      "metadata": {
        "title": "Lista encadeada - Como retornar um item",
        "date": "2017-07-25",
        "tags": "['Algoritmos']",
        "thumbnail": "ListaEncadeada.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/lista-encadeada-retornar-um-item/index.md"
      }
    },
    {
      "id": "80d71f9d256525f3",
      "url": "https://devpleno.com/melhoria-continua",
      "title": "Melhoria Contínua - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Melhoria%20Cont%C3%ADnua&url=https%3A%2F%2Fdevpleno.com%2Fmelhoria-continua) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmelhoria-continua)",
      "description": "A dica de carreira de hoje é sempre tentar melhorar, ou seja, aplicar a melhoria contínua em seu processo de desenvolvimento de software, tecnologia que vo...",
      "keywords": [
        "para",
        "melhoria",
        "https",
        "carreira",
        "cont",
        "software",
        "problema",
        "servidor",
        "problemas",
        "devpleno"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/melhoria-continua"
      }
    },
    {
      "id": "80e6977f05eb656e",
      "url": "https://devpleno.com/blog/confira-4-dicas-de-ux-para-programadores/index",
      "title": "Confira 4 dicas de UX para programadores (Part 2)",
      "content": "Traduzindo na forma literal, UX significa Experiência do Usuário. Ela é definida como a sensação que o consumidor tem ao navegar por uma interface, seja ela de um aplicativo, site ou software.\n\nQuanto melhor a experiência, mais bem avaliado o produto é, aumentando as chances de fidelização de clientes.\n\n### User Interface (UI)\n\nPor outro lado, User Interface (UI) pode ser entendido como a interface do usuário, na tradução literal. Ela diz respeito a toda a parte que o usuário realmente utiliza: telas, botões, menus e formulários.\n\nPorém, o seu papel é muito mais do que construir esses elementos de layout. Profissionais que fazem UI são responsáveis por criar o caminho que determina a experiência do usuário, para que ele seja fácil e intuitivo.\n\nPortanto, podemos dizer que não existe uma agradável UX sem uma boa UI, uma vez que a interface do usuário é o objeto usado pela pessoa, que define a experiência. Isso diz que as duas devem ser trabalhadas em conjunto, buscando os melhores resultados para as soluções criadas.\n\n## Por que eu preciso entender de UX?\n\nApesar de naturalmente associada a área de design, a responsabilidade de fornecer uma experiência única para o usuário também é do programador. Além disso, a tendência é que essas áreas trabalhem cada vez mais próximas, com o surgimento de profissionais como designer Front-End e Back-end.\n\nMuitos designers estão se especializando em design de interfaces e assumindo atividades da área de desenvolvimento. É natural que as empresas busquem esse tipo de profissional para integrar o time, mais completo e interdisciplinar, podendo contribuir de forma ampla no produto.\n\nPortanto, se você quer ser um profissional de destaque no mercado e não ficar para trás, ou até mesmo ser um [empreendedor](https://www.devpleno.com/empreender-na-area-de-software?utm_source=blog&utm_campaign=rc_blogpost), você precisa ter pelo menos noções básicas de UX e colocá-las em seus projetos.",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "produto",
        "informa",
        "https",
        "source",
        "blog"
      ],
      "metadata": {
        "title": "Confira 4 dicas de UX para programadores",
        "date": "2017-10-06",
        "tags": "['Carreira']",
        "thumbnail": "117637-confira-4-dicas-de-ux-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/confira-4-dicas-de-ux-para-programadores/index.md"
      }
    },
    {
      "id": "81379a7fe8a4acee",
      "url": "https://devpleno.com/ferramentas-visuais-para-flexbox",
      "title": "Ferramentas Visuais para Flexbox - DevPleno (Part 1)",
      "content": "Javascript\n\n## Ferramentas Visuais para Flexbox\n\nT\nPor Tulio Faria • 5 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nHá um tempo passei por uma situação onde precisava criar algumas coisas com Flexbox (uma nova forma de display do CSS) na parte de layout do react native (já que é feita em flexbox). Para decidir quais atributos vamos utilizar no flexbox, temos algumas ferramentas que podem nos ajudar, e é isso que eu quero mostrar.\n\n**Por que ele foi criado?**\nO flexbox veio resolver um problema grande que tínhamos de layout, afinal no CSS fazíamos algumas ‘gambiarras’ com float e virava uma bagunça. Ele ‘flexibilizou’ isso, e temos muito a ganhar com a ferramenta.\n\n**Apresentando as Ferramentas**\n\nTemos 3 ferramentas, que eu particularmente uso bastante, e com elas fica bem fácil criar um layout. O primeiro é o **Flexys-boxes.**\n\n[https://the-echoplex.net/flexyboxes/](https://the-echoplex.net/flexyboxes/)\n\nPodemos mudar o eixo principal (flex-direction) que por padrão esta row, para outras orientações, como por exemplo, column, e a ferramenta vai simular como vai ser a apresentação.\n\nDentro de cada um dos Box eu consigo mudar também order, align-self e até mesmo o flex. Com isso, nos é apresentada a linha de código CSS com as propriedades sendo atualizada a cada modificação feita.\n\nIsso é muito legal, pois podemos ir adicionando novos box e ter um preview de como vai ficar e nos ajuda bastante na hora de criar um layout com o flexbox. A segunda ferramenta é o **Interative Flexbox Generator**.\n\n[https://loading.io/flexbox/](https://loading.io/flexbox/)\n\nNele, já temos um preview de alguns tipos de item, como imagens, blocos ou textos dentro do content in item.\n\nTambém conseguimos mudar o main direction, assim como no flexys-boxes, visualizar como queremos o Wrapping, main align, cross align, etc. Tudo isso tendo um preview de como será o layout.\n\nE a terceira e ultima ferramenta é o visual **Guide to CSS3 flexbox.**",
      "description": "Há um tempo passei por uma situação onde precisava criar algumas coisas com Flexbox (uma nova forma de display do CSS) na parte de layout do react native (...",
      "keywords": [
        "flexbox",
        "https",
        "como",
        "ferramentas",
        "para",
        "demos",
        "layout",
        "isso",
        "temos",
        "ferramenta"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/ferramentas-visuais-para-flexbox"
      }
    },
    {
      "id": "814a88079278cb01",
      "url": "https://devpleno.com/blog/reconhecimento-de-nudez-com-js/index",
      "title": "Reconhecimento de nudez com js",
      "content": "Hoje quero complementar aquela dica passada sobre [reconhecimento facial](https://www.devpleno.com/reconhecimento-facial-com-js/). Outra atividade que fazemos bastante quando permitimos que um usuário envie uma foto é checar por nudez. Isso também é conhecido como feature detection.\n\nO mais comum é checar o quanto de pele ou roupa tem naquela foto.\n\nPara fazer isso vamos utilizar o nude.js, primeiramente vamos baixar as versões compressas, nude.min.js e worker.nude.min.js.\n\nAgora em um html faremos o seguinte:\n\n```jsx\n<html>\n  <head>\n    <title>Nude</title>\n  </head>\n  <body>\n    <img src='imgsemnudez.jpg' />\n    <script src='nude.min.js'></script>\n    <script>\n      const img = document.getElementById('img') nude.load(img) nude.scan(\n      result => {console.log(result)})\n    </script>\n  </body>\n</html>\n```\n\nO próprio worker vai arrumar e carregar. Simplesmente temos que carregar essa foto nele e em seguida dar um scan.\n\nNo exemplo acima, eu coloquei uma imagem sem nudez, ao retornar o result percebam que será um false. Caso mudemos para uma imagem de uma pessoa nua ele vai retornar um true, com isso poderíamos negar essa foto. Por exemplo, quando o usuário tentar utilizar a foto podemos pegar a imagem quando selecionarmos, jogar em um canvas e passar pelo nude.js\n\nToda vez que for colocar uma imagem que você tenha medo, por exemplo, por serem desnecessárias, poderíamos rodar esse script para checar e ver se tem indícios de nudez. Outra coisa comum é checar. Se der falso, tudo bem, se der verdadeiro, você manda para uma checagem manual.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-JpM5ddlN5k\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "nude",
        "foto",
        "para",
        "script",
        "https",
        "checar",
        "imagem",
        "embed",
        "devpleno",
        "quando"
      ],
      "metadata": {
        "title": "Reconhecimento de nudez com js",
        "date": "2017-11-24",
        "tags": "['Javascript']",
        "thumbnail": "ReconhecimentoNudez.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/reconhecimento-de-nudez-com-js/index.md"
      }
    },
    {
      "id": "8169355a99792ce6",
      "url": "https://devpleno.com/tag/javascript/8",
      "title": "Javascript - Pagina 8 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 22 de jun. de 2017 Debug de código JavaScript no Navegador](/debug-no-navegador)\n\n[Javascript 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)\n\n[Javascript 13 de jun. de 2017 Template HTML simples - Hands-on Handlebars](/handlebars-template-html-simples)\n\n[Algoritmos 7 de jun. de 2017 Codility: Como Resolver os Desafios e Passar nos Testes de Código](/codility)\n\n[Javascript 6 de jun. de 2017 Gere seu projeto em Express - Hands-on: Express-Generator](/express-generator)\n\n[Javascript 5 de jun. de 2017 Injeção de Dependência em ReactJS](/injecao-de-dependencia-em-reactjs)\n\n[Javascript 1 de jun. de 2017 Injeção de dependência - Aumente a testabilidade do seu código](/injecao-de-dependencia)\n\n[Javascript 1 de jun. de 2017 Vantagens da Injeção de dependência para a testabilidade do código](/vantagens-da-injecao-de-depencia)\n\n[Javascript 30 de mai. de 2017 4 novos Métodos Strings que você precisa conhecer](/4-novos-metodos)\n\n[Javascript 30 de mai. de 2017 Dica: ES6 - Destructuring Assignament](/dica-es6-destructuring-assignament)\n\n[Javascript 30 de mai. de 2017 NodeJS Primeiros Passos: Módulo em NodeJS](/modulos)\n\n[Javascript 30 de mai. de 2017 ES6 - Template Strings](/template-strings)\n\n[Anterior](/tag/javascript/7)8 / 16[Próxima](/tag/javascript/9)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "nodejs",
        "reactjs",
        "digo",
        "template",
        "algoritmos",
        "express",
        "inje",
        "depend"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/8"
      }
    },
    {
      "id": "817174ce6f01e9f4",
      "url": "https://devpleno.com/hands-on-co",
      "title": "Hands-on: CO - DevPleno",
      "content": "Javascript\n\n## Hands-on: CO\n\nT\nPor Tulio Faria • 7 de março de 2017\n\n[Javascript](/tag/javascript)\n\nNeste hands-on iremos usar o CO, um módulo que permite que você organize o fluxo de seu código assíncrono com generators, o que faz seu código parecer muito com código síncrono.\n\n## Confira:\n\nDeixe suas sugestões e dúvidas nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), inscreva-se no canal e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20CO&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-co) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-co)",
      "description": "Neste handson iremos usar o CO, um módulo que permite que você organize o fluxo de seu código assíncrono com generators, o que faz seu código parecer muito...",
      "keywords": [
        "https",
        "javascript",
        "hands",
        "digo",
        "ncrono",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fhands",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-co"
      }
    },
    {
      "id": "8179f055ba704d44",
      "url": "https://devpleno.com/lista-definitiva-de-sites-para-progradores-remotos",
      "title": "Lista de sites para trabalhar remotamente como programador em 2022 - DevPleno (Part 2)",
      "content": "A Scalable Path é bastante semelhante ao Network da Toptal, porém, eles não possuem o screening process inicial. Assim, você cria seu perfil para que os recrutadores da Scalable Path te achem e façam a ponte com a empresa.\n\nUma ótima pedida para as primeiras experiências.\n\n[Entre aqui para fazer seu cadastro na Scalable Path!](https://www.scalablepath.com/apply?r=tf5226)\n\n## RemoteOk.io\n\nEste site é mais como um agregador de vagas para trabalho remoto. Possui muitas vagas e é bastante organizado neste sentido.\n\n[https://remoteok.io/](https://remoteok.io/)\n\n## Crossover.com\n\nCrossover também é um Network (assim com o a Total). O que é bastante atrativo neles é o job board - onde eles incluem vagas bastante interessantes - que passam dos 200 mil dólares anuais (nada mal hein!).\n\n[https://www.crossover.com](https://www.crossover.com)\n\n[https://www.crossover.com/jobs - página com as vagas abertas](https://www.crossover.com/jobs)\n\n## StackOverflow Jobs\n\nOutro agregador de vagas bastante interessante é o StackOverflow Jobs. Ele possui integração com seu perfil da plataforma.\n\n[https://stackoverflow.com/jobs](https://stackoverflow.com/jobs)\n\n## LinkedIn\n\nO LinkedIn também é bastante poderoso para conseguir a sua próxima vaga remota como programador. Basta deixar seu perfil bem preenchido, buscar e aplicar para as vagas que você acredita serem ideias para você.\n\nNão esqueça de filtrar por vagas remotas (se esse for o seu objetivo.)\n\nAproveite e siga o DevPleno por lá:\n\n[https://www.linkedin.com/school/odevpleno/](https://www.linkedin.com/school/odevpleno/)\n\n[https://linkedin.com/in/tuliofaria](https://linkedin.com/in/tuliofaria)\n\nEsta lista ainda é preliminar :) Vamos trazer mais itens em breve.\n\n## Você já trabalha remotamente (no Brasil ou no exterior)?",
      "description": "Se tem uma profissão que já se beneficiava dos benefícios de trabalhar remotamente bem antes de virar moda é a de programador. Eu mesmo atuo neste modelo a...",
      "keywords": [
        "para",
        "https",
        "toptal",
        "bastante",
        "trabalhar",
        "como",
        "vagas",
        "linkedin",
        "crossover",
        "jobs"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/lista-definitiva-de-sites-para-progradores-remotos"
      }
    },
    {
      "id": "817aef5ea78acd2c",
      "url": "https://devpleno.com/blog/npm-e-modulos-de-terceiros/index",
      "title": "NPM e Módulos de Terceiros - NodeJS (Part 1)",
      "content": "O Node já vem com um gerenciador de pacotes chamado NPM (Node Package Mananger), com o qual é possível gerenciar todas as dependências de pacotes, então ele é tanto um repositório de módulos quanto uma ferramenta que já vem instalada com o Node. Se colocarmos no CMD:\n\n```jsx\nnpm - v\n```\n\nDepois de ter instalado o Node, conseguimos ver a versão do NPM, no meu caso é o 3.6.0.\n\nPor exemplo, eu quero instalar um módulo chamado String, então coloco:\n\n```jsx\nnpm install string\n```\n\nÉ meio estranho, mas esse módulo String tem algumas facilidades a mais. Feito isso, será mostrado a mensagem de que foi instalado, no meu caso deu um warning pois eu não tenho um package.json, mas vamos criá-lo mais tarde.\n\nAgora, na pasta do seu projeto, vai ser criada uma pasta node_modules, nela fica todos os módulos que foram instalados pelo NPM, como o módulo String. Especificamente esse pacote String usamos com o S maiúsculo\n\n```jsx\nvar S = require('string');\nvar txt = S('olá').replaceAll(\"o\", \"O').toString();\nconsole.log(txt)\n```\n\nUsamos, por exemplo, o replaceAll, que não tem efetivamente no javaScript. Perceba que ele trocou o 'o' de minúsculo para maiúsculo.\n\nQuais os detalhes temos que reparar quando usamos módulos de terceiros?\n\nFizemos um módulo anteriormente, e nele importávamos colocando ./, por exemplo:\n\n```jsx\nvar S = require('./string')\n```\n\nMas usamos ./ apenas quando os módulos são locais e não uma dependência externa ao seu projeto. No caso do String, que é publicado no NPM, podemos referenciar diretamente pelo nome porque o node vai procurar no módulo da sua pasta. Se não acha, ele começa a procurar nas pastas pai.\n\nNote que quando formos instalar uma dependência, não precisa falar para todo mundo 'olha, ele depende do String', senão toda vez que for copiar o projeto para alguém e não copiar as dependências, tem que avisar qual vamos usar. Para evitar de ter que fazer isso, conseguimos colocar um Descriptor, onde já dizemos todas as dependências que tem no projeto.",
      "keywords": [
        "depend",
        "string",
        "isso",
        "dulos",
        "projeto",
        "para",
        "quando",
        "node",
        "qual",
        "ncias"
      ],
      "metadata": {
        "title": "NPM e Módulos de Terceiros - NodeJS",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "NpmEModulos.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/npm-e-modulos-de-terceiros/index.md"
      }
    },
    {
      "id": "8268c715d78412a0",
      "url": "https://devpleno.com/10-dicas-de-produtividade-para-programadores",
      "title": "10 dicas de produtividade para programadores - DevPleno (Part 2)",
      "content": "Saber definir prioridades entre as tarefas é crucial para a produtividade. Ferramentas como o [Trello](https://trello.com?utm_source=blog&#x26;utm_campaign=rc_blogpost) e o [Asana](https://asana.com?utm_source=blog&#x26;utm_campaign=rc_blogpost) ajudam a gerenciar tarefas, definindo responsáveis e prazos para cada uma. Desta forma, visualizar as diversas atividades que compõem o projeto fica mais simples, possibilitando elencar a prioridade entre elas.\n\n### Editores de texto\n\nEntre os editores de texto mais usados pelos programadores estão o [Notepad++](https://notepad-plus-plus.org?utm_source=blog&#x26;utm_campaign=rc_blogpost), [Sublime Text](https://www.sublimetext.com?utm_source=blog&#x26;utm_campaign=rc_blogpost) e o VS Code. Todos são leves e aceitam *plugins/extensões* que agregam funcionalidades ao *software*. [Na hora de utilizar o editor, uma dica é reduzir a troca de contextos em prol da produtividade](https://www.devpleno.com/como-aumentar-a-produtividade?utm_source=blog&#x26;utm_campaign=rc_blogpost).\n\n### Versionamento\n\nQuando se está criando um *software*, é essencial não perder linhas de código já desenvolvidas. Uma das melhores formas de prevenir que um trecho de código seja sobrescrito ou que ocorra um *bug* causado por alguma alteração no código-fonte é usar o sistema de versionamento [git](https://git-scm.com?utm_source=blog&#x26;utm_campaign=rc_blogpost), disponível nas plataformas [Bitbucket](https://bitbucket.org?utm_source=blog&#x26;utm_campaign=rc_blogpost) e [Github](https://github.com?utm_source=blog&#x26;utm_campaign=rc_blogpost).\n\n### Qualidade do código",
      "description": "Ser um profissional produtivo é uma exigência do mercado de trabalho no cenário altamente competitivo em que vivemos. Os resultados são requisitados cada v...",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "produtividade",
        "para",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/10-dicas-de-produtividade-para-programadores"
      }
    },
    {
      "id": "828febc0500d7498",
      "url": "https://devpleno.com/servidor-http-basico",
      "title": "NodeJS Primeiros Passos: Servidor HTTP Básico - DevPleno",
      "content": "Javascript\n\n## NodeJS Primeiros Passos: Servidor HTTP Básico\n\nT\nPor Tulio Faria • 25 de julho de 2016\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nAprenda NodeJS do zero com esta nova série de vídeos do DevPleno. Neste primeiro vídeo iremos introduzir um pouco de como criamos um servidor HTTP básico.\n\nO código construído está disponível [Aqui](https://github.com/devpleno/nodejs-servidor-http-basico)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20Servidor%20HTTP%20B%C3%A1sico&url=https%3A%2F%2Fdevpleno.com%2Fservidor-http-basico) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidor-http-basico)",
      "description": "Aprenda NodeJS do zero com esta nova série de vídeos do DevPleno. Neste primeiro vídeo iremos introduzir um pouco de como criamos um servidor HTTP básico. ...",
      "keywords": [
        "https",
        "nodejs",
        "http",
        "devpleno",
        "javascript",
        "servidor",
        "basico",
        "sico",
        "facebook",
        "para"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/servidor-http-basico"
      }
    },
    {
      "id": "83153248af271027",
      "url": "https://devpleno.com/devreactjs-lp3",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-lp3 to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-lp3"
      }
    },
    {
      "id": "8357db8ad38be786",
      "url": "https://devpleno.com/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira - DevPleno (Part 3)",
      "content": "## 4. Saiba o que evitar no trabalho freelancer\n\nTanto no Brasil, quanto no exterior, atrasos e quebras de contrato prejudicam sua reputação. Em muitas plataformas que fazem a mediação entre freelancers e clientes, visando a entrega de determinado serviço, isso pode representar a diminuição de sua nota ou, até mesmo, a exclusão de seu perfil.\n\nEm alguns países, pode existir uma intolerância ainda mais aguda em relação a esse problema. Por isso, seja comprometido com seus prazos e entregas a fim de obter [sucesso como freelancer](https://www.devpleno.com/metas-na-carreira-de-desenvolvedor?utm_source=blog&#x26;utm_campaign=rc_blogpost) no exterior.\n\n## 5. Avalie se o trabalho de freelancer combina com você\n\nHá muitas pessoas em empregos formais que jamais se arriscariam na vida de freelancer. A maior parte delas atribui essa forma de pensar às incertezas desse regime de trabalho ou à falta de disciplina para ser seu próprio chefe.\n\nPor outro lado, se você acredita ser capaz de organizar-se para ter uma rotina mais flexível, não se apega a cargos ou a hierarquias e, ainda, sabe lidar com uma margem variável de rendimento mensal, o trabalho como freelancer é uma ótima opção.\n\nA flexibilidade relacionada à prestação desse tipo de serviço pode trazer a possibilidade de viver em outros países. Para quem tem fluência em outras línguas, como o inglês, por exemplo, há um grande número de oportunidades no exterior.\n\n## 6. Esteja em constante capacitação\n\nUma particularidade do trabalho de freelancer é a baixa adesão a cursos de capacitação. Trabalhar por conta própria leva muitos profissionais a pensar que não é preciso estar em constante atualização.\n\nEsse é um engano que não pode ser cometido. As constantes mudanças no mercado de trabalho têm a mesma repercussão para pessoas em empregos formais e para quem presta serviço freelancer.",
      "description": "O trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho. No entanto, a maiori...",
      "keywords": [
        "para",
        "freelancer",
        "trabalho",
        "exterior",
        "https",
        "carreira",
        "pode",
        "mais",
        "isso",
        "como"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira"
      }
    },
    {
      "id": "83f0ed232ea47470",
      "url": "https://devpleno.com/blog/claude-code-otimizacao-arquivos/index",
      "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente (Part 4)",
      "content": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@graph\": [\n    {\n      \"@type\": \"BlogPosting\",\n      \"headline\": \"Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente\",\n      \"description\": \"Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.\",\n      \"inLanguage\": \"pt-BR\",\n      \"keywords\": [\"Claude Code otimização\", \"otimizar PNG com IA\", \"pngquant automático\", \"otimizar imagens com Claude\"]\n    },\n    {\n      \"@type\": \"FAQPage\",\n      \"mainEntity\": [\n        {\n          \"@type\": \"Question\",\n          \"name\": \"O Claude Code instala ferramentas sozinho?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Sim. Quando o Claude Code sugere uma ferramenta como o pngquant, ele pede sua aprovação e executa a instalação via gerenciador de pacotes. Você mantém o controle.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Funciona com qualquer tipo de arquivo?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"O Claude Code trabalha com qualquer arquivo que tenha uma ferramenta de otimização disponível via linha de comando. Imagens, vídeos, fontes, código minificado, containers Docker.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Preciso saber usar linha de comando?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Não. Você descreve o que precisa em linguagem natural e o Claude Code traduz isso em comandos técnicos, explicando o que vai fazer antes de executar.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"É seguro rodar otimizações automáticas no meu projeto?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Sim, desde que você use Git. Crie um branch, rode a otimização, revise as mudanças no diff e só faça merge quando estiver satisfeito.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Quanto de redução posso esperar?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Depende do tipo de arquivo. PNGs não otimizados costumam ter reduções de 50-80%. SVGs com código desnecessário podem cair 30-60%.\"\n          }\n        }\n      ]\n    }\n  ]\n}\n</script>",
      "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
      "keywords": [
        "claude",
        "code",
        "otimiza",
        "ferramenta",
        "type",
        "para",
        "imagens",
        "como",
        "arquivos",
        "otimizar"
      ],
      "metadata": {
        "title": "Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente",
        "description": "Aprenda como o Claude Code pode otimizar PNGs, imagens e outros arquivos do seu projeto com um simples pedido. Reduza até 80% do tamanho dos arquivos.",
        "date": "2026-04-05",
        "tags": "['Ferramentas']",
        "thumbnail": "feature-image.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/claude-code-otimizacao-arquivos/index.md"
      }
    },
    {
      "id": "8401af343df3c77c",
      "url": "https://devpleno.com/ha-high-availability-e-as-auto-scale",
      "title": "HA (High Availability) e AS (Auto Scale) - DevPleno",
      "content": "Fundamentos\n\n## HA (High Availability) e AS (Auto Scale)\n\nT\nPor Tulio Faria • 9 de agosto de 2016\n\n[Fundamentos](/tag/fundamentos)\n\nNeste vídeo falo de 2 características que é a auto disponibilidade e o auto scaling, muito buscadas por startups para suportar a escalabilidade do negócio.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=HA%20(High%20Availability)%20e%20AS%20(Auto%20Scale)&url=https%3A%2F%2Fdevpleno.com%2Fha-high-availability-e-as-auto-scale) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fha-high-availability-e-as-auto-scale)",
      "description": "Neste vídeo falo de 2 características que é a auto disponibilidade e o auto scaling, muito buscadas por startups para suportar a escalabilidade do negócio....",
      "keywords": [
        "auto",
        "https",
        "high",
        "fundamentos",
        "availability",
        "scale",
        "para",
        "devpleno",
        "facebook",
        "youtube"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/ha-high-availability-e-as-auto-scale"
      }
    },
    {
      "id": "84410c5793964acc",
      "url": "https://devpleno.com/minicurso-socket-io-parte-3",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol - DevPleno (Part 2)",
      "content": "const notify = $('#score-notify:checked').val()\nAgora precisamos enviar isso para o express para ele distribuir via Socket.IO para todos os clients. Ao invés de mandar essa atualização via Socket.IO, eu posso mandar via API, salvar essa informação no banco e aí sim notificar (eu prefiro usar sempre essa forma para eu garantir que eu só envie essa notificação para todo mundo).*\n\n$(function)(){\n$(\"#update-score\").click(function(){\nconst scoreA = $(\"#score-a\").val();\nconst scoreB = $(\"#score-b\").val();\nconst notify = $(\"#score-notify\").val();\n$.post(\"/admin/match/0/score\", post {\nscoreA, scoreB, notify\n}, function(data){\nconsole.log(data)\n})\nreturn false;\n})\n});\nEle não vai conseguir, pois não achou, mas se olharmos a conexão os dados já estão sendo enviados, então temos que receber esses dados lá. Vamos voltar em routes/admin.js e criar novo router:\n\nrouter.post('/match/:id/score', function (req, res) {\nres.send(req.body)\n})\nFizemos isso para termos certeza que os dados estão chegando aqui, então vamos parar o servidor e a resposta do score vai ser exatamente o que eu enviei para ele, agora podemos processar esses dados. Vamos setar o valor no placar do banco de dados. Uma das formas que temos de fazer isso no low-db é pegando o índice do jogo e setar lá dentro falando qual o valor vou enviar para ele. Essa informação vai para todos os jogos, então eu devo emitir para todos que estão conectados no Socket.IO:",
      "description": "Nas aulas anteriores do minicurso de Socket.IO, já preparamos o ambiente, conectamos o websocket do client para o servidor e agora vamos começar a emitir r...",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "socket",
        "vamos",
        "notify",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-3"
      }
    },
    {
      "id": "846fbc612b4a94fc",
      "url": "https://devpleno.com/high-order-functions",
      "title": "High-order Functions - DevPleno (Part 2)",
      "content": "function mathOrder(num1, num2, op) {\nreturn op(num1, num2)\n}\nfunction operadorMult(num1, num2) {\nreturn (\nnum1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1\\ *\nnum2\n)\n}\nconsole.log(mathOperator(1, 2, (num1, num2) => num1 + num2))\nconsole.log(mathOperator(1, 2, operadorMult))\nHigh-order functions é um conceito muito importante para podermos injetar comportamento em uma função, esse é o grande ponto delas. Podemos compor funções que são muito mais simples, e isso é muito importante não só em programação funcional mas principalmente para simplificar as funções.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=High-order%20Functions&url=https%3A%2F%2Fdevpleno.com%2Fhigh-order-functions) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhigh-order-functions)",
      "description": "A dica de hoje é sobre Highorder Functions, que são funções que recebem ou retornam funções. Nós temos alguns tipos diferentes, como por exemplo vetor, map...",
      "keywords": [
        "order",
        "num2",
        "high",
        "num1",
        "functions",
        "function",
        "para",
        "https",
        "console",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/high-order-functions"
      }
    },
    {
      "id": "84d4c24afbb8435c",
      "url": "https://devpleno.com/lista-encadeada-retornar-um-item",
      "title": "Lista encadeada - Como retornar um item - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Lista encadeada - Como retornar um item\n\nT\nPor Tulio Faria • 25 de julho de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nHoje vamos continuar falando sobre algoritmos e também estrutura de dados. Vamos discutir um pouco sobre essas técnicas que aprendemos na base da computação e que é bastante útil tanto para entrevistas de emprego quanto para competições em programação, pois geralmente aplicam esse tipo de teste para saber se você sabe gerenciar uma lista encadeada, por exemplo. Vamos continuar falando sobre [lista encadeada](https://www.devpleno.com/lista-encadeada-adicionar-no/) que é um assunto bastante interessante, nós já fizemos a adição de itens nessa lista, agora vamos criar um método para retornar um item que eu quero.\n\nconst getByIndex = (index) => {\nif (index &#x3C; length) {\n}\n}\nPerceba o seguinte, se eu quiser pegar o item 0 e minha lista estiver vazia ou seja, o length for igual a zero, temos que adicionar ao return primeiramente:\n\nreturn {\nlength: () => add(value),\nprint: () => console.log(head),\ngetByIndex: (index) => getByIndex(index)\n}\nEm seguida faremos o seguinte:\n\nconst getByIndex = (index) => {\nif (length === 0) {\nreturn null\n}\nlet node = head\nlet count = 0\nwhile (count &#x3C; index &#x26;&#x26; node.next) {\nnode = node.next\ncount++\n}\nreturn node\n}\nTeoricamente, ao retomarmos o node, já temos nosso método. Vamos recapitular o que fizemos: se a minha lista estiver vazia eu retorno null; se não eu pego o primeiro nó e coloco em node, minha contagem está em zero; caso meu count for zero e meu index for zero, ele irá retornar o nó.\n\nVamos fazer o teste:\n\nconsole.log(list.getByIndex(0))\nPerceba que o índice zero tem toda a estrutura montada anteriormente, em um segundo caso de teste vamos fazer o seguinte:\n\nconsole.log(list.getByIndex(1))\nJá o resultado do índice um retorna o 2 e o 3. Se pegarmos o índice 2 irá retornar apenas o 3, agora se tentarmos pegar o índice 3, ele irá retornar null, porque o 3 não existe.",
      "description": "Hoje vamos continuar falando sobre algoritmos e também estrutura de dados. Vamos discutir um pouco sobre essas técnicas que aprendemos na base da computaçã...",
      "keywords": [
        "node",
        "retornar",
        "index",
        "return",
        "lista",
        "length",
        "value",
        "null",
        "ndice",
        "encadeada"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/lista-encadeada-retornar-um-item"
      }
    },
    {
      "id": "84f869524914a4da",
      "url": "https://devpleno.com/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste",
      "title": "Promise Constante - como criar situações assíncronas de teste - DevPleno (Part 1)",
      "content": "Javascript\n\n## Promise Constante - como criar situações assíncronas de teste\n\nT\nPor Tulio Faria • 3 de outubro de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nA dica de hoje é bastante interessante porque ela nos ajuda a criar algumas situações de teste, principalmente envolvendo promises, que é uma forma de lidar com o assincronismo em JavaScript. Muitas vezes precisamos testar essa promise, então imagine o seguinte cenário, onde eu quero construir uma função readDir e promisificá-la:\n\nconst fs = require('fs')\nconst readdir = (path) =>\nnew Promise((resolve, reject) => {\nfs.readdir(path, (err, list) => {\nif (err) {\nreject(err)\n} else {\nresolve(list)\n}\n})\n})\nAgora imagine que temos uma outra função chamada path, que é assíncrona:\n\nconst functA = (path) => {\nconst list = await readdir(path)\nconsole.log(list)\n}\nSe nós quiséssemos, por exemplo, testar essa função, rodaríamos o funcA:\n\nfuncA('./')\nEla irá trazer todos os arquivos que eu tenho no meu diretório atual. Agora imaginem que eu quero testar esse readdir, mas sem efetivamente passar pelo fs, quero que minha promise retorne os valores para que possa apenas testar se o funcA está correto. É equivalente ao mock.\n\nQuando queremos ter uma promise que é uma constante para a situação que estamos utilizamos, podemos fazer o seguinte:\n\nconst readdir = (path) => Promise.resolve(['arquivo1.txt', arquivo2.txt])\nEle irá retornar uma lista com esses resultados. Então se eu quiser ter uma lista que sempre resolve pro mesmo valor, sendo utilizado parecido com mock para teste, utilizamos o promise.resolve.\n\nQuando estamos aprendendo programação assíncrona e queremos fazer esses testes, isso é muito interessante.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "A dica de hoje é bastante interessante porque ela nos ajuda a criar algumas situações de teste, principalmente envolvendo promises, que é uma forma de lida...",
      "keywords": [
        "promise",
        "readdir",
        "path",
        "https",
        "teste",
        "const",
        "resolve",
        "javascript",
        "constante",
        "criar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste"
      }
    },
    {
      "id": "852cd5f468802052",
      "url": "https://devpleno.com/evite-o-this-em-js",
      "title": "Evite o this em JavaScript - DevPleno (Part 2)",
      "content": "Isso deixa muito mais fácil manutenção, testabilidade e etc. Principalmente se houver outro método e nesse método você usa o ‘this’ tem que se criar um construtor, deixando o código muito mais verboso.\n\nObviamente tem algumas situações que não conseguimos não utilizar, inclusive temos alguns exemplos anteriores que criamos utilizamos o ‘this’ dentro de um componente só e depois replicamos esse state do componente para frente através de uma passagem props.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Evite%20o%20this%20em%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Fevite-o-this-em-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fevite-o-this-em-js)",
      "description": "Venho programando cada vez mais de forma funcional e muitas coisas que víamos com preconceito começamos a entender o porque faz sentido ser da forma que é....",
      "keywords": [
        "this",
        "node",
        "props",
        "https",
        "utilizar",
        "componente",
        "span",
        "javascript",
        "mais",
        "forma"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/evite-o-this-em-js"
      }
    },
    {
      "id": "85334aafd2dff93d",
      "url": "https://devpleno.com/blog/como-receber-de-empresas-estrangeiras/index",
      "title": "Impostos e como receber de empresas estrangeiras (Part 1)",
      "content": "Você sabe como receber de empresas estrangeiras (Toptal, Crossover, Scalable Path e outras)?\n\nCada empresa dessa tem a possibilidade de enviar o dinheiro de uma forma específica, como o Paypal, Payoneer, no caso da Toptal eles têm uma parceria com a Hyper Wallet, ou seja, cada um tem um gateway.\n\nPara o governo brasileiro, independente de como foi recebido, é preciso declarar esse dinheiro. Quando receber, por exemplo, $1000,00 pela Hyper Wallet, vai ser descontado uma taxa, algo em torno de $13,00, ou seja, vai receber $987,00. Depois o valor é multiplicado pelo câmbio atual, vamos supor que esteja R$3,00, o resultado final será em torno de R$2961,00.\n\n> Antes de continuar, preciso te contar uma novidade. Nós conseguimos te ajudar a legalizar o seu dinheiro aqui no Brasil - sim, eu criei um serviço de contabilidade e assessoria jurídica/tributária com esse objetivo. A <a href='https://www.conta49.com.br'>Conta49 é uma contabilidade e assessoria jurídica</a> que entende as especificidades vividas pelos programadores, principalmente os que atuam no exterior. Inclusive temos serviços específicos com esse objetivo (caso você precise legalizar somente uma vez o recebimento ou ainda se possui dúvidas sobre este processo). Acesse o <a href='https://www.conta49.com.br'>site: www.conta49.com.br</a> e conheça todos os serviços.\n>\n> <a href='https://www.conta49.com.br'><img src='logo_conta49.png' noNext='true' alt='Conta49 Logo' /></a>\n\n.\n\nO detalhe é que eles vão fazer uma TED para sua conta aqui no Brasil e em seguida você precisa declarar esse dinheiro porque é uma renda que você está tendo. Para fazer isso, há algumas maneiras: a primeira é pedir para que eles façam essa transferência para uma conta de pessoa física, geralmente esses valores na conta de pessoa física não são valores pequenos. Vamos supor que essa conta gere R$100mil em um ano, isso já faz com que você caia na alíquota máxima de 27,5%, ou seja, de R$100mil você vai pagar R$27,5mil somente de impostos.",
      "keywords": [
        "para",
        "esse",
        "como",
        "empresa",
        "dinheiro",
        "pessoa",
        "receber",
        "isso",
        "pagar",
        "eles"
      ],
      "metadata": {
        "title": "Impostos e como receber de empresas estrangeiras",
        "date": "2017-08-18",
        "tags": "['Carreira']",
        "thumbnail": "COMO-RECEBER-DE-EMPRESAS-ESTRANGERAS-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/como-receber-de-empresas-estrangeiras/index.md"
      }
    },
    {
      "id": "85c2627d8644b4e8",
      "url": "https://devpleno.com/nodejs-primeiros-passos-modulos",
      "title": "NodeJS Primeiros Passos: Módulos - DevPleno",
      "content": "Javascript\n\n## NodeJS Primeiros Passos: Módulos\n\nT\nPor Tulio Faria • 27 de julho de 2016\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nNeste vídeo vamos abordar organização de código em NodeJS através de módulos.\n\nCódigo fonte criado no vídeo: [https://github.com/devpleno/nodejs-modulos](https://github.com/devpleno/nodejs-modulos)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20M%C3%B3dulos&url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-modulos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-modulos)",
      "description": "Neste vídeo vamos abordar organização de código em NodeJS através de módulos. Código fonte criado no vídeo: https://github.com/devpleno/nodejsmodulos <div ...",
      "keywords": [
        "https",
        "nodejs",
        "devpleno",
        "modulos",
        "javascript",
        "primeiros",
        "passos",
        "dulos",
        "fundamentos",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/nodejs-primeiros-passos-modulos"
      }
    },
    {
      "id": "860ca75440f108ff",
      "url": "https://devpleno.com/fullstack-master-2",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master-2 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstack",
        "master"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstack-master-2"
      }
    },
    {
      "id": "86201234e72f2a0d",
      "url": "https://devpleno.com/hands-on-nodemon",
      "title": "Nodemon: Monitore alterações e reinicie automaticamente seus scripts - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Nodemon%3A%20Monitore%20altera%C3%A7%C3%B5es%20e%20reinicie%20automaticamente%20seus%20scripts&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-nodemon) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-nodemon)",
      "description": "Neste handson, vamos falar mais especificamente sobre o Nodemon. Primeiramente vamos instalar: Eu poderia instalar localmente também apenas tirando o g, as...",
      "keywords": [
        "nodemon",
        "https",
        "server",
        "vamos",
        "arquivos",
        "fazer",
        "express",
        "3000",
        "javascript",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-on-nodemon"
      }
    },
    {
      "id": "863b09680839228c",
      "url": "https://devpleno.com/toptal-serietrabalhoremoto",
      "title": "O que é a Toptal?",
      "content": "Carreira\n\n## O que é a Toptal? | Série Trabalho Remoto\n\nT\nPor Tulio Faria • 9 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nVocê já conhece a Toptal? Entenda o papel desta empresa que é uma das principais referências quando falamos em trabalho remoto.\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS aqui.](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=O%20que%20%C3%A9%20a%20Toptal%3F%20%7C%20S%C3%A9rie%20Trabalho%20Remoto&url=https%3A%2F%2Fdevpleno.com%2Ftoptal-serietrabalhoremoto) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftoptal-serietrabalhoremoto)",
      "description": "Você já conhece a Toptal? Entenda o papel desta empresa que é uma das principais referências quando falamos em trabalho remoto. <div className=&#34;embedrespon...",
      "keywords": [
        "https",
        "blog",
        "carreira",
        "toptal",
        "mais",
        "profissionais",
        "trabalho",
        "remoto",
        "reactjs",
        "devreactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/toptal-serietrabalhoremoto"
      }
    },
    {
      "id": "868aa87849b6da9f",
      "url": "https://devpleno.com/morgan",
      "title": "O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express - DevPleno (Part 2)",
      "content": "Compartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=O%20Que%20%C3%A9%20Morgan%20no%20Node.js%3F%20Guia%20Pr%C3%A1tico%20de%20HTTP%20Logging%20com%20Express&url=https%3A%2F%2Fdevpleno.com%2Fmorgan) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmorgan)",
      "description": "Aprenda o que é o Morgan, como instalar e configurar no Express para logar requisições HTTP. Exemplos práticos com todos os formatos de log.",
      "keywords": [
        "morgan",
        "express",
        "temos",
        "https",
        "isso",
        "para",
        "javascript",
        "http",
        "requisi",
        "const"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/morgan"
      }
    },
    {
      "id": "86e7530a71c2201d",
      "url": "https://devpleno.com/blog/entrevista-carlos-drury-e-thiago-coelho/index",
      "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho (Part 4)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "ingl",
        "grande",
        "muito",
        "carlos",
        "javascript",
        "mais",
        "conhecimento",
        "como",
        "pessoa"
      ],
      "metadata": {
        "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho",
        "date": "2017-08-03",
        "tags": "['Carreira']",
        "thumbnail": "entrevista-gdg-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/entrevista-carlos-drury-e-thiago-coelho/index.md"
      }
    },
    {
      "id": "87341821f9c43221",
      "url": "https://devpleno.com/blog/injecao-de-dependencia/index",
      "title": "Injeção de dependência - Aumente a testabilidade do seu código (Part 3)",
      "content": "O que eu quero ressaltar é o seguinte: fica mais claro para nós o que o valida faz, assim que expomos as dependências dele, o nosso código começa a criar essa auto documentação, o que gera uma qualidade de código muito grande.\n\nConfira a explicação em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/L_Hp97n2als\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "alert",
        "para",
        "model",
        "quando",
        "digo",
        "depend",
        "vamos",
        "temos",
        "return",
        "ncia"
      ],
      "metadata": {
        "title": "Injeção de dependência - Aumente a testabilidade do seu código",
        "date": "2017-06-01",
        "tags": "['Javascript']",
        "thumbnail": "InjecaoDependenciaPrin.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/injecao-de-dependencia/index.md"
      }
    },
    {
      "id": "87610bc3f28aad4a",
      "url": "https://devpleno.com/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira",
      "title": "8 dicas de organização para freelancers se darem bem na carreira - DevPleno (Part 5)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=8%20dicas%20de%20organiza%C3%A7%C3%A3o%20para%20freelancers%20se%20darem%20bem%20na%20carreira&url=https%3A%2F%2Fdevpleno.com%2F8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2F8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira)",
      "description": "Nada melhor do que ter uma rotina flexível, com a possibilidade de trabalhar nos seus próprios horários, não é mesmo? Não à toa, ser freelancer é uma alter...",
      "keywords": [
        "para",
        "mais",
        "como",
        "https",
        "carreira",
        "freelancer",
        "pode",
        "freelancers",
        "dicas",
        "afinal"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira"
      }
    },
    {
      "id": "87620d95aedfdaef",
      "url": "https://devpleno.com/devreactjs-lp-2",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-lp-2 to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-lp-2"
      }
    },
    {
      "id": "87c4b131616710d9",
      "url": "https://devpleno.com/blog/loopsrepeticoesiteracoes-no-jsx-do-react/index",
      "title": "Loops/Repetições/Iterações no JSX do React (Part 1)",
      "content": "JSX é a sintaxe que permite escrevermos HTML dentro do Javascript (sim, isso parece estranho, rs) em componentes ReactJS. E um fator muito interessante do JSX é que ele não permite trocar o escopo, assim como é possível fazer um loop/repetição em PHP. Onde apenas deixamos o for/foreach/while dentro do escopo do PHP e o HTML fora do escopo seria repetido.\n\nAlgo como:\n\n```jsx\n<ul><!-- aqui temos HTML normalmente -->\n<?php for($i=0; $i<10; $i++){ // trocamos o escopo para PHP ?>\n<li><?php echo $x ?></li><!-- aqui alternamos o escopo entre HTML/PHP -->\n<?php } ?>\n</ul>\n```\n\nPerceba que no exemplo anterior, sempre que queremos alternar para PHP, apenas usamos o <?php. Em JSX podemos tentar fazer algo semelhante, porém isso não funcionaria. Pois JSX é Javascript, então não tem como alternarmos o escopo. :(\n\n## Forma 1:\n\nNesta maneira geramos fragmentos de JSX dentro de um array e escrevemos este array onde desejamos a nossa saída. Olhando o código fica mais simples entender:\n\n```jsx\nclass Loop1 extends React.Component {\n  render() {\n    let rows = []\n    for (let i = 0; i < 5; i++) {\n      rows.push(<li>Num: {i}</li>)\n    }\n    return (\n      <div>\n        <h1>Loop 1:</h1>\n        <ul>{rows}</ul>\n      </div>\n    )\n  }\n}\n```\n\nApesar de funcionar bem, esta maneira acaba ficando um pouco confusa em componentes um pouco mais complexos.\n\n## Forma 2:\n\nNesta maneira utilizamos um método separado para renderizar cada linha e o método array.map para iterar sobre os valores. Na verdade, poderíamos até mesmo utilizar outro componente na renderização.\n\n```jsx\nclass Loop2 extends React.Component {\n  renderRow(row) {\n    return <li>Num: {row}</li>\n  }\n  render() {\n    let rows = []\n    for (let i = 0; i < 5; i++) {\n      rows.push(i)\n    }\n    return (\n      <div>\n        <h1>Loop 2:</h1>\n        <ul>{rows.map(this.renderRow)}</ul>\n      </div>\n    )\n  }\n}\n```",
      "keywords": [
        "rows",
        "para",
        "escopo",
        "return",
        "loop",
        "html",
        "como",
        "renderrow",
        "https",
        "permite"
      ],
      "metadata": {
        "title": "Loops/Repetições/Iterações no JSX do React",
        "date": "2016-12-27",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "Lops.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/loopsrepeticoesiteracoes-no-jsx-do-react/index.md"
      }
    },
    {
      "id": "87d0971800553df5",
      "url": "https://devpleno.com/blog/ferramentas-visuais-para-flexbox/index",
      "title": "Ferramentas Visuais para Flexbox (Part 1)",
      "content": "Há um tempo passei por uma situação onde precisava criar algumas coisas com Flexbox (uma nova forma de display do CSS) na parte de layout do react native (já que é feita em flexbox). Para decidir quais atributos vamos utilizar no flexbox, temos algumas ferramentas que podem nos ajudar, e é isso que eu quero mostrar.\n\n**Por que ele foi criado?**\nO flexbox veio resolver um problema grande que tínhamos de layout, afinal no CSS fazíamos algumas 'gambiarras' com float e virava uma bagunça. Ele 'flexibilizou' isso, e temos muito a ganhar com a ferramenta.\n\n**Apresentando as Ferramentas**\n\nTemos 3 ferramentas, que eu particularmente uso bastante, e com elas fica bem fácil criar um layout. O primeiro é o **Flexys-boxes.**\n\n[https://the-echoplex.net/flexyboxes/](https://the-echoplex.net/flexyboxes/)\n\n![Tela do Flexyboxes](eecb164f-2fe4-4336-af81-32e7492be37a.png)\n\nPodemos mudar o eixo principal (flex-direction) que por padrão esta row, para outras orientações, como por exemplo, column, e a ferramenta vai simular como vai ser a apresentação.\n\n![Eixo principal](41af88e8-59f7-42bb-862d-37974b103aa3.png)\n\nDentro de cada um dos Box eu consigo mudar também order, align-self e até mesmo o flex. Com isso, nos é apresentada a linha de código CSS com as propriedades sendo atualizada a cada modificação feita.\n\nIsso é muito legal, pois podemos ir adicionando novos box e ter um preview de como vai ficar e nos ajuda bastante na hora de criar um layout com o flexbox. A segunda ferramenta é o **Interative Flexbox Generator**.\n\n[https://loading.io/flexbox/](https://loading.io/flexbox/)\n\nNele, já temos um preview de alguns tipos de item, como imagens, blocos ou textos dentro do content in item.\n\n![Visualizando o preview](b0845ffc-55a7-4186-b1a1-7841c7d8b58d.png)\n\nTambém conseguimos mudar o main direction, assim como no flexys-boxes, visualizar como queremos o Wrapping, main align, cross align, etc. Tudo isso tendo um preview de como será o layout.",
      "keywords": [
        "flexbox",
        "https",
        "como",
        "demos",
        "layout",
        "isso",
        "temos",
        "ferramentas",
        "ferramenta",
        "mudar"
      ],
      "metadata": {
        "title": "Ferramentas Visuais para Flexbox",
        "date": "2017-05-05",
        "tags": "['Javascript']",
        "thumbnail": "FerramentasVisuais.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/ferramentas-visuais-para-flexbox/index.md"
      }
    },
    {
      "id": "87e6864f97e6ba73",
      "url": "https://devpleno.com/expressoes-regulares",
      "title": "3 Padrões para Iniciar com Expressões Regulares (RegExp) - DevPleno (Part 2)",
      "content": "Isso é algo muito poderoso. Essas são dicas para dar os primeiros passos se você nunca ouviu falar de expressão regular.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=3%20Padr%C3%B5es%20para%20Iniciar%20com%20Express%C3%B5es%20Regulares%20(RegExp)&url=https%3A%2F%2Fdevpleno.com%2Fexpressoes-regulares) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fexpressoes-regulares)",
      "description": "Hoje venho trazer três padrões de expressões regulares que você pode utilizar para checar se uma string parece com algo. O que é expressão regular? É uma f...",
      "keywords": [
        "devpleno",
        "para",
        "padr",
        "express",
        "string",
        "test",
        "https",
        "regexp",
        "const",
        "pattern3"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/expressoes-regulares"
      }
    },
    {
      "id": "87fe1063b1c8023d",
      "url": "https://devpleno.com/quantas-linguagens-programar",
      "title": "Quantas linguagens devo programar? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Quantas linguagens devo programar?\n\nT\nPor Tulio Faria • 20 de junho de 2017\n\n[Carreira](/tag/carreira)\n\nHoje vou começar perguntando uma coisa, quantas linguagens você sabe programar?\n\nEssa foi uma das perguntas que recebi recentemente em uma live, achei bem interessante responder isso e mostrar algumas coisas que acho legal quando pensamos nessas quantidades.\n\nRespondendo quantas linguagens eu programo, na verdade, eu não sei, mas deve estar na faixa de umas dez linguagens. Hoje programo com JavaScript, JAVA, PHP, já programei em linguagens muito específicas como C, C++, Pascal, Delphi e por aí vai.\n\nUma coisa que acho bastante interessante e é também um ponto onde podemos evoluir na carreira é que ao invés de contar quantas linguagens, definir uma meta para cada item na carreira. Por exemplo, uma das coisas que defini como meta para mim é aprender um framework ou uma tecnologia nova por ano. Com isso, todo ano eu tenho que perceber que eu fui melhor que o ano anterior. Nos últimos 4 anos, eu fiquei muito encabulado com qualidade, então estou cada vez mais aplicando continuous integration, continuous deployment, teste unitário, etc.\n\nAlém de definir, também é importante se comprometer a completar essa meta. Não vale somente dizer que quer programar uma linguagem por ano, é importante definir o que é programar essa linguagem e conhecer a tecnologia. E como se faz isso? Colocamos em produção.",
      "description": "Hoje vou começar perguntando uma coisa, quantas linguagens você sabe programar? Essa foi uma das perguntas que recebi recentemente em uma live, achei bem i...",
      "keywords": [
        "linguagens",
        "essa",
        "para",
        "programar",
        "https",
        "carreira",
        "quantas",
        "isso",
        "definir",
        "quando"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/quantas-linguagens-programar"
      }
    },
    {
      "id": "8809d6de0b6fc000",
      "url": "https://devpleno.com/blog/4-novos-metodos/index",
      "title": "4 novos Métodos Strings que você precisa conhecer (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "tulio",
        "javascript",
        "console",
        "faria",
        "string",
        "para",
        "startswith",
        "endswith",
        "podemos",
        "partir"
      ],
      "metadata": {
        "title": "4 novos Métodos Strings que você precisa conhecer",
        "date": "2017-05-30",
        "tags": "['Javascript']",
        "thumbnail": "STRING-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/4-novos-metodos/index.md"
      }
    },
    {
      "id": "8842d7568d5c7714",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-1/index",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto (Part 2)",
      "content": "Agora vamos aos arquivos de apoio. Você vai receber um zip com os diretórios **data**, **public**, **views** e um arquivo **funções.js**. Dentro da pasta public, temos o css, imagens, o JavaScript e os áudios. Na views, temos os templates que vamos utilizar e a pasta data, que é o BD que eu preparei para podermos utilizar e consumir esses dados.\n\nDentro de public, vamos copiar tudo que está lá e colocar na pasta public do projeto. O data iremos copiar a pasta inteira e colocar na pasta raiz do projeto, e views iremos copiar um a um assim que for necessário.\n\n**Como foi gerado isso tudo pelo express generator?**\n\nO app.js é a base da nossa aplicação e segue uma boa prática do express, que é criar a aplicação nesse independente da parte que starta o servidor, que na nossa aplicação é em bin/www onde ele importa o app, define a porta e etc. Ele faz isso de uma maneira bem legal porque se quisermos criar testes, conseguimos apenas importando o app e rodamos em cima do app sem precisar realmente ouvir uma porta. Esse app.js também importa o routes que é nosso arquivo de rotas, ele diz o seguinte: quando você entrar no '/' vai renderizar o index. Aí ele irá em views e abrirá o index.ejs.\n\nComo ele sabe que o index está em views?\n\nSe voltarmos em app.js ele definiu que é um ejs que está dentro de views:\n\n```jsx\napp.set('views', path.join(__dirname, 'views'))\napp.set('view engine', 'ejs')\n```\n\nSe dermos um render, ele irá pegar o index. Vamos fazer um teste para ver se é isso mesmo, vamos mudar o Welcome e trocar por Olá para saber se estamos realmente alterando ele:\n\n```jsx\n<p>Olá <%= title %></p>\n```\n\nAgora, dentro desse index, iremos fazer uma lista de jogos, mais especificamente quais estão acontecendo nesse momento. Para fazermos isso, a primeira coisa que temos que fazer é utilizar um banco de dados baseado em json que se chama **lowdb**, então vamos dar um yarn nele:\n\n```jsx\nyarn add lowdb\n```\n\nEsse lowdb vai criar um banco novo onde iremos puxar os jogos de lá:",
      "keywords": [
        "vamos",
        "para",
        "match",
        "matches",
        "dentro",
        "views",
        "express",
        "index",
        "temos",
        "pasta"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 6,
        "sourcePath": "blog/minicurso-socket-io-parte-1/index.md"
      }
    },
    {
      "id": "88456fb518d21c04",
      "url": "https://devpleno.com/blog/projeto-certo-para-estudar-programacao/index",
      "title": "Qual o projeto certo para estudar programação? (Part 1)",
      "content": "Ao iniciar a jornada de estudos sobre programação, livros, vídeos, tutoriais e dicas em sites são os principais recursos para aprender como desenvolver um sistema que realiza uma determinada tarefa. Mas, depois de dominarmos as ferramentas de uma linguagem ficamos sem a noção de como seguir aprendendo mais e desenvolvendo nossas habilidades. O que mais acrescentaria aos meus conhecimentos sobre programação? Devo buscar novas fontes de informação para aprender? Quais serão os meus próximos desafios?\n\nÉ comum estarmos sem ideias de projetos que podemos criar para aprender mais sobre programação. Por isso, hoje vamos responder a seguinte pergunta do Eric Luz: “Que tipo de projeto posso utilizar para estudar?”\n\nNeste post, listamos três formas para continuar desenvolvendo aplicações e manter o seu ritmo de estudo em programação.\n\n### 1) Faça um projeto social\n\nA primeira forma de aprimorar seu aprendizado é procurar uma creche, asilo, orfanato ou uma instituição em prol dos animais e propor uma solução para determinado problema não resolvido. Além de colocar o desenvolvedor para usar suas ferramentas, esse exercício também provê algo bom para a sociedade. Alguns exemplos:\n\nVá a um orfanato próximo de sua casa, converse com os funcionários e veja se um sistema para organizar e administrar o estoque de mantimentos, utensílios, produtos de limpeza, brinquedos e doações seria útil;\n\nVá a um asilo e veja se eles precisam de uma aplicação para registrar e controlar as pessoas que visitam os idosos que moram ali;\n\nVá a uma ONG de proteção aos animais e veja se eles têm algum site ou meio de divulgar o seu trabalho.\n\nOutro ponto muito importante é que você tem a chance de colocar o projeto “no ar” ou “em produção” para que seja realmente utilizado no dia a dia traga benefícios para os seus usuários.\n\n### 2) Inspire-se em soluções do mercado",
      "keywords": [
        "para",
        "devpleno",
        "projeto",
        "como",
        "mais",
        "programa",
        "aplica",
        "https",
        "aprender",
        "suas"
      ],
      "metadata": {
        "title": "Qual o projeto certo para estudar programação?",
        "date": "2018-02-20",
        "tags": "['Carreira']",
        "thumbnail": "ProjetoCerto.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/projeto-certo-para-estudar-programacao/index.md"
      }
    },
    {
      "id": "88586ade1fc76381",
      "url": "https://devpleno.com/handlebars-template-html-simples",
      "title": "Template HTML simples - Hands-on Handlebars - DevPleno (Part 1)",
      "content": "Javascript\n\n## Template HTML simples - Hands-on Handlebars\n\nT\nPor Tulio Faria • 13 de junho de 2017\n\n[Javascript](/tag/javascript)\n\nO Handlebars é uma forma de lidarmos com template HTML. É algo simples, mas que possui diversas opções que podemos fazer. Vou mostrar um caso bem específico dele. Podemos utilizar com NodeJS, ExpressJS, mas eu vou mostrar em conjunto com jQuery para um tipo de solução que eu venho utilizando para fazer algumas coisas mais rápidas.\n\nTenho aqui um arquivo dados.json que vai servir para simular o consumo de uma EPI, vamos carregar os dados via AJAX para o html:\n\n;[{\nname: 'Tulio',\nlastName: 'Faria'\n},\n{\nname: 'Vitor',\nlastName: 'Machado'\n}]\nNo HTML, vamos importar da CDN o jQuery e o Handlebars e testar se estão carregando os nomes do Json:\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;div id=\"people\">\npeople\n&#x3C;/div>\n&#x3C;script src=\"https://code.jquery.com/jquery-3.2.1.slim.min.js\">&#x3C;/script>\n&#x3C;script src=\"https://cdnjs.cloudflare.com/ajax/libs/handleba\nrs.js/4.0.10/handlebars.amd.js\"&#x3C;/script>\n&#x3C;script>\n$function(){\n$.get('dados.json't=' +new Date().getTime(), function(data){\nconsole.log(data);\n}\n})\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nSe eu quiser criar uma lista com esses nomes para colocar na DIV ‘people’ e que seja da seguinte forma:\n\n&#x3C;div id='people'>\n&#x3C;div>\n&#x3C;strong>Name: &#x3C;/strong>nome\n&#x3C;br />\n&#x3C;strong>Last Name: &#x3C;/strong>last\n&#x3C;br />\n&#x3C;/div>\n&#x3C;/div>\nSe fossemos fazer isso com jquery teríamos que interpolar a string dentro da function, como por exemplo:",
      "description": "O Handlebars é uma forma de lidarmos com template HTML. É algo simples, mas que possui diversas opções que podemos fazer. Vou mostrar um caso bem específic...",
      "keywords": [
        "script",
        "strong",
        "html",
        "name",
        "handlebars",
        "people",
        "https",
        "template",
        "lastname",
        "function"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/handlebars-template-html-simples"
      }
    },
    {
      "id": "88eff3a7b205154b",
      "url": "https://devpleno.com/blog/precificacao-de-softwares-voce-sabe-como-fazer/index",
      "title": "Precificação de softwares: você sabe como fazer? (Part 3)",
      "content": "Se você domina mais de um tipo de [linguagem](https://www.devpleno.com/como-escolher-linguagem-de-tecnologia?utm_source=blog&utm_campaign=rc_blogpost) de programação, sabe trabalhar com análises especiais, entre outras competências, você poderá elevar o seu preço desde que esses conhecimentos sejam necessários nos projetos assumidos. Ou que possam entregar um adicional, otimizando-os.\n\nAlém disso, profissionais com maior experiência podem entregar serviços mais bem-acabados, justificando o valor a mais que cobram, mesmo que seja numa área com muita concorrência. Aqueles que possuem capacitação para consultoria também podem cobrar valores ainda maiores.\n\n### Valor agregado\n\nPara definir seu preço, você também precisa mensurar o quanto o seu trabalho rende. Por exemplo, se você cobra R$ 80,00 por hora, é importante que o seu trabalho renda para o cliente acima desse valor, como R$ 100,00 ou R$ 120,00 reais por hora.\n\nÉ importante também que você entregue um adicional que os seus concorrentes não façam, como um atendimento mais personalizado, possibilidade de maior número de ajustes, entre outros benefícios. Esses pontos possibilitam que você eleve o seu preço.\n\n### Os custos envolvidos\n\nComo mencionado acima, você precisa considerar seus custos, como a quantia paga com internet e telefone. É preciso pegar os valores de ambas e dividir pelas horas trabalhadas, para que você some esse número ao seu preço cobrado por hora, mesmo que existam momentos em que você utilize esses serviços para fins diferentes do trabalho. Afinal, você está compondo a sua remuneração para pagá-los também.\n\nSe você recebe por Paypal, por exemplo, é preciso acrescentar as taxas e porcentagem cobrados pelo serviço nas transferências. O mesmo vale na hora de receber por transferências bancárias, como DOCs ou TEDs.\n\n### Os impostos",
      "keywords": [
        "para",
        "software",
        "valor",
        "como",
        "mais",
        "tamb",
        "seus",
        "ncia",
        "trabalho",
        "hora"
      ],
      "metadata": {
        "title": "Precificação de softwares: você sabe como fazer?",
        "date": "2017-06-28",
        "tags": "['Carreira']",
        "thumbnail": "Precificacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "blog/precificacao-de-softwares-voce-sabe-como-fazer/index.md"
      }
    },
    {
      "id": "8915d10b8d768c85",
      "url": "https://devpleno.com/microfone-pelo-navegador",
      "title": "Capturando áudio do microfone pelo Navegador - DevPleno (Part 3)",
      "content": "mediaRecorder.onstop = () => {\nconst blob = new Blob(chunks, { type: 'audio/ogg; code=opus' })\nconst reader = new window.fileReader()\nreader.readAsDtaURL(blob)\nreader.onloadend = () => {\nconst audio = document.createElement('audio')\naudio.src = reader.result\naudio.controls = true\n$('body').append(audio)\n}\n}\nA partir disso podemos por exemplo mandar o áudio em um post, ou fazer o start e o stop baseado em um botão, assim cada vez que apertarmos um botão vai ser feito a ação. Isso abre um leque de possibilidades muito grande.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Capturando%20%C3%A1udio%20do%20microfone%20pelo%20Navegador&url=https%3A%2F%2Fdevpleno.com%2Fmicrofone-pelo-navegador) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmicrofone-pelo-navegador)",
      "description": "Hoje eu quero mostrar como podemos capturar um áudio do microfone pelo navegador. Da onde surgiu essa ideia? Nós construímos um chat em tempo real no Curso...",
      "keywords": [
        "mediarecorder",
        "para",
        "audio",
        "stream",
        "reader",
        "udio",
        "podemos",
        "script",
        "https",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/microfone-pelo-navegador"
      }
    },
    {
      "id": "891ad0abbf857fd6",
      "url": "https://devpleno.com/arvore-binaria-de-busca",
      "title": "Árvore Binária de Busca em JavaScript - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Árvore Binária de Busca em JavaScript\n\nT\nPor Tulio Faria • 3 de julho de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nHoje vamos falar mais sobre árvores binárias, porém um tipo específico, a árvore binária de busca.\n\n**Qual a diferença da árvore binária de busca para a árvore binária normal?**\n\nNa normal, simplesmente inserimos os nós dentro da árvore sem garantir nenhuma regra, já a de busca segue a seguinte regra:\n\nTemos a raiz e inserimos um valor nessa raiz. Quando inserimos o segundo valor, se for maior que a raiz, ele fica à direita, se ele for menor, ficará à esquerda. Com isso conseguimos fazer muitas outras operações utilizando essa árvore binária.\n\nPrimeiramente vamos fazer a inserção em uma árvore binária de busca. Para fazermos isso, temos que checar se essa árvore tem algum valor, depois verificamos se ele é maior ou menor para inserirmos para left ou right.\n\nconst arvore = {}\n\nfunction insert(tree, value) {\nif (tree.value) {\nif (value > tree.value) {\ninsert(tree.right, value)\n} else {\ninsert(tree.left, value)\n}\n} else {\ntree.value = value\n\ntree.right = {}\n\ntree.left = {}\n}\n}\n\ninsert(arvore, 10)\n\nconsole.log(arvore)\nSe não for inserido o tree.value, vai ser igual a value, o tree.right e tree.left serão árvores vazias. Eu estou definindo isso porque quando inserirmos podemos passar uma árvore vazia no insert e ele continua fazendo isso de forma recursiva. Colocando o valor 10, perceba que será retornado: Se inserirmos, por exemplo, um valor 11 em seguida:\n\ninsert(arvore, 10)\n\nconsole.log(arvore)\n\ninsert(arvore, 11)\n\nconsole.log(arvore)\nSerá retornado o seguinte:\n\nAgora vamos colocar o valor 9:\n\ninsert(arvore, 10)\n\nconsole.log(arvore)\n\ninsert(arvore, 11)\n\nconsole.log(arvore)\n\ninsert(arvore, 9)\n\nconsole.log(arvore)\nSerá retornado o seguinte: Na primeira inserção, retorna 10, na segunda 10 e 11 e na terceira 10, 11 e 9, sendo 11 do lado direito, 9 do lado esquerdo e 10 nossa raiz. Vamos colocar um 8 agora:\n\ninsert(arvore, 10)\n\nconsole.log(arvore)",
      "description": "Hoje vamos falar mais sobre árvores binárias, porém um tipo específico, a árvore binária de busca. Qual a diferença da árvore binária de busca para a árvor...",
      "keywords": [
        "arvore",
        "insert",
        "rvore",
        "tree",
        "value",
        "console",
        "busca",
        "isso",
        "para",
        "valor"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/arvore-binaria-de-busca"
      }
    },
    {
      "id": "897271e5c2984fcd",
      "url": "https://devpleno.com/injecao-de-dependencia",
      "title": "Injeção de dependência - Aumente a testabilidade do seu código - DevPleno (Part 1)",
      "content": "Javascript\n\n## Injeção de dependência - Aumente a testabilidade do seu código\n\nT\nPor Tulio Faria • 1 de junho de 2017\n\n[Javascript](/tag/javascript)\n\nPode parecer besteira, mas eu sempre ouvia sobre injeção de dependência. porém nunca tinha refletido tanto sobre ela. Quando passei a testar mais o meu código com teste unitário, comecei a usar essa técnica e percebi que fez muita diferença. Para contextualizar, vamos supor que temos o código:\n\nconst model = require('./model1')\n\nfunction findAll() {\nreturn model.find({})\n}\nDesconsiderando a parte assíncrona, temos, por exemplo, uma função que depende do model que está em um contexto externo. Quando estamos no ambiente de testes, perdemos totalmente a visibilidade de onde ele está, isso deixa extremamente complicado para realizarmos um teste de forma unitária já que dependemos do ambiente para ele rodar.\n\nNo contexto do Node, quando vamos testar, temos apenas o escopo da função, não temos o escopo de onde ele está sendo executado, inclusive se rodarmos com mocka, o contexto será do mocka e não um global.\n\nSe passarmos ele para dependência, passando como model, na hora de chamar essa função temos que injetar esse model\n\nfunction findAll(model) {\nreturn model.find({})\n}\nconst modelAA = require('./model1')\nfindAll(modelAA)\nEstou simplificando bastante apenas para ilustrar, já que até assim seria ruim. Precisaríamos de uma forma melhor de organizar, mas mesmo assim temos uma visibilidade maior do código. Eu sei que findAll depende do model, coisa que eu não sabia antes, pois na função eu não sabia que ela dependia de model. Então, quando fazemos injeção de dependência, estamos dando uma documentação ‘a mais’, afinal ele é um código que se auto descreve. Ele também fica um pouco mais puro, pois dependemos apenas dos parâmetros para fazer o que queremos, já que não há dependência externa.",
      "description": "Pode parecer besteira, mas eu sempre ouvia sobre injeção de dependência. porém nunca tinha refletido tanto sobre ela. Quando passei a testar mais o meu cód...",
      "keywords": [
        "alert",
        "para",
        "digo",
        "model",
        "depend",
        "quando",
        "ncia",
        "vamos",
        "temos",
        "return"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/injecao-de-dependencia"
      }
    },
    {
      "id": "898c7ee0aa7c2bab",
      "url": "https://devpleno.com/como-cobrar-por-software",
      "title": "Como cobrar por Software - DevPleno (Part 4)",
      "content": "Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20cobrar%20por%20Software&url=https%3A%2F%2Fdevpleno.com%2Fcomo-cobrar-por-software) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-cobrar-por-software)",
      "description": "Para precificar software, alguns fatores devem ser levados em consideração e você deve responder algumas perguntas a si mesmo. Confira: O que você está ven...",
      "keywords": [
        "hora",
        "para",
        "valor",
        "mais",
        "horas",
        "muito",
        "projeto",
        "ncia",
        "exemplo",
        "https"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/como-cobrar-por-software"
      }
    },
    {
      "id": "8a0e6467bf65b8e8",
      "url": "https://devpleno.com/blog/npm-e-modulos-de-terceiros/index",
      "title": "NPM e Módulos de Terceiros - NodeJS (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "depend",
        "string",
        "isso",
        "dulos",
        "projeto",
        "para",
        "quando",
        "node",
        "qual",
        "ncias"
      ],
      "metadata": {
        "title": "NPM e Módulos de Terceiros - NodeJS",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "NpmEModulos.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/npm-e-modulos-de-terceiros/index.md"
      }
    },
    {
      "id": "8a3d52a2ea6dacbf",
      "url": "https://devpleno.com/javascript-streams-p-1-readable-streams",
      "title": "Javascript: Streams (P-1: Readable Streams) - DevPleno",
      "content": "Javascript\n\n## Javascript: Streams (P-1: Readable Streams)\n\nT\nPor Tulio Faria • 24 de abril de 2017\n\n[Javascript](/tag/javascript)\n\nNeste vídeo, um assunto bastante interessante para ser utilizado no dia-a-dia: Streams. A primeira parte fala sobre readable streams ou streams de leitura.\n\nERRA:\n\nO evento ‘readable’ é disparado sempre que a tem dados disponíveis, assim, poderíamos trocar o while por if (pois ele também será chamado no fim do stream).\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Javascript%3A%20Streams%20(P-1%3A%20Readable%20Streams)&url=https%3A%2F%2Fdevpleno.com%2Fjavascript-streams-p-1-readable-streams) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fjavascript-streams-p-1-readable-streams)",
      "description": "Neste vídeo, um assunto bastante interessante para ser utilizado no diaadia: Streams. A primeira parte fala sobre readable streams ou streams de leitura. E...",
      "keywords": [
        "streams",
        "https",
        "javascript",
        "readable",
        "para",
        "devpleno",
        "facebook",
        "20streams",
        "2fdevpleno",
        "2fjavascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/javascript-streams-p-1-readable-streams"
      }
    },
    {
      "id": "8a5a3baefd64fda0",
      "url": "https://devpleno.com/blog/carreira-tomar-decisoes/index",
      "title": "Carreira: Tomar decisões",
      "content": "Você toma decisões na sua equipe? Mesmo não sendo o líder?\n\nVocê líder deixa as pessoas tomarem decisões?\n\nNeste vídeo faço uma pequena reflexão sobre como decisões podem desenrolar e deixar equipes e empresas muito mais produtivas.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/0xSnZSKiAu4\" allowfullscreen></iframe>\n</div>\n\nNão esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Um abraço!",
      "keywords": [
        "embed",
        "decis",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "toma"
      ],
      "metadata": {
        "title": "Carreira: Tomar decisões",
        "date": "2017-04-04",
        "tags": "['Carreira']",
        "thumbnail": "maxresdefault-1-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/carreira-tomar-decisoes/index.md"
      }
    },
    {
      "id": "8a5c9ae346248855",
      "url": "https://devpleno.com/dica-debug-nodejs-com-chrome-devtools",
      "title": "Dica: Debug NodeJS com Chrome DevTools - DevPleno (Part 2)",
      "content": "Então vamos colocar essa URL no Chrome e ele já para na primeira linha do meu código executável. Vamos colocar um break point e dar um resume para ver o que acontece: Como é uma função executável ele mostra para mim algo muito semelhante ao teste de mesa que é executar passo a passo o algoritmo.\n\nE eu posso também ir passando linha a linha apenas clicando no botão usado anteriormente e ele vai mostrar como está o valor que foi alterado.\n\nCom isso nós conseguimos saber exatamente oque está acontecendo no nosso algoritmo, fazer a depuração do script de uma forma mais precisa, ainda mais quando é uma função pura porque conseguimos injetar os valores e ir testando passo a passo.\n\n## Confira o video:\n\nNão esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder nenhuma atualização.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Debug%20NodeJS%20com%20Chrome%20DevTools&url=https%3A%2F%2Fdevpleno.com%2Fdica-debug-nodejs-com-chrome-devtools) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-debug-nodejs-com-chrome-devtools)",
      "description": "A dica de hoje é sobre como podemos fazer o debug dos nossos scripts em Node (de um script que fica rodando direto como o express e de um script simples) u...",
      "keywords": [
        "para",
        "debug",
        "chrome",
        "https",
        "nodejs",
        "devtools",
        "como",
        "script",
        "linha",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/dica-debug-nodejs-com-chrome-devtools"
      }
    },
    {
      "id": "8acd153a4c738ce5",
      "url": "https://devpleno.com/blog/pilha/index",
      "title": "Estruturas de Dados - Pilhas (Part 1)",
      "content": "Hoje vamos falar um pouco sobre uma estrutura de dados que é muito comum em computação, principalmente em sua base, a Pilha. O primeiro conceito que temos que saber sobre Pilha é que ela segue o conceito de LIFO (Last In First Out), então o último que entra é o primeiro que sai. Uma coisa bem legal em JavaScript é que já temos uma Pilha naturalmente no vetor, então se fizermos, por exemplo:\n\n```jsx\nconst vetor = []\nvetor.push(1)\nvetor.push(2)\nconsole.log(vetor.pop())\nconsole.log(vetor)\n```\n\nPercebam que quando desempilhamos ele volta o último item que foi empilhado e modifica o vetor. Agora vamos implementar isso sem precisar utilizar o vetor dessa forma, criando nossa própria implementação de stack:\n\n```jsx\nconst Stack = () => {\n  const data = []\n  let top = -1\n}\n```\n\nComo estamos fazendo no modo funcional, não temos o this, estamos guardando apenas no próprio contexto e podemos retornar os métodos que queremos criar:\n\n```jsx\nconst Stack = () => {\n  const data = []\n  let top = -1\n  const push = (value) => {\n    top++\n    data[top] = value\n    console.log(data)\n  }\n  return {\n    push\n  }\n}\nconst stack = Stack\nstack.push(1)\nstack.push(2)\n```\n\nPerceba que ele está montando o vetor perfeitamente adicionando sempre na frente. Agora precisamos remover esse último item:\n\n```jsx\nconst push = (value) => {\n  top++\n  data[top] = value\n  console.log(data)\n}\nconst pop = () => {\n  if (top < 0) {\n    return false\n  } else {\n    const itemToReturn = data[top]\n    delete data[top]\n    top--\n    return itemToReturn\n  }\n}\nreturn {\n  push,\n  pop\n}\nconsole.log(stack.pop())\n```\n\nAgora funcionou perfeitamente, ele retirou o um e deixou apenas o dois. Vamos criar um novo método chamado print para sabermos como está a estrutura:\n\n```jsx\nconst print = () => {\n  console.log(data)\n}\nreturn {\n  push,\n  pop,\n  print\n}\n```\n\nPerceba que nós temos um item vazio, então ele não removeu esse item. Ao invés de utilizar o delete, podemos utilizar o splice:",
      "keywords": [
        "const",
        "data",
        "vetor",
        "push",
        "stack",
        "console",
        "item",
        "return",
        "pilha",
        "temos"
      ],
      "metadata": {
        "title": "Estruturas de Dados - Pilhas",
        "date": "2017-08-21",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Pilha.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/pilha/index.md"
      }
    },
    {
      "id": "8ad54a4dfc5c4478",
      "url": "https://devpleno.com/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador",
      "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador - DevPleno (Part 2)",
      "content": "Ideal para:** devs com experiência sólida que querem projetos de alto nível pagos em dólar.\n\n## 2. Upwork\n\nO [Upwork](https://www.upwork.com) é a maior plataforma de freelance do mundo. Você cria um perfil, anexa seu portfólio e se candidata a projetos de clientes internacionais. Há trabalhos pagos por hora e por projeto, em áreas como JavaScript, Python, React, Node.js, mobile e muito mais.\n\nA plataforma funciona com um sistema de propostas — você encontra um projeto, envia sua oferta com preço e prazo, e o cliente escolhe. Conforme você acumula avaliações positivas, fica mais fácil conseguir projetos melhores. O pagamento é em dólar.\n\n**Ideal para:** qualquer nível de experiência, especialmente quem quer começar a trabalhar para o exterior.\n\n## 3. Freelancer.com\n\nO [Freelancer.com](https://www.br.freelancer.com) é um dos maiores marketplaces do mundo, com milhões de usuários. A plataforma oferece projetos em diversas áreas — programação, desenvolvimento de apps, HTML, processamento de dados e mais.\n\nVocê se cadastra, participa de testes que certificam suas habilidades e se candidata aos projetos disponíveis. Há também categorias de concursos e programas de freelancer preferencial com comissões menores.\n\n**Ideal para:** quem está começando e quer construir um portfólio com projetos variados.\n\n## 4. Workana\n\nO [Workana](https://www.workana.com/pt) tem foco na América Latina e oferece milhares de projetos, desde desenvolvimento web e mobile até tradução e design. Uma vez cadastrado, você pesquisa projetos que se encaixam nas suas habilidades, compara os que pagam por hora vs. preço fixo, e envia propostas.\n\nA plataforma é bastante usada no Brasil e em toda a América Latina, o que facilita a comunicação — muitos projetos são em português ou espanhol.\n\n**Ideal para:** devs que preferem projetos em português/espanhol e querem começar no mercado freelancer latino-americano.\n\n## 5. 99Freelas",
      "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
      "keywords": [
        "para",
        "projetos",
        "https",
        "mais",
        "como",
        "freelancer",
        "plataforma",
        "come",
        "ideal",
        "trabalhar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador"
      }
    },
    {
      "id": "8aeb5c06308f94f8",
      "url": "https://devpleno.com/blog/patternite/index",
      "title": "Entenda o que é Patternite (Part 2)",
      "content": "```jsx\n<html>\n  <head>\n    <tittle>POO2JS</tittle>\n  </head>\n  <body>\n    <h1>Olá</h1>\n  </body>\n</html>\n```\n\nIsso são coisas que naturalmente eu iria perceber que iria acontecer. Caso a gente queira criar mais páginas, começa a perceber que existe um certo padrão. Se quiséssemos saber como a minha aplicação está realmente funcionando, é muito melhor saber qual a URL e para onde ele manda.\n\nPara não ficar uma bagunça, poderíamos por exemplo, criar um arquivo routes e colocar nossas rotas lá dentro:\n\n```jsx\nconst app = require('express').Router()\napp.get('/', (req, res) => {\n  res.render('home')\n})\napp.get('/page1', (req, res) => {\n  res.render('page1')\n})\napp.get('/page2', (req, res) => {\n  res.render('page2')\n})\nmodule.exports = app\n```\n\nAgora, no nosso código inicial, podemos fazer o seguinte:\n\n```jsx\nconst express = require('express')\nconst app = express()\napp.set('view engine', 'ejs')\nconst routes = require('./routes')\napp.use(routes)\napp.listen(3000, (err) => console.log(err, 'server'))\n```\n\nPerceba que eu estou classificando as coisas de uma maneira que faz sentido para mim. A gente começou simplesmente com o arquivo index.\n\nEntão o meu conselho é que se comece construindo tudo em um arquivo apenas e, com o tempo, você percebe que as coisas conseguem se agrupar.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/v0c_02nrMZI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "express",
        "const",
        "para",
        "mais",
        "criar",
        "dentro",
        "require",
        "pattern",
        "arquivo",
        "seguinte"
      ],
      "metadata": {
        "title": "Entenda o que é Patternite",
        "date": "2017-11-10",
        "tags": "['Javascript']",
        "thumbnail": "Patternite.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/patternite/index.md"
      }
    },
    {
      "id": "8b228d33d5370a33",
      "url": "https://devpleno.com/gerenciador-de-series-p1",
      "title": "Construindo um App gerenciador de séries com ReactJS - DevPleno (Part 3)",
      "content": "Um componente no React é uma junção de um ‘template’ mais um pouco de comportamento e, dependendo de como organizamos isso, podemos ter mais ou menos elementos. Essa forma de utilizar componentes permite uma reutilização de códigos muito grande. Por exemplo, se abrir o app.js, você vai perceber que há um class app extends component, que é do próprio React que estamos estendendo.\n\nTambém é possível perceber que temos um método Render que renderiza algo na tela. Temos como se fosse um HTML:\n\nEsse HTML, na verdade, não é HTML, é o que chamamos de JSX.\n\n**O que é o JSX?**\n\nÉ uma forma que o React achou para representar elementos ou hierarquia de elementos em JavaScript de uma maneira que pareça HTML. Com isso, ao invés de criarmos uma árvore de elementos em JavaScript, que seria algo muito complexo, eles criaram uma anotação que com algo semelhante a HTML e transforma isso depois em código quando precisa ser renderizado na tela. Quando ele percebe que tem um div, o react-dom ele transforma em HTML, mas o className continua, pois é uma palavra reservada do JavaScript.\n\nVoltando ao App, temos algumas regrinhas: a primeira delas é que o render, que é o método responsável pelo que vai ser renderizado na tela, sempre retorna um elemento, por isso temos uma div que começa e é fechado mais abaixo. A segunda coisa importante é que quando o elemento começa com letra minúscula, ele já sabe que esse elemento é uma Tag do HTML, como por exemplo o div e o img, já se usarmos letra maiúscula ele sabe que é um componente. Outro item importante, perceba que importamos o React e o Componente, mas não os utilizamos explicitamente, eles vão ser utilizados na hora que tivermos escrevendo JSX.\n\nVamos criar um componente agora para você ter essa ideia de como é criado, por exemplo Ola.js.\n\nA primeira coisa é importar o React e o componente, depois vamos criar a classe estendendo o componente, lembrando que todo componente deve ter um render, que deve retornar algo:",
      "description": "Nesta nova série, vamos construir um aplicativo na prática, mais especificamente um gerenciador de séries, para você nunca mais esquecer as séries que assi...",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/gerenciador-de-series-p1"
      }
    },
    {
      "id": "8b622544bf5ae6d9",
      "url": "https://devpleno.com/hands-on-currying",
      "title": "Hands-on: Currying - DevPleno",
      "content": "Javascript\n\n## Hands-on: Currying\n\nT\nPor Tulio Faria • 17 de abril de 2017\n\n[Javascript](/tag/javascript)\n\nContinuando o assunto sobre programação funcional, o assunto deste vídeo é Currying - uma técnica bastante interessante para composição de funções.\n\n## Confira:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Currying&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-currying) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-currying)",
      "description": "Continuando o assunto sobre programação funcional, o assunto deste vídeo é Currying  uma técnica bastante interessante para composição de funções.  Confira...",
      "keywords": [
        "https",
        "currying",
        "javascript",
        "hands",
        "assunto",
        "para",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fhands"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-currying"
      }
    },
    {
      "id": "8b67e5e74258177a",
      "url": "https://devpleno.com/nivel-de-ingles-para-a-toptal",
      "title": "Qual o nível de inglês para trabalhar por meio da Toptal? - DevPleno",
      "content": "Carreira\n\n## Qual o nível de inglês para trabalhar por meio da Toptal?\n\nT\nPor Tulio Faria • 15 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nO inglês é um fator importante para ingressar na Toptal, já que toda comunicação é feita nesse idioma. Mas qual o nível de inglês necessário? Descubra neste vídeo.\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\nSaiba mais [sobre o DevReactJS aqui.](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Qual%20o%20n%C3%ADvel%20de%20ingl%C3%AAs%20para%20trabalhar%20por%20meio%20da%20Toptal%3F&url=https%3A%2F%2Fdevpleno.com%2Fnivel-de-ingles-para-a-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnivel-de-ingles-para-a-toptal)",
      "description": "O inglês é um fator importante para ingressar na Toptal, já que toda comunicação é feita nesse idioma. Mas qual o nível de inglês necessário? Descubra nest...",
      "keywords": [
        "https",
        "para",
        "toptal",
        "devpleno",
        "blog",
        "carreira",
        "qual",
        "ingl",
        "mais",
        "profissionais"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/nivel-de-ingles-para-a-toptal"
      }
    },
    {
      "id": "8b9d7e1107a07bc6",
      "url": "https://devpleno.com/socket-io-parte1",
      "title": "Comunicação em tempo-real com Node e Socket.io - DevPleno (Part 3)",
      "content": "Perceba que o módulo já descobriu qual a melhor forma de se conectar, no caso websocket, o interessante é que, se caso a conexão pare ao voltar, ele irá se reconectar sozinho, então não precisamos nos preocupar se o usuário está conectado ou não, pois tratamos na interface a medida que novas conexões vão surgindo. A única preocupação que temos é de checar se o estado da conexão que o usuário deixou continua valendo.\n\nCada socket que temos é gerado um ID da conexão para cada usuário, vamos escrever o ID para saber qual é:\n\nio.on('connection', (socket) => {\nconsole.log('New connection', socket.id)\n})\n**Conclusão**\n\nJá deu para termos uma ideia do que é o Socket.io, e este é um assunto que rende muito conteúdo, pois é muito extenso, temos vários desafios para fazê-lo funcionar bem, mas agora já temos uma base de como ele funciona.\n\nEm breve tem a parte 2 deste hands-on.\n\nEnquanto isso confira o também o vídeo dessa primeira parte:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Comunica%C3%A7%C3%A3o%20em%20tempo-real%20com%20Node%20e%20Socket.io&url=https%3A%2F%2Fdevpleno.com%2Fsocket-io-parte1) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsocket-io-parte1)",
      "description": "O que é Socket.io e para que vamos precisar dele? Socket.io é uma implementação em node para web socket, ou seja, uma forma de fazer comunicação em tempo r...",
      "keywords": [
        "socket",
        "para",
        "http",
        "const",
        "require",
        "vamos",
        "html",
        "express",
        "temos",
        "conex"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/socket-io-parte1"
      }
    },
    {
      "id": "8bede6f5a7915cac",
      "url": "https://devpleno.com/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira - DevPleno (Part 5)",
      "content": "[](https://twitter.com/intent/tweet?text=Freelancer%20no%20exterior%3A%207%20dicas%20para%20ter%20sucesso%20na%20carreira&url=https%3A%2F%2Fdevpleno.com%2Ffreelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffreelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira)",
      "description": "O trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho. No entanto, a maiori...",
      "keywords": [
        "para",
        "freelancer",
        "trabalho",
        "exterior",
        "https",
        "carreira",
        "pode",
        "mais",
        "isso",
        "como"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira"
      }
    },
    {
      "id": "8bfe6555980e9dd0",
      "url": "https://devpleno.com/express-generator",
      "title": "Gere seu projeto em Express - Hands-on: Express-Generator - DevPleno (Part 1)",
      "content": "Javascript\n\n## Gere seu projeto em Express - Hands-on: Express-Generator\n\nT\nPor Tulio Faria • 6 de junho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste hands-on, vamos falar sobre o Express-Generator, um gerador de projetos em expressJS. Com ele conseguimos criar a base da nossa aplicação. Primeiramente, para instalar o generator, faça o seguinte comando:\n\nnpm install -g express-generator\nLembrando que usando o express -h aparece uma lista com algumas opções, o que é muito legal para podermos escolher a linguagem de template que queremos utilizar, como por exemplo —ejs. O default dele é o —pug ou —jade.\n\nÉ possível também adicionar um compilador de CSS. Para o exemplo ficar mais completo, vou colocar tudo no projeto. No diretório pai que quero construir minha aplicação, vou colocar:\n\ndica-express --ejs --git --css sass\nE em seguida, para instalar as dependencias, vou digitar:\n\nyarn\nFeito isso, se dermos um cd dica-express/ acessamos o diretório e com o ls -l podemos ver que temos todo os arquivos com detalhe. Usando o ./ podemos abrir no visual code e ver a estrutura que acabamos de criar com o express-generator:\n\nÉ interessante, pois a aplicação é construida no app.js e ainda cria uma boa prática, que é exportar o app, e quem vai iniciar esse app (no caso o bin/www) é quem vai definir as portas e etc.\n\nQual a vantagem disso? Quando formos criar testes em trend para EPI, por exemplo, podemos importar o app e rodar os testes em cima disso e não necessariamente abrir uma porta. O teste controla isso. Na pasta pub, tem o meu style.sass, que é o meu estilo configurado para SaSS.\n\nNo package.json, já tem alguns scripts para conseguirmos utilizar. Podemos, então, fazer um yarn start para abrir o projeto no browser utilizando o localhost:3000 . Perceba que ele já faz a compilação do SaSS pelo app\n\nvar sassMiddleware = require(‘node-sass-middleware’);",
      "description": "Neste handson, vamos falar sobre o ExpressGenerator, um gerador de projetos em expressJS. Com ele conseguimos criar a base da nossa aplicação. Primeirament...",
      "keywords": [
        "para",
        "express",
        "generator",
        "sass",
        "https",
        "aplica",
        "podemos",
        "javascript",
        "projeto",
        "criar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/express-generator"
      }
    },
    {
      "id": "8c5ce305b4309b0c",
      "url": "https://devpleno.com/blog/hands-on-co/index",
      "title": "Hands-on: CO",
      "content": "Neste hands-on iremos usar o CO, um módulo que permite que você organize o fluxo de seu código assíncrono com generators, o que faz seu código parecer muito com código síncrono.\n\n## Confira:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/IXsxtIZuY90\" allowfullscreen></iframe>\n</div>\n\nDeixe suas sugestões e dúvidas nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), inscreva-se no canal e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "digo",
        "responsive",
        "ncrono",
        "classname",
        "iframe",
        "https",
        "devpleno",
        "facebook",
        "neste"
      ],
      "metadata": {
        "title": "Hands-on: CO",
        "date": "2017-03-07",
        "tags": "['Javascript']",
        "thumbnail": "handsOnCo.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-co/index.md"
      }
    },
    {
      "id": "8cb8dd6e9a5b7800",
      "url": "https://devpleno.com/hrn0012019",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /hrn0012019 to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "https",
        "devpleno",
        "devreactjs",
        "redirecting",
        "from",
        "hrn0012019"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hrn0012019"
      }
    },
    {
      "id": "8ccd6966269238ac",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-1/index",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto (Part 6)",
      "content": "Na próxima aula, iremos começar a colocar o socket.IO nessa interface, ligando ele nas duas pontas, tanto no client quanto no servidor para conseguirmos distribuir essas atualizações em tempo real. Baixe os arquivos e apoio e vai ver que está tranquilo de entender, assim não vamos perder tanto tempo com layout e vamos direto para o que interessa, esse layout é apenas para caso você queira demonstrar um projeto, pois ele já fica com cara mais profissional.\n\nConfira a aula em vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Yquf8dNe89w\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "vamos",
        "para",
        "match",
        "matches",
        "dentro",
        "views",
        "express",
        "index",
        "temos",
        "pasta"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 5,
        "totalChunks": 6,
        "sourcePath": "blog/minicurso-socket-io-parte-1/index.md"
      }
    },
    {
      "id": "8d20287b4c457f2e",
      "url": "https://devpleno.com/blog/tudo-acontece-duas-vezes/index",
      "title": "Tudo na vida acontece duas vezes!",
      "content": "Você sabia que tudo que você pensa acontece duas vezes? Uma vez na sua cabeça e outra vez quando você implementa ou realiza isso de fato. Isso acontece com tudo, desde o código que você está programando até um projeto que está implementando.\n\nO detalhe é que toda vez que você for pensar em projetos ou qualquer outra coisa que queira realizar, pense com um máximo de detalhes, sentimentos e sensações que você puder. Por exemplo, se você sonha em ter sua startup de tecnologia, sonhe com você acordando cedo, trocando de roupa empolgado e entrando nela, sentindo o cheiro do ambiente... Quando mais dessas sensações você conseguir sentir, mais vai estar preparado na hora de implementar.\n\nOs pensamentos limitantes são o contrário de você pensar duas vezes, porque você usa esse poder da mente no modo negativo, ou simplesmente não usa. Quando começamos a visualizar as coisas positivas, estamos realmente usando ela para alcançar coisas novas.\n\nVamos supor que você quer comprar um carro novo, imagine você dirigindo o carro, sentindo o cheiro dele… Você vai perceber que vai ficar mais próximo de comprar um carro novo do que se você só estivesse vendo uma foto de revista, por exemplo. Então faça isso irá perceber que vai prosperar muito na carreira.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/MUqyTezv0ts\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "quando",
        "isso",
        "mais",
        "carro",
        "responsive",
        "https",
        "tudo",
        "acontece",
        "duas"
      ],
      "metadata": {
        "title": "Tudo na vida acontece duas vezes!",
        "date": "2017-09-08",
        "tags": "['Carreira']",
        "thumbnail": "TudoAcontece2x.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/tudo-acontece-duas-vezes/index.md"
      }
    },
    {
      "id": "8d5b1988ef064ea1",
      "url": "https://devpleno.com/devreactjs",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs"
      }
    },
    {
      "id": "8da70d7db4e62d20",
      "url": "https://devpleno.com/blog/hands-on-currying/index",
      "title": "Hands-on: Currying",
      "content": "Continuando o assunto sobre programação funcional, o assunto deste vídeo é Currying - uma técnica bastante interessante para composição de funções.\n\n## Confira:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/rec4I8zfYjc\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "assunto",
        "para",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Hands-on: Currying",
        "date": "2017-04-17",
        "tags": "['Javascript']",
        "thumbnail": "Currying.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-currying/index.md"
      }
    },
    {
      "id": "8db99c402088d769",
      "url": "https://devpleno.com/blog/chocolatey/index",
      "title": "Chocolatey - Gerenciador de Pacotes para Windows",
      "content": "Essa dica é para você utiliza o windows para desenvolvimento: um package manenger chamado chocolatey, semelhante ao yum. Ele facilita bastante quando vamos instalar algumas dependências ou pacotes de software como o NodeJS.\n\n**Como instalar o chocolatey?**\n\nA primeira coisa é entrar em [https://www.chocolatey.org/install](https://www.chocolatey.org/install){:rel=\"nofollow\"}, rodar o CMD.exe como administrador e copiar esse trecho de código:\n\n```jsx\n@powershell -NoProfile -ExecutionPolicy Bypass -Command \"iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))\" && SET \"PATH=%PATH%;%ALLUSERSPROFILE%\\\\chocolatey\\\\bin\"\n```\n\nCole no CMD, dê enter e espere a instalação. Pronto! Agora vamos fazer um teste para instalar alguma dependência.\nNote que no site há uma aba Packeges, nele temos todos os pacotes disponíveis para instalação. Vamos tentar instalar o 7zip. Selecione a linha de código referente ao programa e cole no CMD:\n\n```jsx\nchoco install 7zip.install\n```\n\nAparecerá uma mensagem para aceitar as licenças do pacote e, em seguida, que o pacote foi aprovado. Então perguntará se quer rodar o script, aperte Y para continuar. Pronto, o 7Zip está instalado na sua máquina.\n\nEste é um utilitário muito interessante, pois podemos instalar Java, NodeJS, Python… Tudo a partir desse gerador de dependência. Facilita bastante para nós que sempre temos que ficar instalando algumas coisas no ambiente de desenvolvimento.\n\nConfira os passos no vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/RfbgCBCWME8\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "chocolatey",
        "https",
        "instalar",
        "install",
        "embed",
        "vamos",
        "depend",
        "como",
        "7zip"
      ],
      "metadata": {
        "title": "Chocolatey - Gerenciador de Pacotes para Windows",
        "date": "2017-05-29",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "CHOCOLATEY-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/chocolatey/index.md"
      }
    },
    {
      "id": "8dc9191dca81809d",
      "url": "https://devpleno.com/blog/preconceito-com-js-nao-preparado-para-corporativo/index",
      "title": "Preconceito com JS? Não preparado para corporativo?",
      "content": "Hoje quero falar mais um pouco sobre o POO para JavaScript. Basicamente as últimas considerações sobre essa transição e o preconceito que o JavaScript enfrenta.\n\nPor que isso acontece?\n\nPrincipalmente porque o JavaScript já foi muito simples, mas estamos entrando em um mundo onde está sendo padronizado o JavaScript como linguagem front-end e isso é muito bom. Quando falamos do Servidor, também temos essa maturidade da linguagem, principalmente quando grandes empresas como Wallmart começaram a utilizar do javaScript.\n\nOutra coisa que está quebrando essa barreira é o tooling, muitas das ferramentas que utilizamos hoje é construído com o NODE e baseado no NPM.\n\nMas o grande detalhe é, se você está vindo de JAVA, PHP ou qualquer outra linguagem, tente não ter esse preconceito do JavaScript. Não se leve pela simplicidade da linguagem porque ela é bem poderosa.\n\nUma vantagem do que eu vejo hoje e ajuda a quebrar o preconceito é que muitas empresas estão preferindo desenvolvedores JavaScript do que em outras stacks. Um ponto que gostaria de deixar realçado é que o conceito de melhor, pior, certo e errado é muito relativo. Eu aprendi muito isso durante meu mestrado. Hoje eu acredito que algum paradigma mais funcional fica mais elegante dentro do JavaScript, mas é muito difícil colocar pontos. Quanto mais a gente conseguir pensar que essas ferramentas e o que a gente conhece, aumenta a nossa bagagem para saber o que é melhor ou pior naquela situação específica.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/8yEMB8NGrI0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "javascript",
        "muito",
        "hoje",
        "mais",
        "linguagem",
        "embed",
        "para",
        "essa",
        "preconceito",
        "isso"
      ],
      "metadata": {
        "title": "Preconceito com JS? Não preparado para corporativo?",
        "date": "2017-11-10",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "PreconceitoJS.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/preconceito-com-js-nao-preparado-para-corporativo/index.md"
      }
    },
    {
      "id": "8dfde5b8213cc36a",
      "url": "https://devpleno.com/tag/nodejs/5",
      "title": "NodeJS - Pagina 5 - DevPleno",
      "content": "NodeJS\n\n## Arquivo de Insights\n\n58 posts encontrados com a tag NodeJS\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 28 de dez. de 2016 O que é o app.use no NodeJS/ExpressJS?](/o-que-e-o-app-use-no-nodejsexpressjs)\n\n[Javascript 4 de out. de 2016 Como converter uma string em Base64 em JavaScript (Navegador e NodeJS)](/como-converter-uma-string-em-base64-em-javascript-navegador-e-nodejs)\n\n[Javascript 3 de out. de 2016 Mongoose: corrigindo \"Cannot overwrite 'Model' model once compiled\"](/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose)\n\n[Javascript 17 de ago. de 2016 NodeJS Primeiros Passos: Async - Map](/nodejs-primeiros-passos-async-map)\n\n[Javascript 15 de ago. de 2016 NodeJS Primeiros Passos: Async - Waterfall](/nodejs-primeiros-passos-async-waterfall)\n\n[Javascript 12 de ago. de 2016 NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas](/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas)\n\n[Javascript 27 de jul. de 2016 NodeJS Primeiros Passos: Módulos](/nodejs-primeiros-passos-modulos)\n\n[Javascript 26 de jul. de 2016 NodeJS Primeiros Passos: Closures e Escopos](/closures-e-escopos)\n\n[Javascript 25 de jul. de 2016 NodeJS Primeiros Passos: Servidor HTTP Básico](/servidor-http-basico)\n\n[Javascript 12 de jul. de 2016 Vídeo sobre NodeJS com Promises](/nodejs-primeiros-passos-promises)\n\n[Anterior](/tag/nodejs/4)5 / 5\nPróxima",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "nodejs",
        "javascript",
        "primeiros",
        "passos",
        "2016",
        "async",
        "como",
        "model",
        "algoritmos",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/nodejs/5"
      }
    },
    {
      "id": "8e4809f78a2ea7ee",
      "url": "https://devpleno.com/termos-de-uso",
      "title": "Termos de uso - DevPleno (Part 5)",
      "content": "Este site é controlado e operado pela We Dev Ideas – Eirelli – ME a partir de seu escritório no endereço Rua Maria das Dores, 49 – Esplanada, Pouso Alegre, MG e não garante que o conteúdo ou materiais estejam disponíveis para uso em outras localidades. Seu acesso é proibido em territórios onde o conteúdo seja considerado ilegal. Aqueles que optarem",
      "description": "Estes termos de serviço regulam o uso deste site. Ao acessálo você concorda com estes termos. Por favor, consulte regularmente os nossos termos de serviço....",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "termos",
        "servi",
        "website",
        "acesso",
        "para",
        "direitos"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/termos-de-uso"
      }
    },
    {
      "id": "8e7c45140f25f964",
      "url": "https://devpleno.com/blog/servidor-json-simples-em-php-parte-1/index",
      "title": "Servidor JSON simples em PHP (parte 1) (Part 2)",
      "content": "Caso não exista aquele caminho, vamos criar com um vazio, inserir um item novo e salvar. Caso olharmos o banco depois disso, temos a adição do novo item, caso usarmos o get novamente ele puxará todas as séries que existe lá mais a que foi adicionada por último. Você pode subir esse arquivo e o DB para o servidor que suporte PHP.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/7s5_TmBqZR8\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "json",
        "path",
        "contents",
        "method",
        "caso",
        "criar",
        "vamos",
        "jsonbody",
        "embed",
        "para"
      ],
      "metadata": {
        "title": "Servidor JSON simples em PHP (parte 1)",
        "date": "2017-09-08",
        "tags": "['Javascript']",
        "thumbnail": "ServidorJson.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/servidor-json-simples-em-php-parte-1/index.md"
      }
    },
    {
      "id": "8e8082f0d9eab29d",
      "url": "https://devpleno.com/blog/patternite/index",
      "title": "Entenda o que é Patternite (Part 1)",
      "content": "Hoje eu gostaria de falar sobre um item que é bastante impeditivo quando as pessoas que já tem experiência tentam vir para o JavaScript. Eu chamava isso de Patternite, isso nada mais é que a vontade de aplicar Pattern em todos os lugares.\n\nO que é um Pattern ou Design Pattern?\n\nEle é um padrão de projeto. Todo mundo que vem de outras linguagens, provavelmente já com alguns padrões de projeto na mente, como por exemplo Singleton, MVC, Factory, etc, eu sugiro que antes de começar a classificar classes entender o que está acontecendo no código e aí sim aplicar um design pattern muito melhor.\n\nEu vou fazer um exemplo na prática para ficar mais simples. Primeiramente vou instalar o EJS que é uma engine de template baseada em JavaScript. Além disso, vou instalar o Express, que é um micro-framework:\n\n```jsx\nyarn add ejs express\n```\n\nAgora vou criar um arquivo novo chamado index.js e dentro dele farei o seguinte:\n\n```jsx\nconst express = require('express')\nconst app = express()\napp.get('/', (req, res) => {\n  res.send('olá poo2js')\n})\napp.listen(3000, (err) => console.log(err, 'server'))\n```\n\nO detalhe que quero realçar aqui é que não criei nem um controller, nenhum view nem nada no sentido. A vantagem disso é que eu tive meu primeiro small win.\n\nQuando formos aprender uma linguagem nova acho que essa é a parte mais importante para aprender cada vez mais. Agora a segunda small win é a seguinte, é muito ruim construir o código dessa forma então se fizermos o seguinte:\n\n```jsx\nconst express = require('express')\nconst app = express()\napp.set('view engine', 'ejs')\napp.get('/', (req, res) => {\n  res.render('home')\n})\napp.listen(3000, (err) => console.log(err, 'server'))\n```\n\nDessa forma conseguimos utilizar templates e não precisamos criar a resposta falando o conteúdo. Ao rodar, perceba que não conseguimos ver o home dentro do diretório views.\n\nPrecisamos criar um diretório Views e dentro dele o home.ejs, ai sim, lá dentro, fazer o nosso html:",
      "keywords": [
        "express",
        "const",
        "para",
        "mais",
        "criar",
        "dentro",
        "require",
        "pattern",
        "arquivo",
        "seguinte"
      ],
      "metadata": {
        "title": "Entenda o que é Patternite",
        "date": "2017-11-10",
        "tags": "['Javascript']",
        "thumbnail": "Patternite.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/patternite/index.md"
      }
    },
    {
      "id": "8ecd9ecfc7315bc9",
      "url": "https://devpleno.com/decisao-tecnica",
      "title": "Decisão técnica não precisa ser eterna - DevPleno (Part 2)",
      "content": "Eu gosto de deixar meu aprendizado sempre atualizado, então quando eu posso comprar cursos, eu compro. Se eu quero aprender React ou Angular para testar, eu faço ambos os cursos e, aí sim, eu tomo a decisão ao invés de ficar só olhando e tentando achar conteúdo dentro daquilo. Testar e ver possibilidades faz parte da nossa profissão. Descobrir e ponderar qual é a melhor escolha para aquele momento.\n\nObviamente, dependendo de onde você trabalha, não consegue tomar decisão de qual tecnologia utilizar, comece utilizar suas horas vagas para testar novas tecnologias em outros projetos, é bom estar renovando o seu ‘cinto de ferramentas’.\n\nConfira o video:\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Decis%C3%A3o%20t%C3%A9cnica%20n%C3%A3o%20precisa%20ser%20eterna&url=https%3A%2F%2Fdevpleno.com%2Fdecisao-tecnica) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdecisao-tecnica)",
      "description": "Muitas pessoas, principalmente na época em que dava aulas presenciais, costumavam me perguntar qual tecnologia estudar. Geralmente as pessoas colocam a lin...",
      "keywords": [
        "decis",
        "para",
        "https",
        "carreira",
        "melhor",
        "qual",
        "mais",
        "angular",
        "react",
        "tomar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/decisao-tecnica"
      }
    },
    {
      "id": "8f2a993dcfc06614",
      "url": "https://devpleno.com/fullstackacademy-aula-3",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy-aula-3 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstackacademy",
        "aula"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstackacademy-aula-3"
      }
    },
    {
      "id": "8f2e90618a201ec3",
      "url": "https://devpleno.com/pare-de-pensar-em-classes",
      "title": "Pare de pensar em classes!  Série - POO para JS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Pare de pensar em classes! Série - POO para JS\n\nT\nPor Tulio Faria • 25 de outubro de 2017\n\n*\n\n[Javascript](/tag/javascript)\n\nNesta nova série do DevPleno, mostro como podemos passar de programação orientada-objetos para JavaScript mais funcional.\n\nA primeira coisa (que é muito importante)* é tentar parar de pensar estruturado.Se você quer mudar de programação orientada objetos para JavaSxript cada vez mais funcional funcional, precisa parar de pensar em classes. Apesar do JavaScript ter uma forma de criar classes,\n\npor exemplo:\n\nclass Calc {\nconstructor(num1, num2) {\nthis.num1 = num1\nthis.num2 = num2\n}\nout() {\nconsole.log(this.num1, this.num2)\n}\n}\nconst a = new Calc(1, 2)\na.out()\nDevo utilizar?\n\nSe você quer programar mais de uma maneira que faça sentido em JavaScript, você deve evitar. Vou mostrar algo que é bastante estranho principalmente para quem vem de Java, PHP, etc:\n\na.out.bind({ num: 4, num2: 5 })()\nEntão eu peguei o meu objeto ‘a’, o método out e dou um bind passando num1 e num2, com isso eu consigo sobrescrever um parâmetro que teoricamente estaria restrito a esse objeto.\n\nUma forma de construir sem utilizar o class seria assim:\n\nconst Calc = function (num1, num2) {\nthis.num1 = num1\nthis.num2 = num2\nreturn {\nout: function () {\nconsole.log(this.num1, this.num2)\n}\n}\n}\nMas eu consigo resolver isso de mutar o objeto, evitando por exemplo que o bind funcionasse? Toda function cria um contexto novo.\n\nPara que isso não aconteça, podemos utilizar uma outra construção que não permita que façamos isso:\n\nreturn {\nout: () => {\nconsole.log(this.num1, this.num2)\n}\n}\nA partir de uma arrow function, não temos mais uma forma de sobrescrever o this. Assim eu evitei essa criação excessiva de contextos. Utilizando dessa forma, você vai perceber que ele parece muito uma classe mas existem vários conceitos de programação funcional que vão fazer muito sentido à medida que você for evoluindo.\n\nConfira o video:",
      "description": "Nesta nova série do DevPleno, mostro como podemos passar de programação orientadaobjetos para JavaScript mais funcional. A primeira coisa (que é muito impo...",
      "keywords": [
        "num2",
        "this",
        "num1",
        "javascript",
        "para",
        "https",
        "pensar",
        "classes",
        "mais",
        "funcional"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/pare-de-pensar-em-classes"
      }
    },
    {
      "id": "9016944b2ff33567",
      "url": "https://devpleno.com/aulavds",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /aulavds to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "aulavds"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/aulavds"
      }
    },
    {
      "id": "90179da3e7146d4d",
      "url": "https://devpleno.com/blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! (Part 5)",
      "content": "Se a sua resposta é “sim”, agora é hora de colocar a mão na massa. Dê uma lida mais aprofundada sobre cada metodologia — [existem vários tutoriais espalhados pela internet](https://www.youtube.com/devplenocom?utm_source=blog&utm_campaign=rc_blogpost), principalmente sobre o Scrum, e dá para aprender a usar cada metodologia passo a passo. Depois de escolher a metodologia ágil que melhor se encaixa no seu trabalho, coloque ela em ação e veja os resultados. Você não vai se arrepender!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "mais",
        "para",
        "geis",
        "metodologia",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "title": "Metodologia ágil: entenda o que é e como se aplica para programadores!",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "Metodologia.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index.md"
      }
    },
    {
      "id": "9018f4f3693e9098",
      "url": "https://devpleno.com/blog/dicas-paranpm/index",
      "title": "3 dicas para NPM + 1 dica extra (Part 1)",
      "content": "Se você acompanha o DevPleno há algum tempo. deve ter percebido que eu utilizo bastante o learn, mas o repositório onde ficam esses módulos é o NPM. Esse repositório tem diversas funções interessantes para o nosso dia a dia, e é sobre algumas delas que vou abordar neste post. Confira:\n\n#1 – Se você quiser instalar algum módulo em uma versão especifica, pode utilizar o @ depois do nome do módulo que irá instalar. Por exemplo, o Express está no 4.1.5, mas você quer instalar o 4.0.0, então basta fazer o seguinte:\n\n```jsx\nnpm install express@4.0.0\n```\n\nUma das vantagens disso é em relação a compatibilidade. Caso você esteja utilizando um outro módulo, por exemplo, que por questão de compatibilidade precisa do express 4.0.0, poderia fazer isso facilmente apenas utilizando o @.\n\n#2 – Você pode usar repo (repositório) para acessar o repositório do módulo e procurar as issues dele.\n\n```jsx\nnpm repo express\n```\n\n#3 – Você também pode usar home para ir direto ao site do módulo.\n\n```jsx\nnpm home express\n```\n\nObviamente ele está utilizando informações do próprio NPM, ou seja, se a informação não existir nele, não é possível recuperar.\n\nExtra – NPM Outdated\n\nO NPM Outdated checa suas dependências e vê se algo pode ser atualizado. Por exemplo, como forçamos o express 4.0.0, ele irá mostrar que a atual é a 4.0.0, a melhor a ser utilizada é a 4.15.2 e a ultima também é a 4.15.2.\n\nEle pode ser bastante útil caso você tenha muitas dependências para fazer na 'mão', o que é muito trabalhoso, e isso te livra de todo esse trabalho.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/XR4iMcOKvkg\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "para",
        "express",
        "dulo",
        "pode",
        "reposit",
        "embed",
        "devpleno",
        "instalar",
        "exemplo",
        "fazer"
      ],
      "metadata": {
        "title": "3 dicas para NPM + 1 dica extra",
        "date": "2017-05-16",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "DICAS-PARA-NPM-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/dicas-paranpm/index.md"
      }
    },
    {
      "id": "901c4307f2746bfe",
      "url": "https://devpleno.com/map",
      "title": "High-order Function MAP - DevPleno (Part 1)",
      "content": "Javascript\n\n## High-order Function MAP\n\nT\nPor Tulio Faria • 27 de junho de 2017\n\n*\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje vamos continuar falando sobre programação funcional e High Order Functions, alguns tipos específicos que já vêm com o JavaScript, o primeiro que vamos falar é o MAP, ele transforma os dados ou cada item de um vetor. Vou mostrar um exemplo para ficar mais fácil:\n\nconst vetor = [{id: 1, nome: 'Bicicleta', categoria: 1}\n{id: 2, nome: 'Toca de natação', categoria: 2}]\nvetor.map( function(item){\nconsole.log(item)\nreturn item\n})\nEsse MAP que utilizamos é uma High Order Function porque ela aceita uma função e retorna alguma coisa. Ela fica mais interessante quando utilizamos uma Arrow Function porque conseguimos reduzir o código:\n\nvetor.map((item) => {\nconsole.log(item)\nreturn item\n})\nEntão, uma das utilidades do MAP é apenas fazer ele passar pelos itens do vetor. Em React, é muito comum renderizar uma lista de valores na tela dessa forma. A segunda forma é realmente transformar esse vetor, mapear cada valor desse para uma coisa diferente. Para complementar, vamos fazer um exemplo:\n\nVou criar um outro vetor no qual utilizaria a função para retornar algo específico como só o nome dos itens.\n\nconst vetor2 = vetor.map((item) => {\nreturn 'Nome: ' + item.nome\n})\nconsole.log(vetor2)\nEntão eu estou transformando esse vetor1 em um vetor que só tem nome, poderíamos fazer um cálculo ou algo do tipo. Podemos simplificar ainda mais o código:\n\nconst vetor2 = vetor.map((item) => item.nome)\nconsole.log(vetor2)\nSe fossemos fazer sem utilizar o MAP, teríamos que utilizar um for* e isso daria bem mais trabalho. Uma outra ideia que podemos ter é, por exemplo, definir quais são as categorias que eu tenho e que a gente atribua um item a mais, trocando o ID da categoria pelo nome:\n\nconst categoria = {\n1: 'Bicicletas',\n2: 'Natação'\n}\n\nconst vetor2 = vetor.map((item) => {\nitem.categoria = categorias[item.categoria]\nreturn item\n})",
      "description": "Hoje vamos continuar falando sobre programação funcional e High Order Functions, alguns tipos específicos que já vêm com o JavaScript, o primeiro que vamos...",
      "keywords": [
        "item",
        "vetor",
        "nome",
        "mais",
        "categoria",
        "fazer",
        "vetor2",
        "https",
        "para",
        "const"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/map"
      }
    },
    {
      "id": "90b1136ee6f8272c",
      "url": "https://devpleno.com/stream-duplex",
      "title": "Hands-on: Streams Parte 03 - Duplex - DevPleno (Part 2)",
      "content": "Quando for executado a arrow function, ele irá criar uma instância para comunicarmos com o cliente. Quando este cliente enviar algum dado, será feito um ‘ping-pong’, ou seja, vamos mandar de volta esses dados para o cliente. O servidor fica ouvindo uma porta, no exemplo acima, a porta 1337.\n\nUma curiosidade é que isto segue a mesma ideia quando criamos uma aplicação com xpress, pois ele ouve uma porta e faz o tratamento, a única diferença é que ‘por baixo dos panos’ para não precisarmos ficar preocupados em criar socket.\n\n**No cliente:**\n\nNele iremos criar um novo Socket e conectar a porta do servidor (no exemplo 1337). Quando conectamos a esta porta será executado o callBack, que devolverá as respostas de conexão (console.log(‘Connected’);). Toda vez que tivermos uma linha nova no console será escrita no Stream.\n\nRessaltando que o Client também é um Stream Duplex, afinal, nele executamos um.write, que é writable, e o client.on data que é readable.\n\nPor fim, temos um on data. Isso faz com que toda vez que recebermos dados esteja escrito na tela.\n\n**E como isso vai funcionar?**\n\nPara fazermos este código rodar, temos que executar o node socket.js server para startar o servidor. Em uma outra janela iremos rodar o client com node socket.js.\n\n**Conclusão**\n\nIsso é legal porque podemos gerenciar mais de um socket.js client e funcionaria perfeitamente, uma vez que na aplicação, sempre que receber uma conexão nova, ele irá executar o socket com uma instancia nova.\n\nEste exemplo de socket é muito usado para mostrar multi thread em outras linguagens como java. No caso do Node, ele é mono thread, o que torna sua performance muito melhor. Confira o Hands-on no vídeo:\n\nFique à vontade para deixar suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?",
      "description": "Já falamos sobre Readable e Writable Streams, agora falaremos sobre o tipo Duplex. Ele nos permite tanto enviar quanto receber dados. Para testarmos este S...",
      "keywords": [
        "socket",
        "client",
        "para",
        "server",
        "data",
        "este",
        "porta",
        "duplex",
        "stream",
        "cliente"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/stream-duplex"
      }
    },
    {
      "id": "90b52f3c4a50bd69",
      "url": "https://devpleno.com/como-receber-de-empresas-estrangeiras",
      "title": "Impostos e como receber de empresas estrangeiras - DevPleno (Part 4)",
      "content": "Um ponto adicional bem rápido: para a empresa americana, você precisa assinar um documento para a receita de lá. Esse documento se chama FORM A para pessoa física ou FORM B para pessoa jurídica. Basicamente esse formulário vai dizer que você está recebendo realmente esse dinheiro e que o envio da empresa não é crime, e sim que a empresa está contratando um serviço que está sendo realizado no exterior. Isso é importante, pois se um dia a Receita Federal Americana for até essa empresa, eles têm os formulários para provar para onde está indo, lembrando que esses documentos você assina digitalmente.\n\nEsse é um pouco do que eu aprendi até hoje de como receber dinheiro do exterior, não sou contador, mas aprendi isso tudo fazendo e queria compartilhar com vocês porque eu sei que é uma dor que todos passam.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Impostos%20e%20como%20receber%20de%20empresas%20estrangeiras&url=https%3A%2F%2Fdevpleno.com%2Fcomo-receber-de-empresas-estrangeiras) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-receber-de-empresas-estrangeiras)",
      "description": "Você sabe como receber de empresas estrangeiras (Toptal, Crossover, Scalable Path e outras)? Cada empresa dessa tem a possibilidade de enviar o dinheiro de...",
      "keywords": [
        "para",
        "esse",
        "como",
        "receber",
        "empresa",
        "dinheiro",
        "https",
        "pessoa",
        "isso",
        "pagar"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/como-receber-de-empresas-estrangeiras"
      }
    },
    {
      "id": "90ce95c99b4aa56a",
      "url": "https://devpleno.com/blog/por-que-todo-dev-usa-mac/index",
      "title": "Por que todo Dev usa Mac? (Part 1)",
      "content": "Uma pergunta comum que sempre me fazem é: Por que a maioria dos desenvolvedores usa Mac?\n\nBom, vou comentar algumas coisas que eu vejo. O primeiro motivo é moda, afinal é uma máquina que te garante um status. Se você chega em uma reunião com um notebook ruim, não transmite a autoridade que precisa, uma vez que, como desenvolvedores, lidamos com máquinas o dia todo, o que pressupõe-se que temos uma máquina boa.\n\n**Por que eu uso MAC?**\n\nEu uso Mac hoje porque sou programador IOS a maior parte do tempo. Crio aplicativos utilizando o React native para Android e para IOS, e não é possível fazer isso no Windows ou Linux. Já tentei todos os hacks possíveis, como rodar em uma maquina virtual, comprei até uma maquina melhor para isso, com 32GB de ram e rodar um Mac virtual com 16gb, mesmo assim não é a mesma experiência, pois na hora de testar algumas animações, o emulador do IOS não fica tão bem quanto na máquina nativa. Outra coisa que acontece é que, quando vamos tentar emular o android dentro do emulador do IOS, já não funciona mais, não é possível emular dentro de um emulador. Isso começou a me atrasar muito.\n\nSe você faz aplicativos para IOS, tem algumas saídas como alguns serviços em que é possível alugar um Mac online para publicar seu aplicativo através dele, ou então contratar um serviço de build, mas isso só funciona quando estamos fazendo algum aplicativo utilizando o ionics ou react-native, não é possível fazer com objetive C sem ter um Mac, afinal como você vai emular?\n\nOutro motivo é que o Mac é unix like, ou seja, ele é baseado em unix, então muitas coisas feitas no servidor e aplicativos no shell funcionam muito bem, já que ele é muito parecido com o Linux. Por isso quando existe a migração de Windows para o Mac, você sente muita diferença, pois com ele é possível automatizar mais coisas.",
      "keywords": [
        "para",
        "muito",
        "como",
        "poss",
        "isso",
        "quina",
        "aplicativos",
        "windows",
        "aplicativo",
        "algumas"
      ],
      "metadata": {
        "title": "Por que todo Dev usa Mac?",
        "date": "2017-05-15",
        "tags": "['Carreira']",
        "thumbnail": "TodoDevMac.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/por-que-todo-dev-usa-mac/index.md"
      }
    },
    {
      "id": "90d3cfae7770c657",
      "url": "https://devpleno.com/networking",
      "title": "Como fazer Networking corretamente - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Como%20fazer%20Networking%20corretamente&url=https%3A%2F%2Fdevpleno.com%2Fnetworking) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnetworking)",
      "description": "Networking é uma palavra muito utilizada atualmente. A maioria acha que deve ser feito o tempo todo, em todo lugar, e tenta forçar isso. O que é problemáti...",
      "keywords": [
        "networking",
        "fazer",
        "https",
        "isso",
        "valor",
        "carreira",
        "como",
        "muito",
        "mais",
        "gerar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/networking"
      }
    },
    {
      "id": "90f72ecd64137c3a",
      "url": "https://devpleno.com/entenda-a-importancia-de-cursos-para-desenvolvedores",
      "title": "Entenda a importância de cursos para desenvolvedores - DevPleno (Part 3)",
      "content": "Não se pode negar que o ReactJS está em alta, especialmente por ter sido desenvolvido pelo Facebook e Instagram. Porém, mais do que uma moda, ele veio para ficar.\n\nA novidade facilita a escrita em Javascript, é eficiente, excelente para SEO, tem suporte da equipe do Facebook (apesar de ser opensource) e funciona muito bem em aplicativos mobile.\n\n### Firebase\n\nPor falar em mobile, não dá para não mencionar o Firebase como uma ferramenta em alta. Trata-se de uma plataforma móvel do Google que ajuda o desenvolvedor a criar aplicativos, aumentar a base de usuários e obter mais conversões.\n\nCom APIs intuitivas em um único SDK, o Firebase permite a criação de apps sem a necessidade de infraestrutura complexa, facilitando o ensino e a aprendizagem de desenvolvimento. Assim, dê preferência para cursos que usem esta ferramenta. Há uma grande chance de você continuar utilizando-a nos desafios futuros.\n\n### Integração contínua\n\nOs desenvolvedores estão se unindo cada vez mais. Aprender a trabalhar em integração contínua é fundamental para sua carreira. No “Continuous Integration” os membros da equipe integram seu trabalho com frequência.\n\nNesse caso, “integração” é uma fase do desenvolvimento de software em que todo o trabalho do time é agregado, validado e testado. Desta forma, é possível identificar rapidamente possíveis falhas. A técnica reduz o prazo para a entrada em operação do aplicativo que está sendo projetado.\n\n### Continous-deployment\n\nSegurança nunca é demais. Por isso outra prática em alta é a realização de continuous deployment — processo de inserção de um novo código em um brench ou trunk. A técnica permite testar rapidamente um código por meio de testes automatizados. Isso pode acelerar o desenvolvimento do aplicativo.\n\n### Redux",
      "description": "Você está pronto para atuar em uma grande empresa? O mercado de tecnologia está crescendo cada vez mais, e para conseguir se destacar no cenário atual, é p...",
      "keywords": [
        "para",
        "mais",
        "cursos",
        "https",
        "carreira",
        "desenvolvedores",
        "pode",
        "empresa",
        "habilidades",
        "poss"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/entenda-a-importancia-de-cursos-para-desenvolvedores"
      }
    },
    {
      "id": "915d8381bf287b85",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-5/index",
      "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar (Part 4)",
      "content": "Uma dica adicional: se quiser parar o serviço, digite:\n\n```jsx\npm2 stop all\n```\n\nSe alterar o json com a configuração de início, ele não vai funcionar, então temos que fazer um **pm2 delete** para ele apagar o processo e depois sim startar o serviço, senão ele vai pegar sempre o cache. Então aqui já temos o nosso projeto rodando perfeitamente para poder usar como portfólio e com isso chegamos ao fim do nosso minicurso sobre Socket.IO.\n\nPodemos deixar ainda melhor para produção esse nosso serviço, usando escalabilidade, e você pode saber mais sobre esse assunto [na Formação Fullstack Master](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog).\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/wtF5Cv_-SyU\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "vamos",
        "como",
        "fazer",
        "isso",
        "quina",
        "agora",
        "temos",
        "colocar",
        "projeto"
      ],
      "metadata": {
        "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar",
        "date": "2017-07-11",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "SocketIOpart5.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/minicurso-socket-io-parte-5/index.md"
      }
    },
    {
      "id": "915e18dcdbe26ecd",
      "url": "https://devpleno.com/como-gerar-um-array-populado-em-javascript",
      "title": "Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos - DevPleno (Part 3)",
      "content": "Ah, todos os nossos cursos tem um módulos somente de Javascript ;) Conheça o [Fullstack Master](https://go.devpleno.com/fsm?sck=blog-como-gerar-um-array-populado-em-javascript)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20Criar%20e%20Popular%20Arrays%20em%20JavaScript%3A%205%20Formas%20com%20Exemplos&url=https%3A%2F%2Fdevpleno.com%2Fcomo-gerar-um-array-populado-em-javascript) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-gerar-um-array-populado-em-javascript)",
      "description": "Aprenda 5 formas de gerar arrays populados em JavaScript: Array.from, fill, spread, map e mais. Exemplos práticos para copiar e usar.",
      "keywords": [
        "name",
        "array",
        "valor",
        "person",
        "const",
        "fill",
        "javascript",
        "gerar",
        "people",
        "forma"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/como-gerar-um-array-populado-em-javascript"
      }
    },
    {
      "id": "927ffab886b52a0f",
      "url": "https://devpleno.com/qual-seu-maior-desafio",
      "title": "Qual é o seu maior desafio nesse momento? - DevPleno (Part 2)",
      "content": "Venho fazendo esse projeto localmente com alguns profissionais de outras áreas (discutimos negócios, como podemos melhorar as pessoas…) e isso está sendo fantástico, então quero aplicar isso aos desenvolvedores que acompanham o DevPleno. Acredito muito no resultado disso, podemos tornar o mundo melhor começando por onde temos forças: ajudando as pessoas de alguma forma.\n\nAceita entrar nesse desafio? Mande seu e-mail!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Qual%20%C3%A9%20o%20seu%20maior%20desafio%20nesse%20momento%3F&url=https%3A%2F%2Fdevpleno.com%2Fqual-seu-maior-desafio) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fqual-seu-maior-desafio)",
      "description": "Há um tempo venho ajudando desenvolvedores e profissionais de outras áreas e isso vem me proporcionando muita felicidade. É algo que faz parte do meu propó...",
      "keywords": [
        "desafio",
        "isso",
        "https",
        "para",
        "devpleno",
        "como",
        "qual",
        "maior",
        "quero",
        "ajudar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/qual-seu-maior-desafio"
      }
    },
    {
      "id": "92b7ca148b11544f",
      "url": "https://devpleno.com/blog/codility/index",
      "title": "Codility: Como Resolver os Desafios e Passar nos Testes de Código (Part 2)",
      "content": "Ele não consegue fazer isso igual fazemos manualmente, ele tem uma estimativa de qual o custo desse algoritmo, ou seja, uma estimativa baseada no que ele percebe que você definiu de variáveis por causa da complexidade de espaço e, no caso de tempo, mede o tempo, então isso pode variar bastante. Isso é bom para ficarmos atentos para reduzirmos esse tempo de consumo, tanto de processador quanto de memória. Também em lessons, temos os materiais para ler e entender o assunto daquela lição especifica. É recomendável ler os materiais também, pois muita das técnicas computacionais mostradas ali são interessantes para relembrar.\n\nO Codility é tão simples quanto isso que eu mostrei. Quando você for fazer uma prova, alguém vai te mandar um link, você vai clicar e cair em uma prova específica da empresa, então ele escolhe a dificuldade das questões e define o tempo da prova inteira ou para cada questão.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/xbJ-ZAVL_vM\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "description": "Guia prático para resolver desafios do Codility. Dicas, estratégias e exemplos de soluções para testes técnicos de programação.",
      "keywords": [
        "para",
        "codility",
        "fazer",
        "temos",
        "lessons",
        "isso",
        "tempo",
        "embed",
        "programa",
        "caso"
      ],
      "metadata": {
        "title": "Codility: Como Resolver os Desafios e Passar nos Testes de Código",
        "description": "Guia prático para resolver desafios do Codility. Dicas, estratégias e exemplos de soluções para testes técnicos de programação.",
        "date": "2017-06-07",
        "tags": "['Algoritmos', 'Javascript']",
        "thumbnail": "Codility.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/codility/index.md"
      }
    },
    {
      "id": "93d2648703783840",
      "url": "https://devpleno.com/bind",
      "title": "Bind - Altere comportamento e contexto de execução de suas funções - DevPleno (Part 1)",
      "content": "Javascript\n\n## Bind - Altere comportamento e contexto de execução de suas funções\n\nT\nPor Tulio Faria • 27 de julho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nO que é um bind em JavaScript? Para mostrar uma das utilidades do bind, eu criei um pequeno exemplo:\n\n;(function () {\nthis.valor = 10\n\nconst modulo = {\nvalor: 20,\n\ngetValor: function () {\nreturn this.valor\n}\n}\n\nconsole.log(modulo.getValor())\n\nconst getValor = modulo.getValor\n\nconsole.log(getValor())\n})()\nEu tenho um objeto literal que cria um contexto novo. Para esse contexto, o this.valor vai ser igual a 20 e quando eu der um getValor, ele irá retornar o this.valor. Logo acima temos um this.valor que faz referência a primeira função e ao colocarmos o console.log = modulo.getValor ele vai executar referente ao pai dele.\n\nSe criarmos uma nova constante e pegamos só a função extraindo desse objeto literal de cima, quando eu dou console.log(getvalor()), ele trás 20 e 10. 20 é o valor que está dentro do módulo e a segunda vez está pegando o 10 que está fora do módulo.\n\nIsso acontece porque quando eu criei a cópia dele e não especifiquei nada, ele vai utilizar o this na chamada de onde ele está, então acabamos criando um cenário meio inconsistente.\n\nUma das coisas que o bind permite é exatamente isso, quando eu crio essa cópia, eu posso passar um bind onde eu falo em qual contexto eu quero que ele execute. Por exemplo, eu quero que ele execute no contexto do módulo:\n\nconst getValor = modulo.getValor.bind(modulo)\nisso é bastante útil quando criamos as classes em ES6 porque naturalmente ele não tem o bind para o contexto da classe, então podemos fazer no construtor.\n\nA outra utilidade que temos para o bind é, por exemplo, criar uma função que recebe dois parâmetros e criar uma função2, que é a função1 com bind fixando o parâmetro:\n\nfunction func1(param1, param2) {\nconsole.log(param1, param2)\n}\n\nconst funct2 = func1.bind(null, 'paramfixo')",
      "description": "O que é um bind em JavaScript? Para mostrar uma das utilidades do bind, eu criei um pequeno exemplo: Eu tenho um objeto literal que cria um contexto novo. ...",
      "keywords": [
        "bind",
        "getvalor",
        "quando",
        "para",
        "valor",
        "contexto",
        "this",
        "modulo",
        "console",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/bind"
      }
    },
    {
      "id": "93d5a139fb047d01",
      "url": "https://devpleno.com/hands-on-readline",
      "title": "Hands-on: Readline - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Readline&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-readline) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-readline)",
      "description": "Neste post vamos fazer um handson é de um módulo padrão com o core do node: o readline. O que temos que fazer? Vamos importar primeiro o readline e instanc...",
      "keywords": [
        "readline",
        "line",
        "https",
        "console",
        "fazer",
        "podemos",
        "isso",
        "nome",
        "javascript",
        "hands"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-on-readline"
      }
    },
    {
      "id": "93eff2a6d21522ce",
      "url": "https://devpleno.com/composicao-de-componentes-em-reactjs",
      "title": "Composição de componentes em ReactJS - DevPleno (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Composi%C3%A7%C3%A3o%20de%20componentes%20em%20ReactJS&url=https%3A%2F%2Fdevpleno.com%2Fcomposicao-de-componentes-em-reactjs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomposicao-de-componentes-em-reactjs)",
      "description": "A dica de hoje é sobre o ReactJS, mais especificamente sobre como podemos criar composição de componentes em ReactJS de uma forma um pouco diferente, como ...",
      "keywords": [
        "header",
        "props",
        "para",
        "componentes",
        "composi",
        "podemos",
        "reactjs",
        "como",
        "panel",
        "footer"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/composicao-de-componentes-em-reactjs"
      }
    },
    {
      "id": "9458597d637c000d",
      "url": "https://devpleno.com/registros-do-mysql-no-nodejs",
      "title": "[SEGREDO] Muitos registros do MySQL no NodeJS - DevPleno (Part 3)",
      "content": "const query = connection.query('select * from pessoas limit 100')\nObviamente que não elimina você ter que testar, mas já ajuda a agilizar seus testes de começo.\n\nVeja o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=%5BSEGREDO%5D%20Muitos%20registros%20do%20MySQL%20no%20NodeJS&url=https%3A%2F%2Fdevpleno.com%2Fregistros-do-mysql-no-nodejs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fregistros-do-mysql-no-nodejs)",
      "description": "Hoje quero contar um segredo para você: como utilizar o driver padrão do MySQL no Node para lidar com grandes quantidades de dados. A primeira coisa que va...",
      "keywords": [
        "query",
        "para",
        "connection",
        "mysql",
        "console",
        "fazer",
        "registros",
        "dados",
        "muito",
        "https"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/registros-do-mysql-no-nodejs"
      }
    },
    {
      "id": "949f65ccf0231888",
      "url": "https://devpleno.com/minicurso-socket-io-parte-4",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms - DevPleno (Part 2)",
      "content": "Nos botões das torcidas, vamos colocar um ID para cada:\n\n&#x3C;div class\"column w-col w-col-2\">&#x3C;a class=\"button w-button\" id=\"na-torcida-a\" href=\"#\"/> Na torcida &#x3C;/div>\n&#x3C;div class\"column w-col w-col-2\">&#x3C;a class=\"button w-button\" id=\"na-torcida-b\" href=\"#\"/> Na torcida &#x3C;/div>\nAgora precisamos fazer tudo via JavaScript lá em js/match.js, quando clicar no ‘na torcida’ do time A ou time B, ele precisa mandar o valor para a barra:\n\n$(\"#na-torcida-a\").click(function(){\n$.post(\"/match/\")+MATCH_INDEX+\"/supporters\", { team: 'a'}, function(data){})\nreturn false;\n}\n$(\"#na-torcida-a\").click(function(){\n$.post(\"/match/\")+MATCH_INDEX+\"/supporters\", { team: 'b'}, function(data){})\nreturn false;\n}\nAo clicar em “na torcida” ele envia, mas não recebe nada, pois não existe a rota ainda, então temos que ir no nosso routes/indexjs para criar essa rota logo acima de ‘return router’:\n\nrouter.post('/match/:id/supporters', function(req, res, next){\nconst match = db.get('matches['+req.params.id+']).value()\nif(req.body.team==='a'){\nconst newValue = match['team-a'].supporters+1\ndb.set('matches['+req.params.id+'].team-a.supporters', newValue).write()\n}\nif(req.body.team==='b'){\nconst newValue = match['team-b'].supporters+1\ndb.set('matches['+req.params.id+'].team-b.supporters', newValue).write()\n}\nres.send({ ok: true })\n})\nPerceba que pegamos o const match para saber o valor do jogo, em seguida fizemos um IF onde incrementamos o A ou B dependendo de qual botão for apertado.\n\nAgora eu preciso falar para todo mundo desse jogo que houve uma atualização nessa partida. Quando a gente cria um projeto no Socket.IO, tudo que se conecta, é conectado a uma sala geral. Vou explicar para ficar mais fácil.\n\nTemos duas formas de atualização, uma que vai para todos os usuários, ou seja, um geral, e também temos uma atualização que vai por jogo.",
      "description": "Nesta etapa do nosso minicurso de Socket.IO, vamos fazer as atualizações específicas de cada jogo. Primeiro vamos fazer o gráfico da torcida se movimentar....",
      "keywords": [
        "match",
        "supporters",
        "team",
        "para",
        "porcentagem",
        "const",
        "socket",
        "vamos",
        "torcida",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-4"
      }
    },
    {
      "id": "94b8a8782787839e",
      "url": "https://devpleno.com/blog/sobre-o-devpleno/index",
      "title": "Sobre o DevPleno (Part 3)",
      "content": "Meu pai aposentou-se e com o dinheiro que recebeu, nos presenteou com um computador (na época era muito caro!) E isso mudou tudo! Descobri que amava computadores e que essa era a área que gostaria de seguir. Ao mesmo tempo, comecei a ter aulas de programação na escola e brincava de criar meus próprios jogos com um vizinho e amigo meu. Meu ensino médio foi junto com o curso técnico em processamento de dados. Quando me formei aos 18 anos, tive uma ideia e fiz de tudo para desenvolvê-la. Abri realmente uma empresa (com CNPJ) e fui a briga. Consegui apresentar para grandes empresas, mas logo percebi que eu não entendi tanto da área que eu queria entrar.\n\nDepois deste projeto, tive várias outras ideias e projetos. Executando cada um destes projetos e analisando seus resultados obtidos (aprendendo a cada acerto e a cada erro). Ao mesmo tempo desenvolvi aplicações de todos os portes, dentro e fora do Brasil. Terminei minha graduação em Sistemas de Informação, e cada vez me envolvia em projetos maiores e mais desafiadores (aliás, isso me dá uma energia fora do sério).\n\nApós alguns anos de graduado, já tinha 3 empresas em meu nome, com projetos acontecendo em todas elas. É bastante intenso 🙂 Durante pouco mais de 2 anos, desacelerei um pouco os negócios e fiz mestrado na USP, também em Sistemas de Informação. E neste período, ficou evidente para mim que eu precisava fazer algo a relacionado a educação tecnológica e que pudesse fomentar termos cada vez desenvolvedores mais bem preparados tecnicamente e com uma bagagem estratégica diferenciado-os dos demais. Foi então que superei minha zona de conforto, e resolvi criar o DevPleno. Aliás, foi aí que percebi o quanto compartilhar o que sei me faz tão bem. Não lembrava que já fiz isso por anos e isso me incendiava 🙂  \n<span id=\"more-47\"></span>\n\nVocê pode conhecer um pouco mais sobre o motivo pelo qual lancei este projeto neste vídeo:",
      "keywords": [
        "para",
        "como",
        "mais",
        "minha",
        "devpleno",
        "muito",
        "isso",
        "cada",
        "meus",
        "projetos"
      ],
      "metadata": {
        "title": "Sobre o DevPleno",
        "date": "2017-03-15",
        "tags": "['Carreira']",
        "thumbnail": "tulio.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/sobre-o-devpleno/index.md"
      }
    },
    {
      "id": "94ffc12c73b4ebc9",
      "url": "https://devpleno.com/fullstack-master",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstack",
        "master"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstack-master"
      }
    },
    {
      "id": "952691b827b5bcde",
      "url": "https://devpleno.com/blog/microfone-pelo-navegador/index",
      "title": "Capturando áudio do microfone pelo Navegador (Part 2)",
      "content": "```jsx\n<script>\n    $(function(){\n        let mediaRecorder\n        navigator\n        .mediaDevices\n        .getUserMedia({audio: true})\n        .then( stream => {\n            mediaRecorder = new MediaRecorder(stream)\n            mediaRecorder.ondataavailable = data => {\n                console.log(data)\n            }\n            mediaRecorder.onstop = () => {\n                console.log('stop')\n            }\n            mediaRecorder.start()\n            setTimeOut(() => mediaRecorder.stop(), 3000)\n        }, err =>{\n            console.log(err)\n        })\n    })\n</script>\n```\n\nFeito isso, ele vai começar a gravar e três segundos depois ele da um stop e diz que tem dados disponíveis para ser utilizados.\n\nDepois que terminamos de gravar, pode ser que seja interessante fazer alguma coisa com esse áudio, mandar para algum lugar ou coisa nesse sentido. Caso o evento seja muito longo, podemos definir que algumas partes desse áudio vão ser colocados em um vetor e no ondataavailable à medida que formos recebendo os dados do stream vai ser organizado dentro de chunks que são grupos de informação:\n\n```jsx\nmediaRecorder = new MediaRecorder(stream)\nlet chunks = []\nmediaRecorder.ondataavailable = (data) => {\n  chunks.push(data.data)\n}\n```\n\nAgora, no Stop, podemos fazer algo para transformar isso em algum dado que podemos utilizar de alguma forma:\n\n```jsx\nmediaRecorder.onstop = () => {\n  const blob = new Blob(chunks, { type: 'audio/ogg; code=opus' })\n  const reader = new window.fileReader()\n  reader.readAsDtaURL(blob)\n  reader.onloadend = () => {\n    console.log(reader.result)\n  }\n}\n```\n\nCom isso, ele junta os dados em binário em um só chamado blob. Além disso, utilizamos um reader para gerar um URL.\n\nAo rodar, perceba que ele converteu para um base 64, que é um texto, ou seja, ele transformou o que era binário em texto.\n\nPor que isso é importante?",
      "keywords": [
        "mediarecorder",
        "para",
        "audio",
        "stream",
        "reader",
        "podemos",
        "udio",
        "script",
        "isso",
        "blob"
      ],
      "metadata": {
        "title": "Capturando áudio do microfone pelo Navegador",
        "date": "2017-11-13",
        "tags": "['Javascript']",
        "thumbnail": "Microfone.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/microfone-pelo-navegador/index.md"
      }
    },
    {
      "id": "952af81398467a26",
      "url": "https://devpleno.com/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! - DevPleno (Part 1)",
      "content": "Carreira\n\n## Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão!\n\nT\nPor Tulio Faria • 12 de agosto de 2017\n\n*\n\n[Carreira](/tag/carreira)\n\nTodo profissional já deve ter se perguntado as reais vantagens de se trabalhar em uma grande empresa ou de se criar um negócio próprio. E isso não é diferente para os programadores. A possibilidade de fazer seu próprio horário e de não possuir um chefe cobrando prazos se revela bem atrativa. Por outro lado, abrir uma empresa é também correr riscos e ter de assumir responsabilidades compatíveis com essa escolha.\n\nNa verdade, não existe um caminho certo. Ao optar em seguir por um ou por outro, você deve ter em mente, em primeiro lugar, qual é o seu perfil. Não dá pra decidir isso baseado no amigo que fez algo que deu muito certo e por isso vai dar para você também. Quando vemos de fora, o caminho pode parecer mais fácil do que realmente é.\n\nAntes que desperdice tempo, dinheiro e energia, separamos algumas perguntas para ajudar você a pensar melhor em qual tipo de escolha se encaixaria melhor para os seus objetivos. Confira!\n\n**Como você administra suas tarefas?**\n\nNo momento de realizar tarefas você prefere fazê-las com antecedência ou espera até o prazo final de entrega? Todo grande empreendedor é um curioso e, principalmente, um realizador. Por isso, no momento de pensar em abrir uma empresa, é importante ter essa postura.\n\nSe você considera que se encaixa mais no perfil de procrastinador, tente analisar se possui [pensamentos limitantes](https://www.devpleno.com/pensamentos-limitantes?utm_source=blog&#x26;utm_campaign=rc_blogpost). Existe uma palavra muito comum no mundo do empreendedorismo chamada mindset*, que significa “modelos mentais”.",
      "description": "Todo profissional já deve ter se perguntado as reais vantagens de se trabalhar em uma grande empresa ou de se criar um negócio próprio. E isso não é difere...",
      "keywords": [
        "para",
        "empresa",
        "isso",
        "como",
        "muito",
        "https",
        "pode",
        "mais",
        "melhor",
        "source"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao"
      }
    },
    {
      "id": "95377effa410f0c7",
      "url": "https://devpleno.com/blog/map/index",
      "title": "High-order Function MAP (Part 1)",
      "content": "Hoje vamos continuar falando sobre programação funcional e High Order Functions, alguns tipos específicos que já vêm com o JavaScript, o primeiro que vamos falar é o MAP, ele transforma os dados ou cada item de um vetor. Vou mostrar um exemplo para ficar mais fácil:\n\n```jsx\nconst vetor = [{id: 1, nome: 'Bicicleta', categoria: 1}\n{id: 2, nome: 'Toca de natação', categoria: 2}]\nvetor.map( function(item){\n    console.log(item)\n    return item\n})\n```\n\nEsse MAP que utilizamos é uma High Order Function porque ela aceita uma função e retorna alguma coisa. Ela fica mais interessante quando utilizamos uma Arrow Function porque conseguimos reduzir o código:\n\n```jsx\nvetor.map((item) => {\n  console.log(item)\n  return item\n})\n```\n\nEntão, uma das utilidades do MAP é apenas fazer ele passar pelos itens do vetor. Em React, é muito comum renderizar uma lista de valores na tela dessa forma. A segunda forma é realmente transformar esse vetor, mapear cada valor desse para uma coisa diferente. Para complementar, vamos fazer um exemplo:\n\nVou criar um outro vetor no qual utilizaria a função para retornar algo específico como só o nome dos itens.\n\n```jsx\nconst vetor2 = vetor.map((item) => {\n  return 'Nome: ' + item.nome\n})\nconsole.log(vetor2)\n```\n\nEntão eu estou transformando esse vetor1 em um vetor que só tem nome, poderíamos fazer um cálculo ou algo do tipo. Podemos simplificar ainda mais o código:\n\n```jsx\nconst vetor2 = vetor.map((item) => item.nome)\nconsole.log(vetor2)\n```\n\nSe fossemos fazer sem utilizar o MAP, teríamos que utilizar um _for_ e isso daria bem mais trabalho. Uma outra ideia que podemos ter é, por exemplo, definir quais são as categorias que eu tenho e que a gente atribua um item a mais, trocando o ID da categoria pelo nome:\n\n```jsx\nconst categoria = {\n  1: 'Bicicletas',\n  2: 'Natação'\n}\n\nconst vetor2 = vetor.map((item) => {\n  item.categoria = categorias[item.categoria]\n  return item\n})\n\nconsole.log(vetor2)\n```",
      "keywords": [
        "item",
        "vetor",
        "nome",
        "mais",
        "categoria",
        "fazer",
        "vetor2",
        "para",
        "const",
        "console"
      ],
      "metadata": {
        "title": "High-order Function MAP",
        "date": "2017-06-27",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "MAP.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/map/index.md"
      }
    },
    {
      "id": "95379473d09d0eb1",
      "url": "https://devpleno.com/modulo-co",
      "title": "Módulo Co - Organize o fluxo de seu código assíncrono - DevPleno (Part 1)",
      "content": "Javascript\n\n## Módulo Co - Organize o fluxo de seu código assíncrono\n\nT\nPor Tulio Faria • 29 de julho de 2017\n\n[Javascript](/tag/javascript)\n\nNeste hands-on, vamos utilizar uma ferramenta bastante útil no nosso dia a dia, o módulo CO, que é uma forma de controlar o fluxo das funções por meio de generator no JavaScript. Vamos lá, a primeira coisa é adicionar o co:\n\nyarn add co\nO problema que tínhamos era de ler um arquivo, baseado no conteúdo desse arquivo, iterávamos sobre ele e dentro dessa iteração tínhamos que escrever outros arquivos. Se formos fazer isso com código assíncrono normal, isso se torna extremamente confuso porque temos iteração sobre operações assíncronas que dependem de outras operações assíncronas, já com o generator é muito mais simples porque podemos fazer o seguinte:\n\nNo diretório CO, eu criei um arquivo test.js, dentro dele vou importar o CO e o FS e criar uma função readFile onde passamos apenas o arquivo que queremos.\n\nconst co = require('co')\nconst fs = require('fs')\nfunction readFile(file) {\nfs.readFile(file, 'utf-8', function (err, data) {\nconsole.log(data)\n})\n}\nreadFile('yarn.lock')\nTeoricamente, para fazer essa função funcionar, normalmente eu preciso passar para ela um callBack, mas vamos fazer um pouco diferente. Para usar o generator, as funções que chamamos assíncronas têm que ser promises, ou seja, temos que converter essas funções:\n\nfunction readFile(file){\nreturn new promise(function(resolve, reject){\nfs.readFile(file, 'utf-8', function(err, data){\nif(err){\nreject(err)\n}else{\nresolve(data)\n}\n})\n})\n}\nreadFile('yarn.lock')\n.then(function(data)){console.log(data)})\nEstamos pegando essa função que depende de um callBack e ao invés de retorná-la, retornamos uma promise e isso será executado no futuro. Quando ele chamar o callBack, vai rejeitar a promise ou resolver e passa os dados de volta.",
      "description": "Neste handson, vamos utilizar uma ferramenta bastante útil no nosso dia a dia, o módulo CO, que é uma forma de controlar o fluxo das funções por meio de ge...",
      "keywords": [
        "function",
        "readfile",
        "file",
        "digo",
        "data",
        "fazer",
        "const",
        "contents",
        "https",
        "generator"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/modulo-co"
      }
    },
    {
      "id": "95c218c5f911959b",
      "url": "https://devpleno.com/blog/voce-precisa-ter-dom-para-ser-um-bom-profissional/index",
      "title": "Você precisa ter DOM para ser um bom profissional?",
      "content": "Você acredita que as pessoas realmente só aprendem se têm DOM? Neste vídeo, comento a opinião sobre este assunto e explico porque não acredito em dom. Confira!\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/KwdUislTWbA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastra seu e-mail para não perder as novidades. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "para",
        "acredita"
      ],
      "metadata": {
        "title": "Você precisa ter DOM para ser um bom profissional?",
        "date": "2017-03-22",
        "tags": "['Carreira']",
        "thumbnail": "TerDom.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/voce-precisa-ter-dom-para-ser-um-bom-profissional/index.md"
      }
    },
    {
      "id": "95e2b25b956f1077",
      "url": "https://devpleno.com/promisify-node",
      "title": "Promisify-Node: Convertendo funções clássicas do Node em Promises - DevPleno (Part 2)",
      "content": "fs.readFile('arquivo.js', (err, data) => console.log(data.toString()))\nJá irá virar naturalmente uma promise, com isso posso fazer:\n\nfs.readFile('arquivo.js').then((data) => console.log(data.toString()))\nConvertendo todos os métodos e funções disponíveis dentro desse módulo, de callback para promise.\n\n**Concluindo**\n\nAinda estamos usando o fs.readFile, mas em uma versão ‘promisifiada’ :) Isso é bastante poderoso, afinal assim podemos converter um módulo inteiro, de callback para promise utilizando generator ou async/await tranquilamente.\n\nVocê também pode conferir o passo a passo desse hands-on por vídeo:\n\nFique à vontade para deixar suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Promisify-Node%3A%20Convertendo%20fun%C3%A7%C3%B5es%20cl%C3%A1ssicas%20do%20Node%20em%20Promises&url=https%3A%2F%2Fdevpleno.com%2Fpromisify-node) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpromisify-node)",
      "description": "Neste post, vamos fazer um handson do PromisifyNode, uma forma de converter as funções clássicas do Node em JavaScript que retornam callback em promises. E...",
      "keywords": [
        "promisify",
        "node",
        "readfile",
        "para",
        "data",
        "callback",
        "arquivo",
        "https",
        "const",
        "promise"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/promisify-node"
      }
    },
    {
      "id": "95fa3df1e7ced187",
      "url": "https://devpleno.com/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira",
      "title": "Como as maratonas de programação da faculdade impactaram a minha carreira - DevPleno (Part 3)",
      "content": "Mas agora vem uma parte mais importante de toda essa história: a competição foi muito legal, ser premiado melhor ainda. Porém, naquele momento, eu não sabia o quanto ter vivenciado tudo isso teria de impacto na minha carreira.\n\n## Como as maratonas de programação da faculdade me ajudaram a prosperar na carreira de Dev\n\nMuitas vezes, os alunos ignoram atividades extracurriculares durante a faculdade e não dão a importância que elas realmente merecem. No meu caso, foi justamente nessas maratonas que eu passei a treinar programação e, sem dúvidas, isso fez toda a diferença na minha carreira e impactou (positivamente) na criação do DevPleno.\n\nQuase 9 anos depois, fui participar do processo seletivo da Toptal, e adivinhem: em uma das fases (por sinal uma das que mais reprovam) o objetivo era resolver o máximo de problemas em 1 hora. Além do formato parecer muito com a maratona de programação, os tipos de problemas também eram bem semelhantes… Eu já tinha feito isso antes!\n\nE deu certo! Não passei de primeira – e está tudo bem. Mas o melhor foi que, mesmo não tendo passando de primeira, a mentalidade já vinha sendo preparada para conseguir passar na segunda tentativa.\n\n## Aproveite as oportunidades\n\nMais importante do que ter oportunidades é saber aproveitar cada uma delas ao máximo. Às vezes, estamos com a “faca e o queijo na mão” e não enxergamos o quão preciosas são as chances que aparecem na nossa vida.\n\nPor isso, agarre cada oportunidade que surgir na sua vida, seja na faculdade, no trabalho, nas viagens, nos estudos… Veja cada momento como uma chance de se dedicar e explorar os conhecimentos ao máximo. Isso pode te levar a outro patamar e com certeza vai te fazer crescer. Muito.\n\nTalvez não agora… Talvez daqui 10 ou 20 anos, mas a semente vai estar plantada. Aproveite!\n\nPs 1: Aqui fiz uma brincadeira sobre utilizar Pascal, mas é notório que toda linguagem bem utilizada traz resultados.",
      "description": "A história do post de hoje já tem mais de 10 anos e faz parte de lembranças que eu tenho de quando ainda estava na faculdade, mais precisamente, de quando ...",
      "keywords": [
        "mais",
        "competi",
        "como",
        "para",
        "minha",
        "carreira",
        "faculdade",
        "maratonas",
        "muito",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira"
      }
    },
    {
      "id": "96a47691908044f9",
      "url": "https://devpleno.com/metronomo-com-javascript",
      "title": "Metrônomo com JavaScript - DevPleno (Part 3)",
      "content": "Também podemos trocar o texto do botão para play caso esteja tocando e Stop para quando estiver parado. Perceba que, ao apertar o play, ele começa a tocar apenas no próximo tick, pois o setInterval demora esse tick. Podemos fazer ele começar já com esse tick.\n\nplay.addEventListener('click', function () {\nif (isPlaying) {\nplay.innerHTML = 'Play'\nclearInterval(timer)\n} else {\ntick()\nplay.innerHTML = 'Stop'\nconst timer = setInterval(tick, (60 * 1000) / currentBpm)\n}\nisPlaying = !isPlaying\n})\nPara esse valor atualizar sempre que mudamos o range, temos que fazer um if, que vai limpar o intervalo e começar um novo valor baseado no cálculo.\n\nbpm.addEventListener('change', function () {\nh1.innerHTML = this.value + ' bpm'\ncurrentBpm = parseInt(this.value)\nif (isPlaying) {\nclearInterval(timer)\ntimer = setInterval(tick, (60 * 1000) / currentBpm)\n}\n})\nCom isso, acabamos de construir um metrônomo.\n\nEssa é uma ideia do que se pode construir com javaScript e HTML. Algumas outras ideias faremos posteriormente.\n\nConfira o passo a passo em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Metr%C3%B4nomo%20com%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Fmetronomo-com-javascript) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmetronomo-com-javascript)",
      "description": "O metrônomo um dispositivo que deixa uma batida constante e ajuda os músicos a manterem um ritmo quando estão treinando. Esse ritmo pode aumentar ou diminu...",
      "keywords": [
        "play",
        "tick",
        "para",
        "const",
        "timer",
        "vamos",
        "isplaying",
        "valor",
        "audio",
        "currentbpm"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/metronomo-com-javascript"
      }
    },
    {
      "id": "96abfebdd4ed445a",
      "url": "https://devpleno.com/como-publicar-seu-site-no-github",
      "title": "GH-Pages e como publicar seu site no Github - DevPleno (Part 2)",
      "content": "./node_modules/.bin/gh-pages -d build\nEle já está se conectando ao github. Agora se irmos em branch, podemos visualizar o gh-pages, ao olharmos o conteúdo, é exatamente a pasta que foi definida:\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=GH-Pages%20e%20como%20publicar%20seu%20site%20no%20Github&url=https%3A%2F%2Fdevpleno.com%2Fcomo-publicar-seu-site-no-github) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-publicar-seu-site-no-github)",
      "description": "Hoje quero mostrar para vocês como a gente pode postar o nosso site no GitHub utilizando o GHPages, sem precisar trocar ou fazer qualquer trâmite com o Git...",
      "keywords": [
        "pages",
        "site",
        "para",
        "isso",
        "vamos",
        "github",
        "agora",
        "https",
        "nosso",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/como-publicar-seu-site-no-github"
      }
    },
    {
      "id": "96f0f9549d3a6582",
      "url": "https://devpleno.com/blog/orientacao-objeto/index",
      "title": "Sou contra a orientação-objetos (OO)?",
      "content": "Hoje eu queria responder uma pergunta que sempre me fazem: “Tulio, você é contra orientação-objetos?”\n\nPrimeiramente, eu não sou contra orientação-objetos. Se pegarmos linguagens como JAVA, é um paradigma interessante.\n\nCoisas que eu não gosto em orientação-objeto:\n\nNós temos muito Pattern. A “Patternite”, como eu costumo brincar, faz com a a gente utilize o Pattern às vezes antes do tempo, aplicamos de forma prematura. E quando você começa a usar muito isso sem ter a concepção do seu sistema bem definida, pode ser que você comece a ter problemas de abstração, então sempre vai ter algo que não encaixa direito dentro da arquitetura.\n\nVoltando para a programação funcional, quando trazemos muitos Patterns e conceitos para a programação funcional, também temos esse problema, já que estamos abstraindo demais no começo. É Interessante lembrar que a menor unidade de código que temos dentro do JavaScript é a função. Quando a gente replica uma característica de orientação-objeto dentro de uma programação funcional é o que eu acho estranho, já que não precisamos necessariamente criar uma classe dentro do JavaScript, apesar de conseguirmos.\n\nEntão eu não sou contra a orientação-objetos em si, e sim aplicá-la demais em cima de uma linguagem funcional. A minha dica pra você é: tente não organizar demais de começo, senão vai começar a classificar coisas de maneira errada, já que vão ser classificadas em um estágio muito prematuro do projeto.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/GOb-0G4HnBM\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "orienta",
        "come",
        "dentro",
        "funcional",
        "embed",
        "contra",
        "objetos",
        "temos",
        "muito",
        "quando"
      ],
      "metadata": {
        "title": "Sou contra a orientação-objetos (OO)?",
        "date": "2017-09-19",
        "tags": "['Javascript']",
        "thumbnail": "OrientacaoObjeto.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/orientacao-objeto/index.md"
      }
    },
    {
      "id": "96f6a3d0fb420431",
      "url": "https://devpleno.com/blog/express-generator/index",
      "title": "Gere seu projeto em Express - Hands-on: Express-Generator (Part 2)",
      "content": "Nessa linha de código, já é feito a tradução. Quando ele bate em um js, procura no SaSS e gera automaticamente os styles.css. O Express-Generator já configura tudo para nós. Quando quisermos dar esse bootstraping na aplicação nova, ele nos poupa muito trabalho. Confira a explicação em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/EykUOF7Ah2Y\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "express",
        "sass",
        "generator",
        "aplica",
        "podemos",
        "embed",
        "criar",
        "exemplo",
        "abrir"
      ],
      "metadata": {
        "title": "Gere seu projeto em Express - Hands-on: Express-Generator",
        "date": "2017-06-06",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "EXPRESS-GENERATOR-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/express-generator/index.md"
      }
    },
    {
      "id": "97003c9c65a0bb29",
      "url": "https://devpleno.com/blog/clt-ou-pj/index",
      "title": "CLT ou PJ em Software - O que vale mais a pena? (Part 1)",
      "content": "Hoje eu gostaria de mostrar uma continha que eu acho bastante interessante quando vamos analisar ofertas de emprego, que o pessoal fala sobre CLT ou PJ. Entenda qual o custo de cada uma delas e porque você deveria escolher uma ou outra.\n\nA primeira coisa que temos que definir é o salário (lembrando que eu não sou contador, essa é uma conta que eu geralmente faço caso alguém me ofereça um emprego). Vamos colocar, por exemplo, R$10 mil.\n\nQual o custo disso para a empresa que está empregando?\n\nO custo para ela vai ser na faixa de 13x esse valor, pois é acrescentado o décimo terceiro, férias, etc, mais um encargo em torno de 30%:\n\n10.000,00 x 13 x 1,3 = 169.000,00\nValor para a empresa: R$169.000,00\n\nEntão se você recebe R$10 mil por mês, em um ano você custa em torno de R$169 mil para a empresa. No meu caso, como eu sou Super Simples, eu acabo pagando meus funcionários todos juntos no CLT, então não dá pra ter uma ideia muito grande de quanto é.\n\nQuanto desses R$169 mil você vai levar efetivamente?\n\nLembrando que se você recebe R$10 mil, vai bater na alíquota máxima do imposto de renda, então temos que multiplicar também por 0,725\n\n10.000,00 x 13 x 0,725 = 94.250,00\nValor líquido: R$94.250,00\n\nPerceba que isso já é uma diferença de R$74.750,00 (isso é apenas uma comparação no caso da CLT). Agora, qual o custo como PJ para a empresa que está te contratando?\n\n10.000,00 x 12 = 120.000,00\n\nNo fim das contas a empresa não vai gastar mais nada, mas qual o líquido que você vai receber em cima desses R$120 mil? Você terá que pagar um imposto, que se for no Super Simples, por exemplo, pode cair em torno de 8%:\n\n10.000,00 x 12 x 0,93 = 111.600,00\nValor líquido: R$111.600,00",
      "keywords": [
        "para",
        "como",
        "empresa",
        "custo",
        "exemplo",
        "valor",
        "isso",
        "qual",
        "caso",
        "mais"
      ],
      "metadata": {
        "title": "CLT ou PJ em Software - O que vale mais a pena?",
        "date": "2017-08-30",
        "tags": "['Carreira']",
        "thumbnail": "CLT-OU-PJ-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/clt-ou-pj/index.md"
      }
    },
    {
      "id": "971167369310fd05",
      "url": "https://devpleno.com/decisoes-baseadas-apenas-na-questao-financeira",
      "title": "Decisões baseadas apenas na questão financeira - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Decis%C3%B5es%20baseadas%20apenas%20na%20quest%C3%A3o%20financeira&url=https%3A%2F%2Fdevpleno.com%2Fdecisoes-baseadas-apenas-na-questao-financeira) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdecisoes-baseadas-apenas-na-questao-financeira)",
      "description": "Pare de tomar todas as decisões da sua carreira única e exclusivamente baseadas na parte financeira! Isso mudou a forma como eu atuo no mercado hoje. Quand...",
      "keywords": [
        "para",
        "https",
        "carreira",
        "apenas",
        "isso",
        "dinheiro",
        "decis",
        "baseadas",
        "financeira",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/decisoes-baseadas-apenas-na-questao-financeira"
      }
    },
    {
      "id": "9720e3b8742f47cf",
      "url": "https://devpleno.com/blog/stream-duplex/index",
      "title": "Hands-on: Streams Parte 03 - Duplex (Part 2)",
      "content": "Quando for executado a arrow function, ele irá criar uma instância para comunicarmos com o cliente. Quando este cliente enviar algum dado, será feito um 'ping-pong', ou seja, vamos mandar de volta esses dados para o cliente. O servidor fica ouvindo uma porta, no exemplo acima, a porta 1337.\n\nUma curiosidade é que isto segue a mesma ideia quando criamos uma aplicação com xpress, pois ele ouve uma porta e faz o tratamento, a única diferença é que 'por baixo dos panos' para não precisarmos ficar preocupados em criar socket.\n\n**No cliente:**\n\nNele iremos criar um novo Socket e conectar a porta do servidor (no exemplo 1337). Quando conectamos a esta porta será executado o callBack, que devolverá as respostas de conexão (console.log('Connected');). Toda vez que tivermos uma linha nova no console será escrita no Stream.\n\nRessaltando que o Client também é um Stream Duplex, afinal, nele executamos um.write, que é writable, e o client.on data que é readable.\n\nPor fim, temos um on data. Isso faz com que toda vez que recebermos dados esteja escrito na tela.\n\n**E como isso vai funcionar?**\n\nPara fazermos este código rodar, temos que executar o node socket.js server para startar o servidor. Em uma outra janela iremos rodar o client com node socket.js.\n\n**Conclusão**\n\nIsso é legal porque podemos gerenciar mais de um socket.js client e funcionaria perfeitamente, uma vez que na aplicação, sempre que receber uma conexão nova, ele irá executar o socket com uma instancia nova.\n\nEste exemplo de socket é muito usado para mostrar multi thread em outras linguagens como java. No caso do Node, ele é mono thread, o que torna sua performance muito melhor. Confira o Hands-on no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/kYoVIIqEFZQ\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "socket",
        "client",
        "para",
        "server",
        "data",
        "porta",
        "este",
        "stream",
        "cliente",
        "console"
      ],
      "metadata": {
        "title": "Hands-on: Streams Parte 03 - Duplex",
        "date": "2017-05-10",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/stream-duplex/index.md"
      }
    },
    {
      "id": "972120037e9aacf9",
      "url": "https://devpleno.com/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador",
      "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador - DevPleno (Part 3)",
      "content": "O [99Freelas](https://www.99freelas.com.br) é uma plataforma brasileira com mais de 3 milhões de freelancers cadastrados e mais de 138 mil projetos realizados. Os projetos abrangem TI, design, marketing e mais.\n\nVocê se cadastra, completa seu perfil e se candidata aos projetos disponíveis. A cada tarefa concluída, recebe avaliações que aumentam sua visibilidade. O pagamento é intermediado pela plataforma, o que dá mais segurança para ambas as partes.\n\n**Ideal para:** quem quer começar com projetos nacionais em português, sem a barreira do idioma.\n\n## 6. Scalable Path\n\nO [Scalable Path](https://www.scalablepath.com) funciona de forma diferente dos marketplaces tradicionais. A própria equipe da plataforma faz testes e entrevistas com você, e depois conecta com clientes internacionais que procuram habilidades específicas — como desenvolvimento iOS, Android, React, PHP ou Node.js.\n\nIsso significa que você não precisa ficar buscando projetos ativamente. Uma vez aprovado, eles fazem o match com empresas que precisam do seu perfil. Os projetos são internacionais e pagos em dólar.\n\n**Ideal para:** devs com experiência que preferem ser selecionados em vez de competir em leilões.\n\n## 7. Trampos.co\n\nO [Trampos.co](https://trampos.co) é uma plataforma brasileira com mais de 1,2 milhão de profissionais cadastrados. Não é exclusivamente para freelancers — também lista vagas CLT, PJ e estágio — mas tem uma boa oferta de trabalho remoto para desenvolvedores.\n\nVocê pesquisa vagas por cidade, área (programação, criação, marketing) e tipo de contrato. O cadastro é gratuito para profissionais, e a plataforma também oferece conteúdo educacional pelo Trampos Academy.\n\n**Ideal para:** quem busca tanto freelance quanto vagas fixas remotas no mercado brasileiro.\n\n## Como escolher a plataforma certa?\n\nNão existe uma resposta única. Minha recomendação:\n\n- **Está começando?** Comece pelo 99Freelas ou Workana para construir reputação sem a barreira do idioma.",
      "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
      "keywords": [
        "para",
        "projetos",
        "https",
        "mais",
        "como",
        "freelancer",
        "plataforma",
        "come",
        "ideal",
        "trabalhar"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador"
      }
    },
    {
      "id": "97281844a9d4b268",
      "url": "https://devpleno.com/tag/carreira/2",
      "title": "Carreira - Pagina 2 - DevPleno",
      "content": "Carreira\n\n## Arquivo de Insights\n\n93 posts encontrados com a tag Carreira\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 15 de fev. de 2018 Qual o nível de inglês para trabalhar por meio da Toptal?](/nivel-de-ingles-para-a-toptal)\n\n[Carreira 15 de fev. de 2018 Precisa ter diploma para trabalhar por meio da Toptal?](/precisa-ter-diploma-para-a-toptal)\n\n[Carreira 9 de fev. de 2018 Trabalhar na Toptal ou por meio da Toptal?](/na-toptal-ou-por-meio-da-toptal)\n\n[Carreira 9 de fev. de 2018 Por que a Toptal é tão valorizada no mercado?](/por-que-a-toptal-e-tao-valorizada)\n\n[Carreira 9 de fev. de 2018 O que é a Toptal? | Série Trabalho Remoto](/toptal-serietrabalhoremoto)\n\n[Carreira 30 de nov. de 2017 Como manter-se motivado](/como-manter-se-motivado)\n\n[Carreira 10 de nov. de 2017 O que fazer para dar certo?](/o-que-fazer-para-dar-certo)\n\n[Carreira 7 de nov. de 2017 Sobreviver em um mundo de abundância](/mundo-de-abundancia)\n\n[Carreira 27 de out. de 2017 Sobre abrir exceções e como lidar quando elas dão errado](/sobre-abrir-excecoes)\n\n[Carreira 25 de out. de 2017 Decisões baseadas apenas na questão financeira](/decisoes-baseadas-apenas-na-questao-financeira)\n\n[Carreira 17 de out. de 2017 Você sofre de Obesidade Mental?](/obesidade-mental)\n\n[Carreira 13 de out. de 2017 2 Tipos de Soluções de Software que você pode entregar](/2-tipos-de-solucoes-de-software-que-voce-pode-entregar)\n\n[Anterior](/tag/carreira)2 / 8[Próxima](/tag/carreira/3)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "toptal",
        "2017",
        "para",
        "2018",
        "meio",
        "trabalhar",
        "como",
        "algoritmos",
        "ferramentas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/carreira/2"
      }
    },
    {
      "id": "9732cc62e8891b37",
      "url": "https://devpleno.com/blog/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira/index",
      "title": "Como as maratonas de programação da faculdade impactaram a minha carreira (Part 2)",
      "content": "No quesito preparação, foi basicamente a mesma coisa, sempre me preparei. Fiz um aquecimento resolvendo vários problemas semelhantes nas semanas que antecederam a competição…\n\nMas havia algo a mais. Foi aí que lembrei que perdíamos por tempo e não por assertividade. Em maratonas de competição, o primeiro critério é o número de problemas resolvidos: quem resolve mais, vence e em caso de empate, quem os resolve mais rápido. Reparei que como a outra equipe entregava muito rápido (sim, os caras eram muito rápidos em Pascal e eram bem assertivos), tínhamos que vencer de outra forma: na quantidade.\n\nNa minha última participação, faltando 30 minutos para acabar a competição, estávamos perdendo de novo – por tempo. Mesmo número de problemas resolvidos, porém, a equipe Pascal era rápida, tsc.\n\nRestavam problemas cabeludos para resolver… Bom, dá para imaginar que fiquei nervoso e ansioso, mas foquei em fazer passar mais uma solução de problema. Tenta que tenta que tenta… Passamos! \\o/\n\nCaramba! Que alívio! Agora, era esperar que o Pascal Team não fizesse mais um – pois perderíamos no desempate por tempo. Lembro que fui embora da sala de competição e brinquei com a equipe do Pascal: “Agora é com vocês”.\n\n![Minha equipe na nossa última participação](a1357667-cbd4-4514-93cb-7e6edc9202de.jpeg)\n\nÉ, desta vez foi! Vencemos! Conseguimos encerrar a graduação com mais uma vitória. 🙂\n\n## Algumas lições que tirei durante os quatro anos de competição\n\nO que mais aprendi durante a minha última vez competindo foi: precisamos repetir o que dá certo e mudar o que não dá. Parece simples, mas na prática é um pouco mais complicado.\n\nOutro ponto importante: como manter a cabeça no lugar sob pressão. Daqueles 30 minutos finais, 20 passaram como se fosse 1 segundo (até que conseguimos resolver o problema). já os 10 minutos esperando, na ansiedade para descobrir se a outra equipe conseguiria resolver, pareciam dias. Isso me ensinou na prática como controlar o máximo que dava meu emocional.",
      "keywords": [
        "mais",
        "competi",
        "para",
        "como",
        "minha",
        "equipe",
        "muito",
        "isso",
        "programa",
        "pascal"
      ],
      "metadata": {
        "title": "Como as maratonas de programação da faculdade impactaram a minha carreira",
        "date": "2019-03-19",
        "tags": "['Carreira']",
        "thumbnail": "top-tal-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira/index.md"
      }
    },
    {
      "id": "9746c445b7d5bfcb",
      "url": "https://devpleno.com/servidor-json-simples-em-php-parte-1",
      "title": "Servidor JSON simples em PHP (parte 1) - DevPleno (Part 2)",
      "content": "if($method === 'POST'){\n$jsonBody = json_decode($body, true);\n$jsonBody[id] = time();\nif(!$json[$path[0]]){\n$json[$path[0]] = [];\n}\n$json[$path[0]][] = $jsonBody;\necho json_encode($jsonBody);\nfile_put_contents('db.json', json_encode($json));\n}\nCaso não exista aquele caminho, vamos criar com um vazio, inserir um item novo e salvar. Caso olharmos o banco depois disso, temos a adição do novo item, caso usarmos o get novamente ele puxará todas as séries que existe lá mais a que foi adicionada por último. Você pode subir esse arquivo e o DB para o servidor que suporte PHP.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Servidor%20JSON%20simples%20em%20PHP%20(parte%201)&url=https%3A%2F%2Fdevpleno.com%2Fservidor-json-simples-em-php-parte-1) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidor-json-simples-em-php-parte-1)",
      "description": "Hoje quero mostrar para vocês como criar um servidor JSON utilizando o PHP. Mas por que PHP e não JavaScript? Porque ainda é uma linguagem que tem hospedag...",
      "keywords": [
        "json",
        "path",
        "https",
        "contents",
        "method",
        "caso",
        "javascript",
        "servidor",
        "simples",
        "parte"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/servidor-json-simples-em-php-parte-1"
      }
    },
    {
      "id": "975c82d50a762c6f",
      "url": "https://devpleno.com/tag/nodejs/4",
      "title": "NodeJS - Pagina 4 - DevPleno",
      "content": "NodeJS\n\n## Arquivo de Insights\n\n58 posts encontrados com a tag NodeJS\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 8 de mai. de 2017 Hands-on: Readline](/hands-on-readline)\n\n[Javascript 4 de mai. de 2017 Promisify-Node: Convertendo funções clássicas do Node em Promises](/promisify-node)\n\n[Javascript 2 de mai. de 2017 Hands-on: Marked](/hands-on-marked)\n\n[Javascript 24 de abr. de 2017 Hands-on: Low-db](/hands-low-db)\n\n[Javascript 24 de abr. de 2017 Hands-on: Faker](/hands-on-faker)\n\n[Javascript 17 de abr. de 2017 Dica: Once n vezes](/dica-n-vezes)\n\n[Javascript 10 de abr. de 2017 Hands-on: Json-Server](/hands-json-server)\n\n[Javascript 22 de mar. de 2017 Dica: Debug de NodeJS no VS Code](/dica-debug-de-nodejs-no-vs-code)\n\n[Javascript 7 de mar. de 2017 Dica: Injeção de dependência com Destructuring Assignament](/dica-injecao-de-dependencia-com-destructuring-assignament)\n\n[Javascript 6 de mar. de 2017 Hands-on: Slack](/hands-on-slack)\n\n[Javascript 3 de mar. de 2017 Hands-on: ShellJS](/hands-on-shelljs)\n\n[Javascript 24 de fev. de 2017 Hands-on: NodeJS - PM2](/hands-on-nodejs-pm2)\n\n[Anterior](/tag/nodejs/3)4 / 5[Próxima](/tag/nodejs/5)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "hands",
        "javascript",
        "2017",
        "nodejs",
        "dica",
        "node",
        "algoritmos",
        "carreira",
        "ferramentas",
        "fundamentos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/nodejs/4"
      }
    },
    {
      "id": "97751e249ef8efcb",
      "url": "https://devpleno.com/blog/nova-skills-preco-que-tem-que-ser-pago/index",
      "title": "Novas Skills: O preço que tem que ser pago (Part 2)",
      "content": "Às vezes na vida estamos reclamando de alguma coisa, mas evitamos pagar o preço para alcançar esse objetivo.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "tempo",
        "pagar",
        "quero",
        "alguma",
        "skill",
        "come",
        "coisa",
        "como",
        "conta"
      ],
      "metadata": {
        "title": "Novas Skills: O preço que tem que ser pago",
        "date": "2017-05-08",
        "tags": "['Carreira']",
        "thumbnail": "NovaSkill.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/nova-skills-preco-que-tem-que-ser-pago/index.md"
      }
    },
    {
      "id": "977caf0b1564384a",
      "url": "https://devpleno.com/es7-array-includes",
      "title": "ES7 Array Includes - DevPleno",
      "content": "Javascript\n\n## ES7 Array Includes\n\nT\nPor Tulio Faria • 10 de outubro de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nNa dica de hoje, quero falar um pouco sobre o ES7 e uma funcionalidade que foi adicionada ao vetor. Primeiramente vou mostrar como fazemos comumente em ES6 e ES5, seguido de como podemos começar a fazer no ES7 citando sua vantagem. Vou criar um vetor:\n\nconst nums = [1, 2, 3, 4]\nSe quiséssemos checar se um valor está ou não dentro desse vetor, faríamos normalmente, checaríamos se o índice não é -1:\n\nconsole.log(nums.indexOf(4) != -1)\nCom isso, quando ele não encontrar, vai ser retornado -1. O problema do indexOf falha quando tentamos buscar por NaN (not a number). Já com o includes, é possível checar e buscar dentro dele se temos o valor:\n\nconsole.log(nums.includes(NaN))\nCom isso, conseguimos buscar o NaN de uma forma mais coesa. Outra coisa que ganhamos com isso é que o nosso código fica mais legível, já que não fazemos mais “gambiarra”, afinal estamos apenas checando se ele inclui ou não, isso de maneira funcional.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=ES7%20Array%20Includes&url=https%3A%2F%2Fdevpleno.com%2Fes7-array-includes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fes7-array-includes)",
      "description": "Na dica de hoje, quero falar um pouco sobre o ES7 e uma funcionalidade que foi adicionada ao vetor. Primeiramente vou mostrar como fazemos comumente em ES6...",
      "keywords": [
        "https",
        "includes",
        "isso",
        "javascript",
        "array",
        "vetor",
        "nums",
        "checar",
        "buscar",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/es7-array-includes"
      }
    },
    {
      "id": "97b327fa9f2a4296",
      "url": "https://devpleno.com/blog/12",
      "title": "Blog - Página 12 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 18 de jul. de 2017 Estudar 1 hora por dia ou 8 horas no sábado?](/estudar-1-hora-por-dia-ou-8-horas-no-sabado)\n\n[Carreira 18 de jul. de 2017 Pensamentos limitantes](/pensamentos-limitantes)\n\n[Carreira 14 de jul. de 2017 8 dicas de organização para freelancers se darem bem na carreira](/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira)\n\n[Carreira 13 de jul. de 2017 Ensino Formal ou Cursos Livres - Por qual optar?](/ensino-formal-ou-cursos-livres)\n\n[Carreira 12 de jul. de 2017 Aprenda a aprender](/aprenda-a-aprender)\n\n[Algoritmos 12 de jul. de 2017 Lista encadeada - Adicionar nó](/lista-encadeada-adicionar-no)\n\n[Carreira 11 de jul. de 2017 Porque você não deve abaixar a guarda](/abaixar-a-guarda)\n\n[Algoritmos 11 de jul. de 2017 Como saber a complexidade de um algoritmo](/complexidade-de-um-algoritmo)\n\n[Javascript 11 de jul. de 2017 Minicurso Socketio - Parte 05 - Colocando o projeto no ar](/minicurso-socket-io-parte-5)\n\n[Javascript 10 de jul. de 2017 Minicurso Socket.IO Parte 4 - Separando notificações por Rooms](/minicurso-socket-io-parte-4)\n\n[Javascript 8 de jul. de 2017 Jest - Como utilizar a ferramenta de testes criada pelo Facebook](/hands-on-jest)\n\n[Carreira 7 de jul. de 2017 Aprenda a dizer NÃO!](/aprenda-a-dizer-nao)\n\n[Anterior](/blog/11)12 / 26[Próxima](/blog/13)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "carreira",
        "javascript",
        "algoritmos",
        "aprenda",
        "minicurso",
        "parte",
        "para",
        "blog",
        "socket"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/12"
      }
    },
    {
      "id": "97db8eae7b6a5bf0",
      "url": "https://devpleno.com/npm-e-modulos-de-terceiros",
      "title": "NPM e Módulos de Terceiros - NodeJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## NPM e Módulos de Terceiros - NodeJS\n\nT\nPor Tulio Faria • 5 de julho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nO Node já vem com um gerenciador de pacotes chamado NPM (Node Package Mananger), com o qual é possível gerenciar todas as dependências de pacotes, então ele é tanto um repositório de módulos quanto uma ferramenta que já vem instalada com o Node. Se colocarmos no CMD:\n\nnpm - v\nDepois de ter instalado o Node, conseguimos ver a versão do NPM, no meu caso é o 3.6.0.\n\nPor exemplo, eu quero instalar um módulo chamado String, então coloco:\n\nnpm install string\nÉ meio estranho, mas esse módulo String tem algumas facilidades a mais. Feito isso, será mostrado a mensagem de que foi instalado, no meu caso deu um warning pois eu não tenho um package.json, mas vamos criá-lo mais tarde.\n\nAgora, na pasta do seu projeto, vai ser criada uma pasta node_modules, nela fica todos os módulos que foram instalados pelo NPM, como o módulo String. Especificamente esse pacote String usamos com o S maiúsculo\n\nvar S = require('string');\nvar txt = S('olá').replaceAll(\"o\", \"O').toString();\nconsole.log(txt)\nUsamos, por exemplo, o replaceAll, que não tem efetivamente no javaScript. Perceba que ele trocou o ‘o’ de minúsculo para maiúsculo.\n\nQuais os detalhes temos que reparar quando usamos módulos de terceiros?\n\nFizemos um módulo anteriormente, e nele importávamos colocando ./, por exemplo:\n\nvar S = require('./string')\nMas usamos ./ apenas quando os módulos são locais e não uma dependência externa ao seu projeto. No caso do String, que é publicado no NPM, podemos referenciar diretamente pelo nome porque o node vai procurar no módulo da sua pasta. Se não acha, ele começa a procurar nas pastas pai.",
      "description": "O Node já vem com um gerenciador de pacotes chamado NPM (Node Package Mananger), com o qual é possível gerenciar todas as dependências de pacotes, então el...",
      "keywords": [
        "depend",
        "string",
        "dulos",
        "isso",
        "projeto",
        "para",
        "quando",
        "node",
        "qual",
        "ncias"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/npm-e-modulos-de-terceiros"
      }
    },
    {
      "id": "9831c18e34893ad5",
      "url": "https://devpleno.com/convertendo-timestamps",
      "title": "Módulo MS - Convertendo timestamps - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=M%C3%B3dulo%20MS%20-%20Convertendo%20timestamps&url=https%3A%2F%2Fdevpleno.com%2Fconvertendo-timestamps) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fconvertendo-timestamps)",
      "description": "O handson de hoje é bem curto, apenas para mostrar um módulo que achei bastante interessante e funciona tanto para Node quanto para Browser. Esse módulo se...",
      "keywords": [
        "para",
        "https",
        "timestamps",
        "javascript",
        "dulo",
        "bastante",
        "interessante",
        "console",
        "quando",
        "100000"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/convertendo-timestamps"
      }
    },
    {
      "id": "9845bcea6f49b06b",
      "url": "https://devpleno.com/blog/precificacao-de-softwares-voce-sabe-como-fazer/index",
      "title": "Precificação de softwares: você sabe como fazer? (Part 1)",
      "content": "Um dos desafios de quem trabalha na área de tecnologia, especificamente em desenvolvimento de programas, é a precificação de softwares. Por envolver ativos imateriais, virtuais, esse processo acaba suscitando dúvidas no profissional ou na empresa desenvolvedora, que pode acabar por subestimar ou superestimar os valores.\n\nPara evitar a definição equivocada de preços que podem espantar clientes ou serem insuficientes para remunerar o trabalho envolvido, é importante ficar atento aos recursos e conhecimentos envolvidos no processo. Aliás, tais pontos são até comuns de serem avaliados em outros setores que envolvem serviços e produtos físicos, embora nem sempre sejam aplicados de maneira adequada na hora de [cobrar por software](https://www.devpleno.com/como-cobrar-por-software?utm_source=blog&utm_campaign=rc_blogpost).\n\nPortanto, se você quer saber o que considerar nesse processo, continue lendo e veja nossas dicas!\n\n## Como precificar um software?\n\nÉ importante precificar um software de modo inteligente, buscando valorizar o trabalho empregado mas sem perder o foco num valor atrativo, pois é necessário estar atento aos concorrentes e o mercado em geral.\n\nÉ preciso levar em consideração os custos fixos e os variáveis, bem como o valor necessário em cada projeto para a delimitação do seu salário. Também é indicado incluir uma porcentagem para a definição do seu lucro e de uma quantia caso deseje contratar um profissional para complementar o seu trabalho. Além disso, é vital acrescentar uma quantia para o pagamento de tributos, especialmente o Imposto de Renda (IR).\n\nApós isso, você pode definir a forma como pretende trabalhar, se por projeto independente, com começo, meio e fim, ou por meio da criação e manutenção de softwares. Nesse primeiro caso entram os pacotes mensais. Nesse segundo caso, os serviços de atualização, manutenção e prestação de suporte contínuo devem entra na conta.\n\n## Quais os critérios para precificar um software?",
      "keywords": [
        "para",
        "software",
        "valor",
        "como",
        "mais",
        "tamb",
        "seus",
        "ncia",
        "trabalho",
        "hora"
      ],
      "metadata": {
        "title": "Precificação de softwares: você sabe como fazer?",
        "date": "2017-06-28",
        "tags": "['Carreira']",
        "thumbnail": "Precificacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "blog/precificacao-de-softwares-voce-sabe-como-fazer/index.md"
      }
    },
    {
      "id": "984c0852c33f3884",
      "url": "https://devpleno.com/blog/filter/index",
      "title": "High-order Function Filter (Part 1)",
      "content": "Hoje vamos de continuar falando sobre as [high-order functions](https://www.devpleno.com/high-order-functions/) que podemos aplicar em um vetor em JavaScript. Nós já tínhamos feito algumas high-order functions anteriormente, nas quais mostrei o [Map](https://www.devpleno.com/map/) e o [Reduce](https://www.devpleno.com/reduce/), nesse exemplo, vou mostrar o FIlter, que também é muito interessante.\n\nVamos imaginar que temos um estoque que atualiza em tempo real e que por algum motivo a segunda peça está zerada. Quando eu for mostrar o carrinho eu quero que mostre apenas a soma das compras pro estoque maior que zero, para isso podemos usar a high-order function chamada de 'filter', ela filtra os itens que estão fora de estoque:\n\n```js\nconst carrinho = [\n  { id: 1, preco: 2, qtd: 2, estoque: 10 },\n  { id: 1, preco: 3, qtd: 1, estoque: 0 }\n]\n\nconst subtotal = (item) => item.preco * item.qtd\n\nconst total = carrinho\n  .map(subtotal)\n  .reduce((soma, subtotal) => subtotal + soma, 0)\n\nconst semEstoque = carrinho.filter((item) => item.estoque < item.qtd)\n\nconsole.log(semEstoque)\n```\n\nAssim ele já mostra quais têm a quantidade zero. Caso ele tivesse 2 de estoque, ele também mostraria que não consegue atender porque o estoque é menor que a quantidade. Então, quando formos somar o total do carrinho, podemos usar o filter para passar uma arrow function:\n\n```js\nconst total = carrinho\n  .filter((item) => item.estoque >= item.qtd)\n  .map(subtotal)\n  .reduce((soma, subtotal) => subtotal + soma, 0)\n\nconst semEstoque = carrinho.filter((item) => item.estoque < item.qtd)\n\nconsole.log(total)\n```\n\nPerceba que ele não considerou um dos itens, isso acontece porque as high-order function sempre retornam um novo vetor, então quando eu passo o filtro, removo o item do vetor. Então eu estou passando um novo vetor só com o item 1 para o map, que vai multiplicar o preço pela quantidade e vai passar esse novo vetor para o reduce, que vai reduzir somando os valores.",
      "keywords": [
        "item",
        "estoque",
        "subtotal",
        "carrinho",
        "const",
        "filter",
        "reduce",
        "soma",
        "high",
        "order"
      ],
      "metadata": {
        "title": "High-order Function Filter",
        "date": "2017-08-02",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "FILTER-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/filter/index.md"
      }
    },
    {
      "id": "984f7fc99b831188",
      "url": "https://devpleno.com/audio-com-js-puro",
      "title": "Tocando um Áudio com JS puro - DevPleno (Part 2)",
      "content": "audio.currentTime = 0.1\nDentro desse clap podemos fazer até alguns efeitos diferentes, pois à medida com que eu mexo o currentTime e dou o play, o efeito do áudio é um pouco diferente. Para fazer isso, usamos apenas o javaScript.\n\nGostou dessa dica sobre áudio com JS puro? Deixe seu comentário! Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Tocando%20um%20%C3%81udio%20com%20JS%20puro&url=https%3A%2F%2Fdevpleno.com%2Faudio-com-js-puro) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Faudio-com-js-puro)",
      "description": "Uma das coisas que utilizaremos na interface que vamos construir no Minicurso de Socket.io para que fique mais próximo do real são os efeitos sonoros. Por ...",
      "keywords": [
        "audio",
        "udio",
        "para",
        "play",
        "html",
        "https",
        "puro",
        "button",
        "javascript",
        "head"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/audio-com-js-puro"
      }
    },
    {
      "id": "98cfde9461f8088c",
      "url": "https://devpleno.com/blog/reduce/index",
      "title": "High-order Function - Reduce (Part 2)",
      "content": "Essa é uma forma bem fácil de se fazer em teste unitários, utilizando bastante funções puras no Map, Reduce, etc. Isso ajuda muito a aumentar a testabilidade do código e consequentemente a qualidade dele.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/PKnpSaAQdd4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "item",
        "reduce",
        "carrinho",
        "soma",
        "subtotal",
        "const",
        "total",
        "fazer",
        "preco",
        "https"
      ],
      "metadata": {
        "title": "High-order Function - Reduce",
        "date": "2017-06-30",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Reduce.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/reduce/index.md"
      }
    },
    {
      "id": "98eaa2543103b9b8",
      "url": "https://devpleno.com/dica-debug-de-nodejs-no-vs-code",
      "title": "Dica: Debug de NodeJS no VS Code - DevPleno",
      "content": "Javascript\n\n## Dica: Debug de NodeJS no VS Code\n\nT\nPor Tulio Faria • 22 de março de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste dica, vamos ver como depurar nosso código NodeJS utilizando o VS Code.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), i[nscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre se e-mail para não perder as novidades. Deixe suas sugestões e dúvidas nos comentários. Abraços!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Debug%20de%20NodeJS%20no%20VS%20Code&url=https%3A%2F%2Fdevpleno.com%2Fdica-debug-de-nodejs-no-vs-code) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-debug-de-nodejs-no-vs-code)",
      "description": "Neste dica, vamos ver como depurar nosso código NodeJS utilizando o VS Code. Confira o video: <div className=&#34;embedresponsive embedresponsive16by9&#34;   <ifra...",
      "keywords": [
        "nodejs",
        "https",
        "code",
        "javascript",
        "dica",
        "debug",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fdica"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-debug-de-nodejs-no-vs-code"
      }
    },
    {
      "id": "9940da8ba3f80799",
      "url": "https://devpleno.com/funcionalidades-do-console",
      "title": "4 funcionalidades do Console no DevTools que você não conhece - DevPleno (Part 1)",
      "content": "Javascript\n\n## 4 funcionalidades do Console no DevTools que você não conhece\n\nT\nPor Tulio Faria • 25 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nO console no DevTools do Chrome apresenta algumas funcionalidades que muitos utilizam raramente ou até mesmo nem sabem que existem.\n\nPara fazer este teste, vamos criar um HTML simples com um script começando com o console.log normal.\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;script>console.log('este é um log')&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nNele temos apenas uma saída e nada além disso. Agora vamos falar sobre alguns que quase não utilizamos. **#1 error**\n\nconsole.error('um erro')\nCaso tenha algum erro no console, você pode marcá-lo de vermelho, assim, ele te mostra onde ocorreu esse erro. Quando estiver debugando o código e quiser achar algo, pode usar o console.error e ele irá pegar o stack trace também.\n\n**#2 time** Com ele você pode checar quanto tempo foi gasto para executar uma dada função.\n\nconsole.time('nomeCounter')\nconsole.log('este é um log')\nconsole.log('este é um log')\nconsole.timeEnd('nomeCounter')\nEm muitos testes que fazemos, o console.log consome recurso da máquina pois ele tem que lidar com o IO. **#3 count**\n\nconsole.count(contador)\nEle conta quantas vezes uma string foi chamada ou quantas você passou em um trecho específico de código, o que é muito bom para fazer algum check.\n\n**#4 table** Nele você pode colocar uma lista de nomes e ele monta uma tabela no auto do console. Isso facilita bastante na hora de depurar o código, pois pode mostrar os dados em forma de tabela se quiser.\n\nconsole.table([{nome: 'Tulio'};\n{nome: 'Faria'};])\nTodos eles, se bem utilizados, podem ajudar muito na melhora de desempenho do código ou simplesmente ajudar a depurar mais facilmente.\n\nConfira o video:",
      "description": "O console no DevTools do Chrome apresenta algumas funcionalidades que muitos utilizam raramente ou até mesmo nem sabem que existem. Para fazer este teste, ...",
      "keywords": [
        "console",
        "https",
        "este",
        "pode",
        "para",
        "digo",
        "javascript",
        "html",
        "script",
        "error"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/funcionalidades-do-console"
      }
    },
    {
      "id": "99644ab3fdc3090d",
      "url": "https://devpleno.com/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose",
      "title": "Mongoose: corrigindo &quot;Cannot overwrite &#39;Model&#39; model once compiled&quot; - DevPleno (Part 1)",
      "content": "Javascript\n\n## Mongoose: corrigindo \"Cannot overwrite 'Model' model once compiled\"\n\nT\nPor Tulio Faria • 3 de outubro de 2016\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nDurante o desenvolvimento de um protótipo aqui na empresa, eu me deparei com uma situação bem interessante no Mongoose. Por algum motivo, comecei a receber o seguinte erro: _OverwriteModelError: Cannot overwrite `User` model once compiled. _\n\nC:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\node\\_modules\\\\mongoose\\\\lib\\\\index.js:361\nthrow new mongoose.Error.OverwriteModelError(name);\n^\nOverwriteModelError: Cannot overwrite \\`User\\` model once compiled.\nat Mongoose.model (C:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\node\\_modules\\\\mongoose\\\\lib\\\\index.js:361:13)\nat Object.&#x3C;anonymous> (C:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\User.js:8:27)\nat Module.\\_compile (module.js:413:34)\nat Object.Module.\\_extensions..js (module.js:422:10)\nat Module.load (module.js:357:32)\nat Function.Module.\\_load (module.js:314:12)\nat Module.require (module.js:367:17)\nat require (internal/module.js:16:19)\nat Object.&#x3C;anonymous> (C:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\postsController.js:1:74)\nat Module.\\_compile (module.js:413:34)\nat Object.Module.\\_extensions..js (module.js:422:10)\nat Module.load (module.js:357:32)\nat Function.Module.\\_load (module.js:314:12)\nat Module.require (module.js:367:17)\nat require (internal/module.js:16:19)\nat Object.&#x3C;anonymous> (C:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\index.js:6:1)\nO que me intrigou muito foi que sempre utilizei o Mongoose praticamente da mesma forma. O exemplo que gerou este erro é este aqui:\n\nvar mongoose = require('mongoose')\nmongoose.connect('mongodb://localhost/mongoose-problem')\n\nrequire('./usersController.js')\nrequire('./postsController.js')\nO model User:\n\nvar mongoose = require('mongoose')\n\nvar userSchema = mongoose.Schema({\nemail: String,\npassword: String\n})",
      "description": "Durante o desenvolvimento de um protótipo aqui na empresa, eu me deparei com uma situação bem interessante no Mongoose. Por algum motivo, comecei a receber...",
      "keywords": [
        "mongoose",
        "module",
        "user",
        "require",
        "model",
        "windows",
        "erro",
        "devpleno",
        "problem",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose"
      }
    },
    {
      "id": "9980e3538910de09",
      "url": "https://devpleno.com/blog/hands-json-server/index",
      "title": "Hands-on: Json-Server",
      "content": "Todo mundo já passou pela situação onde precisava fazer um teste com front-end e precisou de uma API funcionando. Não seria interessante ter uma forma de acessar um formato de dados simples, sem muita configuração? Veja como é simples criar uma REST API para testes com o Json-server.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/VrPByfYy9PE\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "simples",
        "para",
        "class",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Hands-on: Json-Server",
        "date": "2017-04-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "JsonServer.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-json-server/index.md"
      }
    },
    {
      "id": "99e185562fe63bc7",
      "url": "https://devpleno.com/blog/router-props-2/index",
      "title": "React-router-dom: como injetar props em rotas em ReactJS (Part 2)",
      "content": "export default Teste\n```\n\nAgora vamos até o cabeçalho da aplicação e criar um link para a home e um link para teste, assim, já temos uma navegação funcionando normalmente.\n\n```jsx\n<div className='App'>\n  <div className='App-header'>\n    <img src={logo} className='App-logo' alt='logo' />\n    <h2>Welcome to React</h2>\n    <p>\n      <Link to='/'>Home</Link>\n      <Link to='/teste'>Teste</Link>\n    </p>\n  </div>\n</div>\n```\n\n**Qual o problema?**\n\nEu preciso passar parâmetros ou props para o componente Home, mas ele não irá funcionar se fizermos assim:\n\n```jsx\n<Route exact path='/' component={Home} name='Tulio' />\n```\n\n**Como podemos passar essa props para o componente home?**\n\nAo invés de chamar component, vamos chamar render. Ele é legal porque podemos passar uma arrow function com props e dizemos que essa arrow function vai retornar este componente /Home.\n\n```jsx\n<div className='App-intro'>\n  <Route exact path='/' render={(props) => <Home />} name='Tulio' />\n  <Route exact path='/teste' component={Teste} />\n</div>\n```\n\nEsses props são as propriedades que o próprio route passa para o componente, então temos que injetar essas props _(vai que por algum motivo ele precisa saber em qual URL ele está, ou algo nesse sentido)._\n\nCom isso, conseguimos efetivamente passar os props que queremos.\n\n```jsx\n<Route\n  exact\n  path='/'\n  render={(props) => <Home {...props} name='Tulio' />}\n  name='Tulio'\n/>\n```\n\nAlém das propriedades que já tínhamos no componente por causa da route, caso olharmos em teste, percebemos que só temos as propriedades que foram passadas pelo route e não pela importação do componente.\n\nIsso é muito importante para conseguirmos injetar dependência, eu descobri essa forma de utilizar a passada de props através de uma rota por que precisava injetar uma dependência.\n\nConfira o passo a passo em vídeo:",
      "keywords": [
        "home",
        "react",
        "classname",
        "teste",
        "logo",
        "props",
        "import",
        "componente",
        "route",
        "para"
      ],
      "metadata": {
        "title": "React-router-dom: como injetar props em rotas em ReactJS",
        "date": "2017-05-17",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "RouterProps.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/router-props-2/index.md"
      }
    },
    {
      "id": "99e19971ac071b4f",
      "url": "https://devpleno.com/blog/modulo-co/index",
      "title": "Módulo Co - Organize o fluxo de seu código assíncrono (Part 1)",
      "content": "Neste hands-on, vamos utilizar uma ferramenta bastante útil no nosso dia a dia, o módulo CO, que é uma forma de controlar o fluxo das funções por meio de generator no JavaScript. Vamos lá, a primeira coisa é adicionar o co:\n\n```jsx\nyarn add co\n```\n\nO problema que tínhamos era de ler um arquivo, baseado no conteúdo desse arquivo, iterávamos sobre ele e dentro dessa iteração tínhamos que escrever outros arquivos. Se formos fazer isso com código assíncrono normal, isso se torna extremamente confuso porque temos iteração sobre operações assíncronas que dependem de outras operações assíncronas, já com o generator é muito mais simples porque podemos fazer o seguinte:\n\nNo diretório CO, eu criei um arquivo test.js, dentro dele vou importar o CO e o FS e criar uma função readFile onde passamos apenas o arquivo que queremos.\n\n```jsx\nconst co = require('co')\nconst fs = require('fs')\nfunction readFile(file) {\n  fs.readFile(file, 'utf-8', function (err, data) {\n    console.log(data)\n  })\n}\nreadFile('yarn.lock')\n```\n\nTeoricamente, para fazer essa função funcionar, normalmente eu preciso passar para ela um callBack, mas vamos fazer um pouco diferente. Para usar o generator, as funções que chamamos assíncronas têm que ser promises, ou seja, temos que converter essas funções:\n\n```jsx\nfunction readFile(file){\n    return new promise(function(resolve, reject){\n        fs.readFile(file, 'utf-8', function(err, data){\n            if(err){\n                reject(err)\n            }else{\n            resolve(data)\n            }\n        })\n    })\n}\nreadFile('yarn.lock')\n.then(function(data)){console.log(data)})\n```\n\nEstamos pegando essa função que depende de um callBack e ao invés de retorná-la, retornamos uma promise e isso será executado no futuro. Quando ele chamar o callBack, vai rejeitar a promise ou resolver e passa os dados de volta.",
      "keywords": [
        "function",
        "readfile",
        "file",
        "data",
        "fazer",
        "digo",
        "const",
        "contents",
        "generator",
        "yarn"
      ],
      "metadata": {
        "title": "Módulo Co - Organize o fluxo de seu código assíncrono",
        "date": "2017-07-29",
        "tags": "['Javascript']",
        "thumbnail": "CO.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/modulo-co/index.md"
      }
    },
    {
      "id": "9a025e3447c72348",
      "url": "https://devpleno.com/blog/hands-on-nodejs-pm2/index",
      "title": "Hands-on: NodeJS - PM2",
      "content": "Você precisa deixar seu script rodando direto sem precisar iniciá-lo ou travando seu console? No hands-on deste post, vou mostrar o PM2, um gerenciador de processos que pode ser utilizado em node ou para outras linguagens e tecnologias também. Confira o vídeo-tutorial.:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/rFv_PRU2nrU\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "para",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "precisa"
      ],
      "metadata": {
        "title": "Hands-on: NodeJS - PM2",
        "date": "2017-02-24",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "NodeJSPM2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-nodejs-pm2/index.md"
      }
    },
    {
      "id": "9a2e72452ecbc261",
      "url": "https://devpleno.com/blog/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira/index",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira (Part 3)",
      "content": "## 4. Saiba o que evitar no trabalho freelancer\n\nTanto no Brasil, quanto no exterior, atrasos e quebras de contrato prejudicam sua reputação. Em muitas plataformas que fazem a mediação entre freelancers e clientes, visando a entrega de determinado serviço, isso pode representar a diminuição de sua nota ou, até mesmo, a exclusão de seu perfil.\n\nEm alguns países, pode existir uma intolerância ainda mais aguda em relação a esse problema. Por isso, seja comprometido com seus prazos e entregas a fim de obter [sucesso como freelancer](https://www.devpleno.com/metas-na-carreira-de-desenvolvedor?utm_source=blog&utm_campaign=rc_blogpost) no exterior.\n\n## 5. Avalie se o trabalho de freelancer combina com você\n\nHá muitas pessoas em empregos formais que jamais se arriscariam na vida de freelancer. A maior parte delas atribui essa forma de pensar às incertezas desse regime de trabalho ou à falta de disciplina para ser seu próprio chefe.\n\nPor outro lado, se você acredita ser capaz de organizar-se para ter uma rotina mais flexível, não se apega a cargos ou a hierarquias e, ainda, sabe lidar com uma margem variável de rendimento mensal, o trabalho como freelancer é uma ótima opção.\n\nA flexibilidade relacionada à prestação desse tipo de serviço pode trazer a possibilidade de viver em outros países. Para quem tem fluência em outras línguas, como o inglês, por exemplo, há um grande número de oportunidades no exterior.\n\n## 6. Esteja em constante capacitação\n\nUma particularidade do trabalho de freelancer é a baixa adesão a cursos de capacitação. Trabalhar por conta própria leva muitos profissionais a pensar que não é preciso estar em constante atualização.\n\nEsse é um engano que não pode ser cometido. As constantes mudanças no mercado de trabalho têm a mesma repercussão para pessoas em empregos formais e para quem presta serviço freelancer.",
      "keywords": [
        "para",
        "trabalho",
        "freelancer",
        "exterior",
        "pode",
        "mais",
        "isso",
        "como",
        "brasil",
        "pessoas"
      ],
      "metadata": {
        "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira",
        "date": "2017-07-03",
        "tags": "['Carreira']",
        "thumbnail": "101429-freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira/index.md"
      }
    },
    {
      "id": "9a406ea06fcaed7f",
      "url": "https://devpleno.com/navigator-geolocation",
      "title": "Navigator Geolocation API - Sabendo a localização do usuário - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Navigator%20Geolocation%20API%20-%20Sabendo%20a%20localiza%C3%A7%C3%A3o%20do%20usu%C3%A1rio&url=https%3A%2F%2Fdevpleno.com%2Fnavigator-geolocation) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnavigator-geolocation)",
      "description": "Hoje quero dar uma dica para vocês sobre geolocalização no navegador. É uma API que está cada vez mais disponível nos navegadores. O interessante é que con...",
      "keywords": [
        "geolocation",
        "navigator",
        "position",
        "https",
        "function",
        "console",
        "checar",
        "podemos",
        "error",
        "essa"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/navigator-geolocation"
      }
    },
    {
      "id": "9a5182a0558b99e1",
      "url": "https://devpleno.com/blog/promises/index",
      "title": "NodeJS Primeiros Passos - Promises (Part 3)",
      "content": "Então vamos ler o arquivo 1, colocar no conteúdo, ler o arquivo 2 e então dar o console.log no conteúdo, a resposta será o conteúdo dos dois arquivos concatenados. Podemos chamar o arquivo 3 e passar o conteúdo nele.\n\n```jsx\nfunction readArquivo3(conteudo){\n    var deferred = \".defer()\";\n    fs.readFile('arquivo3.txt', conteudo, function(err){\n        deferred.resolve();\n    });\nreturn deferred.promise;\n}\nvar conteudo=\"\";\nreadArquivo1()\n.then(function(arquivo1){\n    conteudo+= arquivo1;\n    return readArquivo2();\n}).then(function(arquivo2){\n    conteudo+= arquivo2;\n    return writeArquivo3(conteudo)\n}).then(function())\nconsole.log('tudo certo');\n});\n```\n\nPerceba que meu código começa a crescer para baixo e, ao executar, será retornado a mensagem e criado o arquivo 3 com o conteúdo dentro. A manutenção desse código fica muito mais simples porque eu consigo ver claramente o que cada função está fazendo e também a sequência de passos. Uma das coisas que dá para ser feito também é a seguinte:\n\n```jsx\nreadArquivo1().then(readArquivo2).then(readArquivo2)\n```\n\nEle vai passar pelo arquivo 1, arquivo 2 e novamente no arquivo 2. Se eu não tiver que passar atributo para frente, posso fazer isso. Caso a gente queira que o arquivo 2 receba um conteúdo que veio arquivo 1, também podemos utilizar assim, mas o problema é que ela fica muito dependente uma função da outra, eu prefiro fazer de uma forma que uma função não dependa muito da outra para que eu consiga modularizar melhor.\n\nConfira todos os detalhes no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ogg4mDfgGHg\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "function",
        "arquivo1",
        "deferred",
        "arquivo2",
        "readfile",
        "para",
        "arquivo",
        "digo",
        "then",
        "conteudo"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos - Promises",
        "date": "2017-06-27",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "Promises.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/promises/index.md"
      }
    },
    {
      "id": "9a7516dc4610a0b1",
      "url": "https://devpleno.com/blog/defina-metas/index",
      "title": "Defina metas",
      "content": "A carreira de um desenvolvedor é bastante agitada, principalmente, por termos que nos manter sempre atualizados e antenados no mercado. Para isso, nada mais interessante que definir metas profissionais e pessoais. Veja neste vídeo mais dicas e sacadas sobre esse assunto.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Pp40lio_98Y\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "youtube",
        "para",
        "mais",
        "classname",
        "iframe",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Defina metas",
        "date": "2016-07-21",
        "tags": "['Carreira']",
        "thumbnail": "Miniatura-vídeo-carreira-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/defina-metas/index.md"
      }
    },
    {
      "id": "9ab6bd14e94b9a56",
      "url": "https://devpleno.com/blog/programacao-assincrona/index",
      "title": "Programação Assíncrona - NodeJS Primeiros Passos (Part 1)",
      "content": "Continuando nossa série sobre NodeJS, falando um pouco sobre como funciona a Programação Assíncrona do JS, vamos fazer alguns testes para você ver a diferença de como o JavaScript (e nesse caso alguns módulos do NodeJS) trabalham esse assincronismo.\n\n**Por que o assíncrono é tão interessante?**\n\nQuando temos uma tarefa ou alguma instrução que vamos fazer e ela pode ser demorada demais, por exemplo, se ela for um pouco diferente de qualquer estrutura de dados que estamos acostumados como IF e por ai vai, ele simplesmente deixa para executar quando os dados dessas operações estiverem disponíveis.\n\nComo exemplo, vamos ler um arquivo texto de modo síncrono e um de modo assíncrono e mostrar as vantagens disso. Em um novo arquivo, vamos criar um arquivo de texto 'dados.txt' e colocar dentro uma frase, \"Conteúdo do arquivo texto.\" Agora criamos um novo arquivoJS, importamos o FS, um módulo padrão no Node para manipulação do file system.\n\n```jsx\nvar fs = require('fs')\nvar contents = fs.readFileSyinc('dados.txt', 'utf8')\nconsole.log(contents)\n```\n\nVamos salvar como Sync.js e mandar rodar usando o comando\n\n```jsx\nnode sync.js\n```\n\nPerceba o seguinte: como a linha **\"var contents = fs.readFileSyinc('dados.txt', 'utf8');\"**é síncrona, enquanto arquivo não for lido por completo ela não passa para a linha seguinte, isso pode ser legal ou não, dependendo do ponto de vista. Em linguagens que não são assíncronas como no JAVA ou PHP abrimos uma tread nova, ou seja uma linha de execução nova para caso chegue uma outra requisição não fique demorando muito para essa resposta demorar para o usuário. Na escala, isso é muito ruim. Imagine que apenas um usuário está usando, teremos pouco de prejuízo, mas se temos um sistema com 10 mil usuários ao mesmo tempo fazendo operações como essa, isso é muito problemático.\n\nVamos fazer um exemplo com Assíncrono para que fique mais claro:",
      "keywords": [
        "para",
        "como",
        "vamos",
        "fazer",
        "dados",
        "opera",
        "ncrono",
        "contents",
        "isso",
        "ncrona"
      ],
      "metadata": {
        "title": "Programação Assíncrona - NodeJS Primeiros Passos",
        "date": "2017-06-16",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "ProgramacaoAssincrona.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/programacao-assincrona/index.md"
      }
    },
    {
      "id": "9b3556043a2e31b1",
      "url": "https://devpleno.com/blog/precificacao-em-software/index",
      "title": "Dica: Precificação em Software",
      "content": "Uma dúvida comum em desenvolvedores é como precificar softwares. Neste vídeo, comento como eu costumo cobrar e dicas de como você pode fazer de maneira justa para você e para seu cliente.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ho55mJ5r8Y8\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "como",
        "para",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Dica: Precificação em Software",
        "date": "2017-04-24",
        "tags": "['Carreira']",
        "thumbnail": "PrecificacaoSoftware.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/precificacao-em-software/index.md"
      }
    },
    {
      "id": "9b55bf8204393dca",
      "url": "https://devpleno.com/async-await",
      "title": "ES6 - Async/Await - DevPleno (Part 1)",
      "content": "Javascript\n\n## ES6 - Async/Await\n\nT\nPor Tulio Faria • 5 de maio de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nOlá!\nNeste post, falo sobre o Async/Await, uma funcionalidade que vem com o ES6 e é possível ser utilizada no Node, permitindo o aumento da qualidade do nosso código.\nObs: A versão do Node que estou rodando é a 7.7.3.\nO Async/Await, assim como um generator, depende de uma promise para funcionar.\n\nconst fs = require('fs')\nconst readFilePromise = (filename) => new Promise((resolve, (reject = {})))\nCom isso, transformamos uma função callBack, que segue a forma do Node tradicional, em uma promise, criando uma Arrow Funciton Filename, que retornará uma new Promise, passando uma nova Arrow Function para ela com resolve e reject.\n\n**Como fazemos isso?**\n\nChamaremos então um readFile comum no Node, passando o nome do arquivo desejado. Em seguida, recebemos o callBack passando uma arrow function e, caso existir um erro e não for vazio, ele irá rejeitar e envia esse erro. Caso tenha dado tudo certo, será enviado o data para o solicitante:\n\nconst fs = require('fs')\nconst readFilePromise = (filename) => new Promise((resolve, reject = {\nfs.readFile(filename, (err, data) => {\nif(err){\nreject(err)\n} else {\nresolve(data)\n}\n}\n}))\nCom o Arrow Function, fica muito mais simples como vocês podem ver. Para verificarmos se esta tudo OK fazemos:\n\nreadFilePromise('arquivo.js').then((data) => console.log(data.toString()))\nDepois de testado, vamos lá. Crie uma function que terá um Async, ele irá ler o conteúdo do arquivo, e este arquivo vai ter um Await que lerá o arquivo.js:\n\nasync function read() {\nconst contents = await readFilePromise('arquivo.js')\nconsole.log(contents.toString())\n}\nQuando o código for executado, ele vai chegar até o await e vai parar até a promise ser resolvida, então vai retornar o que tiver dentro do arquivo para dentro do contents.\n\n**Para que serve?**",
      "description": "Olá! Neste post, falo sobre o Async/Await, uma funcionalidade que vem com o ES6 e é possível ser utilizada no Node, permitindo o aumento da qualidade do no...",
      "keywords": [
        "await",
        "async",
        "para",
        "arquivo",
        "promise",
        "function",
        "digo",
        "const",
        "https",
        "node"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/async-await"
      }
    },
    {
      "id": "9b5adda17e678a28",
      "url": "https://devpleno.com/blog/request-e-response/index",
      "title": "Request e Response (Part 1)",
      "content": "Nos posts anteriores já falamos sobre back-end, front-end, como eles se comunicam através de uma requisição, e agora você verá um exemplo prático de um request e um response.\n\nVamos usar o NodeJS, mas não é obrigatório focar nisso, pois depois vou falar exclusivamente sobre ele. Toda vez que você entra em um site, como o google, está fazendo um GET no [Google](https://www.google.com/).\n\nComo checar se isso está realmente acontecendo?\n\nNo caso do Windows, apertamos F12 usando o Chrome e então irá aparecer esta aba Network:\n\n![Exemplo 1](RequestResponseEx1.png)\n\nPerceba que temos várias abas, isso é uma barra de desenvolvimento. A medida que formos avançando iremos passar por algumas delas. O importante para agora é o Network, aperte o F5 e irá aparecer muitas requisições:\n\n![Exemplo 2](RequestResponseEx2.png)\n\nSe você clicar em alguma delas, é possível ver tudo sobre ela, e uma das coisas é o request method do tipo GET, qual o servidor, etc. Temos também o response reader logo a baixo:\n\n![Exemplo 3](RequestResponseEx3.png)\n\nNo caso do GET, não temos um Request Body, mas temos um Response Body, que fica ao lado de preview. Lá seria a pagina inicial do google já retornada para o usuário. Agora vamos fazer o seguinte: quando vier um GET em '/' irei retornar todos os GET's da requisição e os dados de resposta em uma function req e res, pegamos o requests da requisição e devolvo ao cliente.\n\n```jsx\nvar express = require ('express');\nvar app express();\napp.get('/', function (req, res){\n    //res.send('Esta é uma requisição GET.');\n    //res.send(req.query);\n    res.send(req.headers);\n});\n```\n\nQuando rodarmos o exemplo irá aparecer o seguinte:\n\n![Exemplo 4](RequestResponseEx4.png)\n\nMostrando todos os Headers que eu solicitei.",
      "keywords": [
        "requisi",
        "exemplo",
        "request",
        "temos",
        "para",
        "express",
        "send",
        "post",
        "https",
        "como"
      ],
      "metadata": {
        "title": "Request e Response",
        "date": "2017-05-22",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "RequestResponse.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/request-e-response/index.md"
      }
    },
    {
      "id": "9b60c4368082b585",
      "url": "https://devpleno.com/hr2-aula2",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /hr2-aula2 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "aula2"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hr2-aula2"
      }
    },
    {
      "id": "9b65fc77461ddc2e",
      "url": "https://devpleno.com/blog/teclado-com-webaudioapi/index",
      "title": "Criando um teclado com WebAudioAPI (Part 3)",
      "content": "Dessa maneira fica mais interessante, pois conseguimos recapear caso quisermos. Além disso, posso guardar uma lista de osciladores para dar um stop. Dessa maneira, quando apertarmos a tecla, ele se inicia, e quando eu solto, ele para:\n\n```jsx\nconst mapOsc = {}\nfunction onKeyDown(key) {\n  if (map[key.keyCode] && !mapOsc[key.keyCode]) {\n    const osc = constext.createOscillator()\n    osc.type = 'sine'\n    osc.frequency.value = notes[map[key.keyCode]]\n    osc.connect(contexto.destination)\n    osc.start()\n    mapOsc[key.keyCode] = osc\n  }\n}\nfunction onKeyUp(key) {\n  if (key.keyCode in mapOsc) {\n    const osc = mapOsc[key.keyCode]\n    osc.stop(0)\n    mapOsc[key.keyCode] = undefined\n  }\n}\n```\n\nAssim temos um teclado bem interessante. Além disso, utilizando a tabela de notas, podemos colocar, por exemplo, os sustenidos. Caso você queira treinar, pode transformar isso em forma visual utilizando uma imagem de teclas de piano e quando você clicar em cada uma delas, é gerado os áudios.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/lKuFqfkVZy0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "keycode",
        "para",
        "onkeydown",
        "onkeyup",
        "const",
        "function",
        "window",
        "maposc",
        "html",
        "tecla"
      ],
      "metadata": {
        "title": "Criando um teclado com WebAudioAPI",
        "date": "2017-10-18",
        "tags": "['Javascript']",
        "thumbnail": "TecladoComWebAudi.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/teclado-com-webaudioapi/index.md"
      }
    },
    {
      "id": "9c047ae43c52c30b",
      "url": "https://devpleno.com/hands-on-benchmark",
      "title": "Hands-on: Benchmark - DevPleno",
      "content": "Javascript\n\n## Hands-on: Benchmark\n\nT\nPor Tulio Faria • 3 de março de 2017\n\n[Javascript](/tag/javascript)\n\nNeste vídeo, fazemos o Benchmark entre duas funções em Javascript utilizando o Benchmark.js. A vantagem deste módulo é que ele compara as funções rodando várias vezes e fazendo a média entre as execuções.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Benchmark&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-benchmark) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-benchmark)",
      "description": "Neste vídeo, fazemos o Benchmark entre duas funções em Javascript utilizando o Benchmark.js. A vantagem deste módulo é que ele compara as funções rodando v...",
      "keywords": [
        "https",
        "benchmark",
        "javascript",
        "hands",
        "entre",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno",
        "2fhands"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-benchmark"
      }
    },
    {
      "id": "9c22aecc12ab4b11",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-4/index",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms (Part 5)",
      "content": "```jsx\nsocke.on('supporters', function (supporters) {\n  console.log(supporters)\n  $('.bar-team-a').css('width', supporters.teamA + '%')\n  $('.bar-team-b').css('width', supporters.teamB + '%')\n})\n```\n\nPerceba que as atualizações de jogo 1 não chegam em jogo 2, isso significa que já estamos filtrando o que vai chegar em cada um dos jogos.\n\nAgora precisamos fazer a atualização dos vídeos e do lance a lance.\n\nSe abrir o match, você vai perceber que temos vários formulários, como atualizar placar, embaixo temos um formulário de novo lance e por último o vídeo. Vamos começar pelo vídeo, mas os dois são a mesma coisa, vamos fazer apenas porque o do vídeo é um pouquinho mais curto, afinal só temos um ID do vídeo no YouTube e ele já vai subir automaticamente.\n\nVamos abrir o admin/match.ejs e vamos pegar o botão do vídeo:\n\n```jsx\n<div class='text-block-5'>\n  <h3>Novo Vídeo</h3>\n  <input type='text' id='video-id' placeholder='ID Vídeo' />\n  <a class='watch-game-btn' id='video-new'>\n    Enviar Vídeo\n  </a>\n</div>\n```\n\nPerceba que temos um vide-ID, que é nosso input, e um vídeo-new que é nosso botão, vamos agora para js/admin.js, lá no final vamos fazer o seguinte:\n\n```jsx\n$('#video-new').click(function () {\n  alert(1)\n})\n```\n\nEntão quando clicar em video-new, demos um alert para saber se deu certo. Agora vamos fazer um post nesse vídeo\n\n```jsx\n$('#video-new').click(function () {\n  $.post(\n    '/admin/match/' + MATCH_INDEX + '/videos',\n    { video: $('#video-id').val() },\n    function (data) {}\n  )\n})\n```\n\nLembrando que temos que atualizar o post anterior:\n\n```jsx\n$.post(\"/admin/match/\"+MATCH_INDEX+\"/score\", {\n    scoreA, scoreB, notify\n}, function(data){\n    console.log(data)\n}\n```\n\nVamos voltar em admin/match.ejs e checar, afinal ele não tem definido ainda o MATCH_INDEX:\n\n```jsx\n<script>const MATCH_INDEX = \"<%- id %>;</script>\n```",
      "keywords": [
        "match",
        "para",
        "supporters",
        "vamos",
        "team",
        "function",
        "video",
        "socket",
        "const",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms",
        "date": "2017-07-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 4,
        "totalChunks": 8,
        "sourcePath": "blog/minicurso-socket-io-parte-4/index.md"
      }
    },
    {
      "id": "9c7c28674295444c",
      "url": "https://devpleno.com/blog/hands-on-yarn/index",
      "title": "Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM) (Part 1)",
      "content": "O 'Yarn' é uma maneira que temos de agilizar a instalação de algumas dependências. É uma alternativa ao NPM, um pouco mais rápido. A primeira coisa que temos que fazer é instalar:\n\n```jsx\nnpm install -g yarn\n```\n\nO Yarn usa o mesmo package.json que já temos no projeto em JavaScript e não adiciona nenhuma outra dependência, vai ser usado exatamente o mesmo repositório que o NPM já roda.\n\n**Qual a vantagem do Yarn?** Uma das vantagens do Yarn é ele ser mais rápido, tende a resolver alguns conflitos de versão de módulo, cria um cash local para, por exemplo, caso você já tenha utilizado algum módulo qualquer com Yarn, aquela versão específica do módulo fica salva na sua máquina, caso você precise usar em outro projeto, ele utiliza do cash e não precisa baixar um novo. Além disso, ele resolve algumas coisas interessantes, por exemplo, é muito comum fazermos:\n\n```jsx\nnpm install nome-do-pacote\n```\n\nQuando fazemos isso, não adicionamos o pacote no package.json e isso gera um problema, nós podemos fazer um comid e em seguida um push para o git e quebrar na máquina de um outro desenvolvedor ou servidor porque na sua máquina vai rodar e quando chegar em outro computador, vai dar erro. Uma das coisas que o Yarn resolve é exatamente isso, não temos essa distinção de save ou não, se você adicionou um pacote, ele vai entrar no package.json. Vamos fazer um teste de velocidade. Eu criei um projeto onde só tem o package.json e só adiciona o async, primeiramente vamos fazer o npm:\n\n```jsx\nnpm install\n```\n\nA instalação demorou mais ou menos 6 segundos, não demorou tanto, agora vou deletar o node_modules e instalar via yarn:\n\n```jsx\nyarn\n```\n\nO tempo de instalação foi de 3.39 segundos",
      "keywords": [
        "yarn",
        "isso",
        "fazer",
        "projeto",
        "para",
        "temos",
        "instala",
        "depend",
        "mais",
        "package"
      ],
      "metadata": {
        "title": "Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM)",
        "date": "2017-08-10",
        "tags": "['Javascript']",
        "thumbnail": "Yarn.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-yarn/index.md"
      }
    },
    {
      "id": "9c8eb610a606bc02",
      "url": "https://devpleno.com/blog/hands-on-pkg/index",
      "title": "PKG - Transforme seu aplicativo Node em executável (Part 2)",
      "content": "Com isso, solicitamos o node para empacotar a aplicação utilizando o package.json. Isso é legal porque podemos entregar este aplicativo para o cliente, demo, trial, etc, criando um instalador.\n\nLembrando que nós continuamos tendo acesso total ao código. Usando o express, podemos abrir em outra máquina e ler a faixa de IP que a máquina principal está rodando e na interface mostrar para o cliente \"para acessar este aplicativo use o IP xxx.xxx.xxx.xxx em uma máquina de sua rede.”\n\nAssim, várias pessoas conseguem acessar o mesmo aplicativo. É possível utilizar o Package sem a necessidade do Package.json, por exemplo passando direto o ponto de entrada, mas eu prefiro usar o package.json para ficar documentado, deste modo não precisamos lembrar todos os parâmetros sempre.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/pZNeUcCPwEs\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "description": "Use o PKG para compilar seu app Node.js em executável para Windows, Mac e Linux. Tutorial passo a passo com exemplos.",
      "keywords": [
        "para",
        "express",
        "aplicativo",
        "node",
        "podemos",
        "package",
        "isso",
        "este",
        "embed",
        "nosso"
      ],
      "metadata": {
        "title": "PKG - Transforme seu aplicativo Node em executável",
        "description": "Use o PKG para compilar seu app Node.js em executável para Windows, Mac e Linux. Tutorial passo a passo com exemplos.",
        "date": "2017-05-09",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Pkg.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-pkg/index.md"
      }
    },
    {
      "id": "9c973d42fb6ee35b",
      "url": "https://devpleno.com/blog/mono-ou-multi-thread-poo-para-js/index",
      "title": "Mono ou multi thread - POO para JS (Part 3)",
      "content": "Lembrando que o math.random retorna um número de 0 a 1, em seguida vamos multiplicar pelo valor máximo e arredonda para cima.\n\nCom isso vamos mandar produzir pelo menos um e começar a consumir:\n\n```jsx\nproducer()\nconsumer()\n```\n\nAgora, quando quisermos produzir, vamos colocar no stock:\n\n```jsx\nconst stock = \\[\\]\nfunction producer(){\n    console.log('producer', stock.length)\n    stock.push(Math.random()\\*100)\n    setTimeOut(producer, Math.ceil(Math.random()\\*3000))\n}\n```\n\nAgora eu preciso consumir esse valor:\n\n```jsx\nfunction consumer(){\n    const item =  stock\\[stock.length-1\\]\n    stock.splice(stock.length-1, 1)\n    console.log('consumer', stock.length)\n    setTimeOut(consumer, Math.ceil(Math.random()\\*3000))\n}\n```\n\nSe tentarmos consumir e não tiver no estoque, não vai dar certo, então podemos fazer o seguinte:\n\n```jsx\nfunction consumer(){\n    if(stock.length===0){\n        console.log('não foi possível consumir')\n    } else {\n        const item =  stock\\[stock.length-1\\]\n        stock.splice(stock.length-1, 1)\n        console.log('consumer', stock.length)\n    }\n    setTimeOut(consumer, Math.ceil(Math.random()\\*3000))\n}\n```\n\nCom isso temos uma sensação de que estão trabalhando separadamente, mas na verdade estamos empilhando e depois desempilhando após um tempo aproximado.\n\nPor que é importante saber que isso acontece?\n\nPorque basicamente qualquer operação pesada acontece de forma assíncrona.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/iGV8gjzx3to\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "stock",
        "para",
        "const",
        "consumer",
        "math",
        "isso",
        "console",
        "producer",
        "length",
        "java"
      ],
      "metadata": {
        "title": "Mono ou multi thread - POO para JS",
        "date": "2017-11-06",
        "tags": "['Javascript']",
        "thumbnail": "MonoOuMulti.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/mono-ou-multi-thread-poo-para-js/index.md"
      }
    },
    {
      "id": "9ca78c482ef710fb",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-4/index",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms (Part 8)",
      "content": "Nossa interface já está atualizando em tempo real já segmentado pela sala. [Na próxima aula](https://www.devpleno.com/minicurso-socket-io-parte-5/), vamos ver como colocar esse projeto no ar, assim você pode utilizar esse projeto como portfólio para um potencial cliente, como o projeto com atualização em tempo real vai ficar e também o que fazer a partir daí.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/UFKOeDqbhsc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "match",
        "para",
        "supporters",
        "vamos",
        "team",
        "function",
        "video",
        "socket",
        "const",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms",
        "date": "2017-07-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 7,
        "totalChunks": 8,
        "sourcePath": "blog/minicurso-socket-io-parte-4/index.md"
      }
    },
    {
      "id": "9cb43567e34193f1",
      "url": "https://devpleno.com/hands-on-rimraf",
      "title": "Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Rimraf%20-%20Remova%20diret%C3%B3rios%20inteiros%20mesmo%20que%20eles%20n%C3%A3o%20estejam%20vazios&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-rimraf) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-rimraf)",
      "description": "Durante a semana fizemos diversos procedimentos em lot, e uma das coisas que nós fizemos foi apagar um diretório de maneira recursiva (pegar o diretório co...",
      "keywords": [
        "rimraf",
        "diret",
        "apagar",
        "https",
        "para",
        "yarn",
        "javascript",
        "dentro",
        "isso",
        "devpleno"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-on-rimraf"
      }
    },
    {
      "id": "9cbb9851ffcc1957",
      "url": "https://devpleno.com/split-em-strings",
      "title": "Dicas utilizando o Split em Strings - DevPleno (Part 1)",
      "content": "Javascript\n\n## Dicas utilizando o Split em Strings\n\nT\nPor Tulio Faria • 5 de outubro de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nNa dica de hoje quero mostrar alguns ‘macetes’ que podemos fazer com o Split, uma função de uma String em JavaScript.\n\nPrimeiramente o que é Split? Ele divide uma String em partes, por exemplo:\n\nconst str = 'Tulio Faria'\nconst parts = str.split(' ')\nconsole.log(parts)\nCom isso, criamos um vetor com o nome e o sobrenome. O interessante disso é que podemos combinar ele com algumas coisas, por exemplo, com o join:\n\nconst parts = str.split(' ').join('====')\nAssim o resultado seria Tulio===Faria. Em algumas situações, é possível fazer alguns processamentos mais inteligentes com essa técnica.\n\nAlém disso podemos parar de utilizar expressão regular, afinal aqui usamos somente a string pura. Outra coisa interessante é que podemos utilizar até mesmo arrow functions, vamos supor que eu quisesse, por exemplo, fazer o seguinte:\n\nconst str = 'Tulio 0 Faria'\nconst parts = str.split(' ').filter((p) => p != '0')\nAssim conseguimos remover o zero do meio da String. São algumas combinações bastante legais, principalmente quando começamos a cascatear ou fazer um link de uma para outra.\n\nOutro ‘macete’ interessante é o seguinte: se eu der um Split em espaço, ele divide letra a letra:\n\n.split(' ')\nAssim poderíamos, por exemplo, tirar as vogais:\n\nconst vogais = 'aeiou'\n.plit(' ')\n.split(' ')\n.filter((letra) => vogais.indexOf(letra) &#x3C; 0)\nCom isso retornamos apenas as consoantes do meu nome.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Na dica de hoje quero mostrar alguns ",
      "keywords": [
        "split",
        "const",
        "https",
        "javascript",
        "tulio",
        "faria",
        "podemos",
        "fazer",
        "string",
        "exemplo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/split-em-strings"
      }
    },
    {
      "id": "9cf35feb618f4e3d",
      "url": "https://devpleno.com/blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! (Part 3)",
      "content": "**As equipes ficam mais produtivas (e criativas):** sem os bloqueios causados por excesso de papelada, necessidade de projetar um programa inteiro sozinho ou ferramentas de uso obrigatório, a equipe pode criar e produzir da forma que gosta.\n\n**Melhorias na comunicação:** que tal chamar o cliente para uma conversa? O trabalho dividido em ciclos permite testar e apresentar cada pedaço do projeto, melhorando o entendimento do que o cliente quer e facilitando o trabalho da equipe de TI.\n\n**Melhor definição do objetivo:** com a redução na burocracia, sem linguagem rebuscada e com definição de cada etapa dos trabalhos é muito mais fácil ter um objetivo final definido, e cumprir isso.\n\n**Melhor atendimento ao cliente:** além de um software feito na medida, o cliente também recebe um ótimo tratamento da equipe de TI, que tem um contato próximo durante os trabalhos.\n\n## Quais são as metodologias ágeis que existem?\n\nE, no final das contas, que metodologias ágeis existem?\n\nNa realidade existem centenas de métodos ágeis e cada um deles tem N variações. Isso significa que é quase impossível listar todos em um único texto, ainda mais sem que fique cansativo. Assim, nós separamos aqui os 5 mais utilizados para o desenvolvimento de softwares para você ter exemplos. Dá só uma olhada!\n\n### 1. Feature Driven Development (FDD)\n\nO FDD é uma metodologia focada em funcionalidades. Por considerar o todo maior que a soma das partes, primeiro analisa-se o projeto inteiro, depois divide-se em partes e, então, divide-se as áreas a serem modeladas (funcionalidades).\n\n### 2. eXtreme Programming (XP)\n\nO método XP é orientado por três bases: agilidade, economia e qualidade. Assim, uma equipe que utiliza o XP baseia-se em valores comportamentais que pautam seu trabalho — aqui entram questões como comunicação, simplicidade, feedback etc.\n\n### 3. Microsoft Solutions Framework (MSF)",
      "keywords": [
        "mais",
        "para",
        "geis",
        "metodologia",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "title": "Metodologia ágil: entenda o que é e como se aplica para programadores!",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "Metodologia.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "blog/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores/index.md"
      }
    },
    {
      "id": "9d2f3b7c3ca9fbe3",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-3/index",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol (Part 1)",
      "content": "Nas [aulas anteriores do minicurso de Socket.IO](https://www.devpleno.com/minicurso-socket-io-parte-2/), já preparamos o ambiente, conectamos o websocket do client para o servidor e agora vamos começar a emitir realmente as notificações.\n\nA primeira coisa que vamos fazer é enviar o placar, vamos abrir o template match.ejs dentro de admin. A única coisa que temos de diferente é o time e os gols, nós vamos pegar esses dados e quando o usuário clicar em atualizar placar, iremos enviar isso ao servidor e ele vai disparar via socket.io para todos os clients.\n\nPrimeiramente lá no final, após incluir o footer, vamos adicionar um script:\n\n```jsx\n<script src='/js/admin.js'></script>\n```\n\nEsse script ainda não existe, vamos criar agora no diretório public/js, primeiro temos que descobrir qual o ID do botão do formulário, que é update-score e quando o usuário clicar nesse botão, eu quero dar um alert apenas para saber se está rodando:\n\n```jsx\n$(function)(){\n    $(\"#update-score\").click(function(){\n        alert(1)\n        return false;\n    })\n});\n```\n\nAgora precisamos pegar os dois valores do jogo nos ID's score, e score-b, o notify-score e damos um console.log para saber se está tudo correto:\n\n```jsx\n$(function)(){\n    $(\"#update-score\").click(function(){\n        const scoreA = $(\"#score-a\").val();\n        const scoreB = $(\"#score-b\").val();\n        const notify = $(\"#score-notify\").val();\n        console.log(scoreA, scoreB, notofy)\n        return false;\n    })\n});\n```\n\nPerceba que o notify continuou com o value 1, isso acontece porque não está checando se esta checked ou não, então fazemos isso:\n\n```jsx\nconst notify = $('#score-notify:checked').val()\n```",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "vamos",
        "notify",
        "socket",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol",
        "date": "2017-07-07",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-3/index.md"
      }
    },
    {
      "id": "9deccc34dde32e09",
      "url": "https://devpleno.com/blog/claude-code-describe-session/index",
      "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos (Part 4)",
      "content": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"O describe session funciona entre projetos diferentes?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Sim. Você pode usar o describe session em um projeto e levar a descrição gerada para qualquer outro projeto ou sessão. O contexto é gerado como texto, então é portável.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Preciso usar algum comando específico?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Você pode simplesmente pedir em linguagem natural para o Claude descrever a sessão atual. Use instruções claras sobre para quem é a descrição para obter o melhor resultado.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Funciona com outros modelos além do Claude?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Sim. Como o output é texto estruturado, você pode usar a descrição gerada como prompt para qualquer outro modelo ou ferramenta de IA.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Qual a diferença entre describe session e os arquivos CLAUDE.md?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Os arquivos CLAUDE.md são instruções persistentes que você escreve manualmente para dar contexto ao Claude em todas as sessões de um projeto. O describe session é uma descrição gerada sob demanda do estado atual de uma sessão específica.\"\n      }\n    }\n  ]\n}\n</script>",
      "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
      "keywords": [
        "claude",
        "para",
        "sess",
        "como",
        "session",
        "describe",
        "contexto",
        "projeto",
        "outro",
        "descri"
      ],
      "metadata": {
        "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos",
        "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
        "date": "2026-04-05",
        "tags": "['Ferramentas']",
        "thumbnail": "feature-image.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/claude-code-describe-session/index.md"
      }
    },
    {
      "id": "9ded888f6a9b4b0e",
      "url": "https://devpleno.com/blog/hands-on-node-js-request/index",
      "title": "Hands-on: Node JS - Request",
      "content": "Nesta nova série, experimento módulos, pacotes ou ferramentas. O pacote demonstrado neste vídeo é o request, que nos permite fazer requisições HTTP de maneira simples.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/elOGmIL7qws\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "nesta",
        "nova"
      ],
      "metadata": {
        "title": "Hands-on: Node JS - Request",
        "date": "2017-02-24",
        "tags": "['Javascript']",
        "thumbnail": "NODEJSRequest.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-node-js-request/index.md"
      }
    },
    {
      "id": "9e0147546a64c8d4",
      "url": "https://devpleno.com/blog/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web/index",
      "title": "Servidores Web -  Um pouco mais do back-end de uma Aplicação Web (Part 2)",
      "content": "Sempre que for utilizar PHP ou ASP precisa utilizar servidores web, mas em alguns casos, que chamamos servidor de aplicação, ainda existem umas coisas a mais, muito comum no mundo JAVA, mas isso fica para uma próxima vez.\n\nDeixe suas dúvidas e sugestões nos comentários.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "servidor",
        "apache",
        "mais",
        "sabe",
        "como",
        "front",
        "site",
        "exemplo",
        "quando"
      ],
      "metadata": {
        "title": "Servidores Web -  Um pouco mais do back-end de uma Aplicação Web",
        "date": "2017-05-23",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ServidorWeb.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web/index.md"
      }
    },
    {
      "id": "9e553118222a4010",
      "url": "https://devpleno.com/blog/algoritmos-permmissingelement/index",
      "title": "Algoritmos: PermMissingElement",
      "content": "Continuando nossa série sobre algoritmos que caem em entrevistas de emprego e competições de programação, neste vídeo, explico sobre o Algoritmo PermMissingElement.\n\n## Confira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/fslpyQRYLOA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "https",
        "youtube",
        "sobre",
        "responsive",
        "iframe",
        "devpleno",
        "facebook",
        "continuando",
        "nossa"
      ],
      "metadata": {
        "title": "Algoritmos: PermMissingElement",
        "date": "2017-03-15",
        "tags": "['Algoritmos']",
        "thumbnail": "ALG.-Ponteiros-PermMissingElement-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/algoritmos-permmissingelement/index.md"
      }
    },
    {
      "id": "9eb33754606c7b10",
      "url": "https://devpleno.com/blog/reconhecimento-facial-com-js/index",
      "title": "Reconhecimento facial com JS (Part 2)",
      "content": "```jsx\n<body>\n  <video\n    id='video'\n    width='320'\n    height='240'\n    preload\n    autoplay\n    loop\n    muted\n  ></video>\n  <canvas id='canvas' width='320' height='240'></canvas>\n  <script rsc='tracking-min.js'></script>\n  <script rsc='data/face-min.js'></script>\n</body>\n```\n\nAgora vamos começar realmente a fazer esse tracking do rosto. Quando carregarmos a página, vamos chamar a função init que vai ter nosso vídeo, canvas um contexto para o canvas e um tracker, que é nosso rastreador em específico:\n\n```jsx\n<script>\n    function init(){\n        const video = document.getElementById('video')\n        const canvas = document.getElementById('canvas')\n        const context = canvas.getContext('2d')\n        const tracker = new traking.ObjectTracker('face')\n    }\n    window.onload = init()\n</script>\n```\n\nAgora podemos mandar rastrear a tag vídeo utilizando a câmera. Fazendo isso, eu consigo enviar um event:\n\n```jsx\ntracking.track('#video', tracker, { camera: true })\ntracker.on('track', (event) => {\n  console.log(event)\n})\n```\n\nAo dar F5 no browser e acessar o F12, percebam que ele muda à medida que o rosto se mexe dentro do limite que escolhemos, com isso vamos desenhar em cima do canvas:\n\n```jsx\n<script>\n    function init(){\n        const video = document.getElementById('video')\n        const canvas = document.getElementById('canvas')\n        const context = canvas.getContext('2d')\n        const tracker = new traking.ObjectTracker('face')\n        tracking.track('#video', tracker, {camera: true})\n        tracker.on('track', event => {\n            console.log(event)\n            context.clearRect(0,0,canvas.width, canvas.height )\n            event.data.foEach( rect => {\n                console.log(rect)\n            })\n        })\n    }\n    window.onload = init()\n</script>\n```\n\nO retângulo já está lá reconhecendo a cabeça ao se mexer, porém ainda não conseguimos visualizar ele.\n\nEntão, para cada retângulo reconhecido, vamos desenhar ele na tela:",
      "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
      "keywords": [
        "rect",
        "canvas",
        "vamos",
        "para",
        "script",
        "context",
        "video",
        "width",
        "const",
        "event"
      ],
      "metadata": {
        "title": "Reconhecimento facial com JS",
        "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
        "date": "2017-11-24",
        "tags": "['Javascript']",
        "thumbnail": "ReconhecimentoFacial.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/reconhecimento-facial-com-js/index.md"
      }
    },
    {
      "id": "9ebcba977baba60c",
      "url": "https://devpleno.com/blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index",
      "title": "Por que fazer um curso de programação voltado para a prática? (Part 1)",
      "content": "A área de tecnologia da informação oferece muitas oportunidades e, para aproveitá-las, o profissional deve se preparar continuamente. Para tanto, o desenvolvedor pode encontrar na web uma grande diversidade de vídeos e tutoriais a respeito de diversas tecnologias, principalmente em blogs, redes sociais, fóruns, youtube e nos [cursos gratuitos](https://www.devpleno.com/ensino-formal-ou-cursos-livres?utm_source=blog&utm_campaign=rc_blogpost) em plataformas de ensino.\n\nPorém, uma capacitação mais sólida, encontrada em um bom curso de programação deve ser considerada para quem quer se destacar, especialmente em um momento tão favorável para o desenvolvedor profissional.\n\nO uso de smartphones e plataformas de serviços aumenta diariamente. Já dentro das empresas, sistemas mais complexos são usados para o controle de produção e analise de dados para melhoria da performance nos negócios.\n\nPara se ter uma ideia, mesmo com a crise no Brasil, os gastos com tecnologia, pessoais e corporativos só crescem. [Segundo a Fundação Getúlio Vargas](https://link.estadao.com.br/noticias/gadget,ate-o-fim-de-2017-brasil-tera-um-smartphone-por-habitante-diz-pesquisa-da-fgv,70001744407?utm_source=blog&utm_campaign=rc_blogpost), o Brasil terá um smartphone por habitante até o final de 2017.\n\nOuto [estudo](https://www.valor.com.br/empresas/4943024/crise-nao-afeta-investimento-das-empresas-em-tecnologia-diz-fgv?utm_source=blog&utm_campaign=rc_blogpost) feito pela mesma instituição mostra que a TI foi uma das áreas que mantiveram níveis de investimentos estáveis pelas empresas em 2016, com uma taxa média de 7,6% da receita aplicado em novas tecnologias.",
      "keywords": [
        "para",
        "como",
        "https",
        "projeto",
        "mais",
        "desenvolvimento",
        "devpleno",
        "source",
        "blog",
        "campaign"
      ],
      "metadata": {
        "title": "Por que fazer um curso de programação voltado para a prática?",
        "date": "2017-07-31",
        "tags": "['Carreira']",
        "thumbnail": "CursoProgramacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index.md"
      }
    },
    {
      "id": "9ec1cb3b2fd0f210",
      "url": "https://devpleno.com/stateless-functional-component",
      "title": "Criando componente mais simples e eficaz em React - DevPleno (Part 1)",
      "content": "Javascript\n\n## Criando componente mais simples e eficaz em React\n\nT\nPor Tulio Faria • 18 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nVamos começar esse hands-on Stateless Functional Component com um projeto do zero criado com Create-react-app. Primeiro vamos criar um arquivo novo chamado home.js (iremos importar o React, pois ainda vamos usar JSX).*\n\nUm Stateless Functional Component, na verdade, é apenas uma arrow function, então iremos fazê-lo desta forma:\n\nimport React from 'react'\nconst Home = () => &#x3C;p>Olá&#x3C;/p>\nexport default home\nEste const home = () =>\n\nOlá\n\njá é o nosso Stateless Functional Component. Ele é uma função, mas perceba que não tem classe, o que o deixa muito mais simples. Essa é a primeira vantagem se comparado com a outra forma de criar componente, afinal é muito simples para saber o que há dentro dele. Outra coisa bacana é que ele é mais rápido, já que não tem todo aquele overload de classe.\n\n**Por que ele é Stateless Functional?**\n\nEle é uma função pura, ou seja, é mais fácil de ser testado e a qualidade do código é maior. Outro ponto interessante é que não usamos o this, pois se temos uma função pura, não temos um estado interno. Ela também só depende das entradas, que são os props.\n\n**Quando usamos esse component?**\n\nQuando temos um componente de apresentação, como por exemplo um componente que só é responsável por renderizar algo na tela. Isso faz com que ele não tenha um comportamento muito complexo. Podemos passar Props para ele também:\n\nimport React from 'react'\nconst Home = ({ name }) => &#x3C;p>Olá {name}&#x3C;/p>\nexport default home\nE no nosso arquivo App.js, faremos o seguinte:\n\nimport React,{ Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\nimport Home from './Home'",
      "description": "Vamos começar esse handson Stateless Functional Component com um projeto do zero criado com Createreactapp. Primeiro vamos criar um arquivo novo chamado ho...",
      "keywords": [
        "react",
        "component",
        "home",
        "mais",
        "functional",
        "import",
        "https",
        "componente",
        "stateless",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/stateless-functional-component"
      }
    },
    {
      "id": "9f799f3d951472ab",
      "url": "https://devpleno.com/10-dicas-de-produtividade-para-programadores",
      "title": "10 dicas de produtividade para programadores - DevPleno (Part 3)",
      "content": "A qualidade do código está diretamente relacionada à produtividade do desenvolvedor. Com o [SonarQube](https://www.sonarqube.org?utm_source=blog&#x26;utm_campaign=rc_blogpost), por exemplo, é possível analisar a qualidade do código em mais de 40 [linguagens](https://www.devpleno.com/quantas-linguagens-programar?utm_source=blog&#x26;utm_campaign=rc_blogpost), como PHP, Java, Javascript, Python, C#, C/C++, entre outros. Outra possibilidade é utilizar algum módulo, como o [StandardJS](https://www.devpleno.com/standard-parte-1?utm_source=blog&#x26;utm_campaign=rc_blogpost).\n\n## 2. Aposte nos atalhos e *snippets*\n\nAtalhos, *snippets* e templates (partes de código já prontas e com lacunas a serem preenchidas) ajudam o desenvolvedor que precisa lidar com instruções, trechos, blocos e partes de código-fonte. É interessante, ainda, personalizar atalhos complexos — que vão além daqueles disponíveis no sistema operacional.\n\n## 3. Hardware\n\nAlgumas soluções de *hardware* podem melhorar a produtividade. É o caso dos múltiplos monitores e dos mouses com botões programáveis, que podem reduzir o tempo necessário para a execução das tarefas. Além disso, existem aplicações que modificam o *desktop* para torná-lo mais eficiente.\n\n## 4. Conforto para o cérebro\n\nOutra dica importante para aumentar a sua [produtividade](https://www.youtube.com/watch?v=6Dx0abJtNvY&#x26;utm_source=blog&#x26;utm_campaign=rc_blogpost) tem a ver com o bem-estar mental. O desenvolvimento de *software *é uma atividade que demanda bastante do cérebro do programador, pois envolve raciocínio lógico e concentração.\n\nAlém disso, a preocupação com os prazos e a necessidade de estar sempre atento às novidades do mercado acabam causando estresse. Por isso, é muito importante procurar manter o seu cérebro confortável e motivado. Ações simples podem ajudar:\n\n### Plantas",
      "description": "Ser um profissional produtivo é uma exigência do mercado de trabalho no cenário altamente competitivo em que vivemos. Os resultados são requisitados cada v...",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "produtividade",
        "para",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/10-dicas-de-produtividade-para-programadores"
      }
    },
    {
      "id": "9f7b02c42d76d697",
      "url": "https://devpleno.com/split-em-strings",
      "title": "Dicas utilizando o Split em Strings - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Dicas%20utilizando%20o%20Split%20em%20Strings&url=https%3A%2F%2Fdevpleno.com%2Fsplit-em-strings) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsplit-em-strings)",
      "description": "Na dica de hoje quero mostrar alguns ",
      "keywords": [
        "split",
        "const",
        "https",
        "javascript",
        "tulio",
        "faria",
        "podemos",
        "fazer",
        "string",
        "exemplo"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/split-em-strings"
      }
    },
    {
      "id": "9fa726859f16f698",
      "url": "https://devpleno.com/blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index",
      "title": "Por que fazer um curso de programação voltado para a prática? (Part 3)",
      "content": "Já para o desenvolvimento de aplicativos móveis, são usados Java para Android, Swift para iPhone ou Cordova. Esse último é um framework que possibilita a utilização de linguagens de WEB para desenvolvimento de aplicações mobile híbridas, que rodam em praticamente todas as plataformas móveis. Além disso podemos também utilizar o próprio ReactJS (react-native) para criar aplicações móveis nativas.\n\nRealmente são muitas as opções, não é? Então, ai entra a importância do know-how do instrutor do curso. Quem tem experiência de mercado poderá direcionar o aluno para que saiba quais [ferramentas deve aprender para cada tipo de projeto](https://www.devpleno.com/ensino-formal-ou-cursos-livres?utm_source=blog&utm_campaign=rc_blogpost). Também mostrará como integrar as tenologias utilizadas, como veremos a seguir.\n\n## Para ter um visão de projeto\n\nO desenvolvedor profissional precisa lidar com problemas complexos e integrar diversas tecnologias. Para que sejam usadas, normalmente existem macetes que agilizam sua instalação e atualização como o uso de Webpack, Bower, Npm, composer. Também entram o uso de IDEs para gerenciamento de código.\n\nCabe ressaltar que, em projetos profissionais, dezenas ou centenas de milhares de linhas de código são geradas ou incorporadas de bibliotecas prontas criadas por terceiros. Assim é fundamental contar com esses sistemas para que se possa fazer um gerenciamento adequado do que está sendo produzido.\n\nEstá aí mais uma vantagem de se aprender na prática, ou seja, com quem entende. O instrutor pode dar dicas valiosas de ferramentas de desenvolvimento e bibliotecas já prontas para agilizar a criação de artefatos mais comuns, porém com relativa complexidade. Muitas encontram-se disponíveis no GitHub.\n\nTambém há a necessidade de manutenção do projeto e compartilhamento com outros programadores. Atualmente, o GitHub vem sendo a plataforma mais usada para armazenar projetos que podem pertencer a uma empresa ou que são públicos.",
      "keywords": [
        "para",
        "como",
        "https",
        "projeto",
        "mais",
        "desenvolvimento",
        "devpleno",
        "source",
        "blog",
        "campaign"
      ],
      "metadata": {
        "title": "Por que fazer um curso de programação voltado para a prática?",
        "date": "2017-07-31",
        "tags": "['Carreira']",
        "thumbnail": "CursoProgramacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index.md"
      }
    },
    {
      "id": "9fbcb82c854ee2a6",
      "url": "https://devpleno.com/float-e-precisao",
      "title": "Float e precisão - DevPleno (Part 1)",
      "content": "Javascript\n\n## Float e precisão\n\nT\nPor Tulio Faria • 28 de julho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje quero dar uma dica e também mostrar um problema que acontece em várias linguagens que é quanto à precisão de número ‘quebrados’ ou Float. Esse problema em específico já caiu em uma entrevista de emprego que eu fiz.\n\nMe passaram um caso de teste e infelizmente eu não lembro exatamente como foi, mas eu vou mostrar como podemos resolver isso de uma forma interessante.\n\nPrimeiramente vou mostrar qual o problema que nós temos com precisão de números float, tanto em Node quanto em outras linguagens. Vamos supor que temos a seguinte situação:\n\nconst num1 = 0.1\n\nconst num2 = 0.2\n\nconst num3 = num1 + num2\nAo darmos o console.log no num3 reparem o número que nós temos: Essa sujeira atrapalha tudo que vamos fazer. Lembrando que essa sujeira vem da conversão para binário e esses números acabam se atrapalhando.\n\nQual a solução para isso? Quando temos números monetários, como preço ou algo nesse sentido, nós tentamos tratar esses números como inteiro, por exemplo, no caso de um banco que fizemos o sistema, eles precisavam de cinco casas decimais de precisão, então nós multiplicávamos isso por 100000 e em seguida dividíamos\n\nconst precisao = 100\n\nconst num1 = parseInt(0.1 * precisao)\n\nconst num2 = parseInt(0.2 * precisao)\nA regra é multiplicar pelo número de casas decimais que queremos e converter em seguida para inteiro, depois fazemos a conta com inteiros, já que ele não tem esse problema. Depois disso, quando formos retornar o valor, nós dividimos pela precisão:\n\nconst num3 = ((num1 + num2) / precisao).toFixed(2)\nObviamente, depois precisamos fazer mais um tratamento porque ele volta a ficar sujo, então precisamos fixar, por exemplo, com 2 zeros depois da vírgula.",
      "description": "Hoje quero dar uma dica e também mostrar um problema que acontece em várias linguagens que é quanto à precisão de número ",
      "keywords": [
        "const",
        "precis",
        "problema",
        "para",
        "precisao",
        "https",
        "como",
        "temos",
        "float",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/float-e-precisao"
      }
    },
    {
      "id": "9fe9408c994c67ee",
      "url": "https://devpleno.com/debug-no-navegador",
      "title": "Debug de código JavaScript no Navegador - DevPleno (Part 1)",
      "content": "Javascript\n\n## Debug de código JavaScript no Navegador\n\nT\nPor Tulio Faria • 22 de junho de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vou dar uma dica rápida de como podemos fazer o debug de código JavaScript no navegador. É bastante simples, se você já trabalha com Java ou alguma ID, já deve ter uma ideia de como fazer isso na ID.\n\nPodemos fazer isso também no front-end com JavaScript. Para ilustrar, vamos usar o seguinte código, que apenas inclui o jQuery e fiz um scripts.js:\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;button id='btn'>Test&#x3C;/button>\n&#x3C;script src='jquery-3.1.0.js'>&#x3C;/script>\n&#x3C;script src='scripts.js'>&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nO script em si tem um contador e duas funções assíncronas:\n\nvar counter = 0;\n\ncounter = counter+1;\n\n$(function)(){\n$(\"btn\").click(function(){\ncounter+=1;\n\nconsole.log(counter);\n});\n});\nProvavelmente quando você executar esse código no browser ele não vai fazer nada, pois estamos passando um console.log O que fazer?\n\nNo Windows, aperte F12 para abrir o developer toolbar:\n\nUma dica interessante: podemos dar CTRL + e CTRL – dentro da toolbar, com isso ele aumenta e diminui o zoom.\n\nHá vários painéis e no sourse vemos todos nossos arquivos fontes. Nele você escolhe, na barra lateral, qual o arquivo quer visualizar e ele mostrará o código. Também é possível saber o que está acontecendo no script, por exemplo, clicar no número 2 da linha 2, voltar no script e dar F5. Ele pausou para podermos debugar o código.\n\nSe passar o mouse em cima da variável, ele mostra que ela não foi definida ainda, se clicar em step over\n\nele executa a instrução e passa para a próxima linha. Ao passar o mouse em counter, ele recebeu 0 porque agora foi atribuído o valor a ele.",
      "description": "Hoje vou dar uma dica rápida de como podemos fazer o debug de código JavaScript no navegador. É bastante simples, se você já trabalha com Java ou alguma ID...",
      "keywords": [
        "para",
        "digo",
        "fazer",
        "script",
        "counter",
        "javascript",
        "https",
        "isso",
        "debug",
        "navegador"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/debug-no-navegador"
      }
    },
    {
      "id": "a019368ac4bab2ec",
      "url": "https://devpleno.com/blog/9",
      "title": "Blog - Página 9 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 9 de ago. de 2017 Você é passageiro ou motorista da sua vida?](/seja-o-motorista-da-sua-vida)\n\n[Carreira 8 de ago. de 2017 Decisão técnica não precisa ser eterna](/decisao-tecnica)\n\n[Carreira 8 de ago. de 2017 Tomar decisões](/tomar-decisoes)\n\n[Javascript 7 de ago. de 2017 Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS](/falsy-e-truthy-values)\n\n[Javascript 7 de ago. de 2017 Short-circuit e valores padrão](/short-circuit-e-valores-padrao)\n\n[Javascript 6 de ago. de 2017 ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux](/shelljs)\n\n[Algoritmos 4 de ago. de 2017 Algoritmos: XOR Swap](/algoritmos-xoe-swap)\n\n[Javascript 4 de ago. de 2017 Fake API - Como testar seus projetos front-end](/fake-api)\n\n[Carreira 3 de ago. de 2017 DevPleno Entrevista - Carlos Drury e Thiago Coelho](/entrevista-carlos-drury-e-thiago-coelho)\n\n[Carreira 3 de ago. de 2017 DevPleno Entrevista - Edy Segura](/entrevista-com-edy-segura)\n\n[Fundamentos 2 de ago. de 2017 Arrow Functions - Construindo funções anônimas de forma mais simplificada](/arrow-functions)\n\n[Javascript 2 de ago. de 2017 High-order Function Filter](/filter)\n\n[Anterior](/blog/8)9 / 26[Próxima](/blog/10)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "carreira",
        "javascript",
        "algoritmos",
        "entrevista",
        "blog",
        "ferramentas",
        "fundamentos",
        "valores",
        "todos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/9"
      }
    },
    {
      "id": "a05e00244b634d30",
      "url": "https://devpleno.com/blog/como-cobrar-por-software/index",
      "title": "Como cobrar por Software (Part 1)",
      "content": "Para precificar software, alguns fatores devem ser levados em consideração e você deve responder algumas perguntas a si mesmo. Confira:\n\n**O que você está vendendo?**\n\nA primeira coisa que deve pensar é chegar em no valor/hora, afinal vai ter que gastar horas e mais horas neste software, logo estará vendendo seu tempo para o cliente.\n\n**O que avaliar nesse valor/hora?**\n\nQuando pensar no valor, deve pensar no nível de experiência que essa hora demanda. (Por exemplo, para um site em HTML simples, o quanto da sua especialidade este conteúdo vai utilizar?) Por isso a hora de um analista de dados atualmente é tão alta, afinal não tem no mercado e isso exige muito conteúdo, como mineração de dados, matemática, etc. Já para o HTML, por exemplo, não precisa de muita habilidade para ser feito, logo é uma hora mais barata.\n\nTambém precisa em sua disponibilidade. Hoje você tem tempo disponível para executar o projeto? Por exemplo, se você trabalha com HTML e todas suas horas estão ocupadas, isso significa que você é bom nesta especialidade (oferta e demanda), logo esta sua hora é um pouco mais cara, pois ao invés de jogar videogame em suas poucas horas disponíveis, você vai estar programando. Porém é preciso tomar cuidado com o viés da sobrevivência, às vezes sua disponibilidade está alta, mas não porque você é ruim, mas sim porque você está entre um projeto e outro.\nQual o valor agregado desta sua hora?\nQuanto sua hora rende? Às vezes você é muito bom e cobra, por exemplo. R$100,00 e um profissional mediano que não renderia tanto cobra R$150,00, neste caso sua hora está desvalorizada, pois sua ela rende mais que a dele. Se você tem experiência e consegue resolver mais rápido e com mais eficiência, então o valor agregado à sua hora é maior. Ao final qual o resultado dessa sua hora aplicada? Vai fazer uma diferença muito grande no projeto? Se sim, sua hora também vai ser mais cara.\n\n**Isso é tudo?**",
      "keywords": [
        "hora",
        "para",
        "valor",
        "mais",
        "horas",
        "muito",
        "projeto",
        "ncia",
        "exemplo",
        "deve"
      ],
      "metadata": {
        "title": "Como cobrar por Software",
        "date": "2017-05-15",
        "tags": "['Carreira']",
        "thumbnail": "PRECIFICAÇÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/como-cobrar-por-software/index.md"
      }
    },
    {
      "id": "a06bd4b392b7bed4",
      "url": "https://devpleno.com/contato",
      "title": "Devpleno - Como entrar em Contato? - DevPleno",
      "content": "Blog\n\n## Devpleno - Como entrar em Contato?\n\nT\nPor Tulio Faria • 14 de março de 2017\n\nSurgiu alguma dúvida durante as aulas? Gostaria de conversar sobre algum assunto específico?\nEntre em contato conosco através do email [contato@devpleno.com](mailto:contato@devpleno.com) ou enviando uma mensagem em nosso Whatsapp: (35) 999 090 011\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Devpleno%20-%20Como%20entrar%20em%20Contato%3F&url=https%3A%2F%2Fdevpleno.com%2Fcontato) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcontato)",
      "description": "Surgiu alguma dúvida durante as aulas? Gostaria de conversar sobre algum assunto específico? Entre em contato conosco através do email contato@devpleno.com...",
      "keywords": [
        "devpleno",
        "contato",
        "https",
        "2fdevpleno",
        "2fcontato",
        "2017",
        "blog",
        "como",
        "entrar",
        "tulio"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/contato"
      }
    },
    {
      "id": "a087be1d6fb008cd",
      "url": "https://devpleno.com/blog/hands-on-socket-io-parte-3/index",
      "title": "Hands-on - Socket.io Parte 3 (Part 2)",
      "content": "```jsx\nlet.counter = 0\nsetInterval(() => io.to('contador'))\n    io.to('contador').emit('msg', counter++)\n}, 1000 )\n```\n\nEssa é uma das formas que temos de criar aplicações sem criar uma instância do socket.io para cada sala, o que seria muito trabalhoso. Além disso, ainda temos outro problema: existem situações em que temos que enviar a mensagem para todos, como no caso anterior, onde enviamos um broadcast para todos os usuários, mas também existem situações onde precisamos enviar para apenas um grupo de pessoas, então com isso podemos saber como vamos mediar, ou seja qual o alcance a mensagem terá.\n\nExistem outras técnicas possíveis de aplicar no socket.io para ficar ainda mais rápido, como distribuir em mais máquinas por exemplo, mas isso já é um assunto avançado que vamos deixar para uma outra ocasião.\n\nConfira o hands-on desta terceira parte também em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/dn2FujGp_xw\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "socket",
        "para",
        "vamos",
        "sala",
        "mensagem",
        "console",
        "contador",
        "como",
        "rios",
        "http"
      ],
      "metadata": {
        "title": "Hands-on - Socket.io Parte 3",
        "date": "2017-05-15",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "HandsOnScocketIo3.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-socket-io-parte-3/index.md"
      }
    },
    {
      "id": "a1adb15681f0d022",
      "url": "https://devpleno.com/request",
      "title": "Request - Requisições HTTP de forma rápida e simples - DevPleno (Part 2)",
      "content": "Um caso de uso que eu já fiz com esse pacote foi a seguinte: eu tinha um serviço em que agregava os logs entre as minhas aplicações, então ela estava distribuída em servidores distintos e esse serviço que utilizava o request para baixar os arquivos de log e depois de baixado ele fazia o processamento das informações. Isso era bastante útil para poder importar os dados, mas lembrando que podemos usá-lo para muitas outras coisas além disso.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Request%20-%20Requisi%C3%A7%C3%B5es%20HTTP%20de%20forma%20r%C3%A1pida%20e%20simples&url=https%3A%2F%2Fdevpleno.com%2Frequest) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frequest)",
      "description": "O Request é um pacote que permite que façamos requisições HTTP. Uma coisa interessante sobre ele é que é uma ferramenta muito simples, conseguimos fazer re...",
      "keywords": [
        "request",
        "https",
        "para",
        "http",
        "require",
        "site",
        "javascript",
        "requisi",
        "vamos",
        "const"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/request"
      }
    },
    {
      "id": "a1c0b43672b6bce7",
      "url": "https://devpleno.com/blog/beatbox-com-javascript/index",
      "title": "Como construir um beatbox com JavaScript (Part 1)",
      "content": "Continuando nossos experimentos utilizando áudio no HTML (você deve ter percebido que me empolguei com este assunto), vamos mudar o exemplo do metrônomo para construir uma 'bateria' e poder criar uma música somente dando 'plays' de forma ordenada em alguns trechos. Então vamos lá!\n\nVamos ter um botão que será um play/stop. Ao dar o play, será tocado uma sequência de áudios para simular uma bateria em loop. Para que isso ocorra, temos que ter alguns áudios e também tratar isso em javaScript.\n\n```jsx\n<html>\n  <head>\n    <tittle>beat-box</tittle>\n  </head>\n\n  <body>\n    <button id=\"play\">Play</button>\n    <audio src=\"prato.wav\" id=\"prato\"></audio>\n    <audio src=\"prato-fechado.wav\" id=\"prato-fechado\"></audio>\n    <audio src=\"bumbo.wav\" id=\"bumbo\"></audio>\n    <audio src=\"boca.wav\" id=\"boca\"></audio>\n    <audio src=\"caixa.wav\" id=\"caixa\"></audio>\n\n    <script></script>\n  </body>\n<html>\n```\n\nDentro do Script, vamos tratar como fizemos no exemplo do metrônomo, então vamos criar o mesmo timer, criar uma função tick, porém fazer ela rodar a 90bpm (60\\*1000/90), isso dá a distância entre uma batida e outra.\n\nA ideia é que a cada interação do tick, toque um áudio. Exemplo: Supondo que nossa música seja prato, bumbo, boca e caixa, o tick vai tocar essas 4 coisas para cada repetição que fizer. Para isso vamos pegar o music na posição currentAudio++.\n\n```jsx\n<script>\n  const  play = constGetElementById('play')\n\n  let timer = null\n\n  let currentAudio = 0\n\n  const bpm = 90\n\n  const music = ['prato', 'bumbo', 'boca', 'caixa']\n\n  function tick(){\n    console.log(music[(currentAudio++)%music.length])\n  }\n\n  play.addEventListener('click', function(){\n    timer = setInterval(tick, (60 *1000 / bpm)\n  })\n</script>\n```\n\nAcabamos de criar uma técnica para fazer os áudios circularem. A cada interação vamos incrementar o currentAudio e quando esse currentAudio chegar em 4, ele voltará para o 0. Com isso já é possível fazer uma bateria apenas mudando o console.log por:",
      "keywords": [
        "play",
        "const",
        "audio",
        "music",
        "para",
        "prato",
        "bumbo",
        "tick",
        "currentaudio",
        "vamos"
      ],
      "metadata": {
        "title": "Como construir um beatbox com JavaScript",
        "date": "2017-05-29",
        "tags": "['Javascript']",
        "thumbnail": "BEATBOX-MANIPULÁVEL-COM-JS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/beatbox-com-javascript/index.md"
      }
    },
    {
      "id": "a1e1ab2b38669fe6",
      "url": "https://devpleno.com/once-n-vezes",
      "title": "Once N vezes - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Once N vezes\n\nT\nPor Tulio Faria • 22 de maio de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nEssa dica é sobre uma técnica em JavaScript de uma função utilitária que permite que uma outra função só seja executada uma única vez (Once).\n\n**Para que fazer isso?**\n\nVamos supor que você carregou uma página ou algo via AJAX e deve fazer alguma operação,mas essa operação só pode acontecer uma única vez (e você pode ter mais de uma operação) então se colocar no final de cada uma, a que acontecer primeiro não deixa as posteriores acontecerem. isso evita algum tipo de concorrência.\n\nVamos criar uma função func1. Ela só vai poder ser chamada uma vez, mesmo sendo chamada duas vezes. Para isso, vou criar uma função once, essa vai ser a função que permitirá que uma outra função qualquer (que no caso vai ser a fn) seja executada somente uma vez. Para isso, precisamos de uma variável resultado e uma return function.\n\nfunction once(fn, context){\nlet result\nreturn function(){\n}\n}\nconst func1 = once(function){\nconsole.log('opah')\n})\nfunc1()\nfunc1()\nQuando chamamos o once e passamos a function\n\n'console.log('opah')'\nestamos passando ele para dentro de fn, então ela vai retornar uma outra função. O detalhe é que essa função que estamos retornando volta e fica dentro de func1, porém o contexto **let result** fica travado, então é possível saber quantas vezes essa função foi chamada.\n\nfunction once(fn, context) {\nlet result\nlet contador = 0\nreturn function () {\ncontador++\nconsole.log(contador)\n}\n}\nChamando o arquivo.js será mostrado o número de vezes que foi chamada a função (no caso, 2 vezes).\n\nAgora vamos fazer com que ele bloqueie as próximas chamadas usando um if. Se o contador for igual a 0, chamamos a função. Caso já tenha sido executada uma vez, ela vai parar.\n\nPara isso, chamaremos a função fn, o contexto – caso não venha contexto nenhum, ele mandará o da própria função – guardamos isso dentro de result e por fim incrementamos o contador e damos o retorno do result.",
      "description": "Essa dica é sobre uma técnica em JavaScript de uma função utilitária que permite que uma outra função só seja executada uma única vez (Once). Para que faze...",
      "keywords": [
        "contador",
        "function",
        "once",
        "result",
        "vezes",
        "para",
        "isso",
        "return",
        "essa",
        "func1"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/once-n-vezes"
      }
    },
    {
      "id": "a1e943c12b679bfd",
      "url": "https://devpleno.com/sobre-o-devpleno",
      "title": "Sobre o DevPleno - DevPleno (Part 1)",
      "content": "Carreira\n\n## Sobre o DevPleno\n\nT\nPor Tulio Faria • 15 de março de 2017\n\n[Carreira](/tag/carreira)\n\nOlá, tudo bem? Meu nome é Tulio Faria e sou o criador do DevPleno, e com certeza você já se perguntou:\n\n- Como posso ser um desenvolvedor melhor?\n\n- Como aprender as tecnologias que fazem a diferença para sua carreira?\n\n- Como posso cada vez ser mais valorizado em minha profissão?\n\n- Como viver de desenvolvimento de software mesmo morando no interior?\n\n- Como entregar resultados através de meus projetos?\n\nSe você já se fez pelo menos uma destas perguntas, você está no lugar certo!\n\n## Agora, leia a seguir como o DevPleno irá lhe ajudar a melhorar sua vida e sua carreira\n\nComo você bem sabe, uma das carreiras mais cobiçadas atualmente envolvem trabalhar com tecnologia. Toda empresa já é dependente de software em algum ponto de suas atividades. Tornando o desenvolvedor uma peça chave em todo modelo de negócios.\n\n### Mas sabe o que eu vejo como o mais problemático para a profissão?\n\nO ensino convencional ainda não consegue preparar um desenvolvedor 100% para o mercado de trabalho. Seja para trabalhar em outras empresas, seja para abrir o seu próprio negócio. Ainda falta alguns pontos muito importantes para a formação ser plena:\n\n- Conhecimento e prática em tecnologias de mercado\n\n- Uso de processos que ajudam a entregar mais qualidade e resultados\n\n- Conhecimento de mercado para alavancar a carreira e projetos\n\n- E essa lista só está começando, vou aprofundar mais a respeito durante o restante do texto.\n\nAnalisando este cenário, vi que precisava fazer algo. Afinal, eu mesmo já aprendi muito na prática. Já é mais de uma década sofrendo e aprendendo com meus próprios erros e eu seria muito egoísta se guardasse isso apenas para mim. Foi aí que reacendeu um vontade muito forte e que acabou virando meu propósito de vida: Preciso ajudar as pessoas a passarem mais facilmente por tudo que já passei! E serem felizes como hoje me considero ser",
      "description": "Olá, tudo bem? Meu nome é Tulio Faria e sou o criador do DevPleno, e com certeza você já se perguntou:  Como posso ser um desenvolvedor melhor?  Como apren...",
      "keywords": [
        "para",
        "como",
        "mais",
        "devpleno",
        "minha",
        "muito",
        "isso",
        "cada",
        "carreira",
        "meus"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/sobre-o-devpleno"
      }
    },
    {
      "id": "a20487332ed46779",
      "url": "https://devpleno.com/lista-encadeada-remover-um-no",
      "title": "Lista encadeada - Como remover um nó - DevPleno (Part 2)",
      "content": "let currentNode = head\nwhile (currentNode.next &#x26;&#x26; currentNode.next != node) {\ncurrentNode = currentNode.next\n}\ncurrentNode.next = node.next\nFizemos o currentNode ser igual ao head, logo ele será o nosso nó 1, em seguida fiz uma condição: se eu tenho um próximo para andar e esse próximo não é o node, vou fazer o currentNode igual a currentNode.next, com isso vou caminhar para frente. Porém, na primeira vez que roda, ele já descobre que o Nó 1 já é o next, então precisamos fazer mais um caso de teste. Vamos adicionar uma posição 4 e em seguida remover a posição 3:\n\nlist.add2(4)\nlet node = list.getByValue(3)\nconsole.log(node)\nlist.remove(node)\nlist.print()\nLembrando que eu estou mostrando o que eu geralmente faço de testes, afinal o teste seria bastante viciado caso eu testasse apenas com o nó 1. Então conseguimos fazer ele caminhar nos nós e só depois então caminhar nele de verdade.\n\nA complexidade desse código é O(n), não tem como ser diferente, pois temos que passar em todos os nós, basicamente é quase o mesmo cenário de adicionar com O(n).\n\nAssista ao vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Lista%20encadeada%20-%20Como%20remover%20um%20n%C3%B3&url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-remover-um-no) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-remover-um-no)",
      "description": "Nós já falamos sobre alguns métodos, adicionamos itens na lista, criamos nó com complexidade O(n) e O(1) e agora vamos remover um nó desse nosso algoritmo....",
      "keywords": [
        "node",
        "currentnode",
        "next",
        "lista",
        "remove",
        "https",
        "head",
        "remover",
        "agora",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/lista-encadeada-remover-um-no"
      }
    },
    {
      "id": "a23bf28c7daddba9",
      "url": "https://devpleno.com/blog/modulos/index",
      "title": "NodeJS Primeiros Passos: Módulo em NodeJS (Part 2)",
      "content": "Vamos criar um novo arquivo modulo02 e um app02, no módulo 2 terá um exemplo um pouco diferente, ao invés de deixar ele criar o escopo como quiser, eu vou criar o modulo02 dentro de uma variável e criar minha própria function, ou seja, vou criar um escopo só para esse módulo:\n\n```jsx\nvar modulo02 = function (initialValue) {\n  var contador = initialValue\n  return {\n    contar: function () {\n      contador++\n    },\n    escrever: function () {\n      console.log(contador)\n    }\n  }\n}\nmodule.exports = modulo02\n```\n\nEssa variável contador é semelhante a um atributo da classe de forma privada, ou seja, não está disponível de forma global, com isso podemos 'explicitar' uma interface que queremos que todos os outros enxerguem, retornando um objeto com duas funções.\n\nA primeira vai só incrementar, a segunda function só escreve e finalmente vamos expor o nosso módulo todo para o 'mundo'.\n\nAgora, indo para o app02.js, faremos o seguinte:\n\n```jsx\nvar m1 = require('./modulo02')\n```\n\nSe fizermos apenas isso, perceba que a function será retornada mas não vai executar a função, então temos que passar o valor inicial que eu quero:\n\n```jsx\nvar m1 = require('./modulo02')(1)\nvar m2 = require('./modulo02')(2)\nm1.contar()\nm2.escrever()\n```\n\nFazendo isso, isolamos os 2 módulos através de uma closer, que é muito semelhante a uma classe.\n\nTeríamos atributos, métodos públicos e métodos privados, pois como eu não exponho ele, então seria visível em um mesmo escopo.\n\n```jsx\nvar modulo02 = function (initialValue) {\n  //atributos\n  var contador = initialValue\n  //metodo privado\n  var ooo = function () {}\n  //metodos publicos\n  return {\n    contar: function () {\n      contador++\n    },\n    escrever: function () {\n      console.log(contador)\n    }\n  }\n}\n```\n\nIsso seria um constructor porque ele consegue definir os valores iniciais e seria executado quando instanciamos o módulo.\n\nEssa é uma das maneiras que temos de organizar módulos, vamos falar mais sobre isso posteriormente.",
      "keywords": [
        "function",
        "require",
        "dulo",
        "contar",
        "contador",
        "para",
        "modulo02",
        "modulo01",
        "isso",
        "vamos"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Módulo em NodeJS",
        "date": "2017-05-30",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Modulos.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/modulos/index.md"
      }
    },
    {
      "id": "a23ed5e56771b528",
      "url": "https://devpleno.com/dom",
      "title": "Você precisar ter DOM para ser um bom profissional? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Você precisar ter DOM para ser um bom profissional?\n\nT\nPor Tulio Faria • 6 de julho de 2017\n\n[Carreira](/tag/carreira)\n\n**Já te contaram a mentira do Dom?**\n\nVou te explicar melhor. Uma coisa que eu sempre vejo as pessoas falando é “ah, Tulio, você tem o dom para aprender tecnologias”. As pessoas se escondem atrás desse “dom”, mas o que é o dom?\n\nNa verdade, eu considero isso uma grande mentira que as pessoas geralmente te contam quando você é novo e isso vem se arrastando com o tempo e pode demorar muito para aprendermos que isso não é uma verdade. A minha sorte é que meus pais não acreditam nesse tipo de coisa, então tudo que eu queria fazer eles deixavam, por exemplo, eu quero desenhar? Tudo bem, vamos desenhar e apoiavam aquilo. Eles me deixavam errar muito, afinal não é um dom que vai definir se você é bom ou não em uma coisa.\n\nO que pode acontecer é que, dependendo da sua criação ou da sua afinidade com certas coisas, tem mais facilidade de aprender sobre elas. Como nunca fui barrado em aprender nada, isso me deixou mais maleável a testar, errar, testar e dar certo e isso me deixou com uma facilidade um pouco maior em aprender por não ter medo de errar.\n\nEu espero que você também não acredite em dom, que se alguém chegar e te perguntar, por exemplo, “você tem dom para música?” você responda “eu não tenho dom para música, mas tenho força de vontade aprender.”\n\nProgramação e tecnologia é a mesma coisa, temos que repetir exaustivamente para fazer algo bem feito com maestria. Então coloque na cabeça que não existe DOM! Obviamente existem pessoas brilhantes, mas a genética delas favoreceu, mas o dom sempre vem com a dedicação. A prática leva a perfeição.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Já te contaram a mentira do Dom? Vou te explicar melhor. Uma coisa que eu sempre vejo as pessoas falando é “ah, Tulio, você tem o dom para aprender tecnolo...",
      "keywords": [
        "para",
        "https",
        "aprender",
        "isso",
        "coisa",
        "pessoas",
        "carreira",
        "errar",
        "tulio",
        "mentira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/dom"
      }
    },
    {
      "id": "a26a3f2d4ca2fdaf",
      "url": "https://devpleno.com/blog/morro-de-vontade/index",
      "title": "Morro de vontade...",
      "content": "Você sempre morre de vontade de aprender alguma tecnologia ou algo novo? Saiba que isso na área de tecnologia da informação não é muito desculpa....\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-r_AKkjd1_c\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "tecnologia",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "sempre"
      ],
      "metadata": {
        "title": "Morro de vontade...",
        "date": "2016-08-01",
        "tags": "['Carreira']",
        "thumbnail": "MorroDeVontade.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/morro-de-vontade/index.md"
      }
    },
    {
      "id": "a2c499a2c0181202",
      "url": "https://devpleno.com/blog/gerenciador-de-series-p1/index",
      "title": "Construindo um App gerenciador de séries com ReactJS (Part 3)",
      "content": "![Trecho de código no vscode](90fb8664-2799-4a91-92fe-eb0229df3ce5.png)\n\nEsse HTML, na verdade, não é HTML, é o que chamamos de JSX.\n\n**O que é o JSX?**\n\nÉ uma forma que o React achou para representar elementos ou hierarquia de elementos em JavaScript de uma maneira que pareça HTML. Com isso, ao invés de criarmos uma árvore de elementos em JavaScript, que seria algo muito complexo, eles criaram uma anotação que com algo semelhante a HTML e transforma isso depois em código quando precisa ser renderizado na tela. Quando ele percebe que tem um div, o react-dom ele transforma em HTML, mas o className continua, pois é uma palavra reservada do JavaScript.\n\nVoltando ao App, temos algumas regrinhas: a primeira delas é que o render, que é o método responsável pelo que vai ser renderizado na tela, sempre retorna um elemento, por isso temos uma div que começa e é fechado mais abaixo. A segunda coisa importante é que quando o elemento começa com letra minúscula, ele já sabe que esse elemento é uma Tag do HTML, como por exemplo o div e o img, já se usarmos letra maiúscula ele sabe que é um componente. Outro item importante, perceba que importamos o React e o Componente, mas não os utilizamos explicitamente, eles vão ser utilizados na hora que tivermos escrevendo JSX.\n\nVamos criar um componente agora para você ter essa ideia de como é criado, por exemplo Ola.js.\n\nA primeira coisa é importar o React e o componente, depois vamos criar a classe estendendo o componente, lembrando que todo componente deve ter um render, que deve retornar algo:\n\n```jsx\nimport React, { Component } from 'react'\n\nclass Ola extends Component {\n  render() {\n    return <span>Olá DevPleno!</span>\n  }\n}\n\nexport default Ola\n```\n\nEsse componente está preso ali, temos que avisar o 'mundo externo' que esse componente existe para podemos utilizá-lo, por isso utilizamos o export. Agora dentro de app.js, por exemplo, podemos fazer o seguinte:\n\n```jsx\nimport Ola from './Ola'\n```\n\nPodemos depois colocar no final:",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "title": "Construindo um App gerenciador de séries com ReactJS",
        "date": "2017-07-19",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "ReactJS-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/gerenciador-de-series-p1/index.md"
      }
    },
    {
      "id": "a2e710e482bddb9b",
      "url": "https://devpleno.com/networking-da-maneira-certa-carreira",
      "title": "Networking da maneira certa - DevPleno",
      "content": "Carreira\n\n## Networking da maneira certa\n\nT\nPor Tulio Faria • 23 de julho de 2016\n\n[Carreira](/tag/carreira)\n\nÉ muito comum e difundido que temos que fazer networking custe o que custar. Mas veja como fazer isso da maneira que te dê mais resultados e a forma que venho fazendo em minha vida.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Networking%20da%20maneira%20certa&url=https%3A%2F%2Fdevpleno.com%2Fnetworking-da-maneira-certa-carreira) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnetworking-da-maneira-certa-carreira)",
      "description": "É muito comum e difundido que temos que fazer networking custe o que custar. Mas veja como fazer isso da maneira que te dê mais resultados e a forma que ve...",
      "keywords": [
        "https",
        "carreira",
        "maneira",
        "networking",
        "certa",
        "fazer",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fnetworking"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/networking-da-maneira-certa-carreira"
      }
    },
    {
      "id": "a32f3d9b2e017fd8",
      "url": "https://devpleno.com/tag/reactjs",
      "title": "ReactJS - DevPleno",
      "content": "ReactJS\n\n## Arquivo de Insights\n\n13 posts encontrados com a tag ReactJS\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 6 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)\n\n[Javascript 2 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)\n\n[Javascript 1 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)\n\n[Javascript 19 de jul. de 2017 Construindo um App gerenciador de séries com ReactJS](/gerenciador-de-series-p1)\n\n[Javascript 28 de jun. de 2017 ReactJS Recursivo?](/renderizar-estruturas-em-formato-de-arvore)\n\n[Javascript 18 de mai. de 2017 Criando componente mais simples e eficaz em React](/stateless-functional-component)\n\n[Javascript 17 de mai. de 2017 React-router-dom: como injetar props em rotas em ReactJS](/router-props-2)\n\n[Javascript 24 de abr. de 2017 Dica: Router Props](/router-props)\n\n[Javascript 4 de abr. de 2017 Dica: Injeção de Dependência no ReactJS](/dica-injecao-de-dependencia-no-reactjs)\n\n[Javascript 9 de mar. de 2017 Hands-on: Creat-React-App](/hands-creat-react-app)\n\n[Javascript 25 de jan. de 2017 Render condicional em ReactJS](/render-condicional-em-reactjs)\n\n[Javascript 27 de dez. de 2016 Loops/Repetições/Iterações no JSX do React](/loopsrepeticoesiteracoes-no-jsx-do-react)\n\nAnterior\n1 / 2[Próxima](/tag/reactjs/2)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "reactjs",
        "javascript",
        "2017",
        "react",
        "router",
        "props",
        "como",
        "dica",
        "algoritmos",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/reactjs"
      }
    },
    {
      "id": "a3839863f2073864",
      "url": "https://devpleno.com/blog/carreira-preciso-de-investimento-para-minha-ideia/index",
      "title": "Carreira: Preciso de investimento para minha ideia?",
      "content": "Na hora de planejar suas ideias, a maioria das pessoas logo pensa em um investidor. Mas será que ele realmente é preciso para executar sua ideia? Neste vídeo, dou dicas sobre esse assunto baseado em experiências próprias. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações.\n\n## Confira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/7fk_Zm8d0W0\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "embed",
        "para",
        "https",
        "responsive",
        "suas",
        "devpleno",
        "facebook",
        "youtube",
        "classname",
        "iframe"
      ],
      "metadata": {
        "title": "Carreira: Preciso de investimento para minha ideia?",
        "date": "2017-03-22",
        "tags": "['Carreira']",
        "thumbnail": "Miniatura-vídeo-carreira-INVESTIMENTO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/carreira-preciso-de-investimento-para-minha-ideia/index.md"
      }
    },
    {
      "id": "a39b158ef59391f1",
      "url": "https://devpleno.com/blog/entenda-a-importancia-de-cursos-para-desenvolvedores/index",
      "title": "Entenda a importância de cursos para desenvolvedores (Part 1)",
      "content": "Você está pronto para atuar em uma grande empresa? O mercado de tecnologia está crescendo cada vez mais, e para conseguir se destacar no cenário atual, é preciso desenvolver habilidades essenciais à profissão. A melhor maneira é se capacitando por meio de cursos para desenvolvedores.\n\nDescubra as principais vantagens de investir em sua capacitação nesta área!\n\n## Empregabilidade\n\nEmpregabilidade é o conjunto de técnicas e habilidades que um profissional precisa ter para ser desejado pelas empresas. Ao estudar e aprender novas técnicas ou aprimorar as já existentes, você começa a ser disputado pelas empresas e pode até mesmo ser chamado para colaborar naquela desenvolvedora dos seus [sonhos](https://www.devpleno.com/metas-na-carreira-de-desenvolvedor?utm_source=blog&utm_campaign=rc_blogpost).\n\nJá pensou poder contribuir com o próximo UBER, Airbnb, Netflix ou Angry Birds?\n\n## Oportunidades\n\nEssa é uma vantagem que anda de mãos dadas com a empregabilidade. Quanto maior a sua empregabilidade, mais portas se abrirão. Capacitação significa oportunidades melhores e salários maiores. A qualidade das oportunidades é proporcional à qualidade dos profissionais.\n\n## Crescimento\n\nVocê é “o cara” da programação e ama a empresa em que trabalha? Neste caso é ainda mais importante fazer um curso. Apenas desenvolvendo novas habilidades é que você poderá crescer dentro da empresa e ser promovido.\n\n## Networking\n\nÉ possível crescer profissionalmente sem contar com o apoio de ninguém? Sim. Porém, este é o caminho mais difícil. Com uma boa rede de networking os resultados aparecem mais rapidamente e de maneira mais fácil.\n\nAo se capacitar você faz contato com pessoas que estão na mesma área. Essa interação – que pode ser tanto presencial quanto online (em fóruns e grupos) – ampliará sua visão da profissão.",
      "keywords": [
        "para",
        "mais",
        "cursos",
        "pode",
        "empresa",
        "habilidades",
        "poss",
        "desenvolvimento",
        "isso",
        "reactjs"
      ],
      "metadata": {
        "title": "Entenda a importância de cursos para desenvolvedores",
        "date": "2017-07-07",
        "tags": "['Carreira']",
        "thumbnail": "102980-entenda-a-importancia-de-cursos-para-desenvolvedores-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/entenda-a-importancia-de-cursos-para-desenvolvedores/index.md"
      }
    },
    {
      "id": "a3b0384d784c69f8",
      "url": "https://devpleno.com/sobre-o-devpleno",
      "title": "Sobre o DevPleno - DevPleno (Part 3)",
      "content": "Meu pai aposentou-se e com o dinheiro que recebeu, nos presenteou com um computador (na época era muito caro!) E isso mudou tudo! Descobri que amava computadores e que essa era a área que gostaria de seguir. Ao mesmo tempo, comecei a ter aulas de programação na escola e brincava de criar meus próprios jogos com um vizinho e amigo meu. Meu ensino médio foi junto com o curso técnico em processamento de dados. Quando me formei aos 18 anos, tive uma ideia e fiz de tudo para desenvolvê-la. Abri realmente uma empresa (com CNPJ) e fui a briga. Consegui apresentar para grandes empresas, mas logo percebi que eu não entendi tanto da área que eu queria entrar.\n\nDepois deste projeto, tive várias outras ideias e projetos. Executando cada um destes projetos e analisando seus resultados obtidos (aprendendo a cada acerto e a cada erro). Ao mesmo tempo desenvolvi aplicações de todos os portes, dentro e fora do Brasil. Terminei minha graduação em Sistemas de Informação, e cada vez me envolvia em projetos maiores e mais desafiadores (aliás, isso me dá uma energia fora do sério).\n\nApós alguns anos de graduado, já tinha 3 empresas em meu nome, com projetos acontecendo em todas elas. É bastante intenso Durante pouco mais de 2 anos, desacelerei um pouco os negócios e fiz mestrado na USP, também em Sistemas de Informação. E neste período, ficou evidente para mim que eu precisava fazer algo a relacionado a educação tecnológica e que pudesse fomentar termos cada vez desenvolvedores mais bem preparados tecnicamente e com uma bagagem estratégica diferenciado-os dos demais. Foi então que superei minha zona de conforto, e resolvi criar o DevPleno. Aliás, foi aí que percebi o quanto compartilhar o que sei me faz tão bem. Não lembrava que já fiz isso por anos e isso me incendiava\n\nVocê pode conhecer um pouco mais sobre o motivo pelo qual lancei este projeto neste vídeo:\n\n## O DevPleno é diferente",
      "description": "Olá, tudo bem? Meu nome é Tulio Faria e sou o criador do DevPleno, e com certeza você já se perguntou:  Como posso ser um desenvolvedor melhor?  Como apren...",
      "keywords": [
        "para",
        "como",
        "mais",
        "devpleno",
        "minha",
        "muito",
        "isso",
        "cada",
        "carreira",
        "meus"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/sobre-o-devpleno"
      }
    },
    {
      "id": "a3df46e4362df265",
      "url": "https://devpleno.com/blog/mundo-de-abundancia/index",
      "title": "Sobreviver em um mundo de abundância (Part 1)",
      "content": "Hoje eu gostaria de compartilhar uma lição que a minha mãe sempre falava pra mim quando estava em um momento de decidir algo em minha carreira.\n\nEla sempre falava de uma maneira bastante simples que as coisas podem ser melhores no futuro. Toda vez que eu vejo uma oportunidade, lembro disso. Vou contar uma história para vocês entenderem melhor.\n\nEu estava para decidir se eu iria trabalhar em uma empresa ou não, meu cenário na época era fazer faculdade de manhã e dar aula a noite, então eu tinha a tarde livre. Então eu recebi uma oferta de trabalho para ganhar mais ou menos 3 ou 4 vezes mais, porém trabalhando de manhã e à tarde, tendo que mudar meu horário da faculdade para noite. Estava nesse dilema e resolvi perguntar para minha mãe, ela disse o seguinte:\n\n“Você já está no terceiro ano de faculdade e já está aparecendo oportunidades como essa, se você continuar como está, vai poder se dedicar mais à faculdade para que, no futuro, quando você se formar, oportunidades ainda melhores apareçam.”\n\nIsso é uma visão que hoje eu vejo como uma visão de abundância. Se encararmos que a oportunidade que temos é única, não vamos evoluir nunca. Ela pode ser uma boa oportunidade, mas eu posso ter outras. Vivemos em um mundo de abundância de conhecimento e existe fartura.\n\nDepois que eu fiz isso, fiquei muito apertado financeiramente e você comecei a pensar na decisão que fiz de não aceitar a oportunidade, então minha mãe também me disse para não olhar mais para trás. Ela estava certa mais uma vez. Quando se toma uma decisão, é importante que não ficar se questionando sobre como poderia ter sido caso tivesse feito uma escolha diferente. Pense nisso.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/e-7FXzaYPt8\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "para",
        "mais",
        "minha",
        "estava",
        "oportunidade",
        "faculdade",
        "como",
        "embed",
        "quando",
        "responsive"
      ],
      "metadata": {
        "title": "Sobreviver em um mundo de abundância",
        "date": "2017-11-07",
        "tags": "['Carreira']",
        "thumbnail": "MundoAbundancia.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/mundo-de-abundancia/index.md"
      }
    },
    {
      "id": "a3f1dde74033edf0",
      "url": "https://devpleno.com/blog/generators-o-que-ha-por-baixo-dos-panos/index",
      "title": "Generators: O que há \"por baixo dos panos\" (Part 1)",
      "content": "Neste post, continuo falando sobre Generatiors em javaScript e como funciona 'por baixo dos panos'.\n\n**O que é um Generator?**\n\nÉ uma função que podemos pausar (ou iteravel). A primeira coisa que temos que saber é que a sintaxe do generator é criada com um function e um asterisco, com isso é possível pausar esta função. Se for utilizado com CO, por exemplo, é possível transforma-la em uma função mais linear.\n\nPrimeiro vamos criar uma function generator e em seguida criar uma variavel denominada gen e chamar um generator.\n\n```jsx\nfunction* generator() {\n  console.log('entrou  no generator')\n}\nconst gen = generator()\n```\n\nPercebam que nada aconteceu, por isso eu gosto de dizer que ela é iteravel, pois precisamos iterar sobre ele para que a gente consiga ter um valor e comece a executar.\n\n**Como fazemos isso?**\n\nPrecisamos criar um const = iteration no código.\n\nLembrando que o next é bastante comum em outras linguagens como java que existe algumas estruturas que são iteraveis (no Java, Iterator). Enquanto você conseguir ter um .next significa que você ainda tem dados para iterar.\n\n```jsx\nfunction* generator() {\n  console.log('entrou  no generator')\n  console.log('segundo passo')\n  console.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\n```\n\nCom isso é possível entrar no Generator. Perceba que ele executou tudo de uma vez. Agora vamos fazer da seguinte forma:\n\n```jsx\nfunction* generator() {\n  console.log('entrou  no generator')\n  console.log('segundo passo')\n  yield 'outro valor'\n  console.log('penultimo')\n  console.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\n```\n\nAo testar o código, note que ele parou em 'segundo passo'. Se dermos um console.log(iteration) ele irá retornar um value: 'outro valor' e um done: false, ou seja, é uma função que além de iteravel conseguimos ter vários retornos de valor.\n\n**Se eu quiser continuar executando o que eu preciso fazer?**\n\nChamaremos novamente gen.next()",
      "keywords": [
        "generator",
        "console",
        "const",
        "function",
        "next",
        "iteration",
        "valor",
        "isso",
        "entrou",
        "segundo"
      ],
      "metadata": {
        "title": "Generators: O que há \"por baixo dos panos\"",
        "date": "2017-05-08",
        "tags": "['Javascript']",
        "thumbnail": "GENERATORS-FUNCTIONS-790x400 (1).png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/generators-o-que-ha-por-baixo-dos-panos/index.md"
      }
    },
    {
      "id": "a41891ba8f1cfeec",
      "url": "https://devpleno.com/renderizar-estruturas-em-formato-de-arvore",
      "title": "ReactJS Recursivo? - DevPleno (Part 1)",
      "content": "Javascript\n\n## ReactJS Recursivo?\n\nT\nPor Tulio Faria • 28 de junho de 2017\n\n*\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nHoje vamos fazer algo que é bastante convencional em sistemas: renderizar estruturas de dados em formato de árvore. No exemplo, será uma árvore binária, mas como poderíamos renderizar no ReactJS.\n\nEm que isso é útil?\n\nVamos supor que você tenha uma interface com um menu lateral e esse menu tem formato de uma pasta dentro da outra, seria muito útil, pois você poderia fazer um item dentro do outro sendo renderizado de forma ‘infinita’. Recursividade é algo muito importante para qualquer sistema, e podemos fazer isso dentro do React utilizando alguns conceitos de recursividade.\n\nEu já tenho um projeto criado, apenas com create React App, nada além disso. Primeiro vamos criar uma estrutura chamada nodes que vai ser nossa árvore em si. Teremos o lado direito, esquerdo e o valor que será uma multiplicação. Do lado esquerdo, vamos ter um valor 1, do lado direito, um outro valor 2 e o ‘v’ dele vai ser uma divisão.\n\nclass App extends Component {\nrender(){\nconst nodes = {\nl:{ l:{ v: 1 }, r:{v: 2},\nv: '/'},\n\nr:{v: 10}\nv:'*'\n}\nreturn(\n&#x3C;div>\n&#x3C;h1> welcome to React&#x3C;/h1>\n&#x3C;/div>\n)\n}\n}\nPerceba que do lado direito temos somente um valor 10. Vamos colocar como se fosse um parênteses do lado esquerdo e depois colocar multiplicado por 10 do lado direito, temos que renderizar os itens do lado esquerdo e depois do lado direito de forma recursiva, então não preciso fazer nenhum for*.\n\nComo fazemos isso de forma recursiva?\n\nA primeira coisa que vamos fazer é criar um outro arquivo chamado node.js, importar o react para usarmos o JSX e, para ficar simples, vamos fazer com functional stateless component:\n\nimport React from 'react'\n\nconst Node = (props) => {\nreturn &#x3C;p> Node &#x3C;/p>\n}\nexport default Node\nVoltando ao App.js vamos importar o node e ao invés de colocarmos o H2 vamos colocar o nó dentro dele:",
      "description": "Hoje vamos fazer algo que é bastante convencional em sistemas: renderizar estruturas de dados em formato de árvore. No exemplo, será uma árvore binária, ma...",
      "keywords": [
        "node",
        "props",
        "span",
        "lado",
        "vamos",
        "para",
        "renderizar",
        "fazer",
        "isso",
        "react"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/renderizar-estruturas-em-formato-de-arvore"
      }
    },
    {
      "id": "a437d1ad743a2641",
      "url": "https://devpleno.com/fullstackmaster",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackmaster to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstackmaster"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstackmaster"
      }
    },
    {
      "id": "a4852c31d606f0b4",
      "url": "https://devpleno.com/minicurso-socket-io-parte-2",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO - DevPleno (Part 5)",
      "content": "router.get('/, function(req, res, next){\nconst matches = db.get('matches').value()\nres.render('admin/index, { matches});\n});\n\nrouter.get('/match', function(req, res, next){\nconst matches = db.get('matches').value()\nconst match = db.get('matches['+req.params.id+']').value()\nres.render('admin/match', { matches, match, id: req.param.id });\n});\nFazemos isso para ele saber que o view não vai ser um view comum, ele vai ser do admin. As únicas diferenças que temos no",
      "description": "Na primeira aula do minicurso de Sockt.IO, fizemos a listagem dos jogos puxando do banco de dados baseado em json e quando clicamos conseguimos visualizar ...",
      "keywords": [
        "vamos",
        "socket",
        "admin",
        "index",
        "para",
        "const",
        "dentro",
        "temos",
        "criar",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-2"
      }
    },
    {
      "id": "a4875ebe6f3f0e36",
      "url": "https://devpleno.com/lista-definitiva-de-sites-para-progradores-remotos",
      "title": "Lista de sites para trabalhar remotamente como programador em 2022 - DevPleno (Part 3)",
      "content": "Se você já trabalha para o exterior e precisa de ajuda para nacionalizar o dinheiro de forma correta, além de decidir se é melhor como pessoa física ou jurídica, entre em contato conosco pelo e-mail [contato@devpleno.com](mailto:contato@devpleno.com) que te ajudaremos.\n\n.\n\nConheça o [Fullstack Master](https://go.devpleno.com/fsm?sck=blog-como-gerar-um-array-populado-em-javascript)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Lista%20de%20sites%20para%20trabalhar%20remotamente%20como%20programador%20em%202022&url=https%3A%2F%2Fdevpleno.com%2Flista-definitiva-de-sites-para-progradores-remotos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-definitiva-de-sites-para-progradores-remotos)",
      "description": "Se tem uma profissão que já se beneficiava dos benefícios de trabalhar remotamente bem antes de virar moda é a de programador. Eu mesmo atuo neste modelo a...",
      "keywords": [
        "para",
        "https",
        "toptal",
        "bastante",
        "trabalhar",
        "como",
        "vagas",
        "linkedin",
        "crossover",
        "jobs"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/lista-definitiva-de-sites-para-progradores-remotos"
      }
    },
    {
      "id": "a4926c6b4a680a6c",
      "url": "https://devpleno.com/blog/dom/index",
      "title": "Você precisar ter DOM para ser um bom profissional?",
      "content": "**Já te contaram a mentira do Dom?**\n\nVou te explicar melhor. Uma coisa que eu sempre vejo as pessoas falando é “ah, Tulio, você tem o dom para aprender tecnologias”. As pessoas se escondem atrás desse “dom”, mas o que é o dom?\n\nNa verdade, eu considero isso uma grande mentira que as pessoas geralmente te contam quando você é novo e isso vem se arrastando com o tempo e pode demorar muito para aprendermos que isso não é uma verdade. A minha sorte é que meus pais não acreditam nesse tipo de coisa, então tudo que eu queria fazer eles deixavam, por exemplo, eu quero desenhar? Tudo bem, vamos desenhar e apoiavam aquilo. Eles me deixavam errar muito, afinal não é um dom que vai definir se você é bom ou não em uma coisa.\n\nO que pode acontecer é que, dependendo da sua criação ou da sua afinidade com certas coisas, tem mais facilidade de aprender sobre elas. Como nunca fui barrado em aprender nada, isso me deixou mais maleável a testar, errar, testar e dar certo e isso me deixou com uma facilidade um pouco maior em aprender por não ter medo de errar.\n\nEu espero que você também não acredite em dom, que se alguém chegar e te perguntar, por exemplo, “você tem dom para música?” você responda “eu não tenho dom para música, mas tenho força de vontade aprender.”\n\nProgramação e tecnologia é a mesma coisa, temos que repetir exaustivamente para fazer algo bem feito com maestria. Então coloque na cabeça que não existe DOM! Obviamente existem pessoas brilhantes, mas a genética delas favoreceu, mas o dom sempre vem com a dedicação. A prática leva a perfeição.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/KwdUislTWbA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "aprender",
        "isso",
        "coisa",
        "pessoas",
        "embed",
        "errar",
        "responsive",
        "https",
        "mentira"
      ],
      "metadata": {
        "title": "Você precisar ter DOM para ser um bom profissional?",
        "date": "2017-07-06",
        "tags": "['Carreira']",
        "thumbnail": "DOM-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dom/index.md"
      }
    },
    {
      "id": "a4dc63bf4d53f1e7",
      "url": "https://devpleno.com/blog/socket-io-parte2/index",
      "title": "Hands-on - Socket.io Parte 2 (Part 2)",
      "content": "```jsx\n<script>\n    const socket = io()\n    socket.on('connect', function(){\n        $(\"msgs\").append('connected with id: '+socket.id+'<br>'\n        socket.emit('msg', 'I am connected '+socket.id);\n    )}\n    socket.on('msg', function(msg){\n        $(\"#msgs\")append(msg+' <br>')\n    }\n</script>\n```\n\nE do lado servidor adicionando um gerenciador de evento para que, quando ele receber uma mensagem,possa só escrever por enquanto (apenas modificamos esta linha de código).\n\n```jsx\nio.on('connection', (socket)=>{\n    console.log('New connection', socket.id)\n}\nsocket.on('msg', (msg)=>{\n    console.log(msg)\n    socket.broadcast.emit('msg', socket.id+' connected');\n})\n```\n\nSe reiniciarmos o servidor e gerarmos uma nova conexão do lado cliente, irá aparecer a mensagem de \"I am connected + ID\" do lado servidor, já que o Socket representa o cliente que está conectado. Depois com o broadcast estamos avisando todos que o ID específico foi conectado.\n\n**Não aconteceu nada. Está dando erro?**\n\nNo lado cliente, abra uma nova aba, copie o link da sessão e rode, então verá que ele irá se conectar, mostrar um novo id, e na sessão anterior vai ser emitida uma mensagem que aquele ID foi conectado, como queríamos, afinal estávamos enviando para todos quando algum novo ID se conectasse.\n\n**Por que isso aconteceu?**\n\nIsso acontece porque o broadcast não manda a mensagem para o próprio Socket. Isso é feito para não permitir que não receba mensagens duplicadas.\n\nPerceba que com isso já é possível criar um chat. Precisamos apenas adicionar ao lado cliente um input type text e criar um function keyDown, em seguida gerar um if dizendo que se o keyCode for igual ao número que representa o enter (no caso 13), vamos disparar a mensagem com o valor dentro do text.",
      "keywords": [
        "socket",
        "script",
        "cliente",
        "lado",
        "function",
        "msgs",
        "para",
        "connected",
        "isso",
        "mensagem"
      ],
      "metadata": {
        "title": "Hands-on - Socket.io Parte 2",
        "date": "2017-05-12",
        "tags": "['Javascript']",
        "thumbnail": "Socket.IO2.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/socket-io-parte2/index.md"
      }
    },
    {
      "id": "a50d3ebce842a496",
      "url": "https://devpleno.com/blog/termos-de-uso/index",
      "title": "Termos de uso (Part 1)",
      "content": "Estes termos de serviço regulam o uso deste site. Ao acessá-lo você concorda com estes termos. Por favor, consulte regularmente os nossos termos de serviço.\n\nO website DevPleno (gerenciado e mantido por We Dev Ideas – Eirelli – ME) é um serviço interativo oferecido em por meio de página eletrônica na internet que oferece informações sobre negócios, cultura, etc, e serviços relacionados a desenvolvedores a partir da integração de diversas fontes de informação. O acesso ao DevPleno representa a aceitação expressa e irrestrita dos termos de uso abaixo descritos. Se você não concorda com os termos, por favor, não acesse nem utilize este website.  \nO visitante poderá usar este site apenas para finalidades lícitas. Este espaço não poderá ser utilizado para para publicar, enviar, distribuir ou divulgar conteúdos ou informação de caráter difamatório, obsceno ou ilícito, inclusive informações de propriedade exclusiva pertencentes a outras pessoas ou empresas, bem como marcas registradas ou informações protegidas por direitos autorais, sem a expressa autorização do detentor desses direitos. Ainda, o visitante não poderá usar o site DevPleno para obter ou divulgar informações pessoais, inclusive endereços na Internet, sobre os usuários do site.\n\nO DevPleno empenha-se em manter a qualidade, atualidade e autenticidade das informações do site, mas seus criadores e colaboradores não se responsabilizam por eventuais falhas nos serviços ou inexatidão das informações oferecidas. O usuário não deve ter como pressuposto que tais serviços e informações são isentos de erros ou serão adequados aos seus objetivos particulares. Os criadores e colaboradores tampouco assumem o compromisso de atualizar as informações, e reservam-se o direito de alterar as condições de uso ou preços dos serviços e produtos oferecidos no site a qualquer momento.\n\nO acesso ao site DevPleno é gratuito. O DevPleno poderá criar áreas de acesso exclusivo aos seus clientes ou para terceiros especialmente autorizados.",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "acesso",
        "termos",
        "servi",
        "website",
        "para",
        "direitos"
      ],
      "metadata": {
        "title": "Termos de uso",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "blog/termos-de-uso/index.md"
      }
    },
    {
      "id": "a517b0592aef4ab4",
      "url": "https://devpleno.com/entrevista-com-edy-segura",
      "title": "DevPleno Entrevista - Edy Segura - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=DevPleno%20Entrevista%20-%20Edy%20Segura&url=https%3A%2F%2Fdevpleno.com%2Fentrevista-com-edy-segura) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fentrevista-com-edy-segura)",
      "description": "Edy Segura é professor da graduação da UNIVAS e da pósgraduação do INATEL e também trabalha com desenvolvimento de software, além de ser um grande amigo me...",
      "keywords": [
        "para",
        "carreira",
        "gradua",
        "https",
        "cnico",
        "devpleno",
        "segura",
        "isso",
        "fazer",
        "fora"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/entrevista-com-edy-segura"
      }
    },
    {
      "id": "a5a65840eb3086bc",
      "url": "https://devpleno.com/lista-encadeada-adicionar-no",
      "title": "Lista encadeada - Adicionar nó - DevPleno (Part 4)",
      "content": "A última observação importante é que como estamos falando bastante de entrevistas, é importante sabermos qual a [complexidade do algoritmo](https://www.devpleno.com/complexidade-de-um-algoritmo/), para isso temos que avaliar como ele cresce. Se pensarmos em proporção, ela crescer mais ou menos em **0(length)**, quando é do tamanho, geralmente o pessoal chama de **0(n)** porque n seria o número máximo de itens que você tem que colocar. Vamos imaginar que temos 2 whiles ao invés de apenas um, teoricamente um while fora do outro seria 0(2n), mas o 2 perto do N não é nada, então continua 0(n). Já se o while fosse dentro, caminhando até o final do nó ai sim teriamos um 0(n²), como não temos, ele está crescendo baseado no tamanho da lista. A complexidade de espaço também será 0(n) porque eu vou ocupar espaços de memória baseado no tamanho de N.\n\nVamos continuar esse algoritmo comparando e comentando a complexidade de cada uma delas, lembrando que estou resolvendo em JavaScript para mostrar como podemos fazer isso em uma entrevista, afinal meu propósito é ajudar você a se recolocar no mercado ou achar sua vaga sonhada. Em qualquer cenário isso é muito importante para treinar algoritmo.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Lista%20encadeada%20-%20Adicionar%20n%C3%B3&url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-adicionar-no) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-adicionar-no)",
      "description": "Vamos explorar um pouco mais de estrutura de dados de algoritmos que são comuns na base curricular, principalmente em computação, e caem muito em competiçã...",
      "keywords": [
        "length",
        "head",
        "value",
        "list",
        "node",
        "lista",
        "para",
        "vamos",
        "return",
        "const"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/lista-encadeada-adicionar-no"
      }
    },
    {
      "id": "a5ab0fbfccd989f5",
      "url": "https://devpleno.com/hands-ler-arquivo-linha-linha",
      "title": "Hands-on: Ler arquivo linha a linha - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on: Ler arquivo linha a linha\n\nT\nPor Tulio Faria • 8 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste hands-on, vamos ver como conseguimos utilizar o readline em conjunto com Readable Stream para ler linhas de um arquivo texto.\n\n**Como faremos isso?**\n\nPrimeiramente vamos importar o headline (que já faz parte do core do node) e o FS (file System). Em seguida, vamos ler o arquivo com o readable.\n\nconst readline = require('readline')\nconst fs = require('fs')\nconst readable = sf.createReadStream('arquivo.html')\nVamos criar uma instancia do readline e no imput vamos passar o readable\n\nconst rl = readline.creatInterface({\ninput: readable,\noutput: process.stdout\n})\n**Mas para que isso serve?**\n\nIsso é legal, pois podemos fazer assim por exemplo: rl\n\n.on('line', (line) => {\nconsole.log('>>>', line)\n})\nSe rodarmos este código, o node vai mostrar o HTML inteiro linha a linha.\n\nPara provar realmente que ele esta fazendo isso, podemos fazer o seguinte:\n\nrl.on('line', (line) => {\nconsole.log('>>>', line.toUpperCase())\n})\nEntão o node retornará tudo em maiúsculo. Neste código, também podemos ler um CSV, bastaria eu processar a linha do CSV dentro do console.log e temos uma forma de rodar o arquivo sem precisar gastar muita memória.\n\n**Conclusão**\n\nQuando temos muitos dados, não é necessário jogar na memória. Utilizando essa forma, a leitura vai ser bem mais vantajosa.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Neste handson, vamos ver como conseguimos utilizar o readline em conjunto com Readable Stream para ler linhas de um arquivo texto. Como faremos isso? Prime...",
      "keywords": [
        "linha",
        "arquivo",
        "line",
        "https",
        "vamos",
        "readline",
        "readable",
        "para",
        "isso",
        "const"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-ler-arquivo-linha-linha"
      }
    },
    {
      "id": "a624444ce7e4d526",
      "url": "https://devpleno.com/blog/dados-ficticios-para-testes/index",
      "title": "Faker - Como gerar grandes massas de dados fictícios para testes (Part 1)",
      "content": "O Faker é um módulo do Node que usamos para gerar dados fictícios para testes, como para popular um banco de dados, por exemplo. Isso é muito útil quando queremos gerar uma grande massa de dados e estamos sem criatividade para gerá-la. Além disso, ele evita a utilização de dados que pareçam reais, pois eles podem gerar algum desconforto posteriormente. A primeira coisa que você precisa fazer é instalar o módulo:\n\n```jsx\nyarn add faker\n```\n\nVamos criar um arquivo novo. _(No meu caso, usarei o nome gen-data.js, mas pode ser qualquer nome que lhe agrade)._ :) Dentro dele faremos o seguinte código:\n\n```jsx\nconst faker = require('faker')\n\nconsole.log(faker.name.firstName(), faker.name.lastName())\n```\n\nNeste código, primeiro vamos importar o módulo Faker. (Perceba que nele existem vários tipos de dados: nome, phone, random, image, etc). Vamos importar o nome por exemplo. Irá aparecer mais tipos de dados como firstName, lastName, jobArea, entre outros. Salvamos e rodamos no Node, ele nos dará um Nome e um Sobrenome aleatório. Podemos pedir para o Faker fazer isso várias vezes gerando, assim, uma grande massa de dados sem que tenhamos tanto trabalho para popular um banco de dados. Veja o exemplo abaixo.\n\n```jsx\nconst faker = require('faker')\n\nfor (let i = 0; i < 10; i++)\n  console.log(faker.name.firstName(), faker.name.lastName())\n```\n\nO Faker gera uma série dados interessantes, como:\n\n```jsx\nconsole.log(faker.helpers.createCard())\n```\n\nQue irá gerar uma lista com todos os dados de uma pessoa fictícia. Outro exemplo poderia ser:\n\n```jsx\nconsole.log(faker.internet.avatar())\n```\n\nNele, o Faker busca uma imagem aleatória como avatar.\n\nIsso é diferente de gerar o loren y, pois nele geralmente há um formato padrão que começa sempre com \"loren y\", o que não fica muito interessante para nomes.\n\nDepois de utilizar o Faker, você perceberá que vai ajudar muito na hora de criar novos dados para testes de forma rápida. Confira o hands-on em vídeo.",
      "keywords": [
        "faker",
        "dados",
        "para",
        "gerar",
        "nome",
        "como",
        "exemplo",
        "console",
        "name",
        "embed"
      ],
      "metadata": {
        "title": "Faker - Como gerar grandes massas de dados fictícios para testes",
        "date": "2017-05-16",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "FAKER-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/dados-ficticios-para-testes/index.md"
      }
    },
    {
      "id": "a62a49439b8845b2",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-5/index",
      "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar (Part 3)",
      "content": "Agora irei na mesma pasta que eu estava no shell, que é a /opt/, dentro dela temos o placar online, vamos fazer o upload dos nossos arquivos dentro dessa pasta, mais especificamente as pastas **bin, data, public, routes, views** e os arquivos **package.json, app.js e yarn.lock**. A única pasta que não vamos subir é a node_modules. Sempre que formos instalar dependências, temos que fazer isso dentro da máquina que vamos rodar, isso é uma boa prática porque às vezes têm alguns módulos do node que são compilados de acordo com a plataforma.\n\nVoltando ao shell, depois que todos os arquivos forem upados, vou dar um **npm install** apenas para instalar as dependências.\n\nAgora já temos o projeto rodando, vamos checar se ele está rodando realmente:\n\n```jsx\nnode bin/www\n```\n\ncomo ele está com a saída vazia vamos fazer:\n\n```jsx\nPORT= 80 npm start\n```\n\nAgora vou abrir o navegador e verificar se está realmente rodando:\n\n![Exemplo 5](socketpart5Ex5.png)\n\nEstá rodando perfeitamente! Perceba que eu coloquei PORT= 80, isso significa que eu defini uma variável de ambiente antes de iniciar o servidor. Não seria interessante deixar o shell aberto para que nosso serviço fique online, então vamos fazer o seguinte:\n\n```jsx\nnpm install -g pm2\n```\n\nO pm2 é um pacote do npm que permite startar serviços como serviços do linux.\n\nAgora vou dar um **vi start.json**, quando nós vamos startar uma aplicação pelo pm2 temos que definir para ele algumas variáveis de ambiente, igual o port que colocamos logo acima, porque ele não reconhece automaticamente essas variáveis do ambiente:\n\n```jsx\n{\n    \"script\": \"bin/www\",\n    \"env\":{\n    \"PORT\": 80,\n    \"NODE_ENV\": \"production\"\n}}\n```\n\nEntão vou criar um Json com um script que é um env com duas propriedades dentro.\n\nAgora faremos **pm2 start start.json**, perceba que ele já startou o próprio json:\n\n![Exemplo 6](socketpart5Ex6.png)\n\nA vantagem é que pelo pm2 eu consigo ver como ele está utilizando o **pm2 status**\n\n![Exemplo 7](socketpart5Ex7.png)",
      "keywords": [
        "para",
        "vamos",
        "como",
        "fazer",
        "isso",
        "quina",
        "agora",
        "temos",
        "colocar",
        "projeto"
      ],
      "metadata": {
        "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar",
        "date": "2017-07-11",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "SocketIOpart5.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/minicurso-socket-io-parte-5/index.md"
      }
    },
    {
      "id": "a650cc4b9cbacbba",
      "url": "https://devpleno.com/blog/funcionalidades-do-console/index",
      "title": "4 funcionalidades do Console no DevTools que você não conhece (Part 2)",
      "content": "Deixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "console",
        "pode",
        "para",
        "este",
        "digo",
        "embed",
        "html",
        "script",
        "error",
        "erro"
      ],
      "metadata": {
        "title": "4 funcionalidades do Console no DevTools que você não conhece",
        "date": "2017-05-25",
        "tags": "['Javascript']",
        "thumbnail": "CONSOLE-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/funcionalidades-do-console/index.md"
      }
    },
    {
      "id": "a6946792e3ba05b0",
      "url": "https://devpleno.com/blog/cheerio/index",
      "title": "Cheerio: Uma implementação jQuery para Node (Part 1)",
      "content": "Cheerio é um módulo muito interessante porque é uma implementação do jQuery para Node. Vou criar um arquivo novo para ilustrar melhor. Vou salvar como cheereio.js e colocá-lo como dependência, mas para isso é preciso instalar ele primeiro:\n\n```jsx\nnpm install cheerio\n```\n\ne dentro do arquivo faremos o seguinte:\n\n```jsx\nconst cheerio = require('cheereio')\n\nlet $ = cheerio.load('<ul><li>1</li><li>2</li></ul>')\n```\n\nA partir desse momento, o Cheerio vai carregar esse HTML que coloquei dentro e permitir que eu navegue ou faça tudo que eu faria com jQuery no HTML. Por exemplo, eu posso pedir para pegar todos os li e caminhar por eles, depois escrever na tela:\n\n```js\n$('li').each(function () {\n  console.log($(this).html())\n})\n```\n\nAo rodar, ele irá retornar o 1 e 2. Podemos alterar o HTML também, vamos supor que eu queira adicionar mais um li:\n\n```js\n$('ul').append('<li>3</li>')\n\n$('li').each(function () {\n  console.log($(this).html())\n})\n```\n\nCom isso eu consigo manipular o HTML exatamente como se estivesse no jQuery ou no browser. Eu poderia pegar esse código, voltar para o request e, ao invés de escrever o site da UOL na tela, jogar o Body dentro. Vamos supor que eu quero saber qual o título do site:\n\n```js\nconst request = require('request')\nconst cheerio = require('cheerio')\n\nrequest('https://www.uol.com.br', function (err, res, body) {\n  if (!err && res.statusCode == 200) {\n    let $ = cheerio.load(body)\n\n    $('title').each(function () {\n      console.log($(this).html())\n    })\n  }\n})\n\n// Resposta: UOL - Seu universo online\n```\n\nEntão o request buscou o HTML, trouxe para o Cheerio, mandei ele carregar e fizemos um transversing e caminhei pelo HTML. Posso fazer ele trazer todos os p's do site da uol:\n\n```js\nconst request = require('request')\nconst cheerio = require('cheerio')\n\nrequest('https://www.uol.com.br', function (err, res, body) {\n  if (!err && res.statusCode == 200) {\n    let $ = cheerio.load(body)",
      "keywords": [
        "cheerio",
        "html",
        "para",
        "request",
        "function",
        "const",
        "require",
        "body",
        "https",
        "jquery"
      ],
      "metadata": {
        "title": "Cheerio: Uma implementação jQuery para Node",
        "date": "2017-08-14",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "CHEEERIO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/cheerio/index.md"
      }
    },
    {
      "id": "a6ce6697151fd0aa",
      "url": "https://devpleno.com/tag/nodejs/2",
      "title": "NodeJS - Pagina 2 - DevPleno",
      "content": "NodeJS\n\n## Arquivo de Insights\n\n58 posts encontrados com a tag NodeJS\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 10 de ago. de 2017 Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios](/hands-on-rimraf)\n\n[Javascript 28 de jul. de 2017 Nodemon: Monitore alterações e reinicie automaticamente seus scripts](/hands-on-nodemon)\n\n[Javascript 27 de jul. de 2017 Fetch - Uma nova forma de fazer requisições HTTP](/fetch-hands-on)\n\n[Javascript 11 de jul. de 2017 Minicurso Socketio - Parte 05 - Colocando o projeto no ar](/minicurso-socket-io-parte-5)\n\n[Javascript 10 de jul. de 2017 Minicurso Socket.IO Parte 4 - Separando notificações por Rooms](/minicurso-socket-io-parte-4)\n\n[Javascript 7 de jul. de 2017 Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol](/minicurso-socket-io-parte-3)\n\n[Javascript 6 de jul. de 2017 Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO](/minicurso-socket-io-parte-2)\n\n[Javascript 5 de jul. de 2017 Minicurso Socket.IO - Parte 01 - Começando o projeto](/minicurso-socket-io-parte-1)\n\n[Javascript 5 de jul. de 2017 NPM e Módulos de Terceiros - NodeJS](/npm-e-modulos-de-terceiros)\n\n[Javascript 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)\n\n[Javascript 26 de jun. de 2017 Como servir arquivos e expor servidor local com HTTPS](/servir-arquivos-e-expor-servidor)\n\n[Javascript 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)\n\n[Anterior](/tag/nodejs)2 / 5[Próxima](/tag/nodejs/3)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "minicurso",
        "parte",
        "socket",
        "nodejs",
        "hands",
        "algoritmos",
        "carreira",
        "ferramentas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/nodejs/2"
      }
    },
    {
      "id": "a701a27d738019c3",
      "url": "https://devpleno.com/devreactjs-lp",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-lp to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-lp"
      }
    },
    {
      "id": "a705b7312c4c2e99",
      "url": "https://devpleno.com/blog/request-promise/index",
      "title": "Hands-on: Request-promise (Part 2)",
      "content": "O interessante é que poderiamos criar um Request-Promise se a gente quisesse, não é tão complicado, podemos importar ele direto e, utilizando com Async/await, podemos fazer várias operações de rede. Um detalhe importante, como sempre falo, o Async await não vai transformar esse código em síncrono, ele continua sendo assíncrono e tendo as mesmas vantagens.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/YHdaewjbSAI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "request",
        "promise",
        "await",
        "https",
        "fazer",
        "async",
        "const",
        "podemos",
        "httpbin",
        "pegarip"
      ],
      "metadata": {
        "title": "Hands-on: Request-promise",
        "date": "2017-08-17",
        "tags": "['Javascript']",
        "thumbnail": "RequestPromisse.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/request-promise/index.md"
      }
    },
    {
      "id": "a72bdd72bd6568a6",
      "url": "https://devpleno.com/arvore-binaria",
      "title": "Árvore Binária em JavaScript - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=%C3%81rvore%20Bin%C3%A1ria%20em%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Farvore-binaria) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Farvore-binaria)",
      "description": "Continuando o assunto sobre alguns algoritmos que utilizamos em computação em geral, neste port falaremos sobre árvore binária, uma estrutura de dados que ...",
      "keywords": [
        "para",
        "tree",
        "preorder",
        "left",
        "right",
        "rvore",
        "inorder",
        "esquerda",
        "direita",
        "value"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/arvore-binaria"
      }
    },
    {
      "id": "a76b73fa62294e40",
      "url": "https://devpleno.com/algoritmos-xoe-swap",
      "title": "Algoritmos: XOR Swap - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Algoritmos: XOR Swap\n\nT\nPor Tulio Faria • 4 de agosto de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nA dica de hoje é sobre o operador XOR, que eu achei bem interessante. Estava estudando outra coisa e apareceu\nessa informação, então resolvi checar e realmente faz muito sentido.\n\nImagine que temos duas variáveis:\n\nlet a = 3\n\nlet b = 4\nEu quero simplesmente colocar A em B e B em A, geralmente faríamos uma variável TMP, colocaríamos A,\ncolocaríamos A = B e em seguida B = TMP:\n\nlet TMP = a\n\na = b\n\nb = TMP\nPrecisamos de mais uma variável para conseguir fazer essa troca. Se a gente quisesse fazer utilizando o XOR, é possível:\n\na = a ^ b\n\nb = a ^ b\n\na = a ^ b\n\nconsole.log(a, b)\nCom isso conseguimos inverter os valores, essa é uma forma diferente de fazer troca de valores. Algo que acho muito legal na nossa área é quando começamos a pegar operadores que nem são tão famosos, como o XOR mesmo, e começamos a ter alguns usos incomuns.\n\nImaginamos que em binário seria:\n\n3 | 011\n\n4 | 100\nEntão no primeiro XOR nós teriamos de resultado o 1\n\na | 111\nAgora vamos pegar nosso x que agora é o valor de A e fazer com o B:\n\na | 111\n\n4 | 100\nNosso resultado sera:\n\nb | 011\nAgora faremos um terceiro XOR com o A:\n\nb | 011\n\na | 111\nE o resultado será:\n\na | 100\nPerceba que o A agora é 100, que é 4, e o B ficou com 011, que é 3. O legal é que se formos lembrar daquele algoritmo que fizemos de achar os pares que estão faltando, é o mesmo caso porque a medida que nós aplicamos duas vezes o mesmo número, em cima nós removemos, então podemos adicionar ele com outro e tirar o que não queremos. Resumindo, colocamos em A a soma de A com B, em B nós somamos B novamente.\n\nObviamente ele só funciona com tipos de variáveis numéricas e do mesmo tipo, no nosso exemplo são dois inteiros.\n\n## Confira o vídeo:",
      "description": "A dica de hoje é sobre o operador XOR, que eu achei bem interessante. Estava estudando outra coisa e apareceu essa informação, então resolvi checar e realm...",
      "keywords": [
        "https",
        "algoritmos",
        "amos",
        "vari",
        "fazer",
        "mesmo",
        "agora",
        "swap",
        "essa",
        "colocar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/algoritmos-xoe-swap"
      }
    },
    {
      "id": "a76d06ff8f4f8d62",
      "url": "https://devpleno.com/teste",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /teste to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "teste"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/teste"
      }
    },
    {
      "id": "a7857e256fc51bf2",
      "url": "https://devpleno.com/investimento-para-executar-ideias",
      "title": "Preciso de investimento para minha ideia? - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Preciso%20de%20investimento%20para%20minha%20ideia%3F&url=https%3A%2F%2Fdevpleno.com%2Finvestimento-para-executar-ideias) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Finvestimento-para-executar-ideias)",
      "description": "Hoje eu gostaria de falar com vocês sobre como executar uma ideia de forma mais efetiva. Uma coisa que eu vejo com recorrência é que as pessoas costumam te...",
      "keywords": [
        "para",
        "ideia",
        "https",
        "investimento",
        "executar",
        "quando",
        "mais",
        "ideias",
        "investidor",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/investimento-para-executar-ideias"
      }
    },
    {
      "id": "a7bb7deabc83313e",
      "url": "https://devpleno.com/router-props-2",
      "title": "React-router-dom: como injetar props em rotas em ReactJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## React-router-dom: como injetar props em rotas em ReactJS\n\nT\nPor Tulio Faria • 17 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nConfesso que tive muito trabalho até conseguir encontrar uma maneira não tão difícil de fazer a passagem de propriedades para o componente. Neste post, você vai conferir uma dica sobre React Router.\n\n**\nTemos também um outro material somente sobre [React-router que você pode ver aqui](https://devpleno.com/router-props).\n\nVamos fazer a partir de um exemplo básico no qual ele só tem um componente criado com Create-react-app.\n\nimport React, { Component } from 'react'\nimport logo from './logo.svg'\nimport './App.css'\nimport Home from './Home'\n\nclass App extends Component {\nrender() {\nreturn (\n&#x3C;div className='App'>\n&#x3C;div className='App-header'>\n&#x3C;img src={logo} className='App-logo' alt='logo' />\n&#x3C;h2>Welcome to React&#x3C;/h2>\n&#x3C;/div>\n&#x3C;div className='App-intro'>\n&#x3C;home name='Tulio' />\n&#x3C;/div>\n&#x3C;/div>\n)\n}\n}\nPrimeiramente vamos colocar a navegação com o React Router em\n\n&#x3C;home name='Tulio' />\nIsso significa que agora temos uma rota exata que vai apontar para o caminho padrão e qual componente ele vai usar. Vamos colocar Home, mas também criaremos um componente em seguida.\n\nimport React, { Component } from 'react'\nimport logo from './logo.svg'\nimport './App.css'\nimport Home from './Home'\nimport Teste from './Teste'\nimport { BrowserRouter as Router, Route, Link } from 'react-router-dom'\n\nclass App extends Component {\nrender() {\nreturn (\n&#x3C;Router>\n&#x3C;div className='App'>\n&#x3C;div className='App-header'>\n&#x3C;img src={logo} className='App-logo' alt='logo' />\n&#x3C;h2>Welcome to React&#x3C;/h2>\n&#x3C;/div>\n&#x3C;div className='App-intro'>\n&#x3C;Route exact path='/' component={Home} />\n&#x3C;Route exact path='/teste' component={Teste} />\n&#x3C;/div>\n&#x3C;/div>\n&#x3C;/Router>\n)\n}\n}\nFeito isso, vamos criar o teste.js\n\nimport React from 'react'",
      "description": "Confesso que tive muito trabalho até conseguir encontrar uma maneira não tão difícil de fazer a passagem de propriedades para o componente. Neste post, voc...",
      "keywords": [
        "react",
        "home",
        "props",
        "teste",
        "logo",
        "classname",
        "import",
        "router",
        "componente",
        "route"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/router-props-2"
      }
    },
    {
      "id": "a807a261e0e4ae64",
      "url": "https://devpleno.com/blog/qual-seu-maior-desafio/index",
      "title": "Qual é o seu maior desafio nesse momento? (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "isso",
        "para",
        "como",
        "quero",
        "ajudar",
        "fazer",
        "mail",
        "devpleno",
        "pessoas",
        "outras"
      ],
      "metadata": {
        "title": "Qual é o seu maior desafio nesse momento?",
        "date": "2017-05-24",
        "tags": "['Carreira']",
        "thumbnail": "MaiorDesafio.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/qual-seu-maior-desafio/index.md"
      }
    },
    {
      "id": "a8246d262caf45c6",
      "url": "https://devpleno.com/blog/servidor-http-basico-2/index",
      "title": "Servidor HTTP Básico - NodeJS Primeiros Passos (Part 1)",
      "content": "Na série NodeJS Primeiros Passos, você poderá os conceitos básicos de Javascript e NodeJS e, assim, poder colocar a mão na massa. Neste primeiro post, confira como criar um Servidor HTTP básico.\n\nPrimeira coisa que temos que fazer é acessar o [www.nodejs.org](https://www.nodejs.org) e fazer o download _(não vou entrar nessa parte, pois depende da plataforma que você está utilizando, mas de modo geral é bem simples de se fazer)_.\n\nVocê precisa conseguir pelo menos escrever no Shell (prompt de comando) o seguinte:\n\n```jsx\nnpm - v\n```\n\nCom isso, conseguimos ver a versão do node package mananger.\n\nE se colocarmos:\n\n```jsx\nnode - v\n```\n\nAparecerá a versão do node que estamos usando. Se aparecer normalmente a versão deles, significa que estão no path do seu sistema e você conseguirá executá-los diretamente. Se ele não estiver no path do sistema, recomendo que coloque a pasta de instalação do Node no path.\n\nComo Node é JavaScript, no sublime vou criar um arquivo novo e importar um módulo do node chamado http, ele permite que manipulemos requisições http. Também vamos criar um servidor com uma função request e response, assim, tudo que entrar no meu servidor, vou devolver o texto \"devpleno.com\":\n\n```jsx\nvar http: require('http');\nhttp.createServer(function(req, res){\n    res.end('DevPleno.com');\n});\n```\n\nUma coisa interessante de se notar é que esta função é uma função anonima e também é executada de forma assíncrona. Isso quer dizer que o servidor fica 'ouvindo' uma porta, mas só irá executar a função quando um evento acontecer, ou seja, quando um cliente fizer uma requisição para o servidor. Qual a vantagem disso? Chamamos isso de não blocking, ou seja, o servidor não fica esperando chegar uma requisição. Quando um evento de requisição chegar, ele irá executar o trecho do código. Depois de criado o servidor, precisamos ouvir a porta _(a porta diferencia que vai receber a solicitação dentro da máquina)._",
      "keywords": [
        "http",
        "servidor",
        "node",
        "devpleno",
        "para",
        "contents",
        "criar",
        "html",
        "nodejs",
        "fazer"
      ],
      "metadata": {
        "title": "Servidor HTTP Básico - NodeJS Primeiros Passos",
        "date": "2017-05-15",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "ServidorHttp2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/servidor-http-basico-2/index.md"
      }
    },
    {
      "id": "a853289aede8ca9f",
      "url": "https://devpleno.com/low-db",
      "title": "Low-DB - Banco de dados para NodeJS baseado em JSON - DevPleno (Part 2)",
      "content": "const n = bd.get('noticias').find({ id: '1' }).value()\nconsole.log(n)\nPercebam que atribuímos um value para o bd, e então chamamos este value no console.log. Por fim, podemos remover um item deste banco, fazemos isso apenas retirando o set do bd e trocando o .find por .remove\n\nbd.get('noticias').find({ id: '1' }).write()\nEsta é uma ótima ferramenta para utilizarmos em projetos pequenos, não vamos utilizar um banco de dados expansive ou até mesmo para armazenar settings de sua aplicação.\n\nConfira o Hands-on no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Low-DB%20-%20Banco%20de%20dados%20para%20NodeJS%20baseado%20em%20JSON&url=https%3A%2F%2Fdevpleno.com%2Flow-db) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flow-db)",
      "description": "O LowDB é uma forma bem interessante de termos um banco de dados baseado em JSON para utilizarmos em aplicações mais simples ou talvez aplicações desktop, ...",
      "keywords": [
        "banco",
        "para",
        "podemos",
        "https",
        "json",
        "mais",
        "exemplo",
        "vamos",
        "lowdb",
        "noticias"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/low-db"
      }
    },
    {
      "id": "a857fd20de02718a",
      "url": "https://devpleno.com/blog/entrevista-carlos-drury-e-thiago-coelho/index",
      "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho (Part 2)",
      "content": "Uma coisa que eu queria ressaltar é toda vez que eu participo de um evento eu aprendo até mais do que eu ensino ou compartilho. Toda vez que me preparo para um evento, a minha preparação é um estudo muito grande. Como vocês estão integrados em vários projetos grandes e têm a qualidade de vida do desenvolvedor em um lugar que não é em um grande centro, o crescimento demora um pouco para chegar, porém com uma vantagem que economizamos tempo (em 10 minutos estamos na academia, em cidades vizinhas estamos a vinte minutos), então se você fosse dar uma dica de carreira, independente se é de cidade grande ou em uma cidade do interior, qual seria?\n\n**Carlos Drury**: “Minha primeira dica é a pessoa ser pró-ativa, procurar saber sobre assuntos que interessam, tecnologias que ela quer aprender. Uma segunda indiscutivelmente é o Inglês, hoje é fundamental para se comunicar com pessoas do mundo inteiro e até mesmo entender novas ferramentas disponíveis no mercado. O mais importante para mim, para conseguir o emprego que tive hoje foi o intercâmbio.”",
      "keywords": [
        "para",
        "ingl",
        "grande",
        "muito",
        "carlos",
        "javascript",
        "mais",
        "conhecimento",
        "como",
        "pessoa"
      ],
      "metadata": {
        "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho",
        "date": "2017-08-03",
        "tags": "['Carreira']",
        "thumbnail": "entrevista-gdg-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/entrevista-carlos-drury-e-thiago-coelho/index.md"
      }
    },
    {
      "id": "a8711af7dd04007f",
      "url": "https://devpleno.com/blog/2-tipos-de-solucoes-de-software-que-voce-pode-entregar/index",
      "title": "2 Tipos de Soluções de Software que você pode entregar (Part 1)",
      "content": "Hoje quero falar com vocês um pouco sobre venda de software. É um conceito bastante interessante sobre as possibilidades que nós temos de entrega para o cliente.\n\nBasicamente temos duas opções para entregar uma solução para nosso cliente.\n\n## 1 - Entregar exatamente o que o cliente quer\n\nEssa é a opção mais simples, geralmente é a mais utilizada por quem está começando na área. A vantagem desse tipo de solução é que entregamos o serviço muito mais facilmente. O problema é que quando o cliente quer algo e é entregue da forma que ele quer, não necessariamente dá o resultado que ele espera.\n\n## 2 - Entregar o que o cliente realmente precisa\n\nÀ medida que vai ganhando experiência, você começa a perceber que o que o cliente quer nem sempre é o que ele precisa. O problema nisso é que você precisa convencer o seu cliente que o que ele precisa é diferente do que ele quer.\n\nQuando entregamos o que ele precisa, geralmente estamos focados no resultado final, porém isso não necessariamente significa entregar um software para o cliente.\n\nPor exemplo, já aconteceu comigo de um potencial cliente querer mensurar algumas informações, mas na verdade, ele não precisava de um software para fazer isso, apenas um formulário de papel resolveria o problema, e foi o que fizemos.\n\nDessa forma, muitas vezes você não entrega software e não consegue cobrar por aquilo.\n\nQuando estamos começando na área, com projetos menores, a chance do cliente se frustrar é menor, por esse motivo é mais seguro entregar o que o cliente quer.\n\nQuando vamos entregar uma solução eficaz para o cliente, muitas vezes não é desenvolver um software, porém tem clientes que não estão abertos a isso (atualmente eu tento entregar o máximo que o cliente precisa, mas não brigo se o cliente fala o que ele quer mais de três vezes.\n\nReflita sobre essas duas formas, quando um cliente te pedir um software, você está entregando o que o cliente quer ou o que ele precisa?",
      "keywords": [
        "cliente",
        "quer",
        "para",
        "entregar",
        "precisa",
        "software",
        "mais",
        "quando",
        "sobre",
        "solu"
      ],
      "metadata": {
        "title": "2 Tipos de Soluções de Software que você pode entregar",
        "date": "2017-10-13",
        "tags": "['Carreira']",
        "thumbnail": "imagem.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/2-tipos-de-solucoes-de-software-que-voce-pode-entregar/index.md"
      }
    },
    {
      "id": "a88a10412e48cc0d",
      "url": "https://devpleno.com/morgan",
      "title": "O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express - DevPleno (Part 1)",
      "content": "Javascript\n\n## O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express\n\nT\nPor Tulio Faria • 23 de agosto de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nO hands-on de hoje é sobre o Morgan, que é uma forma de logar ou mostrar quais requisições estão chegando em nosso servidor HTTP, seja ele feito no Express ou em Node puro utilizando o módulo HTTP.\n\nA primeira coisa que temos que fazer é adicionar as dependências:\n\nyarn add express morgan\nEu já tenho um arquivo teste criado e vou começar a importar o que precisamos:\n\nconst express = require('express')\nconst morgan = require('morgan')\nconst app = express()\napp.get('/', (req, res) => {\nres.send('olá DevPleno')\n})\napp.listen(3000, () => console.log('listenning'))\nAgora vamos colocar o Morgan como um Middleware e ele vai interceptar toda a requisição que chegar:\n\napp.use(morgan('combined'))\nPerceba que, ao dar F5 na página, ele traz as informações:\n\nIsso é muito legal porque no Apache já temos isso, e se estivermos rodando isso na Amazon, temos a possibilidade de conseguir recuperar esses dados. Temos uma outra versão que é o Tiny:\n\napp.use(morgan('tiny'))\n\nNele temos um retorno mais simples, o método, saída e tempo de resposta. Ainda temos uma terceira forma, que é um padrão personalizado:\n\napp.use(morgan(':method :url :response-time'))\n\nLembrando que, pela Amazon, você pode guardar isso enviando para o S3. Indo para lá, você pode guardar essas informações por muito tempo.\n\nEssa é a ideia para gerar dados toda vez que a gente recebe uma requisição no Express, isso é bastante útil, é algo que já existe no Apache, mas temos que adicionar como Middleware no Express e assim configurar da maneira que queremos.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?",
      "description": "Aprenda o que é o Morgan, como instalar e configurar no Express para logar requisições HTTP. Exemplos práticos com todos os formatos de log.",
      "keywords": [
        "morgan",
        "express",
        "temos",
        "https",
        "isso",
        "para",
        "javascript",
        "http",
        "requisi",
        "const"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/morgan"
      }
    },
    {
      "id": "a8d93e3e31cf62bd",
      "url": "https://devpleno.com/blog/router-props-2/index",
      "title": "React-router-dom: como injetar props em rotas em ReactJS (Part 1)",
      "content": "Confesso que tive muito trabalho até conseguir encontrar uma maneira não tão difícil de fazer a passagem de propriedades para o componente. Neste post, você vai conferir uma dica sobre React Router.\n\n> Temos também um outro material somente sobre [React-router que você pode ver aqui](https://devpleno.com/router-props).\n\nVamos fazer a partir de um exemplo básico no qual ele só tem um componente criado com Create-react-app.\n\n```jsx\nimport React, { Component } from 'react'\nimport logo from './logo.svg'\nimport './App.css'\nimport Home from './Home'\n\nclass App extends Component {\n  render() {\n    return (\n      <div className='App'>\n        <div className='App-header'>\n          <img src={logo} className='App-logo' alt='logo' />\n          <h2>Welcome to React</h2>\n        </div>\n        <div className='App-intro'>\n          <home name='Tulio' />\n        </div>\n      </div>\n    )\n  }\n}\n```\n\nPrimeiramente vamos colocar a navegação com o React Router em\n\n```jsx\n<home name='Tulio' />\n```\n\nIsso significa que agora temos uma rota exata que vai apontar para o caminho padrão e qual componente ele vai usar. Vamos colocar Home, mas também criaremos um componente em seguida.\n\n```jsx\nimport React, { Component } from 'react'\nimport logo from './logo.svg'\nimport './App.css'\nimport Home from './Home'\nimport Teste from './Teste'\nimport { BrowserRouter as Router, Route, Link } from 'react-router-dom'\n\nclass App extends Component {\n  render() {\n    return (\n      <Router>\n        <div className='App'>\n          <div className='App-header'>\n            <img src={logo} className='App-logo' alt='logo' />\n            <h2>Welcome to React</h2>\n          </div>\n          <div className='App-intro'>\n            <Route exact path='/' component={Home} />\n            <Route exact path='/teste' component={Teste} />\n          </div>\n        </div>\n      </Router>\n    )\n  }\n}\n```\n\nFeito isso, vamos criar o teste.js\n\n```jsx\nimport React from 'react'\n\nconst Teste = () => <p>Teste</p>",
      "keywords": [
        "home",
        "react",
        "classname",
        "teste",
        "logo",
        "props",
        "import",
        "componente",
        "route",
        "para"
      ],
      "metadata": {
        "title": "React-router-dom: como injetar props em rotas em ReactJS",
        "date": "2017-05-17",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "RouterProps.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/router-props-2/index.md"
      }
    },
    {
      "id": "a8dacf479b497fea",
      "url": "https://devpleno.com/blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index",
      "title": "As vantagens do Javascript em todas as camadas de uma aplicação (Part 1)",
      "content": "As muitas vantagens de usar JavaScript fizeram com que ela se tornasse a linguagem de programação mais popular do mundo.\n\nExtremamente versátil, o JavaScript pode até ter começado de forma tímida com foco limitado ao client-side. Mas isso mudou com a chegada do node.js em 2009: com a possibilidade de utilizar a linguagem também no server-side, cada vez mais devs defendem a utilização desta linguagem em todas as camadas de uma aplicação.\n\nNeste artigo, explicaremos melhor quais são as vantagens da utilização do JavaScript de ponta a ponta, em todas as camadas de uma aplicação.\n\n## O que são exatamente as camadas de uma aplicação?\n\nTambém chamadas de stacks, as camadas de uma aplicação são simplesmente o front-end e o back-end de uma aplicação.\n\nE no caso de uma aplicação web, o front-end é a camada que roda no navegador, ou seja, no lado do cliente, ou client-side. Em resumo, qualquer componente que é manipulado pelo usuário e utilizado para coletar sua entrada em um sistema é qualificado com front-end.\n\nJá o back-end é o server-side, ou lado do servidor. Ele recebe as entradas feitas pelo usuário no front-end, as processa e então devolve uma saída que será exibida ao usuário mais uma vez pelo front-end.\n\nExistem várias linguagens que podem ser usadas tanto no front-end quanto no back-end de uma aplicação, mas o JavaScript pode ser aplicado em ambas. E isso é o que significa utilizar a linguagem em todas as camadas de uma aplicação.\n\nUm dev full stack, ou seja, um desenvolvedor capaz de programar nas duas camadas de uma aplicação, usualmente conhecerá o JavaScript e poderá escrever seu código com essa linguagem em ambas.\n\n## O que são Node.js + Express + EJS + MongoDB?\n\nPara compreender melhor como exatamente o JavaScript pode ser utilizado em todas as camadas de uma aplicação, é preciso conhecer também alguns outros nomes: Node JS, Express, EJS e MongoDB.",
      "keywords": [
        "javascript",
        "para",
        "aplica",
        "linguagem",
        "mais",
        "camadas",
        "node",
        "todas",
        "back",
        "front"
      ],
      "metadata": {
        "title": "As vantagens do Javascript em todas as camadas de uma aplicação",
        "date": "2017-10-06",
        "tags": "['Javascript']",
        "thumbnail": "VantagensUsarJS.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index.md"
      }
    },
    {
      "id": "a8fda3a9dd8badb6",
      "url": "https://devpleno.com/code-fights-metro-card",
      "title": "code fights - Metro Card - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## code fights - Metro Card\n\nT\nPor Tulio Faria • 16 de novembro de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nHoje vamos resolver mais um problema que está disponível no Code Fights. Esse problema é chamado de metro card. Pode parecer simples, mas tem algumas coisas bastante interessantes de ter na cabeça.\n\nO que é o problema do metro card?\n\nNós temos uma função que você vai informar qual o último número de dias. Vamos supor que eu tenho um cartão de metro com 30 dias, eu utilizei os 30 dias, o vetor vai me retornar as possibilidades de próxima recarga baseado em como os meses são organizados.\n\nfunction metroCard(lastNumberOfDays) {}\nPor exemplo, se colocarmos 28 no lastNumberOfDays, teríamos que retornar 31, que é o próximo mês que podemos recarregar. Minha ideia inicial foi montar um vetor com os meses do ano:\n\nfunction metroCard(lastNumberOfDays) {\nconst months = [31, //jan\n28, // fev\n31, //mar\n30, //apr\n31, //may\n30, //jun\n31, //jul\n31, //aug\n30, //set\n31, //oct\n30, //nov\n31 //dec]\n}\nOutra coisa bastante importante é ficar ligado no que o problema pede como saída, especificamente nesse problema, temos que retornar um vetor ordenado crescente.\n\nAgora podemos fazer o seguinte: vamos guardar todos os dias que a gente tem posterior a esse valor informado. Por exemplo, se eu informei 28, a única possibilidade que tenho é 31:\n\nconst days = {\nmonths.forEach((elem, index) => {\nif(elem === lastNumberOfDays){\nconsole.log(months[index+1])\n}\n})\n}\n\nmetroCard(28)\n\nmetroCard(30)\nPercebam que o mês vai ser retornado como undefined. Nós precisamos de mais um ajuste, precisamos somar que o índice precisa fazer o resto por %12. Sempre que usamos o %, ele volta para zero e pega o restante, por exemplo 4 %12 retorna 4.",
      "description": "Hoje vamos resolver mais um problema que está disponível no Code Fights. Esse problema é chamado de metro card. Pode parecer simples, mas tem algumas coisa...",
      "keywords": [
        "months",
        "metro",
        "lastnumberofdays",
        "elem",
        "index",
        "https",
        "card",
        "problema",
        "retornar",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/code-fights-metro-card"
      }
    },
    {
      "id": "a919ba8656fd07ee",
      "url": "https://devpleno.com/precisa-ter-diploma-para-a-toptal",
      "title": "Precisa ter diploma para trabalhar por meio da Toptal? - DevPleno",
      "content": "Carreira\n\n## Precisa ter diploma para trabalhar por meio da Toptal?\n\nT\nPor Tulio Faria • 15 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nVocê não é graduado, mas quer trabalhar por meio da Toptal? Entenda se isso é possível ou não neste vídeo:\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\nSaiba mais [sobre o DevReactJS aqui.](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Precisa%20ter%20diploma%20para%20trabalhar%20por%20meio%20da%20Toptal%3F&url=https%3A%2F%2Fdevpleno.com%2Fprecisa-ter-diploma-para-a-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprecisa-ter-diploma-para-a-toptal)",
      "description": "Você não é graduado, mas quer trabalhar por meio da Toptal? Entenda se isso é possível ou não neste vídeo: <div className=&#34;embedresponsive embedresponsive1...",
      "keywords": [
        "toptal",
        "https",
        "para",
        "carreira",
        "diploma",
        "mais",
        "profissionais",
        "precisa",
        "trabalhar",
        "meio"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/precisa-ter-diploma-para-a-toptal"
      }
    },
    {
      "id": "a91c7199d61a183f",
      "url": "https://devpleno.com/blog/expressao-aritmetica-codefights/index",
      "title": "Resolvendo Expressão Aritmética do CodeFights",
      "content": "Hoje vamos resolver um problema disponível no Code Fights, conhecido como Expressão aritmética. É bastante simples, basicamente temos um número A, B e C e temos que descobrir se existe um operador que faça A#B = C ser verdadeira, temos algumas maneiras de fazer, a primeira que eu fiz foi a seguinte:\n\n```jsx\nfunction arithmeticExpression(a, b, c) {\n  const ops =  ['+','-','/','*']]\n\n  const op = (a, b, o) => {\n    if(o === '+'){\n      return a+b\n    } else if(o === '-') {\n      return a-b\n    } else if(o === '/'){\n      return a/b\n    }\n\n    return a*b\n  }\n\n  return ops\n    .map(o =>(a, b, o)===c)\n    .filter(o => o)\n    .length > 0\n}\n\nconsole.log('2,3,5 =  ',arithmeticExpression(2,3,5))\n```\n\nEu defini uma lista de operadores e cada uma delas representado com seu próprio operador aritmético em JavaScript, em seguida criei uma arrow function que dado a, b e a operação que eu quero, ele faça a operação em si.\n\nFeito isso, peguei todas as operações e fiz um map que converte uma lista de operações para uma lista do resultado dessas operações aplicadas.\n\nTambém poderia ter feito de outra maneira, por exemplo, já que eu já tenho o operador, porque não tentar aplicar o operador sem utilizar o if? Uma das ideias seria algo nesse sentido:\n\n```jsx\nfunction arithmeticExpression(a, b, c) {\n  const ops =  ['+','-','/','*']]\n\n  const op = (a, b, o) => eval(`a ${o} b`)\n\n  return ops\n    .map(o =>(a, b, o)===c)\n    .filter(o => o)\n    .length > 0\n}\n\nconsole.log('2,3,5 =  ',arithmeticExpression(2,3,5))\n```\n\nEsse eval converte para código em JavaScritp e executa, não é um código que tem uma segurança muito grande e é até um pouco mais lento, mas é uma possibilidade.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "return",
        "opera",
        "operador",
        "arithmeticexpression",
        "const",
        "temos",
        "function",
        "lista",
        "para",
        "aritm"
      ],
      "metadata": {
        "title": "Resolvendo Expressão Aritmética do CodeFights",
        "date": "2017-11-13",
        "tags": "['Algoritmos']",
        "thumbnail": "Expressao.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/expressao-aritmetica-codefights/index.md"
      }
    },
    {
      "id": "a929c30c7b6d65c6",
      "url": "https://devpleno.com/blog/projeto-certo-para-estudar-programacao/index",
      "title": "Qual o projeto certo para estudar programação? (Part 3)",
      "content": "Colocar o seu programa em produção é muito importante para você, desenvolvedor, porque ao disponibilizar suas aplicações em seu Github, por exemplo, um recrutador terá mais facilidade de avaliar o seu trabalho e saber se você é o profissional que ele procura para uma vaga de emprego. Além disso, você exercita como publicar os seus projetos.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "devpleno",
        "projeto",
        "como",
        "mais",
        "programa",
        "aplica",
        "https",
        "aprender",
        "suas"
      ],
      "metadata": {
        "title": "Qual o projeto certo para estudar programação?",
        "date": "2018-02-20",
        "tags": "['Carreira']",
        "thumbnail": "ProjetoCerto.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/projeto-certo-para-estudar-programacao/index.md"
      }
    },
    {
      "id": "a92dc21a491a8dd0",
      "url": "https://devpleno.com/router-props-2",
      "title": "React-router-dom: como injetar props em rotas em ReactJS - DevPleno (Part 2)",
      "content": "const Teste = () => &#x3C;p>Teste&#x3C;/p>\n\nexport default Teste\nAgora vamos até o cabeçalho da aplicação e criar um link para a home e um link para teste, assim, já temos uma navegação funcionando normalmente.\n\n&#x3C;div className='App'>\n&#x3C;div className='App-header'>\n&#x3C;img src={logo} className='App-logo' alt='logo' />\n&#x3C;h2>Welcome to React&#x3C;/h2>\n&#x3C;p>\n&#x3C;Link to='/'>Home&#x3C;/Link>\n&#x3C;Link to='/teste'>Teste&#x3C;/Link>\n&#x3C;/p>\n&#x3C;/div>\n&#x3C;/div>\nQual o problema?**\n\nEu preciso passar parâmetros ou props para o componente Home, mas ele não irá funcionar se fizermos assim:\n\n&#x3C;Route exact path='/' component={Home} name='Tulio' />\n**Como podemos passar essa props para o componente home?**\n\nAo invés de chamar component, vamos chamar render. Ele é legal porque podemos passar uma arrow function com props e dizemos que essa arrow function vai retornar este componente /Home.\n\n&#x3C;div className='App-intro'>\n&#x3C;Route exact path='/' render={(props) => &#x3C;Home />} name='Tulio' />\n&#x3C;Route exact path='/teste' component={Teste} />\n&#x3C;/div>\nEsses props são as propriedades que o próprio route passa para o componente, então temos que injetar essas props (vai que por algum motivo ele precisa saber em qual URL ele está, ou algo nesse sentido).*\n\nCom isso, conseguimos efetivamente passar os props que queremos.\n\n&#x3C;Route\nexact\npath='/'\nrender={(props) => &#x3C;Home {...props} name='Tulio' />}\nname='Tulio'\n/>\nAlém das propriedades que já tínhamos no componente por causa da route, caso olharmos em teste, percebemos que só temos as propriedades que foram passadas pelo route e não pela importação do componente.\n\nIsso é muito importante para conseguirmos injetar dependência, eu descobri essa forma de utilizar a passada de props através de uma rota por que precisava injetar uma dependência.\n\nConfira o passo a passo em vídeo:",
      "description": "Confesso que tive muito trabalho até conseguir encontrar uma maneira não tão difícil de fazer a passagem de propriedades para o componente. Neste post, voc...",
      "keywords": [
        "react",
        "home",
        "props",
        "teste",
        "logo",
        "classname",
        "import",
        "router",
        "componente",
        "route"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/router-props-2"
      }
    },
    {
      "id": "a95d412924124206",
      "url": "https://devpleno.com/copy-to-clipboard-em-js",
      "title": "Ctrl+C / Copy to Clipboard em JS - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Ctrl%2BC%20%2F%20Copy%20to%20Clipboard%20em%20JS&url=https%3A%2F%2Fdevpleno.com%2Fcopy-to-clipboard-em-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcopy-to-clipboard-em-js)",
      "description": "Essa é uma dica bem rápida de como podemos mandar algo com o clipboard, ou seja, o equivalente a dar um CTRL + C em um texto na sua página. Para fazer este...",
      "keywords": [
        "para",
        "https",
        "clipboard",
        "script",
        "quando",
        "ctrl",
        "copy",
        "jquery",
        "text",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/copy-to-clipboard-em-js"
      }
    },
    {
      "id": "a97e6a46ae55fdb7",
      "url": "https://devpleno.com/vantagens-da-injecao-de-depencia",
      "title": "Vantagens da Injeção de dependência para a testabilidade do código - DevPleno (Part 2)",
      "content": "const alertUser = require('./alert-user')\ntest('it calls alert', () => {\nconst alertMock = jest.fn()\nalertUser.alert(alertMock, 'message')\nconsole.log(alertMock.mock.calls)\n}\nPerceba que criei um Mock para o alert. **O que é um Mock?** Uma função que está no nosso controle e que usamos apenas para retornar um valor. Assim é possível testar o nosso código. Temos, então, que garantir que o alert faça o que ele deveria fazer, que é passar a mensagem. Note que se passarmos o alertMock.mock.calls, sabemos exatamente que o alert foi chamado. Se quisermos deixar o código mais organizado, sem aquele aspecto de gambiarra, podemos fazer o seguinte:\n\nconst alertUser = require('./alert-user')\ntest('it calls alert', () => {\nconst alertMock = jest.fn()\nconst msg = 'message'\nalertUser.alert(alertMock, msg)\nexpect(alertMock.mock.calls [0][0]).toBe('msg')\n}\nAgora vamos supor que nosso código tem algum erro, então ele não chama o alert, apenas retorna\n\nconst alerts = {\nalerts: (alert, message) => 1\n}\nmodule.exports = alerts\nPerceba que ele daria um erro, pois o mock não foi chamado. Quando ‘mockamos’ temos um controle ainda maior dos nossos testes, sem depender de nada externo ou gambiarra de injetar no módulo. O grande detalhe é o seguinte: quando vamos chamar o alertUser no visual studio, ele já mostra o alert e qual message eu quero, assim fica muito mais claro o que precisa para ele rodar. Portanto, a vantagem de injetarmos dependência é ter essa facilidade de testar sem depender desse load dinâmico das dependências. Simplesmente mockamos a dependência que temos e nosso código vai funcionar. Além disso, fica mais fácil de ler. Confira o hands-on em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Já havia falado por aqui sobre injeção de dependência, disse que muitas vezes não temos acesso ao que estamos testando. Desta vez, falo sobre as vantagens ...",
      "keywords": [
        "alert",
        "alerts",
        "message",
        "const",
        "depend",
        "para",
        "digo",
        "https",
        "browser",
        "alertmock"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/vantagens-da-injecao-de-depencia"
      }
    },
    {
      "id": "a9e67577436bf2e3",
      "url": "https://devpleno.com/minicurso-socket-io-parte-2",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO - DevPleno (Part 3)",
      "content": "module.exports = indexRouter\nVoltando a função que acabamos de criar, vamos tirar essa chave e colocar todas as dependencias da pagina dentro:\n\nfunction indexRouter(dependecies){\n//definindo o bd\nconst low = require('lowdb')\nconst db = low(__dirname+'/../data/db.json')\nconst defaultData = require('../data/default-data.json')\ndb.defaults(defaultData).write()\n....\n});\nreturn router;\n}\nEntão tiramos todo o código que estava dentro do index, criamos uma função indexRouter, fizemos todo o código rodar normal e ao fim retornamos esse router, passando a referencia dessa função para quem chamar ele, exatamente a mesma coisa que o construtor do Socket.IO faz.\n\nAgora temos acesso a essas dependências:\n\nfunction indexRouter(dependecies){\nconsole.log(dependencies)\n//definindo o bd\n...\n}\nVoltando ao app.js vamos fazer o seguinte:\n\nvar index = require('./routes/index')({ io: app.io })\nO require irá retornar uma função, não a execução dessa função e sim a função em si, já o io:app.io fala para executar esse função e eu passo um parâmetro para ele, que são as dependências que eu quero injetar nesse router.\n\nAo executar o código, perceba que agora temos uma instancia de IO dentro do indexRouter. Voltando ao index, vamos trocar o BD de lugar também, recortamos ele do index.js e vamos colar em app.js. Como o app está na raiz, eu preciso concertar os caminhos:\n\n//definindo o bd\nconst low = require('lowdb')\nconst db = low(__dirname + '/data/db.json')\nconst defaultData = require('./data/default-data.json')\ndb.defaults(defaultData).write()\nEle vai quebrar o código, mas fique tranquilo, era para isso acontecer mesmo. Agora vamos enviar o banco para o index.js também\n\nvar index = require('./routes/index')({ io: app.io, db })\nAgora vocês podem perceber que ao startar o projeto temos a dependência do DB. Como construímos um projeto todo dependendo de DB, eu posso apagar o console.log que colocamos dentro da função indexRouter e colocar o seguinte:",
      "description": "Na primeira aula do minicurso de Sockt.IO, fizemos a listagem dos jogos puxando do banco de dados baseado em json e quando clicamos conseguimos visualizar ...",
      "keywords": [
        "vamos",
        "socket",
        "admin",
        "index",
        "para",
        "const",
        "dentro",
        "temos",
        "criar",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-2"
      }
    },
    {
      "id": "aa022c61d7c9dd25",
      "url": "https://devpleno.com/servidor-json-simples-em-php-parte-1",
      "title": "Servidor JSON simples em PHP (parte 1) - DevPleno (Part 1)",
      "content": "Javascript\n\n## Servidor JSON simples em PHP (parte 1)\n\nT\nPor Tulio Faria • 8 de setembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje quero mostrar para vocês como criar um servidor JSON utilizando o PHP. Mas por que PHP e não JavaScript? Porque ainda é uma linguagem que tem hospedagem muito fácil de achar até mesmo gratuitamente. Se você já tiver um WordPress ou um site que suporte PHP já vai conseguir rodar isso, assim é possível rodar, por exemplo, projetos de teste como nosso Minhas Séries, que foi feito em ReactJS. A ideia é bem simples, apenas dois métodos por enquanto. Então vamos criar um arquivo chamado db.JSON e dentro dele vamos colocar assim:\n\n{\n“series”: [],\n“genres”:[]\n}\nEsse é nosso banco de dados. Feito isso, vou criar um index.php e adicionar alguns detalhes, primeiro dividir o que vier como get na variável e em seguida carregar o banco:\n\n&#x3C;?php\n$path = explode('/', $_GET['path']);\n$contents = file_get_contents('bd.json');\n$json = json_decode($contents, true);\n$method = $_SERVER['REQUEST_METHOD'];\nheader('Content-type: application/json');\n$body = file_get_contents('php://input');\nAgora que já lemos tudo, temos que adicionar um if. Caso o method for get, vamos apenas retornar o Json:\n\nif($method === 'GET'){\nif($json[$path[0]]){\necho json_encode($json[$path[0]]);\n}else{\necho '[]';\n}\n}\nCom isso, caso tivermos uma série dentro do campo séries, ele retornará essa série. Além disso, podemos inserir também:",
      "description": "Hoje quero mostrar para vocês como criar um servidor JSON utilizando o PHP. Mas por que PHP e não JavaScript? Porque ainda é uma linguagem que tem hospedag...",
      "keywords": [
        "json",
        "path",
        "https",
        "contents",
        "method",
        "caso",
        "javascript",
        "servidor",
        "simples",
        "parte"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/servidor-json-simples-em-php-parte-1"
      }
    },
    {
      "id": "aa244cf4b570fbf9",
      "url": "https://devpleno.com/fetch-hands-on",
      "title": "Fetch - Uma nova forma de fazer requisições HTTP - DevPleno (Part 1)",
      "content": "Javascript\n\n## Fetch - Uma nova forma de fazer requisições HTTP\n\nT\nPor Tulio Faria • 27 de julho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste hands on, vamos testar o Fetch, uma alternativa que vem sendo adotada e implementada nos navegadores para substituir a forma como fazíamos requisições http no browser. Já existem módulos que implementam isso no Node, o interessante é que podemos usar a mesma API para os dois lados. Quando o navegador não tem suporte, podemos usar um Polifill.\n\nA primeira coisa que vou fazer é adicionar como dependência no meu projeto:\n\nyarn add node-fetch\nAgora precisamos importá-lo. A primeira coisa muito interessante no fetch é que ele retorna promises, com isso fica muito mais simples de trabalharmos:\n\nconst fetch = require('node-fetch')\n\nconst url = 'http//httpbin.org.get'\n\nfetch(url).then((res)=>{\nconsole.log(res)\n}\nPerceba que estou dando um fetch para mandar pegar essa url e em seguida ele retorna o res. Ele retorna os resultados e também um json, que é uma promise. Então simplesmente se eu fizer:\n\nfetch(url)\n.then((res) => res.json())\n.then((json) => console.log(json))\nEle vai dar o retorno do nosso httpbin, vamos passar algum parâmetro para saber se está alterando mesmo:\n\nconst url = 'http//httpbin.org.get?t=1'\nPerceba que o args dele virá com o t=1 Utilizando essas promises fica muito mais fácil de se fazer o código e assim podemos utilizar também outros módulos, como generator ou até mesmo fazer um post com essa mesma ideia:\n\nconst urlPost = 'http//httpbin.org/post'\n\nfetch(urlPost, { method: 'Post', body: 'tulio=faria' })\n.then((res) => res.json())\n.then((json) => console.log(json))\nA única diferença é que passamos um método para ele. Ele pega esse post e mostra para mim, inclusive o data. O interessante é que conseguimos fazer o mesmo controle de erro:",
      "description": "Neste hands on, vamos testar o Fetch, uma alternativa que vem sendo adotada e implementada nos navegadores para substituir a forma como fazíamos requisiçõe...",
      "keywords": [
        "fetch",
        "fazer",
        "para",
        "json",
        "http",
        "https",
        "como",
        "then",
        "post",
        "interessante"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/fetch-hands-on"
      }
    },
    {
      "id": "aa4ff3145859c38f",
      "url": "https://devpleno.com/blog/como-escolher-linguagem-de-tecnologia/index",
      "title": "Como escolher uma linguagem de tecnologia?",
      "content": "Eu sou uma pessoa que sempre tem que estar conhecendo coisas novas e estar confortável com essas coisas, por isso resolvi compartilhar como escolher uma linguagem de tecnologia ou algo novo para estudar.\n\nTem coisas que eu gosto de fazer, como programar em aplicativos web e também tenho algumas missões com isso, como deixar mais fácil de organizar o código. Então, a minha decisão é tomada em cima do resultado que eu consigo ter com aquela linguagem. Eu não tomava decisão baseado em dinheiro, porque uma das coisas que as pessoas esquecem muito é que não é a linguagem que você vai usar que faz a diferença, e sim o quão bom é o produto que você vai construir com aquela linguagem. Por exemplo, tem muita gente que faz sistemas e plataformas maravilhosas com linguagens que nem imaginamos.\n\nSe você souber usar o máximo da linguagem para tirar o máximo de resultado, você será bem remunerado sobre isso.\n\nO mais importante: depois que você sabe algumas linguagens, elas ficam irrelevantes, por exemplo uma das formas que eu defino em qual linguagem eu programo é se consigo entregar algo comercial com garantia pro cliente nessa linguagem. Esse é meu parâmetro para saber se eu estou preparado naquela linguagem e não somente focado no dinheiro.\n\nSe você se sente confortável com aquilo que você aprende, então você faz gerar resultado, já que aquilo não vai ser um peso para você.\n\nAssista ao vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-OMEUwlXewU\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "linguagem",
        "para",
        "coisas",
        "embed",
        "isso",
        "como",
        "resultado",
        "responsive",
        "https",
        "estar"
      ],
      "metadata": {
        "title": "Como escolher uma linguagem de tecnologia?",
        "date": "2017-07-05",
        "tags": "['Carreira']",
        "thumbnail": "LINGUAGEM-ESCOLHER-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/como-escolher-linguagem-de-tecnologia/index.md"
      }
    },
    {
      "id": "aa75b5c082b43efd",
      "url": "https://devpleno.com/dica-map",
      "title": "Redirecting to: /map",
      "content": "Redirecting to: /map [Redirecting from /dica-map to /map](/map)",
      "keywords": [
        "redirecting",
        "from",
        "dica"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-map"
      }
    },
    {
      "id": "aae42697871b355f",
      "url": "https://devpleno.com/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira",
      "title": "Como as maratonas de programação da faculdade impactaram a minha carreira - DevPleno (Part 4)",
      "content": "PS 2: Nas competições que citei, eu não estava sozinho. Obrigado aos meus amigos Luana Lima e Herick Ferreira, pela companhia na equipe Bender. Nós fizemos um ótimo trabalho em equipe.\n\nPS 3: Obrigado, professor Roberto Porto, pelo apoio e incentivo às competições.\n\nPS 4: Na segunda foto, Roberto Porto, eu, Luana Lima e Herick Ferreira.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20as%20maratonas%20de%20programa%C3%A7%C3%A3o%20da%20faculdade%20impactaram%20a%20minha%20carreira&url=https%3A%2F%2Fdevpleno.com%2Fcomo-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira)",
      "description": "A história do post de hoje já tem mais de 10 anos e faz parte de lembranças que eu tenho de quando ainda estava na faculdade, mais precisamente, de quando ...",
      "keywords": [
        "mais",
        "competi",
        "como",
        "para",
        "minha",
        "carreira",
        "faculdade",
        "maratonas",
        "muito",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira"
      }
    },
    {
      "id": "aaeee17b90e03f2e",
      "url": "https://devpleno.com/blog/code-fights-metro-card/index",
      "title": "code fights - Metro Card (Part 1)",
      "content": "Hoje vamos resolver mais um problema que está disponível no Code Fights. Esse problema é chamado de metro card. Pode parecer simples, mas tem algumas coisas bastante interessantes de ter na cabeça.\n\nO que é o problema do metro card?\n\nNós temos uma função que você vai informar qual o último número de dias. Vamos supor que eu tenho um cartão de metro com 30 dias, eu utilizei os 30 dias, o vetor vai me retornar as possibilidades de próxima recarga baseado em como os meses são organizados.\n\n```js\nfunction metroCard(lastNumberOfDays) {}\n```\n\nPor exemplo, se colocarmos 28 no lastNumberOfDays, teríamos que retornar 31, que é o próximo mês que podemos recarregar. Minha ideia inicial foi montar um vetor com os meses do ano:\n\n```js\nfunction metroCard(lastNumberOfDays) {\n  const months = [\n    31, //jan\n    28, // fev\n    31, //mar\n    30, //apr\n    31, //may\n    30, //jun\n    31, //jul\n    31, //aug\n    30, //set\n    31, //oct\n    30, //nov\n    31 //dec\n  ]\n}\n```\n\nOutra coisa bastante importante é ficar ligado no que o problema pede como saída, especificamente nesse problema, temos que retornar um vetor ordenado crescente.\n\nAgora podemos fazer o seguinte: vamos guardar todos os dias que a gente tem posterior a esse valor informado. Por exemplo, se eu informei 28, a única possibilidade que tenho é 31:\n\n```js\nconst days = {\n  months.forEach((elem, index) => {\n    if(elem === lastNumberOfDays){\n      console.log(months[index+1])\n    }\n  })\n}\n\nmetroCard(28)\n\nmetroCard(30)\n```\n\nPercebam que o mês vai ser retornado como undefined. Nós precisamos de mais um ajuste, precisamos somar que o índice precisa fazer o resto por %12. Sempre que usamos o %, ele volta para zero e pega o restante, por exemplo 4 %12 retorna 4.\n\n```js\nconst days = {\n  months.forEach((elem, index) => {\n    if(elem === lastNumberOfDays){\n      console.log(months[(index+1)%12])\n    }\n  })\n}\n```",
      "keywords": [
        "months",
        "lastnumberofdays",
        "elem",
        "index",
        "problema",
        "retornar",
        "como",
        "days",
        "vamos",
        "mais"
      ],
      "metadata": {
        "title": "code fights - Metro Card",
        "date": "2017-11-16",
        "tags": "['Algoritmos']",
        "thumbnail": "metro-card-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/code-fights-metro-card/index.md"
      }
    },
    {
      "id": "aaf45e35326ba806",
      "url": "https://devpleno.com/orientacao-objetos-imperativa-e-funcional",
      "title": "Diferença entre as programações Orientação-objetos, Imperativa e Funcional - DevPleno (Part 1)",
      "content": "Javascript\n\n## Diferença entre as programações Orientação-objetos, Imperativa e Funcional\n\nT\nPor Tulio Faria • 21 de setembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje eu quero explicar um pouco melhor essa diferença entre Programação Funcional, Orientação-objetos e Imperativa.\n\nPrimeiro, todos os paradigmas são interessantes e importantes, mas antes de falarmos sobre cada um deles, o que é um paradigma?\n\nEle vai dizer como você abstrai seu problema do “mundo real” para a computação. Por exemplo, se você vende doces, como você transformar essa venda em uma forma computadorizada. O problema é que na primeira abordagem, que foi a ‘Imperativa’, nós simplesmente executávamos códigos, como comandos diretos, mas foi chegando em uma situação onde ficava muito complexo para entender, não existia uma forma de classificar esse código que deixasse ele um pouco mais fácil de dar manutenção.\n\nUma das formas que surgiram para resolver isso foi a orientação-objetos. Ela tenta abstrair os objetos que estão envolvidas nos problemas e então agrupamos essas funções e dados dentro desses objetos. Por exemplo, eu quero modelar um produto, ele é uma classe, quando eu quiser instanciar essa classe eu vou ter um objeto, que são os valores dentro dessa classe. O problema é que para você programar com orientação-objetos, você tem que conhecer algumas regras ou boas práticas, como patterns, mas o problema maior é quando o pessoal programa em uma linguagem orientada objeto, porém ainda faz imperativa. Para dominar o orientado objeto demora para conseguir fazer essa abstração de maneira interessante.\n\nQuando pegamos uma linguagem funcional, o pessoal aplica o mesmo conceito de orientação-objetos dentro do funcional, isso é algo que não me agrada. Você trazer muita coisa de orientação-objeto para um paradigma diferente. Cada paradigma tem suas próprias características.",
      "description": "Hoje eu quero explicar um pouco melhor essa diferença entre Programação Funcional, Orientaçãoobjetos e Imperativa. Primeiro, todos os paradigmas são intere...",
      "keywords": [
        "para",
        "objetos",
        "funcional",
        "orienta",
        "isso",
        "imperativa",
        "https",
        "programa",
        "como",
        "problema"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/orientacao-objetos-imperativa-e-funcional"
      }
    },
    {
      "id": "aaff3fafdd9c46d8",
      "url": "https://devpleno.com/shelljs",
      "title": "ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux - DevPleno (Part 2)",
      "content": "Nós utilizamos bastante em alguns projetos para, por exemplo, transformar dados, conectar no banco, atualizar o banco, manipular grandes quantidades de dados, etc.\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=ShellJS%20-%20Crie%20ferramentas%20multiplataformas%20baseadas%20no%20Shell%20do%20Linux&url=https%3A%2F%2Fdevpleno.com%2Fshelljs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fshelljs)",
      "description": "Neste handson, vou falar mais especificamente sobre o ShellJS, uma implementação do Shell do linux em JavaScript. Qual a vantagem do ShellJS? A grande vant...",
      "keywords": [
        "para",
        "shelljs",
        "shell",
        "https",
        "exemplo",
        "isso",
        "javascript",
        "linux",
        "arquivo",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/shelljs"
      }
    },
    {
      "id": "ab11786bd1405f00",
      "url": "https://devpleno.com/tudo-acontece-duas-vezes",
      "title": "Tudo na vida acontece duas vezes! - DevPleno",
      "content": "Carreira\n\n## Tudo na vida acontece duas vezes!\n\nT\nPor Tulio Faria • 8 de setembro de 2017\n\n[Carreira](/tag/carreira)\n\nVocê sabia que tudo que você pensa acontece duas vezes? Uma vez na sua cabeça e outra vez quando você implementa ou realiza isso de fato. Isso acontece com tudo, desde o código que você está programando até um projeto que está implementando.\n\nO detalhe é que toda vez que você for pensar em projetos ou qualquer outra coisa que queira realizar, pense com um máximo de detalhes, sentimentos e sensações que você puder. Por exemplo, se você sonha em ter sua startup de tecnologia, sonhe com você acordando cedo, trocando de roupa empolgado e entrando nela, sentindo o cheiro do ambiente… Quando mais dessas sensações você conseguir sentir, mais vai estar preparado na hora de implementar.\n\nOs pensamentos limitantes são o contrário de você pensar duas vezes, porque você usa esse poder da mente no modo negativo, ou simplesmente não usa. Quando começamos a visualizar as coisas positivas, estamos realmente usando ela para alcançar coisas novas.\n\nVamos supor que você quer comprar um carro novo, imagine você dirigindo o carro, sentindo o cheiro dele… Você vai perceber que vai ficar mais próximo de comprar um carro novo do que se você só estivesse vendo uma foto de revista, por exemplo. Então faça isso irá perceber que vai prosperar muito na carreira.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Tudo%20na%20vida%20acontece%20duas%20vezes!&url=https%3A%2F%2Fdevpleno.com%2Ftudo-acontece-duas-vezes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftudo-acontece-duas-vezes)",
      "description": "Você sabia que tudo que você pensa acontece duas vezes? Uma vez na sua cabeça e outra vez quando você implementa ou realiza isso de fato. Isso acontece com...",
      "keywords": [
        "https",
        "acontece",
        "duas",
        "vezes",
        "carreira",
        "tudo",
        "quando",
        "isso",
        "mais",
        "carro"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tudo-acontece-duas-vezes"
      }
    },
    {
      "id": "ab2e2389463cc258",
      "url": "https://devpleno.com/fsmrelampago-ytads",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-ytads to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fsmrelampago",
        "ytads"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsmrelampago-ytads"
      }
    },
    {
      "id": "ab9d57f179d623b9",
      "url": "https://devpleno.com/blog/dotenv-e-variaveis-de-ambiente/index",
      "title": "Dotenv e variáveis de ambiente no NodeJS (Part 2)",
      "content": "```jsx\nrequire('dotenv').config()\nif (process.env.NODE_ENV !== 'production') {\n  console.log('Desenvolvimento')\n} else {\n  console.log('Produção')\n}\n\n// Retorno: Desenvolvimento\n```\n\nQuando começamos a utilizar essas técnicas, a nossa aplicação fica muito mais independente, rodando em qualquer lugar, basta que você informe qual a configuração de banco de dados, Mongo, SQL, etc e ela vai se moldar para cada ambiente.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/KOYQDxaL9ag\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "vari",
        "ambiente",
        "desenvolvimento",
        "node",
        "arquivo",
        "podemos",
        "gente",
        "quina",
        "produ",
        "rodar"
      ],
      "metadata": {
        "title": "Dotenv e variáveis de ambiente no NodeJS",
        "date": "2017-08-23",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "VARIÁVEIS-DE-AMBIENTE-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/dotenv-e-variaveis-de-ambiente/index.md"
      }
    },
    {
      "id": "abeb3fd930404839",
      "url": "https://devpleno.com/standard-parte-2",
      "title": "Standard Parte 2 - DevPleno",
      "content": "Javascript\n\n## Standard Parte 2\n\nT\nPor Tulio Faria • 24 de julho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nPara complementar o hands-on que fizemos sobre [Standard](https://www.devpleno.com/standard-parte-1/), vou passar mais duas dicas sobre a ferramenta. A primeira é uma biblioteca que se chama Snazzy e a segunda é uma forma de automatizar a formatação do código fonte.\n\nImagine o seguinte, você tem um código gigante que precisa passar para o Standard, o que podemos fazer? Vamos lá:\n\nstandard --fix script.js\nCom isso ele já corrigiu o arquivo fonte. Podemos utilizar para formatar automaticamente, eu não uso tanto para formatar dependendo do arquivo porque eu gosto de corrigir para não errar novamente. O segundo módulo se chama Snazzy. Primeiramente vamos instalar:\n\nnpm install -g snazzy\nSe rodarmos Standard no nosso código, percebemos que é bem difícil de entender ou achar onde está o problema, então se fizermos:\n\nstandard | snazzy\nEle vai organizar os erros da seguinte forma:\n\nEle formata as saídas falando os problemas do código de forma organizada, então temos um erro na linha 1 no caracter 6, na linha 2 também, no caracter 6; e na linha 3, o caracter 1, todos eles explicando os erros.\n\nEu geralmente uso o Snazzy, dou uma olhada no arquivo, se não for nada muito grave, uso o —fix para corrigir o arquivo. Recomendo que façam isso também, porque talvez alguma alteração pode atrapalhar seu código.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Standard%20Parte%202&url=https%3A%2F%2Fdevpleno.com%2Fstandard-parte-2) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fstandard-parte-2)",
      "description": "Para complementar o handson que fizemos sobre Standard, vou passar mais duas dicas sobre a ferramenta. A primeira é uma biblioteca que se chama Snazzy e a ...",
      "keywords": [
        "standard",
        "para",
        "https",
        "snazzy",
        "digo",
        "parte",
        "arquivo",
        "javascript",
        "devpleno",
        "forma"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/standard-parte-2"
      }
    },
    {
      "id": "abfc38e59345bd40",
      "url": "https://devpleno.com/blog/ha-e-as/index",
      "title": "HA e AS em Aplicação Web - Web Basic (Part 1)",
      "content": "Hoje vamos continuar com mais alguns conceitos de uma Aplicação WEB que são muito importantes quando falamos de Startups, onde temos um poder de escala muito grande. São duas siglas, HA e AS:\n\nHA = High Availabilty (alta disponibilidade);\n\nAS = Auto Scale (Escala automática).\n\n**O que esses conceitos querem dizer na prática?**\n\nA alta disponibilidade quer dizer que o sistema praticamente não cai ou vai ter a disponibilidade mais alta possível, assim o sistema não fica offline nenhum segundo sequer porque caso tenhamos uma escala de clientes muito grande, se ficarmos 10 segundos fora, o prejuízo financeiro que isso vai gerar é muito grande, então a disponibilidade traz dinheiro.\n\nOutro fator para termos essa disponibilidade é o quanto a arquitetura que planejamos tem de elasticidade para suportar o sistema. Vamos supor que eu tenho um servidor que suporte 100 usuários, se tivermos uma carga de 300 usuários, precisamos de 3 servers, então o Auto Scale é uma forma de você escalar a aplicação para termos alta disponibilidade.\n\nEssas duas palavras combinadas é o que nós desejamos para todo o sistema, principalmente em uma startup, que o sistema fique online 100% do tempo e quando se tem picos de acesso o Auto Scaling suporte a elasticidade tanto para cima quanto para baixo, por exemplo, se eu tenho 100 usuários eu uso apenas um servidor, se subir eu aumento o numero de servidores e se baixar novamente, volto para um servidor, aumentando e diminuindo meus recursos computacionais de forma dinâmica. Isso é muito famoso usando a AMAZON, ela já tem ferramentas para esse tipo de dinamismo.\n\nObviamente apenas a alta disponibilidade já envolve muitas coisas, além do auto scaling, talvez precisamos de uma migração com zero down time, por exemplo, caso precisarmos aplicar uma atualização de software, que é um desafio bem grande. Essas duas siglas são muito comuns em requisitos de sistemas para startups.\n\nConfira o video:",
      "keywords": [
        "para",
        "disponibilidade",
        "muito",
        "alta",
        "sistema",
        "grande",
        "auto",
        "embed",
        "escala",
        "duas"
      ],
      "metadata": {
        "title": "HA e AS em Aplicação Web - Web Basic",
        "date": "2017-06-16",
        "tags": "['Fundamentos']",
        "thumbnail": "HaeAs.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/ha-e-as/index.md"
      }
    },
    {
      "id": "ac0e4077663b4c57",
      "url": "https://devpleno.com/como-vender-software",
      "title": "negociação - Como vender um Software - DevPleno (Part 2)",
      "content": "A dica de ouro da negociação: depois que você tem o formato da ideia de preço, nunca tire algo da proposta sem colocar outra. Basicamente é o seguinte, imagine que seu cliente peça um desconto de um software de R$10 mil pagos em quatro vezes, quando isso acontece eu dou desconto, mas se o prazo está curto, por exemplo, eu aumento o prazo, então eu faço por R$8 mil, mas demoro o dobro do tempo. Se ele disser algo como “o que mais você pode fazer por mim?” você vai utilizar essa jogada que funciona muito bem, diga por exemplo, “eu te dou 5% de desconto se você pagar a vista”. Percebam que sempre você está tirando algo para dar outra.\n\nVamos supor que você já negociou com o cliente e está definido o que vai criar, e o cliente vem tentar adicionar uma funcionalidade nova, lembre-se da regra: você coloca algo novo, mas tem que tirar outra. Se adicionar uma funcionalidade nova, diga precisa tirar outra coisa porque não dá para fazer tudo pelo valor que foi negociado. Essa regra de negociação funciona muito bem. Tudo isso você vai construindo quando conhece bem o cliente.\n\nNegociação não é para “sangrar”, sem cobrar muito além do que vale, precisa ser algo justo. Quando eu tenho um potencial cliente que começa a tentar sangrar meu negócio, eu paro de conversar.",
      "description": "Hoje vou complementar um pouco sobre como vender software, mais especificamente sobre negociação. O primeiro ponto que temos que desconstruir é que negocia...",
      "keywords": [
        "para",
        "isso",
        "negocia",
        "muito",
        "cliente",
        "mais",
        "algo",
        "software",
        "outra",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/como-vender-software"
      }
    },
    {
      "id": "ac36db3d52d4ab44",
      "url": "https://devpleno.com/blog/participacao-em-eventos-e-comunidades/index",
      "title": "Participação em Eventos e Comunidades (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "isso",
        "para",
        "eventos",
        "pessoas",
        "evento",
        "comunidade",
        "sobre",
        "importante",
        "youtube",
        "muito"
      ],
      "metadata": {
        "title": "Participação em Eventos e Comunidades",
        "date": "2017-07-19",
        "tags": "['Carreira']",
        "thumbnail": "ParticipacaoEventos.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/participacao-em-eventos-e-comunidades/index.md"
      }
    },
    {
      "id": "ac9682ea1dadee8b",
      "url": "https://devpleno.com/html-estatico-com-templates-ejs",
      "title": "Gerando HTML estáticos a partir de templates – EJS - DevPleno (Part 2)",
      "content": "&#x3C;h1>Teste&#x3C;/h1>\n&#x3C;p>Teste de paragrafo&#x3C;/p>\n&#x3C;ul>\n&#x3C;% items.forEach(i => {%>\n&#x3C;li>&#x3C;%= i %>&#x3C;/li>\n&#x3C;% }) %>\n&#x3C;/ul>\nSe rodarmos novamente o script podemos ver ele processando isso:\n\nPerceba que é muito melhor gerar dessa forma porque deixamos o template isolado. Podemos também importar, por exemplo, o file system e escrever o código em um novo html:\n\nconst ejs = require('ejs')\nconst fs = require('fs')\nejs.renderFile(\n'./templete.ejs',\n{\nitems: ['Tulio', 'Faria']\n},\n(err, html) => {\nfs.writeFile('templete.html', html, (err) => {\nconsole.log('ok')\n})\nconsole.log(html)\n}\n)\nAo rodar, ele gerará um template.html com o código. Caso você queira gerar seu site estático no gitHub, por exemplo, você pode criar alguns templates, configurar um script que manda essas informações para ele, como um json de configuração, depois disso criar um outro script que chama o ghpages, que publica esse site.\n\nEssas são algumas dicas para utilizar no portfólio, sem usar um módulo ou um sistema já existente. Deixe suas dúvidas e sugestões nos comentários.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Gerando%20HTML%20est%C3%A1ticos%20a%20partir%20de%20templates%20%E2%80%93%20EJS&url=https%3A%2F%2Fdevpleno.com%2Fhtml-estatico-com-templates-ejs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhtml-estatico-com-templates-ejs)",
      "description": "Hoje quero mostrar como podemos utilizar os Templates Engines, que já temos no Express como EJS, PUG, etc, para gerar arquivos HTML estáticos. Com esse pro...",
      "keywords": [
        "html",
        "teste",
        "para",
        "template",
        "https",
        "templates",
        "como",
        "podemos",
        "utilizar",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/html-estatico-com-templates-ejs"
      }
    },
    {
      "id": "acc06516d04e458f",
      "url": "https://devpleno.com/blog/operacao-de-busca/index",
      "title": "Árvore Binária de Busca - Operação de Busca (Part 1)",
      "content": "Agora que você já entendeu sobre [Árvore Binária](https://www.devpleno.com/arvore-binaria/) e [Árvore Binária de Busca](https://www.devpleno.com/arvore-binaria-de-busca/), vamos falar sobre a operação de busca.\n\nEstou utilizando o exemplo do exercício anterior de árvores binárias. Nós sabemos que a árvore binária tem uma regra de inserção, então podemos esperar algumas coisas dela, por exemplo:\n\n```jsx\ninsert(arvore, 10)\n//console.log(arvore)\ninsert(arvore, 11)\n//console.log(arvore)\ninsert(arvore, 9)\n//console.log(arvore)\n//insert(arvore, 8)\nconsole.log(arvore)\nfunction seach(tree, value){\n    if(!tree.value || tree.value === value){\n        return tree.value\n    }\n    if(tree.value < value){\n        return search(tree.left, value)\n    }\n    return serach (tree.right, value)\n\n}\nconsole.log(search(arvore, 10)\n```\n\nCriamos um search onde passamos uma árvore para ela e quero buscar um valor. Sabemos que se o valor dessa árvore não existir, temos que retornar undefined ou se a árvore for igual ao valor que estou buscando, vou retornar o valor. Caso contrário, se o valor que estou buscando for menor que o nó atual, ele deve estar do lado esquerdo, então vamos buscar o valor apenas no lado esquerdo e por último, se for maior, procuramos do lado direito.\n\nPerceba que encontrou o 10, pois ele tinha na árvore. Se procurarmos um valor que não está na árvore, será retornado o undefined.\n\nEla sempre dividirá o problema em dois, então ao pensarmos na complexidade do código, é o contrário de termos um 'for' dentro do outro. Como ele sempre divide em dois, no pior caso, o nosso algoritmo é 0(raiz(n)) então se tivermos 25 elementos, teremos mais ou menos 5 comparações, no nosso caso que temos 4, vamos ter 2 comparações. É algo muito rápido, logo a complexidade do algoritmo é 0(log n) que é uma performance muito boa para um algoritmo de busca. O search é o mais importante das árvores, não é atoa que se chama de busca.",
      "keywords": [
        "arvore",
        "rvore",
        "value",
        "tree",
        "valor",
        "busca",
        "https",
        "console",
        "devpleno",
        "insert"
      ],
      "metadata": {
        "title": "Árvore Binária de Busca - Operação de Busca",
        "date": "2017-07-04",
        "tags": "['Algoritmos']",
        "thumbnail": "ArvoreBinaria.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/operacao-de-busca/index.md"
      }
    },
    {
      "id": "ad09c558aa8000ff",
      "url": "https://devpleno.com/formatos-de-troca-de-dados",
      "title": "Formatos de troca de dados em Aplicações Web - DevPleno (Part 2)",
      "content": "Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Formatos%20de%20troca%20de%20dados%20em%20Aplica%C3%A7%C3%B5es%20Web&url=https%3A%2F%2Fdevpleno.com%2Fformatos-de-troca-de-dados) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fformatos-de-troca-de-dados)",
      "description": "Hoje vamos continuar falando sobre arquitetura de uma aplicação WEB, mais especificamente sobre os formatos de troca de dados entre backend e frontend. Lem...",
      "keywords": [
        "dados",
        "para",
        "name",
        "https",
        "formatos",
        "troca",
        "tulio",
        "quando",
        "requisi",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/formatos-de-troca-de-dados"
      }
    },
    {
      "id": "ad1635900cb2c5bc",
      "url": "https://devpleno.com/desenvolvedor-full-stack-o-que-e-e-como-se-tornar",
      "title": "Desenvolvedor Full Stack: o que é e como se tornar? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Desenvolvedor Full Stack: o que é e como se tornar?\n\nT\nPor Tulio Faria • 7 de junho de 2017\n\n[Carreira](/tag/carreira)\n\nCada vez mais a figura do desenvolvedor Full Stack ganha espaço em empresas de TI e desenvolvimento de software. Esse perfil profissional que combina as habilidades de front end e back end é cada vez mais procurado porque, além de poder cobrir qualquer espaço em um time de desenvolvimento, ele é capaz de enxergar o processo de produção como um todo. Se tornar um desenvolvedor Full Stack pode parecer um desafio tão grande que às vezes é até desencorajador: se já não é fácil ser um dev front-end ou back-end, dominar as duas camadas então seria impossível. Mas na verdade, ter visão holística do Full Stack não é tão complicado quanto parece: neste artigo, vamos explicar melhor o que é um dev Full Stack e o que é preciso fazer para se tornar um deles. Boa leitura!\n\n## O que é um desenvolvedor Full Stack?\n\nEm algumas empresas ainda é muito usual dividir os desenvolvedores de softwares em duas categorias: os especialistas em front-end, que lidam com interfaces e a experiência do usuário e os de back end que trabalham com a camada mais profunda do código, além de outras tarefas como as integrações com bancos de dados. Só que essa especialização intensa começou a ser problemática em alguns casos, porque como os devs eram muito especializados nas funções específicas dos seus times, faltava alguém capaz de enxergar toda a produção como algo único e integrar melhor essas duas camadas do desenvolvimento. E é aí que entra o desenvolvedor Full Stack: um profissional capaz de trabalhar tanto no front-end quanto no back-end, com uma visão holística do processo. Esse perfil profissional é útil tanto em organizações que não dividem os times de forma tão direta quanto em empresas mais modernas, que esperam dos seus colaboradores um conjunto de competências variadas e versatilidade.\n\n## Como se tornar um desenvolvedor Full Stack?",
      "description": "Cada vez mais a figura do desenvolvedor Full Stack ganha espaço em empresas de TI e desenvolvimento de software. Esse perfil profissional que combina as ha...",
      "keywords": [
        "full",
        "stack",
        "desenvolvedor",
        "como",
        "tornar",
        "front",
        "back",
        "para",
        "profissional",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/desenvolvedor-full-stack-o-que-e-e-como-se-tornar"
      }
    },
    {
      "id": "ad299b814379f972",
      "url": "https://devpleno.com/socket-io-parte1",
      "title": "Comunicação em tempo-real com Node e Socket.io - DevPleno (Part 2)",
      "content": "const app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\napp.get('/', (req, res) => {\nres.sendFile(\n\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_dirname + '/index.html'\n)\n})\nMas não temos o index.html, certo? Então vamos criar um novo arquivo index.html, dentro dele você vai perceber algo interessante do socket.io, ele é um módulo que já vem com a parte server e a parte client, com isso é possível fazer um src chamando o socket.io. Irá funcionar porque já injetamos no http para disponibilizar na aplicação. Em seguida vamos instanciar o módulo\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;h1>Socket.io&#x3C;/h1>\n&#x3C;script src='/socket.io/socket.io.js'>&#x3C;/script>\n&#x3C;script>const socket = io()&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nSe olharmos no inspect do browser e irmos em network, podemos perceber que ele já começou uma conexão e websocket. Assim, podemos saber, por exemplo, se algum cliente conectou apenas adicionando no server.js um callback para quando ele se conectar:\n\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\napp.get('/', (req, res) => {\nres.sendFile(\n\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_dirname + '/index.html'\n)\n})\nio.on('connection', (socket) => {\nconsole.log('New connection', socket)\n})\n**O que aconteceu?**\n\nO Socket.io tem o socket que é uma instância da conexão que criamos para o usuário, com isso podemos mandar uma mensagem de volta, logar o usuário por exemplo. Basicamente se eu mandar algo para este socket, esse algo irá somente para este cliente. Mas temos opções no socket.io de mandar só para um cliente ou vários.",
      "description": "O que é Socket.io e para que vamos precisar dele? Socket.io é uma implementação em node para web socket, ou seja, uma forma de fazer comunicação em tempo r...",
      "keywords": [
        "socket",
        "para",
        "http",
        "const",
        "require",
        "vamos",
        "html",
        "express",
        "temos",
        "conex"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/socket-io-parte1"
      }
    },
    {
      "id": "ad31008157c4462a",
      "url": "https://devpleno.com/dados-ficticios-para-testes",
      "title": "Faker - Como gerar grandes massas de dados fictícios para testes - DevPleno (Part 1)",
      "content": "Javascript\n\n## Faker - Como gerar grandes massas de dados fictícios para testes\n\nT\nPor Tulio Faria • 16 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nO Faker é um módulo do Node que usamos para gerar dados fictícios para testes, como para popular um banco de dados, por exemplo. Isso é muito útil quando queremos gerar uma grande massa de dados e estamos sem criatividade para gerá-la. Além disso, ele evita a utilização de dados que pareçam reais, pois eles podem gerar algum desconforto posteriormente. A primeira coisa que você precisa fazer é instalar o módulo:\n\nyarn add faker\nVamos criar um arquivo novo. (No meu caso, usarei o nome gen-data.js, mas pode ser qualquer nome que lhe agrade).* :) Dentro dele faremos o seguinte código:\n\nconst faker = require('faker')\n\nconsole.log(faker.name.firstName(), faker.name.lastName())\nNeste código, primeiro vamos importar o módulo Faker. (Perceba que nele existem vários tipos de dados: nome, phone, random, image, etc). Vamos importar o nome por exemplo. Irá aparecer mais tipos de dados como firstName, lastName, jobArea, entre outros. Salvamos e rodamos no Node, ele nos dará um Nome e um Sobrenome aleatório. Podemos pedir para o Faker fazer isso várias vezes gerando, assim, uma grande massa de dados sem que tenhamos tanto trabalho para popular um banco de dados. Veja o exemplo abaixo.\n\nconst faker = require('faker')\n\nfor (let i = 0; i &#x3C; 10; i++)\nconsole.log(faker.name.firstName(), faker.name.lastName())\nO Faker gera uma série dados interessantes, como:\n\nconsole.log(faker.helpers.createCard())\nQue irá gerar uma lista com todos os dados de uma pessoa fictícia. Outro exemplo poderia ser:\n\nconsole.log(faker.internet.avatar())\nNele, o Faker busca uma imagem aleatória como avatar.\n\nIsso é diferente de gerar o loren y, pois nele geralmente há um formato padrão que começa sempre com “loren y”, o que não fica muito interessante para nomes.",
      "description": "O Faker é um módulo do Node que usamos para gerar dados fictícios para testes, como para popular um banco de dados, por exemplo. Isso é muito útil quando q...",
      "keywords": [
        "faker",
        "dados",
        "para",
        "gerar",
        "https",
        "como",
        "testes",
        "nome",
        "exemplo",
        "console"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/dados-ficticios-para-testes"
      }
    },
    {
      "id": "ad7b66ae8db49fe9",
      "url": "https://devpleno.com/blog/servidor-de-arquivos/index",
      "title": "Servidor de arquivos e sistemas locais com HTTPS",
      "content": "Neste vídeo, vou mostrar como servir arquivos estáticos de forma simples e ainda como expor um servidor local de testes para a internet utilizando uma conexão segura (HTTPS).\n\nPerfeito para testes de webhooks ou de APIs do HTML5 que precisam de HTTPS para funcionar.\n\nPara baixar o ngrok: [https://ngrok.com](https://ngrok.com)\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/n_hWce2qxN4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "https",
        "para",
        "embed",
        "ngrok",
        "responsive",
        "como",
        "testes",
        "classname",
        "iframe",
        "youtube"
      ],
      "metadata": {
        "title": "Servidor de arquivos e sistemas locais com HTTPS",
        "date": "2016-08-07",
        "tags": "['Javascript']",
        "thumbnail": "ServidorArquivos.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/servidor-de-arquivos/index.md"
      }
    },
    {
      "id": "ada009e019e842a7",
      "url": "https://devpleno.com/horario-de-trabalho-na-toptal",
      "title": "Horário de trabalho na toptal - DevPleno",
      "content": "Carreira\n\n## Horário de trabalho na toptal\n\nT\nPor Tulio Faria • 15 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nVocê também tem dúvida sobre como é o horário de trabalho quando se trabalha remotamente? Descubra como é na Toptal.\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\nSaiba mais\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hor%C3%A1rio%20de%20trabalho%20na%20toptal&url=https%3A%2F%2Fdevpleno.com%2Fhorario-de-trabalho-na-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhorario-de-trabalho-na-toptal)",
      "description": "Você também tem dúvida sobre como é o horário de trabalho quando se trabalha remotamente? Descubra como é na Toptal. <div className=&#34;embedresponsive embedr...",
      "keywords": [
        "toptal",
        "https",
        "trabalho",
        "carreira",
        "mais",
        "profissionais",
        "como",
        "reactjs",
        "blog",
        "2fdevpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/horario-de-trabalho-na-toptal"
      }
    },
    {
      "id": "adb1c9c78240dff5",
      "url": "https://devpleno.com/hrn0012019aula2",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /hrn0012019aula2 to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "https",
        "devpleno",
        "devreactjs",
        "redirecting",
        "from",
        "hrn0012019aula2"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hrn0012019aula2"
      }
    },
    {
      "id": "adbfc12b3f991b28",
      "url": "https://devpleno.com/blog/algoritmo-3n-1/index",
      "title": "Algoritmos: Problema 3n+1",
      "content": "Criando a solução em Javascript para o Problema 3n+1.Neste post continuamos a série de conteúdos sobre algoritmos. Principalmente sobre tipos de algoritmos que são utilizados em competições de programação e em entrevistas de emprego. O Problema 3n+1 foi retirado do livro Programming Challenges de Miguel Skiena. O objetivo do algoritmo é, dado i e j, como um intervalo de início e fim, achar o maior ciclo. O processo começa processando os valores de n. Se n é um número par, o próximo valor de n será n /2. Caso n seja impar, o próximo valor de n será 3 \\* n + 1. O algoritmo termina em n = 1. A ideia é calcular o número de passos até que n seja 1. Fazendo este processo entre i e j, e achando o maior número. Neste vídeo, explico um pouco melhor como funciona o algoritmo e como ele foi resolvido.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/voV5OBCqlVs\" allowfullscreen></iframe>\n</div>\n\n[Veja no meu Gist](https://gist.github.com/tuliofaria/a92d387b68931d1294fddb1c4e259723)\n\nNão deixe de comentar com sua opinião, sugestão ou dúvida! E cadastre seu e-mail para receber nossas últimas novidades. Abraços!\n\nE aqui o algoritmo completo:\n\n```js\n{\n  function cycleLen(n) {\n    let steps = 1\n    while (n !== 1) {\n      if (n % 2 === 0) {\n        n = n / 2\n      } else {\n        n = 3 * n + 1\n      }\n      steps++\n    }\n    return steps\n  }\n  function maxCycle(i, j) {\n    let max = cycleLen(i)\n    for (let k = i + 1; k <= j; k++) {\n      let currentCycle = cycleLen(k)\n      if (currentCycle > max) {\n        max = currentCycle\n      }\n    }\n    return i + ' ' + j + ' ' + max\n  }\n  console.log(maxCycle(1, 10))\n  console.log(maxCycle(100, 200))\n  console.log(maxCycle(201, 210))\n  console.log(maxCycle(900, 1000))\n}\n```\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "maxcycle",
        "algoritmo",
        "https",
        "console",
        "para",
        "como",
        "mero",
        "embed",
        "youtube",
        "cyclelen"
      ],
      "metadata": {
        "title": "Algoritmos: Problema 3n+1",
        "date": "2017-02-19",
        "tags": "['Algoritmos']",
        "author": "Tulio Faria",
        "thumbnail": "ALG.-3n-790x400.png",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/algoritmo-3n-1/index.md"
      }
    },
    {
      "id": "adbfeebf706be67d",
      "url": "https://devpleno.com/reconhecimento-facial-com-js",
      "title": "Reconhecimento facial com JS - DevPleno (Part 2)",
      "content": "&#x3C;body>\n&#x3C;video\nid='video'\nwidth='320'\nheight='240'\npreload\nautoplay\nloop\nmuted\n>&#x3C;/video>\n&#x3C;canvas id='canvas' width='320' height='240'>&#x3C;/canvas>\n&#x3C;script rsc='tracking-min.js'>&#x3C;/script>\n&#x3C;script rsc='data/face-min.js'>&#x3C;/script>\n&#x3C;/body>\nAgora vamos começar realmente a fazer esse tracking do rosto. Quando carregarmos a página, vamos chamar a função init que vai ter nosso vídeo, canvas um contexto para o canvas e um tracker, que é nosso rastreador em específico:\n\n&#x3C;script>\nfunction init(){\nconst video = document.getElementById('video')\nconst canvas = document.getElementById('canvas')\nconst context = canvas.getContext('2d')\nconst tracker = new traking.ObjectTracker('face')\n}\nwindow.onload = init()\n&#x3C;/script>\nAgora podemos mandar rastrear a tag vídeo utilizando a câmera. Fazendo isso, eu consigo enviar um event:\n\ntracking.track('#video', tracker, { camera: true })\ntracker.on('track', (event) => {\nconsole.log(event)\n})\nAo dar F5 no browser e acessar o F12, percebam que ele muda à medida que o rosto se mexe dentro do limite que escolhemos, com isso vamos desenhar em cima do canvas:\n\n&#x3C;script>\nfunction init(){\nconst video = document.getElementById('video')\nconst canvas = document.getElementById('canvas')\nconst context = canvas.getContext('2d')\nconst tracker = new traking.ObjectTracker('face')\ntracking.track('#video', tracker, {camera: true})\ntracker.on('track', event => {\nconsole.log(event)\ncontext.clearRect(0,0,canvas.width, canvas.height )\nevent.data.foEach( rect => {\nconsole.log(rect)\n})\n})\n}\nwindow.onload = init()\n&#x3C;/script>\nO retângulo já está lá reconhecendo a cabeça ao se mexer, porém ainda não conseguimos visualizar ele.\n\nEntão, para cada retângulo reconhecido, vamos desenhar ele na tela:",
      "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
      "keywords": [
        "rect",
        "canvas",
        "vamos",
        "para",
        "script",
        "context",
        "video",
        "width",
        "const",
        "event"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/reconhecimento-facial-com-js"
      }
    },
    {
      "id": "ae0e57575f7053bc",
      "url": "https://devpleno.com/blog/por-que-tudo-na-vida-acontece-2x/index",
      "title": "Por que tudo na vida acontece 2x?",
      "content": "No vídeo anterior, falamos que os pensamentos limitantes nos atrapalham a alcançar resultados. Neste vídeo, falo sobre como fazer o oposto disso.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/MUqyTezv0ts\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "anterior",
        "falamos"
      ],
      "metadata": {
        "title": "Por que tudo na vida acontece 2x?",
        "date": "2016-08-14",
        "tags": "['Carreira']",
        "thumbnail": "TudoAcontece2x.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/por-que-tudo-na-vida-acontece-2x/index.md"
      }
    },
    {
      "id": "ae244fbc1921a130",
      "url": "https://devpleno.com/bind",
      "title": "Bind - Altere comportamento e contexto de execução de suas funções - DevPleno (Part 2)",
      "content": "console.log(func2('param2'))\nAo executar, ele vai chamar o paramfixo e param2, então eu consigo criar novas funções que tenham um valor fixo, isso também é conhecido como funções parciais. Podemos utilizar por exemplo para criar funções que filtram determinados valores em um filter.\n\nUtilizamos bastante o bind quando estamos criando um componente em react utilizando as classes em ES6 por causa dessa característica dela não ter o bind automático para this.\n\nUma coisa interessante é que quando você dá o bind, tem que estar ciente de que está alterando alguma coisa do estado atual do seu componente. Quando estamos tentando cada vez mais programação funcional, mesmo que seja alguns métodos do componente, a ideia é que elas se transformem em funções puras, então sempre que se deparar tendo que criar um bind para o método, precisa checar se realmente é necessário, porque muitas vezes conseguimos fazer isso sem o bind. Quando isso é possível, fazemos uma função pura, então a testabilidade do código fica melhor porque ela não depende de nada do contexto.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Bind%20-%20Altere%20comportamento%20e%20contexto%20de%20execu%C3%A7%C3%A3o%20de%20suas%20fun%C3%A7%C3%B5es&url=https%3A%2F%2Fdevpleno.com%2Fbind) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fbind)",
      "description": "O que é um bind em JavaScript? Para mostrar uma das utilidades do bind, eu criei um pequeno exemplo: Eu tenho um objeto literal que cria um contexto novo. ...",
      "keywords": [
        "bind",
        "getvalor",
        "quando",
        "para",
        "valor",
        "contexto",
        "this",
        "modulo",
        "console",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/bind"
      }
    },
    {
      "id": "ae26afa6b1102333",
      "url": "https://devpleno.com/tag/fundamentos/4",
      "title": "Fundamentos - Pagina 4 - DevPleno",
      "content": "Fundamentos\n\n## Arquivo de Insights\n\n56 posts encontrados com a tag Fundamentos\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Fundamentos 19 de mai. de 2017 Formatos de troca de dados em Aplicações Web](/formatos-de-troca-de-dados)\n\n[Fundamentos 15 de mai. de 2017 Web Basic - RESTful](/o-que-e-restful)\n\n[Fundamentos 12 de mai. de 2017 Aplicação Web - Entendendo Back-end e Front-end](/aplicacao-web)\n\n[Javascript 8 de mai. de 2017 Listar arquivos em JS (async, await, promise e Promise.all)](/listar-arquivos-em-js)\n\n[Javascript 5 de mai. de 2017 ES6 - Async/Await](/async-await)\n\n[Javascript 5 de mai. de 2017 Testando o Spread Operator: Novidade do ES6](/spread-operator)\n\n[Javascript 4 de mai. de 2017 Promisify-Node: Convertendo funções clássicas do Node em Promises](/promisify-node)\n\n[Javascript 7 de abr. de 2017 High-order Functions](/high-order-functions)\n\n[Javascript 4 de abr. de 2017 Dica: Injeção de Dependência no ReactJS](/dica-injecao-de-dependencia-no-reactjs)\n\n[Javascript 23 de mar. de 2017 Dica: Self-Invoked Function (Self-invoking Function)](/dica-self-invoked-function-self-invoking-function)\n\n[Javascript 7 de mar. de 2017 Dica: Injeção de dependência com Destructuring Assignament](/dica-injecao-de-dependencia-com-destructuring-assignament)\n\n[Javascript 3 de mar. de 2017 Pure Functions (Funções Puras)](/pure-functions-funcoes-puras)\n\n[Anterior](/tag/fundamentos/3)4 / 5[Próxima](/tag/fundamentos/5)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "fundamentos",
        "dica",
        "reactjs",
        "functions",
        "self",
        "function",
        "async",
        "await"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/fundamentos/4"
      }
    },
    {
      "id": "ae4bb4d624d6f3a0",
      "url": "https://devpleno.com/blog/precificacao-de-softwares-voce-sabe-como-fazer/index",
      "title": "Precificação de softwares: você sabe como fazer? (Part 2)",
      "content": "Além dos pontos mencionados acima, há critérios mais específicos que ajudam a compor o valor final a ser cobrado, seja por software ou por pacotes mensais. São eles:\n\n### Tempo\n\nA primeira coisa a pensar é o tempo gasto para a produção de um programa. Isso geralmente é calculado em valor/hora, pois facilita a mensuração de quanto o profissional deve ganhar por dia e semana para compor o seu salário. Além disso, durante a produção de uma solução, você basicamente comercializará o seu tempo e seus conhecimentos.\n\nPara definir o seu valor/hora você precisa avaliar o seu nível de experiência e seus conhecimentos. Por exemplo, um profissional júnior pode produzir até três vezes menos do que um de nível pleno, o que significa que o segundo poderá ganhar o triplo dele.\n\nAlém disso, é preciso contabilizar o grau de urgência do projeto a ser desenvolvido, pois quanto menor o prazo, maior é o valor a ser cobrado por hora.\n\n### Disponibilidade\n\nA sua disponibilidade também deve entrar na conta, principalmente se você é constantemente requisitado para muitos projetos. É a chamada lei de oferta e demanda: se há grande procura pelos seus serviços, você consegue aumentar mais o seu preço. Quando houver baixa demanda, então é indicado reduzir um pouco seus valores.\n\nNesse ponto, há um porém: existem momentos em que há poucos projetos, mas porque são períodos de transição de trabalhos.\n\n### Nível de experiência\n\nCada tipo de projeto exige um nível de experiência para que seja conduzido corretamente. Por exemplo, uma página de HTML pode necessitar de um profissional com menos experiência do que um software que exija um analista de dados, o qual terá de empregar estatística, matemática, programação e outros conhecimentos no projeto.",
      "keywords": [
        "para",
        "software",
        "valor",
        "como",
        "mais",
        "tamb",
        "seus",
        "ncia",
        "trabalho",
        "hora"
      ],
      "metadata": {
        "title": "Precificação de softwares: você sabe como fazer?",
        "date": "2017-06-28",
        "tags": "['Carreira']",
        "thumbnail": "Precificacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "blog/precificacao-de-softwares-voce-sabe-como-fazer/index.md"
      }
    },
    {
      "id": "ae84f28c5add7cbc",
      "url": "https://devpleno.com/blog/como-encadear-promises/index",
      "title": "Como encadear promises (Part 1)",
      "content": "Na dica de hoje, vamos continuar falando sobre promises. Vou mostrar um detalhe na promise que é bastante interessante: como podemos encadear promises, ou seja, vincular uma promise à outra.\n\nPara poder fazer isso funcionar, vamos começar importando nosso tão usado FS, já que ele é sempre uma chave para isso e em seguida vamos criar uma função readFile, que vai ser uma arrow function. Nós passamos para ele um path de um arquivo e ele vai retornar uma promise nova:\n\n```jsx\nconst fs = require('fs')\n\nconst readFile = (file) => {\n  return new Promise((resolve, reject) => {\n    fs.readFile(file, (err, contents) => {\n      if (err) {\n        reject(err)\n      } else {\n        resolve(contents.toString())\n      }\n    })\n  })\n}\n```\n\nConsideramos que quem vai receber o conteúdo da nova promise queira esse conteúdo em string. Vamos fazer também um writeFile, que também irá passar um file, e um contents, que vai retornar uma nova promise:\n\n```jsx\nconst writeFile = (file, contents) => {\n  return new Promise((resolve, reject) => {\n    fs.writeFile((file, contents), (err) => {\n      if (err) {\n        reject(err)\n      } else {\n        resolve()\n      }\n    })\n  })\n}\n```\n\nO nosso problema agora é que precisamos ler um arquivo e passar para o write, então precisamos fazer o seguinte:\n\n```jsx\nreadFile('promises.js').then((contents) => console.log(contents))\n```\n\nAo mandar rodar o arquivo, perceba que ele retorna o nosso código em string, a vantagem disso é que agora conseguimos 'encavalar' uma promise depois da outra. A primeira alternativa que temos é utilizar o then dessa forma, então precisamos colocar o próprio writeFile:\n\n```jsx\nreadFile('promises.js').then((contents) => writeFile('tst.js', contents))\n```\n\nEssa é a primeira maneira que temos de encadear as promises. Ao rodar o arquivo, perceba que foi criado um tst.js como queríamos. A segunda forma é colocarmos encadeado realmente:\n\n```jsx\nreadFile('promises.js').then(writeFile('tst.js', contents))\n```",
      "keywords": [
        "contents",
        "promises",
        "promise",
        "para",
        "fazer",
        "then",
        "readfile",
        "writefile",
        "isso",
        "arquivo"
      ],
      "metadata": {
        "title": "Como encadear promises",
        "date": "2017-08-31",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ENCADEAR-PROMISES-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/como-encadear-promises/index.md"
      }
    },
    {
      "id": "ae8a35c991d75707",
      "url": "https://devpleno.com/socket-io-parte2",
      "title": "Hands-on - Socket.io Parte 2 - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on - Socket.io Parte 2\n\nT\nPor Tulio Faria • 12 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)\n\nContinuando nossa série sobre Socket.io, vamos aprofundar um pouco mais no assunto. Lembrando nosso código do lado server:\n\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\napp.get('/', (req, res) => {\nres.sendFile(__dirname + '/index.html')\n})\nio.on('connection', (socket) => {\nconsole.log('New connection', socket.id)\n})\nhttp.listen(3000, function () {\nconsole.log('listening on port 3000')\n})\nSimplesmente estávamos tratando a conexão, então se o cliente conectou, isso nos era mostrado, além do ID da conexão. (Lembrando que cada Socket criado tem um ID diferente. Mesmo que o cliente abra duas abas com links da mesma sessão, elas são tratadas separadamente).*\n\nVamos abrir o cliente e adicionar o Jquery _(apenas procure no Google jquery CDN, copiar a url e adicionar em source) e e_m seguida adicionar um socket.on. Com isso, sabemos do lado do cliente que foi conectado.\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;h1>Socket.io&#x3C;/h1>\n&#x3C;script src='/socket.io/socket.io.js'>&#x3C;/script>\n&#x3C;script src='https://code.jquery.com/jquery-3.2.1.min.js'> &#x3C;/script>\n&#x3C;div id='msgs'>&#x3C;/div>\n&#x3C;script>\nconst socket = io() socket.on('connect', function()\n{$('msgs').append('connected with id: ' + socket.id + '&#x3C;br>')}\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\n**E como isso será notificado?**\n\nPerceba que criamos uma DIV msgs para podermos colocar as mensagens dentro a medida que recebemos. Quando o cliente conectar nosso div msgs, irá chamar o append e mostrar a conexão com o ID utilizado. Assim, podemos, por exemplo, identificar o usuário baseado nesta conexão.\n\n**O que podemos fazer?**",
      "description": "Continuando nossa série sobre Socket.io, vamos aprofundar um pouco mais no assunto. Lembrando nosso código do lado server: Simplesmente estávamos tratando ...",
      "keywords": [
        "socket",
        "script",
        "cliente",
        "lado",
        "function",
        "msgs",
        "para",
        "https",
        "connected",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/socket-io-parte2"
      }
    },
    {
      "id": "ae8cfaf9321ddb80",
      "url": "https://devpleno.com/blog/6",
      "title": "Blog - Página 6 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 26 de set. de 2017 Promise Race - Qual promise resolve/rejeita primeiro](/promise-race)\n\n[Carreira 26 de set. de 2017 Descrição das vagas de emprego no Brasil x no exterior](/vagas-de-emprego-no-brasil-e-no-exterior)\n\n[Javascript 22 de set. de 2017 Gerando HTML estáticos a partir de templates – EJS](/html-estatico-com-templates-ejs)\n\n[Javascript 21 de set. de 2017 Diferença entre as programações Orientação-objetos, Imperativa e Funcional](/orientacao-objetos-imperativa-e-funcional)\n\n[Carreira 19 de set. de 2017 Falta tempo para realizar aquele projeto?](/falta-de-tempo)\n\n[Javascript 19 de set. de 2017 Sou contra a orientação-objetos (OO)?](/orientacao-objeto)\n\n[Fundamentos 15 de set. de 2017 Como testar domínios localmente](/como-testar-dominios-localmente)\n\n[Javascript 11 de set. de 2017 Dica: Debug NodeJS com Chrome DevTools](/dica-debug-nodejs-com-chrome-devtools)\n\n[Javascript 11 de set. de 2017 ChalkJS - Deixe as saídas de seu console.log coloridas e com estilo](/hands-on-chalkjs)\n\n[Javascript 8 de set. de 2017 Servidor JSON simples em PHP (parte 1)](/servidor-json-simples-em-php-parte-1)\n\n[Carreira 8 de set. de 2017 Tudo na vida acontece duas vezes!](/tudo-acontece-duas-vezes)\n\n[Fundamentos 6 de set. de 2017 Entenda sobre CORS - Cross Origin Resource Sharing](/entenda-sobre-cors-cross-origin-resource-sharing)\n\n[Anterior](/blog/5)6 / 26[Próxima](/blog/7)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "carreira",
        "fundamentos",
        "nodejs",
        "blog",
        "promise",
        "objetos",
        "todos",
        "para"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/6"
      }
    },
    {
      "id": "ae94fc233792c224",
      "url": "https://devpleno.com/blog/dica-e-algoritmo-xor-e-odd-occurences-array/index",
      "title": "Dica e Algoritmo: XOR e Odd Occurences in Array",
      "content": "Neste vídeo você vai entender como melhorar a performance do algoritmo Odd Occurrences in Array com o operador XOR. Confira! Deixe suas dúvidas e sugestões nos comentários.\n\nNão se esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno/), [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder as novidades. Abraços!\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/68hCa3SY2aM\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "embed",
        "https",
        "responsive",
        "devpleno",
        "facebook",
        "youtube",
        "classname",
        "iframe",
        "neste",
        "entender"
      ],
      "metadata": {
        "title": "Dica e Algoritmo: XOR e Odd Occurences in Array",
        "date": "2017-03-27",
        "tags": "['Algoritmos']",
        "thumbnail": "XOR-e-Odd-Occurences-in-Array-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-e-algoritmo-xor-e-odd-occurences-array/index.md"
      }
    },
    {
      "id": "aebdd8581bd998ef",
      "url": "https://devpleno.com/blog/tecnica-para-alcancar-seus-objetivos/index",
      "title": "Técnica para eliminar o que não te faz alcançar seus objetivos (Part 1)",
      "content": "Hoje eu gostaria de compartilhar uma dica bem rápida, basicamente de como você pode, de uma maneira bem fácil, evoluir na sua vida, seja ela financeira, organização ou saúde e alcançar seus objetivos.\n\nEu venho fazendo isso há algum tempo, mas não tinha racionalizado sobre esse processo. É algo muito simples: vamos supor que você trabalha como freelancer e quer melhorar sua parte financeira, então você vai organizar isso como projeto 1, projeto 2, empresa 1, empresa 2, horas gastas e quanto isso vai dar de retorno financeiro. Feito isso, você vai ordenar do que te dá mais lucro para o que dá menos lucro.\n\nO passo primordial é que depois de ordenado, você vai pegar 20% dessas atividades que não te dão o resultado que você quer e vai cortar da lista para abrir espaço na sua agenda para que coisas novas e melhores possam acontecer.\n\nEu venho fazendo isso de forma irracional há mais ou menos 8 meses, o resultado é muito bom. Além disso, podemos usar como exemplo para complementar essa ideia, a dica sobre falar NÃO quando necessário. Por exemplo, um projeto que pague bem, mas não te dá lucro é puro risco, imagine um projeto que te pague R$10mil por mês e você tem que contratar uma pessoa, pagar gastos e no final esse projeto te gera 500 reais de lucro... Ele te dá prejuízo pelo fato do lucro ser pequeno e o risco ser grande.\n\nHoje em dia, temos que escolher como queremos viver, escolher o que queremos fazer, o que dá mais resultado, e pessoas que nos agregam coisas boas. Pessoas tóxicas sugam a nossa energia, comece a listar esse tipo de pessoa e corte da sua vida também.\n\nVocê vai perceber que isso faz muito sentido. Novamente, eu venho fazendo isso de forma consistente e o resultado é incrível. Coisas que eu não pensava que eu ia fazer agora eu estou fazendo como por exemplo pedir para sair de projeto por estar me dando muito estresse ou financeiramente inviável.",
      "keywords": [
        "isso",
        "como",
        "projeto",
        "para",
        "fazendo",
        "lucro",
        "muito",
        "mais",
        "resultado",
        "coisas"
      ],
      "metadata": {
        "title": "Técnica para eliminar o que não te faz alcançar seus objetivos",
        "date": "2017-08-29",
        "tags": "['Carreira']",
        "thumbnail": "Tecnica20.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/tecnica-para-alcancar-seus-objetivos/index.md"
      }
    },
    {
      "id": "aedae25a0af170c8",
      "url": "https://devpleno.com/blog/generators-o-que-ha-por-baixo-dos-panos/index",
      "title": "Generators: O que há \"por baixo dos panos\" (Part 2)",
      "content": "```jsx\nfunction* generator() {\n  console.log('entrou  no generator')\n  console.log('segundo passo')\n  yield 'outro valor'\n  console.log('penultimo')\n  console.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\ngen.next()\n```\n\nCom isso será retornado os valores em três etapas. Podemos, por exemplo, chamar uma function:\n\n```jsx\nfunction readFilePromise(){\n    return new Promise((resolve, reject) => {\n        setTimeout(() => resolve(10), 2000)\n}\nfunction* generator(){\n    console.log('entrou  no generator')\n    console.log('segundo passo')\n    const value = yield readFilePromise()\n    console.log('penultimo' value)\n    console.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\niteration.value.then((val) =>{\n    gen.next(val)\n}\n```\n\nAfinal, o que o CO faz?\n\nCom ele conseguimos transformar facilmente em uma função generica que resolva qualquer Generator. Por este motivo é interessante resolvermos com Promise, pois se fosse com o ReadFile comum não teríamos este retorno de valor.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/H13rOIqFVPk\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "generator",
        "console",
        "const",
        "function",
        "next",
        "iteration",
        "valor",
        "isso",
        "entrou",
        "segundo"
      ],
      "metadata": {
        "title": "Generators: O que há \"por baixo dos panos\"",
        "date": "2017-05-08",
        "tags": "['Javascript']",
        "thumbnail": "GENERATORS-FUNCTIONS-790x400 (1).png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/generators-o-que-ha-por-baixo-dos-panos/index.md"
      }
    },
    {
      "id": "aee8b5439c56ef21",
      "url": "https://devpleno.com/como-manter-se-motivado",
      "title": "Como manter-se motivado - DevPleno (Part 1)",
      "content": "Carreira\n\n## Como manter-se motivado\n\nT\nPor Tulio Faria • 30 de novembro de 2017\n\n[Carreira](/tag/carreira)\n\nA dica de hoje foi baseada em uma pergunta de um inscrito do canal, a pergunta foi a seguinte:\n\n>\nComo eu consigo me manter motivado a fazer um projeto?\n\nA primeira coisa que precisamos saber e aceitar é que nem sempre vamos ter 100% de motivação, vão haver altos e baixos e isso é normal. Vão existir dias em que você não vai estar conseguindo focar em seu objetivo. O importante é conseguir estar consciente disso e perceber que está fugindo daquilo que é seu objetivo. Quando começar a perceber isso, existem algumas formas de voltar a ter motivação:\n\nEu vou passar dois pontos que eu acredito que fazem bastante diferença. Toda vez que percebo que estou perdendo motivação, eu utilizo dessas técnicas para me motivar.\n\nA primeira delas é a transformação que meu trabalho faz na vida das pessoas, esse é um dos motivos principais que me mantém muito motivado. Por exemplo, você ler isso já é um gatilho motivacional que eu uso para me motivar a fazer cada vez mais coisas. Ache esse seu gatilho e você vai perceber que as chances de perder o foco são menores.\n\nA segunda delas é que quando você está se sentindo um pouco desmotivado, tente fazer algo que te dê uma pequena vitória. Por exemplo, se você não está entendendo uma tecnologia muito complexa e não está conseguindo ver resultado, tente fazer algo com essa tecnologia, nem que seja um ‘olá mundo’, que te dê uma sensação de vitória.\n\nAo invés de focar em um objetivo grande, foque em um pequeno passo naquele objetivo, isso vai te ajuda a manter mais motivado.\n\nEssas duas dicas eu uso para me manter motivado, espero que isso também te ajude a se manter assim.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?",
      "description": "A dica de hoje foi baseada em uma pergunta de um inscrito do canal, a pergunta foi a seguinte:  Como eu consigo me manter motivado a fazer um projeto? A pr...",
      "keywords": [
        "manter",
        "motivado",
        "https",
        "isso",
        "fazer",
        "objetivo",
        "para",
        "carreira",
        "como",
        "motiva"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/como-manter-se-motivado"
      }
    },
    {
      "id": "af394d855e7a1c5e",
      "url": "https://devpleno.com/tag/reactjs/2",
      "title": "ReactJS - Pagina 2 - DevPleno",
      "content": "ReactJS\n\n## Arquivo de Insights\n\n13 posts encontrados com a tag ReactJS\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 23 de nov. de 2016 ReactJS: comentários em JSX](/reactjs-comentarios-em-jsx)\n\n[Anterior](/tag/reactjs)2 / 2\nPróxima",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "reactjs",
        "javascript",
        "algoritmos",
        "carreira",
        "ferramentas",
        "fundamentos",
        "nodejs",
        "2016",
        "arquivo",
        "insights"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/reactjs/2"
      }
    },
    {
      "id": "af3e27cc7414d59c",
      "url": "https://devpleno.com/blog/lista-encadeada-remover-um-no/index",
      "title": "Lista encadeada - Como remover um nó (Part 1)",
      "content": "Nós já falamos sobre alguns métodos, adicionamos itens na lista, criamos nó com [complexidade O(n)](https://www.devpleno.com/lista-encadeada-adicionar-no/) e [O(1)](https://www.devpleno.com/lista-encadeada-adicionar-com-o1/) e agora vamos remover um nó desse nosso algoritmo.\n\nPrimeiro temos que criar um método remove, vamos passar um nó para ele e, baseado nesse nó, ele vai excluir da lista.\n\n```js\nconst remove = (node) => {}\n```\n\nLembrando que em return temos que adicionar o remove:\n\n```js\nreturn{\n    remove(node) => remove(node)\n}\n```\n\nO primeiro cenário que temos é se a lista for igual a null:\n\n```js\nconst remove = (node) => {\n  if (lenght === 0) return\n}\n```\n\nAgora, se o nó for igual ao primeiro nó da minha lista, eu simplesmente vou fazer meu head ser o node.next\n\n```js\nconst remove = (node) => {\n  if (lenght === 0) return\n  if (node === head) {\n    head = node.next\n    return\n  }\n}\n```\n\nAgora temos a parte complexa, afinal já cobrimos a situação em que nossa lista está vazia, remover o primeiro item e agora precisamos remover o item que escolhermos. Vamos imaginar que queremos, por exemplo, excluir o nó 2, temos que pegar o next do nó 1 e apontar para o nó 3, então temos que descobrir quem é o nó 1 para fazermos esse mapeamento:\n\n```js\nconst remove = (node) => {\n  if (lenght === 0) return\n  if (node === head) {\n    head = node.next\n    return\n  }\n  let currentNode = head\n  while (currentNode.next && currentNode.next != node) {\n    currentNode = currentNode.next\n  }\n  console.log(currentNode)\n}\n```\n\nAgora eu quero pegar o valor 2 da nossa lista e checar se eu peguei realmente esse valor:\n\n```js\nlet node = list.getByValue(2)\nconsole.log(node)\n```\n\nAgora eu preciso mandar excluir esse nó 2:\n\n```js\nlist.remove(node)\n```\n\nPronto, conseguimos excluir, agora precisamos pegar nosso currentNode, que é nosso nó 1 e apontar para o nó 3, já que ele seria nosso next a partir do momento em que excluímos o nó 2:",
      "keywords": [
        "node",
        "currentnode",
        "next",
        "remove",
        "lista",
        "head",
        "agora",
        "temos",
        "para",
        "return"
      ],
      "metadata": {
        "title": "Lista encadeada - Como remover um nó",
        "date": "2017-07-25",
        "tags": "['Algoritmos']",
        "thumbnail": "RemoverNo.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/lista-encadeada-remover-um-no/index.md"
      }
    },
    {
      "id": "af4808e3ded86e8d",
      "url": "https://devpleno.com/metas-na-carreira-de-desenvolvedor",
      "title": "Metas na carreira de desenvolvedor - DevPleno (Part 1)",
      "content": "Carreira\n\n## Metas na carreira de desenvolvedor\n\nT\nPor Tulio Faria • 22 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nMetas são muito importantes tanto para nossa carreira quanto para nossa vida.\n\n**Você define metas para sua carreira?**\n\n**Você sabe aonde quer estar daqui dez anos?**\n\n**Quais conhecimentos quer ter daqui um ano?**\n\nUm exercício que eu faço para minha vida, e acredito que você consiga adaptar para a sua, é definir algumas metas pessoais relacionadas a parte acadêmica, como aprender alguma linguagem de programação ou framework por ano. No meu caso, não é só aprender, eu meço se eu domino e se consigo fazer um projeto envolvendo essa tecnologia para um cliente.\n\nPor exemplo, minha meta anos atrás era aprender Minstech e só percebi que dominava quando consegui concluir um projeto com Minstech. Hoje já é natural para mim trabalhar com essa tecnologia.\n\nPodemos criar outras metas também, até mesmo relacionadas com hobby. No momento, estou focado em aprender a tocar guitarra, pois é algo que sempre gostei. Minha meta é simplesmente tocar de 40 minutos a 1 hora por dia. Nesse período, eu paro exclusivamente para estudar guitarra.\n\nEste tipo de meta é muito bom, pois quanto mais você faz isso constantemente, mais você melhora como pessoa, pois transforma sua vida através de metas.\n\nPodem ser coisas simples: Tem que escrever algo? Escreva um parágrafo por dia, isso já vai adicionar muito em um período e no final das contas você acaba gerando um produto muito grande baseado em pequenas metas.\n\nEu conheço muitas linguagens de programação atualmente. Consigo coordenar, projetar e desenvolver em muitas tecnologias diferentes, mas tudo começou com uma primeira, como PHP, Java, JavaScript, etc.\n\nPara finalizar, não postergue suas metas! Se você tem a meta de aprender uma linguagem por ano, se organize e cumpra. Se começar a postergar, nunca irá realizar isto.",
      "description": "Metas são muito importantes tanto para nossa carreira quanto para nossa vida. Você define metas para sua carreira? Você sabe aonde quer estar daqui dez ano...",
      "keywords": [
        "para",
        "metas",
        "carreira",
        "https",
        "aprender",
        "muito",
        "meta",
        "pois",
        "desenvolvedor",
        "vida"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/metas-na-carreira-de-desenvolvedor"
      }
    },
    {
      "id": "af4f938c55119246",
      "url": "https://devpleno.com/chainability-com-javascript",
      "title": "Chainability com Javascript - DevPleno (Part 1)",
      "content": "Javascript\n\n## Chainability com Javascript\n\nT\nPor Tulio Faria • 10 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje eu quero mostrar como podemos construir um pattern que é muito utilizado no Jquery. Apesar de não ser um pattern que muita gente gosta, é bastante interessante.\n\nVamos construir um para você ter uma ideia de como podemos fazer e também para entender um pouco da linguagem que está ali por trás.\n\nEle também pode ser utilizado em outras linguagens além do JavaScript.\n\nEm jQuery, podemos fazer o seguinte:\n\n$('.opa').attr('', '').css('', '').click()\nEssa possibilidade de encadear coisas relacionadas a um elemento é chamado de Chainability, isso é bastante interessante para o JavaScript.\n\nComo podemos ter um comportamento semelhante a esse?\n\nVamos criar uma calculadora para você ter uma ideia de como se utiliza:\n\nconst calculador = (initial = 0) => {\nconst obj = {\ntotal: initial,\n\nadd: (num) => {},\n\nsub: (num) => {},\n\ndiv: (num) => {},\n\nmult: (num) => {}\n}\n\nreturn obj\n}\nA calculadora foi construída, mas até agora não temos a possibilidade de fazer esse chain. O que permite a gente fazer isso é o seguinte:\n\nconst calculador = (initial = 0) => {\n\nconst obj = {\ntotal: initial,\n\nadd: (num) => {\nobj.total+=num\n\nreturn obj\n},\n\nsub: (num) => {\nobj.total-=num\n\nreturn obj\n},\n\ndiv: (num) => {\nobj.total/=num\n\nreturn obj\n},\n\nmult: (num) => {\nobj.total*=num\n\nreturn obj\n}\n\nout: () => {\nconsole.log(obj.total)\n\nreturn obj\n}\n}\n\nreturn obj\n\n}\nSó o fato de conseguirmos retornar o obj, já é possível fazer o seguinte:\n\ncalculadora().add(10).sub(5).out()\nAssim já conseguimos saber qual é o retorno dele. A ideia do chainlability é que toda operação que ele faz ele vai retornar o próprio objeto. Isso faz muito sentido para o jQuery, já que mudamos o html de forma imperativa.\n\nConfira o vídeo:",
      "description": "Hoje eu quero mostrar como podemos construir um pattern que é muito utilizado no Jquery. Apesar de não ser um pattern que muita gente gosta, é bastante int...",
      "keywords": [
        "javascript",
        "total",
        "return",
        "para",
        "https",
        "fazer",
        "como",
        "podemos",
        "const",
        "initial"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/chainability-com-javascript"
      }
    },
    {
      "id": "af553ea331a1552f",
      "url": "https://devpleno.com/closure-poo-para-js",
      "title": "Closure Série - POO para JS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Closure Série - POO para JS\n\nT\nPor Tulio Faria • 7 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vou continuar a falar sobre como passar de Programação Orientada-objetos para JavaScript cada vez mais funcional.\n\nUma outra coisa bastante diferente para se comparar entre ambos os paradigmas é o uso de closure. No JavaScript, anteriormente tínhamos reproduzido aquela “classe” e acabamos criando uma closure. Vamos supor que eu faça uma função dessa forma:\n\nfunction func1() {\nconst name = 'tulio faria'\n\nfunction func1b() {\nconsole.log(name)\n}\n\nfunc1b()\n}\n\nfunc1()\nEm JavaScript é normal e podemos fazer uma função dentro de uma função como no exemplo acima. Você percebeu que eu consegui acessar o ‘name’? Isso é uma característica do JS. Por conseguir colocar uma função em uma variável, é possível ter funções dentro de funções. Essa função interna consegue acessar o escopo da função pai.\n\nNo cenário, vamos executar esse código todo síncrono e em seguida ele morre, porém, existe uma outra situação onde eu consigo manter esse escopo vivo. Vamos supor que eu queira passar uma saudação:\n\nfunction func1() {\nconst saudacao = 'Ola' + name\n\nfunction func1b() {\nconsole.log(saudacao)\n}\n\nreturn func1b\n}\n\nconst saudarOTulio = func1('Tulio Faria')\n\nsaudarOTulio()\nQuando eu fiz isso, a func1 passou a ser uma closure porque ela travou esse escopo inteiro, nisso eu posso a qualquer momento chamar essa saudação. Existem alguns tipos de funcionalidades dentro do JS que permitem que a gente faça alguns tipos interessantes, como por exemplo:\n\nconst contador = function (num) {\nlet atual = 1\n\nlet timer = setInterval(() => {\nif (atual === num) {\nclearInterval(timer)\n}\n\nconsole.log(atual++)\n}, 1000)\n}",
      "description": "Hoje vou continuar a falar sobre como passar de Programação Orientadaobjetos para JavaScript cada vez mais funcional. Uma outra coisa bastante diferente pa...",
      "keywords": [
        "javascript",
        "para",
        "https",
        "closure",
        "function",
        "func1",
        "const",
        "name",
        "func1b",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/closure-poo-para-js"
      }
    },
    {
      "id": "af59e377ee4ff5aa",
      "url": "https://devpleno.com/high-order-functions",
      "title": "High-order Functions - DevPleno (Part 1)",
      "content": "Javascript\n\n## High-order Functions\n\nT\nPor Tulio Faria • 7 de abril de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nA dica de hoje é sobre High-order Functions, que são funções que recebem ou retornam funções. Nós temos alguns tipos diferentes, como por exemplo vetor, map e forEach, elas são high-order functions porque podemos passar um método que ele vai iterar dando o console.log.\n\nconst vetor = [1, 2, 3]\n\nvetor.forEach((item) => console.log(item))\nPerceba que estamos passando uma função para essa outra função que é uma high-order function, a função que passamos para ela chamamos de firt order function. Com ela conseguimos construir nossas próprias funções high-order. Por exemplo, caso queiramos fazer uma função mathOperator, que pega dois termos e retorna os números, e uma função que faz a operação que eu quero:\n\nfunction mathOrder(num1, num2, op) {\nreturn op(num1, num2)\n}\n\nconsole.log(mathOperator(1, 2, (num1, num2) => num1 + num2))\nEntão eu quis que essa high-order function chame o num1 e num2 e retorne a soma das duas.\n\nNão necessariamente as high-order functions precisam ser puras, a única regra que temos é que ela recebe ou retorna uma função. No exemplo que fizemos, o op naquele momento é uma função. É importante lembrar que em JavaScript funções podem ser colocadas dentro de variáveis, por isso é possível criar high-order functions, uma coisa que não é tão simples de se fazer em Java por exemplo.\n\nLembrando que eu utilizei arrow function para facilitar mas eu poderia também fazer a operação:",
      "description": "A dica de hoje é sobre Highorder Functions, que são funções que recebem ou retornam funções. Nós temos alguns tipos diferentes, como por exemplo vetor, map...",
      "keywords": [
        "order",
        "num2",
        "high",
        "num1",
        "functions",
        "function",
        "para",
        "https",
        "console",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/high-order-functions"
      }
    },
    {
      "id": "afba03d907dbdd74",
      "url": "https://devpleno.com/seja-o-motorista-da-sua-vida",
      "title": "Você é passageiro ou motorista da sua vida? - DevPleno (Part 2)",
      "content": "Deixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Voc%C3%AA%20%C3%A9%20passageiro%20ou%20motorista%20da%20sua%20vida%3F&url=https%3A%2F%2Fdevpleno.com%2Fseja-o-motorista-da-sua-vida) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fseja-o-motorista-da-sua-vida)",
      "description": "Você é passageiro ou motorista da sua vida? Eu vou contar uma história para vocês e acho que faz bastante sentido pelo momento que passei. Eu estava no emb...",
      "keywords": [
        "para",
        "motorista",
        "vida",
        "https",
        "mais",
        "quer",
        "fora",
        "carreira",
        "passageiro",
        "sentido"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/seja-o-motorista-da-sua-vida"
      }
    },
    {
      "id": "afd07363b97a07b0",
      "url": "https://devpleno.com/mundo-de-abundancia",
      "title": "Sobreviver em um mundo de abundância - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Sobreviver%20em%20um%20mundo%20de%20abund%C3%A2ncia&url=https%3A%2F%2Fdevpleno.com%2Fmundo-de-abundancia) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmundo-de-abundancia)",
      "description": "Hoje eu gostaria de compartilhar uma lição que a minha mãe sempre falava pra mim quando estava em um momento de decidir algo em minha carreira. Ela sempre ...",
      "keywords": [
        "para",
        "https",
        "mais",
        "carreira",
        "minha",
        "estava",
        "oportunidade",
        "faculdade",
        "como",
        "abund"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/mundo-de-abundancia"
      }
    },
    {
      "id": "b02af43c977e21ac",
      "url": "https://devpleno.com/blog/dotenv-e-variaveis-de-ambiente/index",
      "title": "Dotenv e variáveis de ambiente no NodeJS (Part 1)",
      "content": "Hoje eu tenho duas dicas, como podemos configurar uma aplicação sem precisar alterar o código fonte. Essa é uma boa prática, apesar de muita gente ainda não usar, então quero reforçar o conceito de como podemos fazer isso. A ideia é que o sistema fique immutable e que a gente construa esse artefato no sistema e se colocarmos em uma máquina de desenvolvimento, ele vira desenvolvimento, em uma máquina de produção vai virar produção, isso baseado somente em variáveis de ambiente. Como pegamos uma variável de ambiente?\n\n```jsx\nconsole.log(process.env.NODE_ENV)\n```\n\nAo rodar, perceba que vai dar undefined, porém se fizermos:\n\n```jsx\nNODE_ENV=production node test.js\n```\n\nvamos ter uma variável de ambiente production. Porém se rodar de novo, ele volta para undefined, então quando definimos essa variável ele carrega de forma automática qual banco conectar e qual usuário. Isso fica no ambiente e não mais na aplicação. Mas se toda vez que formos desenvolver tivermos que lembrar as informações, é bastante trabalhoso, correto? Então podemos utilizar um módulo que se chama Dotenv, onde criamos um arquivo com uma variável de ambiente que a gente quer e ele carrega automaticamente:\n\n```jsx\nyarn add dotenv\n```\n\nJá no nosso script, vamos fazer o seguinte:\n\n```jsx\nrequire('dotenv').config()\n```\n\nAssim carregamos o arquivo .env Agora vamos criar um arquivo na raiz do projeto chamado .env, nele vamos colocar o nome da variável que a gente quer, por exemplo:\n\n```jsx\nNODE_ENV = tulio\n```\n\nAo rodar novamente percebam que agora vai ser retornado 'tulio'. A ideia é que, na máquina de desenvolvimento, você vai criar o arquivo .env com todas as variáveis que você precisa para rodar na máquina e quando você colocar no servidor, vão ser colocadas essas variáveis no ambiente e não mais no arquivo. Podemos também, se ele estiver em produção, evitar que ele acesse o ambiente de desenvolvimento:",
      "keywords": [
        "vari",
        "ambiente",
        "desenvolvimento",
        "node",
        "arquivo",
        "podemos",
        "gente",
        "quina",
        "produ",
        "rodar"
      ],
      "metadata": {
        "title": "Dotenv e variáveis de ambiente no NodeJS",
        "date": "2017-08-23",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "VARIÁVEIS-DE-AMBIENTE-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/dotenv-e-variaveis-de-ambiente/index.md"
      }
    },
    {
      "id": "b0343d4450ab4018",
      "url": "https://devpleno.com/blog/dica-injecao-de-dependencia-no-reactjs/index",
      "title": "Dica: Injeção de Dependência no ReactJS",
      "content": "Injeção de dependência ajuda muito na testabilidade do código e de certa forma em aumentar a legibilidade do código. Veja como podemos implementar Injeção de dependências no ReactJS\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/tQ80uAP_B_M\" allowfullscreen></iframe>\n</div>\n\nVeja mais sobre injeção de dependências em [https://www.devpleno.com/injecao-de-dependencia/](https://www.devpleno.com/injecao-de-dependencia/) Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "https",
        "embed",
        "devpleno",
        "inje",
        "depend",
        "responsive",
        "digo",
        "veja",
        "ncias",
        "classname"
      ],
      "metadata": {
        "title": "Dica: Injeção de Dependência no ReactJS",
        "date": "2017-04-04",
        "tags": "['Javascript', 'Fundamentos', 'ReactJS']",
        "thumbnail": "InjecaoDependencia.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-injecao-de-dependencia-no-reactjs/index.md"
      }
    },
    {
      "id": "b03b8a24be179278",
      "url": "https://devpleno.com/como-invocar-funcoes-dinamicamente-com-js",
      "title": "Como invocar funções dinamicas em JavaScript - DevPleno (Part 1)",
      "content": "Javascript\n\n## Como invocar funções dinamicas em JavaScript\n\nT\nPor Tulio Faria • 19 de fevereiro de 2018\n\n[Javascript](/tag/javascript)\n\nEm programação, blocos de código que executam instruções específicas são chamadas de funções e, no Javascript, são conhecidas como métodos. Agora, imagine o seguinte cenário: como desenvolvedor, você não conhece o nome do método que quer chamar mas sabe que existe o nome dele em uma variável. Então, como faremos para chamá-lo?\n\nOs métodos são muito úteis em casos onde queremos uma programação mais dinâmica, por exemplo: você tem um serviço e não sabe os nomes dos métodos disponíveis e é possível programar a forma como serão chamados ou se você tem uma forma de integrar módulos com pontos de entrada na aplicação para importar o módulo baseado nessa variável, chamando seus métodos dinamicamente.\n\nImagine o seguinte cenário em temos um console como o da imagem abaixo, onde deixamos para o usuário a opção de escolher o método **log** ou o **debug**:\n\nAo executarmos o código acima (dinamicamente.js) no prompt de comando, vemos o resultado a seguir com destaque para o “opa” que foi impresso:\n\nAo criar um objeto obj, definindo valores para suas variáveis a e b, tal qual a imagem abaixo:\n\nPodemos pegar o valor da variável a do objeto obj com a instrução console.log(obj.a) e mostrar o conteúdo de a como um resultado:\n\nOutra forma de obter o valor de a consiste em definirmos uma constante (variável com valor fixo) que chamaremos de key e com a instrução console.log(obj[key]) conseguimos o valor de a como resultado:\n\nCom os métodos, o processo é semelhante. Alteremos o código acima para deixar apenas a definição da constante key como ‘log’ e, como não sabemos a posição do método que iremos chamar, colocamos console[key].\n\nPara entender o que console[key] retornaria, escreveremos a instrução console.log(console[key]) para observar o valor de retorno:",
      "description": "Em programação, blocos de código que executam instruções específicas são chamadas de funções e, no Javascript, são conhecidas como métodos. Agora, imagine ...",
      "keywords": [
        "como",
        "console",
        "para",
        "todos",
        "valor",
        "javascript",
        "resultado",
        "https",
        "vari",
        "dinamicamente"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/como-invocar-funcoes-dinamicamente-com-js"
      }
    },
    {
      "id": "b045d2e890e4f401",
      "url": "https://devpleno.com/blog/lista-encadeada-adicionar-com-o1/index",
      "title": "Lista encadeada - Adicionar com O(1) (Part 1)",
      "content": "Hoje vamos continuar falando mais um pouco sobre [algoritmos](https://www.devpleno.com/tag/algoritmos/) que principalmente caem ou em listas de emprego ou competições de programação, mas vai ser um pouco diferente. Estamos falando sobre listas encadeadas e já fizemos uma forma de [adicionar um nó em que a complexidade é 0(n)](https://www.devpleno.com/lista-encadeada-adicionar-no/), pois precisamos navegar até o final da lista toda vez que vamos adicionar um item novo. Porém uma das pessoas que acompanham a gente no YouTube comentou que podemos fazer com o O(1), ou seja, um valor constante, desde que a gente armazene além da cabeça da lista, o rabo, então eu decidi fazer dessa forma também para ficar bem claro as duas formas. A primeira coisa que temos que fazer no algoritmo é, além de utilizar o head, utilizar também o tail:\n\n```jsx\nlet head = null\nlet tail = null\n```\n\nAgora vamos fazer um add e, caso estivermos adicionando pela primeira vez, vamos seguir a mesma regra utilizada anteriormente:\n\n```jsx\nconst add2 = (value) => {\n  if (!head) {\n    head = Node(value)\n    tail = head\n    length++\n    return head\n  }\n}\n```\n\nPerceba que tail é igual a head, afinal se não tivermos nenhum nó, ao adicionar, o início e o fim serão o mesmo.\n\nAgora, caso o Head não for nulo, temos que fazer o Tail que será o nosso último. Para isso vamos criar um nó e pegar o tail.next e apontar para o novo nó:\n\n```jsx\nconst add2 = (value) => {\n  if (!head) {\n    head = Node(value)\n    tail = head\n    length++\n    return head\n  }\n  let node = Node(value)\n  tail.next = node\n  tail = node\n  return node\n}\n```\n\nQuando a lista não está vazia criamos um novo nó, vamos nesse último nó e colocamos no ultimo, logo nosso tail será o novo nó. Para checar se isso funciona no return, temos que adicionar:\n\n```jsx\nadd2: (value) => add2(value)\n```\n\nVamos fazer um teste:\n\n```jsx\nlist.add2(1)\nlist.add2(2)\nlist.add2(3)\nlist.print()\n```",
      "keywords": [
        "head",
        "tail",
        "vamos",
        "adicionar",
        "lista",
        "para",
        "add2",
        "value",
        "node",
        "fazer"
      ],
      "metadata": {
        "title": "Lista encadeada - Adicionar com O(1)",
        "date": "2017-07-25",
        "tags": "['Algoritmos']",
        "thumbnail": "AdicionarCom01.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/lista-encadeada-adicionar-com-o1/index.md"
      }
    },
    {
      "id": "b051c5b7b0a7795f",
      "url": "https://devpleno.com/blog/dicas-paranpm/index",
      "title": "3 dicas para NPM + 1 dica extra (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "express",
        "dulo",
        "pode",
        "reposit",
        "embed",
        "devpleno",
        "instalar",
        "exemplo",
        "fazer"
      ],
      "metadata": {
        "title": "3 dicas para NPM + 1 dica extra",
        "date": "2017-05-16",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "DICAS-PARA-NPM-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/dicas-paranpm/index.md"
      }
    },
    {
      "id": "b07879e940fbce8c",
      "url": "https://devpleno.com/blog/como-organizar-os-estudos-em-tecnologia/index",
      "title": "Como organizar os estudos em tecnologia (Part 1)",
      "content": "O inscrito Leonardo Oliveira deixou uma pergunta no canal e achei interessante compartilhar a resposta, afinal pode ser a dúvida de outras pessoas, inclusive a sua. A pergunta é a seguinte:\n\n“Gostei das dicas! Eu curso sistema de informação, já aprendi um bocado de coisa mas tenho um problema em não conseguir definir prioridades. Sempre quero aprender muita coisa e, no fim, acabo ficando perdido. Queria achar uma técnica que me ajude a ser mais produtivo.”\n\nÉ muito legal estar aprendendo bastante na faculdade, pois vai te dar uma bagagem muito boa e permitir que você comece a dar seus primeiros passos. Acontece que atualmente vivemos com um overload de informações, ou seja, temos muita informação, mas sem saber para onde ir, que curso fazer, o que estudar primeiro, etc.\n\nO que eu costumo fazer é priorizar o que tenho mais experiência ou mais conhecimento sobre o assunto. Se tenho 5 tecnologias que quero aprender, tento filtrar e ver em qual delas estou mais perto de ficar bom. Por exemplo, se estou entre Mongo, Express, React e Node, então verei qual eu estou mais próximo de dominar.\n\n**Por que fazer isso?**\n\nPara conseguir ter mais motivação para começar as demais. Supondo que você está bom em React, então você vai treinar mais para chegar em um nível mais alto e o React não será mais um problema. Depois de ter dominado essa primeira tecnologia, então você vai para a segunda que tinha mais experiência, depois a terceira, e por ai vai. Isso é muito bom para cuidar da sua motivação.\n\nUma outra forma de priorizar o que estudar, essa um pouco mais arriscada, é entregar um projeto com essa tecnologia. Eu fiz isso ano passado, pois queria ficar muito bom em React. Defini que iria fazer o projeto com ele e entreguei, mas isso é perigoso, apesar de bom, porque você definirá um projeto que tem uma contrapartida muito grande, afinal você vai ter um deadline e precisa entregar de alguma forma, o que vai te motivar ainda mais a estudar essa tecnologia.",
      "keywords": [
        "mais",
        "para",
        "muito",
        "essa",
        "fazer",
        "react",
        "isso",
        "tecnologia",
        "informa",
        "tenho"
      ],
      "metadata": {
        "title": "Como organizar os estudos em tecnologia",
        "date": "2017-05-17",
        "tags": "['Carreira']",
        "thumbnail": "COMO-ORGANIZAR-OS-ESTUDOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/como-organizar-os-estudos-em-tecnologia/index.md"
      }
    },
    {
      "id": "b088286607cf9a22",
      "url": "https://devpleno.com/aprenda-a-dizer-nao",
      "title": "Aprenda a dizer NÃO! - DevPleno (Part 1)",
      "content": "Carreira\n\n## Aprenda a dizer NÃO!\n\nT\nPor Tulio Faria • 7 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nUma das coisas que eu aprendi ultimamente é dizer NÃO. Se alguma coisa não me agrada, não faz bem para minha empresa ou não está de acordo com o que eu quero para minha vida, eu simplesmente digo não. Por exemplo, eu me nego a pegar um serviço que não está alinhado ao meu objetivo maior e isso fez uma diferença muito grande para minha empresa. Ao invés de pegar projetos igual um louco, eu pego somente os projetos que fazem sentido para minha empresa.\n\nMuitas vezes a gente pega algumas coisas para estudar que não faz sentido para nós, temos que dizer não para nós mesmos. Se você tem N projetos que acha que não vai dar em nada, precisa dizer não, afinal está perdendo tempo e energia.\n\nUma coisa que achei muito interessante foi uma das conversas que eu tive no mestrado com alguns colegas. Um deles estava reclamando que não gostava do tema do mestrado dele e que não sabia o que fazer porque não estava produzindo, já que não se dava bem com o tema. O que foi unânime na mesa foi dizer “Você não está na idade de falar sim para tudo, se você não gostou desse tema, está na hora de falar que não quer continuar.”\n\nQuando eu era mais novo, por exemplo, não gostava de balada, então quando as pessoas me convidavam eu não sabia falar não e ia porque simplesmente não me aceitava como eu era, e me sentia péssimo, porque não era algo que eu gostava ou queria fazer. Quando você vai ficando um pouco mais velho, começa a aprender a falar não.\n\nJá está mais do que na hora de aprender e descobrir o que você gosta, chega de aceitar tudo, se algo não está indo bem, fale, se seu chefe faz algo que você não gosta fale para ele, converse e explique.",
      "description": "Uma das coisas que eu aprendi ultimamente é dizer NÃO. Se alguma coisa não me agrada, não faz bem para minha empresa ou não está de acordo com o que eu que...",
      "keywords": [
        "para",
        "dizer",
        "minha",
        "https",
        "empresa",
        "vida",
        "quando",
        "mais",
        "estava",
        "porque"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/aprenda-a-dizer-nao"
      }
    },
    {
      "id": "b095a649363f99ea",
      "url": "https://devpleno.com/tag/javascript/5",
      "title": "Javascript - Pagina 5 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 10 de ago. de 2017 Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios](/hands-on-rimraf)\n\n[Javascript 10 de ago. de 2017 Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM)](/hands-on-yarn)\n\n[Javascript 7 de ago. de 2017 Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS](/falsy-e-truthy-values)\n\n[Javascript 7 de ago. de 2017 Short-circuit e valores padrão](/short-circuit-e-valores-padrao)\n\n[Javascript 6 de ago. de 2017 ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux](/shelljs)\n\n[Javascript 4 de ago. de 2017 Fake API - Como testar seus projetos front-end](/fake-api)\n\n[Fundamentos 2 de ago. de 2017 Arrow Functions - Construindo funções anônimas de forma mais simplificada](/arrow-functions)\n\n[Javascript 2 de ago. de 2017 High-order Function Filter](/filter)\n\n[Javascript 2 de ago. de 2017 High-order Function Find](/find)\n\n[Javascript 1 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)\n\n[Javascript 31 de jul. de 2017 Json-server - Como criar uma REST API para testes de forma simples](/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples)\n\n[Javascript 30 de jul. de 2017 Async - Como Controlar Operações Assíncronas](/async)\n\n[Anterior](/tag/javascript/4)5 / 16[Próxima](/tag/javascript/6)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "reactjs",
        "como",
        "ferramentas",
        "fundamentos",
        "valores",
        "forma",
        "algoritmos",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/5"
      }
    },
    {
      "id": "b0e1bd198f5cd9e5",
      "url": "https://devpleno.com/blog/es7-array-includes/index",
      "title": "ES7 Array Includes",
      "content": "Na dica de hoje, quero falar um pouco sobre o ES7 e uma funcionalidade que foi adicionada ao vetor. Primeiramente vou mostrar como fazemos comumente em ES6 e ES5, seguido de como podemos começar a fazer no ES7 citando sua vantagem. Vou criar um vetor:\n\n```jsx\nconst nums = [1, 2, 3, 4]\n```\n\nSe quiséssemos checar se um valor está ou não dentro desse vetor, faríamos normalmente, checaríamos se o índice não é -1:\n\n```jsx\nconsole.log(nums.indexOf(4) != -1)\n```\n\nCom isso, quando ele não encontrar, vai ser retornado -1. O problema do indexOf falha quando tentamos buscar por NaN (not a number). Já com o includes, é possível checar e buscar dentro dele se temos o valor:\n\n```jsx\nconsole.log(nums.includes(NaN))\n```\n\nCom isso, conseguimos buscar o NaN de uma forma mais coesa. Outra coisa que ganhamos com isso é que o nosso código fica mais legível, já que não fazemos mais “gambiarra”, afinal estamos apenas checando se ele inclui ou não, isso de maneira funcional.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ZwJ8_kJdvmk\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "isso",
        "embed",
        "vetor",
        "nums",
        "checar",
        "buscar",
        "mais",
        "responsive",
        "https",
        "youtube"
      ],
      "metadata": {
        "title": "ES7 Array Includes",
        "date": "2017-10-10",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ES7-ARRAY-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/es7-array-includes/index.md"
      }
    },
    {
      "id": "b0f46e14032efbea",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-3/index",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol (Part 4)",
      "content": "Quando faço isso, o match.index consegue acessar esse valor, então dentro do nosso match conseguimos checar se estamos em nosso jogo atual:\n\n```jsx\nsocket.on('score', function (score) {\n  console.log('score', score)\n  //na lista de jogos\n  $('. match-' + score.match + '-a').html(score.scoreA)\n  $('. match-' + score.match + '-b').html(score.scoreb)\n  //  atualizar o jogo\n  if (MATCH_INDEX == score.match) {\n    $('.score-team-a').html(score.scoreA)\n    $('.score-team-b').html(score.scoreB)\n    if (score.notify == '1') {\n      console.log('notificar')\n    }\n  }\n})\n```\n\nSe o jogo é o que recebemos a notificação, nós notificamos esse gol. Em view/match, lá no final, temos uma div que é uma class goooolllll com um áudio, então se estivermos com o notificado ligado vamos dar um play nesse áudio, voltamos no código anterior e adicionamos o seguinte:\n\n```jsx\nif (score.notify == '1') {\n  console.log('notificar')\n  $('#audio-gol')[0].currentTime = 0\n  $('audio-gol')[0].play()\n}\n```\n\nPor que fizemos o notificar sim ou não? É possível notificar um gol e caso ele seja anulado, você tira o notificar e tira o placar sem alarmar todos. Podemos também fazer uma animação com aquele div que está ali\n\n```jsx\nif(score.notify=='1'){\n    console.log('notificar')\n    $('#audio-gol')[0].currentTime=0;\n    $('audio-gol')[0].play();\n    $('.goooolllll')addClass('goooolllll-anim')\n    $('.goooolllll-text')addClass('goooolllll-text-anim')\n    $('.goooolllll-text')on('transitionend webkitTransitionEnd oTransitionEnd', function(){\n        $('.goooolllll')removeClass('goooolllll-anim')\n        $('.goooolllll-text')removeClass('goooolllll-text-anim')\n    })\n}\n```\n\nPara testar temos que notificar em uma outra aba. Ao clicar, aparece duas classes com essa animação, quando a animação terminar nós removemos essa animação.\n\nNa próxima aula vamos colocar a comunicação do lance a lance e dos vídeos, além de colocar o projeto em um servidor no digitalhost para conseguirmos acessar externamente.",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "vamos",
        "notify",
        "socket",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol",
        "date": "2017-07-07",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-3/index.md"
      }
    },
    {
      "id": "b10052bfb1e79bda",
      "url": "https://devpleno.com/estudar-1-hora-por-dia-ou-8-horas-no-sabado",
      "title": "Estudar 1 hora por dia ou 8 horas no sábado? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Estudar 1 hora por dia ou 8 horas no sábado?\n\nT\nPor Tulio Faria • 18 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nO que é melhor, estudar 1 hora por dia ou 8 horas no fim de semana?\n\nPrimeiro depende da sua disponibilidade, se você tem 8 horas no sábado, então utilize esse tempo. Porém tudo que fazemos todos os dias acabamos tendo uma certa maestria, então se você programa todo dia, acaba programando melhor depois de 7 dias, você acaba programando melhor do que se ficar 8 horas de um sábado, que a carga horária é maior e teoricamente você está mais focado.\n\nEu acredito nisso por alguns motivos, primeiro que você cria o hábito de estudar. Quando você consegue reservar um pouquinho por dia, mesmo que seja 20 minutos, eu ainda acredito que seja melhor que juntar tudo em um sábado ou domingo.\n\nNo DevPleno, eu gero vídeo todo dia (antigamente eu gerava uma vez por semana), e uma coisa que eu percebi é que é muito mais difícil para mim sentar e gravar um vídeo por semana do que eu gravar um vídeo por dia, isso é bizarro mas é verdade, porque se eu gravo um vídeo por dia, eu gero um hábito de gravar, já se eu faço uma vez por semana, esse hábito não é tão forte. Se pensar que vai fazer algo só no fim de semana ou em um dia só, você acaba ficando mais preguiçoso e vai postergando. Fazendo todo dia, você cria esse hábito e percebe que não consegue parar mais, já fica mais fluido e assim consegue atingir mais resultados.\n\nÉ muito melhor você melhorar aos poucos do que dar saltos, por exemplos se você estudar 2 sábados seguidos, esses 5 dias que vão separar seus fins de semana vão te atrapalhar porque você vai esquecer as coisas que já estudou. Então é importante estar estudando sempre, quando você diminui o tempo, mas dilui durante sua semana melhor vai ser sua performance em aprender.",
      "description": "Descubra a melhor rotina de estudos para programadores: consistência diária ou maratonas no fim de semana? Dicas para organizar seus estudos.",
      "keywords": [
        "semana",
        "estudar",
        "horas",
        "melhor",
        "mais",
        "dias",
        "para",
        "https",
        "bado",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/estudar-1-hora-por-dia-ou-8-horas-no-sabado"
      }
    },
    {
      "id": "b123f6faf5622a85",
      "url": "https://devpleno.com/tag/javascript/16",
      "title": "Javascript - Pagina 16 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 25 de jul. de 2016 NodeJS Primeiros Passos: Servidor HTTP Básico](/servidor-http-basico)\n\n[Javascript 24 de jul. de 2016 Vídeo sobre Servidores Web - o back-end de uma aplicação web](/servidores-web-entendo-back-end)\n\n[Javascript 12 de jul. de 2016 Vídeo sobre NodeJS com Promises](/nodejs-primeiros-passos-promises)\n\n[Anterior](/tag/javascript/15)16 / 16\nPróxima",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "nodejs",
        "2016",
        "algoritmos",
        "carreira",
        "ferramentas",
        "fundamentos",
        "reactjs",
        "primeiros",
        "passos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/16"
      }
    },
    {
      "id": "b13a99bcf35c6095",
      "url": "https://devpleno.com/blog/map/index",
      "title": "High-order Function MAP (Part 2)",
      "content": "Essas são algumas ideias do que podemos fazer com o MAP, é bastante interessante utilizar isso porque a gente consegue fazer uma sequência de transformações dos dados que provavelmente consiga resolver boa parte dos problemas nos sistemas convencionais. Lembrando que no caso acima ela é uma função pura porque depende exclusivamente dos parâmetros que vêm pra ela, então isso a deixa mais fácil de ser testada, consequentemente a qualidade do código aumenta.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Ax101agfFB0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "item",
        "vetor",
        "nome",
        "mais",
        "categoria",
        "fazer",
        "vetor2",
        "para",
        "const",
        "console"
      ],
      "metadata": {
        "title": "High-order Function MAP",
        "date": "2017-06-27",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "MAP.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/map/index.md"
      }
    },
    {
      "id": "b158a87ed0c2d006",
      "url": "https://devpleno.com/normalizar-email",
      "title": "Normalizar-email - DevPleno (Part 1)",
      "content": "Javascript\n\n## Normalizar-email\n\nT\nPor Tulio Faria • 30 de novembro de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nHoje eu quero comentar um detalhe de implementação de e-mail muito interessante e como podemos contornar essa característica que temos em alguns endereços de e-mail.\n\nUma coisa que muita gente acredita é que nossos e-mails somente funcionam dessa maneira:\n\ntuliofaria@devpleno.com\nUm detalhe é que podemos adicionar alguns itens a mais nesse e-mail e aí depende do provedor permitir ou não esse e-mail.\n\nNo caso do Gmail nós conseguimos colocar alguma string qualquer na frente:\n\ntuliofaria+string@devpleno.com\n\ntulio.faria@devpleno.com\nNós podemos utilizar o primeiro exemplo em alguns sistemas, onde queremos criar mais de uma conta com o mesmo e-mail e também para verificar de onde veio esse e-mail.\n\nSe eu cadastrei esse e-mail em [americanas.com](https://www.americanas.com.br/) eu posso utilizar por exemplo:\n\ntuliofaria+americanas@devpleno.com\n\nSe a gente quiser construir um sistema e desconsiderar essas características de que cada provedor corrige podemos utilizar um módulo chamado normalize-e-mail, ele vai fazer exatamente isso, pegar esse e-mail que está sujo e, dependendo das normalizações que o provedor faz, vai fazer também:\n\nyarn add normalize-email\nconst normalize-email = require('normalize-email')\nconsole.log(normalizeEmail('tuliofaria+americanas@gmail.com'))\nconsole.log(normalizeEmail('tulio.faria+americanas@outlook.com'))\nCom isso ele vai fazer as devidas correções. É muito simples, porém muito útil.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje eu quero comentar um detalhe de implementação de email muito interessante e como podemos contornar essa característica que temos em alguns endereços d...",
      "keywords": [
        "mail",
        "email",
        "https",
        "devpleno",
        "americanas",
        "podemos",
        "tuliofaria",
        "esse",
        "normalize",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/normalizar-email"
      }
    },
    {
      "id": "b198e16214ad2d76",
      "url": "https://devpleno.com/dica-find",
      "title": "Redirecting to: /find",
      "content": "Redirecting to: /find [Redirecting from /dica-find to /find](/find)",
      "keywords": [
        "find",
        "redirecting",
        "from",
        "dica"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-find"
      }
    },
    {
      "id": "b1e87f9ce83a7ece",
      "url": "https://devpleno.com/blog/participacao-em-eventos-e-comunidades/index",
      "title": "Participação em Eventos e Comunidades (Part 2)",
      "content": "Em um último evento que eu fui, que foi sobre negócios, eu conheci uma pessoa que falava sobre como controlar a ansiedade e isso foi muito legal, ele fez até um experimento para eu me acalmar e reduzir a ansiedade. Cada dia do evento eu fui conhecendo uma pessoa diferente, pois cada dia eu sentava em um lugar diferente, isso é bastante importante para nos conectarmos.\n\nO grande problema que o pessoal reclama é que não tem eventos na sua região, então a minha postura quanto a isso é encabeçar esses eventos, não presencialmente pois hoje não consigo mais, mas online eu consigo, como o Fullstack Academy. Eu deixo isso claro para minha comunidade que sempre que precisar eu estou disponível para dar palestra em qualquer evento na região que eu possa abordar algum tema. Eu faço isso porque temos que fortalecer primeiramente os eventos que estão perto da gente.\n\nTínhamos um evento na cidade que aconteceu quatro ou cinco anos seguidos e depois teve uma pausa e agora voltou esse ano e sempre que é preciso eu estou lá, antes dessa pausa eu era um dos poucos palestrantes que tinham e com isso acabamos inspirando novas pessoas a palestrar e no último ano antes da pausa, tivemos muitas palestras, isso foi muito legal porque conseguimos fortalecer um evento regional.\n\nSe você tem um evento na sua cidade que você não esteja alinhado com ele, converse com a coordenação desse evento para palestrar ao invés de criar outro evento. Eu faço muito disso, esse ano dei por volta de três palestras e principalmente na região.\n\nEntão fortaleça as comunidades e eventos que estão perto de você. Nós vivemos em comunidade, trabalhamos em comunidade, então porque não aprender em comunidade?\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/qvMqSNpzyjk\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "isso",
        "para",
        "eventos",
        "pessoas",
        "evento",
        "comunidade",
        "sobre",
        "importante",
        "youtube",
        "muito"
      ],
      "metadata": {
        "title": "Participação em Eventos e Comunidades",
        "date": "2017-07-19",
        "tags": "['Carreira']",
        "thumbnail": "ParticipacaoEventos.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/participacao-em-eventos-e-comunidades/index.md"
      }
    },
    {
      "id": "b21e3c37aab64114",
      "url": "https://devpleno.com/blog/converter-markdown-para-html/index",
      "title": "Como converter Markdown para HTML usando Marked (Part 2)",
      "content": "Com isso, o Marked sabe que o texto que eu quero é o Teste, e o level que eu quero é o 2, ou no caso a heading tag H2. Eu consigo retornar uma fontSize maior como no exemplo abaixo:\n\n```jsx\nrenderer.heading = function (Text, level) {\n  return<Textstyle={{fontSize: }}>'Text: ' +text+' Level: '+level\n}\n```\n\nChecando obviamente o level e por aí vai. Assim podemos gerar uma interface que vai ser reproduzida de forma igual tanto no react native quanto na Web, já que é possível converter para HTML e estaria tudo rodando normalmente.\n\n**5 – Concluindo**\n\nVenho usando bastante Markdown para documentação. Uma outra ideia interessante seria pegar esse HTML gerado pelo Markdown e, a partir dele, gerar um PDF para salvar isso para outros desenvolvedores.\n\nMarked é uma forma que temos no Node de converter o Markdown em HTML, mas também podemos utilizá-lo no browser.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "marked",
        "teste",
        "para",
        "level",
        "text",
        "renderer",
        "markdown",
        "exemplo",
        "vamos",
        "html"
      ],
      "metadata": {
        "title": "Como converter Markdown para HTML usando Marked",
        "date": "2017-05-03",
        "tags": "['Javascript']",
        "thumbnail": "MARKED-POST-2-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/converter-markdown-para-html/index.md"
      }
    },
    {
      "id": "b21fd1fe5621e56e",
      "url": "https://devpleno.com/processo-seletivo-da-toptal",
      "title": "Processo Seletivo da Toptal – Série Trabalho Remoto - DevPleno",
      "content": "Carreira\n\n## Processo Seletivo da Toptal – Série Trabalho Remoto\n\nT\nPor Tulio Faria • 21 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nSeu objetivo é trabalhar remotamente por meio da Toptal? Neste vídeo, você vai entender como funciona o processo seletivo.\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog).\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Processo%20Seletivo%20da%20Toptal%20%E2%80%93%20S%C3%A9rie%20Trabalho%20Remoto&url=https%3A%2F%2Fdevpleno.com%2Fprocesso-seletivo-da-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprocesso-seletivo-da-toptal)",
      "description": "Seu objetivo é trabalhar remotamente por meio da Toptal? Neste vídeo, você vai entender como funciona o processo seletivo. <div className=&#34;embedresponsive ...",
      "keywords": [
        "https",
        "toptal",
        "seletivo",
        "blog",
        "carreira",
        "processo",
        "mais",
        "profissionais",
        "reactjs",
        "devreactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/processo-seletivo-da-toptal"
      }
    },
    {
      "id": "b251c24eb5260f40",
      "url": "https://devpleno.com/blog/fs-extra/index",
      "title": "Fs-extra - Filesystem com Promises e mais funcionalidades",
      "content": "O Fs-extra é uma forma de otimizar as funcionalidades do SF normal do node. Primeiramente, temos que executar o comando yarn sf-extra. Uma utilidade interessante do SF-extra é que, importando o outputFile, é possível criar um arquivo, um TXT, por exemplo. Ele funciona tanto com callback quanto com promises.\n\n```jsx\nfs.outputFile('file.txt', 'olá').then(() => console.log('ok'))\n```\n\nCom isso, ele irá criar um arquivo file.txt com o texto _olá_ dentro e o console nos enviará uma mensagem _ok_. Isso possibilita usarmos mais facilmente com async await, generator e por aí vai. Outra coisa interessante é que ele trás alguns métodos que não são comuns no FS como o fs.copy, que é possível copiar o arquivo diretamente por ele usando uma versão 'promiseficada'.\n\n```jsx\nfs.copy('file.txt', 'file2.txt').then(() => console.log('ok'))\n```\n\nAssim. será criado um arquivo file2.txt copiando o arquivo file.txt Este foi apenas uma pequena apresentação do FS-extra, ele permite utilizarmos mais tranquilamente essas novidades do ES6, ES7, async await e por ai vai, isso fica muito legal para usarmos com promises.\n\nEle também agiliza bastante, já que com generator poderíamos, por exemplo, só usar o yield fs.copy sem mesmo usar o then, e já resolveria a promise tranquilamente.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/fTf-fORqQrs\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "arquivo",
        "extra",
        "file",
        "embed",
        "then",
        "console",
        "isso",
        "copy",
        "responsive",
        "https"
      ],
      "metadata": {
        "title": "Fs-extra - Filesystem com Promises e mais funcionalidades",
        "date": "2017-05-15",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "FS-EXTRA-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/fs-extra/index.md"
      }
    },
    {
      "id": "b25ca7341453d267",
      "url": "https://devpleno.com/blog/como-encadear-promises/index",
      "title": "Como encadear promises (Part 2)",
      "content": "Vamos dizer a ele para ler o nosso arquivo e em seguida escrever um outro arquivo, o problema é que se fizermos dessa forma, quando ele passar 'parseando' o código, ele já vai executar esse primeiro writeFile, se não estivéssemos passando um file, poderíamos fazer isso direto, mas como isso não acontece, temos que utilizar o bind, pois ele vai criar uma nova função, a onde eu posso passar o contexto que eu quero executar essa função e fazer um curring fixando alguns atributos da esquerda para a direita:\n\n```jsx\nreadFile('promises.js').then(writeFile.bind(null, 'tst2.js'))\n```\n\nA grande dica é entender como funciona isso. Podemos colocar um then após o outro, podemos fazer um novo teste:\n\n```jsx\nconst out (contents) => {\n  return new Promise(resolve =>{\n    setTimeout(() => {\n      console.log(contents)\n\n      resolve()\n    }, 2000)\n  })\n}\n```\n\nCom isso, caso a gente queira fazer um teste no then, podemos fazer o seguinte:\n\n```jsx\nreadFile('promises.js')\n  .then(out)\n  .then(() => console.log('final'))\n```\n\nRetornando as promises nós conseguimos encadear, essa é uma grande vantagem em relação a um callback, afinal conseguimos fazer o código crescer para baixo ao invés de crescer para frente, evitamos o callback hell.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-xcbKhbk2ec\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "contents",
        "promises",
        "promise",
        "para",
        "fazer",
        "then",
        "readfile",
        "writefile",
        "isso",
        "arquivo"
      ],
      "metadata": {
        "title": "Como encadear promises",
        "date": "2017-08-31",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ENCADEAR-PROMISES-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/como-encadear-promises/index.md"
      }
    },
    {
      "id": "b26e5429f2548fcc",
      "url": "https://devpleno.com/blog/18",
      "title": "Blog - Página 18 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 18 de mai. de 2017 Criando componente mais simples e eficaz em React](/stateless-functional-component)\n\n[Carreira 17 de mai. de 2017 Como organizar os estudos em tecnologia](/como-organizar-os-estudos-em-tecnologia)\n\n[Javascript 17 de mai. de 2017 React-router-dom: como injetar props em rotas em ReactJS](/router-props-2)\n\n[Javascript 16 de mai. de 2017 Faker - Como gerar grandes massas de dados fictícios para testes](/dados-ficticios-para-testes)\n\n[Javascript 16 de mai. de 2017 3 dicas para NPM + 1 dica extra](/dicas-paranpm)\n\n[Carreira 15 de mai. de 2017 Como cobrar por Software](/como-cobrar-por-software)\n\n[Javascript 15 de mai. de 2017 Fs-extra - Filesystem com Promises e mais funcionalidades](/fs-extra)\n\n[Javascript 15 de mai. de 2017 Hands-on - Socket.io Parte 3](/hands-on-socket-io-parte-3)\n\n[Fundamentos 15 de mai. de 2017 Web Basic - RESTful](/o-que-e-restful)\n\n[Carreira 15 de mai. de 2017 Por que todo Dev usa Mac?](/por-que-todo-dev-usa-mac)\n\n[Javascript 15 de mai. de 2017 Servidor HTTP Básico - NodeJS Primeiros Passos](/servidor-http-basico-2)\n\n[Fundamentos 12 de mai. de 2017 Aplicação Web - Entendendo Back-end e Front-end](/aplicacao-web)\n\n[Anterior](/blog/17)18 / 26[Próxima](/blog/19)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "como",
        "carreira",
        "para",
        "fundamentos",
        "blog",
        "nodejs",
        "reactjs",
        "extra"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/18"
      }
    },
    {
      "id": "b3295c01b0d1b6e6",
      "url": "https://devpleno.com/tag/javascript/6",
      "title": "Javascript - Pagina 6 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 29 de jul. de 2017 Módulo Co - Organize o fluxo de seu código assíncrono](/modulo-co)\n\n[Javascript 28 de jul. de 2017 Float e precisão](/float-e-precisao)\n\n[Javascript 28 de jul. de 2017 Nodemon: Monitore alterações e reinicie automaticamente seus scripts](/hands-on-nodemon)\n\n[Javascript 27 de jul. de 2017 Bind - Altere comportamento e contexto de execução de suas funções](/bind)\n\n[Javascript 27 de jul. de 2017 Fetch - Uma nova forma de fazer requisições HTTP](/fetch-hands-on)\n\n[Javascript 24 de jul. de 2017 Standard - Padronize o código fonte JavaScript da sua equipe](/standard-parte-1)\n\n[Javascript 24 de jul. de 2017 Standard Parte 2](/standard-parte-2)\n\n[Javascript 20 de jul. de 2017 Factory Function em JavaScript](/factory-function)\n\n[Javascript 19 de jul. de 2017 Construindo um App gerenciador de séries com ReactJS](/gerenciador-de-series-p1)\n\n[Javascript 11 de jul. de 2017 Minicurso Socketio - Parte 05 - Colocando o projeto no ar](/minicurso-socket-io-parte-5)\n\n[Javascript 10 de jul. de 2017 Minicurso Socket.IO Parte 4 - Separando notificações por Rooms](/minicurso-socket-io-parte-4)\n\n[Javascript 8 de jul. de 2017 Jest - Como utilizar a ferramenta de testes criada pelo Facebook](/hands-on-jest)\n\n[Anterior](/tag/javascript/5)6 / 16[Próxima](/tag/javascript/7)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "parte",
        "standard",
        "minicurso",
        "reactjs",
        "hands",
        "socket",
        "algoritmos",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/6"
      }
    },
    {
      "id": "b35570f8cd134d21",
      "url": "https://devpleno.com/blog/formatos-de-troca-de-dados/index",
      "title": "Formatos de troca de dados em Aplicações Web (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/BBNYp0YsE-s\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "dados",
        "para",
        "name",
        "quando",
        "requisi",
        "mais",
        "como",
        "body",
        "temos",
        "json"
      ],
      "metadata": {
        "title": "Formatos de troca de dados em Aplicações Web",
        "date": "2017-05-19",
        "tags": "['Fundamentos']",
        "thumbnail": "TROCA-DE-DADOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/formatos-de-troca-de-dados/index.md"
      }
    },
    {
      "id": "b3884706e5d37850",
      "url": "https://devpleno.com/blog/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose/index",
      "title": "Mongoose: corrigindo \"Cannot overwrite ''Model'' model once compiled\" (Part 1)",
      "content": "Durante o desenvolvimento de um protótipo aqui na empresa, eu me deparei com uma situação bem interessante no Mongoose. Por algum motivo, comecei a receber o seguinte erro: _OverwriteModelError: Cannot overwrite \\`User\\` model once compiled. _\n\n```jsx\nC:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\node\\_modules\\\\mongoose\\\\lib\\\\index.js:361\n      throw new mongoose.Error.OverwriteModelError(name);\n      ^\n OverwriteModelError: Cannot overwrite \\`User\\` model once compiled.\n    at Mongoose.model (C:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\node\\_modules\\\\mongoose\\\\lib\\\\index.js:361:13)\n    at Object.<anonymous> (C:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\User.js:8:27)\n    at Module.\\_compile (module.js:413:34)\n    at Object.Module.\\_extensions..js (module.js:422:10)\n    at Module.load (module.js:357:32)\n    at Function.Module.\\_load (module.js:314:12)\n    at Module.require (module.js:367:17)\n    at require (internal/module.js:16:19)\n    at Object.<anonymous> (C:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\postsController.js:1:74)\n    at Module.\\_compile (module.js:413:34)\n    at Object.Module.\\_extensions..js (module.js:422:10)\n    at Module.load (module.js:357:32)\n    at Function.Module.\\_load (module.js:314:12)\n    at Module.require (module.js:367:17)\n    at require (internal/module.js:16:19)\n    at Object.<anonymous> (C:\\\\Arquivos\\\\devpleno\\\\conteudos\\\\mongoose-problem-windows\\\\index.js:6:1)\n```\n\nO que me intrigou muito foi que sempre utilizei o Mongoose praticamente da mesma forma. O exemplo que gerou este erro é este aqui:\n\n```jsx\nvar mongoose = require('mongoose')\nmongoose.connect('mongodb://localhost/mongoose-problem')\n\nrequire('./usersController.js')\nrequire('./postsController.js')\n```\n\nO model User:\n\n```jsx\nvar mongoose = require('mongoose')\n\nvar userSchema = mongoose.Schema({\n  email: String,\n  password: String\n})\n\nmodule.exports = mongoose.model('User', userSchema)\n```",
      "keywords": [
        "module",
        "mongoose",
        "user",
        "require",
        "windows",
        "model",
        "devpleno",
        "erro",
        "problem",
        "digo"
      ],
      "metadata": {
        "title": "Mongoose: corrigindo \"Cannot overwrite ''Model'' model once compiled\"",
        "date": "2016-10-03",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "nodejs-mongoose-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose/index.md"
      }
    },
    {
      "id": "b3bedbdcc345c75b",
      "url": "https://devpleno.com/blog/metas-na-carreira-de-desenvolvedor/index",
      "title": "Metas na carreira de desenvolvedor (Part 1)",
      "content": "Metas são muito importantes tanto para nossa carreira quanto para nossa vida.\n\n**Você define metas para sua carreira?**\n\n**Você sabe aonde quer estar daqui dez anos?**\n\n**Quais conhecimentos quer ter daqui um ano?**\n\nUm exercício que eu faço para minha vida, e acredito que você consiga adaptar para a sua, é definir algumas metas pessoais relacionadas a parte acadêmica, como aprender alguma linguagem de programação ou framework por ano. No meu caso, não é só aprender, eu meço se eu domino e se consigo fazer um projeto envolvendo essa tecnologia para um cliente.\n\nPor exemplo, minha meta anos atrás era aprender Minstech e só percebi que dominava quando consegui concluir um projeto com Minstech. Hoje já é natural para mim trabalhar com essa tecnologia.\n\nPodemos criar outras metas também, até mesmo relacionadas com hobby. No momento, estou focado em aprender a tocar guitarra, pois é algo que sempre gostei. Minha meta é simplesmente tocar de 40 minutos a 1 hora por dia. Nesse período, eu paro exclusivamente para estudar guitarra.\n\nEste tipo de meta é muito bom, pois quanto mais você faz isso constantemente, mais você melhora como pessoa, pois transforma sua vida através de metas.\n\nPodem ser coisas simples: Tem que escrever algo? Escreva um parágrafo por dia, isso já vai adicionar muito em um período e no final das contas você acaba gerando um produto muito grande baseado em pequenas metas.\n\nEu conheço muitas linguagens de programação atualmente. Consigo coordenar, projetar e desenvolver em muitas tecnologias diferentes, mas tudo começou com uma primeira, como PHP, Java, JavaScript, etc.\n\nPara finalizar, não postergue suas metas! Se você tem a meta de aprender uma linguagem por ano, se organize e cumpra. Se começar a postergar, nunca irá realizar isto.\n\nPara ser um profissional melhor, é importante criar essas pequenas metas e cumpri-las, pois ao longo do tempo a evolução ocorre de forma fantástica.\n\nDeixe sugestões de temas para os próximos posts.",
      "keywords": [
        "para",
        "metas",
        "aprender",
        "muito",
        "meta",
        "pois",
        "vida",
        "minha",
        "como",
        "nossa"
      ],
      "metadata": {
        "title": "Metas na carreira de desenvolvedor",
        "date": "2017-05-22",
        "tags": "['Carreira']",
        "thumbnail": "Metas.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/metas-na-carreira-de-desenvolvedor/index.md"
      }
    },
    {
      "id": "b3c387f1a963adcf",
      "url": "https://devpleno.com/patternite",
      "title": "Entenda o que é Patternite - DevPleno (Part 2)",
      "content": "Precisamos criar um diretório Views e dentro dele o home.ejs, ai sim, lá dentro, fazer o nosso html:\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;tittle>POO2JS&#x3C;/tittle>\n&#x3C;/head>\n&#x3C;body>\n&#x3C;h1>Olá&#x3C;/h1>\n&#x3C;/body>\n&#x3C;/html>\nIsso são coisas que naturalmente eu iria perceber que iria acontecer. Caso a gente queira criar mais páginas, começa a perceber que existe um certo padrão. Se quiséssemos saber como a minha aplicação está realmente funcionando, é muito melhor saber qual a URL e para onde ele manda.\n\nPara não ficar uma bagunça, poderíamos por exemplo, criar um arquivo routes e colocar nossas rotas lá dentro:\n\nconst app = require('express').Router()\napp.get('/', (req, res) => {\nres.render('home')\n})\napp.get('/page1', (req, res) => {\nres.render('page1')\n})\napp.get('/page2', (req, res) => {\nres.render('page2')\n})\nmodule.exports = app\nAgora, no nosso código inicial, podemos fazer o seguinte:\n\nconst express = require('express')\nconst app = express()\napp.set('view engine', 'ejs')\nconst routes = require('./routes')\napp.use(routes)\napp.listen(3000, (err) => console.log(err, 'server'))\nPerceba que eu estou classificando as coisas de uma maneira que faz sentido para mim. A gente começou simplesmente com o arquivo index.\n\nEntão o meu conselho é que se comece construindo tudo em um arquivo apenas e, com o tempo, você percebe que as coisas conseguem se agrupar.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Entenda%20o%20que%20%C3%A9%20Patternite&url=https%3A%2F%2Fdevpleno.com%2Fpatternite) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpatternite)",
      "description": "Hoje eu gostaria de falar sobre um item que é bastante impeditivo quando as pessoas que já tem experiência tentam vir para o JavaScript. Eu chamava isso de...",
      "keywords": [
        "express",
        "const",
        "para",
        "https",
        "javascript",
        "mais",
        "criar",
        "dentro",
        "require",
        "pattern"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/patternite"
      }
    },
    {
      "id": "b3d872959440be98",
      "url": "https://devpleno.com/nova-skills-preco-que-tem-que-ser-pago",
      "title": "Novas Skills: O preço que tem que ser pago - DevPleno (Part 2)",
      "content": "Se pararmos um pouco de cuidar dessa Skill, ela começa a ser esquecida, pois ela não está enraizada em você, e por esse motivo é muito importante na nossa carreira continuar estudando para não perder esses conhecimentos.\n\nReflita sobre isso.\n\nÀs vezes na vida estamos reclamando de alguma coisa, mas evitamos pagar o preço para alcançar esse objetivo.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Novas%20Skills%3A%20O%20pre%C3%A7o%20que%20tem%20que%20ser%20pago&url=https%3A%2F%2Fdevpleno.com%2Fnova-skills-preco-que-tem-que-ser-pago) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnova-skills-preco-que-tem-que-ser-pago)",
      "description": "Recentemente ministrei uma palestra e passei a refletir o quanto de tempo nós que investir para conseguir realizar alguma coisa. Conhecimento ou Skills são...",
      "keywords": [
        "para",
        "tempo",
        "pagar",
        "https",
        "quero",
        "carreira",
        "skills",
        "alguma",
        "skill",
        "come"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/nova-skills-preco-que-tem-que-ser-pago"
      }
    },
    {
      "id": "b420ca12df195ee8",
      "url": "https://devpleno.com/blog/once-n-vezes/index",
      "title": "Once N vezes (Part 2)",
      "content": "```jsx\nfunction once(fn, context) {\n  let result\n  let contador = 0\n  return function () {\n    contador++\n    if (contador === 0) {\n      result = fn.apply(context || this)\n    }\n    contador++\n    return result\n  }\n}\n```\n\nPodemos aumentar isso ainda mais, dizer o número máximo de vezes que queremos que chame a função, por exemplo.\n\n```jsx\nfunction once(fn, max, context){\n    let result\n    let contador = 0\n    return function(){\n        contador++\n        if(contador<max){\n            result = fn.apply(context || this)\n        }\n        contador++\n        return result\n    }\n}\nconst func1 = once(function){\n    console.log('opah')\n}, 2)\n```\n\nEssa técnica é muito poderosa para fazer alguns tipos de restrições.\n\nPerceba que fizemos duas coisas: travar a função para rodar apenas uma vez e em seguida rodar um número N de vezes que determinamos utilizando a mesma técnica.\n\nConfira o passo a passo no vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/6dB2dVep_UQ\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "contador",
        "function",
        "result",
        "once",
        "para",
        "isso",
        "return",
        "essa",
        "func1",
        "vezes"
      ],
      "metadata": {
        "title": "Once N vezes",
        "date": "2017-05-22",
        "tags": "['Algoritmos']",
        "thumbnail": "OnceNVezes.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/once-n-vezes/index.md"
      }
    },
    {
      "id": "b436058ee93675ef",
      "url": "https://devpleno.com/blog/pilha/index",
      "title": "Estruturas de Dados - Pilhas (Part 2)",
      "content": "```jsx\n    } else {\n        const itemToReturn = data[top]\n        data.splice(top, 1)\n        top--\n        return itemToReturn\n    }\n```\n\nO splice já faz essa fatia, cortando nosso array no item top.\n\nAcabamos de implementar uma pilha. É muito interessante conhecer o que é pilha, faz mais sentido quando recebemos os erro stack overflow, acontece que as estruturas de dados vão se empilhando tanto que não aguenta mais o tamanho, por esse motivo é um erro bem comum.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/DnHSTYuk-V4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "const",
        "data",
        "vetor",
        "push",
        "stack",
        "console",
        "item",
        "return",
        "pilha",
        "temos"
      ],
      "metadata": {
        "title": "Estruturas de Dados - Pilhas",
        "date": "2017-08-21",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "Pilha.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/pilha/index.md"
      }
    },
    {
      "id": "b447040b1c3e5460",
      "url": "https://devpleno.com/blog/express-generator/index",
      "title": "Gere seu projeto em Express - Hands-on: Express-Generator (Part 1)",
      "content": "Neste hands-on, vamos falar sobre o Express-Generator, um gerador de projetos em expressJS. Com ele conseguimos criar a base da nossa aplicação. Primeiramente, para instalar o generator, faça o seguinte comando:\n\n```jsx\nnpm install -g express-generator\n```\n\nLembrando que usando o express -h aparece uma lista com algumas opções, o que é muito legal para podermos escolher a linguagem de template que queremos utilizar, como por exemplo --ejs. O default dele é o --pug ou --jade.\n\nÉ possível também adicionar um compilador de CSS. Para o exemplo ficar mais completo, vou colocar tudo no projeto. No diretório pai que quero construir minha aplicação, vou colocar:\n\n```jsx\ndica-express --ejs --git --css sass\n```\n\nE em seguida, para instalar as dependencias, vou digitar:\n\n```jsx\nyarn\n```\n\nFeito isso, se dermos um cd dica-express/ acessamos o diretório e com o ls -l podemos ver que temos todo os arquivos com detalhe. Usando o ./ podemos abrir no visual code e ver a estrutura que acabamos de criar com o express-generator:\n![Visualizando o VSCode](bb74c12b-39a9-4e93-bd5c-ef7516e54765.png)\n\nÉ interessante, pois a aplicação é construida no app.js e ainda cria uma boa prática, que é exportar o app, e quem vai iniciar esse app (no caso o bin/www) é quem vai definir as portas e etc.\n\nQual a vantagem disso? Quando formos criar testes em trend para EPI, por exemplo, podemos importar o app e rodar os testes em cima disso e não necessariamente abrir uma porta. O teste controla isso. Na pasta pub, tem o meu style.sass, que é o meu estilo configurado para SaSS.\n\nNo package.json, já tem alguns scripts para conseguirmos utilizar. Podemos, então, fazer um yarn start para abrir o projeto no browser utilizando o localhost:3000 . Perceba que ele já faz a compilação do SaSS pelo app\n\nvar sassMiddleware = require('node-sass-middleware');",
      "keywords": [
        "para",
        "express",
        "sass",
        "generator",
        "aplica",
        "podemos",
        "embed",
        "criar",
        "exemplo",
        "abrir"
      ],
      "metadata": {
        "title": "Gere seu projeto em Express - Hands-on: Express-Generator",
        "date": "2017-06-06",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "EXPRESS-GENERATOR-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/express-generator/index.md"
      }
    },
    {
      "id": "b454d50a4b2686aa",
      "url": "https://devpleno.com/precificacao-em-software",
      "title": "Dica: Precificação em Software - DevPleno",
      "content": "Carreira\n\n## Dica: Precificação em Software\n\nT\nPor Tulio Faria • 24 de abril de 2017\n\n[Carreira](/tag/carreira)\n\nUma dúvida comum em desenvolvedores é como precificar softwares. Neste vídeo, comento como eu costumo cobrar e dicas de como você pode fazer de maneira justa para você e para seu cliente.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Precifica%C3%A7%C3%A3o%20em%20Software&url=https%3A%2F%2Fdevpleno.com%2Fprecificacao-em-software) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprecificacao-em-software)",
      "description": "Uma dúvida comum em desenvolvedores é como precificar softwares. Neste vídeo, comento como eu costumo cobrar e dicas de como você pode fazer de maneira jus...",
      "keywords": [
        "https",
        "carreira",
        "software",
        "como",
        "para",
        "dica",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fprecificacao"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/precificacao-em-software"
      }
    },
    {
      "id": "b532e677b7ce7de4",
      "url": "https://devpleno.com/blog/autenticacao-e-autorizacao/index",
      "title": "Autenticação e Autorização - Entenda os termos (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "autentica",
        "temos",
        "sistema",
        "para",
        "autoriza",
        "algo",
        "embed",
        "dois",
        "quando",
        "vamos"
      ],
      "metadata": {
        "title": "Autenticação e Autorização - Entenda os termos",
        "date": "2017-06-06",
        "tags": "['Fundamentos']",
        "thumbnail": "AUTENTICAÇÃO-X-AUTORIZAÇÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/autenticacao-e-autorizacao/index.md"
      }
    },
    {
      "id": "b55e3c52bdb44cd6",
      "url": "https://devpleno.com/blog/10-dicas-de-produtividade-para-programadores/index",
      "title": "10 dicas de produtividade para programadores (Part 1)",
      "content": "Ser um profissional produtivo é uma exigência do mercado de trabalho no cenário altamente competitivo em que vivemos. Os resultados são requisitados cada vez mais rapidamente e sempre com a melhor qualidade. E aqueles profissionais que conseguem atender a essa demanda são muito valorizados.\n\nNa era digital, porém, há muitas distrações que podem fazer os níveis de [produtividade](https://www.devpleno.com/como-aumentar-a-produtividade?utm_source=blog&utm_campaign=rc_blogpost) despencar. É assim em todas as áreas, inclusive no mundo do desenvolvimento de _software_. Contudo, existem soluções e comportamentos que podem ajudar a melhorar isso. Apresentamos algumas dicas de produtividade na lista a seguir.\n\n## 1\\. Escolha a ferramenta certa\n\nHá diversas ferramentas que podem ser utilizadas para organizar os fluxos de trabalho e, assim, melhorar a sua produtividade. Elas auxiliam em diferentes atividades. Confira:\n\n### Gestão de projetos\n\nPlanejamento e produtividade sempre andam de mãos dadas. Um bom planejamento aumenta a produtividade, mas a falta dele pode fazer com que algumas tarefas sejam adiadas caso haja atrasos em atividades das quais dependem. Com essa quebra de sequência e os constantes retornos aos processos anteriores, a produtividade cai.\n\nEntre os programas que podem ajudar você em seus projetos estão o [Gantter](https://gantter.com?utm_source=blog&utm_campaign=rc_blogpost) (integrável ao Drive do Google), e o [MS Project](https://products.office.com/pt-br/project/project-management?utm_source=blog&utm_campaign=rc_blogpost), da Microsoft. Com eles, é possível definir o cronograma detalhado do projeto, com prazos para cada atividade e relação de dependência entre elas. Enquanto o Project apresenta mais funcionalidades que o Gantter, este último é gratuito e online — e eles são compatíveis.\n\n### Gestão de tarefas",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "para",
        "produtividade",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "title": "10 dicas de produtividade para programadores",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "106696-10-dicas-de-produtividade-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "revisor": "['Renato Siqueira']",
        "chunkIndex": 0,
        "totalChunks": 6,
        "sourcePath": "blog/10-dicas-de-produtividade-para-programadores/index.md"
      }
    },
    {
      "id": "b562aec3cae8293a",
      "url": "https://devpleno.com/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira",
      "title": "Como as maratonas de programação da faculdade impactaram a minha carreira - DevPleno (Part 1)",
      "content": "Carreira\n\n## Como as maratonas de programação da faculdade impactaram a minha carreira\n\nT\nPor Tulio Faria • 19 de março de 2019\n\n[Carreira](/tag/carreira)\n\nA história do post de hoje já tem mais de 10 anos e faz parte de lembranças que eu tenho de quando ainda estava na faculdade, mais precisamente, de quando participava das maratonas de programação, onde me graduei. E fique comigo até o fim, pois a lição aqui não é só baseada nos prêmios e competição, mas tem total relação a minha aprovação na Toptal.\n\nEsses são prêmios que ganhei participando das competições de programação. Apesar de simbólicos, eles não estão aqui para me gabar ou algo assim, mas claro, eles representam muito para mim e para o meu crescimento profissional e carregam histórias e lembranças da minha evolução como dev.\n\nNa época foi gratificante, por exemplo, em uma competição onde havia alunos de todos os períodos, ter ficado em primeiro lugar mesmo competindo com o pessoal prestes a se formar (que além de mais experiência, já tinham participado das semi-finais nacionais da mesma competição).\n\nNo segundo ano de competição, como eu havia vencido no primeiro ano de faculdade, fui com a mentalidade de “já ganhei”. Bom, e aí vem mais uma lição: aprender que nem sempre vencemos. Sim, no meu segundo, fiquei em segundo lugar.\n\nAinda tinha mais 2 anos de competição, dava para vencer mais 2. Sim, sou muito competitivo e isso não é errado se você não deixar a competitividade passar por cima da sua ética.\n\nVamos para terceira vez competindo e… Caramba! Ficamos em segundo de novo! E a mesma equipe que havia nos desbancado no ano anterior venceu novamente. O que mais me chocava era que eles venceram sempre utilizando Pascal (perdemos realizando tudo em C puro).\n\nAntes de ir para a minha última competição, refleti sobre o que eu tinha feito de diferente no primeiro ano e que não fiz nos outros 2 e também sobre como perdemos.",
      "description": "A história do post de hoje já tem mais de 10 anos e faz parte de lembranças que eu tenho de quando ainda estava na faculdade, mais precisamente, de quando ...",
      "keywords": [
        "mais",
        "competi",
        "como",
        "para",
        "minha",
        "carreira",
        "faculdade",
        "maratonas",
        "muito",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira"
      }
    },
    {
      "id": "b58865baca6cb6e4",
      "url": "https://devpleno.com/blog/lista-definitiva-de-sites-para-progradores-remotos/index",
      "title": "Lista de sites para trabalhar remotamente como programador em 2022 (Part 1)",
      "content": "Se tem uma profissão que já se beneficiava dos benefícios de trabalhar remotamente bem antes de virar moda é a de programador. Eu mesmo atuo neste modelo a bastante tempo.\n\nA pergunta que mais recebo é: quais os melhores sites para trabalhar remotamente como programador?\n\nNeste artigo vamos explorar um pouco desta lista. Os links terão uma indicação de quando são de referência meus (fazendo o cadastro por estes links você também pode ganhar alguns benefícios).\n\n## Toptal\n\nUma das empresas mais famosas para trabalhar como programador é a Toptal (Toptal é a junção de Top talent). Um ponto bastante importante é que a Toptal tem 2 formas de trabalho: você pode trabalhar no Core Team (ou seja, na Toptal em si) ou fazer parte do Network da Toptal (trabalhar para clientes da Toptal). E sim, é no Network que a Toptal é reconhecida por ter um processo seletivo bastante exigente - onde apenas 3% dos aplicantes conseguem passar, e também, é a forma que eu tenho relacionamento com eles.\n\nNo Network da Toptal, após passar pelo processo seletivo, você poderá ser alocado em clientes (que também passam por um processo seletivo). A Toptal cuidará de tudo que é burocrático (inclusive pagamento) e você somente tem que trabalhar/programar.\n\nA forma de trabalho pode variar entre: horista (ou por hora), part-time (meio-período - 4 horas por dia) ou full-time (período integral - 8 horas por dia).\n\n[Entre aqui para fazer seu cadastro na Toptal!](https://www.toptal.com/qaVGKx/worlds-top-talent). Algumas especialidades (React e React-native são uma delas) dão bônus de USD 2500 para ambos, para mim e para você que se cadastrou.\n\n# Scalable Path\n\nA Scalable Path é bastante semelhante ao Network da Toptal, porém, eles não possuem o screening process inicial. Assim, você cria seu perfil para que os recrutadores da Scalable Path te achem e façam a ponte com a empresa.\n\nUma ótima pedida para as primeiras experiências.",
      "keywords": [
        "para",
        "https",
        "toptal",
        "bastante",
        "vagas",
        "trabalhar",
        "como",
        "crossover",
        "jobs",
        "linkedin"
      ],
      "metadata": {
        "title": "Lista de sites para trabalhar remotamente como programador em 2022",
        "date": "2021-09-05",
        "tags": "['Carreira']",
        "thumbnail": "lista-trabalho-remoto.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/lista-definitiva-de-sites-para-progradores-remotos/index.md"
      }
    },
    {
      "id": "b5bb6e2c5f51ddda",
      "url": "https://devpleno.com/grupovipfsm",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /grupovipfsm to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "grupovipfsm"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/grupovipfsm"
      }
    },
    {
      "id": "b5cebbc357505c64",
      "url": "https://devpleno.com/request-e-response",
      "title": "Request e Response - DevPleno (Part 1)",
      "content": "Javascript\n\n## Request e Response\n\nT\nPor Tulio Faria • 22 de maio de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nNos posts anteriores já falamos sobre back-end, front-end, como eles se comunicam através de uma requisição, e agora você verá um exemplo prático de um request e um response.\n\nVamos usar o NodeJS, mas não é obrigatório focar nisso, pois depois vou falar exclusivamente sobre ele. Toda vez que você entra em um site, como o google, está fazendo um GET no [Google](https://www.google.com/).\n\nComo checar se isso está realmente acontecendo?\n\nNo caso do Windows, apertamos F12 usando o Chrome e então irá aparecer esta aba Network:\n\nPerceba que temos várias abas, isso é uma barra de desenvolvimento. A medida que formos avançando iremos passar por algumas delas. O importante para agora é o Network, aperte o F5 e irá aparecer muitas requisições:\n\nSe você clicar em alguma delas, é possível ver tudo sobre ela, e uma das coisas é o request method do tipo GET, qual o servidor, etc. Temos também o response reader logo a baixo:\n\nNo caso do GET, não temos um Request Body, mas temos um Response Body, que fica ao lado de preview. Lá seria a pagina inicial do google já retornada para o usuário. Agora vamos fazer o seguinte: quando vier um GET em ’/’ irei retornar todos os GET’s da requisição e os dados de resposta em uma function req e res, pegamos o requests da requisição e devolvo ao cliente.\n\nvar express = require ('express');\nvar app express();\napp.get('/', function (req, res){\n//res.send('Esta é uma requisição GET.');\n//res.send(req.query);\nres.send(req.headers);\n});\nQuando rodarmos o exemplo irá aparecer o seguinte:\n\nMostrando todos os Headers que eu solicitei.",
      "description": "Nos posts anteriores já falamos sobre backend, frontend, como eles se comunicam através de uma requisição, e agora você verá um exemplo prático de um reque...",
      "keywords": [
        "requisi",
        "https",
        "request",
        "response",
        "temos",
        "para",
        "express",
        "send",
        "post",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/request-e-response"
      }
    },
    {
      "id": "b61fae1d8e8b5112",
      "url": "https://devpleno.com/metas-na-carreira-de-desenvolvedor",
      "title": "Metas na carreira de desenvolvedor - DevPleno (Part 2)",
      "content": "Para ser um profissional melhor, é importante criar essas pequenas metas e cumpri-las, pois ao longo do tempo a evolução ocorre de forma fantástica.\n\nDeixe sugestões de temas para os próximos posts.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Metas%20na%20carreira%20de%20desenvolvedor&url=https%3A%2F%2Fdevpleno.com%2Fmetas-na-carreira-de-desenvolvedor) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmetas-na-carreira-de-desenvolvedor)",
      "description": "Metas são muito importantes tanto para nossa carreira quanto para nossa vida. Você define metas para sua carreira? Você sabe aonde quer estar daqui dez ano...",
      "keywords": [
        "para",
        "metas",
        "carreira",
        "https",
        "aprender",
        "muito",
        "meta",
        "pois",
        "desenvolvedor",
        "vida"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/metas-na-carreira-de-desenvolvedor"
      }
    },
    {
      "id": "b6863db139fb05f7",
      "url": "https://devpleno.com/blog/precisa-ter-diploma-para-a-toptal/index",
      "title": "Precisa ter diploma para trabalhar por meio da Toptal?",
      "content": "Você não é graduado, mas quer trabalhar por meio da Toptal? Entenda se isso é possível ou não neste vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/pYXf9DXnBgI\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\nSaiba mais [sobre o DevReactJS aqui.](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)",
      "keywords": [
        "embed",
        "responsive",
        "mais",
        "profissionais",
        "toptal",
        "classname",
        "iframe",
        "https",
        "reactjs",
        "devreactjs"
      ],
      "metadata": {
        "title": "Precisa ter diploma para trabalhar por meio da Toptal?",
        "date": "2018-02-15",
        "tags": "['Carreira']",
        "thumbnail": "GradcacaodDiploma.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/precisa-ter-diploma-para-a-toptal/index.md"
      }
    },
    {
      "id": "b6a48bc1c8ca15b4",
      "url": "https://devpleno.com/normalizar-email",
      "title": "Normalizar-email - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Normalizar-email&url=https%3A%2F%2Fdevpleno.com%2Fnormalizar-email) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnormalizar-email)",
      "description": "Hoje eu quero comentar um detalhe de implementação de email muito interessante e como podemos contornar essa característica que temos em alguns endereços d...",
      "keywords": [
        "mail",
        "email",
        "https",
        "devpleno",
        "americanas",
        "podemos",
        "tuliofaria",
        "esse",
        "normalize",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/normalizar-email"
      }
    },
    {
      "id": "b6c89ee87c3c5fe9",
      "url": "https://devpleno.com/postman-como-testar-apis",
      "title": "Postman - Como testar APIs - Hands-on - DevPleno (Part 2)",
      "content": "Se for uma API, você pode mandar um exemplo de API para o usuário e ele precisa apenas mudar a parte de autenticação. Mas caso você mesmo queira trocar a autenticação, basta ir em Authorization, nele você diz qual o tipo de autenticação está usando. Lembrando que sempre que fizer algo em Authorization precisa dar um update request para atualizar os Headers correspondentes.\n\nSe clicarmos em Send ele irá executar e retornar com o status. No nosso caso deu OK, tempo 391ms, todos os headers que tivemos e em body é possível visualizar como Pretty, Raw e Preview. Veja o exemplo abaixo:\n\nVamos criar mais uma requisição, mas dessa vez um POST utilizando o link https://httpbin.org/post, mas podemos criar todos os métodos do HTTP.\n\nVamos criar mais uma requisição, mas dessa vez um POST utilizando o link https://httpbin.org/post, mas podemos criar todos os métodos do HTTP.\n\nPerceba que o POST suporta body, então é possível mandar dados para ele. Vou mandar um name e enviar Tulio:\n\nO form retorna com o valor que coloquei.\n\nTambém podemos enviar um arquivo apenas mudando o text para file.\n\nTemos o environment, que cria alguns ambientes e podemos customizar os requests baseados neles, mas basicamente, para mim, já é possível usar boa parte apenas usando collections e requisições.\n\nConfira todos detalhes no vídeo:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Postman%20-%20Como%20testar%20APIs%20-%20Hands-on&url=https%3A%2F%2Fdevpleno.com%2Fpostman-como-testar-apis) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpostman-como-testar-apis)",
      "description": "O Postman é uma ferramenta indispensável para o desenvolvimento de aplicativos API, principalmente Rest API, pois ele é um client para uma API em Rest. Exi...",
      "keywords": [
        "para",
        "como",
        "https",
        "criar",
        "poss",
        "requisi",
        "podemos",
        "todos",
        "postman",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/postman-como-testar-apis"
      }
    },
    {
      "id": "b6c960a467a63c11",
      "url": "https://devpleno.com/multer-upload-de-imagens-com-nodejs-e-express",
      "title": "Multer upload de imagens com nodejs e express - DevPleno (Part 1)",
      "content": "Javascript\n\n## Multer upload de imagens com nodejs e express\n\nT\nPor Tulio Faria • 29 de novembro de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nHoje vou mostrar uma dica rápida de como podemos fazer upload no NodeJS utilizando o Express. Para isso vamos utilizar o Multer.\n\nA primeira coisa que vamos fazer é o seguinte:\n\nyarn add express ejs multer\nAgora, com o Visual Studio Code aberto, vamos criar um arquivo novo index.js e também uma pasta view com um arquivo home.ejs dentro dele, em seguida faremos o seguinte em index.js:\n\nconst express = require('express')\nconst app = express()\napp.set('view-engine', 'ejs')\napp.get('/', (req, res) => res.render('home'))\napp.post('/', (req, res) => {\nconsole.log(req.body, req.files)\nres.send('ok')\n})\napp.listen(3000, () => console.log('running...'))\nJá dentro de home.ejs vai ter o seguinte:\n\n&#x3C;h1>Upload&#x3C;/h1>\n\n&#x3C;form method=\"post\" ectype=\"multipart/form-data\">\n&#x3C;input type=\"file\" name=\"img\" />\n&#x3C;button type=\"submit\">Enviar&#x3C;/button>\n&#x3C;/form>\nO ‘enctype=”multipart/form-data”’ significa que vamos mandar os campos em vários formatos.\n\nQuando enviamos uma foto, por exemplo, vai retornar dois undefined, isso significa que não estamos tratando nem o file e nem o body, por isso precisamos do multer.\n\nO multer é um middleware, por esse motivo conseguimos rodar antes da requisição:\n\nconst express = require('express')\nconst app = express()\nconst multer = require('multer')\nconst upload = multer({ dest: 'uploads/' })\napp.set('view-engine', 'ejs')\napp.get('/', (req, res) => res.render('home'))\napp.post('/', upload.single('img'), (req, res) => {\nconsole.log(req.body, req.file)\nres.send('ok')\n})\napp.listen(3000, () => console.log('running...'))\nReparem que agora temos no body um arquivo vazio e o outro undefined traz informações sobre a imagem juntamente com onde foi salva a imagem.\n\nNós conseguimos controlar também qual o nome que vamos dar para essa imagem.",
      "description": "Hoje vou mostrar uma dica rápida de como podemos fazer upload no NodeJS utilizando o Express. Para isso vamos utilizar o Multer. A primeira coisa que vamos...",
      "keywords": [
        "express",
        "multer",
        "const",
        "upload",
        "file",
        "nodejs",
        "vamos",
        "https",
        "require",
        "para"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/multer-upload-de-imagens-com-nodejs-e-express"
      }
    },
    {
      "id": "b708cf35de482db9",
      "url": "https://devpleno.com/blog/escopos-e-closures/index",
      "title": "Escopos e Closures - NodeJS Primeiros Passos (Part 1)",
      "content": "Entender Escopos e Closures do JavaScript é muito importante para conseguir avançar no NodeJS. Primeiramente tenho um diretório criado com nossos exemplos. Vou criar um arquivo novo e mostrar um exemplo básico:\n\n```jsx\nvar a = 10\n\nconsole.log(a)\n```\n\nou simplesmente:\n\n```jsx\na = 10\n\nconsole.log(a)\n```\n\nPerceba que tem apenas uma declaração de variável e o console.log para fazer a saída dela, ou seja, escrever a variável no console. Se rodarmos este script, teremos o retorno 10. Esse tipo de variável está sendo criada no escopo Global, mas o que é interessante nisso? Se eu fizer um function de incrementação a ela, terei um segundo escopo.\n\n```jsx\nvar a = 10\n\nfunction inc() {\n  a++\n}\n\ninc()\n\nconsole.log(a)\n```\n\nEsse segundo escopo consegue enxergar o escopo de fora. Podemos manipular as variáveis do lado de fora. Embora pareça vantagem, em alguns momentos pode atrapalhar o escopo principal. Logo acima, fizemos uma versão sem a variável var. Quando não colocamos o var, não travamos o escopo dela.\n\n```jsx\nvar a = 10\n\nfunction inc() {\n  a++\n\n  b = 11\n}\n\ninc()\n\nconsole.log(a, b)\n```\n\nSe fizermos como no exemplo acima, o segundo escopo já morreu, mas mesmo assim vai sair o valor de b, pois conseguimos escrever o b fora do escopo definido a ele. Então, quando criamos arquivos JavaScript que fazem esse tipo de coisa, estamos sujando o escopo global, e isso não é algo que desejamos fazer.\n\n**Por que?** Vamos supor que exista um outro trecho de código que dependesse desse b, então a função 'inc' estaria alterando essa variável que está no contexto global podendo alterar o comportamento do código, isso para achar bug é extremamente difícil.\n\n**O que podemos fazer para isso não acontecer?** Uma das coisas que podemos utilizar é guardar a variável sendo válida apenas dentro do escopo, utilizando o var, por exemplo:\n\n```jsx\nfunction inc() {\n  a++\n\n  var b = 11\n}\n```",
      "keywords": [
        "escopo",
        "function",
        "console",
        "vari",
        "conta",
        "dentro",
        "fazer",
        "podemos",
        "contador",
        "para"
      ],
      "metadata": {
        "title": "Escopos e Closures - NodeJS Primeiros Passos",
        "date": "2017-05-25",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "ESCOPUS-E-CLOSURES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/escopos-e-closures/index.md"
      }
    },
    {
      "id": "b71d53804bf616df",
      "url": "https://devpleno.com/como-cobrar-por-software",
      "title": "Como cobrar por Software - DevPleno (Part 3)",
      "content": "Faça estimativas das horas gastas no projeto, por exemplo, sua hora custa R$100,00 e o projeto tem uma estimativa de 40 horas, então o projeto custará em torno de R$4.ooo,oo. A partir disso, avalie se esse valor realmente irá trazer o resultado esperado desta hora. (Já teve casos que deixei de passar o orçamento para o cliente porque ficaria muito caro, de acordo com minha disponibilidade, experiência e o que o projeto exigia, não valeria a pena para ele, já que ele não teria o retorno tão rápido disso).\nAvalie se você não está superestimando o valor. A margem de lucro muito alta pode assustar o cliente, já que ele não vai ver seu cálculo sobre o valor.\n\n**Como saber a base para a hora de acordo com o seu nível?**\n\nVocê está atuando como PJ? Se sim, pense o seguinte: R$30,00 por hora para um Junior é um valor interessante, pensando que um Junior rende mais ou menos um terço de uma pessoa com experiência. E para um pleno R$100,00 é um valor muito alto, pois pouquíssimos projetos justificariam este valor, a não ser que sua disponibilidade seja muito pequena e sua especialidade muito grande (em casos de consultorias, por exemplo, poderia subir mais).\nMuitas vezes as pessoas olham no sindicato. Lá as horas são totalmente desproporcionais e não servem de referência. O ideal é ir ajustando, por exemplo, o projeto você estimou que demoraria 40 horas, mas terminou antes, então entrega um pouco mais ao cliente e no próximo você ajusta essa hora. O mesmo vale para o inverso: deu mais tempo? Então ajuste para mais.\nO mais importante é colocar um valor que você ache justo, mas não justo para ficar milionário no primeiro projeto. (Quando eu comecei, cobrava meus sites em torno de R$2.000,00. Fazia o site muito rápido, mas era péssimo de layout, então contratava alguém por R$1.000,00, então minhas 4 horas valiam R$250,00. Assim, conseguia entregar muitos sites, pois terceirizava uma parte do processo).",
      "description": "Para precificar software, alguns fatores devem ser levados em consideração e você deve responder algumas perguntas a si mesmo. Confira: O que você está ven...",
      "keywords": [
        "hora",
        "para",
        "valor",
        "mais",
        "horas",
        "muito",
        "projeto",
        "ncia",
        "exemplo",
        "https"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/como-cobrar-por-software"
      }
    },
    {
      "id": "b76b345f80266f68",
      "url": "https://devpleno.com/blog/como-vender-software/index",
      "title": "negociação - Como vender um Software (Part 3)",
      "content": "Uma outra coisa que eu parei de fazer, a não ser nesses modelos que comentei acima, é evitar fazer muita transação de preço na frente do cliente porque você pode cometer erros gravíssimos à medida que começar a pegar projetos maiores. Se você fazer uma conta errada na frente do cliente e assumir o compromisso de uma proposta, vai assumir um risco muito grande. Pode ser que você combine algo ali e, posteriormente, perceba que vai dar mais trabalho do que foi imaginado. Por esse motivo, sempre peça um tempo para pensar, não dê a resposta final sem que você tenha refletido sobre isso. A negociação dá uma adrenalina e no ímpeto de querer fechar, pode ser que acabe fazendo algo sem pensar e isso te prejudique futuramente.\n\nUma última dica: eu nunca dou mais que 5% de desconto. Imagine que você cobrou R$10 mil de um cliente e do nada baixou para R$5 mil. A sensação que o cliente vai ter é que aquilo não valia R$10 mil, e sim 5 mil, então a empresa é taxada como uma empresa que queria extorquir dinheiro. Isso acaba com a credibilidade.\n\nSe você fizer essas dicas que eu passei, tenho certeza que vai se dar bem, eu utilizo elas sempre\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/FszhDTUw2E0\" allowfullscreen></iframe>\n</div>\n\nCurta o DevPleno no <a href=\"https://www.facebook.com/devpleno\">Facebook</a>,<a href=\"https://www.youtube.com/devplenocom\">inscreva-se no canal</a> e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "isso",
        "muito",
        "cliente",
        "mais",
        "negocia",
        "algo",
        "outra",
        "fazer",
        "tempo"
      ],
      "metadata": {
        "title": "negociação - Como vender um Software",
        "date": "2017-08-16",
        "tags": "['Carreira']",
        "thumbnail": "NEGOCIAÇÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/como-vender-software/index.md"
      }
    },
    {
      "id": "b78024239fd9d0be",
      "url": "https://devpleno.com/react-16-o-pacificador",
      "title": "React 16 - o Pacificador - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=React%2016%20-%20o%20Pacificador&url=https%3A%2F%2Fdevpleno.com%2Freact-16-o-pacificador) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freact-16-o-pacificador)",
      "description": "Hoje quero trazer as boas novas do mundo React, era algo que já esperava e esperava que fosse acontecer. Muito se discutiu, nos últimos tempos, sobre a lic...",
      "keywords": [
        "react",
        "https",
        "vers",
        "algo",
        "licen",
        "javascript",
        "pacificador",
        "para",
        "bastante",
        "coisas"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/react-16-o-pacificador"
      }
    },
    {
      "id": "b7968e92069ccdf6",
      "url": "https://devpleno.com/blog/arvore-binaria-de-busca/index",
      "title": "Árvore Binária de Busca em JavaScript (Part 1)",
      "content": "Hoje vamos falar mais sobre árvores binárias, porém um tipo específico, a árvore binária de busca.\n\n**Qual a diferença da árvore binária de busca para a árvore binária normal?**\n\nNa normal, simplesmente inserimos os nós dentro da árvore sem garantir nenhuma regra, já a de busca segue a seguinte regra:\n\nTemos a raiz e inserimos um valor nessa raiz. Quando inserimos o segundo valor, se for maior que a raiz, ele fica à direita, se ele for menor, ficará à esquerda. Com isso conseguimos fazer muitas outras operações utilizando essa árvore binária.\n\nPrimeiramente vamos fazer a inserção em uma árvore binária de busca. Para fazermos isso, temos que checar se essa árvore tem algum valor, depois verificamos se ele é maior ou menor para inserirmos para left ou right.\n\n```jsx\nconst arvore = {}\n\nfunction insert(tree, value) {\n  if (tree.value) {\n    if (value > tree.value) {\n      insert(tree.right, value)\n    } else {\n      insert(tree.left, value)\n    }\n  } else {\n    tree.value = value\n\n    tree.right = {}\n\n    tree.left = {}\n  }\n}\n\ninsert(arvore, 10)\n\nconsole.log(arvore)\n```\n\nSe não for inserido o tree.value, vai ser igual a value, o tree.right e tree.left serão árvores vazias. Eu estou definindo isso porque quando inserirmos podemos passar uma árvore vazia no insert e ele continua fazendo isso de forma recursiva. Colocando o valor 10, perceba que será retornado: Se inserirmos, por exemplo, um valor 11 em seguida:\n\n```jsx\ninsert(arvore, 10)\n\nconsole.log(arvore)\n\ninsert(arvore, 11)\n\nconsole.log(arvore)\n```\n\nSerá retornado o seguinte:\n\nAgora vamos colocar o valor 9:\n\n```jsx\ninsert(arvore, 10)\n\nconsole.log(arvore)\n\ninsert(arvore, 11)\n\nconsole.log(arvore)\n\ninsert(arvore, 9)\n\nconsole.log(arvore)\n```\n\nSerá retornado o seguinte: Na primeira inserção, retorna 10, na segunda 10 e 11 e na terceira 10, 11 e 9, sendo 11 do lado direito, 9 do lado esquerdo e 10 nossa raiz. Vamos colocar um 8 agora:\n\n```jsx\ninsert(arvore, 10)\n\nconsole.log(arvore)\n\ninsert(arvore, 11)\n\nconsole.log(arvore)",
      "keywords": [
        "arvore",
        "insert",
        "tree",
        "rvore",
        "value",
        "console",
        "isso",
        "para",
        "valor",
        "lado"
      ],
      "metadata": {
        "title": "Árvore Binária de Busca em JavaScript",
        "date": "2017-07-03",
        "tags": "['Algoritmos']",
        "thumbnail": "Debusca.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/arvore-binaria-de-busca/index.md"
      }
    },
    {
      "id": "b79fb4ab4fb027ad",
      "url": "https://devpleno.com/blog/busca-binaria/index",
      "title": "Busca Binária (Part 2)",
      "content": "Para saber se o algoritmo acabou, uma das maneiras é se por algum motivo o item do lado direito for maior que do lado esquerdo, é válido, já que vamos marcar os lados para acertar a metade, caso ele não encontre do lado esquerdo, vamos procurar do lado direito, e por fim retornar -1 caso não encontrarmos em nenhum dos lados.\n\nNos casos, fizemos um valor que não existe, 20, e um que existe, 5. A vantagem que tirei nesse projeto é que toda vez que acessavamos o índice sempre gastava muito tempo, então poderíamos fazer o seguinte para economizar:\n\n```jsx\nconst binSearch = (vetor, left, right, valor) => {\n  if (right >= left) {\n    const indice = parseInt(left + (right - left) / 2)\n\n    const atual = vetor[indice]\n\n    if (atual === valor) {\n      return valor\n    }\n\n    if (atual > valor) {\n      return binSearch(vetor, left, indice - 1, valor)\n    }\n  }\n}\n```\n\nA medida que escalamos, isso vai ficando cada vez mais interessante já que aumentamos muito o número de itens e o número de vezes que ele passa é pequeno.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/l6pxuyV3mKQ\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "vetor",
        "valor",
        "left",
        "busca",
        "indice",
        "vamos",
        "binsearch",
        "right",
        "const",
        "return"
      ],
      "metadata": {
        "title": "Busca Binária",
        "date": "2017-08-29",
        "tags": "['Algoritmos']",
        "thumbnail": "BUSCA-BINÁRIA-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/busca-binaria/index.md"
      }
    },
    {
      "id": "b7d5af7512761655",
      "url": "https://devpleno.com/javascript-streams-p-3-duplex",
      "title": "Javascript: Streams (P-3: Duplex) - DevPleno",
      "content": "Javascript\n\n## Javascript: Streams (P-3: Duplex)\n\nT\nPor Tulio Faria • 28 de abril de 2017\n\n[Javascript](/tag/javascript)\n\nNesta terceira parte da série sobre Streams, falo sobre o Streams Duplex, que permite tanto o envio quanto o recebimento de dados.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Javascript%3A%20Streams%20(P-3%3A%20Duplex)&url=https%3A%2F%2Fdevpleno.com%2Fjavascript-streams-p-3-duplex) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fjavascript-streams-p-3-duplex)",
      "description": "Nesta terceira parte da série sobre Streams, falo sobre o Streams Duplex, que permite tanto o envio quanto o recebimento de dados. Confira o video: <div cl...",
      "keywords": [
        "https",
        "javascript",
        "streams",
        "duplex",
        "sobre",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fjavascript",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/javascript-streams-p-3-duplex"
      }
    },
    {
      "id": "b8107c0054db52a4",
      "url": "https://devpleno.com/blog/como-organizar-os-estudos-em-tecnologia/index",
      "title": "Como organizar os estudos em tecnologia (Part 2)",
      "content": "Essas são algumas dicas para você lidar com essa grande quantidade de tecnologia e não ficar perdido nas prioridades de linguagens ou tecnologias que quer aprender. Eu me organizo assim e tem dado certo, portanto acredito que seja efetivo.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "mais",
        "para",
        "muito",
        "essa",
        "fazer",
        "react",
        "isso",
        "tecnologia",
        "informa",
        "tenho"
      ],
      "metadata": {
        "title": "Como organizar os estudos em tecnologia",
        "date": "2017-05-17",
        "tags": "['Carreira']",
        "thumbnail": "COMO-ORGANIZAR-OS-ESTUDOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/como-organizar-os-estudos-em-tecnologia/index.md"
      }
    },
    {
      "id": "b8185b74b1b71b25",
      "url": "https://devpleno.com/aviso-legal",
      "title": "Aviso legal - DevPleno",
      "content": "Blog\n\n## Aviso legal\n\nT\nPor Tulio Faria • 14 de março de 2017\n\nVocê deve saber que todos os produtos e materiais produzidos pela We Dev Ideas – Eirelli – ME, são feitos para fins educacionais e informacionais e por isso, a We Dev Ideas não garante que você conseguirá obter quaisquer resultados ou ganhar algum dinheiro usando qualquer uma de nossas ideias, ferramentas, estratégias e recomendações, e nada em nossos Sites é uma promessa ou garantia para você de ganhos futuros.\n\nVOCÊ CONCORDA QUE O USO OU INCAPACIDADE DE USO DOS PRODUTOS DA WE DEV IDEAS É POR SUA CONTA E RISCO. Ao adquirir um produto de nossa empresa, você aceita, concorda e entende que você é totalmente responsável por seu progresso e resultados de sua participação e que nós não oferecemos nenhuma representação, garantia ou garantias verbalmente ou por escrito sobre seus ganhos, o lucro do negócio, o desempenho do marketing, o crescimento da audiência ou resultados de qualquer tipo.\n\nQualquer dado presente no site **DevPleno** ou de seus produtos, são somente ilustrativos e não devem ser considerados como um ganho comum, ganho exato ou promessa de renda no futuro.\n\nVocê é totalmente responsável pelas suas decisões, ações e resultados na vida, e através dos seus registros no site, você concorda em não nos responsabilizar por qualquer decisão, ações ou resultados a qualquer momento, em nenhuma circunstância.\n\nQuaisquer declarações descritas no nosso website, conteúdos e ofertas são simplesmente nossa opinião e, portanto, não são garantias ou promessas de desempenho real. Nós não oferecemos assessoria jurídica, médica, psicológica ou financeira profissional.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Aviso%20legal&url=https%3A%2F%2Fdevpleno.com%2Faviso-legal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Faviso-legal)",
      "description": "Você deve saber que todos os produtos e materiais produzidos pela We Dev Ideas – Eirelli – ME, são feitos para fins educacionais e informacionais e por iss...",
      "keywords": [
        "resultados",
        "qualquer",
        "https",
        "legal",
        "produtos",
        "ideas",
        "concorda",
        "seus",
        "aviso",
        "para"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/aviso-legal"
      }
    },
    {
      "id": "b833d9c5baf2bc21",
      "url": "https://devpleno.com/hands-on-standard",
      "title": "Hands-on: Standard - DevPleno",
      "content": "Javascript\n\n## Hands-on: Standard\n\nT\nPor Tulio Faria • 3 de março de 2017\n\n[Javascript](/tag/javascript)\n\nNeste Hands-on, vou falar sobre um módulo da NPM, o Standard, com o qual você pode padronize o código fonte JavaScript da sua equipe.\n\nConfira os detalhes nos vídeos:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Standard&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-standard) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-standard)",
      "description": "Neste Handson, vou falar sobre um módulo da NPM, o Standard, com o qual você pode padronize o código fonte JavaScript da sua equipe. Confira os detalhes no...",
      "keywords": [
        "https",
        "javascript",
        "standard",
        "hands",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno",
        "2fhands",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-standard"
      }
    },
    {
      "id": "b8b0a194dae9378d",
      "url": "https://devpleno.com/fullstacklab",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /fullstacklab to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "fullstacklab"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstacklab"
      }
    },
    {
      "id": "b8d7ca2dba6eb510",
      "url": "https://devpleno.com/low-db",
      "title": "Low-DB - Banco de dados para NodeJS baseado em JSON - DevPleno (Part 1)",
      "content": "Javascript\n\n## Low-DB - Banco de dados para NodeJS baseado em JSON\n\nT\nPor Tulio Faria • 11 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nO Low-DB é uma forma bem interessante de termos um banco de dados baseado em JSON para utilizarmos em aplicações mais simples ou talvez aplicações desktop, onde podemos utilizar electron, por exemplo.\n\nPrimeiro vamos instalar o módulo:\n\nyarn add lowdb\nCriamos então o low-db. Com isso, precisamos de uma instância de um banco mostrando qual arquivo queremos utilizar.\n\nconst lowdb = require('lowdb')\nconst db = lowdb('banco.json')\ndb.defauts({\nnoticias: [],\nusuarios: []\n}).write()\nO interessante é que podemos definir os valores padrão quando o banco for criado, como por exemplo notícias e usuários. Lembrando que com o low-db temos que escrever estas operações para a classe começar a valer.\n\nAo dar um node no arquivo.js, ele irá criar um novo arquivo com o nome banco.json com os valores padrão pra cada um deles.\n\nVamos fazer mais alguns testes, por exemplo, adicionar uma notícia nova com id, assunto e conteúdo e por fim escreva no json.\n\ndb.get('noticias')\n.push({\nid: '1',\nassunto: 'crime',\nconteudo: 'teste'\n})\n.write()\nO mais interessante: você mandar adicionar novamente, ele irá adicionar ao anterior e não sobrepor. Podemos setar um valor de uma maneira em que podemos guardar as configurações.\n\ndb.set('settings.toggledOption', true).write\nUtilizamos o ponto no código acima para dizer que a opção toggledOption do settings deve estar aberta. Podemos gerar estas atualizações mais profundas apenas colocando ponto.\n\n**Um banco não é um banco se não pudéssemos buscar as informações nele, correto?**\n\nEntão vamos buscar uma informação (e única do nosso banco de exemplo) que é a notícia com o ID igual a 1.",
      "description": "O LowDB é uma forma bem interessante de termos um banco de dados baseado em JSON para utilizarmos em aplicações mais simples ou talvez aplicações desktop, ...",
      "keywords": [
        "banco",
        "para",
        "podemos",
        "https",
        "json",
        "mais",
        "exemplo",
        "vamos",
        "lowdb",
        "noticias"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/low-db"
      }
    },
    {
      "id": "b9597a098f21fcb0",
      "url": "https://devpleno.com/blog/hands-ler-arquivo-linha-linha/index",
      "title": "Hands-on: Ler arquivo linha a linha",
      "content": "Neste hands-on, vamos ver como conseguimos utilizar o readline em conjunto com Readable Stream para ler linhas de um arquivo texto.\n\n**Como faremos isso?**\n\nPrimeiramente vamos importar o headline (que já faz parte do core do node) e o FS (file System). Em seguida, vamos ler o arquivo com o readable.\n\n```jsx\nconst readline = require('readline')\nconst fs = require('fs')\nconst readable = sf.createReadStream('arquivo.html')\n```\n\nVamos criar uma instancia do readline e no imput vamos passar o readable\n\n```jsx\nconst rl = readline.creatInterface({\n  input: readable,\n  output: process.stdout\n})\n```\n\n**Mas para que isso serve?**\n\nIsso é legal, pois podemos fazer assim por exemplo: rl\n\n```jsx\n.on('line', (line) => {\n    console.log('>>>', line)\n})\n```\n\nSe rodarmos este código, o node vai mostrar o HTML inteiro linha a linha.\n\nPara provar realmente que ele esta fazendo isso, podemos fazer o seguinte:\n\n```jsx\nrl.on('line', (line) => {\n  console.log('>>>', line.toUpperCase())\n})\n```\n\nEntão o node retornará tudo em maiúsculo. Neste código, também podemos ler um CSV, bastaria eu processar a linha do CSV dentro do console.log e temos uma forma de rodar o arquivo sem precisar gastar muita memória.\n\n**Conclusão**\n\nQuando temos muitos dados, não é necessário jogar na memória. Utilizando essa forma, a leitura vai ser bem mais vantajosa.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/bNKi8_J4TLI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "line",
        "vamos",
        "readline",
        "readable",
        "para",
        "arquivo",
        "isso",
        "const",
        "embed",
        "node"
      ],
      "metadata": {
        "title": "Hands-on: Ler arquivo linha a linha",
        "date": "2017-05-08",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "LerArquivos.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-ler-arquivo-linha-linha/index.md"
      }
    },
    {
      "id": "b97999a00b88a910",
      "url": "https://devpleno.com/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica",
      "title": "Por que fazer um curso de programação voltado para a prática? - DevPleno (Part 3)",
      "content": "Já para o desenvolvimento de aplicativos móveis, são usados Java para Android, Swift para iPhone ou Cordova. Esse último é um framework que possibilita a utilização de linguagens de WEB para desenvolvimento de aplicações mobile híbridas, que rodam em praticamente todas as plataformas móveis. Além disso podemos também utilizar o próprio ReactJS (react-native) para criar aplicações móveis nativas.\n\nRealmente são muitas as opções, não é? Então, ai entra a importância do know-how do instrutor do curso. Quem tem experiência de mercado poderá direcionar o aluno para que saiba quais [ferramentas deve aprender para cada tipo de projeto](https://www.devpleno.com/ensino-formal-ou-cursos-livres?utm_source=blog&#x26;utm_campaign=rc_blogpost). Também mostrará como integrar as tenologias utilizadas, como veremos a seguir.\n\n## Para ter um visão de projeto\n\nO desenvolvedor profissional precisa lidar com problemas complexos e integrar diversas tecnologias. Para que sejam usadas, normalmente existem macetes que agilizam sua instalação e atualização como o uso de Webpack, Bower, Npm, composer. Também entram o uso de IDEs para gerenciamento de código.\n\nCabe ressaltar que, em projetos profissionais, dezenas ou centenas de milhares de linhas de código são geradas ou incorporadas de bibliotecas prontas criadas por terceiros. Assim é fundamental contar com esses sistemas para que se possa fazer um gerenciamento adequado do que está sendo produzido.\n\nEstá aí mais uma vantagem de se aprender na prática, ou seja, com quem entende. O instrutor pode dar dicas valiosas de ferramentas de desenvolvimento e bibliotecas já prontas para agilizar a criação de artefatos mais comuns, porém com relativa complexidade. Muitas encontram-se disponíveis no GitHub.\n\nTambém há a necessidade de manutenção do projeto e compartilhamento com outros programadores. Atualmente, o GitHub vem sendo a plataforma mais usada para armazenar projetos que podem pertencer a uma empresa ou que são públicos.",
      "description": "A área de tecnologia da informação oferece muitas oportunidades e, para aproveitálas, o profissional deve se preparar continuamente. Para tanto, o desenvol...",
      "keywords": [
        "para",
        "como",
        "projeto",
        "https",
        "source",
        "blog",
        "campaign",
        "blogpost",
        "mais",
        "desenvolvimento"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica"
      }
    },
    {
      "id": "b9adeb091acc9f8e",
      "url": "https://devpleno.com/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! - DevPleno (Part 2)",
      "content": "Desde que nascemos, estamos acostumados com certos modelos mentais, que nos são passados pela família e pela cultura em geral. Apenas uma pessoa “inquieta” consegue ultrapassar os limites desses modelos e realizar uma verdadeira mudança de *mindset*. É por meio dessa consciência que a inovação se torna possível e, consequentemente, os grandes feitos.\n\nEntão, você prefere a comodidade de receber e executar tarefas ou o desafio de buscar mudanças de pensamento que podem trazer grandes impactos para as pessoas e para a sociedade?\n\n**Você se sente capaz de definir metas e atingi-las?**\n\nNa vida empreendedora, é muito importante que exista [comprometimento com as metas](https://www.devpleno.com/comprometimento-com-suas-metas?utm_source=blog&#x26;utm_campaign=rc_blogpost). Como citado, o ato de realizar é o que diferencia um empreendedor de um criador. De pouco vale ser muito criativo, mas viver cheio de ideias dentro da sua mente. Isso não vai criar algo realmente transformador.\n\nPortanto, saber definir objetivos acaba tendo um papel fundamental. Onde você quer chegar? Como pretende alcançar isso e em quanto tempo? Trabalhando dentro de uma empresa você estará cumprindo metas de outras pessoas, e não as suas.\n\nSe você quer ser o dono de suas metas, deve responder também pelo planejamento, comercialização e fiscalização do andamento de todos os processos de seu negócio. Nesse caso, a medida do sucesso é saber não só criar um plano de ação eficaz, como executá-lo da melhor forma a partir dos recursos disponíveis.\n\n**Você se considera uma pessoa disciplinada?**\n\nUm empreendedor está sempre atarefado com muitas coisas, realizando e gerenciando várias atividades ao mesmo tempo, sem que ninguém peça para que ele faça isso. Ele sabe a verdadeira importância de realizá-las. Diferente de um colaborador que, basicamente, deve cumprir tarefas e uma quantidade de horas de trabalho indicadas por um gerente.",
      "description": "Todo profissional já deve ter se perguntado as reais vantagens de se trabalhar em uma grande empresa ou de se criar um negócio próprio. E isso não é difere...",
      "keywords": [
        "para",
        "empresa",
        "isso",
        "como",
        "muito",
        "https",
        "pode",
        "mais",
        "melhor",
        "source"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao"
      }
    },
    {
      "id": "b9eeb1745fbe4744",
      "url": "https://devpleno.com/blog/como-ser-muito-mais-produtivo/index",
      "title": "Como ser MUITO mais produtivo?",
      "content": "Venho aplicando 2 técnicas bastante interessantes: medir o tempo que gasto em cada tarefa e fazer pausas durante as mesmas. Neste vídeo, falo destas técnicas e mostro ferramentas que podem te ajudar a fazer isso e tornar-se mais produtivo no seu dia-a-dia.\n\nPomodoro: [https://cirillocompany.de/pages/pomodo...](https://cirillocompany.de/pages/pomodoro-technique)\n\nToggl (não esquece de baixar o Toggl Desktop): [https://toggl.com](https://toggl.com/)\n\nPomodoro para windows: [https://tomighty.org/](https://tomighty.org/)\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/6Dx0abJtNvY\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "https",
        "toggl",
        "embed",
        "pomodoro",
        "responsive",
        "youtube",
        "cnicas",
        "fazer",
        "cirillocompany",
        "pages"
      ],
      "metadata": {
        "title": "Como ser MUITO mais produtivo?",
        "date": "2017-05-03",
        "tags": "['Carreira']",
        "thumbnail": "PRODUTIVIDADE-2-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/como-ser-muito-mais-produtivo/index.md"
      }
    },
    {
      "id": "ba0a48ee74331b2b",
      "url": "https://devpleno.com/renderizar-estruturas-em-formato-de-arvore",
      "title": "ReactJS Recursivo? - DevPleno (Part 2)",
      "content": "import Node from './node'\nreturn (\n&#x3C;div>\n&#x3C;h2>\n{' '}\n&#x3C;Node node={nodes} />\n&#x3C;/h2>\n&#x3C;/div>\n)\nEntão ele escreveu o node, que é o que está dentro do nó.\n\nVamos mudar, colocar um span em node.js e colocar um JSON com um props.node para sabermos o que tem ali dentro:\n\nconst Node = (props) =>{\nreturn(\n&#x3C;span> {JSON.stringfy(props.node) &#x3C;/span>\n)\n}\nPerceba que é retornado o nó inteiro. Se eu tiver o lado esquerdo, tenho que renderizar esse nó, para isso podemos pedir para o node renderizar do lado esquerdo.\n\nconst Node = (props) => {\nreturn (\n&#x3C;span>\n{props.node.l &#x26;&#x26; &#x3C;Node node={props.node.l} />}\n{props.node.v}\n&#x3C;/span>\n)\n}\nCom isso ele andou apenas para o lado esquerdo. Podemos adicionar também, por exemplo, apenas o lado direito:\n\n{\nprops.node.r &#x26;&#x26; &#x3C;Node node={props.node.r} />\n}\nAgora eu quero saber quando eu renderizar um nó colocar um parênteses para saber quando foi realizado uma conta:\n\nconst Node = (props) => {\nreturn (\n&#x3C;span>\n({props.node.l &#x26;&#x26; &#x3C;Node node={props.node.l} />}\n{props.node.v})\n&#x3C;/span>\n)\n}\nCom isso conseguimos reparar como foi feito a conta, afinal ele mantém as precedências dos parênteses, ou seja, ele está entrando realmente na árvore.\n\nPerceba que fizemos recursividade sem utilizar nada de repetição, apenas mandamos renderizar a função, que nada mais é do que um componente chamando ele mesmo. Uma coisa importante é sabermos que ele tem um nó base, então toda vez que ele for um V não tem nel left nem right, logo ele é o passo base, onde eu paro a recursividade.\n\nPoderíamos fazer o parênteses não aparecer nos valores, deixando o resultado muito mais simples.",
      "description": "Hoje vamos fazer algo que é bastante convencional em sistemas: renderizar estruturas de dados em formato de árvore. No exemplo, será uma árvore binária, ma...",
      "keywords": [
        "node",
        "props",
        "span",
        "lado",
        "vamos",
        "para",
        "renderizar",
        "fazer",
        "isso",
        "react"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/renderizar-estruturas-em-formato-de-arvore"
      }
    },
    {
      "id": "ba2bdfa2c9a71843",
      "url": "https://devpleno.com/debug-no-navegador",
      "title": "Debug de código JavaScript no Navegador - DevPleno (Part 2)",
      "content": "Uma das coisas que acho fantástico no Chrome é o counter estar com o valor zero. Se eu quiser prever quanto ele vai ficar, posso selecionar o pedaço de código que quero e ele já faz um preview do valor que essa variável vai retornar. Isso é muito bom para quando vamos debugar um código mais extenso. O problema é que quando continuamos apertando o step over, vai entrar em uma parte de um código jQuery, se eu der um step over de novo, ele irá para dentro desse jQuery, então para evitar isso, eu coloco o meu break point dentro da função anônima que vai ser chamada de forma assíncrona.\n\nSe deixarmos no 7, ele nunca vai fazer nada porque nunca vai passar pelo console.log, então vamos no botão resume para continuar executando.Ele executou tudo que podia de forma síncrona e como coloquei o break point dentro da função anônima, vamos clicar em test para ver o que acontece. Perceba que agora podemos selecionar e checar o preview normalmente como fizemos anteriormente.\n\nEsse tipo de debug ajuda muito quando precisamos achar algum erro de lógica, afinal é equivalente a fazer aquela execução passo a passo. Confira o vídeo.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Debug%20de%20c%C3%B3digo%20JavaScript%20no%20Navegador&url=https%3A%2F%2Fdevpleno.com%2Fdebug-no-navegador) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdebug-no-navegador)",
      "description": "Hoje vou dar uma dica rápida de como podemos fazer o debug de código JavaScript no navegador. É bastante simples, se você já trabalha com Java ou alguma ID...",
      "keywords": [
        "para",
        "digo",
        "fazer",
        "script",
        "counter",
        "javascript",
        "https",
        "isso",
        "debug",
        "navegador"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/debug-no-navegador"
      }
    },
    {
      "id": "ba41a1a90316a86a",
      "url": "https://devpleno.com/autenticacao-e-autorizacao",
      "title": "Autenticação e Autorização - Entenda os termos - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Autentica%C3%A7%C3%A3o%20e%20Autoriza%C3%A7%C3%A3o%20-%20Entenda%20os%20termos&url=https%3A%2F%2Fdevpleno.com%2Fautenticacao-e-autorizacao) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fautenticacao-e-autorizacao)",
      "description": "Dois termos estão muito relacionados quando estamos desenvolvendo um sistema para Web ou Mobile: AUTENTICAÇÃO e AUTORIZAÇÃO. Vamos pensar o seguinte: temos...",
      "keywords": [
        "autentica",
        "temos",
        "https",
        "autoriza",
        "sistema",
        "para",
        "algo",
        "fundamentos",
        "termos",
        "dois"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/autenticacao-e-autorizacao"
      }
    },
    {
      "id": "baa488a02cee6e68",
      "url": "https://devpleno.com/minicurso-socket-io-parte-5",
      "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar - DevPleno (Part 4)",
      "content": "pm2 stop all\nSe alterar o json com a configuração de início, ele não vai funcionar, então temos que fazer um **pm2 delete** para ele apagar o processo e depois sim startar o serviço, senão ele vai pegar sempre o cache. Então aqui já temos o nosso projeto rodando perfeitamente para poder usar como portfólio e com isso chegamos ao fim do nosso minicurso sobre Socket.IO.\n\nPodemos deixar ainda melhor para produção esse nosso serviço, usando escalabilidade, e você pode saber mais sobre esse assunto [na Formação Fullstack Master](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog).\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Minicurso%20Socketio%20-%20Parte%2005%20-%20Colocando%20o%20projeto%20no%20ar&url=https%3A%2F%2Fdevpleno.com%2Fminicurso-socket-io-parte-5) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fminicurso-socket-io-parte-5)",
      "description": "Chegamos à última etapa do nosso Minicurso de Socket.IO. Nessa aula, nós vamos colocar o projeto no ar para que você possa utilizálo como um projeto de por...",
      "keywords": [
        "para",
        "vamos",
        "como",
        "fazer",
        "isso",
        "quina",
        "projeto",
        "agora",
        "temos",
        "https"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/minicurso-socket-io-parte-5"
      }
    },
    {
      "id": "bb7aa2b54cc28ad7",
      "url": "https://devpleno.com/blog/lista-encadeada-adicionar-com-o1/index",
      "title": "Lista encadeada - Adicionar com O(1) (Part 2)",
      "content": "Perceba que retornou 0 e 1 e nossa lista, a diferença que guardamos uma referência para o tail e utilizou apenas dele para checar e adicionar novos itens. Pode ser que consigamos otimizar esse código, a grande questão é que agora nosso algoritmo tem complexidade 0(1), a vantagem é que independente do tamanho da minha lista, adicionar a ela sempre custará uma constante.\n\nO único detalhe é que guardamos dois valores, vamos pensar que esses valores variam dependendo do tamanho da lista, geralmente pensaríamos o seguinte: se ele variasse muito seria um um temporal 2,mas ele sempre será 0(1) mesmo com o resultado 2 porque não faz diferença quando nós falamos em escala.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-spW0EURyNk\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "head",
        "tail",
        "vamos",
        "adicionar",
        "lista",
        "para",
        "add2",
        "value",
        "node",
        "fazer"
      ],
      "metadata": {
        "title": "Lista encadeada - Adicionar com O(1)",
        "date": "2017-07-25",
        "tags": "['Algoritmos']",
        "thumbnail": "AdicionarCom01.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/lista-encadeada-adicionar-com-o1/index.md"
      }
    },
    {
      "id": "bbd2534552124a44",
      "url": "https://devpleno.com/blog/chainability-com-javascript/index",
      "title": "Chainability com Javascript (Part 1)",
      "content": "Hoje eu quero mostrar como podemos construir um pattern que é muito utilizado no Jquery. Apesar de não ser um pattern que muita gente gosta, é bastante interessante.\n\nVamos construir um para você ter uma ideia de como podemos fazer e também para entender um pouco da linguagem que está ali por trás.\n\nEle também pode ser utilizado em outras linguagens além do JavaScript.\n\nEm jQuery, podemos fazer o seguinte:\n\n```jsx\n$('.opa').attr('', '').css('', '').click()\n```\n\nEssa possibilidade de encadear coisas relacionadas a um elemento é chamado de Chainability, isso é bastante interessante para o JavaScript.\n\nComo podemos ter um comportamento semelhante a esse?\n\nVamos criar uma calculadora para você ter uma ideia de como se utiliza:\n\n```jsx\nconst calculador = (initial = 0) => {\n  const obj = {\n    total: initial,\n\n    add: (num) => {},\n\n    sub: (num) => {},\n\n    div: (num) => {},\n\n    mult: (num) => {}\n  }\n\n  return obj\n}\n```\n\nA calculadora foi construída, mas até agora não temos a possibilidade de fazer esse chain. O que permite a gente fazer isso é o seguinte:\n\n```jsx\nconst calculador = (initial = 0) => {\n\n  const obj = {\n    total: initial,\n\n    add: (num) => {\n      obj.total+=num\n\n      return obj\n    },\n\n    sub: (num) => {\n      obj.total-=num\n\n      return obj\n    },\n\n    div: (num) => {\n      obj.total/=num\n\n      return obj\n    },\n\n    mult: (num) => {\n      obj.total*=num\n\n      return obj\n    }\n\n    out: () => {\n      console.log(obj.total)\n\n      return obj\n    }\n  }\n\n  return obj\n\n}\n```\n\nSó o fato de conseguirmos retornar o obj, já é possível fazer o seguinte:\n\n```jsx\ncalculadora().add(10).sub(5).out()\n```\n\nAssim já conseguimos saber qual é o retorno dele. A ideia do chainlability é que toda operação que ele faz ele vai retornar o próprio objeto. Isso faz muito sentido para o jQuery, já que mudamos o html de forma imperativa.\n\nConfira o vídeo:",
      "keywords": [
        "total",
        "return",
        "para",
        "fazer",
        "como",
        "podemos",
        "const",
        "initial",
        "embed",
        "jquery"
      ],
      "metadata": {
        "title": "Chainability com Javascript",
        "date": "2017-11-10",
        "tags": "['Javascript']",
        "thumbnail": "CHAINABILITY-790x400.png",
        "author": "Tulio Faria",
        "keywords": "dicas",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/chainability-com-javascript/index.md"
      }
    },
    {
      "id": "bbf42d6d00198436",
      "url": "https://devpleno.com/blog/registros-do-mysql-no-nodejs/index",
      "title": "[SEGREDO] Muitos registros do MySQL no NodeJS (Part 1)",
      "content": "Hoje quero contar um segredo para você: como utilizar o driver padrão do MySQL no Node para lidar com grandes quantidades de dados.\n\nA primeira coisa que vamos fazer é instalar o driver padrão:\n\n```jsx\nyarn add mysql\n```\n\nTudo que formos fazer em Node e envolve grandes quantidades de dados, temos que pensar em Stream (fique com isso na cabeça). Precisamos utilizar o Stream de alguma forma:\n\n```jsx\nconst mysql = require('mysql')\nconst connection = mysql.createConnection({\n  host: '127.0.0.1',\n  user: 'root',\n  password: '',\n  database: 'cadastro'\n})\nconnection.connect(() => console.log('connected'))\n```\n\nLembrando que eu já tenho um banco de dados para testes. Fizemos algo bem rápido para chegar logo na parte que interessa :)\n\nDepois que conectamos, temos que fazer uma busca. Imagine que você tem que retornar um milhão de registros, a primeira coisa é que você não vai conseguir retornar isso em interface nenhuma, então provavelmente terá que gerar um arquivo xml, json ou qualquer coisa desse tipo.\n\n```jsx\nconnection.connect(() => {\n  console.log('connected')\n  connection.query('select * from pessoas', (err, results) => {\n    console.log(results)\n  })\n})\n```\n\nCom isso ele vai mostrar todas as pessoas que estão cadastradas; no meu caso, tenho mais de 900 itens. Isso já é muito peso para ser lidado dessa forma porque a query vai pro banco e volta de uma vez dentro de \"results\". Nesse ponto, estamos matando as duas pontas porque precisamos fazer o banco inteiro trazer todos os registros e depois processando todos. Pensando em uma escala de milhão, quando trouxermos para o Node, teremos problema de memória.\n\nPrecisamos então fazer essa query de uma outra maneira:\n\n```jsx\nconnection.connect(() => {\n  console.log('connected')\n  const query = connection.query('select * from pessoas')\n  query.on('result', (row) => {\n    console.log(row)\n  })\n})\n```",
      "keywords": [
        "query",
        "para",
        "connection",
        "console",
        "fazer",
        "mysql",
        "dados",
        "muito",
        "coisa",
        "isso"
      ],
      "metadata": {
        "title": "[SEGREDO] Muitos registros do MySQL no NodeJS",
        "date": "2017-08-18",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "RegistrosMYSQL.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/registros-do-mysql-no-nodejs/index.md"
      }
    },
    {
      "id": "bc0be1523fecda87",
      "url": "https://devpleno.com/blog/como-receber-de-empresas-estrangeiras/index",
      "title": "Impostos e como receber de empresas estrangeiras (Part 4)",
      "content": "Esse é um pouco do que eu aprendi até hoje de como receber dinheiro do exterior, não sou contador, mas aprendi isso tudo fazendo e queria compartilhar com vocês porque eu sei que é uma dor que todos passam.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/E69thpoxrtI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "esse",
        "como",
        "empresa",
        "dinheiro",
        "pessoa",
        "receber",
        "isso",
        "pagar",
        "eles"
      ],
      "metadata": {
        "title": "Impostos e como receber de empresas estrangeiras",
        "date": "2017-08-18",
        "tags": "['Carreira']",
        "thumbnail": "COMO-RECEBER-DE-EMPRESAS-ESTRANGERAS-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/como-receber-de-empresas-estrangeiras/index.md"
      }
    },
    {
      "id": "bc16591974fba549",
      "url": "https://devpleno.com/como-aumentar-a-produtividade",
      "title": "Como aumentar a produtividade diminuindo a troca de contexto - DevPleno (Part 1)",
      "content": "Carreira\n\n## Como aumentar a produtividade diminuindo a troca de contexto\n\nT\nPor Tulio Faria • 23 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nVocê sente que não está sendo tão produtivo quanto poderia? Após fazer algumas mudanças na forma como desenvolvo projetos, estou aumentando a minha produtividade.\n\nA primeira coisa que mudei foi deixar de usar o sublime e passei a usar o Visual Studio code (VScode).\n\n**Por que eu fiz isso?**\n\nO VScode tem algumas coisas integradas, que eu sei que é possível integrar no Sublime, mas achei mais interessante no próprio VScode: o modo como ele funciona o Git e como depurar códigos, por exemplo.\n\nNo Sublime, eu deixava todos os projetos abertos ao mesmo tempo, com muitas abas, já no VScode, ao invés de abrir todas as abas de todos os projetos ao mesmo tempo, passei a abrir apenas um diretório e ele se mantém da forma como abri da última vez.\n\nUma coisa que percebi foi o tempo que gastava nessa mudança de contexto, pois eu estava com todos os projetos abertos e acabava virando uma bagunça. Perdia tempo achando o contexto em que eu estava e, como eu trabalho com vários projetos simultâneos, deixava aberto e esquecia.\n\nAbrindo apenas um projeto fica muito mais fácil. No Git, ele já irá acender se tiver algo para comitar ou enviar, além de me permitir fazer isso e adicionar os arquivos que vou comitar de forma mais precisa.\n\nEntão muitas vezes uma mudança simples como essa pode nos deixar mais produtivo, afinal perdemos menos tempo nessa troca de contexto.\n\nNo meu caso demorou para eu perceber que isso reduzia minha produtividade, então comecei a trabalhar dessa forma diferente e senti uma mudança. E você, como desenvolve software hoje: como eu fazia antes ou assim como estou fazendo agora?\n\nConfira o video:\n\nDeixe seu comentário. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "description": "Você sente que não está sendo tão produtivo quanto poderia? Após fazer algumas mudanças na forma como desenvolvo projetos, estou aumentando a minha produti...",
      "keywords": [
        "como",
        "https",
        "produtividade",
        "projetos",
        "tempo",
        "contexto",
        "mudan",
        "forma",
        "vscode",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/como-aumentar-a-produtividade"
      }
    },
    {
      "id": "bc18856df6f758b4",
      "url": "https://devpleno.com/blog/mono-ou-multi-thread-poo-para-js/index",
      "title": "Mono ou multi thread - POO para JS (Part 1)",
      "content": "Hoje vou continuar falando um pouco mais sobre como podemos fazer a transição de uma linguagem orientada-objeto, como PHP ou Java, para JavaScript cada vez mais funcional.\n\nMais especificamente vamos falar sobre “processamento concorrente”, entre aspas, porque hoje, com vários núcleos, nós conseguimos ter um processamento praticamente concorrente. Quero mostrar um problema que é muito comum quando a gente quer exercitar concorrência em linguagens POO. Principalmente em Java, trabalhamos muito com isso para mostrar essa concorrência.\n\nO que fazemos com concorrência em Java?\n\nNós criamos o que chamamos de threads, que é uma linha de execução. Por exemplo, se eu criar algo\n\ncomo:\n\n```jsx\nconst a = 1\nconst b = 10\n```\n\nEssa linha de execução em Java, por ser uma linguagem síncrona, então eu posso travar a linha de execução. Para evitar que isso aconteça, nós criamos uma nova thread.\n\nÉ muito comum nessas linguagens termos um while(true) checando se algo chegou, como por exemplo conexão de socket. Ela tem suas vantagens e suas desvantagens, mas ela tem um limite onde acabamos tendo alguns problemas para gerenciar essas threads.\n\nJá o JavaScript é mono-thread, com isso ele não mantém várias linhas de execução em paralelo, e sim mantém uma estrutura que vai ser executada depois. Por exemplo:\n\n```jsx\nconst a = 1\nconst b = 2\n```\n\nQuando executamos essa linha de código em JavaScript, ele entra em algo que chamamos de event loop. É como se fosse uma caixa onde colocamos coisas lá dentro, tudo que vai para ela podemos desempilhar depois. É assim que ele consegue lidar com várias coisas ao mesmo tempo.\n\nPor que isso é tão importante?",
      "keywords": [
        "stock",
        "para",
        "const",
        "consumer",
        "math",
        "isso",
        "console",
        "producer",
        "length",
        "java"
      ],
      "metadata": {
        "title": "Mono ou multi thread - POO para JS",
        "date": "2017-11-06",
        "tags": "['Javascript']",
        "thumbnail": "MonoOuMulti.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/mono-ou-multi-thread-poo-para-js/index.md"
      }
    },
    {
      "id": "bc1e1f059726df8c",
      "url": "https://devpleno.com/projeto-certo-para-estudar-programacao",
      "title": "Qual o projeto certo para estudar programação? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Qual o projeto certo para estudar programação?\n\nT\nPor Tulio Faria • 20 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nAo iniciar a jornada de estudos sobre programação, livros, vídeos, tutoriais e dicas em sites são os principais recursos para aprender como desenvolver um sistema que realiza uma determinada tarefa. Mas, depois de dominarmos as ferramentas de uma linguagem ficamos sem a noção de como seguir aprendendo mais e desenvolvendo nossas habilidades. O que mais acrescentaria aos meus conhecimentos sobre programação? Devo buscar novas fontes de informação para aprender? Quais serão os meus próximos desafios?\n\nÉ comum estarmos sem ideias de projetos que podemos criar para aprender mais sobre programação. Por isso, hoje vamos responder a seguinte pergunta do Eric Luz: “Que tipo de projeto posso utilizar para estudar?”\n\nNeste post, listamos três formas para continuar desenvolvendo aplicações e manter o seu ritmo de estudo em programação.\n\n### 1) Faça um projeto social\n\nA primeira forma de aprimorar seu aprendizado é procurar uma creche, asilo, orfanato ou uma instituição em prol dos animais e propor uma solução para determinado problema não resolvido. Além de colocar o desenvolvedor para usar suas ferramentas, esse exercício também provê algo bom para a sociedade. Alguns exemplos:\n\nVá a um orfanato próximo de sua casa, converse com os funcionários e veja se um sistema para organizar e administrar o estoque de mantimentos, utensílios, produtos de limpeza, brinquedos e doações seria útil;\n\nVá a um asilo e veja se eles precisam de uma aplicação para registrar e controlar as pessoas que visitam os idosos que moram ali;\n\nVá a uma ONG de proteção aos animais e veja se eles têm algum site ou meio de divulgar o seu trabalho.\n\nOutro ponto muito importante é que você tem a chance de colocar o projeto “no ar” ou “em produção” para que seja realmente utilizado no dia a dia traga benefícios para os seus usuários.\n\n### 2) Inspire-se em soluções do mercado",
      "description": "Ao iniciar a jornada de estudos sobre programação, livros, vídeos, tutoriais e dicas em sites são os principais recursos para aprender como desenvolver um ...",
      "keywords": [
        "para",
        "https",
        "projeto",
        "devpleno",
        "estudar",
        "programa",
        "como",
        "mais",
        "aplica",
        "aprender"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/projeto-certo-para-estudar-programacao"
      }
    },
    {
      "id": "bc4e86b0310de22c",
      "url": "https://devpleno.com/blog/react-16-o-pacificador/index",
      "title": "React 16 - o Pacificador",
      "content": "Hoje quero trazer as boas novas do mundo React, era algo que já esperava e esperava que fosse acontecer. Muito se discutiu, nos últimos tempos, sobre a licença, que era um pouco restritiva e muitas empresas estavam saindo do ecossistema por esse motivo.\n\nNo dia 25 de setembro de 2017, na versão 15.6.2, já foi mudada essa licença para algo mais permissiva, saindo dessa BSD + patentes para MIT, assim ela fica aberta.\n\nA nova versão do React, a versão 16 também já está nessa licença, isso ficou bastante interessante.\n\nQuero comentar algumas coisas também referente ao React que são coisas que me motivaram aos meus estudos serem focados em React e não em Angular, por exemplo.\n\nAlgumas coisas novas, como por exemplo, ele pode retornar um vetor de JSX, uma string, deu uma melhor forma de lidar com erros, mas o que eu queria comentar é que, além da troca da licença, o tamanho foi reduzido. Isso era algo que atrapalhava bastante quando você gerava um bundle. Se não tivesse utilizando uma forma de quebrar esse bundle, ficava muito pesado.\n\nOutra mudança que achei bastante interessante foi que a característica do React foi reescrita todo o core do zero utilizando o projeto Fiber.\n\nAlém disso, eles não mexeram nas API's, então é possível atualizar o React sem quebrar muita coisa, algo que aconteceu, por exemplo, com o Angular.\n\nEu considero essa versão do React a versão das “pazes” porque a comunidade estava um pouco desanimada.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/biLYWAlQNK4\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "react",
        "vers",
        "algo",
        "licen",
        "embed",
        "para",
        "bastante",
        "coisas",
        "exemplo",
        "responsive"
      ],
      "metadata": {
        "title": "React 16 - o Pacificador",
        "date": "2017-10-02",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "React16.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/react-16-o-pacificador/index.md"
      }
    },
    {
      "id": "bc6d97c6ae4d82d5",
      "url": "https://devpleno.com/cmder-turbine-seu-cmd-no-windows",
      "title": "cmder: Turbine seu cmd no Windows - DevPleno (Part 1)",
      "content": "Javascript\n\n## cmder: Turbine seu cmd no Windows\n\nT\nPor Tulio Faria • 13 de outubro de 2016\n\n[Javascript](/tag/javascript)\n\nOlá pessoal,\nhoje vai uma dica interessante para quem desenvolve no windows (sim, eu ainda me incluo neste grupo, mas logo logo estarei de mudança :)).\n\nEu fico bastante irritado com o cmd padrão do windows. Simplesmente porque tudo nele é meio burocrático de se fazer (aka copiar saídas, etc). Bom, resolvi então buscar uma solução, e uma das que estou utilizando atualmente e estou gostando muito é o Cmder.\n\nBom, começando pela interface:\n\nAchei muito bacana esse efeito translucido, mas além de ser só um corpinho bonito, ele realmente é muito funcional e ajuda bastante na produtividade. Alguns pontos que já me chamaram a atenção:\n\n1 – Várias abas\nBasta utilizar o atalho: Shif+Alt+1 para adicionar uma aba do CMD, ou Shit+Alt+2 para uma do PowerShell. Ah, e elas ficam todas organizadinhas na parte de baixo da interface (quem já teve que lidar com um zilhão de cmd´s abertos ao mesmo tempo no windows sabe como isso é um grande avanço).\n\n2 – Copiar e colar\nCopiar e colar no cmd padrão é bem complicadinho. Você não consegue selecionar o texto diretamente. Já no cmder basta selecionar o texto que você quer que ele já copia. Se quiser colar, basta clicar com o botão direito do mouse.\n\n3 – Cmd on esteroids\nO cmder utiliza um “enhancer” para ampliar os comandos disponíveis no shell. Inclusive com SSH, CURL, VI e grep\n\n4 – Isso é só o começo\nRecomendo vocês a entrarem nas preferências do Cmder (clicando no title com o botão direito) ou pressionando win+alt+p, e o personalizar ainda mais (aumentar a fonte entre outros). É possível também configurar como novas abas serão abertas. Vale a pena explorar\n\nEu explorei alguns destes itens, porém, só com o básico já ganhei bastante produtividade, acredito que vocês também ganharão. Até a próxima dica",
      "description": "Olá pessoal, hoje vai uma dica interessante para quem desenvolve no windows (sim, eu ainda me incluo neste grupo, mas logo logo estarei de mudança :)). Eu ...",
      "keywords": [
        "cmder",
        "windows",
        "https",
        "para",
        "javascript",
        "turbine",
        "bastante",
        "copiar",
        "muito",
        "basta"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/cmder-turbine-seu-cmd-no-windows"
      }
    },
    {
      "id": "bcbfa821bb89d525",
      "url": "https://devpleno.com/blog/claude-code-describe-session/index",
      "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos (Part 2)",
      "content": "1. **Abra a sessão do Claude Code no projeto do CMS** (o projeto que tem o contexto que você quer compartilhar)\n2. **Peça para o Claude descrever a sessão** pensando em como outro agente usaria essa informação. Algo como: *\"Describe this session so another Claude session working on the front-end can understand how to integrate with this CMS\"*\n3. **O Claude gera a descrição completa** — endpoints disponíveis, estrutura de dados, autenticação, tudo o que a outra sessão precisa saber\n4. **Use essa descrição na sessão do front-end** como contexto inicial, colando o output ou referenciando-o\n\nO resultado é que a sessão do front-end recebe um briefing claro e estruturado, sem perda de informação.\n\n## Indo além: passando contexto entre agentes e modelos diferentes\n\nO describe session não se limita a conectar duas sessões do Claude Code. Você pode usar essa mesma técnica para:\n\n- **Passar contexto entre agentes diferentes** — por exemplo, de um agente de código para um agente de revisão\n- **Gerar prompts para outros modelos** — pedir para o Claude descrever a sessão em formato de prompt otimizado para outro LLM\n- **Criar documentação de handoff** — quando outro desenvolvedor (humano ou IA) vai assumir o trabalho\n\nA ideia central é a mesma: transformar o contexto implícito de uma sessão de trabalho em uma descrição explícita e reutilizável.\n\n## Quer dominar o Claude Code e IA na prática?\n\nSe você quer ir além e aprender a usar o Claude Code como ferramenta principal no seu fluxo de desenvolvimento, temos um curso bônus sobre IA e Claude Code dentro do **The Best Stack**. Lá você aprende na prática como integrar IA no seu dia a dia como dev.\n\n**[Acesse o The Best Stack e comece agora](https://do.devpleno.com/the-best-stack)**\n\n## FAQ\n\n### O describe session funciona entre projetos diferentes?\n\nSim. Você pode usar o describe session em um projeto e levar a descrição gerada para qualquer outro projeto ou sessão. O contexto é gerado como texto, então é portável.",
      "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
      "keywords": [
        "claude",
        "para",
        "sess",
        "como",
        "session",
        "describe",
        "contexto",
        "projeto",
        "outro",
        "descri"
      ],
      "metadata": {
        "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos",
        "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
        "date": "2026-04-05",
        "tags": "['Ferramentas']",
        "thumbnail": "feature-image.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/claude-code-describe-session/index.md"
      }
    },
    {
      "id": "bd1d246e64f3cef8",
      "url": "https://devpleno.com/hands-on-readline",
      "title": "Hands-on: Readline - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on: Readline\n\nT\nPor Tulio Faria • 8 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste post vamos fazer um hands-on é de um módulo padrão com o core do node: o readline.\n\n**O que temos que fazer?**\n\nVamos importar primeiro o readline e instanciar um novo readline.\n\nconst readline = require('readline')\nconst rl = readline.createInterface({\ninput: process.stdin,\noutput: process.stout\n})\nComo o readline é um modulo que permite que lidemos com entrada e saída, podemos atrelar um readable stream no input e output padrão.\n\n**Pra que serve isso?**\n\nPodemos construir várias ‘ferramentinhas’ com o readline, a principal delas é a seguinte:\n\nrl.on('line', (line)==>{\nconsole.log('line >>', line)\n})\nE toda vez que eu digitar algo, ele irá retornar o que escrevi adicionando o que esta no line. Mas não é só isso. Podemos saber, por exemplo, se o usuário apertou Ctrl+C para fechar o prompt:\n\nrl.on('line', (line)==>{\nconsole.log('line >>', line)\n})\nrl.on('SIGINT', () => {\nconsole.log('bye'),\nrl.pause()\n})\nAo fazer isso, quando o usuário apertar Ctrl+C ele irá escrever ‘bye’ e irá sair, isso acontece, pois estamos chamando o rl.pause() já que estamos pausando e não pegando mais nada do stdin.\n\nPodemos criar várias formas de interação, vou dar mais um exemplo prático.\n\nrl.question('qual o seu nome?', (nome) => {\nconsole.log('prazer ', nome)\n})\nRodando o node, a pergunta irá aparecer e ao escrever o console.log vai ser retorndado: prazer mais o nome que você digitou.\n\nEm Java, temos algo bem semelhante. Conseguimos dar o readline no stream e ele devolve a linha digitada pelo usuário.\n\n**Conclusão**\n\nApenas com o realine já é possível construir uma ferramenta simples como ler dois arquivos e fazer algo apenas utilizando puramente o rl.on e o rl.question.\n\nConfira o video:",
      "description": "Neste post vamos fazer um handson é de um módulo padrão com o core do node: o readline. O que temos que fazer? Vamos importar primeiro o readline e instanc...",
      "keywords": [
        "readline",
        "line",
        "https",
        "console",
        "fazer",
        "podemos",
        "isso",
        "nome",
        "javascript",
        "hands"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-on-readline"
      }
    },
    {
      "id": "bd64f8dfdc7e41e6",
      "url": "https://devpleno.com/se-sujar-faz-bem",
      "title": "Porque se sujar faz bem! - DevPleno (Part 1)",
      "content": "Carreira\n\n## Porque se sujar faz bem!\n\nT\nPor Tulio Faria • 9 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nUma coisa que sempre marcou a minha infância foram as propagandas do sabão em pó OMO que via na TV. O slogan era “Se sujar faz bem” e mostrava as crianças pulando e brincando na lama sem medo de se sujar.\n\nSe fossemos trazer esse ensinamento para o nosso meio profissional, percebemos que tem muita gente que, por mais que queira fazer algo, tem medo de errar, medo de se sujar. Muitas vezes você tem medo de assumir um compromisso em um projeto com um pouco a mais de conhecimento que você não tem por de falhar e nisso o slogan da OMO tem todo sentido, você errar, dar esse passo a mais faz bem mesmo quando você se suja, o risco é grande mas você aprende muito com isso.\n\nSempre que você puder fazer algum projeto que tem algo a mais ou precisa tomar alguma atitude que vai um pouco além da sua zona de descanso, se realmente almeja uma carreira melhor, arrisque-se. Muitas vezes você vai errar e esse erro irá fazer você ficar cada vez melhor.\n\nOutra coisa bastante importante é não achar que tem que dar certo de primeira, por exemplo, sua empresa tem que dar certo de primeira, arriscar uma tecnologia nova e tem que dar certo de primeira e por aí vai… Eu sempre gosto de primar é fazer até dar certo, não importa se vai ser de primeira, segunda. Se você acredita naquilo, tem que correr o risco. Não fique com medo de testar uma tecnologia nova ou pegar algum projeto novo porque isso vai te trazer muito aprendizado.",
      "description": "Uma coisa que sempre marcou a minha infância foram as propagandas do sabão em pó OMO que via na TV. O slogan era “Se sujar faz bem” e mostrava as crianças ...",
      "keywords": [
        "sujar",
        "muito",
        "mais",
        "https",
        "carreira",
        "medo",
        "para",
        "fazer",
        "errar",
        "certo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/se-sujar-faz-bem"
      }
    },
    {
      "id": "bd6696305af42234",
      "url": "https://devpleno.com/como-manter-se-motivado",
      "title": "Como manter-se motivado - DevPleno (Part 2)",
      "content": "Compartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20manter-se%20motivado&url=https%3A%2F%2Fdevpleno.com%2Fcomo-manter-se-motivado) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomo-manter-se-motivado)",
      "description": "A dica de hoje foi baseada em uma pergunta de um inscrito do canal, a pergunta foi a seguinte:  Como eu consigo me manter motivado a fazer um projeto? A pr...",
      "keywords": [
        "manter",
        "motivado",
        "https",
        "isso",
        "fazer",
        "objetivo",
        "para",
        "carreira",
        "como",
        "motiva"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/como-manter-se-motivado"
      }
    },
    {
      "id": "bd7e8262118b4eaa",
      "url": "https://devpleno.com/blog/algoritmo-campo-minado-minesweeper/index",
      "title": "Algoritmos: Campo Minado (Minesweeper) (Part 2)",
      "content": "if(i+1<len){\n          if(k>0){\n            if(filledField\\[i+1\\]\\[k-1\\]==='\\*'){\n              filledField\\[i\\]\\[k\\]++\n            }\n          }\n          if(filledField\\[i+1\\]\\[k\\]==='\\*'){\n            filledField\\[i\\]\\[k\\]++\n          }\n          if(k+1<numCols){\n            if(filledField\\[i+1\\]\\[k+1\\]==='\\*'){\n              filledField\\[i\\]\\[k\\]++\n            }\n          }\n        }\n      }\n    }\n  }\n  for(let i=0; i<len; i++){\n    console.log(filledField\\[i\\].join(''))\n  }\n  console.log('')\n}\n\ndo{\n  line = lines\\[current++\\]\n  let nums = line.split(' ')\n  if(nums.length===2){\n    const numLines = parseInt(nums\\[0\\])\n    const numCols = parseInt(nums\\[1\\])\n    if(numLines!==0 && numCols!==0){\n      console.log('Field #'+currentField+':')\n      minesweeper(lines.slice(current, current+numLines), numCols)\n      currentField++\n    }\n  }\n}while(line !== '0 0')\n```\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "filledfield",
        "numcols",
        "line",
        "const",
        "current",
        "field",
        "nums",
        "sobre",
        "minesweeper",
        "embed"
      ],
      "metadata": {
        "title": "Algoritmos: Campo Minado (Minesweeper)",
        "date": "2017-02-24",
        "tags": "['Algoritmos']",
        "thumbnail": "ALG.-CAMPO-MINADO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/algoritmo-campo-minado-minesweeper/index.md"
      }
    },
    {
      "id": "bd87b4aee1a34326",
      "url": "https://devpleno.com/blog/composicao-de-componentes-em-reactjs/index",
      "title": "Composição de componentes em ReactJS (Part 2)",
      "content": "Isso facilita bastante criar essa composição. Podemos criar componentes mais genéricos, principalmente os estilo containers e injetamos duas informações dentro. Outra coisa que podemos fazer o é o seguinte:\n\n```jsx\nconst Panel = (props) => {\n  return (\n    <div>\n      <h1>{props.header}</h1>\n\n      <p>{props.footer}</p>\n    </div>\n  )\n}\n\nconst Header = (props) => {\n  return <div>.....</div>\n}\n```\n\nO que passarem para ele eu vou colocar dentro do div. Como assim? Imagine que isso é meu header:\n\n```jsx\n<Panel\n  header={\n    <span>\n      'Olá <u>mundo!</u>\n    </span>\n  }\n/>\n```\n\nE eu vou dizer para ele que é um header com as coisas dentro:\n\n```jsx\n<Header>\n  <span>\n    'Olá <u>mudo!</u>\n  </span>\n</Header>\n```\n\nPara utilizar o que está dentro do header e o /header utilizamos uma outra propriedade chamada props.children:\n\n```jsx\nconst Header = (props) => {\n  return <div>{props.children}</div>\n}\n```\n\nEssas duas formas são bastante interessantes de se criar uma composição, ou com uma props normal ou se eu passar no corpo desse componente podemos gerar o props.children, com isso consigo pensar em componentes cada vez mais genéricos, porque eu posso fazer um header, por exemplo, para todas as minhas páginas e se eu quiser aplicar um class diferente, aplico no div.\n\nIsso libera um potencial para o React muito grande, porque a gente consegue reutilizar muito código a partir dessa componentização.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/HdSrcNnZPEM\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "header",
        "props",
        "para",
        "podemos",
        "como",
        "panel",
        "footer",
        "composi",
        "componentes",
        "isso"
      ],
      "metadata": {
        "title": "Composição de componentes em ReactJS",
        "date": "2017-08-01",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "COMPOSIÇÃO-REACTJS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/composicao-de-componentes-em-reactjs/index.md"
      }
    },
    {
      "id": "be1c7a58f7efe5b6",
      "url": "https://devpleno.com/blog/lista-definitiva-de-sites-para-progradores-remotos/index",
      "title": "Lista de sites para trabalhar remotamente como programador em 2022 (Part 2)",
      "content": "[Entre aqui para fazer seu cadastro na Scalable Path!](https://www.scalablepath.com/apply?r=tf5226)\n\n# RemoteOk.io\n\nEste site é mais como um agregador de vagas para trabalho remoto. Possui muitas vagas e é bastante organizado neste sentido.\n\n[https://remoteok.io/](https://remoteok.io/)\n\n# Crossover.com\n\nCrossover também é um Network (assim com o a Total). O que é bastante atrativo neles é o job board - onde eles incluem vagas bastante interessantes - que passam dos 200 mil dólares anuais (nada mal hein!).\n\n[https://www.crossover.com](https://www.crossover.com)\n\n[https://www.crossover.com/jobs - página com as vagas abertas](https://www.crossover.com/jobs)\n\n# StackOverflow Jobs\n\nOutro agregador de vagas bastante interessante é o StackOverflow Jobs. Ele possui integração com seu perfil da plataforma.\n\n[https://stackoverflow.com/jobs](https://stackoverflow.com/jobs)\n\n# LinkedIn\n\nO LinkedIn também é bastante poderoso para conseguir a sua próxima vaga remota como programador. Basta deixar seu perfil bem preenchido, buscar e aplicar para as vagas que você acredita serem ideias para você.\n\nNão esqueça de filtrar por vagas remotas (se esse for o seu objetivo.)\n\nAproveite e siga o DevPleno por lá:\n\n[https://www.linkedin.com/school/odevpleno/](https://www.linkedin.com/school/odevpleno/)\n\n[https://linkedin.com/in/tuliofaria](https://linkedin.com/in/tuliofaria)\n\nEsta lista ainda é preliminar :) Vamos trazer mais itens em breve.\n\n# Você já trabalha remotamente (no Brasil ou no exterior)?\n\nSe você já trabalha para o exterior e precisa de ajuda para nacionalizar o dinheiro de forma correta, além de decidir se é melhor como pessoa física ou jurídica, entre em contato conosco pelo e-mail contato@devpleno.com que te ajudaremos.\n\n.\n\nConheça o [Fullstack Master](https://go.devpleno.com/fsm?sck=blog-como-gerar-um-array-populado-em-javascript)",
      "keywords": [
        "para",
        "https",
        "toptal",
        "bastante",
        "vagas",
        "trabalhar",
        "como",
        "crossover",
        "jobs",
        "linkedin"
      ],
      "metadata": {
        "title": "Lista de sites para trabalhar remotamente como programador em 2022",
        "date": "2021-09-05",
        "tags": "['Carreira']",
        "thumbnail": "lista-trabalho-remoto.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/lista-definitiva-de-sites-para-progradores-remotos/index.md"
      }
    },
    {
      "id": "be1f55172395a6b4",
      "url": "https://devpleno.com/comprometimento-com-suas-metas",
      "title": "Comprometimento com as suas metas - DevPleno (Part 2)",
      "content": "Posteriormente eu fui assistindo e consegui escrever tudo, mas o mais importante é que na época eu não pensei o efeito que isso teria na minha vida. Hoje em dia, eu vejo que naquele tempo eu não coloquei muita desculpa para não fazer o que queria e esse é um ponto muito interessante, mesmo com algum empecilho, não devemos usá-lo como desculpa para não cumprir a meta. O segundo ponto, que é a chave do que estou falando, é que você se comprometa com uma meta para você mesmo, você precisa cumpri-la, senão vai acabar não fazendo nada de diferente e consequentemente não evoluindo como você deveria evoluir. O grande ponto é ter um comprometimento muito forte.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Comprometimento%20com%20as%20suas%20metas&url=https%3A%2F%2Fdevpleno.com%2Fcomprometimento-com-suas-metas) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcomprometimento-com-suas-metas)",
      "description": "Hoje vamos tratar de um ponto muito importante para toda a carreira: o comprometimento com as suas metas. Quais são as suas? Aprender uma linguagem de prog...",
      "keywords": [
        "para",
        "https",
        "carreira",
        "suas",
        "metas",
        "meta",
        "como",
        "comprometimento",
        "ponto",
        "hoje"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/comprometimento-com-suas-metas"
      }
    },
    {
      "id": "be3134ef888e9f84",
      "url": "https://devpleno.com/blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index",
      "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador (Part 3)",
      "content": "O [99Freelas](https://www.99freelas.com.br) é uma plataforma brasileira com mais de 3 milhões de freelancers cadastrados e mais de 138 mil projetos realizados. Os projetos abrangem TI, design, marketing e mais.\n\nVocê se cadastra, completa seu perfil e se candidata aos projetos disponíveis. A cada tarefa concluída, recebe avaliações que aumentam sua visibilidade. O pagamento é intermediado pela plataforma, o que dá mais segurança para ambas as partes.\n\n**Ideal para:** quem quer começar com projetos nacionais em português, sem a barreira do idioma.\n\n## 6. Scalable Path\n\nO [Scalable Path](https://www.scalablepath.com) funciona de forma diferente dos marketplaces tradicionais. A própria equipe da plataforma faz testes e entrevistas com você, e depois conecta com clientes internacionais que procuram habilidades específicas — como desenvolvimento iOS, Android, React, PHP ou Node.js.\n\nIsso significa que você não precisa ficar buscando projetos ativamente. Uma vez aprovado, eles fazem o match com empresas que precisam do seu perfil. Os projetos são internacionais e pagos em dólar.\n\n**Ideal para:** devs com experiência que preferem ser selecionados em vez de competir em leilões.\n\n## 7. Trampos.co\n\nO [Trampos.co](https://trampos.co) é uma plataforma brasileira com mais de 1,2 milhão de profissionais cadastrados. Não é exclusivamente para freelancers — também lista vagas CLT, PJ e estágio — mas tem uma boa oferta de trabalho remoto para desenvolvedores.\n\nVocê pesquisa vagas por cidade, área (programação, criação, marketing) e tipo de contrato. O cadastro é gratuito para profissionais, e a plataforma também oferece conteúdo educacional pelo Trampos Academy.\n\n**Ideal para:** quem busca tanto freelance quanto vagas fixas remotas no mercado brasileiro.\n\n## Como escolher a plataforma certa?\n\nNão existe uma resposta única. Minha recomendação:",
      "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
      "keywords": [
        "para",
        "projetos",
        "mais",
        "https",
        "plataforma",
        "come",
        "freelancer",
        "ideal",
        "como",
        "experi"
      ],
      "metadata": {
        "title": "Trabalhar como freelancer: 7 sites para conseguir jobs como programador",
        "description": "Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para come��ar.",
        "date": "2026-04-04",
        "tags": "['Carreira']",
        "thumbnail": "Freelancers.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index.md"
      }
    },
    {
      "id": "be7deef2b6ed0d1b",
      "url": "https://devpleno.com/pegadinha-de-entrevistas-de-javascript",
      "title": "Pegadinha #1 de entrevistas em JavaScript - DevPleno (Part 2)",
      "content": "Confira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Pegadinha%20%231%20de%20entrevistas%20em%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Fpegadinha-de-entrevistas-de-javascript) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpegadinha-de-entrevistas-de-javascript)",
      "description": "Hoje quero comentar uma questão muito comum em entrevistas de JavaScript. Qual é a saída desse código? Detalhe que estamos utilizando um setTimeOut com um ...",
      "keywords": [
        "javascript",
        "settimeout",
        "https",
        "console",
        "entrevistas",
        "como",
        "undefined",
        "dentro",
        "isso",
        "essa"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/pegadinha-de-entrevistas-de-javascript"
      }
    },
    {
      "id": "be9425e68030e425",
      "url": "https://devpleno.com/spread-operator",
      "title": "Testando o Spread Operator: Novidade do ES6 - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades.\n\nAh, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Testando%20o%20Spread%20Operator%3A%20Novidade%20do%20ES6&url=https%3A%2F%2Fdevpleno.com%2Fspread-operator) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fspread-operator)",
      "description": "Olá! Neste post, vou mostrar uma novidade do ES6: o Spread Operator. Você deve estar se perguntando agora (ou não): Para que serve o Spread Operator? O Spr...",
      "keywords": [
        "operator",
        "spread",
        "para",
        "https",
        "quando",
        "criar",
        "exemplo",
        "const",
        "valores",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/spread-operator"
      }
    },
    {
      "id": "bf15740eb6dd4d7d",
      "url": "https://devpleno.com/blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index",
      "title": "8 dicas de organização para freelancers se darem bem na carreira (Part 4)",
      "content": "Esse é um cenário familiar? Então, provavelmente, você não está destinando a devida atenção para as suas obrigações. Para focar no seu trabalho, elimine todos os focos de distração. Desligue o celular ou faça o que for preciso para ficar concentrado.\n\nNão existe uma regra aqui. O importante é saber como se manter compenetrado com a atividade que está sendo executada. Afinal, somente você sabe o que desvia sua atenção.\n\n## 8\\. Crie rituais\n\nRealizar sistematicamente determinadas atividades pode ajudá-lo a se habituar com a vida de freelancer. O que você fazia antes de ir para a empresa em que trabalhava? Tomava café, lia algumas notícias e via um pouco de TV? Saiba, então, que você pode continuar tendo tais hábitos. Na verdade, você não só pode como deve, pois, assim, quando finalizá-los, a sua mente vai entender que é horário de pegar no batente.\n\nComo em todo trabalho, existe alguns desafios que precisam ser superados no mundo dos freelancers. Mas pode apostar: não há nada mais gratificante — afinal, poder controlar seus horários e trabalhar com aquilo que se ama já é motivo o suficiente para curtir essa opção.\n\nE você, já coloca essas dicas de organização em prática? Tem mais alguma sugestão que ajuda a lidar com a rotina de freelancer? Deixe um comentário!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "mais",
        "como",
        "freelancer",
        "pode",
        "afinal",
        "isso",
        "preciso",
        "https",
        "devpleno"
      ],
      "metadata": {
        "title": "8 dicas de organização para freelancers se darem bem na carreira",
        "date": "2017-07-14",
        "tags": "['Carreira']",
        "thumbnail": "105725-8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index.md"
      }
    },
    {
      "id": "bf58e95f6d7fae26",
      "url": "https://devpleno.com/fetch-hands-on",
      "title": "Fetch - Uma nova forma de fazer requisições HTTP - DevPleno (Part 2)",
      "content": ".catch((e)=>console.log(e))\nCaso a URL esteja errada, ele vai retornar que não foi encontrada. Fica muito mais fácil de fazer essas requisições em HTTP. Como é uma promise, nós conseguimos fazer várias ao mesmo tempo, utilizar com generator, await async e por ai vai, fica bem mais organizado.\n\nEu mostrei essas duas formas, post e get, mas é simples fazer as outras formas também. Uma última coisa interessante é que, nos navegadores, ele já está disponível como window.fetch\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Fetch%20-%20Uma%20nova%20forma%20de%20fazer%20requisi%C3%A7%C3%B5es%20HTTP&url=https%3A%2F%2Fdevpleno.com%2Ffetch-hands-on) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffetch-hands-on)",
      "description": "Neste hands on, vamos testar o Fetch, uma alternativa que vem sendo adotada e implementada nos navegadores para substituir a forma como fazíamos requisiçõe...",
      "keywords": [
        "fetch",
        "fazer",
        "para",
        "json",
        "http",
        "https",
        "como",
        "then",
        "post",
        "interessante"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/fetch-hands-on"
      }
    },
    {
      "id": "bfba9a157984b149",
      "url": "https://devpleno.com/lista-encadeada-adicionar-no",
      "title": "Lista encadeada - Adicionar nó - DevPleno (Part 3)",
      "content": "return{\nlength: () => length\nadd: (value) => add(value)\nprint: () => console.log(head)\n}\nconst list = LinkedList()\nconsole.log(list.length())\nlist.add(1)\nconsole.log(list.length())\nlist.print()\nPerceba que é retornado 0, 1 e em seguida **value:1 next: null**, mas tem um detalhe: se eu chamar novamente um add e adicionar um valor dois, não vai acontecer nada; vamos continuar apenas com um porque agora o head não é mais um false. Agora eu preciso descobrir qual o nó que o next vai ser null para aí sim adicionar nesse null:\n\nconst add (value) =>{\nif(!head){\nhead = Node(value)\nlength++\nreturn head\n}\nlet node = head\nwhile(node.next){\nnode = node.next\n}\nnode.next = Node(value)\nlength++\nreturn node.next\nconsole.log(node)\n}\nEntão conseguimos chegar no nó, começa com o head e enquanto o node.next for verdadeiro vai andar para frente, quando ele for falso o nó vai ter a representação do último item, então podemos colocar o nó igual a node(value), novamente dou um length++ e um return no next, já que estou retornando o nó que foi adicionado.\n\nVamos recapitular o que fizemos: se minha lista está vazia, eu vou adicionar no head um novo nó, incremento o length. Se isso não acontecer eu vou pegar o head, coloco em uma variável node e enquanto esse nó for verdadeiro, eu vou para o próximo, quando chegar no próximo, que está com null, pego ele e adiciono um novo nó, incremento e retorno esse nó.\n\nA ideia é a gente conseguir adicionar novos nós infinitamente. Quando pensamos isso em uma estrutura de dados sem ser JavaScript, conseguimos adicionar nós dinamicamente, podemos alocar esses espaço de memória e ir adicionando de forma dinâmica, por exemplo, em linguagens como C é um pouco mais utilizado.",
      "description": "Vamos explorar um pouco mais de estrutura de dados de algoritmos que são comuns na base curricular, principalmente em computação, e caem muito em competiçã...",
      "keywords": [
        "length",
        "head",
        "value",
        "list",
        "node",
        "lista",
        "para",
        "vamos",
        "return",
        "const"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/lista-encadeada-adicionar-no"
      }
    },
    {
      "id": "bfd8f16dae344ecc",
      "url": "https://devpleno.com/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript",
      "title": "Verificando o tempo para executar um trecho de código em Javascript - DevPleno (Part 2)",
      "content": "console.time('TempoLoop')\n// trecho de código a ser medido\nconsole.endTime('TempoLoop')\nO tempo de execução será exibido em milisegundos em ambos os casos. Um ponto muito importante quando estamos medindo o tempo de execução de um trecho de código é não executar console.log dentro de laços repetição ou dentro de algorítmo onde ele será executado várias vezes. O node/browser ou até mesmo a saída no console em outras linguagens é muito custosa, e vai atrapalhar seus testes, por deixar de maneira geral seu código rodando mais lentamente. Existem outras formas de fazer isso, com profiling e outras ferramentas. Mas esse será tema para outro post :) Não deixem de comentar e nos seguir em todas as redes sociais, até a próxima!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastra seu e-mail para não perder as novidades. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Verificando%20o%20tempo%20para%20executar%20um%20trecho%20de%20c%C3%B3digo%20em%20Javascript&url=https%3A%2F%2Fdevpleno.com%2Fverificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fverificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript)",
      "description": "Uma tarefa que venho executando bastante nos últimos dias, principalmente por participar de alguns processos de seleção para projetos é em relação a perfor...",
      "keywords": [
        "trecho",
        "digo",
        "para",
        "javascript",
        "console",
        "tempo",
        "https",
        "executar",
        "execu",
        "complexidade"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript"
      }
    },
    {
      "id": "c03afec2a036b4d8",
      "url": "https://devpleno.com/blog/factory-function/index",
      "title": "Factory Function em JavaScript (Part 1)",
      "content": "Hoje vou dar uma dica de JavaScript, mais especificamente como implementar o Patern Factory. Factory é bastante conhecido em Java, C# e outras linguagens com orientação a objeto. Nessas linguagens, retornamos uma instancia de uma classe, no JavaScript, poderíamos também, mas para ser mais funcional, podemos retornar um objeto de forma literal, ou seja, já em JavaScript. Vamos supor que eu tenha um Person Factory onde é passado o name:\n\n```jsx\nfunction personFactory(name) {\n  return {\n    name: name,\n\n    type: 'person'\n  }\n}\n\nconsole.log(personFactory('Tulio'))\n\nconsole.log(personFactory('João'))\n```\n\nQuando executarmos o código, ele vai criar um objeto novo com o nome Tulio e outro com o nome João. Então uma das funcionalidades que temos para factory é criar objetos novos. Outra coisa bacana, mas bem especifico de linguagens funcionais e até da característica do JavaScript, é que temos uma closure, então acabamos conseguindo fazer um contador, por exemplo, com um count retornando uma arrow function..\n\n```jsx\nfunction personFactory(name) {\n  let count = 0\n\n  return {\n    count () => count++,\n    name: name,\n    type: 'person'\n  }\n}\n\nconst tulio = personFactory('Tulio')\n\nconst joao = personFactory('João')\n\nconsole.log(tulio)\n\nconsole.log(joao)\n```\n\nO primeiro count não é o mesmo que o de dentro, o de dentro é o que retornamos para a factory. Quando eu chamo o Person Factory passando o nome 'Tulio', ele vai criar um escopo novo que vai retornar somente esses dados, e junto com ele vai travar o contexto. O count vai ter o valor 0 para o objeto Tulio e depois para o objeto João, então se fizermos o seguinte:\n\n```jsx\nconst tulio = personFactory('Tulio')\n\nconst joao = personFactory('João')\n\nconsole.log(tulio.count())\n\nconsole.log(tulio.count())\n```",
      "description": "Aprenda como usar Factory Functions em JavaScript para criar objetos sem classes. Exemplos práticos com closures e estado privado.",
      "keywords": [
        "tulio",
        "count",
        "name",
        "personfactory",
        "objeto",
        "para",
        "console",
        "factory",
        "mais",
        "const"
      ],
      "metadata": {
        "title": "Factory Function em JavaScript",
        "description": "Aprenda como usar Factory Functions em JavaScript para criar objetos sem classes. Exemplos práticos com closures e estado privado.",
        "date": "2017-07-20",
        "tags": "['Javascript']",
        "thumbnail": "FACTORY-FUNCTION-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/factory-function/index.md"
      }
    },
    {
      "id": "c052b57581fe832d",
      "url": "https://devpleno.com/por-que-tudo-na-vida-acontece-2x",
      "title": "Por que tudo na vida acontece 2x? - DevPleno",
      "content": "Carreira\n\n## Por que tudo na vida acontece 2x?\n\nT\nPor Tulio Faria • 14 de agosto de 2016\n\n[Carreira](/tag/carreira)\n\nNo vídeo anterior, falamos que os pensamentos limitantes nos atrapalham a alcançar resultados. Neste vídeo, falo sobre como fazer o oposto disso.\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Por%20que%20tudo%20na%20vida%20acontece%202x%3F&url=https%3A%2F%2Fdevpleno.com%2Fpor-que-tudo-na-vida-acontece-2x) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpor-que-tudo-na-vida-acontece-2x)",
      "description": "No vídeo anterior, falamos que os pensamentos limitantes nos atrapalham a alcançar resultados. Neste vídeo, falo sobre como fazer o oposto disso. <div clas...",
      "keywords": [
        "https",
        "carreira",
        "tudo",
        "vida",
        "acontece",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fpor",
        "2016"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/por-que-tudo-na-vida-acontece-2x"
      }
    },
    {
      "id": "c067dfab9f06cec9",
      "url": "https://devpleno.com/blog/autenticacao-e-autorizacao/index",
      "title": "Autenticação e Autorização - Entenda os termos (Part 1)",
      "content": "Dois termos estão muito relacionados quando estamos desenvolvendo um sistema para Web ou Mobile: AUTENTICAÇÃO e AUTORIZAÇÃO.\n\nVamos pensar o seguinte: temos uma empresa na qual você precisa apresentar um crachá na portaria para conseguir entrar. O crachá prova que você é quem você diz ser. Esse processo de confirmação é o que chamamos de autenticação.\n\nNo momento em que o segurança te deixa passar ou não, baseado na sua função ou algo nesse sentido, ele vai te dar a autorização, que é o segundo passo.\n\nGeralmente o que fazemos em um sistema é identificar o usuário, com usuário e senha e a partir disso verificamos se pode ou não fazer.\n\nQuando pensamos em um sistema digital, temos algumas formas de nos identificarmos. No mundo offline, temos o CPF, o RG, a CNH, etc. No mundo digital, temos algumas outras formas, que podem ser dividas em três categorias:\n\n– Algo que sabemos: Usuário e senha.\n\n– Algo que temos: Token, posse de um celular.\n\n– Algo que somos: Biometria.\n\nTemos um número cada vez maior de autenticação e podemos misturar as categorias, como token e usuário e senha, que chamamos de Autenticação de dois fatores.\n\nA autorização é um pouco mais complexa, afinal uma vez que o usuário provou que é realmente ele, vamos ter que ir no banco do sistema para saber se esse usuário é mesmo ele e qual é o tipo de acesso ele tem.\n\nQuando for montar um sistema, pense em qual tipo de autenticação o público-alvo está acostumado a utilizar para se identificar, e só depois disso pense na autorização.\n\nPense um pouco sobre esses dois termos, vamos voltar a falar mais das formas de autenticação posteriormente. Por enquanto esse conceito básico é o suficiente.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/acGpu4z0azk\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "autentica",
        "temos",
        "sistema",
        "para",
        "autoriza",
        "algo",
        "embed",
        "dois",
        "quando",
        "vamos"
      ],
      "metadata": {
        "title": "Autenticação e Autorização - Entenda os termos",
        "date": "2017-06-06",
        "tags": "['Fundamentos']",
        "thumbnail": "AUTENTICAÇÃO-X-AUTORIZAÇÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/autenticacao-e-autorizacao/index.md"
      }
    },
    {
      "id": "c07995996727e5df",
      "url": "https://devpleno.com/closures-e-escopos",
      "title": "NodeJS Primeiros Passos: Closures e Escopos - DevPleno",
      "content": "Javascript\n\n## NodeJS Primeiros Passos: Closures e Escopos\n\nT\nPor Tulio Faria • 26 de julho de 2016\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste vídeo é abordado mais sobre closures e escopos em javascript, conceitos bastante importantes para a criação futura de módulos.\n\n[Código fonte:](https://gist.github.com/tuliofaria/72953c6c4b898561aee5e8d91dd589ab)\n\n## Confira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20Closures%20e%20Escopos&url=https%3A%2F%2Fdevpleno.com%2Fclosures-e-escopos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fclosures-e-escopos)",
      "description": "Neste vídeo é abordado mais sobre closures e escopos em javascript, conceitos bastante importantes para a criação futura de módulos. Código fonte:  Confira...",
      "keywords": [
        "https",
        "javascript",
        "nodejs",
        "escopos",
        "closures",
        "para",
        "devpleno",
        "facebook",
        "youtube",
        "2fdevpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/closures-e-escopos"
      }
    },
    {
      "id": "c080eb785c78cc88",
      "url": "https://devpleno.com/arvore-binaria-de-busca",
      "title": "Árvore Binária de Busca em JavaScript - DevPleno (Part 2)",
      "content": "insert(arvore, 11)\n\nconsole.log(arvore)\n\ninsert(arvore, 9)\n\nconsole.log(arvore)\n\ninsert(arvore, 8)\n\nconsole.log(arvore)\nO resultado será:\n\nCom o 8 agora temos 10 na raiz, 11 do lado direito, do lado esquerdo 9 e do lado esquerdo do lado esquerdo 8.\n\nCom isso conseguimos fazer o algoritmo de inserção na árvore de busca. É importante ressaltar que isso não é programação funcional, já que não estamos retornando uma nova árvore. Fiz isso apenas para mostrar que boa parte dos algoritmos que fazemos em C ou alguma linguagem que vemos na graduação utilizam a passagem por referência.\n\nConfira o passo a passo no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=%C3%81rvore%20Bin%C3%A1ria%20de%20Busca%20em%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Farvore-binaria-de-busca) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Farvore-binaria-de-busca)",
      "description": "Hoje vamos falar mais sobre árvores binárias, porém um tipo específico, a árvore binária de busca. Qual a diferença da árvore binária de busca para a árvor...",
      "keywords": [
        "arvore",
        "insert",
        "rvore",
        "tree",
        "value",
        "console",
        "busca",
        "isso",
        "para",
        "valor"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/arvore-binaria-de-busca"
      }
    },
    {
      "id": "c0ae5e724e6583e1",
      "url": "https://devpleno.com/streams-parte-3-transform",
      "title": "Hands-on: Streams Parte 4 - Transform - DevPleno (Part 2)",
      "content": "const fs = require('fs')\nconst zlib = require('zlib')\nconst readable = fs.createReadStream('arquivo.txt')\nconst readable = fs.createWriteStream('arquivo-upper.txt')\nconst Transform = require('Stream').Transform\nconst upperCase = new Transform({\ntransform(chunk, encoding, callback) {\nconst chunkUpper = (chunk + '').toUpperCase()\nthis.push(chunkUpper)\ncallback()\n}\n})\nreadable.pipe(upperCase).pipe(writable)\nNo código acima, criamos um Stream transform pegando o Stream do core do Node utilizando a instancia de transform. Em seguida, criamos uma função upperCase e essa mesma função espera que passamos um método transform, enviando um chunk, encoding e um callback. Transformamos este chunck em um tipo string eo retornamos eem push.\n\nTemos um callback ali, pois este método poderia ser assíncrono, fazendo outra operação que dependesse de um IO e, com isso, chamaríamos o callback quando tivéssemos terminado de transformar o chunk de dado.\n\nEm resumo, pegamos o que o readable enviou, criamos uma variável nova e passamos esta informação para maiúsculo.\n\n**Qual a utilidade do Transform?**\n\nÉ muito comum utilizarmos este stream para zippar arquivos e transformá-los para maiúsculos. Isso é muito poderoso para podermos criar aplicações que não precisam ler realmente estes dados em memória para depois ser processados. Por exemplo, o zipper que criamos irá zippar pedaços do arquivo e isso não consome tanto recurso da maquina.\n\n**Conclusão**\n\nEste tipo de Stream é muito interessante e eu recomendo fortemente que você faça alguns testes. Existem outras maneiras de fazer o transform, como por exemplo em alguns casos em que estendemos a classe, mas acredito que a forma explicada aqui seja mais convencional ou ‘java way’.\n\nConfira também o vídeo do hand-on:",
      "description": "Continuando nossa série sobre Streams, iremos falar sobre como podemos ligar um readable em um writable e viceversa, e como criamos o tipo Transform. Prime...",
      "keywords": [
        "transform",
        "const",
        "readable",
        "writable",
        "para",
        "stream",
        "pipe",
        "arquivo",
        "zipper",
        "criamos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/streams-parte-3-transform"
      }
    },
    {
      "id": "c0e94b7e96d9d6eb",
      "url": "https://devpleno.com/devreacrjs",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreacrjs to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "https",
        "devpleno",
        "devreactjs",
        "redirecting",
        "from",
        "devreacrjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreacrjs"
      }
    },
    {
      "id": "c0fbb5d9a76977e9",
      "url": "https://devpleno.com/registros-do-mysql-no-nodejs",
      "title": "[SEGREDO] Muitos registros do MySQL no NodeJS - DevPleno (Part 2)",
      "content": "connection.connect(() => {\nconsole.log('connected')\nconst query = connection.query('select * from pessoas')\nquery.on('result', (row) => {\nconsole.log(row)\n})\n})\nA query tem algo bem interessante; ela mostra que algum resultado chegou no Stream porque quando fazemos essa consulta, ela é muito pesada, então trará linha a linha. Perceba que à medida que ele for recebendo de forma assíncrona, a gente vai processando os registros e isso é muito mais performático do que tentar usar o callback como estávamos fazendo antes.\n\nImagine, por exemplo, que temos algum arquivo que não fosse executado de primeira:\n\nquery.on('result', (row) => {\nsetTimeout(() => {\nconsole.log(row)\n}, 300)\n})\nQuando trazemos esse resultado, travaremos o Stream (lembrando que o Node é mono-thread), então enquanto eu estiver processando, ele vai ter várias coisas pendentes e corre o risco de ser mais rápido trazer da rede do que processar. Temos que falar para o driver do MySQL segurar:\n\nquery.on('result', (row) => {\nconnection.pause()\nsetTimeout(() => {\nconsole.log(row)\nconnection.resume()\n}, 300)\n})\nAssim vamos conseguir controlar esse fluxo de dados e podemos processar grandes quantidades de registros sem ter problema com memória. Outra coisa que podemos fazer é o seguinte: terminou de processar, pode finalizar a conexão:\n\n...\n},300)\n})\nquery.on('end', () => connection.end())\nÉ muito interessante utilizarmos essa query como um eventStream, ele vai enviando eventos e pausa a conexão, restabelecendo ela para continuar mandando dados sempre que estiver fazendo esse processamento dos dados, assim evitamos trazer todos os registros para memória de uma vez.\n\nSe você for fazer processo em lote, que é muito pesado, deixe os ‘console.log’ somente para debug porque ele também é pesado. Pensando em escala, você perde alguns mili segundos sempre que o faz. Outra coisa: se o processamento é muito lento, limite enquanto está testando:",
      "description": "Hoje quero contar um segredo para você: como utilizar o driver padrão do MySQL no Node para lidar com grandes quantidades de dados. A primeira coisa que va...",
      "keywords": [
        "query",
        "para",
        "connection",
        "mysql",
        "console",
        "fazer",
        "registros",
        "dados",
        "muito",
        "https"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/registros-do-mysql-no-nodejs"
      }
    },
    {
      "id": "c1003a033baca506",
      "url": "https://devpleno.com/entrevista-carlos-drury-e-thiago-coelho",
      "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho - DevPleno (Part 1)",
      "content": "Carreira\n\n## DevPleno Entrevista - Carlos Drury e Thiago Coelho\n\nT\nPor Tulio Faria • 3 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nCarlos Drury e Thiago Coelho fazem parte do GDG Vale da Eletrônica. Essa entrevista aconteceu durante um evento organizado por eles no Vale da Eletrônica, em Santa Rita do Sapucaí.\n\nO Carlos é desenvolvedor JavaScript e atualmente trabalha no INATEL, em um projeto da Ericsson, uma das empresas que o INATEL presta serviço.\n\nO Thiago é especialista em JavaScript e trabalha no INATEL com desenvolvimento WEB. Tem experiência de mais de 10 anos em São Paulo e hoje atua em um projeto chamado OSS da Ericcsson.\n\nO Vale da Eletrônica é uma região que tem muita empresa tecnológica que atende clientes gigantescos lá fora e em projetos totalmente distintos, e o mais bacana é que não é em um grande centro, então temos uma certa facilidade de ter esses eventos contando com gente que tem atuação internacional e de grande porte.\n\nO que é o GDG (Grupo de Desenvolvedores Google) em si de maneira geral?\n\n**Carlos Drury**: “O GDG surge através de uma comunidade de desenvolvedores dentro de uma localidade, geralmente são desenvolvedores que têm interesse em difundir conhecimento ou aumentar seu network, com isso o Google libera algum material e suporte para esses grupos, onde podemos ter esses materiais para ministrar palestras e convidar alguns palestrantes. Lembrando que o GDG é aberto para todos.”\n\nExistem outros GDG’s espalhados, eu gostaria de saber como uma pessoa pode participar de um GDG específico, se existe uma formalização do seu membro e quais as desvantagens de participar do GDG como um participante comum?",
      "description": "Carlos Drury e Thiago Coelho fazem parte do GDG Vale da Eletrônica. Essa entrevista aconteceu durante um evento organizado por eles no Vale da Eletrônica, ...",
      "keywords": [
        "para",
        "carlos",
        "ingl",
        "drury",
        "thiago",
        "carreira",
        "grande",
        "muito",
        "https",
        "coelho"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/entrevista-carlos-drury-e-thiago-coelho"
      }
    },
    {
      "id": "c1021b4255157288",
      "url": "https://devpleno.com/funcionalidades-do-console",
      "title": "4 funcionalidades do Console no DevTools que você não conhece - DevPleno (Part 2)",
      "content": "Deixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=4%20funcionalidades%20do%20Console%20no%20DevTools%20que%20voc%C3%AA%20n%C3%A3o%20conhece&url=https%3A%2F%2Fdevpleno.com%2Ffuncionalidades-do-console) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffuncionalidades-do-console)",
      "description": "O console no DevTools do Chrome apresenta algumas funcionalidades que muitos utilizam raramente ou até mesmo nem sabem que existem. Para fazer este teste, ...",
      "keywords": [
        "console",
        "https",
        "este",
        "pode",
        "para",
        "digo",
        "javascript",
        "html",
        "script",
        "error"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/funcionalidades-do-console"
      }
    },
    {
      "id": "c113a81d151228b8",
      "url": "https://devpleno.com/blog/stream-parte-2-writable/index",
      "title": "Hands-on: Streams Parte 2 - Writable (Part 1)",
      "content": "Vamos continuar falando sobre o Stream em node, mais especificamente sobre o Writable, lembrando que podemos usar estes conceitos em outras linguagens. Se você ainda não viu a parte 1, clique [AQUI](https://www.devpleno.com/streams-parte-1/).\n\n**O que é Writable Stream?**\n\nSão Stream's onde podemos escrever algo neles, diferente do Readable que apenas lemos os dados. Dizemos que o Writable é um stream de destination. Podemos utiliza-los, por exemplo, em operações em rede, escrever em arquivos, etc. Hoje vamos trabalhar fazendo testes em um arquivo por ser mais simples.\n\n**Qual a vantagem em relação ao modo sem Stream?**\n\nDo mesmo modo que o readable Stream, iremos escrever 'parcelado' neste arquivo, sem necessidade de termos ele inteiro em memória.\n\n**Como ulizamos o Writable Stream?**\n\nPrimeiro vamos chamar o fs para ter acesso a ele e em seguida chamar o WritableStream, lembrando que no Writable temos algumas opões, como flags, que irá indicar como eu vou escrever este arquivo e o encoding para setar o tipo de codificação (UTF8 é o mais consolidado).\n\n```jsx\nconst sf = require('sf')\nconst writable = sf.createWriteStream('arquivo.txt', {\n  flags: 'w',\n  encoding: 'utf8'\n})\nwritable.write('exemplo\\\\n')\nwritable.write('acabou')\n```\n\nTemos então o Writable Stream, dizendo onde eu quero gravar meu arquivo e qual flag quero utilizar, neste caso utilizamos o W que é somente para escrever criando um novo arquivo ou sobrescrevendo um já existente por completo.\n\nAo trocar o W pelo A entramos no modo append, ou seja, ele acrescenta a escrita no final do arquivo, somando o anterior com as novas adições.\n\n**Por que utilizamos o Writable Stream?**\n\nPodemos construir um arquivo nosso com stream parcialmente e, a medida em que temos acesso a novos dados para serem escritos, podemos adiciona-los.\n\n**Concluindo**",
      "keywords": [
        "stream",
        "writable",
        "arquivo",
        "podemos",
        "para",
        "escrever",
        "https",
        "como",
        "embed",
        "vamos"
      ],
      "metadata": {
        "title": "Hands-on: Streams Parte 2 - Writable",
        "date": "2017-05-09",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/stream-parte-2-writable/index.md"
      }
    },
    {
      "id": "c189700f362dbde3",
      "url": "https://devpleno.com/fullstack-lab-especial-fsm-relampago",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-lab-especial-fsm-relampago to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstack",
        "especial",
        "relampago"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstack-lab-especial-fsm-relampago"
      }
    },
    {
      "id": "c19ff878afe6a5d4",
      "url": "https://devpleno.com/standard-parte-1",
      "title": "Standard - Padronize o código fonte JavaScript da sua equipe - DevPleno (Part 2)",
      "content": "Porque temos que colocar o nosso curly brace na mesma linha do controlador. Se você criar um projeto e seguir esse padrão, as chances do seu código ter menos erros é maior, além disso, ele fica bem mais legível.\n\nEle também tem algumas coisas de lint também, o próprio Standard utiliza o ES Lint para resolver isso. A ideia é que você comece a utilizar algum padrão de código em JavaScript, em todas as linguagens tem alguma recomendação para utilizar as melhores práticas.\n\nConfira o hands-on em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Standard%20-%20Padronize%20o%20c%C3%B3digo%20fonte%20JavaScript%20da%20sua%20equipe&url=https%3A%2F%2Fdevpleno.com%2Fstandard-parte-1) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fstandard-parte-1)",
      "description": "O módulo Standard é uma ferramenta bastante útil no nosso dia a dia, ele aplica algumas regras para você manter seu código fonte. Por exemplo, se você vai ...",
      "keywords": [
        "digo",
        "javascript",
        "standard",
        "para",
        "https",
        "temos",
        "nosso",
        "resolver",
        "isso",
        "linha"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/standard-parte-1"
      }
    },
    {
      "id": "c1ed949da76273ec",
      "url": "https://devpleno.com/blog/21",
      "title": "Blog - Página 21 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 28 de abr. de 2017 Javascript: Streams (P-4: Transform)](/javascript-streams-p-4-transform)\n\n[Javascript 24 de abr. de 2017 Hands-on: Low-db](/hands-low-db)\n\n[Javascript 24 de abr. de 2017 Hands-on: Faker](/hands-on-faker)\n\n[Javascript 24 de abr. de 2017 Javascript: Streams (P-1: Readable Streams)](/javascript-streams-p-1-readable-streams)\n\n[Javascript 24 de abr. de 2017 Javascript: Streams (P-2: Writable Streams)](/javascript-streams-p-2-writable-streams)\n\n[Carreira 24 de abr. de 2017 Dica: Precificação em Software](/precificacao-em-software)\n\n[Javascript 24 de abr. de 2017 Dica: Router Props](/router-props)\n\n[Javascript 17 de abr. de 2017 Dica: Once n vezes](/dica-n-vezes)\n\n[Javascript 17 de abr. de 2017 Hands-on: Injeção de Dependência é bom mesmo?](/hands-injecao-de-dependencia-e-bom-mesmo)\n\n[Javascript 17 de abr. de 2017 Hands-on: Currying](/hands-on-currying)\n\n[Algoritmos 10 de abr. de 2017 Dica: Como saber a complexidade de um algoritmo](/dica-como-saber-complexidade-de-um-algoritmo)\n\n[Javascript 10 de abr. de 2017 Hands-on: Json-Server](/hands-json-server)\n\n[Anterior](/blog/20)21 / 26[Próxima](/blog/22)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "streams",
        "hands",
        "dica",
        "blog",
        "algoritmos",
        "carreira",
        "todos",
        "ferramentas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/21"
      }
    },
    {
      "id": "c1edd93d52664ab5",
      "url": "https://devpleno.com/blog/vagas-de-emprego-no-brasil-e-no-exterior/index",
      "title": "Descrição das vagas de emprego no Brasil x no exterior (Part 1)",
      "content": "Hoje quero comentar um e-mail que recebi e achei bastante relevante falar sobre, principalmente quando estamos olhando para o mercado de desenvolvedor web.\n\nA pergunta no e-mail era a seguinte: Em vagas de empregos no exterior para desenvolvedor fullstack, existem informações bem pontuais, ou seja, exatamente o que os profissionais precisam saber.\n\nEm contrapartida, as vagas no Brasil exigem tudo e não pagam nada. Por quê? Eu acredito que no Brasil o pessoal ainda não está acostumado a contratar pessoas de tecnologia, geralmente são empresas de RH que não tem a ideia do perfil que eles vão procurar.\n\nComo eles procuram de forma abrangente, não é filtrado o que a pessoa precisa saber. À medida que começarmos a ter mais empresas de RH conhecendo a área, melhor vai ficar a contratação.\n\nNo exterior isso já é muito comum, quem contrata engenheiros ou desenvolvedores de softwares são outros engenheiros ou desenvolvedores, não mais pessoas somente do RH, por esse motivo há essa diferença.\n\nO que eu fiz para contratar meus funcionários?\n\nUm deles aconteceu dele conversar comigo e eu estar precisando, como já o conhecia, acabei contratando. O outro eu coloquei na descrição da vaga que precisava de pessoas que trabalhem com JavaScript e tivessem vontade de desenvolver nessa área, simplesmente isso.\n\nIsso vai muito da preparação da pessoa que está recrutando, muitas vezes a pessoa não sabe o que quer ou esperar de habilidade desse profissional. Para mim não era importante o JavaScript, eu coloquei para eu ter um norte, já que precisava de alguém que tivesse vontade de aprender e foi o que aconteceu.\n\nNa Toptal, por exemplo, todos os testes que fiz, foram feitos por engenheiros de softwares da Toptal.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/3o3bP_VOP9Y\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "para",
        "embed",
        "mail",
        "pessoas",
        "pessoa",
        "isso",
        "engenheiros",
        "responsive",
        "https",
        "youtube"
      ],
      "metadata": {
        "title": "Descrição das vagas de emprego no Brasil x no exterior",
        "date": "2017-09-26",
        "tags": "['Carreira']",
        "thumbnail": "VagasEmprego.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/vagas-de-emprego-no-brasil-e-no-exterior/index.md"
      }
    },
    {
      "id": "c1fe775f3c01f7be",
      "url": "https://devpleno.com/fullstackacademy",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstackacademy"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstackacademy"
      }
    },
    {
      "id": "c21d91d8def42a45",
      "url": "https://devpleno.com/hands-on-marked",
      "title": "Hands-on: Marked - DevPleno",
      "content": "Javascript\n\n## Hands-on: Marked\n\nT\nPor Tulio Faria • 2 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste vídeo, faço um hands-on do módulo Marked, que tem a função de converter Markdown para HTML.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Marked&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-marked) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-marked)",
      "description": "Neste vídeo, faço um handson do módulo Marked, que tem a função de converter Markdown para HTML. Confira o video: <div className=&#34;embedresponsive embedresp...",
      "keywords": [
        "https",
        "marked",
        "javascript",
        "hands",
        "nodejs",
        "para",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fhands"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-marked"
      }
    },
    {
      "id": "c22e7bb40b40e346",
      "url": "https://devpleno.com/sua-carreira-pode-mudar-durante-o-carnaval",
      "title": "Sua carreira pode mudar durante o carnaval? - DevPleno (Part 2)",
      "content": "Eu conheci a pessoa 2 anos antes deste e-mail. Sim, 2 anos! E pasmem, quem me apresentou a ela foi um colega que havia estudado comigo 13 anos antes. Network é um jogo de longo prazo e tem que ser cultivado o tempo todo!\n\n**Quanto você está comprometido com a mudança que quer?**\n\nEu queria uma mudança na minha carreira. Eu não sabia que ia acontecer no carnaval, mas mesmo assim, eu estava usando esse feriado para, de alguma forma, achar uma solução para a época. E isso me fez estar presente, disponível e apto a responder prontamente a uma oportunidade bastante interessante.\n\n**Quanto você se coloca em risco?**",
      "description": "Geralmente, acreditase que não… Afinal de contas, carnaval, feriado, festas, bebedeira, ninguém quer se preocupar com carreira ou trabalho. Não é verdade? ...",
      "keywords": [
        "carreira",
        "carnaval",
        "para",
        "minha",
        "estava",
        "durante",
        "mudan",
        "feira",
        "isso",
        "havia"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/sua-carreira-pode-mudar-durante-o-carnaval"
      }
    },
    {
      "id": "c23f623476bdd3d0",
      "url": "https://devpleno.com/filter",
      "title": "High-order Function Filter - DevPleno (Part 1)",
      "content": "Javascript\n\n## High-order Function Filter\n\nT\nPor Tulio Faria • 2 de agosto de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje vamos de continuar falando sobre as [high-order functions](https://www.devpleno.com/high-order-functions/) que podemos aplicar em um vetor em JavaScript. Nós já tínhamos feito algumas high-order functions anteriormente, nas quais mostrei o [Map](https://www.devpleno.com/map/) e o [Reduce](https://www.devpleno.com/reduce/), nesse exemplo, vou mostrar o FIlter, que também é muito interessante.\n\nVamos imaginar que temos um estoque que atualiza em tempo real e que por algum motivo a segunda peça está zerada. Quando eu for mostrar o carrinho eu quero que mostre apenas a soma das compras pro estoque maior que zero, para isso podemos usar a high-order function chamada de ‘filter’, ela filtra os itens que estão fora de estoque:\n\nconst carrinho = [{ id: 1, preco: 2, qtd: 2, estoque: 10 },\n{ id: 1, preco: 3, qtd: 1, estoque: 0 }]\n\nconst subtotal = (item) => item.preco * item.qtd\n\nconst total = carrinho\n.map(subtotal)\n.reduce((soma, subtotal) => subtotal + soma, 0)\n\nconst semEstoque = carrinho.filter((item) => item.estoque &#x3C; item.qtd)\n\nconsole.log(semEstoque)\nAssim ele já mostra quais têm a quantidade zero. Caso ele tivesse 2 de estoque, ele também mostraria que não consegue atender porque o estoque é menor que a quantidade. Então, quando formos somar o total do carrinho, podemos usar o filter para passar uma arrow function:\n\nconst total = carrinho\n.filter((item) => item.estoque >= item.qtd)\n.map(subtotal)\n.reduce((soma, subtotal) => subtotal + soma, 0)\n\nconst semEstoque = carrinho.filter((item) => item.estoque &#x3C; item.qtd)",
      "description": "Hoje vamos de continuar falando sobre as highorder functions que podemos aplicar em um vetor em JavaScript. Nós já tínhamos feito algumas highorder functio...",
      "keywords": [
        "item",
        "estoque",
        "subtotal",
        "filter",
        "https",
        "carrinho",
        "const",
        "high",
        "order",
        "reduce"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/filter"
      }
    },
    {
      "id": "c24ee96a417865d8",
      "url": "https://devpleno.com/async",
      "title": "Async - Como Controlar Operações Assíncronas - DevPleno (Part 2)",
      "content": "async.eachSeries(files, function (file, callback) {\nfs.readFile(file, 'utf-8', function (err, contents) {\nconsole.log(contents)\n\ncallback(null)\n})\n})\nAgora garantimos que ele vai abrir um após o outro.\n\nO async é muito bom para fazermos esse tipo de processamento, por exemplo, podemos fazer uma busca no banco, retornar uma sequência de registros e fazer um outro processamento com esse resultado de forma assíncrona.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Async%20-%20Como%20Controlar%20Opera%C3%A7%C3%B5es%20Ass%C3%ADncronas&url=https%3A%2F%2Fdevpleno.com%2Fasync) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fasync)",
      "description": "O Async é um módulo que nos ajuda a controlar processamento assíncrono. Primeiramente temos que instalar o async: Outro detalhe é que eu tenho 2 arquivos d...",
      "keywords": [
        "async",
        "arquivos",
        "arquivo",
        "esse",
        "callback",
        "para",
        "https",
        "outro",
        "processamento",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/async"
      }
    },
    {
      "id": "c284819ef509ec54",
      "url": "https://devpleno.com/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao",
      "title": "As vantagens do Javascript em todas as camadas de uma aplicação - DevPleno (Part 4)",
      "content": "E com o MongoDB, é possível inclusive usar o JavaScript no banco de dados. Isso faz com que realmente todo o fluxo de um objeto em uma aplicação seja realizado com o JavaScript.\n\nÉ possível receber a entrada no navegador com JavaScript, transportar a demanda para o back end ainda com a linguagem e, por fim, salvar um objeto no MongoDB ainda com o JavaScript. Naturalmente, o fluxo reverso também será tão prático quanto.\n\nE você, já está pronto para trabalhar com o JavaScript e se tornar um desenvolvedor full stack? Entre em [contato com a gente](https://www.devpleno.com/contato?utm_source=blog&#x26;utm_campaign=rc_blogpost) para aprender mais sobre essa possibilidade e potencializar seu currículo para o mercado! Esperamos você!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=As%20vantagens%20do%20Javascript%20em%20todas%20as%20camadas%20de%20uma%20aplica%C3%A7%C3%A3o&url=https%3A%2F%2Fdevpleno.com%2Fquais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fquais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao)",
      "description": "As muitas vantagens de usar JavaScript fizeram com que ela se tornasse a linguagem de programação mais popular do mundo. Extremamente versátil, o JavaScrip...",
      "keywords": [
        "javascript",
        "para",
        "aplica",
        "camadas",
        "linguagem",
        "mais",
        "todas",
        "node",
        "back",
        "https"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao"
      }
    },
    {
      "id": "c2e18c9568bda1cb",
      "url": "https://devpleno.com/async-await",
      "title": "ES6 - Async/Await - DevPleno (Part 2)",
      "content": "Com isso, podemos, por exemplo, ler 2 arquivos seguidos apenas adicionando um novo Await no código. Dois detalhes importantes: 1. Se formos usar o Await dentro de uma função, eu tenho que marcar esta function como Async. 2. Caso haja uma rejeição da promise, o node irá retornar o erro, mas com o código quebrado, com isso temos uma maneira correta de checar os erros com o Async/Await, usando o try catch:\n\ntry {\nasync function read(){\nconst contents = await readFilePromise ('arquivo.js')\nconsole.log(contents.toString())\n} catch(e){\nconsole.log('erro', e)\n}\n}\n**Conclusão**\nUma coisa que percebemos muito nessa evolução do javaScript é que está ficando cada vez mais fácil de escrever código assincrono, que realmente era o calcanhar de Aquiles da linguagem, pois temos callBack hell e vários outros erros, atrapalhando a qualidade do código, então essas features novas que vem sendo adicionadas simplifica muito nossa forma de construir códigos.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=ES6%20-%20Async%2FAwait&url=https%3A%2F%2Fdevpleno.com%2Fasync-await) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fasync-await)",
      "description": "Olá! Neste post, falo sobre o Async/Await, uma funcionalidade que vem com o ES6 e é possível ser utilizada no Node, permitindo o aumento da qualidade do no...",
      "keywords": [
        "await",
        "async",
        "para",
        "arquivo",
        "promise",
        "function",
        "digo",
        "const",
        "https",
        "node"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/async-await"
      }
    },
    {
      "id": "c349a04085a32917",
      "url": "https://devpleno.com/blog/hands-on-benchmark/index",
      "title": "Hands-on: Benchmark",
      "content": "Neste vídeo, fazemos o Benchmark entre duas funções em Javascript utilizando o Benchmark.js. A vantagem deste módulo é que ele compara as funções rodando várias vezes e fazendo a média entre as execuções.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/oV907Yl2WSA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "youtube",
        "benchmark",
        "entre",
        "classname",
        "iframe",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Hands-on: Benchmark",
        "date": "2017-03-03",
        "tags": "['Javascript']",
        "thumbnail": "Benchmark.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-benchmark/index.md"
      }
    },
    {
      "id": "c3b44698fc9231db",
      "url": "https://devpleno.com/como-receber-de-empresas-estrangeiras",
      "title": "Impostos e como receber de empresas estrangeiras - DevPleno (Part 2)",
      "content": "O detalhe é que eles vão fazer uma TED para sua conta aqui no Brasil e em seguida você precisa declarar esse dinheiro porque é uma renda que você está tendo. Para fazer isso, há algumas maneiras: a primeira é pedir para que eles façam essa transferência para uma conta de pessoa física, geralmente esses valores na conta de pessoa física não são valores pequenos. Vamos supor que essa conta gere R$100mil em um ano, isso já faz com que você caia na alíquota máxima de 27,5%, ou seja, de R$100mil você vai pagar R$27,5mil somente de impostos.\n\nAgora imagine o seguinte: você declarou esse valor, caso receba como pessoa física, precisa baixar um programa chamado Carnê Leão, esse programa da Receita calcula baseado no valor que você recebeu naquele mês (lembrando que tem a opção para dinheiro vindo do exterior), ele vai gerar uma guia que você deve pagar. Você é obrigado a recolher o Carnê Leão de forma mensal, geralmente não achamos essa informação tão facilmente na internet, então é bom lembrar isso, devemos pagar ele no mês que recebemos. Eu acredito que isso seja muito bom, porque você não esquece de guardar esse dinheiro, imagine você receber R$100mil em um ano em 12x e esquecer de recolher e guardar esses 27,5%, depois vai faltar dinheiro para pagar o imposto. Pagando corretamente você pode ter restituição de imposto de renda.\n\nMas qual valor declarar?**\n\nEu declaro o valor que caiu na minha conta, porque a empresa lá de fora não tem essa informação para a receita daqui, então só é validado quando cai no banco da sua conta.\n\nOutra opção é com pessoa jurídica. Vamos utilizar os mesmos R$100mil como exemplo. Nesse caso, você vai pagar mais ou menos 10%, a minha alíquota hoje no simples nacional está mais ou menos 7%.",
      "description": "Você sabe como receber de empresas estrangeiras (Toptal, Crossover, Scalable Path e outras)? Cada empresa dessa tem a possibilidade de enviar o dinheiro de...",
      "keywords": [
        "para",
        "esse",
        "como",
        "receber",
        "empresa",
        "dinheiro",
        "https",
        "pessoa",
        "isso",
        "pagar"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/como-receber-de-empresas-estrangeiras"
      }
    },
    {
      "id": "c3c11debe573787a",
      "url": "https://devpleno.com/qual-a-sua-desculpa",
      "title": "Qual é a sua desculpa? - DevPleno",
      "content": "Carreira\n\n## Qual é a sua desculpa?\n\nT\nPor Tulio Faria • 22 de junho de 2017\n\n[Carreira](/tag/carreira)\n\nQual a sua desculpa para não fazer ou não estudar alguma coisa hoje?\n\nNosso corpo e nossa mente tem essa mania de dar desculpas para tudo, então sempre que queremos dar um passo a mais, estudar algo novo ou fazer algo interessante, a nossa mente nos dá desculpas para não fazer e muitas vezes acreditamos nessas desculpas. Por exemplo, estou muito cansado para aprender uma linguagem nova ou um idioma novo.\n\nO problema nisso é que como conhecemos muito bem nosso corpo e mente, damos desculpas que nós mesmos acreditamos, então é muito difícil lutar contra isso. A minha dica é que sempre que você se pegar dando uma desculpa, converta isso em uma motivação, afinal esse é seu corpo tentando te ‘proteger’ e você deve lutar contra isso porque é apenas a sua mente tentando me desviar do seu objetivo.\n\nSempre que ouvir de alguém que algo é difícil de ser feito, pegue isso e transforme em motivação para você, pois quem quer fazer arruma um jeito e quem não quer arruma desculpa.\n\nVeja o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Qual%20%C3%A9%20a%20sua%20desculpa%3F&url=https%3A%2F%2Fdevpleno.com%2Fqual-a-sua-desculpa) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fqual-a-sua-desculpa)",
      "description": "Qual a sua desculpa para não fazer ou não estudar alguma coisa hoje? Nosso corpo e nossa mente tem essa mania de dar desculpas para tudo, então sempre que ...",
      "keywords": [
        "desculpa",
        "para",
        "https",
        "fazer",
        "mente",
        "desculpas",
        "isso",
        "carreira",
        "qual",
        "corpo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/qual-a-sua-desculpa"
      }
    },
    {
      "id": "c3eb613e1eb56f90",
      "url": "https://devpleno.com/blog/2",
      "title": "Blog - Página 2 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 16 de fev. de 2018 Férias e feriados trabalhando por meio da toptal](/ferias-e-feriados-trabalhando-por-meio-da-toptal)\n\n[Carreira 16 de fev. de 2018 Quanto ganha quem trabalha por meio da Toptal?](/quanto-ganha-quem-trabalha-por-meio-da-toptal)\n\n[Carreira 15 de fev. de 2018 Formas de trabalho na Toptal](/formas-de-trabalho-por-meio-da-toptal)\n\n[Carreira 15 de fev. de 2018 Horário de trabalho na toptal](/horario-de-trabalho-na-toptal)\n\n[Carreira 15 de fev. de 2018 Qual o nível de inglês para trabalhar por meio da Toptal?](/nivel-de-ingles-para-a-toptal)\n\n[Carreira 15 de fev. de 2018 Precisa ter diploma para trabalhar por meio da Toptal?](/precisa-ter-diploma-para-a-toptal)\n\n[Carreira 9 de fev. de 2018 Trabalhar na Toptal ou por meio da Toptal?](/na-toptal-ou-por-meio-da-toptal)\n\n[Carreira 9 de fev. de 2018 Por que a Toptal é tão valorizada no mercado?](/por-que-a-toptal-e-tao-valorizada)\n\n[Carreira 9 de fev. de 2018 O que é a Toptal? | Série Trabalho Remoto](/toptal-serietrabalhoremoto)\n\n[Javascript 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)\n\n[Carreira 30 de nov. de 2017 Como manter-se motivado](/como-manter-se-motivado)\n\n[Javascript 30 de nov. de 2017 Normalizar-email](/normalizar-email)\n\n[Anterior](/blog)2 / 26[Próxima](/blog/3)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "toptal",
        "carreira",
        "2018",
        "meio",
        "para",
        "trabalho",
        "javascript",
        "2017",
        "precisa",
        "blog"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/2"
      }
    },
    {
      "id": "c404a14e53684978",
      "url": "https://devpleno.com/parceiros",
      "title": "Parceiros e Amigos - DevPleno",
      "content": "## Parceiros e Amigos\n\nEmpresas que acreditam no nosso trabalho e oferecem benefícios exclusivos para a comunidade DevPleno.\n\n[Contabilidade Conta49 Contabilidade A minha contabilidade especializada para profissionais de tecnologia e SaaS. Abertur](https://www.conta49.com.br)\n\n[Cloud DigitalOcean Infraestrutura cloud simples e escalável para desenvolvedores. Servidores, bancos de dados e Kubernet](https://m.do.co/c/90c6221fd51a)\n\n[Câmbio TechFX Plataforma de câmbio para recebimentos do exterior. Ideal para quem precisa receber da gringa. Taxa de 0,1](https://www.techfx.com.br/tulio-faria/)\n\n[Câmbio Payoneer Plataforma de câmbio e recebimentos do exterior. Possui cartão de débito em dólar. Receba USD 250,00* ao](https://discover.payoneer.com/partner/conta49)\n\n[Cloud Hostinger Hospedagem e VPS no Brasil. Use o cupom: DEVPLENO para 10% de desconto. Visitar Parceiro](https://www.hostg.xyz/SHEDX)\n\n[Câmbio Husky Plataforma de câmbio e recebimentos do exterior. Isenção de taxa (TAXA ZERO) no seu primeiro recebimento. V](https://app.husky.io/onboarding?ref=tuliovitormachadofaria)",
      "description": "Empresas parceiras que oferecem descontos e benefícios exclusivos para a comunidade DevPleno.",
      "keywords": [
        "para",
        "https",
        "mbio",
        "contabilidade",
        "conta49",
        "cloud",
        "plataforma",
        "recebimentos",
        "exterior",
        "taxa"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/parceiros"
      }
    },
    {
      "id": "c461dd692765e7be",
      "url": "https://devpleno.com/precificacao-de-softwares-voce-sabe-como-fazer",
      "title": "Precificação de softwares: você sabe como fazer? - DevPleno (Part 5)",
      "content": "Para convencer um cliente, é preciso utilizar a racionalização em cima dos recursos necessários, mesmo que subjetivos. Aliás, isso é um dos fatores que diferenciam um produto convencional de um software.\n\nO primeiro demanda insumos mais concretos, físicos, enquanto que o segundo necessita de conhecimentos e insumos intangíveis, que exigem muito tempo de experiência e estudo para serem adquiridos.\n\nPor fim, lembre-se de ser correto na definição de seus preços, alertando seus clientes caso o custo de um software fique alto demais e o pr",
      "description": "Um dos desafios de quem trabalha na área de tecnologia, especificamente em desenvolvimento de programas, é a precificação de softwares. Por envolver ativos...",
      "keywords": [
        "para",
        "como",
        "software",
        "valor",
        "mais",
        "ncia",
        "hora",
        "tamb",
        "seus",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/precificacao-de-softwares-voce-sabe-como-fazer"
      }
    },
    {
      "id": "c4900a2ef9efa7cd",
      "url": "https://devpleno.com/blog/animacao-basica-css3/index",
      "title": "Animação basica em CSS3 (Part 2)",
      "content": "Como grande parte dos navegadores suporta CSS3 atualmente, conseguimos fazer tudo com ele, pelo menos para alguns tipos de aplicativos. Tudo isso utilizando apenas o transition, sem precisar utilizar Jquery. Confira os detalhes no vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/9jB1oDP5NmA\" allowfullscreen></iframe>\n</div>\n\nNão perca nenhuma atualização. Cadastre seu e-mail, curta o [DevPleno no Facebook](https://www.facebook.com) e [inscreva-se no canal](https://goo.gl/VBU2PR). Deixe suas dúvidas e sugestões nos comentários.",
      "keywords": [
        "hello",
        "class",
        "script",
        "node",
        "para",
        "anima",
        "apenas",
        "grey",
        "transition",
        "active"
      ],
      "metadata": {
        "title": "Animação basica em CSS3",
        "date": "2017-05-22",
        "tags": "['Fundamentos', 'Javascript']",
        "thumbnail": "CSS3-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/animacao-basica-css3/index.md"
      }
    },
    {
      "id": "c492b164e06db9fd",
      "url": "https://devpleno.com/blog/o-que-e-o-app-use-no-nodejsexpressjs/index",
      "title": "O que é o app.use no NodeJS/ExpressJS? (Part 2)",
      "content": "Já quando executamos qualquer outra url diferente de /, o terceiro middleware é executado. E como ele não tem next(), ele não deixa nada abaixo dele ser executado. Ou seja, neste exemplo, ele está ocultando a última rota.\n\n**Aplicando um middleware a um conjunto de URLs específicas**\n\nVeja o seguinte exemplo:\n\n```jsx\nconst express = require('express')\nconst app = express()\n\napp.use(function (req, res, next) {\n  console.log('middleware 1')\n  next()\n})\napp.use(function (req, res, next) {\n  console.log('middleware 2')\n  next()\n})\napp.get('/', function (req, res) {\n  console.log('requisição')\n  res.send('Requisição!')\n})\n\napp.use('/admin', function (req, res, next) {\n  console.log('checar se tem permissao')\n  next()\n})\napp.get('/admin', function (req, res) {\n  console.log('requisição admin')\n  res.send('Requisição admin!')\n})\napp.get('/admin/teste', function (req, res) {\n  console.log('requisição admin')\n  res.send('Requisição admin!')\n})\n\napp.use(function (req, res, next) {\n  res.send('nada encontrado')\n})\napp.get('/url', function (req, res) {\n  console.log('requisição')\n  res.send('Requisição!')\n})\n\napp.listen(3001, function () {\n  console.log('Example app listening on port 3000!')\n})\n```\n\nRepare que adicionamos um middleware passando uma URL base. Nestes casos, apenas se a URL iniciar, no exemplo, por /admin, o middleware será executado. Isso também é muito útil para autenticação e autorização.\n\n## Veja este material em vídeo\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-d2DLqOHOGM\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "description": "Entenda o que é o app.use no Express.js, como funciona o sistema de middlewares e como usá-lo para organizar sua aplicação Node.js.",
      "keywords": [
        "function",
        "requisi",
        "next",
        "console",
        "middleware",
        "express",
        "send",
        "admin",
        "const",
        "este"
      ],
      "metadata": {
        "title": "O que é o app.use no NodeJS/ExpressJS?",
        "description": "Entenda o que é o app.use no Express.js, como funciona o sistema de middlewares e como usá-lo para organizar sua aplicação Node.js.",
        "date": "2016-12-28",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Nodejs.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/o-que-e-o-app-use-no-nodejsexpressjs/index.md"
      }
    },
    {
      "id": "c4e4304a351a7b54",
      "url": "https://devpleno.com/fsmrelampago-email",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-email to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fsmrelampago",
        "email"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsmrelampago-email"
      }
    },
    {
      "id": "c4eda7ade79e599f",
      "url": "https://devpleno.com/blog/navigator-geolocation/index",
      "title": "Navigator Geolocation API - Sabendo a localização do usuário (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/WrzA8oqcxjA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "geolocation",
        "position",
        "navigator",
        "function",
        "console",
        "checar",
        "podemos",
        "error",
        "essa",
        "watcher"
      ],
      "metadata": {
        "title": "Navigator Geolocation API - Sabendo a localização do usuário",
        "date": "2017-10-05",
        "tags": "['Javascript']",
        "thumbnail": "Navigator.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/navigator-geolocation/index.md"
      }
    },
    {
      "id": "c4f16ff9ed8f2216",
      "url": "https://devpleno.com/blog/4-novos-metodos/index",
      "title": "4 novos Métodos Strings que você precisa conhecer (Part 1)",
      "content": "Quatro novas funções foram adicionadas às Strings no ES6 e são bastante interessantes para usarmos no dia a dia. Veja só:\n\n# startsWith\n\nNela temos uma string qualquer e fazemos o seguinte:\n\n```javascript\nconsole.log('Tulio Faria'.startsWith('Tulio'))\n```\n\nSerá que Tulio Faria começa com a palavra Tulio? Se sim, é retornado true. Lembrando que ele é case sensitive, então se tiver a palavra 'tulio' dentro do startsWith, seria retornado um false. Ainda não é possível fazer isso sem o case sensitive.\n\nPodemos também definir a partir de qual parte ele comece a considerar, por exemplo:\n\n```javascript\nconsole.log('Tulio Faria'.startsWith('ulio', 1))\n```\n\nAssim ele começa a considerar a partir da primeira letra.\n\n# endsWith\n\nEle que faz basicamente a mesma coisa que o Starts, mas pega o final, por exemplo:\n\n```javascript\nconsole.log('Tulio Faria'.endsWith('ria'))\n```\n\nLembrando que no endsWith também conseguimos escolher a partir de qual parte considerar:\n\n```javascript\nconsole.log('Tulio Faria'.endsWith('ulio', 5))\n```\n\nConsideramos o parâmetro onde irá parar a string.\n\n# Includes\n\nSupondo que eu quero saber se no meu nome inclui 'Machado':\n\n```javascript\nconsole.log('Tulio Machado Faria'.includes('Machado'))\n```\n\nEle verifica se a string está incluída.\n\n# Repeat\n\nCom ela podemos repetir a string quantas vezes quisermos:\n\n```javascript\nconsole.log('01'.repeat(10))\n```\n\nPodemos paddings de strings, pegar essa string e colocar na frente de outra, por exemplo, que funciona normalmente.\n\nConsiderando as três primeiras, se quisermos de forma insensitiva, temos algumas alternativas como passar todas para maiúsculas, todas para minúsculas ou por expressão regular.\n\n## Confira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/CuR966gt1CU\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "tulio",
        "javascript",
        "console",
        "faria",
        "string",
        "para",
        "startswith",
        "endswith",
        "podemos",
        "partir"
      ],
      "metadata": {
        "title": "4 novos Métodos Strings que você precisa conhecer",
        "date": "2017-05-30",
        "tags": "['Javascript']",
        "thumbnail": "STRING-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/4-novos-metodos/index.md"
      }
    },
    {
      "id": "c51dd4d8482ab0e6",
      "url": "https://devpleno.com/viverdesoftware",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /viverdesoftware to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "viverdesoftware"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/viverdesoftware"
      }
    },
    {
      "id": "c52a87a0c0ed647d",
      "url": "https://devpleno.com/dica-injecao-de-dependencia-no-reactjs",
      "title": "Dica: Injeção de Dependência no ReactJS - DevPleno",
      "content": "Javascript\n\n## Dica: Injeção de Dependência no ReactJS\n\nT\nPor Tulio Faria • 4 de abril de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[ReactJS](/tag/reactjs)\n\nInjeção de dependência ajuda muito na testabilidade do código e de certa forma em aumentar a legibilidade do código. Veja como podemos implementar Injeção de dependências no ReactJS\n\nVeja mais sobre injeção de dependências em [https://www.devpleno.com/injecao-de-dependencia/](https://www.devpleno.com/injecao-de-dependencia/) Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Inje%C3%A7%C3%A3o%20de%20Depend%C3%AAncia%20no%20ReactJS&url=https%3A%2F%2Fdevpleno.com%2Fdica-injecao-de-dependencia-no-reactjs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-injecao-de-dependencia-no-reactjs)",
      "description": "Injeção de dependência ajuda muito na testabilidade do código e de certa forma em aumentar a legibilidade do código. Veja como podemos implementar Injeção ...",
      "keywords": [
        "https",
        "reactjs",
        "inje",
        "depend",
        "devpleno",
        "injecao",
        "dependencia",
        "javascript",
        "dica",
        "ncia"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-injecao-de-dependencia-no-reactjs"
      }
    },
    {
      "id": "c5375c6d35a1684c",
      "url": "https://devpleno.com/patternite",
      "title": "Entenda o que é Patternite - DevPleno (Part 1)",
      "content": "Javascript\n\n## Entenda o que é Patternite\n\nT\nPor Tulio Faria • 10 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje eu gostaria de falar sobre um item que é bastante impeditivo quando as pessoas que já tem experiência tentam vir para o JavaScript. Eu chamava isso de Patternite, isso nada mais é que a vontade de aplicar Pattern em todos os lugares.\n\nO que é um Pattern ou Design Pattern?\n\nEle é um padrão de projeto. Todo mundo que vem de outras linguagens, provavelmente já com alguns padrões de projeto na mente, como por exemplo Singleton, MVC, Factory, etc, eu sugiro que antes de começar a classificar classes entender o que está acontecendo no código e aí sim aplicar um design pattern muito melhor.\n\nEu vou fazer um exemplo na prática para ficar mais simples. Primeiramente vou instalar o EJS que é uma engine de template baseada em JavaScript. Além disso, vou instalar o Express, que é um micro-framework:\n\nyarn add ejs express\nAgora vou criar um arquivo novo chamado index.js e dentro dele farei o seguinte:\n\nconst express = require('express')\nconst app = express()\napp.get('/', (req, res) => {\nres.send('olá poo2js')\n})\napp.listen(3000, (err) => console.log(err, 'server'))\nO detalhe que quero realçar aqui é que não criei nem um controller, nenhum view nem nada no sentido. A vantagem disso é que eu tive meu primeiro small win.\n\nQuando formos aprender uma linguagem nova acho que essa é a parte mais importante para aprender cada vez mais. Agora a segunda small win é a seguinte, é muito ruim construir o código dessa forma então se fizermos o seguinte:\n\nconst express = require('express')\nconst app = express()\napp.set('view engine', 'ejs')\napp.get('/', (req, res) => {\nres.render('home')\n})\napp.listen(3000, (err) => console.log(err, 'server'))\nDessa forma conseguimos utilizar templates e não precisamos criar a resposta falando o conteúdo. Ao rodar, perceba que não conseguimos ver o home dentro do diretório views.",
      "description": "Hoje eu gostaria de falar sobre um item que é bastante impeditivo quando as pessoas que já tem experiência tentam vir para o JavaScript. Eu chamava isso de...",
      "keywords": [
        "express",
        "const",
        "para",
        "https",
        "javascript",
        "mais",
        "criar",
        "dentro",
        "require",
        "pattern"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/patternite"
      }
    },
    {
      "id": "c543e7dfa8d667e8",
      "url": "https://devpleno.com/blog/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira/index",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira (Part 2)",
      "content": "- **Vista roupas diferentes daquelas que, normalmente, você veste em casa**. Passar o dia de pijama, para muitas pessoas, pode ser um convite à procrastinação. Com roupas adequadas, você estará dizendo a si mesmo que é hora do trabalho, mensagem que sua própria mente saberá identificar.\n- **Estabeleça um horário fixo para desenvolver seu trabalho.** Isso contribui para que você organize melhor seu dia e não comprometa seu tempo com outros compromissos que podem ser adiados, como um médico no meio do dia que pode ser remarcado para o fim da tarde. Dessa maneira, você estará zelando pelas suas entregas e não perderá prazos.\n- **Destine um ambiente de sua casa para chamar de escritório**. Não se trata de um alto investimento em um ambiente bem decorado e tudo mais que envolva um escritório bem equipado. Longe disso! Um pequeno espaço que reúna os recursos de que você precisa já é suficiente. Assim, é mais fácil você manter a organização, a privacidade e o silêncio para trabalhar.\n\nPara um freelancer no exterior, seguir essa cartilha é ainda mais aconselhável. Isso se deve ao fato de demorarmos um pouco mais para incorporar uma rotina quando estamos longe de casa.\n\nNesse caso, não menospreze a necessidade de impor disciplina à realização das tarefas que você deve desenvolver ao longo do dia.\n\n## 3. Conheça detalhes operacionais do trabalho de freelancer no exterior\n\nTrabalhar como freelancer fora do país requer uma série de cuidados que, muitas vezes, não precisaríamos ter no Brasil. Entre essas precauções, a principal delas talvez seja emitir nota fiscal referente aos serviços prestados.\n\nNo Brasil, essa não é uma preocupação recorrente entre profissionais que aderem a esse regime de trabalho, tampouco configura uma necessidade para grande maioria dos trabalhos.\n\nNo entanto, no exterior, a depender do país, é muito importante habilitar-se para emitir nota fiscal. Muitos freelancers fora do país perdem trabalhos importantes por não se organizarem nesse sentido.",
      "keywords": [
        "para",
        "trabalho",
        "freelancer",
        "exterior",
        "pode",
        "mais",
        "isso",
        "como",
        "brasil",
        "pessoas"
      ],
      "metadata": {
        "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira",
        "date": "2017-07-03",
        "tags": "['Carreira']",
        "thumbnail": "101429-freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira/index.md"
      }
    },
    {
      "id": "c54eafedd51def13",
      "url": "https://devpleno.com/blog/servir-arquivos-e-expor-servidor/index",
      "title": "Como servir arquivos e expor servidor local com HTTPS (Part 2)",
      "content": "Outra vantagem é quando você for testar Webhook. Vamos supor que você vá integrar com um gateway de pagamento, eles geralmente oferecem o Webhook, caso aconteça alguma coisa no pagamento, ele faz uma requisição em seu servidor falando que algo aconteceu. Uma das coisas que a nossa empresa faz bastante é definir a URL do ngrok com uma URL do Webhook, então mandamos para o pagseguro e quando houver uma alteração no status do pagamento, mandamos uma requisição e meu sistema, rodando na minha máquina, consegue receber sem eu precisar fazer configuração nenhuma de roteador porque o ngrok está fazendo o túnel dessa aplicação.\n\nUma coisa interessante: quando abrimos a interface no prompt, perceba que existe um web interface. Se abrirmos esse endereço, temos acesso a esse painel:\n\n![Exemplo 3](ArquivosEx3.png)\n\nNele são mostradas todas as requisições que foram feitas naquele endereço, o código em summary,os headers que foram enviados e por aí vai.\n\nQuando formos refazer este teste com o Webhook, é possível reproduzi-lo apenas apertando em Replay. Já que o Webhook acontece uma vez só, por exemplo em uma transação de teste que eu fiz, chegou no ngrok e foi passado para a aplicação, vamos supor que você cometeu um erro na aplicação e ela não processou, podemos vir aqui e mandar dar um replay, assim ele vai fazer a requisição para o servidor de testes e você vai conseguir recriar o teste.\n\nConfira a dica em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/n_hWce2qxN4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "https",
        "endere",
        "ngrok",
        "servidor",
        "como",
        "vamos",
        "http",
        "exemplo",
        "webhook"
      ],
      "metadata": {
        "title": "Como servir arquivos e expor servidor local com HTTPS",
        "date": "2017-06-26",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "ServirArquivos.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/servir-arquivos-e-expor-servidor/index.md"
      }
    },
    {
      "id": "c55a97471b378e74",
      "url": "https://devpleno.com/blog/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste/index",
      "title": "Promise Constante - como criar situações assíncronas de teste (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "promise",
        "readdir",
        "path",
        "const",
        "resolve",
        "testar",
        "list",
        "para",
        "embed",
        "quero"
      ],
      "metadata": {
        "title": "Promise Constante - como criar situações assíncronas de teste",
        "date": "2017-10-03",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "PromiseConstante.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste/index.md"
      }
    },
    {
      "id": "c571b3b19c0e2c5c",
      "url": "https://devpleno.com/carreira-preco-que-tem-que-ser-pago",
      "title": "Carreira: Preço que tem que ser pago - DevPleno",
      "content": "Carreira\n\n## Carreira: Preço que tem que ser pago\n\nT\nPor Tulio Faria • 2 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nNeste vídeo, faço uma análise de como aprendemos novas skills. Confira!\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\nConfira o vídeo:\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Carreira%3A%20Pre%C3%A7o%20que%20tem%20que%20ser%20pago&url=https%3A%2F%2Fdevpleno.com%2Fcarreira-preco-que-tem-que-ser-pago) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcarreira-preco-que-tem-que-ser-pago)",
      "description": "Neste vídeo, faço uma análise de como aprendemos novas skills. Confira! Deixe suas dúvidas e sugestões nos comentários. Curta o DevPleno no Facebook, inscr...",
      "keywords": [
        "https",
        "carreira",
        "pago",
        "confira",
        "devpleno",
        "facebook",
        "20que",
        "2fdevpleno",
        "2fcarreira",
        "preco"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/carreira-preco-que-tem-que-ser-pago"
      }
    },
    {
      "id": "c63e902e63c8ba80",
      "url": "https://devpleno.com/blog/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose/index",
      "title": "Mongoose: corrigindo \"Cannot overwrite ''Model'' model once compiled\" (Part 2)",
      "content": "E os 2 controllers, que simulam a utilização deste model:\n\n```jsx\nvar User = require('./user')\n// restante do código do controller\n\nvar Post = require('./User')\n// restante do código do controller\n```\n\nBom, analisando o erro novamente, podemos notar que por algum motivo ao executar o código, o módulo onde está o model está sendo instanciado mais de uma vez. E isso acarreta em setar o schema duas vezes, gerando assim este erro.\n\nSe analisarmos como está sendo dado o require em cada controller, vamos notar que um deles está como user e no outro User. No Windows, se tentarmos abrir um arquivo User.js ou user.js, ambos irão apontar para o mesmo local (que foi o que aconteceu aqui).\n\nPorém, o nodejs gerencia os módulos em si de maneira case-sensitive. Então se fizermos: require('./User') e require('./user'), o nodejs vai tentar registrar 2x. O que duplica o registro do schema User no mongoose.\n\nNo Linux/Mac isso não aconteceria, pois bem antes de esse erro \"pipocar\", o node já iria gritar dizendo que o módulo User.js não existe. E ficaria bem mais simples de encontrar o erro.\n\n## Outros efeitos colaterais deste problema:\n\nSe por algum motivo, tivéssemos um trecho de código que não possuísse a restrição do mongoose+schema (de não poder ser registrado mais de uma vez). Este código seria executado 2x no Windows (pois o node registraria 2x o módulo).\n\nIsso poderia gerar um bug/efeito colateral que aconteceria somente no Windows. E o código quebraria quando fosse colocado em produção no Linux. O ideal então é manter um padrão, e chamar no require da mesma forma que o arquivo foi salvo. Evitando assim, muita dor de cabeça.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "module",
        "mongoose",
        "user",
        "require",
        "windows",
        "model",
        "devpleno",
        "erro",
        "problem",
        "digo"
      ],
      "metadata": {
        "title": "Mongoose: corrigindo \"Cannot overwrite ''Model'' model once compiled\"",
        "date": "2016-10-03",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "nodejs-mongoose-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose/index.md"
      }
    },
    {
      "id": "c66e4eecebff1554",
      "url": "https://devpleno.com/obesidade-mental",
      "title": "Você sofre de Obesidade Mental? - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Voc%C3%AA%20sofre%20de%20Obesidade%20Mental%3F&url=https%3A%2F%2Fdevpleno.com%2Fobesidade-mental) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fobesidade-mental)",
      "description": "Hoje quero contar para você o que aconteceu comigo há mais ou menos 1 ano / 1 ano e meio, até mesmo antes de começar o DevPleno. Eu comecei a perceber que ...",
      "keywords": [
        "para",
        "https",
        "mais",
        "carreira",
        "mental",
        "devpleno",
        "queria",
        "come",
        "comecei",
        "pouco"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/obesidade-mental"
      }
    },
    {
      "id": "c68807a19e363374",
      "url": "https://devpleno.com/politica-de-privacidade",
      "title": "Política de Privacidade - DevPleno (Part 2)",
      "content": "Em adição também utilizamos publicidade de terceiros no nosso website para suportar os custos de manutenção. Alguns destes publicitários, poderão utilizar tecnologias como os cookies e/ou web beacons quando publicitam no nosso website, o que fará com que esses publicitários (como o Google através do Google AdSense) também recebam a sua informação pessoal, como o endereço IP, o seu ISP, o seu browser, etc. Esta função é geralmente utilizada para geotargeting (mostrar publicidade de Lisboa apenas aos leitores oriundos de Lisboa por ex.) ou apresentar publicidade direcionada a um tipo de utilizador (como mostrar publicidade de restaurante a um utilizador que visita sites de culinária regularmente, por ex.).\n\nVocê detém o poder de desligar os seus cookies, nas opções do seu browser, ou efetuando alterações nas ferramentas de programas Anti-Virus, como o Norton Internet Security. No entanto, isso poderá alterar a forma como interage com o nosso website, ou outros websites. Isso poderá afetar ou não permitir que faça logins em programas, sites ou fóruns da nossa e de outras redes.\n\nLigações a Sites de terceiros\n\nO **DevPleno** possui ligações para outros sites, os quais, a nosso ver, podem conter informações / ferramentas úteis para os nossos visitantes. A nossa política de privacidade não é aplicada a sites de terceiros, pelo que, caso visite outro site a partir do nosso deverá ler a política de privacidade do mesmo.\n\nNão nos responsabilizamos pela política de privacidade ou conteúdo presente nesses mesmos sites.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Pol%C3%ADtica%20de%20Privacidade&url=https%3A%2F%2Fdevpleno.com%2Fpolitica-de-privacidade) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpolitica-de-privacidade)",
      "description": "Esta Política de Privacidade foi formulada com o intuito de manter a privacidade e a segurança das informações coletadas de nossos clientes e usuários. Pol...",
      "keywords": [
        "como",
        "privacidade",
        "nosso",
        "informa",
        "para",
        "tica",
        "devpleno",
        "website",
        "sites",
        "outros"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/politica-de-privacidade"
      }
    },
    {
      "id": "c69495e7d943dc2b",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-1/index",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto (Part 1)",
      "content": "Essa é a primeira parte do nosso minicurso de Socket.IO. Nesta etapa, vamos começar o projeto e criar as primeiras páginas para dar o suporte à aplicação.\n\nA primeira coisa que temos que fazer é garantir que o express generator está instalado.\n\n```jsx\nnpm install -g express-generator\n```\n\nEsse express generator instala um gerador de aplicações em expressJS que é o que vamos utilizar. Escrevendo **express -h** ele mostra o nosso help, com isso consigo criar um projeto do zero já falando as especificidades que eu quero para ele. Por exemplo, vamos fazer o seguinte:\n\n```jsx\nexpress placar-online --ejs\n```\n\nEntão colocamos o express, o nome do diretório que queremos e --ejs porque queremos utilizá-lo como engine para template. Nos arquivos de apoio ([https://www.devpleno.com/minicurso-socket-io-parte-1/](https://www.devpleno.com/minicurso-socket-io-parte-1/)) já estão em EJS, mas nada te impede usar o --pug ou --handlesbar por exemplo.\n\nInstalamos depois o yarn:\n\n```jsx\nyarn\n```\n\nAo dar enter, ele já cria todos nossos arquivos, agora precisamos entrar no diretório do placar-online e damos um start no yarn:\n\n```jsx\nyarn start\n```\n\nPara acessarmos a aplicação, entramos em **localhost:3000**. Nela temos nossa aplicação.\n\nVamos abrir esse diretório no Visual Code, perceba que o express generator já criou uma pasta bin, code_modules, publc, routes e uma pasta views. Dentro desse views, teremos nossos templates, no routes teremos nossas rotas e em public nossa pasta pública, ou seja, o que conseguimos acessar publicamente nesse servidor.\n\nPara começar, vamos deletar da pasta **public** os diretórios **images, javascript e stylesheets** e, na pasta **routes,** deletar o arquivo **users.js**. Lembrando que estamos deletando apenas o que não precisamos.\n\nAgora vamos abrir o **app.js** e remover o users, já que apagamos o diretório:\n\n```jsx\nvar users = require('./routes/users')\napp.use('./users', users)\n```",
      "keywords": [
        "vamos",
        "para",
        "match",
        "matches",
        "dentro",
        "views",
        "express",
        "index",
        "temos",
        "pasta"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 6,
        "sourcePath": "blog/minicurso-socket-io-parte-1/index.md"
      }
    },
    {
      "id": "c6af6f7622fc2681",
      "url": "https://devpleno.com/autenticacao-e-autorizacao",
      "title": "Autenticação e Autorização - Entenda os termos - DevPleno (Part 1)",
      "content": "Fundamentos\n\n## Autenticação e Autorização - Entenda os termos\n\nT\nPor Tulio Faria • 6 de junho de 2017\n\n[Fundamentos](/tag/fundamentos)\n\nDois termos estão muito relacionados quando estamos desenvolvendo um sistema para Web ou Mobile: AUTENTICAÇÃO e AUTORIZAÇÃO.\n\nVamos pensar o seguinte: temos uma empresa na qual você precisa apresentar um crachá na portaria para conseguir entrar. O crachá prova que você é quem você diz ser. Esse processo de confirmação é o que chamamos de autenticação.\n\nNo momento em que o segurança te deixa passar ou não, baseado na sua função ou algo nesse sentido, ele vai te dar a autorização, que é o segundo passo.\n\nGeralmente o que fazemos em um sistema é identificar o usuário, com usuário e senha e a partir disso verificamos se pode ou não fazer.\n\nQuando pensamos em um sistema digital, temos algumas formas de nos identificarmos. No mundo offline, temos o CPF, o RG, a CNH, etc. No mundo digital, temos algumas outras formas, que podem ser dividas em três categorias:\n\n– Algo que sabemos: Usuário e senha.\n\n– Algo que temos: Token, posse de um celular.\n\n– Algo que somos: Biometria.\n\nTemos um número cada vez maior de autenticação e podemos misturar as categorias, como token e usuário e senha, que chamamos de Autenticação de dois fatores.\n\nA autorização é um pouco mais complexa, afinal uma vez que o usuário provou que é realmente ele, vamos ter que ir no banco do sistema para saber se esse usuário é mesmo ele e qual é o tipo de acesso ele tem.\n\nQuando for montar um sistema, pense em qual tipo de autenticação o público-alvo está acostumado a utilizar para se identificar, e só depois disso pense na autorização.\n\nPense um pouco sobre esses dois termos, vamos voltar a falar mais das formas de autenticação posteriormente. Por enquanto esse conceito básico é o suficiente.",
      "description": "Dois termos estão muito relacionados quando estamos desenvolvendo um sistema para Web ou Mobile: AUTENTICAÇÃO e AUTORIZAÇÃO. Vamos pensar o seguinte: temos...",
      "keywords": [
        "autentica",
        "temos",
        "https",
        "autoriza",
        "sistema",
        "para",
        "algo",
        "fundamentos",
        "termos",
        "dois"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/autenticacao-e-autorizacao"
      }
    },
    {
      "id": "c71de6f4d6baf908",
      "url": "https://devpleno.com/entenda-sobre-cors-cross-origin-resource-sharing",
      "title": "Entenda sobre CORS - Cross Origin Resource Sharing - DevPleno (Part 1)",
      "content": "Fundamentos\n\n## Entenda sobre CORS - Cross Origin Resource Sharing\n\nT\nPor Tulio Faria • 6 de setembro de 2017\n\n[Fundamentos](/tag/fundamentos)\n\nHoje vou falar sobre um assunto que é bastante interessante: CORS (ou Cross Origin Resourse Sharing).\n\nO que isso quer dizer?\n\nÉ como dois servidores ou dois domínios diferentes poderiam compartilhar um recurso. Imagine o seguinte: nós temos o site do DevPleno e o tuliofaria.net, se eu fizer uma requisição no DevPleno, especificamente utilizando o AJAX, que tenta fazer uma requisição de dados do tuliofaria.net, o servidor do tuliofaria.net corre um risco de ter uma forma de exploração.\n\nImagine o site dos Correios, se tivéssemos que fazer isso direto com o CEP, as pessoas não sairiam do site delas e faríamos as requisições todas do site dos Correios, isso sobrecarregaria o site, além de ser uma falha de segurança porque podemos fazer algo nesse script para fazer um exploid e mandar para outro servidor. Um exemplo disso é onde você coloca o nome em uma aplicação, é possível colocar um script ali que quando o administrador for listar todos os nomes, tenha um script injetado que mande os dados para outro servidor. Por esse motivo não é possível fazer requisições para outro domínio a não ser que esse domínio permita isso.\n\nAlgumas operações falamos que são ‘pre-fligth’, isso quer dizer que antes dela executar é mandado uma requisição chamada ‘option’, nisso ele pergunta algo como “nesse CEP, quais são as opções que eu tenho nesse servidor?” e o servidor vai responder essas opções, como um GET, POST ou ditar o domínio. Caso ele responder qual o domínio, o próprio navegador não vai fazer a outra requisição, por exemplo, caso tenhamos feito um post para salvar algum dado no tuliofaria.net, o próprio navegador manda um Options, checa esse retorno e aí sim faz o post se ele puder.",
      "description": "Hoje vou falar sobre um assunto que é bastante interessante: CORS (ou Cross Origin Resourse Sharing). O que isso quer dizer? É como dois servidores ou dois...",
      "keywords": [
        "cors",
        "servidor",
        "para",
        "esse",
        "isso",
        "requisi",
        "fazer",
        "https",
        "sharing",
        "site"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/entenda-sobre-cors-cross-origin-resource-sharing"
      }
    },
    {
      "id": "c7a33d2c27052aa1",
      "url": "https://devpleno.com/teclado-com-webaudioapi",
      "title": "Criando um teclado com WebAudioAPI - DevPleno (Part 2)",
      "content": "&#x3C;html>\n&#x3C;body>\n&#x3C;script>\nconst notes = { 'C3': 130.81,\n'C#3': 138.59,\n'D3': 146.83,\n'D#3': 155.56,\n'E3': 164.81,\n'F3': 174.61,\n'F#3': 185.00,\n'G3': 196.00,\n'G#3': 207.65,\n'A3': 220.00,\n'A#3': 233.08,\n'B3': 246.94,\n'C4': 261.63,\n'C#4': 277.18,\n'D4': 293.66,\n'D#4': 311.13,\n'E4': 329.63,\n'F4': 349.23,\n'F#4': 369.99,\n'G4': 392.00,\n'G#4': 415.30,\n'A4': 440.00,\n'A#4': 466.16,\n'B4': 493.88,\n'C5': 523.25,\n'C#5': 554.37,\n'D5': 587.33,\n'D#5': 622.25,\n'E5': 659.25,\n'F5': 698.46,\n'F#5': 739.99,\n'G5': 783.99,\n'G#5': 830.61,\n'A5': 880.00,\n'A#5': 932.33,\n'B5': 987.77\n}\nconst map = {\n65 = 'C3',\n83 = 'D3',\n68 = 'E3',\n70 = 'F3',\n71 = 'G3',\n72 = 'A3',\n74 = 'B3'\n}\nconst context = new (window.AudioContext || window.webkitAudioContext)()\nfunction onKeyDown(key){\nif(key.keyCode in map){\nconst osc = constext.createOscillator()\nosc.type = 'sine'\nosc.frequency.value = notes[map[key.keyCode]]\nosc.connect(contexto.destination)\nosc.start()\nosc.stop(contexto.currentTime+2)\n}\n}\nfunction onKeyUp(key){\nconsole.log(key)\n}\nwindow.onkeydown = onKeyDown\nwindow.onkeyup = onKeyUp\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nDessa maneira fica mais interessante, pois conseguimos recapear caso quisermos. Além disso, posso guardar uma lista de osciladores para dar um stop. Dessa maneira, quando apertarmos a tecla, ele se inicia, e quando eu solto, ele para:",
      "description": "Hoje quero continuar falando sobre WebAudioAPI. Vamos um pouco além do que já fizemos anteriormente. No nosso arquivo HTML, teremos dois scripts com função...",
      "keywords": [
        "keycode",
        "para",
        "https",
        "onkeydown",
        "onkeyup",
        "const",
        "function",
        "window",
        "maposc",
        "webaudioapi"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/teclado-com-webaudioapi"
      }
    },
    {
      "id": "c7d749850816a6ca",
      "url": "https://devpleno.com/blog/high-order-functions/index",
      "title": "High-order Functions (Part 1)",
      "content": "A dica de hoje é sobre High-order Functions, que são funções que recebem ou retornam funções. Nós temos alguns tipos diferentes, como por exemplo vetor, map e forEach, elas são high-order functions porque podemos passar um método que ele vai iterar dando o console.log.\n\n```jsx\nconst vetor = [1, 2, 3]\n\nvetor.forEach((item) => console.log(item))\n```\n\nPerceba que estamos passando uma função para essa outra função que é uma high-order function, a função que passamos para ela chamamos de firt order function. Com ela conseguimos construir nossas próprias funções high-order. Por exemplo, caso queiramos fazer uma função mathOperator, que pega dois termos e retorna os números, e uma função que faz a operação que eu quero:\n\n```jsx\nfunction mathOrder(num1, num2, op) {\n  return op(num1, num2)\n}\n\nconsole.log(mathOperator(1, 2, (num1, num2) => num1 + num2))\n```\n\nEntão eu quis que essa high-order function chame o num1 e num2 e retorne a soma das duas.\n\nNão necessariamente as high-order functions precisam ser puras, a única regra que temos é que ela recebe ou retorna uma função. No exemplo que fizemos, o op naquele momento é uma função. É importante lembrar que em JavaScript funções podem ser colocadas dentro de variáveis, por isso é possível criar high-order functions, uma coisa que não é tão simples de se fazer em Java por exemplo.\n\nLembrando que eu utilizei arrow function para facilitar mas eu poderia também fazer a operação:\n\n```jsx\nfunction mathOrder(num1, num2, op) {\n  return op(num1, num2)\n}\nfunction operadorMult(num1, num2) {\n  return (\n    num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1\\ *\n    num2\n  )\n}\nconsole.log(mathOperator(1, 2, (num1, num2) => num1 + num2))\nconsole.log(mathOperator(1, 2, operadorMult))\n```",
      "keywords": [
        "num2",
        "num1",
        "order",
        "high",
        "function",
        "para",
        "functions",
        "console",
        "exemplo",
        "mathoperator"
      ],
      "metadata": {
        "title": "High-order Functions",
        "date": "2017-04-07",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "HighrOrder.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/high-order-functions/index.md"
      }
    },
    {
      "id": "c822550fd1d378ea",
      "url": "https://devpleno.com/blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index",
      "title": "Por que fazer um curso de programação voltado para a prática? (Part 2)",
      "content": "São muitas as razões para se [profissionalizar em TI](https://www.devpleno.com/integridade?utm_source=blog&utm_campaign=rc_blogpost) não é mesmo? Vamos mostrar no artigo de hoje a importância de escolher um curso que valorize a prática. Isso leva o profissional a apresentar resultados com maior rapidez ao ser contratado ou mesmo o favorece em processos de seleção, especialmente nas entrevistas! Preparado? Então vamos lá!\n\n## Para conhecer as tecnologias usadas pelas empresas\n\nQuando uma empresa contrata ou um desenvolvedor, seja para um emprego fixo, seja para um [freela](https://www.devpleno.com/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira?utm_source=blog&utm_campaign=rc_blogpost), exige-se, fundamentalmente, conhecimentos e habilidades específicas das tecnologias relacionadas ao projeto ou que são mais usadas na empresa. Geralmente, é necessário que tenha capacidade de trabalhar com múltiplas tecnologias, especialmente em projetos para web.\n\nEntre as competências que se pode exigir de um desenvolvedor para que entre um projeto, normalmente podemos encontrar:\n\n### Para desenvolvimento de front-end:\n\n- conhecimento em html5, css3 e javascprit;\n\n- conhecimentos em algum framework para trabalhar com as linguagens acima, como [ReactJs](https://www.devpleno.com/renderizar-estruturas-em-formato-de-arvore?utm_source=blog&utm_campaign=rc_blogpost), AngularJs, CanJs, jQuery, Bootstrap etc.\n\n- pelo menos um conhecimento básico de sistemas para tratamento de imagens e criação de vetores.\n\n### Já para o desenvolvimento de back-end:\n\n- conhecimento aprofundado em pelo menos uma linguagens de back-end, como NodeJS, Java, Python, PHP, C# etc;\n\n- em relação à linguagem que será trabalhada, é importante ter pelo menos um Framework , como Spring, Django, Laravel, ExpressJS;\n\n- bancos de dados SQL e NoSql;\n\n- sistemas operacionais.",
      "keywords": [
        "para",
        "como",
        "https",
        "projeto",
        "mais",
        "desenvolvimento",
        "devpleno",
        "source",
        "blog",
        "campaign"
      ],
      "metadata": {
        "title": "Por que fazer um curso de programação voltado para a prática?",
        "date": "2017-07-31",
        "tags": "['Carreira']",
        "thumbnail": "CursoProgramacao.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index.md"
      }
    },
    {
      "id": "c85bd9cb31e00b35",
      "url": "https://devpleno.com/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples",
      "title": "Json-server - Como criar uma REST API para testes de forma simples - DevPleno (Part 2)",
      "content": "Use bastante, é uma ótima forma para poder ilustrar que está havendo uma comunicação com o servidor, e ele também é muito flexível, já vem com os métodos do HTTP implementados, então se quisermos excluir, podemos também. Não dá para usar em produção, seria muito inseguro, mas é possível para prototiparmos uma interface ou quem sabe um aplicativo móvel.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Json-server%20-%20Como%20criar%20uma%20REST%20API%20para%20testes%20de%20forma%20simples&url=https%3A%2F%2Fdevpleno.com%2Fjson-server-como-criar-uma-rest-api-para-testes-de-forma-simples) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fjson-server-como-criar-uma-rest-api-para-testes-de-forma-simples)",
      "description": "Neste handson onde vou mostrar uma ferramenta que é bastante interessante no dia a dia, o Jsonserver. Primeiro vamos instalar: O que ele faz? Muitas vezes ...",
      "keywords": [
        "para",
        "json",
        "https",
        "server",
        "criar",
        "como",
        "forma",
        "podemos",
        "produtos",
        "rest"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples"
      }
    },
    {
      "id": "c88a88592d89578f",
      "url": "https://devpleno.com/4-novos-metodos",
      "title": "4 novos Métodos Strings que você precisa conhecer - DevPleno (Part 1)",
      "content": "Javascript\n\n## 4 novos Métodos Strings que você precisa conhecer\n\nT\nPor Tulio Faria • 30 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nQuatro novas funções foram adicionadas às Strings no ES6 e são bastante interessantes para usarmos no dia a dia. Veja só:\n\n## startsWith\n\nNela temos uma string qualquer e fazemos o seguinte:\n\nconsole.log('Tulio Faria'.startsWith('Tulio'))\nSerá que Tulio Faria começa com a palavra Tulio? Se sim, é retornado true. Lembrando que ele é case sensitive, então se tiver a palavra ‘tulio’ dentro do startsWith, seria retornado um false. Ainda não é possível fazer isso sem o case sensitive.\n\nPodemos também definir a partir de qual parte ele comece a considerar, por exemplo:\n\nconsole.log('Tulio Faria'.startsWith('ulio', 1))\nAssim ele começa a considerar a partir da primeira letra.\n\n## endsWith\n\nEle que faz basicamente a mesma coisa que o Starts, mas pega o final, por exemplo:\n\nconsole.log('Tulio Faria'.endsWith('ria'))\nLembrando que no endsWith também conseguimos escolher a partir de qual parte considerar:\n\nconsole.log('Tulio Faria'.endsWith('ulio', 5))\nConsideramos o parâmetro onde irá parar a string.\n\n## Includes\n\nSupondo que eu quero saber se no meu nome inclui ‘Machado’:\n\nconsole.log('Tulio Machado Faria'.includes('Machado'))\nEle verifica se a string está incluída.\n\n## Repeat\n\nCom ela podemos repetir a string quantas vezes quisermos:\n\nconsole.log('01'.repeat(10))\nPodemos paddings de strings, pegar essa string e colocar na frente de outra, por exemplo, que funciona normalmente.\n\nConsiderando as três primeiras, se quisermos de forma insensitiva, temos algumas alternativas como passar todas para maiúsculas, todas para minúsculas ou por expressão regular.\n\n## Confira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?",
      "description": "Quatro novas funções foram adicionadas às Strings no ES6 e são bastante interessantes para usarmos no dia a dia. Veja só:  startsWith Nela temos uma string...",
      "keywords": [
        "tulio",
        "faria",
        "console",
        "https",
        "string",
        "para",
        "startswith",
        "endswith",
        "javascript",
        "novos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/4-novos-metodos"
      }
    },
    {
      "id": "c89baf5274acbd25",
      "url": "https://devpleno.com/blog/beatbox-manipulavel-com-js/index",
      "title": "Construindo um Beatbox Manipulável com JS (Part 2)",
      "content": "O objetivo é que o usuário possa escolher quando quer que cada item toque, por exemplo, com o bumbo batendo em um ritmo e o prato nos intervalos. ![aa](c97fc2c7-ec01-49c4-9be8-b96d40b8395b.png) Para que isso aconteça, cada tick da música tem que checar se naquela linha aquele áudio está marcado.\n\n```jsx\n<script>\n  //gera o check-box\n  const numItems = 10\n  function generationTrack(trackId){\n    const track = document.getElementById('track'+trackId)\n\n    for (let i=0; i<10; i++){\n      track.innerHTML += '<input type=\"checkbox id=\"i-'+trackId+'-'+i+'\" />'\n    }\n  }\n  generateTrack(1)\n  generateTrack(2)\n  generateTrack(2)\n  //fim gerar check-box\n\n  const bpm = 90\n  let current = 0\n  function tick(){\n    const currentItem = current++ % numItems\n\n    console.log(currentItem)\n  }\n\n  setInterval(tick, (60*1000)/bpm)\n</script>\n```\n\nNote que ele está caminhando entre os itens, mas temos que andar entre os tracks e pegar os que vão ser tocados. Para isso vamos implementar o script criando um for com i iniciado em 1 e i menor ou igual a 3, então podemos checar se aquele item em especifico está marcado. Quando for true, daremos play, e por último 'startar' quando apertarmos no play:\n\n```jsx\n<script>\n  const bpm = 90\n  let current = 0\n  let isPlaying = false\n  let timer = null\n  function tick(){\n    const currentItem = current++ % numItems\n    for(let i=1; i<=3; i++){\n      const item = document.getElementById('i-'+i+'-'+currentItem)\n      const track = document.getElementById('track' +i)\n      if (item.checked){\n        const audio = document.getElementById(track.attributes.rel.value)\n        audio.currentTime = 0\n        audio.play()\n      }\n    }\n  }\n  const play = document.getElementById('play')\n  play.addEventListener('click', function(){\n    if (isPlaying){\n      clearInterval(timer)\n      play.innerHTML = 'Play'\n    } else {\n      timer = setInterval(tick, (60*1000)/bpm)\n      play.innerHTML = 'Stop'\n    }\n\n    isPlaying = !isPlaying\n  }\n</script>\n```",
      "keywords": [
        "play",
        "audio",
        "const",
        "prato",
        "track",
        "script",
        "checkbox",
        "https",
        "para",
        "trackid"
      ],
      "metadata": {
        "title": "Construindo um Beatbox Manipulável com JS",
        "date": "2017-05-29",
        "tags": "['Javascript']",
        "thumbnail": "BEATBOX-COM-JS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/beatbox-manipulavel-com-js/index.md"
      }
    },
    {
      "id": "c8abea17ac7004f8",
      "url": "https://devpleno.com/blog/algoritmos-xoe-swap/index",
      "title": "Algoritmos: XOR Swap (Part 2)",
      "content": "E Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "amos",
        "vari",
        "fazer",
        "mesmo",
        "agora",
        "essa",
        "colocar",
        "resultado",
        "nosso",
        "embed"
      ],
      "metadata": {
        "title": "Algoritmos: XOR Swap",
        "date": "2017-08-04",
        "tags": "['Algoritmos']",
        "thumbnail": "XOR-SWAP-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/algoritmos-xoe-swap/index.md"
      }
    },
    {
      "id": "c8b57568b61007df",
      "url": "https://devpleno.com/react-16-o-pacificador",
      "title": "React 16 - o Pacificador - DevPleno (Part 1)",
      "content": "Javascript\n\n## React 16 - o Pacificador\n\nT\nPor Tulio Faria • 2 de outubro de 2017\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nHoje quero trazer as boas novas do mundo React, era algo que já esperava e esperava que fosse acontecer. Muito se discutiu, nos últimos tempos, sobre a licença, que era um pouco restritiva e muitas empresas estavam saindo do ecossistema por esse motivo.\n\nNo dia 25 de setembro de 2017, na versão 15.6.2, já foi mudada essa licença para algo mais permissiva, saindo dessa BSD + patentes para MIT, assim ela fica aberta.\n\nA nova versão do React, a versão 16 também já está nessa licença, isso ficou bastante interessante.\n\nQuero comentar algumas coisas também referente ao React que são coisas que me motivaram aos meus estudos serem focados em React e não em Angular, por exemplo.\n\nAlgumas coisas novas, como por exemplo, ele pode retornar um vetor de JSX, uma string, deu uma melhor forma de lidar com erros, mas o que eu queria comentar é que, além da troca da licença, o tamanho foi reduzido. Isso era algo que atrapalhava bastante quando você gerava um bundle. Se não tivesse utilizando uma forma de quebrar esse bundle, ficava muito pesado.\n\nOutra mudança que achei bastante interessante foi que a característica do React foi reescrita todo o core do zero utilizando o projeto Fiber.\n\nAlém disso, eles não mexeram nas API’s, então é possível atualizar o React sem quebrar muita coisa, algo que aconteceu, por exemplo, com o Angular.\n\nEu considero essa versão do React a versão das “pazes” porque a comunidade estava um pouco desanimada.\n\nDeixe suas dúvidas e sugestões nos comentários.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje quero trazer as boas novas do mundo React, era algo que já esperava e esperava que fosse acontecer. Muito se discutiu, nos últimos tempos, sobre a lic...",
      "keywords": [
        "react",
        "https",
        "vers",
        "algo",
        "licen",
        "javascript",
        "pacificador",
        "para",
        "bastante",
        "coisas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/react-16-o-pacificador"
      }
    },
    {
      "id": "c91051630ae9675d",
      "url": "https://devpleno.com/claude-code-describe-session",
      "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos - DevPleno (Part 3)",
      "content": "Você pode simplesmente pedir em linguagem natural para o Claude descrever a sessão atual. Use instruções claras sobre para quem é a descrição (outro agente, outro projeto, outro modelo) para obter o melhor resultado.\n\n### Funciona com outros modelos além do Claude?\n\nSim. Como o output é texto estruturado, você pode usar a descrição gerada como prompt para qualquer outro modelo ou ferramenta de IA.\n\n### Qual a diferença entre describe session e os arquivos CLAUDE.md?\n\nOs arquivos CLAUDE.md são instruções persistentes que você escreve manualmente para dar contexto ao Claude em todas as sessões de um projeto. O describe session é uma descrição gerada sob demanda do estado atual de uma sessão específica — útil para passagens pontuais de contexto.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20Usar%20o%20Describe%20Session%20do%20Claude%20Code%20para%20Conectar%20Projetos&url=https%3A%2F%2Fdevpleno.com%2Fclaude-code-describe-session) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fclaude-code-describe-session)",
      "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
      "keywords": [
        "claude",
        "para",
        "sess",
        "como",
        "session",
        "describe",
        "contexto",
        "code",
        "outro",
        "projeto"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/claude-code-describe-session"
      }
    },
    {
      "id": "c92272bf49cfcfc8",
      "url": "https://devpleno.com/guiatrabalhoremoto",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /guiatrabalhoremoto to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "guiatrabalhoremoto"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/guiatrabalhoremoto"
      }
    },
    {
      "id": "c9334e8be63678d4",
      "url": "https://devpleno.com/fsmrelampago-ytorg",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-ytorg to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fsmrelampago",
        "ytorg"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsmrelampago-ytorg"
      }
    },
    {
      "id": "c95c42c0e7142212",
      "url": "https://devpleno.com/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao",
      "title": "As vantagens do Javascript em todas as camadas de uma aplicação - DevPleno (Part 3)",
      "content": "Com isso, o processo de desenvolvimento é mais rápido e o código completo fica mais integrado e padronizado, pois apenas JavaScript é utilizado, ainda que o EJS emita o resultado em HTML.\n\nE por fim, o MongoDB é uma ferramenta de banco de dados que armazena tudo em arquivos JSON-like. Ele é um banco de dados gratuito e open-source que pode ser utilizado em conjunto com todas as demais ferramentas já citadas para que a aplicação utilize JavaScript de ponta a ponta.\n\n## Quais são as vantagens de usar JavaScript em todas as camadas?\n\nO JavaScript já foi ridicularizado por ser uma linguagem simples demais e limitadora do potencial de um programador. Ainda hoje, muitos devs ainda torcem o nariz para ela, mas a verdade é que, desde o seu lançamento oficial em 1996 até os dias de hoje, o JavaScript evoluiu muito e não foi à toa que se tornou a linguagem mais popular do mundo, desbancando Java, C#, PHP, Phyton e outras.\n\nEntre as vantagens de utilização dessa linguagem em todas as camadas de uma aplicação, a mais clara é a padronização: com tudo sendo escrito em JavaScript, a uniformidade da linguagem é maior e o trabalho é mais compreensivo para quem está envolvido no projeto, seja um dev front-end, back-end ou full stack.\n\nE se um programador compreende bem os fundamentos da linguagem, ele será capaz de escrever também em todas as camadas, reduzindo gargalos em que o desenvolvimento para porque metade do time espera o pessoal do back-end terminar algo, por exemplo.\n\nSe uma equipe for boa em JavaScript, já é um passo dado para que todos sejam, de certa forma, full stack, ou seja, capazes de trabalhar nas duas camadas da aplicação. E um time full stack é mais versátil, ágil e compreende melhor o produto como um todo.\n\nOutra vantagem bem significativa é a possibilidade de reaproveitamento do código. Reutilizar trechos de código que já foram feitos é uma forma de reduzir a carga de trabalho dos desenvolvedores e acelerar o término do projeto.",
      "description": "As muitas vantagens de usar JavaScript fizeram com que ela se tornasse a linguagem de programação mais popular do mundo. Extremamente versátil, o JavaScrip...",
      "keywords": [
        "javascript",
        "para",
        "aplica",
        "camadas",
        "linguagem",
        "mais",
        "todas",
        "node",
        "back",
        "https"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao"
      }
    },
    {
      "id": "c96d939494cb0f16",
      "url": "https://devpleno.com/request-promise",
      "title": "Hands-on: Request-promise - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on: Request-promise\n\nT\nPor Tulio Faria • 17 de agosto de 2017\n\n[Javascript](/tag/javascript)\n\nEste hands-on vai ser complementar a outro módulo que eu já mostrei por aqui, o Request. O módulo de hoje é o Request-Promise, que é basicamente o Resquest ‘Promisificado’, então ele retorna uma Promise e assim fica muito mais fácil de fazer tratamentos de várias requisições HTTP, porque podemos utilizar, por exemplo, tanto o Generator com o Wild ou dentro do Async/await, que é uma maneira mais moderna de se fazer.\n\nEntão vamos colocar a mão na massa. Primeiro vou instalar as duas dependências que precisamos. Uma coisa importante: o Request promise depende do Request, então temos que adicionar os dois:\n\nyarn request\n\nyarn request promise\nEm seguida, basta simplesmente importar ele. A assinatura é exatamente a mesma do Request, então eu posso simplesmente trocar para o Request-Promise:\n\nconst request = require('request-promise')\nrequest('https://httpbin.org/ip').then((res) => console.log(res))\nEntão a versão com promise eu não tenho um callback, e sim um then com catch para tratar. Ao rodar, perceba que ele vai bater no servidor e retornar o IP.\n\nOutra vantagem que temos é que podemos fazer o seguinte:\n\nconst pegarIp = async () => {\nconst ip = await request('https://httpbin.org/ip')\nconsole.log(ip)\n}\npegarIp()\nPerceba que o código ficou muito mais simples, conseguimos fazer a mesma operação, porém trocando a Promise por Async/await. Outra coisa que poderíamos fazer é pegar esse IP e enviar de volta:\n\nconst pegarIp = async () => {\nconst ip = await request('https://httpbin.org/ip')\nconst ipPost = await request({\nmethod: 'POST',\njson: ip,\nuri: 'https://httpbin.org/post'\n})\nconsole.log(ipPost)\n}\npegarIp()\nEle já vai mostrar o data como o IP que eu recebi.",
      "description": "Este handson vai ser complementar a outro módulo que eu já mostrei por aqui, o Request. O módulo de hoje é o RequestPromise, que é basicamente o Resquest ",
      "keywords": [
        "request",
        "promise",
        "https",
        "await",
        "fazer",
        "async",
        "const",
        "podemos",
        "httpbin",
        "pegarip"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/request-promise"
      }
    },
    {
      "id": "c9d79b6023864b8f",
      "url": "https://devpleno.com/blog/javascript-streams-p-3-duplex/index",
      "title": "Javascript: Streams (P-3: Duplex)",
      "content": "Nesta terceira parte da série sobre Streams, falo sobre o Streams Duplex, que permite tanto o envio quanto o recebimento de dados.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/kYoVIIqEFZQ\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "sobre",
        "streams",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Javascript: Streams (P-3: Duplex)",
        "date": "2017-04-28",
        "tags": "['Javascript']",
        "thumbnail": "JSStreamPart3.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/javascript-streams-p-3-duplex/index.md"
      }
    },
    {
      "id": "c9ff1b284d926c48",
      "url": "https://devpleno.com/lista-definitiva-de-sites-para-progradores-remotos",
      "title": "Lista de sites para trabalhar remotamente como programador em 2022 - DevPleno (Part 1)",
      "content": "Carreira\n\n## Lista de sites para trabalhar remotamente como programador em 2022\n\nT\nPor Tulio Faria • 5 de setembro de 2021\n\n[Carreira](/tag/carreira)\n\nSe tem uma profissão que já se beneficiava dos benefícios de trabalhar remotamente bem antes de virar moda é a de programador. Eu mesmo atuo neste modelo a bastante tempo.\n\nA pergunta que mais recebo é: quais os melhores sites para trabalhar remotamente como programador?\n\nNeste artigo vamos explorar um pouco desta lista. Os links terão uma indicação de quando são de referência meus (fazendo o cadastro por estes links você também pode ganhar alguns benefícios).\n\n## Toptal\n\nUma das empresas mais famosas para trabalhar como programador é a Toptal (Toptal é a junção de Top talent). Um ponto bastante importante é que a Toptal tem 2 formas de trabalho: você pode trabalhar no Core Team (ou seja, na Toptal em si) ou fazer parte do Network da Toptal (trabalhar para clientes da Toptal). E sim, é no Network que a Toptal é reconhecida por ter um processo seletivo bastante exigente - onde apenas 3% dos aplicantes conseguem passar, e também, é a forma que eu tenho relacionamento com eles.\n\nNo Network da Toptal, após passar pelo processo seletivo, você poderá ser alocado em clientes (que também passam por um processo seletivo). A Toptal cuidará de tudo que é burocrático (inclusive pagamento) e você somente tem que trabalhar/programar.\n\nA forma de trabalho pode variar entre: horista (ou por hora), part-time (meio-período - 4 horas por dia) ou full-time (período integral - 8 horas por dia).\n\n[Entre aqui para fazer seu cadastro na Toptal!](https://www.toptal.com/qaVGKx/worlds-top-talent). Algumas especialidades (React e React-native são uma delas) dão bônus de USD 2500 para ambos, para mim e para você que se cadastrou.\n\n## Scalable Path",
      "description": "Se tem uma profissão que já se beneficiava dos benefícios de trabalhar remotamente bem antes de virar moda é a de programador. Eu mesmo atuo neste modelo a...",
      "keywords": [
        "para",
        "https",
        "toptal",
        "bastante",
        "trabalhar",
        "como",
        "vagas",
        "linkedin",
        "crossover",
        "jobs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/lista-definitiva-de-sites-para-progradores-remotos"
      }
    },
    {
      "id": "ca0dd7013b0d8faa",
      "url": "https://devpleno.com/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira",
      "title": "8 dicas de organização para freelancers se darem bem na carreira - DevPleno (Part 3)",
      "content": "Pelo contrário: o mais indicado é que você organize um ambiente específico para o serviço. Essa simples ação evitará a dispersão, o que contribuirá com o seu rendimento. E, é claro, maior [produtividade](https://www.devpleno.com/como-ser-muito-mais-produtivo?utm_source=blog&#x26;utm_campaign=rc_blogpost) é garantia de maior remuneração.\n\nPara não ter erro, separe um espaço do seu lar e transforme em uma mini-escritório, que precisará apenas de uma mesinha adequada, uma cadeira e os devidos objetos de trabalho.\n\n## 5. Honre os prazos\n\nNão são raros os casos em que os freelancers assumem vários compromissos com clientes distintos e acabam não honrando os prazos. É o tal de tentar abraçar todo o mundo com apenas dois braços.\n\nO resultado disso, como se pode imaginar, é a entrega de um serviço de baixa qualidade e fora do prazo combinado. Essa característica deixa os clientes insatisfeitos (com toda razão, né?), afetando assim sua reputação no mercado.\n\nPortanto, uma das mais importantes dicas de organização é priorizar sempre a excelência e não a quantidade. Além do mais, em hipótese alguma faça promessas que não poderá cumprir. Como já dizia o ditado: “O combinado não sai caro”.\n\n## 6. Defina prioridades\n\nO freelancer deve tornar o relógio o seu principal amigo. Claro que, às vezes, vai surgir um enorme desespero originado da sensação de que não vai dar tempo de concluir todas as tarefas pretendidas. Contudo, isso somente acontece porque o profissional não conseguiu ainda se adequar à nova realidade.\n\nEle, nesse aspecto, precisa entender que o tempo não é seu inimigo. Entretanto, somente é possível chegar a essa mentalidade quando o freelancer começar a criar uma lista de prioridades.",
      "description": "Nada melhor do que ter uma rotina flexível, com a possibilidade de trabalhar nos seus próprios horários, não é mesmo? Não à toa, ser freelancer é uma alter...",
      "keywords": [
        "para",
        "mais",
        "como",
        "https",
        "carreira",
        "freelancer",
        "pode",
        "freelancers",
        "dicas",
        "afinal"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira"
      }
    },
    {
      "id": "ca1eff50c7b87cda",
      "url": "https://devpleno.com/pegadinha-de-entrevistas-de-javascript",
      "title": "Pegadinha #1 de entrevistas em JavaScript - DevPleno (Part 1)",
      "content": "Javascript\n\n## Pegadinha #1 de entrevistas em JavaScript\n\nT\nPor Tulio Faria • 7 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje quero comentar uma questão muito comum em entrevistas de JavaScript.\n\nQual é a saída desse código?\n\nconst arr = ['a', 'b', 'c', 'd']\nfor (var i = 0; i &#x3C; arr.length; i++) {\nsetTimeOut(() => {\nconsole.log(i, arr[i])\n}, 0)\n}\nconsole.log('out', i)\nDetalhe que estamos utilizando um setTimeOut com um zero, mas poderia ser qualquer valor.\n\nO primeiro detalhe é que percebemos que o out saiu primeiro com o número 4. O ‘var’ foi definido dentro do for, porém eu consegui dar um console log lá é baixo. Podemos chegar a conclusão que ele não respeitou o escopo. Outro ponto importante é que ele aconteceu antes do restante, isso acontece porque sempre que utilizamos o setTimeOut, ele leva essa execução da arrow function para dentro do event loop.\n\nComo o i já está com 4, ele não é um número válido, pois nosso array inicia-se em zero e termina em 3. Por esse motivo virá o seguinte:\n\nout 4\n\n4 undefined\n4 undefined\n4 undefined\n4 undefined\nComo arrumamos essa função?\n\nTemos algumas formas de arrumar isso. Existe uma bem simples e algumas que podemos brincar um pouco mais.\n\nA primeira bem simples é trocar o var por let:\n\nfor (let i=0; i&#x3C;arr.length; i++){\nsetTimeOut(() => {\nconsole.log(i, arr[i])\n},0)\n\nAgora funcionou perfeitamente:\n\n0 'a'\n1 'b'\n2 'c'\n3 'd'\n\nPor que essa diferença?\n\nQuando estamos com o var, seria equivalente a quando ele estiver executando o código ele puxa todos os vars pra cima, isso é conhecido como hoisting.\n\nPor esse motivo, sempre que possível, utilize let e const.\n\nOutra maneira seria transformar em setTimeOut em uma maneira que eu consiga injetar as variáveis dentro dele mesmo, como uma self invoked:\n\nsetTimeOut(\n(function (ii) {\nreturn () => {\nconsole.log(ii, arr[ii])\n}\n})(i),\n0\n)\nIremos executar a função e a partir da function o ii vai estar válido. Assim funcionará também do jeito que esperávamos.",
      "description": "Hoje quero comentar uma questão muito comum em entrevistas de JavaScript. Qual é a saída desse código? Detalhe que estamos utilizando um setTimeOut com um ...",
      "keywords": [
        "javascript",
        "settimeout",
        "https",
        "console",
        "entrevistas",
        "como",
        "undefined",
        "dentro",
        "isso",
        "essa"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/pegadinha-de-entrevistas-de-javascript"
      }
    },
    {
      "id": "ca2b4f567b970188",
      "url": "https://devpleno.com/vagas-de-emprego-no-brasil-e-no-exterior",
      "title": "Descrição das vagas de emprego no Brasil x no exterior - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Descri%C3%A7%C3%A3o%20das%20vagas%20de%20emprego%20no%20Brasil%20x%20no%20exterior&url=https%3A%2F%2Fdevpleno.com%2Fvagas-de-emprego-no-brasil-e-no-exterior) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fvagas-de-emprego-no-brasil-e-no-exterior)",
      "description": "Hoje quero comentar um email que recebi e achei bastante relevante falar sobre, principalmente quando estamos olhando para o mercado de desenvolvedor web. ...",
      "keywords": [
        "para",
        "https",
        "brasil",
        "exterior",
        "carreira",
        "descri",
        "vagas",
        "emprego",
        "mail",
        "pessoas"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/vagas-de-emprego-no-brasil-e-no-exterior"
      }
    },
    {
      "id": "ca38b0cced43b565",
      "url": "https://devpleno.com/blog/como-esta-seu-ingles-carreira/index",
      "title": "Como está seu inglês?",
      "content": "Na carreira de um DevPleno que lida com tecnologia o dia todo é muito importante saber se comunicar em inglês. Veja algumas dicas de como melhorar seu inglês técnico e do cotidiano.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/IhP90Dk962I\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "devpleno",
        "responsive",
        "https",
        "youtube",
        "ingl",
        "classname",
        "iframe",
        "facebook",
        "carreira"
      ],
      "metadata": {
        "title": "Como está seu inglês?",
        "date": "2016-08-02",
        "tags": "['Carreira']",
        "thumbnail": "Miniatura-vídeo-carreira-INGLÊS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/como-esta-seu-ingles-carreira/index.md"
      }
    },
    {
      "id": "cab093ac87fd215b",
      "url": "https://devpleno.com/blog/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar/index",
      "title": "A habilidade mais importante que um programador deveria ter (e praticar) (Part 1)",
      "content": "É muito comum na área de programação todos pensarem que a habilidade mais importante esteja relacionada ao pensamento lógico e a capacidade de resolver problemas. E não que estas habilidades não sejam importantes, mas existe uma habilidade que potencializa o resultados delas: **perguntar**.\n\nSim, exatamente. Perguntar é uma habilidade importantíssima. E antes que você ache isso muito estranho, vamos entender melhor.\n\nO ato de perguntar é relacionado inclusive ao processo científico. Você já deve ter ouvido algo como \"o que move o mundo são as perguntas e não as respostas\". Perguntar destrava caminhos alternativos. Perguntar te leva a caminhos que talvez nem havia pensado sobre.\n\n![Imagine este cenário](processo-perguntas.png 'O processo de perguntar')\n\nNeste cenário hipotético da imagem anterior, o seu processo te leva a um `resultado 1`. E questionamentos e perguntas podem gerar no mínimo 3 novas opções de cenários:\n\n- Um resultado pior (neste caso, o resultado 2)\n- Nenhum resultado\n- Um resultado melhor (neste caso, o resultado 3)\n\n# Qual seria a vantagem de explorar o resultado com mais perguntas?\n\nO grande ganho deste tipo de pensamento e processo é a exploração de potenciais resultados melhores, re-afirmar o resultado obtido como um resultado bom e ainda aumentar a possibilidade argumentativa dos motivos por qual processo ter sido melhor.\n\n# Mas como saberei qual resultado seria o melhor?\n\nNeste caso, para todo problema que você esteja buscando uma solução é importante ter em mente quais critérios essa solução deverá ser mensurada. Ainda usando o cenário anterior, o resultado 3, poderia ser melhor sobre um critério que não era o seu objetivo inicial, e inclusive ter sido descartado.\n\nTrazendo para algo mais próximo do cotidiano de programação: você pode chegar em um resultado em que a performance é muito boa, porém a manutenção fica mais complexa.",
      "keywords": [
        "perguntas",
        "resultado",
        "para",
        "rios",
        "perguntar",
        "processo",
        "como",
        "solu",
        "muito",
        "crit"
      ],
      "metadata": {
        "title": "A habilidade mais importante que um programador deveria ter (e praticar)",
        "date": "2021-05-13",
        "tags": "['Carreira']",
        "thumbnail": "perguntas-thumb.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar/index.md"
      }
    },
    {
      "id": "cb367c691ab40ca8",
      "url": "https://devpleno.com/minicurso-socket-io-parte-5",
      "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar - DevPleno (Part 1)",
      "content": "Javascript\n\n## Minicurso Socketio - Parte 05 - Colocando o projeto no ar\n\nT\nPor Tulio Faria • 11 de julho de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nChegamos à última etapa do nosso Minicurso de Socket.IO. Nessa aula, nós vamos colocar o projeto no ar para que você possa utilizá-lo como um projeto de portfólio e também mostrar as atualizações em tempo real para um potencial cliente. Além disso, eu vou mostrar como a gente pode deixar ele mais resiliente a falhas, como podemos gerar auto scalling, como aumentar a disponibilidade desse projeto. Além disso, vamos falar sobre outras melhorias que são muito importantes quando colocadas em produção.\n\nA primeira coisa é que vamos colocar o projeto para rodar no digital ocean, se você ainda não colocou nada no ar, ele é a melhor experiência para fazer isso porque ele é bastante simples e também barato, custa em torno de 5 dólares por mês por uma máquina que tem 512mb de ram, então se você for rodar um site de portfólio já é o suficiente.\n\nEu já estou logado na minha conta, nela já tenho o cartão de crédito atrelado então já consigo criar um droplet aqui sem nenhum problema, eu aconselho a entrar em digitalocean.com e colocar os seus dados bancários também porque eles vão pedir.\n\nVou dar um create Droplet. Uma coisa que é muito legal do digital ocean é que podemos começar uma máquina do zero, instalar o node e etc, ou ir em One-click apps e escolher uma máquina já preparada para isso, ali já tem o Node em uma versão boa, que é a 6.10.3 e no Ubunto 16.04. Então eu vou clicar em NodeJS 6.10.3:\n\nE no tamanho da máquina eu vou escolher a de 5 colares:\n\nEu já rodei aplicações production read e, em uma máquina de 10 dólares. tivemos 100 conexões simultâneas no Socket.IO, então não é uma escala muito grande, mas já deu para medir bastante e não teve quase nada de uso de memória.",
      "description": "Chegamos à última etapa do nosso Minicurso de Socket.IO. Nessa aula, nós vamos colocar o projeto no ar para que você possa utilizálo como um projeto de por...",
      "keywords": [
        "para",
        "vamos",
        "como",
        "fazer",
        "isso",
        "quina",
        "projeto",
        "agora",
        "temos",
        "https"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/minicurso-socket-io-parte-5"
      }
    },
    {
      "id": "cb43927ec0b41475",
      "url": "https://devpleno.com/fake-api",
      "title": "Fake API - Como testar seus projetos front-end - DevPleno (Part 1)",
      "content": "Javascript\n\n## Fake API - Como testar seus projetos front-end\n\nT\nPor Tulio Faria • 4 de agosto de 2017\n\n[Javascript](/tag/javascript)\n\nHoje eu trago uma dica que eu utilizo bastante com a minha equipe que é quando temos ainda uma fonte de dados para fornecer para um front-end, por exemplo, quando estamos construindo um SPA (geralmente essa aplicação precisa consumir dados) e quando não temos uma API pronta, temos uma possibilidade para trabalhar sem depender do back-end.\n\nNós utilizamos algumas API’s falsas para trazer os dados, porque basicamente se a gente executar uma interface qualquer de um sistema, é possível baixar uma lista de clientes, pedidos etc. Se a aplicação for construída da maneira correta, vai ser só uma questão de trocar a camada que faz esse carregamento para refletir os dados reais da sua aplicação. Esse tipo de coisa é muito bom para acelerar o desenvolvimento e deixar um pouco mais flexível a parte do front-end.\n\nEu vou mostrar dois exemplos: primeiramente temos o Json Place Holder e também temos o SWAP, eu criei um arquivo index apenas para testarmos, a ideia é que ao invés de consultarmos os dados no nosso servidor que ainda não existe ou não está pronto, nós vamos consultar dados desses sites:\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;h1> testing API&#x3C;/h1>\n\n&#x3C;pre id='contents'>&#x3C;/pre>\n\n&#x3C;script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'>&#x3C;/script>\n\n&#x3C;script>\n$(function()\n{$.get('https://jsonplaceholder.typicode.com/posts', function (data) {\n$('#contents').html(JSON.stringfy(data))\n})})\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nCom isso ele já retorna todos os posts. Se olharmos em network, ele já foi lá, bateu no servidor deles e retornou a lista de posts. Eu posso trabalhar essa lista de posts por exemplo:\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;h1> testing API&#x3C;/h1>\n\n&#x3C;div id='contents'>&#x3C;/div>",
      "description": "Hoje eu trago uma dica que eu utilizo bastante com a minha equipe que é quando temos ainda uma fonte de dados para fornecer para um frontend, por exemplo, ...",
      "keywords": [
        "para",
        "https",
        "dados",
        "script",
        "body",
        "contents",
        "temos",
        "html",
        "function",
        "posts"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/fake-api"
      }
    },
    {
      "id": "cb56bbb3987a3510",
      "url": "https://devpleno.com/handsonreact-fb",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /handsonreact-fb to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "handsonreact"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/handsonreact-fb"
      }
    },
    {
      "id": "cb7d21e98ea26d44",
      "url": "https://devpleno.com/immutability-e-immutablejs",
      "title": "Immutability e ImmutableJS - DevPleno",
      "content": "Javascript\n\n## Immutability e ImmutableJS\n\nT\nPor Tulio Faria • 28 de março de 2017\n\n[Javascript](/tag/javascript)\n\nNeste hands-on/dica, falo um pouco da importância da imutabilidade em programação funcional em Javascript. Além disso, apresento o módulo Immutable que nos ajuda a lidar com imutabilidade.\n\nApenas para simplificar:\n\n-\nImutabilidade / Immutability: nome da técnica\n\n-\nImutável / Immutable: nome do módulo e qualidade da variável que não é alterada ao longo do tempo (ex: variável imutável)\n\n## Confira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Immutability%20e%20ImmutableJS&url=https%3A%2F%2Fdevpleno.com%2Fimmutability-e-immutablejs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fimmutability-e-immutablejs)",
      "description": "Neste handson/dica, falo um pouco da importância da imutabilidade em programação funcional em Javascript. Além disso, apresento o módulo Immutable que nos ...",
      "keywords": [
        "https",
        "javascript",
        "immutability",
        "immutablejs",
        "imutabilidade",
        "para",
        "dulo",
        "immutable",
        "nome",
        "imut"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/immutability-e-immutablejs"
      }
    },
    {
      "id": "cb7f4a9a4fdd7155",
      "url": "https://devpleno.com/blog/validade/index",
      "title": "Validade de um projeto/ideia/ação (Part 1)",
      "content": "Na dica de hoje, eu quero mostrar pra você que nem sempre a gente tem que ir até o fim com as coisas, é algo que eu estou passando nesse momento e sempre repenso sobre a minha empresa, sobre as coisas que estamos fazendo e se estamos indo pelo caminho certo.\n\nQuando você cria um projeto novo e está em uma empreitada nova, além do empenho e tudo que você precisa para executar, uma das coisas que a gente esquece de definir é quando parar, qual o prazo de validade do projeto ou do atendimento a um cliente específico.\n\nPor exemplo, coisas que já errei na minha vida: eu já tive empresas que não defini um prazo para acabar. Se ela não conseguiu ter X de faturamento, precisava fechar as portas. Isso é muito importante para que a gente consiga alinhar se estamos indo para um caminho certo ou não.\n\nQuando você for atender um cliente é a mesma coisa, muitas vezes um projeto começa sobre uma perspectiva e, à medida que ele vai evoluindo, você começa a mudar esse rumo. Se você não consegue chegar ao fim e bate na validade do projeto que definiu, pode ser contratual ou uma meta pessoal, principalmente se o resultado é importante para você assim como é para mim e você não está conseguindo entregar resultado, isso é um indício de que a validade com ele acabou.\n\nOutra coisa que pode acontecer quando está atendendo um cliente é ele não ficar lucrativo. Às vezes você está gastando muito mais energia para atender esse cliente do que você está tendo de lucro, então esse projeto que está \"empatando\", é prejuízo. Eu considero que se você está muito próximo de ter uma margem de lucro, às vezes esse lucro não vale a pena e isso é um indício de que você precisa ou renegociar ou simplesmente expirar e não atender mais esse cliente. São pontos muito importantes que temos que definir para nosso negócio ou carreira.",
      "keywords": [
        "para",
        "validade",
        "quando",
        "projeto",
        "cliente",
        "isso",
        "muito",
        "esse",
        "coisas",
        "importante"
      ],
      "metadata": {
        "title": "Validade de um projeto/ideia/ação",
        "date": "2017-09-06",
        "tags": "['Carreira']",
        "thumbnail": "Validade.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/validade/index.md"
      }
    },
    {
      "id": "cbc4398c0eb903f2",
      "url": "https://devpleno.com/blog/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira/index",
      "title": "Como as maratonas de programação da faculdade impactaram a minha carreira (Part 1)",
      "content": "A história do post de hoje já tem mais de 10 anos e faz parte de lembranças que eu tenho de quando ainda estava na faculdade, mais precisamente, de quando participava das maratonas de programação, onde me graduei. E fique comigo até o fim, pois a lição aqui não é só baseada nos prêmios e competição, mas tem total relação a minha aprovação na Toptal.\n\nEsses são prêmios que ganhei participando das competições de programação. Apesar de simbólicos, eles não estão aqui para me gabar ou algo assim, mas claro, eles representam muito para mim e para o meu crescimento profissional e carregam histórias e lembranças da minha evolução como dev.\n\n![Minhas premiações em competição de programação](d4880d63-4e4d-4521-be16-4ff5c668fd69.jpeg)\n\nNa época foi gratificante, por exemplo, em uma competição onde havia alunos de todos os períodos, ter ficado em primeiro lugar mesmo competindo com o pessoal prestes a se formar (que além de mais experiência, já tinham participado das semi-finais nacionais da mesma competição).\n\nNo segundo ano de competição, como eu havia vencido no primeiro ano de faculdade, fui com a mentalidade de “já ganhei”. Bom, e aí vem mais uma lição: aprender que nem sempre vencemos. Sim, no meu segundo, fiquei em segundo lugar.\n\nAinda tinha mais 2 anos de competição, dava para vencer mais 2. Sim, sou muito competitivo e isso não é errado se você não deixar a competitividade passar por cima da sua ética.\n\nVamos para terceira vez competindo e… Caramba! Ficamos em segundo de novo! E a mesma equipe que havia nos desbancado no ano anterior venceu novamente. O que mais me chocava era que eles venceram sempre utilizando Pascal (perdemos realizando tudo em C puro).\n\nAntes de ir para a minha última competição, refleti sobre o que eu tinha feito de diferente no primeiro ano e que não fiz nos outros 2 e também sobre como perdemos.",
      "keywords": [
        "mais",
        "competi",
        "para",
        "como",
        "minha",
        "equipe",
        "muito",
        "isso",
        "programa",
        "pascal"
      ],
      "metadata": {
        "title": "Como as maratonas de programação da faculdade impactaram a minha carreira",
        "date": "2019-03-19",
        "tags": "['Carreira']",
        "thumbnail": "top-tal-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira/index.md"
      }
    },
    {
      "id": "cbfea527e75df85d",
      "url": "https://devpleno.com/sleep-em-generator",
      "title": "Sleep em Generator - DevPleno (Part 2)",
      "content": "co(function* () {\nconsole.log('Step 1')\nyield sleep(1000)\nconsole.log('Step 2')\n})\nCom isso temo um sleep mais próximo que tínhamos por exemplo em C, Pascal ou até o PHP.\n\nConfira os passos em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Sleep%20em%20Generator&url=https%3A%2F%2Fdevpleno.com%2Fsleep-em-generator) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsleep-em-generator)",
      "description": "Hoje quero mostrar como podemos recriar o famoso sleep, que temos em algumas linguagens que não são assíncronas como JAVA e PHP, quando queremos usar dentr...",
      "keywords": [
        "sleep",
        "generator",
        "function",
        "para",
        "https",
        "fazer",
        "utilizar",
        "console",
        "javascript",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/sleep-em-generator"
      }
    },
    {
      "id": "cc409fc24b6cc43e",
      "url": "https://devpleno.com/claude-code-describe-session",
      "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos - DevPleno (Part 2)",
      "content": "- **Peça para o Claude descrever a sessão** pensando em como outro agente usaria essa informação. Algo como: “Describe this session so another Claude session working on the front-end can understand how to integrate with this CMS”*\n\n- **O Claude gera a descrição completa** — endpoints disponíveis, estrutura de dados, autenticação, tudo o que a outra sessão precisa saber\n\n- **Use essa descrição na sessão do front-end** como contexto inicial, colando o output ou referenciando-o\n\nO resultado é que a sessão do front-end recebe um briefing claro e estruturado, sem perda de informação.\n\n## Indo além: passando contexto entre agentes e modelos diferentes\n\nO describe session não se limita a conectar duas sessões do Claude Code. Você pode usar essa mesma técnica para:\n\n- **Passar contexto entre agentes diferentes** — por exemplo, de um agente de código para um agente de revisão\n\n- **Gerar prompts para outros modelos** — pedir para o Claude descrever a sessão em formato de prompt otimizado para outro LLM\n\n- **Criar documentação de handoff** — quando outro desenvolvedor (humano ou IA) vai assumir o trabalho\n\nA ideia central é a mesma: transformar o contexto implícito de uma sessão de trabalho em uma descrição explícita e reutilizável.\n\n## Quer dominar o Claude Code e IA na prática?\n\nSe você quer ir além e aprender a usar o Claude Code como ferramenta principal no seu fluxo de desenvolvimento, temos um curso bônus sobre IA e Claude Code dentro do **The Best Stack**. Lá você aprende na prática como integrar IA no seu dia a dia como dev.\n\n**[Acesse o The Best Stack e comece agora](https://do.devpleno.com/the-best-stack)**\n\n## FAQ\n\n### O describe session funciona entre projetos diferentes?\n\nSim. Você pode usar o describe session em um projeto e levar a descrição gerada para qualquer outro projeto ou sessão. O contexto é gerado como texto, então é portável.\n\n### Preciso usar algum comando específico?",
      "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
      "keywords": [
        "claude",
        "para",
        "sess",
        "como",
        "session",
        "describe",
        "contexto",
        "code",
        "outro",
        "projeto"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/claude-code-describe-session"
      }
    },
    {
      "id": "ccb2eaeae8fba27d",
      "url": "https://devpleno.com/tag/carreira/4",
      "title": "Carreira - Pagina 4 - DevPleno",
      "content": "Carreira\n\n## Arquivo de Insights\n\n93 posts encontrados com a tag Carreira\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 16 de ago. de 2017 3 dicas para começar a empreender na área de software](/empreender-na-area-de-software)\n\n[Carreira 12 de ago. de 2017 Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão!](/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao)\n\n[Carreira 9 de ago. de 2017 Porque se sujar faz bem!](/se-sujar-faz-bem)\n\n[Carreira 9 de ago. de 2017 Você é passageiro ou motorista da sua vida?](/seja-o-motorista-da-sua-vida)\n\n[Carreira 8 de ago. de 2017 Decisão técnica não precisa ser eterna](/decisao-tecnica)\n\n[Carreira 8 de ago. de 2017 Tomar decisões](/tomar-decisoes)\n\n[Carreira 3 de ago. de 2017 DevPleno Entrevista - Carlos Drury e Thiago Coelho](/entrevista-carlos-drury-e-thiago-coelho)\n\n[Carreira 3 de ago. de 2017 DevPleno Entrevista - Edy Segura](/entrevista-com-edy-segura)\n\n[Carreira 1 de ago. de 2017 Ensinar algo a alguém todos os dias](/ensinar-algo)\n\n[Carreira 31 de jul. de 2017 Por que fazer um curso de programação voltado para a prática?](/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica)\n\n[Carreira 26 de jul. de 2017 Mantenha sua Integridade - Dica de carreira DevPleno](/integridade)\n\n[Carreira 24 de jul. de 2017 10 dicas de produtividade para programadores](/10-dicas-de-produtividade-para-programadores)\n\n[Anterior](/tag/carreira/3)4 / 8[Próxima](/tag/carreira/5)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "2017",
        "para",
        "empresa",
        "entrevista",
        "dicas",
        "devpleno",
        "todos",
        "algoritmos",
        "ferramentas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/carreira/4"
      }
    },
    {
      "id": "ccd5d73b8dc8c5b7",
      "url": "https://devpleno.com/blog/ensino-formal-ou-cursos-livres/index",
      "title": "Ensino Formal ou Cursos Livres - Por qual optar? (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/FFfrKB3-NEc\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "ensino",
        "para",
        "cursos",
        "precisa",
        "formal",
        "livres",
        "pouco",
        "embed",
        "curso",
        "tamb"
      ],
      "metadata": {
        "title": "Ensino Formal ou Cursos Livres - Por qual optar?",
        "date": "2017-07-13",
        "tags": "['Carreira']",
        "thumbnail": "ensino-formalou-cursos-livres-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/ensino-formal-ou-cursos-livres/index.md"
      }
    },
    {
      "id": "cce9691a3a8690ec",
      "url": "https://devpleno.com/programacao-assincrona",
      "title": "Programação Assíncrona - NodeJS Primeiros Passos - DevPleno (Part 3)",
      "content": "Se criarmos uma aplicação em node com 100 usuários usando ao mesmo tempo, ele consegue responder os 100 usuários com apenas uma linha de código. Para quem já programou em JAVA sabe que o minimo seriam 100 treads se não tivesse nenhuma otimização. O node é muito baseado em assíncrono, praticamente tudo que vamos fazer é feito de forma assíncrona e a única coisa que você precisa tomar cuidado é de não achar que o console.log de dentro do callback executaria antes do que está fora, as vezes a pessoa fica atentada a querer fazer uma operação atrás da outra mas são várias operações assíncronas, logo não vai funcionar porque vão retornar em tempos diferentes. Existe algumas estruturas que utilizamos para controlar esse fluxo e vamos falar mais a frente.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Programa%C3%A7%C3%A3o%20Ass%C3%ADncrona%20-%20NodeJS%20Primeiros%20Passos&url=https%3A%2F%2Fdevpleno.com%2Fprogramacao-assincrona) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprogramacao-assincrona)",
      "description": "Continuando nossa série sobre NodeJS, falando um pouco sobre como funciona a Programação Assíncrona do JS, vamos fazer alguns testes para você ver a difere...",
      "keywords": [
        "para",
        "como",
        "vamos",
        "fazer",
        "dados",
        "opera",
        "ncrona",
        "ncrono",
        "contents",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/programacao-assincrona"
      }
    },
    {
      "id": "ccf4bb9698695b9c",
      "url": "https://devpleno.com/blog/arvore-binaria/index",
      "title": "Árvore Binária em JavaScript (Part 1)",
      "content": "Continuando o assunto sobre alguns algoritmos que utilizamos em computação em geral, neste port falaremos sobre árvore binária, uma estrutura de dados que me fascina bastante pela versatilidade.\n\nEntão vamos implementar uma árvore, ainda não será uma árvore de busca, e vamos fazer o algoritmo base para navegar nessa árvore porque envolve recursividade. Por definição, a árvore binária tem o nó da esquerda, direita e o valor no elemento:\n\n```js\nlet arvore = {\n  left: undefined,\n  right: undefined,\n  value: 10\n}\n```\n\nA regra de navegação que temos na árvore é baseada em como a gente passa nesses nós. Então vamos criar, por exemplo, uma função que chamamos de pré order. Ela imprime o valor, vai para a esquerda e depois para a direita.\n\n```js\nfunction preOrder(tree) {\n  console.log(tree.value)\n\n  preOrder(tree.left)\n  preOrder(tree.right)\n}\n```\n\nPerceba que passamos a tree recursivamente para o lado esquerdo e em seguida para o direito.\n\n**Por que ele se chama preOrder?**\n\nPorque ele vem primeiro de tudo. Por isso ele é diferente o inOrder e o poOrder que vem no meio e no final da navegação respectivamente. Podemos checar se o 'preOrder(tree.left)' e o 'preOrder(tree.right)' são vazios por exemplo:\n\n```js\nfunction preOrder(tree) {\n  console.log(tree.value)\n\n  tree.left && preOrder(tree.left)\n  tree.right && preOrder(tree.right)\n}\n\nconsole.log('preOrder')\n\npreOrder(arvore)\n```\n\nSe ele é um dos valores que é convertido para verdadeiro, consequentemente, tem algo dentro, então ele vai navegar para o lado esquerdo. Se acontecer o mesmo depois, ele navegará para o lado direito. Ao somar o preOrder e passar a árvore, ele imprime o valor 10.\n\nVamos colocar algum valor do lado esquerdo:\n\n```js\nlet arvore = {\n  left: {\n    left: undefined,\n    right: {\n      value: 3\n    },\n    value: 2\n  },\n  right: undefined,\n  value: 10\n}\n```",
      "keywords": [
        "para",
        "tree",
        "preorder",
        "left",
        "right",
        "inorder",
        "rvore",
        "esquerda",
        "direita",
        "value"
      ],
      "metadata": {
        "title": "Árvore Binária em JavaScript",
        "date": "2017-07-03",
        "tags": "['Algoritmos']",
        "thumbnail": "Arvores.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/arvore-binaria/index.md"
      }
    },
    {
      "id": "cd05996115735df9",
      "url": "https://devpleno.com/blog/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript/index",
      "title": "Verificando o tempo para executar um trecho de código em Javascript (Part 1)",
      "content": "Uma tarefa que venho executando bastante nos últimos dias, principalmente por participar de alguns processos de seleção para projetos é em relação a performance de um trecho de código. Em muitas destas entrevistas, fui questionado sobre a complexidade de minha solução utilizando a notação big-o (sim, aquela que gera algo como O(n) ou O(n²) para uma dada complexidade - iremos falar mais sobre isso em outros posts). Fora do mundo acadêmico (ou destes testes), eu prefiro checar a complexidade através do tempo de execução de um trecho de código. Então, a ideia é a seguinte:\n\n1.  salvamos a data/hora atual\n2.  executamos o trecho de código\n3.  pegamos a data/hora atual e subtraímos o valor encontrado no item 1.\n\nSimples né? Vamos fazer agora em Javascritp:\n\n```jsx\nconst inicio = new Date().getTime()\n// trecho de código que queremos mensurar\nconst total = new Date().getTime() - inicio\nconsole.log('Foi executado em: ', total)\n```\n\nO interessante é que em Javascript já temos uma maneira mais específica de fazer isso. Bastando apenas chamar console.time(\"nome do timer\") no início, e console.endTime(\"nome do timer\") no fim da execução. O código ficaria assim:\n\n```jsx\nconsole.time('TempoLoop')\n// trecho de código a ser medido\nconsole.endTime('TempoLoop')\n```\n\nO tempo de execução será exibido em milisegundos em ambos os casos. Um ponto muito importante quando estamos medindo o tempo de execução de um trecho de código é não executar console.log dentro de laços repetição ou dentro de algorítmo onde ele será executado várias vezes. O node/browser ou até mesmo a saída no console em outras linguagens é muito custosa, e vai atrapalhar seus testes, por deixar de maneira geral seu código rodando mais lentamente. Existem outras formas de fazer isso, com profiling e outras ferramentas. Mas esse será tema para outro post :) Não deixem de comentar e nos seguir em todas as redes sociais, até a próxima!",
      "keywords": [
        "digo",
        "console",
        "trecho",
        "para",
        "execu",
        "complexidade",
        "mais",
        "isso",
        "tempo",
        "fazer"
      ],
      "metadata": {
        "title": "Verificando o tempo para executar um trecho de código em Javascript",
        "date": "2017-02-01",
        "tags": "['Javascript']",
        "thumbnail": "js.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript/index.md"
      }
    },
    {
      "id": "cd3fbf106e774cdb",
      "url": "https://devpleno.com/hands-on-threejs",
      "title": "Hands-on - Three.JS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on - Three.JS\n\nT\nPor Tulio Faria • 16 de novembro de 2017\n\n[Javascript](/tag/javascript)\n\nHoje vamos falar um pouco sobre Three.JS, que é uma biblioteca muito interessante para conseguirmos fazer 3d no browser, melhor dizendo, ele faz essa compatibilidade para renderizar no browser com WebGL ou canvas. Para testar isso, vamos fazer um teste utilizando um cubo em 3d. No site deles, existem vários exemplos que já fizeram utilizando o three.js. Nós podemos baixar ele direto no site threejs.org ou simplesmente pegar um three.js de um CDN. Vamos criar um arquivo HTML. Quem já trabalhou com software 3d sabe que basicamente temos uma cena onde acontece as coisas em 3d :\n\n&#x3C;html>\n&#x3C;body>\n&#x3C;script src='//cdnjs.cloudflare.com/ajax/libs/three.js/88/three.js'>&#x3C;/script>\n&#x3C;script>\nconst scene = new THREE.Scene() const camera = new\nTHREE.PerspectiveCamera(75, window.in nerWidth / window.innerHight, 0.1,\n1000) const renderer = new THREE.WebGLRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocumnet.body.appenChild(renderer.domElement)\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nEsse parâmetro 75 é a profundidade de campo e o window é a proporção da câmera. Com isso, vamos criar uma câmera que tem uma visão cônica, igual a visão de uma câmera normal. Além disso, temos um renderizador que vai ser responsável por transformar isso em algo a ser enxergado. Por fim vamos adicionar ele dentro do body.\n\nAo rodar, temos uma tela preta, que é nossa scene. Agora vamos começar a adicionar alguns objetos:",
      "description": "Hoje vamos falar um pouco sobre Three.JS, que é uma biblioteca muito interessante para conseguirmos fazer 3d no browser, melhor dizendo, ele faz essa compa...",
      "keywords": [
        "three",
        "const",
        "window",
        "script",
        "scene",
        "renderer",
        "body",
        "vamos",
        "isso",
        "https"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/hands-on-threejs"
      }
    },
    {
      "id": "cd55954506ababe1",
      "url": "https://devpleno.com/blog/vantagens-da-injecao-de-depencia/index",
      "title": "Vantagens da Injeção de dependência para a testabilidade do código (Part 1)",
      "content": "Já havia falado por aqui sobre [injeção de dependência](https://www.devpleno.com/injecao-de-dependencia/), disse que muitas vezes não temos acesso ao que estamos testando. Desta vez, falo sobre as vantagens da injeção de dependência na testabilidade do código. Vamos criar um alert que é uma arrow function no qual eu passo um alert e uma mensagem. Lembrando que, nesse caso, o alert é a injeção de dependência, então é ele quem eu estou mandando para essa função chamar.\n\n```jsx\nconst alerts = {\n  alerts: (alert, message) => alert(message)\n}\n\nmodule.exports = alerts\n```\n\nNo exemplo acima, temos um módulo que alerta o usuário. É igual o alert do browser, tanto é que chamamos o alert. Então, qual a diferença? Se eu chamasse realmente o alert do browser, ele não conseguiria rodar este teste no node, então usualmente rodamos os testes sem o browser primeiro e depois rodamos em um browser que ainda não tem tela. A ideia é conseguir testar as funcionalidades do código sem necessariamente startar um browser porque isso é muito pesado. Se fossemos utilizar essa função no browser, faríamos assim:\n\n```jsx\nconst alerts = {\n  alerts: (alert, message) => alert(message)\n}\nalerts.alert(window.alert, 'message')\nmodule.exports = alerts\n```\n\nMas como vamos testar sem ter um browser, eu sei que tem um window.alert, e quando for utilizar, eu vou passar este valor para ele, mas na hora do meu teste temos que importar o alertUser:\n\n```jsx\nconst alertUser = require('./alert-user')\ntest('it calls alert', () => {\n    const alertMock = jest.fn()\n    alertUser.alert(alertMock, 'message')\n    console.log(alertMock.mock.calls)\n}\n```",
      "keywords": [
        "alert",
        "alerts",
        "message",
        "const",
        "browser",
        "alertmock",
        "depend",
        "temos",
        "digo",
        "para"
      ],
      "metadata": {
        "title": "Vantagens da Injeção de dependência para a testabilidade do código",
        "date": "2017-06-01",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "VantagemInejcao.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/vantagens-da-injecao-de-depencia/index.md"
      }
    },
    {
      "id": "cd6bd079adb72aa2",
      "url": "https://devpleno.com/blog/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples/index",
      "title": "Json-server - Como criar uma REST API para testes de forma simples (Part 1)",
      "content": "Neste hands-on onde vou mostrar uma ferramenta que é bastante interessante no dia a dia, o Json-server.\n\nPrimeiro vamos instalar:\n\n```jsx\nnpm install -g json-server\n```\n\n**O que ele faz?**\n\nMuitas vezes estamos criando uma aplicação apenas front-end, como React ou Angular e ele é uma rest API para podermos testar, trazer dados, alterar esses dados, etc. Ele permite que a gente faça isso de uma forma muito simples.\n\nVou criar um novo arquivo, por exemplo db.json, e dentro dele vou colocar o seguinte:\n\n```jsx\n{\n  \"produtos\": [\n    {\"id\": 1, \"name\": \"bike\"}\n  ]\n}\n```\n\nCriamos uma base de produtos onde tenho uma bicicleta com o ID 1. Com isso posso ir por exemplo no Shell e escrever:\n\n```jsx\njson-server --watch db.json\n```\n\nEle retorna que já temos um recurso, que é:\n\n```jsx\nhttps://localhost:3000/produtos\n```\n\nEsse produto é o key que foi criado, que seria como se fosse nosso banco de dados. Se abrirmos o [Postman](https://www.devpleno.com/postman-como-testar-apis/) para testar, podemos colar essa url e dar um get, ele irá retornar nosso json.\n\nEntão podemos fazer uma requisição em jQuery, por exemplo, que ele já baixa. O mais legal é que podemos criar um produto novo copiamos o retorno do nosso get:\n\n```jsx\n{\n\"id\": 1,\n\"name\": \"bike\"\n}\n```\n\nE depois mudamos o parâmetro para post e vamos postar um produto com ID 2. No body, temos que colocar que ele será em Raw\n\n```jsx\n{\n\"id\": 2,\n\"name\": \"carrinho\"\n}\n```\n\nSe clicarmos em Send e voltarmos a dar um Get, ele retorna os dois produtos, então eu consigo criar um registro e retornar esse registro apenas fazendo isso. Podemos também fazer com um ID direto dessa maneira:\n\n```jsx\nhttps://localhost:3000/produtos/1\n```\n\nEle retornará apenas o ID 1.\n\nPerceba que ele transforma um Json em um banquinho de dados para podermos testar. À medida que vamos trocando, percebemos que o Json vai mudando também, então podemos criar essas alterações de uma forma persistida.",
      "keywords": [
        "json",
        "para",
        "https",
        "podemos",
        "produtos",
        "testar",
        "dados",
        "criar",
        "tamb",
        "embed"
      ],
      "metadata": {
        "title": "Json-server - Como criar uma REST API para testes de forma simples",
        "date": "2017-07-31",
        "tags": "['Javascript']",
        "thumbnail": "JsonServer.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/json-server-como-criar-uma-rest-api-para-testes-de-forma-simples/index.md"
      }
    },
    {
      "id": "cd97ecb298c486c9",
      "url": "https://devpleno.com/aplicacao-web",
      "title": "Aplicação Web - Entendendo Back-end e Front-end - DevPleno (Part 2)",
      "content": "O lado back-end, é o lado que, se não for padronizado a WEB, continuará normal, mas já o lado do front tivemos que ter uma padronização, por esse motivo temos um número reduzido de tecnologias, ela é padronizada pelo W3C, já que ali está a maior parte dos usuários e diversidade de dispositivos que vão usar o client side para acessar o server side. Já o Server side tem a função de devolver algo padronizado para o cliente.\n\nConfira a explicação no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Aplica%C3%A7%C3%A3o%20Web%20-%20Entendendo%20Back-end%20e%20Front-end&url=https%3A%2F%2Fdevpleno.com%2Faplicacao-web) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Faplicacao-web)",
      "description": "Uma Aplicação Web sempre é composta por dois &#34;blocos&#34;: o frontend e o backend. Podemos classificar nossas tecnologias, arquiteturas, etc baseado nessas dua...",
      "keywords": [
        "front",
        "para",
        "https",
        "devpleno",
        "back",
        "tecnologias",
        "server",
        "side",
        "lado",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/aplicacao-web"
      }
    },
    {
      "id": "cdce45108dec2ab9",
      "url": "https://devpleno.com/blog/pare-de-pensar-em-classes/index",
      "title": "Pare de pensar em classes!  Série - POO para JS (Part 1)",
      "content": "Nesta nova série do DevPleno, mostro como podemos passar de programação orientada-objetos para JavaScript mais funcional.\n\nA primeira coisa _(que é muito importante)_ é tentar parar de pensar estruturado.Se você quer mudar de programação orientada objetos para JavaSxript cada vez mais funcional funcional, precisa parar de pensar em classes. Apesar do JavaScript ter uma forma de criar classes,\n\npor exemplo:\n\n```jsx\nclass Calc {\n  constructor(num1, num2) {\n    this.num1 = num1\n    this.num2 = num2\n  }\n  out() {\n    console.log(this.num1, this.num2)\n  }\n}\nconst a = new Calc(1, 2)\na.out()\n```\n\nDevo utilizar?\n\nSe você quer programar mais de uma maneira que faça sentido em JavaScript, você deve evitar. Vou mostrar algo que é bastante estranho principalmente para quem vem de Java, PHP, etc:\n\n```jsx\na.out.bind({ num: 4, num2: 5 })()\n```\n\nEntão eu peguei o meu objeto 'a', o método out e dou um bind passando num1 e num2, com isso eu consigo sobrescrever um parâmetro que teoricamente estaria restrito a esse objeto.\n\nUma forma de construir sem utilizar o class seria assim:\n\n```jsx\nconst Calc = function (num1, num2) {\n  this.num1 = num1\n  this.num2 = num2\n  return {\n    out: function () {\n      console.log(this.num1, this.num2)\n    }\n  }\n}\n```\n\nMas eu consigo resolver isso de mutar o objeto, evitando por exemplo que o bind funcionasse? Toda function cria um contexto novo.\n\nPara que isso não aconteça, podemos utilizar uma outra construção que não permita que façamos isso:\n\n```jsx\nreturn {\n  out: () => {\n    console.log(this.num1, this.num2)\n  }\n}\n```\n\nA partir de uma arrow function, não temos mais uma forma de sobrescrever o this. Assim eu evitei essa criação excessiva de contextos. Utilizando dessa forma, você vai perceber que ele parece muito uma classe mas existem vários conceitos de programação funcional que vão fazer muito sentido à medida que você for evoluindo.\n\nConfira o video:",
      "keywords": [
        "num2",
        "this",
        "num1",
        "para",
        "mais",
        "funcional",
        "forma",
        "isso",
        "function",
        "embed"
      ],
      "metadata": {
        "title": "Pare de pensar em classes!  Série - POO para JS",
        "date": "2017-10-25",
        "tags": "['Javascript']",
        "thumbnail": "ParaDePensar.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/pare-de-pensar-em-classes/index.md"
      }
    },
    {
      "id": "cdf5e2fb69ea002f",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-4/index",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms (Part 3)",
      "content": "Imagine que temos um servidor e cinco usuários, porém dois usuários estão no jogo um e três no jogo dois, eu poderia mandar essa informação para todos e separar no client, mas fazendo isso eu vou matar a performance na rede. Imagine mandar a atualização de um vídeo novo, se não estiver selecionando os usuários do jogo especifico, eu mandaria para três usuários de forma desnecessária e se pensarmos em escala perdemos muito recurso trafegando dado que não precisa.\n\nTambém temos a situação onde temos que gerar atualização para todo mundo, nesse caso já estamos consumindo o recurso necessário. O importante é conseguir segmentar isso caso a gente queira. Um conceito importante no Socket.IO é o 'room', que são as salas que nós temos, toda vez que um usuário conecta, ele está na sala geral, então já tem um room que engloba todos os usuários que estão conectados ao Socket.IO naquele momento, depois conseguimos criar novas rooms, por exemplo match-1 para o jogo 1, e quando eu quiser mandar uma informação para os usuários dessa sala específica, fica mais simples e é isso que vamos fazer agora. Dentro de js/match.js, vamos fazer uma modificação no código para falar para o servidor em qual sala estamos conectado, isso vai ser feito quando formos chamar o construtor do Socket.IO do client, vai ser passado uma string vazia como url e depois vamos passar um query, que será um objeto com match e dentro dele um MATCH_INDEX:\n\n```jsx\n$function(){\n    const socket = io('', { query: { match: MATCH_INDEX}});\n    ...\n}\n```\n\nPerceba que agora no route/index.js, quando o usuário conectar, vamos colocar ele na sala:\n\n```jsx\nio.on('connect', function (socket) {\n  if (socket.handshake.query.match) {\n    console.log('user connnected on match', socket.handshake.query.match)\n    socket.join('match-' + socket.handshake.query.match)\n  } else {\n    console.log('a new client connected')\n  }\n})\n```",
      "keywords": [
        "match",
        "para",
        "supporters",
        "vamos",
        "team",
        "function",
        "video",
        "socket",
        "const",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms",
        "date": "2017-07-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 8,
        "sourcePath": "blog/minicurso-socket-io-parte-4/index.md"
      }
    },
    {
      "id": "ce299b14d8660dc3",
      "url": "https://devpleno.com/fullstacklab-google",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstacklab-google to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstacklab",
        "google"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstacklab-google"
      }
    },
    {
      "id": "ce33baab85d9a002",
      "url": "https://devpleno.com/socket-io-parte1",
      "title": "Comunicação em tempo-real com Node e Socket.io - DevPleno (Part 1)",
      "content": "Javascript\n\n## Comunicação em tempo-real com Node e Socket.io\n\nT\nPor Tulio Faria • 11 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)\n\n**O que é Socket.io e para que vamos precisar dele?**\n\nSocket.io é uma implementação em node para web socket, ou seja, uma forma de fazer comunicação em tempo real, mas mais importante que isso é sua possibilidade de fallBack. O Socket.io foi lançado há mais ou menos cinco anos e mesmo assim ele ainda continua sendo a melhor opção para comunicação em tempo real quando utilizamos o node.\n\nOutra coisa muito importante é o fato de poder integrá-lo a outros Stacks, como em uma aplicação feita em PHP, Java, etc. E o mais interessante é que é possível fazer com autenticação e tudo mais.\n\nO Socket.io também é muito fácil de escalar, como é em tempo real, o chamamos de io intensive, ou seja, acontece muito io quando estamos utilizando o mesmo.\n\nExemplo:* Por algum motivo seus clientes que estão se conectando ao Socket.io não têm suporte ao web Socket, então ele vai tentar outras maneiras (não tão performáticas como AJAX). Nesta situação, o Node se destaca de outras tecnologias, pois ele suporta mais usuários.\n\nPara começarmos o projeto, devemos instalar os módulos Socket.io e o Express :\n\nyarn add socket.io\nyarn add express\nFeito isso, vamos criar um arquivo (vou chamá-lo de server.js), que será nosso servidor express. Nele vamos criar a instância do socket.io e passar o http.\n\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\nVamos fazer um teste para ver se esta tudo funcionando corretamente:\n\nhttp.listen(3000, function () {\nconsole.log('listening on port 3000')\n})\nCom o Server respondendo corretamente, precisamos pelo menos ter um arquivo HTML para conectar ao secket.io, então vamos mandar um arquivo index apenas para ter algo para mandar ao navegador.",
      "description": "O que é Socket.io e para que vamos precisar dele? Socket.io é uma implementação em node para web socket, ou seja, uma forma de fazer comunicação em tempo r...",
      "keywords": [
        "socket",
        "para",
        "http",
        "const",
        "require",
        "vamos",
        "html",
        "express",
        "temos",
        "conex"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/socket-io-parte1"
      }
    },
    {
      "id": "ce512058e2b190c3",
      "url": "https://devpleno.com/blog/evite-o-this-em-js/index",
      "title": "Evite o this em JavaScript (Part 1)",
      "content": "Venho programando cada vez mais de forma funcional e muitas coisas que víamos com preconceito começamos a entender o porque faz sentido ser da forma que é. Toda vez que você for pensar em utilizar o 'this' em JavaScript pense 10 vezes antes, porque toda vez que tem um 'this' você tem um estado interno nesse componente ou classe caso fossemos utilizar ES6.\n\n**Qual o problema disso?** Se eu estou utilizando o 'this', naturalmente esse método já não é mais puro.\n\n**O que é uma função pura?** É uma função que depende exclusivamente da entrada dela para ter um retorno. Então, ao utilizar o this dentro do seu componente, pense melhor, pois ele não é funcional e isso vai atrapalhar o seus testes. Por exemplo, podemos utilizar o exemplo que fizemos anteriormente do [React recursivo](https://www.devpleno.com/renderizar-estruturas-em-formato-de-arvore/), que fizemos utilizando uma functional stateless component, ou seja, um componente em React, que é uma closer. No exemplo, foi criado com uma arrow function e retorna JSX, nela eu não tenho 'this' e sim o contexto onde posso guardar algumas variáveis.\n\n```jsx\nconst Node = (props) => {\n  return (\n    <span>\n      {props.node.l && props.node.r && <span>(</span>}\n\n      {props.node.l && <Node node={props.node.l} />}\n\n      {props.node.v}\n\n      {props.node.l && props.node.r && <span>)</span>}\n    </span>\n  )\n}\n```\n\nCom isso, é possível saber qual o resultado esperado, ou seja, consigo testar esse componente de uma forma muito melhor. Prefira sempre utilizar uma closer, arrow function ou functional stateless component onde não se tem o 'this'.\n\nUma coisa interessante é que quando você começa a ficar mais ciente para isso, naturalmente, no caso do React, você começa a construir os componentes dessa forma e evita alguns deslizes.\n\nIsso deixa muito mais fácil manutenção, testabilidade e etc. Principalmente se houver outro método e nesse método você usa o 'this' tem que se criar um construtor, deixando o código muito mais verboso.",
      "keywords": [
        "node",
        "props",
        "this",
        "utilizar",
        "componente",
        "span",
        "mais",
        "forma",
        "para",
        "isso"
      ],
      "metadata": {
        "title": "Evite o this em JavaScript",
        "date": "2017-07-03",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "javascript-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/evite-o-this-em-js/index.md"
      }
    },
    {
      "id": "ce61f480326bd34d",
      "url": "https://devpleno.com/blog/lista-encadeada-retornar-um-item/index",
      "title": "Lista encadeada - Como retornar um item (Part 3)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "node",
        "index",
        "return",
        "length",
        "value",
        "null",
        "ndice",
        "vamos",
        "para",
        "lista"
      ],
      "metadata": {
        "title": "Lista encadeada - Como retornar um item",
        "date": "2017-07-25",
        "tags": "['Algoritmos']",
        "thumbnail": "ListaEncadeada.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/lista-encadeada-retornar-um-item/index.md"
      }
    },
    {
      "id": "ce8b44481c33187c",
      "url": "https://devpleno.com/hands-on-slack",
      "title": "Hands-on: Slack - DevPleno",
      "content": "Javascript\n\n## Hands-on: Slack\n\nT\nPor Tulio Faria • 6 de março de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste hands-on iremos fazer um bot simples que envia notificações utilizando o Slack.\n\nO Slack vem sendo bastante utilizado para comunicação corporativa (eu mesmo uso bastante). E concentrar informações a respeito da sua empresa ou projeto nele é bem interessante.\n\n[Para criar um bot no slack entre aqui.](https://my.slack.com/apps/A0F7YS25R-bots)\n\nconst token = 'xoxb-....'\nconst Api = require('@slack/client').WebClient\nconst api = new Api(token)\nconst RtmClient = require('@slack/client').RtmClient\nconst rtm = new RtmClient(token)\nconst RTM_EVENTS = require('@slack/client').RTM_EVENTS\napi.channels.list(function (err, info) {\nconst channelId = info.channels\n.filter((channel) => channel.name === 'general')\n.map((channel) => channel.id)[0]\nrtm.on(RTM_EVENTS.MESSAGE, (msg) => {\nrtm.sendMessage(msg.text, channelId)\n})\n\nrtm.start()\n})\nJá pensou o que você vai criar notificar no Slack para sua equipe de forma automática?\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Slack&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-slack) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-slack)",
      "description": "Neste handson iremos fazer um bot simples que envia notificações utilizando o Slack. O Slack vem sendo bastante utilizado para comunicação corporativa (eu ...",
      "keywords": [
        "slack",
        "https",
        "const",
        "para",
        "channel",
        "javascript",
        "hands",
        "token",
        "require",
        "client"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-slack"
      }
    },
    {
      "id": "cf2bd3e736b9d947",
      "url": "https://devpleno.com/tag/javascript/4",
      "title": "Javascript - Pagina 4 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 11 de set. de 2017 ChalkJS - Deixe as saídas de seu console.log coloridas e com estilo](/hands-on-chalkjs)\n\n[Javascript 8 de set. de 2017 Servidor JSON simples em PHP (parte 1)](/servidor-json-simples-em-php-parte-1)\n\n[Javascript 5 de set. de 2017 Módulo MS - Convertendo timestamps](/convertendo-timestamps)\n\n[Javascript 31 de ago. de 2017 Como encadear promises](/como-encadear-promises)\n\n[Javascript 23 de ago. de 2017 Dotenv e variáveis de ambiente no NodeJS](/dotenv-e-variaveis-de-ambiente)\n\n[Javascript 23 de ago. de 2017 O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express](/morgan)\n\n[Javascript 21 de ago. de 2017 3 Padrões para Iniciar com Expressões Regulares (RegExp)](/expressoes-regulares)\n\n[Javascript 21 de ago. de 2017 Estruturas de Dados - Pilhas](/pilha)\n\n[Javascript 18 de ago. de 2017 [SEGREDO] Muitos registros do MySQL no NodeJS](/registros-do-mysql-no-nodejs)\n\n[Javascript 17 de ago. de 2017 Hands-on: Request-promise](/request-promise)\n\n[Javascript 14 de ago. de 2017 Cheerio: Uma implementação jQuery para Node](/cheerio)\n\n[Javascript 14 de ago. de 2017 Request - Requisições HTTP de forma rápida e simples](/request)\n\n[Anterior](/tag/javascript/3)4 / 16[Próxima](/tag/javascript/5)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "nodejs",
        "request",
        "simples",
        "algoritmos",
        "carreira",
        "ferramentas",
        "fundamentos",
        "reactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/4"
      }
    },
    {
      "id": "cf4d9282f2a673a7",
      "url": "https://devpleno.com/aprenda-a-aprender",
      "title": "Aprenda a aprender - DevPleno (Part 1)",
      "content": "Carreira\n\n## Aprenda a aprender\n\nT\nPor Tulio Faria • 12 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nNesta dica de carreira, vou contar como podemos aprender mais. O ponto mais importante de quando estamos aprendendo algo novo, seja uma tecnologia, uma linguagem ou qualquer outra coisa, é tentar achar a melhor forma para aprender.\n\nMuita gente me diz “eu não consigo ler um livro e entender o que está no livro”, existe uma teoria que se chama a teoria das múltiplas inteligências, na qual diz que cada um tem uma combinação de tipos de inteligência, então você pode ter facilidade para algumas coisas e dificuldades para outras, isso é normal e você consegue praticar uma ou outra.\n\nQuando você aprende o jeito que você aprende fica muito mais fácil. Por exemplo, para eu aprender algo, preciso fazer um paralelo com a aplicação prática disso, se eu quero aprender uma teoria sobre algo, tento trazer para qual a aplicação prática eu tenho e como eu posso aplicar isso na prática. No ensino médio, quando estava aprendendo geometria, eu já programava, então tentava trazer para o mundo que eu gostava, programava jogo, por exemplo, aplicando isso. São coisas que não esqueço mais porque eu aprendi como aprender de uma forma mais efetiva.\n\nVamos supor que você tenha uma facilidade maior de aprender ouvindo, então tudo que você tem que aprender, leia e grave em um gravador, depois ouça sua própria voz lendo esse conteúdo. Gosta de vídeos? Então ache vídeos no YouTube e assista para absorver da melhor forma possível.\n\nUma outra forma que me ajuda bastante é, ao invés de eu ler um texto longo, separar por tópicos, organizar em causa e efeito, com isso uma mapa mental me ajuda bastante a organizar a informação.\n\nA dica de hoje é experimente formatos diferentes quando você está aprendendo algo, pode ser que você está tentando aprender da maneira que não é bom para você. Cada um aprende de uma maneira, encontre a sua!",
      "description": "Nesta dica de carreira, vou contar como podemos aprender mais. O ponto mais importante de quando estamos aprendendo algo novo, seja uma tecnologia, uma lin...",
      "keywords": [
        "aprender",
        "para",
        "https",
        "mais",
        "carreira",
        "quando",
        "algo",
        "forma",
        "isso",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/aprenda-a-aprender"
      }
    },
    {
      "id": "cf56b7b6a753bd28",
      "url": "https://devpleno.com/coding-weekend-materiais",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /coding-weekend-materiais to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "coding",
        "weekend",
        "materiais"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/coding-weekend-materiais"
      }
    },
    {
      "id": "cf8773f873520276",
      "url": "https://devpleno.com/blog/24",
      "title": "Blog - Página 24 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 3 de mar. de 2017 Hands-on: Standard](/hands-on-standard)\n\n[Javascript 3 de mar. de 2017 Pure Functions (Funções Puras)](/pure-functions-funcoes-puras)\n\n[Algoritmos 24 de fev. de 2017 Algoritmos: Campo Minado (Minesweeper)](/algoritmo-campo-minado-minesweeper)\n\n[Javascript 24 de fev. de 2017 Hands-on: Node JS - Request](/hands-on-node-js-request)\n\n[Javascript 24 de fev. de 2017 Hands-on: NodeJS - PM2](/hands-on-nodejs-pm2)\n\n[Javascript 24 de fev. de 2017 Hands-on: Pre-Commit](/hands-on-pre-commit)\n\n[Algoritmos 19 de fev. de 2017 Algoritmos: Problema 3n+1](/algoritmo-3n-1)\n\n[Javascript 1 de fev. de 2017 Verificando o tempo para executar um trecho de código em Javascript](/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript)\n\n[Javascript 25 de jan. de 2017 Render condicional em ReactJS](/render-condicional-em-reactjs)\n\n[Javascript 28 de dez. de 2016 O que é o app.use no NodeJS/ExpressJS?](/o-que-e-o-app-use-no-nodejsexpressjs)\n\n[Javascript 27 de dez. de 2016 Loops/Repetições/Iterações no JSX do React](/loopsrepeticoesiteracoes-no-jsx-do-react)\n\n[Javascript 23 de nov. de 2016 ReactJS: comentários em JSX](/reactjs-comentarios-em-jsx)\n\n[Anterior](/blog/23)24 / 26[Próxima](/blog/25)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "hands",
        "algoritmos",
        "reactjs",
        "nodejs",
        "2016",
        "para",
        "blog",
        "todos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/24"
      }
    },
    {
      "id": "cf8a4ea8a00c1a8c",
      "url": "https://devpleno.com/tomar-decisoes",
      "title": "Tomar decisões - DevPleno (Part 1)",
      "content": "Carreira\n\n## Tomar decisões\n\nT\nPor Tulio Faria • 8 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nVocê costuma tomar decisões necessárias ou espera ter tudo na sua mão?\n\nIndependente se você está em um cargo de liderança ou se é liderado, é muito importante tomar algumas decisões, nem que sejam microdecisões.\n\nSe você for um liderado, precisa ajudar o seu líder, mesmo que sejam microdecisões. Estudar as alternativas e explicar o porquê delas serem as melhores para sua equipe facilita para seu líder tomar a decisão correta.\n\nNa minha empresa, somos o braço direito em algumas outras empresas, ajudamos a desenrolar essa parte tecnológica, então elas acham que qualquer decisão que envolvam um software depende da gente, com isso a empresa inteira fica enroscada porque as pessoas não querem tomar decisão, tem medo ou algo do tipo. A postura que eu acredito que funcione mais é se a decisão está no seu ambiente, se você sabe resolver, tem a informação para resolver e consigue fazer, por que não faz?\n\nÀs vezes é algo muito simples, mas as pessoas complicam, com isso a produtividade da empresa como um todo vai para baixo.\n\nPara uma empresa mais produtiva, as pessoas têm que assumir mais esses riscos. Quando você é liderado, assuma mais riscos, não precisa ser inconsequente, mas comece a tomar decisões.\n\nQuanto mais decisões você tomar, mais treinado você vai estar para tomar decisões. Já se você é o líder, existe a contrapartida, às vezes você concentra em você e não quer que sua equipe tome decisões porque você tem medo de algo dar errado e você ser o responsável, aí vem a outra dica: você tem que treinar sua equipe a tomar decisões também, ajudar você a organizar isso, porque se concentrar tudo em você, vai ser o cara que vai atrasar a equipe, afinal vai ser tanta decisão para se tomar que as microdecisões, que as pessoas poderiam tomar, não vão ser feitas porque você não deixa.",
      "description": "Você costuma tomar decisões necessárias ou espera ter tudo na sua mão? Independente se você está em um cargo de liderança ou se é liderado, é muito importa...",
      "keywords": [
        "decis",
        "para",
        "tomar",
        "mais",
        "equipe",
        "porque",
        "https",
        "empresa",
        "isso",
        "pessoas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/tomar-decisoes"
      }
    },
    {
      "id": "cfa101bb9526d7c3",
      "url": "https://devpleno.com/blog/quanto-ganha-quem-trabalha-por-meio-da-toptal/index",
      "title": "Quanto ganha quem trabalha por meio da Toptal?",
      "content": "A pergunta que não quer calar: Quanto se ganha trabalhando por meio da Toptal?\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/36dtfgmQoI4\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\n[![Curso DevReactJS](DevReact.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)",
      "keywords": [
        "embed",
        "responsive",
        "profissionais",
        "toptal",
        "classname",
        "iframe",
        "https",
        "reactjs",
        "mais",
        "devreactjs"
      ],
      "metadata": {
        "title": "Quanto ganha quem trabalha por meio da Toptal?",
        "date": "2018-02-16",
        "tags": "['Carreira']",
        "thumbnail": "SalarioToptal.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/quanto-ganha-quem-trabalha-por-meio-da-toptal/index.md"
      }
    },
    {
      "id": "cfaa2235ac6ea6cf",
      "url": "https://devpleno.com/hands-ler-arquivo-linha-linha",
      "title": "Hands-on: Ler arquivo linha a linha - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Ler%20arquivo%20linha%20a%20linha&url=https%3A%2F%2Fdevpleno.com%2Fhands-ler-arquivo-linha-linha) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-ler-arquivo-linha-linha)",
      "description": "Neste handson, vamos ver como conseguimos utilizar o readline em conjunto com Readable Stream para ler linhas de um arquivo texto. Como faremos isso? Prime...",
      "keywords": [
        "linha",
        "arquivo",
        "line",
        "https",
        "vamos",
        "readline",
        "readable",
        "para",
        "isso",
        "const"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/hands-ler-arquivo-linha-linha"
      }
    },
    {
      "id": "d00421200aefad3c",
      "url": "https://devpleno.com/blog/entrevista-com-edy-segura/index",
      "title": "DevPleno Entrevista - Edy Segura (Part 2)",
      "content": "“O brasileiro tem uma dinâmica, a gente se mistura, corre atrás, quando recebemos uma tarefa queremos resolver. Lá fora, o que eu vejo em alguns perfis de outros países é, por exemplo, eles pedem para fazer X, e se tem algo que saiu desse X, os profissionais não fazem ou ficam travados. Já nós, baseado nos brasileiros que eu já trabalhei, se travou em algum lugar, vamos querer resolver.”\n\nEu percebo isso também, faço bastante projeto fora e da pra perceber muito que o pessoal é mais objetivo, se ele é contratado para fazer X, ele não faz X+1. Se você fosse dar uma dica de carreira, analisando o que você fez, ou avaliando o que as pessoas fizeram, o que você diria a elas?\n\n“Principalmente para nossa área é fundamental o Inglês, eu me arrependo por não ter dado importância cedo para o inglês, tive que sofrer um pouco com isso e perdi algumas oportunidades, mas é fundamental, já que é a língua internacional da tecnologia. Quando você aprende o inglês abre portas de tal maneira que você se liberta para pegar conteúdos gratuitos de qualidade na internet. Em projetos open-source, existe gente de todas as nacionalidades, então minha dica de carreira número um nessa área é o inglês.”\n\nE sobre tecnologia, o que você acha que o pessoal deveria estar antenado para 2017?\n\n“Eu acredito que o JavaScript com certeza para quem está começando vai ajudar muito, porque mesmo que o projeto não é focado em JavaScript o ferramentario é feito em JavaScript. Outra linguagem que está há bastante tempo e não vai sair tão cedo é o Java, é uma linguagem standard, que em algum momento você vai ter contato.”\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Cdatj4bxWx4\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "para",
        "gradua",
        "cnico",
        "isso",
        "fazer",
        "fora",
        "ingl",
        "embed",
        "tamb",
        "come"
      ],
      "metadata": {
        "title": "DevPleno Entrevista - Edy Segura",
        "date": "2017-08-03",
        "tags": "['Carreira']",
        "thumbnail": "entrevista-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/entrevista-com-edy-segura/index.md"
      }
    },
    {
      "id": "d00d54c0c663594f",
      "url": "https://devpleno.com/blog/quantas-linguagens-programar/index",
      "title": "Quantas linguagens devo programar? (Part 1)",
      "content": "Hoje vou começar perguntando uma coisa, quantas linguagens você sabe programar?\n\nEssa foi uma das perguntas que recebi recentemente em uma live, achei bem interessante responder isso e mostrar algumas coisas que acho legal quando pensamos nessas quantidades.\n\nRespondendo quantas linguagens eu programo, na verdade, eu não sei, mas deve estar na faixa de umas dez linguagens. Hoje programo com JavaScript, JAVA, PHP, já programei em linguagens muito específicas como C, C++, Pascal, Delphi e por aí vai.\n\nUma coisa que acho bastante interessante e é também um ponto onde podemos evoluir na carreira é que ao invés de contar quantas linguagens, definir uma meta para cada item na carreira. Por exemplo, uma das coisas que defini como meta para mim é aprender um framework ou uma tecnologia nova por ano. Com isso, todo ano eu tenho que perceber que eu fui melhor que o ano anterior. Nos últimos 4 anos, eu fiquei muito encabulado com qualidade, então estou cada vez mais aplicando continuous integration, continuous deployment, teste unitário, etc.\n\nAlém de definir, também é importante se comprometer a completar essa meta. Não vale somente dizer que quer programar uma linguagem por ano, é importante definir o que é programar essa linguagem e conhecer a tecnologia. E como se faz isso? Colocamos em produção.",
      "keywords": [
        "essa",
        "para",
        "linguagens",
        "isso",
        "definir",
        "quando",
        "muito",
        "como",
        "produ",
        "embed"
      ],
      "metadata": {
        "title": "Quantas linguagens devo programar?",
        "date": "2017-06-20",
        "tags": "['Carreira']",
        "thumbnail": "QuantasLinguagensProgramar.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/quantas-linguagens-programar/index.md"
      }
    },
    {
      "id": "d057e6b6591a42ea",
      "url": "https://devpleno.com/blog/navigator-geolocation/index",
      "title": "Navigator Geolocation API - Sabendo a localização do usuário (Part 1)",
      "content": "Hoje quero dar uma dica para vocês sobre geolocalização no navegador. É uma API que está cada vez mais disponível nos navegadores. O interessante é que conseguimos fazer aplicações WEB que tenham esse senso de localização.\n\nAlguns dos métodos que eles têm:\n\n```jsx\n<html>\n  <body>\n    <script>\n      if('geolocation' in navigator){} else {Alert('ops')}\n    </script>\n  </body>\n</html>\n```\n\nA partir disso, conseguiríamos checar a nossa localização. Podemos, por exemplo, fazer:\n\n```jsx\nif ('geolocation' in navigator) {\n  navigator.geolocation.getCurrentPosition(\n    function (position) {\n      console.log(position)\n    },\n    function (error) {\n      Console.log(error)\n    }\n  )\n} else {\n  Alert('ops')\n}\n```\n\nAo rodar o código e inspecionar, perceba que ele retorna a nossa posição.\n\nSe sua aplicação necessita ter essa possibilidade de checar a posição, é importante checar se não retornou um erro caso o usuário não aceite a verificação.\n\nOutra coisa bem interessante é que podemos checar, de tempos em tempos, a posição do usuário, fazendo um tracker, por exemplo:\n\n```jsx\nwatcher: navigator.geolocation.watchPosition(function (position) {\n  console.log(position)\n})\n```\n\nAgora, à medida que essa coordenada ficar mais precisa, vai ser melhor, pois ela vai nos trazendo essas informações.\n\nConseguimos aumentar essa precisão também utilizando o enableHighAccuracy:\n\n```jsx\nwatcher: navigator.geolocation.watchPosition(\n  function (position) {\n    console.log(position)\n  },\n  function (error) {\n    console.log(error)\n  },\n  { enableHighAccuracy: true, maximumAge: 30000, timeout: 30000 }\n)\n```\n\nNo caso do watcher, podemos apagar, equivalente ao que podemos fazer com o clear interval:\n\n```jsx\nGeolocation.clearWatch(watcher)\n```\n\nEsse é um pouco do geolocation. Eu trouxe essa dica pois a utilizamos no Fullstack Academy e eu já construí algumas aplicações utilizando isso também.",
      "keywords": [
        "geolocation",
        "position",
        "navigator",
        "function",
        "console",
        "checar",
        "podemos",
        "error",
        "essa",
        "watcher"
      ],
      "metadata": {
        "title": "Navigator Geolocation API - Sabendo a localização do usuário",
        "date": "2017-10-05",
        "tags": "['Javascript']",
        "thumbnail": "Navigator.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/navigator-geolocation/index.md"
      }
    },
    {
      "id": "d06b6969b88e80e8",
      "url": "https://devpleno.com/blog/lista-encadeada-adicionar-no/index",
      "title": "Lista encadeada - Adicionar nó (Part 1)",
      "content": "Vamos explorar um pouco mais de estrutura de dados de algoritmos que são comuns na base curricular, principalmente em computação, e caem muito em competição de programação e em entrevistas de emprego. Quando falamos de entrevista no exterior, é muito comum fazer essa entrevista com esse tipo de questão.\n\nHoje vamos falar sobre lista, com questões do google. Isso mostra que você tem essa desenvoltura, mesmo que não use na prática, nas entrevistas o que eles procuram é essa capacidade de conseguir resolver o problema.\n\nA lista encadeada, também conhecida como Linked-List basicamente é composta por nós que têm dois valores dentro, sendo que o segundo valor aponta para o próximo nó, por esse motivo se chama lista encadeada. Podemos ter uma estrutura de dados que represente isso, para isso podemos, por exemplo, citar uma função em JavaScript que vai funcionar quase que igual a uma classe em orientação de objeto, mas vamos utilizar somente closure e travar o contexto dentro da função para fazer toda a operação na lista.\n\nEntão eu vou criar algumas variáveis dentro e retornar qual vai ser a interface pública dessa lista:\n\n```jsx\nfunction LinkedList() {\n  let head = null\n  length = 0\n  return {\n    length: () => length\n  }\n}\n```\n\nPerceba que eu defini um head, que é o ponto inicial da nossa lista, e além disso eu defini o length, que é o tamanho da nossa lista. O legal é que estamos retornando um length, porém esse length vai ser uma função que retorna length. Nós não utilizamos o this, esse tipo de operação é o melhor possível porque não temos essa mistura de contexto. No JavaScript funcional, quanto mais utilizarmos dessa forma melhor vai ser.\n\nSe eu fizer:\n\n```jsx\nconst list = LinkedList()\nconsole.log(list.length())\n```\n\nEle irá retornar o objeto length, como é uma função, ela será executada. Ao executar será retornado o valor 0, então temos que implementar todas as operações dentro de LinkedList, por exemplo, eu quero fazer a operação Add para adicionar um valor novo:",
      "keywords": [
        "length",
        "head",
        "value",
        "list",
        "node",
        "para",
        "lista",
        "vamos",
        "return",
        "const"
      ],
      "metadata": {
        "title": "Lista encadeada - Adicionar nó",
        "date": "2017-07-12",
        "tags": "['Algoritmos']",
        "thumbnail": "AdicionarNo.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/lista-encadeada-adicionar-no/index.md"
      }
    },
    {
      "id": "d080dacf964f3949",
      "url": "https://devpleno.com/servir-arquivos-e-expor-servidor",
      "title": "Como servir arquivos e expor servidor local com HTTPS - DevPleno (Part 2)",
      "content": "Outra vantagem é quando você for testar Webhook. Vamos supor que você vá integrar com um gateway de pagamento, eles geralmente oferecem o Webhook, caso aconteça alguma coisa no pagamento, ele faz uma requisição em seu servidor falando que algo aconteceu. Uma das coisas que a nossa empresa faz bastante é definir a URL do ngrok com uma URL do Webhook, então mandamos para o pagseguro e quando houver uma alteração no status do pagamento, mandamos uma requisição e meu sistema, rodando na minha máquina, consegue receber sem eu precisar fazer configuração nenhuma de roteador porque o ngrok está fazendo o túnel dessa aplicação.\n\nUma coisa interessante: quando abrimos a interface no prompt, perceba que existe um web interface. Se abrirmos esse endereço, temos acesso a esse painel:\n\nNele são mostradas todas as requisições que foram feitas naquele endereço, o código em summary,os headers que foram enviados e por aí vai.\n\nQuando formos refazer este teste com o Webhook, é possível reproduzi-lo apenas apertando em Replay. Já que o Webhook acontece uma vez só, por exemplo em uma transação de teste que eu fiz, chegou no ngrok e foi passado para a aplicação, vamos supor que você cometeu um erro na aplicação e ela não processou, podemos vir aqui e mandar dar um replay, assim ele vai fazer a requisição para o servidor de testes e você vai conseguir recriar o teste.\n\nConfira a dica em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20servir%20arquivos%20e%20expor%20servidor%20local%20com%20HTTPS&url=https%3A%2F%2Fdevpleno.com%2Fservir-arquivos-e-expor-servidor) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservir-arquivos-e-expor-servidor)",
      "description": "Nesta dica, vou mostrar como servir arquivos estáticos de forma simples, além disso, como expor um servidor local de testes para a internet e ainda utiliza...",
      "keywords": [
        "https",
        "servidor",
        "para",
        "endere",
        "como",
        "ngrok",
        "vamos",
        "http",
        "webhook",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/servir-arquivos-e-expor-servidor"
      }
    },
    {
      "id": "d0e1ef0c598e72ab",
      "url": "https://devpleno.com/entenda-sobre-cors-cross-origin-resource-sharing",
      "title": "Entenda sobre CORS - Cross Origin Resource Sharing - DevPleno (Part 2)",
      "content": "CORS nada mais é do que esse bloqueio, ou como a gente controla esses recursos, então durante essa troca de informações temos algumas trocas de cabeçalhos que vão dizer se esse servidor permite outro servidor acessar ou manipular os dados.\n\nÉ sempre bom tomarmos cuidado com isso porque vamos supor que se a gente testar nossa API no postman, por exemplo, ele não tem problema de CORS, já que ele é uma aplicação stand-alone e não uma página estática.\n\nAlgumas coisas que aconteceram conosco aqui na empresa foi colocar sistemas com domínios diferentes mas acessando a mesma API, por exemplo. O desafio era controlar o CORS para saber se esse domínio tinha acesso ou não. Esse é mais um conceito da arquitetura WEB.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Entenda%20sobre%20CORS%20-%20Cross%20Origin%20Resource%20Sharing&url=https%3A%2F%2Fdevpleno.com%2Fentenda-sobre-cors-cross-origin-resource-sharing) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fentenda-sobre-cors-cross-origin-resource-sharing)",
      "description": "Hoje vou falar sobre um assunto que é bastante interessante: CORS (ou Cross Origin Resourse Sharing). O que isso quer dizer? É como dois servidores ou dois...",
      "keywords": [
        "cors",
        "servidor",
        "para",
        "esse",
        "isso",
        "requisi",
        "fazer",
        "https",
        "sharing",
        "site"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/entenda-sobre-cors-cross-origin-resource-sharing"
      }
    },
    {
      "id": "d0fad1f296e8365e",
      "url": "https://devpleno.com/decisao-tecnica",
      "title": "Decisão técnica não precisa ser eterna - DevPleno (Part 1)",
      "content": "Carreira\n\n## Decisão técnica não precisa ser eterna\n\nT\nPor Tulio Faria • 8 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nMuitas pessoas, principalmente na época em que dava aulas presenciais, costumavam me perguntar qual tecnologia estudar. Geralmente as pessoas colocam a linguagem ou a tecnologia como se fosse uma decisão exclusiva que não pode ser mudada nunca mais. Não existe isso, se você é um profissional desse tipo, eu sinto lhe informar que está fadado ao fracasso, pois suas decisões devem estar sempre evoluindo, sua melhor decisão tem que ser a melhor decisão para aquele momento. Decisão técnica não precisa ser eterna!\n\nEu já fiz muito projeto em Angular por exemplo, e hoje para mim o React acaba sendo mais interessante, mas não que o Angular seja ruim, é que para mim o React é melhor no momento.\n\nJá aconteceu de eu dizer que ASP é ruim porque estava começando minha carreira com ASP e comparei com o PHP, que eu já era bem melhor, nesse caso óbvio que ASP vai ser pior que PHP, pois os meus parâmetros eram diferentes. Então precisamos tomar cuidado com esse tipo de pensamento porque essas decisões não vão ser para o resto da vida, você pode e até deve mudar de opinião e se reciclar sempre. Quando for tomar uma decisão, como criar um projeto novo, meu conselho é conhecer mais opções, não precisa tomar a decisão final com a linguagem e pronto… Aprenda Angular e React, por exemplo, e veja qual você se sente mais confortável para fazer aquele projeto e não para todos os projetos da sua vida. Isso vai permitir que você evolua na sua carreira.\n\nComigo aconteceu várias coisas nesse sentido, antes eu achava que a HS era cara, ai eu hospedava tudo na Digital Ocean, hoje eu uso a HS e ela não custa caro, tudo depende do ponto de vista.",
      "description": "Muitas pessoas, principalmente na época em que dava aulas presenciais, costumavam me perguntar qual tecnologia estudar. Geralmente as pessoas colocam a lin...",
      "keywords": [
        "decis",
        "para",
        "https",
        "carreira",
        "melhor",
        "qual",
        "mais",
        "angular",
        "react",
        "tomar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/decisao-tecnica"
      }
    },
    {
      "id": "d116ee133c846c64",
      "url": "https://devpleno.com/coding-weekend-inscricoes",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /coding-weekend-inscricoes to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "coding",
        "weekend",
        "inscricoes"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/coding-weekend-inscricoes"
      }
    },
    {
      "id": "d1254d6fc946f910",
      "url": "https://devpleno.com/blog/bind/index",
      "title": "Bind - Altere comportamento e contexto de execução de suas funções (Part 2)",
      "content": "Ao executar, ele vai chamar o paramfixo e param2, então eu consigo criar novas funções que tenham um valor fixo, isso também é conhecido como funções parciais. Podemos utilizar por exemplo para criar funções que filtram determinados valores em um filter.\n\nUtilizamos bastante o bind quando estamos criando um componente em react utilizando as classes em ES6 por causa dessa característica dela não ter o bind automático para this.\n\nUma coisa interessante é que quando você dá o bind, tem que estar ciente de que está alterando alguma coisa do estado atual do seu componente. Quando estamos tentando cada vez mais programação funcional, mesmo que seja alguns métodos do componente, a ideia é que elas se transformem em funções puras, então sempre que se deparar tendo que criar um bind para o método, precisa checar se realmente é necessário, porque muitas vezes conseguimos fazer isso sem o bind. Quando isso é possível, fazemos uma função pura, então a testabilidade do código fica melhor porque ela não depende de nada do contexto.\n\nConfira o vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/96Gfio4Tiz0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "bind",
        "getvalor",
        "quando",
        "para",
        "valor",
        "this",
        "modulo",
        "console",
        "contexto",
        "isso"
      ],
      "metadata": {
        "title": "Bind - Altere comportamento e contexto de execução de suas funções",
        "date": "2017-07-27",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "BIND-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/bind/index.md"
      }
    },
    {
      "id": "d1d43601ef889d87",
      "url": "https://devpleno.com/blog/postman-como-testar-apis/index",
      "title": "Postman - Como testar APIs - Hands-on (Part 2)",
      "content": "Se for uma API, você pode mandar um exemplo de API para o usuário e ele precisa apenas mudar a parte de autenticação. Mas caso você mesmo queira trocar a autenticação, basta ir em Authorization, nele você diz qual o tipo de autenticação está usando. Lembrando que sempre que fizer algo em Authorization precisa dar um update request para atualizar os Headers correspondentes.\n\nSe clicarmos em Send ele irá executar e retornar com o status. No nosso caso deu OK, tempo 391ms, todos os headers que tivemos e em body é possível visualizar como Pretty, Raw e Preview. Veja o exemplo abaixo:\n\nVamos criar mais uma requisição, mas dessa vez um POST utilizando o link `https://httpbin.org/post`, mas podemos criar todos os métodos do HTTP.\n\n![Exemplo 4](PostmanEx4.png)\n\nVamos criar mais uma requisição, mas dessa vez um POST utilizando o link `https://httpbin.org/post`, mas podemos criar todos os métodos do HTTP.\n\n![Exemplo 5](PostmanEx5.png)\n\nPerceba que o POST suporta body, então é possível mandar dados para ele. Vou mandar um name e enviar Tulio:\n\n![Exemplo 6](PostmanEx6.png)\n\nO form retorna com o valor que coloquei.\n\nTambém podemos enviar um arquivo apenas mudando o text para file.\n\nTemos o environment, que cria alguns ambientes e podemos customizar os requests baseados neles, mas basicamente, para mim, já é possível usar boa parte apenas usando collections e requisições.\n\nConfira todos detalhes no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/rI9rhM6iJoI\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "exemplo",
        "criar",
        "como",
        "https",
        "poss",
        "requisi",
        "podemos",
        "todos",
        "mais"
      ],
      "metadata": {
        "title": "Postman - Como testar APIs - Hands-on",
        "date": "2017-05-19",
        "tags": "['Javascript']",
        "thumbnail": "Postman.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/postman-como-testar-apis/index.md"
      }
    },
    {
      "id": "d1ec389ab2416cf0",
      "url": "https://devpleno.com/hr2-aula3",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /hr2-aula3 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "aula3"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hr2-aula3"
      }
    },
    {
      "id": "d22676ab65c2b78f",
      "url": "https://devpleno.com/falta-de-apoio",
      "title": "Falta de apoio - DevPleno (Part 1)",
      "content": "Carreira\n\n## Falta de apoio\n\nT\nPor Tulio Faria • 28 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nQuando estamos em uma empresa ou até mesmo fazendo projetos por conta própria, temos ideias criativas e percebemos que, quando comunicamos essas ideias para outras pessoas, não temos o apoio necessário para realizá-las\n\nImagine que você começou a planejar um aplicativo e então começa a falar para as pessoas e ninguém te apoia. O que você fazer nesse momento?\n\nA primeira coisa você precisa fazer é avaliar qual a relevância da falta de apoio por esse grupo de pessoas. Se for sua família ou amigos mais próximos, pode ser que eles estejam te protegendo de um possível fracasso, afinal, todos sabem que toda ideia corre risco de fracasso.\n\nTirando essa consideração, existe uma segunda vertente que é saber qual a relevância dessa pessoa para essa sua ideia. Vamos supor que você está fazendo um aplicativo para um mercado farmacêutico, se a pessoa que você perguntou for do mercado esportivo, a relevância é um pouco baixa, mesmo tendo que ouvir a todos. Algumas pessoas não têm o viés do assunto e acaba ponto uma opinião pessoal sobre esse determinado assunto.\n\nQuando você está em uma equipe, muitas vezes você não tem apoio pelos mesmos motivos da primeira opção: seu possível fracasso. Então a falta de apoio pode ser uma falta de relevância dessa pessoa, ou seja, ela não sabe do que se trata, ou simplesmente é uma tentativa de te proteger.",
      "description": "Quando estamos em uma empresa ou até mesmo fazendo projetos por conta própria, temos ideias criativas e percebemos que, quando comunicamos essas ideias par...",
      "keywords": [
        "apoio",
        "falta",
        "para",
        "https",
        "pessoas",
        "fazer",
        "relev",
        "ncia",
        "essa",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/falta-de-apoio"
      }
    },
    {
      "id": "d251af9cb624baad",
      "url": "https://devpleno.com/stack-master",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /stack-master to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "stack",
        "master"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/stack-master"
      }
    },
    {
      "id": "d25ba3a2b5d1da65",
      "url": "https://devpleno.com/blog/closure-poo-para-js/index",
      "title": "Closure Série - POO para JS (Part 1)",
      "content": "Hoje vou continuar a falar sobre como passar de Programação Orientada-objetos para JavaScript cada vez mais funcional.\n\nUma outra coisa bastante diferente para se comparar entre ambos os paradigmas é o uso de closure. No JavaScript, anteriormente tínhamos reproduzido aquela “classe” e acabamos criando uma closure. Vamos supor que eu faça uma função dessa forma:\n\n```jsx\nfunction func1() {\n  const name = 'tulio faria'\n\n  function func1b() {\n    console.log(name)\n  }\n\n  func1b()\n}\n\nfunc1()\n```\n\nEm JavaScript é normal e podemos fazer uma função dentro de uma função como no exemplo acima. Você percebeu que eu consegui acessar o 'name'? Isso é uma característica do JS. Por conseguir colocar uma função em uma variável, é possível ter funções dentro de funções. Essa função interna consegue acessar o escopo da função pai.\n\nNo cenário, vamos executar esse código todo síncrono e em seguida ele morre, porém, existe uma outra situação onde eu consigo manter esse escopo vivo. Vamos supor que eu queira passar uma saudação:\n\n```js\nfunction func1() {\n  const saudacao = 'Ola' + name\n\n  function func1b() {\n    console.log(saudacao)\n  }\n\n  return func1b\n}\n\nconst saudarOTulio = func1('Tulio Faria')\n\nsaudarOTulio()\n```\n\nQuando eu fiz isso, a func1 passou a ser uma closure porque ela travou esse escopo inteiro, nisso eu posso a qualquer momento chamar essa saudação. Existem alguns tipos de funcionalidades dentro do JS que permitem que a gente faça alguns tipos interessantes, como por exemplo:\n\n```js\nconst contador = function (num) {\n  let atual = 1\n\n  let timer = setInterval(() => {\n    if (atual === num) {\n      clearInterval(timer)\n    }\n\n    console.log(atual++)\n  }, 1000)\n}\n\ncontador(5)\n```",
      "keywords": [
        "function",
        "func1",
        "const",
        "name",
        "func1b",
        "isso",
        "vari",
        "esse",
        "contador",
        "embed"
      ],
      "metadata": {
        "title": "Closure Série - POO para JS",
        "date": "2017-11-07",
        "tags": "['Javascript']",
        "thumbnail": "CLOSURE-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/closure-poo-para-js/index.md"
      }
    },
    {
      "id": "d25e80d02466671d",
      "url": "https://devpleno.com/blog/racionalizacao/index",
      "title": "Racionalização: Tomando decisões racionais (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "como",
        "racionaliza",
        "exemplo",
        "esta",
        "devpleno",
        "tudo",
        "projeto",
        "fazer",
        "hoje"
      ],
      "metadata": {
        "title": "Racionalização: Tomando decisões racionais",
        "date": "2017-05-08",
        "tags": "['Carreira']",
        "thumbnail": "Racionalizacao.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/racionalizacao/index.md"
      }
    },
    {
      "id": "d272025b76c75fc4",
      "url": "https://devpleno.com/fullstackacademy-aula-2",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy-aula-2 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstackacademy",
        "aula"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstackacademy-aula-2"
      }
    },
    {
      "id": "d2c875ffff173717",
      "url": "https://devpleno.com/tag/javascript/9",
      "title": "Javascript - Pagina 9 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 29 de mai. de 2017 Como construir um beatbox com JavaScript](/beatbox-com-javascript)\n\n[Javascript 29 de mai. de 2017 Construindo um Beatbox Manipulável com JS](/beatbox-manipulavel-com-js)\n\n[Javascript 29 de mai. de 2017 Chocolatey - Gerenciador de Pacotes para Windows](/chocolatey)\n\n[Javascript 26 de mai. de 2017 Currying - Uma técnica interessante usada em programação funcional](/currying)\n\n[Javascript 26 de mai. de 2017 Metrônomo com JavaScript](/metronomo-com-javascript)\n\n[Javascript 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)\n\n[Javascript 25 de mai. de 2017 4 funcionalidades do Console no DevTools que você não conhece](/funcionalidades-do-console)\n\n[Javascript 24 de mai. de 2017 Tocando um Áudio com JS puro](/audio-com-js-puro)\n\n[Javascript 24 de mai. de 2017 JavaScript: Apply](/javascript-apply)\n\n[Javascript 23 de mai. de 2017 Servidores Web - Um pouco mais do back-end de uma Aplicação Web](/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web)\n\n[Fundamentos 22 de mai. de 2017 Animação basica em CSS3](/animacao-basica-css3)\n\n[Javascript 22 de mai. de 2017 Request e Response](/request-e-response)\n\n[Anterior](/tag/javascript/8)9 / 16[Próxima](/tag/javascript/10)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "beatbox",
        "fundamentos",
        "nodejs",
        "algoritmos",
        "carreira",
        "ferramentas",
        "reactjs",
        "chocolatey"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/9"
      }
    },
    {
      "id": "d2d4837e3ebd5578",
      "url": "https://devpleno.com/blog/termos-de-uso/index",
      "title": "Termos de uso (Part 3)",
      "content": "## Informações enviadas pelos usuários e colaboradores\n\nQualquer material, informação, artigos ou outras comunicações que forem transmitidas, enviadas ou publicadas neste site serão considerados informação não confidencial, e qualquer violação aos direitos dos seus criadores não será de responsabilidade do DevPleno. É terminantemente proibido transmitir, trocar ou publicar, através deste website, qualquer material de cunho obsceno, difamatório ou ilegal, bem como textos ou criações de terceiros sem a autorização do autor. O DevPleno reserva-se o direito de restringir o acesso às informações enviadas por terceiros aos seus usuários.  \nO DevPleno poderá, mas não é obrigado, a monitorar, revistar e restringir o acesso a qualquer área no site onde usuários transmitem e trocam informações entre si, incluindo, mas não limitado a, salas de chat, centro de mensagens ou outros fóruns de debates, podendo retirar do ar ou retirar o acesso a qualquer destas informações ou comunicações. Porém, o DevPleno não é responsável pelo conteúdo de qualquer uma das informações trocadas entre os usuários, sejam elas lícitas ou ilícitas.\n\n## Links para sites de terceiros\n\nOs sites apontados não estão sob o controle do DevPleno que não é responsável pelo conteúdo de qualquer outro website indicado ou acessado por meio do DevPleno reserva-se o direito de eliminar qualquer link ou direcionamento a outros sites ou serviços a qualquer momento. O DevPleno não endossa firmas ou produtos indicados, acessados ou divulgados através deste website, tampouco pelos anúncios aqui publicados, reservando-se o direito de publicar este alerta em suas páginas eletrônicas sempre que considerar necessário.\n\n## Direitos autorais e propriedade intelectual",
      "keywords": [
        "devpleno",
        "informa",
        "site",
        "qualquer",
        "acesso",
        "termos",
        "servi",
        "website",
        "para",
        "direitos"
      ],
      "metadata": {
        "title": "Termos de uso",
        "date": "2017-03-14",
        "tags": "[]",
        "author": "Tulio Faria",
        "internal": "true",
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "blog/termos-de-uso/index.md"
      }
    },
    {
      "id": "d2e49795cb8fd9f4",
      "url": "https://devpleno.com/npm-e-modulos-de-terceiros",
      "title": "NPM e Módulos de Terceiros - NodeJS - DevPleno (Part 3)",
      "content": "Confira a explicação em vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NPM%20e%20M%C3%B3dulos%20de%20Terceiros%20-%20NodeJS&url=https%3A%2F%2Fdevpleno.com%2Fnpm-e-modulos-de-terceiros) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnpm-e-modulos-de-terceiros)",
      "description": "O Node já vem com um gerenciador de pacotes chamado NPM (Node Package Mananger), com o qual é possível gerenciar todas as dependências de pacotes, então el...",
      "keywords": [
        "depend",
        "string",
        "dulos",
        "isso",
        "projeto",
        "para",
        "quando",
        "node",
        "qual",
        "ncias"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/npm-e-modulos-de-terceiros"
      }
    },
    {
      "id": "d2f86b5ec0d24ae8",
      "url": "https://devpleno.com/blog/listar-arquivos-em-js/index",
      "title": "Listar arquivos em JS (async, await, promise e Promise.all) (Part 4)",
      "content": "Onde concatena essas promises de volta, isso é muito importante para conseguirmos fazer esse exercício. Se você esta vendo esse exercício e não participou do Fullstack Academy, confira a gravação das aulas no nosso [Canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww/featured).",
      "keywords": [
        "stat",
        "path",
        "paths",
        "const",
        "await",
        "readdir",
        "lista",
        "promise",
        "para",
        "arquivos"
      ],
      "metadata": {
        "title": "Listar arquivos em JS (async, await, promise e Promise.all)",
        "date": "2017-05-08",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ListarArquivos.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "blog/listar-arquivos-em-js/index.md"
      }
    },
    {
      "id": "d35595ed2a7c01cb",
      "url": "https://devpleno.com/tag/javascript/12",
      "title": "Javascript - Pagina 12 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 4 de mai. de 2017 Promisify-Node: Convertendo funções clássicas do Node em Promises](/promisify-node)\n\n[Javascript 3 de mai. de 2017 Como converter Markdown para HTML usando Marked](/converter-markdown-para-html)\n\n[Javascript 2 de mai. de 2017 Hands-on: Ferramentas visuais para Flexbox](/ferramentas-par-layouts-com-flexbox)\n\n[Javascript 2 de mai. de 2017 Hands-on: Marked](/hands-on-marked)\n\n[Javascript 28 de abr. de 2017 Javascript: Streams (P-3: Duplex)](/javascript-streams-p-3-duplex)\n\n[Javascript 28 de abr. de 2017 Javascript: Streams (P-4: Transform)](/javascript-streams-p-4-transform)\n\n[Javascript 24 de abr. de 2017 Hands-on: Low-db](/hands-low-db)\n\n[Javascript 24 de abr. de 2017 Hands-on: Faker](/hands-on-faker)\n\n[Javascript 24 de abr. de 2017 Javascript: Streams (P-1: Readable Streams)](/javascript-streams-p-1-readable-streams)\n\n[Javascript 24 de abr. de 2017 Javascript: Streams (P-2: Writable Streams)](/javascript-streams-p-2-writable-streams)\n\n[Javascript 24 de abr. de 2017 Dica: Router Props](/router-props)\n\n[Javascript 17 de abr. de 2017 Dica: Once n vezes](/dica-n-vezes)\n\n[Anterior](/tag/javascript/11)12 / 16[Próxima](/tag/javascript/13)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "streams",
        "hands",
        "ferramentas",
        "node",
        "para",
        "marked",
        "dica",
        "algoritmos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/12"
      }
    },
    {
      "id": "d369bc12f69365fe",
      "url": "https://devpleno.com/blog/aplicacao-web/index",
      "title": "Aplicação Web - Entendendo Back-end e Front-end (Part 2)",
      "content": "O lado back-end, é o lado que, se não for padronizado a WEB, continuará normal, mas já o lado do front tivemos que ter uma padronização, por esse motivo temos um número reduzido de tecnologias, ela é padronizada pelo W3C, já que ali está a maior parte dos usuários e diversidade de dispositivos que vão usar o client side para acessar o server side. Já o Server side tem a função de devolver algo padronizado para o cliente.\n\nConfira a explicação no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/EEeLl-M5YmI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "front",
        "para",
        "tecnologias",
        "server",
        "side",
        "back",
        "lado",
        "temos",
        "devpleno",
        "https"
      ],
      "metadata": {
        "title": "Aplicação Web - Entendendo Back-end e Front-end",
        "date": "2017-05-12",
        "tags": "['Fundamentos']",
        "thumbnail": "APLICAÇÃO-WEB-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/aplicacao-web/index.md"
      }
    },
    {
      "id": "d3b59686096e1c86",
      "url": "https://devpleno.com/blog/na-toptal-ou-por-meio-da-toptal/index",
      "title": "Trabalhar na Toptal ou por meio da Toptal?",
      "content": "Qual a diferença de trabalhar na Toptal e por meio da Toptal? Sim, existe diferença! Entenda tudo que precisa saber neste vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/7jcWMc712Wc\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\nSaiba mais em [https://go.devpleno.com/fsm/](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)\n\n[![Curso DevReactJS](DevReact.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "https",
        "devpleno",
        "embed",
        "blog",
        "toptal",
        "responsive",
        "mais",
        "profissionais",
        "diferen",
        "classname"
      ],
      "metadata": {
        "title": "Trabalhar na Toptal ou por meio da Toptal?",
        "date": "2018-02-09",
        "tags": "['Carreira']",
        "thumbnail": "NaOuMeioToptal.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/na-toptal-ou-por-meio-da-toptal/index.md"
      }
    },
    {
      "id": "d3fbc67ba2f6c6e4",
      "url": "https://devpleno.com/como-publicar-seu-site-no-github",
      "title": "GH-Pages e como publicar seu site no Github - DevPleno (Part 1)",
      "content": "Javascript\n\n## GH-Pages e como publicar seu site no Github\n\nT\nPor Tulio Faria • 6 de outubro de 2017\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nHoje quero mostrar para vocês como a gente pode postar o nosso site no GitHub utilizando o GH-Pages, sem precisar trocar ou fazer qualquer trâmite com o Git, tudo isso de uma maneira bastante fácil. Além disso, integrar isso em um WorkFlow ou em um processo junto no Node.\n\nA primeira coisa que vou fazer é criar um repositório chamado gh-pages-teste só para termos um lugar para testar. Vou deixar de forma pública:\n\nAgora vamos no SHELL e dar um create-react-app apenas para criar uma aplicação em React, que vai ser nosso site. Lembrando que não é necessário ser em React, é apenas para mostrar como a gente poderia criar algo estático e hospedar dentro do GitHub.\n\nUma coisa bastante interessante: o Git permite que a gente mantenha um site estático, basta colocar os arquivos estáticos dentro de um branch chamado GH-Pages, feito isso ele já vai conseguir manter o nosso site.\n\nAgora vou abrir o visual studio code e vamos trocar apenas o que está escrito no App.js, ao invés de Welcome, vou colocar GH-Pages DevPleno.\n\nAgora um detalhe, se no próprio React dermos um yarn build ou npm run build, ele vai gerar os arquivos compilados dentro do diretório build que já tem nosso site todo, agora temos que colocar esses arquivos dentro do Branch do GH-Pages.\n\nFeito isso vamos dar um git init no shell e adicionar os arquivos, lembrando que já iniciamos o repositório:\n\nVamos também dar um git remote add origin e add o ssh que no meu caso é:\n\nTambém vamos adicionar o upstream:\n\nFeito isso ele subiu, então temos nosso fonte do master. Agora temos que fazer uma forma de criar um brait novo para colocar o site lá. Para isso vamos fazer o seguinte:\n\nyarn add --dev gh-pages\nEstamos instalando esse módulo que consegue fazer isso para nós. Depois de instalado vamos construir o diretório que eu quero colocar os arquivos:",
      "description": "Hoje quero mostrar para vocês como a gente pode postar o nosso site no GitHub utilizando o GHPages, sem precisar trocar ou fazer qualquer trâmite com o Git...",
      "keywords": [
        "pages",
        "site",
        "para",
        "isso",
        "vamos",
        "github",
        "agora",
        "https",
        "nosso",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/como-publicar-seu-site-no-github"
      }
    },
    {
      "id": "d425037c06b29f10",
      "url": "https://devpleno.com/blog/float-e-precisao/index",
      "title": "Float e precisão (Part 1)",
      "content": "Hoje quero dar uma dica e também mostrar um problema que acontece em várias linguagens que é quanto à precisão de número 'quebrados' ou Float. Esse problema em específico já caiu em uma entrevista de emprego que eu fiz.\n\nMe passaram um caso de teste e infelizmente eu não lembro exatamente como foi, mas eu vou mostrar como podemos resolver isso de uma forma interessante.\n\nPrimeiramente vou mostrar qual o problema que nós temos com precisão de números float, tanto em Node quanto em outras linguagens. Vamos supor que temos a seguinte situação:\n\n```jsx\nconst num1 = 0.1\n\nconst num2 = 0.2\n\nconst num3 = num1 + num2\n```\n\nAo darmos o console.log no num3 reparem o número que nós temos: ![Visualizando o terminal](screen.png) Essa sujeira atrapalha tudo que vamos fazer. Lembrando que essa sujeira vem da conversão para binário e esses números acabam se atrapalhando.\n\nQual a solução para isso? Quando temos números monetários, como preço ou algo nesse sentido, nós tentamos tratar esses números como inteiro, por exemplo, no caso de um banco que fizemos o sistema, eles precisavam de cinco casas decimais de precisão, então nós multiplicávamos isso por 100000 e em seguida dividíamos\n\n```jsx\nconst precisao = 100\n\nconst num1 = parseInt(0.1 * precisao)\n\nconst num2 = parseInt(0.2 * precisao)\n```\n\nA regra é multiplicar pelo número de casas decimais que queremos e converter em seguida para inteiro, depois fazemos a conta com inteiros, já que ele não tem esse problema. Depois disso, quando formos retornar o valor, nós dividimos pela precisão:\n\n```jsx\nconst num3 = ((num1 + num2) / precisao).toFixed(2)\n```\n\nObviamente, depois precisamos fazer mais um tratamento porque ele volta a ficar sujo, então precisamos fixar, por exemplo, com 2 zeros depois da vírgula.",
      "keywords": [
        "const",
        "problema",
        "para",
        "precis",
        "como",
        "temos",
        "esse",
        "meros",
        "vamos",
        "num1"
      ],
      "metadata": {
        "title": "Float e precisão",
        "date": "2017-07-28",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "FLOAT-E-PRECISAO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/float-e-precisao/index.md"
      }
    },
    {
      "id": "d43af0b51a61856c",
      "url": "https://devpleno.com/blog/10-dicas-de-produtividade-para-programadores/index",
      "title": "10 dicas de produtividade para programadores (Part 3)",
      "content": "A qualidade do código está diretamente relacionada à produtividade do desenvolvedor. Com o [SonarQube](https://www.sonarqube.org?utm_source=blog&utm_campaign=rc_blogpost), por exemplo, é possível analisar a qualidade do código em mais de 40 [linguagens](https://www.devpleno.com/quantas-linguagens-programar?utm_source=blog&utm_campaign=rc_blogpost), como PHP, Java, Javascript, Python, C#, C/C++, entre outros. Outra possibilidade é utilizar algum módulo, como o [StandardJS](https://www.devpleno.com/standard-parte-1?utm_source=blog&utm_campaign=rc_blogpost).\n\n## 2\\. Aposte nos atalhos e _snippets_\n\nAtalhos, _snippets_ e templates (partes de código já prontas e com lacunas a serem preenchidas) ajudam o desenvolvedor que precisa lidar com instruções, trechos, blocos e partes de código-fonte. É interessante, ainda, personalizar atalhos complexos — que vão além daqueles disponíveis no sistema operacional.\n\n## 3\\. Hardware\n\nAlgumas soluções de _hardware_ podem melhorar a produtividade. É o caso dos múltiplos monitores e dos mouses com botões programáveis, que podem reduzir o tempo necessário para a execução das tarefas. Além disso, existem aplicações que modificam o _desktop_ para torná-lo mais eficiente.\n\n## 4\\. Conforto para o cérebro\n\nOutra dica importante para aumentar a sua [produtividade](https://www.youtube.com/watch?v=6Dx0abJtNvY&utm_source=blog&utm_campaign=rc_blogpost) tem a ver com o bem-estar mental. O desenvolvimento de *software *é uma atividade que demanda bastante do cérebro do programador, pois envolve raciocínio lógico e concentração.\n\nAlém disso, a preocupação com os prazos e a necessidade de estar sempre atento às novidades do mercado acabam causando estresse. Por isso, é muito importante procurar manter o seu cérebro confortável e motivado. Ações simples podem ajudar:\n\n### Plantas",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "para",
        "produtividade",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "title": "10 dicas de produtividade para programadores",
        "date": "2017-07-24",
        "tags": "['Carreira']",
        "thumbnail": "106696-10-dicas-de-produtividade-para-programadores-790x400.jpg",
        "author": "Tulio Faria",
        "revisor": "['Renato Siqueira']",
        "chunkIndex": 2,
        "totalChunks": 6,
        "sourcePath": "blog/10-dicas-de-produtividade-para-programadores/index.md"
      }
    },
    {
      "id": "d4786c7d74822663",
      "url": "https://devpleno.com/blog/hands-on-standard/index",
      "title": "Hands-on: Standard",
      "content": "Neste Hands-on, vou falar sobre um módulo da NPM, o Standard, com o qual você pode padronize o código fonte JavaScript da sua equipe.\n\nConfira os detalhes nos vídeos:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/vZNbbRgIBo8\" allowfullscreen></iframe>\n</div>\n\n<div className=\"embed-responsive embed-responsive-16by9\" style={{ marginTop: 30 }}>\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ISVp1mlB1BA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "classname",
        "iframe",
        "https",
        "youtube",
        "16by9",
        "item",
        "allowfullscreen",
        "devpleno"
      ],
      "metadata": {
        "title": "Hands-on: Standard",
        "date": "2017-03-03",
        "tags": "['Javascript']",
        "thumbnail": "Standard.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-standard/index.md"
      }
    },
    {
      "id": "d4903190c6cb3565",
      "url": "https://devpleno.com/fsm-reservar",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsm-reservar to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "reservar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsm-reservar"
      }
    },
    {
      "id": "d4cdaf5359688702",
      "url": "https://devpleno.com/fullstacklab-fbad",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstacklab-fbad to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstacklab",
        "fbad"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstacklab-fbad"
      }
    },
    {
      "id": "d5528e6c014b9395",
      "url": "https://devpleno.com/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica",
      "title": "Por que fazer um curso de programação voltado para a prática? - DevPleno (Part 5)",
      "content": "## Para conhecer ferramentas de configuração do ambiente de desenvolvimento\n\nPara que uma linguagem seja usada, normalmente são necessários sistemas que dão suporte ao seu funcionamento, como drivers e bibliotecas para que possam se integrar a outros tipos tecnologias.\n\nQuer um exemplo? O desenvolvimento de aplicações web completas com Javascript pode ser acelerado e feito como mais qualidade us",
      "description": "A área de tecnologia da informação oferece muitas oportunidades e, para aproveitálas, o profissional deve se preparar continuamente. Para tanto, o desenvol...",
      "keywords": [
        "para",
        "como",
        "projeto",
        "https",
        "source",
        "blog",
        "campaign",
        "blogpost",
        "mais",
        "desenvolvimento"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica"
      }
    },
    {
      "id": "d560702768016ec5",
      "url": "https://devpleno.com/blog/hands-injecao-de-dependencia-e-bom-mesmo/index",
      "title": "Hands-on: Injeção de Dependência é bom mesmo?",
      "content": "Muitas pessoas ainda me perguntam se injeção de dependência é realmente bom. Você também ainda não está convencido sobre isso? Neste vídeo, crio um mock e um teste com injeção de dependência para te convencer ainda mais sobre a importância desta técnica.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/sCt69a0i4WE\" allowfullscreen></iframe>\n</div>\n\nNão esqueça de curtir o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "ainda",
        "ncia",
        "responsive",
        "https",
        "inje",
        "depend",
        "sobre",
        "para",
        "classname"
      ],
      "metadata": {
        "title": "Hands-on: Injeção de Dependência é bom mesmo?",
        "date": "2017-04-17",
        "tags": "['Javascript']",
        "thumbnail": "InjecaoDeDependencia.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-injecao-de-dependencia-e-bom-mesmo/index.md"
      }
    },
    {
      "id": "d5c6f78ff3b673a6",
      "url": "https://devpleno.com/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! - DevPleno (Part 3)",
      "content": "**As equipes ficam mais produtivas (e criativas):** sem os bloqueios causados por excesso de papelada, necessidade de projetar um programa inteiro sozinho ou ferramentas de uso obrigatório, a equipe pode criar e produzir da forma que gosta.\n\n**Melhorias na comunicação:** que tal chamar o cliente para uma conversa? O trabalho dividido em ciclos permite testar e apresentar cada pedaço do projeto, melhorando o entendimento do que o cliente quer e facilitando o trabalho da equipe de TI.\n\n**Melhor definição do objetivo:** com a redução na burocracia, sem linguagem rebuscada e com definição de cada etapa dos trabalhos é muito mais fácil ter um objetivo final definido, e cumprir isso.\n\n**Melhor atendimento ao cliente:** além de um software feito na medida, o cliente também recebe um ótimo tratamento da equipe de TI, que tem um contato próximo durante os trabalhos.\n\n## Quais são as metodologias ágeis que existem?\n\nE, no final das contas, que metodologias ágeis existem?\n\nNa realidade existem centenas de métodos ágeis e cada um deles tem N variações. Isso significa que é quase impossível listar todos em um único texto, ainda mais sem que fique cansativo. Assim, nós separamos aqui os 5 mais utilizados para o desenvolvimento de softwares para você ter exemplos. Dá só uma olhada!\n\n### 1. Feature Driven Development (FDD)\n\nO FDD é uma metodologia focada em funcionalidades. Por considerar o todo maior que a soma das partes, primeiro analisa-se o projeto inteiro, depois divide-se em partes e, então, divide-se as áreas a serem modeladas (funcionalidades).\n\n### 2. eXtreme Programming (XP)\n\nO método XP é orientado por três bases: agilidade, economia e qualidade. Assim, uma equipe que utiliza o XP baseia-se em valores comportamentais que pautam seu trabalho — aqui entram questões como comunicação, simplicidade, feedback etc.\n\n### 3. Microsoft Solutions Framework (MSF)",
      "description": "Nascidas nos anos 80, só vieram a ficar conhecidas depois dos anos 2000. Muito comuns no desenvolvimento de softwares, essas ferramentas ganharam espaço em...",
      "keywords": [
        "mais",
        "metodologia",
        "para",
        "geis",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 5,
        "sourcePath": "/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores"
      }
    },
    {
      "id": "d5ca93de43e399e2",
      "url": "https://devpleno.com/tag/javascript/3",
      "title": "Javascript - Pagina 3 - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)\n\n[Javascript 6 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)\n\n[Javascript 6 de out. de 2017 As vantagens do Javascript em todas as camadas de uma aplicação](/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao)\n\n[Javascript 5 de out. de 2017 Navigator Geolocation API - Sabendo a localização do usuário](/navigator-geolocation)\n\n[Javascript 5 de out. de 2017 Dicas utilizando o Split em Strings](/split-em-strings)\n\n[Javascript 3 de out. de 2017 Promise Constante - como criar situações assíncronas de teste](/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste)\n\n[Javascript 2 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)\n\n[Javascript 26 de set. de 2017 Promise Race - Qual promise resolve/rejeita primeiro](/promise-race)\n\n[Javascript 22 de set. de 2017 Gerando HTML estáticos a partir de templates – EJS](/html-estatico-com-templates-ejs)\n\n[Javascript 21 de set. de 2017 Diferença entre as programações Orientação-objetos, Imperativa e Funcional](/orientacao-objetos-imperativa-e-funcional)\n\n[Javascript 19 de set. de 2017 Sou contra a orientação-objetos (OO)?](/orientacao-objeto)\n\n[Javascript 11 de set. de 2017 Dica: Debug NodeJS com Chrome DevTools](/dica-debug-nodejs-com-chrome-devtools)\n\n[Anterior](/tag/javascript/2)3 / 16[Próxima](/tag/javascript/4)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "promise",
        "nodejs",
        "como",
        "objetos",
        "algoritmos",
        "carreira",
        "ferramentas",
        "fundamentos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript/3"
      }
    },
    {
      "id": "d5e385324005bf3b",
      "url": "https://devpleno.com/como-gerar-um-array-populado-em-javascript",
      "title": "Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos - DevPleno (Part 2)",
      "content": "const array = new Array(15).fill('valor')\n// array = [\"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\", \"valor\"]\nUma observação importante é que o método fill usa a mesma referência. Ou seja, se passarmos um objeto como valor no fill, todos os itens do vetor referenciarão o mesmo objeto. E caso alteramos um deles, iremos alterar todos.\n\nconst people = new Array(3).fill({ name: 'Person' })\npeople[0].name = 'Changed Person'\n/*\npeople =\n0: {name: \"Changed Person\"}\n1: {name: \"Changed Person\"}\n2: {name: \"Changed Person\"}\n*/\nExiste uma forma de mudar ligeiramente este comportamento, bastando para isso conectar o fill com um map (lembrando que map transforma um vetor em outro).\n\nconst people = new Array(3).fill(null).map(() => ({ name: 'Person' }))\npeople[0].name = 'Changed Person'\n/*\npeople =\n0: {name: \"Changed Person\"}\n1: {name: \"Person\"}\n2: {name: \"Person\"}\n*/\n\n## Array.from\n\nUma outra forma de criar um array é usando o Array.from. Esta versão é bastante simples:\n\nconst array = Array.from({ length: 5 }, () => 1)\n// array = [1, 1, 1, 1, 1]\nconst people = Array.from({ length: 3 }, () => ({ name: 'Person' }))\n/*\npeople =\n0: {name: \"Person\"}\n1: {name: \"Person\"}\n2: {name: \"Person\"}\n*/\n\n## Usando o Object.keys\n\nUma forma bastante interessante de gerar um array preenchido com números é usando uma característica de objetos (sim, objetos). Usaremos o Object.keys.\n\nconst numbers = Object.keys(new Array(5).fill(null))\n// numbers = [\"0\", \"1\", \"2\", \"3\", \"4\"]\nRepare que os números que foram inseridos no array estão com string. Podemos usar um map para convertê-los:\n\nconst numbers = Object.keys(new Array(5).fill(null)).map(Number)\n// numbers = [0, 1, 2, 3, 4]\nBom é isso :) O que gostou destas formas de gerar um vetor? Qual a sua forma favorita?",
      "description": "Aprenda 5 formas de gerar arrays populados em JavaScript: Array.from, fill, spread, map e mais. Exemplos práticos para copiar e usar.",
      "keywords": [
        "name",
        "array",
        "valor",
        "person",
        "const",
        "fill",
        "javascript",
        "gerar",
        "people",
        "forma"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/como-gerar-um-array-populado-em-javascript"
      }
    },
    {
      "id": "d5e8ff1ad6e55f5b",
      "url": "https://devpleno.com/blog/20",
      "title": "Blog - Página 20 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 8 de mai. de 2017 Racionalização: Tomando decisões racionais](/racionalizacao)\n\n[Javascript 8 de mai. de 2017 Hands-on: Streams - Parte 1](/streams-parte-1)\n\n[Javascript 5 de mai. de 2017 ES6 - Async/Await](/async-await)\n\n[Javascript 5 de mai. de 2017 Ferramentas Visuais para Flexbox](/ferramentas-visuais-para-flexbox)\n\n[Javascript 5 de mai. de 2017 Testando o Spread Operator: Novidade do ES6](/spread-operator)\n\n[Javascript 4 de mai. de 2017 Promisify-Node: Convertendo funções clássicas do Node em Promises](/promisify-node)\n\n[Carreira 3 de mai. de 2017 Como ser MUITO mais produtivo?](/como-ser-muito-mais-produtivo)\n\n[Javascript 3 de mai. de 2017 Como converter Markdown para HTML usando Marked](/converter-markdown-para-html)\n\n[Carreira 2 de mai. de 2017 Carreira: Preço que tem que ser pago](/carreira-preco-que-tem-que-ser-pago)\n\n[Javascript 2 de mai. de 2017 Hands-on: Ferramentas visuais para Flexbox](/ferramentas-par-layouts-com-flexbox)\n\n[Javascript 2 de mai. de 2017 Hands-on: Marked](/hands-on-marked)\n\n[Javascript 28 de abr. de 2017 Javascript: Streams (P-3: Duplex)](/javascript-streams-p-3-duplex)\n\n[Anterior](/blog/19)20 / 26[Próxima](/blog/21)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "carreira",
        "para",
        "ferramentas",
        "hands",
        "streams",
        "flexbox",
        "blog",
        "visuais"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/20"
      }
    },
    {
      "id": "d5eaf037f68436a1",
      "url": "https://devpleno.com/promise-race",
      "title": "Promise Race - Qual promise resolve/rejeita primeiro - DevPleno",
      "content": "Javascript\n\n## Promise Race - Qual promise resolve/rejeita primeiro\n\nT\nPor Tulio Faria • 26 de setembro de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje quero mostrar uma funcionalidade que chamada Promise.race. Ela vai receber uma lista de promises no JavaScript e ele vai retornar apenas uma dessas promise: a que rejeitar ou resolver primeiro. Vamos criar uma função que é uma promise:\n\nconst p = (time, name) => {\nreturn new Promise((resolve, reject) => {\nsetTimeOut(() => resolve(time + ' ' + name), time)\n})\n}\np(100, 'opa').then((e) => console.log(e))\nAo rodar esse código, ele retorna opa depois de 100ms. Agora vamos criar uma lista chamada de OS, e dentro dela faremos uma lista de promises:\n\nconst os = [P(100, 'opa'), P(200, 'opa2')]\nPromise.race(os).then((e) => console.log(e))\nAo rodar, vai trazer a primeira promise, isso não quer dizer que ele pare a operação do outro. Ele continua executando, porém não retorna para o resultado, mesmo se rejeitarmos. Obviamente é o contrário do Promise.all, que é quando retornamos todos:\n\nPromise.all(os).then((e) => console.log(e))\nAssim vamos ter todos os retornos, ao contrário do race.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Promise%20Race%20-%20Qual%20promise%20resolve%2Frejeita%20primeiro&url=https%3A%2F%2Fdevpleno.com%2Fpromise-race) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpromise-race)",
      "description": "Hoje quero mostrar uma funcionalidade que chamada Promise.race. Ela vai receber uma lista de promises no JavaScript e ele vai retornar apenas uma dessas pr...",
      "keywords": [
        "promise",
        "race",
        "https",
        "javascript",
        "resolve",
        "lista",
        "vamos",
        "time",
        "then",
        "console"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/promise-race"
      }
    },
    {
      "id": "d5fa5a5e9bc13d9b",
      "url": "https://devpleno.com/blog/registros-do-mysql-no-nodejs/index",
      "title": "[SEGREDO] Muitos registros do MySQL no NodeJS (Part 2)",
      "content": "A query tem algo bem interessante; ela mostra que algum resultado chegou no Stream porque quando fazemos essa consulta, ela é muito pesada, então trará linha a linha. Perceba que à medida que ele for recebendo de forma assíncrona, a gente vai processando os registros e isso é muito mais performático do que tentar usar o callback como estávamos fazendo antes.\n\nImagine, por exemplo, que temos algum arquivo que não fosse executado de primeira:\n\n```jsx\nquery.on('result', (row) => {\n  setTimeout(() => {\n    console.log(row)\n  }, 300)\n})\n```\n\nQuando trazemos esse resultado, travaremos o Stream (lembrando que o Node é mono-thread), então enquanto eu estiver processando, ele vai ter várias coisas pendentes e corre o risco de ser mais rápido trazer da rede do que processar. Temos que falar para o driver do MySQL segurar:\n\n```jsx\nquery.on('result', (row) => {\n  connection.pause()\n  setTimeout(() => {\n    console.log(row)\n    connection.resume()\n  }, 300)\n})\n```\n\nAssim vamos conseguir controlar esse fluxo de dados e podemos processar grandes quantidades de registros sem ter problema com memória. Outra coisa que podemos fazer é o seguinte: terminou de processar, pode finalizar a conexão:\n\n```jsx\n  ...\n    },300)\n})\nquery.on('end', () => connection.end())\n```\n\nÉ muito interessante utilizarmos essa query como um eventStream, ele vai enviando eventos e pausa a conexão, restabelecendo ela para continuar mandando dados sempre que estiver fazendo esse processamento dos dados, assim evitamos trazer todos os registros para memória de uma vez.\n\nSe você for fazer processo em lote, que é muito pesado, deixe os 'console.log' somente para debug porque ele também é pesado. Pensando em escala, você perde alguns mili segundos sempre que o faz. Outra coisa: se o processamento é muito lento, limite enquanto está testando:\n\n```jsx\nconst query = connection.query('select * from pessoas limit 100')\n```\n\nObviamente que não elimina você ter que testar, mas já ajuda a agilizar seus testes de começo.",
      "keywords": [
        "query",
        "para",
        "connection",
        "console",
        "fazer",
        "mysql",
        "dados",
        "muito",
        "coisa",
        "isso"
      ],
      "metadata": {
        "title": "[SEGREDO] Muitos registros do MySQL no NodeJS",
        "date": "2017-08-18",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "RegistrosMYSQL.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/registros-do-mysql-no-nodejs/index.md"
      }
    },
    {
      "id": "d626258688cb49c6",
      "url": "https://devpleno.com/hands-on-reactjs-materiaisdeapoio",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /hands-on-reactjs-materiaisdeapoio to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "https",
        "devpleno",
        "devreactjs",
        "redirecting",
        "from",
        "hands",
        "reactjs",
        "materiaisdeapoio"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-on-reactjs-materiaisdeapoio"
      }
    },
    {
      "id": "d68e60d08fd75540",
      "url": "https://devpleno.com/blog/como-criar-e-reutilizando-seus-proprios-modulos/index",
      "title": "Como criar e reutilizar seus módulos no NodeJS com Git (Part 1)",
      "content": "Hoje quero mostrar um recurso que nós temos na ferramenta NPM e que poucas pessoas sabem que existem. Com ela, podemos criar nossos próprios módulos sem precisar registrar no repositório do NPM.\n\nUma coisa interessante do yarn e NPM é que podemos colocar como dependência do nosso projeto um repositório GIT, inclusive um commit específico ou tag especifica.\n\nQual a vantagem dessa situação?\n\nMuita gente não utiliza reaproveitamento de código, nem cria seus próprios módulos e bibliotecas porque não tem como compartilhar isso de forma privada. Aqui vamos fazer um exemplo utilizando o repositório do Github.\n\nNós poderíamos utilizar um repositório privado desde que, na máquina que estiver utilizando, esse repositório tivéssemos uma chave para baixar essa dependência.\n\nPara simplificar esse processo, vou criar um repositório novo e deixar inicializando com o README e dar um create repository:\n\n![Criando Repositório](de7951f6-bdba-4379-a42b-0b480929ba55.png)\n\nEle vai conter meu código e que vai ser compartilhado com outros projetos. Primeiramente vamos copiar o link que ele nos gera:\n\n![Copiando Url](d0051514-24c8-46c2-a57e-c0a945565281.png)\n\nVamos agora clonar na máquina. Como ela já está com o tortoise git e a chave atrelada, então eu consigo dar um ok e ele já baixa.\n\nAgora eu posso ir para minha pasta e dar um NPM init nessa pasta para iniciar meu módulo.\n\nCom o package.json aberto, o mais importante é o arquivo main, ele é o que vai ser nosso arquivo principal, ou seja, o ponto de entrada do nosso módulo.\n\nVamos criar então um index.js e exportar uma função que retorna uma string:\n\n```jsx\nmodule.exports = function (str) {\n  return str + ' - DevPleno!'\n}\n```",
      "keywords": [
        "reposit",
        "vamos",
        "para",
        "criar",
        "podemos",
        "como",
        "agora",
        "embed",
        "depend",
        "ncia"
      ],
      "metadata": {
        "title": "Como criar e reutilizar seus módulos no NodeJS com Git",
        "date": "2017-11-29",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "criar-e-reutilizar-seus-próprios-módulos-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/como-criar-e-reutilizando-seus-proprios-modulos/index.md"
      }
    },
    {
      "id": "d69c1762e4b73031",
      "url": "https://devpleno.com/minicurso-socket-io-parte-5",
      "title": "Minicurso Socketio - Parte 05 - Colocando o projeto no ar - DevPleno (Part 2)",
      "content": "Quando trabalhamos em escala, pensamos exatamente isso, máquinas menores, mas trabalhando juntas, com isso conseguimos ligar e desligá-las de maneira mais satisfatória, então se você tiver um pico de acesso é possível aumentar o número de máquinas e diminuir caso caia o número de acesso.\n\nEm seguida, escolhemos qual a região que queremos, eles não têm na América do Sul, então obviamente eu deixo no padrão de New York, não mexo em mais nada, apenas ativo o monitoramento.\n\nE no nome vou colocar placar-online.\n\nEm seguida vou dar um Create (o legal do digital ocean é que ele é muito rápido para criar). Terminando, ele vai enviar um email com os dados do servidor, nome de usuário e senha.\n\nVamos fazer alguns testes, primeiro precisamos acessar a máquina com o ssh primeiro para poder depois enviar os arquivos, então vamos copiar o ip - no caso do Mac, a gente consegue acessar o ssh direto. No caso do Windows, vou mandar um e-mail para você de como fazemos esse acesso usando o putty.\n\nSe você estiver utilizando o comander no Windows, é possível fazer da mesma forma que vamos fazer agora.\n\nVamos lá, primeiro damos o comando:\n\nSSH root@IpDoServidor\nLembrando que é muito importante que coloquei **root@**, porque senão ele vai tentar logar com o usuário da sua máquina. Em seguida, ele pede a senha (basta só colocar a senha, ele irá pedir para trocar a senha no primeiro acesso).\n\nAgora já estou no placar online, vamos **em cd/opt/** e aqui já temos uma pasta digital ocean, vamos criar outra com **mkdir placar-online** e dar um cd nela.\n\nPor enquanto, essa parte eu vou parar por aqui e vou abrir o fileZilla que será um processo igual para os dois, tanto Mac quanto Windows e colocar o ip do meu servidor, login root e senha:",
      "description": "Chegamos à última etapa do nosso Minicurso de Socket.IO. Nessa aula, nós vamos colocar o projeto no ar para que você possa utilizálo como um projeto de por...",
      "keywords": [
        "para",
        "vamos",
        "como",
        "fazer",
        "isso",
        "quina",
        "projeto",
        "agora",
        "temos",
        "https"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/minicurso-socket-io-parte-5"
      }
    },
    {
      "id": "d6b55a7775581420",
      "url": "https://devpleno.com/pilha",
      "title": "Estruturas de Dados - Pilhas - DevPleno (Part 1)",
      "content": "Javascript\n\n## Estruturas de Dados - Pilhas\n\nT\nPor Tulio Faria • 21 de agosto de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje vamos falar um pouco sobre uma estrutura de dados que é muito comum em computação, principalmente em sua base, a Pilha. O primeiro conceito que temos que saber sobre Pilha é que ela segue o conceito de LIFO (Last In First Out), então o último que entra é o primeiro que sai. Uma coisa bem legal em JavaScript é que já temos uma Pilha naturalmente no vetor, então se fizermos, por exemplo:\n\nconst vetor = []\nvetor.push(1)\nvetor.push(2)\nconsole.log(vetor.pop())\nconsole.log(vetor)\nPercebam que quando desempilhamos ele volta o último item que foi empilhado e modifica o vetor. Agora vamos implementar isso sem precisar utilizar o vetor dessa forma, criando nossa própria implementação de stack:\n\nconst Stack = () => {\nconst data = []\nlet top = -1\n}\nComo estamos fazendo no modo funcional, não temos o this, estamos guardando apenas no próprio contexto e podemos retornar os métodos que queremos criar:\n\nconst Stack = () => {\nconst data = []\nlet top = -1\nconst push = (value) => {\ntop++\ndata[top] = value\nconsole.log(data)\n}\nreturn {\npush\n}\n}\nconst stack = Stack\nstack.push(1)\nstack.push(2)\nPerceba que ele está montando o vetor perfeitamente adicionando sempre na frente. Agora precisamos remover esse último item:\n\nconst push = (value) => {\ntop++\ndata[top] = value\nconsole.log(data)\n}\nconst pop = () => {\nif (top &#x3C; 0) {\nreturn false\n} else {\nconst itemToReturn = data[top]\ndelete data[top]\ntop--\nreturn itemToReturn\n}\n}\nreturn {\npush,\npop\n}\nconsole.log(stack.pop())\nAgora funcionou perfeitamente, ele retirou o um e deixou apenas o dois. Vamos criar um novo método chamado print para sabermos como está a estrutura:\n\nconst print = () => {\nconsole.log(data)\n}\nreturn {\npush,\npop,\nprint\n}\nPerceba que nós temos um item vazio, então ele não removeu esse item. Ao invés de utilizar o delete, podemos utilizar o splice:",
      "description": "Hoje vamos falar um pouco sobre uma estrutura de dados que é muito comum em computação, principalmente em sua base, a Pilha. O primeiro conceito que temos ...",
      "keywords": [
        "const",
        "data",
        "vetor",
        "push",
        "stack",
        "console",
        "return",
        "https",
        "pilha",
        "item"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/pilha"
      }
    },
    {
      "id": "d6f0d5e55e11081e",
      "url": "https://devpleno.com/beatbox-com-javascript",
      "title": "Como construir um beatbox com JavaScript - DevPleno (Part 2)",
      "content": "play.addEventListener('click', function(){\ntimer = setInterval(tick, (60 *1000 / bpm)\n})\n&#x3C;/script>\nAcabamos de criar uma técnica para fazer os áudios circularem. A cada interação vamos incrementar o currentAudio e quando esse currentAudio chegar em 4, ele voltará para o 0. Com isso já é possível fazer uma bateria apenas mudando o console.log por:\n\nfunction tick(){\nconst audioID = (music[(currentAudio++)%music.length]\n\nconst audio = document.getElementById(audioID)\n\naudio.play()\n}\nConseguimos tocar uma trilha, mas para a música ficar legal, podemos colocar essa trilha de uma forma diferente, por exemplo:\n\n&#x3C;script>\nconst play = constGetElementById('play')\n\nlet timer = null\n\nlet currentAudio = 0\n\nconst bpm = 90\n\nconst music = \\[\\['bumbo', 'bumbo', 'bumbo', 'bumbo', \\],\n\\['prato', 'prato-fechado', 'boca', 'caixa'\\]\n\\]\n\nfunction tick(){\nconst current = (music\\[(currentAudio++)%music\\[0\\].length\\]\n\nconst audioID1 = music\\[0\\]\\[current\\]\n\nconst audioID2 = music\\[1\\]\\[current\\]\n\nconst audio1 = document.getElementById(audioID1)\n\naudio1.play()\n\naudio1.currentTime = 0\n\nconst audio2 = document.getElementById(audioID2)\n\naudio2.play()\n\naudio2.currentTime = 0\n}\n\nplay.addEventListener('click', function(){\ntimer = setInterval(tick, (60*1000/bpm)\n})\n&#x3C;/script>\nVocê pode baixar os arquivos de áudio aqui: [Download](https://goo.gl/zHKuad)\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Como%20construir%20um%20beatbox%20com%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Fbeatbox-com-javascript) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fbeatbox-com-javascript)",
      "description": "Continuando nossos experimentos utilizando áudio no HTML (você deve ter percebido que me empolguei com este assunto), vamos mudar o exemplo do metrônomo pa...",
      "keywords": [
        "play",
        "const",
        "audio",
        "music",
        "para",
        "prato",
        "bumbo",
        "tick",
        "currentaudio",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/beatbox-com-javascript"
      }
    },
    {
      "id": "d7062648f226134d",
      "url": "https://devpleno.com/quantas-linguagens-programar",
      "title": "Quantas linguagens devo programar? - DevPleno (Part 2)",
      "content": "Sabemos que projetos simples de estudo não dão os mesmos problemas que quando colocamos em produção, então, esse processo é muito importante para o aprendizado. Quando você coloca seu software para usuários normais usarem, estão testando pra valer. Eu acredito bastante que quando fazemos isso pensamos diferente, a segurança como um todo, conexão externa e por aí vai. É por isso que uma das características que eu venho trazendo para os cursos do DevPleno é essa característica de trazer processos que usamos no mercado. O nosso curso de ReactJS traz essa bagagem porque quero trazer esse caminho das pedras, o React sozinho é muito legal, mas faltam coisas para colocar em produção, afinal essa é a última milha da experiência que precisamos. Então eu programo com várias linguagens, mas o principal é definir o critério que você vai definir se você conhece ou não essa linguagem. O meu critério é colocar ele em produção.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Quantas%20linguagens%20devo%20programar%3F&url=https%3A%2F%2Fdevpleno.com%2Fquantas-linguagens-programar) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fquantas-linguagens-programar)",
      "description": "Hoje vou começar perguntando uma coisa, quantas linguagens você sabe programar? Essa foi uma das perguntas que recebi recentemente em uma live, achei bem i...",
      "keywords": [
        "linguagens",
        "essa",
        "para",
        "programar",
        "https",
        "carreira",
        "quantas",
        "isso",
        "definir",
        "quando"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/quantas-linguagens-programar"
      }
    },
    {
      "id": "d70e2ea7486b979b",
      "url": "https://devpleno.com/blog/generators-functions/index",
      "title": "Generators Functions - o que acontece por baixo dos panos (Part 1)",
      "content": "Hoje vamos continuar falando sobre Generators Functions em JavaScript.\n\n**O que é Generator?**\n\nÉ uma função que podemos pausar ou iterar sobre ela. Já falamos sobre generators no hands-on do Módulo CO, que resolve um generator, mas hoje vamos falar como ele funciona 'por baixo dos panos' e até mesmo como o CO foi construído.\n\nA primeira coisa que temos que saber é que a sintaxe do generator é criada com uma function e um asterisco. Se fizermos isso, dizemos que é uma função generator, então é possível pausar essa função com CO, o que deixa o código mais linear:\n\n```jsx\nfunction* generator() {\n  console.log('Entrou no generator')\n}\nconst gen = generator()\n```\n\nAo executar o código, perceba que não saiu nada. Primeiro precisamos iterar sobre ele para que consigamos ter um valor, para isso criamos um:\n\n```jsx\nconst iteration = gen.next()\n```\n\nO next é muito comum em outras linguagens, nas quais temos algumas estruturas que são iteráveis. Enquanto você utilizar o .next significa que você ainda tem dados para iterar.\n\nAgora executamos para ver o que acontece novamente. Perceba que aparece a mensagem ('Entrou no generator') porque ele depende do next para entrar na primeira linha.\n\nAgora vamos fazer algo diferente:\n\n```jsx\nfunction* generator() {\n  console.log('Entrou no generator')\n  console.log('Segundo passo')\n  console.log('Penultimo passo')\n  console.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\n```\n\nEle executou tudo de uma vez. Agora vamos fazer o seguinte:\n\n```jsx\nyield 'outro valor'\n```\n\nOlha que interessante, ele parou agora no segundo passo, se eu der um console.log no iteration ele retorna um objeto com um value 'outro valor' dentro e um done: false. Ele parou e retornou esse valor, então ela é uma função que além de iterável, conseguimos ter vários retorno de valor. Se eu quisesse continuar executando, tenho que chamar novamente gen. next:",
      "keywords": [
        "generator",
        "console",
        "next",
        "const",
        "iteration",
        "function",
        "para",
        "passo",
        "value",
        "valor"
      ],
      "metadata": {
        "title": "Generators Functions - o que acontece por baixo dos panos",
        "date": "2017-06-29",
        "tags": "['Javascript']",
        "thumbnail": "GENERATORS-FUNCTIONS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/generators-functions/index.md"
      }
    },
    {
      "id": "d70ed5c095bba416",
      "url": "https://devpleno.com/blog/como-testar-dominios-localmente/index",
      "title": "Como testar domínios localmente",
      "content": "Hoje quero dar uma dica bem rapidinha de como você pode testar o seu site local com domínios válidos para sua máquina. Com isso você consegue, por exemplo, fazer um domínio que você ainda não publicou ou registrou funcionar somente na sua máquina para testes. Outra coisa bastante útil é se você precisa, no seu sistema, lidar com diferentes domínios. É possível fazer essa configuração local na sua máquina para fazer esse teste.\n\nNós vamos fazer no Mac, mas vou deixar logo o caminho do arquivo para o Linux e para o Windows:\n\n```jsx\n- Mac OS: /etc/hosts\n\n- Linux: /etc/hosts\n\n- Windows: c:\\\\windows\\\\system32\\\\drivers\\\\etc\\\\hosts\n```\n\nCom o Shell aberto vou dar um 'sudo' para fazer algo como super user, como estamos mexendo em uma configuração do sistema operacional, precisamos ser administrador para fazer isso:\n\n```jsx\nsudo nano/etc/host\n```\n\nVocê pode perceber que eu já tenho dois servers mapeando para o mesmo IP:\n\n![Dois servers no mesmo ip](4263515b-509e-402f-b953-1ee429c91daf.png)\n\nAgora podemos digitar nesse arquivo e adicionar um novo IP e mapear para o site que eu quero, por exemplo:\n\n```jsx\n127.0.0.1     devpleno.local\n```\n\nEu já tenho uma aplicação para teste rodando no localhost, vamos testar agora mudando o url:\n\n![Navegador rodando](07244a91-df89-41a3-8ca8-199506879f24.png)\n\nPerceba que ele está mapeando normalmente. Lembrando que isso não vale para máquinas externas.\n\nConfira o video:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/kh5gLNqxxeM\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "fazer",
        "embed",
        "como",
        "local",
        "quina",
        "isso",
        "windows",
        "hosts",
        "devpleno"
      ],
      "metadata": {
        "title": "Como testar domínios localmente",
        "date": "2017-09-15",
        "tags": "['Fundamentos']",
        "thumbnail": "TESTAR-DOMÍNIOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/como-testar-dominios-localmente/index.md"
      }
    },
    {
      "id": "d7165b076acde461",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-1/index",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto (Part 4)",
      "content": "Perceba que existe um parcial, que é uma técnica muito legal que ao invés de ficarmos fazendo e repetindo o cabeçalho, criamos alguns elementos que só importamos e ele já resolve esses arquivos. Então, também dentro dos arquivos de apoio, vamos copiar a pasta partials e adicionar nos arquivos de apoio. Por exemplo dentro de partials/head temos apenas os links do css e etc, isso deixa mais fácil pois vamos importar em todos os arquivos.\n\nAo atualizar, já temos dois jogos funcionando.\n\n**Como funciona esse template?**\n\nNós definimos que vamos renderizar o index enviando matches para lá, quando vamos no template existe um matches e utilizamos tudo em javaScript normal, então estamos usando um forEach para fazer essa iteração, ou seja, estou repetindo esse div várias vezes (esse div nada mais é que o template que eu criei com algumas classes).\n\nSe voltarmos ao bd, a gente percebe que existe um team-a, team-b e todos os dados dentro dele, no index puxamos esse time a e time b:\n\n```jsx\n<div class=\"text-block-5\">\n<%- match['team-a'].name %>\n<%- match['team-b'].name %>\n</div>\n```\n\nUm ponto importante é que estamos utilizando o db mapeado por índices, ou seja, pegamos o jogo na primeira posição e que depois nós poderíamos fazer com um banco de dados de verdade, linkar para uma chave primária. No link, vamos passar o indice com o parâmetro para ele saber qual o jogo que vai ter que renderizar.\n\nSe clicarmos em acompanhar agora, ele vai dar um erro, porque não encontrou, obviamente, já que não construímos essa página ainda.\n\nAgora vamos em index.js, dentro de routes, falar que queremos responder quando o entramos em match e tiver um ID nesse jogos e também vamos pegar o jogo em especifico:\n\n```jsx\nrouter.get('/match', function (req, res, next) {\n  const matches = db.get('matches').value()\n  const match = db.get('matches[' + req.params.id + ']').value()\n  res.render('match', { matches, match, id: req.param.id })\n})\n```",
      "keywords": [
        "vamos",
        "para",
        "match",
        "matches",
        "dentro",
        "views",
        "express",
        "index",
        "temos",
        "pasta"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto",
        "date": "2017-07-05",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 6,
        "sourcePath": "blog/minicurso-socket-io-parte-1/index.md"
      }
    },
    {
      "id": "d71b21bdfed1cc2d",
      "url": "https://devpleno.com/blog/falta-de-apoio/index",
      "title": "Falta de apoio (Part 1)",
      "content": "Quando estamos em uma empresa ou até mesmo fazendo projetos por conta própria, temos ideias criativas e percebemos que, quando comunicamos essas ideias para outras pessoas, não temos o apoio necessário para realizá-las\n\nImagine que você começou a planejar um aplicativo e então começa a falar para as pessoas e ninguém te apoia. O que você fazer nesse momento?\n\nA primeira coisa você precisa fazer é avaliar qual a relevância da falta de apoio por esse grupo de pessoas. Se for sua família ou amigos mais próximos, pode ser que eles estejam te protegendo de um possível fracasso, afinal, todos sabem que toda ideia corre risco de fracasso.\n\nTirando essa consideração, existe uma segunda vertente que é saber qual a relevância dessa pessoa para essa sua ideia. Vamos supor que você está fazendo um aplicativo para um mercado farmacêutico, se a pessoa que você perguntou for do mercado esportivo, a relevância é um pouco baixa, mesmo tendo que ouvir a todos. Algumas pessoas não têm o viés do assunto e acaba ponto uma opinião pessoal sobre esse determinado assunto.\n\nQuando você está em uma equipe, muitas vezes você não tem apoio pelos mesmos motivos da primeira opção: seu possível fracasso. Então a falta de apoio pode ser uma falta de relevância dessa pessoa, ou seja, ela não sabe do que se trata, ou simplesmente é uma tentativa de te proteger.\n\nTente avaliar se você comunicou corretamente o que você quer fazer, muitas vezes você está pensando em criar um projeto, mas não ficou claro da forma que explicou.Essa falta de claridade traz uma insegurança que consequentemente gera a falta de apoio, e finalmente, mesmo que você não tenha apoio para sua ideia ou projeto novo, se você conseguir levar isso adiante sozinho, aplique, porque não adianta as pessoas te apoiarem, a única coisa que isso faz é te dar motivação, mas não vai fazer por você. Vale muito a pena ter essa postura de sempre fazer independente do apoio.\n\nConfira o video:",
      "keywords": [
        "para",
        "apoio",
        "pessoas",
        "fazer",
        "falta",
        "relev",
        "ncia",
        "essa",
        "embed",
        "quando"
      ],
      "metadata": {
        "title": "Falta de apoio",
        "date": "2017-08-28",
        "tags": "['Carreira']",
        "thumbnail": "FALTA-DE-APOIO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/falta-de-apoio/index.md"
      }
    },
    {
      "id": "d784eebe690b2a36",
      "url": "https://devpleno.com/blog/javascript-streams-p-1-readable-streams/index",
      "title": "Javascript: Streams (P-1: Readable Streams)",
      "content": "Neste vídeo, um assunto bastante interessante para ser utilizado no dia-a-dia: Streams. A primeira parte fala sobre readable streams ou streams de leitura.\n\nERRA:\n\nO evento 'readable' é disparado sempre que a tem dados disponíveis, assim, poderíamos trocar o while por if (pois ele também será chamado no fim do stream).\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/PcvJm2QqSS4\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "streams",
        "responsive",
        "https",
        "para",
        "readable",
        "classname",
        "iframe",
        "youtube",
        "devpleno"
      ],
      "metadata": {
        "title": "Javascript: Streams (P-1: Readable Streams)",
        "date": "2017-04-24",
        "tags": "['Javascript']",
        "thumbnail": "JSStreamPart1.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/javascript-streams-p-1-readable-streams/index.md"
      }
    },
    {
      "id": "d7c3442f27fa5dae",
      "url": "https://devpleno.com/blog/fs-watch/index",
      "title": "FS-Watch - Checando mudanças em um arquivo-diretório (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/kJxdeJ55GOI\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "arquivo",
        "temos",
        "file",
        "checar",
        "fazer",
        "watchfile",
        "curr",
        "para",
        "podemos",
        "embed"
      ],
      "metadata": {
        "title": "FS-Watch - Checando mudanças em um arquivo-diretório",
        "date": "2017-10-17",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "FS-WATCH-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/fs-watch/index.md"
      }
    },
    {
      "id": "d7d09a7fe9d1f478",
      "url": "https://devpleno.com/dotenv-e-variaveis-de-ambiente",
      "title": "Dotenv e variáveis de ambiente no NodeJS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Dotenv e variáveis de ambiente no NodeJS\n\nT\nPor Tulio Faria • 23 de agosto de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nHoje eu tenho duas dicas, como podemos configurar uma aplicação sem precisar alterar o código fonte. Essa é uma boa prática, apesar de muita gente ainda não usar, então quero reforçar o conceito de como podemos fazer isso. A ideia é que o sistema fique immutable e que a gente construa esse artefato no sistema e se colocarmos em uma máquina de desenvolvimento, ele vira desenvolvimento, em uma máquina de produção vai virar produção, isso baseado somente em variáveis de ambiente. Como pegamos uma variável de ambiente?\n\nconsole.log(process.env.NODE_ENV)\nAo rodar, perceba que vai dar undefined, porém se fizermos:\n\nNODE_ENV=production node test.js\nvamos ter uma variável de ambiente production. Porém se rodar de novo, ele volta para undefined, então quando definimos essa variável ele carrega de forma automática qual banco conectar e qual usuário. Isso fica no ambiente e não mais na aplicação. Mas se toda vez que formos desenvolver tivermos que lembrar as informações, é bastante trabalhoso, correto? Então podemos utilizar um módulo que se chama Dotenv, onde criamos um arquivo com uma variável de ambiente que a gente quer e ele carrega automaticamente:\n\nyarn add dotenv\nJá no nosso script, vamos fazer o seguinte:\n\nrequire('dotenv').config()\nAssim carregamos o arquivo .env Agora vamos criar um arquivo na raiz do projeto chamado .env, nele vamos colocar o nome da variável que a gente quer, por exemplo:\n\nNODE_ENV = tulio\nAo rodar novamente percebam que agora vai ser retornado ‘tulio’. A ideia é que, na máquina de desenvolvimento, você vai criar o arquivo .env com todas as variáveis que você precisa para rodar na máquina e quando você colocar no servidor, vão ser colocadas essas variáveis no ambiente e não mais no arquivo. Podemos também, se ele estiver em produção, evitar que ele acesse o ambiente de desenvolvimento:",
      "description": "Hoje eu tenho duas dicas, como podemos configurar uma aplicação sem precisar alterar o código fonte. Essa é uma boa prática, apesar de muita gente ainda nã...",
      "keywords": [
        "ambiente",
        "vari",
        "dotenv",
        "desenvolvimento",
        "https",
        "node",
        "arquivo",
        "veis",
        "podemos",
        "gente"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/dotenv-e-variaveis-de-ambiente"
      }
    },
    {
      "id": "d7d1eb9262c48702",
      "url": "https://devpleno.com/formatos-de-troca-de-dados-em-aplicacoes-web",
      "title": "Vídeo sobre Formatos de troca de dados em Aplicações Web - DevPleno",
      "content": "Fundamentos\n\n## Vídeo sobre Formatos de troca de dados em Aplicações Web\n\nT\nPor Tulio Faria • 20 de julho de 2016\n\n[Fundamentos](/tag/fundamentos)\n\nNeste vídeo da série Web Basic, vou explicar sobre os formatos de troca de dados entre as camadas do front-end e back-end.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=V%C3%ADdeo%20sobre%20Formatos%20de%20troca%20de%20dados%20em%20Aplica%C3%A7%C3%B5es%20Web&url=https%3A%2F%2Fdevpleno.com%2Fformatos-de-troca-de-dados-em-aplicacoes-web) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fformatos-de-troca-de-dados-em-aplicacoes-web)",
      "description": "Neste vídeo da série Web Basic, vou explicar sobre os formatos de troca de dados entre as camadas do frontend e backend. Confira o video: <div className=&#34;e...",
      "keywords": [
        "https",
        "troca",
        "dados",
        "fundamentos",
        "sobre",
        "formatos",
        "devpleno",
        "facebook",
        "20de",
        "2fdevpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/formatos-de-troca-de-dados-em-aplicacoes-web"
      }
    },
    {
      "id": "d7f12ee3b0ba1b8f",
      "url": "https://devpleno.com/blog/promisify-node/index",
      "title": "Promisify-Node: Convertendo funções clássicas do Node em Promises (Part 2)",
      "content": "Já irá virar naturalmente uma promise, com isso posso fazer:\n\n```jsx\nfs.readFile('arquivo.js').then((data) => console.log(data.toString()))\n```\n\nConvertendo todos os métodos e funções disponíveis dentro desse módulo, de callback para promise.\n\n**Concluindo**\n\nAinda estamos usando o fs.readFile, mas em uma versão 'promisifiada' :) Isso é bastante poderoso, afinal assim podemos converter um módulo inteiro, de callback para promise utilizando generator ou async/await tranquilamente.\n\nVocê também pode conferir o passo a passo desse hands-on por vídeo:\n\n<div class=\"embed-responsive embed-responsive-16by9\">\n  <iframe class=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-Uy6Ri631H4\" allowfullscreen></iframe>\n</div>\n\nFique à vontade para deixar suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "promisify",
        "readfile",
        "para",
        "data",
        "callback",
        "arquivo",
        "node",
        "const",
        "promise",
        "vamos"
      ],
      "metadata": {
        "title": "Promisify-Node: Convertendo funções clássicas do Node em Promises",
        "date": "2017-05-04",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "PormisifyNode.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/promisify-node/index.md"
      }
    },
    {
      "id": "d7fbc8d7e14ce4c8",
      "url": "https://devpleno.com/hands-creat-react-app",
      "title": "Hands-on: Creat-React-App - DevPleno",
      "content": "Javascript\n\n## Hands-on: Creat-React-App\n\nT\nPor Tulio Faria • 9 de março de 2017\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nNeste Hands-on, testo um pacote para React, o Create-React-App.\n\nConfira:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Creat-React-App&url=https%3A%2F%2Fdevpleno.com%2Fhands-creat-react-app) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-creat-react-app)",
      "description": "Neste Handson, testo um pacote para React, o CreateReactApp. Confira: <div className=&#34;embedresponsive embedresponsive16by9&#34;   <iframe className=&#34;embedrespo...",
      "keywords": [
        "react",
        "https",
        "javascript",
        "hands",
        "creat",
        "reactjs",
        "para",
        "devpleno",
        "facebook",
        "youtube"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hands-creat-react-app"
      }
    },
    {
      "id": "d80d2f1b51c36670",
      "url": "https://devpleno.com/blog/grandes-quantidades-de-dados-com-menos-recursos/index",
      "title": "Grandes quantidades de dados com menos recursos (Part 2)",
      "content": "Perceba que ao rodar o código, ele trará os registros lentamente e fora de ordem. Estamos empilhando de forma gigantesca, gastando muita memória, porque carregamos todos os registros, fizemos um split e depois ainda mandei salvar tudo de uma vez, além do banco tendo que lidar com todas as requisições ao mesmo tempo.\n\n**Mas qual a maneira ideal de fazer isso?**\n\nDeixar que esses dados passem pelo aplicativo, nós resolvemos o que tem que resolver e vamos para o próximo.\n\nVou criar um arquivo otimizado.js para fazer da maneira correta e vou utilizar o fast-csv:\n\n```jsx\nyarn add fast-csv\n```\n\nEm seguida, no código, faremos algo um pouco diferente. Vamos importar o fast-csv e criar um readStream para a entrada e outro construtor para essa entrada:\n\n```jsx\nconst fs = require('fs')\nconst csv = require('fast-csv')\nconst entrada = fs.createReadStream('data.csv')\nconst csvStream = csv\n  .fromStream(entrada, {\n    headers: true\n  })\n  .on('data', (data) => {\n    console.log(data)\n  })\n```\n\nAgora imagine que temos a mesma função de salvar, o caminho mais interessante é passar os dados, porém, enquanto não terminarmos de salvar esses dados, não manda mais nada:\n\n```jsx\nconst fs = require('fs')\nconst csv =require('fast-csv')\nconst entrada = fs.createReadStream('data.csv')\nconst saveDB = record => {\n    return new Promise((resolve, reject) =>{\n        setTimeOut(resolve, Math.ceil(Math.random()*4000))\n    })\n}\nconst csvStream = csv.fromStream(entrada, {\n    headers: true\n}).on('data', data => {\n    csvStream.pause()\n    saveDB(data).then((){\n        console.log(data)\n        csvStream.resume\n    })\n})\n```\n\nDessa maneira, utilizando o pause, não jogamos tudo na memória para processar. Resolvido o problema no banco de dados, vamos mandar mais informações.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/apAP7IrO3Fg\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "const",
        "data",
        "para",
        "dados",
        "require",
        "contents",
        "line",
        "vamos",
        "console",
        "entrada"
      ],
      "metadata": {
        "title": "Grandes quantidades de dados com menos recursos",
        "date": "2017-10-17",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "MAIS-DADOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/grandes-quantidades-de-dados-com-menos-recursos/index.md"
      }
    },
    {
      "id": "d81cd38dfa63269f",
      "url": "https://devpleno.com/blog/clt-ou-pj/index",
      "title": "CLT ou PJ em Software - O que vale mais a pena? (Part 3)",
      "content": "Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "como",
        "empresa",
        "custo",
        "exemplo",
        "valor",
        "isso",
        "qual",
        "caso",
        "mais"
      ],
      "metadata": {
        "title": "CLT ou PJ em Software - O que vale mais a pena?",
        "date": "2017-08-30",
        "tags": "['Carreira']",
        "thumbnail": "CLT-OU-PJ-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/clt-ou-pj/index.md"
      }
    },
    {
      "id": "d8842faed0d11313",
      "url": "https://devpleno.com/reconhecimento-facial-com-js",
      "title": "Reconhecimento facial com JS - DevPleno (Part 3)",
      "content": "event.data.foEach((rect) => {\ncontext.strokeStyle = '#ff0000'\ncontext.lineWidth = 2\ncontext.strokeRect(rect.x, rect.y, rect.width, rect.height)\n})\nCom isso já conseguimos ver o reconhecimento do meu rosto. Em uma aplicação real, eu poderia, por exemplo, reconhecer o rosto, dar um freeze e cortar a imagem um pouco para cima e para os lados para ajudar no crop.\n\nAlém disso ainda podemos mostrar uma informação de onde está sendo reconhecido esse retângulo:\n\nevent.data.foEach((rect) => {\ncontext.strokeStyle = '#ff0000'\ncontext.lineWidth = 2\ncontext.strokeRect(rect.x, rect.y, rect.width, rect.height)\ncontext.fillText(\n`x: ${rect.x}`,\n`w: $:{rect.width}`,\nrect.x + rect.width + 20,\nrect.y + 20\n)\ncontext.fillText(\n`y: ${rect.y}`,\n`h: $:{rect.height}`,\nrect.x + rect.width + 20,\nrect.y + 40\n)\n})\nAssim temos a informação precisa de onde foi encontrado o nosso rosto. Poderíamos utilizar isso para fazer o crop.\n\nComo colocamos isso em um vetor, é possível reconhecer mais de um rosto no vetor, a partir disso podemos fazer, por exemplo, um sistema de tag para marcar os amigos.\n\nVeja o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Reconhecimento%20facial%20com%20JS&url=https%3A%2F%2Fdevpleno.com%2Freconhecimento-facial-com-js) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freconhecimento-facial-com-js)",
      "description": "Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.",
      "keywords": [
        "rect",
        "canvas",
        "vamos",
        "para",
        "script",
        "context",
        "video",
        "width",
        "const",
        "event"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/reconhecimento-facial-com-js"
      }
    },
    {
      "id": "d88e0ff684fe87a2",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-2/index",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO (Part 2)",
      "content": "Já em match.ejs vamos adicionar o JavaScript lá em baixo, depois de todo o footer:\n\n```jsx\n<% include partials/footer %>\n<script src=\"/js/match.js\"></script>\n```\n\nAo atualizar ele vai mostrar o alert, isso significa que está funcionando perfeitamente. Então agora vamos começar a conectar o front-end ao back-end. Voltando ao match.js, vamos retirar o alert e adicionar o seguinte:\n\n```jsx\n$(function)(){\n    const socket = io();\n})\n```\n\nAo fazer isso, se formos ao WS, perceba que ele já tentou fazer uma conexão: Como eu tenho certeza se isso está ok? Vamos fazer o seguinte teste:\n\n```jsx\n$(function)(){\n    const socket = io();\n    socket.on('connect', function(){\n        console.log('conected');\n    })\n})\n```\n\nPara vermos se ele está conectado ao servidor, voltamos em index.js e precisamos checar se ele se conectou. O problema é que preciso pegar o IO que está no arquivo anterior, o DB também está estranho porque precisamos ter um admin para criar e gerenciar esses jogos e ele vai utilizar o mesmo banco, então estamos deixando esse index muito dependente, precisamos fazer algo que a gente possa injetar o DB e o IO ali dentro.\n\nComo fazemos isso?\n\nPoderíamos em app.js ao invés de deixar o index em cima, vamos passar um pouco para baixo. Antes de importar, vamos injetar a dependência que temos do IO para ele:\n\nSe olharmos esse index, ele exporta um router, vamos fazer ele exportar também um router, mas de uma maneira diferente, vamos criar uma função indexRouter e colocar as dependências:\n\n```jsx\nfunction indexRouter(dependecies) {}\n```\n\nE lá em baixo ao invés de exportar um router vamos exportar o indexRouter:\n\n```jsx\nmodule.exports = indexRouter\n```\n\nVoltando a função que acabamos de criar, vamos tirar essa chave e colocar todas as dependencias da pagina dentro:",
      "keywords": [
        "vamos",
        "socket",
        "para",
        "index",
        "admin",
        "const",
        "criar",
        "dentro",
        "fazer",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO",
        "date": "2017-07-06",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart2.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-2/index.md"
      }
    },
    {
      "id": "d8ba4426fc929587",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-4/index",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms (Part 1)",
      "content": "Nesta etapa do nosso minicurso de Socket.IO, vamos fazer as atualizações específicas de cada jogo. Primeiro vamos fazer o gráfico da torcida se movimentar.\n\nDentro de match.ejs, vamos mudar para refletir realmente os valores da porcentagem, se olharmos as barras, vamos ver que na torcida está apenas uma barra fixa:\n\n```jsx\n<div class=\"bar-team-a\" style=\"width: 80%\"></div>\n<div class=\"bar-team-b\" style=\"width: 20%\"></div>\n```\n\nPrecisamos alterar esse valor, vamos em routes/index.js e quando pegarmos um jogo vamos calcular a porcentagem da torcida. Se pegarmos nosso banco, para cada time nós temos um **'supporters',** que é o número de pessoas que clicaram na torcida para aquele time em específico, então vamos pegar os dois times e calcular a porcentagem:\n\n```jsx\nconst supportersA = match['team-a'].supporters\nconst supportersB = match['team-b'].supporters\nconst total = supportersA + supportersB\nconst porcentagem = {\n  teamA: 50,\n  teamB: 50\n}\nif (total > 0) {\n  porcentagem.teamA = ((supportersA / total) * 100).toFixed(0)\n  porcentagem.teamB = ((supportersB / total) * 100).toFixed(0)\n}\nmatch.porcentagem = porcentagem\n```\n\nEntão temos como padrão 50/50, e se for maior que zero, o time A vai ser igual ao número de votos que o time A tem dividido pelo total e multiplicado por 100. Fizemos a mesma coisa para o time B. Por fim, enviamos o objeto porcentagem dentro de match.\n\nVoltando ao match.ejs, temos que colocar os valores lá dentro:\n\n```jsx\n<div class=\"bar-team-a\" style=\"width: <%- JSON.stringfy(match.porcentagem.teamA) %>%\"></div>\n<div class=\"bar-team-b\" style=\"width: <%- JSON.stringfy(match.porcentagem.teamB) %>%\"></div>\n```\n\nPronto, agora nossa barra está 50/50, quando eu clicar na torcida do time A, vou somar 1 e preciso retornar via Socket.IO a atualização na torcida para a barra.\n\nNos botões das torcidas, vamos colocar um ID para cada:",
      "keywords": [
        "match",
        "para",
        "supporters",
        "vamos",
        "team",
        "function",
        "video",
        "socket",
        "const",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms",
        "date": "2017-07-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 8,
        "sourcePath": "blog/minicurso-socket-io-parte-4/index.md"
      }
    },
    {
      "id": "d8c12887f69f0e7d",
      "url": "https://devpleno.com/blog/algoritmos-contar-numeros-negativos/index",
      "title": "Algoritmos: Contar números negativos",
      "content": "Continuando nossa série sobre algoritmos que caem em entrevistas e competições, neste vídeo falo sobre Contar Números Negativos, que já caiu em entrevistas da Amazon. Então fique ligado no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/eFC51WkFge4\" allowfullscreen></iframe>\n</div>\n\nconfira o codigo abaixo:\n\n```js\nconst input = [\n  [-3, -2, -1, 1],\n  [-2, 2, 3, 4],\n  [4, 5, 7, 8]\n]\n\nfunction countNegative(input) {\n  let line = 0\n  let column = input[line].length - 1\n  let count = 0\n  while (line < input.length && column >= 0) {\n    if (input[line][column] < 0) {\n      count += column + 1\n      line++\n    } else {\n      column--\n    }\n  }\n  console.log(input[line][column])\n}\n\ncountNegative(input[line][column])\n```\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "input",
        "line",
        "column",
        "embed",
        "https",
        "youtube",
        "sobre",
        "entrevistas",
        "responsive",
        "iframe"
      ],
      "metadata": {
        "title": "Algoritmos: Contar números negativos",
        "date": "2017-03-03",
        "tags": "['Algoritmos']",
        "thumbnail": "CONTAR-NÚMEROS-NEGATIVOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/algoritmos-contar-numeros-negativos/index.md"
      }
    },
    {
      "id": "d8f37856ff474f58",
      "url": "https://devpleno.com/fsm-turmarelampago",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsm-turmarelampago to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "turmarelampago"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsm-turmarelampago"
      }
    },
    {
      "id": "d91b11d2a22eead1",
      "url": "https://devpleno.com/blog/coisas-ruins-normais/index",
      "title": "Coisas ruins normais",
      "content": "Essa dica de carreira é bem rápida, mas muito importante. Uma coisa que eu vejo acontecer com frequência é o fato das pessoas acharem que certas coisas ruins são normais. Por exemplo, vamos supor que você vá colocar o seu site ou uma atualização do seu sistema no ar e aquilo demora muito tempo… Quando está muito trabalhoso de se fazer, não está bom porque deve ser natural. Imagine que você tem que lembrar uma sequência de 50 pastas para colocar o sistema no ar.\n\nSempre que você perceber algumas situações como essa, verifique se não há uma maneira melhor de fazer isso. Já aconteceu de eu entrar em algumas equipes, nas quais algumas pessoas falavam algo do tipo: “isso funciona muito bem, só precisamos fazer isso, ou aquilo e depois isso.” No fim das contas, você tinha 50 processos para fazer em cada coisa. Se você organizasse, aquilo funcionaria muito melhor. Então não ache que está tudo normal se você está tendo muito trabalho para fazer algo.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/gmNoxscFPWQ\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "muito",
        "fazer",
        "para",
        "isso",
        "embed",
        "aquilo",
        "algumas",
        "responsive",
        "https",
        "essa"
      ],
      "metadata": {
        "title": "Coisas ruins normais",
        "date": "2017-08-28",
        "tags": "['Carreira']",
        "thumbnail": "COISAS-RUINS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/coisas-ruins-normais/index.md"
      }
    },
    {
      "id": "d95093f0685b6338",
      "url": "https://devpleno.com/blog/cmder-turbine-seu-cmd-no-windows/index",
      "title": "cmder: Turbine seu cmd no Windows (Part 1)",
      "content": "Olá pessoal,\nhoje vai uma dica interessante para quem desenvolve no windows (sim, eu ainda me incluo neste grupo, mas logo logo estarei de mudança :)).\n\nEu fico bastante irritado com o cmd padrão do windows. Simplesmente porque tudo nele é meio burocrático de se fazer (aka copiar saídas, etc). Bom, resolvi então buscar uma solução, e uma das que estou utilizando atualmente e estou gostando muito é o Cmder.\n\nBom, começando pela interface:\n![Interface do Cmder](9ea5e58b-1300-45dc-9d53-8ab2f8bde11d.png)\n\nAchei muito bacana esse efeito translucido, mas além de ser só um corpinho bonito, ele realmente é muito funcional e ajuda bastante na produtividade. Alguns pontos que já me chamaram a atenção:\n\n1 – Várias abas\nBasta utilizar o atalho: Shif+Alt+1 para adicionar uma aba do CMD, ou Shit+Alt+2 para uma do PowerShell. Ah, e elas ficam todas organizadinhas na parte de baixo da interface (quem já teve que lidar com um zilhão de cmd´s abertos ao mesmo tempo no windows sabe como isso é um grande avanço).\n\n2 – Copiar e colar\nCopiar e colar no cmd padrão é bem complicadinho. Você não consegue selecionar o texto diretamente. Já no cmder basta selecionar o texto que você quer que ele já copia. Se quiser colar, basta clicar com o botão direito do mouse.\n\n3 – Cmd on esteroids\nO cmder utiliza um “enhancer” para ampliar os comandos disponíveis no shell. Inclusive com SSH, CURL, VI e grep 🙂\n\n4 – Isso é só o começo\nRecomendo vocês a entrarem nas preferências do Cmder (clicando no title com o botão direito) ou pressionando win+alt+p, e o personalizar ainda mais (aumentar a fonte entre outros). É possível também configurar como novas abas serão abertas. Vale a pena explorar 🙂\n\nEu explorei alguns destes itens, porém, só com o básico já ganhei bastante produtividade, acredito que vocês também ganharão. Até a próxima dica 😉",
      "keywords": [
        "para",
        "cmder",
        "windows",
        "bastante",
        "copiar",
        "muito",
        "interface",
        "basta",
        "colar",
        "dica"
      ],
      "metadata": {
        "title": "cmder: Turbine seu cmd no Windows",
        "date": "2016-10-13",
        "tags": "['Javascript']",
        "thumbnail": "cmder-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/cmder-turbine-seu-cmd-no-windows/index.md"
      }
    },
    {
      "id": "d99868a7a9f3f958",
      "url": "https://devpleno.com/blog/arvore-binaria-de-busca/index",
      "title": "Árvore Binária de Busca em JavaScript (Part 2)",
      "content": "insert(arvore, 9)\n\nconsole.log(arvore)\n\ninsert(arvore, 8)\n\nconsole.log(arvore)\n```\n\nO resultado será:\n\nCom o 8 agora temos 10 na raiz, 11 do lado direito, do lado esquerdo 9 e do lado esquerdo do lado esquerdo 8.\n\nCom isso conseguimos fazer o algoritmo de inserção na árvore de busca. É importante ressaltar que isso não é programação funcional, já que não estamos retornando uma nova árvore. Fiz isso apenas para mostrar que boa parte dos algoritmos que fazemos em C ou alguma linguagem que vemos na graduação utilizam a passagem por referência.\n\nConfira o passo a passo no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ewb1WUuTgRU\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "arvore",
        "insert",
        "tree",
        "rvore",
        "value",
        "console",
        "isso",
        "para",
        "valor",
        "lado"
      ],
      "metadata": {
        "title": "Árvore Binária de Busca em JavaScript",
        "date": "2017-07-03",
        "tags": "['Algoritmos']",
        "thumbnail": "Debusca.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/arvore-binaria-de-busca/index.md"
      }
    },
    {
      "id": "d9e284f6590d17b0",
      "url": "https://devpleno.com/blog/socket-io-parte1/index",
      "title": "Comunicação em tempo-real com Node e Socket.io (Part 1)",
      "content": "**O que é Socket.io e para que vamos precisar dele?**\n\nSocket.io é uma implementação em node para web socket, ou seja, uma forma de fazer comunicação em tempo real, mas mais importante que isso é sua possibilidade de fallBack. O Socket.io foi lançado há mais ou menos cinco anos e mesmo assim ele ainda continua sendo a melhor opção para comunicação em tempo real quando utilizamos o node.\n\nOutra coisa muito importante é o fato de poder integrá-lo a outros Stacks, como em uma aplicação feita em PHP, Java, etc. E o mais interessante é que é possível fazer com autenticação e tudo mais.\n\nO Socket.io também é muito fácil de escalar, como é em tempo real, o chamamos de io intensive, ou seja, acontece muito io quando estamos utilizando o mesmo.\n\n_Exemplo:_ Por algum motivo seus clientes que estão se conectando ao Socket.io não têm suporte ao web Socket, então ele vai tentar outras maneiras (não tão performáticas como AJAX). Nesta situação, o Node se destaca de outras tecnologias, pois ele suporta mais usuários.\n\nPara começarmos o projeto, devemos instalar os módulos Socket.io e o Express :\n\n```jsx\nyarn add socket.io\nyarn add express\n```\n\nFeito isso, vamos criar um arquivo (vou chamá-lo de server.js), que será nosso servidor express. Nele vamos criar a instância do socket.io e passar o http.\n\n```jsx\nconst app = require('express')()\nconst http = require('http').createServer(app)\nconst io = require('socket.io')(http)\n```\n\nVamos fazer um teste para ver se esta tudo funcionando corretamente:\n\n```jsx\nhttp.listen(3000, function () {\n  console.log('listening on port 3000')\n})\n```\n\nCom o Server respondendo corretamente, precisamos pelo menos ter um arquivo HTML para conectar ao secket.io, então vamos mandar um arquivo index apenas para ter algo para mandar ao navegador.",
      "keywords": [
        "socket",
        "para",
        "http",
        "const",
        "require",
        "vamos",
        "html",
        "express",
        "temos",
        "conex"
      ],
      "metadata": {
        "title": "Comunicação em tempo-real com Node e Socket.io",
        "date": "2017-05-11",
        "tags": "['Javascript']",
        "thumbnail": "Socket.IO1.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/socket-io-parte1/index.md"
      }
    },
    {
      "id": "da0eb2e112fdd713",
      "url": "https://devpleno.com/blog/tenha-cicatrizes/index",
      "title": "Tenha cicatrizes (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/4BNMXpyKFVg\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "mais",
        "para",
        "cicatrizes",
        "carreira",
        "construir",
        "embed",
        "isso",
        "fazer",
        "responsive",
        "https"
      ],
      "metadata": {
        "title": "Tenha cicatrizes",
        "date": "2017-09-05",
        "tags": "['Carreira']",
        "thumbnail": "Cicatrizes.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/tenha-cicatrizes/index.md"
      }
    },
    {
      "id": "da38fe7edcfe7cbd",
      "url": "https://devpleno.com/blog/claude-code-describe-session/index",
      "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos (Part 1)",
      "content": "O **describe session** é uma funcionalidade do Claude Code que permite que uma sessão descreva seu próprio contexto de forma estruturada — como se estivesse gerando um briefing para outro agente ou sessão.\n\nNa prática, você pede para o Claude explicar o que está acontecendo no projeto atual, e ele gera uma descrição completa: o que foi feito, qual é o estado atual e o que a próxima sessão precisa saber para continuar o trabalho.\n\nIsso é especialmente útil quando você trabalha com **dois ou mais projetos que precisam se comunicar**, como um back-end e um front-end separados.\n\n## Por que isso é útil ao trabalhar com múltiplos projetos\n\nQuem desenvolve com projetos separados conhece o problema: você está no projeto A e precisa que o projeto B entenda exatamente o que mudou, quais endpoints estão disponíveis ou como uma integração deve funcionar.\n\nSem o describe session, a alternativa seria:\n\n- Escrever manualmente um resumo do que foi feito\n- Copiar trechos de código entre sessões\n- Tentar explicar o contexto do zero em cada nova sessão\n\nCom o describe session, o próprio Claude gera essa passagem de contexto de forma automática e estruturada. Ele entende o projeto, sabe o que foi implementado e consegue descrever isso como outro agente faria.\n\n## Como usar na prática\n\nVeja um caso real: um **CMS** criado com Claude Code que possui um **front-end** separado fazendo a integração.\n\nO front-end começou a ter dificuldades para consumir a API do CMS. Em vez de abrir a sessão do front-end e tentar explicar tudo manualmente, o caminho foi diferente:",
      "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
      "keywords": [
        "claude",
        "para",
        "sess",
        "como",
        "session",
        "describe",
        "contexto",
        "projeto",
        "outro",
        "descri"
      ],
      "metadata": {
        "title": "Como Usar o Describe Session do Claude Code para Conectar Projetos",
        "description": "Aprenda a usar o describe session do Claude Code para passar contexto entre sessões e projetos diferentes. Guia prático com exemplo real de CMS + front-end.",
        "date": "2026-04-05",
        "tags": "['Ferramentas']",
        "thumbnail": "feature-image.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/claude-code-describe-session/index.md"
      }
    },
    {
      "id": "da5ad91f627c5b5f",
      "url": "https://devpleno.com/blog/streams-parte-1/index",
      "title": "Hands-on: Streams - Parte 1 (Part 1)",
      "content": "Olá!\n\nNeste post, vamos falar sobre Streams, um conceito utilizando em JavaScript mas que pode ser aplicado em outras linguagens. Nele temos uma grande quantidade de conteúdo para explorar.\n\n**O que é um Stream?**\n\nÉ um Fluxo de dados. Quando queremos ler um arquivo muito grande, por exemplo, ele permite que façamos um fluxo de dados na leitura deste arquivo.\n\n**Qual a vantagem de existir este fluxo de dados?**\n\nPrimeiramente isso permite lermos arquivos gigantescos e transformar os dados na medida que vamos lendo estes dados.\n\nOutra coisa interessante sobre o Stream é que podemos fazer o Pipe (uma ligação) de um Stream com outro, como por exemplo um Stream de leitura com um Stream de escrita integrando os dois de forma fluída. Isso é muito bom para trabalharmos com movimento de dados, tratando pedaços deste arquivo à medida que eu vou lendo, sem precisar colocar ele todo na memória.\n\nNo JavaScript, temos quatro tipos de Stream: Readable (leitura), Writable (escrita), Duplex(ambos os anteriores juntos) e Transform (permite transformação de dados).\n\n**Readable**\n\nPrimeiro vamos pegar um arquivo grande, por exemplo arquivo.txt e vamos ler ele com Stream. Vamos chamar o fs para ter acesso a isso.\n\n_Uma curiosidade: o Stream no Node é implementável, ou seja, quando algum módulo implementa o Stream, podemos tratá-lo da mesma forma, podendo utilizar os mesmos métodos em outros Streams._\n\n```jsx\nconst fs = require('fs')\nconst readable = sf.crateReadStream('arquivo.txt')\n```\n\nNós temos dois tipos de readable Stream: o paused mode, onde ele para e eu solicito os dados, e o flowing mode, em que a medida que ele consegue ler os arquivos já vai devolvendo os dados.\n\nPara fazermos o Flowing mode, vamos criar uma arrow function data passando o data para dentro. Lembrando que o data é um buffer, então precisamos adicionar um toString para sabermos o que tem dentro dele.",
      "keywords": [
        "readable",
        "dados",
        "arquivo",
        "stream",
        "data",
        "para",
        "vamos",
        "const",
        "exemplo",
        "isso"
      ],
      "metadata": {
        "title": "Hands-on: Streams - Parte 1",
        "date": "2017-05-08",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart1.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/streams-parte-1/index.md"
      }
    },
    {
      "id": "da881ab9c464082c",
      "url": "https://devpleno.com/generators-o-que-ha-por-baixo-dos-panos",
      "title": "Generators: O que há &quot;por baixo dos panos&quot; - DevPleno (Part 2)",
      "content": "**Se eu quiser continuar executando o que eu preciso fazer?**\n\nChamaremos novamente gen.next()\n\nfunction* generator() {\nconsole.log('entrou no generator')\nconsole.log('segundo passo')\nyield 'outro valor'\nconsole.log('penultimo')\nconsole.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\ngen.next()\nCom isso será retornado os valores em três etapas. Podemos, por exemplo, chamar uma function:\n\nfunction readFilePromise(){\nreturn new Promise((resolve, reject) => {\nsetTimeout(() => resolve(10), 2000)\n}\nfunction* generator(){\nconsole.log('entrou no generator')\nconsole.log('segundo passo')\nconst value = yield readFilePromise()\nconsole.log('penultimo' value)\nconsole.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\niteration.value.then((val) =>{\ngen.next(val)\n}\nAfinal, o que o CO faz?\n\nCom ele conseguimos transformar facilmente em uma função generica que resolva qualquer Generator. Por este motivo é interessante resolvermos com Promise, pois se fosse com o ReadFile comum não teríamos este retorno de valor.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Generators%3A%20O%20que%20h%C3%A1%20%22por%20baixo%20dos%20panos%22&url=https%3A%2F%2Fdevpleno.com%2Fgenerators-o-que-ha-por-baixo-dos-panos) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fgenerators-o-que-ha-por-baixo-dos-panos)",
      "description": "Neste post, continuo falando sobre Generatiors em javaScript e como funciona ",
      "keywords": [
        "generator",
        "console",
        "const",
        "function",
        "next",
        "iteration",
        "valor",
        "https",
        "isso",
        "entrou"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/generators-o-que-ha-por-baixo-dos-panos"
      }
    },
    {
      "id": "dab2f0b21747b444",
      "url": "https://devpleno.com/reactnative",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /reactnative to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "reactnative"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/reactnative"
      }
    },
    {
      "id": "dace4b2f0564cfe7",
      "url": "https://devpleno.com/injecao-de-dependencia-em-reactjs",
      "title": "Injeção de Dependência em ReactJS - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Inje%C3%A7%C3%A3o%20de%20Depend%C3%AAncia%20em%20ReactJS&url=https%3A%2F%2Fdevpleno.com%2Finjecao-de-dependencia-em-reactjs) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Finjecao-de-dependencia-em-reactjs)",
      "description": "Como estávamos comentando anteriormente sobre injeção de dependência, achei relevante mostrar como podemos fazer Injeção de Dependência em ReactJS. Para il...",
      "keywords": [
        "axios",
        "react",
        "import",
        "from",
        "https",
        "componente",
        "depend",
        "para",
        "fazer",
        "ncia"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/injecao-de-dependencia-em-reactjs"
      }
    },
    {
      "id": "daeb54f45a41d486",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-2/index",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO (Part 4)",
      "content": "Isso é um destructor assignment, ele cria variáveis novas a partir de propriedades das dependências. Ainda dentro da função, abaixo do const que acabamos de criar, vamos fazer o seguinte:\n\n```jsx\nio.on('connect', function (socket) {\n  console.log('a new client conected')\n})\n```\n\nUma coisa interessante do Socket.IO é que ele já tenta a conexão automaticamente.\n\nO último objetivo desta etapa é criar uma rota administrativa para que a gente consiga gerenciar esses jogos. Primeiramente vou copiar o index.js do routes e colar no mesmo diretório, em seguida vamos renomear a cópia para admin.js e no admin vou tirar esse conect que acabamos de criar. Em seguida, vamos trocar o nome da função de indexRouter para adminRouter, lembrando que ao final do código temos que exportar adminRouter também.\n\nEm app.js vamos vamos importar o admin nele:\n\n```jsx\nvar admin = require('./routes/admin')({ io: app.io, bd })\n```\n\nem seguida vamos linkar ele na aplicação:\n\n```jsx\napp.use('/admin', admin)\n```\n\nLembrando que estou apenas colocando abaixo do original, que é index. Esse use no express fala que a partir de '/' você vai rotear para index, e quando eu falo '/admin' ele vai prefixa isso, então terei /admin/ e /admin/match com o ide do jogo.\n\nApenas por curiosidade, o app.use é conhecido como middleware. Esse middleware só vai checar as rotas se são administrativas ou não se ela começar com /admin. Nós não temos o administrativo ainda, ele é um clone do administrador, vamos fazer algumas alterações. Dentro do diretório views, vamos criar uma pasta nova chamada admin. Se voltar aos arquivos de apoio, você pode perceber que dentro da pasta view tem uma pasta admin com dois layouts, copie esses dois e cole na pasta do projeto que acabamos de criar.\n\nDentro desses dois itens, vamos olhar primeiro o index, ele é igual o index anterior com a diferença que estamos importando um header diferente. Já dentro do admin, quando formos dar um render, temos que colocar admin/:",
      "keywords": [
        "vamos",
        "socket",
        "para",
        "index",
        "admin",
        "const",
        "criar",
        "dentro",
        "fazer",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO",
        "date": "2017-07-06",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart2.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "blog/minicurso-socket-io-parte-2/index.md"
      }
    },
    {
      "id": "db867bfebf6e8e4f",
      "url": "https://devpleno.com/formatos-de-troca-de-dados",
      "title": "Formatos de troca de dados em Aplicações Web - DevPleno (Part 1)",
      "content": "Fundamentos\n\n## Formatos de troca de dados em Aplicações Web\n\nT\nPor Tulio Faria • 19 de maio de 2017\n\n*\n\n[Fundamentos](/tag/fundamentos)\n\nHoje vamos continuar falando sobre arquitetura de uma aplicação WEB, mais especificamente sobre os formatos de troca de dados entre back-end e front-end. Lembrando que o Front-end envia algo ao back-end, como por exemplo um POST em /users.\n\nQuando fazemos isso, a requisição é formada por alguns componentes: O Header de requisição; O Body de requisição; Em seguida temos as respostas de ambos. Quando fazemos um post para o users, podemos passar estes dados em alguns formatos. O mais conhecido hoje em dia é o JSON, por exemplo:\n\n{\n'name' = 'tulio'\n}\nNo body da requisição, vamos mandar esta string, já no Header temos que enviar a informação para o servidor de que o que estamos enviando no body é um JSON. Temos outras formas de envio como o XML:\n\n&#x3C;user>\n&#x3C;name>tulio&#x3C;/name>\n&#x3C;/user>\n(XML era muito comum de ser utilizado antes do JSON e RESTful ficarem tão famosos).* A forma que ainda é muito comum de enviar estas strings é o URL encoded, nela vamos mandar os dados da seguinte forma no body da requisição:\n\n?name = tulio\n\nSe colocarmos mais dados:\n\n?name = Tulio &#x26; lastName = Faria.\n\nOutra forma é o mult-part form data, que diz mais ou menos assim:\n\nfield = name value\nNo header ele envia um separador outro camp = valor outro separador. Quando ele faz este multiform data, conseguimos mandar grandes quantidades de informação.\n\n**Quando isso é recomendado?** Quando estamos fazendo um Upload como enviar uma foto ou vídeo, por exemplo. Estes são os formatos que temos para troca de dados enviando do front-end para o back-end. Já a resposta do servidor pode ser retornado com um JSON, um XML, os dados como textuais e também HTML, img, PDF, CSS, etc, basicamente qualquer tipo de arquivo que quisermos do servidor para o cliente, desde que o navegador suporte isso.\n\nConfira o video:",
      "description": "Hoje vamos continuar falando sobre arquitetura de uma aplicação WEB, mais especificamente sobre os formatos de troca de dados entre backend e frontend. Lem...",
      "keywords": [
        "dados",
        "para",
        "name",
        "https",
        "formatos",
        "troca",
        "tulio",
        "quando",
        "requisi",
        "mais"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/formatos-de-troca-de-dados"
      }
    },
    {
      "id": "db964d43b7b36d74",
      "url": "https://devpleno.com/filter",
      "title": "High-order Function Filter - DevPleno (Part 2)",
      "content": "console.log(total)\nPerceba que ele não considerou um dos itens, isso acontece porque as high-order function sempre retornam um novo vetor, então quando eu passo o filtro, removo o item do vetor. Então eu estou passando um novo vetor só com o item 1 para o map, que vai multiplicar o preço pela quantidade e vai passar esse novo vetor para o reduce, que vai reduzir somando os valores.\n\nPodemos utilizar essas funções com imutabilidade porque toda vez que filtro, uso o reduce ou map, eu não estou alterando o vetor original, isso é muito importante para a programação funcional. Podemos também o seguinte:\n\nconst filtroEmEstoque = (item) => item.estoque &#x3C; item.qtd\n\nconst total = carrinho\n.filter(filtroEmEstoque)\n.map(subtotal)\n.reduce((soma, subtotal) => subtotal + soma, 0)\n\nconst semEstoque = carrinho.filter((item) => item.estoque &#x3C; item.qtd)\n\nconsole.log(total)\nA vantagem de fazermos isso é que acaba ficando cada vez mais fácil de entender, além de ser facilmente testado. Tudo isso feito com funções puras, quanto mais utilizamos essas high-order functions, mais limpo ele fica.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=High-order%20Function%20Filter&url=https%3A%2F%2Fdevpleno.com%2Ffilter) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffilter)",
      "description": "Hoje vamos de continuar falando sobre as highorder functions que podemos aplicar em um vetor em JavaScript. Nós já tínhamos feito algumas highorder functio...",
      "keywords": [
        "item",
        "estoque",
        "subtotal",
        "filter",
        "https",
        "carrinho",
        "const",
        "high",
        "order",
        "reduce"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/filter"
      }
    },
    {
      "id": "db9917263e342fe9",
      "url": "https://devpleno.com/blog/4",
      "title": "Blog - Página 4 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 10 de nov. de 2017 Entenda o que é Patternite](/patternite)\n\n[Javascript 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)\n\n[Javascript 7 de nov. de 2017 Closure Série - POO para JS](/closure-poo-para-js)\n\n[Carreira 7 de nov. de 2017 Sobreviver em um mundo de abundância](/mundo-de-abundancia)\n\n[Javascript 7 de nov. de 2017 Pegadinha #1 de entrevistas em JavaScript](/pegadinha-de-entrevistas-de-javascript)\n\n[Javascript 6 de nov. de 2017 Mono ou multi thread - POO para JS](/mono-ou-multi-thread-poo-para-js)\n\n[Carreira 27 de out. de 2017 Sobre abrir exceções e como lidar quando elas dão errado](/sobre-abrir-excecoes)\n\n[Carreira 25 de out. de 2017 Decisões baseadas apenas na questão financeira](/decisoes-baseadas-apenas-na-questao-financeira)\n\n[Javascript 25 de out. de 2017 Pare de pensar em classes! Série - POO para JS](/pare-de-pensar-em-classes)\n\n[Javascript 18 de out. de 2017 Criando um teclado com WebAudioAPI](/teclado-com-webaudioapi)\n\n[Javascript 17 de out. de 2017 FS-Watch - Checando mudanças em um arquivo-diretório](/fs-watch)\n\n[Javascript 17 de out. de 2017 Grandes quantidades de dados com menos recursos](/grandes-quantidades-de-dados-com-menos-recursos)\n\n[Anterior](/blog/3)4 / 26[Próxima](/blog/5)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "para",
        "carreira",
        "blog",
        "arquivo",
        "todos",
        "algoritmos",
        "ferramentas",
        "fundamentos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/4"
      }
    },
    {
      "id": "db9cee1f47432c22",
      "url": "https://devpleno.com/algoritmo-3n-1",
      "title": "Algoritmos: Problema 3n+1 - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Algoritmos%3A%20Problema%203n%2B1&url=https%3A%2F%2Fdevpleno.com%2Falgoritmo-3n-1) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Falgoritmo-3n-1)",
      "description": "Criando a solução em Javascript para o Problema 3n+1.Neste post continuamos a série de conteúdos sobre algoritmos. Principalmente sobre tipos de algoritmos...",
      "keywords": [
        "algoritmos",
        "https",
        "maxcycle",
        "algoritmo",
        "console",
        "problema",
        "para",
        "como",
        "mero",
        "cyclelen"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/algoritmo-3n-1"
      }
    },
    {
      "id": "dbea78a9bcad6a4a",
      "url": "https://devpleno.com/expressao-aritmetica-codefights",
      "title": "Resolvendo Expressão Aritmética do CodeFights - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Resolvendo Expressão Aritmética do CodeFights\n\nT\nPor Tulio Faria • 13 de novembro de 2017\n\n[Algoritmos](/tag/algoritmos)\n\nHoje vamos resolver um problema disponível no Code Fights, conhecido como Expressão aritmética. É bastante simples, basicamente temos um número A, B e C e temos que descobrir se existe um operador que faça A#B = C ser verdadeira, temos algumas maneiras de fazer, a primeira que eu fiz foi a seguinte:\n\nfunction arithmeticExpression(a, b, c) {\nconst ops = ['+','-','/','*']]\n\nconst op = (a, b, o) => {\nif(o === '+'){\nreturn a+b\n} else if(o === '-') {\nreturn a-b\n} else if(o === '/'){\nreturn a/b\n}\n\nreturn a*b\n}\n\nreturn ops\n.map(o =>(a, b, o)===c)\n.filter(o => o)\n.length > 0\n}\n\nconsole.log('2,3,5 = ',arithmeticExpression(2,3,5))\nEu defini uma lista de operadores e cada uma delas representado com seu próprio operador aritmético em JavaScript, em seguida criei uma arrow function que dado a, b e a operação que eu quero, ele faça a operação em si.\n\nFeito isso, peguei todas as operações e fiz um map que converte uma lista de operações para uma lista do resultado dessas operações aplicadas.\n\nTambém poderia ter feito de outra maneira, por exemplo, já que eu já tenho o operador, porque não tentar aplicar o operador sem utilizar o if? Uma das ideias seria algo nesse sentido:\n\nfunction arithmeticExpression(a, b, c) {\nconst ops = ['+','-','/','*']]\n\nconst op = (a, b, o) => eval(`a ${o} b`)\n\nreturn ops\n.map(o =>(a, b, o)===c)\n.filter(o => o)\n.length > 0\n}\n\nconsole.log('2,3,5 = ',arithmeticExpression(2,3,5))\nEsse eval converte para código em JavaScritp e executa, não é um código que tem uma segurança muito grande e é até um pouco mais lento, mas é uma possibilidade.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje vamos resolver um problema disponível no Code Fights, conhecido como Expressão aritmética. É bastante simples, basicamente temos um número A, B e C e ...",
      "keywords": [
        "return",
        "https",
        "opera",
        "operador",
        "arithmeticexpression",
        "const",
        "algoritmos",
        "aritm",
        "codefights",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/expressao-aritmetica-codefights"
      }
    },
    {
      "id": "dc5431c78d99ad11",
      "url": "https://devpleno.com/blog/codility/index",
      "title": "Codility: Como Resolver os Desafios e Passar nos Testes de Código (Part 1)",
      "content": "O Codility é uma plataforma que pode ser utilizada para treinar programação e, no caso de recrutadores, para selecionar programadores para a equipe. No meu caso. utilizei o Codility para passar em uma das provas da Toptal e já aproveitei para estudar um pouco mais sobre programação.\n\n**Vamos ao hands-on**\n\nDepois de logado no Codility, já caímos em Codility Programers, que é o ambiente para programadores. Na parte superior, temos duas abas: as Lessons e os Challenges. Lessons são as lições que ele tem sobre assuntos de programação, conceitos básicos como iterações, vetores, etc. Já Challenges, são 'competições' que podemos participar. Ele é um ambiente completo. Conseguimos rodar baseados nas entradas, desenvolver normalmente utilizando a ferramenta.\n\n**Como me preparei para a Toptal?**\n\nFui em lessons e fiz tudo que tinha para fazer, deixando tudo em 100%. Eu gosto de fazer na minha máquina depois submeter a solução, mas é possível fazer diretamente no Codility.\n\nVamos fazer um exemplo. Vou entrar em Iterations e dar o Start na lição. Vai aparecer a mensagem que eu tenho 120 minutos para concluir. Ao começar, é possível mudar de linguagem na aba superior.\n\nO problema vem escrito do lado esquerdo e temos que resolver do lado direito. Ele já cria uma função solução.\n\nConseguimos dar um run para fazermos alguns casos de teste que rodarmos diretamente pelo Codility. Temos também o submit this task, aí sim ele vai passar por todos os processos de qualidade. É preciso ficar atento ao fato de que o Codility considera a complexidade. Na lesson escolhida, por exemplo, ele espera que o pior cenário a complexidade seja O(log(N));",
      "description": "Guia prático para resolver desafios do Codility. Dicas, estratégias e exemplos de soluções para testes técnicos de programação.",
      "keywords": [
        "para",
        "codility",
        "fazer",
        "temos",
        "lessons",
        "isso",
        "tempo",
        "embed",
        "programa",
        "caso"
      ],
      "metadata": {
        "title": "Codility: Como Resolver os Desafios e Passar nos Testes de Código",
        "description": "Guia prático para resolver desafios do Codility. Dicas, estratégias e exemplos de soluções para testes técnicos de programação.",
        "date": "2017-06-07",
        "tags": "['Algoritmos', 'Javascript']",
        "thumbnail": "Codility.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/codility/index.md"
      }
    },
    {
      "id": "dc5a877045ffab36",
      "url": "https://devpleno.com/blog/como-aumentar-a-produtividade/index",
      "title": "Como aumentar a produtividade diminuindo a troca de contexto (Part 1)",
      "content": "Você sente que não está sendo tão produtivo quanto poderia? Após fazer algumas mudanças na forma como desenvolvo projetos, estou aumentando a minha produtividade.\n\nA primeira coisa que mudei foi deixar de usar o sublime e passei a usar o Visual Studio code (VScode).\n\n**Por que eu fiz isso?**\n\nO VScode tem algumas coisas integradas, que eu sei que é possível integrar no Sublime, mas achei mais interessante no próprio VScode: o modo como ele funciona o Git e como depurar códigos, por exemplo.\n\nNo Sublime, eu deixava todos os projetos abertos ao mesmo tempo, com muitas abas, já no VScode, ao invés de abrir todas as abas de todos os projetos ao mesmo tempo, passei a abrir apenas um diretório e ele se mantém da forma como abri da última vez.\n\nUma coisa que percebi foi o tempo que gastava nessa mudança de contexto, pois eu estava com todos os projetos abertos e acabava virando uma bagunça. Perdia tempo achando o contexto em que eu estava e, como eu trabalho com vários projetos simultâneos, deixava aberto e esquecia.\n\nAbrindo apenas um projeto fica muito mais fácil. No Git, ele já irá acender se tiver algo para comitar ou enviar, além de me permitir fazer isso e adicionar os arquivos que vou comitar de forma mais precisa.\n\nEntão muitas vezes uma mudança simples como essa pode nos deixar mais produtivo, afinal perdemos menos tempo nessa troca de contexto.\n\nNo meu caso demorou para eu perceber que isso reduzia minha produtividade, então comecei a trabalhar dessa forma diferente e senti uma mudança. E você, como desenvolve software hoje: como eu fazia antes ou assim como estou fazendo agora?\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/dXLLWMtXfww\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "como",
        "projetos",
        "tempo",
        "mudan",
        "forma",
        "vscode",
        "mais",
        "embed",
        "sublime",
        "isso"
      ],
      "metadata": {
        "title": "Como aumentar a produtividade diminuindo a troca de contexto",
        "date": "2017-05-23",
        "tags": "['Carreira']",
        "thumbnail": "PRODUTIVIDADE-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/como-aumentar-a-produtividade/index.md"
      }
    },
    {
      "id": "dc71a2b11e21717c",
      "url": "https://devpleno.com/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas",
      "title": "NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas - DevPleno",
      "content": "Javascript\n\n## NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas\n\nT\nPor Tulio Faria • 12 de agosto de 2016\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)\n\nNeste vídeo da série NodeJS Primeiros Passou vamos conferir um módulo que nos auxilia muito no controle de operações assíncronas/async, principalmente, quando potencialmente poderão ser executadas em cascata.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20Async%20-%20Como%20Controlar%20Opera%C3%A7%C3%B5es%20Ass%C3%ADncronas&url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-como-controlar-operacoes-assincronas) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-como-controlar-operacoes-assincronas)",
      "description": "Neste vídeo da série NodeJS Primeiros Passou vamos conferir um módulo que nos auxilia muito no controle de operações assíncronas/async, principalmente, qua...",
      "keywords": [
        "https",
        "nodejs",
        "primeiros",
        "async",
        "javascript",
        "passos",
        "como",
        "controlar",
        "opera",
        "ncronas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas"
      }
    },
    {
      "id": "dc771c83014c296a",
      "url": "https://devpleno.com/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao",
      "title": "As vantagens do Javascript em todas as camadas de uma aplicação - DevPleno (Part 1)",
      "content": "Javascript\n\n## As vantagens do Javascript em todas as camadas de uma aplicação\n\nT\nPor Tulio Faria • 6 de outubro de 2017\n\n[Javascript](/tag/javascript)\n\nAs muitas vantagens de usar JavaScript fizeram com que ela se tornasse a linguagem de programação mais popular do mundo.\n\nExtremamente versátil, o JavaScript pode até ter começado de forma tímida com foco limitado ao client-side. Mas isso mudou com a chegada do node.js em 2009: com a possibilidade de utilizar a linguagem também no server-side, cada vez mais devs defendem a utilização desta linguagem em todas as camadas de uma aplicação.\n\nNeste artigo, explicaremos melhor quais são as vantagens da utilização do JavaScript de ponta a ponta, em todas as camadas de uma aplicação.\n\n## O que são exatamente as camadas de uma aplicação?\n\nTambém chamadas de stacks, as camadas de uma aplicação são simplesmente o front-end e o back-end de uma aplicação.\n\nE no caso de uma aplicação web, o front-end é a camada que roda no navegador, ou seja, no lado do cliente, ou client-side. Em resumo, qualquer componente que é manipulado pelo usuário e utilizado para coletar sua entrada em um sistema é qualificado com front-end.\n\nJá o back-end é o server-side, ou lado do servidor. Ele recebe as entradas feitas pelo usuário no front-end, as processa e então devolve uma saída que será exibida ao usuário mais uma vez pelo front-end.\n\nExistem várias linguagens que podem ser usadas tanto no front-end quanto no back-end de uma aplicação, mas o JavaScript pode ser aplicado em ambas. E isso é o que significa utilizar a linguagem em todas as camadas de uma aplicação.\n\nUm dev full stack, ou seja, um desenvolvedor capaz de programar nas duas camadas de uma aplicação, usualmente conhecerá o JavaScript e poderá escrever seu código com essa linguagem em ambas.\n\n## O que são Node.js + Express + EJS + MongoDB?",
      "description": "As muitas vantagens de usar JavaScript fizeram com que ela se tornasse a linguagem de programação mais popular do mundo. Extremamente versátil, o JavaScrip...",
      "keywords": [
        "javascript",
        "para",
        "aplica",
        "camadas",
        "linguagem",
        "mais",
        "todas",
        "node",
        "back",
        "https"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao"
      }
    },
    {
      "id": "dc894aa8dd2a8117",
      "url": "https://devpleno.com/blog/microfone-pelo-navegador/index",
      "title": "Capturando áudio do microfone pelo Navegador (Part 1)",
      "content": "Hoje eu quero mostrar como podemos capturar um áudio do microfone pelo navegador.\n\nDa onde surgiu essa ideia?\n\nNós construímos um chat em tempo real no Curso Completo de Socket.io, que faz parte do Fullstack Master. Nele construímos um chat semelhante ao WhatsApp, onde conseguiríamos mandar uma mensagem de voz. Quero mostrar mais ou menos a ideia de como podemos capturar este áudio.\n\nPrimeiramente vamos acessar o jQuery CDN para conseguirmos copiar o link do jQuery.\n\nVamos criar um arquivo index.html bem rápido, apenas para começarmos o nosso exemplo:\n\n```jsx\n<html>\n  <body>\n    <script\n      src='https://code.jquery.com/jquery-3.2.1.slim.js'\n      integrity='sha256-tA8y0XqiwnpwmOIl3SGAcFl2RvxHjA8qp0+1uCGmRmg='\n      crossorigin='anonymous'\n    ></script>\n  </body>\n</html>\n```\n\nVou criar um script que vai dentro do próprio body, já que o que importa mesmo é o que estamos executando:\n\n```jsx\n<script>\n  $(function()\n  {navigator.mediaDevices.getUserMedia({ audio: true }).then(\n    (stream) => {\n      console.log(stream)\n    },\n    (err) => {\n      console.log(err)\n    }\n  )})\n</script>\n```\n\nQuando temos o getUserMedia, temos uma promise e essa promise pode ser resolvida tendo o stream ou tendo um erro.\n\nRepare que ao rodar o navegador ele já está capturando o áudio e foi criado um stream para isso. Se formos fazer um sistema real, ao dar erro como acesso negado, precisamos avisar o porque não funcionou:\n\n```jsx\n}, err =>{\n    $('body').append('<p>Você deve permitir o áudio</p>')\n})\n\n```\n\nEu sempre gosto de definir um mediaRecorder, assim, quando o stream for criado, é criado junto o mediaRecorder:",
      "keywords": [
        "mediarecorder",
        "para",
        "audio",
        "stream",
        "reader",
        "podemos",
        "udio",
        "script",
        "isso",
        "blob"
      ],
      "metadata": {
        "title": "Capturando áudio do microfone pelo Navegador",
        "date": "2017-11-13",
        "tags": "['Javascript']",
        "thumbnail": "Microfone.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/microfone-pelo-navegador/index.md"
      }
    },
    {
      "id": "dca762dbb34296f6",
      "url": "https://devpleno.com/stream-parte-2-writable",
      "title": "Hands-on: Streams Parte 2 - Writable - DevPleno (Part 2)",
      "content": "Percebam que quando usamos xpress, a requisição tem um Readable Stream e a saída é um Writable Stream, então já podemos imaginar que é possível criar algumas coisas no próprio xpress, isso acontece por que o xpress implementa stream.\n\nOutras comunicações que utilizam streams como socket io também seguem a mesma sintaxe. Confira o hands-on completo no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Hands-on%3A%20Streams%20Parte%202%20-%20Writable&url=https%3A%2F%2Fdevpleno.com%2Fstream-parte-2-writable) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fstream-parte-2-writable)",
      "description": "Vamos continuar falando sobre o Stream em node, mais especificamente sobre o Writable, lembrando que podemos usar estes conceitos em outras linguagens. Se ...",
      "keywords": [
        "writable",
        "stream",
        "arquivo",
        "https",
        "podemos",
        "para",
        "parte",
        "escrever",
        "como",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/stream-parte-2-writable"
      }
    },
    {
      "id": "dccb00d32f4e1bc7",
      "url": "https://devpleno.com/blog/postman-como-testar-apis/index",
      "title": "Postman - Como testar APIs - Hands-on (Part 1)",
      "content": "O Postman é uma ferramenta indispensável para o desenvolvimento de aplicativos API, principalmente Rest API, pois ele é um client para uma API em Rest. Existem outras ferramentas para isso, mas o Postman é o mais conhecido no mercado.\n\nO primeiro ponto interessante é que o Postman é uma extensão do Google Chrome, então ele segue uma tendência de aplicações que são desenvolvidas como extensões, e à medida com que elas vão tendo propriedades a mais, você pode adicionar como um aplicativo na sua máquina.\n\nPrimeiro precisamos criar uma conta para ser possível salvar links. Você vai encontrar uma tela parecida com essa:\n\n![Exemplo 1](PostmanEx1.png)\n\nComo eu já havia criado e feito alguns testes, já tem um histórico do lado, mas o seu estará vazio.\n\nPerceba que existe o History e o Collections. No Collections, há alguns exemplos de como fazer algumas requisições, como mudar o tipo de request, mas também é possível criar uma Collection nossa.\n\n![Exemplo 2](PostmanEx2.png)\n\nIsso nada mais é que um conjunto de requisições que criamos. Por exemplo, suponhamos que vou criar um projeto DevReactJS, eu crio então uma Collection e dentro da Collection é possível criar uma pasta (folder).\n\n![Exemplo 3](PostmanEx3.png)\n\nPodemos criar, por exemplo, uma pasta Users e salvar a requisição dentro.\n\nVou colocar em GET [https://httpbin.org/ip](https://httpbin.org/ip), ir em Save (ao lado de Send), Save as _(podemos dar um nome, como GetIP),_ escolher o projeto e a pasta que queremos e pronto. Note que vai ficar salvo dentro da pasta, o que é muito legal pois posso compartilhar depois, clicando em share, collection link. Assim, posso mandar o link para outra pessoa testar o sistema que estou fazendo.",
      "keywords": [
        "para",
        "exemplo",
        "criar",
        "como",
        "https",
        "poss",
        "requisi",
        "podemos",
        "todos",
        "mais"
      ],
      "metadata": {
        "title": "Postman - Como testar APIs - Hands-on",
        "date": "2017-05-19",
        "tags": "['Javascript']",
        "thumbnail": "Postman.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/postman-como-testar-apis/index.md"
      }
    },
    {
      "id": "dcfdc7a9eff865b7",
      "url": "https://devpleno.com/router-props",
      "title": "Dica: Router Props - DevPleno",
      "content": "Javascript\n\n## Dica: Router Props\n\nT\nPor Tulio Faria • 24 de abril de 2017\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nComo passar props para rotas (em react-router) em uma app react?\n\nDica interessante para injetarmos dependências nos componentes que são dinamicamente renderizados pelo router.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Router%20Props&url=https%3A%2F%2Fdevpleno.com%2Frouter-props) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frouter-props)",
      "description": "Como passar props para rotas (em reactrouter) em uma app react? Dica interessante para injetarmos dependências nos componentes que são dinamicamente render...",
      "keywords": [
        "https",
        "props",
        "javascript",
        "dica",
        "router",
        "para",
        "reactjs",
        "react",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/router-props"
      }
    },
    {
      "id": "dd3bc80ec121c859",
      "url": "https://devpleno.com/animacao-basica-css3",
      "title": "Animação basica em CSS3 - DevPleno (Part 2)",
      "content": ".hello.hover{\nbackground: green;\n}\nComo grande parte dos navegadores suporta CSS3 atualmente, conseguimos fazer tudo com ele, pelo menos para alguns tipos de aplicativos. Tudo isso utilizando apenas o transition, sem precisar utilizar Jquery. Confira os detalhes no vídeo:\n\nNão perca nenhuma atualização. Cadastre seu e-mail, curta o [DevPleno no Facebook](https://www.facebook.com) e [inscreva-se no canal](https://goo.gl/VBU2PR). Deixe suas dúvidas e sugestões nos comentários.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Anima%C3%A7%C3%A3o%20basica%20em%20CSS3&url=https%3A%2F%2Fdevpleno.com%2Fanimacao-basica-css3) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fanimacao-basica-css3)",
      "description": "Recentemente eu estava planejando e desenvolvendo a interface para o curso de Socket.io, e como ela terá algumas animações à medida em que os dados chegam ...",
      "keywords": [
        "hello",
        "anima",
        "https",
        "css3",
        "script",
        "node",
        "javascript",
        "para",
        "apenas",
        "grey"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/animacao-basica-css3"
      }
    },
    {
      "id": "dd61ddd8455d10d3",
      "url": "https://devpleno.com/empreender-na-area-de-software",
      "title": "3 dicas para começar a empreender na área de software - DevPleno (Part 1)",
      "content": "Carreira\n\n## 3 dicas para começar a empreender na área de software\n\nT\nPor Tulio Faria • 16 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nHoje quero dar três dicas para você que está começando a empreender na área de software. Vou aproveitar uma dúvida e comentário do João Henrique, em um vídeo nosso, dizendo que ele está começando na área, gosta de programar, está começando a empreender na área e qual dica eu daria a ele.\n\n**Dica #1 – Comece simples**\n\nNão tente pegar o maior sistema que você puder de primeira porque você não tem experiência. Eu aconselho a começar com um site com uma parte mais dinâmica, por exemplo, e vai aumentando gradativamente à medida que você for ganhando experiência. Isso é muito importante para que você consiga ir melhorando cada vez mais.\n\n**Dica #2 – Tenha um portfólio**\n\nSe você não tem nada para mostrar, eu aconselho que faça um projeto social. Vá em um asilo/creche e crie um projeto para ajudar alguma dessas instituições. O portfólio vai te mostrar duas coisas: a primeira é mostrar para um potencial cliente e a segunda é aprender com um projeto em produção, além de ajudar outras pessoas, claro.\n\n**Dica #3 – Aprenda a vender**\n\nSe você quer realmente continuar nessa carreira, aprenda a vender, foi uma das melhores coisas que eu aprendi. Estude muito como fazer marketing. Já cheguei a vender sistemas de R$150 mil porque eu aprendi a vender.\n\nNa primeira venda tente tirar todas as lições disso, o que você aprendeu e o que você errou. Eu faço isso em toda reunião que faço para vender algo.\n\n**Dica #4 (bônus) – Negociar é deixar as duas partes alinhadas**\n\nNegociação não é pra sugar a outra parte e sim para deixar as duas partes alinhadas. Você não tem que explorar o seu cliente, mas sim alinhar o valor cobrado. Não é aquilo de baixar R$5,00 ou R$1.000,00, negociação de verdade é quando as duas partes saem de um contrato muito felizes por terem feito um bom negócio.",
      "description": "Hoje quero dar três dicas para você que está começando a empreender na área de software. Vou aproveitar uma dúvida e comentário do João Henrique, em um víd...",
      "keywords": [
        "para",
        "vender",
        "https",
        "come",
        "dica",
        "carreira",
        "software",
        "duas",
        "empreender",
        "ando"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/empreender-na-area-de-software"
      }
    },
    {
      "id": "dd771a10bcf2eb7c",
      "url": "https://devpleno.com/blog/render-condicional-em-reactjs/index",
      "title": "Render condicional em ReactJS (Part 1)",
      "content": "Durante a criação de componentes em ReactJS é muito comum que dado um estado do componente, renderizarmos uma estrutura ou outra. Para fazermos isso no ReactJS/JSX temos algumas alternativas.\n\n## Primeira maneira: utilizando if´s\n\nJSX é basicamente um Javascript disfarçado de HTML (sim, apenas para facilitar a criação de templates). Então, podemos utilizar JS para renderizar ou não um treco de template.\n\n```jsx\nimport React, { Component } from 'react'\n\nclass CondComIf extends Component {\n  render() {\n    if (this.props.condicao) {\n      return <p>Condicao é verdadeira</p>\n    }\n    return <p>Condicao é falsa</p>\n  }\n}\n\n// para renderizarmos este componente\n// <CondComIf condicao={true} />\n```\n\n**Importante:** sempre o método render precisa retornar algo e que este algo seja apenas uma tag.\n\n## Segunda maneira: condicional com operador lógico\n\nEste formato utiliza a precedência de operadores para funcionar como uma condicional. Por exemplo, se fizermos isso:\n\n```jsx\na === 10 && b === 20\n```\n\nTemos uma característica interessante. Caso a===10 retorne falso, na grande maioria das linguagens (por termos um &&) não ira nem executar a comparação de b===20.\n\nIsso nos permite fazer o seguinte:\n\n```jsx\nconst a = 10\nconst b = 20\n\na===b && console.log('A eh igual a B)\n```\n\nClaro que neste exemplo, nunca o console.log será executado, mas creio que fez sentido para você.\n\nUtilizando a mesma ideia, podemos fazer o seguinte:\n\n```jsx\nimport React, { Component } from 'react'\n\nclass CondComOp extends Component {\n  render() {\n    return (\n      <p>\n        <h2>Vamos fazer o condicional: </h2>\n        {this.props.condicao && <span>Condicao é verdadeira</span>}\n        {!this.props.condicao && <span>Condicao é falsa</span>}\n      </p>\n    )\n  }\n}\n\n// para renderizarmos este componente\n// <CondComOp condicao={true} />\n```",
      "keywords": [
        "para",
        "condicao",
        "render",
        "span",
        "temos",
        "react",
        "component",
        "return",
        "este",
        "reactjs"
      ],
      "metadata": {
        "title": "Render condicional em ReactJS",
        "date": "2017-01-25",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "RenderCondicional.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/render-condicional-em-reactjs/index.md"
      }
    },
    {
      "id": "dd953e7b27332b9f",
      "url": "https://devpleno.com/como-escolher-linguagem-de-tecnologia",
      "title": "Como escolher uma linguagem de tecnologia? - DevPleno (Part 1)",
      "content": "Carreira\n\n## Como escolher uma linguagem de tecnologia?\n\nT\nPor Tulio Faria • 5 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nEu sou uma pessoa que sempre tem que estar conhecendo coisas novas e estar confortável com essas coisas, por isso resolvi compartilhar como escolher uma linguagem de tecnologia ou algo novo para estudar.\n\nTem coisas que eu gosto de fazer, como programar em aplicativos web e também tenho algumas missões com isso, como deixar mais fácil de organizar o código. Então, a minha decisão é tomada em cima do resultado que eu consigo ter com aquela linguagem. Eu não tomava decisão baseado em dinheiro, porque uma das coisas que as pessoas esquecem muito é que não é a linguagem que você vai usar que faz a diferença, e sim o quão bom é o produto que você vai construir com aquela linguagem. Por exemplo, tem muita gente que faz sistemas e plataformas maravilhosas com linguagens que nem imaginamos.\n\nSe você souber usar o máximo da linguagem para tirar o máximo de resultado, você será bem remunerado sobre isso.\n\nO mais importante: depois que você sabe algumas linguagens, elas ficam irrelevantes, por exemplo uma das formas que eu defino em qual linguagem eu programo é se consigo entregar algo comercial com garantia pro cliente nessa linguagem. Esse é meu parâmetro para saber se eu estou preparado naquela linguagem e não somente focado no dinheiro.\n\nSe você se sente confortável com aquilo que você aprende, então você faz gerar resultado, já que aquilo não vai ser um peso para você.\n\nAssista ao vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Eu sou uma pessoa que sempre tem que estar conhecendo coisas novas e estar confortável com essas coisas, por isso resolvi compartilhar como escolher uma li...",
      "keywords": [
        "linguagem",
        "https",
        "como",
        "para",
        "escolher",
        "tecnologia",
        "coisas",
        "carreira",
        "isso",
        "resultado"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/como-escolher-linguagem-de-tecnologia"
      }
    },
    {
      "id": "ddb0976460d9fc8f",
      "url": "https://devpleno.com/blog/async/index",
      "title": "Async - Como Controlar Operações Assíncronas (Part 1)",
      "content": "O Async é um módulo que nos ajuda a controlar processamento assíncrono. Primeiramente temos que instalar o async:\n\n```jsx\nnpm install async\n```\n\nOutro detalhe é que eu tenho 2 arquivos de texto, um escrito “arquivo 1” e o outro “arquivo 2”, vamos usá-los posteriormente.\n\nSe você lembra bem, no exemplo de promises, nós escrevemos 2 arquivos e concatenou o conteúdo desses arquivos. Aqui vou fazer um exemplo um pouquinho diferente. Vou criar um vetor com o nome dos arquivos dentro:\n\n```jsx\nvar fs = require('fs')\n\nvar async = require('async')\n\nvar files = ['arquivo1.txt', 'arquivo2.txt']\n```\n\nVamos supor que eu tenha que ler 100 arquivos de log e processá-los, então são 100 arquivos, um atrás do outro, de operações assíncronas, esse é o grande detalhe do que vamos fazer agora. Se fosse uma linguagem síncrona, seria muito fácil.\n\n```jsx\nasync.each(files, function (file, callback) {\n  fs.readFile(file, 'utf-8', function (err, contents) {\n    console.log(contents)\n\n    callback(null)\n  })\n})\n```\n\nPara cada arquivo, ele irá executar uma vez o código acima, quando ele retornar o conteúdo vou escrever na tela e o async espera que você o avise quando terminou esse processamento, então temos que chamar esse callback. Nele passamos null, mas também podemos passar um error, que é o padrão de callback no Node, se esse Error for Null significa que não deu erro nenhum.\n\nAo rodar o arquivo, vai ser retornado arquivo1 e arquivo2. Pode acontecer do arquivo 1 terminar mais rápido que o arquivo 2 porque não estamos impondo nenhuma ordem. Para o async não importa, ele vai executar todos, mas vai respeitar a ordem das operações de IO que vão sendo resolvidas.\n\nUm detalhe é que ele abre isso de forma paralela, então o 'each' é para otimizar pode abrir ao mesmo tempo. Para forçar a abrir um de cada vez, faremos o seguinte:\n\n```jsx\nasync.eachSeries(files, function (file, callback) {\n  fs.readFile(file, 'utf-8', function (err, contents) {\n    console.log(contents)",
      "keywords": [
        "async",
        "arquivos",
        "arquivo",
        "esse",
        "callback",
        "para",
        "outro",
        "processamento",
        "fazer",
        "function"
      ],
      "metadata": {
        "title": "Async - Como Controlar Operações Assíncronas",
        "date": "2017-07-30",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ASYNC-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/async/index.md"
      }
    },
    {
      "id": "de513e56f08b05e7",
      "url": "https://devpleno.com/stateless-functional-component",
      "title": "Criando componente mais simples e eficaz em React - DevPleno (Part 2)",
      "content": "class App extends Component {\nrender() {\nreturn (\n&#x3C;div className=\"App\">\n&#x3C;div className=\"App-header\">\n&#x3C;img src={logo} className=\"App-logo\" alt=\"logo\" />\n&#x3C;h2>Welcome to React&#x3C;/h2>\n&#x3C;/div>\n&#x3C;div className=\"App-intro\">\n&#x3C;home name='Tulio' />\n&#x3C;/div>\n);\n}\n}\nPerceba que passei um props chamado name, e então fiz o destructor assignment, extraindo do objeto apenas o que eu quero. Também poderia colocar Props e props.name, funcionaria normalmente, mas como temos uma forma mais simplificada, não é necessário.\n\nPodemos fazer também alguma checagem. Não tem problema nenhum o componente ter uma condicional, desde que retorne o JSX.\n\nExiste uma premissa no React que quanto mais você utiliza o Stateless Functional Component, mais seu código vai estar otimizado.\n\nAssista o passo a passo desse hands-on:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Criando%20componente%20mais%20simples%20e%20eficaz%20em%20React&url=https%3A%2F%2Fdevpleno.com%2Fstateless-functional-component) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fstateless-functional-component)",
      "description": "Vamos começar esse handson Stateless Functional Component com um projeto do zero criado com Createreactapp. Primeiro vamos criar um arquivo novo chamado ho...",
      "keywords": [
        "react",
        "component",
        "home",
        "mais",
        "functional",
        "import",
        "https",
        "componente",
        "stateless",
        "from"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/stateless-functional-component"
      }
    },
    {
      "id": "dec756a5f997d9c7",
      "url": "https://devpleno.com/assincrono",
      "title": "NodeJS Primeiros Passos Assíncrono - DevPleno",
      "content": "Javascript\n\n## NodeJS Primeiros Passos Assíncrono\n\nT\nPor Tulio Faria • 5 de agosto de 2016\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nUma das grandes características do Javascript/NodeJS é seu assincronismo. Isso é muito importante, pois há um grande ganho de performance principalmente quando temos aplicações IO Intensive (praticamente todas atualmente são assim). Veja neste vídeo um exemplo entre um script síncrono e um assíncrono!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%20Ass%C3%ADncrono&url=https%3A%2F%2Fdevpleno.com%2Fassincrono) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fassincrono)",
      "description": "Uma das grandes características do Javascript/NodeJS é seu assincronismo. Isso é muito importante, pois há um grande ganho de performance principalmente qu...",
      "keywords": [
        "https",
        "javascript",
        "nodejs",
        "ncrono",
        "fundamentos",
        "devpleno",
        "facebook",
        "para",
        "2fdevpleno",
        "2fassincrono"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/assincrono"
      }
    },
    {
      "id": "decf6e62e44daec8",
      "url": "https://devpleno.com/animacao-basica-css3",
      "title": "Animação basica em CSS3 - DevPleno (Part 1)",
      "content": "Fundamentos\n\n## Animação basica em CSS3\n\nT\nPor Tulio Faria • 22 de maio de 2017\n\n[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)\n\nRecentemente eu estava planejando e desenvolvendo a interface para o curso de Socket.io, e como ela terá algumas animações à medida em que os dados chegam em tempo real, resolvi voltar a estudar CSS3, algo que há tempos não utilizo.\n\nÀs vezes ficamos focando em um navegador mais novo e esquecemos que algumas coisas podemos utilizar sem o Javascript, apenas com CSS. Vou criar uma pequena página HTML, um pouco de CSS e Javascript apenas para poder controlar a class:\n\n.hello{\nborder:2px solid grey;\ntransition: all 3s;\n}\n.hello-active{\nborder:2px solid red;\nbackground: grey;\n}\n&#x3C;body>\n&#x3C;div class=\"hello\">\nOlá!\n&#x3C;/div>\n&#x3C;script>\nconst node = document.querySelector('.hello')\nnode.addEventListener('click', function(){\nthis.classList.add('hello-active');\n})\n&#x3C;/script>\n&#x3C;/body>\nO que o transition faz? Ele fala basicamente assim, “qualquer transição que você fizer envolvendo essa classe vai ter uma animação de X segundos”. Apenas a propriedade transition já é possível fazer muita coisa.\n\nNo caso acima, ao clicar, a borda grey muda para red e o background grey em uma transição que dura 3 segundos. Também podemos fazer uma animação ‘ao contrário’, fazendo ele voltar ao estado original adicionando ao script a seguinte linha:\n\n&#x3C;script>\nconst node = document.querySelector('.hello')\nnode.addEventListener('click', function(){\nthis.classList.add('hello-active');\n})\nnode.addEventLiestener('transitionend', function(){\nthis.classList.remove('hello-active');\n})\n&#x3C;/script>\nO evento transitionend faz com que, ao terminar o tempo determinado, remova do classList a class. Isso faz com que o CSS volte ao seu estado inicial em uma transição de ‘vai e volta’. Podemos também adicionar animação em hover:",
      "description": "Recentemente eu estava planejando e desenvolvendo a interface para o curso de Socket.io, e como ela terá algumas animações à medida em que os dados chegam ...",
      "keywords": [
        "hello",
        "anima",
        "https",
        "css3",
        "script",
        "node",
        "javascript",
        "para",
        "apenas",
        "grey"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/animacao-basica-css3"
      }
    },
    {
      "id": "dee411768dec0a79",
      "url": "https://devpleno.com/blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index",
      "title": "As vantagens do Javascript em todas as camadas de uma aplicação (Part 3)",
      "content": "E por fim, o MongoDB é uma ferramenta de banco de dados que armazena tudo em arquivos JSON-like. Ele é um banco de dados gratuito e open-source que pode ser utilizado em conjunto com todas as demais ferramentas já citadas para que a aplicação utilize JavaScript de ponta a ponta.\n\n## Quais são as vantagens de usar JavaScript em todas as camadas?\n\nO JavaScript já foi ridicularizado por ser uma linguagem simples demais e limitadora do potencial de um programador. Ainda hoje, muitos devs ainda torcem o nariz para ela, mas a verdade é que, desde o seu lançamento oficial em 1996 até os dias de hoje, o JavaScript evoluiu muito e não foi à toa que se tornou a linguagem mais popular do mundo, desbancando Java, C#, PHP, Phyton e outras.\n\nEntre as vantagens de utilização dessa linguagem em todas as camadas de uma aplicação, a mais clara é a padronização: com tudo sendo escrito em JavaScript, a uniformidade da linguagem é maior e o trabalho é mais compreensivo para quem está envolvido no projeto, seja um dev front-end, back-end ou full stack.\n\nE se um programador compreende bem os fundamentos da linguagem, ele será capaz de escrever também em todas as camadas, reduzindo gargalos em que o desenvolvimento para porque metade do time espera o pessoal do back-end terminar algo, por exemplo.\n\nSe uma equipe for boa em JavaScript, já é um passo dado para que todos sejam, de certa forma, full stack, ou seja, capazes de trabalhar nas duas camadas da aplicação. E um time full stack é mais versátil, ágil e compreende melhor o produto como um todo.\n\nOutra vantagem bem significativa é a possibilidade de reaproveitamento do código. Reutilizar trechos de código que já foram feitos é uma forma de reduzir a carga de trabalho dos desenvolvedores e acelerar o término do projeto.\n\nE com o MongoDB, é possível inclusive usar o JavaScript no banco de dados. Isso faz com que realmente todo o fluxo de um objeto em uma aplicação seja realizado com o JavaScript.",
      "keywords": [
        "javascript",
        "para",
        "aplica",
        "linguagem",
        "mais",
        "camadas",
        "node",
        "todas",
        "back",
        "front"
      ],
      "metadata": {
        "title": "As vantagens do Javascript em todas as camadas de uma aplicação",
        "date": "2017-10-06",
        "tags": "['Javascript']",
        "thumbnail": "VantagensUsarJS.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index.md"
      }
    },
    {
      "id": "defc64c355d85b88",
      "url": "https://devpleno.com/converter-markdown-para-html",
      "title": "Como converter Markdown para HTML usando Marked - DevPleno (Part 1)",
      "content": "Javascript\n\n## Como converter Markdown para HTML usando Marked\n\nT\nPor Tulio Faria • 3 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nO Markdown é uma forma de escrevermos documentação que foi popularizada pelo Github (e que é uma mão na roda, diga-se de passagem). Com ele, podemos pegar um texto e criar algumas marcações, o que gera uma interface mais organizada, sem perigo de existir sujeiras provenientes do Word por exemplo.\n\n**1 – Usando o módulo Marked**\n\nPara entender como o Markdown funciona, vamos fazer um hands-on no módulo chamado Marked, que tem a função de converter Markdown para HTML.\n\nPrimeiro, vamos criar um arquivo novo para testarmos (vou chamar o meu de teste.js)\n\n**2 – Importando o Marked**\n\nCom o arquivo aberto, vamos dar um Require chamando o módulo Marked\n\nconst marked = require('marked')\n\nconsole.log(marked('# teste'))\n**3 – Rodando o arquivo**\n\nAo dar node no arquivo teste.js, perceba que ele vai retornar\n\n&#x3C;h1> id='teste'>Teste&#x3C;/h1>\n\nO # trás pra gente a tag H1, podemos usar 2 # por exemplo e ele nos retornaria a tag H2\n\nconsole.log(marked('## teste'))\n\n&#x3C;h2> id=\"teste\">Teste&#x3C;/h2>\n**4 – Por que usar o Markdown?**\n\nCom ele, conseguimos colocar esses textos de forma mais limpa e também plugarmos renderes nele.\n\nPor exemplo, quando renderizar o H1, quero que seja um pouco diferente. Se colocarmos um texto formatado, poderia converter isso em view no react native, text, HTML, etc.\n\nExemplo:\n\nconstmarked = requie('marked')\n\nconstrenderer = new marked.Renderer()\n\nrenderer.heading = function (Text, level) {\nreturn 'Text: ' + text + ' Level: ' + level\n}\n\nconsole.log(marked('# teste', { renderer: renderer }))\nLembrando que ao criar um renderer temos que avisar o marked que estamos criando um renderer diferente. Neste caso, como ele é um Heading, vamos chamar o renderer.heading. Novamente, para visualizarmos o que foi feito, vamos dar um node teste.js e ele vai retornar pra gente:",
      "description": "O Markdown é uma forma de escrevermos documentação que foi popularizada pelo Github (e que é uma mão na roda, digase de passagem). Com ele, podemos pegar u...",
      "keywords": [
        "marked",
        "para",
        "teste",
        "markdown",
        "text",
        "level",
        "html",
        "renderer",
        "https",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/converter-markdown-para-html"
      }
    },
    {
      "id": "df0afd4247fda281",
      "url": "https://devpleno.com/blog/hands-low-db/index",
      "title": "Hands-on: Low-db",
      "content": "Neste hands-on, um módulo muito interessante para termos um banco de dados bem simples baseado em Json. Uma boa alternativa para aplicações desktop/electron e para guardar configurações de aplicações.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Zej3O0o7v4o\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "para",
        "embed",
        "responsive",
        "https",
        "aplica",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Hands-on: Low-db",
        "date": "2017-04-24",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Lowdb.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-low-db/index.md"
      }
    },
    {
      "id": "df4c1a523e90f5ef",
      "url": "https://devpleno.com/tag/fundamentos/5",
      "title": "Fundamentos - Pagina 5 - DevPleno",
      "content": "Fundamentos\n\n## Arquivo de Insights\n\n56 posts encontrados com a tag Fundamentos\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 17 de ago. de 2016 NodeJS Primeiros Passos: Async - Map](/nodejs-primeiros-passos-async-map)\n\n[Javascript 12 de ago. de 2016 NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas](/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas)\n\n[Fundamentos 9 de ago. de 2016 HA (High Availability) e AS (Auto Scale)](/ha-high-availability-e-as-auto-scale)\n\n[Javascript 5 de ago. de 2016 NodeJS Primeiros Passos Assíncrono](/assincrono)\n\n[Javascript 27 de jul. de 2016 NodeJS Primeiros Passos: Módulos](/nodejs-primeiros-passos-modulos)\n\n[Javascript 24 de jul. de 2016 Vídeo sobre Servidores Web - o back-end de uma aplicação web](/servidores-web-entendo-back-end)\n\n[Fundamentos 20 de jul. de 2016 Vídeo sobre Formatos de troca de dados em Aplicações Web](/formatos-de-troca-de-dados-em-aplicacoes-web)\n\n[Javascript 12 de jul. de 2016 Vídeo sobre NodeJS com Promises](/nodejs-primeiros-passos-promises)\n\n[Anterior](/tag/fundamentos/4)5 / 5\nPróxima",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "nodejs",
        "2016",
        "javascript",
        "primeiros",
        "passos",
        "fundamentos",
        "async",
        "sobre",
        "algoritmos",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/fundamentos/5"
      }
    },
    {
      "id": "df6cf4f0426dec97",
      "url": "https://devpleno.com/blog/entenda-a-importancia-de-cursos-para-desenvolvedores/index",
      "title": "Entenda a importância de cursos para desenvolvedores (Part 2)",
      "content": "Além disso, o colega do outro lado do computador pode ter uma ideia de negócio com você ou conhecer uma empresa que está contratando pessoas com seu perfil. É possível até mesmo que ele seja dono de uma empresa de informática com vagas abertas.\n\nO [network](https://www.devpleno.com/networking?utm_source=blog&utm_campaign=rc_blogpost) é essencial em qualquer área e no campo de desenvolvimento não é diferente. Quanto mais pessoas o conhecerem e souberem de suas habilidades, melhor.\n\n## Credibilidade\n\nTer credibilidade significa ser respeitado em sua área de atuação e, com o tempo e o acúmulo de conhecimentos, é possível tornar-se até mesmo uma referência. Para que isso aconteça, conviva e aprenda com quem sabe. Para isso, escolha cursos com grandes nomes da área.\n\n## Planejamento\n\nÉ imprescindível ter um plano de carreira. Comece definindo quais são seus pontos fracos e fortes. Um curso de capacitação ajudará a avaliar seu atual nível de conhecimento e compará-lo a outros profissionais da sua área. Estude para desenvolver seus pontos fracos e aprimorar os fortes.\n\n## Melhores cursos para desenvolvedores\n\nExistem algumas capacidades que todo desenvolvedor precisa ter e é nisso que você deve investir sua energia e dinheiro. As habilidades básicas sempre podem ser aprimoradas, por isso é importante não se acomodar.\n\nAlém disso, fique atento também às tendências do mercado. Identifique quais são as competências que estão em alta e escolha cursos para que possa aprendê-las.\n\nVeja algumas tendências atuais de desenvolvimento e programação:\n\n### ReactJS\n\nReactJS é uma biblioteca JavaScrips do Facebook para criar interfaces de usuários. O foco do React, ao contrário de outras bibliotecas, é a view, deixando de lado os demais componentes de uma aplicação front-end. O ReactJS estrutura a representação do HTML em objetos.",
      "keywords": [
        "para",
        "mais",
        "cursos",
        "pode",
        "empresa",
        "habilidades",
        "poss",
        "desenvolvimento",
        "isso",
        "reactjs"
      ],
      "metadata": {
        "title": "Entenda a importância de cursos para desenvolvedores",
        "date": "2017-07-07",
        "tags": "['Carreira']",
        "thumbnail": "102980-entenda-a-importancia-de-cursos-para-desenvolvedores-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/entenda-a-importancia-de-cursos-para-desenvolvedores/index.md"
      }
    },
    {
      "id": "df8746b4133b1fb6",
      "url": "https://devpleno.com/blog/renderizar-estruturas-em-formato-de-arvore/index",
      "title": "ReactJS Recursivo? (Part 3)",
      "content": "```jsx\nconst Node = (props) => {\n  return (\n    <span>\n      {props.node.l && props.node.r && <span>(</span>}\n      {props.node.l && <Node node={props.node.l} />}\n      {props.node.v}\n      {props.node.l && props.node.r && <span>)</span>}\n    </span>\n  )\n}\n```\n\nUma coisa interessante é que se fizermos um inspect no browser e usar o react dev tools é possível ver toda a estrutura sendo criada.\n\nFizemos aqui um forma de renderizar expressões, mas poderíamos utilizar para renderizar uma árvore, lista de diretórios, etc. Tudo isso utilizando essa simples estrutura.\n\nConfira todos os passos no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ZYomEoLdtdE\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "node",
        "props",
        "span",
        "lado",
        "vamos",
        "para",
        "renderizar",
        "fazer",
        "isso",
        "react"
      ],
      "metadata": {
        "title": "ReactJS Recursivo?",
        "date": "2017-06-28",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "ReactRecursivo.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/renderizar-estruturas-em-formato-de-arvore/index.md"
      }
    },
    {
      "id": "df87cdeb23017f23",
      "url": "https://devpleno.com/blog/entenda-sobre-cors-cross-origin-resource-sharing/index",
      "title": "Entenda sobre CORS - Cross Origin Resource Sharing (Part 2)",
      "content": "É sempre bom tomarmos cuidado com isso porque vamos supor que se a gente testar nossa API no postman, por exemplo, ele não tem problema de CORS, já que ele é uma aplicação stand-alone e não uma página estática.\n\nAlgumas coisas que aconteceram conosco aqui na empresa foi colocar sistemas com domínios diferentes mas acessando a mesma API, por exemplo. O desafio era controlar o CORS para saber se esse domínio tinha acesso ou não. Esse é mais um conceito da arquitetura WEB.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/3hzidd-sQfY\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "servidor",
        "para",
        "esse",
        "isso",
        "requisi",
        "fazer",
        "site",
        "cors",
        "como",
        "devpleno"
      ],
      "metadata": {
        "title": "Entenda sobre CORS - Cross Origin Resource Sharing",
        "date": "2017-09-06",
        "tags": "['Fundamentos']",
        "thumbnail": "CORS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/entenda-sobre-cors-cross-origin-resource-sharing/index.md"
      }
    },
    {
      "id": "dfb7b17fd1256e72",
      "url": "https://devpleno.com/metronomo-com-javascript",
      "title": "Metrônomo com JavaScript - DevPleno (Part 1)",
      "content": "Javascript\n\n## Metrônomo com JavaScript\n\nT\nPor Tulio Faria • 26 de maio de 2017\n\n*\n\n[Javascript](/tag/javascript)\n\nO metrônomo um dispositivo que deixa uma batida constante e ajuda os músicos a manterem um ritmo quando estão treinando. Esse ritmo pode aumentar ou diminuir de acordo com a escolha do músico.\n\nTeremos um HTML simples, e primeiro vamos criar um input type range para gerar uma barra que será onde vamos controlar a velocidade do nosso metrônomo. Nele conseguimos colocar qual o valor mínimo e qual o valor máximo. Vamos pegar o do google como exemplo, o mínimo será 40 e o máximo 218. Um value inicial e um ID para conseguirmos recuperar este valor.\n\nEm seguida, vamos colocar o áudio que será tocado (no meu caso tenho um clap.wav e um botão play para controlar o metrônomo).*\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;tittle>Metronomo&#x3C;/tittle>\n&#x3C;/head>\n&#x3C;body>\n&#x3C;input type=\"range\" min=\"40\" max=\"218\" value=\"40\" id=\"bpm\"/>\n&#x3C;audio src=\"clap.wav\">&#x3C;/audio>\n&#x3C;button id=\"play\">Play&#x3C;/button>\n&#x3C;/body>\n&#x3C;html>\nEle ficará assim:\n\nTambém é interessante colocarmos antes do input um H1 com o número inicial de batida que está configurado.\n\n&#x3C;h1>40bpm&#x3C;/h1>\nFeito isso, podemos começar a adicionar um pouco de comportamento. Vamos colocar o script no corpo do HTML mesmo, pois a intenção no exemplo é só demonstrar como poderíamos reconstruir o metrônomo.\n\nToda vez que trocar o valor do range tem que ser trocado o que está escrito em H1. Então vamos pegar o BPM e o H1. Toda vez que o BPM mudar, ou seja, dar um change, o h1 tem que mudar também. Lembrando que essa técnica de colocar todos os seletores em cima é chamada de cash.\n\nPrimeiro faremos um teste com um valor fixo criando uma função que faz o play. Vamos chamá-la de tick e um intervalo fixo, que em sequência vamos resolver.\n\nNessa função tick, temos que pegar o áudio",
      "description": "O metrônomo um dispositivo que deixa uma batida constante e ajuda os músicos a manterem um ritmo quando estão treinando. Esse ritmo pode aumentar ou diminu...",
      "keywords": [
        "play",
        "tick",
        "para",
        "const",
        "timer",
        "vamos",
        "isplaying",
        "valor",
        "audio",
        "currentbpm"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/metronomo-com-javascript"
      }
    },
    {
      "id": "dfe7a751a8a817ad",
      "url": "https://devpleno.com/orientacao-objetos-imperativa-e-funcional",
      "title": "Diferença entre as programações Orientação-objetos, Imperativa e Funcional - DevPleno (Part 2)",
      "content": "Fazendo isso, nós começamos a classificar as coisas cedo demais. Algo que eu acho muito legal da programação funcional é que conseguimos construir pequenos blocos, que são as funções, podemos passar elas como parâmetros, por exemplo. O legal disso é que não assumimos nenhuma classificação inicial para isso. Caso a gente queira fazer tudo em um arquivo só e depois ir quebrando em funções, é possível. Fazendo isso nós podemos amadurecer e estabilizar melhor para depois organizar. Não precisamos ter isso de começo, porque muitas vezes uma arquitetura te impõe erros, pois temos uma arquitetura muito bem definida mas tem coisas que não se encaixam em nem um lugar nem em outro.\n\nPara não acontecer isso em programação funcional, é interessante não trazer esses conceitos e apenas a ideia desse pattern.\n\nMas o maior problema que eu vejo hoje em orientação-objetos é exatamente a questão de que, quando ele começa a crescer, existem coisas que não se encaixam em nenhum lugar dentro da arquitetura.\n\nEntão a grande vantagem para as três abstrações é saber utilizar elas do jeito delas e não tentar aplicar esse paradigma em outro.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Diferen%C3%A7a%20entre%20as%20programa%C3%A7%C3%B5es%20Orienta%C3%A7%C3%A3o-objetos%2C%20Imperativa%20e%20Funcional&url=https%3A%2F%2Fdevpleno.com%2Forientacao-objetos-imperativa-e-funcional) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Forientacao-objetos-imperativa-e-funcional)",
      "description": "Hoje eu quero explicar um pouco melhor essa diferença entre Programação Funcional, Orientaçãoobjetos e Imperativa. Primeiro, todos os paradigmas são intere...",
      "keywords": [
        "para",
        "objetos",
        "funcional",
        "orienta",
        "isso",
        "imperativa",
        "https",
        "programa",
        "como",
        "problema"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/orientacao-objetos-imperativa-e-funcional"
      }
    },
    {
      "id": "dff5282353413565",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-4/index",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms (Part 2)",
      "content": "```jsx\n<div class\"column w-col w-col-2\"><a class=\"button w-button\" id=\"na-torcida-a\" href=\"#\"/> Na torcida </div>\n<div class\"column w-col w-col-2\"><a class=\"button w-button\" id=\"na-torcida-b\" href=\"#\"/> Na torcida </div>\n```\n\nAgora precisamos fazer tudo via JavaScript lá em js/match.js, quando clicar no 'na torcida' do time A ou time B, ele precisa mandar o valor para a barra:\n\n```jsx\n$(\"#na-torcida-a\").click(function(){\n    $.post(\"/match/\")+MATCH_INDEX+\"/supporters\", { team: 'a'}, function(data){})\n    return false;\n}\n$(\"#na-torcida-a\").click(function(){\n    $.post(\"/match/\")+MATCH_INDEX+\"/supporters\", { team: 'b'}, function(data){})\n    return false;\n}\n```\n\nAo clicar em \"na torcida\" ele envia, mas não recebe nada, pois não existe a rota ainda, então temos que ir no nosso routes/indexjs para criar essa rota logo acima de 'return router':\n\n```jsx\nrouter.post('/match/:id/supporters', function(req, res, next){\n    const match = db.get('matches['+req.params.id+']).value()\n    if(req.body.team==='a'){\n        const newValue =  match['team-a'].supporters+1\n        db.set('matches['+req.params.id+'].team-a.supporters', newValue).write()\n    }\n    if(req.body.team==='b'){\n        const newValue =  match['team-b'].supporters+1\n        db.set('matches['+req.params.id+'].team-b.supporters', newValue).write()\n    }\n    res.send({ ok: true })\n})\n```\n\nPerceba que pegamos o const match para saber o valor do jogo, em seguida fizemos um IF onde incrementamos o A ou B dependendo de qual botão for apertado.\n\nAgora eu preciso falar para todo mundo desse jogo que houve uma atualização nessa partida. Quando a gente cria um projeto no Socket.IO, tudo que se conecta, é conectado a uma sala geral. Vou explicar para ficar mais fácil.\n\nTemos duas formas de atualização, uma que vai para todos os usuários, ou seja, um geral, e também temos uma atualização que vai por jogo.",
      "keywords": [
        "match",
        "para",
        "supporters",
        "vamos",
        "team",
        "function",
        "video",
        "socket",
        "const",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms",
        "date": "2017-07-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 8,
        "sourcePath": "blog/minicurso-socket-io-parte-4/index.md"
      }
    },
    {
      "id": "e03a7697787c2acd",
      "url": "https://devpleno.com/tag/javascript",
      "title": "Javascript - DevPleno",
      "content": "Javascript\n\n## Arquivo de Insights\n\n183 posts encontrados com a tag Javascript\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)\n\n[Javascript 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)\n\n[Javascript 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)\n\n[Javascript 30 de nov. de 2017 Normalizar-email](/normalizar-email)\n\n[Javascript 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)\n\n[Javascript 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)\n\n[Javascript 24 de nov. de 2017 Reconhecimento de nudez com js](/reconhecimento-de-nudez-com-js)\n\n[Javascript 24 de nov. de 2017 Reconhecimento facial com JS](/reconhecimento-facial-com-js)\n\n[Javascript 23 de nov. de 2017 CHAVES DINÂMICAS](/chaves-dinamicas)\n\n[Javascript 16 de nov. de 2017 Hands-on - Three.JS](/hands-on-threejs)\n\n[Javascript 13 de nov. de 2017 Capturando áudio do microfone pelo Navegador](/microfone-pelo-navegador)\n\n[Javascript 13 de nov. de 2017 Preview de imagens antes do upload](/preview-de-imagens-antes-do-upload)\n\nAnterior\n1 / 16[Próxima](/tag/javascript/2)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "como",
        "nodejs",
        "imagens",
        "upload",
        "reconhecimento",
        "criar",
        "algoritmos",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/javascript"
      }
    },
    {
      "id": "e03b166c3fd06aa7",
      "url": "https://devpleno.com/blog/short-circuit-e-valores-padrao/index",
      "title": "Short-circuit e valores padrão (Part 2)",
      "content": "Temos dois usos alternativos dos operadores && e ||, posso usar o 'ou' para o valor padrão e o && para um short-circuit e evitar que a linha continue sendo executada.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/GBcsH6LXzK8\" allowfullscreen></iframe>\n</div>\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "debug",
        "valor",
        "console",
        "para",
        "padr",
        "short",
        "circuit",
        "esse",
        "isso",
        "embed"
      ],
      "metadata": {
        "title": "Short-circuit e valores padrão",
        "date": "2017-08-07",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ShortCircuit.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/short-circuit-e-valores-padrao/index.md"
      }
    },
    {
      "id": "e08a42577694e686",
      "url": "https://devpleno.com/blog/normalizar-email/index",
      "title": "Normalizar-email",
      "content": "Hoje eu quero comentar um detalhe de implementação de e-mail muito interessante e como podemos contornar essa característica que temos em alguns endereços de e-mail.\n\nUma coisa que muita gente acredita é que nossos e-mails somente funcionam dessa maneira:\n\n```jsx\ntuliofaria@devpleno.com\n```\n\nUm detalhe é que podemos adicionar alguns itens a mais nesse e-mail e aí depende do provedor permitir ou não esse e-mail.\n\nNo caso do Gmail nós conseguimos colocar alguma string qualquer na frente:\n\n```jsx\ntuliofaria+string@devpleno.com\n\ntulio.faria@devpleno.com\n```\n\nNós podemos utilizar o primeiro exemplo em alguns sistemas, onde queremos criar mais de uma conta com o mesmo e-mail e também para verificar de onde veio esse e-mail.\n\nSe eu cadastrei esse e-mail em [americanas.com](https://www.americanas.com.br/) eu posso utilizar por exemplo:\n\n```jsx\ntuliofaria+americanas@devpleno.com\n\n```\n\nSe a gente quiser construir um sistema e desconsiderar essas características de que cada provedor corrige podemos utilizar um módulo chamado normalize-e-mail, ele vai fazer exatamente isso, pegar esse e-mail que está sujo e, dependendo das normalizações que o provedor faz, vai fazer também:\n\n```jsx\nyarn add normalize-email\nconst normalize-email = require('normalize-email')\nconsole.log(normalizeEmail('tuliofaria+americanas@gmail.com'))\nconsole.log(normalizeEmail('tulio.faria+americanas@outlook.com'))\n```\n\nCom isso ele vai fazer as devidas correções. É muito simples, porém muito útil.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/6urhRR9es5M\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "mail",
        "devpleno",
        "americanas",
        "podemos",
        "tuliofaria",
        "esse",
        "https",
        "normalize",
        "embed",
        "muito"
      ],
      "metadata": {
        "title": "Normalizar-email",
        "date": "2017-11-30",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "NormalizarEmail.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/normalizar-email/index.md"
      }
    },
    {
      "id": "e0b8ea0a1122ce08",
      "url": "https://devpleno.com/nodejs-primeiros-passos-async-waterfall",
      "title": "NodeJS Primeiros Passos: Async - Waterfall - DevPleno",
      "content": "Javascript\n\n## NodeJS Primeiros Passos: Async - Waterfall\n\nT\nPor Tulio Faria • 15 de agosto de 2016\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nNeste vídeo, vou mostrar uma outra forma de organizar códigos assíncrono, neste caso, executando em cascata (um após o outro).\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20Async%20-%20Waterfall&url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-waterfall) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-waterfall)",
      "description": "Neste vídeo, vou mostrar uma outra forma de organizar códigos assíncrono, neste caso, executando em cascata (um após o outro). Confira o video: <div classN...",
      "keywords": [
        "https",
        "nodejs",
        "javascript",
        "primeiros",
        "passos",
        "async",
        "waterfall",
        "neste",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/nodejs-primeiros-passos-async-waterfall"
      }
    },
    {
      "id": "e150376d9290454a",
      "url": "https://devpleno.com/currying",
      "title": "Currying -  Uma técnica interessante usada em programação funcional - DevPleno (Part 2)",
      "content": "console.log('curried', func2(10)(20))\nNa versão curried, precisamos lembrar que a primeira parte retorna uma função e então conseguimos chamar a segunda função com o segundo parâmetro que queremos. Uma outra coisa que podemos fazer é uma curried function só com arrow function, por exemplo:\n\nconst functArrow = (valor1) => (valor2) => (valor3) => {\nreturn valor1 + valor2 + valor3\n}\n\nconsole.log(functArrow(1)(2)(3))\nPerceba que isso deixa ainda mais simplificado uma curried function e vamos compondo cada vez mais nossas funções. Isso deixa mais fácil de ser testado, pois, à medida que a parte elementar dela é testada, só precisamos passar os valores corretamente que não vai ter problema. Confira a explicação em vídeo.\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Currying%20-%20%20Uma%20t%C3%A9cnica%20interessante%20usada%20em%20programa%C3%A7%C3%A3o%20funcional&url=https%3A%2F%2Fdevpleno.com%2Fcurrying) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcurrying)",
      "description": "O Currying é basicamente uma forma de informar para uma função os parâmetros de forma parcial. Você pode pegar uma função qualquer que recebe, por exemplo,...",
      "keywords": [
        "function",
        "valor1",
        "valor2",
        "curried",
        "https",
        "currying",
        "valores",
        "return",
        "valor",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/currying"
      }
    },
    {
      "id": "e1dc0d3ef61946cc",
      "url": "https://devpleno.com/blog/sobre-o-devpleno/index",
      "title": "Sobre o DevPleno (Part 2)",
      "content": "### Tecnologia+Processos+Negócios = DevPleno – um profissional que entrega resultados\n\n## Um pouco da minha história até virar DevPleno\n\nEu fui criado em uma família humilde. Meus pais não possuem curso superior. Porém, eles fizeram muito por mim e meus irmãos: eles investiram toda a energia e recursos possíveis para que tivéssemos chances de estudar nos melhores colégios (claro que neste ponto também fazíamos nossa parte – por exemplo, do ensino fundamental ao médio – sempre estudei com bolsas de estudo por mérito).\n\nNeste caminho pude assistir e participar da superação deles para financeiramente prover uma educação de qualidade para mim e meus irmãos. Vi a trajetória da minha mãe, saindo de dona de casa a criar uma mercearia/quitanda que mantinha muitas das contas da casa. Além de meu pai, que era funcionário e fora do horário comercial e nos fim de semana estendia a mercearia para virar também um bar. Isso foi muito importante para a minha formação como pessoa: pois eu pude aprender o valor da persistência e do empreendedorismo. Assisti inúmeras vezes meu pai literalmente caindo de sono nas suas empreitadas fora do horário comercial. Porém, totalmente alinhado e comprometido com seu objetivo. As lições de empreendedorismo que aprendi com minha mãe são incontáveis e bastante surpreendentes! Ela sabia exatamente como agregar valor aos seus produtos (na época minha mãe chegou a vender cheiro-verde (cebolinha e salsinha) e couve picadas, pois percebeu que algumas clientes não gostavam de fazer isso. Então ela fazia e cobrava mais caro 🙂\n\nNesta época, ajudávamos como podíamos. Eu fui entregador, atendente e garçom. Além de ajudar a realizar as compras nos centro de abastecimentos. Isso foi muito importante para a minha formação!",
      "keywords": [
        "para",
        "como",
        "mais",
        "minha",
        "devpleno",
        "muito",
        "isso",
        "cada",
        "meus",
        "projetos"
      ],
      "metadata": {
        "title": "Sobre o DevPleno",
        "date": "2017-03-15",
        "tags": "['Carreira']",
        "thumbnail": "tulio.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "blog/sobre-o-devpleno/index.md"
      }
    },
    {
      "id": "e1e719a2c24f6c08",
      "url": "https://devpleno.com/dica-debug-nodejs-com-chrome-devtools",
      "title": "Dica: Debug NodeJS com Chrome DevTools - DevPleno (Part 1)",
      "content": "Javascript\n\n## Dica: Debug NodeJS com Chrome DevTools\n\nT\nPor Tulio Faria • 11 de setembro de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nA dica de hoje é sobre como podemos fazer o debug dos nossos scripts em Node (de um script que fica rodando direto como o express e de um script simples) utilizando o chrome. Eu tenho em minha máquina um servidor em express e no meu shell eu vou rodar esse servidor:\n\nnode -- inspect server.js\nPerceba que ele mostra um link:\n\nEsse link eu vou copiar e colar no navegador. Com isso ele abre para mim o devTools do Chrome e eu posso ir em Source, por exemplo, apertar CTRL+P e colocar o nome do arquivo, no caso o meu se chama servser.js:\n\nAgora eu quero que ele pare a execução quando passar no primeiro console.log:\n\nÉ muito comum em algumas ferramentas como o visual studio fazer o debug dessa forma, setando um break point e quando o script for executar, ele vai parar nesse ponto que marcamos.\n\nAgora vamos rodar nosso localhost:3000 e quando voltamos para o devtools, perceba que ele parou e nós conseguimos checar o que tem dentro do req, res:\n\nEu posso pedir para ele ir para a próxima linha ou mandar continuar o script utilizando os botões:\n\n![(73aa926e-a947-4d9d-8c54-4f3920ba916b.png)\n\nVamos supor que eu queira saber o que vai sair em uma expressão, eu posso selecionar e passar o mouse em cima que ele mostra sendo executado. Isso é muito útil para achar alguma inconsistência no código.\n\nSempre que você for testar, principalmente código assíncrono, coloque um break point onde você quer que pare, principalmente para call back.\n\nOutra forma que temos de depurar um código é depurar desde a primeira linha, para isso vou utilizar um algoritmo que já fizemos em outra aula:\n\nnode --inspect --debug-brk cyclic_rotation.js\nPercebam que eu não tenho nada de assíncrono no meu algoritmo, mas mesmo assim ele deu uma URL para depurar:",
      "description": "A dica de hoje é sobre como podemos fazer o debug dos nossos scripts em Node (de um script que fica rodando direto como o express e de um script simples) u...",
      "keywords": [
        "para",
        "debug",
        "chrome",
        "https",
        "nodejs",
        "devtools",
        "como",
        "script",
        "linha",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/dica-debug-nodejs-com-chrome-devtools"
      }
    },
    {
      "id": "e20df0d32a66a009",
      "url": "https://devpleno.com/blog/servidor-http-basico-2/index",
      "title": "Servidor HTTP Básico - NodeJS Primeiros Passos (Part 2)",
      "content": "```jsx\nvar http: require('http');\nhttp.createServer(function(req, res){\n    res.end('DevPleno.com');\n}).listen(3000);\n```\n\nVamos salvá-lo como server.js, abrir o prompt de comando e executar o seguinte comando:\n\n```jsx\nNode server.js\n```\n\nIsso vai 'Startar' nosso servidor. Quando abrirmos o browser e escrevermos localhost:3000, recebemos a mensagem DevPleno.com, assim, é possível ver que o servidor está rodando normalmente. O bom disso é que não precisamos importar bibliotecas de terceiros, já que o HTTP é um módulo que faz parte do core do node. O que podemos fazer a mais? Podemos, por exemplo, importar um módulo que lida com FileSystem, criar uma var contents que receberá um readFileSync _(lembrando que não é muito bom usar o Sync, mas estou fazendo apenas com intuíto de demonstração)._\n\n```jsx\nvar http: require('http');\nvar fs = require('fs');\nvar contents = fs.readFileSync('contents.html')\nhttp.createServer(function(req, res){\n    res.end(contents);\n}).listen(3000);\n```\n\nEm seguida, criar um HTML com o nome contents\n\n```jsx\n<html>\n    <body>\n    <h1>DevPleno.com</h1>\n    </body>\n<html>\n```\n\nAperte Ctrl C para parar o servidor. Vamos reiniciar o servidor com node server.js, recarregar o browser e ele irá requisitar o contents.html do jeito que criamos.\n\nClaro que para criarmos uma aplicação mais avançada, iremos utilizar alguns módulos de terceiros para que esse processo todo fique um pouco mais fácil e mais robusto, mas essa é só uma parte introdutória.\n\nConfira o passo a passo no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/5L5-EoJbMfY\" allowfullscreen></iframe>\n</div>\n\nFique à vontade para deixar suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "http",
        "servidor",
        "node",
        "devpleno",
        "para",
        "contents",
        "criar",
        "html",
        "nodejs",
        "fazer"
      ],
      "metadata": {
        "title": "Servidor HTTP Básico - NodeJS Primeiros Passos",
        "date": "2017-05-15",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "ServidorHttp2.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/servidor-http-basico-2/index.md"
      }
    },
    {
      "id": "e2119e7ddb2dc990",
      "url": "https://devpleno.com/expressao-aritmetica-codefights",
      "title": "Resolvendo Expressão Aritmética do CodeFights - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Resolvendo%20Express%C3%A3o%20Aritm%C3%A9tica%20do%20CodeFights&url=https%3A%2F%2Fdevpleno.com%2Fexpressao-aritmetica-codefights) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fexpressao-aritmetica-codefights)",
      "description": "Hoje vamos resolver um problema disponível no Code Fights, conhecido como Expressão aritmética. É bastante simples, basicamente temos um número A, B e C e ...",
      "keywords": [
        "return",
        "https",
        "opera",
        "operador",
        "arithmeticexpression",
        "const",
        "algoritmos",
        "aritm",
        "codefights",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/expressao-aritmetica-codefights"
      }
    },
    {
      "id": "e25c5b9df1702c12",
      "url": "https://devpleno.com/blog/comprometimento-com-suas-metas/index",
      "title": "Comprometimento com as suas metas (Part 2)",
      "content": "Posteriormente eu fui assistindo e consegui escrever tudo, mas o mais importante é que na época eu não pensei o efeito que isso teria na minha vida. Hoje em dia, eu vejo que naquele tempo eu não coloquei muita desculpa para não fazer o que queria e esse é um ponto muito interessante, mesmo com algum empecilho, não devemos usá-lo como desculpa para não cumprir a meta. O segundo ponto, que é a chave do que estou falando, é que você se comprometa com uma meta para você mesmo, você precisa cumpri-la, senão vai acabar não fazendo nada de diferente e consequentemente não evoluindo como você deveria evoluir. O grande ponto é ter um comprometimento muito forte.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/zrOJVx8IO64\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "meta",
        "como",
        "ponto",
        "embed",
        "hoje",
        "muito",
        "importante",
        "fazer",
        "mais"
      ],
      "metadata": {
        "title": "Comprometimento com as suas metas",
        "date": "2017-07-19",
        "tags": "['Carreira']",
        "thumbnail": "COMPROMETIMENTO-COM-SUAS-METAS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/comprometimento-com-suas-metas/index.md"
      }
    },
    {
      "id": "e26d762d89e613ed",
      "url": "https://devpleno.com/minicurso-socket-io-parte-2",
      "title": "Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO - DevPleno (Part 2)",
      "content": "Esta tudo correto, estamos com o Socket.IO conectado ao express. Agora temos que fazer o client conectar no server, vamos criar mais um JavaScript e incluir diretamente no app. Em public/js vamos criar um arquivo novo chamado match.js, dentro dele vai ter o um jQuery para simplificarmos um pouco e dentro dele terá um alert:\n\n$(function)(){\nalert(1)\n})\nJá em match.ejs vamos adicionar o JavaScript lá em baixo, depois de todo o footer:\n\n&#x3C;% include partials/footer %>\n&#x3C;script src=\"/js/match.js\">&#x3C;/script>\nAo atualizar ele vai mostrar o alert, isso significa que está funcionando perfeitamente. Então agora vamos começar a conectar o front-end ao back-end. Voltando ao match.js, vamos retirar o alert e adicionar o seguinte:\n\n$(function)(){\nconst socket = io();\n})\nAo fazer isso, se formos ao WS, perceba que ele já tentou fazer uma conexão: Como eu tenho certeza se isso está ok? Vamos fazer o seguinte teste:\n\n$(function)(){\nconst socket = io();\nsocket.on('connect', function(){\nconsole.log('conected');\n})\n})\nPara vermos se ele está conectado ao servidor, voltamos em index.js e precisamos checar se ele se conectou. O problema é que preciso pegar o IO que está no arquivo anterior, o DB também está estranho porque precisamos ter um admin para criar e gerenciar esses jogos e ele vai utilizar o mesmo banco, então estamos deixando esse index muito dependente, precisamos fazer algo que a gente possa injetar o DB e o IO ali dentro.\n\nComo fazemos isso?\n\nPoderíamos em app.js ao invés de deixar o index em cima, vamos passar um pouco para baixo. Antes de importar, vamos injetar a dependência que temos do IO para ele:\n\nSe olharmos esse index, ele exporta um router, vamos fazer ele exportar também um router, mas de uma maneira diferente, vamos criar uma função indexRouter e colocar as dependências:\n\nfunction indexRouter(dependecies) {}\nE lá em baixo ao invés de exportar um router vamos exportar o indexRouter:",
      "description": "Na primeira aula do minicurso de Sockt.IO, fizemos a listagem dos jogos puxando do banco de dados baseado em json e quando clicamos conseguimos visualizar ...",
      "keywords": [
        "vamos",
        "socket",
        "admin",
        "index",
        "para",
        "const",
        "dentro",
        "temos",
        "criar",
        "fazer"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-2"
      }
    },
    {
      "id": "e293011a2432d255",
      "url": "https://devpleno.com/minicurso-socket-io-parte-3",
      "title": "Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol - DevPleno (Part 4)",
      "content": "$(function)(){\nconst socket = io();\nsocket.on('connect', function(){\nconsole.log('conected');\n})\nsocket.on('score', function(score){\nconsole.log('score', score)\n//na lista de jogos\n$(\". match-\"+score.match+\"-a\").html(score.scoreA)\n$(\". match-\"+score.match+\"-b\").html(score.scoreb)\n})\n})\nPerceba que em A nós escrevemos o valor de score.scoreA e o mesmo no B. Agora temos que atualizar a parte de baixo também, então nós temos o score-team-A e o valor do score por exemplo, porém como eu vou saber se esse jogo é o que eu estou atualmente? Em match.ejs, lá no final, antes do include do footer, vamos fazer um script que define uma constante:\n\n&#x3C;script>\nconst MATCH_INDEX = \"&#x3C;%- id %>\";\n&#x3C;/script>\nQuando faço isso, o match.index consegue acessar esse valor, então dentro do nosso match conseguimos checar se estamos em nosso jogo atual:\n\nsocket.on('score', function (score) {\nconsole.log('score', score)\n//na lista de jogos\n$('. match-' + score.match + '-a').html(score.scoreA)\n$('. match-' + score.match + '-b').html(score.scoreb)\n// atualizar o jogo\nif (MATCH_INDEX == score.match) {\n$('.score-team-a').html(score.scoreA)\n$('.score-team-b').html(score.scoreB)\nif (score.notify == '1') {\nconsole.log('notificar')\n}\n}\n})\nSe o jogo é o que recebemos a notificação, nós notificamos esse gol. Em view/match, lá no final, temos uma div que é uma class goooolllll com um áudio, então se estivermos com o notificado ligado vamos dar um play nesse áudio, voltamos no código anterior e adicionamos o seguinte:\n\nif (score.notify == '1') {\nconsole.log('notificar')\n$('#audio-gol')[0].currentTime = 0\n$('audio-gol')[0].play()\n}\nPor que fizemos o notificar sim ou não? É possível notificar um gol e caso ele seja anulado, você tira o notificar e tira o placar sem alarmar todos. Podemos também fazer uma animação com aquele div que está ali",
      "description": "Nas aulas anteriores do minicurso de Socket.IO, já preparamos o ambiente, conectamos o websocket do client para o servidor e agora vamos começar a emitir r...",
      "keywords": [
        "score",
        "match",
        "para",
        "function",
        "socket",
        "vamos",
        "notify",
        "jogo",
        "console",
        "scorea"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-3"
      }
    },
    {
      "id": "e295c5c70e109a4f",
      "url": "https://devpleno.com/blog/morgan/index",
      "title": "O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "description": "Aprenda o que é o Morgan, como instalar e configurar no Express para logar requisições HTTP. Exemplos práticos com todos os formatos de log.",
      "keywords": [
        "morgan",
        "express",
        "temos",
        "isso",
        "para",
        "embed",
        "requisi",
        "const",
        "devpleno",
        "exemplo"
      ],
      "metadata": {
        "title": "O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express",
        "description": "Aprenda o que é o Morgan, como instalar e configurar no Express para logar requisições HTTP. Exemplos práticos com todos os formatos de log.",
        "date": "2017-08-23",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Morgan.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/morgan/index.md"
      }
    },
    {
      "id": "e2ce927aa97c0946",
      "url": "https://devpleno.com/cursos",
      "title": "Cursos e Programas - DevPleno",
      "content": "## Cursos e Programas\n\nExperiencias de aprendizado personalizadas para cada estagio da sua jornada como desenvolvedor, da primeira linha de codigo ao seu proprio SaaS.\n\nIniciante\n\n#### Fullstack Master 101\n\nO plano definitivo para quem quer entrar na área de tecnologia com uma base sólida.\n\nEm Breve\n\nAvançado\n\n#### Fullstack Master Pro\n\nEleve suas habilidades para liderar times e entregar produtos de alto desempenho.\n\n[Conhecer Programa](https://go.devpleno.com/fsm)\n\nMentoria\n\n#### TheSiders\n\nMentoria exclusiva 1:1 focada em construir e escalar seus produtos de software.\n\n[Conhecer Programa](https://do.devpleno.com/thesiders)\n\nEmpreendedorismo\n\n#### Simple SaaS\n\nDa validação à escala. Uma jornada completa para transformar ideias em negócios.\n\nEm Breve\n\nArquitetura\n\n#### TheBestStack\n\nPrepare sua arquitetura para o futuro. Aprenda a preparar sua stack para a velocidade da IA.\n\n[Conhecer Programa](https://do.devpleno.com/the-best-stack)\n\nProdutividade\n\n#### My AI Way\n\nOs bastidores do meu workflow pessoal com IA para entregar 10x mais em metade do tempo.\n\n[Conhecer Programa](https://do.devpleno.com/the-best-stack)\n\n[Finanças Conta49 Contabilidade Trabalha como PJ? Quer receber do seu SaaS de forma correta? A Conta49 é a minha contabil](https://www.conta49.com.br)",
      "description": "Cursos, mentorias e programas de crescimento para desenvolvedores. Do iniciante ao avancado, encontre a trilha ideal para sua carreira em tecnologia.",
      "keywords": [
        "para",
        "https",
        "conhecer",
        "programa",
        "devpleno",
        "saas",
        "stack",
        "conta49",
        "jornada",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/cursos"
      }
    },
    {
      "id": "e2d2f318acaaf33f",
      "url": "https://devpleno.com/blog/servir-arquivos-e-expor-servidor/index",
      "title": "Como servir arquivos e expor servidor local com HTTPS (Part 1)",
      "content": "Nesta dica, vou mostrar como servir arquivos estáticos de forma simples, além disso, como expor um servidor local de testes para a internet e ainda utilizando uma conexão segura (HTTPS).\n\nPressupondo que a gente já tenha o NodeJS e o NPM instalado vamos fazer o seguinte no cmd:\n\n```jsx\nnpm install -g http-server\n```\n\nEle vai instalar o HTTP server, que é mais ou menos parecido com o APACHE, porém mais simples porque podemos servir qualquer pasta, geralmente de forma temporária e não startado como serviço.\n\nEntão vamos lá. Já estou na minha pasta, na qual tenho o HTML, e vou colocar:\n\n```jsx\nhttp - server\n```\n\nEle me mostra alguns endereços, disponibilizando para um servidor e ouve as placas de rede.\n\n![Exemplo 1](ArquivosEx1.png)\n\nVamos pegar o primeiro, abrir uma aba nova no browser e mandar rodar. A partir daí, estamos acessando via um servidor. Algumas API's do JavaScript e HTML eu já conseguiria acessar por estar no servidor, mas algumas delas eu preciso estar em uma conexão segura para esse endereço, e como faço isso?\n\nUma das maneiras que eu acho interessante é usando uma ferramenta chamada [ngrok](https://ngrok.com/download). É um arquivo zip com um .exe dentro. Podemos colocar ele dentro de uma pasta e colocar a pasta no path. No meu caso, sempre coloco ele na área de trabalho, abro outro CMD e faço:\n\n```jsx\nngrok http 8080\n```\n\n8080 representa a porta que estamos utilizando. Com isso, ele libera dois endereços, um https e um http, abrindo um túnel pela internet.\n\n![Exemplo 2](ArquivosEx2.png)\n\nSe copiarmos o endereço https e colar no browser, a conexão para o mesmo arquivo vai ser com https, assim podemos testar muito mais coisas da API do HTML5.\n\nUma vantagem do ngrok é que como ele é um túnel, o endereço vai estar disponível na internet, logo você pode enviar esse endereço para seu cliente por exemplo, que vai acessar normalmente.",
      "keywords": [
        "para",
        "https",
        "endere",
        "ngrok",
        "servidor",
        "como",
        "vamos",
        "http",
        "exemplo",
        "webhook"
      ],
      "metadata": {
        "title": "Como servir arquivos e expor servidor local com HTTPS",
        "date": "2017-06-26",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "ServirArquivos.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/servir-arquivos-e-expor-servidor/index.md"
      }
    },
    {
      "id": "e2e9bd0724c396ab",
      "url": "https://devpleno.com/minicurso-socket-io-parte-1",
      "title": "Minicurso Socket.IO - Parte 01 - Começando o projeto - DevPleno (Part 2)",
      "content": "var users = require('./routes/users')\napp.use('./users', users)\nAgora vamos aos arquivos de apoio. Você vai receber um zip com os diretórios **data**, **public**, **views** e um arquivo **funções.js**. Dentro da pasta public, temos o css, imagens, o JavaScript e os áudios. Na views, temos os templates que vamos utilizar e a pasta data, que é o BD que eu preparei para podermos utilizar e consumir esses dados.\n\nDentro de public, vamos copiar tudo que está lá e colocar na pasta public do projeto. O data iremos copiar a pasta inteira e colocar na pasta raiz do projeto, e views iremos copiar um a um assim que for necessário.\n\n**Como foi gerado isso tudo pelo express generator?**\n\nO app.js é a base da nossa aplicação e segue uma boa prática do express, que é criar a aplicação nesse independente da parte que starta o servidor, que na nossa aplicação é em bin/www onde ele importa o app, define a porta e etc. Ele faz isso de uma maneira bem legal porque se quisermos criar testes, conseguimos apenas importando o app e rodamos em cima do app sem precisar realmente ouvir uma porta. Esse app.js também importa o routes que é nosso arquivo de rotas, ele diz o seguinte: quando você entrar no ’/’ vai renderizar o index. Aí ele irá em views e abrirá o index.ejs.\n\nComo ele sabe que o index está em views?\n\nSe voltarmos em app.js ele definiu que é um ejs que está dentro de views:\n\napp.set('views', path.join(__dirname, 'views'))\napp.set('view engine', 'ejs')\nSe dermos um render, ele irá pegar o index. Vamos fazer um teste para ver se é isso mesmo, vamos mudar o Welcome e trocar por Olá para saber se estamos realmente alterando ele:\n\n&#x3C;p>Olá &#x3C;%= title %>&#x3C;/p>\nAgora, dentro desse index, iremos fazer uma lista de jogos, mais especificamente quais estão acontecendo nesse momento. Para fazermos isso, a primeira coisa que temos que fazer é utilizar um banco de dados baseado em json que se chama **lowdb**, então vamos dar um yarn nele:",
      "description": "Essa é a primeira parte do nosso minicurso de Socket.IO. Nesta etapa, vamos começar o projeto e criar as primeiras páginas para dar o suporte à aplicação. ...",
      "keywords": [
        "vamos",
        "para",
        "dentro",
        "matches",
        "views",
        "express",
        "pasta",
        "index",
        "match",
        "temos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/minicurso-socket-io-parte-1"
      }
    },
    {
      "id": "e2ea1e09adc1e969",
      "url": "https://devpleno.com/blog/handlebars-template-html-simples/index",
      "title": "Template HTML simples - Hands-on Handlebars (Part 2)",
      "content": "Isso dá muito trabalho, então vamos criar uma parte do template usando Script do handlebars. Ao invés de ficar concatenando Strings, vou colar a div dentro dele e onde eu quiser colocar o nome apenas coloco {{name}}:\n\n```jsx\n<script type='text/x-handlebars-templete' id='person-templete'>\n  <div>\n    <strong>Name: </strong>\n    {{ nome }}\n    <br />\n    <strong>Last Name: </strong>\n    {{ lastName }}\n    <br />\n  </div>\n</script>\n```\n\nTemos, então, que pegar essa String de dentro do script, correto? Então vamos fazer o seguinte: pegar o html que está ali dentro, que é um template do Handlebars, ele vai trocar de forma automática. Depois disso, vamos criar um template do handlebars. Lembrando que o personTemplete você pode renderizar:\n\n```jsx\n<script>\n    $function(){\n        $.get'dados.json't=' +new Date().getTime(), function(data){\n        const templeteString = $(\"#person-templete\").html();\n        const personTemplete = Handlebars.compile(templeteString);\n        const html = personTemplete({\n            name: 'Tulio',\n            lastName: 'Faria'\n        })\n        $(\"people\").html(html);\n        }\n    })\n</script>\n```\n\nCom isso, o template já ficou bem mais fácil, pois apenas damos um append no html. Se funcionar, podemos até tirar a div da parte de cima do nosso HTML que vai funcionar perfeitamente.\n\nObviamente, para uma pessoa, só daria para fazer na mão, mas imagine se quisermos colocar várias pessoas, é possível fazer isso também por meio da linguagem de script e ao invés de passar uma pessoa só, vou passar a minha lista de pessoas.\n\n```jsx\n<html>\n    <body>\n        <div id=\"people\">\n            Loading...\n        </div>\n        <script type=\"text/x-handlebars-templete\" id=\"person-templete\">\n            {{#earch people}}\n            <div>\n                <strong>Name: </strong>{{nome}}<br />\n                <strong>Last Name: </strong>{{lastName}}<br />\n                <hr />\n            </div>\n            {{/each}}\n        </script>",
      "keywords": [
        "script",
        "strong",
        "html",
        "name",
        "people",
        "handlebars",
        "lastname",
        "function",
        "para",
        "dados"
      ],
      "metadata": {
        "title": "Template HTML simples - Hands-on Handlebars",
        "date": "2017-06-13",
        "tags": "['Javascript']",
        "thumbnail": "HandleBars.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/handlebars-template-html-simples/index.md"
      }
    },
    {
      "id": "e35ce69e3461cedc",
      "url": "https://devpleno.com/blog/5",
      "title": "Blog - Página 5 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 17 de out. de 2017 Você sofre de Obesidade Mental?](/obesidade-mental)\n\n[Javascript 17 de out. de 2017 WebAudioAPI - Gerando um som no browser](/webaudioapi)\n\n[Carreira 13 de out. de 2017 2 Tipos de Soluções de Software que você pode entregar](/2-tipos-de-solucoes-de-software-que-voce-pode-entregar)\n\n[Javascript 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)\n\n[Javascript 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)\n\n[Javascript 6 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)\n\n[Carreira 6 de out. de 2017 Confira 4 dicas de UX para programadores](/confira-4-dicas-de-ux-para-programadores)\n\n[Javascript 6 de out. de 2017 As vantagens do Javascript em todas as camadas de uma aplicação](/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao)\n\n[Javascript 5 de out. de 2017 Navigator Geolocation API - Sabendo a localização do usuário](/navigator-geolocation)\n\n[Javascript 5 de out. de 2017 Dicas utilizando o Split em Strings](/split-em-strings)\n\n[Javascript 3 de out. de 2017 Promise Constante - como criar situações assíncronas de teste](/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste)\n\n[Javascript 2 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)\n\n[Anterior](/blog/4)5 / 26[Próxima](/blog/6)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "carreira",
        "para",
        "blog",
        "como",
        "dicas",
        "todos",
        "algoritmos",
        "ferramentas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/5"
      }
    },
    {
      "id": "e414b51d5faacfa9",
      "url": "https://devpleno.com/factory-function",
      "title": "Factory Function em JavaScript - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Factory%20Function%20em%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Ffactory-function) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffactory-function)",
      "description": "Aprenda como usar Factory Functions em JavaScript para criar objetos sem classes. Exemplos práticos com closures e estado privado.",
      "keywords": [
        "tulio",
        "count",
        "name",
        "personfactory",
        "factory",
        "objeto",
        "para",
        "console",
        "javascript",
        "function"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/factory-function"
      }
    },
    {
      "id": "e457b2aa5cbd3b36",
      "url": "https://devpleno.com/blog/como-receber-de-empresas-estrangeiras/index",
      "title": "Impostos e como receber de empresas estrangeiras (Part 3)",
      "content": "O interessante é que, como a nota fiscal pode ser emitida para uma empresa que não tem CNPJ, o que eu declaro geralmente são alguns serviços que estão dentro da área, mas que são incluídos no Simples Nacional. (Lembrando que é importante conversar com seu contador para fazer um planejamento tributário para que você pague menos impostos).\n\nObviamente se você colocar que seu Pró-labore é de R$8mil por mês, você irá pagar mais alguns impostos.\n\n**O que é Pró-labore?**\n\nSeria mais ou menos o mesmo que a sua empresa te contratar para trabalhar para ela; essa empresa que você usa para receber vai te pagar um salário.\n\nOs contadores geralmente já indicam fazer o seguinte: colocar um Pró-labore de um salário mínimo, depois vai pegar o restante e colocar como retirada de lucro. A retirada de lucro não tem impostos, então quando você vai declarar esse dinheiro no seu imposto de renda de pessoa física, vai ter um campo que você vai declarar o quanto de retirada de lucro teve.\n\n**Por que estamos falando de tudo isso?**\n\nPorque não adianta nada você receber R$100mil do exterior e não declarar. Imagine que você vai lá e compra um carro, então você não vai ter renda nenhuma declarada na receita, então eles virão atrás.\n\nObviamente pode ser que no primeiro ano passe, o segundo passe, mas depois de um tempo eles vão achar você e descobrir o que está acontecendo.\n\nUm ponto adicional bem rápido: para a empresa americana, você precisa assinar um documento para a receita de lá. Esse documento se chama FORM A para pessoa física ou FORM B para pessoa jurídica. Basicamente esse formulário vai dizer que você está recebendo realmente esse dinheiro e que o envio da empresa não é crime, e sim que a empresa está contratando um serviço que está sendo realizado no exterior. Isso é importante, pois se um dia a Receita Federal Americana for até essa empresa, eles têm os formulários para provar para onde está indo, lembrando que esses documentos você assina digitalmente.",
      "keywords": [
        "para",
        "esse",
        "como",
        "empresa",
        "dinheiro",
        "pessoa",
        "receber",
        "isso",
        "pagar",
        "eles"
      ],
      "metadata": {
        "title": "Impostos e como receber de empresas estrangeiras",
        "date": "2017-08-18",
        "tags": "['Carreira']",
        "thumbnail": "COMO-RECEBER-DE-EMPRESAS-ESTRANGERAS-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/como-receber-de-empresas-estrangeiras/index.md"
      }
    },
    {
      "id": "e4677ff5f4e62117",
      "url": "https://devpleno.com/blog/servidores-web-entendo-back-end/index",
      "title": "Vídeo sobre Servidores Web - o back-end de uma aplicação web",
      "content": "Neste vídeo, vamos \"entrar\" um pouco mais a fundo no back-end, entendendo servidores web. O que são e como eles recebem as requisições.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/FT29w4L8TB8\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "embed",
        "responsive",
        "classname",
        "iframe",
        "neste",
        "vamos",
        "entrar",
        "pouco",
        "mais",
        "fundo"
      ],
      "metadata": {
        "title": "Vídeo sobre Servidores Web - o back-end de uma aplicação web",
        "date": "2016-07-24",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ServidorBackEnd.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/servidores-web-entendo-back-end/index.md"
      }
    },
    {
      "id": "e4b7a4ecd0b75b62",
      "url": "https://devpleno.com/busca-binaria",
      "title": "Busca Binária - DevPleno (Part 2)",
      "content": "console.log(binSearch(vetor, 0, vetor.length - 1, 5))\nPara saber se o algoritmo acabou, uma das maneiras é se por algum motivo o item do lado direito for maior que do lado esquerdo, é válido, já que vamos marcar os lados para acertar a metade, caso ele não encontre do lado esquerdo, vamos procurar do lado direito, e por fim retornar -1 caso não encontrarmos em nenhum dos lados.\n\nNos casos, fizemos um valor que não existe, 20, e um que existe, 5. A vantagem que tirei nesse projeto é que toda vez que acessavamos o índice sempre gastava muito tempo, então poderíamos fazer o seguinte para economizar:\n\nconst binSearch = (vetor, left, right, valor) => {\nif (right >= left) {\nconst indice = parseInt(left + (right - left) / 2)\n\nconst atual = vetor[indice]\n\nif (atual === valor) {\nreturn valor\n}\n\nif (atual > valor) {\nreturn binSearch(vetor, left, indice - 1, valor)\n}\n}\n}\nA medida que escalamos, isso vai ficando cada vez mais interessante já que aumentamos muito o número de itens e o número de vezes que ele passa é pequeno.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Busca%20Bin%C3%A1ria&url=https%3A%2F%2Fdevpleno.com%2Fbusca-binaria) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fbusca-binaria)",
      "description": "Hoje vamos falar um pouco mais sobre algoritmos, que são as bases da computação. Especificamente sobre um tipo de busca que eu já utilizei em um projeto e ...",
      "keywords": [
        "vetor",
        "valor",
        "busca",
        "left",
        "indice",
        "vamos",
        "binsearch",
        "right",
        "const",
        "return"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/busca-binaria"
      }
    },
    {
      "id": "e4d119b10f81c760",
      "url": "https://devpleno.com/blog/modulo-co/index",
      "title": "Módulo Co - Organize o fluxo de seu código assíncrono (Part 2)",
      "content": "Esse código funcionou igual o anterior, mas perceba que ainda está muito chato. Imagine se tivermos que ler 10 arquivos, como faríamos? Vamos melhorar isso usando o CO:\n\n```jsx\nfunction readFile(file) {\n  return new promise(function (resolve, reject) {\n    fs.readFile(file, 'utf-8', function (err, data) {\n      if (err) {\n        reject(err)\n      } else {\n        resolve(data)\n      }\n    })\n  })\n}\nco(function* () {\n  const contents = yield readFile('yarn.lock')\n  console.log(contents)\n})\n```\n\nComo tem um \\* ele é um generator, e podemos interromper a execução dele com yield e por baixo dos panos ele retorna um iterator que consegue voltar depois, o código continua sendo assíncrono, mas a única diferença é que ele mostra o código de uma forma mais fácil de entender.\n\nNós transformamos um código que era assíncrono com callBack, o transformamos em uma promise e quando usamos o CO conseguimos fazer que essa função seja executada de uma forma que parece que ela é síncrona, mas na verdade é assíncrona. Podemos, por exemplo, ler dois arquivos ao invés de um:\n\n```jsx\nco(function* () {\n  const file = ['yarn.lock', 'package.json']\n  for (let i = 0; i < file.length; i++) {\n    let contents = yield readFile(file[i])\n    console.log(contents)\n  }\n})\n```\n\nExecutando esse código ele conseguiu carregar todos os arquivos em sequência. Imagine o quanto você consegue simplificar o seu fluxo de um programa assíncrono só utilizando o próprio CO e o generator function. Podemos também fazer uma lista de promises e depois retornar todos os arrays processados segurando o código com o yield. A vantagem disso é que criamos um paralelismo, fazendo com que as promises sejam executadas de forma paralela.\n\n```jsx\nco(function* () {\n  const file = ['yarn.lock', 'package.json']\n  const filePromises = []\n  for (let i = 0; i < file.length; i++) {\n    filePromises.push(readFile(file[i]))\n  }\n  const contents = yield filePromises\n  console.log(contents)\n})\n```",
      "keywords": [
        "function",
        "readfile",
        "file",
        "data",
        "fazer",
        "digo",
        "const",
        "contents",
        "generator",
        "yarn"
      ],
      "metadata": {
        "title": "Módulo Co - Organize o fluxo de seu código assíncrono",
        "date": "2017-07-29",
        "tags": "['Javascript']",
        "thumbnail": "CO.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/modulo-co/index.md"
      }
    },
    {
      "id": "e4da5dfac4f7abca",
      "url": "https://devpleno.com/entrevista-com-edy-segura",
      "title": "DevPleno Entrevista - Edy Segura - DevPleno (Part 1)",
      "content": "Carreira\n\n## DevPleno Entrevista - Edy Segura\n\nT\nPor Tulio Faria • 3 de agosto de 2017\n\n[Carreira](/tag/carreira)\n\nEdy Segura é professor da graduação da UNIVAS e da pós-graduação do INATEL e também trabalha com desenvolvimento de software, além de ser um grande amigo meu.\n\nUma das coisas que nós compartilhamos é que você é uma das poucas pessoas que, assim como eu, tem uma formação completa, ou seja, começamos juntos no técnico, fizemos uma graduação e temos uma pós graduação também, mas eu gostaria de saber do início, o que foi o curso técnico para você e o que ele influenciou na sua carreira?\n\n“Ele foi a porta de entrada, até então nós só mexíamos em casa, tentando desenvolver algo, montando e desmontando computadores e com isso eu senti que era aquilo que eu queria fazer, então pesquisei e descobri o curso técnico que nós dois fizemos, cheguei para o meu pai e pedi o que chamamos de “paitrocinio”. Eu já trabalhava com formatação e montagem de computadores mas gostaria de saber o que mais dava pra fazer com eles. Isso abriu portas para podermos desenvolver.”\n\nUma coisa muito interessante é que começamos a programar WEB no curso técnico, no meu caso estágio do técnico e do Edy já na graduação. Nós tocavamos um provedor de internet só com estagiário e lá conseguimos nos “destravar”, ele permitiu que entrássemos realmente na área e na graduação sem medo. Conte pra gente com que tipo de projeto você lida em linhas gerais.\n\n“Hoje eu sou desenvolvedor FullStack Sênior no INATEL. Desenvolvemos soluções de mídia, em vários projetos de IPTV, OTT, soluções como Netflix que foram projetos legais onde trabalhamos para fora do país. Hoje trabalho com soluções para telecomunicações. Tem um misto de tecnologias bem interessante.”\n\nHá uma diferença dos profissionais brasileiros e os estrangeiros, não só americanos, mas alemães entre outros. Você sente essa diferença? O brasileiro tem uma vantagem ou desvantagem em relação ao pessoal de fora?",
      "description": "Edy Segura é professor da graduação da UNIVAS e da pósgraduação do INATEL e também trabalha com desenvolvimento de software, além de ser um grande amigo me...",
      "keywords": [
        "para",
        "carreira",
        "gradua",
        "https",
        "cnico",
        "devpleno",
        "segura",
        "isso",
        "fazer",
        "fora"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/entrevista-com-edy-segura"
      }
    },
    {
      "id": "e51edcc05a8f1a36",
      "url": "https://devpleno.com/blog/projeto-certo-para-estudar-programacao/index",
      "title": "Qual o projeto certo para estudar programação? (Part 2)",
      "content": "A segunda forma para manter seu ritmo de aprendizado é observar o mercado de soluções em TI e ver quais as aplicações poderiam ser replicadas. Um exemplo que temos no DevPleno é o MercadoDev, inspirado no Mercado Livre, mas implementado como uma versão reduzida utilizando o React para manter o foco nas funcionalidades de mostrar os dados do Firebase e fazer uploads de arquivos.\n\nUma dica de estudo que sempre mencionamos por aqui é “Poucas coisas novas ao mesmo tempo”. Os projetos criados no DevPleno possuem algumas funcionalidades, mas as restringimos para estudar cada aspecto de maneira focada, compreendê-la adequadamente e aplicar o conhecimento aprendido no código sem perder muito tempo. Dessa forma, garantimos que o projeto será finalizado, testado para verificar sua execução, alterado caso haja algo que não funcionou como o esperado e colocado em produção. Ao começar um projeto menor e terminar cada etapa aos poucos, sentimos a gratificação em concluir um sistema inspirado em algo que existe e funciona – o que nos motiva a estudar e aprender cada vez mais.\n\n### 3) Crie um projeto de sua autoria\n\nNão fique com vergonha de suas próprias ideias! Pegue aquela ideia esquecida na gaveta e coloque-a em prática. Lembre-se sempre de começar um projeto com poucas funcionalidades e (o que é mais importante) coloque em produção. Uma coisa muito interessante aqui no DevPleno é que as pessoas que estão acompanhando nossos minicursos gratuitos como o de [Socket.IO](https://go.devpleno.com/fsm?sck=blog), o de [ReactJS](https://go.devpleno.com/fsm?sck=blog) e o [Fullstack Academy](https://go.devpleno.com/fsm?sck=blog), estão colocando no ar suas aplicações. Já vimos várias versões do MercadoDev, iRango, MinhasSéries rodando online, o que é fantástico!",
      "keywords": [
        "para",
        "devpleno",
        "projeto",
        "como",
        "mais",
        "programa",
        "aplica",
        "https",
        "aprender",
        "suas"
      ],
      "metadata": {
        "title": "Qual o projeto certo para estudar programação?",
        "date": "2018-02-20",
        "tags": "['Carreira']",
        "thumbnail": "ProjetoCerto.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/projeto-certo-para-estudar-programacao/index.md"
      }
    },
    {
      "id": "e5592876d3af699d",
      "url": "https://devpleno.com/fullstackacademy-materiaisdeapoio",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy-materiaisdeapoio to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstackacademy",
        "materiaisdeapoio"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstackacademy-materiaisdeapoio"
      }
    },
    {
      "id": "e5906ed236411d1b",
      "url": "https://devpleno.com/tag/carreira",
      "title": "Carreira - DevPleno",
      "content": "Carreira\n\n## Arquivo de Insights\n\n93 posts encontrados com a tag Carreira\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 4 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)\n\n[Carreira 5 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)\n\n[Carreira 13 de mai. de 2021 A habilidade mais importante que um programador deveria ter (e praticar)](/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar)\n\n[Carreira 19 de mar. de 2019 Como as maratonas de programação da faculdade impactaram a minha carreira](/como-as-maratonas-de-programacao-da-faculdade-impactaram-a-minha-carreira)\n\n[Carreira 1 de mar. de 2019 Sua carreira pode mudar durante o carnaval?](/sua-carreira-pode-mudar-durante-o-carnaval)\n\n[Carreira 21 de fev. de 2018 Primeiros passos na Toptal – Série Trabalho Remoto](/primeiros-passos-na-toptal)\n\n[Carreira 21 de fev. de 2018 Processo Seletivo da Toptal – Série Trabalho Remoto](/processo-seletivo-da-toptal)\n\n[Carreira 20 de fev. de 2018 Qual o projeto certo para estudar programação?](/projeto-certo-para-estudar-programacao)\n\n[Carreira 16 de fev. de 2018 Férias e feriados trabalhando por meio da toptal](/ferias-e-feriados-trabalhando-por-meio-da-toptal)\n\n[Carreira 16 de fev. de 2018 Quanto ganha quem trabalha por meio da Toptal?](/quanto-ganha-quem-trabalha-por-meio-da-toptal)\n\n[Carreira 15 de fev. de 2018 Formas de trabalho na Toptal](/formas-de-trabalho-por-meio-da-toptal)\n\n[Carreira 15 de fev. de 2018 Horário de trabalho na toptal](/horario-de-trabalho-na-toptal)\n\nAnterior\n1 / 8[Próxima](/tag/carreira/2)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "toptal",
        "2018",
        "como",
        "para",
        "trabalho",
        "programador",
        "meio",
        "sites",
        "trabalhar"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/carreira"
      }
    },
    {
      "id": "e5b76a988b86caaa",
      "url": "https://devpleno.com/blog/23",
      "title": "Blog - Página 23 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Algoritmos 15 de mar. de 2017 Algoritmos: PermMissingElement](/algoritmos-permmissingelement)\n\n[Carreira 15 de mar. de 2017 Sobre o DevPleno](/sobre-o-devpleno)\n\n[Algoritmos 14 de mar. de 2017 Algoritmos: Cyclic Rotation](/algoritmos-cyclic-rotation)\n\n[Algoritmos 13 de mar. de 2017 Algoritmos: Odd Occurrences in Array](/algoritmos-odd-occurrences-array)\n\n[Javascript 9 de mar. de 2017 Apresentação em HTML](/apresentacao-em-html)\n\n[Javascript 9 de mar. de 2017 Hands-on: Creat-React-App](/hands-creat-react-app)\n\n[Javascript 7 de mar. de 2017 Dica: Injeção de dependência com Destructuring Assignament](/dica-injecao-de-dependencia-com-destructuring-assignament)\n\n[Javascript 7 de mar. de 2017 Hands-on: CO](/hands-on-co)\n\n[Javascript 6 de mar. de 2017 Hands-on: Slack](/hands-on-slack)\n\n[Algoritmos 3 de mar. de 2017 Algoritmos: Contar números negativos](/algoritmos-contar-numeros-negativos)\n\n[Javascript 3 de mar. de 2017 Hands-on: Benchmark](/hands-on-benchmark)\n\n[Javascript 3 de mar. de 2017 Hands-on: ShellJS](/hands-on-shelljs)\n\n[Anterior](/blog/22)23 / 26[Próxima](/blog/24)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "algoritmos",
        "2017",
        "hands",
        "javascript",
        "blog",
        "carreira",
        "todos",
        "ferramentas",
        "fundamentos",
        "nodejs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/23"
      }
    },
    {
      "id": "e608fe8b0216e7f1",
      "url": "https://devpleno.com/blog/primeiros-passos-na-toptal/index",
      "title": "Primeiros passos na Toptal – Série Trabalho Remoto",
      "content": "Depois de passar pelo processo seletivo da Toptal, quais são os primeiros passos? Descubra neste vídeo.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/VUhDqDp23Bw\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog).\n\n[![Thumbnail](DevReact.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)",
      "keywords": [
        "embed",
        "blog",
        "responsive",
        "https",
        "mais",
        "profissionais",
        "toptal",
        "classname",
        "iframe",
        "reactjs"
      ],
      "metadata": {
        "title": "Primeiros passos na Toptal – Série Trabalho Remoto",
        "date": "2018-02-21",
        "tags": "['Carreira']",
        "thumbnail": "PrimeirosPassos.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/primeiros-passos-na-toptal/index.md"
      }
    },
    {
      "id": "e65c61d667af0ba2",
      "url": "https://devpleno.com/fsl2-aulas",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /fsl2-aulas to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "fsl2",
        "aulas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fsl2-aulas"
      }
    },
    {
      "id": "e69ebf2bec2c5f3b",
      "url": "https://devpleno.com/blog/salario-em-ti/index",
      "title": "Por que o Salário em TI é baixo? DevPleno Reponde (Part 1)",
      "content": "Uma pergunta que ouço com frequência, principalmente dos profissionais da área de T.I, é: \"Por que o salário em TI é baixo?\".\n\nA primeira coisa que eu acho importante é definir o que é um salário alto ou um salário baixo. Muitos profissionais recebem um salário que é “normal” na média do mercado. Isso varia muito de uma área para outra.\n\nUm médico, por exemplo, recebe muito bem, já que há uma escassez grande na área. Em TI, também tem escassez, porém as pessoas podem trabalhar sem ter formação, o que diminui a escassez e acaba quebrando um pouco essa dificuldade.\n\nAntes de falar se o valor está baixo ou alto, é bom olhar em volta do mercado: Qual o seu salário hoje? Qual a média das pessoas que trabalham na minha cidade?\n\nTalvez você esteja em uma cidade na qual a média salarial não é muito grande porque a cidade é pequena, por exemplo. Então é bom avaliar isso na sua cidade ou região.\n\nO segundo ponto (o que acho mais importante): Avalie o seu trabalho atual, você mesmo e a sua carreira para saber se está valendo tudo isso. O salário que você ganha hoje deve contribuir para a empresa com o mesmo valor.\n\nVamos supor que o salário que você considera alto é R$10.000,00, então suas ações e o que você faz na empresa precisam gerar de R$10.000,00 a 15.000,00 no mínimo. Se não gerar isso, a empresa não ganha nada. Obviamente se você contribui muito pouco, seu salário vai ser baixo, por isso quanto mais gerencial for o cargo, maior será o salário, já que eles lidam com estratégias de extremo risco.\n\nEsqueça o salário dos outros. Às vezes achamos que valemos mais do que valeria. Claro que muitas empresas pagam menos do que você vale e isso é natural no mercado, mas se você não consegue um outro emprego em um lugar que paga melhor, talvez o problema não seja na área e sim com você.\n\nIsso se aplica em todas as áreas. Existe personal trainer que ganha menos de um salário mínimo, mas também existe personal que ganha R$100mil por mês. O mesmo acontece com TI.",
      "keywords": [
        "isso",
        "para",
        "mais",
        "baixo",
        "alto",
        "muito",
        "essa",
        "cidade",
        "carreira",
        "ganha"
      ],
      "metadata": {
        "title": "Por que o Salário em TI é baixo? DevPleno Reponde",
        "date": "2017-06-08",
        "tags": "['Carreira']",
        "thumbnail": "SalarioEmTI.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/salario-em-ti/index.md"
      }
    },
    {
      "id": "e6aab4763850ef29",
      "url": "https://devpleno.com/blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! (Part 1)",
      "content": "Todo profissional já deve ter se perguntado as reais vantagens de se trabalhar em uma grande empresa ou de se criar um negócio próprio. E isso não é diferente para os programadores. A possibilidade de fazer seu próprio horário e de não possuir um chefe cobrando prazos se revela bem atrativa. Por outro lado, abrir uma empresa é também correr riscos e ter de assumir responsabilidades compatíveis com essa escolha.\n\nNa verdade, não existe um caminho certo. Ao optar em seguir por um ou por outro, você deve ter em mente, em primeiro lugar, qual é o seu perfil. Não dá pra decidir isso baseado no amigo que fez algo que deu muito certo e por isso vai dar para você também. Quando vemos de fora, o caminho pode parecer mais fácil do que realmente é.\n\nAntes que desperdice tempo, dinheiro e energia, separamos algumas perguntas para ajudar você a pensar melhor em qual tipo de escolha se encaixaria melhor para os seus objetivos. Confira!\n\n**Como você administra suas tarefas?**\n\nNo momento de realizar tarefas você prefere fazê-las com antecedência ou espera até o prazo final de entrega? Todo grande empreendedor é um curioso e, principalmente, um realizador. Por isso, no momento de pensar em abrir uma empresa, é importante ter essa postura.\n\nSe você considera que se encaixa mais no perfil de procrastinador, tente analisar se possui [pensamentos limitantes](https://www.devpleno.com/pensamentos-limitantes?utm_source=blog&utm_campaign=rc_blogpost). Existe uma palavra muito comum no mundo do empreendedorismo chamada _mindset_, que significa \"modelos mentais\".\n\nDesde que nascemos, estamos acostumados com certos modelos mentais, que nos são passados pela família e pela cultura em geral. Apenas uma pessoa \"inquieta\" consegue ultrapassar os limites desses modelos e realizar uma verdadeira mudança de _mindset_. É por meio dessa consciência que a inovação se torna possível e, consequentemente, os grandes feitos.",
      "keywords": [
        "para",
        "isso",
        "como",
        "muito",
        "empresa",
        "pode",
        "mais",
        "melhor",
        "https",
        "source"
      ],
      "metadata": {
        "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão!",
        "date": "2017-08-12",
        "tags": "['Carreira']",
        "thumbnail": "TrabalharOuEmpreender.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index.md"
      }
    },
    {
      "id": "e6adaca8d1e16ff9",
      "url": "https://devpleno.com/fullstackmaster4",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackmaster4 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "fullstackmaster4"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/fullstackmaster4"
      }
    },
    {
      "id": "e6ec0f22522a7cc7",
      "url": "https://devpleno.com/tag/algoritmos/2",
      "title": "Algoritmos - Pagina 2 - DevPleno",
      "content": "Algoritmos\n\n## Arquivo de Insights\n\n23 posts encontrados com a tag Algoritmos\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Algoritmos 7 de jun. de 2017 Codility: Como Resolver os Desafios e Passar nos Testes de Código](/codility)\n\n[Algoritmos 22 de mai. de 2017 Once N vezes](/once-n-vezes)\n\n[Algoritmos 10 de abr. de 2017 Dica: Como saber a complexidade de um algoritmo](/dica-como-saber-complexidade-de-um-algoritmo)\n\n[Algoritmos 31 de mar. de 2017 Vídeo sobre Algoritmos: XOR Swap](/algoritmos-xor-swap)\n\n[Algoritmos 27 de mar. de 2017 Dica e Algoritmo: XOR e Odd Occurences in Array](/dica-e-algoritmo-xor-e-odd-occurences-array)\n\n[Algoritmos 15 de mar. de 2017 Algoritmos: PermMissingElement](/algoritmos-permmissingelement)\n\n[Algoritmos 14 de mar. de 2017 Algoritmos: Cyclic Rotation](/algoritmos-cyclic-rotation)\n\n[Algoritmos 13 de mar. de 2017 Algoritmos: Odd Occurrences in Array](/algoritmos-odd-occurrences-array)\n\n[Algoritmos 3 de mar. de 2017 Algoritmos: Contar números negativos](/algoritmos-contar-numeros-negativos)\n\n[Algoritmos 24 de fev. de 2017 Algoritmos: Campo Minado (Minesweeper)](/algoritmo-campo-minado-minesweeper)\n\n[Algoritmos 19 de fev. de 2017 Algoritmos: Problema 3n+1](/algoritmo-3n-1)\n\n[Anterior](/tag/algoritmos)2 / 2\nPróxima",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "algoritmos",
        "2017",
        "algoritmo",
        "dica",
        "array",
        "como",
        "carreira",
        "ferramentas",
        "fundamentos",
        "javascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/algoritmos/2"
      }
    },
    {
      "id": "e70c44f3faabb295",
      "url": "https://devpleno.com/dicas-paranpm",
      "title": "3 dicas para NPM + 1 dica extra - DevPleno (Part 1)",
      "content": "Javascript\n\n## 3 dicas para NPM + 1 dica extra\n\nT\nPor Tulio Faria • 16 de maio de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nSe você acompanha o DevPleno há algum tempo. deve ter percebido que eu utilizo bastante o learn, mas o repositório onde ficam esses módulos é o NPM. Esse repositório tem diversas funções interessantes para o nosso dia a dia, e é sobre algumas delas que vou abordar neste post. Confira:\n\n#1 – Se você quiser instalar algum módulo em uma versão especifica, pode utilizar o @ depois do nome do módulo que irá instalar. Por exemplo, o Express está no 4.1.5, mas você quer instalar o 4.0.0, então basta fazer o seguinte:\n\nnpm install express@4.0.0\nUma das vantagens disso é em relação a compatibilidade. Caso você esteja utilizando um outro módulo, por exemplo, que por questão de compatibilidade precisa do express 4.0.0, poderia fazer isso facilmente apenas utilizando o @.\n\n#2 – Você pode usar repo (repositório) para acessar o repositório do módulo e procurar as issues dele.\n\nnpm repo express\n#3 – Você também pode usar home para ir direto ao site do módulo.\n\nnpm home express\nObviamente ele está utilizando informações do próprio NPM, ou seja, se a informação não existir nele, não é possível recuperar.\n\nExtra – NPM Outdated\n\nO NPM Outdated checa suas dependências e vê se algo pode ser atualizado. Por exemplo, como forçamos o express 4.0.0, ele irá mostrar que a atual é a 4.0.0, a melhor a ser utilizada é a 4.15.2 e a ultima também é a 4.15.2.\n\nEle pode ser bastante útil caso você tenha muitas dependências para fazer na ‘mão’, o que é muito trabalhoso, e isso te livra de todo esse trabalho.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Se você acompanha o DevPleno há algum tempo. deve ter percebido que eu utilizo bastante o learn, mas o repositório onde ficam esses módulos é o NPM. Esse r...",
      "keywords": [
        "para",
        "express",
        "https",
        "dulo",
        "pode",
        "reposit",
        "javascript",
        "devpleno",
        "instalar",
        "exemplo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/dicas-paranpm"
      }
    },
    {
      "id": "e720d3d68fc4214c",
      "url": "https://devpleno.com/blog/servidor-http-basico/index",
      "title": "NodeJS Primeiros Passos: Servidor HTTP Básico",
      "content": "Aprenda NodeJS do zero com esta nova série de vídeos do DevPleno. Neste primeiro vídeo iremos introduzir um pouco de como criamos um servidor HTTP básico.\n\nO código construído está disponível [Aqui](https://github.com/devpleno/nodejs-servidor-http-basico)\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/5L5-EoJbMfY\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "devpleno",
        "https",
        "embed",
        "responsive",
        "nodejs",
        "servidor",
        "http",
        "classname",
        "iframe",
        "youtube"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Servidor HTTP Básico",
        "date": "2016-07-25",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "ServidorHttp.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/servidor-http-basico/index.md"
      }
    },
    {
      "id": "e72913911da7ea50",
      "url": "https://devpleno.com/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores",
      "title": "Metodologia ágil: entenda o que é e como se aplica para programadores! - DevPleno (Part 1)",
      "content": "Carreira\n\n## Metodologia ágil: entenda o que é e como se aplica para programadores!\n\nT\nPor Tulio Faria • 24 de julho de 2017\n\n[Carreira](/tag/carreira)\n\nNascidas nos anos 80, só vieram a ficar conhecidas depois dos anos 2000. Muito comuns no desenvolvimento de [softwares](https://www.devpleno.com/como-cobrar-por-software?utm_source=blog&#x26;utm_campaign=rc_blogpost), essas ferramentas ganharam espaço em um mercado concorrido que exige projetos rápidos, bem-feitos e sob medida para o cliente.\n\nEstamos falando sobre a metodologia ágil!\n\nMuito se fala sobre esse assunto, mas poucos entendem o que, de fato, são os métodos ágeis. Os equívocos acerca disso podem levar a uma aplicação equivocada e, em consequência, uma perda de produção e qualidade.\n\nPara evitar que isso aconteça com você, separamos neste artigo algumas informações úteis para o seu trabalho. Confira!\n\n## O que é uma metodologia ágil?\n\nAntes de sair gritando aos sete ventos sobre métodos ágeis, precisamos entender o que eles são. Concorda?\n\nMetodologias ágeis são uma alternativa para a gestão de projetos focado na [produtividade](https://www.devpleno.com/como-aumentar-a-produtividade?utm_source=blog&#x26;utm_campaign=rc_blogpost). Suas bases estão na relação entre os envolvidos no projeto. Isso inclui os gestores, a equipe de produção e o cliente.\n\nEsse método de trabalho é pautado no empirismo, ou seja: entre em contato, resolva na prática. Por esse motivo, as metodologias ágeis visam dividir as adversidades em problemas menores e resolver em etapas.\n\nAssim, diz-se que os projetos geridos por essas metodologias implicam em entregas incrementais — a entrega é apenas um incremento ao que já existe, e não um [software](https://www.devpleno.com/precificacao-em-software?utm_source=blog&#x26;utm_campaign=rc_blogpost) pronto, por exemplo — e ciclos interativos —, os trabalhos são divididos em ciclos e estes têm como objetivo melhorar os projetos anteriores.\n\nQuer um exemplo legal?",
      "description": "Nascidas nos anos 80, só vieram a ficar conhecidas depois dos anos 2000. Muito comuns no desenvolvimento de softwares, essas ferramentas ganharam espaço em...",
      "keywords": [
        "mais",
        "metodologia",
        "para",
        "geis",
        "como",
        "cliente",
        "todos",
        "assim",
        "https",
        "trabalho"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 5,
        "sourcePath": "/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores"
      }
    },
    {
      "id": "e731a0e6c5c185f5",
      "url": "https://devpleno.com/blog/decisoes-baseadas-apenas-na-questao-financeira/index",
      "title": "Decisões baseadas apenas na questão financeira",
      "content": "Pare de tomar todas as decisões da sua carreira única e exclusivamente baseadas na parte financeira! Isso mudou a forma como eu atuo no mercado hoje.\n\nQuando você coloca isso na sua cabeça, você começa a fazer naturalmente. Eu fazia isso desde meu primeiro emprego, onde ganhava R$100,00 por mês, era muito pouco pelo montante que eu fazia, porém foi a maior escola que eu tive. Se eu tivesse tomado a decisão de ir pelo dinheiro, eu não teria feito uma grande escolha para minha vida, afinal foi de lá eu tirei toda a minha base de Web.\n\nÉ muito comum olharmos apenas para o valor que vamos receber, mas quando quando você para de olhar para o dinheiro, ele acaba aparecendo. O financeiro não vai te trazer a felicidade na profissão, isso é o ponto mais importante para nós como desenvolvedores e profissionais.\n\nAtualmente muitos amigos meus que fizeram escolhas parecidas também tiveram muito sucesso. Um deles deixou de ir trabalhar em uma empresa que pagaria muito dinheiro para trabalhar em uma outra que lhe daria apenas experiência, e essa experiência foi o que permitiu que ele morasse um tempo na alemanha.\n\nPense mais estrategicamente em sua carreira. Quais os pontos que te motivam? Qual tecnologia vai trazer mais felicidade?\n\nPor exemplo, hoje eu poderia programar em JAVA, mas eu não programo porque não é uma linguagem que eu gosto.\n\nSe você não focar em dinheiro e sim na sua formação e na sua satisfação profissional, mais oportunidades vão aparecer para você.\n\nApesar de ser importante, o dinheiro não é tudo. Pense melhor sobre isso.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/8vEyw2--TRQ\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "para",
        "isso",
        "dinheiro",
        "muito",
        "mais",
        "embed",
        "quando",
        "responsive",
        "https",
        "youtube"
      ],
      "metadata": {
        "title": "Decisões baseadas apenas na questão financeira",
        "date": "2017-10-25",
        "tags": "['Carreira']",
        "thumbnail": "DECISÕES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/decisoes-baseadas-apenas-na-questao-financeira/index.md"
      }
    },
    {
      "id": "e744e19d8489cd06",
      "url": "https://devpleno.com/blog/fake-api/index",
      "title": "Fake API - Como testar seus projetos front-end (Part 2)",
      "content": "<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>\n    <script>\n      $(function()\n      {$.get('https://jsonplaceholder.typicode.com/posts', function (data) {\n        data.forEach(function (post) {\n          $('#contents').append('<h1>' + post.title + '</h1>')\n        })\n      })})\n    </script>\n  </body>\n</html>\n```\n\nLembrando que isso não é uma boa prática, mas como é apenas para intuito de aprendizado, então estou fazendo dessa forma. Perceba que ele tem um body também caso queira:\n\n```jsx\n$('#contents').append('<h2>' + post.title + '</h2>')\n\n$('#contents').append('<div>' + post.body + '</div>')\n```\n\nPor exemplo, caso você esteja fazendo uma lista de pedidos ou clientes, pode utilizar esses dados para simular como a aplicação vai se comportar com os dados. Deve haver outras opções mas essas são duas que eu utilizo bastante, funciona muito bem e agiliza muito o desenvolvimento no front-end.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/RDqevtTeN10\" allowfullscreen></iframe>\n</div>\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "dados",
        "script",
        "https",
        "body",
        "contents",
        "temos",
        "html",
        "function",
        "posts"
      ],
      "metadata": {
        "title": "Fake API - Como testar seus projetos front-end",
        "date": "2017-08-04",
        "tags": "['Javascript']",
        "thumbnail": "FAKE-API-790x400 (1).png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/fake-api/index.md"
      }
    },
    {
      "id": "e83a117847c14455",
      "url": "https://devpleno.com/blog/formatos-de-troca-de-dados-em-aplicacoes-web/index",
      "title": "Vídeo sobre Formatos de troca de dados em Aplicações Web",
      "content": "Neste vídeo da série Web Basic, vou explicar sobre os formatos de troca de dados entre as camadas do front-end e back-end.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/BBNYp0YsE-s\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "neste",
        "basic"
      ],
      "metadata": {
        "title": "Vídeo sobre Formatos de troca de dados em Aplicações Web",
        "date": "2016-07-20",
        "tags": "['Fundamentos']",
        "thumbnail": "Formato.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/formatos-de-troca-de-dados-em-aplicacoes-web/index.md"
      }
    },
    {
      "id": "e882a17cf7311559",
      "url": "https://devpleno.com/blog/pare-de-pensar-em-classes/index",
      "title": "Pare de pensar em classes!  Série - POO para JS (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/po9Ik_v5koU\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "num2",
        "this",
        "num1",
        "para",
        "mais",
        "funcional",
        "forma",
        "isso",
        "function",
        "embed"
      ],
      "metadata": {
        "title": "Pare de pensar em classes!  Série - POO para JS",
        "date": "2017-10-25",
        "tags": "['Javascript']",
        "thumbnail": "ParaDePensar.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/pare-de-pensar-em-classes/index.md"
      }
    },
    {
      "id": "e8a517fc467c66ce",
      "url": "https://devpleno.com/tag/carreira/8",
      "title": "Carreira - Pagina 8 - DevPleno",
      "content": "Carreira\n\n## Arquivo de Insights\n\n93 posts encontrados com a tag Carreira\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 22 de mar. de 2017 Carreira: Preciso de investimento para minha ideia?](/carreira-preciso-de-investimento-para-minha-ideia)\n\n[Carreira 22 de mar. de 2017 Você precisa ter DOM para ser um bom profissional?](/voce-precisa-ter-dom-para-ser-um-bom-profissional)\n\n[Carreira 15 de mar. de 2017 Sobre o DevPleno](/sobre-o-devpleno)\n\n[Carreira 14 de ago. de 2016 Por que tudo na vida acontece 2x?](/por-que-tudo-na-vida-acontece-2x)\n\n[Carreira 2 de ago. de 2016 Como está seu inglês?](/como-esta-seu-ingles-carreira)\n\n[Carreira 1 de ago. de 2016 Morro de vontade...](/morro-de-vontade)\n\n[Carreira 30 de jul. de 2016 Eu já sei! Evite uma mentalidade que não te deixa evoluir](/eu-ja-sei-carreira)\n\n[Carreira 23 de jul. de 2016 Networking da maneira certa](/networking-da-maneira-certa-carreira)\n\n[Carreira 21 de jul. de 2016 Defina metas](/defina-metas)\n\n[Anterior](/tag/carreira/7)8 / 8\nPróxima",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "carreira",
        "2016",
        "para",
        "2017",
        "algoritmos",
        "ferramentas",
        "fundamentos",
        "javascript",
        "nodejs",
        "reactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/carreira/8"
      }
    },
    {
      "id": "e8dc7461944d2006",
      "url": "https://devpleno.com/router-props-2",
      "title": "React-router-dom: como injetar props em rotas em ReactJS - DevPleno (Part 3)",
      "content": "Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=React-router-dom%3A%20como%20injetar%20props%20em%20rotas%20em%20ReactJS&url=https%3A%2F%2Fdevpleno.com%2Frouter-props-2) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frouter-props-2)",
      "description": "Confesso que tive muito trabalho até conseguir encontrar uma maneira não tão difícil de fazer a passagem de propriedades para o componente. Neste post, voc...",
      "keywords": [
        "react",
        "home",
        "props",
        "teste",
        "logo",
        "classname",
        "import",
        "router",
        "componente",
        "route"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/router-props-2"
      }
    },
    {
      "id": "e91fe4fc45c3128d",
      "url": "https://devpleno.com/blog/estudar-1-hora-por-dia-ou-8-horas-no-sabado/index",
      "title": "Estudar 1 hora por dia ou 8 horas no sábado? (Part 2)",
      "content": "Uma coisa que eu fazia na faculdade que funcionava muito bem para mim era relembrar todo o conteúdo da aula anterior antes de assistir outra aula. Se minhas aulas eram na terça e quinta, na segunda eu relembrava as aulas da terça e na quarta o de quinta, então dos 7 dias eu já estava estudando 4 dias, isso facilitou e eu evolui muito rápido em programação, sem contar os outros dias que eu brincava um pouco.\n\nÉ muito importante manter esse ritmo de estudo para gerar um hábito. Então meu conselho para você é: estude um pouco todo dia ao invés de fazer uma vez só no fim de semana. Se você pegar 20 minutos focado em um dia, é mais fácil de cumprir do que 4 ou até 8 horas seguidas, é mais fácil desfocar quando a carga horária é maior.\n\nPor esse motivo, quando vamos estudar para prova e damos aquele gás, ele pode parecer efetivo, mas na verdade pouquíssimo do tempo que você estudou é realmente efetivo, porque o estudo que dura é a prática e o conhecimento que você faz de forma recorrente, e isso vai levar você a performar melhor.\n\nPorém, se você não tem tempo durante a semana, ainda é melhor estudar 8 horas no sábado do que não estudar nada nunca, nem que sua frequência de estudo seja menor ainda sim é bom ter uma frequência de estudo, mas o ideal é manter uma frequência e enraíze seu dia a dia.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/3eIyF4i8104\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "description": "Descubra a melhor rotina de estudos para programadores: consistência diária ou maratonas no fim de semana? Dicas para organizar seus estudos.",
      "keywords": [
        "semana",
        "melhor",
        "mais",
        "estudar",
        "dias",
        "para",
        "horas",
        "esse",
        "todo",
        "bito"
      ],
      "metadata": {
        "title": "Estudar 1 hora por dia ou 8 horas no sábado?",
        "description": "Descubra a melhor rotina de estudos para programadores: consistência diária ou maratonas no fim de semana? Dicas para organizar seus estudos.",
        "date": "2017-07-18",
        "tags": "['Carreira']",
        "thumbnail": "ROTINA-DE-ESTUDOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/estudar-1-hora-por-dia-ou-8-horas-no-sabado/index.md"
      }
    },
    {
      "id": "e9a380f8aab9744a",
      "url": "https://devpleno.com/vantagens-da-injecao-de-depencia",
      "title": "Vantagens da Injeção de dependência para a testabilidade do código - DevPleno (Part 1)",
      "content": "Javascript\n\n## Vantagens da Injeção de dependência para a testabilidade do código\n\nT\nPor Tulio Faria • 1 de junho de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nJá havia falado por aqui sobre [injeção de dependência](https://www.devpleno.com/injecao-de-dependencia/), disse que muitas vezes não temos acesso ao que estamos testando. Desta vez, falo sobre as vantagens da injeção de dependência na testabilidade do código. Vamos criar um alert que é uma arrow function no qual eu passo um alert e uma mensagem. Lembrando que, nesse caso, o alert é a injeção de dependência, então é ele quem eu estou mandando para essa função chamar.\n\nconst alerts = {\nalerts: (alert, message) => alert(message)\n}\n\nmodule.exports = alerts\nNo exemplo acima, temos um módulo que alerta o usuário. É igual o alert do browser, tanto é que chamamos o alert. Então, qual a diferença? Se eu chamasse realmente o alert do browser, ele não conseguiria rodar este teste no node, então usualmente rodamos os testes sem o browser primeiro e depois rodamos em um browser que ainda não tem tela. A ideia é conseguir testar as funcionalidades do código sem necessariamente startar um browser porque isso é muito pesado. Se fossemos utilizar essa função no browser, faríamos assim:\n\nconst alerts = {\nalerts: (alert, message) => alert(message)\n}\nalerts.alert(window.alert, 'message')\nmodule.exports = alerts\nMas como vamos testar sem ter um browser, eu sei que tem um window.alert, e quando for utilizar, eu vou passar este valor para ele, mas na hora do meu teste temos que importar o alertUser:",
      "description": "Já havia falado por aqui sobre injeção de dependência, disse que muitas vezes não temos acesso ao que estamos testando. Desta vez, falo sobre as vantagens ...",
      "keywords": [
        "alert",
        "alerts",
        "message",
        "const",
        "depend",
        "para",
        "digo",
        "https",
        "browser",
        "alertmock"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/vantagens-da-injecao-de-depencia"
      }
    },
    {
      "id": "e9e892cb4d171f6e",
      "url": "https://devpleno.com/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao",
      "title": "Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! - DevPleno (Part 5)",
      "content": "Se você gostou do conteúdo e deseja estar sempre atualizado com dicas e cursos para empreender como programador, [curta a nossa página no Facebook](https://www.facebook.com/devpleno?utm_source=blog&#x26;utm_campaign=rc_blogpost) e não fique de fora das novidades!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Trabalhar%20em%20uma%20grande%20empresa%20ou%20abrir%20uma%20empresa%3F%20Desvende%20a%20quest%C3%A3o!&url=https%3A%2F%2Fdevpleno.com%2Ftrabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao) [](ht",
      "description": "Todo profissional já deve ter se perguntado as reais vantagens de se trabalhar em uma grande empresa ou de se criar um negócio próprio. E isso não é difere...",
      "keywords": [
        "para",
        "empresa",
        "isso",
        "como",
        "muito",
        "https",
        "pode",
        "mais",
        "melhor",
        "source"
      ],
      "metadata": {
        "chunkIndex": 4,
        "totalChunks": 5,
        "sourcePath": "/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao"
      }
    },
    {
      "id": "e9ee407e33d9ed2a",
      "url": "https://devpleno.com/falta-de-tempo",
      "title": "Falta tempo para realizar aquele projeto? - DevPleno (Part 2)",
      "content": "Avalie se você não está perdendo tempo em algumas tarefas ou coisas que não deveria fazer. Isso é muito importante para sempre conseguir objetivos cada vez maiores.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Falta%20tempo%20para%20realizar%20aquele%20projeto%3F&url=https%3A%2F%2Fdevpleno.com%2Ffalta-de-tempo) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffalta-de-tempo)",
      "description": "Você sempre diz para as pessoas que não tem tempo para realizar um projeto? Quando te perguntam se conseguiu implementar aquela ideia, você responde “Sabe ...",
      "keywords": [
        "tempo",
        "para",
        "mais",
        "https",
        "projeto",
        "muito",
        "devpleno",
        "carreira",
        "sempre",
        "prioridade"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/falta-de-tempo"
      }
    },
    {
      "id": "ea60e79b8d32ed9c",
      "url": "https://devpleno.com/salario-em-ti",
      "title": "Por que o Salário em TI é baixo? DevPleno Reponde - DevPleno (Part 1)",
      "content": "Carreira\n\n## Por que o Salário em TI é baixo? DevPleno Reponde\n\nT\nPor Tulio Faria • 8 de junho de 2017\n\n[Carreira](/tag/carreira)\n\nUma pergunta que ouço com frequência, principalmente dos profissionais da área de T.I, é: “Por que o salário em TI é baixo?”.\n\nA primeira coisa que eu acho importante é definir o que é um salário alto ou um salário baixo. Muitos profissionais recebem um salário que é “normal” na média do mercado. Isso varia muito de uma área para outra.\n\nUm médico, por exemplo, recebe muito bem, já que há uma escassez grande na área. Em TI, também tem escassez, porém as pessoas podem trabalhar sem ter formação, o que diminui a escassez e acaba quebrando um pouco essa dificuldade.\n\nAntes de falar se o valor está baixo ou alto, é bom olhar em volta do mercado: Qual o seu salário hoje? Qual a média das pessoas que trabalham na minha cidade?\n\nTalvez você esteja em uma cidade na qual a média salarial não é muito grande porque a cidade é pequena, por exemplo. Então é bom avaliar isso na sua cidade ou região.\n\nO segundo ponto (o que acho mais importante): Avalie o seu trabalho atual, você mesmo e a sua carreira para saber se está valendo tudo isso. O salário que você ganha hoje deve contribuir para a empresa com o mesmo valor.\n\nVamos supor que o salário que você considera alto é R$10.000,00, então suas ações e o que você faz na empresa precisam gerar de R$10.000,00 a 15.000,00 no mínimo. Se não gerar isso, a empresa não ganha nada. Obviamente se você contribui muito pouco, seu salário vai ser baixo, por isso quanto mais gerencial for o cargo, maior será o salário, já que eles lidam com estratégias de extremo risco.\n\nEsqueça o salário dos outros. Às vezes achamos que valemos mais do que valeria. Claro que muitas empresas pagam menos do que você vale e isso é natural no mercado, mas se você não consegue um outro emprego em um lugar que paga melhor, talvez o problema não seja na área e sim com você.",
      "description": "Uma pergunta que ouço com frequência, principalmente dos profissionais da área de T.I, é: &#34;Por que o salário em TI é baixo?&#34;. A primeira coisa que eu acho ...",
      "keywords": [
        "isso",
        "carreira",
        "baixo",
        "para",
        "mais",
        "https",
        "devpleno",
        "alto",
        "muito",
        "essa"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/salario-em-ti"
      }
    },
    {
      "id": "ea62919dff85985b",
      "url": "https://devpleno.com/once-n-vezes",
      "title": "Once N vezes - DevPleno (Part 2)",
      "content": "function once(fn, context) {\nlet result\nlet contador = 0\nreturn function () {\ncontador++\nif (contador === 0) {\nresult = fn.apply(context || this)\n}\ncontador++\nreturn result\n}\n}\nPodemos aumentar isso ainda mais, dizer o número máximo de vezes que queremos que chame a função, por exemplo.\n\nfunction once(fn, max, context){\nlet result\nlet contador = 0\nreturn function(){\ncontador++\nif(contador&#x3C;max){\nresult = fn.apply(context || this)\n}\ncontador++\nreturn result\n}\n}\nconst func1 = once(function){\nconsole.log('opah')\n}, 2)\nEssa técnica é muito poderosa para fazer alguns tipos de restrições.\n\nPerceba que fizemos duas coisas: travar a função para rodar apenas uma vez e em seguida rodar um número N de vezes que determinamos utilizando a mesma técnica.\n\nConfira o passo a passo no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Once%20N%20vezes&url=https%3A%2F%2Fdevpleno.com%2Fonce-n-vezes) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fonce-n-vezes)",
      "description": "Essa dica é sobre uma técnica em JavaScript de uma função utilitária que permite que uma outra função só seja executada uma única vez (Once). Para que faze...",
      "keywords": [
        "contador",
        "function",
        "once",
        "result",
        "vezes",
        "para",
        "isso",
        "return",
        "essa",
        "func1"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/once-n-vezes"
      }
    },
    {
      "id": "eaa4b37aa33fc5a6",
      "url": "https://devpleno.com/blog/como-manter-se-motivado/index",
      "title": "Como manter-se motivado (Part 1)",
      "content": "A dica de hoje foi baseada em uma pergunta de um inscrito do canal, a pergunta foi a seguinte:\n\n> Como eu consigo me manter motivado a fazer um projeto?\n\nA primeira coisa que precisamos saber e aceitar é que nem sempre vamos ter 100% de motivação, vão haver altos e baixos e isso é normal. Vão existir dias em que você não vai estar conseguindo focar em seu objetivo. O importante é conseguir estar consciente disso e perceber que está fugindo daquilo que é seu objetivo. Quando começar a perceber isso, existem algumas formas de voltar a ter motivação:\n\nEu vou passar dois pontos que eu acredito que fazem bastante diferença. Toda vez que percebo que estou perdendo motivação, eu utilizo dessas técnicas para me motivar.\n\nA primeira delas é a transformação que meu trabalho faz na vida das pessoas, esse é um dos motivos principais que me mantém muito motivado. Por exemplo, você ler isso já é um gatilho motivacional que eu uso para me motivar a fazer cada vez mais coisas. Ache esse seu gatilho e você vai perceber que as chances de perder o foco são menores.\n\nA segunda delas é que quando você está se sentindo um pouco desmotivado, tente fazer algo que te dê uma pequena vitória. Por exemplo, se você não está entendendo uma tecnologia muito complexa e não está conseguindo ver resultado, tente fazer algo com essa tecnologia, nem que seja um 'olá mundo', que te dê uma sensação de vitória.\n\nAo invés de focar em um objetivo grande, foque em um pequeno passo naquele objetivo, isso vai te ajuda a manter mais motivado.\n\nEssas duas dicas eu uso para me manter motivado, espero que isso também te ajude a se manter assim.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/MZv21GmQcv0\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "isso",
        "manter",
        "motivado",
        "fazer",
        "objetivo",
        "para",
        "embed",
        "motiva",
        "perceber",
        "responsive"
      ],
      "metadata": {
        "title": "Como manter-se motivado",
        "date": "2017-11-30",
        "tags": "['Carreira']",
        "author": "Tulio Faria",
        "thumbnail": "Como.png",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/como-manter-se-motivado/index.md"
      }
    },
    {
      "id": "eada7c670f751f3a",
      "url": "https://devpleno.com/blog/azure-cognitive-service/index",
      "title": "Classificação de imagens com Azure (Part 2)",
      "content": "```html\n<script>\n  const btn = document.getElementById('btn')\n  const imgInput = document.getElementById('imgInput')\n  const img = document.getElementById('img')\n  const key = 'keyDoAzure'\n  const azure = axios.create({\n    baseURL:\n      'https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/analyze',\n    headers: {\n      'Content-type': 'application/json',\n      'Ocp-apim-Subscription-Key': key\n    }\n  })\n\n  imgInput.addEventListener('blur', () => {\n    img.src = imgInput.value\n  })\n\n  btn.addEventListener('click', () => {\n    azure\n      .post(\n        '?visualFeactures=Categories,Description,Color&details=&language=en',\n        { url: imgInput.value }\n      )\n      .then((data) => {\n        console.log(data)\n      })\n  })\n</script>\n```\n\nAo rodar, perceba que ele consegue capturar várias tags, além de cores dominantes no background, na frente, etc. Podemos utilizar isso para classificar, por exemplo, se a foto tem algum tipo de violência.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/Evl1tRMMh0o\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "imagem",
        "imginput",
        "para",
        "axios",
        "script",
        "vamos",
        "https",
        "const",
        "azure",
        "html"
      ],
      "metadata": {
        "title": "Classificação de imagens com Azure",
        "date": "2017-11-30",
        "tags": "['Javascript']",
        "thumbnail": "classificação-de-IMAGENS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/azure-cognitive-service/index.md"
      }
    },
    {
      "id": "ebe729d82959d930",
      "url": "https://devpleno.com/blog/fetch-hands-on/index",
      "title": "Fetch - Uma nova forma de fazer requisições HTTP (Part 1)",
      "content": "Neste hands on, vamos testar o Fetch, uma alternativa que vem sendo adotada e implementada nos navegadores para substituir a forma como fazíamos requisições http no browser. Já existem módulos que implementam isso no Node, o interessante é que podemos usar a mesma API para os dois lados. Quando o navegador não tem suporte, podemos usar um Polifill.\n\nA primeira coisa que vou fazer é adicionar como dependência no meu projeto:\n\n```jsx\nyarn add node-fetch\n```\n\nAgora precisamos importá-lo. A primeira coisa muito interessante no fetch é que ele retorna promises, com isso fica muito mais simples de trabalharmos:\n\n```jsx\nconst fetch = require('node-fetch')\n\nconst url = 'http//httpbin.org.get'\n\nfetch(url).then((res)=>{\n  console.log(res)\n}\n```\n\nPerceba que estou dando um fetch para mandar pegar essa url e em seguida ele retorna o res. Ele retorna os resultados e também um json, que é uma promise. Então simplesmente se eu fizer:\n\n```jsx\nfetch(url)\n  .then((res) => res.json())\n  .then((json) => console.log(json))\n```\n\nEle vai dar o retorno do nosso httpbin, vamos passar algum parâmetro para saber se está alterando mesmo:\n\n```jsx\nconst url = 'http//httpbin.org.get?t=1'\n```\n\nPerceba que o args dele virá com o t=1 Utilizando essas promises fica muito mais fácil de se fazer o código e assim podemos utilizar também outros módulos, como generator ou até mesmo fazer um post com essa mesma ideia:\n\n```jsx\nconst urlPost = 'http//httpbin.org/post'\n\nfetch(urlPost, { method: 'Post', body: 'tulio=faria' })\n  .then((res) => res.json())\n  .then((json) => console.log(json))\n```\n\nA única diferença é que passamos um método para ele. Ele pega esse post e mostra para mim, inclusive o data. O interessante é que conseguimos fazer o mesmo controle de erro:\n\n```jsx\n.catch((e)=>console.log(e))\n```",
      "keywords": [
        "fetch",
        "para",
        "fazer",
        "json",
        "como",
        "http",
        "then",
        "post",
        "interessante",
        "muito"
      ],
      "metadata": {
        "title": "Fetch - Uma nova forma de fazer requisições HTTP",
        "date": "2017-07-27",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "FETCH-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/fetch-hands-on/index.md"
      }
    },
    {
      "id": "ebf69214b1f81b93",
      "url": "https://devpleno.com/complexidade-de-um-algoritmo",
      "title": "Como saber a complexidade de um algoritmo - DevPleno (Part 2)",
      "content": "Se por algum propósito do algoritmo o M for N, então teremos uma complexidade O(n²) que é o pior algoritmo que temos, porque ele cresce de forma exponencial.\n\nPor isso em algumas entrevistas em inglês eles vão te questionar se essa é a melhor solução, se você sabe que ela é O(n²), pode ser que não seja a melhor.\n\nExiste ainda um outro cenário, no qual passamos o for para fora:\n\nfunction calculo(vetor) {\nconst n = vetor.lenght\n\nfor (let i = 0; i &#x3C; n; i++) {}\n\nfor (let k = 0; k &#x3C; n; k++) {\nconsole.log(n * k)\n}\n}\nEsse algoritmo volta a ser O(2n), pois ele vai rodar N depois rodar novamente o N. Ele não é nada comparado a 1000, por exemplo, porque ele varia muito pouco. O grande problema então é o N e não o 2, por isso consideramos a complexidade O(n) porque somamos os dois.\n\nAgora vamos supor que esse algoritmo faça uma ordenação de sort:\n\nfuncton(vetor){\nvetor = vetor.sort()\n}\nO quick sort na média é N log N, ou seja, ele tem uma complexidade boa e qualquer coisa que fizermos, além disso temos que multiplicar ou somar, então provavelmente vai predominar o N log N.\n\nNo codelite, ele vai usar algo muito interessante que é uma estimativa do tempo que demorou para rodar o seu algoritmo para descobrir a complexidade, por isso quando você roda o algoritmo para ser avaliado, toda complexidade que ele descobre é estimada e não a real, por isso se tivermos essa noção de como evolui o algoritmo já é muito importante para resolvermos os problemas.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Hoje eu gostaria de dar uma dica rápida, principalmente para o pessoal que estiver fazendo alguns testes no codelite, porque ele considera a complexidade d...",
      "keywords": [
        "vetor",
        "algoritmo",
        "complexidade",
        "para",
        "porque",
        "rodar",
        "https",
        "saber",
        "console",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/complexidade-de-um-algoritmo"
      }
    },
    {
      "id": "ec210d835d8dd9c5",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-4/index",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms (Part 6)",
      "content": "Agora vamos fazer a rota que vai realmente salvar o vídeo, para isso precisamos ir em routes/admin.js e da mesma forma que fizemos uma rota para o supporters vamos fazer uma para vídeos:\n\n```jsx\nrouter.post('/match/:id/videos, function(req, res, next){\ndb.get('matches['+req.params.id+'].videos)\n    .push(req.body.video).write()\n    io.to('match-'+ req.params.id).emit('video', req.body.video)\n    res.send(req.body)\n})\n```\n\nDemos um push no setor de vídeos para adicionar um vídeo novo e depois emitimos que esse vídeo na sala match com o ID específico. Agora quando a gente adicionar e chegar via Socket.IO no jogo que queremos eu preciso atualizar esse vídeo na página, então eu vou voltar ao match.js que é nosso client e colocar mais um evento:\n\n```jsx\nsocket.on('video', function (video) {\n  console.log(video)\n})\n```\n\nVou fazer algo um pouco diferente. Se pegarmos o match.js, vamos perceber que os vídeos têm um monte de coisas, não é igual a barra de supporters. Nos arquivos de apoio que foram enviados, você vai perceber que tem um outro item embaixo do vídeo que é um script, que é do tipo x-handlebars-templete. Eu fiz isso para que ao invés de ter que escrever tudo isso dentro de JavaScript, vou usar isso como template e vai ficar muito mais fácil de conseguir atualizar esse trecho de código porque vamos conseguir escrever esse trecho de html sem necessariamente escrever o html no JavaScript.\n\nEntão vamos em js/match.js e lá em cima, antes de começar todos os códigos, vamos deixar em cach:\n\n```jsx\nconst videoTemplete =  Handlebars.compile($(\"#video-templete).html())\n```\n\nEntão estamos pegando o valor do vídeo em html e falando para o handlebars compilar. Perceba que no script que eu citei antes tem uma variável lá dentro, a gente vai conseguir adicionar o vídeo apenas trocando essa variável {{ video }} de lá de dentro.\n\nQuando chegar um vídeo, vou fazer o seguinte:",
      "keywords": [
        "match",
        "para",
        "supporters",
        "vamos",
        "team",
        "function",
        "video",
        "socket",
        "const",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms",
        "date": "2017-07-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 5,
        "totalChunks": 8,
        "sourcePath": "blog/minicurso-socket-io-parte-4/index.md"
      }
    },
    {
      "id": "ec42296260f05816",
      "url": "https://devpleno.com",
      "title": "DevPleno - Ajudando desenvolvedores a construir produtos de classe mundial (Part 2)",
      "content": "\"Código é apenas uma ferramenta; o valor está nos problemas que você resolve e na vida que você constrói.\"\n\n## // Conheça o Humano\n\n### Além da <sintaxe />\n\nSão 25 anos de carreira e um Mestrado na USP em Sistemas de Informação. Passei os primeiros 17 anos perseguindo cada nova onda — frameworks, linguagens, metodologias — até entender que experiência de verdade** não é colecionar tecnologias, é saber quando cada uma importa. Hoje ensino devs a construir carreiras sólidas com essa clareza.\n\n##### Pragmático Sobre Dogmático\n\nUso qualquer ferramenta que resolva o problema mais rápido sem sacrificar a sanidade a longo prazo.\n\n##### Orientado pela Comunidade\n\nConstruir em público não é apenas uma tendência; é como permanecemos responsáveis e aprendemos juntos.\n\n##### Programação com Saúde em Primeiro Lugar\n\nSeu cérebro é seu hardware. Se você não cuidar dele, o software vai sofrer.\n\n25+\n\nAnos de Carreira\n\n50+\n\nProjetos\n\n## // Diario de Bordo\n\n### Últimos Insights\n\nMergulhos profundos em tech e vida de desenvolvedor.\n\n[Ver Todos](/blog)\n\n[Ferramentas 5 de abr. de 2026 Como Usar o Describe Session do Claude Code para Conectar Projetos](/claude-code-describe-session)\n\n[Ferramentas 5 de abr. de 2026 Como Usar o Claude Code Para Otimizar Seus Arquivos Automaticamente](/claude-code-otimizacao-arquivos)\n\n[Carreira 4 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)",
      "description": "Cursos, mentorias e conteudo para desenvolvedores que querem evoluir na carreira e construir produtos incriveis.",
      "keywords": [
        "para",
        "https",
        "como",
        "devpleno",
        "programa",
        "code",
        "construir",
        "conhecer",
        "claude",
        "2026"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/"
      }
    },
    {
      "id": "ec749a923d14896c",
      "url": "https://devpleno.com/pure-functions-funcoes-puras",
      "title": "Pure Functions (Funções Puras) - DevPleno",
      "content": "Javascript\n\n## Pure Functions (Funções Puras)\n\nT\nPor Tulio Faria • 3 de março de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nUma forma de construir funções muito difundido pela programação é usar funções puras. Veja neste vídeo as vantagens dessas funções ao construir aplicações com Javascript.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Pure%20Functions%20(Fun%C3%A7%C3%B5es%20Puras)&url=https%3A%2F%2Fdevpleno.com%2Fpure-functions-funcoes-puras) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpure-functions-funcoes-puras)",
      "description": "Uma forma de construir funções muito difundido pela programação é usar funções puras. Veja neste vídeo as vantagens dessas funções ao construir aplicações ...",
      "keywords": [
        "https",
        "javascript",
        "puras",
        "functions",
        "pure",
        "fundamentos",
        "construir",
        "devpleno",
        "facebook",
        "2fdevpleno"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/pure-functions-funcoes-puras"
      }
    },
    {
      "id": "ec9e623542361a06",
      "url": "https://devpleno.com/blog/entrevista-carlos-drury-e-thiago-coelho/index",
      "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho (Part 3)",
      "content": "**Thiago Coelho**: “Como tinha dito antes, eu vim de São Paulo, sou formado pela FAI, tenho cursos técnicos em Pouso Alegre, minha paixão por desenvolvimento começou no SENAI e no IMPETTECC que foi onde eu tive o primeiro contato com tecnologia em si, quando eu comecei a fazer faculdade, o mundo era Desktop e JAVA, nesse momento eu estava começando a aprender um pouco de PHP, HTML e JavaScript, na época eu enxerguei um nicho muito grande nessas tecnologias. Trabalhei na faculdade por 4 anos na parte de desenvolvimento WEB, nessa época eu decidi ir para São Paulo pelo fator oportunidade. Mas como você disse, hoje a vida no interior tem uma qualidade de vida muito melhor, por isso eu voltei. Agora em termo de carreira, uma dica que eu posso dar para as pessoas é o Inglês, no meu caso para entrar na INATEL eu deveria ter o inglês, o que me salvou foi o JavaScript, meu conhecimento é avançado em JavaScript, mas não sou muito avançado em inglês.”\n\nPara complementar uma informação, estávamos conversando anteriormente, o inglês é o que mata, porque a gente acha que tem o inglês, mas quando está em uma chamada onde tem um indiano, um alemão e um argentino é muito complicado conversar com o pessoal. Então o inglês as vezes atrapalha a gente a conseguir algo melhor na carreira. Eu tive o mesmo teto que o Thiago teve, os clientes que eu tinha cheguei no meu limite de testar e enfrentar desafios, foi quando eu comecei a tentar coisas fora e eu não sabia inglês, o que me salvou também foi o conhecimento técnico. Enfim, Obrigado pela participação de vocês e por me receberem, sempre que puder eu vou convidar vocês para compartilhar conhecimento porque é algo muito válido.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/HmaVuyn9opU\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "para",
        "ingl",
        "grande",
        "muito",
        "carlos",
        "javascript",
        "mais",
        "conhecimento",
        "como",
        "pessoa"
      ],
      "metadata": {
        "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho",
        "date": "2017-08-03",
        "tags": "['Carreira']",
        "thumbnail": "entrevista-gdg-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/entrevista-carlos-drury-e-thiago-coelho/index.md"
      }
    },
    {
      "id": "ecb0d26a1bf6dd12",
      "url": "https://devpleno.com/reactjs-comentarios-em-jsx",
      "title": "ReactJS: comentários em JSX - DevPleno",
      "content": "Javascript\n\n## ReactJS: comentários em JSX\n\nT\nPor Tulio Faria • 23 de novembro de 2016\n\n[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)\n\nEstes dias passei por uma situação engraçada: queria apenas comentar uma parte de um JSX. JSX é a sintaxe utilizada para renderizar HTML do ReactJS. Porém, isso não foi tão simples :)\n\nA primeira tentativa seria fazer como um comentário em HTML:\n\nrender(){\nreturn (\n&#x3C;div>\n&#x3C;!-- isso não vai funcionar :) -->\n&#x3C;/div>\n)\n}\nPorém, rapidamente iremos perceber que isso não funciona :)\n\nA segunda tentativa (já que JSX é meio HTML meio JS) seria tentar:\n\nrender(){\nreturn (\n&#x3C;div>\n{ &#x3C;-- isso não vai funcionar :) ---> }\n&#x3C;/div>\n)\n}\nHum, mas não funcionou :(\n\nBom, mas aí que está o pulo do gato. Precisamos avisar o JSX que ele tem que renderizar este trecho de código como javascript e não como JSX.\n\nE aí está o motivo do qual temos que usar { }.\n\nrender(){\nreturn (\n&#x3C;div>\n{ /* isso vai funcionar :) */ }\n&#x3C;/div>\n)\n}\nNeste caso, quando utilizamos as chaves, estamos alternando o contexto entre JSX e JS, e por isso,o comentário agora irá funcionar. Basta lembrar que quando queremos “escrever” algo no JSX utilizamos { nomeDaVariavel }.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=ReactJS%3A%20coment%C3%A1rios%20em%20JSX&url=https%3A%2F%2Fdevpleno.com%2Freactjs-comentarios-em-jsx) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freactjs-comentarios-em-jsx)",
      "description": "Estes dias passei por uma situação engraçada: queria apenas comentar uma parte de um JSX. JSX é a sintaxe utilizada para renderizar HTML do ReactJS. Porém,...",
      "keywords": [
        "isso",
        "https",
        "reactjs",
        "javascript",
        "funcionar",
        "coment",
        "html",
        "como",
        "render",
        "return"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/reactjs-comentarios-em-jsx"
      }
    },
    {
      "id": "ecd8089a6ab8062f",
      "url": "https://devpleno.com/blog/morgan/index",
      "title": "O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express (Part 1)",
      "content": "O hands-on de hoje é sobre o Morgan, que é uma forma de logar ou mostrar quais requisições estão chegando em nosso servidor HTTP, seja ele feito no Express ou em Node puro utilizando o módulo HTTP.\n\nA primeira coisa que temos que fazer é adicionar as dependências:\n\n```jsx\nyarn add express morgan\n```\n\nEu já tenho um arquivo teste criado e vou começar a importar o que precisamos:\n\n```jsx\nconst express = require('express')\nconst morgan = require('morgan')\nconst app = express()\napp.get('/', (req, res) => {\n  res.send('olá DevPleno')\n})\napp.listen(3000, () => console.log('listenning'))\n```\n\nAgora vamos colocar o Morgan como um Middleware e ele vai interceptar toda a requisição que chegar:\n\n```jsx\napp.use(morgan('combined'))\n```\n\nPerceba que, ao dar F5 na página, ele traz as informações:\n\n![Exemplo 1](MorganEx1.png)\n\nIsso é muito legal porque no Apache já temos isso, e se estivermos rodando isso na Amazon, temos a possibilidade de conseguir recuperar esses dados. Temos uma outra versão que é o Tiny:\n\n```jsx\napp.use(morgan('tiny'))\n```\n\n![Exemplo 2](MorganEx2.png)\n\nNele temos um retorno mais simples, o método, saída e tempo de resposta. Ainda temos uma terceira forma, que é um padrão personalizado:\n\n```jsx\napp.use(morgan(':method :url :response-time'))\n```\n\n![Exemplo 3](morganEx3.png)\n\nLembrando que, pela Amazon, você pode guardar isso enviando para o S3. Indo para lá, você pode guardar essas informações por muito tempo.\n\nEssa é a ideia para gerar dados toda vez que a gente recebe uma requisição no Express, isso é bastante útil, é algo que já existe no Apache, mas temos que adicionar como Middleware no Express e assim configurar da maneira que queremos.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/19HkfrtUm38\" allowfullscreen></iframe>\n</div>",
      "description": "Aprenda o que é o Morgan, como instalar e configurar no Express para logar requisições HTTP. Exemplos práticos com todos os formatos de log.",
      "keywords": [
        "morgan",
        "express",
        "temos",
        "isso",
        "para",
        "embed",
        "requisi",
        "const",
        "devpleno",
        "exemplo"
      ],
      "metadata": {
        "title": "O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express",
        "description": "Aprenda o que é o Morgan, como instalar e configurar no Express para logar requisições HTTP. Exemplos práticos com todos os formatos de log.",
        "date": "2017-08-23",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Morgan.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/morgan/index.md"
      }
    },
    {
      "id": "ed0d0634ca09c9a4",
      "url": "https://devpleno.com/generators-functions",
      "title": "Generators Functions - o que acontece por baixo dos panos - DevPleno (Part 2)",
      "content": "function* generator() {\nconsole.log('Entrou no generator')\nconsole.log('Segundo passo')\nyield 'outro valor'\nconsole.log('Penultimo passo')\nconsole.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\ngen.next()\nPerceba que ele fez os dois primeiros passos, pausou para retornar o yeild, e por fim fez os dois últimos passos, por isso é chamada de função pausavel.\n\nNo yeild, podemos por exemplo retornar uma promise:\n\nfunction* generator(){\nconsole.log('Entrou no generator')\nconsole.log('Segundo passo')\nyield new Promise((resolve, reject) => {\nsetTimeout(() => resolve(10), 2000\n})\nconsole.log('Penultimo passo')\nconsole.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\niteration.value.then(() => {\ngen.next()\n})\nImagine que estamos buscando no banco de dados alguma informação; quando fazemos isso, estamos fazendo uma operação assíncrona e ela vai demorar mais tempo porque é um IO, o yeild está simulando essa busca e o iteration.value.then está esperando essa ‘busca’ para retornar as próximas informações.\n\nEntão o que o CO faz é o controle de chamar o next e executar o then de forma organizada. Vamos supor que esse código fosse um function ReadFilePromise:\n\nfunction ReadFilePromise () {\nreturn new Promise((resolve, reject) => {\nsetTimeout(() => resolve(10), 2000\n)})\n}\nfunction* generator(){\nconsole.log('Entrou no generator')\nconsole.log('Segundo passo')\nconst value = yield readFilePromise()\nconsole.log('Penultimo passo' value)\nconsole.log('fim do generator')\n}\nconst gen = generator()\nconst iteration = gen.next()\niteration.value.then(()=>{\ngen.next()\n})\nAo fazer isso, ele vai chamar a nossa function ReadFilePromise e esperar. Para aproximar mais do CO o value tem que vir preenchido, mas perceba que ele veio com undefined porque não aproveitamos o value no then. Então vamos aproveitar:",
      "description": "Hoje vamos continuar falando sobre Generators Functions em JavaScript. O que é Generator? É uma função que podemos pausar ou iterar sobre ela. Já falamos s...",
      "keywords": [
        "generator",
        "console",
        "next",
        "const",
        "iteration",
        "function",
        "para",
        "passo",
        "value",
        "valor"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/generators-functions"
      }
    },
    {
      "id": "ed11340c070deff7",
      "url": "https://devpleno.com/blog/tecnica-para-alcancar-seus-objetivos/index",
      "title": "Técnica para eliminar o que não te faz alcançar seus objetivos (Part 2)",
      "content": "Uma coisa interessante, fazendo isso, ou vai entrar coisas melhores na sua vida ou você foca na lista menor, afinal os projetos que ficaram vão ter mais energia.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/V3-0JCN99ek\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "isso",
        "como",
        "projeto",
        "para",
        "fazendo",
        "lucro",
        "muito",
        "mais",
        "resultado",
        "coisas"
      ],
      "metadata": {
        "title": "Técnica para eliminar o que não te faz alcançar seus objetivos",
        "date": "2017-08-29",
        "tags": "['Carreira']",
        "thumbnail": "Tecnica20.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/tecnica-para-alcancar-seus-objetivos/index.md"
      }
    },
    {
      "id": "ed1c8d4a6c8162d0",
      "url": "https://devpleno.com/blog/como-vender-software/index",
      "title": "negociação - Como vender um Software (Part 2)",
      "content": "A dica de ouro da negociação: depois que você tem o formato da ideia de preço, nunca tire algo da proposta sem colocar outra. Basicamente é o seguinte, imagine que seu cliente peça um desconto de um software de R$10 mil pagos em quatro vezes, quando isso acontece eu dou desconto, mas se o prazo está curto, por exemplo, eu aumento o prazo, então eu faço por R$8 mil, mas demoro o dobro do tempo. Se ele disser algo como “o que mais você pode fazer por mim?” você vai utilizar essa jogada que funciona muito bem, diga por exemplo, “eu te dou 5% de desconto se você pagar a vista”. Percebam que sempre você está tirando algo para dar outra.\n\nVamos supor que você já negociou com o cliente e está definido o que vai criar, e o cliente vem tentar adicionar uma funcionalidade nova, lembre-se da regra: você coloca algo novo, mas tem que tirar outra. Se adicionar uma funcionalidade nova, diga precisa tirar outra coisa porque não dá para fazer tudo pelo valor que foi negociado. Essa regra de negociação funciona muito bem. Tudo isso você vai construindo quando conhece bem o cliente.\n\nNegociação não é para “sangrar”, sem cobrar muito além do que vale, precisa ser algo justo. Quando eu tenho um potencial cliente que começa a tentar sangrar meu negócio, eu paro de conversar.",
      "keywords": [
        "para",
        "isso",
        "muito",
        "cliente",
        "mais",
        "negocia",
        "algo",
        "outra",
        "fazer",
        "tempo"
      ],
      "metadata": {
        "title": "negociação - Como vender um Software",
        "date": "2017-08-16",
        "tags": "['Carreira']",
        "thumbnail": "NEGOCIAÇÃO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/como-vender-software/index.md"
      }
    },
    {
      "id": "ed21783c37bec664",
      "url": "https://devpleno.com/complexidade-de-um-algoritmo",
      "title": "Como saber a complexidade de um algoritmo - DevPleno (Part 1)",
      "content": "Algoritmos\n\n## Como saber a complexidade de um algoritmo\n\nT\nPor Tulio Faria • 11 de julho de 2017\n\n*\n\n[Algoritmos](/tag/algoritmos)[Fundamentos](/tag/fundamentos)\n\nHoje eu gostaria de dar uma dica rápida, principalmente para o pessoal que estiver fazendo alguns testes no codelite, porque ele considera a complexidade de um algoritmo quando vai avaliar, obviamente depende muito de enunciado de problema.\n\nO grande problema que eu vejo é saber se a notação big-O, que usamos para saber a complexidade do algoritmo, é uma solução boa ou não. Uma ideia que gosto bastante de usar é a seguinte: se você tem uma função qualquer, e você passa um vetor para essa função:\n\nfunction calculo(vetor) {}\nComo saber a complexidade desse cálculo? Temos que olhar as coisas que podem variar no cálculo, no caso acima, o tamanho do vetor. Geralmente o tamanho do vetor seria um const n por exemplo:\n\nfunction calculo(vetor) {\nconst n = vetor.lenght\n\nfor (let i = 0; i &#x3C; n; i++) {\nconsole.log(n)\n}\n}\nEntão ela poderia variar de acordo com N. Se considerarmos que o tamanho do vetor é N (geralmente no problema eles falam isso) logo esse é um algoritmo O(n) porque ele vai rodar a coisa mais pesada dele e vai iterar N vezes, quanto maior for esse N, mais vezes vamos rodar esse pedaço de código.\n\nSe tivermos outra função, por exemplo um outro for,* e tivermos que fazer um cálculo baseado no N:\n\nfunction calculo(vetor, m) {\nconst n = vetor.lenght\n\nfor (let i = 0; i &#x3C; n; i++) {\nconsole.log(n)\nfor (let k = 0; k &#x3C; m; k++) {\nconsole.log(n * k)\n}\n}\n}\nNesse cenário, sabemos que tem dois for, um dentro do outro, o de cima varia em N e o de baixo varia em M. Se o M for um valor diferente, a complexidade dele é O(n*m), porque ele depende de dois fatores de entrada para saber a complexidade e o número de vezes que vai rodar o segundo console.log vai ser n*m.",
      "description": "Hoje eu gostaria de dar uma dica rápida, principalmente para o pessoal que estiver fazendo alguns testes no codelite, porque ele considera a complexidade d...",
      "keywords": [
        "vetor",
        "algoritmo",
        "complexidade",
        "para",
        "porque",
        "rodar",
        "https",
        "saber",
        "console",
        "isso"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/complexidade-de-um-algoritmo"
      }
    },
    {
      "id": "ed5713aba252fa8b",
      "url": "https://devpleno.com/participacao-em-eventos-e-comunidades",
      "title": "Participação em Eventos e Comunidades - DevPleno (Part 2)",
      "content": "Já sobre a participação em eventos, eu acho extremamente importante. Novamente o mais importante é fazer conexões com pessoas, vá em eventos para conversar com as pessoas. Uma das coisas que eu faço sempre é ir sozinho aos eventos, porque as dinâmicas se você está com alguém fará com essa pessoa e isso é uma grande perda de chance de conhecer novas pessoas, trocar contato e talvez perder uma parceria que pode mudar sua vida. Pode ser que você converse com alguém sobre um tema e isso mude sua vida ou perspectiva de como enxergar as coisas.\n\nEm um último evento que eu fui, que foi sobre negócios, eu conheci uma pessoa que falava sobre como controlar a ansiedade e isso foi muito legal, ele fez até um experimento para eu me acalmar e reduzir a ansiedade. Cada dia do evento eu fui conhecendo uma pessoa diferente, pois cada dia eu sentava em um lugar diferente, isso é bastante importante para nos conectarmos.\n\nO grande problema que o pessoal reclama é que não tem eventos na sua região, então a minha postura quanto a isso é encabeçar esses eventos, não presencialmente pois hoje não consigo mais, mas online eu consigo, como o Fullstack Academy. Eu deixo isso claro para minha comunidade que sempre que precisar eu estou disponível para dar palestra em qualquer evento na região que eu possa abordar algum tema. Eu faço isso porque temos que fortalecer primeiramente os eventos que estão perto da gente.\n\nTínhamos um evento na cidade que aconteceu quatro ou cinco anos seguidos e depois teve uma pausa e agora voltou esse ano e sempre que é preciso eu estou lá, antes dessa pausa eu era um dos poucos palestrantes que tinham e com isso acabamos inspirando novas pessoas a palestrar e no último ano antes da pausa, tivemos muitas palestras, isso foi muito legal porque conseguimos fortalecer um evento regional.",
      "description": "Hoje eu vou comentar um pouco sobre a participação em eventos e em comunidades, esse tema foi sugerido pelo Ian Magalhães que comentou no nosso canal do Yo...",
      "keywords": [
        "isso",
        "para",
        "eventos",
        "pessoas",
        "evento",
        "comunidades",
        "https",
        "comunidade",
        "sobre",
        "importante"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/participacao-em-eventos-e-comunidades"
      }
    },
    {
      "id": "ed780ab0fa210485",
      "url": "https://devpleno.com/hr2-aula1",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /hr2-aula1 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "aula1"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/hr2-aula1"
      }
    },
    {
      "id": "ed99b11b7eb7b60a",
      "url": "https://devpleno.com/ha-e-as",
      "title": "HA e AS em Aplicação Web - Web Basic - DevPleno (Part 2)",
      "content": "Obviamente apenas a alta disponibilidade já envolve muitas coisas, além do auto scaling, talvez precisamos de uma migração com zero down time, por exemplo, caso precisarmos aplicar uma atualização de software, que é um desafio bem grande. Essas duas siglas são muito comuns em requisitos de sistemas para startups.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=HA%20e%20AS%20em%20Aplica%C3%A7%C3%A3o%20Web%20-%20Web%20Basic&url=https%3A%2F%2Fdevpleno.com%2Fha-e-as) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fha-e-as)",
      "description": "Hoje vamos continuar com mais alguns conceitos de uma Aplicação WEB que são muito importantes quando falamos de Startups, onde temos um poder de escala mui...",
      "keywords": [
        "para",
        "disponibilidade",
        "muito",
        "https",
        "alta",
        "sistema",
        "grande",
        "auto",
        "fundamentos",
        "aplica"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/ha-e-as"
      }
    },
    {
      "id": "edc2acb8c073b5b2",
      "url": "https://devpleno.com/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira - DevPleno (Part 2)",
      "content": "- **Vista roupas diferentes daquelas que, normalmente, você veste em casa**. Passar o dia de pijama, para muitas pessoas, pode ser um convite à procrastinação. Com roupas adequadas, você estará dizendo a si mesmo que é hora do trabalho, mensagem que sua própria mente saberá identificar.\n\n- **Estabeleça um horário fixo para desenvolver seu trabalho.** Isso contribui para que você organize melhor seu dia e não comprometa seu tempo com outros compromissos que podem ser adiados, como um médico no meio do dia que pode ser remarcado para o fim da tarde. Dessa maneira, você estará zelando pelas suas entregas e não perderá prazos.\n\n- **Destine um ambiente de sua casa para chamar de escritório**. Não se trata de um alto investimento em um ambiente bem decorado e tudo mais que envolva um escritório bem equipado. Longe disso! Um pequeno espaço que reúna os recursos de que você precisa já é suficiente. Assim, é mais fácil você manter a organização, a privacidade e o silêncio para trabalhar.\n\nPara um freelancer no exterior, seguir essa cartilha é ainda mais aconselhável. Isso se deve ao fato de demorarmos um pouco mais para incorporar uma rotina quando estamos longe de casa.\n\nNesse caso, não menospreze a necessidade de impor disciplina à realização das tarefas que você deve desenvolver ao longo do dia.\n\n## 3. Conheça detalhes operacionais do trabalho de freelancer no exterior\n\nTrabalhar como freelancer fora do país requer uma série de cuidados que, muitas vezes, não precisaríamos ter no Brasil. Entre essas precauções, a principal delas talvez seja emitir nota fiscal referente aos serviços prestados.\n\nNo Brasil, essa não é uma preocupação recorrente entre profissionais que aderem a esse regime de trabalho, tampouco configura uma necessidade para grande maioria dos trabalhos.\n\nNo entanto, no exterior, a depender do país, é muito importante habilitar-se para emitir nota fiscal. Muitos freelancers fora do país perdem trabalhos importantes por não se organizarem nesse sentido.",
      "description": "O trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho. No entanto, a maiori...",
      "keywords": [
        "para",
        "freelancer",
        "trabalho",
        "exterior",
        "https",
        "carreira",
        "pode",
        "mais",
        "isso",
        "como"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira"
      }
    },
    {
      "id": "edd71b6212762017",
      "url": "https://devpleno.com/blog/entenda-sobre-cors-cross-origin-resource-sharing/index",
      "title": "Entenda sobre CORS - Cross Origin Resource Sharing (Part 1)",
      "content": "Hoje vou falar sobre um assunto que é bastante interessante: CORS (ou Cross Origin Resourse Sharing).\n\nO que isso quer dizer?\n\nÉ como dois servidores ou dois domínios diferentes poderiam compartilhar um recurso. Imagine o seguinte: nós temos o site do DevPleno e o tuliofaria.net, se eu fizer uma requisição no DevPleno, especificamente utilizando o AJAX, que tenta fazer uma requisição de dados do tuliofaria.net, o servidor do tuliofaria.net corre um risco de ter uma forma de exploração.\n\nImagine o site dos Correios, se tivéssemos que fazer isso direto com o CEP, as pessoas não sairiam do site delas e faríamos as requisições todas do site dos Correios, isso sobrecarregaria o site, além de ser uma falha de segurança porque podemos fazer algo nesse script para fazer um exploid e mandar para outro servidor. Um exemplo disso é onde você coloca o nome em uma aplicação, é possível colocar um script ali que quando o administrador for listar todos os nomes, tenha um script injetado que mande os dados para outro servidor. Por esse motivo não é possível fazer requisições para outro domínio a não ser que esse domínio permita isso.\n\nAlgumas operações falamos que são 'pre-fligth', isso quer dizer que antes dela executar é mandado uma requisição chamada 'option', nisso ele pergunta algo como “nesse CEP, quais são as opções que eu tenho nesse servidor?” e o servidor vai responder essas opções, como um GET, POST ou ditar o domínio. Caso ele responder qual o domínio, o próprio navegador não vai fazer a outra requisição, por exemplo, caso tenhamos feito um post para salvar algum dado no tuliofaria.net, o próprio navegador manda um Options, checa esse retorno e aí sim faz o post se ele puder.\n\nCORS nada mais é do que esse bloqueio, ou como a gente controla esses recursos, então durante essa troca de informações temos algumas trocas de cabeçalhos que vão dizer se esse servidor permite outro servidor acessar ou manipular os dados.",
      "keywords": [
        "servidor",
        "para",
        "esse",
        "isso",
        "requisi",
        "fazer",
        "site",
        "cors",
        "como",
        "devpleno"
      ],
      "metadata": {
        "title": "Entenda sobre CORS - Cross Origin Resource Sharing",
        "date": "2017-09-06",
        "tags": "['Fundamentos']",
        "thumbnail": "CORS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/entenda-sobre-cors-cross-origin-resource-sharing/index.md"
      }
    },
    {
      "id": "edde05f187e71437",
      "url": "https://devpleno.com/10-dicas-de-produtividade-para-programadores",
      "title": "10 dicas de produtividade para programadores - DevPleno (Part 4)",
      "content": "Um [estudo](https://www.uq.edu.au/news/article/2014/09/leafy-green-better-lean?utm_source=blog&#x26;utm_campaign=rc_blogpost) da Universidade de Queensland, na Austrália, descobriu que a presença de plantas no ambiente de trabalho aumenta a produtividade em até 15%.\n\n### Pausas\n\nEmbora pareçam difíceis de encaixar na rotina, segundo Tony Schwartz, autor de [The Way We’re Working Isn’t Working](https://www.amazon.com/Way-Were-Working-Isnt-Performance/dp/1439127662/ref=sr_1_1?ie=UTF8&#x26;s=books&#x26;qid=1273182790&#x26;sr=1-1&#x26;utm_source=blog&#x26;utm_campaign=rc_blogpost), pausas de 20 minutos a cada 90 minutos trabalhados aumentam a atenção, o foco e a energia.\n\nUm [estudo](https://www.health.harvard.edu/newsletter_article/napping-may-not-be-such-a-no-no?utm_source=blog&#x26;utm_campaign=rc_blogpost) da Universidade de Harvard, também mostra que cochilar de 20 a 30 minutos toda tarde incentiva o hipotálamo a funcionar melhor. Você pode ainda gerenciar seu tempo utilizando o Pomodoro, falamos mais disso [neste post](https://www.devpleno.com/como-ser-muito-mais-produtivo?utm_source=blog&#x26;utm_campaign=rc_blogpost).\n\n## 5. Alimentação saudável\n\nDados da [Organização Mundial da Saúde](https://www.mindflash.com/blog/2011/09/does-the-food-we-eat-affect-our-productivity?utm_source=blog&#x26;utm_campaign=rc_blogpost) (OMS) demonstram que uma alimentação adequada também pode aumentar a produtividade em 20%.\n\n## 6. Música e redes sociais\n\nAs suas músicas preferidas ajudam na concentração, segundo [Teresa Lesiuk](https://graphics8.nytimes.com/packages/pdf/business/LESIUKarticle2005.pdf?utm_source=blog&#x26;utm_campaign=rc_blogpost), professora de terapia musical da Universidade de Miami. Com elas, é possível fazer as tarefas mais rapidamente e ter ideias melhores, já que ouvir sons melodiosos libera dopamina, um hormônio relacionado ao prazer.",
      "description": "Ser um profissional produtivo é uma exigência do mercado de trabalho no cenário altamente competitivo em que vivemos. Os resultados são requisitados cada v...",
      "keywords": [
        "blog",
        "https",
        "source",
        "campaign",
        "blogpost",
        "produtividade",
        "para",
        "mais",
        "podem",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/10-dicas-de-produtividade-para-programadores"
      }
    },
    {
      "id": "edf971fe27d6a750",
      "url": "https://devpleno.com/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose",
      "title": "Mongoose: corrigindo &quot;Cannot overwrite &#39;Model&#39; model once compiled&quot; - DevPleno (Part 2)",
      "content": "module.exports = mongoose.model('User', userSchema)\nE os 2 controllers, que simulam a utilização deste model:\n\nvar User = require('./user')\n// restante do código do controller\n\nvar Post = require('./User')\n// restante do código do controller\nBom, analisando o erro novamente, podemos notar que por algum motivo ao executar o código, o módulo onde está o model está sendo instanciado mais de uma vez. E isso acarreta em setar o schema duas vezes, gerando assim este erro.\n\nSe analisarmos como está sendo dado o require em cada controller, vamos notar que um deles está como user e no outro User. No Windows, se tentarmos abrir um arquivo User.js ou user.js, ambos irão apontar para o mesmo local (que foi o que aconteceu aqui).\n\nPorém, o nodejs gerencia os módulos em si de maneira case-sensitive. Então se fizermos: require(’./User’) e require(’./user’), o nodejs vai tentar registrar 2x. O que duplica o registro do schema User no mongoose.\n\nNo Linux/Mac isso não aconteceria, pois bem antes de esse erro “pipocar”, o node já iria gritar dizendo que o módulo User.js não existe. E ficaria bem mais simples de encontrar o erro.\n\n## Outros efeitos colaterais deste problema:\n\nSe por algum motivo, tivéssemos um trecho de código que não possuísse a restrição do mongoose+schema (de não poder ser registrado mais de uma vez). Este código seria executado 2x no Windows (pois o node registraria 2x o módulo).\n\nIsso poderia gerar um bug/efeito colateral que aconteceria somente no Windows. E o código quebraria quando fosse colocado em produção no Linux. O ideal então é manter um padrão, e chamar no require da mesma forma que o arquivo foi salvo. Evitando assim, muita dor de cabeça.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Durante o desenvolvimento de um protótipo aqui na empresa, eu me deparei com uma situação bem interessante no Mongoose. Por algum motivo, comecei a receber...",
      "keywords": [
        "mongoose",
        "module",
        "user",
        "require",
        "model",
        "windows",
        "erro",
        "devpleno",
        "problem",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose"
      }
    },
    {
      "id": "eebdf74a40732b9b",
      "url": "https://devpleno.com/blog/expressoes-regulares/index",
      "title": "3 Padrões para Iniciar com Expressões Regulares (RegExp) (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/skJE3zpaj_M\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal ](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "devpleno",
        "para",
        "padr",
        "express",
        "string",
        "test",
        "const",
        "pattern3",
        "regular",
        "come"
      ],
      "metadata": {
        "title": "3 Padrões para Iniciar com Expressões Regulares (RegExp)",
        "date": "2017-08-21",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "EXPRESSÕES-REGULARES-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/expressoes-regulares/index.md"
      }
    },
    {
      "id": "eedd7ad9302a5a37",
      "url": "https://devpleno.com/blog/investimento-para-executar-ideias/index",
      "title": "Preciso de investimento para minha ideia? (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/7fk_Zm8d0W0\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "ideia",
        "para",
        "quando",
        "mais",
        "investidor",
        "muito",
        "investimento",
        "embed",
        "hoje",
        "como"
      ],
      "metadata": {
        "title": "Preciso de investimento para minha ideia?",
        "date": "2017-07-06",
        "tags": "['Carreira']",
        "thumbnail": "Investimento.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/investimento-para-executar-ideias/index.md"
      }
    },
    {
      "id": "eef14761fbc1d85d",
      "url": "https://devpleno.com/blog/minicurso-socket-io-parte-4/index",
      "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms (Part 4)",
      "content": "Agora nosso usuário está na sala especifica do jogo e também na geral. Caso queira que ele receba só a notificação da sala, eu consigo e também consigo que ele receba a atualização de geral como a atualização de placar, por exemplo. Lembrando que não difere em nada para o cliente, afinal ele já vai receber a informação já filtrada.\n\nContinuando em routes/index.js, na hora de atualizar nossos supporters vamos pegar a nossa porcentagem e mandar via Socket.IO:\n\n```jsx\nrouter.post('/match/:id/supporters', function(req, res, next){\n    const match = db.get('matches['+req.params.id+']').value()\n    if(req.body.team==='a'){\n        const newValue =  match['team-a'].supporters+1\n        db.set('matches['+req.params.id+'].team-a.supporters', newValue).write()\n    }\n    if(req.body.team==='b'){\n        const newValue =  match['team-b'].supporters+1\n        db.set('matches['+req.params.id+'].team-b.supporters', newValue).write()\n    }\n    const supportersA = match.['team-a'].supporters\n    const supportersB = match.['team-b'].supporters\n    const total = supportersA+supportersB\n    const porcentagem = {\n        teamA: 50,\n        teamB: 50\n    }\n    if(total > 0){\n        porcentagem.teamA = ((supportersA / total) * 100).toFixed(0)\n        porcentagem.teamB = ((supportersB/ total) * 100).toFixed(0)\n    }\n    io.to('match-'+req.paramns.id).emit('supporters'), porcentagem)\n    res.send({ ok: true })\n})\n```\n\nComo vamos emitir uma atualização 'supporters', temos que ir no js/match.js e falar para o Socket que ele precisa esperar um evento chama supporters:\n\n```jsx\nsocke.on('supporters', function (supporters) {\n  console.log(supporters)\n})\n```\n\nCom isso sempre que clicar em \"na torcida\" ele já irá mostrar o novo valor de supporters, agora eu preciso aplicar isso nas barras, quando chegar esse evento em supporters eu preciso atualizar:",
      "keywords": [
        "match",
        "para",
        "supporters",
        "vamos",
        "team",
        "function",
        "video",
        "socket",
        "const",
        "temos"
      ],
      "metadata": {
        "title": "Minicurso Socket.IO Parte 4 - Separando notificações por Rooms",
        "date": "2017-07-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "socketpart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 3,
        "totalChunks": 8,
        "sourcePath": "blog/minicurso-socket-io-parte-4/index.md"
      }
    },
    {
      "id": "ef1e9f50f99eecc1",
      "url": "https://devpleno.com/como-invocar-funcoes-dinamicamente-com-js",
      "title": "Como invocar funções dinamicas em JavaScript - DevPleno (Part 2)",
      "content": "Pelo resultado, notamos uma coisa muito legal no Javascript: as funções também são valores – o que nos permite escrever console[key]('valor1') e obter seu resultado no prompt:\n\nO resultado anterior permite que façamos coisas como imprimir com console[key]('valor'), a partir de um vetor de constantes key, o valor associado a cada constante:\n\nModificando a definição de const keys, podemos obter todos os métodos de console:\n\nou então passar a constante key como um valor:\n\nSe você seguiu os passos até aqui, então conseguiu chamar métodos de uma forma dinâmica – algo muito poderoso no Javascript. Outra coisa que podemos fazer está no Web Console do navegador (Ctrl+Shift+I no Google Chrome). Nesse console, temos um objeto chamado window que traz as mesmas funcionalidades para chamada dinâmica de métodos, assim como fizemos com console, vide o exemplo abaixo:\n\nE assim, surge uma mensagem “opa” na tela do navegador:\n\nPodemos, ainda, guardar uma função dentro de uma constante alertOpa:\n\nE, ao acessarmos alertOpa como um objeto, faremos a chamada da função com o texto ‘lopa’ que escrevemos como valor:\n\nA principal ideia do que aprendemos é criar funções dinâmicas e facilitar o uso de módulos de extensões de uma aplicação com essa abordagem, tanto para carregar um módulo dinâmico quanto para executar algo dentro desse módulo dinamicamente.\n\nE essa é a dica de hoje. Confira o passo a passo no vídeo abaixo.\n\nAté a próxima!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Em programação, blocos de código que executam instruções específicas são chamadas de funções e, no Javascript, são conhecidas como métodos. Agora, imagine ...",
      "keywords": [
        "como",
        "console",
        "para",
        "todos",
        "valor",
        "javascript",
        "resultado",
        "https",
        "vari",
        "dinamicamente"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/como-invocar-funcoes-dinamicamente-com-js"
      }
    },
    {
      "id": "efa264dffc40e5a2",
      "url": "https://devpleno.com/blog/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript/index",
      "title": "Verificando o tempo para executar um trecho de código em Javascript (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastra seu e-mail para não perder as novidades. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "digo",
        "console",
        "trecho",
        "para",
        "execu",
        "complexidade",
        "mais",
        "isso",
        "tempo",
        "fazer"
      ],
      "metadata": {
        "title": "Verificando o tempo para executar um trecho de código em Javascript",
        "date": "2017-02-01",
        "tags": "['Javascript']",
        "thumbnail": "js.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript/index.md"
      }
    },
    {
      "id": "f02e219f34ded4ee",
      "url": "https://devpleno.com/blog/formatos-de-troca-de-dados/index",
      "title": "Formatos de troca de dados em Aplicações Web (Part 1)",
      "content": "Hoje vamos continuar falando sobre arquitetura de uma aplicação WEB, mais especificamente sobre os formatos de troca de dados entre back-end e front-end. Lembrando que o Front-end envia algo ao back-end, como por exemplo um POST em /users.\n\nQuando fazemos isso, a requisição é formada por alguns componentes: O Header de requisição; O Body de requisição; Em seguida temos as respostas de ambos. Quando fazemos um post para o users, podemos passar estes dados em alguns formatos. O mais conhecido hoje em dia é o JSON, por exemplo:\n\n```jsx\n{\n  'name' = 'tulio'\n}\n```\n\nNo body da requisição, vamos mandar esta string, já no Header temos que enviar a informação para o servidor de que o que estamos enviando no body é um JSON. Temos outras formas de envio como o XML:\n\n```jsx\n<user>\n  <name>tulio</name>\n</user>\n```\n\n_(XML era muito comum de ser utilizado antes do JSON e RESTful ficarem tão famosos)._ A forma que ainda é muito comum de enviar estas strings é o URL encoded, nela vamos mandar os dados da seguinte forma no body da requisição:\n\n```jsx\n?name = tulio\n\nSe colocarmos mais dados:\n\n?name = Tulio & lastName = Faria.\n\nOutra forma é o mult-part form data, que diz mais ou menos assim:\n\nfield = name value\n```\n\nNo header ele envia um separador outro camp = valor outro separador. Quando ele faz este multiform data, conseguimos mandar grandes quantidades de informação.\n\n**Quando isso é recomendado?** Quando estamos fazendo um Upload como enviar uma foto ou vídeo, por exemplo. Estes são os formatos que temos para troca de dados enviando do front-end para o back-end. Já a resposta do servidor pode ser retornado com um JSON, um XML, os dados como textuais e também HTML, img, PDF, CSS, etc, basicamente qualquer tipo de arquivo que quisermos do servidor para o cliente, desde que o navegador suporte isso.\n\nConfira o video:",
      "keywords": [
        "dados",
        "para",
        "name",
        "quando",
        "requisi",
        "mais",
        "como",
        "body",
        "temos",
        "json"
      ],
      "metadata": {
        "title": "Formatos de troca de dados em Aplicações Web",
        "date": "2017-05-19",
        "tags": "['Fundamentos']",
        "thumbnail": "TROCA-DE-DADOS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/formatos-de-troca-de-dados/index.md"
      }
    },
    {
      "id": "f040106c7e612e40",
      "url": "https://devpleno.com/blog/como-gerar-um-array-populado-em-javascript/index",
      "title": "Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos (Part 2)",
      "content": "Uma observação importante é que o método `fill` usa a mesma referência. Ou seja, se passarmos um objeto como valor no fill, todos os itens do vetor referenciarão o mesmo objeto. E caso alteramos um deles, iremos alterar todos.\n\n```javascript\nconst people = new Array(3).fill({ name: 'Person' })\npeople[0].name = 'Changed Person'\n/*\npeople = \n  0: {name: \"Changed Person\"}\n  1: {name: \"Changed Person\"}\n  2: {name: \"Changed Person\"}\n*/\n```\n\nExiste uma forma de mudar ligeiramente este comportamento, bastando para isso conectar o `fill` com um `map` (lembrando que `map` transforma um vetor em outro).\n\n```javascript\nconst people = new Array(3).fill(null).map(() => ({ name: 'Person' }))\npeople[0].name = 'Changed Person'\n/*\npeople = \n  0: {name: \"Changed Person\"}\n  1: {name: \"Person\"}\n  2: {name: \"Person\"}\n*/\n```\n\n# Array.from\n\nUma outra forma de criar um array é usando o `Array.from`. Esta versão é bastante simples:\n\n```javascript\nconst array = Array.from({ length: 5 }, () => 1)\n// array = [1, 1, 1, 1, 1]\nconst people = Array.from({ length: 3 }, () => ({ name: 'Person' }))\n/*\npeople = \n  0: {name: \"Person\"}\n  1: {name: \"Person\"}\n  2: {name: \"Person\"}\n*/\n```\n\n## Usando o `Object.keys`\n\nUma forma bastante interessante de gerar um array preenchido com números é usando uma característica de objetos (sim, objetos). Usaremos o `Object.keys`.\n\n```javascript\nconst numbers = Object.keys(new Array(5).fill(null))\n// numbers = [\"0\", \"1\", \"2\", \"3\", \"4\"]\n```\n\nRepare que os números que foram inseridos no array estão com `string`. Podemos usar um map para convertê-los:\n\n```javascript\nconst numbers = Object.keys(new Array(5).fill(null)).map(Number)\n// numbers = [0, 1, 2, 3, 4]\n```\n\nBom é isso :) O que gostou destas formas de gerar um vetor? Qual a sua forma favorita?\n\nAh, todos os nossos cursos tem um módulos somente de Javascript ;) Conheça o [Fullstack Master](https://go.devpleno.com/fsm?sck=blog-como-gerar-um-array-populado-em-javascript)",
      "description": "Aprenda 5 formas de gerar arrays populados em JavaScript: Array.from, fill, spread, map e mais. Exemplos práticos para copiar e usar.",
      "keywords": [
        "name",
        "array",
        "valor",
        "person",
        "const",
        "javascript",
        "fill",
        "people",
        "forma",
        "size"
      ],
      "metadata": {
        "title": "Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos",
        "description": "Aprenda 5 formas de gerar arrays populados em JavaScript: Array.from, fill, spread, map e mais. Exemplos práticos para copiar e usar.",
        "date": "2021-07-25",
        "tags": "['Javascript']",
        "thumbnail": "array-javascript.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/como-gerar-um-array-populado-em-javascript/index.md"
      }
    },
    {
      "id": "f052d98658979bd7",
      "url": "https://devpleno.com/entrevista-carlos-drury-e-thiago-coelho",
      "title": "DevPleno Entrevista - Carlos Drury e Thiago Coelho - DevPleno (Part 2)",
      "content": "**Carlos Drury**: “Uma pessoa que quer se envolver com o GDG pode primeiramente ir no site do Google de diretórios de group developers tool e lá ela consegue encontrar um GDG mais próximo. O benefício para a pessoa que participa do GDG é a forma de compartilhar conhecimento, o GDG não está aqui para ganhar dinheiro, nem promover uma pessoa e sim para ajudar projetos.”\n\nUma coisa que eu queria ressaltar é toda vez que eu participo de um evento eu aprendo até mais do que eu ensino ou compartilho. Toda vez que me preparo para um evento, a minha preparação é um estudo muito grande. Como vocês estão integrados em vários projetos grandes e têm a qualidade de vida do desenvolvedor em um lugar que não é em um grande centro, o crescimento demora um pouco para chegar, porém com uma vantagem que economizamos tempo (em 10 minutos estamos na academia, em cidades vizinhas estamos a vinte minutos), então se você fosse dar uma dica de carreira, independente se é de cidade grande ou em uma cidade do interior, qual seria?\n\n**Carlos Drury**: “Minha primeira dica é a pessoa ser pró-ativa, procurar saber sobre assuntos que interessam, tecnologias que ela quer aprender. Uma segunda indiscutivelmente é o Inglês, hoje é fundamental para se comunicar com pessoas do mundo inteiro e até mesmo entender novas ferramentas disponíveis no mercado. O mais importante para mim, para conseguir o emprego que tive hoje foi o intercâmbio.”",
      "description": "Carlos Drury e Thiago Coelho fazem parte do GDG Vale da Eletrônica. Essa entrevista aconteceu durante um evento organizado por eles no Vale da Eletrônica, ...",
      "keywords": [
        "para",
        "carlos",
        "ingl",
        "drury",
        "thiago",
        "carreira",
        "grande",
        "muito",
        "https",
        "coelho"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 4,
        "sourcePath": "/entrevista-carlos-drury-e-thiago-coelho"
      }
    },
    {
      "id": "f08a3e6ec4bb4a8f",
      "url": "https://devpleno.com/blog/nodejs-primeiros-passos-async-map/index",
      "title": "NodeJS Primeiros Passos: Async - Map",
      "content": "Neste vídeo, vou mostrar uma outra forma de organizar códigos assíncrono, neste caso, executando a mesma operação assíncrona em uma lista de dados e agrupando o resultado no fim.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/gBRGWY71pcw\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "neste",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "mostrar"
      ],
      "metadata": {
        "title": "NodeJS Primeiros Passos: Async - Map",
        "date": "2016-08-17",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "AsyncMap.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/nodejs-primeiros-passos-async-map/index.md"
      }
    },
    {
      "id": "f09dffcc0b164c9a",
      "url": "https://devpleno.com/find",
      "title": "High-order Function Find - DevPleno (Part 2)",
      "content": "console.log(carrinho.find(idEquals1)\nEu já sei que estou travando o ID em um, criando uma nova função a partir da função que eu já tinha. A vantagem disso é que vamos saindo de funções mais genéricas para funções mais específicas que também são fáceis de testar, deixando o código cada vez mais legível. Óbvio que esse exemplo é bem simples, mas poderíamos travar uma dependência com um banco, por exemplo.\n\nPodemos usar o bind junto com find e qualquer outra função para travar algumas variáveis criando funções novas que travam alguns desses valores.\n\nConfira o video:\n\no [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=High-order%20Function%20Find&url=https%3A%2F%2Fdevpleno.com%2Ffind) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffind)",
      "description": "Já falamos sobre map, reduce e filter, hoje vou mostrar uma highorder function bem parecida chamada de find. Vamos aproveitar o exemplo do reduce: Perceba ...",
      "keywords": [
        "item",
        "const",
        "https",
        "find",
        "carrinho",
        "devpleno",
        "mais",
        "high",
        "order",
        "reduce"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/find"
      }
    },
    {
      "id": "f0a95fe7b5890be1",
      "url": "https://devpleno.com/dom",
      "title": "Você precisar ter DOM para ser um bom profissional? - DevPleno (Part 2)",
      "content": "[](https://twitter.com/intent/tweet?text=Voc%C3%AA%20precisar%20ter%20DOM%20para%20ser%20um%20bom%20profissional%3F&url=https%3A%2F%2Fdevpleno.com%2Fdom) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdom)",
      "description": "Já te contaram a mentira do Dom? Vou te explicar melhor. Uma coisa que eu sempre vejo as pessoas falando é “ah, Tulio, você tem o dom para aprender tecnolo...",
      "keywords": [
        "para",
        "https",
        "aprender",
        "isso",
        "coisa",
        "pessoas",
        "carreira",
        "errar",
        "tulio",
        "mentira"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/dom"
      }
    },
    {
      "id": "f0aa3ce87c73f8e3",
      "url": "https://devpleno.com/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar",
      "title": "A habilidade mais importante que um programador deveria ter (e praticar) - DevPleno (Part 3)",
      "content": "**Maneira 4:** crie o hábito de questionar soluções trazidas por colegas de trabalho e por sua equipe. Importante você deixar claro o motivo das perguntas para não passar por “cri-cri” ou chato. Caso você prefira, você pode guardar as perguntas e potenciais respostas para você como uma forma de praticar esta habilidade (funciona muito bem em cenários que você - por questões hierárquicas não será ouvido - e está tudo bem).\n\n## Antes de encerrar, procure por perguntas de outras pessoas / empresas\n\nMuitas vezes consumimos conteúdos de casos de uso de uma tecnologia x. Ou como uma big tech começou a usar y. Entenda sempre as perguntas que eles fizeram até chegarem a aquelas respostas. Isso vai te ajudar a entender se é viável para todos os cenários ou somente para quando você tem um nível de escalada desta big tech.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=A%20habilidade%20mais%20importante%20que%20um%20programador%20deveria%20ter%20(e%20praticar)&url=https%3A%2F%2Fdevpleno.com%2Fa-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fa-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar)",
      "description": "É muito comum na área de programação todos pensarem que a habilidade mais importante esteja relacionada ao pensamento lógico e a capacidade de resolver pro...",
      "keywords": [
        "resultado",
        "perguntas",
        "para",
        "habilidade",
        "mais",
        "rios",
        "como",
        "solu",
        "importante",
        "muito"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar"
      }
    },
    {
      "id": "f0b2d218f1dc3dbf",
      "url": "https://devpleno.com/template-strings",
      "title": "ES6 - Template Strings - DevPleno (Part 1)",
      "content": "Javascript\n\n## ES6 - Template Strings\n\nT\nPor Tulio Faria • 30 de maio de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nComo já citei em outros posts, (como em: [ES6 Spread Operator](https://www.devpleno.com/spread-operator/), [Async/await](https://devpleno.com/async-await), [Destructuring Assignment](https://devpleno.com/dica-es6-destructuring-assignament)) o ES6 apresenta algumas novidades, uma delas é o Template Strings, uma forma de declarar uma string em JavaScript.\n\nconst str1 = `teste`\nconsole.log(str1)\nEla será o mesmo que se fizermos uma String convencional, porém podemos fazer algumas coisas extras. Exemplo: Se eu quisesse uma String multilinha, teria que fazer o seguinte:\n\nconst str1 = `teste`\nconst strMultiLinha = 'linha1 \\n linha2'\nconsole.log(strMultiLinha)\nOu seja, teria que utilizar o contra barra (ou scape) em todas as linhas, o que é um tanto chato.\n\n### O que pode ser feito?\n\nCom o Template String é possível fazer simplesmente isso:\n\nconst strMultiLinha = `linha1\nlinha meio\nlinha2`\nconsole.log(strMultiLinha)\nNão é mais necessário utilizar o \\n, isso deixa o código mais limpo. Outra coisa do Template String é que podemos criar uma string interpolada, ou seja, misturar uma expressão com a string que vai ser avaliada e depois colocar ela entre pólos, ao invés de concatenar. Fazemos isso apenas abrindo um \\$ {expressão}, por exemplo:\n\nconst str = `Ola \\$ {1 + 1} !`\nconsole.log(str)\nObviamente também podemos colocar variáveis dentro:\n\nconst a = 10\nconst str = `Ola \\$ {a + 1} !`\nconsole.log(str)\nExiste ainda uma outra funcionalidade interessante: utilizar algumas tags com o Template String. Exemplo: Vamos criar uma tag e ela vai receber strings e values.",
      "description": "Como já citei em outros posts, (como em: ES6 Spread Operator, Async/await, Destructuring Assignment) o ES6 apresenta algumas novidades, uma delas é o Templ...",
      "keywords": [
        "strings",
        "https",
        "string",
        "const",
        "console",
        "template",
        "devpleno",
        "isso",
        "javascript",
        "podemos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/template-strings"
      }
    },
    {
      "id": "f15280fc5a007e5d",
      "url": "https://devpleno.com/blog/qual-a-sua-desculpa/index",
      "title": "Qual é a sua desculpa?",
      "content": "Qual a sua desculpa para não fazer ou não estudar alguma coisa hoje?\n\nNosso corpo e nossa mente tem essa mania de dar desculpas para tudo, então sempre que queremos dar um passo a mais, estudar algo novo ou fazer algo interessante, a nossa mente nos dá desculpas para não fazer e muitas vezes acreditamos nessas desculpas. Por exemplo, estou muito cansado para aprender uma linguagem nova ou um idioma novo.\n\nO problema nisso é que como conhecemos muito bem nosso corpo e mente, damos desculpas que nós mesmos acreditamos, então é muito difícil lutar contra isso. A minha dica é que sempre que você se pegar dando uma desculpa, converta isso em uma motivação, afinal esse é seu corpo tentando te 'proteger' e você deve lutar contra isso porque é apenas a sua mente tentando me desviar do seu objetivo.\n\nSempre que ouvir de alguém que algo é difícil de ser feito, pegue isso e transforme em motivação para você, pois quem quer fazer arruma um jeito e quem não quer arruma desculpa.\n\nVeja o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/jbSspugOsM4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "fazer",
        "mente",
        "desculpas",
        "isso",
        "embed",
        "desculpa",
        "corpo",
        "sempre",
        "algo"
      ],
      "metadata": {
        "title": "Qual é a sua desculpa?",
        "date": "2017-06-22",
        "tags": "['Carreira']",
        "thumbnail": "QualDesculpa.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/qual-a-sua-desculpa/index.md"
      }
    },
    {
      "id": "f163bac24344d91b",
      "url": "https://devpleno.com/blog/streams-parte-3-transform/index",
      "title": "Hands-on: Streams Parte 4 - Transform (Part 2)",
      "content": "```jsx\nconst fs = require('fs')\nconst zlib = require('zlib')\nconst readable = fs.createReadStream('arquivo.txt')\nconst readable = fs.createWriteStream('arquivo-upper.txt')\nconst Transform = require('Stream').Transform\nconst upperCase = new Transform({\n  transform(chunk, encoding, callback) {\n    const chunkUpper = (chunk + '').toUpperCase()\n    this.push(chunkUpper)\n    callback()\n  }\n})\nreadable.pipe(upperCase).pipe(writable)\n```\n\nNo código acima, criamos um Stream transform pegando o Stream do core do Node utilizando a instancia de transform. Em seguida, criamos uma função upperCase e essa mesma função espera que passamos um método transform, enviando um chunk, encoding e um callback. Transformamos este chunck em um tipo string eo retornamos eem push.\n\nTemos um callback ali, pois este método poderia ser assíncrono, fazendo outra operação que dependesse de um IO e, com isso, chamaríamos o callback quando tivéssemos terminado de transformar o chunk de dado.\n\nEm resumo, pegamos o que o readable enviou, criamos uma variável nova e passamos esta informação para maiúsculo.\n\n**Qual a utilidade do Transform?**\n\nÉ muito comum utilizarmos este stream para zippar arquivos e transformá-los para maiúsculos. Isso é muito poderoso para podermos criar aplicações que não precisam ler realmente estes dados em memória para depois ser processados. Por exemplo, o zipper que criamos irá zippar pedaços do arquivo e isso não consome tanto recurso da maquina.\n\n**Conclusão**\n\nEste tipo de Stream é muito interessante e eu recomendo fortemente que você faça alguns testes. Existem outras maneiras de fazer o transform, como por exemplo em alguns casos em que estendemos a classe, mas acredito que a forma explicada aqui seja mais convencional ou 'java way'.\n\nConfira também o vídeo do hand-on:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/gp7sB7-bPAg\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "const",
        "readable",
        "transform",
        "writable",
        "para",
        "stream",
        "pipe",
        "arquivo",
        "zipper",
        "criamos"
      ],
      "metadata": {
        "title": "Hands-on: Streams Parte 4 - Transform",
        "date": "2017-05-10",
        "tags": "['Javascript']",
        "thumbnail": "StreamPart4.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/streams-parte-3-transform/index.md"
      }
    },
    {
      "id": "f16812ffaabb7570",
      "url": "https://devpleno.com/blog/16",
      "title": "Blog - Página 16 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 30 de mai. de 2017 4 novos Métodos Strings que você precisa conhecer](/4-novos-metodos)\n\n[Javascript 30 de mai. de 2017 Dica: ES6 - Destructuring Assignament](/dica-es6-destructuring-assignament)\n\n[Javascript 30 de mai. de 2017 NodeJS Primeiros Passos: Módulo em NodeJS](/modulos)\n\n[Javascript 30 de mai. de 2017 ES6 - Template Strings](/template-strings)\n\n[Javascript 29 de mai. de 2017 Como construir um beatbox com JavaScript](/beatbox-com-javascript)\n\n[Javascript 29 de mai. de 2017 Construindo um Beatbox Manipulável com JS](/beatbox-manipulavel-com-js)\n\n[Javascript 29 de mai. de 2017 Chocolatey - Gerenciador de Pacotes para Windows](/chocolatey)\n\n[Javascript 26 de mai. de 2017 Currying - Uma técnica interessante usada em programação funcional](/currying)\n\n[Javascript 26 de mai. de 2017 Metrônomo com JavaScript](/metronomo-com-javascript)\n\n[Javascript 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)\n\n[Javascript 25 de mai. de 2017 4 funcionalidades do Console no DevTools que você não conhece](/funcionalidades-do-console)\n\n[Javascript 24 de mai. de 2017 Tocando um Áudio com JS puro](/audio-com-js-puro)\n\n[Anterior](/blog/15)16 / 26[Próxima](/blog/17)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "nodejs",
        "beatbox",
        "todos",
        "blog",
        "strings",
        "para",
        "precisa",
        "algoritmos"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/16"
      }
    },
    {
      "id": "f179ad96bb596684",
      "url": "https://devpleno.com/blog/promisify-node/index",
      "title": "Promisify-Node: Convertendo funções clássicas do Node em Promises (Part 1)",
      "content": "Neste post, vamos fazer um hands-on do Promisify-Node, uma forma de converter as funções clássicas do Node em JavaScript que retornam callback em promises. Existem vários módulos que já fazem isso, como em módulos utilitários de promises, o q, bluebird, por exemplo.\n\n**Então por que usar o Promisify-Node?**\n\nEle tem uma funcionalidade bastante relevante que vou mostrar durante o hands-on, vamos lá. Para instalar e adicionar como dependência o Promisify-Node:\n\n```jsx\nyarn add promisify-node\n```\n\nVamos importar o promisify e o fs(file system) para termos uma função com o callBack.\n\n```jsx\nconst promisify = require('promisify-node')\nconst fs = require('fs')\n```\n\nSe fossemos utilizar o fs normalmente, iriamos fazer o seguinte:\n\n```jsx\nfs.readFile('arquivo.js', (err, data) => console.log(data.toString()))\n```\n\nEntão ele retorna um callBack, onde eu consigo escrever o conteúdo do arquivo. Então vamos converter essa função em promise para, por exemplo, usar o then dentro de um generator ou com async/await.\n\nPodemos pegar essa função fs.readFile, criar uma nova readFile e passar para promisify, assim:\n\n```jsx\nconst readFile = promisyfy(fs.readFile)\n```\n\n**Qual a diferença?**\n\nAgora eu posso chamar a readFile, falar qual arquivo eu quero (no caso o arquivo.js) e chamar ele no modo promisify.\n\n```jsx\nreadFile('arquivo.js').then((data) => console.log(data.toString()))\n```\n\n**Qual a vantagem?**\n\nAlém da promisify ser mais fácil de manipular, evitamos o callback hell ou código hadouken, que faz uma barrigona de tanto callback que tem um dentro do outro.\n\nTambém podemos utilizar com generator e com async/await. Outra coisa legal é que, se quisermos usar todas as funções do fs como uma promise, podemos mudar o Const fs = require('fs') assim:\n\n```jsx\nconst fs = promisify('fs')\n```\n\nE, assim, qualquer função que eu for utilizar, como por exemplo:\n\n```jsx\nfs.readFile('arquivo.js', (err, data) => console.log(data.toString()))\n```",
      "keywords": [
        "promisify",
        "readfile",
        "para",
        "data",
        "callback",
        "arquivo",
        "node",
        "const",
        "promise",
        "vamos"
      ],
      "metadata": {
        "title": "Promisify-Node: Convertendo funções clássicas do Node em Promises",
        "date": "2017-05-04",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "PormisifyNode.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/promisify-node/index.md"
      }
    },
    {
      "id": "f18a06a3d1b0e690",
      "url": "https://devpleno.com/blog/dica-es6-destructuring-assignament/index",
      "title": "Dica: ES6 - Destructuring Assignament",
      "content": "Nesta dica, comento sobre uma novidade que veio com o ES6: o Destructuring Assignament, que permite uma grande organização e aumento de legibilidade do código. Confira!\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/XhPCG9JZ_yE\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook",
        "nesta",
        "dica"
      ],
      "metadata": {
        "title": "Dica: ES6 - Destructuring Assignament",
        "date": "2017-05-30",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "ES6-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-es6-destructuring-assignament/index.md"
      }
    },
    {
      "id": "f1b95465be5e8a7d",
      "url": "https://devpleno.com/o-que-fazer-para-dar-certo",
      "title": "O que fazer para dar certo? - DevPleno",
      "content": "Carreira\n\n## O que fazer para dar certo?\n\nT\nPor Tulio Faria • 10 de novembro de 2017\n\n[Carreira](/tag/carreira)\n\nHoje eu gostaria de responder uma coisa que eu ouço muito. As pessoas sempre me perguntam como que eu faço para dar certo. Como dar certo para trabalhar no exterior, nos projetos, no emprego novo, etc.\n\nUma coisa que eu venho refletindo de tudo que eu venho fazendo e coincidiu com o que um mentor meu me disse e eu achei fantástica é a seguinte:\n\nA primeira coisa é mudar de pensar e trocar o PARA por ATÉ. Comece a pensar nas coisas ATÈ conseguir alcançar seus objetivos, assim elas vão dar certo.\n\nPode parecer besteira, mas quando colocamos isso na cabeça, mudamos a forma de pensar e tudo muda. Faça as coisas até elas darem certo. Se você fizer isso, pode ter certeza que vai fazer muita diferença no seu mind-set.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=O%20que%20fazer%20para%20dar%20certo%3F&url=https%3A%2F%2Fdevpleno.com%2Fo-que-fazer-para-dar-certo) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fo-que-fazer-para-dar-certo)",
      "description": "Hoje eu gostaria de responder uma coisa que eu ouço muito. As pessoas sempre me perguntam como que eu faço para dar certo. Como dar certo para trabalhar no...",
      "keywords": [
        "para",
        "certo",
        "https",
        "fazer",
        "carreira",
        "coisa",
        "pensar",
        "como",
        "venho",
        "tudo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/o-que-fazer-para-dar-certo"
      }
    },
    {
      "id": "f1bd36505a50a4a5",
      "url": "https://devpleno.com/blog/horario-de-trabalho-na-toptal/index",
      "title": "Horário de trabalho na toptal",
      "content": "Você também tem dúvida sobre como é o horário de trabalho quando se trabalha remotamente? Descubra como é na Toptal.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/FGIZLWcLhsc\" allowfullscreen></iframe>\n</div>\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS.\n\nSaiba mais\n\n[![Curso DevReactJS](DevReact.png)](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)",
      "keywords": [
        "embed",
        "responsive",
        "mais",
        "profissionais",
        "como",
        "toptal",
        "classname",
        "iframe",
        "https",
        "reactjs"
      ],
      "metadata": {
        "title": "Horário de trabalho na toptal",
        "date": "2018-02-15",
        "tags": "['Carreira']",
        "thumbnail": "HorarioDaToptal.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/horario-de-trabalho-na-toptal/index.md"
      }
    },
    {
      "id": "f1d3221de7fabd32",
      "url": "https://devpleno.com/handlebars-template-html-simples",
      "title": "Template HTML simples - Hands-on Handlebars - DevPleno (Part 3)",
      "content": "&#x3C;html>\n&#x3C;body>\n&#x3C;div id=\"people\">\nLoading...\n&#x3C;/div>\n&#x3C;script type=\"text/x-handlebars-templete\" id=\"person-templete\">\n{{#earch people}}\n&#x3C;div>\n&#x3C;strong>Name: &#x3C;/strong>{{nome}}&#x3C;br />\n&#x3C;strong>Last Name: &#x3C;/strong>{{lastName}}&#x3C;br />\n&#x3C;hr />\n&#x3C;/div>\n{{/each}}\n&#x3C;/script>\n\n&#x3C;script src=\"https://code.jquery.com/jquery-3.2.1.slim.min.js\">&#x3C;/script>\n\n&#x3C;script src=\"https://cdnjs.cloudflare.com/ajax/libs/handleb\nars.js/4.0.10/handlebars.amd.js\"&#x3C;/script>\n\n&#x3C;script>\n$function(){\n$.get('dados.json't=' +new Date().getTime(), function(data){\nconst templeteString = $(\"#person-templete\").html();\nconst personTemplete = Handlebars.compile(templeteString);\nconst html = personTemplete({ people: data })\n$(\"people\").html(html);\n}\n})\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nPerceba que o Name e o lastName ele pega de dentro do contexto do people do dados.json. Outra coisa legal é que se eu colocar algo dentro de dados.json:\n\n[{\n\"name\": \"Tulio\",\n\"lastName\": \"Faria\",\n\"adress\": {\n\"city\": \"Pouso Alegre\"\n}\n},{\n\"name\": \"Vitor\",\n\"lastName\": \"Machado\"\n\"adress\": {\n\"city\": \"São Paulo\"\n}\n}]\nPodemos utilizar a seguinte estrutura:\n\n{{#earch people}}\n&#x3C;div>\n&#x3C;strong>Name: &#x3C;/strong>{{nome}}&#x3C;br />\n&#x3C;strong>Last Name: &#x3C;/strong>{{lastName}}&#x3C;br />\n&#x3C;strong>City: &#x3C;/strong>{{adress.city}}&#x3C;br />\n&#x3C;hr />\n&#x3C;/div>\n{{/each}}\nPerceba que estamos pegando o adress e o que tem dentro dele. Isso é bem bacana, podemos fazer muitas coisas com Handlebars.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "O Handlebars é uma forma de lidarmos com template HTML. É algo simples, mas que possui diversas opções que podemos fazer. Vou mostrar um caso bem específic...",
      "keywords": [
        "script",
        "strong",
        "html",
        "name",
        "handlebars",
        "people",
        "https",
        "template",
        "lastname",
        "function"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "/handlebars-template-html-simples"
      }
    },
    {
      "id": "f1faf9212b69758f",
      "url": "https://devpleno.com/devreactjs-lista-de-espera",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-lista-de-espera to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from",
        "lista",
        "espera"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-lista-de-espera"
      }
    },
    {
      "id": "f1fca22dcc0bd79e",
      "url": "https://devpleno.com/primeiros-passos-na-toptal",
      "title": "Primeiros passos na Toptal – Série Trabalho Remoto - DevPleno",
      "content": "Carreira\n\n## Primeiros passos na Toptal – Série Trabalho Remoto\n\nT\nPor Tulio Faria • 21 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nDepois de passar pelo processo seletivo da Toptal, quais são os primeiros passos? Descubra neste vídeo.\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog).\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Primeiros%20passos%20na%20Toptal%20%E2%80%93%20S%C3%A9rie%20Trabalho%20Remoto&url=https%3A%2F%2Fdevpleno.com%2Fprimeiros-passos-na-toptal) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprimeiros-passos-na-toptal)",
      "description": "Depois de passar pelo processo seletivo da Toptal, quais são os primeiros passos? Descubra neste vídeo. <div className=&#34;embedresponsive embedresponsive16by...",
      "keywords": [
        "https",
        "toptal",
        "passos",
        "blog",
        "carreira",
        "primeiros",
        "mais",
        "profissionais",
        "reactjs",
        "devreactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/primeiros-passos-na-toptal"
      }
    },
    {
      "id": "f27ead9d38d5887d",
      "url": "https://devpleno.com/blog/router-props-2/index",
      "title": "React-router-dom: como injetar props em rotas em ReactJS (Part 3)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/VD7ojK3deWE\" allowFullScreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "home",
        "react",
        "classname",
        "teste",
        "logo",
        "props",
        "import",
        "componente",
        "route",
        "para"
      ],
      "metadata": {
        "title": "React-router-dom: como injetar props em rotas em ReactJS",
        "date": "2017-05-17",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "RouterProps.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/router-props-2/index.md"
      }
    },
    {
      "id": "f30466cceb85fd7d",
      "url": "https://devpleno.com/stream-duplex",
      "title": "Hands-on: Streams Parte 03 - Duplex - DevPleno (Part 1)",
      "content": "Javascript\n\n## Hands-on: Streams Parte 03 - Duplex\n\nT\nPor Tulio Faria • 10 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nJá falamos sobre Readable e Writable Streams, agora falaremos sobre o tipo Duplex. Ele nos permite tanto enviar quanto receber dados. Para testarmos este Stream, vamos utilizar a classe net.Socket, que implementa um Socket, o que permite fazer uma comunicação em rede no Node. Vale lembrar que o Socket é muito comum em outras linguagens como Java.\n\n**O que o Socket faz?**\n\nBasicamente um Socket abre uma porta na rede e fica ‘ouvindo’ essa porta, possibilitando que um cliente a acesse e feche uma conexão. Lembrando que Socket é um tipo Duplex, pois é possível ler e escrever dados deste Stream.\n\n**Vamos ao exemplo:**\n\nSe a última posição do process.argv for igual a server, teremos que rodar duas versões: a server, que irá ouvir e receber este Sockt, e uma versão client, que irá se conectar a este Socket.\n\nconst net = require('net');\nconst readLine = require('readLine')\nif(process.argv\\[process.argv.length-1\\] === 'server'){\n//server\nconst server = net.creatServer((socket) =>{\nsocket.on('data'), (data) => {\nsocket.write(data)\nconsole.log('Receive from client ' + data)\n})\n})\nserver.listen(1337, '127.0.0.1')\n\n}else{\n//client\nconst rl = readLine.createInterface({\ninput: process.stdin,\noutput:process.stdout\n})\nconst client = new.net.Socket()\nclient.connect(1337, '127.0.0.1', () => {\nconsole.log('Connected');\ncliente.write('Hello, server!');\nrl.addListener('Line', (line) => client.write(line))\n})\nclient.on('data', (data) => console.log('Received: ' + data))\nclient.on('close', ()=> console.log('Connection clesed'))\nQuando criamos o servidor, iremos criar um callBack que retorna o Socket, ou seja, sempre que houver uma conexão nova ele irá chamar a arrow function que terá as duas funções do socket, socket.on que é equivalente ao readable Stream e o socket.write, que é equivalente ao writable Stream.\n\n**O que acontece neste código?**\n\n**No Server:**",
      "description": "Já falamos sobre Readable e Writable Streams, agora falaremos sobre o tipo Duplex. Ele nos permite tanto enviar quanto receber dados. Para testarmos este S...",
      "keywords": [
        "socket",
        "client",
        "para",
        "server",
        "data",
        "este",
        "porta",
        "duplex",
        "stream",
        "cliente"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/stream-duplex"
      }
    },
    {
      "id": "f365291f7fd90662",
      "url": "https://devpleno.com/blog/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira/index",
      "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira (Part 1)",
      "content": "O trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho.\n\nNo entanto, a maioria das pessoas têm pouco conhecimento sobre a preparação que envolve essa empreitada fora do Brasil.\n\nQuer saber tudo sobre trabalho de freelancer no exterior? Acompanhe, nesse post, 7 dicas fundamentais que preparamos para você!\n\n## 1. Conquiste uma demanda constante de trabalho\n\nUma questão central no dia a dia de qualquer freelancer é fidelizar certo número de clientes para, assim, manter uma demanda mais ou menos estável de trabalho. Ter sucesso em relação a isso significa conseguir estabelecer uma previsão de ganho mensal, algo muito importante para quem não tem um salário fixo.\n\nQuando se trata de freelancer no exterior, esse ponto ganha uma centralidade ainda maior. Isso porque, morar fora demanda um esforço significativo de [planejamento financeiro](https://www.devpleno.com/carreira-preciso-de-investimento-para-minha-ideia?utm_source=blog&utm_campaign=rc_blogpost). Atrasar as contas do mês, por exemplo, a depender do país, pode ser um desconforto muito maior do que no Brasil.\n\nAlém disso, uma vida financeira estável fora do país contribui para uma adaptação sem contratempos. Isso é, você poderá desfrutar de uma vida mais confortável e de outras possibilidades que o lugar ofereça, como opções de lazer e viagens.\n\n## 2. Incorpore hábitos de freelancers de excelência\n\nExistem muitos hábitos virtuosos que freelancers de excelência devem incorporar a seu dia a dia. Esses hábitos dizem respeito a uma rotina de trabalho cujo foco é propiciar maior produtividade e otimizar seus ganhos.\n\nQuanto a isso, podemos falar de uma \"cartilha\" de sucesso para pessoas que trabalham em casa:",
      "keywords": [
        "para",
        "trabalho",
        "freelancer",
        "exterior",
        "pode",
        "mais",
        "isso",
        "como",
        "brasil",
        "pessoas"
      ],
      "metadata": {
        "title": "Freelancer no exterior: 7 dicas para ter sucesso na carreira",
        "date": "2017-07-03",
        "tags": "['Carreira']",
        "thumbnail": "101429-freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "blog/freelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira/index.md"
      }
    },
    {
      "id": "f38ec065d1846e3c",
      "url": "https://devpleno.com/sleep-em-generator",
      "title": "Sleep em Generator - DevPleno (Part 1)",
      "content": "Javascript\n\n## Sleep em Generator\n\nT\nPor Tulio Faria • 28 de junho de 2017\n\n[Javascript](/tag/javascript)\n\nHoje quero mostrar como podemos recriar o famoso sleep, que temos em algumas linguagens que não são assíncronas como JAVA e PHP, quando queremos usar dentro de um Generator function. Eu cheguei nessa função porque queria fazer testes de algumas operações e naquele dado momento que queria rodar a Generator, queria pausar um pouco entre elas para ver um detalhe acontecer a fim de depurar o código. Então acabei refletindo como poderia criar esse sleep para conseguir fazer esse teste.\n\nPara fazer o teste vamos utilizar o CO, que é uma forma de rodarmos uma Generator Function. Lembrando que uma Generator Function é uma função que pode ser pausada e retornada posteriormente, com isso podemos escrever uma função síncrona, porém continua tendo os benefícios da função assíncrona.\n\nVamos lá, a primeira coisa que vou fazer é importar o CO.\n\nconst co = require('co')\nSe fossemos escrever realmente uma Generator Function iriamos fazer o seguinte:\n\nco(function* () {\nconsole.log('Step 1')\nsleep(1000)\nconsole.log('Step 2')\n})\nEm JavaScript não temos sleep, obviamente, porque não faz muito sentido porque temos o setTimeout.\n\nComo transformamos o setTimeout em um sleep?\n\nPrimeiro vamos criar uma função chamada sleep e para transformar esse setTimeOut em um sleep. Eu teria que transformá-la em uma [promise](https://www.devpleno.com/promises/) e para essa promise passar uma função que vai receber 2 parâmetros, o resolve e o reject, ou seja, dois callBacks:\n\nfunction sleep(time){\nreturn new Promise((resolve, reject) =>\nsetTimeout(resolve, time)\n})\nCom isso, quando chamar o sleep eu consigo utilizar o then para saber que ele rodou depois de um segundo:\n\nsleep(1000).then(() => console.log('Depois de um segundo'))\nMas queremos utilizar dentro do CO porque quero essa ‘cara’ de assíncrona, então ao invés de utilizar apenas o sleep, vou utilizar o yield sleep, pausando entre os steps.",
      "description": "Hoje quero mostrar como podemos recriar o famoso sleep, que temos em algumas linguagens que não são assíncronas como JAVA e PHP, quando queremos usar dentr...",
      "keywords": [
        "sleep",
        "generator",
        "function",
        "para",
        "https",
        "fazer",
        "utilizar",
        "console",
        "javascript",
        "como"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/sleep-em-generator"
      }
    },
    {
      "id": "f396de8be060f870",
      "url": "https://devpleno.com/blog/15",
      "title": "Blog - Página 15 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Carreira 20 de jun. de 2017 Quantas linguagens devo programar?](/quantas-linguagens-programar)\n\n[Fundamentos 16 de jun. de 2017 HA e AS em Aplicação Web - Web Basic](/ha-e-as)\n\n[Javascript 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)\n\n[Javascript 13 de jun. de 2017 Template HTML simples - Hands-on Handlebars](/handlebars-template-html-simples)\n\n[Carreira 8 de jun. de 2017 Por que o Salário em TI é baixo? DevPleno Reponde](/salario-em-ti)\n\n[Algoritmos 7 de jun. de 2017 Codility: Como Resolver os Desafios e Passar nos Testes de Código](/codility)\n\n[Carreira 7 de jun. de 2017 Desenvolvedor Full Stack: o que é e como se tornar?](/desenvolvedor-full-stack-o-que-e-e-como-se-tornar)\n\n[Fundamentos 6 de jun. de 2017 Autenticação e Autorização - Entenda os termos](/autenticacao-e-autorizacao)\n\n[Javascript 6 de jun. de 2017 Gere seu projeto em Express - Hands-on: Express-Generator](/express-generator)\n\n[Javascript 5 de jun. de 2017 Injeção de Dependência em ReactJS](/injecao-de-dependencia-em-reactjs)\n\n[Javascript 1 de jun. de 2017 Injeção de dependência - Aumente a testabilidade do seu código](/injecao-de-dependencia)\n\n[Javascript 1 de jun. de 2017 Vantagens da Injeção de dependência para a testabilidade do código](/vantagens-da-injecao-de-depencia)\n\n[Anterior](/blog/14)15 / 26[Próxima](/blog/16)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "carreira",
        "fundamentos",
        "reactjs",
        "blog",
        "algoritmos",
        "nodejs",
        "como",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/15"
      }
    },
    {
      "id": "f39923d7e25be8c1",
      "url": "https://devpleno.com/blog/networking/index",
      "title": "Como fazer Networking corretamente",
      "content": "Networking é uma palavra muito utilizada atualmente. A maioria acha que deve ser feito o tempo todo, em todo lugar, e tenta forçar isso.\n\n**O que é problemático?**\n\nÉ exatamente esse networking forçado, no qual você não tem uma sinergia tão grande, então pega cartão por pegar, entrega por entregar, faz por fazer.\n\n**Como fazer Networking?**\n\nA resposta mais simples é: NÃO faça networking! Se você tem na sua cabeça que precisa fazer isso, você não está fazendo.\n\nA maneira mais interessante capaz de te gerar valor ao longo do tempo é ajudar as pessoas. Gere valor a elas, esse é o primeiro ponto. Na faculdade, você tem facilidade em programação? Ajude colegas com os exercícios. Tem facilidade em gestão de projetos? Ajude as pessoas em gestão de projetos.\n\nUm outro ponto interessante é fazer o que você se propôs de uma maneira muito bem feita e entregue o seu melhor, assim você deixa claro que é muito bom.\n\nPor exemplo, se você entregou algo a um cliente, ele é um ponto de networking. Eu tenho vários clientes antigos, para os quais eu entregava tanto valor, que até hoje nos encontramos e ficamos conversando por horas. Eles não são mais cliente, mas eu ainda mantenho contato.\n\nIsso é networking! Gerar valor, não tentar fazer networking pedindo algo à pessoa logo após entregar um cartão.\n\nNão se esqueça de que o networking é gerar amizades. Não é legal querer ter contatos puramente por resultados financeiros. Reflita sobre isso, você está mesmo fazendo networking do jeito certo?\n\nDeixe suas sugestões nos comentários.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "networking",
        "fazer",
        "isso",
        "valor",
        "muito",
        "mais",
        "gerar",
        "ponto",
        "tempo",
        "todo"
      ],
      "metadata": {
        "title": "Como fazer Networking corretamente",
        "date": "2017-05-23",
        "tags": "['Carreira']",
        "thumbnail": "FazerNetworking.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/networking/index.md"
      }
    },
    {
      "id": "f3ef49de0777427b",
      "url": "https://devpleno.com/blog/ensino-formal-ou-cursos-livres/index",
      "title": "Ensino Formal ou Cursos Livres - Por qual optar? (Part 1)",
      "content": "Que tipo de ensino e de novos estudos devemos buscar: o ensino formaL (curso técnico, faculdade, pós graduação, etc) ou cursos livres (cursos pela internet ou presenciais sem vínculo com o MEC ou CAPES)?\n\nHoje sou mestre em Sistema de Informações pela USP, ou seja, fui pelo ensino formal também, mas tenho muito conhecimento através de cursos livres. Terminei minha graduação e sempre pesquisei e estudei muito por cursos livres, conhecimento gratuito, livros, etc, mas eu precisava ser desafiado e sair da minha zona de conforto, por isso acabei indo para o Mestrado, podendo também contribuir um pouco com a sociedade por meio do meu projeto.\n\nO grande detalhe que costumo analisar é o custo-benefício. Se o que eu preciso necessariamente vai ser suprido com o curso. Por exemplo, eu quero aprender a fazer deploy de sistemas de forma contínua, mas não existe uma faculdade disso, então preciso fazer um curso livre. Se quero aprender um pouco mais sobre o meio acadêmico e fugir um pouco do que estou acostumado, então vou para o formal.\n\nDepende muito de qual o seu objetivo ou necessidade. Muitas vezes você vai precisar do título (mesmo sabendo que às vezes não quer dizer nada). Se for lecionar para ensino superior, por exemplo, você precisa de no mínimo um mestrado (em instituições públicas, precisa de doutorado), então sua titulação também depende do seu objetivo. Se ele precisa de titulação, busque uma formação que te dê isso, mas se não precisa e onde você for atuar não exige, vá em cursos livres e prove na prática. Tudo que fiz até hoje não precisei de titulação para mostrar apesar de tê-la.\n\nÉ importante ressaltar que geralmente o ensino formal é um pouco mais teórico que o ensino livre, pois um foca no conhecimento geral enquanto o outro em pontos específicos.\n\nPortanto, a dica é analisar o custo-benefício. O que você precisa no momento? Qual o seu objetivo para o futuro?\n\nConfira o vídeo:",
      "keywords": [
        "ensino",
        "para",
        "cursos",
        "precisa",
        "formal",
        "livres",
        "pouco",
        "embed",
        "curso",
        "tamb"
      ],
      "metadata": {
        "title": "Ensino Formal ou Cursos Livres - Por qual optar?",
        "date": "2017-07-13",
        "tags": "['Carreira']",
        "thumbnail": "ensino-formalou-cursos-livres-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/ensino-formal-ou-cursos-livres/index.md"
      }
    },
    {
      "id": "f415a2d357fd585f",
      "url": "https://devpleno.com/audio-com-js-puro",
      "title": "Tocando um Áudio com JS puro - DevPleno (Part 1)",
      "content": "Javascript\n\n## Tocando um Áudio com JS puro\n\nT\nPor Tulio Faria • 24 de maio de 2017\n\n[Javascript](/tag/javascript)\n\nUma das coisas que utilizaremos na interface que vamos construir no Minicurso de Socket.io para que fique mais próximo do real são os efeitos sonoros. Por isso, essa dica é para você entender como dar play em um arquivo de áudio com JS puro, ou seja, usando somente HTML, sem usar nenhuma lib.\n\nA primeira coisa que vamos fazer é criar uma tag audio no HTML. Esse áudio vai representar um arquivo de som (lembrando que também há, em especificações mais novas, a tag vídeo, que é parecida com a tag audio, mas é um pouco mais complicada, pois temos várias ‘camadas’, como por exemplo vídeos específicos para celular).\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;tittle>Audio&#x3C;/tittle>\n&#x3C;/head>\n\n&#x3C;body>\n&#x3C;h1>Audio&#x3C;/h1>\n\n&#x3C;audio>&#x3C;/audio>\n&#x3C;/body>\n&#x3C;/html>\nNo caso do áudio, tenho um arquivo chamado clap.wav e, quando o coloco dentro da tag áudio, ele automaticamente coloca esse áudio quando a página carregar em memória.\n\nEm seguida, vamos criar um botão com o nome de Play e adicionar alguns scripts, um com uma instância desse botão e outro com um eventListener, assim, quando alguém clicar no botão vai ser ser pego esse áudio e dar um play.\n\n&#x3C;html>\n&#x3C;head>\n&#x3C;tittle>Audio&#x3C;/tittle>\n&#x3C;/head>\n\n&#x3C;body>\n&#x3C;h1>Audio&#x3C;/h1>\n\n&#x3C;audio>&#x3C;/audio>\n&#x3C;button>&#x3C;/button>\n\n&#x3C;script>\nconst button = document.querySelector('button')\n\nbutton.addEventListener('click', function(){\n\ncont audio = document.querySelector('audio')\n\naudio.play\n\n})\n&#x3C;/script>\n&#x3C;/body>\n&#x3C;/html>\nOutra ponto interessante é que podemos começar a tocar o áudio a partir de um ponto específico,, por exemplo, aos 0.2 segundos. Para isso adicionamos apenas o código entre o querySelector e o audio.play:",
      "description": "Uma das coisas que utilizaremos na interface que vamos construir no Minicurso de Socket.io para que fique mais próximo do real são os efeitos sonoros. Por ...",
      "keywords": [
        "audio",
        "udio",
        "para",
        "play",
        "html",
        "https",
        "puro",
        "button",
        "javascript",
        "head"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/audio-com-js-puro"
      }
    },
    {
      "id": "f4912a6338b91d8a",
      "url": "https://devpleno.com/entenda-a-importancia-de-cursos-para-desenvolvedores",
      "title": "Entenda a importância de cursos para desenvolvedores - DevPleno (Part 4)",
      "content": "Por fim, mas não menos importante, vale a pena considerar o aprendizado em Redux, uma nova forma de controle e organização do estado da aplicação. O Redux oferece ganhos de qualidade e estabilidade e saber usá-lo é um grande diferencial para qualquer profissional.\n\nCada capacitação é como evoluir um nível e pode lhe deixar mais perto do seu sonho.\n\nO ideal é que os cursos tenham aulas práticas para que você possa colocar a mão na massa. O DevPleno oferece um excelente curso de ReactJS para que você possa se aprimorar e manter-se bem qualificado no mercado de trabalho. Conheça o [devReactJS](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog).\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Entenda%20a%20import%C3%A2ncia%20de%20cursos%20para%20desenvolvedores&url=https%3A%2F%2Fdevpleno.com%2Fentenda-a-importancia-de-cursos-para-desenvolvedores) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fentenda-a-importancia-de-cursos-para-desenvolvedores)",
      "description": "Você está pronto para atuar em uma grande empresa? O mercado de tecnologia está crescendo cada vez mais, e para conseguir se destacar no cenário atual, é p...",
      "keywords": [
        "para",
        "mais",
        "cursos",
        "https",
        "carreira",
        "desenvolvedores",
        "pode",
        "empresa",
        "habilidades",
        "poss"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 4,
        "sourcePath": "/entenda-a-importancia-de-cursos-para-desenvolvedores"
      }
    },
    {
      "id": "f4a25db8b48a1210",
      "url": "https://devpleno.com/blog/11",
      "title": "Blog - Página 11 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Algoritmos 25 de jul. de 2017 Lista encadeada - Adicionar com O(1)](/lista-encadeada-adicionar-com-o1)\n\n[Algoritmos 25 de jul. de 2017 Lista encadeada - Como remover um nó](/lista-encadeada-remover-um-no)\n\n[Algoritmos 25 de jul. de 2017 Lista encadeada - Como retornar um item](/lista-encadeada-retornar-um-item)\n\n[Carreira 24 de jul. de 2017 10 dicas de produtividade para programadores](/10-dicas-de-produtividade-para-programadores)\n\n[Carreira 24 de jul. de 2017 Metodologia ágil: entenda o que é e como se aplica para programadores!](/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores)\n\n[Javascript 24 de jul. de 2017 Standard - Padronize o código fonte JavaScript da sua equipe](/standard-parte-1)\n\n[Javascript 24 de jul. de 2017 Standard Parte 2](/standard-parte-2)\n\n[Javascript 20 de jul. de 2017 Factory Function em JavaScript](/factory-function)\n\n[Carreira 19 de jul. de 2017 Como fazer anotações em eventos](/anotacoes-em-eventos)\n\n[Carreira 19 de jul. de 2017 Comprometimento com as suas metas](/comprometimento-com-suas-metas)\n\n[Javascript 19 de jul. de 2017 Construindo um App gerenciador de séries com ReactJS](/gerenciador-de-series-p1)\n\n[Carreira 19 de jul. de 2017 Participação em Eventos e Comunidades](/participacao-em-eventos-e-comunidades)\n\n[Anterior](/blog/10)11 / 26[Próxima](/blog/12)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "javascript",
        "carreira",
        "lista",
        "encadeada",
        "para",
        "algoritmos",
        "como",
        "programadores",
        "standard"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/11"
      }
    },
    {
      "id": "f4a271de512d0882",
      "url": "https://devpleno.com/grandes-quantidades-de-dados-com-menos-recursos",
      "title": "Grandes quantidades de dados com menos recursos - DevPleno (Part 1)",
      "content": "Javascript\n\n## Grandes quantidades de dados com menos recursos\n\nT\nPor Tulio Faria • 17 de outubro de 2017\n\n[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)\n\nA dica de hoje é um ponto bastante importante para performance em NodeJS. Eu já comentei um pouquinho sobre esse assunto, mas vou reforçar esse cuidado que a gente pode ter aqui para poupar memória quando estamos processando grandes quantidades de dados.\n\nPrimeiramente eu baixei um arquivo com mil registros em CSV, eu quero então processar esses arquivos. Vou criar um arquivo sem-otimizar.js:\n\nconst fs = require('fs')\nfs.readFile('data.csv', (err, contents) => {\nconsole.log(contentes.toString())\n})\nUma outra abordagem seria, por exemplo:\n\nconst fs = require('fs')\nfs.readFile('data.csv', (err, contents) => {\nconst lines = contents.toString().split('\\\\n')\nline.forEach((line) => console.log(lines.split(',')))\n})\nAgora imagine o seguinte, ao invés de colocar da forma anterior, vamos imaginar que vai ser salva a linha no banco de dados:\n\nconst fs = require('fs')\n\nfs.readFile('data.csv', (err, contents) => {\nconst lines = contents.toString().split('\\\\n')\nline.forEach((line) => {\nconsole.log()\n})\n})\nNosso primeiro erro é fazer essa operação sem se preocupar muito se ela retornou algo ou não. Para simular isso, vamos fazer um record e retornar uma promise:\n\nconst saveDB = (record) => {\nreturn new Promise((resolve, reject) => {\nsetTimeOut(resolve, Math.ceil(Math.random() * 4000))\n})\n}\nCom isso vamos simular um save no banco de dados, variando o tempo de resposta não ultrapassando 4 segundos. Agora vamos fazer algumas modificações no código readFiles:",
      "description": "A dica de hoje é um ponto bastante importante para performance em NodeJS. Eu já comentei um pouquinho sobre esse assunto, mas vou reforçar esse cuidado que...",
      "keywords": [
        "const",
        "data",
        "dados",
        "para",
        "require",
        "contents",
        "line",
        "vamos",
        "console",
        "entrada"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "/grandes-quantidades-de-dados-com-menos-recursos"
      }
    },
    {
      "id": "f4d0cb6691a2dc21",
      "url": "https://devpleno.com/blog/chaves-dinamicas/index",
      "title": "CHAVES DINÂMICAS",
      "content": "Hoje eu quero comentar uma novidade no ES6, mostrando a forma de como faríamos isso anteriormente. A partir do ES6, conseguimos inicializar um objeto JavaScript passando uma Key dinâmica, mas anteriormente nós conseguiamos fazer isso apenas posteriormente, ou seja, tínhamos que criar o objeto para depois conseguir alterá-lo.\n\nAnteriormente fazíamos dessa forma:\n\n```jsx\nconst obj = {\n  a: 1\n}\n\nobj['b'] = 2\n\nconsole.log(obj)\n```\n\nPorém, assim não tínhamos um jeito de fazer dinamicamente. Inspirado por essa forma de construir, o ES6 trouxe essa novidade, onde podemos fazer isso já de começo. Se eu quisesse colocar esse 2 na inicialização do objeto, eu poderia fazer simplesmente:\n\n```jsx\nconst obj = {\n  a: 1,\n  ['b']: 2\n}\n\nconsole.log(obj)\n```\n\nAssim já inicializamos esse objeto com o key dinâmico, coisa que não era possível no ES6. É muito interessante eles aproveitarem o property accessor já na inicialização.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/V-lJhz4gyFs\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/channel/UC07JWf9A0B1scApbS1Te7Ww) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "objeto",
        "fazer",
        "embed",
        "forma",
        "isso",
        "anteriormente",
        "responsive",
        "https",
        "youtube",
        "novidade"
      ],
      "metadata": {
        "title": "CHAVES DINÂMICAS",
        "date": "2017-11-23",
        "tags": "['Javascript']",
        "thumbnail": "CHAVES-DINÂMICAS-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/chaves-dinamicas/index.md"
      }
    },
    {
      "id": "f5628256f848c08f",
      "url": "https://devpleno.com/falsy-e-truthy-values",
      "title": "Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS - DevPleno (Part 1)",
      "content": "Javascript\n\n## Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS\n\nT\nPor Tulio Faria • 7 de agosto de 2017\n\n[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)\n\nHoje eu gostaria de falar sobre um assunto que surgiu nos comentários do vídeo sobre [short-circuit e valores padrão](https://www.devpleno.com/short-circuit-e-valores-padrao/).\n\nEu não comentei sobre que valores são convertidos para verdadeiro ou falso porque, na verdade, eu não sabia que eram chamados de falsy e truthy values, então quero trazer essa racionalização. O exemplo que tínhamos feito era:\n\nlet a = null\n\nlet b = a || 'teste'\nQuando eu passo o valor e o operador ou é atribuído o valor padrão. Existe uma série de valores que fazem ele retornar false e consequentemente ele traria o valor padrão ‘teste’, alguns desses valores são ‘null’, uma string vazia ’ ’, o ‘false’ em si, undefined, que seria o caso de uma entrada no express, outro valor considerado ou convertido para false é o Zero ‘o’ e um último é o NaN.\n\nExiste uma situação, que está documentada no site da mozilla, que é o (document.all)[1]. Ele é bastante utilizado para verificar navegadores antigos, mas vamos focar nos anteriores principalmente para o Node.\n\nEm contrapartida, temos tudo que não são valores passados anteriormente, nesse caso seria retornado o valor ‘true’, por exemplo:\n\nlet c = true\nOutros valores considerados truthy seriam por exemplo {}, que seria um objetct, um array [], um número qualquer, uma string com algo dentro ‘test’ , um new Date(), um número negativo, float e uma constant em JavaScript (Infinity), que também retornaria True. Por esse motivo em alguns condicionais, como por exemplo:",
      "description": "Hoje eu gostaria de falar sobre um assunto que surgiu nos comentários do vídeo sobre shortcircuit e valores padrão. Eu não comentei sobre que valores são c...",
      "keywords": [
        "valores",
        "para",
        "true",
        "https",
        "valor",
        "truthy",
        "exemplo",
        "javascript",
        "falsy",
        "values"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/falsy-e-truthy-values"
      }
    },
    {
      "id": "f5765acea2d40db5",
      "url": "https://devpleno.com/projeto-certo-para-estudar-programacao",
      "title": "Qual o projeto certo para estudar programação? - DevPleno (Part 2)",
      "content": "A segunda forma para manter seu ritmo de aprendizado é observar o mercado de soluções em TI e ver quais as aplicações poderiam ser replicadas. Um exemplo que temos no DevPleno é o MercadoDev, inspirado no Mercado Livre, mas implementado como uma versão reduzida utilizando o React para manter o foco nas funcionalidades de mostrar os dados do Firebase e fazer uploads de arquivos.\n\nUma dica de estudo que sempre mencionamos por aqui é “Poucas coisas novas ao mesmo tempo”. Os projetos criados no DevPleno possuem algumas funcionalidades, mas as restringimos para estudar cada aspecto de maneira focada, compreendê-la adequadamente e aplicar o conhecimento aprendido no código sem perder muito tempo. Dessa forma, garantimos que o projeto será finalizado, testado para verificar sua execução, alterado caso haja algo que não funcionou como o esperado e colocado em produção. Ao começar um projeto menor e terminar cada etapa aos poucos, sentimos a gratificação em concluir um sistema inspirado em algo que existe e funciona – o que nos motiva a estudar e aprender cada vez mais.\n\n### 3) Crie um projeto de sua autoria\n\nNão fique com vergonha de suas próprias ideias! Pegue aquela ideia esquecida na gaveta e coloque-a em prática. Lembre-se sempre de começar um projeto com poucas funcionalidades e (o que é mais importante) coloque em produção. Uma coisa muito interessante aqui no DevPleno é que as pessoas que estão acompanhando nossos minicursos gratuitos como o de [Socket.IO](https://go.devpleno.com/fsm?sck=blog), o de [ReactJS](https://go.devpleno.com/fsm?sck=blog) e o [Fullstack Academy](https://go.devpleno.com/fsm?sck=blog), estão colocando no ar suas aplicações. Já vimos várias versões do MercadoDev, iRango, MinhasSéries rodando online, o que é fantástico!",
      "description": "Ao iniciar a jornada de estudos sobre programação, livros, vídeos, tutoriais e dicas em sites são os principais recursos para aprender como desenvolver um ...",
      "keywords": [
        "para",
        "https",
        "projeto",
        "devpleno",
        "estudar",
        "programa",
        "como",
        "mais",
        "aplica",
        "aprender"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/projeto-certo-para-estudar-programacao"
      }
    },
    {
      "id": "f5c23b83eba850a7",
      "url": "https://devpleno.com/blog/low-db/index",
      "title": "Low-DB - Banco de dados para NodeJS baseado em JSON (Part 1)",
      "content": "O Low-DB é uma forma bem interessante de termos um banco de dados baseado em JSON para utilizarmos em aplicações mais simples ou talvez aplicações desktop, onde podemos utilizar electron, por exemplo.\n\nPrimeiro vamos instalar o módulo:\n\n```jsx\nyarn add lowdb\n```\n\nCriamos então o low-db. Com isso, precisamos de uma instância de um banco mostrando qual arquivo queremos utilizar.\n\n```jsx\nconst lowdb = require('lowdb')\nconst db = lowdb('banco.json')\ndb.defauts({\n  noticias: [],\n  usuarios: []\n}).write()\n```\n\nO interessante é que podemos definir os valores padrão quando o banco for criado, como por exemplo notícias e usuários. Lembrando que com o low-db temos que escrever estas operações para a classe começar a valer.\n\nAo dar um node no arquivo.js, ele irá criar um novo arquivo com o nome banco.json com os valores padrão pra cada um deles.\n\nVamos fazer mais alguns testes, por exemplo, adicionar uma notícia nova com id, assunto e conteúdo e por fim escreva no json.\n\n```jsx\ndb.get('noticias')\n  .push({\n    id: '1',\n    assunto: 'crime',\n    conteudo: 'teste'\n  })\n  .write()\n```\n\nO mais interessante: você mandar adicionar novamente, ele irá adicionar ao anterior e não sobrepor. Podemos setar um valor de uma maneira em que podemos guardar as configurações.\n\n```jsx\ndb.set('settings.toggledOption', true).write\n```\n\nUtilizamos o ponto no código acima para dizer que a opção toggledOption do settings deve estar aberta. Podemos gerar estas atualizações mais profundas apenas colocando ponto.\n\n**Um banco não é um banco se não pudéssemos buscar as informações nele, correto?**\n\nEntão vamos buscar uma informação (e única do nosso banco de exemplo) que é a notícia com o ID igual a 1.\n\n```jsx\nconst n = bd.get('noticias').find({ id: '1' }).value()\nconsole.log(n)\n```\n\nPercebam que atribuímos um value para o bd, e então chamamos este value no console.log. Por fim, podemos remover um item deste banco, fazemos isso apenas retirando o set do bd e trocando o .find por .remove",
      "keywords": [
        "banco",
        "para",
        "podemos",
        "json",
        "mais",
        "exemplo",
        "vamos",
        "lowdb",
        "noticias",
        "write"
      ],
      "metadata": {
        "title": "Low-DB - Banco de dados para NodeJS baseado em JSON",
        "date": "2017-05-11",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Low-db.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/low-db/index.md"
      }
    },
    {
      "id": "f5cbf45677bf9b06",
      "url": "https://devpleno.com/blog/filter/index",
      "title": "High-order Function Filter (Part 2)",
      "content": "Podemos utilizar essas funções com imutabilidade porque toda vez que filtro, uso o reduce ou map, eu não estou alterando o vetor original, isso é muito importante para a programação funcional. Podemos também o seguinte:\n\n```js\nconst filtroEmEstoque = (item) => item.estoque < item.qtd\n\nconst total = carrinho\n  .filter(filtroEmEstoque)\n  .map(subtotal)\n  .reduce((soma, subtotal) => subtotal + soma, 0)\n\nconst semEstoque = carrinho.filter((item) => item.estoque < item.qtd)\n\nconsole.log(total)\n```\n\nA vantagem de fazermos isso é que acaba ficando cada vez mais fácil de entender, além de ser facilmente testado. Tudo isso feito com funções puras, quanto mais utilizamos essas high-order functions, mais limpo ele fica.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/3tu35hvhmQA\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "item",
        "estoque",
        "subtotal",
        "carrinho",
        "const",
        "filter",
        "reduce",
        "soma",
        "high",
        "order"
      ],
      "metadata": {
        "title": "High-order Function Filter",
        "date": "2017-08-02",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "FILTER-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/filter/index.md"
      }
    },
    {
      "id": "f5e55b1433a59007",
      "url": "https://devpleno.com/empreendedorismo",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /empreendedorismo to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "empreendedorismo"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/empreendedorismo"
      }
    },
    {
      "id": "f6153e78c8fea970",
      "url": "https://devpleno.com/blog/busca-binaria/index",
      "title": "Busca Binária (Part 1)",
      "content": "Hoje vamos falar um pouco mais sobre algoritmos, que são as bases da computação. Especificamente sobre um tipo de busca que eu já utilizei em um projeto e nunca imaginei que iria utilizar, a busca binária.\n\nOs algoritmos de busca inicialmente parecem teóricos demais, mas, na verdade, podemos usar bastante em projetos. Há algum tempo, antes de termos o Android e IOS, era comum termos os Palmtops, eles tinham memória péssima e precisávamos fazer uma busca que nem era tão grande (essa busca demorava demais de forma sequencial) a partir disso, assumimos uma restrição nos dados, deixando-os ordenados para a busca binária e assim conseguimos resolver o problema.\n\nVou dar um exemplo de um problema com um vetor de 5 itens. Deixávamos o vetor de forma sequencial e salvavamos esses slots de dados sequencialmente, mas isolados, com isso era possível saber que quando fossemos naquele ponto de memória, teria poucas iterações.\n\nA estratégia era a seguinte: tentamos acertar primeiro o item do meio, por exemplo, o número 3, se o número 3 é igual ao número que eu estou buscando, ele é retornado, caso eu esteja procurando o 2 por exemplo, eu sei que ele é menor que o 3, então meu próximo espaço de busca será 1 ou 2, com isso é tentado de novo, se acertar, ele retorna, caso contrário tentará de novo e por aí vai.\n\nPor esse motivo é chamado de busca binária, porque sempre vamos dividir em dois espaços. O pior dos casos é ele dividir todos pela metade. Vamos implementar agora:\n\n```jsx\nconst vetor = [1, 2, 3, 4, 5]\n\nconst binSearch = (vetor, left, right, valor) => {\n  if (right >= left) {\n    const indice = parseInt(left + (right - left) / 2)\n\n    if (vetor[indice] === valor) {\n      return valor\n    }\n\n    if (vetor[indice] > valor) {\n      return binSearch(vetor, left, indice - 1, valor)\n    }\n\n    return binSearch(vetor, indice + 1, right, valor)\n  }\n\n  return -1\n}\n\nconsole.log(binSearch(vetor, 0, vetor.length - 1, 20))\n\nconsole.log(binSearch(vetor, 0, vetor.length - 1, 5))\n```",
      "keywords": [
        "vetor",
        "valor",
        "left",
        "busca",
        "indice",
        "vamos",
        "binsearch",
        "right",
        "const",
        "return"
      ],
      "metadata": {
        "title": "Busca Binária",
        "date": "2017-08-29",
        "tags": "['Algoritmos']",
        "thumbnail": "BUSCA-BINÁRIA-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/busca-binaria/index.md"
      }
    },
    {
      "id": "f625b79af31d959a",
      "url": "https://devpleno.com/webaudioapi",
      "title": "WebAudioAPI - Gerando um som no browser - DevPleno (Part 2)",
      "content": "function play(){\nconst contexto = (window.AudioContext || window.webkitAudioContex)t\nconst osc = contexto.createOscillator()\nosc.type = document.getElementById('type').value\nosc.frequency.value = 440\nosc.connect(context.destination)\nosc.start()\nosc.stop(contexto.currentTime +2)\n}\n&#x3C;/script>\nAssim já conseguimos criar um sintetizador de áudio, sem precisar de um arquivo de áudio. Podemos, por exemplo, pegar a frequência de cada nota e trabalhar em cima dela.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=WebAudioAPI%20-%20Gerando%20um%20som%20no%20browser&url=https%3A%2F%2Fdevpleno.com%2Fwebaudioapi) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fwebaudioapi)",
      "description": "Hoje eu quero falar um pouco sobre WebAudioAPI e como podemos gerar sons dinamicamente no browser. Vamos começar fazendo uma função que toca um som e depoi...",
      "keywords": [
        "contexto",
        "option",
        "value",
        "https",
        "script",
        "webaudioapi",
        "vamos",
        "udio",
        "const",
        "window"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/webaudioapi"
      }
    },
    {
      "id": "f6528b2621a1ad38",
      "url": "https://devpleno.com/aprenda-a-dizer-nao",
      "title": "Aprenda a dizer NÃO! - DevPleno (Part 2)",
      "content": "Outra coisa interessante também é você comemorar seus ”nãos”. Se você conseguiu dar um não em algo que não te fazia bem ou não era o seu objetivo, comemore essa escolha. Uma lição que eu aprendi com a minha mãe é que quando você diz não, não fique remoendo isso. Se teve uma chance de ir para uma empresa e se recusou, não fique olhando mais para trás, afinal você tomou a decisão e acabou.\n\nA alguns meses atrás eu disse não para morar em Amsterdã, eu tinha passado no processo seletivo do Booking e disse não porque não estava alinhado com o meu objetivo de vida para aquele momento, mesmo tendo uma oportunidade de vida no exterior. Essa foi uma lição que mudou muito a minha vida, hoje minha empresa fatura 6 vezes mais do que estava quando eu fiz essa transformação.\n\nEntão pense nisso. Essa dica pode mudar a sua vida!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Aprenda%20a%20dizer%20N%C3%83O!&url=https%3A%2F%2Fdevpleno.com%2Faprenda-a-dizer-nao) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Faprenda-a-dizer-nao)",
      "description": "Uma das coisas que eu aprendi ultimamente é dizer NÃO. Se alguma coisa não me agrada, não faz bem para minha empresa ou não está de acordo com o que eu que...",
      "keywords": [
        "para",
        "dizer",
        "minha",
        "https",
        "empresa",
        "vida",
        "quando",
        "mais",
        "estava",
        "porque"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/aprenda-a-dizer-nao"
      }
    },
    {
      "id": "f65676af9c6b964b",
      "url": "https://devpleno.com/blog/hands-on-rimraf/index",
      "title": "Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios",
      "content": "Durante a semana fizemos diversos procedimentos em lot, e uma das coisas que nós fizemos foi apagar um diretório de maneira recursiva (pegar o diretório completo e apagar).\n\nSeria mais ou menos o seguinte: tenho um diretório no VS Code e dentro desse diretório tivesse um dir1, dentro dele um dir2, dentro um dir3 e por aí vai. Precisamos apagar a estrutura toda.\n\nA forma que temos para fazer isso no padrão do node usando o FS é ter que apagar um por um, mas vamos utilizar um módulo chamado Rimraf para que ele faça esse processo.\n\n```jsx\nyarn add rimraf\n```\n\nEle é um pacote bem simples. Ao adicionar, o [Yarn](https://www.devpleno.com/hands-on-yarn/) já cria o package.json e o yarn.lock para travar as versões. Agora vamos criar um arquivo que vai apagar o diretório. Esse arquivo vai se chamar apagar.js:\n\n```jsx\nconst rimraf = require('rimraf')\nrimraf('dir1', function () {\n  console.log('done')\n})\n```\n\nAo rodar, o código perceba que ele apagou o diretório. É muito legal utilizar isso porque o filesystem padrão do node não permite que a gente apague diretório de forma recursiva, isso é muito importante para conseguir agilizar, já que não precisamos criar nada recursivamente.\n\nO Rimraf tem outra coisa muito interessante que é apagar diretórios que não estão vazios, temos algumas limitações como, por exemplo, se pegarmos os rmdir que só apaga diretório vazio.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/N9lvwnRZIoM\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "diret",
        "apagar",
        "rimraf",
        "para",
        "yarn",
        "https",
        "embed",
        "dentro",
        "isso",
        "devpleno"
      ],
      "metadata": {
        "title": "Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios",
        "date": "2017-08-10",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Rimraf.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-on-rimraf/index.md"
      }
    },
    {
      "id": "f7016ececc642373",
      "url": "https://devpleno.com/gerenciador-de-series-p1",
      "title": "Construindo um App gerenciador de séries com ReactJS - DevPleno (Part 2)",
      "content": "npm install -g json-server\nnpm install -g create-react-app\nnpm install -g yarn\nO Create React App é uma forma de iniciar o projeto em React de forma muito rápida e sem ‘briga’, afinal, quando temos que configurar muito webpack, gastamos muito tempo porque dá muito problema, então o Create React App já é uma forma muito boa de começarmos um projeto, pois diminuímos muito o número de dependências diretas do projeto deixando ele mais limpo.\n\nJá o Yarn é bom instalar porque o Create React-App usa muito o Yarn, que é uma NPM com mais coisas, isso faz com que o Create React-App rode mais rápido.\n\nDepois podemos criar realmente nosso projeto:\n\ncreate-react-app primeiro-projeto\nPerceba que ele está instalando o React, react-dom, and react-scripts. Quando criamos um projeto com o Create React-App, ele coloca dependência apenas para esses três módulos, isso deixa o projeto mais leve e fica mais claro quais dependências estamos colocando.\n\nCom isso, ele vai criar dentro do diretório ‘primeiro-projeto’ e vamos acessar esse diretório utilizando cd e depois startando o yarn:\n\ncd primeiro-projeto/\nyarn start\nele irá abrir o projeto: Se você conseguiu acessar, tem um projeto em React funcionando. Vou parar o servidor um pouco e fazer o seguinte:\n\ncode./\nEle vai abrir o Visual Studio Code com esse diretório aberto. Note que ao criar nosso primeiro projeto, ele já criou algumas coisas como o package.json e dentro dele as dependências são muito curtas.\n\nVamos entrar em index, já que ele é nosso ponto de entrada, ele instancia um componente chamado app e renderiza isso no elemento root que está em public/index.html.\n\nEle irá trocar esse div root pelo componente app. Falando em componente, o React usa componentes como sua base mínima de código.\n\n**O que é um componente?**",
      "description": "Nesta nova série, vamos construir um aplicativo na prática, mais especificamente um gerenciador de séries, para você nunca mais esquecer as séries que assi...",
      "keywords": [
        "react",
        "para",
        "componente",
        "vamos",
        "projeto",
        "isso",
        "muito",
        "mais",
        "como",
        "esse"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 5,
        "sourcePath": "/gerenciador-de-series-p1"
      }
    },
    {
      "id": "f720e0fd4417e22b",
      "url": "https://devpleno.com/coding-weekend-materiais-obrigado",
      "title": "Redirecting to: https://go.devpleno.com/fsm",
      "content": "Redirecting to: https://go.devpleno.com/fsm [Redirecting from /coding-weekend-materiais-obrigado to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)",
      "keywords": [
        "https",
        "devpleno",
        "redirecting",
        "from",
        "coding",
        "weekend",
        "materiais",
        "obrigado"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/coding-weekend-materiais-obrigado"
      }
    },
    {
      "id": "f7237193e2c869a8",
      "url": "https://devpleno.com/escopos-e-closures",
      "title": "Escopos e Closures - NodeJS Primeiros Passos - DevPleno (Part 2)",
      "content": "var b = 11\n}\nCom isso, travamos a variável apenas para o escopo definido. Temos um tipo de escopo que chamamos de Self involking function, onde temos um parenteses e colocamos uma função anônima dentro.\n\n;(function () {\nvar a,\nb = 1\n\nconsole.log(1)\n})()\nPerceba que existe um abrir e fechar parênteses no fim, assim, estamos ‘chamando’ a função. Sem isso, nada acontece.\n\n**Qual a vantagem de fazermos códigos dentro de uma Self Involking function?** Tudo que fizer lá dentro, como var a, b = 1, não estará sujando o escopo global, além disso, caso eu queira alterar o escopo dentro não consiguirá, as únicas que conseguem são as que estiverem dentro do self involking. Uma outra coisa interessante no JavaScript é que podemos fazer é a seguinte:\n\n;(function () {\nvar a = 10\n\nfunction inc() {\na++\n}\n\ninc()\n\nconsole.log(a)\n})()\nAssim o escopo é realmente isolado. Note que o escopo filho (a++) busca o valor do escopos pai. Isso nos permite fazer, por exemplo, um contador tentando imitar um comportamento de singleton, ou seja, mantendo uma função só de uma classe. Como não temos classe, podemos simular algo semelhante.\n\nvar conta = (function() {\n\nvar contador = 0;\n\nreturn function(){\ncontador++; console.log(contador);\n}\n}();\n\nconta();\n\nconta();\n\nconta();\nPegamos essa função e jogamos dentro de uma variável.\n\n**O que aconteceu ali?** A var ‘conta’ vai receber a self invoking function, que retorna automaticamente uma outra function, e como ela está dentro do escopo, é possível acessar o escopo pai. O javaScript mantém esse escopo mesmo quando a função deixou de ser executada, e então temos um comportamento parecido com o singleton. Quando uma função tem acesso a uma variável do escopo pai mesmo depois que acabou de ser executada, chamamos de Closer. Mais um exemplo:\n\nvar conta = (function() {\nvar contador = 0;\n\nreturn {\ncontar = function(){\ncontador++;\n},\nout: function(){\nconsole.log(contador);\n}\n}\n}();\n\nconta.contar();\n\nconta.out();\n\nconta.contar();",
      "description": "Entender Escopos e Closures do JavaScript é muito importante para conseguir avançar no NodeJS. Primeiramente tenho um diretório criado com nossos exemplos....",
      "keywords": [
        "escopo",
        "function",
        "console",
        "vari",
        "conta",
        "dentro",
        "javascript",
        "fazer",
        "podemos",
        "contador"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/escopos-e-closures"
      }
    },
    {
      "id": "f7359b764d26dab3",
      "url": "https://devpleno.com/blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index",
      "title": "8 dicas de organização para freelancers se darem bem na carreira (Part 3)",
      "content": "Não são raros os casos em que os freelancers assumem vários compromissos com clientes distintos e acabam não honrando os prazos. É o tal de tentar abraçar todo o mundo com apenas dois braços.\n\nO resultado disso, como se pode imaginar, é a entrega de um serviço de baixa qualidade e fora do prazo combinado. Essa característica deixa os clientes insatisfeitos (com toda razão, né?), afetando assim sua reputação no mercado.\n\nPortanto, uma das mais importantes dicas de organização é priorizar sempre a excelência e não a quantidade. Além do mais, em hipótese alguma faça promessas que não poderá cumprir. Como já dizia o ditado: \"O combinado não sai caro\".\n\n## 6\\. Defina prioridades\n\nO freelancer deve tornar o relógio o seu principal amigo. Claro que, às vezes, vai surgir um enorme desespero originado da sensação de que não vai dar tempo de concluir todas as tarefas pretendidas. Contudo, isso somente acontece porque o profissional não conseguiu ainda se adequar à nova realidade.\n\nEle, nesse aspecto, precisa entender que o tempo não é seu inimigo. Entretanto, somente é possível chegar a essa mentalidade quando o freelancer começar a criar uma lista de prioridades.\n\nOrganize bem a sua agenda e estabeleça uma ordem de prioridade nos seus trabalhos. Comece por aqueles que têm a data de entrega mais próxima — afinal, você não quer correr o risco de perder o prazo, certo? Simples assim: verifique a urgência de cada projeto e produza primeiro aqueles que são emergenciais.\n\n## 7\\. Seja focado\n\nWhatsApp, redes sociais, músicas e televisão: são várias as fontes de distrações que fazem a sua produtividade reduzir substancialmente.\n\nUma paradinha aqui para olhar o Facebook, outra para assistir aquele seriado bacana e, quando se der conta, o dia já está quase acabando e você não fez o que pretendia (ou deveria) fazer.",
      "keywords": [
        "para",
        "mais",
        "como",
        "freelancer",
        "pode",
        "afinal",
        "isso",
        "preciso",
        "https",
        "devpleno"
      ],
      "metadata": {
        "title": "8 dicas de organização para freelancers se darem bem na carreira",
        "date": "2017-07-14",
        "tags": "['Carreira']",
        "thumbnail": "105725-8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira-790x400.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 4,
        "sourcePath": "blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index.md"
      }
    },
    {
      "id": "f7879ca825711efb",
      "url": "https://devpleno.com/blog/injecao-de-dependencia/index",
      "title": "Injeção de dependência - Aumente a testabilidade do seu código (Part 1)",
      "content": "Pode parecer besteira, mas eu sempre ouvia sobre injeção de dependência. porém nunca tinha refletido tanto sobre ela. Quando passei a testar mais o meu código com teste unitário, comecei a usar essa técnica e percebi que fez muita diferença. Para contextualizar, vamos supor que temos o código:\n\n```jsx\nconst model = require('./model1')\n\nfunction findAll() {\n  return model.find({})\n}\n```\n\nDesconsiderando a parte assíncrona, temos, por exemplo, uma função que depende do model que está em um contexto externo. Quando estamos no ambiente de testes, perdemos totalmente a visibilidade de onde ele está, isso deixa extremamente complicado para realizarmos um teste de forma unitária já que dependemos do ambiente para ele rodar.\n\nNo contexto do Node, quando vamos testar, temos apenas o escopo da função, não temos o escopo de onde ele está sendo executado, inclusive se rodarmos com mocka, o contexto será do mocka e não um global.\n\nSe passarmos ele para dependência, passando como model, na hora de chamar essa função temos que injetar esse model\n\n```jsx\nfunction findAll(model) {\n  return model.find({})\n}\nconst modelAA = require('./model1')\nfindAll(modelAA)\n```\n\nEstou simplificando bastante apenas para ilustrar, já que até assim seria ruim. Precisaríamos de uma forma melhor de organizar, mas mesmo assim temos uma visibilidade maior do código. Eu sei que findAll depende do model, coisa que eu não sabia antes, pois na função eu não sabia que ela dependia de model. Então, quando fazemos injeção de dependência, estamos dando uma documentação 'a mais', afinal ele é um código que se auto descreve. Ele também fica um pouco mais puro, pois dependemos apenas dos parâmetros para fazer o que queremos, já que não há dependência externa.\n\nVamos fazer o seguinte teste: imagine que temos um código que valida, e essa função vai haver um if que se for maior que 100 ela mostrará ERROR e retorna false:",
      "keywords": [
        "alert",
        "para",
        "model",
        "quando",
        "digo",
        "depend",
        "vamos",
        "temos",
        "return",
        "ncia"
      ],
      "metadata": {
        "title": "Injeção de dependência - Aumente a testabilidade do seu código",
        "date": "2017-06-01",
        "tags": "['Javascript']",
        "thumbnail": "InjecaoDependenciaPrin.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 3,
        "sourcePath": "blog/injecao-de-dependencia/index.md"
      }
    },
    {
      "id": "f7bf8c79995f9122",
      "url": "https://devpleno.com/blog/ha-high-availability-e-as-auto-scale/index",
      "title": "HA (High Availability) e AS (Auto Scale)",
      "content": "Neste vídeo falo de 2 características que é a auto disponibilidade e o auto scaling, muito buscadas por startups para suportar a escalabilidade do negócio.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/-ynU21-FPFY\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "youtube",
        "auto",
        "para",
        "classname",
        "iframe",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "HA (High Availability) e AS (Auto Scale)",
        "date": "2016-08-09",
        "tags": "['Fundamentos']",
        "thumbnail": "Avaliability.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/ha-high-availability-e-as-auto-scale/index.md"
      }
    },
    {
      "id": "f82c52ef57694cfc",
      "url": "https://devpleno.com/promises",
      "title": "NodeJS Primeiros Passos - Promises - DevPleno (Part 3)",
      "content": "function readArquivo3(conteudo){\nvar deferred = \".defer()\";\nfs.readFile('arquivo3.txt', conteudo, function(err){\ndeferred.resolve();\n});\nreturn deferred.promise;\n}\nvar conteudo=\"\";\nreadArquivo1()\n.then(function(arquivo1){\nconteudo+= arquivo1;\nreturn readArquivo2();\n}).then(function(arquivo2){\nconteudo+= arquivo2;\nreturn writeArquivo3(conteudo)\n}).then(function())\nconsole.log('tudo certo');\n});\nPerceba que meu código começa a crescer para baixo e, ao executar, será retornado a mensagem e criado o arquivo 3 com o conteúdo dentro. A manutenção desse código fica muito mais simples porque eu consigo ver claramente o que cada função está fazendo e também a sequência de passos. Uma das coisas que dá para ser feito também é a seguinte:\n\nreadArquivo1().then(readArquivo2).then(readArquivo2)\nEle vai passar pelo arquivo 1, arquivo 2 e novamente no arquivo 2. Se eu não tiver que passar atributo para frente, posso fazer isso. Caso a gente queira que o arquivo 2 receba um conteúdo que veio arquivo 1, também podemos utilizar assim, mas o problema é que ela fica muito dependente uma função da outra, eu prefiro fazer de uma forma que uma função não dependa muito da outra para que eu consiga modularizar melhor.\n\nConfira todos os detalhes no vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%20-%20Promises&url=https%3A%2F%2Fdevpleno.com%2Fpromises) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpromises)",
      "description": "Continuando nosso assunto sobre NodeJS, vamos tratar sobre como podemos organizar o fluxo para que o código fique realmente organizado. Olhe esse exemplo: ...",
      "keywords": [
        "function",
        "arquivo1",
        "deferred",
        "arquivo2",
        "readfile",
        "para",
        "arquivo",
        "digo",
        "then",
        "conteudo"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/promises"
      }
    },
    {
      "id": "f86474abdb0f5275",
      "url": "https://devpleno.com/blog/dica-n-vezes/index",
      "title": "Dica: Once n vezes",
      "content": "Neste vídeo. iremos implementar em Javascript uma função utilitária que permite uma função ser executada apenas uma vez (once) e também modificamos um pouco este exemplo para que possa ser limitado a n-vezes.\n\nDependendo da regra de negócio, poderia ser utilizado para permitir que uma ação seja executada apenas x vezes.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/6dB2dVep_UQ\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Deixe suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "para",
        "responsive",
        "https",
        "executada",
        "apenas",
        "vezes",
        "classname",
        "iframe",
        "youtube"
      ],
      "metadata": {
        "title": "Dica: Once n vezes",
        "date": "2017-04-17",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "OnceNVezesS.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/dica-n-vezes/index.md"
      }
    },
    {
      "id": "f868d3fa06456336",
      "url": "https://devpleno.com/falta-de-apoio",
      "title": "Falta de apoio - DevPleno (Part 2)",
      "content": "Tente avaliar se você comunicou corretamente o que você quer fazer, muitas vezes você está pensando em criar um projeto, mas não ficou claro da forma que explicou.Essa falta de claridade traz uma insegurança que consequentemente gera a falta de apoio, e finalmente, mesmo que você não tenha apoio para sua ideia ou projeto novo, se você conseguir levar isso adiante sozinho, aplique, porque não adianta as pessoas te apoiarem, a única coisa que isso faz é te dar motivação, mas não vai fazer por você. Vale muito a pena ter essa postura de sempre fazer independente do apoio.\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Falta%20de%20apoio&url=https%3A%2F%2Fdevpleno.com%2Ffalta-de-apoio) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffalta-de-apoio)",
      "description": "Quando estamos em uma empresa ou até mesmo fazendo projetos por conta própria, temos ideias criativas e percebemos que, quando comunicamos essas ideias par...",
      "keywords": [
        "apoio",
        "falta",
        "para",
        "https",
        "pessoas",
        "fazer",
        "relev",
        "ncia",
        "essa",
        "carreira"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/falta-de-apoio"
      }
    },
    {
      "id": "f87ec78bed2e0e51",
      "url": "https://devpleno.com/dica-debounce",
      "title": "Dica: Debounce - DevPleno",
      "content": "Javascript\n\n## Dica: Debounce\n\nT\nPor Tulio Faria • 4 de abril de 2017\n\n[Javascript](/tag/javascript)\n\nDebounce é uma técnica bastante útil para restringir o tempo entre a chamada de uma mesma função. Por exemplo, se um usuário clicar 6x em um botão em menos de 2s, apenas a última vez será contada. Neste vídeo, construiremos uma forma genérica de controlar isso.\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Dica%3A%20Debounce&url=https%3A%2F%2Fdevpleno.com%2Fdica-debounce) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-debounce)",
      "description": "Debounce é uma técnica bastante útil para restringir o tempo entre a chamada de uma mesma função. Por exemplo, se um usuário clicar 6x em um botão em menos...",
      "keywords": [
        "https",
        "debounce",
        "javascript",
        "dica",
        "para",
        "devpleno",
        "facebook",
        "2fdevpleno",
        "2fdica",
        "2017"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/dica-debounce"
      }
    },
    {
      "id": "f8863efbb334ad40",
      "url": "https://devpleno.com/vagas-de-emprego-no-brasil-e-no-exterior",
      "title": "Descrição das vagas de emprego no Brasil x no exterior - DevPleno (Part 1)",
      "content": "Carreira\n\n## Descrição das vagas de emprego no Brasil x no exterior\n\nT\nPor Tulio Faria • 26 de setembro de 2017\n\n[Carreira](/tag/carreira)\n\nHoje quero comentar um e-mail que recebi e achei bastante relevante falar sobre, principalmente quando estamos olhando para o mercado de desenvolvedor web.\n\nA pergunta no e-mail era a seguinte: Em vagas de empregos no exterior para desenvolvedor fullstack, existem informações bem pontuais, ou seja, exatamente o que os profissionais precisam saber.\n\nEm contrapartida, as vagas no Brasil exigem tudo e não pagam nada. Por quê? Eu acredito que no Brasil o pessoal ainda não está acostumado a contratar pessoas de tecnologia, geralmente são empresas de RH que não tem a ideia do perfil que eles vão procurar.\n\nComo eles procuram de forma abrangente, não é filtrado o que a pessoa precisa saber. À medida que começarmos a ter mais empresas de RH conhecendo a área, melhor vai ficar a contratação.\n\nNo exterior isso já é muito comum, quem contrata engenheiros ou desenvolvedores de softwares são outros engenheiros ou desenvolvedores, não mais pessoas somente do RH, por esse motivo há essa diferença.\n\nO que eu fiz para contratar meus funcionários?\n\nUm deles aconteceu dele conversar comigo e eu estar precisando, como já o conhecia, acabei contratando. O outro eu coloquei na descrição da vaga que precisava de pessoas que trabalhem com JavaScript e tivessem vontade de desenvolver nessa área, simplesmente isso.\n\nIsso vai muito da preparação da pessoa que está recrutando, muitas vezes a pessoa não sabe o que quer ou esperar de habilidade desse profissional. Para mim não era importante o JavaScript, eu coloquei para eu ter um norte, já que precisava de alguém que tivesse vontade de aprender e foi o que aconteceu.\n\nNa Toptal, por exemplo, todos os testes que fiz, foram feitos por engenheiros de softwares da Toptal.\n\nConfira o video:",
      "description": "Hoje quero comentar um email que recebi e achei bastante relevante falar sobre, principalmente quando estamos olhando para o mercado de desenvolvedor web. ...",
      "keywords": [
        "para",
        "https",
        "brasil",
        "exterior",
        "carreira",
        "descri",
        "vagas",
        "emprego",
        "mail",
        "pessoas"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "/vagas-de-emprego-no-brasil-e-no-exterior"
      }
    },
    {
      "id": "f89d44be3121e561",
      "url": "https://devpleno.com/blog/algoritmos-xoe-swap/index",
      "title": "Algoritmos: XOR Swap (Part 1)",
      "content": "A dica de hoje é sobre o operador XOR, que eu achei bem interessante. Estava estudando outra coisa e apareceu\nessa informação, então resolvi checar e realmente faz muito sentido.\n\nImagine que temos duas variáveis:\n\n```jsx\nlet a = 3\n\nlet b = 4\n```\n\nEu quero simplesmente colocar A em B e B em A, geralmente faríamos uma variável TMP, colocaríamos A,\ncolocaríamos A = B e em seguida B = TMP:\n\n```jsx\nlet TMP = a\n\na = b\n\nb = TMP\n```\n\nPrecisamos de mais uma variável para conseguir fazer essa troca. Se a gente quisesse fazer utilizando o XOR, é possível:\n\n```jsx\na = a ^ b\n\nb = a ^ b\n\na = a ^ b\n\nconsole.log(a, b)\n```\n\nCom isso conseguimos inverter os valores, essa é uma forma diferente de fazer troca de valores. Algo que acho muito legal na nossa área é quando começamos a pegar operadores que nem são tão famosos, como o XOR mesmo, e começamos a ter alguns usos incomuns.\n\nImaginamos que em binário seria:\n\n```jsx\n3 | 011\n\n4 | 100\n```\n\nEntão no primeiro XOR nós teriamos de resultado o 1\n\n```jsx\na | 111\n```\n\nAgora vamos pegar nosso x que agora é o valor de A e fazer com o B:\n\n```jsx\na | 111\n\n4 | 100\n```\n\nNosso resultado sera:\n\n```jsx\nb | 011\n```\n\nAgora faremos um terceiro XOR com o A:\n\n```jsx\nb | 011\n\na | 111\n```\n\nE o resultado será:\n\n```jsx\na | 100\n```\n\nPerceba que o A agora é 100, que é 4, e o B ficou com 011, que é 3. O legal é que se formos lembrar daquele algoritmo que fizemos de achar os pares que estão faltando, é o mesmo caso porque a medida que nós aplicamos duas vezes o mesmo número, em cima nós removemos, então podemos adicionar ele com outro e tirar o que não queremos. Resumindo, colocamos em A a soma de A com B, em B nós somamos B novamente.\n\nObviamente ele só funciona com tipos de variáveis numéricas e do mesmo tipo, no nosso exemplo são dois inteiros.\n\n## Confira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe src=\"https://www.youtube.com/embed/5E_1usjXc_E\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "amos",
        "vari",
        "fazer",
        "mesmo",
        "agora",
        "essa",
        "colocar",
        "resultado",
        "nosso",
        "embed"
      ],
      "metadata": {
        "title": "Algoritmos: XOR Swap",
        "date": "2017-08-04",
        "tags": "['Algoritmos']",
        "thumbnail": "XOR-SWAP-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/algoritmos-xoe-swap/index.md"
      }
    },
    {
      "id": "f8b13e43411173fa",
      "url": "https://devpleno.com/como-cobrar-por-software",
      "title": "Como cobrar por Software - DevPleno (Part 1)",
      "content": "Carreira\n\n## Como cobrar por Software\n\nT\nPor Tulio Faria • 15 de maio de 2017\n\n[Carreira](/tag/carreira)\n\nPara precificar software, alguns fatores devem ser levados em consideração e você deve responder algumas perguntas a si mesmo. Confira:\n\n**O que você está vendendo?**\n\nA primeira coisa que deve pensar é chegar em no valor/hora, afinal vai ter que gastar horas e mais horas neste software, logo estará vendendo seu tempo para o cliente.\n\n**O que avaliar nesse valor/hora?**\n\nQuando pensar no valor, deve pensar no nível de experiência que essa hora demanda. (Por exemplo, para um site em HTML simples, o quanto da sua especialidade este conteúdo vai utilizar?) Por isso a hora de um analista de dados atualmente é tão alta, afinal não tem no mercado e isso exige muito conteúdo, como mineração de dados, matemática, etc. Já para o HTML, por exemplo, não precisa de muita habilidade para ser feito, logo é uma hora mais barata.",
      "description": "Para precificar software, alguns fatores devem ser levados em consideração e você deve responder algumas perguntas a si mesmo. Confira: O que você está ven...",
      "keywords": [
        "hora",
        "para",
        "valor",
        "mais",
        "horas",
        "muito",
        "projeto",
        "ncia",
        "exemplo",
        "https"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 4,
        "sourcePath": "/como-cobrar-por-software"
      }
    },
    {
      "id": "f8bd775413943d94",
      "url": "https://devpleno.com/blog/socket-io-parte2/index",
      "title": "Hands-on - Socket.io Parte 2 (Part 3)",
      "content": "```jsx\n<html>\n    <body>\n        <h1>Socket.io</h1>\n        <script src=\"/socket.io/socket.io.js\"></script>\n        <script src=\"https://code.jquery.com/jquery-3.2.1.min.js\"> </script>\n        <div id=\"msgs\"></div>\n        <input type=\"text\" />\n        <script>\n            const socket = io()\n            socket.on('connect', function(){\n                $(\"msgs\").append('connected with id: '+socket.id+'<br>'\n                socket.emit('msg', 'I am connected '+socket.id);\n            )}\n            socket.on('msg', function(msg){\n                $(\"#msgs\")append(msg+' <br>')\n            }\n            $(function(){\n                $(\"imput\").keyDown(function(key){\n                    if(key.keyCode===13){\n                        socket.emit('msg', $(this).val());\n                    }\n                })\n            })\n        </script>\n    </body>\n</html>\n```\n\nJá do lado servidor, temos que pedir para enviar a mensagem do campo texto ao invés do socket.id, substituindo:\n\n```jsx\nsocket.broadcast.emit('msg', socket.id + ' connected')\n```\n\nPor:\n\n```jsx\nsocket.broadcast.emit('msg', msg)\n```\n\nConfira todos os detalhes no vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/07qqDZrZ--8\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "socket",
        "script",
        "cliente",
        "lado",
        "function",
        "msgs",
        "para",
        "connected",
        "isso",
        "mensagem"
      ],
      "metadata": {
        "title": "Hands-on - Socket.io Parte 2",
        "date": "2017-05-12",
        "tags": "['Javascript']",
        "thumbnail": "Socket.IO2.png",
        "author": "Tulio Faria",
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "blog/socket-io-parte2/index.md"
      }
    },
    {
      "id": "f8d51dd991dafc75",
      "url": "https://devpleno.com/blog/immutability-e-immutablejs/index",
      "title": "Immutability e ImmutableJS",
      "content": "Neste hands-on/dica, falo um pouco da importância da imutabilidade em programação funcional em Javascript. Além disso, apresento o módulo Immutable que nos ajuda a lidar com imutabilidade.\n\nApenas para simplificar:\n\n- Imutabilidade / Immutability: nome da técnica\n\n- Imutável / Immutable: nome do módulo e qualidade da variável que não é alterada ao longo do tempo (ex: variável imutável)\n\n# Confira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/ZgAmnOHR7u8\" allowFullScreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!",
      "keywords": [
        "embed",
        "imutabilidade",
        "para",
        "responsive",
        "https",
        "dulo",
        "immutable",
        "nome",
        "imut",
        "vari"
      ],
      "metadata": {
        "title": "Immutability e ImmutableJS",
        "date": "2017-03-28",
        "tags": "['Javascript']",
        "thumbnail": "Immutability.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/immutability-e-immutablejs/index.md"
      }
    },
    {
      "id": "f97623c0399b9d68",
      "url": "https://devpleno.com/blog/javascript-streams-p-2-writable-streams/index",
      "title": "Javascript: Streams (P-2: Writable Streams)",
      "content": "Neste vídeo, um assunto bastante interessante para ser utilizado no dia-a-dia: Streams. A primeira parte fala sobre writable streams ou streams de gravação.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/9fVNChUKfZ4\" allowfullscreen></iframe>\n</div>\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "embed",
        "streams",
        "responsive",
        "https",
        "para",
        "classname",
        "iframe",
        "youtube",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Javascript: Streams (P-2: Writable Streams)",
        "date": "2017-04-24",
        "tags": "['Javascript']",
        "thumbnail": "JSStreamParte2.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/javascript-streams-p-2-writable-streams/index.md"
      }
    },
    {
      "id": "f9a8d2cf05821a31",
      "url": "https://devpleno.com/blog/ensinar-algo/index",
      "title": "Ensinar algo a alguém todos os dias (Part 1)",
      "content": "Você já ensinou algo a alguém hoje? Quando estamos na faculdade, por exemplo, as pessoas tendem a nos perguntar dicas sobre de computação/informática ou pedir ajuda em algumas situações como configurar o roteador, e nós algumas vezes pensamos “Esse cara acha que eu sou o que? Sou analista,mas não mexo com rede”.\n\nA dica de hoje é fazer exatamente o contrário disso. Uma das coisas que venho tentando aplicar na minha vida é que se as pessoas me perguntam sobre isso, eu falo algo como “eu não sou especialista em rede, mas, se você quiser, eu tento te ajudar”.\n\nQuando você está ajudando ou ensinando uma pessoa, mesmo sem querer nada em troca, a gente gera algo bem interessante que é uma sensação de gratidão nessa pessoa com você. Isso gera uma positividade muito boa para a sua carreira e vida.\n\nO detalhe é que a pessoa se sente em débito com você, sempre que ela precisar ou lembrar de alguém, ela vai lembrar de você. É muito legal se você puder ensinar as pessoas ou ajudar pelo menos uma vez por dia, por exemplo “hoje eu consigo ensinar alguém a programar tal coisa”, “eu consigo ensinar a minha mãe a mexer no controle remoto” e por aí vai. Toda vez que você ensina algo, está praticando o que falamos de doar conhecimento aos outros e com certeza você vai receber muito mais que você doa.\n\nA conclusão de hoje é sempre doe mais do que você pretende receber, ajude as pessoas a vencer alguma barreira. Eu tenho certeza que isso vai gerar muitos frutos legais para a sua carreira e pra sua vida pessoal, pois as pessoas não vão lembrar de você apenas com coisas vinculadas a dinheiro e profissional, quando tiramos o olho do dinheiro ele aparece no bolso. Quando você pratica gerar valor às pessoas, o dinheiro vem por consequência.\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/WGdAsrIZCrk\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "pessoas",
        "algo",
        "hoje",
        "quando",
        "embed",
        "algu",
        "vida",
        "isso",
        "pessoa",
        "muito"
      ],
      "metadata": {
        "title": "Ensinar algo a alguém todos os dias",
        "date": "2017/08/01",
        "tags": "['Carreira']",
        "thumbnail": "ENSINAR-ALGO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/ensinar-algo/index.md"
      }
    },
    {
      "id": "f9d27eec6a4257b1",
      "url": "https://devpleno.com/blog/factory-function/index",
      "title": "Factory Function em JavaScript (Part 2)",
      "content": "Assim, conseguimos manter um estado para esse objeto porque temos uma closure sem nenhum this ou coisa desse sentido, com isso não temos problema nenhum de localização. Muita gente vai falar que não conseguimos o isolamento das variáveis, só que, na verdade, conseguimos sim utilizando closure. Vamos fazer um outro teste só que ao invés de chamar de count vou chamar de opa:\n\n```jsx\nfunction personFactory(name) {\n  let count = 0\n\n  return {\n    opa () => count++,\n    name: name,\n    type: 'person'\n  }\n}\n\nconst tulio = personFactory('Tulio')\n\nconst joao = personFactory('João')\n\nconsole.log(tulio.opa())\n\nconsole.log(tulio.opa())\n```\n\nContinua funcionando normalmente, porém se eu tentar fazer um console.log(tulio.count), que teoricamente seria o count de fora, ele apareceria undefined porque está dentro da closure.\n\nQuando retornado, ele cria uma nova interface publica para o objeto e as únicas que temos é o opa, name e type. Então podemos utilizar para gerar como se fosse uma classe de uma maneira mais funcional ou quando queremos retornar um objeto com várias propriedades que queremos deixar um ou dois dinâmicos apenas, construindo uma factory de um objeto que é um pouco mais complexo.\n\nO factory em outras linguagens segue mais ou menos a mesma linha, a única diferença é que ele instancia realmente uma classe. Uma dica é que quando for pensar em programação funcional comece a restringir o uso do this, quanto mais longe estamos do this, mais próximo estamos da programação funcional.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/w5rzHhGx-bw\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "description": "Aprenda como usar Factory Functions em JavaScript para criar objetos sem classes. Exemplos práticos com closures e estado privado.",
      "keywords": [
        "tulio",
        "count",
        "name",
        "personfactory",
        "objeto",
        "para",
        "console",
        "factory",
        "mais",
        "const"
      ],
      "metadata": {
        "title": "Factory Function em JavaScript",
        "description": "Aprenda como usar Factory Functions em JavaScript para criar objetos sem classes. Exemplos práticos com closures e estado privado.",
        "date": "2017-07-20",
        "tags": "['Javascript']",
        "thumbnail": "FACTORY-FUNCTION-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/factory-function/index.md"
      }
    },
    {
      "id": "fa2e8d86f48452df",
      "url": "https://devpleno.com/tag/fundamentos/2",
      "title": "Fundamentos - Pagina 2 - DevPleno",
      "content": "Fundamentos\n\n## Arquivo de Insights\n\n56 posts encontrados com a tag Fundamentos\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 7 de ago. de 2017 Short-circuit e valores padrão](/short-circuit-e-valores-padrao)\n\n[Fundamentos 2 de ago. de 2017 Arrow Functions - Construindo funções anônimas de forma mais simplificada](/arrow-functions)\n\n[Javascript 2 de ago. de 2017 High-order Function Filter](/filter)\n\n[Javascript 2 de ago. de 2017 High-order Function Find](/find)\n\n[Javascript 30 de jul. de 2017 Async - Como Controlar Operações Assíncronas](/async)\n\n[Javascript 28 de jul. de 2017 Float e precisão](/float-e-precisao)\n\n[Javascript 27 de jul. de 2017 Bind - Altere comportamento e contexto de execução de suas funções](/bind)\n\n[Javascript 24 de jul. de 2017 Standard Parte 2](/standard-parte-2)\n\n[Algoritmos 11 de jul. de 2017 Como saber a complexidade de um algoritmo](/complexidade-de-um-algoritmo)\n\n[Javascript 3 de jul. de 2017 Evite o this em JavaScript](/evite-o-this-em-js)\n\n[Javascript 30 de jun. de 2017 High-order Function - Reduce](/reduce)\n\n[Javascript 27 de jun. de 2017 High-order Function MAP](/map)\n\n[Anterior](/tag/fundamentos)2 / 5[Próxima](/tag/fundamentos/3)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "javascript",
        "2017",
        "fundamentos",
        "high",
        "order",
        "function",
        "algoritmos",
        "carreira",
        "ferramentas",
        "nodejs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/tag/fundamentos/2"
      }
    },
    {
      "id": "fa56457ef7e87ac3",
      "url": "https://devpleno.com/blog/mono-ou-multi-thread-poo-para-js/index",
      "title": "Mono ou multi thread - POO para JS (Part 2)",
      "content": "Principalmente no navegador, essa característica do JavaScript permite que a gente não bloqueie a tela. É muito comum em Java por exemplo, se você não criar uma thread nova e clicar em um botão swing, ao passar o mouse em cima da interface, ela fica com loading. Em JavaScript isso não acontece porque um dos stacks que ele tem é o de processamento gráfico, então ele não deixa acontecer se utilizarmos as boas práticas.\n\nPara evitar que nosso programa trave no tempo que está executando uma linha de código, podemos utilizar o seguinte:\n\n```jsx\nconst fs = require('fs')\nconst a = 1\nconst b = 2\nconsole.log('inicio')\nfs.readdir('./', (err, files) => console.log(files))\nconsole.log('fim')\n```\n\nCom isso o resultado é que o início e fim virão antes do readdir. Ela vai ser empilhada no event loop e quando acabar a execução, vai sair da pilha.\n\nAgora vamos supor que eu tenho uma operação um pouco pesada, temos uma forma de mandar para o event loop utilizando o setTimeOut(() => console.log('event loop'), 0) e ao invés de passar um tempo, se passarmos zero vamos empilhar isso dentro do event loop.\n\nPara fechar, vamos fazer um problema conhecido como Produtor-Consumidor, esse é um problema muito recorrente que utilizamos para aprender essa forma de lidar com várias threads em Java.\n\nTemos uma função producer, que é a que produz, e uma função consumer, onde consome algo:\n\n```jsx\nconst stock = \\[\\]\nfunction producer() {}\nfunction consumer() {}\n```\n\nEntão, quando eu produzo, jogo em stock e o consumidor irá consumir do stock. O problema é que essas duas functions rodam separadamente, se fossemos fazer isso em Java, teríamos que ter duas threads. Para simular essa questão em JavaScript:\n\n```jsx\nconst stock = \\[\\]\nfunction producer(){\n    console.log('producer')\n    setTimeOut(producer, Math.ceil(Math.random()\\*3000))\n}\nfunction consumer(){\n    console.log('consumer')\n    setTimeOut(consumer, Math.ceil(Math.random()\\*3000))\n}\n```",
      "keywords": [
        "stock",
        "para",
        "const",
        "consumer",
        "math",
        "isso",
        "console",
        "producer",
        "length",
        "java"
      ],
      "metadata": {
        "title": "Mono ou multi thread - POO para JS",
        "date": "2017-11-06",
        "tags": "['Javascript']",
        "thumbnail": "MonoOuMulti.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/mono-ou-multi-thread-poo-para-js/index.md"
      }
    },
    {
      "id": "fb06fdf504541cf8",
      "url": "https://devpleno.com/blog/ensinar-algo/index",
      "title": "Ensinar algo a alguém todos os dias (Part 2)",
      "content": "Deixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço",
      "keywords": [
        "pessoas",
        "algo",
        "hoje",
        "quando",
        "embed",
        "algu",
        "vida",
        "isso",
        "pessoa",
        "muito"
      ],
      "metadata": {
        "title": "Ensinar algo a alguém todos os dias",
        "date": "2017/08/01",
        "tags": "['Carreira']",
        "thumbnail": "ENSINAR-ALGO-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/ensinar-algo/index.md"
      }
    },
    {
      "id": "fb151414cd591e40",
      "url": "https://devpleno.com/blog/preview-de-imagens-antes-do-upload/index",
      "title": "Preview de imagens antes do upload (Part 2)",
      "content": "<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/euUtDQcwsYk\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "filereader",
        "script",
        "function",
        "upload",
        "file",
        "vamos",
        "this",
        "const",
        "fazer",
        "https"
      ],
      "metadata": {
        "title": "Preview de imagens antes do upload",
        "date": "2017-11-13",
        "tags": "['Javascript']",
        "thumbnail": "PreviewDeImagens.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/preview-de-imagens-antes-do-upload/index.md"
      }
    },
    {
      "id": "fb276572711d0158",
      "url": "https://devpleno.com/blog/nova-skills-preco-que-tem-que-ser-pago/index",
      "title": "Novas Skills: O preço que tem que ser pago (Part 1)",
      "content": "Recentemente ministrei uma palestra e passei a refletir o quanto de tempo nós que investir para conseguir realizar alguma coisa. Conhecimento ou Skills são como se fosse uma conta bancaria. Por exemplo, se você quer aprender a programar alguma uma certa linguagem, tem que depositar tempo nessa linguagem. Quando se quer uma nova Skill, você entra devendo nesta conta.\n\nPor exemplo, quero ter uma Skill que é saber a complexidade de um algoritmo, como não sei nada sobre este algoritmo começo negativo, e, na medida que estuda esta linguagem, você vai se aproximando de não dever nada, ou seja, conhecer o algoritmo. E quando você começa a tirar lucro disso podemos fazer a analogia de dinheiro investido, ou positivo nesta conta.\n\n**Sempre começamos no negativo.**\n\nComo a música do Mr Big, Price you gonna pay, se você quer aprender algo novo, é o preço que você tem que pagar. Muitas vezes, com alguns treinamentos, você pode reduzir esse tempo gasto, mas estaria trocando menos tempo por dinheiro investido.\n\nIsso é muito interessante para refletirmos sobre nossa vida, às vezes estamos empolgados para fazer algo, mas não queremos pagar o preço.\n\n\"Eu quero ter uma empresa milionária, mas não quero pagar o preço\"\n\n\"Quero fazer meu aplicativo funcionar, mas não quero pagar o preço\"\n\nÉ importante termos essa ciência de que tudo tem um preço para se pagar: seu tempo, dinheiro... Algo deve ser depositado para trazer resultados.\n\n**Meu conselho:**\n\nSe você já está dedicando seu tempo a estudar alguma coisa, estude de um jeito que não vai precisar se dedicar novamente. Da mesma forma que ficamos negativos em uma Skill por não ter nenhuma experiencia, com o tempo vamos ficando cada vez mais positivos.\n\n**Qual o intuito disso?**\n\nSe pararmos um pouco de cuidar dessa Skill, ela começa a ser esquecida, pois ela não está enraizada em você, e por esse motivo é muito importante na nossa carreira continuar estudando para não perder esses conhecimentos.\n\nReflita sobre isso.",
      "keywords": [
        "para",
        "tempo",
        "pagar",
        "quero",
        "alguma",
        "skill",
        "come",
        "coisa",
        "como",
        "conta"
      ],
      "metadata": {
        "title": "Novas Skills: O preço que tem que ser pago",
        "date": "2017-05-08",
        "tags": "['Carreira']",
        "thumbnail": "NovaSkill.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/nova-skills-preco-que-tem-que-ser-pago/index.md"
      }
    },
    {
      "id": "fc1cc4c2b1b3b6d7",
      "url": "https://devpleno.com/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose",
      "title": "Mongoose: corrigindo &quot;Cannot overwrite &#39;Model&#39; model once compiled&quot; - DevPleno (Part 3)",
      "content": "[](https://twitter.com/intent/tweet?text=Mongoose%3A%20corrigindo%20%22Cannot%20overwrite%20) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcorrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose)",
      "description": "Durante o desenvolvimento de um protótipo aqui na empresa, eu me deparei com uma situação bem interessante no Mongoose. Por algum motivo, comecei a receber...",
      "keywords": [
        "mongoose",
        "module",
        "user",
        "require",
        "model",
        "windows",
        "erro",
        "devpleno",
        "problem",
        "digo"
      ],
      "metadata": {
        "chunkIndex": 2,
        "totalChunks": 3,
        "sourcePath": "/corrigindo-o-erro-cannot-overwrite-model-model-once-compiled-no-mongoose"
      }
    },
    {
      "id": "fc36758e606b7481",
      "url": "https://devpleno.com/blog/programacao-assincrona/index",
      "title": "Programação Assíncrona - NodeJS Primeiros Passos (Part 2)",
      "content": "```jsx\nvar fs = require('fs');\nfs.readFile('dados.txt', 'utf8'), function (err, contents){\n    console.log(contents)\n});\nconsole.log('continuar...')\n```\n\nVamos salvar como async.js. Note que eu passo como parâmetro para essa instrução um callback.\n\n**O que faz uma função de callback?**\n\nEssa operação de IO demora um pouco para finalizar, então como é assíncrono, ele vai rodar e vai passar reto enquanto os dados não estiverem prontos e não pararem nela como no sync.js. Quando ele bater na linha ReadFile ele vai passar todas as camadas do SO pedindo para fazer esse IO e, internamente, vai gerenciar avisando quando estiver pronto para leitura ou dado um erro, vai ser chamado o callback.\n\nNo async, repare o seguinte: o 'continuar...' apareceu antes do conteúdo do contents. Imagine se fossemos ler mil arquivos, não teria problema nenhum porque os arquivos vão lendo a medida que vão chegando. Por exemplo, se eu mandei 10 arquivos, não significa que os 10 vão ser lidos ao mesmo tempo, pode ser que o primeiro esteja disponível primeiro, depois o quinto, depois o terceiro e por ai vai. Enfim, de forma assíncrona não consegue saber quando vai ser retornado mas isso é legal porque não travamos o nosso programa principal apenas para fazer uma leitura de IO.\n\nIsso é fantástico porque qualquer aplicação mais robusta hoje em dia é uma aplicação que chamamos de IO intensive, ou seja, eles usam muita entrada e saída. Se você for pensar, por exemplo, no facebook, a parte de chat e autorizações automáticas são muitas operações de IO acontecendo ao mesmo tempo, então se temos uma engine como o node que consegue lidar com isso de uma forma muito boa, podemos lidar com essas operações de IO intensive de forma assíncrona e não vai travar a tread principal.",
      "keywords": [
        "para",
        "como",
        "vamos",
        "fazer",
        "dados",
        "opera",
        "ncrono",
        "contents",
        "isso",
        "ncrona"
      ],
      "metadata": {
        "title": "Programação Assíncrona - NodeJS Primeiros Passos",
        "date": "2017-06-16",
        "tags": "['Javascript', 'Fundamentos', 'NodeJS']",
        "thumbnail": "ProgramacaoAssincrona.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "blog/programacao-assincrona/index.md"
      }
    },
    {
      "id": "fc3cdbfb12f352d0",
      "url": "https://devpleno.com/blog/decisao-tecnica/index",
      "title": "Decisão técnica não precisa ser eterna (Part 2)",
      "content": "Eu gosto de deixar meu aprendizado sempre atualizado, então quando eu posso comprar cursos, eu compro. Se eu quero aprender React ou Angular para testar, eu faço ambos os cursos e, aí sim, eu tomo a decisão ao invés de ficar só olhando e tentando achar conteúdo dentro daquilo. Testar e ver possibilidades faz parte da nossa profissão. Descobrir e ponderar qual é a melhor escolha para aquele momento.\n\nObviamente, dependendo de onde você trabalha, não consegue tomar decisão de qual tecnologia utilizar, comece utilizar suas horas vagas para testar novas tecnologias em outros projetos, é bom estar renovando o seu 'cinto de ferramentas'.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/p4-XQvw5VSM\" allowfullscreen></iframe>\n</div>\n\nDeixe seu cometário, curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "decis",
        "para",
        "melhor",
        "qual",
        "mais",
        "angular",
        "react",
        "tomar",
        "embed",
        "tecnologia"
      ],
      "metadata": {
        "title": "Decisão técnica não precisa ser eterna",
        "date": "2017-08-08",
        "tags": "['Carreira']",
        "thumbnail": "DECISÃO-TÉCNICA-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/decisao-tecnica/index.md"
      }
    },
    {
      "id": "fc4a0e99822a8a4f",
      "url": "https://devpleno.com/cmder-turbine-seu-cmd-no-windows",
      "title": "cmder: Turbine seu cmd no Windows - DevPleno (Part 2)",
      "content": "Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=cmder%3A%20Turbine%20seu%20cmd%20no%20Windows&url=https%3A%2F%2Fdevpleno.com%2Fcmder-turbine-seu-cmd-no-windows) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcmder-turbine-seu-cmd-no-windows)",
      "description": "Olá pessoal, hoje vai uma dica interessante para quem desenvolve no windows (sim, eu ainda me incluo neste grupo, mas logo logo estarei de mudança :)). Eu ...",
      "keywords": [
        "cmder",
        "windows",
        "https",
        "para",
        "javascript",
        "turbine",
        "bastante",
        "copiar",
        "muito",
        "basta"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/cmder-turbine-seu-cmd-no-windows"
      }
    },
    {
      "id": "fc6cc47ef1df1ed5",
      "url": "https://devpleno.com/blog/render-condicional-em-reactjs/index",
      "title": "Render condicional em ReactJS (Part 2)",
      "content": "**Importante:** o trecho de template que vem após o && deve seguir a mesma regra do return do render. Ou seja, temos que retornar sempre um nó filho (no caso do exemplo um span).\n\nA combinação destas técnicas nos permite chegar a componentes muito bem organizados. Pois se precisarmos renderizar algo totalmente diferente, podemos usar o if. Caso desejamos apenas mostrar/ocultar trechos menores dentro do render, a segunda opção é muito viável.\n\nNão deixe de comentar e nos seguir em todo lugar :) _Ah, e para você que quer aprender ReactJS mais rapidamente, temos o nosso curso completo!_\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "para",
        "condicao",
        "render",
        "span",
        "temos",
        "react",
        "component",
        "return",
        "este",
        "reactjs"
      ],
      "metadata": {
        "title": "Render condicional em ReactJS",
        "date": "2017-01-25",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "RenderCondicional.jpg",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/render-condicional-em-reactjs/index.md"
      }
    },
    {
      "id": "fc8ee4f1bb6ad1f5",
      "url": "https://devpleno.com/blog/hands-on-nodemon/index",
      "title": "Nodemon: Monitore alterações e reinicie automaticamente seus scripts (Part 1)",
      "content": "Neste hands-on, vamos falar mais especificamente sobre o Nodemon. Primeiramente vamos instalar:\n\n```jsx\nnpm install -g nodemon\n```\n\nEu poderia instalar localmente também apenas tirando o -g, assim ele não ficaria disponível no sistema inteiro. Mas, o que o nodemon faz?\n\nEle permite que a gente rode um script em node e que ele fique monitorando os arquivos. Caso você altere, ele restarta automaticamente o servidor, isso é muito interessante principalmente quando vamos fazer algo com o express. Eu tenho um server.js:\n\n```jsx\nconst express = require('express');\n\nconst = express();\napp.get('/', function (req, res){\n    console.log('>> here...' +new Date().getTime())\n    res.send('Hello World');\n})\napp.listen(3000, function() {\n    console.log('Example app listening on port 3000!');\n});\n```\n\nCaso eu modifique alguma linha, por exemplo:\n\n```jsx\nconsole.log('Example app listening on port 3000!****')\n```\n\nEle restarta o server e já me diz o server foi reiniciado devido a mudanças:\n\n![Exemplo](Ex1.png)\n\nVamos supor que por algum motivo eu não quero alguns arquivos, então eu posso fazer ele ignorar esses arquivos. Vou fazer o teste na pasta lib:\n\n```js\nnodemon --ignore lib/ server.js\n```\n\nAssim nada que modificarmos dentro dessa pasta vai fazer o server ser restartado.\n\nOutra coisa interessante é que se digitarmos rs e dermos um enter, conseguimos forçar um restart dele também.\n\nEssa ferramenta ajuda bastante a agilizar o processo de desenvolvimento recarregando os arquivos sempre que precisarmos. Tem outras opções, por exemplo, conseguimos criar um arquivo de configuração, mas se usarmos apenas para restartar o servidor, já é muito útil e aumenta muito a produtividade.\n\nConfira o vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/iZpvJm6Oq6I\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "server",
        "vamos",
        "nodemon",
        "arquivos",
        "fazer",
        "express",
        "embed",
        "3000",
        "muito",
        "console"
      ],
      "metadata": {
        "title": "Nodemon: Monitore alterações e reinicie automaticamente seus scripts",
        "date": "2017-07-28",
        "tags": "['Javascript', 'NodeJS']",
        "thumbnail": "Nodemon.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-nodemon/index.md"
      }
    },
    {
      "id": "fcb27c9b3f968f5e",
      "url": "https://devpleno.com/por-que-a-toptal-e-tao-valorizada",
      "title": "Por que a Toptal é tão valorizada no mercado? - DevPleno",
      "content": "Carreira\n\n## Por que a Toptal é tão valorizada no mercado?\n\nT\nPor Tulio Faria • 9 de fevereiro de 2018\n\n[Carreira](/tag/carreira)\n\nVocê sabe porque a Toptal é tão valorizada no mercado? Neste vídeo, você vai entender melhor sobre o top 3%.\n\nAtualmente o ReactJS é uma das tecnologias que mais estão em alta. Os profissionais que dominam essa biblioteca vêm sendo cada vez mais valorizados pelas pequenas e grandes empresas (incluindo a Toptal), porém esses profissionais ainda estão em falta no mercado. Aproveite para surfar a crista da onda e conquistar as melhores vagas de emprego. Conheça o DevReactJS, nosso treinamento premium que vai te fazer entregar aplicações completas e profissionais em ReactJS EM APENAS 45 DIAS. Saiba mais [sobre o DevReactJS.](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n[](https://go.devpleno.com/fsm?utm_source=blog&#x26;utm_campaign=rc_blogpost&#x26;sck=blog)\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Por%20que%20a%20Toptal%20%C3%A9%20t%C3%A3o%20valorizada%20no%20mercado%3F&url=https%3A%2F%2Fdevpleno.com%2Fpor-que-a-toptal-e-tao-valorizada) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpor-que-a-toptal-e-tao-valorizada)",
      "description": "Você sabe porque a Toptal é tão valorizada no mercado? Neste vídeo, você vai entender melhor sobre o top 3%. <div className=&#34;embedresponsive embedresponsiv...",
      "keywords": [
        "https",
        "toptal",
        "valorizada",
        "blog",
        "carreira",
        "mercado",
        "mais",
        "profissionais",
        "sobre",
        "reactjs"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/por-que-a-toptal-e-tao-valorizada"
      }
    },
    {
      "id": "fdb93792a7991812",
      "url": "https://devpleno.com/blog/sleep-em-generator/index",
      "title": "Sleep em Generator (Part 2)",
      "content": "```jsx\nco(function* () {\n  console.log('Step 1')\n  yield sleep(1000)\n  console.log('Step 2')\n})\n```\n\nCom isso temo um sleep mais próximo que tínhamos por exemplo em C, Pascal ou até o PHP.\n\nConfira os passos em vídeo:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/xmVWF1RU3n4\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!",
      "keywords": [
        "sleep",
        "function",
        "para",
        "generator",
        "fazer",
        "utilizar",
        "console",
        "como",
        "porque",
        "step"
      ],
      "metadata": {
        "title": "Sleep em Generator",
        "date": "2017-06-28",
        "tags": "['Javascript']",
        "thumbnail": "SleepGenerator.png",
        "author": "Tulio Faria",
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "blog/sleep-em-generator/index.md"
      }
    },
    {
      "id": "fde457e0cdd428a1",
      "url": "https://devpleno.com/handsonreact-yt",
      "title": "Redirecting to: /",
      "content": "Redirecting to: / [Redirecting from /handsonreact-yt to /](/)",
      "keywords": [
        "redirecting",
        "from",
        "handsonreact"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/handsonreact-yt"
      }
    },
    {
      "id": "fe3db1ca9b9c7e59",
      "url": "https://devpleno.com/blog/find/index",
      "title": "High-order Function Find (Part 1)",
      "content": "Já falamos sobre [map](https://www.devpleno.com/map/), [reduce](https://www.devpleno.com/reduce/) e [filter](https://www.devpleno.com/filter), hoje vou mostrar uma [high-order function](https://www.devpleno.com/high-order-functions/) bem parecida chamada de find. Vamos aproveitar o exemplo do reduce:\n\n```jsx\nconst carrinho = [\n  { id: 1, preco: 2, qtd: 2, estoque: 10 },\n  { id: 1, preco: 3, qtd: 5, estoque: 2 }\n]\n\nconst subtotal = (item) => item.preço * item.qtd\n\nconst filtroEmEstoque = (item) => item.estoque * item.qtd\n\nconst soma = (soma, subtotal) => subtotal + soma\n\nconst total = carrinho.filter(filtroEmEstoque).map(subtotal).reduce(soma, 0)\n\nconst produtoId1 = (item) => item.id === 1\n\nconst produtoId1Retorno = carrinho.find(produtoId1)\n\nconsole.log(produtoId1Retorno)\n```\n\nPerceba que pedimos o produto com o id 1, mandamos procurar com o find no carrinho e buscamos esse ID 1. Uma coisa interessante e comum é fazermos como fizemos em cima, até meu filtro ser uma variável e apenas fazermos o retorno. Agora imaginem que a gente queira parametrizar ainda mais, um conceito bem legal é a seguinte:\n\n```jsx\nconst idEquals = (id, item) => item.id === id\n\nconst idEquals1 = carrinho.find(produtoId1)\n\nconsole.log(produtoId1Retorno)\n```\n\nPerceba que eu fiz uma arrow function e nela estou passando o ID com o item que estou iterando. Quando for criar mais filtros, posso usar essa função de idEquals e fixar quem eu quero nesse primeiro parâmetro.\n\n```jsx\nconst idEquals = (id, item) => item.id === id\n\nconst idEquals1 = idEquals.bind(null, 1)\n\nconst idEquals1 = carrinho.find(produtoId1)\n\nconsole.log(produtoId1Retorno)\n```\n\nEssa nova função que eu criei sempre terá um do ID fixo, então quando eu fizer:\n\n```jsx\nconsole.log(carrinho.find(idEquals1)\n```",
      "keywords": [
        "item",
        "const",
        "https",
        "find",
        "carrinho",
        "devpleno",
        "mais",
        "reduce",
        "subtotal",
        "soma"
      ],
      "metadata": {
        "title": "High-order Function Find",
        "date": "2017-08-02",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "FIND-1-790x400.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/find/index.md"
      }
    },
    {
      "id": "fe52232328af7b66",
      "url": "https://devpleno.com/javascript-streams-p-4-transform",
      "title": "Javascript: Streams (P-4: Transform) - DevPleno",
      "content": "Javascript\n\n## Javascript: Streams (P-4: Transform)\n\nT\nPor Tulio Faria • 28 de abril de 2017\n\n[Javascript](/tag/javascript)\n\nNa quarta parte sobre Streams, falo sobre Transform. Confira!\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Ah, fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Javascript%3A%20Streams%20(P-4%3A%20Transform)&url=https%3A%2F%2Fdevpleno.com%2Fjavascript-streams-p-4-transform) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fjavascript-streams-p-4-transform)",
      "description": "Na quarta parte sobre Streams, falo sobre Transform. Confira! <div className=&#34;embedresponsive embedresponsive16by9&#34;   <iframe className=&#34;embedresponsiveite...",
      "keywords": [
        "https",
        "javascript",
        "streams",
        "transform",
        "sobre",
        "devpleno",
        "facebook",
        "para",
        "2fdevpleno",
        "2fjavascript"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/javascript-streams-p-4-transform"
      }
    },
    {
      "id": "fe698256c99d57aa",
      "url": "https://devpleno.com/blog/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste/index",
      "title": "Promise Constante - como criar situações assíncronas de teste (Part 1)",
      "content": "A dica de hoje é bastante interessante porque ela nos ajuda a criar algumas situações de teste, principalmente envolvendo promises, que é uma forma de lidar com o assincronismo em JavaScript. Muitas vezes precisamos testar essa promise, então imagine o seguinte cenário, onde eu quero construir uma função readDir e promisificá-la:\n\n```jsx\nconst fs = require('fs')\nconst readdir = (path) =>\n  new Promise((resolve, reject) => {\n    fs.readdir(path, (err, list) => {\n      if (err) {\n        reject(err)\n      } else {\n        resolve(list)\n      }\n    })\n  })\n```\n\nAgora imagine que temos uma outra função chamada path, que é assíncrona:\n\n```jsx\nconst functA = (path) => {\n  const list = await readdir(path)\n  console.log(list)\n}\n```\n\nSe nós quiséssemos, por exemplo, testar essa função, rodaríamos o funcA:\n\n```jsx\nfuncA('./')\n```\n\nEla irá trazer todos os arquivos que eu tenho no meu diretório atual. Agora imaginem que eu quero testar esse readdir, mas sem efetivamente passar pelo fs, quero que minha promise retorne os valores para que possa apenas testar se o funcA está correto. É equivalente ao mock.\n\nQuando queremos ter uma promise que é uma constante para a situação que estamos utilizamos, podemos fazer o seguinte:\n\n```jsx\nconst readdir = (path) => Promise.resolve(['arquivo1.txt', arquivo2.txt])\n```\n\nEle irá retornar uma lista com esses resultados. Então se eu quiser ter uma lista que sempre resolve pro mesmo valor, sendo utilizado parecido com mock para teste, utilizamos o promise.resolve.\n\nQuando estamos aprendendo programação assíncrona e queremos fazer esses testes, isso é muito interessante.\n\nConfira o video:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/OeI0CCzl0y4\" allowfullscreen></iframe>\n</div>",
      "keywords": [
        "promise",
        "readdir",
        "path",
        "const",
        "resolve",
        "testar",
        "list",
        "para",
        "embed",
        "quero"
      ],
      "metadata": {
        "title": "Promise Constante - como criar situações assíncronas de teste",
        "date": "2017-10-03",
        "tags": "['Javascript', 'Fundamentos']",
        "thumbnail": "PromiseConstante.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste/index.md"
      }
    },
    {
      "id": "fe6b494c12708e5e",
      "url": "https://devpleno.com/entrevista-com-edy-segura",
      "title": "DevPleno Entrevista - Edy Segura - DevPleno (Part 2)",
      "content": "“O brasileiro tem uma dinâmica, a gente se mistura, corre atrás, quando recebemos uma tarefa queremos resolver. Lá fora, o que eu vejo em alguns perfis de outros países é, por exemplo, eles pedem para fazer X, e se tem algo que saiu desse X, os profissionais não fazem ou ficam travados. Já nós, baseado nos brasileiros que eu já trabalhei, se travou em algum lugar, vamos querer resolver.”\n\nEu percebo isso também, faço bastante projeto fora e da pra perceber muito que o pessoal é mais objetivo, se ele é contratado para fazer X, ele não faz X+1. Se você fosse dar uma dica de carreira, analisando o que você fez, ou avaliando o que as pessoas fizeram, o que você diria a elas?\n\n“Principalmente para nossa área é fundamental o Inglês, eu me arrependo por não ter dado importância cedo para o inglês, tive que sofrer um pouco com isso e perdi algumas oportunidades, mas é fundamental, já que é a língua internacional da tecnologia. Quando você aprende o inglês abre portas de tal maneira que você se liberta para pegar conteúdos gratuitos de qualidade na internet. Em projetos open-source, existe gente de todas as nacionalidades, então minha dica de carreira número um nessa área é o inglês.”\n\nE sobre tecnologia, o que você acha que o pessoal deveria estar antenado para 2017?\n\n“Eu acredito que o JavaScript com certeza para quem está começando vai ajudar muito, porque mesmo que o projeto não é focado em JavaScript o ferramentario é feito em JavaScript. Outra linguagem que está há bastante tempo e não vai sair tão cedo é o Java, é uma linguagem standard, que em algum momento você vai ter contato.”\n\nConfira o video:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom)e cadastre seu e-mail para não perder nenhuma novidade. Deixe suas dúvidas e sugestões nos comentários. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.",
      "description": "Edy Segura é professor da graduação da UNIVAS e da pósgraduação do INATEL e também trabalha com desenvolvimento de software, além de ser um grande amigo me...",
      "keywords": [
        "para",
        "carreira",
        "gradua",
        "https",
        "cnico",
        "devpleno",
        "segura",
        "isso",
        "fazer",
        "fora"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 3,
        "sourcePath": "/entrevista-com-edy-segura"
      }
    },
    {
      "id": "fe82aed92e760fa2",
      "url": "https://devpleno.com/cheerio",
      "title": "Cheerio: Uma implementação jQuery para Node - DevPleno (Part 2)",
      "content": "request('https://www.uol.com.br', function (err, res, body) {\nif (!err &#x26;&#x26; res.statusCode == 200) {\nlet $ = cheerio.load(body)\n\n$('p').each(function () {\nconsole.log($(this).html())\n})\n}\n})\nO Cheerio não é um browser completo, então vai permitir que você apenas navegue pelo HTML, isso é muito legal para fazermos um crawler, por exemplo, podemos acessar um outro site como se fosse um navegador e escolher a informação que a gente quer, usando seletores do próprio jQuery.\n\nConfira o video:\n\nDeixe suas dúvidas e sugestões nos comentários. Curta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=Cheerio%3A%20Uma%20implementa%C3%A7%C3%A3o%20jQuery%20para%20Node&url=https%3A%2F%2Fdevpleno.com%2Fcheerio) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fcheerio)",
      "description": "Cheerio é um módulo muito interessante porque é uma implementação do jQuery para Node. Vou criar um arquivo novo para ilustrar melhor. Vou salvar como chee...",
      "keywords": [
        "cheerio",
        "html",
        "para",
        "request",
        "https",
        "function",
        "jquery",
        "const",
        "require",
        "body"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/cheerio"
      }
    },
    {
      "id": "fe9e7d8d290779a7",
      "url": "https://devpleno.com/blog/hands-on-threejs/index",
      "title": "Hands-on - Three.JS (Part 1)",
      "content": "Hoje vamos falar um pouco sobre Three.JS, que é uma biblioteca muito interessante para conseguirmos fazer 3d no browser, melhor dizendo, ele faz essa compatibilidade para renderizar no browser com WebGL ou canvas. Para testar isso, vamos fazer um teste utilizando um cubo em 3d. No site deles, existem vários exemplos que já fizeram utilizando o three.js. Nós podemos baixar ele direto no site threejs.org ou simplesmente pegar um three.js de um CDN. Vamos criar um arquivo HTML. Quem já trabalhou com software 3d sabe que basicamente temos uma cena onde acontece as coisas em 3d :\n\n```jsx\n<html>\n  <body>\n    <script src='//cdnjs.cloudflare.com/ajax/libs/three.js/88/three.js'></script>\n    <script>\n      const scene = new THREE.Scene() const camera = new\n      THREE.PerspectiveCamera(75, window.in nerWidth / window.innerHight, 0.1,\n      1000) const renderer = new THREE.WebGLRenderer()\n      renderer.setSize(window.innerWidth, window.innerHeight)\n      documnet.body.appenChild(renderer.domElement)\n    </script>\n  </body>\n</html>\n```\n\nEsse parâmetro 75 é a profundidade de campo e o window é a proporção da câmera. Com isso, vamos criar uma câmera que tem uma visão cônica, igual a visão de uma câmera normal. Além disso, temos um renderizador que vai ser responsável por transformar isso em algo a ser enxergado. Por fim vamos adicionar ele dentro do body.\n\nAo rodar, temos uma tela preta, que é nossa scene. Agora vamos começar a adicionar alguns objetos:",
      "keywords": [
        "three",
        "const",
        "window",
        "script",
        "scene",
        "renderer",
        "body",
        "vamos",
        "isso",
        "html"
      ],
      "metadata": {
        "title": "Hands-on - Three.JS",
        "date": "2017-11-16",
        "tags": "['Javascript']",
        "thumbnail": "ThreeJS.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/hands-on-threejs/index.md"
      }
    },
    {
      "id": "fed86a6a73d33f13",
      "url": "https://devpleno.com/confira-4-dicas-de-ux-para-programadores",
      "title": "Confira 4 dicas de UX para programadores - DevPleno (Part 4)",
      "content": "Além disso, busque feedbacks constantes com essas áreas que fazem contato direto com o consumidor, para direcionar e aprimorar suas demandas, focando em UX. Mantenha o contato com esse novo [network](https://www.devpleno.com/networking?utm_source=blog&#x26;utm_campaign=rc_blogpost).\n\n### 3. Estude o mercado\n\nQuantas vezes você recebeu a tarefa de desenvolver um software e programa e só buscou referências técnicas para criá-lo? Se costuma fazer isso, você não considera a experiência do usuário em seus projetos.\n\nO ideal é que teste alguma solução concorrente ao seu projeto, que seja bem avaliada pelos consumidores, para entender como é sua usabilidade. Faça uma avaliação de como as informações são dispostas, como os elementos interagem, quais funções são essenciais e quais não tão necessárias.\n\nEssa análise, juntamente com as informações do seu usuário, vai te direcionar na criação de uma solução mais otimizada, em função não só de técnica, mas também da experiência que proporcionará.\n\n### 4. Mantenha-se atualizado\n\nAssim como você busca novas informações e [cursos](https://www.devpleno.com/entenda-a-importancia-de-cursos-para-desenvolvedores?utm_source=blog&#x26;utm_campaign=rc_blogpost)sobre linguagens, técnicas e métodos de programação, é preciso também se atualizar sobre as novidades de UX, como conhecimentos que simplificam processos ou podem deixar o seu sistema mais eficiente no front-end.\n\nExistem diversos meios em que você encontra dicas de como se manter atualizado e [aprendendo sempre](https://www.devpleno.com/aprenda-a-aprender?utm_source=blog&#x26;utm_campaign=rc_blogpost).",
      "description": "Você já tentou usar um aplicativo e desistiu porque não conseguia encontrar as informações corretas ou um botão não funcionava por não ser responsivo para ...",
      "keywords": [
        "para",
        "ncia",
        "mais",
        "experi",
        "como",
        "https",
        "produto",
        "dicas",
        "informa",
        "source"
      ],
      "metadata": {
        "chunkIndex": 3,
        "totalChunks": 5,
        "sourcePath": "/confira-4-dicas-de-ux-para-programadores"
      }
    },
    {
      "id": "ff5f374eb352ae0c",
      "url": "https://devpleno.com/blog/22",
      "title": "Blog - Página 22 - DevPleno",
      "content": "## Arquivo de Insights\n\nExplore todos os artigos, tutoriais e reflexões. Filtre por categoria para encontrar exatamente o que você precisa.\n\n[Todos](/blog) [Algoritmos](/tag/algoritmos)[Carreira](/tag/carreira)[Ferramentas](/tag/ferramentas)[Fundamentos](/tag/fundamentos)[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)[ReactJS](/tag/reactjs)\n\n[Javascript 7 de abr. de 2017 High-order Functions](/high-order-functions)\n\n[Carreira 4 de abr. de 2017 Carreira: Tomar decisões](/carreira-tomar-decisoes)\n\n[Javascript 4 de abr. de 2017 Dica: Debounce](/dica-debounce)\n\n[Javascript 4 de abr. de 2017 Dica: Injeção de Dependência no ReactJS](/dica-injecao-de-dependencia-no-reactjs)\n\n[Algoritmos 31 de mar. de 2017 Vídeo sobre Algoritmos: XOR Swap](/algoritmos-xor-swap)\n\n[Javascript 28 de mar. de 2017 Immutability e ImmutableJS](/immutability-e-immutablejs)\n\n[Carreira 27 de mar. de 2017 Carreira: Você é o passageiro da sua Vida?](/carreira-voce-e-o-passageiro-da-sua-vida)\n\n[Algoritmos 27 de mar. de 2017 Dica e Algoritmo: XOR e Odd Occurences in Array](/dica-e-algoritmo-xor-e-odd-occurences-array)\n\n[Javascript 23 de mar. de 2017 Dica: Self-Invoked Function (Self-invoking Function)](/dica-self-invoked-function-self-invoking-function)\n\n[Carreira 22 de mar. de 2017 Carreira: Preciso de investimento para minha ideia?](/carreira-preciso-de-investimento-para-minha-ideia)\n\n[Javascript 22 de mar. de 2017 Dica: Debug de NodeJS no VS Code](/dica-debug-de-nodejs-no-vs-code)\n\n[Carreira 22 de mar. de 2017 Você precisa ter DOM para ser um bom profissional?](/voce-precisa-ter-dom-para-ser-um-bom-profissional)\n\n[Anterior](/blog/21)22 / 26[Próxima](/blog/23)",
      "description": "Artigos sobre desenvolvimento, carreira e tecnologia.",
      "keywords": [
        "2017",
        "carreira",
        "dica",
        "javascript",
        "algoritmos",
        "para",
        "nodejs",
        "reactjs",
        "self",
        "function"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/blog/22"
      }
    },
    {
      "id": "ff6f041085816864",
      "url": "https://devpleno.com/blog/hands-creat-react-app/index",
      "title": "Hands-on: Creat-React-App",
      "content": "Neste Hands-on, testo um pacote para React, o Create-React-App.\n\nConfira:\n\n<div className=\"embed-responsive embed-responsive-16by9\">\n  <iframe className=\"embed-responsive-item\" src=\"https://www.youtube.com/embed/jNJmp7iic8c\" allowfullscreen></iframe>\n</div>\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), se inscreva no [canal no YouTube](https://www.youtube.com/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!",
      "keywords": [
        "embed",
        "responsive",
        "https",
        "youtube",
        "para",
        "react",
        "classname",
        "iframe",
        "devpleno",
        "facebook"
      ],
      "metadata": {
        "title": "Hands-on: Creat-React-App",
        "date": "2017-03-09",
        "tags": "['Javascript', 'ReactJS']",
        "thumbnail": "CreateReactApp.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "blog/hands-creat-react-app/index.md"
      }
    },
    {
      "id": "ff9d1d92bedabfeb",
      "url": "https://devpleno.com/blog/request-promise/index",
      "title": "Hands-on: Request-promise (Part 1)",
      "content": "Este hands-on vai ser complementar a outro módulo que eu já mostrei por aqui, o Request. O módulo de hoje é o Request-Promise, que é basicamente o Resquest 'Promisificado', então ele retorna uma Promise e assim fica muito mais fácil de fazer tratamentos de várias requisições HTTP, porque podemos utilizar, por exemplo, tanto o Generator com o Wild ou dentro do Async/await, que é uma maneira mais moderna de se fazer.\n\nEntão vamos colocar a mão na massa. Primeiro vou instalar as duas dependências que precisamos. Uma coisa importante: o Request promise depende do Request, então temos que adicionar os dois:\n\n```jsx\nyarn request\n\nyarn request promise\n```\n\nEm seguida, basta simplesmente importar ele. A assinatura é exatamente a mesma do Request, então eu posso simplesmente trocar para o Request-Promise:\n\n```jsx\nconst request = require('request-promise')\nrequest('https://httpbin.org/ip').then((res) => console.log(res))\n```\n\nEntão a versão com promise eu não tenho um callback, e sim um then com catch para tratar. Ao rodar, perceba que ele vai bater no servidor e retornar o IP.\n\nOutra vantagem que temos é que podemos fazer o seguinte:\n\n```jsx\nconst pegarIp = async () => {\n  const ip = await request('https://httpbin.org/ip')\n  console.log(ip)\n}\npegarIp()\n```\n\nPerceba que o código ficou muito mais simples, conseguimos fazer a mesma operação, porém trocando a Promise por Async/await. Outra coisa que poderíamos fazer é pegar esse IP e enviar de volta:\n\n```jsx\nconst pegarIp = async () => {\n  const ip = await request('https://httpbin.org/ip')\n  const ipPost = await request({\n    method: 'POST',\n    json: ip,\n    uri: 'https://httpbin.org/post'\n  })\n  console.log(ipPost)\n}\npegarIp()\n```\n\nEle já vai mostrar o data como o IP que eu recebi.",
      "keywords": [
        "request",
        "promise",
        "await",
        "https",
        "fazer",
        "async",
        "const",
        "podemos",
        "httpbin",
        "pegarip"
      ],
      "metadata": {
        "title": "Hands-on: Request-promise",
        "date": "2017-08-17",
        "tags": "['Javascript']",
        "thumbnail": "RequestPromisse.png",
        "author": "Tulio Faria",
        "chunkIndex": 0,
        "totalChunks": 2,
        "sourcePath": "blog/request-promise/index.md"
      }
    },
    {
      "id": "ffbf580f85298a6e",
      "url": "https://devpleno.com/devreactjs-3",
      "title": "Redirecting to: https://lp.devpleno.com/devreactjs/",
      "content": "Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /devreactjs-3 to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)",
      "keywords": [
        "devreactjs",
        "https",
        "devpleno",
        "redirecting",
        "from"
      ],
      "metadata": {
        "chunkIndex": 0,
        "totalChunks": 1,
        "sourcePath": "/devreactjs-3"
      }
    },
    {
      "id": "ffd123d6c869a55e",
      "url": "https://devpleno.com/template-strings",
      "title": "ES6 - Template Strings - DevPleno (Part 2)",
      "content": "function tag(strings, ...values) {\nconsole.log(strings, values)\nreturn 'opa'\n}\nconst str = tag`Olá \\$ {10} mundo!`\nPerceba que a strings vai ter olá e mundo e o value terá o 10. Ele está entre as strings, por isso o nome interpolação. Com isso podemos criar uma tag em HTML sem grandes problemas. Uma última coisa que conseguimos fazer é checar o valor raw das variáveis apenas adicionando:\n\nconsole.log(strings.raw[0])\nEstamos pegando o raw da posição zero neste exemplo. Quando colocamos o raw, ele mostra exatamente como foi definido, então se você colocar um \\n, será mostrado realmente o raw disso, o \\n.\n\nConfira o vídeo:\n\nCurta o [DevPleno no Facebook](https://www.facebook.com/devpleno), [inscreva-se no canal](https://www.youtube.com/devplenocom) e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!\n\n#### Gostou do conteúdo?\n\nCompartilhe este artigo com outros devs.\n\n[](https://twitter.com/intent/tweet?text=ES6%20-%20Template%20Strings&url=https%3A%2F%2Fdevpleno.com%2Ftemplate-strings) [](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftemplate-strings)",
      "description": "Como já citei em outros posts, (como em: ES6 Spread Operator, Async/await, Destructuring Assignment) o ES6 apresenta algumas novidades, uma delas é o Templ...",
      "keywords": [
        "strings",
        "https",
        "string",
        "const",
        "console",
        "template",
        "devpleno",
        "isso",
        "javascript",
        "podemos"
      ],
      "metadata": {
        "chunkIndex": 1,
        "totalChunks": 2,
        "sourcePath": "/template-strings"
      }
    }
  ],
  "metadata": {
    "totalEntries": 1418,
    "generator": "aeo.js",
    "generatorUrl": "https://aeojs.org",
    "embedding": {
      "recommended": "text-embedding-ada-002",
      "dimensions": 1536
    }
  }
}