<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex Ribeiro</title>
    <description>The latest articles on DEV Community by Alex Ribeiro (@alexribeirodev).</description>
    <link>https://dev.to/alexribeirodev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F237117%2F09a2784d-cbbe-4e37-8648-7f70a8c5eb35.jpg</url>
      <title>DEV Community: Alex Ribeiro</title>
      <link>https://dev.to/alexribeirodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexribeirodev"/>
    <language>en</language>
    <item>
      <title>EDA — Arquitetura Orientada a Eventos</title>
      <dc:creator>Alex Ribeiro</dc:creator>
      <pubDate>Mon, 18 Nov 2019 12:00:16 +0000</pubDate>
      <link>https://dev.to/alexribeir0_/eda-arquitetura-orientada-a-eventos-2cfk</link>
      <guid>https://dev.to/alexribeir0_/eda-arquitetura-orientada-a-eventos-2cfk</guid>
      <description>&lt;h3&gt;
  
  
  EDA — Arquitetura Orientada a Eventos
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_dEocuXm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/601/0%2A_7le9jNOJIGbU7Qx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_dEocuXm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/601/0%2A_7le9jNOJIGbU7Qx.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessa postagem tenho como objetivo trazer um resumo do funcionamento de uma de sistemas onde seus componentes se comunicam entre si por meio de eventos, de forma rápida e assíncrona. Espero que o conhecimento aqui exposto auxilie em futuras tomadas de decisões. Vamos lá?!&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;Arquitetura Orientada a Eventos (EDA) é um paradigma de programação. É basicamente o efeito de um ação e reação, onde de acordo com algum acontecimento/evento dentro do sistema pode ou não gerar um novo processo, como o nome já diz: orientado a eventos.&lt;/p&gt;

&lt;p&gt;Esse evento pode ser qualquer coisa dentro do sistema, desde um log a ser gerado, um novo registro sendo inserido no banco de dados, o clique de um mouse… Enfim, existem eventos em praticamente todos os ecossistemas técnicos de nosso dia a dia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como funciona?
&lt;/h3&gt;

&lt;p&gt;De forma simples, o processo seria dividido nos seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Um evento é publicado em um barramento/fila&lt;/li&gt;
&lt;li&gt;Os serviços interessados consomem e reagem aos eventos&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aprofundando um pouco existem 2 modelos de eventos: o modelo de pub/sub e o modelo de fluxo de evento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pub/Sub&lt;/strong&gt; : a infraestrutura de mensagens acompanha o controle de assinaturas. Quando um evento é publicado, ele envia o evento para cada assinante. Depois que um evento é recebido, ele não pode ser reproduzido e não será exibido para assinantes novos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streaming de eventos&lt;/strong&gt; : eventos são gravados em um registro. Os eventos são ordenados e duráveis. Os serviços não assinam o fluxo, em vez disso, um cliente pode ler a partir de qualquer parte do fluxo. O serviço é responsável por avançar a sua posição no fluxo. Isso significa que um serviço pode reagir a qualquer evento que já tenha sido gerado.&lt;/p&gt;

&lt;p&gt;No desenho acima, existe uma etapa central (Event Ingestion) que pode ser um mediador ou um broker de eventos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Ingestion
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Mediador
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tHBfndAX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/951/0%2AjXiPt2RMu9w2BBbW.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tHBfndAX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/951/0%2AjXiPt2RMu9w2BBbW.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usada principalmente quando há necessidade de orquestração ou manipulação de etapas no processamento do evento. Tendo como tipos de componentes a fila, mediador, canais e processador (todos de eventos).&lt;/p&gt;

&lt;p&gt;Exemplos de implementações : Apache Camel, Spring Integration ou Mule ESB.&lt;/p&gt;

&lt;h4&gt;
  
  
  Broker
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z0vyGs77--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/925/0%2AjZ0BSA4Al1-Wgq2Z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z0vyGs77--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/925/0%2AjZ0BSA4Al1-Wgq2Z.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usada quando se tem um fluxo de eventos simples, onde não há necessidade de orquestração dos eventos. Este componente pode ser centralizado ou federado e contém os canais de eventos usados no fluxo, sendo os canais modelo de filas, tópicos de mensagens ou a combinação deles.&lt;/p&gt;

&lt;p&gt;Exemplos de implementações: AWS SQS, Apache ActiveMQ, Apache Kafka.&lt;/p&gt;

&lt;h3&gt;
  
  
  Padrões
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Notificação de evento
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T1ogj2su--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/951/0%2A8wVVfo9UxWRQ02Uf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T1ogj2su--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/951/0%2A8wVVfo9UxWRQ02Uf.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O produtor do evento gera um evento e o envia para um broker de eventos, por exemplo, informando que houve uma alteração de endereço. Os interessados neste evento (no caso os consumidores) serão notificados. Neste modelo, os dados relacionados ao evento não estão nele! Diferente do caso da alteração do endereço, o consumidor queria saber qual é o novo bairro e a rua. Para isso, ele deverá realizar uma consulta no sistema que produziu o evento!&lt;/p&gt;

