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...
Dica: Debug NodeJS com Chrome DevTools - DevPleno
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:
node -- inspect server.js
Perceba que ele mostra um link:
Esse 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:
Agora eu quero que ele pare a execução quando passar no primeiro console.log:
É 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.
Agora 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:
Eu posso pedir para ele ir para a próxima linha ou mandar continuar o script utilizando os botões:
, [inscrever-se no canal](https://www.youtube.com/devplenocom) e cadastrar seu e-mail para não perder nenhuma atualização.
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-debug-nodejs-com-chrome-devtools) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Dica e Algoritmo: XOR e Odd Occurences in Array - DevPleno
URL: https://devpleno.com/dica-e-algoritmo-xor-e-odd-occurences-array
> 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...
Dica e Algoritmo: XOR e Odd Occurences in Array - DevPleno
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ã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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Algoritmos](/tag/algoritmos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-e-algoritmo-xor-e-odd-occurences-array) Copiar link
Continue lendo
## Insights relacionados
[Algoritmos · 16 de nov. de 2017 code fights - Metro Card](/code-fights-metro-card)
[Algoritmos · 13 de nov. de 2017 Resolvendo Expressão Aritmética do CodeFights](/expressao-aritmetica-codefights)
[Algoritmos · 29 de ago. de 2017 Busca Binária](/busca-binaria)
---
# Dica: ES6 - Destructuring Assignament - DevPleno
URL: https://devpleno.com/dica-es6-destructuring-assignament
> 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...
Dica: ES6 - Destructuring Assignament - DevPleno
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!
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Dica%3A%20ES6%20-%20Destructuring%20Assignament&url=https%3A%2F%2Fdevpleno.com%2Fdica-es6-destructuring-assignament) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-es6-destructuring-assignament) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Redirecting to: /find
URL: https://devpleno.com/dica-find
Redirecting to: /find [Redirecting from /dica-find to /find](/find)
---
# Dica: Injeção de dependência com Destructuring Assignament - DevPleno
URL: https://devpleno.com/dica-injecao-de-dependencia-com-destructuring-assignament
> 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...
Dica: Injeção de dependência com Destructuring Assignament - DevPleno
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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-injecao-de-dependencia-com-destructuring-assignament) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)
[Javascript · 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)
[Javascript · 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)
---
# Dica: Injeção de Dependência no ReactJS - DevPleno
URL: https://devpleno.com/dica-injecao-de-dependencia-no-reactjs
> 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 ...
Dica: Injeção de Dependência no ReactJS - DevPleno
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
Veja 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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[ReactJS](/tag/reactjs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-injecao-de-dependencia-no-reactjs) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Redirecting to: /map
URL: https://devpleno.com/dica-map
Redirecting to: /map [Redirecting from /dica-map to /map](/map)
---
# Dica: Once n vezes - DevPleno
URL: https://devpleno.com/dica-n-vezes
> 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...
Dica: Once n vezes - DevPleno
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.
Dependendo da regra de negócio, poderia ser utilizado para permitir que uma ação seja executada apenas x vezes.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Dica%3A%20Once%20n%20vezes&url=https%3A%2F%2Fdevpleno.com%2Fdica-n-vezes) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-n-vezes) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Dica: Self-Invoked Function (Self-invoking Function) - DevPleno
URL: https://devpleno.com/dica-self-invoked-function-self-invoking-function
> Selfinvoked Functions é uma técnica bastante interessante no Javascript, e pode resolver alguns problemas de conflito de contexto (que já estão sendo reduz...
Dica: Self-Invoked Function (Self-invoking Function) - DevPleno
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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdica-self-invoked-function-self-invoking-function) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# 3 dicas para NPM + 1 dica extra - DevPleno
URL: https://devpleno.com/dicas-paranpm
> 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...
3 dicas para NPM + 1 dica extra - DevPleno
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:
#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:
npm install express@4.0.0
Uma 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 @.
#2 – Você pode usar repo (repositório) para acessar o repositório do módulo e procurar as issues dele.
npm repo express
#3 – Você também pode usar home para ir direto ao site do módulo.
npm home express
Obviamente ele está utilizando informações do próprio NPM, ou seja, se a informação não existir nele, não é possível recuperar.
Extra – NPM Outdated
O 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.
Ele 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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=3%20dicas%20para%20NPM%20%2B%201%20dica%20extra&url=https%3A%2F%2Fdevpleno.com%2Fdicas-paranpm) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdicas-paranpm) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Você precisar ter DOM para ser um bom profissional? - DevPleno
URL: https://devpleno.com/dom
> 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...
Você precisar ter DOM para ser um bom profissional? - DevPleno **
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 tecnologias”. As pessoas se escondem atrás desse “dom”, mas o que é o dom?
Na 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.
O 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.
Eu 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.”
Programaçã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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdom) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Dotenv e variáveis de ambiente no NodeJS - DevPleno
URL: https://devpleno.com/dotenv-e-variaveis-de-ambiente
> 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ã...
Dotenv e variáveis de ambiente no NodeJS - DevPleno
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?
console.log(process.env.NODE_ENV)
Ao rodar, perceba que vai dar undefined, porém se fizermos:
NODE_ENV=production node test.js
vamos 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:
yarn add dotenv
Já no nosso script, vamos fazer o seguinte:
require('dotenv').config()
Assim 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:
NODE_ENV = tulio
Ao 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:
require('dotenv').config()
if (process.env.NODE_ENV !== 'production') {
console.log('Desenvolvimento')
} else {
console.log('Produção')
}
// Retorno: Desenvolvimento
Quando 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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fdotenv-e-variaveis-de-ambiente) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Redirecting to: /
URL: https://devpleno.com/empreendedorismo
Redirecting to: / [Redirecting from /empreendedorismo to /](/)
---
# 3 dicas para começar a empreender na área de software - DevPleno
URL: https://devpleno.com/empreender-na-area-de-software
> 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...
3 dicas para começar a empreender na área de software - DevPleno **
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.
Dica #1 – Comece simples**
Nã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.
**Dica #2 – Tenha um portfólio**
Se 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.
**Dica #3 – Aprenda a vender**
Se 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.
Na 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.
**Dica #4 (bônus) – Negociar é deixar as duas partes alinhadas**
Negociaçã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.
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.
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://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fempreender-na-area-de-software) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Ensinar algo a alguém todos os dias - DevPleno
URL: https://devpleno.com/ensinar-algo
> 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...
Ensinar algo a alguém todos os dias - DevPleno
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”.
A 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”.
Quando 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.
O 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.
A 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.
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
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Ensinar%20algo%20a%20algu%C3%A9m%20todos%20os%20dias&url=https%3A%2F%2Fdevpleno.com%2Fensinar-algo) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fensinar-algo) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Ensino Formal ou Cursos Livres - Por qual optar? - DevPleno
URL: https://devpleno.com/ensino-formal-ou-cursos-livres
> 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...
Ensino Formal ou Cursos Livres - Por qual optar? - DevPleno
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)?
Hoje 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.
O 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.
Depende 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.
É 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.
Portanto, a dica é analisar o custo-benefício. O que você precisa no momento? Qual o seu objetivo para o futuro?
Confira o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fensino-formal-ou-cursos-livres) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Entenda a importância de cursos para desenvolvedores - DevPleno
URL: https://devpleno.com/entenda-a-importancia-de-cursos-para-desenvolvedores
> 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...
Entenda a importância de cursos para desenvolvedores - DevPleno
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.
Descubra as principais vantagens de investir em sua capacitação nesta área!
## Empregabilidade
Empregabilidade é 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).
Já pensou poder contribuir com o próximo UBER, Airbnb, Netflix ou Angry Birds?
## Oportunidades
Essa é 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.
## Crescimento
Você é “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.
## Networking
É 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.
Ao 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.
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.
O [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.
## Credibilidade
Ter 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.
## Planejamento
É 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.
## Melhores cursos para desenvolvedores
Existem 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.
Alé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.
Veja algumas tendências atuais de desenvolvimento e programação:
### ReactJS
ReactJS é 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.
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.
A 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.
### Firebase
Por 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.
Com 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.
### Integração contínua
Os 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.
Nesse 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.
### Continous-deployment
Seguranç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.
### Redux
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.
Cada capacitação é como evoluir um nível e pode lhe deixar mais perto do seu sonho.
O 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).
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fentenda-a-importancia-de-cursos-para-desenvolvedores) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Entenda sobre CORS - Cross Origin Resource Sharing - DevPleno
URL: https://devpleno.com/entenda-sobre-cors-cross-origin-resource-sharing
> 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...
Entenda sobre CORS - Cross Origin Resource Sharing - DevPleno
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 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.
Imagine 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.
Algumas 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.
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.
É 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.
Algumas 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fentenda-sobre-cors-cross-origin-resource-sharing) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# DevPleno Entrevista - Carlos Drury e Thiago Coelho - DevPleno
URL: https://devpleno.com/entrevista-carlos-drury-e-thiago-coelho
> 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, ...
DevPleno Entrevista - Carlos Drury e Thiago Coelho - DevPleno **
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í.
O Carlos é desenvolvedor JavaScript e atualmente trabalha no INATEL, em um projeto da Ericsson, uma das empresas que o INATEL presta serviço.
O 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.
O 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.
O que é o GDG (Grupo de Desenvolvedores Google) em si de maneira geral?
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.”
Existem 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?
**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.”
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?
**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.”
**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.”
Para 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fentrevista-carlos-drury-e-thiago-coelho) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# DevPleno Entrevista - Edy Segura - DevPleno
URL: https://devpleno.com/entrevista-com-edy-segura
> 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...
DevPleno Entrevista - Edy Segura - DevPleno
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.
Uma 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?
“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.”
Uma 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.
“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.”
Há 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?
“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.”
Eu 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?
“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.”
E sobre tecnologia, o que você acha que o pessoal deveria estar antenado para 2017?
“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.”
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=DevPleno%20Entrevista%20-%20Edy%20Segura&url=https%3A%2F%2Fdevpleno.com%2Fentrevista-com-edy-segura) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fentrevista-com-edy-segura) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Javascript - ES6 Default Parameters - DevPleno
URL: https://devpleno.com/es6-default-parameters
> 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...
Javascript - ES6 Default Parameters - DevPleno ** *
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.
O que é um parâmetro padrão?
Vamos supor que temos uma função aplicarImposto, um valor e o quanto de imposto que queremos aplicar para esse valor:
function aplicarImposto(valor, imposto) {
return valor + valor * imposto
}
console.log(aplicarImposto(100, 0.1))
Entã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:
function aplicarImposto(valor, imposto) {
console.log(imposto)
return valor + valor * imposto
}
console.log(aplicarImposto(100, 0.1))
console.log(aplicarImposto(200))
Ao 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:
function aplicarImposto(valor, imposto) {
Imposto = imposto || 0.07
return valor + valor * imposto
}
console.log(aplicarImposto(100, 0.1))
console.log(aplicarImposto(200))
Se 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):*
console.log(aplicarImposto(100, 0.1))
console.log(aplicarImposto(200))
console.log(aplicarImposto(300, 0))
Repare 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:
Imposto = typeof imposto === 'undefined' ? 0.07 : imposto
Ainda podemos fazer de uma outra forma, com o ES6:
function aplicarImpostES6(valor, imposto = 0.07) {
return valor + valor * imposto
}
console.log(aplicarImpostoES6(100, 0.1))
console.log(aplicarImpostoES6(200))
console.log(aplicarImpostoES6(300, 0))
Com 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:
function aplicarImpostES6(
valor,
imposto = 0.07,
adicional = valor * (imposto + 0.1)
) {
return valor + valor * imposto + adicional
}
console.log(aplicarImpostoES6(100, 0.1, 0))
console.log(aplicarImpostoES6(200))
console.log(aplicarImpostoES6(300, 0, 0))
No 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.
Confira o video:
Deixe 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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Javascript%20-%20ES6%20Default%20Parameters&url=https%3A%2F%2Fdevpleno.com%2Fes6-default-parameters) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fes6-default-parameters) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
[Javascript · 05 de out. de 2017 Dicas utilizando o Split em Strings](/split-em-strings)
---
# ES7 Array Includes - DevPleno
URL: https://devpleno.com/es7-array-includes
> 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...
ES7 Array Includes - DevPleno
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:
const nums = [1, 2, 3, 4]
Se quiséssemos checar se um valor está ou não dentro desse vetor, faríamos normalmente, checaríamos se o índice não é -1:
console.log(nums.indexOf(4) != -1)
Com 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:
console.log(nums.includes(NaN))
Com 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.
Confira o video:
Deixe 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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=ES7%20Array%20Includes&url=https%3A%2F%2Fdevpleno.com%2Fes7-array-includes) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fes7-array-includes) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 05 de out. de 2017 Dicas utilizando o Split em Strings](/split-em-strings)
---
# Escopos e Closures - NodeJS Primeiros Passos - DevPleno
URL: https://devpleno.com/escopos-e-closures
> Entender Escopos e Closures do JavaScript é muito importante para conseguir avançar no NodeJS. Primeiramente tenho um diretório criado com nossos exemplos....
Escopos e Closures - NodeJS Primeiros Passos - DevPleno **
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:
var a = 10
console.log(a)
ou simplesmente:
a = 10
console.log(a)
Perceba 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.
var a = 10
function inc() {
a++
}
inc()
console.log(a)
Esse 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.
var a = 10
function inc() {
a++
b = 11
}
inc()
console.log(a, b)
Se 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.
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.
**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:
function inc() {
a++
var b = 11
}
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.
;(function () {
var a,
b = 1
console.log(1)
})()
Perceba que existe um abrir e fechar parênteses no fim, assim, estamos ‘chamando’ a função. Sem isso, nada acontece.
**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:
;(function () {
var a = 10
function inc() {
a++
}
inc()
console.log(a)
})()
Assim 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.
var conta = (function() {
var contador = 0;
return function(){
contador++; console.log(contador);
}
}();
conta();
conta();
conta();
Pegamos essa função e jogamos dentro de uma variável.
**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:
var conta = (function() {
var contador = 0;
return {
contar = function(){
contador++;
},
out: function(){
console.log(contador);
}
}
}();
conta.contar();
conta.out();
conta.contar();
conta.out();
Complicando 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.
Podemos 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:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Escopos%20e%20Closures%20-%20NodeJS%20Primeiros%20Passos&url=https%3A%2F%2Fdevpleno.com%2Fescopos-e-closures) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fescopos-e-closures) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)
[Javascript · 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)
[Javascript · 04 de mai. de 2017 Promisify-Node: Convertendo funções clássicas do Node em Promises](/promisify-node)
---
# Estudar 1 hora por dia ou 8 horas no sábado? - DevPleno
URL: https://devpleno.com/estudar-1-hora-por-dia-ou-8-horas-no-sabado
> Descubra a melhor rotina de estudos para programadores: consistência diária ou maratonas no fim de semana? Dicas para organizar seus estudos.
Estudar 1 hora por dia ou 8 horas no sábado? - DevPleno
O que é melhor, estudar 1 hora por dia ou 8 horas no fim de semana?
Primeiro 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.
Eu 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.
No 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.
É 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.
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.
É 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.
Por 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.
Poré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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Festudar-1-hora-por-dia-ou-8-horas-no-sabado) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Eu já sei! Evite uma mentalidade que não te deixa evoluir - DevPleno
URL: https://devpleno.com/eu-ja-sei-carreira
> Evite uma mentalidade que não te deixa evoluir e aprender sempre. Confira o video:
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 é....
Evite o this em JavaScript - DevPleno **
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.
Qual o problema disso?** Se eu estou utilizando o ‘this’, naturalmente esse método já não é mais puro.
**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.
const Node = (props) => {
return (
<span>
{props.node.l && props.node.r && <span>(</span>}
{props.node.l && <Node node={props.node.l} />}
{props.node.v}
{props.node.l && props.node.r && <span>)</span>}
</span>
)
}
Com 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’.
Uma 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.
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.
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Evite%20o%20this%20em%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Fevite-o-this-em-js) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fevite-o-this-em-js) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Gere seu projeto em Express - Hands-on: Express-Generator - DevPleno
URL: https://devpleno.com/express-generator
> Neste handson, vamos falar sobre o ExpressGenerator, um gerador de projetos em expressJS. Com ele conseguimos criar a base da nossa aplicação. Primeirament...
Gere seu projeto em Express - Hands-on: Express-Generator - DevPleno
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:
npm install -g express-generator
Lembrando 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.
É 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:
dica-express --ejs --git --css sass
E em seguida, para instalar as dependencias, vou digitar:
yarn
Feito 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:
É 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.
Qual 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.
No 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
var sassMiddleware = require(‘node-sass-middleware’);
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:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fexpress-generator) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Resolvendo Expressão Aritmética do CodeFights - DevPleno
URL: https://devpleno.com/expressao-aritmetica-codefights
> 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 ...
Resolvendo Expressão Aritmética do CodeFights - DevPleno
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:
function arithmeticExpression(a, b, c) {
const ops = ['+','-','/','*']]
const op = (a, b, o) => {
if(o === '+'){
return a+b
} else if(o === '-') {
return a-b
} else if(o === '/'){
return a/b
}
return a*b
}
return ops
.map(o =>(a, b, o)===c)
.filter(o => o)
.length > 0
}
console.log('2,3,5 = ',arithmeticExpression(2,3,5))
Eu 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.
Feito 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.
També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:
function arithmeticExpression(a, b, c) {
const ops = ['+','-','/','*']]
const op = (a, b, o) => eval(`a ${o} b`)
return ops
.map(o =>(a, b, o)===c)
.filter(o => o)
.length > 0
}
console.log('2,3,5 = ',arithmeticExpression(2,3,5))
Esse 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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Algoritmos](/tag/algoritmos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Resolvendo%20Express%C3%A3o%20Aritm%C3%A9tica%20do%20CodeFights&url=https%3A%2F%2Fdevpleno.com%2Fexpressao-aritmetica-codefights) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fexpressao-aritmetica-codefights) Copiar link
Continue lendo
## Insights relacionados
[Algoritmos · 16 de nov. de 2017 code fights - Metro Card](/code-fights-metro-card)
[Algoritmos · 29 de ago. de 2017 Busca Binária](/busca-binaria)
[Algoritmos · 04 de ago. de 2017 Algoritmos: XOR Swap](/algoritmos-xoe-swap)
---
# 3 Padrões para Iniciar com Expressões Regulares (RegExp) - DevPleno
URL: https://devpleno.com/expressoes-regulares
> 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...
3 Padrões para Iniciar com Expressões Regulares (RegExp) - DevPleno
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.
Agora 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:
const str1 = 'Olá DevPleno'
const pattern1 = new RegExp('^Ol')
console.log(pattern1.test(str1))
Toda 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:
const pattern2 = new RegExp('DevPleno$')
console.log(pattern2.test(str1))
Assim 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 $.
Agora o último padrão. Imagine o seguinte: se quiséssemos encontrar um padrão no meio, utilizando ou um ou outro:
const str1 = 'Olá oi DevPleno'
const pattern3 = new RegExp('Olá (oi|tchau) DevPleno')
console.log(
'====' ,
pattern3.test('Olá Mundo')
pattern3.test('Olá oi DevPleno')
pattern3.test('Olá tchau DevPleno')
pattern3.test('Olá opa DevPleno')
)
Perceba 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”.
Isso é algo muito poderoso. Essas são dicas para dar os primeiros passos se você nunca ouviu falar de expressão regular.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fexpressoes-regulares) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Factory Function em JavaScript - DevPleno
URL: https://devpleno.com/factory-function
> Aprenda como usar Factory Functions em JavaScript para criar objetos sem classes. Exemplos práticos com closures e estado privado.
Factory Function em JavaScript - DevPleno
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:
function personFactory(name) {
return {
name: name,
type: 'person'
}
}
console.log(personFactory('Tulio'))
console.log(personFactory('João'))
Quando 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..
function personFactory(name) {
let count = 0
return {
count () => count++,
name: name,
type: 'person'
}
}
const tulio = personFactory('Tulio')
const joao = personFactory('João')
console.log(tulio)
console.log(joao)
O 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:
const tulio = personFactory('Tulio')
const joao = personFactory('João')
console.log(tulio.count())
console.log(tulio.count())
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:
function personFactory(name) {
let count = 0
return {
opa () => count++,
name: name,
type: 'person'
}
}
const tulio = personFactory('Tulio')
const joao = personFactory('João')
console.log(tulio.opa())
console.log(tulio.opa())
Continua 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.
Quando 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.
O 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Factory%20Function%20em%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Ffactory-function) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffactory-function) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Fake API - Como testar seus projetos front-end - DevPleno
URL: https://devpleno.com/fake-api
> 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, ...
Fake API - Como testar seus projetos front-end - DevPleno
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ó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.
Eu 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:
<html>
<body>
<h1> testing API</h1>
<pre id='contents'></pre>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>
<script>
$(function()
{$.get('https://jsonplaceholder.typicode.com/posts', function (data) {
$('#contents').html(JSON.stringfy(data))
})})
</script>
</body>
</html>
Com 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:
<html>
<body>
<h1> testing API</h1>
<div id='contents'></div>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>
<script>
$(function()
{$.get('https://jsonplaceholder.typicode.com/posts', function (data) {
data.forEach(function (post) {
$('#contents').append('<h1>' + post.title + '</h1>')
})
})})
</script>
</body>
</html>
Lembrando 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:
$('#contents').append('<h2>' + post.title + '</h2>')
$('#contents').append('<div>' + post.body + '</div>')
Por 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Fake%20API%20-%20Como%20testar%20seus%20projetos%20front-end&url=https%3A%2F%2Fdevpleno.com%2Ffake-api) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffake-api) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS - DevPleno
URL: https://devpleno.com/falsy-e-truthy-values
> 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...
Falsy e Truthy Values - Valores considerados verdadeiro e falso em JS - DevPleno
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/).
Eu 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:
let a = null
let b = a || 'teste'
Quando 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.
Existe 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.
Em contrapartida, temos tudo que não são valores passados anteriormente, nesse caso seria retornado o valor ‘true’, por exemplo:
let c = true
Outros 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:
{
comments && comments.map()
}
Vai 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:
console.log(42 == true)
Irá retornar False, mas se fizermos isso:
console.log(!!42 == true)
Estamos 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffalsy-e-truthy-values) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Falta de apoio - DevPleno
URL: https://devpleno.com/falta-de-apoio
> 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...
Falta de apoio - DevPleno
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
Imagine 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?
A 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.
Tirando 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.
Quando 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.
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Falta%20de%20apoio&url=https%3A%2F%2Fdevpleno.com%2Ffalta-de-apoio) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffalta-de-apoio) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Falta tempo para realizar aquele projeto? - DevPleno
URL: https://devpleno.com/falta-de-tempo
> 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 ...
Falta tempo para realizar aquele projeto? - DevPleno
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”…?
Se 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”.
A 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.
Se 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?
É 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.
É 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.
Essa é 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.
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Falta%20tempo%20para%20realizar%20aquele%20projeto%3F&url=https%3A%2F%2Fdevpleno.com%2Ffalta-de-tempo) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffalta-de-tempo) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Férias e feriados trabalhando por meio da toptal - DevPleno
URL: https://devpleno.com/ferias-e-feriados-trabalhando-por-meio-da-toptal
> 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:
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...
Hands-on: Ferramentas visuais para Flexbox - DevPleno
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Ferramentas%20visuais%20para%20Flexbox&url=https%3A%2F%2Fdevpleno.com%2Fferramentas-par-layouts-com-flexbox) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fferramentas-par-layouts-com-flexbox) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Ferramentas Visuais para Flexbox - DevPleno
URL: https://devpleno.com/ferramentas-visuais-para-flexbox
> 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 (...
Ferramentas Visuais para Flexbox - DevPleno **
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.
Por que ele foi criado?**
O 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.
**Apresentando as Ferramentas**
Temos 3 ferramentas, que eu particularmente uso bastante, e com elas fica bem fácil criar um layout. O primeiro é o **Flexys-boxes.**
[https://the-echoplex.net/flexyboxes/](https://the-echoplex.net/flexyboxes/)
Podemos 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.
Dentro 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.
Isso é 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**.
[https://loading.io/flexbox/](https://loading.io/flexbox/)
Nele, já temos um preview de alguns tipos de item, como imagens, blocos ou textos dentro do content in item.
També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.
E a terceira e ultima ferramenta é o visual **Guide to CSS3 flexbox.**
[https://demos.scotch.io/visual-guide-to-css3-flexb](https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/)
[ox-flexbox-playground/demos/](https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/)
Nele, podemos mudar a largura de todos os Box, e também modificar dentro de cada Box, mais ou menos como nas outras duas ferramentas.
Confira mais detalhes no vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Ferramentas%20Visuais%20para%20Flexbox&url=https%3A%2F%2Fdevpleno.com%2Fferramentas-visuais-para-flexbox) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fferramentas-visuais-para-flexbox) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Fetch - Uma nova forma de fazer requisições HTTP - DevPleno
URL: https://devpleno.com/fetch-hands-on
> 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...
Fetch - Uma nova forma de fazer requisições HTTP - DevPleno
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.
A primeira coisa que vou fazer é adicionar como dependência no meu projeto:
yarn add node-fetch
Agora precisamos importá-lo. A primeira coisa muito interessante no fetch é que ele retorna promises, com isso fica muito mais simples de trabalharmos:
const fetch = require('node-fetch')
const url = 'http//httpbin.org.get'
fetch(url).then((res)=>{
console.log(res)
}
Perceba 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:
fetch(url)
.then((res) => res.json())
.then((json) => console.log(json))
Ele vai dar o retorno do nosso httpbin, vamos passar algum parâmetro para saber se está alterando mesmo:
const url = 'http//httpbin.org.get?t=1'
Perceba 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:
const urlPost = 'http//httpbin.org/post'
fetch(urlPost, { method: 'Post', body: 'tulio=faria' })
.then((res) => res.json())
.then((json) => console.log(json))
A ú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:
.catch((e)=>console.log(e))
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.
Eu 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
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffetch-hands-on) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# High-order Function Filter - DevPleno
URL: https://devpleno.com/filter
> 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...
High-order Function Filter - DevPleno
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.
Vamos 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:
const carrinho = [{ id: 1, preco: 2, qtd: 2, estoque: 10 },
{ id: 1, preco: 3, qtd: 1, estoque: 0 }]
const subtotal = (item) => item.preco * item.qtd
const total = carrinho
.map(subtotal)
.reduce((soma, subtotal) => subtotal + soma, 0)
const semEstoque = carrinho.filter((item) => item.estoque < item.qtd)
console.log(semEstoque)
Assim 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:
const total = carrinho
.filter((item) => item.estoque >= item.qtd)
.map(subtotal)
.reduce((soma, subtotal) => subtotal + soma, 0)
const semEstoque = carrinho.filter((item) => item.estoque < item.qtd)
console.log(total)
Perceba 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.
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:
const filtroEmEstoque = (item) => item.estoque < item.qtd
const total = carrinho
.filter(filtroEmEstoque)
.map(subtotal)
.reduce((soma, subtotal) => subtotal + soma, 0)
const semEstoque = carrinho.filter((item) => item.estoque < item.qtd)
console.log(total)
A 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=High-order%20Function%20Filter&url=https%3A%2F%2Fdevpleno.com%2Ffilter) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffilter) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# High-order Function Find - DevPleno
URL: https://devpleno.com/find
> 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 ...
High-order Function Find - DevPleno
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:
const carrinho = [{ id: 1, preco: 2, qtd: 2, estoque: 10 },
{ id: 1, preco: 3, qtd: 5, estoque: 2 }]
const subtotal = (item) => item.preço * item.qtd
const filtroEmEstoque = (item) => item.estoque * item.qtd
const soma = (soma, subtotal) => subtotal + soma
const total = carrinho.filter(filtroEmEstoque).map(subtotal).reduce(soma, 0)
const produtoId1 = (item) => item.id === 1
const produtoId1Retorno = carrinho.find(produtoId1)
console.log(produtoId1Retorno)
Perceba 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:
const idEquals = (id, item) => item.id === id
const idEquals1 = carrinho.find(produtoId1)
console.log(produtoId1Retorno)
Perceba 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.
const idEquals = (id, item) => item.id === id
const idEquals1 = idEquals.bind(null, 1)
const idEquals1 = carrinho.find(produtoId1)
console.log(produtoId1Retorno)
Essa nova função que eu criei sempre terá um do ID fixo, então quando eu fizer:
console.log(carrinho.find(idEquals1)
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.
Podemos 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=High-order%20Function%20Find&url=https%3A%2F%2Fdevpleno.com%2Ffind) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffind) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Float e precisão - DevPleno
URL: https://devpleno.com/float-e-precisao
> Hoje quero dar uma dica e também mostrar um problema que acontece em várias linguagens que é quanto à precisão de número
Float e precisão - DevPleno
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.
Me 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.
Primeiramente 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:
const num1 = 0.1
const num2 = 0.2
const num3 = num1 + num2
Ao 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.
Qual 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
const precisao = 100
const num1 = parseInt(0.1 * precisao)
const num2 = parseInt(0.2 * precisao)
A 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:
const num3 = ((num1 + num2) / precisao).toFixed(2)
Obviamente, 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.
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.
Se você passar por esse problema, agora já sabe como resolver. :)
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Float%20e%20precis%C3%A3o&url=https%3A%2F%2Fdevpleno.com%2Ffloat-e-precisao) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffloat-e-precisao) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Formas de trabalho na Toptal - DevPleno
URL: https://devpleno.com/formas-de-trabalho-por-meio-da-toptal
> Você sabe quais as formas de trabalho quando se atua por meio da Toptal? Confira neste vídeo:
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...
Formatos de troca de dados em Aplicações Web - DevPleno ** *
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.
Quando 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:
{
'name' = 'tulio'
}
No 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:
<user>
<name>tulio</name>
</user>
(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:
?name = tulio
Se colocarmos mais dados:
?name = Tulio & lastName = Faria.
Outra forma é o mult-part form data, que diz mais ou menos assim:
field = name value
No header ele envia um separador outro camp = valor outro separador. Quando ele faz este multiform data, conseguimos mandar grandes quantidades de informação.
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fformatos-de-troca-de-dados) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Vídeo sobre Formatos de troca de dados em Aplicações Web - DevPleno
URL: https://devpleno.com/formatos-de-troca-de-dados-em-aplicacoes-web
> 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:
O trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho. No entanto, a maiori...
- Freelancer no exterior: 7 dicas para ter sucesso na carreira - DevPleno **
O trabalho de freelancer no exterior configura uma grande oportunidade para muitos profissionais que aderem a esse regime de trabalho.
No entanto, a maioria das pessoas têm pouco conhecimento sobre a preparação que envolve essa empreitada fora do Brasil.
Quer saber tudo sobre trabalho de freelancer no exterior? Acompanhe, nesse post, 7 dicas fundamentais que preparamos para você!
## 1. Conquiste uma demanda constante de trabalho
Uma 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.
Quando 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.
Alé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.
## 2. Incorpore hábitos de freelancers de excelência
Existem 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.
Quanto a isso, podemos falar de uma “cartilha” de sucesso para pessoas que trabalham em casa:
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.
- **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.
- **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.
Para 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.
Nesse caso, não menospreze a necessidade de impor disciplina à realização das tarefas que você deve desenvolver ao longo do dia.
## 3. Conheça detalhes operacionais do trabalho de freelancer no exterior
Trabalhar 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.
No 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.
No 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.
## 4. Saiba o que evitar no trabalho freelancer
Tanto 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.
Em 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.
## 5. Avalie se o trabalho de freelancer combina com você
Há 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.
Por 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.
A 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.
## 6. Esteja em constante capacitação
Uma 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.
Esse é 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.
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).
## 7. Conheça as especificidades de seu campo de atuação no exterior
Uma 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.
As 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.
Ser 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.
Para 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.
Gostou das nossas dicas sobre ser freelancer no exterior? Siga compartilhando nossos conteúdos nas redes sociais!
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffreelancer-no-exterior-7-dicas-para-ter-sucesso-na-carreira) C
---
# Fs-extra - Filesystem com Promises e mais funcionalidades - DevPleno
URL: https://devpleno.com/fs-extra
> O Fsextra é uma forma de otimizar as funcionalidades do SF normal do node. Primeiramente, temos que executar o comando yarn sfextra. Uma utilidade interess...
Fs-extra - Filesystem com Promises e mais funcionalidades - DevPleno *
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.
fs.outputFile('file.txt', 'olá').then(() => console.log('ok'))
Com 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’.
fs.copy('file.txt', 'file2.txt').then(() => console.log('ok'))
Assim. 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.
Ele 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Fs-extra%20-%20Filesystem%20com%20Promises%20e%20mais%20funcionalidades&url=https%3A%2F%2Fdevpleno.com%2Ffs-extra) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffs-extra) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# FS-Watch - Checando mudanças em um arquivo-diretório - DevPleno
URL: https://devpleno.com/fs-watch
> 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...
FS-Watch - Checando mudanças em um arquivo-diretório - DevPleno
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.
Primeiramente temos uma pasta criada, nele vou criar um arquivo novo chamado fs-watch.js e fazer o seguinte:
const fs = require('fs')
Dentro do próprio FS eu tenho duas possibilidades: o watchFile, onde eu posso checar se um arquivo está sendo alterado:
fs.watchFile('file.txt', (curr, next) => {
console.log(curr, next)
})
Basicamente 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:
fs.watchFile('file.txt', (curr, prev) => {
console.log(curr.size, prev.size)
})
Assim, sempre que mudarmos o número de caracteres do arquivo, ele vai mostrar o quanto nós temos agora e o quanto tinha anteriormente.
Essa é 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.
Outra forma que temos de fazer é utilizando o fs.watch(). Com ele podemos checar um diretório contra mudanças:
fs.watch('./', (changeType, file) => {
console.log('change', changeType, file)
})
Ao fazermos isso, ele vai checar nesse diretório qualquer arquivo que foi alterado, assim temos bastante precisão neste tipo de operação.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffs-watch) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsl
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsl to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: /
URL: https://devpleno.com/fsl-materialdeapoio
Redirecting to: / [Redirecting from /fsl-materialdeapoio to /](/)
---
# Redirecting to: /
URL: https://devpleno.com/fsl2-aulas
Redirecting to: / [Redirecting from /fsl2-aulas to /](/)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsm-inscricao
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsm-inscricao to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsm-reservar
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsm-reservar to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsm-reservar-fbads
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsm-reservar-fbads to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsm-turmarelampago
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsm-turmarelampago to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsmrelampago-email
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-email to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsmrelampago-fbads
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-fbads to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsmrelampago-wpp
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-wpp to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsmrelampago-ytads
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-ytads to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fsmrelampago-ytorg
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fsmrelampago-ytorg to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstack-lab-especial-fsm-relampago
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)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstack-master
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstack-master-2
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master-2 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstack-master-li1
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master-li1 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstack-master-li2
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master-li2 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstack-master-listadeespera
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstack-master-listadeespera to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstackacademy
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstackacademy-aula-1
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy-aula-1 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstackacademy-aula-2
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy-aula-2 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstackacademy-aula-3
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy-aula-3 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstackacademy-materiaisdeapoio
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackacademy-materiaisdeapoio to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: /
URL: https://devpleno.com/fullstacklab
Redirecting to: / [Redirecting from /fullstacklab to /](/)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstacklab-fbad
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstacklab-fbad to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: /
URL: https://devpleno.com/fullstacklab-fborg
Redirecting to: / [Redirecting from /fullstacklab-fborg to /](/)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstacklab-google
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstacklab-google to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstacklab-whatsapp
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstacklab-whatsapp to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstacklab-ytad
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstacklab-ytad to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstackmaster
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackmaster to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/fullstackmaster4
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /fullstackmaster4 to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# 4 funcionalidades do Console no DevTools que você não conhece - DevPleno
URL: https://devpleno.com/funcionalidades-do-console
> O console no DevTools do Chrome apresenta algumas funcionalidades que muitos utilizam raramente ou até mesmo nem sabem que existem. Para fazer este teste, ...
4 funcionalidades do Console no DevTools que você não conhece - DevPleno **
O console no DevTools do Chrome apresenta algumas funcionalidades que muitos utilizam raramente ou até mesmo nem sabem que existem.
Para fazer este teste, vamos criar um HTML simples com um script começando com o console.log normal.
<html>
<body>
<script>console.log('este é um log')</script>
</body>
</html>
Nele temos apenas uma saída e nada além disso. Agora vamos falar sobre alguns que quase não utilizamos. #1 error**
console.error('um erro')
Caso 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.
**#2 time** Com ele você pode checar quanto tempo foi gasto para executar uma dada função.
console.time('nomeCounter')
console.log('este é um log')
console.log('este é um log')
console.timeEnd('nomeCounter')
Em muitos testes que fazemos, o console.log consome recurso da máquina pois ele tem que lidar com o IO. **#3 count**
console.count(contador)
Ele 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.
**#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.
console.table([{nome: 'Tulio'};
{nome: 'Faria'};])
Todos eles, se bem utilizados, podem ajudar muito na melhora de desempenho do código ou simplesmente ajudar a depurar mais facilmente.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ffuncionalidades-do-console) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Generators Functions - o que acontece por baixo dos panos - DevPleno
URL: https://devpleno.com/generators-functions
> 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...
Generators Functions - o que acontece por baixo dos panos - DevPleno **
Hoje vamos continuar falando sobre Generators Functions em JavaScript.
O que é Generator?**
É 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.
A 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:
function* generator() {
console.log('Entrou no generator')
}
const gen = generator()
Ao 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:
const iteration = gen.next()
O 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.
Agora 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.
Agora vamos fazer algo diferente:
function* generator() {
console.log('Entrou no generator')
console.log('Segundo passo')
console.log('Penultimo passo')
console.log('fim do generator')
}
const gen = generator()
const iteration = gen.next()
Ele executou tudo de uma vez. Agora vamos fazer o seguinte:
yield 'outro valor'
Olha 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:
function* generator() {
console.log('Entrou no generator')
console.log('Segundo passo')
yield 'outro valor'
console.log('Penultimo passo')
console.log('fim do generator')
}
const gen = generator()
const iteration = gen.next()
gen.next()
Perceba 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.
No yeild, podemos por exemplo retornar uma promise:
function* generator(){
console.log('Entrou no generator')
console.log('Segundo passo')
yield new Promise((resolve, reject) => {
setTimeout(() => resolve(10), 2000
})
console.log('Penultimo passo')
console.log('fim do generator')
}
const gen = generator()
const iteration = gen.next()
iteration.value.then(() => {
gen.next()
})
Imagine 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.
Entã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:
function ReadFilePromise () {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(10), 2000
)})
}
function* generator(){
console.log('Entrou no generator')
console.log('Segundo passo')
const value = yield readFilePromise()
console.log('Penultimo passo' value)
console.log('fim do generator')
}
const gen = generator()
const iteration = gen.next()
iteration.value.then(()=>{
gen.next()
})
Ao 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:
const gen = generator()
const iteration = gen.next()
iteration.value.then((val) => {
gen.next(val)
})
Assim 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:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Generators%20Functions%20-%20o%20que%20acontece%20por%20baixo%20dos%20panos&url=https%3A%2F%2Fdevpleno.com%2Fgenerators-functions) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fgenerators-functions) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Generators: O que há "por baixo dos panos" - DevPleno
URL: https://devpleno.com/generators-o-que-ha-por-baixo-dos-panos
> Neste post, continuo falando sobre Generatiors em javaScript e como funciona
Generators: O que há "por baixo dos panos" - DevPleno **
Neste post, continuo falando sobre Generatiors em javaScript e como funciona ‘por baixo dos panos’.
O que é um Generator?**
É 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.
Primeiro vamos criar uma function generator e em seguida criar uma variavel denominada gen e chamar um generator.
function* generator() {
console.log('entrou no generator')
}
const gen = generator()
Percebam 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.
**Como fazemos isso?**
Precisamos criar um const = iteration no código.
Lembrando 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.
function* generator() {
console.log('entrou no generator')
console.log('segundo passo')
console.log('fim do generator')
}
const gen = generator()
const iteration = gen.next()
Com isso é possível entrar no Generator. Perceba que ele executou tudo de uma vez. Agora vamos fazer da seguinte forma:
function* generator() {
console.log('entrou no generator')
console.log('segundo passo')
yield 'outro valor'
console.log('penultimo')
console.log('fim do generator')
}
const gen = generator()
const iteration = gen.next()
Ao 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.
**Se eu quiser continuar executando o que eu preciso fazer?**
Chamaremos novamente gen.next()
function* generator() {
console.log('entrou no generator')
console.log('segundo passo')
yield 'outro valor'
console.log('penultimo')
console.log('fim do generator')
}
const gen = generator()
const iteration = gen.next()
gen.next()
Com isso será retornado os valores em três etapas. Podemos, por exemplo, chamar uma function:
function readFilePromise(){
return new Promise((resolve, reject) => {
setTimeout(() => resolve(10), 2000)
}
function* generator(){
console.log('entrou no generator')
console.log('segundo passo')
const value = yield readFilePromise()
console.log('penultimo' value)
console.log('fim do generator')
}
const gen = generator()
const iteration = gen.next()
iteration.value.then((val) =>{
gen.next(val)
}
Afinal, o que o CO faz?
Com 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fgenerators-o-que-ha-por-baixo-dos-panos) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Construindo um App gerenciador de séries com ReactJS - DevPleno
URL: https://devpleno.com/gerenciador-de-series-p1
> 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...
Construindo um App gerenciador de séries com ReactJS - DevPleno **
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.
Atualmente 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.
Hoje 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.
No 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.
VAMOS LÁ!
Para construir esse projeto, vamos precisar de três módulos:
npm install -g json-server
npm install -g create-react-app
npm install -g yarn
O 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.
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.
Depois podemos criar realmente nosso projeto:
create-react-app primeiro-projeto
Perceba 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.
Com isso, ele vai criar dentro do diretório ‘primeiro-projeto’ e vamos acessar esse diretório utilizando cd e depois startando o yarn:
cd primeiro-projeto/
yarn start
ele irá abrir o projeto: Se você conseguiu acessar, tem um projeto em React funcionando. Vou parar o servidor um pouco e fazer o seguinte:
code./
Ele 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.
Vamos 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.
Ele irá trocar esse div root pelo componente app. Falando em componente, o React usa componentes como sua base mínima de código.
O que é um componente?**
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.
Também é possível perceber que temos um método Render que renderiza algo na tela. Temos como se fosse um HTML:
Esse HTML, na verdade, não é HTML, é o que chamamos de JSX.
**O que é o JSX?**
É 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.
Voltando 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.
Vamos criar um componente agora para você ter essa ideia de como é criado, por exemplo Ola.js.
A 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:
import React, { Component } from 'react'
class Ola extends Component {
render() {
return <span>Olá DevPleno!</span>
}
}
export default Ola
Esse 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:
import Ola from './Ola'
Podemos depois colocar no final:
<Ola></Ola>
e o resultado é o seguinte:
Acabamos de criar um componente. Outra coisa importante é que conseguimos injetar dados, como por exemplo:
<Ola name='Tulio' />
E dentro do Ola.js fazer o seguinte:
import React, { Component } from 'react'
class Ola extends Component {
render() {
return <span>Olá {this.props.name}!</span>
}
}
export default Ola
Essa é uma forma de enviar dados do componente pai para o filho, afinal estamos passando propriedades (ou props) para o componente.
Durante a execução do projeto que vamos fazer, utilizaremos bastante isso.
Por 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.
Esse db.json vai ter o seguinte formato:
{
"series":[{
"id": 1,
"name": "How I met your mother"
},
{
"id": 2,
"name": "Friends"
}]
}
Vamos salvar e dentro do diretório colocar
json-server --watch db.json
Com 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fgerenciador-de-series-p1) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 06 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)
[Javascript · 02 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)
[Javascript · 01 de ag
---
# Grandes quantidades de dados com menos recursos - DevPleno
URL: https://devpleno.com/grandes-quantidades-de-dados-com-menos-recursos
> 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...
Grandes quantidades de dados com menos recursos - DevPleno **
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.
Primeiramente eu baixei um arquivo com mil registros em CSV, eu quero então processar esses arquivos. Vou criar um arquivo sem-otimizar.js:
const fs = require('fs')
fs.readFile('data.csv', (err, contents) => {
console.log(contentes.toString())
})
Uma outra abordagem seria, por exemplo:
const fs = require('fs')
fs.readFile('data.csv', (err, contents) => {
const lines = contents.toString().split('\\n')
line.forEach((line) => console.log(lines.split(',')))
})
Agora imagine o seguinte, ao invés de colocar da forma anterior, vamos imaginar que vai ser salva a linha no banco de dados:
const fs = require('fs')
fs.readFile('data.csv', (err, contents) => {
const lines = contents.toString().split('\\n')
line.forEach((line) => {
console.log()
})
})
Nosso 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:
const saveDB = (record) => {
return new Promise((resolve, reject) => {
setTimeOut(resolve, Math.ceil(Math.random() * 4000))
})
}
Com 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:
fs.readFile('data.csv', (err, contents) =>{
const lines = contents.toString().split('\\n')
line.forEach(line, i) => {
saveDB(line).then(() => console.log(i))
})
})
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.
Mas qual a maneira ideal de fazer isso?**
Deixar que esses dados passem pelo aplicativo, nós resolvemos o que tem que resolver e vamos para o próximo.
Vou criar um arquivo otimizado.js para fazer da maneira correta e vou utilizar o fast-csv:
yarn add fast-csv
Em 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:
const fs = require('fs')
const csv = require('fast-csv')
const entrada = fs.createReadStream('data.csv')
const csvStream = csv
.fromStream(entrada, {
headers: true
})
.on('data', (data) => {
console.log(data)
})
Agora 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:
const fs = require('fs')
const csv =require('fast-csv')
const entrada = fs.createReadStream('data.csv')
const saveDB = record => {
return new Promise((resolve, reject) =>{
setTimeOut(resolve, Math.ceil(Math.random()*4000))
})
}
const csvStream = csv.fromStream(entrada, {
headers: true
}).on('data', data => {
csvStream.pause()
saveDB(data).then((){
console.log(data)
csvStream.resume
})
})
Dessa 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fgrandes-quantidades-de-dados-com-menos-recursos) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/grupovipfsm
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /grupovipfsm to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Redirecting to: /
URL: https://devpleno.com/guiatrabalhoremoto
Redirecting to: / [Redirecting from /guiatrabalhoremoto to /](/)
---
# HA e AS em Aplicação Web - Web Basic - DevPleno
URL: https://devpleno.com/ha-e-as
> 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...
HA e AS em Aplicação Web - Web Basic - DevPleno **
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:
HA = High Availabilty (alta disponibilidade);
AS = Auto Scale (Escala automática).
O que esses conceitos querem dizer na prática?**
A 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.
Outro 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.
Essas 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.
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fha-e-as) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# HA (High Availability) e AS (Auto Scale) - DevPleno
URL: https://devpleno.com/ha-high-availability-e-as-auto-scale
> 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....
HA (High Availability) e AS (Auto Scale) - DevPleno
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fha-high-availability-e-as-auto-scale) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Template HTML simples - Hands-on Handlebars - DevPleno
URL: https://devpleno.com/handlebars-template-html-simples
> 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...
Template HTML simples - Hands-on Handlebars - DevPleno
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.
Tenho aqui um arquivo dados.json que vai servir para simular o consumo de uma EPI, vamos carregar os dados via AJAX para o html:
;[{
name: 'Tulio',
lastName: 'Faria'
},
{
name: 'Vitor',
lastName: 'Machado'
}]
No HTML, vamos importar da CDN o jQuery e o Handlebars e testar se estão carregando os nomes do Json:
<html>
<body>
<div id="people">
people
</div>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handleba
rs.js/4.0.10/handlebars.amd.js"</script>
<script>
$function(){
$.get('dados.json't=' +new Date().getTime(), function(data){
console.log(data);
}
})
</script>
</body>
</html>
Se eu quiser criar uma lista com esses nomes para colocar na DIV ‘people’ e que seja da seguinte forma:
<div id='people'>
<div>
<strong>Name: </strong>nome
<br />
<strong>Last Name: </strong>last
<br />
</div>
</div>
Se fossemos fazer isso com jquery teríamos que interpolar a string dentro da function, como por exemplo:
<script>
$function(){
$.get('dados.json't=' +new Date().getTime(), function(data){
$("#people").append('<div><strong>Name: </strong> '+nome)
$("#people").append('<div><strong>Last Name: </strong> '+last)
}
})
</script>
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}}:
<script type='text/x-handlebars-templete' id='person-templete'>
<div>
<strong>Name: </strong>
{{ nome }}
<br />
<strong>Last Name: </strong>
{{ lastName }}
<br />
</div>
</script>
Temos, 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:
<script>
$function(){
$.get'dados.json't=' +new Date().getTime(), function(data){
const templeteString = $("#person-templete").html();
const personTemplete = Handlebars.compile(templeteString);
const html = personTemplete({
name: 'Tulio',
lastName: 'Faria'
})
$("people").html(html);
}
})
</script>
Com 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.
Obviamente, 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.
<html>
<body>
<div id="people">
Loading...
</div>
<script type="text/x-handlebars-templete" id="person-templete">
{{#earch people}}
<div>
<strong>Name: </strong>{{nome}}<br />
<strong>Last Name: </strong>{{lastName}}<br />
<hr />
</div>
{{/each}}
</script>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handleb
ars.js/4.0.10/handlebars.amd.js"</script>
<script>
$function(){
$.get('dados.json't=' +new Date().getTime(), function(data){
const templeteString = $("#person-templete").html();
const personTemplete = Handlebars.compile(templeteString);
const html = personTemplete({ people: data })
$("people").html(html);
}
})
</script>
</body>
</html>
Perceba 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:
[{
"name": "Tulio",
"lastName": "Faria",
"adress": {
"city": "Pouso Alegre"
}
},{
"name": "Vitor",
"lastName": "Machado"
"adress": {
"city": "São Paulo"
}
}]
Podemos utilizar a seguinte estrutura:
{{#earch people}}
<div>
<strong>Name: </strong>{{nome}}<br />
<strong>Last Name: </strong>{{lastName}}<br />
<strong>City: </strong>{{adress.city}}<br />
<hr />
</div>
{{/each}}
Perceba que estamos pegando o adress e o que tem dentro dele. Isso é bem bacana, podemos fazer muitas coisas com Handlebars.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Template%20HTML%20simples%20-%20Hands-on%20Handlebars&url=https%3A%2F%2Fdevpleno.com%2Fhandlebars-template-html-simples) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhandlebars-template-html-simples) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Hands-on: Creat-React-App - DevPleno
URL: https://devpleno.com/hands-creat-react-app
> Neste Handson, testo um pacote para React, o CreateReactApp. Confira:
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 ...
Hands-on: Injeção de Dependência é bom mesmo? - DevPleno
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.
Confira o video:
Nã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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-injecao-de-dependencia-e-bom-mesmo) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Hands-on: Json-Server - DevPleno
URL: https://devpleno.com/hands-json-server
> 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...
Hands-on: Json-Server - DevPleno
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Json-Server&url=https%3A%2F%2Fdevpleno.com%2Fhands-json-server) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-json-server) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Hands-on: Ler arquivo linha a linha - DevPleno
URL: https://devpleno.com/hands-ler-arquivo-linha-linha
> 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...
Hands-on: Ler arquivo linha a linha - DevPleno **
Neste hands-on, vamos ver como conseguimos utilizar o readline em conjunto com Readable Stream para ler linhas de um arquivo texto.
Como faremos isso?**
Primeiramente 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.
const readline = require('readline')
const fs = require('fs')
const readable = sf.createReadStream('arquivo.html')
Vamos criar uma instancia do readline e no imput vamos passar o readable
const rl = readline.creatInterface({
input: readable,
output: process.stdout
})
**Mas para que isso serve?**
Isso é legal, pois podemos fazer assim por exemplo: rl
.on('line', (line) => {
console.log('>>>', line)
})
Se rodarmos este código, o node vai mostrar o HTML inteiro linha a linha.
Para provar realmente que ele esta fazendo isso, podemos fazer o seguinte:
rl.on('line', (line) => {
console.log('>>>', line.toUpperCase())
})
Entã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.
**Conclusão**
Quando temos muitos dados, não é necessário jogar na memória. Utilizando essa forma, a leitura vai ser bem mais vantajosa.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-ler-arquivo-linha-linha) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Hands-on: Low-db - DevPleno
URL: https://devpleno.com/hands-low-db
> 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...
Hands-on: Low-db - DevPleno
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.
Confira o video:
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. Fique à vontade para deixar suas dúvidas e sugestões nos comentários. Abraço!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Low-db&url=https%3A%2F%2Fdevpleno.com%2Fhands-low-db) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-low-db) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Hands-on: Benchmark - DevPleno
URL: https://devpleno.com/hands-on-benchmark
> 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...
Hands-on: Benchmark - DevPleno
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Benchmark&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-benchmark) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-benchmark) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# ChalkJS - Deixe as saídas de seu console.log coloridas e com estilo - DevPleno
URL: https://devpleno.com/hands-on-chalkjs
> 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...
ChalkJS - Deixe as saídas de seu console.log coloridas e com estilo - DevPleno
O ChalkJS é um módulo que basicamente permite uma saída colorida no console. Primeiramente vamos importar o módulo:
yarn add chalk
Agora, no editor, vamos escrever um código. Eu criei um arquivo chalk.js e dentro dele vamos colocar o seguinte:
const chalk = require('chalk')
console.log('DevPleno')
Ao mandarmos rodar o código, a resposta sairá normalmente, mas agora vamos utilizar de uma forma diferente:
console.log(chalk.red('DevPleno'))
Agora, se rodarmos o código, ele vira da seguinte forma:
O interessante é que podemos combinar as seguintes variações:
Ao aparecer um erro ou um alerta, por exemplo, podemos colocar um ‘bgRed’:
Uma outra coisa interessante é que podemos abrir o estilo, por exemplo:
console.log(chalk.styles.red.open + 'Vermelho' + chalk.style.red.close)
Entã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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-chalkjs) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Hands-on: CO - DevPleno
URL: https://devpleno.com/hands-on-co
> 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...
Hands-on: CO - DevPleno
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.
## Confira:
Deixe 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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20CO&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-co) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-co) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Hands-on: Currying - DevPleno
URL: https://devpleno.com/hands-on-currying
> 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...
Hands-on: Currying - DevPleno
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:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Currying&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-currying) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-currying) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Hands-on: Faker - DevPleno
URL: https://devpleno.com/hands-on-faker
> 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...
Hands-on: Faker - DevPleno
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.
Confira o video:
Nã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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Faker&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-faker) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-faker) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Jest - Como utilizar a ferramenta de testes criada pelo Facebook - DevPleno
URL: https://devpleno.com/hands-on-jest
> 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 ...
Jest - Como utilizar a ferramenta de testes criada pelo Facebook - DevPleno
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 nosso teste chamado jest-handson, então vou rodar:
yarn add jest --dev
Vamos 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.
Dentro do Package.json tem o código:
{
"devDependencies": {
"jest": "^19.0.2"
}
}
E vamos adicionar:
{
"devDependencies": {
"jest": "^19.0.2"
},
"scripts":{
"test": "jest"
}
}
Se rodarmos o yarn test agora, ele já sabe como rodar e retornou que não temos nenhum teste para rodar.
Então vamos criar um módulo chamado modulo1 para testarmos:
const modulo1 = {
func1: (a) => a + 1
}
module.exports = modulo1
Uma 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:
const modulo1 = require('./modulo1')
describe('basic features', () => {
it('should return the right value', () => {
expect(modulo1.func1(10)).toBe(11)
})
})
Perceba 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.
Agora imagine que por algum motivo no local de ‘a’ deve rodar uma função em específico, vamos supor uma função 2:
const modulo1 = {
func1: (a) => a + 1,
func2: (a, cb) => a + cb(a)
}
module.exports = modulo1
Podemos fazer o seguinte para testar essa função:
const modulo1 = require('./modulo1')
describe('basic features', () => {
it('should return the right value', () => {
expect(modulo1.func1(10)).toBe(11)
})
it('func2', () => {
const cb = jest.fn()
cb.mockReturnValue(1)
expet(modulo1.func2(10, cb)).toBe(11)
})
})
Nã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.
Se colocarmos um
console.log(cb.mock.calls)
vamos conseguir até mesmo inspecionar se a chamada foi com o valor correto.
O 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.
Confira:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-jest) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Hands-on: Marked - DevPleno
URL: https://devpleno.com/hands-on-marked
> Neste vídeo, faço um handson do módulo Marked, que tem a função de converter Markdown para HTML. Confira o video:
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...
Hands-on: Node JS - Request - DevPleno
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Node%20JS%20-%20Request&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-node-js-request) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-node-js-request) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Hands-on: NodeJS - PM2 - DevPleno
URL: https://devpleno.com/hands-on-nodejs-pm2
> 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...
Hands-on: NodeJS - PM2 - DevPleno
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.:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20NodeJS%20-%20PM2&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-nodejs-pm2) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-nodejs-pm2) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Nodemon: Monitore alterações e reinicie automaticamente seus scripts - DevPleno
URL: https://devpleno.com/hands-on-nodemon
> Neste handson, vamos falar mais especificamente sobre o Nodemon. Primeiramente vamos instalar: Eu poderia instalar localmente também apenas tirando o g, as...
Nodemon: Monitore alterações e reinicie automaticamente seus scripts - DevPleno
Neste hands-on, vamos falar mais especificamente sobre o Nodemon. Primeiramente vamos instalar:
npm install -g nodemon
Eu 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?
Ele 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:
const express = require('express');
const = express();
app.get('/', function (req, res){
console.log('>> here...' +new Date().getTime())
res.send('Hello World');
})
app.listen(3000, function() {
console.log('Example app listening on port 3000!');
});
Caso eu modifique alguma linha, por exemplo:
console.log('Example app listening on port 3000!****')
Ele restarta o server e já me diz o server foi reiniciado devido a mudanças:
Vamos 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:
nodemon --ignore lib/ server.js
Assim nada que modificarmos dentro dessa pasta vai fazer o server ser restartado.
Outra coisa interessante é que se digitarmos rs e dermos um enter, conseguimos forçar um restart dele também.
Essa 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.
Confira o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-nodemon) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# PKG - Transforme seu aplicativo Node em executável - DevPleno
URL: https://devpleno.com/hands-on-pkg
> Use o PKG para compilar seu app Node.js em executável para Windows, Mac e Linux. Tutorial passo a passo com exemplos.
PKG - Transforme seu aplicativo Node em executável - DevPleno **
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.
Qual a vantagem disso?**
Com 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.
Primeiramente vamos instalar este módulo:
npm install -g pkg
Em seguida vamos adicionar um express:
yarn add express
Depois iremos no Visual Studio Code e criamos um index.js
const express = require('express')
const app = express()
app.get('/', (req, res)=>{
res.send('Bem vindo ao meu-app')
)}
app.listen(3000, ()=>{
console.log('Running meu-app')
}
Ele irá ‘ouvir’ a porta 3000 e, se tudo ocorrer bem, mostrará a mensagem “running meu-app”
Originalmente o package virá assim:
{
"dependencies": {
"express": "^4.15.2"
}
}
Mas 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”)
e 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.
{
name": "meuapp",
"dependencies": {
"express": "^4.15.2"
},
"bin": "index.js",
"pkg":{
"assets":["view/\*\*/\*"],
"target": ["node7"]
}
}
Para executarmos isso, vamos no Node e colocamos:
pkg . (pkg ponto)
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.
Lembrando 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.”
Assim, 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-pkg) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Hands-on: Pre-Commit - DevPleno
URL: https://devpleno.com/hands-on-pre-commit
> 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...
Hands-on: Pre-Commit - DevPleno
O módulo testado neste post é o Pre-Commit, que nos permite executar tarefas antes de fazer Commit em seus repositórios Git.
Assista o vídeo para entender como funciona:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Pre-Commit&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-pre-commit) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-pre-commit) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Redirecting to: https://lp.devpleno.com/devreactjs/
URL: https://devpleno.com/hands-on-reactjs-materiaisdeapoio
Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /hands-on-reactjs-materiaisdeapoio to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)
---
# Hands-on: Readline - DevPleno
URL: https://devpleno.com/hands-on-readline
> 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...
Hands-on: Readline - DevPleno **
Neste post vamos fazer um hands-on é de um módulo padrão com o core do node: o readline.
O que temos que fazer?**
Vamos importar primeiro o readline e instanciar um novo readline.
const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stout
})
Como o readline é um modulo que permite que lidemos com entrada e saída, podemos atrelar um readable stream no input e output padrão.
**Pra que serve isso?**
Podemos construir várias ‘ferramentinhas’ com o readline, a principal delas é a seguinte:
rl.on('line', (line)==>{
console.log('line >>', line)
})
E 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:
rl.on('line', (line)==>{
console.log('line >>', line)
})
rl.on('SIGINT', () => {
console.log('bye'),
rl.pause()
})
Ao 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.
Podemos criar várias formas de interação, vou dar mais um exemplo prático.
rl.question('qual o seu nome?', (nome) => {
console.log('prazer ', nome)
})
Rodando o node, a pergunta irá aparecer e ao escrever o console.log vai ser retorndado: prazer mais o nome que você digitou.
Em Java, temos algo bem semelhante. Conseguimos dar o readline no stream e ele devolve a linha digitada pelo usuário.
**Conclusão**
Apenas 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Readline&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-readline) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-readline) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios - DevPleno
URL: https://devpleno.com/hands-on-rimraf
> 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...
Rimraf - Remova diretórios inteiros mesmo que eles não estejam vazios - DevPleno
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).
Seria 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.
A 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.
yarn add rimraf
Ele é 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:
const rimraf = require('rimraf')
rimraf('dir1', function () {
console.log('done')
})
Ao 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.
O 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-rimraf) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Hands-on: ShellJS - DevPleno
URL: https://devpleno.com/hands-on-shelljs
> 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...
Hands-on: ShellJS - DevPleno
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.
Estas 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.
Assim seu script pode utilizar recursos do shell e ainda ser multiplataforma.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20ShellJS&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-shelljs) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-shelljs) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Hands-on: Slack - DevPleno
URL: https://devpleno.com/hands-on-slack
> 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 ...
Hands-on: Slack - DevPleno
Neste hands-on iremos fazer um bot simples que envia notificações utilizando o Slack.
O 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.
[Para criar um bot no slack entre aqui.](https://my.slack.com/apps/A0F7YS25R-bots)
const token = 'xoxb-....'
const Api = require('@slack/client').WebClient
const api = new Api(token)
const RtmClient = require('@slack/client').RtmClient
const rtm = new RtmClient(token)
const RTM_EVENTS = require('@slack/client').RTM_EVENTS
api.channels.list(function (err, info) {
const channelId = info.channels
.filter((channel) => channel.name === 'general')
.map((channel) => channel.id)[0]
rtm.on(RTM_EVENTS.MESSAGE, (msg) => {
rtm.sendMessage(msg.text, channelId)
})
rtm.start()
})
Já pensou o que você vai criar notificar no Slack para sua equipe de forma automática?
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Slack&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-slack) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-slack) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Hands-on - Socket.io Parte 3 - DevPleno
URL: https://devpleno.com/hands-on-socket-io-parte-3
> 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...
Hands-on - Socket.io Parte 3 - DevPleno
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á?!
const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
app.get('/', (req, res)=>{
res.sendFile(__dirname+'/index.html')
})
io.on('connection', (socket)=>{
console.log('New connection', socket.id)
socket.on('msg', (msg)=>{
console.log(msg)
socket.broadcast.emit('msg', msg);
})
http.listen(3000, function(){
console.log('listening on port 3000')
})
}
Quando 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.
io.on('connection', (socket)=>{
console.log('New connection', socket.id)
socket.on('msg', (msg)=>{
console.log(msg)
socket.broadcast.emit('msg', msg);
socket.join('contador');
})
Com 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.
Vamos 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.
let.counter = 0
setInterval(() => io.to('contador'))
io.to('contador').emit('msg', counter++)
}, 1000 )
Essa é 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á.
Existem 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.
Confira o hands-on desta terceira parte também em vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-socket-io-parte-3) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Hands-on: Standard - DevPleno
URL: https://devpleno.com/hands-on-standard
> 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...
Hands-on: Standard - DevPleno
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.
Confira os detalhes nos vídeos:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Standard&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-standard) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-standard) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Hands-on - Three.JS - DevPleno
URL: https://devpleno.com/hands-on-threejs
> 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...
Hands-on - Three.JS - DevPleno
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 :
<html>
<body>
<script src='//cdnjs.cloudflare.com/ajax/libs/three.js/88/three.js'></script>
<script>
const scene = new THREE.Scene() const camera = new
THREE.PerspectiveCamera(75, window.in nerWidth / window.innerHight, 0.1,
1000) const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
documnet.body.appenChild(renderer.domElement)
</script>
</body>
</html>
Esse 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.
Ao rodar, temos uma tela preta, que é nossa scene. Agora vamos começar a adicionar alguns objetos:
<html>
<body>
<script src="//cdnjs.cloudflare.com/ajax/libs/three.js/88/three.js">
</script>
<script>
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(75, window.in
nerWidth / window.innerHight, 0.1, 1000)
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
documnet.body.appenChild(renderer.domElement)
const box = new THREE.BoxGeometry(1,1,1)
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })
const cube = new THREE.Mesh( box, material )
scene.add( cube )
camera.position.z = 5
const animated = () => {
requestAnimationFrame( animate )
renderer.render( scene, camera)
}
animate()
</script>
</body>
</html>
O renderizador pega uma câmera e renderiza a cena na câmera, com isso ele cria a imagem a partir disso.
O 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:
const animated = () => {
requestAnimationFrame(animate)
cube.rotation.x += 0.01
cube.rotation.y += 0.01
cube.rotation.z += 0.01
renderer.render(scene, camera)
}
Fazendo 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%20-%20Three.JS&url=https%3A%2F%2Fdevpleno.com%2Fhands-on-threejs) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-threejs) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM) - DevPleno
URL: https://devpleno.com/hands-on-yarn
> O
Yarn (uma alternativa ao gerenciador de pacotes/dependências NPM) - DevPleno **
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:
npm install -g yarn
O 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.
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:
npm install nome-do-pacote
Quando 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:
npm install
A instalação demorou mais ou menos 6 segundos, não demorou tanto, agora vou deletar o node_modules e instalar via yarn:
yarn
O tempo de instalação foi de 3.39 segundos
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.
Também podemos colocar:
yarn global add nome-do-pacote
Com isso ele deixa em escopo global.
Entã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.
Apenas 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhands-on-yarn) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Redirecting to: /
URL: https://devpleno.com/handsonreact
Redirecting to: / [Redirecting from /handsonreact to /](/)
---
# Redirecting to: /
URL: https://devpleno.com/handsonreact-fb
Redirecting to: / [Redirecting from /handsonreact-fb to /](/)
---
# Redirecting to: /
URL: https://devpleno.com/handsonreact-gg
Redirecting to: / [Redirecting from /handsonreact-gg to /](/)
---
# Redirecting to: /
URL: https://devpleno.com/handsonreact-wpp
Redirecting to: / [Redirecting from /handsonreact-wpp to /](/)
---
# Redirecting to: /
URL: https://devpleno.com/handsonreact-yt
Redirecting to: / [Redirecting from /handsonreact-yt to /](/)
---
# Redirecting to: /
URL: https://devpleno.com/handsonreactjs
Redirecting to: / [Redirecting from /handsonreactjs to /](/)
---
# High-order Functions - DevPleno
URL: https://devpleno.com/high-order-functions
> 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...
High-order Functions - DevPleno
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.
const vetor = [1, 2, 3]
vetor.forEach((item) => console.log(item))
Perceba 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:
function mathOrder(num1, num2, op) {
return op(num1, num2)
}
console.log(mathOperator(1, 2, (num1, num2) => num1 + num2))
Então eu quis que essa high-order function chame o num1 e num2 e retorne a soma das duas.
Nã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.
Lembrando que eu utilizei arrow function para facilitar mas eu poderia também fazer a operação:
function mathOrder(num1, num2, op) {
return op(num1, num2)
}
function operadorMult(num1, num2) {
return (
num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1num1\ *
num2
)
}
console.log(mathOperator(1, 2, (num1, num2) => num1 + num2))
console.log(mathOperator(1, 2, operadorMult))
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=High-order%20Functions&url=https%3A%2F%2Fdevpleno.com%2Fhigh-order-functions) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fhigh-order-functions) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Horário de trabalho na toptal - DevPleno
URL: https://devpleno.com/horario-de-trabalho-na-toptal
> Você também tem dúvida sobre como é o horário de trabalho quando se trabalha remotamente? Descubra como é na Toptal.
Na quarta parte sobre Streams, falo sobre Transform. Confira!
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 ...
Json-server - Como criar uma REST API para testes de forma simples - DevPleno **
Neste hands-on onde vou mostrar uma ferramenta que é bastante interessante no dia a dia, o Json-server.
Primeiro vamos instalar:
npm install -g json-server
O que ele faz?**
Muitas 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.
Vou criar um novo arquivo, por exemplo db.json, e dentro dele vou colocar o seguinte:
{
"produtos": [{"id": 1, "name": "bike"}]
}
Criamos uma base de produtos onde tenho uma bicicleta com o ID 1. Com isso posso ir por exemplo no Shell e escrever:
json-server --watch db.json
Ele retorna que já temos um recurso, que é:
https://localhost:3000/produtos
Esse 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.
Entã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:
{
"id": 1,
"name": "bike"
}
E 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
{
"id": 2,
"name": "carrinho"
}
Se 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:
https://localhost:3000/produtos/1
Ele retornará apenas o ID 1.
Perceba 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.
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](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) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Lista de sites para trabalhar remotamente como programador em 2022 - DevPleno
URL: https://devpleno.com/lista-definitiva-de-sites-para-progradores-remotos
> 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...
Lista de sites para trabalhar remotamente como programador em 2022 - DevPleno
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.
A pergunta que mais recebo é: quais os melhores sites para trabalhar remotamente como programador?
Neste 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).
## Toptal
Uma 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.
No 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.
A 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).
[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.
## Scalable Path
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.
Uma ótima pedida para as primeiras experiências.
[Entre aqui para fazer seu cadastro na Scalable Path!](https://www.scalablepath.com/apply?r=tf5226)
## RemoteOk.io
Este site é mais como um agregador de vagas para trabalho remoto. Possui muitas vagas e é bastante organizado neste sentido.
[https://remoteok.io/](https://remoteok.io/)
## Crossover.com
Crossover 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!).
[https://www.crossover.com](https://www.crossover.com)
[https://www.crossover.com/jobs - página com as vagas abertas](https://www.crossover.com/jobs)
## StackOverflow Jobs
Outro agregador de vagas bastante interessante é o StackOverflow Jobs. Ele possui integração com seu perfil da plataforma.
[https://stackoverflow.com/jobs](https://stackoverflow.com/jobs)
## LinkedIn
O 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ão esqueça de filtrar por vagas remotas (se esse for o seu objetivo.)
Aproveite e siga o DevPleno por lá:
[https://www.linkedin.com/school/odevpleno/](https://www.linkedin.com/school/odevpleno/)
[https://linkedin.com/in/tuliofaria](https://linkedin.com/in/tuliofaria)
Esta lista ainda é preliminar :) Vamos trazer mais itens em breve.
## Você já trabalha remotamente (no Brasil ou no exterior)?
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.
.
Conheça o [Fullstack Master](https://go.devpleno.com/fsm?sck=blog-como-gerar-um-array-populado-em-javascript)
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-definitiva-de-sites-para-progradores-remotos) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[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)
[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)
---
# Lista encadeada - Adicionar com O(1) - DevPleno
URL: https://devpleno.com/lista-encadeada-adicionar-com-o1
> 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...
Lista encadeada - Adicionar com O(1) - DevPleno
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:
let head = null
let tail = null
Agora vamos fazer um add e, caso estivermos adicionando pela primeira vez, vamos seguir a mesma regra utilizada anteriormente:
const add2 = (value) => {
if (!head) {
head = Node(value)
tail = head
length++
return head
}
}
Perceba que tail é igual a head, afinal se não tivermos nenhum nó, ao adicionar, o início e o fim serão o mesmo.
Agora, 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ó:
const add2 = (value) => {
if (!head) {
head = Node(value)
tail = head
length++
return head
}
let node = Node(value)
tail.next = node
tail = node
return node
}
Quando 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:
add2: (value) => add2(value)
Vamos fazer um teste:
list.add2(1)
list.add2(2)
list.add2(3)
list.print()
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.
O ú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.
Confira o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Algoritmos](/tag/algoritmos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Lista%20encadeada%20-%20Adicionar%20com%20O(1)&url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-adicionar-com-o1) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-adicionar-com-o1) Copiar link
Continue lendo
## Insights relacionados
[Algoritmos · 16 de nov. de 2017 code fights - Metro Card](/code-fights-metro-card)
[Algoritmos · 13 de nov. de 2017 Resolvendo Expressão Aritmética do CodeFights](/expressao-aritmetica-codefights)
[Algoritmos · 29 de ago. de 2017 Busca Binária](/busca-binaria)
---
# Lista encadeada - Adicionar nó - DevPleno
URL: https://devpleno.com/lista-encadeada-adicionar-no
> 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çã...
Lista encadeada - Adicionar nó - DevPleno **
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.
Hoje 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.
A 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.
Então eu vou criar algumas variáveis dentro e retornar qual vai ser a interface pública dessa lista:
function LinkedList() {
let head = null
length = 0
return {
length: () => length
}
}
Perceba 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.
Se eu fizer:
const list = LinkedList()
console.log(list.length())
Ele 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:
function LinkedList(){
let head = null
length = 0
const add (value) =>{
if(!head){
}
}
return{
length: () => length
}
}
const list = LinkedList()
console.log(list.length())
A 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.
Como eu tenho que criar um novo nó, vamos criar um const Node que vai retornar um outro nó:
function LinkedList(){
let head = null
length = 0
const Node = (value) => {
return {
value,
next: null
}
}
const add (value) =>{
if(!head){
}
}
return {
length: () => length
}
}
const list = LinkedList()
console.log(list.length())
Entã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:
const add (value) =>{
if(!head){
head = Node(value)
length++
return head
}
}
return{
length: () => length
add: (value) => add(value)
}
Lembrando 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:
const list = LinkedList()
console.log(list.length())
list.add(1)
console.log(list.length())
A 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:
return{
length: () => length
add: (value) => add(value)
print: () => console.log(head)
}
const list = LinkedList()
console.log(list.length())
list.add(1)
console.log(list.length())
list.print()
Perceba 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:
const add (value) =>{
if(!head){
head = Node(value)
length++
return head
}
let node = head
while(node.next){
node = node.next
}
node.next = Node(value)
length++
return node.next
console.log(node)
}
Entã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.
Vamos 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ó.
A 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.
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.
Vamos 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.
Confira o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Algoritmos](/tag/algoritmos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Lista%20encadeada%20-%20Adicionar%20n%C3%B3&url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-adicionar-no) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-adicionar-no) Copiar link
Continue lendo
## Insights relacionados
[Algoritmos · 16 de nov. de 2017 code fights - Metro Card](/code-fights-metro-card)
[Algoritmos · 13 de nov. de 2017 Resolvendo Expressão Aritmética do CodeFights](/expressao-aritmetica-codefights)
[Algoritmos · 29 de ago. de 2017 Busca Binária](/busca-binaria)
---
# Lista encadeada - Como remover um nó - DevPleno
URL: https://devpleno.com/lista-encadeada-remover-um-no
> 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....
Lista encadeada - Como remover um nó - DevPleno
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.
Primeiro temos que criar um método remove, vamos passar um nó para ele e, baseado nesse nó, ele vai excluir da lista.
const remove = (node) => {}
Lembrando que em return temos que adicionar o remove:
return{
remove(node) => remove(node)
}
O primeiro cenário que temos é se a lista for igual a null:
const remove = (node) => {
if (lenght === 0) return
}
Agora, se o nó for igual ao primeiro nó da minha lista, eu simplesmente vou fazer meu head ser o node.next
const remove = (node) => {
if (lenght === 0) return
if (node === head) {
head = node.next
return
}
}
Agora 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:
const remove = (node) => {
if (lenght === 0) return
if (node === head) {
head = node.next
return
}
let currentNode = head
while (currentNode.next && currentNode.next != node) {
currentNode = currentNode.next
}
console.log(currentNode)
}
Agora eu quero pegar o valor 2 da nossa lista e checar se eu peguei realmente esse valor:
let node = list.getByValue(2)
console.log(node)
Agora eu preciso mandar excluir esse nó 2:
list.remove(node)
Pronto, 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:
let currentNode = head
while (currentNode.next && currentNode.next != node) {
currentNode = currentNode.next
}
currentNode.next = node.next
Fizemos 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:
list.add2(4)
let node = list.getByValue(3)
console.log(node)
list.remove(node)
list.print()
Lembrando 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.
A 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).
Assista ao vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Algoritmos](/tag/algoritmos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-remover-um-no) Copiar link
Continue lendo
## Insights relacionados
[Algoritmos · 16 de nov. de 2017 code fights - Metro Card](/code-fights-metro-card)
[Algoritmos · 13 de nov. de 2017 Resolvendo Expressão Aritmética do CodeFights](/expressao-aritmetica-codefights)
[Algoritmos · 29 de ago. de 2017 Busca Binária](/busca-binaria)
---
# Lista encadeada - Como retornar um item - DevPleno
URL: https://devpleno.com/lista-encadeada-retornar-um-item
> 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çã...
Lista encadeada - Como retornar um item - DevPleno **
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.
const getByIndex = (index) => {
if (index < length) {
}
}
Perceba 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:
return {
length: () => add(value),
print: () => console.log(head),
getByIndex: (index) => getByIndex(index)
}
Em seguida faremos o seguinte:
const getByIndex = (index) => {
if (length === 0) {
return null
}
let node = head
let count = 0
while (count < index && node.next) {
node = node.next
count++
}
return node
}
Teoricamente, 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ó.
Vamos fazer o teste:
console.log(list.getByIndex(0))
Perceba que o índice zero tem toda a estrutura montada anteriormente, em um segundo caso de teste vamos fazer o seguinte:
console.log(list.getByIndex(1))
Já 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.
O que podemos fazer para corrigir?
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:
const getByIndex = (index) => {
if (length === 0 || index >= length) {
return null
}
let node = head
let count = 0
while (count < index && node.next) {
node = node.next
count++
}
return node
}
Novamente 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:
const getByValue = (value) => {
if (length === 0) {
return null
}
let node = head
if (node.value === value) {
return node
}
while (node.net) {
node = node.next
if (node.value === value) {
return node
}
}
return null
}
Lembrando que temos que exportar ele também:
getByValue (value) => getByValue(value)
No 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.
Confira todos os passos em vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Algoritmos](/tag/algoritmos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Lista%20encadeada%20-%20Como%20retornar%20um%20item&url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-retornar-um-item) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flista-encadeada-retornar-um-item) Copiar link
Continue lendo
## Insights relacionados
[Algoritmos · 16 de nov. de 2017 code fights - Metro Card](/code-fights-metro-card)
[Algoritmos · 13 de nov. de 2017 Resolvendo Expressão Aritmética do CodeFights](/expressao-aritmetica-codefights)
[Algoritmos · 29 de ago. de 2017 Busca Binária](/busca-binaria)
---
# Listar arquivos em JS (async, await, promise e Promise.all) - DevPleno
URL: https://devpleno.com/listar-arquivos-em-js
> 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...
Listar arquivos em JS (async, await, promise e Promise.all) - DevPleno
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.
Entã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.
Primeiramente 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:
const fs = require('fs')
fs.readdir('./', (err, paths) => {
console.log(paths)
})
Ao 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:
function readdir(path){
return new Promise((resolve, reject) => {
fs.readdir(path, (err, paths) =>{
if(err){
reject(err)
} else {
resolve(paths)
}
}
}
}
Simplesmente estou retornando uma promise desse readdir, o que muda é que agora eu posso chamar o readdir passando o ./ com o then:
readdir('./')then((paths) => console.log(paths))
Do 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:
fs.stat(path, (err, stat) => {
console.log(stat.isFile())
})
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:
fs.stat('./', (err, stat) => {
console.log(stat.isFile())
})
Agora precisamos transformar o fs.stat também em uma função:
function stat(path){
return new Promise((resolve, reject) => {
fs.stat(path, (err, stat) =>{
if(err){
reject(err)
} else {
resolve(stat)
}
})
}
}
Agora podermos fazer uma nova versão:
fs.stat('./').then,
(stat) => {
console.log(stat.isFile())
}
Agora 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:
async function lista() {
const paths = await readdir('./')
console.log(paths)
}
lista()
Lembrando 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.
Perceba 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:
async function lista() {
const paths = await readdir('./')
const stats = paths.map(async (path) => await stat(path))
console.log(paths)
}
lista()
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:
async function lista() {
const paths = await readdir('./')
const stats = paths.map(async (path) => await stat(path))
const stats = await Prmise.all(statsPromises)
console.log(paths)
}
lista()
Agrupamos 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.
Agora como eu vou saber qual caminho é o que?
Na minha função stat, ao invés de retornar só o stat, vou retornar o path também para sabermos que arquivo é esse:
function stat(path){
return new Promise((resolve, reject) => {
fs.stat(path, (err, stat) =>{
if(err){
reject(err)
} else {
resolve({path, stat })
}
})
}
}
Agora precisamos filtrar qual desses caras são realmente arquivos, para isso vamos fazer o seguinte:
async function lista() {
const paths = await readdir('./')
const stats = paths.map(async (path) => await stat(path))
const stats = await Prmise.all(statsPromises)
const pathsWithIsFile = stats.map((path) => ({
path: path,
isFile: path.stat.isFile()
}))
const files = pathsWithIsFile.filter((path) => path.isFile)
console.log(files)
}
lista()
Agora ele irá retornar apenas os caminhos que são arquivos, o grande segredo de tudo é essa parte:
const stats = paths.map(async (path) => await stat(path))
const stats = await Prmise.all(statsPromises)
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).
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flistar-arquivos-em-js) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Redirecting to: https://lp.devpleno.com/devreactjs/
URL: https://devpleno.com/listavip-devreactjs
Redirecting to: https://lp.devpleno.com/devreactjs/ [Redirecting from /listavip-devreactjs to https://lp.devpleno.com/devreactjs/](https://lp.devpleno.com/devreactjs/)
---
# Loops/Repetições/Iterações no JSX do React - DevPleno
URL: https://devpleno.com/loopsrepeticoesiteracoes-no-jsx-do-react
> JSX é a sintaxe que permite escrevermos HTML dentro do Javascript (sim, isso parece estranho, rs) em componentes ReactJS. E um fator muito interessante do ...
Loops/Repetições/Iterações no JSX do React - DevPleno
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.
Algo como:
<ul><!-- aqui temos HTML normalmente -->
<?php for($i=0; $i<10; $i++){ // trocamos o escopo para PHP ?>
<li><?php echo $x ?></li><!-- aqui alternamos o escopo entre HTML/PHP -->
<?php } ?>
</ul>
Perceba 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. :(
## Forma 1:
Nesta 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:
class Loop1 extends React.Component {
render() {
let rows = []
for (let i = 0; i < 5; i++) {
rows.push(<li>Num: {i}</li>)
}
return (
<div>
<h1>Loop 1:</h1>
<ul>{rows}</ul>
</div>
)
}
}
Apesar de funcionar bem, esta maneira acaba ficando um pouco confusa em componentes um pouco mais complexos.
## Forma 2:
Nesta 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.
class Loop2 extends React.Component {
renderRow(row) {
return <li>Num: {row}</li>
}
render() {
let rows = []
for (let i = 0; i < 5; i++) {
rows.push(i)
}
return (
<div>
<h1>Loop 2:</h1>
<ul>{rows.map(this.renderRow)}</ul>
</div>
)
}
}
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:
class Loop3 extends React.Component {
renderRow(row) {
return <li>Num: {row}</li>
}
render() {
let rows = []
for (let i = 0; i < 5; i++) {
rows.push(i)
}
if (rows.length == 0) {
return <p>Nenhum item</p>
}
return (
<div>
<h1>Loop 3:</h1>
<ul>{rows.map(this.renderRow)}</ul>
</div>
)
}
}
Se a lista for vazia, ele retorna uma mensagem e não renderiza o loop :)
Você pode ver estes exemplos rodando aqui: [https://codepen.io/tuliofaria/pen/NbZgqK](https://codepen.io/tuliofaria/pen/NbZgqK)
Bom pessoal, estas são algumas ideias para utilizar loops em JSX. Como sempre, fiquem a vontade para comentar e até a próxima!
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Floopsrepeticoesiteracoes-no-jsx-do-react) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 06 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)
[Javascript · 02 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)
[Javascript · 01 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)
---
# Low-DB - Banco de dados para NodeJS baseado em JSON - DevPleno
URL: https://devpleno.com/low-db
> 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, ...
Low-DB - Banco de dados para NodeJS baseado em JSON - DevPleno **
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.
Primeiro vamos instalar o módulo:
yarn add lowdb
Criamos então o low-db. Com isso, precisamos de uma instância de um banco mostrando qual arquivo queremos utilizar.
const lowdb = require('lowdb')
const db = lowdb('banco.json')
db.defauts({
noticias: [],
usuarios: []
}).write()
O 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.
Ao 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.
Vamos fazer mais alguns testes, por exemplo, adicionar uma notícia nova com id, assunto e conteúdo e por fim escreva no json.
db.get('noticias')
.push({
id: '1',
assunto: 'crime',
conteudo: 'teste'
})
.write()
O 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.
db.set('settings.toggledOption', true).write
Utilizamos 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.
Um banco não é um banco se não pudéssemos buscar as informações nele, correto?**
Então vamos buscar uma informação (e única do nosso banco de exemplo) que é a notícia com o ID igual a 1.
const n = bd.get('noticias').find({ id: '1' }).value()
console.log(n)
Percebam 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
bd.get('noticias').find({ id: '1' }).write()
Esta é 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.
Confira o Hands-on no vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Flow-db) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# High-order Function MAP - DevPleno
URL: https://devpleno.com/map
> 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...
High-order Function MAP - DevPleno *
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:
const vetor = [{id: 1, nome: 'Bicicleta', categoria: 1}
{id: 2, nome: 'Toca de natação', categoria: 2}]
vetor.map( function(item){
console.log(item)
return item
})
Esse 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:
vetor.map((item) => {
console.log(item)
return item
})
Entã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:
Vou criar um outro vetor no qual utilizaria a função para retornar algo específico como só o nome dos itens.
const vetor2 = vetor.map((item) => {
return 'Nome: ' + item.nome
})
console.log(vetor2)
Entã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:
const vetor2 = vetor.map((item) => item.nome)
console.log(vetor2)
Se 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:
const categoria = {
1: 'Bicicletas',
2: 'Natação'
}
const vetor2 = vetor.map((item) => {
item.categoria = categorias[item.categoria]
return item
})
console.log(vetor2)
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.
Confira o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=High-order%20Function%20MAP&url=https%3A%2F%2Fdevpleno.com%2Fmap) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmap) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Melhoria Contínua - DevPleno
URL: https://devpleno.com/melhoria-continua
> 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...
Melhoria Contínua - DevPleno
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.
Vou contar uma história rapidinho para vocês terem uma ideia de onde eu quero chegar e porque essa dica é tão importante.
Temos 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.
A 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.
Entã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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Melhoria%20Cont%C3%ADnua&url=https%3A%2F%2Fdevpleno.com%2Fmelhoria-continua) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmelhoria-continua) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Metas na carreira de desenvolvedor - DevPleno
URL: https://devpleno.com/metas-na-carreira-de-desenvolvedor
> 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...
Metas na carreira de desenvolvedor - DevPleno **
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 anos?**
**Quais conhecimentos quer ter daqui um ano?**
Um 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.
Por 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.
Podemos 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.
Este 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.
Podem 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.
Eu 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.
Para 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.
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.
Deixe sugestões de temas para os próximos posts.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Metas%20na%20carreira%20de%20desenvolvedor&url=https%3A%2F%2Fdevpleno.com%2Fmetas-na-carreira-de-desenvolvedor) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmetas-na-carreira-de-desenvolvedor) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Metodologia ágil: entenda o que é e como se aplica para programadores! - DevPleno
URL: https://devpleno.com/metodologia-agil-entenda-o-que-e-e-como-se-aplica-para-programadores
> 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...
Metodologia ágil: entenda o que é e como se aplica para programadores! - DevPleno **
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.
Estamos falando sobre a metodologia ágil!
Muito 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.
Para evitar que isso aconteça com você, separamos neste artigo algumas informações úteis para o seu trabalho. Confira!
## O que é uma metodologia ágil?
Antes de sair gritando aos sete ventos sobre métodos ágeis, precisamos entender o que eles são. Concorda?
Metodologias á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.
Esse 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.
Assim, 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.
Quer um exemplo legal?
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.
E é 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.
Ficou claro o que é uma metodologia ágil? Então vamos adiante!
## Quais são os valores fundamentais da metodologia ágil?
Em 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:
Indivíduos e interações** mais que processos e ferramentas
**Software em funcionamento** mais que documentação abrangente
**Colaboração com o cliente** mais que negociação de contratos
**Responder a mudanças** mais que seguir um plano
De 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.
Logo, é 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.
## Quais são os benefícios dos métodos ágeis em TI?
Alé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:
**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.
**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.
**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.
**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.
## Quais são as metodologias ágeis que existem?
E, no final das contas, que metodologias ágeis existem?
Na 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!
### 1. Feature Driven Development (FDD)
O 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).
### 2. eXtreme Programming (XP)
O 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.
### 3. Microsoft Solutions Framework (MSF)
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.
### 4. Dynamic System Development Model (DSDM)
O 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.
### 5. Scrum
Mais 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.
Existem 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.
Assim, a medida que cada sprint é feito, outro se inicia. E esse ciclo continua até a conclusão do projeto.
## Gostou das metodologias? Então implemente-as!
Agora 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?
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!
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!
T
Escrito por
Tulio Fa
---
# Metrônomo com JavaScript - DevPleno
URL: https://devpleno.com/metronomo-com-javascript
> 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...
Metrônomo com JavaScript - DevPleno *
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.
Teremos 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.
Em 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).*
<html>
<head>
<tittle>Metronomo</tittle>
</head>
<body>
<input type="range" min="40" max="218" value="40" id="bpm"/>
<audio src="clap.wav"></audio>
<button id="play">Play</button>
</body>
<html>
Ele ficará assim:
Também é interessante colocarmos antes do input um H1 com o número inicial de batida que está configurado.
<h1>40bpm</h1>
Feito 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.
Toda 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.
Primeiro 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.
Nessa função tick, temos que pegar o áudio
<script>
const bpm = document.getElementById('bpm')
const h1 = document.querySelector('h1')
const play = document.getElementByld('play')
const.audio = document.querySelector('audio')
let currentBpm = 40
function tick(){
audio.currentTime= 0
audio.play()
}
bpm.addEventListener('change', function(){
h1.innerHTML = this.value + ' bpm'
currentBpm = parseInt(this.value)
})
play.addEventListener('click', function(){
const timer = setInterval(tick, 100)
})
</script>
Agora 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:
play.addEventListener('click', function () {
const timer = setInterval(tick, (60 * 1000) / currentBpm)
})
Precisamos 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.
<script>
const bpm = document.getElementById('bpm')
const h1 = document.querySelector('h1')
const play = document.getElementByld('play')
const.audio = document.querySelector('audio')
let currentBpm = 40
let isPlaying = false
let timer = null
function tick(){
audio.currentTime= 0
audio.play()
}
bpm.addEventListener('change', function(){
h1.innerHTML = this.value + ' bpm'
currentBpm = parseInt(this.value)
})
play.addEventListener('click', function(){
if(isPlaying){
clearInterval(timer)
} else {
const timer = setInterval(tick, (60*1000)/currentBpm)
}
isPlaying = !isPlaying
})
</script>
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.
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.
play.addEventListener('click', function () {
if (isPlaying) {
play.innerHTML = 'Play'
clearInterval(timer)
} else {
tick()
play.innerHTML = 'Stop'
const timer = setInterval(tick, (60 * 1000) / currentBpm)
}
isPlaying = !isPlaying
})
Para 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.
bpm.addEventListener('change', function () {
h1.innerHTML = this.value + ' bpm'
currentBpm = parseInt(this.value)
if (isPlaying) {
clearInterval(timer)
timer = setInterval(tick, (60 * 1000) / currentBpm)
}
})
Com isso, acabamos de construir um metrônomo.
Essa é uma ideia do que se pode construir com javaScript e HTML. Algumas outras ideias faremos posteriormente.
Confira o passo a passo em vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Metr%C3%B4nomo%20com%20JavaScript&url=https%3A%2F%2Fdevpleno.com%2Fmetronomo-com-javascript) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmetronomo-com-javascript) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Capturando áudio do microfone pelo Navegador - DevPleno
URL: https://devpleno.com/microfone-pelo-navegador
> 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...
Capturando áudio do microfone pelo Navegador - DevPleno
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 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.
Primeiramente vamos acessar o jQuery CDN para conseguirmos copiar o link do jQuery.
Vamos criar um arquivo index.html bem rápido, apenas para começarmos o nosso exemplo:
<html>
<body>
<script
src='https://code.jquery.com/jquery-3.2.1.slim.js'
integrity='sha256-tA8y0XqiwnpwmOIl3SGAcFl2RvxHjA8qp0+1uCGmRmg='
crossorigin='anonymous'
></script>
</body>
</html>
Vou criar um script que vai dentro do próprio body, já que o que importa mesmo é o que estamos executando:
<script>
$(function()
{navigator.mediaDevices.getUserMedia({ audio: true }).then(
(stream) => {
console.log(stream)
},
(err) => {
console.log(err)
}
)})
</script>
Quando temos o getUserMedia, temos uma promise e essa promise pode ser resolvida tendo o stream ou tendo um erro.
Repare 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:
}, err =>{
$('body').append('<p>Você deve permitir o áudio</p>')
})
Eu sempre gosto de definir um mediaRecorder, assim, quando o stream for criado, é criado junto o mediaRecorder:
<script>
$(function(){
let mediaRecorder
navigator
.mediaDevices
.getUserMedia({audio: true})
.then( stream => {
mediaRecorder = new MediaRecorder(stream)
mediaRecorder.ondataavailable = data => {
console.log(data)
}
mediaRecorder.onstop = () => {
console.log('stop')
}
mediaRecorder.start()
setTimeOut(() => mediaRecorder.stop(), 3000)
}, err =>{
console.log(err)
})
})
</script>
Feito 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.
Depois 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:
mediaRecorder = new MediaRecorder(stream)
let chunks = []
mediaRecorder.ondataavailable = (data) => {
chunks.push(data.data)
}
Agora, no Stop, podemos fazer algo para transformar isso em algum dado que podemos utilizar de alguma forma:
mediaRecorder.onstop = () => {
const blob = new Blob(chunks, { type: 'audio/ogg; code=opus' })
const reader = new window.fileReader()
reader.readAsDtaURL(blob)
reader.onloadend = () => {
console.log(reader.result)
}
}
Com isso, ele junta os dados em binário em um só chamado blob. Além disso, utilizamos um reader para gerar um URL.
Ao rodar, perceba que ele converteu para um base 64, que é um texto, ou seja, ele transformou o que era binário em texto.
Por que isso é importante?
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.
Além disso, temos uma outra vantagem, podemos, por exemplo, utilizar a url para dar play no body:
mediaRecorder.onstop = () => {
const blob = new Blob(chunks, { type: 'audio/ogg; code=opus' })
const reader = new window.fileReader()
reader.readAsDtaURL(blob)
reader.onloadend = () => {
const audio = document.createElement('audio')
audio.src = reader.result
audio.controls = true
$('body').append(audio)
}
}
A 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.
Confira o video:
Deixe 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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Capturando%20%C3%A1udio%20do%20microfone%20pelo%20Navegador&url=https%3A%2F%2Fdevpleno.com%2Fmicrofone-pelo-navegador) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmicrofone-pelo-navegador) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Minicurso Socket.IO - Parte 01 - Começando o projeto - DevPleno
URL: https://devpleno.com/minicurso-socket-io-parte-1
> 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. ...
Minicurso Socket.IO - Parte 01 - Começando o projeto - DevPleno **
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.
A primeira coisa que temos que fazer é garantir que o express generator está instalado.
npm install -g express-generator
Esse 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:
express placar-online --ejs
Entã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.
Instalamos depois o yarn:
yarn
Ao dar enter, ele já cria todos nossos arquivos, agora precisamos entrar no diretório do placar-online e damos um start no yarn:
yarn start
Para acessarmos a aplicação, entramos em **localhost:3000**. Nela temos nossa aplicação.
Vamos 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.
Para 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.
Agora vamos abrir o **app.js** e remover o users, já que apagamos o diretório:
var users = require('./routes/users')
app.use('./users', users)
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.
Dentro 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.
**Como foi gerado isso tudo pelo express generator?**
O 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.
Como ele sabe que o index está em views?
Se voltarmos em app.js ele definiu que é um ejs que está dentro de views:
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'ejs')
Se 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:
<p>Olá <%= title %></p>
Agora, 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:
yarn add lowdb
Esse lowdb vai criar um banco novo onde iremos puxar os jogos de lá:
var express = require('express');
var router = express.Router();
//definindo o bd
const low = require('lowdb')
const db = low(__dirname+'/../data/db.json')
const defaultData = require('../data/default-data.json')
db.defaults(defaultData).write()
/\*Get home page. \*/
router.get('/', function(req, res, next){
res.render('index', {title: 'Express'});
});
module.exports = router;
Estamos 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.
Perceba que o db.json está vazio, mas ao darmos um yarn start ele será preenchido com as informações do defaultData.
Nosso 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:
;/\*Get home page. \*/
router.get('/', function (req, res, next) {
const matches = db.get('matches').value()
res.render('index', { matches })
})
module.exports = router
Agora, dentro de index.js, vamos remover o title de todas as linhas de código e adicionar matches dentro do <p>:
<p>Olá <%= matches %></p>
Perceba 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:
<p>Olá <%= JSON.stringfy(matches) %></p>
Então o jogo está funcionando perfeitamente.
Como 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.
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.
Ao atualizar, já temos dois jogos funcionando.
**Como funciona esse template?**
Nó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).
Se 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:
<div class="text-block-5">
<%- match['team-a'].name %>
<%- match['team-b'].name %>
</div>
Um 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.
Se clicarmos em acompanhar agora, ele vai dar um erro, porque não encontrou, obviamente, já que não construímos essa página ainda.
Agora 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:
router.get('/match', function (req, res, next) {
const matches = db.get('matches').value()
const match = db.get('matches[' + req.params.id + ']').value()
res.render('match', { matches, match, id: req.param.id })
})
Ao final, renderizamos o view match e mandamos uma lista para la, matches, match e id.
Ele 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.
**Como ele está colocando esses dados na tela?**
Dentro 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
---
# Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO - DevPleno
URL: https://devpleno.com/minicurso-socket-io-parte-2
> 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 ...
Minicurso Socket.IO - Parte 02 - Adicionando o Socket.IO - DevPleno
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:
yarn add socket.io
Depois 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.
app.io = require('socket.io')()
Feito 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
var server = http.createServer(app)
app.io.attach(server)
Agora ele vai conseguir responder nesse server. De alguma forma, precisamos conectar as coisas, então vamos no partials que já tem algo pronto:
<script src='/socket.io/socket.io.js'></script>
Perceba 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:
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:
$(function)(){
alert(1)
})
Já em match.ejs vamos adicionar o JavaScript lá em baixo, depois de todo o footer:
<% include partials/footer %>
<script src="/js/match.js"></script>
Ao 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:
$(function)(){
const socket = io();
})
Ao 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:
$(function)(){
const socket = io();
socket.on('connect', function(){
console.log('conected');
})
})
Para 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.
Como fazemos isso?
Poderí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:
Se 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:
function indexRouter(dependecies) {}
E lá em baixo ao invés de exportar um router vamos exportar o indexRouter:
module.exports = indexRouter
Voltando a função que acabamos de criar, vamos tirar essa chave e colocar todas as dependencias da pagina dentro:
function indexRouter(dependecies){
//definindo o bd
const low = require('lowdb')
const db = low(__dirname+'/../data/db.json')
const defaultData = require('../data/default-data.json')
db.defaults(defaultData).write()
....
});
return router;
}
Entã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.
Agora temos acesso a essas dependências:
function indexRouter(dependecies){
console.log(dependencies)
//definindo o bd
...
}
Voltando ao app.js vamos fazer o seguinte:
var index = require('./routes/index')({ io: app.io })
O 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.
Ao 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:
//definindo o bd
const low = require('lowdb')
const db = low(__dirname + '/data/db.json')
const defaultData = require('./data/default-data.json')
db.defaults(defaultData).write()
Ele vai quebrar o código, mas fique tranquilo, era para isso acontecer mesmo. Agora vamos enviar o banco para o index.js também
var index = require('./routes/index')({ io: app.io, db })
Agora 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:
const { db, io } = dependencies
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:
io.on('connect', function (socket) {
console.log('a new client conected')
})
Uma coisa interessante do Socket.IO é que ele já tenta a conexão automaticamente.
O ú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.
Em app.js vamos vamos importar o admin nele:
var admin = require('./routes/admin')({ io: app.io, bd })
em seguida vamos linkar ele na aplicação:
app.use('/admin', admin)
Lembrando 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.
Apenas 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.
Dentro 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/:
router.get('/, function(req, res, next){
const matches = db.get('matches').value()
res.render('admin/index, { matches});
});
router.get('/match', function(req, res, next){
const matches = db.get('matches').value()
const match = db.get('matches['+req.params.id+']').value()
res.render('admin/match', { matches, match, id: req.param.id });
});
Fazemos 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 “gera
---
# Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol - DevPleno
URL: https://devpleno.com/minicurso-socket-io-parte-3
> 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...
Minicurso Socket.IO - Parte 3 - Recebendo a notificação de Gol - DevPleno *
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.
A 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.
Primeiramente lá no final, após incluir o footer, vamos adicionar um script:
<script src='/js/admin.js'></script>
Esse 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:
$(function)(){
$("#update-score").click(function(){
alert(1)
return false;
})
});
Agora 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:
$(function)(){
$("#update-score").click(function(){
const scoreA = $("#score-a").val();
const scoreB = $("#score-b").val();
const notify = $("#score-notify").val();
console.log(scoreA, scoreB, notofy)
return false;
})
});
Perceba 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:
const notify = $('#score-notify:checked').val()
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).*
$(function)(){
$("#update-score").click(function(){
const scoreA = $("#score-a").val();
const scoreB = $("#score-b").val();
const notify = $("#score-notify").val();
$.post("/admin/match/0/score", post {
scoreA, scoreB, notify
}, function(data){
console.log(data)
})
return false;
})
});
Ele 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:
router.post('/match/:id/score', function (req, res) {
res.send(req.body)
})
Fizemos 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:
router.post('/match/:id/score', function (req, res) {
db.set(
'matches[' + req.params.id + '].team-a.score',
parseInt(req.body.scoreA)
).write()
db.set(
'matches[' + req.params.id + '].team-b.score',
parseInt(req.body.scoreB)
).write()
io.emit('score', {
match: req.params.id,
scoreA: req.body.scoreA,
scoreB: req.body.scoreB,
notify: req.body.notify || 0
})
res.send(req.body)
})
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:
$(function)(){
const socket = io();
socket.on('connect', function(){
console.log('conected');
})
socket.on('score', function(score){
console.log('score', score)
})
})
Perceba 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.
Vamos copiar esse trecho de código em negrito:
<em class="match-<%- index %>-b">
Agora vamos voltar para nosso match do client em js/match.js e fazer o seguinte:
$(function)(){
const socket = io();
socket.on('connect', function(){
console.log('conected');
})
socket.on('score', function(score){
console.log('score', score)
//na lista de jogos
$(". match-"+score.match+"-a").html(score.scoreA)
$(". match-"+score.match+"-b").html(score.scoreb)
})
})
Perceba 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:
<script>
const MATCH_INDEX = "<%- id %>";
</script>
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:
socket.on('score', function (score) {
console.log('score', score)
//na lista de jogos
$('. match-' + score.match + '-a').html(score.scoreA)
$('. match-' + score.match + '-b').html(score.scoreb)
// atualizar o jogo
if (MATCH_INDEX == score.match) {
$('.score-team-a').html(score.scoreA)
$('.score-team-b').html(score.scoreB)
if (score.notify == '1') {
console.log('notificar')
}
}
})
Se 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:
if (score.notify == '1') {
console.log('notificar')
$('#audio-gol')[0].currentTime = 0
$('audio-gol')[0].play()
}
Por 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
if(score.notify=='1'){
console.log('notificar')
$('#audio-gol')[0].currentTime=0;
$('audio-gol')[0].play();
$('.goooolllll')addClass('goooolllll-anim')
$('.goooolllll-text')addClass('goooolllll-text-anim')
$('.goooolllll-text')on('transitionend webkitTransitionEnd oTransitionEnd', function(){
$('.goooolllll')removeClass('goooolllll-anim')
$('.goooolllll-text')removeClass('goooolllll-text-anim')
})
}
Para 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.
Na 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.
Confira o passo a passo em vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fminicurso-socket-io-parte-3) Copiar
---
# Minicurso Socket.IO Parte 4 - Separando notificações por Rooms - DevPleno
URL: https://devpleno.com/minicurso-socket-io-parte-4
> 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....
Minicurso Socket.IO Parte 4 - Separando notificações por Rooms - DevPleno **
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.
Dentro 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:
<div class="bar-team-a" style="width: 80%"></div>
<div class="bar-team-b" style="width: 20%"></div>
Precisamos 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:
const supportersA = match['team-a'].supporters
const supportersB = match['team-b'].supporters
const total = supportersA + supportersB
const porcentagem = {
teamA: 50,
teamB: 50
}
if (total > 0) {
porcentagem.teamA = ((supportersA / total) * 100).toFixed(0)
porcentagem.teamB = ((supportersB / total) * 100).toFixed(0)
}
match.porcentagem = porcentagem
Entã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.
Voltando ao match.ejs, temos que colocar os valores lá dentro:
<div class="bar-team-a" style="width: <%- JSON.stringfy(match.porcentagem.teamA) %>%"></div>
<div class="bar-team-b" style="width: <%- JSON.stringfy(match.porcentagem.teamB) %>%"></div>
Pronto, 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.
Nos botões das torcidas, vamos colocar um ID para cada:
<div class"column w-col w-col-2"><a class="button w-button" id="na-torcida-a" href="#"/> Na torcida </div>
<div class"column w-col w-col-2"><a class="button w-button" id="na-torcida-b" href="#"/> Na torcida </div>
Agora 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:
$("#na-torcida-a").click(function(){
$.post("/match/")+MATCH_INDEX+"/supporters", { team: 'a'}, function(data){})
return false;
}
$("#na-torcida-a").click(function(){
$.post("/match/")+MATCH_INDEX+"/supporters", { team: 'b'}, function(data){})
return false;
}
Ao 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’:
router.post('/match/:id/supporters', function(req, res, next){
const match = db.get('matches['+req.params.id+']).value()
if(req.body.team==='a'){
const newValue = match['team-a'].supporters+1
db.set('matches['+req.params.id+'].team-a.supporters', newValue).write()
}
if(req.body.team==='b'){
const newValue = match['team-b'].supporters+1
db.set('matches['+req.params.id+'].team-b.supporters', newValue).write()
}
res.send({ ok: true })
})
Perceba 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.
Agora 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.
Temos 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.
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.
També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:
$function(){
const socket = io('', { query: { match: MATCH_INDEX}});
...
}
Perceba que agora no route/index.js, quando o usuário conectar, vamos colocar ele na sala:
io.on('connect', function (socket) {
if (socket.handshake.query.match) {
console.log('user connnected on match', socket.handshake.query.match)
socket.join('match-' + socket.handshake.query.match)
} else {
console.log('a new client connected')
}
})
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.
Continuando em routes/index.js, na hora de atualizar nossos supporters vamos pegar a nossa porcentagem e mandar via Socket.IO:
router.post('/match/:id/supporters', function(req, res, next){
const match = db.get('matches['+req.params.id+']').value()
if(req.body.team==='a'){
const newValue = match['team-a'].supporters+1
db.set('matches['+req.params.id+'].team-a.supporters', newValue).write()
}
if(req.body.team==='b'){
const newValue = match['team-b'].supporters+1
db.set('matches['+req.params.id+'].team-b.supporters', newValue).write()
}
const supportersA = match.['team-a'].supporters
const supportersB = match.['team-b'].supporters
const total = supportersA+supportersB
const porcentagem = {
teamA: 50,
teamB: 50
}
if(total > 0){
porcentagem.teamA = ((supportersA / total) * 100).toFixed(0)
porcentagem.teamB = ((supportersB/ total) * 100).toFixed(0)
}
io.to('match-'+req.paramns.id).emit('supporters'), porcentagem)
res.send({ ok: true })
})
Como 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:
socke.on('supporters', function (supporters) {
console.log(supporters)
})
Com 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:
socke.on('supporters', function (supporters) {
console.log(supporters)
$('.bar-team-a').css('width', supporters.teamA + '%')
$('.bar-team-b').css('width', supporters.teamB + '%')
})
Perceba 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.
Agora precisamos fazer a atualização dos vídeos e do lance a lance.
Se 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
---
# Minicurso Socketio - Parte 05 - Colocando o projeto no ar - DevPleno
URL: https://devpleno.com/minicurso-socket-io-parte-5
> 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...
Minicurso Socketio - Parte 05 - Colocando o projeto no ar - DevPleno **
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.
A 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.
Eu 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.
Vou 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:
E no tamanho da máquina eu vou escolher a de 5 colares:
Eu 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.
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.
Em 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.
E no nome vou colocar placar-online.
Em 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.
Vamos 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.
Se você estiver utilizando o comander no Windows, é possível fazer da mesma forma que vamos fazer agora.
Vamos lá, primeiro damos o comando:
SSH root@IpDoServidor
Lembrando 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).
Agora 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.
Por 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:
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.
Voltando ao shell, depois que todos os arquivos forem upados, vou dar um **npm install** apenas para instalar as dependências.
Agora já temos o projeto rodando, vamos checar se ele está rodando realmente:
node bin/www
como ele está com a saída vazia vamos fazer:
PORT= 80 npm start
Agora vou abrir o navegador e verificar se está realmente rodando:
Está 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:
npm install -g pm2
O pm2 é um pacote do npm que permite startar serviços como serviços do linux.
Agora 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:
{
"script": "bin/www",
"env":{
"PORT": 80,
"NODE_ENV": "production"
}}
Então vou criar um Json com um script que é um env com duas propriedades dentro.
Agora faremos **pm2 start start.json**, perceba que ele já startou o próprio json:
A vantagem é que pelo pm2 eu consigo ver como ele está utilizando o **pm2 status**
Uma dica adicional: se quiser parar o serviço, digite:
pm2 stop all
Se 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.
Podemos 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).
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fminicurso-socket-io-parte-5) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Módulo Co - Organize o fluxo de seu código assíncrono - DevPleno
URL: https://devpleno.com/modulo-co
> 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...
Módulo Co - Organize o fluxo de seu código assíncrono - DevPleno
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:
yarn add co
O 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:
No 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.
const co = require('co')
const fs = require('fs')
function readFile(file) {
fs.readFile(file, 'utf-8', function (err, data) {
console.log(data)
})
}
readFile('yarn.lock')
Teoricamente, 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:
function readFile(file){
return new promise(function(resolve, reject){
fs.readFile(file, 'utf-8', function(err, data){
if(err){
reject(err)
}else{
resolve(data)
}
})
})
}
readFile('yarn.lock')
.then(function(data)){console.log(data)})
Estamos 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.
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:
function readFile(file) {
return new promise(function (resolve, reject) {
fs.readFile(file, 'utf-8', function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
co(function* () {
const contents = yield readFile('yarn.lock')
console.log(contents)
})
Como 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ó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:
co(function* () {
const file = ['yarn.lock', 'package.json']
for (let i = 0; i < file.length; i++) {
let contents = yield readFile(file[i])
console.log(contents)
}
})
Executando 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.
co(function* () {
const file = ['yarn.lock', 'package.json']
const filePromises = []
for (let i = 0; i < file.length; i++) {
filePromises.push(readFile(file[i]))
}
const contents = yield filePromises
console.log(contents)
})
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.
Agora entenda melhor sobre [Generators Functions e tudo que acontece “por baixo dos panos”.](https://www.devpleno.com/generators-functions/)
Confira o Hands-on em vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmodulo-co) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# NodeJS Primeiros Passos: Módulo em NodeJS - DevPleno
URL: https://devpleno.com/modulos
> 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...
NodeJS Primeiros Passos: Módulo em NodeJS - DevPleno **
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 funcionais do código.
Vamos fazer um teste simples apenas para testar o require, que é a forma de importar esse módulo.
Crie um novo arquivo no Node e coloque um nome qualquer, o meu será modulo01.js, esse arquivo será meu módulo, dentro dele terá:
console.log('Dentro do modulo')
Salve e crie um novo arquivo chamado app.js. Nele vamos fazer o seguinte:
require('./modulo01')
Ao executar o app.js, o require chama o modulo01 e apresenta a frase do nosso arquivo modulo01.js
O 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.
Para fazermos uma funcionalidade um pouco melhor, podemos falar para esse módulo exportar, por exemplo, um contar:
var contador = 0
module.exports.contar = function () {
contador++
console.log(contador)
}
Com isso estamos expondo um pedaço do nosso módulo para o que está externo, criando uma pequena interface chamada contar.
Quando fizermos o require do módulo no app.js, podemos atribuir ele a uma variável:
var m1 = require('./modulo01')
m1.contar()
Assim o m1 recebe uma self invoking e conseguimos ter acesso ao contar que expomos para o que está externo.
Um exemplo que podemos fazer é o seguinte:
var m1 = require('./modulo01')
m1.contar()
var m2 = require('./modulo01')
m2.contar()
O 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.
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:
var modulo02 = function (initialValue) {
var contador = initialValue
return {
contar: function () {
contador++
},
escrever: function () {
console.log(contador)
}
}
}
module.exports = modulo02
Essa 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.
A primeira vai só incrementar, a segunda function só escreve e finalmente vamos expor o nosso módulo todo para o ‘mundo’.
Agora, indo para o app02.js, faremos o seguinte:
var m1 = require('./modulo02')
Se 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:
var m1 = require('./modulo02')(1)
var m2 = require('./modulo02')(2)
m1.contar()
m2.escrever()
Fazendo isso, isolamos os 2 módulos através de uma closer, que é muito semelhante a uma classe.
Terí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.
var modulo02 = function (initialValue) {
//atributos
var contador = initialValue
//metodo privado
var ooo = function () {}
//metodos publicos
return {
contar: function () {
contador++
},
escrever: function () {
console.log(contador)
}
}
}
Isso seria um constructor porque ele consegue definir os valores iniciais e seria executado quando instanciamos o módulo.
Essa é uma das maneiras que temos de organizar módulos, vamos falar mais sobre isso posteriormente.
Confira a explicação completa em vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20M%C3%B3dulo%20em%20NodeJS&url=https%3A%2F%2Fdevpleno.com%2Fmodulos) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmodulos) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Mono ou multi thread - POO para JS - DevPleno
URL: https://devpleno.com/mono-ou-multi-thread-poo-para-js
> 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 ...
Mono ou multi thread - POO para JS - DevPleno
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.
Mais 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.
O que fazemos com concorrência em Java?
Nós criamos o que chamamos de threads, que é uma linha de execução. Por exemplo, se eu criar algo
como:
const a = 1
const b = 10
Essa 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.
É 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.
Já 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:
const a = 1
const b = 2
Quando 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.
Por que isso é tão importante?
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.
Para evitar que nosso programa trave no tempo que está executando uma linha de código, podemos utilizar o seguinte:
const fs = require('fs')
const a = 1
const b = 2
console.log('inicio')
fs.readdir('./', (err, files) => console.log(files))
console.log('fim')
Com 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.
Agora 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.
Para 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.
Temos uma função producer, que é a que produz, e uma função consumer, onde consome algo:
const stock = \[\]
function producer() {}
function consumer() {}
Entã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:
const stock = \[\]
function producer(){
console.log('producer')
setTimeOut(producer, Math.ceil(Math.random()\*3000))
}
function consumer(){
console.log('consumer')
setTimeOut(consumer, Math.ceil(Math.random()\*3000))
}
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.
Com isso vamos mandar produzir pelo menos um e começar a consumir:
producer()
consumer()
Agora, quando quisermos produzir, vamos colocar no stock:
const stock = \[\]
function producer(){
console.log('producer', stock.length)
stock.push(Math.random()\*100)
setTimeOut(producer, Math.ceil(Math.random()\*3000))
}
Agora eu preciso consumir esse valor:
function consumer(){
const item = stock\[stock.length-1\]
stock.splice(stock.length-1, 1)
console.log('consumer', stock.length)
setTimeOut(consumer, Math.ceil(Math.random()\*3000))
}
Se tentarmos consumir e não tiver no estoque, não vai dar certo, então podemos fazer o seguinte:
function consumer(){
if(stock.length===0){
console.log('não foi possível consumir')
} else {
const item = stock\[stock.length-1\]
stock.splice(stock.length-1, 1)
console.log('consumer', stock.length)
}
setTimeOut(consumer, Math.ceil(Math.random()\*3000))
}
Com isso temos uma sensação de que estão trabalhando separadamente, mas na verdade estamos empilhando e depois desempilhando após um tempo aproximado.
Por que é importante saber que isso acontece?
Porque basicamente qualquer operação pesada acontece de forma assíncrona.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmono-ou-multi-thread-poo-para-js) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express - DevPleno
URL: https://devpleno.com/morgan
> 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.
O Que é Morgan no Node.js? Guia Prático de HTTP Logging com Express - DevPleno
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.
A primeira coisa que temos que fazer é adicionar as dependências:
yarn add express morgan
Eu já tenho um arquivo teste criado e vou começar a importar o que precisamos:
const express = require('express')
const morgan = require('morgan')
const app = express()
app.get('/', (req, res) => {
res.send('olá DevPleno')
})
app.listen(3000, () => console.log('listenning'))
Agora vamos colocar o Morgan como um Middleware e ele vai interceptar toda a requisição que chegar:
app.use(morgan('combined'))
Perceba que, ao dar F5 na página, ele traz as informações:
Isso é 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:
app.use(morgan('tiny'))
Nele temos um retorno mais simples, o método, saída e tempo de resposta. Ainda temos uma terceira forma, que é um padrão personalizado:
app.use(morgan(':method :url :response-time'))
Lembrando que, pela Amazon, você pode guardar isso enviando para o S3. Indo para lá, você pode guardar essas informações por muito tempo.
Essa é 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmorgan) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Morro de vontade... - DevPleno
URL: https://devpleno.com/morro-de-vontade
> 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...
Morro de vontade... - DevPleno
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…
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Morro%20de%20vontade...&url=https%3A%2F%2Fdevpleno.com%2Fmorro-de-vontade) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmorro-de-vontade) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Multer upload de imagens com nodejs e express - DevPleno
URL: https://devpleno.com/multer-upload-de-imagens-com-nodejs-e-express
> 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...
Multer upload de imagens com nodejs e express - DevPleno
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 fazer é o seguinte:
yarn add express ejs multer
Agora, 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:
const express = require('express')
const app = express()
app.set('view-engine', 'ejs')
app.get('/', (req, res) => res.render('home'))
app.post('/', (req, res) => {
console.log(req.body, req.files)
res.send('ok')
})
app.listen(3000, () => console.log('running...'))
Já dentro de home.ejs vai ter o seguinte:
<h1>Upload</h1>
<form method="post" ectype="multipart/form-data">
<input type="file" name="img" />
<button type="submit">Enviar</button>
</form>
O ‘enctype=”multipart/form-data”’ significa que vamos mandar os campos em vários formatos.
Quando 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.
O multer é um middleware, por esse motivo conseguimos rodar antes da requisição:
const express = require('express')
const app = express()
const multer = require('multer')
const upload = multer({ dest: 'uploads/' })
app.set('view-engine', 'ejs')
app.get('/', (req, res) => res.render('home'))
app.post('/', upload.single('img'), (req, res) => {
console.log(req.body, req.file)
res.send('ok')
})
app.listen(3000, () => console.log('running...'))
Reparem 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ós conseguimos controlar também qual o nome que vamos dar para essa imagem.
Podemos criar um diskStorage, ele é um objeto que tem duas keys, destination que é onde eu vou salvar. Além disso, posso pegar um filename:
const express = require('express')
const app = express()
const multer = require('multer')
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/')
},
filename: (req, file, cb) => {
cb(null, Date.now() + '-' + file.ogirinalname)
}
})
const upload = multer({ storage })
Nó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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmulter-upload-de-imagens-com-nodejs-e-express) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 17 de out. de 2017 FS-Watch - Checando mudanças em um arquivo-diretório](/fs-watch)
---
# Sobreviver em um mundo de abundância - DevPleno
URL: https://devpleno.com/mundo-de-abundancia
> 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 ...
Sobreviver em um mundo de abundância - DevPleno
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 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.
Eu 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:
“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.”
Isso é 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.
Depois 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Sobreviver%20em%20um%20mundo%20de%20abund%C3%A2ncia&url=https%3A%2F%2Fdevpleno.com%2Fmundo-de-abundancia) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fmundo-de-abundancia) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Trabalhar na Toptal ou por meio da Toptal? - DevPleno
URL: https://devpleno.com/na-toptal-ou-por-meio-da-toptal
> 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:
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...
Navigator Geolocation API - Sabendo a localização do usuário - DevPleno
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.
Alguns dos métodos que eles têm:
<html>
<body>
<script>
if('geolocation' in navigator){} else {Alert('ops')}
</script>
</body>
</html>
A partir disso, conseguiríamos checar a nossa localização. Podemos, por exemplo, fazer:
if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition(
function (position) {
console.log(position)
},
function (error) {
Console.log(error)
}
)
} else {
Alert('ops')
}
Ao rodar o código e inspecionar, perceba que ele retorna a nossa posição.
Se 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.
Outra coisa bem interessante é que podemos checar, de tempos em tempos, a posição do usuário, fazendo um tracker, por exemplo:
watcher: navigator.geolocation.watchPosition(function (position) {
console.log(position)
})
Agora, à medida que essa coordenada ficar mais precisa, vai ser melhor, pois ela vai nos trazendo essas informações.
Conseguimos aumentar essa precisão também utilizando o enableHighAccuracy:
watcher: navigator.geolocation.watchPosition(
function (position) {
console.log(position)
},
function (error) {
console.log(error)
},
{ enableHighAccuracy: true, maximumAge: 30000, timeout: 30000 }
)
No caso do watcher, podemos apagar, equivalente ao que podemos fazer com o clear interval:
Geolocation.clearWatch(watcher)
Esse é 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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnavigator-geolocation) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Como fazer Networking corretamente - DevPleno
URL: https://devpleno.com/networking
> 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...
Como fazer Networking corretamente - DevPleno **
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ático?**
É 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.
**Como fazer Networking?**
A resposta mais simples é: NÃO faça networking! Se você tem na sua cabeça que precisa fazer isso, você não está fazendo.
A 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.
Um 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.
Por 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.
Isso é networking! Gerar valor, não tentar fazer networking pedindo algo à pessoa logo após entregar um cartão.
Nã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?
Deixe suas 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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Como%20fazer%20Networking%20corretamente&url=https%3A%2F%2Fdevpleno.com%2Fnetworking) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnetworking) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Networking da maneira certa - DevPleno
URL: https://devpleno.com/networking-da-maneira-certa-carreira
> É 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...
Networking da maneira certa - DevPleno
É 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Networking%20da%20maneira%20certa&url=https%3A%2F%2Fdevpleno.com%2Fnetworking-da-maneira-certa-carreira) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnetworking-da-maneira-certa-carreira) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Qual o nível de inglês para trabalhar por meio da Toptal? - DevPleno
URL: https://devpleno.com/nivel-de-ingles-para-a-toptal
> 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...
Qual o nível de inglês para trabalhar por meio da Toptal? - DevPleno
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.
Atualmente 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)
[](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnivel-de-ingles-para-a-toptal) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas - DevPleno
URL: https://devpleno.com/nodejs-primeiros-passos-async-como-controlar-operacoes-assincronas
> 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...
NodeJS Primeiros Passos: Async - Como Controlar Operações Assíncronas - DevPleno
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-como-controlar-operacoes-assincronas) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)
[Javascript · 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)
[Javascript · 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)
---
# NodeJS Primeiros Passos: Async - Map - DevPleno
URL: https://devpleno.com/nodejs-primeiros-passos-async-map
> 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...
NodeJS Primeiros Passos: Async - Map - DevPleno
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20Async%20-%20Map&url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-map) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fnodejs-primeiros-passos-async-map) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)
[Javascript · 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)
[Javascript · 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)
---
# NodeJS Primeiros Passos: Async - Waterfall - DevPleno
URL: https://devpleno.com/nodejs-primeiros-passos-async-waterfall
> 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:
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
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" :)
A área de tecnologia da informação oferece muitas oportunidades e, para aproveitálas, o profissional deve se preparar continuamente. Para tanto, o desenvol...
- Por que fazer um curso de programação voltado para a prática? - DevPleno
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.
Poré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.
O 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.
Para 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.
Outo [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.
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á!
## Para conhecer as tecnologias usadas pelas empresas
Quando 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.
Entre as competências que se pode exigir de um desenvolvedor para que entre um projeto, normalmente podemos encontrar:
### Para desenvolvimento de front-end:
conhecimento em html5, css3 e javascprit;
-
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.
-
pelo menos um conhecimento básico de sistemas para tratamento de imagens e criação de vetores.
### Já para o desenvolvimento de back-end:
-
conhecimento aprofundado em pelo menos uma linguagens de back-end, como NodeJS, Java, Python, PHP, C# etc;
-
em relação à linguagem que será trabalhada, é importante ter pelo menos um Framework , como Spring, Django, Laravel, ExpressJS;
-
bancos de dados SQL e NoSql;
-
sistemas operacionais.
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.
Realmente 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.
## Para ter um visão de projeto
O 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.
Cabe 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.
Está 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.
També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.
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.
Saber 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.
## Para saber lidar com as necessidades dos clientes
Quem 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.
Há 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.
Assim, é 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.
## Para aumentar a qualidade do projeto
Alé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.
Existem 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.
## Para conhecer ferramentas de configuração do ambiente de desenvolvimento
Para 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.
Quer 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 NodeJ
---
# Por que todo Dev usa Mac? - DevPleno
URL: https://devpleno.com/por-que-todo-dev-usa-mac
> 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 é ...
Por que todo Dev usa Mac? - DevPleno **
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 é 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.
Por que eu uso MAC?**
Eu 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.
Se 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?
Outro 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.
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.
Mas 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.
Caso 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. :)
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpor-que-todo-dev-usa-mac) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Por que tudo na vida acontece 2x? - DevPleno
URL: https://devpleno.com/por-que-tudo-na-vida-acontece-2x
> 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.
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...
Postman - Como testar APIs - Hands-on - DevPleno *
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.
O 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.
Primeiro precisamos criar uma conta para ser possível salvar links. Você vai encontrar uma tela parecida com essa:
Como eu já havia criado e feito alguns testes, já tem um histórico do lado, mas o seu estará vazio.
Perceba 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.
Isso 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).
Podemos criar, por exemplo, uma pasta Users e salvar a requisição dentro.
Vou 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.
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.
Se 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:
Vamos 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.
Vamos 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.
Perceba que o POST suporta body, então é possível mandar dados para ele. Vou mandar um name e enviar Tulio:
O form retorna com o valor que coloquei.
Também podemos enviar um arquivo apenas mudando o text para file.
Temos 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.
Confira todos detalhes no vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Postman%20-%20Como%20testar%20APIs%20-%20Hands-on&url=https%3A%2F%2Fdevpleno.com%2Fpostman-como-testar-apis) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpostman-como-testar-apis) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Precificação de softwares: você sabe como fazer? - DevPleno
URL: https://devpleno.com/precificacao-de-softwares-voce-sabe-como-fazer
> Um dos desafios de quem trabalha na área de tecnologia, especificamente em desenvolvimento de programas, é a precificação de softwares. Por envolver ativos...
- Precificação de softwares: você sabe como fazer? - DevPleno
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.
Para 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).
Portanto, se você quer saber o que considerar nesse processo, continue lendo e veja nossas dicas!
## Como precificar um software?
É 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.
É 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).
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.
## Quais os critérios para precificar um software?
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:
### Tempo
A 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.
Para 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.
Alé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.
### Disponibilidade
A 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.
Nesse ponto, há um porém: existem momentos em que há poucos projetos, mas porque são períodos de transição de trabalhos.
### Nível de experiência
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.
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.
Alé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.
### Valor agregado
Para 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.
É 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.
### Os custos envolvidos
Como 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.
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.
### Os impostos
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.
## Como explicar o valor do software para o cliente?
A 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.
É 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.
També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:
os preços praticados pelo mercado;
-
os gastos com mão de obra não só sua, mas de outros profissionais caso tenha sido preciso contratá-los;
-
a experiência necessária para o desenvolvimento do software;
-
o tempo de trabalho exigido, especialmente se foi necessário trabalhar em feriados e fins de semana, até mesmo de noite;
-
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.
## Qual a diferença entre precificação de softwares e de outros tipos de produto?
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.
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.
Por 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 comprome
---
# Dica: Precificação em Software - DevPleno
URL: https://devpleno.com/precificacao-em-software
> 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...
Dica: Precificação em Software - DevPleno
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Dica%3A%20Precifica%C3%A7%C3%A3o%20em%20Software&url=https%3A%2F%2Fdevpleno.com%2Fprecificacao-em-software) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprecificacao-em-software) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Precisa ter diploma para trabalhar por meio da Toptal? - DevPleno
URL: https://devpleno.com/precisa-ter-diploma-para-a-toptal
> Você não é graduado, mas quer trabalhar por meio da Toptal? Entenda se isso é possível ou não neste vídeo:
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...
Preconceito com JS? Não preparado para corporativo? - DevPleno
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.
Por que isso acontece?
Principalmente 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.
Outra coisa que está quebrando essa barreira é o tooling, muitas das ferramentas que utilizamos hoje é construído com o NODE e baseado no NPM.
Mas 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.
Uma 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpreconceito-com-js-nao-preparado-para-corporativo) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
[Javascript · 05 de out. de 2017 Dicas utilizando o Split em Strings](/split-em-strings)
---
# Preview de imagens antes do upload - DevPleno
URL: https://devpleno.com/preview-de-imagens-antes-do-upload
> 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...
Preview de imagens antes do upload - DevPleno
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.
Vamos criar inicialmente um html, em seguida criar um input type do tipo file e um img:
<html>
<head>Preview Upload</head>
<body>
<input type='file' id='upload' />
<img id='img' />
<script
src='https://code.jquery.com/jquery-3.2.1.slim.js'
integrity='sha256-tA8y0XqiwnpwmOIl3SGAcFl2RvxHjA8qp0+1uCGmRmg='
crossorigin='anonymous'
></script>
</body>
</html>
Agora vamos abrir uma tag script nele. Quando o documento estiver pronto e for feito um change, vamos fazer um console.log this:
<script>
$(function()
{$('#upload').change(function () {
console.log($(this)[0].files)
})})
</script>
Assim 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:
<script>
$(function()
{$('#upload').change(function () {
const file = $(this)[0].files[0]
const fileReader = new fileReader()
fileReader.onLoadend = function () {
console.log(fileReader.result)
}
fileReader.readAsDataURL(file)
})})
</script>
Como a imagem gera uma URL válida, se eu colocá-lo como source da imagem, ele vai dar um preview.
<script>
$(function(){
$('#upload').change(function(){
const file = $(this)[0].files[0]
const fileReader = new fileReader()
fileReader.onLoadend = function(){
$('#img')attrib('src', .fileReader.result)
}
fileReader.readAsDataURL(file)
})
})
</script>
Isso é 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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Preview%20de%20imagens%20antes%20do%20upload&url=https%3A%2F%2Fdevpleno.com%2Fpreview-de-imagens-antes-do-upload) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpreview-de-imagens-antes-do-upload) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Primeiros passos na Toptal – Série Trabalho Remoto - DevPleno
URL: https://devpleno.com/primeiros-passos-na-toptal
> Depois de passar pelo processo seletivo da Toptal, quais são os primeiros passos? Descubra neste vídeo.
Seu objetivo é trabalhar remotamente por meio da Toptal? Neste vídeo, você vai entender como funciona o processo seletivo.
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...
Programação Assíncrona - NodeJS Primeiros Passos - DevPleno **
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.
Por que o assíncrono é tão interessante?**
Quando 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.
Como 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.
var fs = require('fs')
var contents = fs.readFileSyinc('dados.txt', 'utf8')
console.log(contents)
Vamos salvar como Sync.js e mandar rodar usando o comando
node sync.js
Perceba 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.
Vamos fazer um exemplo com Assíncrono para que fique mais claro:
var fs = require('fs');
fs.readFile('dados.txt', 'utf8'), function (err, contents){
console.log(contents)
});
console.log('continuar...')
Vamos salvar como async.js. Note que eu passo como parâmetro para essa instrução um callback.
**O que faz uma função de callback?**
Essa 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.
No 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.
Isso é 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.
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.
Confira o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprogramacao-assincrona) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)
[Javascript · 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)
[Javascript · 04 de mai. de 2017 Promisify-Node: Convertendo funções clássicas do Node em Promises](/promisify-node)
---
# Qual o projeto certo para estudar programação? - DevPleno
URL: https://devpleno.com/projeto-certo-para-estudar-programacao
> 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 ...
Qual o projeto certo para estudar programação? - DevPleno
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?
É 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?”
Neste post, listamos três formas para continuar desenvolvendo aplicações e manter o seu ritmo de estudo em programação.
### 1) Faça um projeto social
A 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:
Vá 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;
Vá 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;
Vá a uma ONG de proteção aos animais e veja se eles têm algum site ou meio de divulgar o seu trabalho.
Outro 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.
### 2) Inspire-se em soluções do mercado
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.
Uma 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.
### 3) Crie um projeto de sua autoria
Nã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!
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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fprojeto-certo-para-estudar-programacao) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Promise Constante - como criar situações assíncronas de teste - DevPleno
URL: https://devpleno.com/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste
> 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...
Promise Constante - como criar situações assíncronas de teste - DevPleno
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:
const fs = require('fs')
const readdir = (path) =>
new Promise((resolve, reject) => {
fs.readdir(path, (err, list) => {
if (err) {
reject(err)
} else {
resolve(list)
}
})
})
Agora imagine que temos uma outra função chamada path, que é assíncrona:
const functA = (path) => {
const list = await readdir(path)
console.log(list)
}
Se nós quiséssemos, por exemplo, testar essa função, rodaríamos o funcA:
funcA('./')
Ela 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.
Quando queremos ter uma promise que é uma constante para a situação que estamos utilizamos, podemos fazer o seguinte:
const readdir = (path) => Promise.resolve(['arquivo1.txt', arquivo2.txt])
Ele 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.
Quando estamos aprendendo programação assíncrona e queremos fazer esses testes, isso é muito interessante.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpromise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Promise Race - Qual promise resolve/rejeita primeiro - DevPleno
URL: https://devpleno.com/promise-race
> 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...
Promise Race - Qual promise resolve/rejeita primeiro - DevPleno
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:
const p = (time, name) => {
return new Promise((resolve, reject) => {
setTimeOut(() => resolve(time + ' ' + name), time)
})
}
p(100, 'opa').then((e) => console.log(e))
Ao 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:
const os = [P(100, 'opa'), P(200, 'opa2')]
Promise.race(os).then((e) => console.log(e))
Ao 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:
Promise.all(os).then((e) => console.log(e))
Assim vamos ter todos os retornos, ao contrário do race.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Promise%20Race%20-%20Qual%20promise%20resolve%2Frejeita%20primeiro&url=https%3A%2F%2Fdevpleno.com%2Fpromise-race) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpromise-race) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# NodeJS Primeiros Passos - Promises - DevPleno
URL: https://devpleno.com/promises
> Continuando nosso assunto sobre NodeJS, vamos tratar sobre como podemos organizar o fluxo para que o código fique realmente organizado. Olhe esse exemplo: ...
NodeJS Primeiros Passos - Promises - DevPleno **
Continuando nosso assunto sobre NodeJS, vamos tratar sobre como podemos organizar o fluxo para que o código fique realmente organizado. Olhe esse exemplo:
var fs = require('fs')
fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {
fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {
fs.readFile('arquivo3.txt', arquivo1 + '\\n' + arquivo2, function (err) {
console.log('tudo certo')
})
})
})
Aqui 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’.
npm install q
No 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á:
var Q = require('q')
var fs = require('fs')
function readArquivo1() {
fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {})
}
function readArquivo2() {
fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {})
}
function readArquivo3() {
fs.readFile('arquivo3.txt', arquivo1 + '\\n' + arquivo2, function (err) {})
}
Vamos 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:
function readArquivo1(){
... <linha1>
fs.readFile('arquivo1.txt', 'utf8', function(err, arquivo1){
});
...< linha 2>
}
Não é muito bem isso que queremos, afinal queremos um atrás do outro, então podemos fazer o seguinte:
function readArquivo1() {
var deferred = '.defer()'
fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {
deferred.resolve(arquivo1)
})
return deferred.promise
}
Perceba 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):
function readArquivo1() {
var deferred = '.defer()'
fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {
deferred.resolve(arquivo1)
})
return deferred.promise
}
function readArquivo2() {
var deferred = '.defer()'
fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {
deferred.resolve(arquivo2)
})
return deferred.promise
}
function readArquivo3() {
var deferred = '.defer()'
fs.readFile('arquivo3.txt', arquivo1 + '\\n' + arquivo2, function (err) {
deferred.resolve()
})
return deferred.promise
}
readArquivo1().then(function (arquivo1) {
console.log(arquivo1)
})
O 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:
var conteudo = ''
readArquivo1()
.then(function (arquivo1) {
conteudo += arquivo1
return readArquivo2()
})
.then(function (arquivo2) {
conteudo += arquivo2
console.log(conteudo)
})
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.
function readArquivo3(conteudo){
var deferred = ".defer()";
fs.readFile('arquivo3.txt', conteudo, function(err){
deferred.resolve();
});
return deferred.promise;
}
var conteudo="";
readArquivo1()
.then(function(arquivo1){
conteudo+= arquivo1;
return readArquivo2();
}).then(function(arquivo2){
conteudo+= arquivo2;
return writeArquivo3(conteudo)
}).then(function())
console.log('tudo certo');
});
Perceba 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:
readArquivo1().then(readArquivo2).then(readArquivo2)
Ele 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.
Confira todos os detalhes no vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%20-%20Promises&url=https%3A%2F%2Fdevpleno.com%2Fpromises) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpromises) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)
[Javascript · 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)
[Javascript · 04 de mai. de 2017 Promisify-Node: Convertendo funções clássicas do Node em Promises](/promisify-node)
---
# Promisify-Node: Convertendo funções clássicas do Node em Promises - DevPleno
URL: https://devpleno.com/promisify-node
> 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...
Promisify-Node: Convertendo funções clássicas do Node em Promises - DevPleno **
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.
Então por que usar o Promisify-Node?**
Ele tem uma funcionalidade bastante relevante que vou mostrar durante o hands-on, vamos lá. Para instalar e adicionar como dependência o Promisify-Node:
yarn add promisify-node
Vamos importar o promisify e o fs(file system) para termos uma função com o callBack.
const promisify = require('promisify-node')
const fs = require('fs')
Se fossemos utilizar o fs normalmente, iriamos fazer o seguinte:
fs.readFile('arquivo.js', (err, data) => console.log(data.toString()))
Entã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.
Podemos pegar essa função fs.readFile, criar uma nova readFile e passar para promisify, assim:
const readFile = promisyfy(fs.readFile)
**Qual a diferença?**
Agora eu posso chamar a readFile, falar qual arquivo eu quero (no caso o arquivo.js) e chamar ele no modo promisify.
readFile('arquivo.js').then((data) => console.log(data.toString()))
**Qual a vantagem?**
Alé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.
També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:
const fs = promisify('fs')
E, assim, qualquer função que eu for utilizar, como por exemplo:
fs.readFile('arquivo.js', (err, data) => console.log(data.toString()))
Já irá virar naturalmente uma promise, com isso posso fazer:
fs.readFile('arquivo.js').then((data) => console.log(data.toString()))
Convertendo todos os métodos e funções disponíveis dentro desse módulo, de callback para promise.
**Concluindo**
Ainda 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.
Você também pode conferir o passo a passo desse hands-on por vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpromisify-node) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 27 de jun. de 2017 NodeJS Primeiros Passos - Promises](/promises)
[Javascript · 16 de jun. de 2017 Programação Assíncrona - NodeJS Primeiros Passos](/programacao-assincrona)
[Javascript · 25 de mai. de 2017 Escopos e Closures - NodeJS Primeiros Passos](/escopos-e-closures)
---
# Pure Functions (Funções Puras) - DevPleno
URL: https://devpleno.com/pure-functions-funcoes-puras
> 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 ...
Pure Functions (Funções Puras) - DevPleno
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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fpure-functions-funcoes-puras) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# As vantagens do Javascript em todas as camadas de uma aplicação - DevPleno
URL: https://devpleno.com/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao
> 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...
As vantagens do Javascript em todas as camadas de uma aplicação - DevPleno
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 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.
Neste 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.
## O que são exatamente as camadas de uma aplicação?
Também chamadas de stacks, as camadas de uma aplicação são simplesmente o front-end e o back-end de uma aplicação.
E 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.
Já 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.
Existem 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.
Um 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.
## O que são Node.js + Express + EJS + MongoDB?
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.
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.
O 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.
Quando 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.
O 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.
O 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.
Já 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.
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.
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.
## Quais são as vantagens de usar JavaScript em todas as camadas?
O 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.
Entre 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.
E 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.
Se 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.
Outra 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.
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.
É 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.
E 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ê!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](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) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Qual é a sua desculpa? - DevPleno
URL: https://devpleno.com/qual-a-sua-desculpa
> 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 ...
Qual é a sua desculpa? - DevPleno
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 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.
O 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.
Sempre 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.
Veja o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Qual%20%C3%A9%20a%20sua%20desculpa%3F&url=https%3A%2F%2Fdevpleno.com%2Fqual-a-sua-desculpa) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fqual-a-sua-desculpa) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Qual é o seu maior desafio nesse momento? - DevPleno
URL: https://devpleno.com/qual-seu-maior-desafio
> 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ó...
Qual é o seu maior desafio nesse momento? - DevPleno **
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.
O que você precisa fazer**
Escreva 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.
Pode ficar tranquilo quanto à privacidade, somente eu tenho acesso a este e-mail
**O projeto**
Depois 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.
Entã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.
Posteriormente, 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.
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.
Aceita entrar nesse desafio? Mande seu e-mail!
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fqual-seu-maior-desafio) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Quantas linguagens devo programar? - DevPleno
URL: https://devpleno.com/quantas-linguagens-programar
> 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...
Quantas linguagens devo programar? - DevPleno
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 interessante responder isso e mostrar algumas coisas que acho legal quando pensamos nessas quantidades.
Respondendo 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.
Uma 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.
Alé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.
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.
Confira o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Quantas%20linguagens%20devo%20programar%3F&url=https%3A%2F%2Fdevpleno.com%2Fquantas-linguagens-programar) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fquantas-linguagens-programar) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Quanto ganha quem trabalha por meio da Toptal? - DevPleno
URL: https://devpleno.com/quanto-ganha-quem-trabalha-por-meio-da-toptal
> A pergunta que não quer calar: Quanto se ganha trabalhando por meio da Toptal?
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 ...
Racionalização: Tomando decisões racionais - DevPleno **
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.
Como assim?**
Por 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.
Usando 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.
Quanto 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.
**Como fazer isso?**
Comece a olhar outros projetos de outros ‘lugares’ e ache razão neles, trazendo para o seu projeto.
Podemos 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.
É 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.
Entã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’.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Racionaliza%C3%A7%C3%A3o%3A%20Tomando%20decis%C3%B5es%20racionais&url=https%3A%2F%2Fdevpleno.com%2Fracionalizacao) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fracionalizacao) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# React 16 - o Pacificador - DevPleno
URL: https://devpleno.com/react-16-o-pacificador
> 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...
React 16 - o Pacificador - DevPleno
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.
No 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.
A nova versão do React, a versão 16 também já está nessa licença, isso ficou bastante interessante.
Quero 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.
Algumas 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.
Outra mudança que achei bastante interessante foi que a característica do React foi reescrita todo o core do zero utilizando o projeto Fiber.
Alé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.
Eu considero essa versão do React a versão das “pazes” porque a comunidade estava um pouco desanimada.
Deixe 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/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)
Compartilhar [X](https://twitter.com/intent/tweet?text=React%2016%20-%20o%20Pacificador&url=https%3A%2F%2Fdevpleno.com%2Freact-16-o-pacificador) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freact-16-o-pacificador) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 06 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)
[Javascript · 01 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)
[Javascript · 19 de jul. de 2017 Construindo um App gerenciador de séries com ReactJS](/gerenciador-de-series-p1)
---
# ReactJS: comentários em JSX - DevPleno
URL: https://devpleno.com/reactjs-comentarios-em-jsx
> 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,...
ReactJS: comentários em JSX - DevPleno
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 :)
A primeira tentativa seria fazer como um comentário em HTML:
render(){
return (
<div>
<!-- isso não vai funcionar :) -->
</div>
)
}
Porém, rapidamente iremos perceber que isso não funciona :)
A segunda tentativa (já que JSX é meio HTML meio JS) seria tentar:
render(){
return (
<div>
{ <-- isso não vai funcionar :) ---> }
</div>
)
}
Hum, mas não funcionou :(
Bom, 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.
E aí está o motivo do qual temos que usar { }.
render(){
return (
<div>
{ /* isso vai funcionar :) */ }
</div>
)
}
Neste 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 }.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)
Compartilhar [X](https://twitter.com/intent/tweet?text=ReactJS%3A%20coment%C3%A1rios%20em%20JSX&url=https%3A%2F%2Fdevpleno.com%2Freactjs-comentarios-em-jsx) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freactjs-comentarios-em-jsx) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 06 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)
[Javascript · 02 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)
[Javascript · 01 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)
---
# Redirecting to: /
URL: https://devpleno.com/reactnative
Redirecting to: / [Redirecting from /reactnative to /](/)
---
# Reconhecimento de nudez com js - DevPleno
URL: https://devpleno.com/reconhecimento-de-nudez-com-js
> Hoje quero complementar aquela dica passada sobre reconhecimento facial. Outra atividade que fazemos bastante quando permitimos que um usuário envie uma fo...
Reconhecimento de nudez com js - DevPleno
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.
O mais comum é checar o quanto de pele ou roupa tem naquela foto.
Para fazer isso vamos utilizar o nude.js, primeiramente vamos baixar as versões compressas, nude.min.js e worker.nude.min.js.
Agora em um html faremos o seguinte:
<html>
<head>
<title>Nude</title>
</head>
<body>
<img src='imgsemnudez.jpg' />
<script src='nude.min.js'></script>
<script>
const img = document.getElementById('img') nude.load(img) nude.scan(
result => {console.log(result)})
</script>
</body>
</html>
O próprio worker vai arrumar e carregar. Simplesmente temos que carregar essa foto nele e em seguida dar um scan.
No 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
Toda 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Reconhecimento%20de%20nudez%20com%20js&url=https%3A%2F%2Fdevpleno.com%2Freconhecimento-de-nudez-com-js) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freconhecimento-de-nudez-com-js) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Reconhecimento facial com JS - DevPleno
URL: https://devpleno.com/reconhecimento-facial-com-js
> Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.
Reconhecimento facial com JS - DevPleno
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.
Visã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.
Um 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.
A 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.
Vamos 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:
<html>
<head>
<title>Face Traking</title>
<style>
video, canvas {
position: absolute;
border: 1px solid red;
}
</style>
</head>
<body>
<script rsc="tracking-min.js"></script>
<script rsc="data/face-min.js"></script>
</body>
</html>
O 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.
Agora 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:
<body>
<video
id='video'
width='320'
height='240'
preload
autoplay
loop
muted
></video>
<canvas id='canvas' width='320' height='240'></canvas>
<script rsc='tracking-min.js'></script>
<script rsc='data/face-min.js'></script>
</body>
Agora 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:
<script>
function init(){
const video = document.getElementById('video')
const canvas = document.getElementById('canvas')
const context = canvas.getContext('2d')
const tracker = new traking.ObjectTracker('face')
}
window.onload = init()
</script>
Agora podemos mandar rastrear a tag vídeo utilizando a câmera. Fazendo isso, eu consigo enviar um event:
tracking.track('#video', tracker, { camera: true })
tracker.on('track', (event) => {
console.log(event)
})
Ao 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:
<script>
function init(){
const video = document.getElementById('video')
const canvas = document.getElementById('canvas')
const context = canvas.getContext('2d')
const tracker = new traking.ObjectTracker('face')
tracking.track('#video', tracker, {camera: true})
tracker.on('track', event => {
console.log(event)
context.clearRect(0,0,canvas.width, canvas.height )
event.data.foEach( rect => {
console.log(rect)
})
})
}
window.onload = init()
</script>
O retângulo já está lá reconhecendo a cabeça ao se mexer, porém ainda não conseguimos visualizar ele.
Então, para cada retângulo reconhecido, vamos desenhar ele na tela:
event.data.foEach((rect) => {
context.strokeStyle = '#ff0000'
context.lineWidth = 2
context.strokeRect(rect.x, rect.y, rect.width, rect.height)
})
Com 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.
Além disso ainda podemos mostrar uma informação de onde está sendo reconhecido esse retângulo:
event.data.foEach((rect) => {
context.strokeStyle = '#ff0000'
context.lineWidth = 2
context.strokeRect(rect.x, rect.y, rect.width, rect.height)
context.fillText(
`x: ${rect.x}`,
`w: $:{rect.width}`,
rect.x + rect.width + 20,
rect.y + 20
)
context.fillText(
`y: ${rect.y}`,
`h: $:{rect.height}`,
rect.x + rect.width + 20,
rect.y + 40
)
})
Assim temos a informação precisa de onde foi encontrado o nosso rosto. Poderíamos utilizar isso para fazer o crop.
Como 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.
Veja o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Reconhecimento%20facial%20com%20JS&url=https%3A%2F%2Fdevpleno.com%2Freconhecimento-facial-com-js) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freconhecimento-facial-com-js) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# High-order Function - Reduce - DevPleno
URL: https://devpleno.com/reduce
> Hoje vamos continuar falando sobre high order functions, principalmente as que estão disponíveis nos vetores em JavaScript. Vamos falar mais especificament...
High-order Function - Reduce - DevPleno
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.
Suponhamos 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ó.
Como fazer isso?
Primeiramente podemos fazer com uma Arrow Function:
const carrinho = [{ id: 1, preco: 2, qtd: 2 },
{ id: 1, preco: 3, qtd: 1 }]
carrinho.reduce()
const total = carrinho.reduce((soma, item) => item.preco + soma, 0)
console.log(total)
Perceba 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.
Você se lembra que o MAP transforma de um valor para outro? Então poderíamos fazer o seguinte:
const carrinho = [{ id: 1, preco: 2, qtd: 2 },
{ id: 1, preco: 3, qtd: 1 }]
carrinho.reduce()
const total = carrinho
.map((item) => item.preço * item.qtd)
.reduce((soma, subtotal) => subtotal + soma, 0)
console.log(total)
Com 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.
Poderíamos, por exemplo, colocar o item em uma const e passar apenas o subtotal:
const subtotal = (item) => item.preço * item.qtd
const total = carrinho
.map(subtotal)
.reduce((soma, subtotal) => subtotal + soma, 0)
console.log(total)
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.
Confira o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=High-order%20Function%20-%20Reduce&url=https%3A%2F%2Fdevpleno.com%2Freduce) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Freduce) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# [SEGREDO] Muitos registros do MySQL no NodeJS - DevPleno
URL: https://devpleno.com/registros-do-mysql-no-nodejs
> 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...
[SEGREDO] Muitos registros do MySQL no NodeJS - DevPleno
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 vamos fazer é instalar o driver padrão:
yarn add mysql
Tudo 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:
const mysql = require('mysql')
const connection = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: '',
database: 'cadastro'
})
connection.connect(() => console.log('connected'))
Lembrando que eu já tenho um banco de dados para testes. Fizemos algo bem rápido para chegar logo na parte que interessa :)
Depois 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.
connection.connect(() => {
console.log('connected')
connection.query('select * from pessoas', (err, results) => {
console.log(results)
})
})
Com 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.
Precisamos então fazer essa query de uma outra maneira:
connection.connect(() => {
console.log('connected')
const query = connection.query('select * from pessoas')
query.on('result', (row) => {
console.log(row)
})
})
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.
Imagine, por exemplo, que temos algum arquivo que não fosse executado de primeira:
query.on('result', (row) => {
setTimeout(() => {
console.log(row)
}, 300)
})
Quando 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:
query.on('result', (row) => {
connection.pause()
setTimeout(() => {
console.log(row)
connection.resume()
}, 300)
})
Assim 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:
...
},300)
})
query.on('end', () => connection.end())
É 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.
Se 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:
const query = connection.query('select * from pessoas limit 100')
Obviamente que não elimina você ter que testar, mas já ajuda a agilizar seus testes de começo.
Veja o vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fregistros-do-mysql-no-nodejs) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Redirecting to: https://go.devpleno.com/fsm
URL: https://devpleno.com/relampagofsm
Redirecting to: https://go.devpleno.com/fsm [Redirecting from /relampagofsm to https://go.devpleno.com/fsm](https://go.devpleno.com/fsm)
---
# Render condicional em ReactJS - DevPleno
URL: https://devpleno.com/render-condicional-em-reactjs
> 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...
Render condicional em ReactJS - DevPleno ** *
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.
## Primeira maneira: utilizando if´s
JSX é 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.
import React, { Component } from 'react'
class CondComIf extends Component {
render() {
if (this.props.condicao) {
return <p>Condicao é verdadeira</p>
}
return <p>Condicao é falsa</p>
}
}
// para renderizarmos este componente
// <CondComIf condicao={true} />
Importante:** sempre o método render precisa retornar algo e que este algo seja apenas uma tag.
## Segunda maneira: condicional com operador lógico
Este formato utiliza a precedência de operadores para funcionar como uma condicional. Por exemplo, se fizermos isso:
a === 10 && b === 20
Temos 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.
Isso nos permite fazer o seguinte:
const a = 10
const b = 20
a===b && console.log('A eh igual a B)
Claro que neste exemplo, nunca o console.log será executado, mas creio que fez sentido para você.
Utilizando a mesma ideia, podemos fazer o seguinte:
import React, { Component } from 'react'
class CondComOp extends Component {
render() {
return (
<p>
<h2>Vamos fazer o condicional: </h2>
{this.props.condicao && <span>Condicao é verdadeira</span>}
{!this.props.condicao && <span>Condicao é falsa</span>}
</p>
)
}
}
// para renderizarmos este componente
// <CondComOp condicao={true} />
**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).
A 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ã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!*
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Render%20condicional%20em%20ReactJS&url=https%3A%2F%2Fdevpleno.com%2Frender-condicional-em-reactjs) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frender-condicional-em-reactjs) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 06 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)
[Javascript · 02 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)
[Javascript · 01 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)
---
# ReactJS Recursivo? - DevPleno
URL: https://devpleno.com/renderizar-estruturas-em-formato-de-arvore
> 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...
ReactJS Recursivo? - DevPleno *
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.
Em que isso é útil?
Vamos 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.
Eu 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.
class App extends Component {
render(){
const nodes = {
l:{ l:{ v: 1 }, r:{v: 2},
v: '/'},
r:{v: 10}
v:'*'
}
return(
<div>
<h1> welcome to React</h1>
</div>
)
}
}
Perceba 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*.
Como fazemos isso de forma recursiva?
A 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:
import React from 'react'
const Node = (props) => {
return <p> Node </p>
}
export default Node
Voltando ao App.js vamos importar o node e ao invés de colocarmos o H2 vamos colocar o nó dentro dele:
import Node from './node'
return (
<div>
<h2>
{' '}
<Node node={nodes} />
</h2>
</div>
)
Então ele escreveu o node, que é o que está dentro do nó.
Vamos mudar, colocar um span em node.js e colocar um JSON com um props.node para sabermos o que tem ali dentro:
const Node = (props) =>{
return(
<span> {JSON.stringfy(props.node) </span>
)
}
Perceba 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.
const Node = (props) => {
return (
<span>
{props.node.l && <Node node={props.node.l} />}
{props.node.v}
</span>
)
}
Com isso ele andou apenas para o lado esquerdo. Podemos adicionar também, por exemplo, apenas o lado direito:
{
props.node.r && <Node node={props.node.r} />
}
Agora eu quero saber quando eu renderizar um nó colocar um parênteses para saber quando foi realizado uma conta:
const Node = (props) => {
return (
<span>
({props.node.l && <Node node={props.node.l} />}
{props.node.v})
</span>
)
}
Com 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.
Perceba 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.
Poderíamos fazer o parênteses não aparecer nos valores, deixando o resultado muito mais simples.
const Node = (props) => {
return (
<span>
{props.node.l && props.node.r && <span>(</span>}
{props.node.l && <Node node={props.node.l} />}
{props.node.v}
{props.node.l && props.node.r && <span>)</span>}
</span>
)
}
Uma coisa interessante é que se fizermos um inspect no browser e usar o react dev tools é possível ver toda a estrutura sendo criada.
Fizemos 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.
Confira todos os passos no vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)
Compartilhar [X](https://twitter.com/intent/tweet?text=ReactJS%20Recursivo%3F&url=https%3A%2F%2Fdevpleno.com%2Frenderizar-estruturas-em-formato-de-arvore) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frenderizar-estruturas-em-formato-de-arvore) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 06 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)
[Javascript · 02 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)
[Javascript · 01 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)
---
# Request - Requisições HTTP de forma rápida e simples - DevPleno
URL: https://devpleno.com/request
> 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...
Request - Requisições HTTP de forma rápida e simples - DevPleno *
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.
Primeiramente vamos instalar:
npm install request
Agora vamos criar um novo arquivo e fazer um require no nosso request e pegar o site da UOL por exemplo:
const request = require('request')
request('https://www.uol.com.br', function (err, res, body) {
if (!err && res.statusCode === 200) {
console.log(body)
}
})
Entã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.
Ao 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.
Vamos 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):
const request = require('request')
const fs = require('fs')
request('https://www.uol.com.br').pipe(fs.createWriteStream('home.html'))
(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.
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.
Confira o video:
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://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frequest) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Request e Response - DevPleno
URL: https://devpleno.com/request-e-response
> 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...
Request e Response - DevPleno
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.
Vamos 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/).
Como checar se isso está realmente acontecendo?
No caso do Windows, apertamos F12 usando o Chrome e então irá aparecer esta aba Network:
Perceba 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:
Se 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:
No 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.
var express = require ('express');
var app express();
app.get('/', function (req, res){
//res.send('Esta é uma requisição GET.');
//res.send(req.query);
res.send(req.headers);
});
Quando rodarmos o exemplo irá aparecer o seguinte:
Mostrando todos os Headers que eu solicitei.
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:
var express = require ('express');
var app express();
app.post('/users', function(req,res){
res.send(req.headers);
req.on('data', function(chunk){
//res.send(chunk);
});
});
Vamos 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.
Em 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.
Note 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.
Assista ao vídeo da explicação:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](https://twitter.com/intent/tweet?text=Request%20e%20Response&url=https%3A%2F%2Fdevpleno.com%2Frequest-e-response) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frequest-e-response) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Hands-on: Request-promise - DevPleno
URL: https://devpleno.com/request-promise
> 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
Hands-on: Request-promise - DevPleno
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.
Entã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:
yarn request
yarn request promise
Em seguida, basta simplesmente importar ele. A assinatura é exatamente a mesma do Request, então eu posso simplesmente trocar para o Request-Promise:
const request = require('request-promise')
request('https://httpbin.org/ip').then((res) => console.log(res))
Entã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.
Outra vantagem que temos é que podemos fazer o seguinte:
const pegarIp = async () => {
const ip = await request('https://httpbin.org/ip')
console.log(ip)
}
pegarIp()
Perceba 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:
const pegarIp = async () => {
const ip = await request('https://httpbin.org/ip')
const ipPost = await request({
method: 'POST',
json: ip,
uri: 'https://httpbin.org/post'
})
console.log(ipPost)
}
pegarIp()
Ele já vai mostrar o data como o IP que eu recebi.
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Hands-on%3A%20Request-promise&url=https%3A%2F%2Fdevpleno.com%2Frequest-promise) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frequest-promise) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Dica: Router Props - DevPleno
URL: https://devpleno.com/router-props
> Como passar props para rotas (em reactrouter) em uma app react? Dica interessante para injetarmos dependências nos componentes que são dinamicamente render...
Dica: Router Props - DevPleno
Como passar props para rotas (em react-router) em uma app react?
Dica interessante para injetarmos dependências nos componentes que são dinamicamente renderizados pelo router.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)
Compartilhar [X](https://twitter.com/intent/tweet?text=Dica%3A%20Router%20Props&url=https%3A%2F%2Fdevpleno.com%2Frouter-props) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frouter-props) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 06 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)
[Javascript · 02 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)
[Javascript · 01 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)
---
# React-router-dom: como injetar props em rotas em ReactJS - DevPleno
URL: https://devpleno.com/router-props-2
> 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...
React-router-dom: como injetar props em rotas em ReactJS - DevPleno ** *
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.
>
Temos também um outro material somente sobre [React-router que você pode ver aqui](https://devpleno.com/router-props).
Vamos fazer a partir de um exemplo básico no qual ele só tem um componente criado com Create-react-app.
import React, { Component } from 'react'
import logo from './logo.svg'
import './App.css'
import Home from './Home'
class App extends Component {
render() {
return (
<div className='App'>
<div className='App-header'>
<img src={logo} className='App-logo' alt='logo' />
<h2>Welcome to React</h2>
</div>
<div className='App-intro'>
<home name='Tulio' />
</div>
</div>
)
}
}
Primeiramente vamos colocar a navegação com o React Router em
<home name='Tulio' />
Isso 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.
import React, { Component } from 'react'
import logo from './logo.svg'
import './App.css'
import Home from './Home'
import Teste from './Teste'
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
class App extends Component {
render() {
return (
<Router>
<div className='App'>
<div className='App-header'>
<img src={logo} className='App-logo' alt='logo' />
<h2>Welcome to React</h2>
</div>
<div className='App-intro'>
<Route exact path='/' component={Home} />
<Route exact path='/teste' component={Teste} />
</div>
</div>
</Router>
)
}
}
Feito isso, vamos criar o teste.js
import React from 'react'
const Teste = () => <p>Teste</p>
export default Teste
Agora 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.
<div className='App'>
<div className='App-header'>
<img src={logo} className='App-logo' alt='logo' />
<h2>Welcome to React</h2>
<p>
<Link to='/'>Home</Link>
<Link to='/teste'>Teste</Link>
</p>
</div>
</div>
Qual o problema?**
Eu preciso passar parâmetros ou props para o componente Home, mas ele não irá funcionar se fizermos assim:
<Route exact path='/' component={Home} name='Tulio' />
**Como podemos passar essa props para o componente home?**
Ao 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.
<div className='App-intro'>
<Route exact path='/' render={(props) => <Home />} name='Tulio' />
<Route exact path='/teste' component={Teste} />
</div>
Esses 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).*
Com isso, conseguimos efetivamente passar os props que queremos.
<Route
exact
path='/'
render={(props) => <Home {...props} name='Tulio' />}
name='Tulio'
/>
Alé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.
Isso é 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.
Confira o passo a passo em vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[ReactJS](/tag/reactjs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Frouter-props-2) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 06 de out. de 2017 GH-Pages e como publicar seu site no Github](/como-publicar-seu-site-no-github)
[Javascript · 02 de out. de 2017 React 16 - o Pacificador](/react-16-o-pacificador)
[Javascript · 01 de ago. de 2017 Composição de componentes em ReactJS](/composicao-de-componentes-em-reactjs)
---
# Por que o Salário em TI é baixo? DevPleno Reponde - DevPleno
URL: https://devpleno.com/salario-em-ti
> Uma pergunta que ouço com frequência, principalmente dos profissionais da área de T.I, é: "Por que o salário em TI é baixo?". A primeira coisa que eu acho ...
Por que o Salário em TI é baixo? DevPleno Reponde - DevPleno
Uma pergunta que ouço com frequência, principalmente dos profissionais da área de T.I, é: “Por que o salário em TI é baixo?”.
A 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.
Um 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.
Antes 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?
Talvez 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.
O 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.
Vamos 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.
Esqueç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ê.
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.
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.
Outra 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.
Existe um treinamento de um grande mentor meu que trabalha mais sobre essa mentalidade.
Se tiver interesse, mande um e-mail para [tuliofaria@devpleno.com](mailto:tuliofaria@devpleno.com). Irei te passar o link.
Confira minha fala em vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fsalario-em-ti) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Porque se sujar faz bem! - DevPleno
URL: https://devpleno.com/se-sujar-faz-bem
> 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 ...
Porque se sujar faz bem! - DevPleno
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.
Se 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.
Sempre 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.
Outra 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.
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Porque%20se%20sujar%20faz%20bem!&url=https%3A%2F%2Fdevpleno.com%2Fse-sujar-faz-bem) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fse-sujar-faz-bem) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Você é passageiro ou motorista da sua vida? - DevPleno
URL: https://devpleno.com/seja-o-motorista-da-sua-vida
> 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...
Você é passageiro ou motorista da sua vida? - DevPleno *
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 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.
Quando 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.
Uma 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.
Mude 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.
Quando 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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fseja-o-motorista-da-sua-vida) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Redirecting to: /sobre
URL: https://devpleno.com/ser-devpleno
Redirecting to: /sobre [Redirecting from /ser-devpleno to /sobre](/sobre)
---
# Servidor de arquivos e sistemas locais com HTTPS - DevPleno
URL: https://devpleno.com/servidor-de-arquivos
> 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...
Servidor de arquivos e sistemas locais com HTTPS - DevPleno
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).
Perfeito para testes de webhooks ou de APIs do HTML5 que precisam de HTTPS para funcionar.
Para baixar o ngrok: [https://ngrok.com](https://ngrok.com)
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=Servidor%20de%20arquivos%20e%20sistemas%20locais%20com%20HTTPS&url=https%3A%2F%2Fdevpleno.com%2Fservidor-de-arquivos) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidor-de-arquivos) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# NodeJS Primeiros Passos: Servidor HTTP Básico - DevPleno
URL: https://devpleno.com/servidor-http-basico
> 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. ...
NodeJS Primeiros Passos: Servidor HTTP Básico - DevPleno
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.
O código construído está disponível [Aqui](https://github.com/devpleno/nodejs-servidor-http-basico)
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](https://twitter.com/intent/tweet?text=NodeJS%20Primeiros%20Passos%3A%20Servidor%20HTTP%20B%C3%A1sico&url=https%3A%2F%2Fdevpleno.com%2Fservidor-http-basico) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidor-http-basico) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Servidor HTTP Básico - NodeJS Primeiros Passos - DevPleno
URL: https://devpleno.com/servidor-http-basico-2
> 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...
Servidor HTTP Básico - NodeJS Primeiros Passos - DevPleno *
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.
Primeira 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)*.
Você precisa conseguir pelo menos escrever no Shell (prompt de comando) o seguinte:
npm - v
Com isso, conseguimos ver a versão do node package mananger.
E se colocarmos:
node - v
Aparecerá 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.
Como 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”:
var http: require('http');
http.createServer(function(req, res){
res.end('DevPleno.com');
});
Uma 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).*
var http: require('http');
http.createServer(function(req, res){
res.end('DevPleno.com');
}).listen(3000);
Vamos salvá-lo como server.js, abrir o prompt de comando e executar o seguinte comando:
Node server.js
Isso 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).*
var http: require('http');
var fs = require('fs');
var contents = fs.readFileSync('contents.html')
http.createServer(function(req, res){
res.end(contents);
}).listen(3000);
Em seguida, criar um HTML com o nome contents
<html>
<body>
<h1>DevPleno.com</h1>
</body>
<html>
Aperte 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.
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.
Confira o passo a passo no vídeo:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[NodeJS](/tag/nodejs)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidor-http-basico-2) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 30 de nov. de 2017 Normalizar-email](/normalizar-email)
[Javascript · 29 de nov. de 2017 Como criar e reutilizar seus módulos no NodeJS com Git](/como-criar-e-reutilizando-seus-proprios-modulos)
[Javascript · 29 de nov. de 2017 Multer upload de imagens com nodejs e express](/multer-upload-de-imagens-com-nodejs-e-express)
---
# Servidor JSON simples em PHP (parte 1) - DevPleno
URL: https://devpleno.com/servidor-json-simples-em-php-parte-1
> 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...
Servidor JSON simples em PHP (parte 1) - DevPleno
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:
{
“series”: [],
“genres”:[]
}
Esse é 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:
<?php
$path = explode('/', $_GET['path']);
$contents = file_get_contents('bd.json');
$json = json_decode($contents, true);
$method = $_SERVER['REQUEST_METHOD'];
header('Content-type: application/json');
$body = file_get_contents('php://input');
Agora que já lemos tudo, temos que adicionar um if. Caso o method for get, vamos apenas retornar o Json:
if($method === 'GET'){
if($json[$path[0]]){
echo json_encode($json[$path[0]]);
}else{
echo '[]';
}
}
Com isso, caso tivermos uma série dentro do campo séries, ele retornará essa série. Além disso, podemos inserir também:
if($method === 'POST'){
$jsonBody = json_decode($body, true);
$jsonBody[id] = time();
if(!$json[$path[0]]){
$json[$path[0]] = [];
}
$json[$path[0]][] = $jsonBody;
echo json_encode($jsonBody);
file_put_contents('db.json', json_encode($json));
}
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fservidor-json-simples-em-php-parte-1) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Vídeo sobre Servidores Web - o back-end de uma aplicação web - DevPleno
URL: https://devpleno.com/servidores-web-entendo-back-end
> Neste vídeo, vamos "entrar" um pouco mais a fundo no backend, entendendo servidores web. O que são e como eles recebem as requisições.
Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para começar.
- Trabalhar como freelancer: 7 sites para conseguir jobs como programador - DevPleno **
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.
Trabalhar 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.
>
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.
Reuni 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.
## 1. Toptal
A [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.
Os 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.
Ideal para:** devs com experiência sólida que querem projetos de alto nível pagos em dólar.
## 2. Upwork
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.
A 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.
**Ideal para:** qualquer nível de experiência, especialmente quem quer começar a trabalhar para o exterior.
## 3. Freelancer.com
O [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.
Você 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.
**Ideal para:** quem está começando e quer construir um portfólio com projetos variados.
## 4. Workana
O [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.
A 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.
**Ideal para:** devs que preferem projetos em português/espanhol e querem começar no mercado freelancer latino-americano.
## 5. 99Freelas
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.
Você 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.
**Ideal para:** quem quer começar com projetos nacionais em português, sem a barreira do idioma.
## 6. Scalable Path
O [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.
Isso 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.
**Ideal para:** devs com experiência que preferem ser selecionados em vez de competir em leilões.
## 7. Trampos.co
O [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.
Você 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.
**Ideal para:** quem busca tanto freelance quanto vagas fixas remotas no mercado brasileiro.
## Como escolher a plataforma certa?
Não existe uma resposta única. Minha recomendação:
**Está começando?** Comece pelo 99Freelas ou Workana para construir reputação sem a barreira do idioma.
- **Tem inglês intermediário?** Crie perfil no Upwork e no Freelancer.com para acessar o mercado internacional.
- **Tem experiência sólida?** Invista no processo seletivo da Toptal ou Scalable Path — os projetos e a remuneração compensam.
- **Quer diversificar?** Mantenha perfis em 2-3 plataformas e veja onde consegue mais tração.
O 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.
Aproveite 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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftrabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
[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)
---
# Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! - DevPleno
URL: https://devpleno.com/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao
> 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...
- Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão! - DevPleno ** *
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.
Na 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 é.
Antes 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!
Como você administra suas tarefas?**
No 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.
Se 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”.
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.
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?
**Você se sente capaz de definir metas e atingi-las?**
Na 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.
Portanto, 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.
Se 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.
**Você se considera uma pessoa disciplinada?**
Um 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.
Um 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.
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.
**Como é a sua relação com o dinheiro?**
Esse é 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”.
Você 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”.
Um 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.
**Como medir o sucesso?**
Um 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.
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.
**Quanto vale o seu trabalho?**
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.
Essa 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.
Trabalhar 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.
A partir desses questionamentos, certamente, você vai conseguir entender melhor se a decisão de abrir uma empresa é realmente a melhor para sua vida!
Por falar em empreendedorismo, você pode gostar destes nossos 2 vídeos:
[3 dicas para empreender em software](https://www.youtube.com/watch?v=A5RgxkpJIrA&utm_source=blog&utm_campaign=rc_blogpost)
- [Como negociar software (ou qualquer outra coisa)](https://www.youtube.com/watch?v=FszhDTUw2E0&utm_source=blog&utm_campaign=rc_blogpost)
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&utm_campaign=rc_blogpost) e não fique de fora das novidades!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Trabalhar%20em%20uma%20grande%20empresa%20ou%20abrir%
---
# Tudo na vida acontece duas vezes! - DevPleno
URL: https://devpleno.com/tudo-acontece-duas-vezes
> 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 na vida acontece duas vezes! - DevPleno
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.
O 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.
Os 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.
Vamos 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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Tudo%20na%20vida%20acontece%20duas%20vezes!&url=https%3A%2F%2Fdevpleno.com%2Ftudo-acontece-duas-vezes) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Ftudo-acontece-duas-vezes) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Usar IA na infraestrutura: quando isso vira risco para o seu produto - DevPleno
URL: https://devpleno.com/usar-ia-na-infraestrutura-riscos
> Usar IA na infraestrutura pode acelerar deploys, mas também aumentar o risco de perda de dados e falhas críticas. Veja como reduzir esse risco.
- Usar IA na infraestrutura: quando isso vira risco para o seu produto - DevPleno **
Nem todo ganho de velocidade vale o risco operacional. O problema não é usar IA na infra — é deixar ela decidir sozinha em produção.
Se você está usando IA para construir software, tem uma armadilha que parece produtividade, mas pode virar prejuízo rápido:
não é porque a IA consegue subir sua infraestrutura que você deveria deixar ela fazer isso sozinha.**
Hoje já tem muita gente usando Claude Code, Cursor, Codex e outras ferramentas para configurar servidor, preparar banco, instalar serviços, criar pipelines e até colocar aplicação em produção. O problema é que, quando isso acontece sem revisão, versionamento e rollback, você não está só economizando tempo.
Você está **terceirizando uma decisão crítica** para um sistema probabilístico.
E, quando o assunto é infraestrutura, isso pode custar dado, tempo, dinheiro e confiança do usuário.
O ponto aqui é simples: **IA é alavanca, não substituto de critério.**
Neste post, eu quero te mostrar:
por que o uso de IA na infraestrutura ficou tão comum
- onde está o risco real dessa prática
- e como usar IA nessa camada sem transformar velocidade em fragilidade
## O problema não é usar IA na infraestrutura
Vale deixar isso claro desde o começo: **o problema não é usar IA na infraestrutura.**
Usar IA para explicar opções, gerar scripts, estruturar pipelines, revisar mudanças e acelerar tarefas repetitivas pode ser extremamente útil. Em muitos casos, isso realmente aumenta a produtividade.
O erro começa quando a IA deixa de ser copiloto e passa a virar **autoridade operacional**.
Infraestrutura não é só “fazer funcionar”. Infra envolve, ao mesmo tempo:
- segurança
- persistência de dados
- permissões
- backup
- rollback
- observabilidade
- disponibilidade
- custo operacional
Ou seja: quando você entrega esse contexto inteiro para a IA resolver sozinha, sem uma camada de revisão humana, você assume um risco que muita gente ainda está subestimando.
## Por que isso ficou mais comum com o vibe coding
Boa parte desse comportamento cresceu junto com o vibe coding.
Antes, muita gente nem cogitava subir servidor, configurar banco ou montar ambiente por conta própria. Agora, com uma boa interface e alguns prompts, isso parece simples demais.
A sequência geralmente é parecida:
- a pessoa quer colocar uma ideia no ar rápido
- encontra uma VPS barata
- pede para a IA instalar tudo
- vê o sistema funcionando
- assume que está tudo certo
Só que **facilidade de execução não é a mesma coisa que maturidade operacional**.
É aí que mora o risco.
Principalmente para quem não tem background forte em infra, o resultado pode parecer profissional na superfície, mas estar cheio de fragilidades por baixo: portas expostas, segredos mal gerenciados, banco sem backup, deploy sem histórico, rollback inexistente e mudanças difíceis de auditar.
## Os 3 maiores riscos de deixar a IA operar sua infra sem review
### 1. A IA otimiza para concluir a tarefa, não para proteger o seu negócio
Esse é um dos pontos mais importantes.
Quando você pede para a IA “colocar isso no ar”, ela tende a buscar o caminho que resolve a tarefa da forma mais direta possível. O objetivo dela não é preservar o contexto inteiro do seu negócio. O objetivo dela é **fechar a tarefa**.
Na prática, isso pode gerar decisões perigosas:
- sobrescrever configuração
- recriar recursos desnecessariamente
- aplicar mudança destrutiva em banco
- abrir permissões excessivas para “fazer funcionar”
- ignorar um trade-off importante em troca de velocidade
Para a IA, isso pode parecer uma solução plausível.
Para o seu produto, pode virar um incidente.
Por isso o risco não está só em “a IA errar”. O risco está em ela **errar de forma operacionalmente cara**.
### 2. Quem não domina infraestrutura pode não conseguir julgar o que acabou de acontecer
Esse ponto pesa muito para quem está começando a construir produto com IA.
Se você não entende minimamente o que foi configurado, também não consegue responder perguntas essenciais como:
- esse banco está seguro?
- esse servidor está exposto do jeito certo?
- existe backup?
- se quebrar, como volta?
- o que foi alterado de verdade?
- qual parte dessa infra está crítica demais para ficar sem observabilidade?
A sensação de velocidade vira uma falsa sensação de controle.
Você olha a VPS barata, vê a IA fazendo tudo e pensa que ganhou eficiência. Mas pode ter criado uma bomba-relógio que só vai aparecer quando surgir problema em produção.
E o pior: quando você não domina a camada operacional, você tende a perceber o risco só depois do dano.
### 3. Sem versionamento e revisão, você perde auditabilidade
Quando a IA altera a infraestrutura diretamente, sem passar por código versionado, sem pull request e sem uma etapa de revisão, você perde uma das coisas mais valiosas em ambiente técnico:
**a capacidade de entender o que mudou, por que mudou e como desfazer.**
Sem esse histórico, qualquer erro fica mais caro.
Você não tem:
- diff claro
- ponto de validação antes do deploy
- trilha de auditoria
- rollback confiável
- contexto suficiente para revisar depois
E isso vale tanto para infraestrutura quanto para banco de dados.
Se uma IA decide remover uma coluna, recriar uma tabela ou mudar uma configuração sensível, você precisa conseguir identificar isso **antes** de ir para produção — não depois.
## Como usar IA na infraestrutura de um jeito mais maduro
A forma mais segura de pensar nisso é simples:
**use a IA para acelerar a construção da decisão, não para substituir completamente o critério da decisão.**
Na prática, eu seguiria três caminhos principais.
### 1. Evite VPS manual sempre que possível
A primeira pergunta não é “como eu subo isso numa VPS?”.
A pergunta certa é:
**eu realmente preciso administrar servidor aqui?**
Em muitos casos, especialmente no começo de um SaaS ou de um produto pequeno, a resposta é não.
Você pode usar plataformas como Vercel, Railway, Fly.io e outras opções gerenciadas para reduzir boa parte da carga operacional logo no início.
Isso não elimina responsabilidade técnica. Você ainda precisa cuidar da aplicação, do banco, dos segredos e da lógica de negócio. Mas reduz uma parte importante do risco estrutural.
E vale reforçar uma ideia que muita gente ainda resiste em aceitar:
**PaaS não é preguiça técnica. Muitas vezes é maturidade operacional.**
Escolher uma solução gerenciada no começo pode ser muito mais inteligente do que abrir uma VPS só porque agora a IA consegue configurar isso para você.
### 2. Trate sua infraestrutura como código
Se você realmente precisa de algo mais customizado, o próximo passo é fazer essa infra existir como artefato versionado.
Ou seja: nada de alteração crítica acontecendo solta em shell, direto no ambiente, sem rastreabilidade.
A IA pode ajudar a:
- escrever scripts
- montar pipelines
- gerar configuração de infraestrutura
- estruturar ferramentas como SST, Terraform e afins
- sugerir migrations
Mas isso precisa virar:
- código versionado
- mudança revisável
- histórico auditável
- base para rollback
Quando a infraestrutura vira código, você consegue olhar com mais calma, perguntar por que determinada escolha foi feita e evitar alterações destrutivas antes que elas cheguem ao ambiente real.
### 3. Passe por pull request antes do deploy
Esse é o checkpoint que mais reduz risco.
Se a IA ajudou a criar uma mudança, ótimo. Mas antes de publicar, você precisa conseguir revisar:
- o que foi adicionado
- o que foi removido
- o que foi alterado no banco
- quais permissões foram abertas
- quais serviços estão sendo expostos
- quais termos potencialmente destrutivos aparecem na mudança
Mesmo uma revisão simples já é muito melhor do que deixar alteração crítica ir direto para produção.
Se você encontrar sinais como drop, delete, remove ou mudanças inesperadas em tabelas e permissões, isso já acende um alerta para
---
# Descrição das vagas de emprego no Brasil x no exterior - DevPleno
URL: https://devpleno.com/vagas-de-emprego-no-brasil-e-no-exterior
> Hoje quero comentar um email que recebi e achei bastante relevante falar sobre, principalmente quando estamos olhando para o mercado de desenvolvedor web. ...
Descrição das vagas de emprego no Brasil x no exterior - DevPleno
Hoje quero comentar um e-mail que recebi e achei bastante relevante falar sobre, principalmente quando estamos olhando para o mercado de desenvolvedor web.
A 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.
Em 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.
Como 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.
No 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.
O que eu fiz para contratar meus funcionários?
Um 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.
Isso 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.
Na Toptal, por exemplo, todos os testes que fiz, foram feitos por engenheiros de softwares da Toptal.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fvagas-de-emprego-no-brasil-e-no-exterior) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Validade de um projeto/ideia/ação - DevPleno
URL: https://devpleno.com/validade
> 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...
Validade de um projeto/ideia/ação - DevPleno
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.
Quando 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.
Por 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.
Quando 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.
Outra 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.
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.
Quando 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.
Entã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.
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](https://twitter.com/intent/tweet?text=Validade%20de%20um%20projeto%2Fideia%2Fa%C3%A7%C3%A3o&url=https%3A%2F%2Fdevpleno.com%2Fvalidade) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fvalidade) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# Vantagens da Injeção de dependência para a testabilidade do código - DevPleno
URL: https://devpleno.com/vantagens-da-injecao-de-depencia
> 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 ...
Vantagens da Injeção de dependência para a testabilidade do código - DevPleno **
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.
const alerts = {
alerts: (alert, message) => alert(message)
}
module.exports = alerts
No 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:
const alerts = {
alerts: (alert, message) => alert(message)
}
alerts.alert(window.alert, 'message')
module.exports = alerts
Mas 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:
const alertUser = require('./alert-user')
test('it calls alert', () => {
const alertMock = jest.fn()
alertUser.alert(alertMock, 'message')
console.log(alertMock.mock.calls)
}
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:
const alertUser = require('./alert-user')
test('it calls alert', () => {
const alertMock = jest.fn()
const msg = 'message'
alertUser.alert(alertMock, msg)
expect(alertMock.mock.calls [0][0]).toBe('msg')
}
Agora vamos supor que nosso código tem algum erro, então ele não chama o alert, apenas retorna
const alerts = {
alerts: (alert, message) => 1
}
module.exports = alerts
Perceba 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:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)[Fundamentos](/tag/fundamentos)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fvantagens-da-injecao-de-depencia) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 10 de nov. de 2017 Preconceito com JS? Não preparado para corporativo?](/preconceito-com-js-nao-preparado-para-corporativo)
[Javascript · 10 de out. de 2017 Javascript - ES6 Default Parameters](/es6-default-parameters)
[Javascript · 10 de out. de 2017 ES7 Array Includes](/es7-array-includes)
---
# Verificando o tempo para executar um trecho de código em Javascript - DevPleno
URL: https://devpleno.com/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript
> 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...
- Verificando o tempo para executar um trecho de código em Javascript - DevPleno
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:
salvamos a data/hora atual
- executamos o trecho de código
- pegamos a data/hora atual e subtraímos o valor encontrado no item 1.
Simples né? Vamos fazer agora em Javascritp:
const inicio = new Date().getTime()
// trecho de código que queremos mensurar
const total = new Date().getTime() - inicio
console.log('Foi executado em: ', total)
O 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:
console.time('TempoLoop')
// trecho de código a ser medido
console.endTime('TempoLoop')
O 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!
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fverificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# Redirecting to: /
URL: https://devpleno.com/viverdesoftware
Redirecting to: / [Redirecting from /viverdesoftware to /](/)
---
# Você precisa ter DOM para ser um bom profissional? - DevPleno
URL: https://devpleno.com/voce-precisa-ter-dom-para-ser-um-bom-profissional
> 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...
Você precisa ter DOM para ser um bom profissional? - DevPleno
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!
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Carreira](/tag/carreira)
Compartilhar [X](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) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fvoce-precisa-ter-dom-para-ser-um-bom-profissional) Copiar link
Continue lendo
## Insights relacionados
[Carreira · 04 de abr. de 2026 Trabalhar como freelancer: 7 sites para conseguir jobs como programador](/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador)
[Carreira · 05 de set. de 2021 Lista de sites para trabalhar remotamente como programador em 2022](/lista-definitiva-de-sites-para-progradores-remotos)
[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)
---
# WebAudioAPI - Gerando um som no browser - DevPleno
URL: https://devpleno.com/webaudioapi
> 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...
WebAudioAPI - Gerando um som no browser - DevPleno
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:
<html>
<head>
<tittle>WebAudioAPI</tittle>
</head>
<body>
<script>
const contexto = (window.AudioContext || window.webkitAudioContext)
</script>
</body>
</html>
Agora, com o contexto pronto, precisamos criar um oscilador, que é uma forma de gerar essa onda dinâmica:
const osc = contexto.createOscillator()
Com isso conseguimos começar a brincar com o oscilador, por exemplo:
osc.type = 'sine'
osc.frequency.value = 440
No 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:
osc.connect(context.destination)
osc.start()
osc.stop(contexto.currentTime + 2)
Ao rodar por dois segundos, ele emitirá um som. Agora vamos criar um select, dentro dele podemos variar o tipo de onda:
<select id=”type” onchange=”play()”>
<option>-</option>
<option value=”sine”>Sine</option>
<option value=”square”>Square</option>
<option value=”sawtooth”> Sawtooth </option>
<option value=”triangle”> Triangle </option>
</select>
Agora, dentro de script, colocaremos uma function play:
<script>
function play(){
const contexto = (window.AudioContext || window.webkitAudioContex)t
const osc = contexto.createOscillator()
osc.type = document.getElementById('type').value
osc.frequency.value = 440
osc.connect(context.destination)
osc.start()
osc.stop(contexto.currentTime +2)
}
</script>
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.
Confira o video:
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!
T
Escrito por
Tulio Faria
Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.
[Javascript](/tag/javascript)
Compartilhar [X](https://twitter.com/intent/tweet?text=WebAudioAPI%20-%20Gerando%20um%20som%20no%20browser&url=https%3A%2F%2Fdevpleno.com%2Fwebaudioapi) [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fdevpleno.com%2Fwebaudioapi) Copiar link
Continue lendo
## Insights relacionados
[Javascript · 25 de jul. de 2021 Como Criar e Popular Arrays em JavaScript: 5 Formas com Exemplos](/como-gerar-um-array-populado-em-javascript)
[Javascript · 19 de fev. de 2018 Como invocar funções dinamicas em JavaScript](/como-invocar-funcoes-dinamicamente-com-js)
[Javascript · 30 de nov. de 2017 Classificação de imagens com Azure](/azure-cognitive-service)
---
# authors/tulio-faria.md
Source: authors/tulio-faria.md
---
# 10 dicas de produtividade para programadores
Source: blog/10-dicas-de-produtividade-para-programadores/index.md
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.
Na 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.
### 1\. Escolha a ferramenta certa
Há diversas ferramentas que podem ser utilizadas para organizar os fluxos de trabalho e, assim, melhorar a sua produtividade. Elas auxiliam em diferentes atividades. Confira:
#### Gestão de projetos
Planejamento 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.
Entre 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.
#### Gestão de tarefas
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.
#### Editores de texto
Entre 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).
#### Versionamento
Quando 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).
#### Qualidade do código
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).
### 2\. Aposte nos atalhos e _snippets_
Atalhos, _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.
### 3\. Hardware
Algumas 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.
### 4\. Conforto para o cérebro
Outra 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.
Alé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:
#### Plantas
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%.
#### Pausas
Embora 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.
Um [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).
### 5\. Alimentação saudável
Dados 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%.
### 6\. Música e redes sociais
As 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.
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.
### 7\. Pense rápido
A capacidade de tomar decisões rápidas é útil para qualquer profissional. Algumas estratégias podem ajudar nisso.
- 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;
- criatividade: a coragem para inovar pode ser a chave do sucesso em um processo de desenvolvimento de _software_;
- plano B: quando algo não sai como previsto, é preciso ter um plano B para que as decisões sejam mais automáticas;
- pense rápido: pensar de forma ágil é essencial para não comprometer o andamento das atividades;
- 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;
- fundamentação: fatos, relatórios, documentos, planilhas, gráficos e projeções financeiras tornam as decisões mais consistentes.
### 8\. Home office
Uma [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.
### 9\. Uma coisa de cada vez
Um [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.
### 10\. Evite procrastinar
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.
Com 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.
Gostou 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.
---
# 2 Tipos de Soluções de Software que você pode entregar
Source: blog/2-tipos-de-solucoes-de-software-que-voce-pode-entregar/index.md
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.
Basicamente temos duas opções para entregar uma solução para nosso cliente.
### 1 - Entregar exatamente o que o cliente quer
Essa é 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.
### 2 - Entregar o que o cliente realmente precisa
À 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.
Quando entregamos o que ele precisa, geralmente estamos focados no resultado final, porém isso não necessariamente significa entregar um software para o cliente.
Por 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.
Dessa forma, muitas vezes você não entrega software e não consegue cobrar por aquilo.
Quando 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.
Quando 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.
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?
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!
---
# 4 novos Métodos Strings que você precisa conhecer
Source: blog/4-novos-metodos/index.md
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 qualquer e fazemos o seguinte:
```javascript
console.log('Tulio Faria'.startsWith('Tulio'))
```
Será 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.
Podemos também definir a partir de qual parte ele comece a considerar, por exemplo:
```javascript
console.log('Tulio Faria'.startsWith('ulio', 1))
```
Assim ele começa a considerar a partir da primeira letra.
## endsWith
Ele que faz basicamente a mesma coisa que o Starts, mas pega o final, por exemplo:
```javascript
console.log('Tulio Faria'.endsWith('ria'))
```
Lembrando que no endsWith também conseguimos escolher a partir de qual parte considerar:
```javascript
console.log('Tulio Faria'.endsWith('ulio', 5))
```
Consideramos o parâmetro onde irá parar a string.
## Includes
Supondo que eu quero saber se no meu nome inclui 'Machado':
```javascript
console.log('Tulio Machado Faria'.includes('Machado'))
```
Ele verifica se a string está incluída.
## Repeat
Com ela podemos repetir a string quantas vezes quisermos:
```javascript
console.log('01'.repeat(10))
```
Podemos paddings de strings, pegar essa string e colocar na frente de outra, por exemplo, que funciona normalmente.
Considerando 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.
### Confira o vídeo:
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!
---
# 8 dicas de organização para freelancers se darem bem na carreira
Source: blog/8-dicas-de-organizacao-para-freelancers-se-darem-bem-na-carreira/index.md
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.
Contudo, é preciso ter muita disciplina para atuar nessa modalidade. Afinal, o seu rendimento no final do mês será proporcional à sua dedicação e produtividade.
Para 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:
### 1\. Tenha um fundo de reserva
Aqueles 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.
No entanto, isso requer tempo. Portanto, é essencial ter uma reserva financeira, que dará o devido suporte até que você se estabilize.
O 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.
### 2\. Faça um planejamento
Diferente 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.
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&utm_campaign=rc_blogpost) semanais e/ou mensais, certificando-se de cumpri-las. Afinal, a sua renda depende diretamente da sua produção.
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.
Lembre-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.
### 3\. Invista em cursos de capacitação
O 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?
Perceba, 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.
Sendo assim, não tenha medo em investir na sua área, realizando cursos que vão torná-lo um freelancer mais competente.
### 4\. Organize o seu ambiente de trabalho
Ao 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.
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&utm_campaign=rc_blogpost) é garantia de maior remuneração.
Para 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.
### 5\. Honre os prazos
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.
O 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.
Portanto, 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".
### 6\. Defina prioridades
O 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.
Ele, 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.
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.
### 7\. Seja focado
WhatsApp, redes sociais, músicas e televisão: são várias as fontes de distrações que fazem a sua produtividade reduzir substancialmente.
Uma 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.
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ã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.
### 8\. Crie rituais
Realizar 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.
Como 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.
E 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!
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!
---
# A habilidade mais importante que um programador deveria ter (e praticar)
Source: blog/a-habilidade-mais-importante-que-um-programador-deveria-ter-e-praticar/index.md
É 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**.
Sim, exatamente. Perguntar é uma habilidade importantíssima. E antes que você ache isso muito estranho, vamos entender melhor.
O 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.