&lt;h4&gt;
  
  
  Transferência de estado transportado pelo evento
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zjWQCAkW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/973/0%2ALCOj11Je7IsXaYn0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zjWQCAkW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/973/0%2ALCOj11Je7IsXaYn0.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O evento leva os dados relacionados à ele. Neste caso, o consumidor não precisa consultar o produtor para obter mais informações. Com isso, o consumidor não depende de dados de outra aplicação e disponibilidade para fazer o que precisa ser feito, garantindo assim resiliência e disponibilidade no processo executado pelo consumidor, porém isso irá gerar maior complexidade do lado do consumidor por conta de que os dados são de outro domínio.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fonte de eventos (Event Sourcing)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pjooDV9T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/967/0%2Aq2TXf55OXCpmnQ-E.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pjooDV9T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/967/0%2Aq2TXf55OXCpmnQ-E.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modelo muito utilizado para armazenamento de eventos , criando um histórico de eventos. Na prática, isso nos permite realizar auditoria dos dados e retroceder determinado ponto de estado. Como quando existe alguma inconsistência, por exemplo, e é necessário validar o que foi realizado. Com um histórico, também podemos analisar comportamentos e gerar análises de negócio sobre as informações geradas. Este modelo é muito usado com o padrão CQRS (Command Query Responsibility Segregation), que separa escrita de leitura. Nesta mescla dos padrões vocês vão encontrar o event sourcing sendo a fonte de escrita, que muitas vezes possui um Handler, que faz a gestão e distribuição destes dados para bases de consulta. A abordagem de event sourcing hoje é amplamente aplicada e vai desde cases de Internet da Coisas a Data Science.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando usar?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vários subsistemas devem processar os mesmos eventos.&lt;/li&gt;
&lt;li&gt;Processamento em tempo real com retardo mínimo de tempo.&lt;/li&gt;
&lt;li&gt;O processamento de eventos complexos, como a correspondência de padrões ou agregação em janelas de tempo.&lt;/li&gt;
&lt;li&gt;Alto volume e alta velocidade de dados, como IoT.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Produtores e consumidores são separados, aumentando a resiliência e desacoplamento.&lt;/li&gt;
&lt;li&gt;Altamente escalável e distribuído.&lt;/li&gt;
&lt;li&gt;Os consumidores podem responder aos eventos imediatamente assim que chegarem, resultando em operações assíncronas.&lt;/li&gt;
&lt;li&gt;Os subsistemas têm exibições independentes do fluxo de evento.&lt;/li&gt;
&lt;li&gt;Entrega contínua.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;p&gt;Dependendo da situação, estes são pontos negativos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Muita concorrência.&lt;/li&gt;
&lt;li&gt;Pode haver perda de informação&lt;/li&gt;
&lt;li&gt;Pode adicionar mais complexidade se mal implementada&lt;/li&gt;
&lt;li&gt;A garantia de entrega é um problema em grandes volumes&lt;/li&gt;
&lt;li&gt;Desafio para a governança de dados e fluxo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/pt-br/azure/architecture/guide/architecture-styles/event-driven"&gt;https://docs.microsoft.com/pt-br/azure/architecture/guide/architecture-styles/event-driven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://labs.bawi.io/arquitetura-orientada-%C3%A0-eventos-do-jeito-certo-f37727999f15"&gt;https://labs.bawi.io/arquitetura-orientada-%C3%A0-eventos-do-jeito-certo-f37727999f15&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/devs-javagirl/desenvolvimento-de-sistemas-e-arquitetura-baseada-em-eventos-3a9894f6a70a"&gt;https://medium.com/devs-javagirl/desenvolvimento-de-sistemas-e-arquitetura-baseada-em-eventos-3a9894f6a70a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://garywoodfine.com/event-driven-architecture-node-js/"&gt;https://garywoodfine.com/event-driven-architecture-node-js/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/understanding-node-js-event-driven-architecture-223292fcbc2d/"&gt;https://www.freecodecamp.org/news/understanding-node-js-event-driven-architecture-223292fcbc2d/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nelsonbassetto.com/blog/2013/05/event-driven-architecture-parte-1/"&gt;http://nelsonbassetto.com/blog/2013/05/event-driven-architecture-parte-1/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>eventdrivenarchitecture</category>
      <category>eda</category>
      <category>arquiteturadeinformação</category>
      <category>event</category>
    </item>
    <item>
      <title>Git: Um grande aliado</title>
      <dc:creator>Alex Ribeiro</dc:creator>
      <pubDate>Thu, 14 Jun 2018 13:08:00 +0000</pubDate>
      <link>https://dev.to/alexribeirodev/git-um-grande-aliado-41if</link>
      <guid>https://dev.to/alexribeirodev/git-um-grande-aliado-41if</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AaugkC9jV1gsn_kFQ" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AaugkC9jV1gsn_kFQ" width="1024" height="683"&gt;&lt;/a&gt;“A pendrive in the USB port of a laptop” by &lt;a href="https://unsplash.com/@brina_blum?utm_source=medium&amp;amp;utm_medium=referral" rel="noopener noreferrer"&gt;Brina Blum&lt;/a&gt; on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para quem já é da área de desenvolvimento ou já trabalhou com versionamento de algum projeto, certamente já ouviu falar de Git.&lt;/p&gt;

&lt;p&gt;Se ainda não domina esta ferramenta, continue lendo esta postagem que poderá te ajudar em seus projetinhos atuais e futuros.&lt;/p&gt;

&lt;p&gt;Antes de adentrarmos no conceito do que é Git, é importante compreender o que é Controle de Versão, pois o Git (assim como outros semelhantes) utiliza-se deste sistema para fazer o que faz de melhor.&lt;/p&gt;

&lt;p&gt;Segundo a própria documentação que se encontra no site do Git:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O controle de versão é um sistema que registra as mudanças feitas em um arquivo ou um conjunto de arquivos ao longo do tempo de forma que você possa recuperar versões específicas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Outros controles que podemos ter com essas premissas de um controle de versão é a possibilidade de identificar quem é responsável por qualquer modificação, assim como mapear origem de bugs e até mesmo comparar o avanço das mudanças feitas no decorrer do tempo.&lt;/p&gt;

&lt;p&gt;Isso é demais! Imagina quanta segurança e praticidade que isso proporciona sobre nossos projetos?! Alguns pontos importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integridade: controle sobre qualquer alteração nos arquivos ou estrutura do projeto;&lt;/li&gt;
&lt;li&gt;Autenticidade: controle sobre as propriedades e origem dos arquivos de forma a comprovar quem é responsável ou quem alterou algo;&lt;/li&gt;
&lt;li&gt;Disponibilidade: dependendo de onde os arquivos estiverem armazenados, pode-se acessar os projetos de qualquer máquina pela internet ou rede local;&lt;/li&gt;
&lt;li&gt;Confidencialidade: dependendo de como e onde os arquivos estiverem armazenados, pode-se ter controle de autorização de acesso aos mesmos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjj3b32v72vq4pdg5sk9t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjj3b32v72vq4pdg5sk9t.gif" width="480" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Incrível o quanto essa ferramenta pode fazer, néh?!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Afinal, o que é Git?
&lt;/h3&gt;

&lt;p&gt;Git é um sistema de controle de versão de arquivos de forma distribuída, permitindo até mesmo que mais de uma pessoa trabalhe no mesmo projeto.&lt;/p&gt;

&lt;p&gt;Existem diversos sistemas de controle de versão, mas o diferencial do Git é seu foco em velocidade, colocando maior parte dos controle de forma local sem necessidade imediatada de alguma conexão com o repositório principal.&lt;/p&gt;

&lt;p&gt;Outro ponto diferencial do Git é a forma como versiona e garante a integridade dos arquivos, pois ele utiliza-se da ideia de branchs (semelhante ao que seriam snapshots), que podem ser criadas a qualquer instante, ou seja, nos permite ter cópias do mesmo projeto e na mesma pasta.&lt;/p&gt;

&lt;p&gt;Um exemplo simples e prático da utilização dessas vantagens do git: Estou com meu website na branch principal (master) e quero testar algo novo sem interferir no que está pronto e funcional. Crio uma nova branch, a partir dela já poderei alterar o que quiser do projeto. Assim que tudo estiver pronto e testado, pego essas alteração e faço uma união com a branch principal (esta união é chamada de merge). Caso ocorra algum problema na branch principal, posso reverter facilmente qualquer alteração feita para um estado anterior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lista de comandos
&lt;/h3&gt;

&lt;p&gt;Git possui uma variedade de ferramentas que podem ser utilizadas por comandos via terminal. Pode conferir estes comandos logo abaixo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Criar
&lt;/h4&gt;

&lt;p&gt;Clona um repositório existente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone ssh://user@domain.com/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cria um novo repositório local:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Modificações locais
&lt;/h4&gt;

&lt;p&gt;Arquivos modificados no diretório ativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modificações em arquivos versionados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add all current changes to the next commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adiciona as mudanças do &amp;lt;file&amp;gt; no próximo commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add -p \&amp;lt;file\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commita todas as modificações de arquivos versionados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git commit -a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commita modificações preparadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modifica o último commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git commit --amend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Linha do tempo
&lt;/h4&gt;

&lt;p&gt;Mostra todos os commits, começando pelo mais novo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mostra as modificações para um arquivo específico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git log -p \&amp;lt;file\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quem mudou o quê e quando em um arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git blame \&amp;lt;file\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Branchs e tags
&lt;/h4&gt;