Neste 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:
- Um resultado pior (neste caso, o resultado 2)
- Nenhum resultado
- Um resultado melhor (neste caso, o resultado 3)
## Qual seria a vantagem de explorar o resultado com mais perguntas?
O 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.
## Mas como saberei qual resultado seria o melhor?
Neste 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.
Trazendo 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.
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.
Isso ainda vai te ajudar a solucionar problemas de uma maneira bastante inteligente, visto que cada nova decisão estará pautada.
## Como exercitar "perguntar" na prática?
**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:
- Qual o motivo de fazerem desta maneira?
- Será que fazem o que estão dizendo?
**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.
A 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.
**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.
Fazemos 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.
**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).
## Antes de encerrar, procure por perguntas de outras pessoas / empresas
Muitas 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.
---
# Porque você não deve abaixar a guarda
Source: blog/abaixar-a-guarda/index.md
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.
Vamos 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.
Entã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.
Curta o DevPleno no Facebook,inscreva-se no canal e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!
---
# Algoritmos: Problema 3n+1
Source: blog/algoritmo-3n-1/index.md
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.
[Veja no meu Gist](https://gist.github.com/tuliofaria/a92d387b68931d1294fddb1c4e259723)
Nã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!
E aqui o algoritmo completo:
```js
{
function cycleLen(n) {
let steps = 1
while (n !== 1) {
if (n % 2 === 0) {
n = n / 2
} else {
n = 3 * n + 1
}
steps++
}
return steps
}
function maxCycle(i, j) {
let max = cycleLen(i)
for (let k = i + 1; k <= j; k++) {
let currentCycle = cycleLen(k)
if (currentCycle > max) {
max = currentCycle
}
}
return i + ' ' + j + ' ' + max
}
console.log(maxCycle(1, 10))
console.log(maxCycle(100, 200))
console.log(maxCycle(201, 210))
console.log(maxCycle(900, 1000))
}
```
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!
---
# Algoritmos: Campo Minado (Minesweeper)
Source: blog/algoritmo-campo-minado-minesweeper/index.md
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.
```jsx
const input = \`4 4
\*...
....
.\*..
....
3 5
\*\*...
.....
.\*...
0 0\`
let lines = input.split('\\n')
let current = 0
let currentField = 1
function minesweeper(field, numCols){
let filledField = \[\]
const len = field.length
for(let i = 0; i0){
if(k>0){
if(filledField\[i-1\]\[k-1\]==='\*'){
filledField\[i\]\[k\]++
}
}
if(filledField\[i-1\]\[k\]==='\*'){
filledField\[i\]\[k\]++
}
if(k+10){
if(filledField\[i\]\[k-1\]==='\*'){
filledField\[i\]\[k\]++
}
}
if(k+10){
if(filledField\[i+1\]\[k-1\]==='\*'){
filledField\[i\]\[k\]++
}
}
if(filledField\[i+1\]\[k\]==='\*'){
filledField\[i\]\[k\]++
}
if(k+1
confira o codigo abaixo:
```js
const input = [
[-3, -2, -1, 1],
[-2, 2, 3, 4],
[4, 5, 7, 8]
]
function countNegative(input) {
let line = 0
let column = input[line].length - 1
let count = 0
while (line < input.length && column >= 0) {
if (input[line][column] < 0) {
count += column + 1
line++
} else {
column--
}
}
console.log(input[line][column])
}
countNegative(input[line][column])
```
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!
---
# Algoritmos: Cyclic Rotation
Source: blog/algoritmos-cyclic-rotation/index.md
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.
### Confira o vídeo:
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!
---
# Algoritmos: Odd Occurrences in Array
Source: blog/algoritmos-odd-occurrences-array/index.md
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:
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!
---
# Algoritmos: PermMissingElement
Source: blog/algoritmos-permmissingelement/index.md
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.
### Confira o vídeo:
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!
---
# Algoritmos: XOR Swap
Source: blog/algoritmos-xoe-swap/index.md
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 realmente faz muito sentido.
Imagine que temos duas variáveis:
```jsx
let a = 3
let b = 4
```
Eu quero simplesmente colocar A em B e B em A, geralmente faríamos uma variável TMP, colocaríamos A,
colocaríamos A = B e em seguida B = TMP:
```jsx
let TMP = a
a = b
b = TMP
```
Precisamos de mais uma variável para conseguir fazer essa troca. Se a gente quisesse fazer utilizando o XOR, é possível:
```jsx
a = a ^ b
b = a ^ b
a = a ^ b
console.log(a, b)
```
Com 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.
Imaginamos que em binário seria:
```jsx
3 | 011
4 | 100
```
Então no primeiro XOR nós teriamos de resultado o 1
```jsx
a | 111
```
Agora vamos pegar nosso x que agora é o valor de A e fazer com o B:
```jsx
a | 111
4 | 100
```
Nosso resultado sera:
```jsx
b | 011
```
Agora faremos um terceiro XOR com o A:
```jsx
b | 011
a | 111
```
E o resultado será:
```jsx
a | 100
```
Perceba 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.
Obviamente ele só funciona com tipos de variáveis numéricas e do mesmo tipo, no nosso exemplo são dois inteiros.
### Confira o vídeo:
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!
---
# Vídeo sobre Algoritmos: XOR Swap
Source: blog/algoritmos-xor-swap/index.md
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!
### Confira o vídeo:
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!
---
# Animação basica em CSS3
Source: blog/animacao-basica-css3/index.md
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.
À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:
```js
.hello{
border:2px solid grey;
transition: all 3s;
}
.hello-active{
border:2px solid red;
background: grey;
}
Olá!
```
O 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.
No 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:
```js
```
O 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:
```js
.hello.hover{
background: green;
}
```
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ã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.
---
# Como fazer anotações em eventos
Source: blog/anotacoes-em-eventos/index.md
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.
Eu 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.
Quando 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.
Essa 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.
Isso é 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.
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!
---
# Aplicação Web - Entendendo Back-end e Front-end
Source: blog/aplicacao-web/index.md
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.
**O que é back-end?**
São todas as tecnologias que rodam em um "Servidor", uma ou mais maquinas.
**E o front-end?**
Ele é tudo que roda do lado cliente, ou seja, o que o usuário final vê.
Para 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).
A primeira comunicação sempre é feita do Front-end para o Beck-end. Por exemplo, ao entrar no site [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.
**Quais tecnologias temos para cada tipo?**
Algumas 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.
Ja 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.
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.
Confira a explicação no vídeo:
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!
---
# Aprenda a aprender
Source: blog/aprenda-a-aprender/index.md
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.
Muita 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.
Quando 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.
Vamos 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.
Uma 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.
A 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!
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!
---
# Aprenda a dizer NÃO!
Source: blog/aprenda-a-dizer-nao/index.md
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.
Muitas 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.
Uma 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.”
Quando 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.
Já 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.
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.
A 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.
Então pense nisso. Essa dica pode mudar a sua vida!
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!
---
# Apresentação em HTML
Source: blog/apresentacao-em-html/index.md
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:
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!
---
# Arrow Functions - Construindo funções anônimas de forma mais simplificada
Source: blog/arrow-functions/index.md
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:
```jsx
const funct1 = function (param1) {}
```
Se fossemos construir isso com uma Arrow Function, poderíamos fazer simplesmente isso:
```jsx
const funct1 = (param) => {}
```
**Por que ela se chama Arrow Function?**
Porque 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:
```jsx
const2 = function (valor) {
return valor * 2
}
```
Se quisermos criar uma Arrow Function nesse sentido, precisamos passar também o valor, mas podemos fazer apenas isso:
```jsx
const funct2 = (valor) => valor * 2
```
Chamamos 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:
```jsx
const vetor = [1, 2, 3]
vetor.map((valor) => valor * 2)
```
A ú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:
```jsx
class Componente extends Component{
loadData(){
//anything
}
render(){
return(
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!
---
# Árvore Binária de Busca - Operação de Busca
Source: blog/operacao-de-busca/index.md
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.
Estou 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:
```jsx
insert(arvore, 10)
//console.log(arvore)
insert(arvore, 11)
//console.log(arvore)
insert(arvore, 9)
//console.log(arvore)
//insert(arvore, 8)
console.log(arvore)
function seach(tree, value){
if(!tree.value || tree.value === value){
return tree.value
}
if(tree.value < value){
return search(tree.left, value)
}
return serach (tree.right, value)
}
console.log(search(arvore, 10)
```
Criamos 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.
Perceba que encontrou o 10, pois ele tinha na árvore. Se procurarmos um valor que não está na árvore, será retornado o undefined.
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.
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.
Confira o vídeo:
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!
---
# Sou contra a orientação-objetos (OO)?
Source: blog/orientacao-objeto/index.md
Hoje eu queria responder uma pergunta que sempre me fazem: “Tulio, você é contra orientação-objetos?”
Primeiramente, eu não sou contra orientação-objetos. Se pegarmos linguagens como JAVA, é um paradigma interessante.
Coisas que eu não gosto em orientação-objeto:
Nó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.
Voltando 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.
Entã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.
Confira o video:
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!
---
# Diferença entre as programações Orientação-objetos, Imperativa e Funcional
Source: blog/orientacao-objetos-imperativa-e-funcional/index.md
Hoje eu quero explicar um pouco melhor essa diferença entre Programação Funcional, Orientação-objetos e Imperativa.
Primeiro, todos os paradigmas são interessantes e importantes, mas antes de falarmos sobre cada um deles, o que é um paradigma?
Ele 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.
Uma 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.
Quando 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.
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.
Para não acontecer isso em programação funcional, é interessante não trazer esses conceitos e apenas a ideia desse pattern.
Mas 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.
Entã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.
Confira o video:
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!
---
# Pare de pensar em classes! Série - POO para JS
Source: blog/pare-de-pensar-em-classes/index.md
Nesta nova série do DevPleno, mostro como podemos passar de programação orientada-objetos para JavaScript mais funcional.
A 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,
por exemplo:
```jsx
class Calc {
constructor(num1, num2) {
this.num1 = num1
this.num2 = num2
}
out() {
console.log(this.num1, this.num2)
}
}
const a = new Calc(1, 2)
a.out()
```
Devo utilizar?
Se 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:
```jsx
a.out.bind({ num: 4, num2: 5 })()
```
Entã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.
Uma forma de construir sem utilizar o class seria assim:
```jsx
const Calc = function (num1, num2) {
this.num1 = num1
this.num2 = num2
return {
out: function () {
console.log(this.num1, this.num2)
}
}
}
```
Mas eu consigo resolver isso de mutar o objeto, evitando por exemplo que o bind funcionasse? Toda function cria um contexto novo.
Para que isso não aconteça, podemos utilizar uma outra construção que não permita que façamos isso:
```jsx
return {
out: () => {
console.log(this.num1, this.num2)
}
}
```
A 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.
Confira o video:
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!
---
# Participação em Eventos e Comunidades
Source: blog/participacao-em-eventos-e-comunidades/index.md
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.
O que eu acho sobre comunidades e participação em eventos?
Qualquer 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.
Aqui 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.
O 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.
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.
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.
O 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.
Tí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.
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.
Entã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?
Confira o video:
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!
---
# Entenda o que é Patternite
Source: blog/patternite/index.md
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.
O que é um Pattern ou Design Pattern?
Ele é 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.
Eu 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:
```jsx
yarn add ejs express
```
Agora vou criar um arquivo novo chamado index.js e dentro dele farei o seguinte:
```jsx
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('olá poo2js')
})
app.listen(3000, (err) => console.log(err, 'server'))
```
O 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.
Quando 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:
```jsx
const express = require('express')
const app = express()
app.set('view engine', 'ejs')
app.get('/', (req, res) => {
res.render('home')
})
app.listen(3000, (err) => console.log(err, 'server'))
```
Dessa 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.
Precisamos criar um diretório Views e dentro dele o home.ejs, ai sim, lá dentro, fazer o nosso html:
```jsx
POO2JS
Olá
```
Isso 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.
Para não ficar uma bagunça, poderíamos por exemplo, criar um arquivo routes e colocar nossas rotas lá dentro:
```jsx
const app = require('express').Router()
app.get('/', (req, res) => {
res.render('home')
})
app.get('/page1', (req, res) => {
res.render('page1')
})
app.get('/page2', (req, res) => {
res.render('page2')
})
module.exports = app
```
Agora, no nosso código inicial, podemos fazer o seguinte:
```jsx
const express = require('express')
const app = express()
app.set('view engine', 'ejs')
const routes = require('./routes')
app.use(routes)
app.listen(3000, (err) => console.log(err, 'server'))
```
Perceba que eu estou classificando as coisas de uma maneira que faz sentido para mim. A gente começou simplesmente com o arquivo index.
Entã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.
Confira o video:
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!
---
# Pegadinha #1 de entrevistas em JavaScript
Source: blog/pegadinha-de-entrevistas-de-javascript/index.md
Hoje quero comentar uma questão muito comum em entrevistas de JavaScript.
Qual é a saída desse código?
```jsx
const arr = ['a', 'b', 'c', 'd']
for (var i = 0; i < arr.length; i++) {
setTimeOut(() => {
console.log(i, arr[i])
}, 0)
}
console.log('out', i)
```
Detalhe que estamos utilizando um setTimeOut com um zero, mas poderia ser qualquer valor.
O 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.
Como 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:
```jsx
out 4
4 undefined
4 undefined
4 undefined
4 undefined
```
Como arrumamos essa função?
Temos algumas formas de arrumar isso. Existe uma bem simples e algumas que podemos brincar um pouco mais.
A primeira bem simples é trocar o var por let:
```jsx
for (let i=0; i {
console.log(i, arr[i])
},0)
```
Agora funcionou perfeitamente:
```jsx
0 'a'
1 'b'
2 'c'
3 'd'
```
Por que essa diferença?
Quando 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.
Por esse motivo, sempre que possível, utilize let e const.
Outra maneira seria transformar em setTimeOut em uma maneira que eu consiga injetar as variáveis dentro dele mesmo, como uma self invoked:
```jsx
setTimeOut(
(function (ii) {
return () => {
console.log(ii, arr[ii])
}
})(i),
0
)
```
Iremos executar a função e a partir da function o ii vai estar válido. Assim funcionará também do jeito que esperávamos.
Confira o video:
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!
---
# Pensamentos limitantes
Source: blog/pensamentos-limitantes/index.md
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.
A primeira que precisa pensar quando se quer ser um desenvolvedor pleno é estudar cada vez mais, conseguir coisas novas e não ter pensamento limitante.
Quando 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.
Confira o video:
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!
---
# Estruturas de Dados - Pilhas
Source: blog/pilha/index.md
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:
```jsx
const vetor = []
vetor.push(1)
vetor.push(2)
console.log(vetor.pop())
console.log(vetor)
```
Percebam 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:
```jsx
const Stack = () => {
const data = []
let top = -1
}
```
Como 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:
```jsx
const Stack = () => {
const data = []
let top = -1
const push = (value) => {
top++
data[top] = value
console.log(data)
}
return {
push
}
}
const stack = Stack
stack.push(1)
stack.push(2)
```
Perceba que ele está montando o vetor perfeitamente adicionando sempre na frente. Agora precisamos remover esse último item:
```jsx
const push = (value) => {
top++
data[top] = value
console.log(data)
}
const pop = () => {
if (top < 0) {
return false
} else {
const itemToReturn = data[top]
delete data[top]
top--
return itemToReturn
}
}
return {
push,
pop
}
console.log(stack.pop())
```
Agora 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:
```jsx
const print = () => {
console.log(data)
}
return {
push,
pop,
print
}
```
Perceba 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:
```jsx
} else {
const itemToReturn = data[top]
data.splice(top, 1)
top--
return itemToReturn
}
```
O splice já faz essa fatia, cortando nosso array no item top.
Acabamos 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.
Confira o video:
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!
---
# Política de Privacidade
Source: blog/politica-de-privacidade/index.md
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ítica de privacidade para **DevPleno**.
Todas 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.
A garantia da confidencialidade dos dados pessoais dos utilizadores do nosso site é importante para o **DevPleno**.
Todas 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).
A 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.
O 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.
Os anúncios
Tal 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.
Os Cookies e Web Beacons
Utilizamos 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.
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.).
Você 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.
Ligações a Sites de terceiros
O **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ão nos responsabilizamos pela política de privacidade ou conteúdo presente nesses mesmos sites.
---
# Por que a Toptal é tão valorizada no mercado?
Source: blog/por-que-a-toptal-e-tao-valorizada/index.md
Você sabe porque a Toptal é tão valorizada no mercado? Neste vídeo, você vai entender melhor sobre o top 3%.
Atualmente 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)
[](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)
---
# Por que fazer um curso de programação voltado para a prática?
Source: blog/por-que-fazer-um-curso-de-programacao-voltado-para-a-pratica/index.md
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.
Poré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.
O 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.
Para 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.
Outo [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.
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á!
### Para conhecer as tecnologias usadas pelas empresas
Quando 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.
Entre as competências que se pode exigir de um desenvolvedor para que entre um projeto, normalmente podemos encontrar:
#### Para desenvolvimento de front-end:
- conhecimento em html5, css3 e javascprit;
- 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.
- pelo menos um conhecimento básico de sistemas para tratamento de imagens e criação de vetores.
#### Já para o desenvolvimento de back-end:
- conhecimento aprofundado em pelo menos uma linguagens de back-end, como NodeJS, Java, Python, PHP, C# etc;
- em relação à linguagem que será trabalhada, é importante ter pelo menos um Framework , como Spring, Django, Laravel, ExpressJS;
- bancos de dados SQL e NoSql;
- sistemas operacionais.
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.
Realmente 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.
### Para ter um visão de projeto
O 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.
Cabe 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.
Está 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.
També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.
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.
Saber 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.
### Para saber lidar com as necessidades dos clientes
Quem 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.
Há 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.
Assim, é 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.
### Para aumentar a qualidade do projeto
Alé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.
Existem 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.
### Para conhecer ferramentas de configuração do ambiente de desenvolvimento
Para 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.
Quer 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.
Outro 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.
Em 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.
Vimos 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.
Até a próxima :)
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!
---
# Por que todo Dev usa Mac?
Source: blog/por-que-todo-dev-usa-mac/index.md
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 é 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.
**Por que eu uso MAC?**
Eu 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.
Se 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?
Outro 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.
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.
Mas 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.
Caso 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. :)
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!
---
# Por que tudo na vida acontece 2x?
Source: blog/por-que-tudo-na-vida-acontece-2x/index.md
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.
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!
---
# Postman - Como testar APIs - Hands-on
Source: blog/postman-como-testar-apis/index.md
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.
O 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.
Primeiro precisamos criar uma conta para ser possível salvar links. Você vai encontrar uma tela parecida com essa:

Como eu já havia criado e feito alguns testes, já tem um histórico do lado, mas o seu estará vazio.
Perceba 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.

Isso 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).

Podemos criar, por exemplo, uma pasta Users e salvar a requisição dentro.
Vou 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.
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.
Se 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:
Vamos 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.

Vamos 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.

Perceba que o POST suporta body, então é possível mandar dados para ele. Vou mandar um name e enviar Tulio:

O form retorna com o valor que coloquei.
Também podemos enviar um arquivo apenas mudando o text para file.
Temos 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.
Confira todos detalhes no vídeo:
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!
---
# Precificação de softwares: você sabe como fazer?
Source: blog/precificacao-de-softwares-voce-sabe-como-fazer/index.md
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.
Para 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).
Portanto, se você quer saber o que considerar nesse processo, continue lendo e veja nossas dicas!
### Como precificar um software?
É 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.
É 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).
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.
### Quais os critérios para precificar um software?
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:
#### Tempo
A 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.
Para 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.
Alé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.
#### Disponibilidade
A 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.
Nesse ponto, há um porém: existem momentos em que há poucos projetos, mas porque são períodos de transição de trabalhos.
#### Nível de experiência
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.
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.
Alé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.
#### Valor agregado
Para 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.
É 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.
#### Os custos envolvidos
Como 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.
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.
#### Os impostos
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.
### Como explicar o valor do software para o cliente?
A 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.
É 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.
També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:
- os preços praticados pelo mercado;
- os gastos com mão de obra não só sua, mas de outros profissionais caso tenha sido preciso contratá-los;
- a experiência necessária para o desenvolvimento do software;
- o tempo de trabalho exigido, especialmente se foi necessário trabalhar em feriados e fins de semana, até mesmo de noite;
- 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.
### Qual a diferença entre precificação de softwares e de outros tipos de produto?
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.
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.
Por 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.
També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.
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!
---
# Dica: Precificação em Software
Source: blog/precificacao-em-software/index.md
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.
Confira o video:
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!
---
# Precisa ter diploma para trabalhar por meio da Toptal?
Source: blog/precisa-ter-diploma-para-a-toptal/index.md
Você não é graduado, mas quer trabalhar por meio da Toptal? Entenda se isso é possível ou não neste vídeo:
Atualmente 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)
---
# Preconceito com JS? Não preparado para corporativo?
Source: blog/preconceito-com-js-nao-preparado-para-corporativo/index.md
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.
Por que isso acontece?
Principalmente 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.
Outra coisa que está quebrando essa barreira é o tooling, muitas das ferramentas que utilizamos hoje é construído com o NODE e baseado no NPM.
Mas 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.
Uma 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.
Confira o video:
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!
---
# Preview de imagens antes do upload
Source: blog/preview-de-imagens-antes-do-upload/index.md
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.
Vamos criar inicialmente um html, em seguida criar um input type do tipo file e um img:
```jsx
Preview Upload
```
Agora vamos abrir uma tag script nele. Quando o documento estiver pronto e for feito um change, vamos fazer um console.log this:
```jsx
```
Assim 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:
```jsx
```
Como a imagem gera uma URL válida, se eu colocá-lo como source da imagem, ele vai dar um preview.
```jsx
```
Isso é 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.
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!
---
# Primeiros passos na Toptal – Série Trabalho Remoto
Source: blog/primeiros-passos-na-toptal/index.md
Depois de passar pelo processo seletivo da Toptal, quais são os primeiros passos? Descubra neste vídeo.
Atualmente 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).
[](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)
---
# Processo Seletivo da Toptal – Série Trabalho Remoto
Source: blog/processo-seletivo-da-toptal/index.md
Seu objetivo é trabalhar remotamente por meio da Toptal? Neste vídeo, você vai entender como funciona o processo seletivo.
Atualmente 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).
[](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)
---
# Programação Assíncrona - NodeJS Primeiros Passos
Source: blog/programacao-assincrona/index.md
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.
**Por que o assíncrono é tão interessante?**
Quando 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.
Como 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.
```jsx
var fs = require('fs')
var contents = fs.readFileSyinc('dados.txt', 'utf8')
console.log(contents)
```
Vamos salvar como Sync.js e mandar rodar usando o comando
```jsx
node sync.js
```
Perceba 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.
Vamos fazer um exemplo com Assíncrono para que fique mais claro:
```jsx
var fs = require('fs');
fs.readFile('dados.txt', 'utf8'), function (err, contents){
console.log(contents)
});
console.log('continuar...')
```
Vamos salvar como async.js. Note que eu passo como parâmetro para essa instrução um callback.
**O que faz uma função de callback?**
Essa 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.
No 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.
Isso é 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.
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.
Confira o vídeo:
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!
---
# Qual o projeto certo para estudar programação?
Source: blog/projeto-certo-para-estudar-programacao/index.md
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?
É 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?”
Neste post, listamos três formas para continuar desenvolvendo aplicações e manter o seu ritmo de estudo em programação.
#### 1) Faça um projeto social
A 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:
Vá 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;
Vá 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;
Vá a uma ONG de proteção aos animais e veja se eles têm algum site ou meio de divulgar o seu trabalho.
Outro 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.
#### 2) Inspire-se em soluções do mercado
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.
Uma 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.
#### 3) Crie um projeto de sua autoria
Nã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!
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.
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!
---
# Promise Constante - como criar situações assíncronas de teste
Source: blog/promise-constante-uma-forma-simples-de-criar-situacoes-assincronas-de-teste/index.md
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:
```jsx
const fs = require('fs')
const readdir = (path) =>
new Promise((resolve, reject) => {
fs.readdir(path, (err, list) => {
if (err) {
reject(err)
} else {
resolve(list)
}
})
})
```
Agora imagine que temos uma outra função chamada path, que é assíncrona:
```jsx
const functA = (path) => {
const list = await readdir(path)
console.log(list)
}
```
Se nós quiséssemos, por exemplo, testar essa função, rodaríamos o funcA:
```jsx
funcA('./')
```
Ela 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.
Quando queremos ter uma promise que é uma constante para a situação que estamos utilizamos, podemos fazer o seguinte:
```jsx
const readdir = (path) => Promise.resolve(['arquivo1.txt', arquivo2.txt])
```
Ele 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.
Quando estamos aprendendo programação assíncrona e queremos fazer esses testes, isso é muito interessante.
Confira o video:
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!
---
# Promise Race - Qual promise resolve/rejeita primeiro
Source: blog/promise-race/index.md
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:
```jsx
const p = (time, name) => {
return new Promise((resolve, reject) => {
setTimeOut(() => resolve(time + ' ' + name), time)
})
}
p(100, 'opa').then((e) => console.log(e))
```
Ao 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:
```jsx
const os = [P(100, 'opa'), P(200, 'opa2')]
Promise.race(os).then((e) => console.log(e))
```
Ao 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:
```jsx
Promise.all(os).then((e) => console.log(e))
```
Assim vamos ter todos os retornos, ao contrário do race.
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!
---
# NodeJS Primeiros Passos - Promises
Source: blog/promises/index.md
Continuando nosso assunto sobre NodeJS, vamos tratar sobre como podemos organizar o fluxo para que o código fique realmente organizado. Olhe esse exemplo:
```jsx
var fs = require('fs')
fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {
fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {
fs.readFile('arquivo3.txt', arquivo1 + '\\n' + arquivo2, function (err) {
console.log('tudo certo')
})
})
})
```
Aqui 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'.
```jsx
npm install q
```
No 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á:
```jsx
var Q = require('q')
var fs = require('fs')
function readArquivo1() {
fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {})
}
function readArquivo2() {
fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {})
}
function readArquivo3() {
fs.readFile('arquivo3.txt', arquivo1 + '\\n' + arquivo2, function (err) {})
}
```
Vamos 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:
```jsx
function readArquivo1(){
...
fs.readFile('arquivo1.txt', 'utf8', function(err, arquivo1){
});
...< linha 2>
}
```
Não é muito bem isso que queremos, afinal queremos um atrás do outro, então podemos fazer o seguinte:
```jsx
function readArquivo1() {
var deferred = '.defer()'
fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {
deferred.resolve(arquivo1)
})
return deferred.promise
}
```
Perceba 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):
```jsx
function readArquivo1() {
var deferred = '.defer()'
fs.readFile('arquivo1.txt', 'utf8', function (err, arquivo1) {
deferred.resolve(arquivo1)
})
return deferred.promise
}
function readArquivo2() {
var deferred = '.defer()'
fs.readFile('arquivo2.txt', 'utf8', function (err, arquivo2) {
deferred.resolve(arquivo2)
})
return deferred.promise
}
function readArquivo3() {
var deferred = '.defer()'
fs.readFile('arquivo3.txt', arquivo1 + '\\n' + arquivo2, function (err) {
deferred.resolve()
})
return deferred.promise
}
readArquivo1().then(function (arquivo1) {
console.log(arquivo1)
})
```
O 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:
```jsx
var conteudo = ''
readArquivo1()
.then(function (arquivo1) {
conteudo += arquivo1
return readArquivo2()
})
.then(function (arquivo2) {
conteudo += arquivo2
console.log(conteudo)
})
```
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.
```jsx
function readArquivo3(conteudo){
var deferred = ".defer()";
fs.readFile('arquivo3.txt', conteudo, function(err){
deferred.resolve();
});
return deferred.promise;
}
var conteudo="";
readArquivo1()
.then(function(arquivo1){
conteudo+= arquivo1;
return readArquivo2();
}).then(function(arquivo2){
conteudo+= arquivo2;
return writeArquivo3(conteudo)
}).then(function())
console.log('tudo certo');
});
```
Perceba 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:
```jsx
readArquivo1().then(readArquivo2).then(readArquivo2)
```
Ele 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.
Confira todos os detalhes no vídeo:
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!
---
# Promisify-Node: Convertendo funções clássicas do Node em Promises
Source: blog/promisify-node/index.md
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.
**Então por que usar o Promisify-Node?**
Ele tem uma funcionalidade bastante relevante que vou mostrar durante o hands-on, vamos lá. Para instalar e adicionar como dependência o Promisify-Node:
```jsx
yarn add promisify-node
```
Vamos importar o promisify e o fs(file system) para termos uma função com o callBack.
```jsx
const promisify = require('promisify-node')
const fs = require('fs')
```
Se fossemos utilizar o fs normalmente, iriamos fazer o seguinte:
```jsx
fs.readFile('arquivo.js', (err, data) => console.log(data.toString()))
```
Entã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.
Podemos pegar essa função fs.readFile, criar uma nova readFile e passar para promisify, assim:
```jsx
const readFile = promisyfy(fs.readFile)
```
**Qual a diferença?**
Agora eu posso chamar a readFile, falar qual arquivo eu quero (no caso o arquivo.js) e chamar ele no modo promisify.
```jsx
readFile('arquivo.js').then((data) => console.log(data.toString()))
```
**Qual a vantagem?**
Alé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.
També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:
```jsx
const fs = promisify('fs')
```
E, assim, qualquer função que eu for utilizar, como por exemplo:
```jsx
fs.readFile('arquivo.js', (err, data) => console.log(data.toString()))
```
Já irá virar naturalmente uma promise, com isso posso fazer:
```jsx
fs.readFile('arquivo.js').then((data) => console.log(data.toString()))
```
Convertendo todos os métodos e funções disponíveis dentro desse módulo, de callback para promise.
**Concluindo**
Ainda 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.
Você também pode conferir o passo a passo desse hands-on por vídeo:
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!
---
# Pure Functions (Funções Puras)
Source: blog/pure-functions-funcoes-puras/index.md
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.
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!
---
# As vantagens do Javascript em todas as camadas de uma aplicação
Source: blog/quais-sao-as-vantagens-de-usar-javascript-em-todas-as-camadas-de-uma-aplicacao/index.md
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 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.
Neste 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.
### O que são exatamente as camadas de uma aplicação?
Também chamadas de stacks, as camadas de uma aplicação são simplesmente o front-end e o back-end de uma aplicação.
E 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.
Já 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.
Existem 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.
Um 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.
### O que são Node.js + Express + EJS + MongoDB?
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.
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.
O 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.
Quando 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.
O 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.
O 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.
Já 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.
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.
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.
### Quais são as vantagens de usar JavaScript em todas as camadas?
O 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.
Entre 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.
E 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.
Se 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.
Outra 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.
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.
É 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.
E 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ê!
---
# Qual é a sua desculpa?
Source: blog/qual-a-sua-desculpa/index.md
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 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.
O 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.
Sempre 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.
Veja o vídeo:
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!
---
# Qual é o seu maior desafio nesse momento?
Source: blog/qual-seu-maior-desafio/index.md
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.
**O que você precisa fazer**
Escreva 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.
Pode ficar tranquilo quanto à privacidade, somente eu tenho acesso a este e-mail
**O projeto**
Depois 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.
Entã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.
Posteriormente, 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.
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.
Aceita entrar nesse desafio? Mande seu e-mail!
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!
---
# Quantas linguagens devo programar?
Source: blog/quantas-linguagens-programar/index.md
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 interessante responder isso e mostrar algumas coisas que acho legal quando pensamos nessas quantidades.
Respondendo 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.
Uma 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.
Alé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.
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.
Confira o vídeo:
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!
---
# Quanto ganha quem trabalha por meio da Toptal?
Source: blog/quanto-ganha-quem-trabalha-por-meio-da-toptal/index.md
A pergunta que não quer calar: Quanto se ganha trabalhando por meio da Toptal?
Atualmente 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.
[](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)
---
# Racionalização: Tomando decisões racionais
Source: blog/racionalizacao/index.md
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.
**Como assim?**
Por 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.
Usando 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.
Quanto 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.
**Como fazer isso?**
Comece a olhar outros projetos de outros 'lugares' e ache razão neles, trazendo para o seu projeto.
Podemos 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.
É 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.
Entã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'.
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!
---
# React 16 - o Pacificador
Source: blog/react-16-o-pacificador/index.md
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.
No 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.
A nova versão do React, a versão 16 também já está nessa licença, isso ficou bastante interessante.
Quero 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.
Algumas 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.
Outra mudança que achei bastante interessante foi que a característica do React foi reescrita todo o core do zero utilizando o projeto Fiber.
Alé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.
Eu considero essa versão do React a versão das “pazes” porque a comunidade estava um pouco desanimada.
Deixe 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/devplenocom) e cadastre seu e-mail para não perder as atualizações. Abraço!
---
# ReactJS: comentários em JSX
Source: blog/reactjs-comentarios-em-jsx/index.md
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 :)
A primeira tentativa seria fazer como um comentário em HTML:
```jsx
render(){
return (
)
}
```
Porém, rapidamente iremos perceber que isso não funciona :)
A segunda tentativa (já que JSX é meio HTML meio JS) seria tentar:
```jsx
render(){
return (
{ <-- isso não vai funcionar :) ---> }
)
}
```
Hum, mas não funcionou :(
Bom, 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.
E aí está o motivo do qual temos que usar { }.
```jsx
render(){
return (
{ /* isso vai funcionar :) */ }
)
}
```
Neste 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 }.
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!
---
# Reconhecimento de nudez com js
Source: blog/reconhecimento-de-nudez-com-js/index.md
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.
O mais comum é checar o quanto de pele ou roupa tem naquela foto.
Para fazer isso vamos utilizar o nude.js, primeiramente vamos baixar as versões compressas, nude.min.js e worker.nude.min.js.
Agora em um html faremos o seguinte:
```jsx
Nude
```
O próprio worker vai arrumar e carregar. Simplesmente temos que carregar essa foto nele e em seguida dar um scan.
No 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
Toda 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.
Confira o video:
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!
---
# Reconhecimento facial com JS
Source: blog/reconhecimento-facial-com-js/index.md
> Implemente reconhecimento facial no navegador com JavaScript usando a biblioteca TrackingJS. Hands-on com visão computacional.
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.
Visã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.
Um 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.
A 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.
Vamos 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:
```jsx
Face Traking
```
O 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.
Agora 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:
```jsx
```
Agora 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:
```jsx
```
Agora podemos mandar rastrear a tag vídeo utilizando a câmera. Fazendo isso, eu consigo enviar um event:
```jsx
tracking.track('#video', tracker, { camera: true })
tracker.on('track', (event) => {
console.log(event)
})
```
Ao 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:
```jsx
```
O retângulo já está lá reconhecendo a cabeça ao se mexer, porém ainda não conseguimos visualizar ele.
Então, para cada retângulo reconhecido, vamos desenhar ele na tela:
```jsx
event.data.foEach((rect) => {
context.strokeStyle = '#ff0000'
context.lineWidth = 2
context.strokeRect(rect.x, rect.y, rect.width, rect.height)
})
```
Com 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.
Além disso ainda podemos mostrar uma informação de onde está sendo reconhecido esse retângulo:
```jsx
event.data.foEach((rect) => {
context.strokeStyle = '#ff0000'
context.lineWidth = 2
context.strokeRect(rect.x, rect.y, rect.width, rect.height)
context.fillText(
`x: ${rect.x}`,
`w: $:{rect.width}`,
rect.x + rect.width + 20,
rect.y + 20
)
context.fillText(
`y: ${rect.y}`,
`h: $:{rect.height}`,
rect.x + rect.width + 20,
rect.y + 40
)
})
```
Assim temos a informação precisa de onde foi encontrado o nosso rosto. Poderíamos utilizar isso para fazer o crop.
Como 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.
Veja o vídeo:
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!
---
# High-order Function - Reduce
Source: blog/reduce/index.md
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.
Suponhamos 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ó.
Como fazer isso?
Primeiramente podemos fazer com uma Arrow Function:
```jsx
const carrinho = [
{ id: 1, preco: 2, qtd: 2 },
{ id: 1, preco: 3, qtd: 1 }
]
carrinho.reduce()
const total = carrinho.reduce((soma, item) => item.preco + soma, 0)
console.log(total)
```
Perceba 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.
Você se lembra que o MAP transforma de um valor para outro? Então poderíamos fazer o seguinte:
```jsx
const carrinho = [
{ id: 1, preco: 2, qtd: 2 },
{ id: 1, preco: 3, qtd: 1 }
]
carrinho.reduce()
const total = carrinho
.map((item) => item.preço * item.qtd)
.reduce((soma, subtotal) => subtotal + soma, 0)
console.log(total)
```
Com 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.
Poderíamos, por exemplo, colocar o item em uma const e passar apenas o subtotal:
```jsx
const subtotal = (item) => item.preço * item.qtd
const total = carrinho
.map(subtotal)
.reduce((soma, subtotal) => subtotal + soma, 0)
console.log(total)
```
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.
Confira o vídeo:
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!
---
# [SEGREDO] Muitos registros do MySQL no NodeJS
Source: blog/registros-do-mysql-no-nodejs/index.md
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 vamos fazer é instalar o driver padrão:
```jsx
yarn add mysql
```
Tudo 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:
```jsx
const mysql = require('mysql')
const connection = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: '',
database: 'cadastro'
})
connection.connect(() => console.log('connected'))
```
Lembrando que eu já tenho um banco de dados para testes. Fizemos algo bem rápido para chegar logo na parte que interessa :)
Depois 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.
```jsx
connection.connect(() => {
console.log('connected')
connection.query('select * from pessoas', (err, results) => {
console.log(results)
})
})
```
Com 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.
Precisamos então fazer essa query de uma outra maneira:
```jsx
connection.connect(() => {
console.log('connected')
const query = connection.query('select * from pessoas')
query.on('result', (row) => {
console.log(row)
})
})
```
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.
Imagine, por exemplo, que temos algum arquivo que não fosse executado de primeira:
```jsx
query.on('result', (row) => {
setTimeout(() => {
console.log(row)
}, 300)
})
```
Quando 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:
```jsx
query.on('result', (row) => {
connection.pause()
setTimeout(() => {
console.log(row)
connection.resume()
}, 300)
})
```
Assim 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:
```jsx
...
},300)
})
query.on('end', () => connection.end())
```
É 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.
Se 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:
```jsx
const query = connection.query('select * from pessoas limit 100')
```
Obviamente que não elimina você ter que testar, mas já ajuda a agilizar seus testes de começo.
Veja o vídeo:
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!
---
# Render condicional em ReactJS
Source: blog/render-condicional-em-reactjs/index.md
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.
### Primeira maneira: utilizando if´s
JSX é 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.
```jsx
import React, { Component } from 'react'
class CondComIf extends Component {
render() {
if (this.props.condicao) {
return
Condicao é verdadeira
}
return
Condicao é falsa
}
}
// para renderizarmos este componente
//
```
**Importante:** sempre o método render precisa retornar algo e que este algo seja apenas uma tag.
### Segunda maneira: condicional com operador lógico
Este formato utiliza a precedência de operadores para funcionar como uma condicional. Por exemplo, se fizermos isso:
```jsx
a === 10 && b === 20
```
Temos 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.
Isso nos permite fazer o seguinte:
```jsx
const a = 10
const b = 20
a===b && console.log('A eh igual a B)
```
Claro que neste exemplo, nunca o console.log será executado, mas creio que fez sentido para você.
Utilizando a mesma ideia, podemos fazer o seguinte:
```jsx
import React, { Component } from 'react'
class CondComOp extends Component {
render() {
return (
Vamos fazer o condicional:
{this.props.condicao && Condicao é verdadeira}
{!this.props.condicao && Condicao é falsa}
)
}
}
// para renderizarmos este componente
//
```
**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).
A 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ã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!_
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!
---
# ReactJS Recursivo?
Source: blog/renderizar-estruturas-em-formato-de-arvore/index.md
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.
Em que isso é útil?
Vamos 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.
Eu 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.
```jsx
class App extends Component {
render(){
const nodes = {
l:{ l:{ v: 1 }, r:{v: 2},
v: '/'},
r:{v: 10}
v:'*'
}
return(
welcome to React
)
}
}
```
Perceba 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_.
Como fazemos isso de forma recursiva?
A 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:
```jsx
import React from 'react'
const Node = (props) => {
return
Node
}
export default Node
```
Voltando ao App.js vamos importar o node e ao invés de colocarmos o H2 vamos colocar o nó dentro dele:
```jsx
import Node from './node'
return (
{' '}
)
```
Então ele escreveu o node, que é o que está dentro do nó.
Vamos mudar, colocar um span em node.js e colocar um JSON com um props.node para sabermos o que tem ali dentro:
```jsx
const Node = (props) =>{
return(
{JSON.stringfy(props.node)
)
}
```
Perceba 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.
```jsx
const Node = (props) => {
return (
{props.node.l && }
{props.node.v}
)
}
```
Com isso ele andou apenas para o lado esquerdo. Podemos adicionar também, por exemplo, apenas o lado direito:
```jsx
{
props.node.r &&
}
```
Agora eu quero saber quando eu renderizar um nó colocar um parênteses para saber quando foi realizado uma conta:
```jsx
const Node = (props) => {
return (
({props.node.l && }
{props.node.v})
)
}
```
Com 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.
Perceba 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.
Poderíamos fazer o parênteses não aparecer nos valores, deixando o resultado muito mais simples.
```jsx
const Node = (props) => {
return (
{props.node.l && props.node.r && (}
{props.node.l && }
{props.node.v}
{props.node.l && props.node.r && )}
)
}
```
Uma coisa interessante é que se fizermos um inspect no browser e usar o react dev tools é possível ver toda a estrutura sendo criada.
Fizemos 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.
Confira todos os passos no vídeo:
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!
---
# Request - Requisições HTTP de forma rápida e simples
Source: blog/request/index.md
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.
Primeiramente vamos instalar:
```jsx
npm install request
```
Agora vamos criar um novo arquivo e fazer um require no nosso request e pegar o site da UOL por exemplo:
```jsx
const request = require('request')
request('https://www.uol.com.br', function (err, res, body) {
if (!err && res.statusCode === 200) {
console.log(body)
}
})
```
Entã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.
Ao 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.
Vamos 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):
```jsx
const request = require('request')
const fs = require('fs')
request('https://www.uol.com.br').pipe(fs.createWriteStream('home.html'))
```
_(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.
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.
Confira o video:
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://goo.gl/VBU2PR)e cadastre seu e-mail para não perder as atualizações.
---
# Request e Response
Source: blog/request-e-response/index.md
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.
Vamos 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/).
Como checar se isso está realmente acontecendo?
No caso do Windows, apertamos F12 usando o Chrome e então irá aparecer esta aba Network:

Perceba 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:

Se 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:

No 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.
```jsx
var express = require ('express');
var app express();
app.get('/', function (req, res){
//res.send('Esta é uma requisição GET.');
//res.send(req.query);
res.send(req.headers);
});
```
Quando rodarmos o exemplo irá aparecer o seguinte:

Mostrando todos os Headers que eu solicitei.
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:
```jsx
var express = require ('express');
var app express();
app.post('/users', function(req,res){
res.send(req.headers);
req.on('data', function(chunk){
//res.send(chunk);
});
});
```
Vamos mandar para https://localhost:3000/users o tipo de requisição, no caso o POST, e um raw, ou seja, um texto puro.

Em 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.

Note 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.
Assista ao vídeo da explicação:
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!
---
# Hands-on: Request-promise
Source: blog/request-promise/index.md
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.
Entã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:
```jsx
yarn request
yarn request promise
```
Em seguida, basta simplesmente importar ele. A assinatura é exatamente a mesma do Request, então eu posso simplesmente trocar para o Request-Promise:
```jsx
const request = require('request-promise')
request('https://httpbin.org/ip').then((res) => console.log(res))
```
Entã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.
Outra vantagem que temos é que podemos fazer o seguinte:
```jsx
const pegarIp = async () => {
const ip = await request('https://httpbin.org/ip')
console.log(ip)
}
pegarIp()
```
Perceba 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:
```jsx
const pegarIp = async () => {
const ip = await request('https://httpbin.org/ip')
const ipPost = await request({
method: 'POST',
json: ip,
uri: 'https://httpbin.org/post'
})
console.log(ipPost)
}
pegarIp()
```
Ele já vai mostrar o data como o IP que eu recebi.
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.
Confira o video:
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!
---
# Dica: Router Props
Source: blog/router-props/index.md
Como passar props para rotas (em react-router) em uma app react?
Dica interessante para injetarmos dependências nos componentes que são dinamicamente renderizados pelo router.
Confira o video:
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!
---
# React-router-dom: como injetar props em rotas em ReactJS
Source: blog/router-props-2/index.md
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.
> Temos também um outro material somente sobre [React-router que você pode ver aqui](https://devpleno.com/router-props).
Vamos fazer a partir de um exemplo básico no qual ele só tem um componente criado com Create-react-app.
```jsx
import React, { Component } from 'react'
import logo from './logo.svg'
import './App.css'
import Home from './Home'
class App extends Component {
render() {
return (
Welcome to React
)
}
}
```
Primeiramente vamos colocar a navegação com o React Router em
```jsx
```
Isso 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.
```jsx
import React, { Component } from 'react'
import logo from './logo.svg'
import './App.css'
import Home from './Home'
import Teste from './Teste'
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
class App extends Component {
render() {
return (
Welcome to React
)
}
}
```
Feito isso, vamos criar o teste.js
```jsx
import React from 'react'
const Teste = () =>
Teste
export default Teste
```
Agora 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.
```jsx
Welcome to React
Home
Teste
```
**Qual o problema?**
Eu preciso passar parâmetros ou props para o componente Home, mas ele não irá funcionar se fizermos assim:
```jsx
```
**Como podemos passar essa props para o componente home?**
Ao 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.
```jsx
} name='Tulio' />
```
Esses 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)._
Com isso, conseguimos efetivamente passar os props que queremos.
```jsx
}
name='Tulio'
/>
```
Alé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.
Isso é 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.
Confira o passo a passo em vídeo:
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!
---
# Por que o Salário em TI é baixo? DevPleno Reponde
Source: blog/salario-em-ti/index.md
Uma pergunta que ouço com frequência, principalmente dos profissionais da área de T.I, é: "Por que o salário em TI é baixo?".
A 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.
Um 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.
Antes 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?
Talvez 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.
O 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.
Vamos 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.
Esqueç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ê.
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.
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.
Outra 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.
Existe um treinamento de um grande mentor meu que trabalha mais sobre essa mentalidade.
Se tiver interesse, mande um e-mail para tuliofaria@devpleno.com. Irei te passar o link.
Confira minha fala em vídeo:
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!
---
# Porque se sujar faz bem!
Source: blog/se-sujar-faz-bem/index.md
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.
Se 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.
Sempre 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.
Outra 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.
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.
Confira o video:
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!
---
# Você é passageiro ou motorista da sua vida?
Source: blog/seja-o-motorista-da-sua-vida/index.md
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 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.
Quando 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.
Uma 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.
Mude 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.
Quando 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.
Confira o video:
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!
---
# Servidor de arquivos e sistemas locais com HTTPS
Source: blog/servidor-de-arquivos/index.md
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).
Perfeito para testes de webhooks ou de APIs do HTML5 que precisam de HTTPS para funcionar.
Para baixar o ngrok: [https://ngrok.com](https://ngrok.com)
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!
---
# NodeJS Primeiros Passos: Servidor HTTP Básico
Source: blog/servidor-http-basico/index.md
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.
O código construído está disponível [Aqui](https://github.com/devpleno/nodejs-servidor-http-basico)
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!
---
# Servidor HTTP Básico - NodeJS Primeiros Passos
Source: blog/servidor-http-basico-2/index.md
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.
Primeira 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)_.
Você precisa conseguir pelo menos escrever no Shell (prompt de comando) o seguinte:
```jsx
npm - v
```
Com isso, conseguimos ver a versão do node package mananger.
E se colocarmos:
```jsx
node - v
```
Aparecerá 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.
Como 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":
```jsx
var http: require('http');
http.createServer(function(req, res){
res.end('DevPleno.com');
});
```
Uma 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)._
```jsx
var http: require('http');
http.createServer(function(req, res){
res.end('DevPleno.com');
}).listen(3000);
```
Vamos salvá-lo como server.js, abrir o prompt de comando e executar o seguinte comando:
```jsx
Node server.js
```
Isso 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)._
```jsx
var http: require('http');
var fs = require('fs');
var contents = fs.readFileSync('contents.html')
http.createServer(function(req, res){
res.end(contents);
}).listen(3000);
```
Em seguida, criar um HTML com o nome contents
```jsx
DevPleno.com
```
Aperte 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.
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.
Confira o passo a passo no vídeo:
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!
---
# Servidor JSON simples em PHP (parte 1)
Source: blog/servidor-json-simples-em-php-parte-1/index.md
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:
```jsx
{
“series”: [],
“genres”:[]
}
```
Esse é 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:
```jsx
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!
---
# Vídeo sobre Servidores Web - o back-end de uma aplicação web
Source: blog/servidores-web-entendo-back-end/index.md
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.
---
# Servidores Web - Um pouco mais do back-end de uma Aplicação Web
Source: blog/servidores-web-um-pouco-mais-back-end-de-uma-aplicacao-web/index.md
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.
Este tipo de arquitetura ainda é muito comum. Atualmente temos algumas outras alternativas, mas esse formato ainda é o mais utilizado.
Quando 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.
Geralmente, 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.
**Quais as opções disponíveis no mercado?**
O 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.
Antigamente 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.
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.
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.
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!
---
# Como servir arquivos e expor servidor local com HTTPS
Source: blog/servir-arquivos-e-expor-servidor/index.md
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).
Pressupondo que a gente já tenha o NodeJS e o NPM instalado vamos fazer o seguinte no cmd:
```jsx
npm install -g http-server
```
Ele 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.
Então vamos lá. Já estou na minha pasta, na qual tenho o HTML, e vou colocar:
```jsx
http - server
```
Ele me mostra alguns endereços, disponibilizando para um servidor e ouve as placas de rede.

Vamos 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?
Uma 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:
```jsx
ngrok http 8080
```
8080 representa a porta que estamos utilizando. Com isso, ele libera dois endereços, um https e um http, abrindo um túnel pela internet.

Se 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.
Uma 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.
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.
Uma coisa interessante: quando abrimos a interface no prompt, perceba que existe um web interface. Se abrirmos esse endereço, temos acesso a esse painel:

Nele 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.
Quando 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.
Confira a dica em vídeo:
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!
---
# ShellJS - Crie ferramentas multiplataformas baseadas no Shell do Linux
Source: blog/shelljs/index.md
Neste hands-on, vou falar mais especificamente sobre o ShellJS, uma implementação do Shell do linux em JavaScript.
Qual a vantagem do ShellJS?
A 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.
Para utilizar o ShellJS precisamos primeiro instalar a ferramenta:
```jsx
yarn add shelljs
```
Vou criar um arquivo novo teste1.js, e importar o o shell e usar o cat para ver o arquivo, por exemplo:
```jsx
const sh = require('shelljs')
const contents = sh.cat('arq1.txt')
console.log(contents.toString())
```
Lembrando 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:
```jsx
const sh = require('shelljs')
sh.cp('arq1.txt', 'arq2.txt')
```
É 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:
```jsx
sh.cp('-R', 'node_modules', 'mods')
```
Ele 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ós utilizamos bastante em alguns projetos para, por exemplo, transformar dados, conectar no banco, atualizar o banco, manipular grandes quantidades de dados, etc.
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!
---
# Short-circuit e valores padrão
Source: blog/short-circuit-e-valores-padrao/index.md
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.
Imagine 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:
```jsx
const DEBUG = true
console.log(1)
Geralmente as pessoas fariam algo assim:
if(DEBUG)
console.log(1)
```
O 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:
```jsx
DEBUG && console.log(1)
```
Se 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.
Essa 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.
A 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.
```jsx
let a = null
let b = a || 'padrão'
```
Se 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 ||.
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.
Confira o video:
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!
---
# Sleep em Generator
Source: blog/sleep-em-generator/index.md
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.
Para 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.
Vamos lá, a primeira coisa que vou fazer é importar o CO.
```jsx
const co = require('co')
```
Se fossemos escrever realmente uma Generator Function iriamos fazer o seguinte:
```jsx
co(function* () {
console.log('Step 1')
sleep(1000)
console.log('Step 2')
})
```
Em JavaScript não temos sleep, obviamente, porque não faz muito sentido porque temos o setTimeout.
Como transformamos o setTimeout em um sleep?
Primeiro 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:
```jsx
function sleep(time){
return new Promise((resolve, reject) =>
setTimeout(resolve, time)
})
```
Com isso, quando chamar o sleep eu consigo utilizar o then para saber que ele rodou depois de um segundo:
```jsx
sleep(1000).then(() => console.log('Depois de um segundo'))
```
Mas 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.
```jsx
co(function* () {
console.log('Step 1')
yield sleep(1000)
console.log('Step 2')
})
```
Com isso temo um sleep mais próximo que tínhamos por exemplo em C, Pascal ou até o PHP.
Confira os passos em vídeo:
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!
---
# Sobre abrir exceções e como lidar quando elas dão errado
Source: blog/sobre-abrir-excecoes/index.md
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, voltei a focar ainda mais no meu objetivo, pois eu tinha aberto uma exceção para uma situação. Qual o problema nisso?
Toda 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.
A 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.
Muitas 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.
Então, não tome decisões visando apenas ajudar se tiver que fugir do seu objetivo.
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!
---
# Sobre o DevPleno
Source: blog/sobre-o-devpleno/index.md
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 aprender as tecnologias que fazem a diferença para sua carreira?
- Como posso cada vez ser mais valorizado em minha profissão?
- Como viver de desenvolvimento de software mesmo morando no interior?
- Como entregar resultados através de meus projetos?
Se você já se fez pelo menos uma destas perguntas, você está no lugar certo!
### Agora, leia a seguir como o DevPleno irá lhe ajudar a melhorar sua vida e sua carreira
Como 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.
#### Mas sabe o que eu vejo como o mais problemático para a profissão?
O 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:
- Conhecimento e prática em tecnologias de mercado
- Uso de processos que ajudam a entregar mais qualidade e resultados
- Conhecimento de mercado para alavancar a carreira e projetos
- E essa lista só está começando, vou aprofundar mais a respeito durante o restante do texto.
Analisando 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 🙂
Bingo! Nunca estive tão motivado a começar algo como o DevPleno que impacta diretamente a vida de tantas pessoas!
#### Tecnologia+Processos+Negócios = DevPleno – um profissional que entrega resultados
### Um pouco da minha história até virar DevPleno
Eu 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).
Neste 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 🙂
Nesta é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!
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.
Depois 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).
Apó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 🙂
Você pode conhecer um pouco mais sobre o motivo pelo qual lancei este projeto neste vídeo:
### O DevPleno é diferente
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 🙂.
---
# Comunicação em tempo-real com Node e Socket.io
Source: blog/socket-io-parte1/index.md
**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 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.
Outra 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.
O 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.
_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.
Para começarmos o projeto, devemos instalar os módulos Socket.io e o Express :
```jsx
yarn add socket.io
yarn add express
```
Feito 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.
```jsx
const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
```
Vamos fazer um teste para ver se esta tudo funcionando corretamente:
```jsx
http.listen(3000, function () {
console.log('listening on port 3000')
})
```
Com 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.
```jsx
const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
app.get('/', (req, res) => {
res.sendFile(
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_dirname + '/index.html'
)
})
```
Mas 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
```jsx
Socket.io
```
Se 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:
```jsx
const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
app.get('/', (req, res) => {
res.sendFile(
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_dirname + '/index.html'
)
})
io.on('connection', (socket) => {
console.log('New connection', socket)
})
```
**O que aconteceu?**
O 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.
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.
Cada socket que temos é gerado um ID da conexão para cada usuário, vamos escrever o ID para saber qual é:
```jsx
io.on('connection', (socket) => {
console.log('New connection', socket.id)
})
```
**Conclusão**
Já 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.
Em breve tem a parte 2 deste hands-on.
Enquanto isso confira o também o vídeo dessa primeira parte:
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!
---
# Hands-on - Socket.io Parte 2
Source: blog/socket-io-parte2/index.md
Continuando nossa série sobre Socket.io, vamos aprofundar um pouco mais no assunto. Lembrando nosso código do lado server:
```jsx
const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html')
})
io.on('connection', (socket) => {
console.log('New connection', socket.id)
})
http.listen(3000, function () {
console.log('listening on port 3000')
})
```
Simplesmente 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)._
Vamos 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.
```jsx
Socket.io
```
**E como isso será notificado?**
Perceba 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.
**O que podemos fazer?**
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.
```jsx
```
E 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).
```jsx
io.on('connection', (socket)=>{
console.log('New connection', socket.id)
}
socket.on('msg', (msg)=>{
console.log(msg)
socket.broadcast.emit('msg', socket.id+' connected');
})
```
Se 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ão aconteceu nada. Está dando erro?**
No 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.
**Por que isso aconteceu?**
Isso 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.
Perceba 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.
```jsx
Socket.io
```
Já do lado servidor, temos que pedir para enviar a mensagem do campo texto ao invés do socket.id, substituindo:
```jsx
socket.broadcast.emit('msg', socket.id + ' connected')
```
Por:
```jsx
socket.broadcast.emit('msg', msg)
```
Confira todos os detalhes no vídeo:
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!
---
# Dicas utilizando o Split em Strings
Source: blog/split-em-strings/index.md
Na dica de hoje quero mostrar alguns 'macetes' que podemos fazer com o Split, uma função de uma String em JavaScript.
Primeiramente o que é Split? Ele divide uma String em partes, por exemplo:
```jsx
const str = 'Tulio Faria'
const parts = str.split(' ')
console.log(parts)
```
Com 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:
```jsx
const parts = str.split(' ').join('====')
```
Assim o resultado seria Tulio===Faria. Em algumas situações, é possível fazer alguns processamentos mais inteligentes com essa técnica.
Alé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:
```jsx
const str = 'Tulio 0 Faria'
const parts = str.split(' ').filter((p) => p != '0')
```
Assim 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.
Outro 'macete' interessante é o seguinte: se eu der um Split em espaço, ele divide letra a letra:
```jsx
.split(' ')
```
Assim poderíamos, por exemplo, tirar as vogais:
```jsx
const vogais = 'aeiou'
.plit(' ')
.split(' ')
.filter((letra) => vogais.indexOf(letra) < 0)
```
Com isso retornamos apenas as consoantes do meu nome.
Confira o video:
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!
---
# Testando o Spread Operator: Novidade do ES6
Source: blog/spread-operator/index.md
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 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.
**Mãos na massa**
Ele é bastante simples, vou criar um exemplo utilizando Array.
Primeiramente temos que criar o Array:
```jsx
const arr = [0, 1, 2]
```
Então, se eu quisesse criar um novo vetor eu faria:
```jsx
constNewArr = [...arr, 3]
```
Somente esses 3 pontinhos já é o Spread Operator.
**E o que ele faz?**
Vai ficar bem claro quando fizermos um teste com funções. Se eu pedir para rodar:
```jsx
console.log(newArr)
```
Ele nos retornará um vetor novo com o 0,1,2,3.
Eu adicionei o item 3 no final e posso manipulá-lo em qualquer posição, por exemplo
```jsx
const NewArr = [3, ...arr]
```
Ele 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.
Se pensarmos assim, podemos fazer o seguinte:
```jsx
function soma(a, b, c) {
returna + b + c
}
```
Ao mandar rodar o
```jsx
console.log(soma(...arr))
```
Ele irá espalhar estes valores em a, b e c e vamos conseguir somar esses valores.
Podemos utilizar isso de várias maneiras, como por exemplo tirando um valor do arr
```jsx
const arr = [0, 1, 2]
```
deixando
```jsx
const arr = [0, 2]
```
E passando para o
```jsx
console.log(soma(1, ...arr))
```
**Dica**
Uma dica fácil é lembrar que ele espalha os valores colocando virgula entre eles. Isso é bastante útil, principalmente quando a gente quer duplicar um vetor.
Você pode conferir o Hands-on também pelo vídeo:
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!
---
# Standard - Padronize o código fonte JavaScript da sua equipe
Source: blog/standard-parte-1/index.md
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:
```jsx
if (i === 1) {
}
```
Com 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.
No caso do Standart, ele tem uma ferramente que checa o código. Para usar, primeiramente tem que dar um npm:
```jsx
npm install -g standard
```
Quando 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:

Entã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:
```jsx
let i = 0
if (i === 1) {
}
```
Ao rodar, percebam que já diminuiu um bug:

Agora temos um espaço vazio na linha 3
```jsx
let i = 0
if (i === 1) {
console.log(1)
}
```
E 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.
Uma coisa que dá bastante discussão é onde colocar a abertura da chave. Se você colocar na linha de baixo, ele irá dar um erro:
```jsx
if (i === 1) {
console.log(1)
}
```

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.
Ele 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.
Confira o hands-on em vídeo:
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!
---
# Standard Parte 2
Source: blog/standard-parte-2/index.md
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.
Imagine o seguinte, você tem um código gigante que precisa passar para o Standard, o que podemos fazer? Vamos lá:
```jsx
standard --fix script.js
```
Com 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:
```jsx
npm install -g snazzy
```
Se rodarmos Standard no nosso código, percebemos que é bem difícil de entender ou achar onde está o problema, então se fizermos:
```jsx
standard | snazzy
```
Ele vai organizar os erros da seguinte forma:

Ele 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.
Eu 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.
Confira o vídeo:
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!
---
# Criando componente mais simples e eficaz em React
Source: blog/stateless-functional-component/index.md
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)._
Um Stateless Functional Component, na verdade, é apenas uma arrow function, então iremos fazê-lo desta forma:
```jsx
import React from 'react'
const Home = () =>
Olá
export default home
```
Este const home = () =>
Olá
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.
**Por que ele é Stateless Functional?**
Ele é 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.
**Quando usamos esse component?**
Quando 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:
```jsx
import React from 'react'
const Home = ({ name }) =>
Olá {name}
export default home
```
E no nosso arquivo App.js, faremos o seguinte:
```jsx
import React,{ Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Home from './Home'
class App extends Component {
render() {
return (
Welcome to React
);
}
}
```
Perceba 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.
Podemos fazer também alguma checagem. Não tem problema nenhum o componente ter uma condicional, desde que retorne o JSX.
Existe uma premissa no React que quanto mais você utiliza o Stateless Functional Component, mais seu código vai estar otimizado.
Assista o passo a passo desse hands-on:
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!
---
# Hands-on: Streams Parte 03 - Duplex
Source: blog/stream-duplex/index.md
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.
**O que o Socket faz?**
Basicamente 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.
**Vamos ao exemplo:**
Se 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.
```jsx
const net = require('net');
const readLine = require('readLine')
if(process.argv\[ process.argv.length-1\] === 'server'){
//server
const server = net.creatServer((socket) =>{
socket.on('data'), (data) => {
socket.write(data)
console.log('Receive from client ' + data)
})
})
server.listen(1337, '127.0.0.1')
}else{
//client
const rl = readLine.createInterface({
input: process.stdin,
output:process.stdout
})
const client = new.net.Socket()
client.connect(1337, '127.0.0.1', () => {
console.log('Connected');
cliente.write('Hello, server!');
rl.addListener('Line', (line) => client.write(line))
})
client.on('data', (data) => console.log('Received: ' + data))
client.on('close', ()=> console.log('Connection clesed'))
```
Quando 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.
**O que acontece neste código?**
**No Server:**
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.
Uma 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.
**No cliente:**
Nele 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.
Ressaltando que o Client também é um Stream Duplex, afinal, nele executamos um.write, que é writable, e o client.on data que é readable.
Por fim, temos um on data. Isso faz com que toda vez que recebermos dados esteja escrito na tela.
**E como isso vai funcionar?**
Para 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.
**Conclusão**
Isso é 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.
Este 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:
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!
---
# Hands-on: Streams Parte 2 - Writable
Source: blog/stream-parte-2-writable/index.md
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/).
**O que é Writable Stream?**
Sã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.
**Qual a vantagem em relação ao modo sem Stream?**
Do mesmo modo que o readable Stream, iremos escrever 'parcelado' neste arquivo, sem necessidade de termos ele inteiro em memória.
**Como ulizamos o Writable Stream?**
Primeiro 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).
```jsx
const sf = require('sf')
const writable = sf.createWriteStream('arquivo.txt', {
flags: 'w',
encoding: 'utf8'
})
writable.write('exemplo\\n')
writable.write('acabou')
```
Temos 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.
Ao 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.
**Por que utilizamos o Writable Stream?**
Podemos construir um arquivo nosso com stream parcialmente e, a medida em que temos acesso a novos dados para serem escritos, podemos adiciona-los.
**Concluindo**
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.
Outras comunicações que utilizam streams como socket io também seguem a mesma sintaxe. Confira o hands-on completo no vídeo:
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!
---
# Hands-on: Streams - Parte 1
Source: blog/streams-parte-1/index.md
Olá!
Neste 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.
**O que é um Stream?**
É 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.
**Qual a vantagem de existir este fluxo de dados?**
Primeiramente isso permite lermos arquivos gigantescos e transformar os dados na medida que vamos lendo estes dados.
Outra 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.
No JavaScript, temos quatro tipos de Stream: Readable (leitura), Writable (escrita), Duplex(ambos os anteriores juntos) e Transform (permite transformação de dados).
**Readable**
Primeiro vamos pegar um arquivo grande, por exemplo arquivo.txt e vamos ler ele com Stream. Vamos chamar o fs para ter acesso a isso.
_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._
```jsx
const fs = require('fs')
const readable = sf.crateReadStream('arquivo.txt')
```
Nó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.
Para 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.
```jsx
const fs = require('fs')
const readable = sf.crateReadStream('arquivo.txt')
readable.on('data', (data) => {
console.log(data.toString())
})
```
Quando 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.
Podemos 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:
```jsx
const fs = require('fs')
const readable = sf.crateReadStream('arquivo.txt')
readable.on('data', (data) => {
console.log(data.toString())
readable.pause()
setTimeout(() => readable.resume(), 2000)
})
```
No 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.
```jsx
const fs = require('fs')
const readable = sf.crateReadStream('arquivo.txt')
readable.on('readable', () => {
while ((chunk = readable.read())) {
console.log(chunk.toString())
}
})
```
**Qual a vantagem do modo paused?**
Eu posso ir processando uma pequena quantia de dados de acordo com o que eu quero.
**Conclusão**
Essa 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:
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!
---
# Hands-on: Streams Parte 4 - Transform
Source: blog/streams-parte-3-transform/index.md
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:
```jsx
const fs = require('fs')
const readable = fs.createReadStream('arquivo.txt')
const writable = fs.createWritableStream('arquivo-2.txt')
readable.pipe(writable)
```
Com 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.
**Para que serve o Pipe?**
O 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:
```jsx
const fs = require('fs')
const zlib = require('zlib')
const readable = fs.createReadStream('arquivo.txt')
const writable = fs.createWritableStream('arquivo-2.txt')
const zipper = zlib.createGzip()
readable.pipe(zipper).pipe(writable)
```
Com 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.
**O que o Zipper faz?**
O 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:
```jsx
const fs = require('fs')
const zlib = require('zlib')
const readable = fs.createReadStream('arquivo.txt')
const readable = fs.createWriteStream('arquivo-upper.txt')
const Transform = require('Stream').Transform
const upperCase = new Transform({
transform(chunk, encoding, callback) {
const chunkUpper = (chunk + '').toUpperCase()
this.push(chunkUpper)
callback()
}
})
readable.pipe(upperCase).pipe(writable)
```
No 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.
Temos 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.
Em resumo, pegamos o que o readable enviou, criamos uma variável nova e passamos esta informação para maiúsculo.
**Qual a utilidade do Transform?**
É 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.
**Conclusão**
Este 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'.
Confira também o vídeo do hand-on:
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!
---
# Sua carreira pode mudar durante o carnaval?
Source: blog/sua-carreira-pode-mudar-durante-o-carnaval/index.md
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?
Bom, pelo menos muita coisa mudou em minha carreira a partir de uma terça feira de carnaval. Estranho isso, né?
Toda 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. :)
Só 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...
Neste 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. ;)
Foi quando recebi o e-mail desta foto:

Sim, uma pessoa que eu havia sido apresentado há 2 anos, lembrou-se de que eu poderia ajudá-la em um projeto.
E 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).


Relembrando este acontecimento, eu consegui desconstruir vários pontos interessantes que gostaria de compartilhar com vocês:
**Network não acontece do dia para a noite!**
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!
**Quanto você está comprometido com a mudança que quer?**
Eu 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.
**Quanto você se coloca em risco?**
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!
[](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)
---
# Criando um teclado com WebAudioAPI
Source: blog/teclado-com-webaudioapi/index.md
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:
```jsx
```
A 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:
```jsx
```
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:
```jsx
const mapOsc = {}
function onKeyDown(key) {
if (map[key.keyCode] && !mapOsc[key.keyCode]) {
const osc = constext.createOscillator()
osc.type = 'sine'
osc.frequency.value = notes[map[key.keyCode]]
osc.connect(contexto.destination)
osc.start()
mapOsc[key.keyCode] = osc
}
}
function onKeyUp(key) {
if (key.keyCode in mapOsc) {
const osc = mapOsc[key.keyCode]
osc.stop(0)
mapOsc[key.keyCode] = undefined
}
}
```
Assim 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.
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!
---
# Técnica para eliminar o que não te faz alcançar seus objetivos
Source: blog/tecnica-para-alcancar-seus-objetivos/index.md
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.
Eu 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.
O 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.
Eu 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.
Hoje 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.
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.
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.
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!
---
# ES6 - Template Strings
Source: blog/template-strings/index.md
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.
```javascript
const str1 = `teste`
console.log(str1)
```
Ela 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:
```javascript
const str1 = `teste`
const strMultiLinha = 'linha1 \n linha2'
console.log(strMultiLinha)
```
Ou seja, teria que utilizar o contra barra (ou scape) em todas as linhas, o que é um tanto chato.
#### O que pode ser feito?
Com o Template String é possível fazer simplesmente isso:
```javascript
const strMultiLinha = `linha1
linha meio
linha2`
console.log(strMultiLinha)
```
Nã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:
```javascript
const str = `Ola \$ {1 + 1} !`
console.log(str)
```
Obviamente também podemos colocar variáveis dentro:
```javascript
const a = 10
const str = `Ola \$ {a + 1} !`
console.log(str)
```
Existe ainda uma outra funcionalidade interessante: utilizar algumas tags com o Template String. Exemplo: Vamos criar uma tag e ela vai receber strings e values.
```javascript
function tag(strings, ...values) {
console.log(strings, values)
return 'opa'
}
const str = tag`Olá \$ {10} mundo!`
```
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:
```javascript
console.log(strings.raw[0])
```
Estamos 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.
Confira o vídeo:
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!
---
# Tenha cicatrizes
Source: blog/tenha-cicatrizes/index.md
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 :)
Essa é uma expressão que eu ouvi em um evento e que faz total sentido.
O que significa ter cicatrizes?
É 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.
Arrisque 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.
Quando 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.
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.
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!
---
# Termos de uso
Source: blog/termos-de-uso/index.md
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.
O 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.
O 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.
O 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.
O acesso ao site DevPleno é gratuito. O DevPleno poderá criar áreas de acesso exclusivo aos seus clientes ou para terceiros especialmente autorizados.
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.
### Erros e falhas
Os 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.
### Limitação da responsabilidade
Os 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.
ODevPleno 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.
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.
### Informações enviadas pelos usuários e colaboradores
Qualquer 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.
O 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.
### Links para sites de terceiros
Os 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.
### Direitos autorais e propriedade intelectual
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.
As 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.
O 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.
As 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.
### Reclamações sobre violação de direitos autorais
O 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.
### Leis aplicáveis
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.
O acesso ao DevPleno representa a aceitação expressa e irrestrita dos termos de uso acima descritos.
---
# Tomar decisões
Source: blog/tomar-decisoes/index.md
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 importante tomar algumas decisões, nem que sejam microdecisões.
Se 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.
Na 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?
Às vezes é algo muito simples, mas as pessoas complicam, com isso a produtividade da empresa como um todo vai para baixo.
Para 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.
Quanto 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.
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.
Entã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.
Já 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.
Confira o video:
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!
---
# O que é a Toptal? | Série Trabalho Remoto
Source: blog/toptal-serietrabalhoremoto/index.md
Você já conhece a Toptal? Entenda o papel desta empresa que é uma das principais referências quando falamos em trabalho remoto.
Atualmente 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)
[](https://go.devpleno.com/fsm?utm_source=blog&utm_campaign=rc_blogpost&sck=blog)
---
# Trabalhar como freelancer: 7 sites para conseguir jobs como programador
Source: blog/trabalhar-como-freelancer-7-sites-para-conseguir-jobs-como-programador/index.md
> Conheça 7 plataformas para encontrar trabalho como programador freelancer, incluindo Toptal, Upwork e 99Freelas. Dicas para começar.
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.
Trabalhar 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.
> 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.
Reuni 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.
### 1. Toptal
A [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.
Os 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.
**Ideal para:** devs com experiência sólida que querem projetos de alto nível pagos em dólar.
### 2. Upwork
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.
A 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.
**Ideal para:** qualquer nível de experiência, especialmente quem quer começar a trabalhar para o exterior.
### 3. Freelancer.com
O [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.
Você 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.
**Ideal para:** quem está começando e quer construir um portfólio com projetos variados.
### 4. Workana
O [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.
A 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.
**Ideal para:** devs que preferem projetos em português/espanhol e querem começar no mercado freelancer latino-americano.
### 5. 99Freelas
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.
Você 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.
**Ideal para:** quem quer começar com projetos nacionais em português, sem a barreira do idioma.
### 6. Scalable Path
O [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.
Isso 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.
**Ideal para:** devs com experiência que preferem ser selecionados em vez de competir em leilões.
### 7. Trampos.co
O [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.
Você 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.
**Ideal para:** quem busca tanto freelance quanto vagas fixas remotas no mercado brasileiro.
### Como escolher a plataforma certa?
Não existe uma resposta única. Minha recomendação:
- **Está começando?** Comece pelo 99Freelas ou Workana para construir reputação sem a barreira do idioma.
- **Tem inglês intermediário?** Crie perfil no Upwork e no Freelancer.com para acessar o mercado internacional.
- **Tem experiência sólida?** Invista no processo seletivo da Toptal ou Scalable Path — os projetos e a remuneração compensam.
- **Quer diversificar?** Mantenha perfis em 2-3 plataformas e veja onde consegue mais tração.
O 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.
Aproveite 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!
---
# Trabalhar em uma grande empresa ou abrir uma empresa? Desvende a questão!
Source: blog/trabalhar-em-uma-grande-empresa-ou-abrir-uma-empresa-desvende-a-questao/index.md
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.
Na 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 é.
Antes 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!
**Como você administra suas tarefas?**
No 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.
Se 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".
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.
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?
**Você se sente capaz de definir metas e atingi-las?**
Na 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.
Portanto, 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.
Se 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.
**Você se considera uma pessoa disciplinada?**
Um 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.
Um 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.
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.
**Como é a sua relação com o dinheiro?**
Esse é 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".
Você 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".
Um 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.
**Como medir o sucesso?**
Um 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.
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.
**Quanto vale o seu trabalho?**
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.
Essa 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.
Trabalhar 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.
A partir desses questionamentos, certamente, você vai conseguir entender melhor se a decisão de abrir uma empresa é realmente a melhor para sua vida!
Por falar em empreendedorismo, você pode gostar destes nossos 2 vídeos:
- [3 dicas para empreender em software](https://www.youtube.com/watch?v=A5RgxkpJIrA&utm_source=blog&utm_campaign=rc_blogpost)
- [Como negociar software (ou qualquer outra coisa)](https://www.youtube.com/watch?v=FszhDTUw2E0&utm_source=blog&utm_campaign=rc_blogpost)
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&utm_campaign=rc_blogpost) e não fique de fora das novidades!
---
# Tudo na vida acontece duas vezes!
Source: blog/tudo-acontece-duas-vezes/index.md
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.
O 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.
Os 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.
Vamos 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.
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!
---
# Usar IA na infraestrutura: quando isso vira risco para o seu produto
Source: blog/usar-ia-na-infraestrutura-riscos/index.md
> Usar IA na infraestrutura pode acelerar deploys, mas também aumentar o risco de perda de dados e falhas críticas. Veja como reduzir esse risco.
Nem todo ganho de velocidade vale o risco operacional. O problema não é usar IA na infra — é deixar ela decidir sozinha em produção.
Se você está usando IA para construir software, tem uma armadilha que parece produtividade, mas pode virar prejuízo rápido:
**não é porque a IA consegue subir sua infraestrutura que você deveria deixar ela fazer isso sozinha.**
Hoje já tem muita gente usando Claude Code, Cursor, Codex e outras ferramentas para configurar servidor, preparar banco, instalar serviços, criar pipelines e até colocar aplicação em produção. O problema é que, quando isso acontece sem revisão, versionamento e rollback, você não está só economizando tempo.
Você está **terceirizando uma decisão crítica** para um sistema probabilístico.
E, quando o assunto é infraestrutura, isso pode custar dado, tempo, dinheiro e confiança do usuário.
O ponto aqui é simples: **IA é alavanca, não substituto de critério.**
Neste post, eu quero te mostrar:
- por que o uso de IA na infraestrutura ficou tão comum
- onde está o risco real dessa prática
- e como usar IA nessa camada sem transformar velocidade em fragilidade
### O problema não é usar IA na infraestrutura
Vale deixar isso claro desde o começo: **o problema não é usar IA na infraestrutura.**
Usar IA para explicar opções, gerar scripts, estruturar pipelines, revisar mudanças e acelerar tarefas repetitivas pode ser extremamente útil. Em muitos casos, isso realmente aumenta a produtividade.
O erro começa quando a IA deixa de ser copiloto e passa a virar **autoridade operacional**.
Infraestrutura não é só "fazer funcionar". Infra envolve, ao mesmo tempo:
- segurança
- persistência de dados
- permissões
- backup
- rollback
- observabilidade
- disponibilidade
- custo operacional
Ou seja: quando você entrega esse contexto inteiro para a IA resolver sozinha, sem uma camada de revisão humana, você assume um risco que muita gente ainda está subestimando.
### Por que isso ficou mais comum com o vibe coding
Boa parte desse comportamento cresceu junto com o vibe coding.
Antes, muita gente nem cogitava subir servidor, configurar banco ou montar ambiente por conta própria. Agora, com uma boa interface e alguns prompts, isso parece simples demais.
A sequência geralmente é parecida:
1. a pessoa quer colocar uma ideia no ar rápido
2. encontra uma VPS barata
3. pede para a IA instalar tudo
4. vê o sistema funcionando
5. assume que está tudo certo
Só que **facilidade de execução não é a mesma coisa que maturidade operacional**.
É aí que mora o risco.
Principalmente para quem não tem background forte em infra, o resultado pode parecer profissional na superfície, mas estar cheio de fragilidades por baixo: portas expostas, segredos mal gerenciados, banco sem backup, deploy sem histórico, rollback inexistente e mudanças difíceis de auditar.
### Os 3 maiores riscos de deixar a IA operar sua infra sem review
#### 1. A IA otimiza para concluir a tarefa, não para proteger o seu negócio
Esse é um dos pontos mais importantes.
Quando você pede para a IA "colocar isso no ar", ela tende a buscar o caminho que resolve a tarefa da forma mais direta possível. O objetivo dela não é preservar o contexto inteiro do seu negócio. O objetivo dela é **fechar a tarefa**.
Na prática, isso pode gerar decisões perigosas:
- sobrescrever configuração
- recriar recursos desnecessariamente
- aplicar mudança destrutiva em banco
- abrir permissões excessivas para "fazer funcionar"
- ignorar um trade-off importante em troca de velocidade
Para a IA, isso pode parecer uma solução plausível.
Para o seu produto, pode virar um incidente.
Por isso o risco não está só em "a IA errar". O risco está em ela **errar de forma operacionalmente cara**.
#### 2. Quem não domina infraestrutura pode não conseguir julgar o que acabou de acontecer
Esse ponto pesa muito para quem está começando a construir produto com IA.
Se você não entende minimamente o que foi configurado, também não consegue responder perguntas essenciais como:
- esse banco está seguro?
- esse servidor está exposto do jeito certo?
- existe backup?
- se quebrar, como volta?
- o que foi alterado de verdade?
- qual parte dessa infra está crítica demais para ficar sem observabilidade?
A sensação de velocidade vira uma falsa sensação de controle.
Você olha a VPS barata, vê a IA fazendo tudo e pensa que ganhou eficiência. Mas pode ter criado uma bomba-relógio que só vai aparecer quando surgir problema em produção.
E o pior: quando você não domina a camada operacional, você tende a perceber o risco só depois do dano.
#### 3. Sem versionamento e revisão, você perde auditabilidade
Quando a IA altera a infraestrutura diretamente, sem passar por código versionado, sem pull request e sem uma etapa de revisão, você perde uma das coisas mais valiosas em ambiente técnico:
**a capacidade de entender o que mudou, por que mudou e como desfazer.**
Sem esse histórico, qualquer erro fica mais caro.
Você não tem:
- diff claro
- ponto de validação antes do deploy
- trilha de auditoria
- rollback confiável
- contexto suficiente para revisar depois
E isso vale tanto para infraestrutura quanto para banco de dados.
Se uma IA decide remover uma coluna, recriar uma tabela ou mudar uma configuração sensível, você precisa conseguir identificar isso **antes** de ir para produção — não depois.
### Como usar IA na infraestrutura de um jeito mais maduro
A forma mais segura de pensar nisso é simples:
**use a IA para acelerar a construção da decisão, não para substituir completamente o critério da decisão.**
Na prática, eu seguiria três caminhos principais.
#### 1. Evite VPS manual sempre que possível
A primeira pergunta não é "como eu subo isso numa VPS?".
A pergunta certa é:
**eu realmente preciso administrar servidor aqui?**
Em muitos casos, especialmente no começo de um SaaS ou de um produto pequeno, a resposta é não.
Você pode usar plataformas como Vercel, Railway, Fly.io e outras opções gerenciadas para reduzir boa parte da carga operacional logo no início.
Isso não elimina responsabilidade técnica. Você ainda precisa cuidar da aplicação, do banco, dos segredos e da lógica de negócio. Mas reduz uma parte importante do risco estrutural.
E vale reforçar uma ideia que muita gente ainda resiste em aceitar:
**PaaS não é preguiça técnica. Muitas vezes é maturidade operacional.**
Escolher uma solução gerenciada no começo pode ser muito mais inteligente do que abrir uma VPS só porque agora a IA consegue configurar isso para você.
#### 2. Trate sua infraestrutura como código
Se você realmente precisa de algo mais customizado, o próximo passo é fazer essa infra existir como artefato versionado.
Ou seja: nada de alteração crítica acontecendo solta em shell, direto no ambiente, sem rastreabilidade.
A IA pode ajudar a:
- escrever scripts
- montar pipelines
- gerar configuração de infraestrutura
- estruturar ferramentas como SST, Terraform e afins
- sugerir migrations
Mas isso precisa virar:
- código versionado
- mudança revisável
- histórico auditável
- base para rollback
Quando a infraestrutura vira código, você consegue olhar com mais calma, perguntar por que determinada escolha foi feita e evitar alterações destrutivas antes que elas cheguem ao ambiente real.
#### 3. Passe por pull request antes do deploy
Esse é o checkpoint que mais reduz risco.
Se a IA ajudou a criar uma mudança, ótimo. Mas antes de publicar, você precisa conseguir revisar:
- o que foi adicionado
- o que foi removido
- o que foi alterado no banco
- quais permissões foram abertas
- quais serviços estão sendo expostos
- quais termos potencialmente destrutivos aparecem na mudança
Mesmo uma revisão simples já é muito melhor do que deixar alteração crítica ir direto para produção.
Se você encontrar sinais como `drop`, `delete`, `remove` ou mudanças inesperadas em tabelas e permissões, isso já acende um alerta para investigar melhor.
O PR não existe para atrasar você. Ele existe para impedir que velocidade sem critério vire retrabalho, perda de dados ou incidente evitável.
### Um checklist prático para usar IA na infraestrutura com mais segurança
Se você quer usar IA na infraestrutura sem cair nessa armadilha, este checklist já reduz muito o risco:
- **Pergunte primeiro se você realmente precisa de VPS**
- **Prefira PaaS quando o objetivo for validar e colocar no ar com menos carga operacional**
- **Nunca deixe mudança crítica acontecer sem histórico**
- **Transforme infra em código versionado**
- **Passe alterações importantes por pull request antes do deploy**
- **Tenha rollback e backup como requisito, não como detalhe**
- **Use IA como copiloto de execução, não como autoridade final**
Esse tipo de disciplina parece exagero no começo. Mas, no longo prazo, é justamente o que separa velocidade sustentável de caos operacional.
### Quando faz sentido usar VPS mesmo assim?
Vale fazer a nuance certa aqui: **VPS não é errada por definição.**
Ela pode fazer sentido por:
- custo em cenários específicos
- necessidade de controle fino
- requisitos de arquitetura mais customizados
- etapa mais madura do produto
- time com repertório operacional para sustentar essa decisão
O ponto não é demonizar VPS. O ponto é evitar que ela vire a escolha padrão só porque a IA tornou esse caminho mais acessível.
A decisão madura não é a mais "hacker". É a que equilibra velocidade, risco, contexto e capacidade real de manutenção.
### O maior risco do vibe coding não é o código
Se eu tivesse que resumir tudo em uma frase, seria essa:
**o maior risco do vibe coding não é o código — é a autonomia sem review.**
Porque, quando a IA escreve código ruim, normalmente você ainda tem mais chance de revisar, testar, refatorar e corrigir.
Mas, quando ela mexe em infraestrutura ou banco de forma direta, o custo do erro pode ser muito maior.
Aí você não está só falando de bug. Você está falando de:
- dado perdido
- ambiente quebrado
- cliente impactado
- tempo gasto para recuperar contexto
- decisões que ninguém consegue auditar depois
É por isso que IA precisa entrar nessa camada com guardrails. Não como mágica. Não como substituta de pensamento. E certamente não como operador autônomo de produção sem checkpoint.
### Conclusão
Usar IA na infraestrutura pode ser uma grande alavanca.
Ela pode acelerar a escrita de scripts, ajudar a montar pipelines, revisar possibilidades, explicar configurações e reduzir fricção técnica.
Mas isso só funciona bem quando existe estrutura em volta.
Sem versionamento, sem revisão e sem rollback, a IA deixa de ser alavanca e passa a ser risco multiplicado.
Então, antes de deixar qualquer agente "resolver sua infra", vale lembrar:
**possibilidade técnica não significa boa decisão.**
Se o seu objetivo é construir software com mais clareza, mais segurança e mais maturidade, o caminho não é automatizar tudo a qualquer custo. O caminho é **automatizar com critério**.
### FAQ
#### Posso usar IA para fazer deploy?
Pode, mas o ideal é usar a IA para apoiar o processo e não para operar produção de forma autônoma. O mais seguro é manter versionamento, revisão e rollback antes de qualquer deploy crítico.
#### É melhor usar VPS ou PaaS quando estou começando?
Na maioria dos casos, PaaS tende a ser a escolha mais segura e prática no início. Você reduz carga operacional e evita assumir complexidade de infraestrutura cedo demais.
#### Infra como código ajuda mesmo quando uso IA?
Sim. Infra como código deixa as mudanças rastreáveis, revisáveis e mais fáceis de auditar. Isso reduz bastante o risco de a IA introduzir alterações problemáticas sem que você perceba.
### Próximo passo
Se você quer construir software com IA sem cair em overengineering, deploy frágil e decisão técnica sem critério, vale acompanhar conteúdos nessa linha.
E, se o seu momento é estruturar melhor stack, deploy e construção de produto com mais maturidade, [**The Best Stack**](https://do.devpleno.com/the-best-stack) pode ser um próximo passo interessante.
---
# Descrição das vagas de emprego no Brasil x no exterior
Source: blog/vagas-de-emprego-no-brasil-e-no-exterior/index.md
Hoje quero comentar um e-mail que recebi e achei bastante relevante falar sobre, principalmente quando estamos olhando para o mercado de desenvolvedor web.
A 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.
Em 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.
Como 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.
No 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.
O que eu fiz para contratar meus funcionários?
Um 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.
Isso 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.
Na Toptal, por exemplo, todos os testes que fiz, foram feitos por engenheiros de softwares da Toptal.
Confira o video:
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!
---
# Validade de um projeto/ideia/ação
Source: blog/validade/index.md
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.
Quando 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.
Por 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.
Quando 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.
Outra 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.
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.
Quando 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.
Entã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.
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!
---
# Vantagens da Injeção de dependência para a testabilidade do código
Source: blog/vantagens-da-injecao-de-depencia/index.md
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.
```jsx
const alerts = {
alerts: (alert, message) => alert(message)
}
module.exports = alerts
```
No 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:
```jsx
const alerts = {
alerts: (alert, message) => alert(message)
}
alerts.alert(window.alert, 'message')
module.exports = alerts
```
Mas 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:
```jsx
const alertUser = require('./alert-user')
test('it calls alert', () => {
const alertMock = jest.fn()
alertUser.alert(alertMock, 'message')
console.log(alertMock.mock.calls)
}
```
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:
```jsx
const alertUser = require('./alert-user')
test('it calls alert', () => {
const alertMock = jest.fn()
const msg = 'message'
alertUser.alert(alertMock, msg)
expect(alertMock.mock.calls [0][0]).toBe('msg')
}
```
Agora vamos supor que nosso código tem algum erro, então ele não chama o alert, apenas retorna
```jsx
const alerts = {
alerts: (alert, message) => 1
}
module.exports = alerts
```
Perceba 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:
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!
---
# Verificando o tempo para executar um trecho de código em Javascript
Source: blog/verificando-o-tempo-para-executar-um-trecho-de-codigo-em-javascript/index.md
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:
1. salvamos a data/hora atual
2. executamos o trecho de código
3. pegamos a data/hora atual e subtraímos o valor encontrado no item 1.
Simples né? Vamos fazer agora em Javascritp:
```jsx
const inicio = new Date().getTime()
// trecho de código que queremos mensurar
const total = new Date().getTime() - inicio
console.log('Foi executado em: ', total)
```
O 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:
```jsx
console.time('TempoLoop')
// trecho de código a ser medido
console.endTime('TempoLoop')
```
O 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!
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!
---
# Você precisa ter DOM para ser um bom profissional?
Source: blog/voce-precisa-ter-dom-para-ser-um-bom-profissional/index.md
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!
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!
---
# WebAudioAPI - Gerando um som no browser
Source: blog/webaudioapi/index.md
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:
```jsx
WebAudioAPI
```
Agora, com o contexto pronto, precisamos criar um oscilador, que é uma forma de gerar essa onda dinâmica:
```jsx
const osc = contexto.createOscillator()
```
Com isso conseguimos começar a brincar com o oscilador, por exemplo:
```jsx
osc.type = 'sine'
osc.frequency.value = 440
```
No 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:
```jsx
osc.connect(context.destination)
osc.start()
osc.stop(contexto.currentTime + 2)
```
Ao rodar por dois segundos, ele emitirá um som. Agora vamos criar um select, dentro dele podemos variar o tipo de onda:
```jsx
```
Agora, dentro de script, colocaremos uma function play:
```jsx
```
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.
Confira o video:
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!
---
# testimonials/david-junior.md
Source: testimonials/david-junior.md
---
# testimonials/lourival-mendes.md
Source: testimonials/lourival-mendes.md
---
# testimonials/marcos-antonio.md
Source: testimonials/marcos-antonio.md
---
## About This Document
This concatenated documentation file is generated automatically by aeo.js
to make it easier for AI systems to understand the complete context of this project.
For a structured index, see: https://devpleno.com/llms.txt
For individual files, see: https://devpleno.com/docs.json
Generated by aeo.js - https://aeojs.org