&lt;p&gt;Lista todas as branches existentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git branch -av
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muda a branch atual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git checkout \&amp;lt;branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cria uma branch a partir do HEAD atual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git branch \&amp;lt;new-branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deleta uma branch local:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git checkout --track \&amp;lt;remote/branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete a local branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git branch -d \&amp;lt;branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Marca o commit atual com uma tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git tag \&amp;lt;tag-name\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Atualizar e publicar
&lt;/h4&gt;

&lt;p&gt;Lista todos os remotes configurados atualmente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git remote -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mostra informações sobre um remote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git remote show \&amp;lt;remote\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adiciona um novo repositório remoto, nomeado &amp;lt;remote&amp;gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git remote add \&amp;lt;shortname\&amp;gt; \&amp;lt;url\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Baixa todas as modificações do &amp;lt;remote&amp;gt;, mas não integra ao HEAD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git fetch \&amp;lt;remote\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Baixa as modificação e automaticamente faz o merge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git pull \&amp;lt;remote\&amp;gt; \&amp;lt;branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Publica as modificações locais em um remote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git push \&amp;lt;remote\&amp;gt; \&amp;lt;branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deleta uma branch no remote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git branch -dr \&amp;lt;remote/branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Publica suas tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git push — tags
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Merge e rebase
&lt;/h4&gt;

&lt;p&gt;Fazer merge da &amp;lt;branch&amp;gt; no HEAD atual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git merge \&amp;lt;branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fazer rebase do seu HEAD na &amp;lt;branch&amp;gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git rebase \&amp;lt;branch\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abortar um rebase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git rebase --abort
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Continuar um rebase depois de resolver conflitos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git rebase --continue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usar a sua ferramente de merge configurada para resolver conflitos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git mergetool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use seu editor para resolver conflitos manualmente e marcar o arquivo como resolvido:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add \&amp;lt;resolved-file\&amp;gt;

$ git rm \&amp;lt;resolved-file\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Desfazer
&lt;/h4&gt;

&lt;p&gt;Descarta todas as mudanças locais no diretório atual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git reset --hard HEAD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Descarta mudanças locais em um arquivo específico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git checkout HEAD \&amp;lt;file\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reverte um commit (criando um novo com as modifições ao contrário):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git revert \&amp;lt;commit\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reseta o ponteiro do HEAD para um commit anterior&lt;/p&gt;

&lt;p&gt;…e descarta as modificações desde então:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git reset --hard \&amp;lt;commit\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…e preserva todas as modificações como modificações não preparadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git reset \&amp;lt;commit\&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…e preserva modificações locais não commitadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git reset --keep \&amp;lt;commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Eu sei, é muita coisa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jkz9ckb51ul7vpb8mtf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jkz9ckb51ul7vpb8mtf.gif" width="500" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow básico
&lt;/h3&gt;

&lt;p&gt;O fluxo de trabalho com o Git geralmente é uma sequencia bem simples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Você modifica o arquivo ou grupo de arquivos no seu diretório de trabalho;&lt;/li&gt;
&lt;li&gt;Você seleciona os arquivos, adicionando snapshots deles para sua área de preparação;&lt;/li&gt;
&lt;li&gt;Você faz um commit, que leva os arquivos como eles estão na sua área de preparação e os armazena permanentemente no seu diretório Git.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Dica
&lt;/h3&gt;

&lt;p&gt;Se você quiser ou precisar praticar os principais fluxos de trabalho com o Git, recomendo esse site: &lt;a href="http://aprenda.vidageek.net/aprenda/git" rel="noopener noreferrer"&gt;http://aprenda.vidageek.net/aprenda/git&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por ele poderá praticar de forma simplificada e objetiva os diversos comandos do Git.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/pt-br/v1/Primeiros-passos-No%C3%A7%C3%B5es-B%C3%A1sicas-de-Git" rel="noopener noreferrer"&gt;https://git-scm.com/book/pt-br/v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.oficinadanet.com.br/post/16111-o-que-e-e-como-funciona-o-git-e-github" rel="noopener noreferrer"&gt;https://www.oficinadanet.com.br/post/16111-o-que-e-e-como-funciona-o-git-e-github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Git" rel="noopener noreferrer"&gt;https://pt.wikipedia.org/wiki/Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.git-tower.com/blog/git-cheat-sheet" rel="noopener noreferrer"&gt;https://www.git-tower.com/blog/git-cheat-sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Obrigado e até mais!
&lt;/h4&gt;

&lt;p&gt;Se gostou do meu texto, me acompanhe que em breve estarei trazendo novidades.&lt;/p&gt;

&lt;p&gt;Quer saber mais sobre o assunto ou tem alguma dúvida? Deixe um comentário. Ah, estou aberto a críticas também.&lt;/p&gt;

&lt;p&gt;Abraço!&lt;/p&gt;




</description>
      <category>github</category>
      <category>git</category>
    </item>
    <item>
      <title>Node.js: Como criar um servidor HTTP</title>
      <dc:creator>Alex Ribeiro</dc:creator>
      <pubDate>Mon, 19 Mar 2018 00:34:44 +0000</pubDate>
      <link>https://dev.to/alexribeirodev/node-js-como-criar-um-servidor-http-59la</link>
      <guid>https://dev.to/alexribeirodev/node-js-como-criar-um-servidor-http-59la</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgbyynhsu6grldumv7r7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgbyynhsu6grldumv7r7.jpeg" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessa postagem, irei mostrar a vocês como é simples criar um servidor HTTP, mais conhecido como servidor Web, utilizando Node.js.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Caso tenha alguma dúvida sobre o que é Node.js, dê uma lida em minha postagem onde explico de forma simplificada clicando &lt;a href="https://medium.com/@alexribeiro_/o-que-e-nodejs-bc0066b3bfe2" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Criando um servidor HTTP
&lt;/h3&gt;

&lt;p&gt;Pressupondo que já tenha o Node.js instalado em sua máquina. Vamos criar um arquivo chamado &lt;em&gt;app.js&lt;/em&gt; com a seguinte estrutura:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Toda vez que o servidor HTTP recebe uma requisição, a função de callback passada para o método &lt;em&gt;createServer&lt;/em&gt; é executada.&lt;br&gt;&lt;br&gt;
O método listen é o responsável pela parametrização de endereço e porta, escutando os mesmos, possibilitando a execução do servidor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perfeito. Todos as linhas necessárias para a criação de nosso servidor estão prontas. Agora só precisamos iniciar o servidor.&lt;/p&gt;

&lt;p&gt;Pelo terminal, vá até a pasta onde se encontra o arquivo &lt;em&gt;app.js&lt;/em&gt; e execute o seguinte comando: node app.js.&lt;/p&gt;

&lt;p&gt;A saída no terminal será:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Servidor rodando em &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Parar o servidor com: ctrl + c&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A partir de agora, seu servidor Web está rodando! Se tudo estiver correto, ao acessar &lt;a href="http://localhost" rel="noopener noreferrer"&gt;http://localhost&lt;/a&gt;:3000 pelo navegador e terá o mesmo retorno da linha 7: &lt;em&gt;Retorno da requisição.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Servidor configurado e funcionando! Porém, qualquer caminho vai dar o mesmo retorno. Como iríamos configurar diversas rotas com essa estrutura atual?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cjanu1q324kr13r2uy5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cjanu1q324kr13r2uy5.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Calma, meu caro leitor! Irei lhe mostrar uma forma simples e funcional para isso. Vamos lá!&lt;/p&gt;
&lt;h3&gt;
  
  
  Trabalhando com rotas
&lt;/h3&gt;

&lt;p&gt;Sabendo como funciona o fluxo de requisições no servidor, podemos adicionar poucas linhas ao nosso código atual para termos um controle de rotas simples e funcional:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Pronto, agora temos um controle de rotas funcional. Se cancelar a execução atual do servidor com &lt;em&gt;ctrl+c&lt;/em&gt; e rodar novamente o comando &lt;em&gt;node app.js&lt;/em&gt; poderá testar as as rotas.&lt;/p&gt;

&lt;p&gt;Viu só como é simples?! Com poucas linhas temos uma estrutura capaz de receber requisições e dar um retorno baseado em rotas dinâmicas. Brilhante, não?!&lt;/p&gt;

&lt;p&gt;Apesar de funcional, essa estrutura é difícil de se manter. Por diversos motivos a comunidade de JavaScript começou a criar frameworks (novidade?!) para cuidar das rotas.&lt;/p&gt;

&lt;p&gt;A partir deste ponto, podemos construir diversas outras formas de organização e tratamento dos retornos. Deixo essa tarefa com vocês.&lt;/p&gt;

&lt;h4&gt;
  
  
  Obrigado e até mais!
&lt;/h4&gt;

&lt;p&gt;Se gostou do meu texto, me acompanhe que em breve estarei trazendo novidades.&lt;/p&gt;

&lt;p&gt;Quer saber mais sobre o assunto ou tem alguma dúvida? Deixe um comentário. Ah, estou aberto a críticas também.&lt;/p&gt;

&lt;p&gt;Abraço!&lt;/p&gt;




</description>
      <category>node</category>
    </item>
    <item>
      <title>Gearman — Um breve resumo</title>
      <dc:creator>Alex Ribeiro</dc:creator>
      <pubDate>Fri, 23 Feb 2018 12:31:41 +0000</pubDate>
      <link>https://dev.to/alexribeirodev/gearman-um-breve-resumo-3kp3</link>
      <guid>https://dev.to/alexribeirodev/gearman-um-breve-resumo-3kp3</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foh21u7rot7ivi0j5fmaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foh21u7rot7ivi0j5fmaj.png" width="480" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gearman fornece um framework/aplicação genérica para explorar o trabalho de outras máquinas ou processos mais adequados para um determinado trabalho.&lt;/p&gt;

&lt;p&gt;Permite que você trabalhe em paralelo, equilibrar processamento e chamar funções entre linguagens distintas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxy473tvcgrjf8r0ardu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxy473tvcgrjf8r0ardu.png" width="479" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ele pode ser utilizado em uma variedades de aplicações, desde sites de alta disponibilidade até o transporte de eventos de replicação de banco de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfd7zdkpg0ous9wmm7xz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfd7zdkpg0ous9wmm7xz.png" width="478" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em outras palavras, é o sistema nervoso de como o processamento distribuído se comunica.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ce5xj4endjyyujc0cq1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ce5xj4endjyyujc0cq1.png" width="390" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alguns pontos fortes sobre Gearman:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Source&lt;/li&gt;
&lt;li&gt;Multi-linguagem&lt;/li&gt;
&lt;li&gt;Flexível&lt;/li&gt;
&lt;li&gt;Rápido&lt;/li&gt;
&lt;li&gt;Incorporável&lt;/li&gt;
&lt;li&gt;Nenhum ponto de falha&lt;/li&gt;
&lt;li&gt;Sem limites no tamanho dos dados&lt;/li&gt;
&lt;li&gt;Escalável&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Esta instalação tem como foco a possibilidade de executar scripts com PHP. Caso não seja necessário o uso do PHP, seguir somente até o segundo passo e retirar referências ao PHP.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  1. Instalar e atualizar o Gearman PPA
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ apt-get install software-properties-common
$ add-apt-repository ppa:gearman-developers/ppa
$ apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Instalar Gearman e outros componentes e ferramentas
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ apt-get install gearman gearman-tools gearman-job-server libgearman-dev php7.0-dev php-pear wget unzip re2c
$ apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Baixar, compilar o gearman pecl module e adicionar ao php.ini
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd /tmp/
$ wget [https://github.com/wcgallego/pecl-gearman/archive/master.zip](https://github.com/wcgallego/pecl-gearman/archive/master.zip)
$ unzip master.zip
$ cd pecl-gearman-master
$ phpize
$ ./configure
$ make
$ make install
$ echo "extension=gearman.so" \&amp;gt; /etc/php/7.0/mods-available/gearman.ini
$ phpenmod -v ALL -s ALL gearman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Reiniciar o Apache2 ou PHP FPM
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ service php7.0-fpm restart
$ service apache2 restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execução
&lt;/h3&gt;

&lt;p&gt;Executar o servidor Gearman com o seguindo comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gearmand -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verificar o status do servidor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gearadmin --status
worker 0 1 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Na linha de resposta do status, respectivamente, temos o nome da função (worker), o número de tasks na fila (0), o número de jobs rodando (1) e o número de workers capazes (2).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Ferramentas de linha de comando
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Gearman
&lt;/h4&gt;

&lt;p&gt;Com o Gearman, você pode executar funções de clients e workers por linha de comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gearman -H
Common options
 -f \&amp;lt;function\&amp;gt;
 Function name to use for jobs (can give many)
​
 -h \&amp;lt;host\&amp;gt;
 Job server host
​
 -H
 Print this help menu
​
 -p \&amp;lt;port\&amp;gt;
 Gearman server port
​
 -t \&amp;lt;timeout\&amp;gt;
 Timeout in milliseconds
​
 -i \&amp;lt;pidfile\&amp;gt;
 Create a pidfile for the process
​
 -n
 In client mode run one job per line, in worker mode send data packet for each line
​
 -N
 Same as -n, but strip off the newline
​
Client options
 -b
 Run jobs in the background
​
 -I
 Run jobs as high priority
​
 -L
 Run jobs as low priority
​
 -P
 Prefix all output lines with functions names
​
 -s
 Send job without reading from standard input
​
 -u \&amp;lt;unique\&amp;gt;
 Unique key to use for job
​
Worker options\*
 -c \&amp;lt;count\&amp;gt;
 Number of jobs for worker to run before exiting
​
 -w
 Run in worker mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Gearmand
&lt;/h4&gt;

&lt;p&gt;Gearmand é utilizado para iniciar e parametrizar o servidor via linha de comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gearmand -h
General options
 -b [--backlog] arg (=32)
 Number of backlog connections for listen.
​
 --check-args
 Check command line and configuration file argments and then exit.
​
 -d [--daemon]
 Daemon, detach and run in the background.
​
 -f [--file-descriptors] arg
 Number of file descriptors to allow for the process (total connections will be slightly less). Default is max allowed for user.
​
 -h [--help]
 Print this help menu.
​
 -j [--job-retries] arg (=0)
 Number of attempts to run the job before the job server removes it. This is helpful to ensure a bad job does not crash all available workers. Default is no limit.
​
 -l [--log-file] arg
 Log file to write errors and information to. Turning this option on also forces the first verbose level to be enabled.
​
 -L [--listen] arg
 Address the server should listen on. Default is INADDR\_ANY.
​
 -p [--port] arg (=4730)
 Port the server should listen on.
​
 -P [--pid-file] arg
 File to write process ID out to.
​
 -r [--protocol] arg
 Load protocol module.
​
 -R [--round-robin]
 Assign work in round-robin order per worker connection. The default is to assign work in the order of functions added by the worker.
​
 -q [--queue-type] arg
 Persistent queue type to use.
​
 -t [--threads] arg (=4)
 Number of I/O threads to use. Default=4.
​
 -u [--user] arg
 Switch to given user after startup.
​
 -v [--verbose] arg (=v)
 Increase verbosity level by one.
​
 -V [--version]
 Display the version of gearmand and exit.
​
 -w [--worker-wakeup] arg (=0)
 Number of workers to wakeup for each job received. The default is to wakeup all available workers.
​
HTTP:
 --http-port arg (=8080)
 Port to listen on.
​
 sqlite
 --libsqlite3-db arg
 Database file to use.
​
 --libsqlite3-table arg (=gearman\_queue)
 Table to use.
​
 Memcached(libmemcached)
 --libmemcached-servers arg
 List of Memcached servers to use.
​
 Drizzle/MySQL(libdrizzle)
 -host arg
 Host of server.
​
 -port arg
 Port of server. (by default Drizzle)
​
 -uds arg
 Unix domain socket for server.
​
 -user arg
 User name for authentication.
​
 -password arg
 Password for authentication.
​
 -db arg
 Schema/Database to use.
​
 -table arg
 Table to use.
​
 -mysql arg
 Use MySQL protocol.
​
 Postgres
 --libpq-conninfo arg
 PostgreSQL connection information string.
​
 --libpq-table arg (=queue)
 Table to use.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Gearadmin
&lt;/h4&gt;

&lt;p&gt;Gearadmin é uma ferramenta de linha de comando para manipular os servidores do Gearman.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gearadmin --help
--help
Provice help about the program.
​
--create-function
Create a function from the server.
​
-h [--host] arg (=localhost)i
Connect to the host
​
-p [--port] arg (=4730)
Port number or service to use for connection
​
--drop-function
Drop a function from the server.
​
--server-version
Fetch the version number for the server.
​
--server-verbose
Fetch the verbose setting for the server.
​
--status
Status for the server.
​
--workers
Workers for the server.
​
--shutdown
Shutdown server.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;Vamos criar dois scripts PHP, um será para o client e o outro para o worker.&lt;/p&gt;

&lt;p&gt;Client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\&amp;lt;?php
$client = new GearmanClient();
$client-\&amp;gt;addServer();
print $client-\&amp;gt;do("reverse\_string", "Hello World!");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\&amp;lt;?php
$worker = new GearmanWorker();
$worker-\&amp;gt;addServer();
$worker-\&amp;gt;addFunction("reverse\_string", function ($job) {
 return strrev($job-\&amp;gt;workload()) . "\n";
});
while ($worker-\&amp;gt;work());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execução do Worker:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2an17we4cvv963hdjx2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2an17we4cvv963hdjx2f.png" width="464" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Foi executado o script worker.php em segundo plano.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ao verificar o status do servidor, pode-se notar que foi registrado a função reverse_string com um worker registrado como capaz.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caso seja executado uma segunda vez o mesmo worker, a quantidade de workers capazes irá mudar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Execução do Client&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb55bqniwr0vod22auq97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb55bqniwr0vod22auq97.png" width="366" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ao executar o client.php, já obtivemos o retorno programado no worker. Com isso, validamos que o mesmo está funcionando.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Esta aplicação é ótima para diversas situações onde se encontra a necessidade de controlar processos específicos, aliviando o uso acumulado dos recursos do servidor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gearman — &lt;a href="http://gearman.org/" rel="noopener noreferrer"&gt;http://gearman.org/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Obrigado e até mais!
&lt;/h4&gt;

&lt;p&gt;Se você gostou do texto, me acompanhe e terá mais informações em breve.&lt;/p&gt;

&lt;p&gt;Quer saber mais sobre o assunto ou tem alguma dúvida? Deixe um comentário. Ah, estou aberto a críticas também.&lt;/p&gt;




</description>
      <category>gearman</category>
      <category>scheduling</category>
    </item>
    <item>
      <title>O que é Node.js?</title>
      <dc:creator>Alex Ribeiro</dc:creator>
      <pubDate>Thu, 04 Jan 2018 08:01:01 +0000</pubDate>
      <link>https://dev.to/alexribeirodev/o-que-e-node-js-4oh5</link>
      <guid>https://dev.to/alexribeirodev/o-que-e-node-js-4oh5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmn1bg9731m9ancupxy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmn1bg9731m9ancupxy1.png" width="800" height="489"&gt;&lt;/a&gt;Imagem por &lt;a href="https://medium.com/u/96cd9a1fb56" rel="noopener noreferrer"&gt;Node.js Foundation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/a&gt; é um runtime de JavaScript, criado por &lt;a href="https://en.wikipedia.org/wiki/Ryan_Dahl" rel="noopener noreferrer"&gt;&lt;strong&gt;Ryan Dahl&lt;/strong&gt;&lt;/a&gt; em 2009. Foi desenvolvido em cima do motor &lt;strong&gt;JavaScript V8&lt;/strong&gt;  — engine criada pelo Google e utilizado no Chrome e Chromium — , que leva o processamento e renderização do JavaScript para o lado do servidor.&lt;/p&gt;

&lt;p&gt;Node.js usa um modelo de &lt;strong&gt;I/O não bloqueante&lt;/strong&gt; orientada a evento que o torna leve e eficiente, que possibilita criar aplicações rápidas, escaláveis e estáveis. Desde seu surgimento, vem ganhando crescente espaço entre profissionais de tecnologia do Brasil e do mundo.&lt;/p&gt;

&lt;p&gt;Já pensou, poder utilizar &lt;strong&gt;javascript no back-end&lt;/strong&gt; , com a mesma segurança proporcionada por linguagens como &lt;strong&gt;PHP&lt;/strong&gt; e &lt;strong&gt;ASP.NET&lt;/strong&gt;?!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rbhse1bdun2n9mtab7p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rbhse1bdun2n9mtab7p.gif" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para quem já tem certa experiência com desenvolvimento web (certamente conhece a limitação de uso do &lt;strong&gt;Javascript no front-end&lt;/strong&gt; ) nunca iria imaginar essa possibilidade.&lt;/p&gt;

&lt;p&gt;Agora estamos em uma era diferente, onde praticamente todas as grandes limitações do Javascript não existem mais. A cada dia infinitas possibilidades surgem e diversas referências vem aderindo a esse avanço.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que (e quando) utilizar Node.js?
&lt;/h3&gt;

&lt;p&gt;Vou listar pontos cruciais, alguns já mencionados anteriormente, que irão te esclarecer o porquê de utilizar o Node.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Assíncrono&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I/O sem bloqueios&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alta performance&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade fácil e barata&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loop de eventos&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um detalhe que toma a dianteira em relação aos concorrentes é o &lt;strong&gt;loop de eventos&lt;/strong&gt;. Irei explicar melhor como isso funciona.&lt;/p&gt;

&lt;p&gt;Geralmente, um jeito “tradicional” de lidar com muitas requisições é criando múltiplas threads, ou seja, para cada requisição é criada uma thread. Nela é tratada a requisição e somente após o retorno deste tratamento a thread é finalizada. Porém, muito recurso é gasto nesse processo e muitas vezes de forma desnecessária, já que nem sempre todo aquele recurso reservado é utilizado e a thread fica “estacionada” enquanto o tratamento não estiver concluído.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quando uso o termo “tratamento” me refiro a qualquer processo feito antes de devolver uma resposta, seja uma consulta no banco, verificação de arquivo, cálculo…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Já o Node.js, trata toda e qualquer requisição em uma única thread.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Aí você me pergunta: Então como é possível ele ser tão performático?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quando ele recebe uma requisição, ao invés de esperar o resultado do tratamento desta, ele segue com a próxima requisição e assim por diante, como uma fila. Quando alguma requisição em espera tiver seu tratamento finalizado, é sinalizado um evento que a retornará o quanto antes.&lt;/p&gt;

&lt;p&gt;Isso quer dizer que, com o Node.js, temos um ganho muito grande de número de requisições que podem ser processadas.&lt;/p&gt;

&lt;p&gt;Node.js não é apenas um servidor, já que hoje em dia pode ser utilizado para criar até mesmo aplicações desktop. Também é ótimo para realizar diversos tipos de projetos, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs (principal uso);&lt;/li&gt;
&lt;li&gt;Aplicações web real-time como servidores de chat ou aplicações colaborativas entre múltiplos usuários (socket);&lt;/li&gt;
&lt;li&gt;Jogos multiplayer;&lt;/li&gt;
&lt;li&gt;Aplicações que demandam alta escalabilidade;&lt;/li&gt;
&lt;li&gt;Servidores de streaming de dados;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quando não utilizar?
&lt;/h3&gt;

&lt;p&gt;Por usar somente uma thread, ele não serve para lidar com algoritmos complexos que consumam muita CPU, como edição de imagens, por exemplo. Isso impediria a execução de outras ações até o processamento estar completo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quem já utiliza?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Então quer dizer que não é só uma “modinha”?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aqui vai uma lista de empresas conhecidas que utilização esta linda tecnologia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Walmart;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PayPal;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groupon;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Netflix;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New York Times;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flickr&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mozilla&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yahoo.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Obrigado e até mais!
&lt;/h4&gt;

&lt;p&gt;Esta é minha primeira postagem. Se você gostou do meu texto, me acompanhe e terá mais informações em breve.&lt;/p&gt;

&lt;p&gt;Quer saber mais sobre o assunto ou tem alguma dúvida? Deixe um comentário. Ah, estou aberto a críticas também.&lt;/p&gt;




</description>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
