<?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>Forem: Thiago Luna</title>
    <description>The latest articles on Forem by Thiago Luna (@thiagoluna).</description>
    <link>https://forem.com/thiagoluna</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%2F364238%2Fc0f99f82-1f4c-4a54-8d02-e51f3278106c.jpeg</url>
      <title>Forem: Thiago Luna</title>
      <link>https://forem.com/thiagoluna</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/thiagoluna"/>
    <language>en</language>
    <item>
      <title>Liderando em tempos difíceis</title>
      <dc:creator>Thiago Luna</dc:creator>
      <pubDate>Fri, 29 Sep 2023 10:46:53 +0000</pubDate>
      <link>https://forem.com/thiagoluna/liderando-em-tempos-dificeis-5dnn</link>
      <guid>https://forem.com/thiagoluna/liderando-em-tempos-dificeis-5dnn</guid>
      <description>&lt;p&gt;“&lt;em&gt;O mercado de TI cresceu 65% em 2020…&lt;/em&gt;”&lt;br&gt;
No período da pandemia centenas de notícias como essa foram veiculadas na internet mostrando uma nova realidade no mercado de TI.&lt;/p&gt;

&lt;p&gt;Com isso, muitos times cresceram, novas squads foram formadas e novos líderes contratados para  desempenharem um papel de conexão e influência alinhados à visão do negócio da empresa.&lt;br&gt;
O momento era positivo para as empresas que cresciam, para os profissionais que tinham um emprego garantido em meio ao caos da pandemia e para os líderes que, em um ambiente corporativo movitado pelo crescimento, encontravam um ótimo clima organizacional que os ajudava bastante no desenvolvimento de suas atividades. &lt;/p&gt;

&lt;p&gt;O tempo passou, muta coisa aconteceu, muita coisa mudou e, infelizmente, as notícias também mudaram. Passamos a ter notícias dos temidos Layoffs.&lt;br&gt;
Segundo um estudo feito pela Layoffs.fyi, 24.151 mil funcionários foram demitidos nos primeiros 15 dias de 2023 em 91 mil empresas de tecnologia ao redor do mundo. &lt;br&gt;
Agora o clima é outro. Mudou completamente. Para os líderes que continuaram em seus empregos ficou a grande e difícil responsabilidade de manterem os times focados, engajados e motivados. Mas como?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Influenciando Positivamente&lt;/strong&gt;&lt;br&gt;
Servindo de modelo, influenciando de maneira positiva seus liderados, seja através do alinhamento de expectativas tornando as novas regras e fazendo novos acordos de forma explícita, ou através da segurança psicológica, gerando um ambiente tranquilo, livre de práticas nocivas e adequado ao trabalho.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sendo Solícito&lt;/strong&gt;&lt;br&gt;
Observando as necessidades das pessoas a sua volta procurando atendê-las.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tendo Iniciativa&lt;/strong&gt;&lt;br&gt;
Analisando as circunstâncias e atuando de forma a promover resolução.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agindo com Criatividade&lt;/strong&gt;&lt;br&gt;
Não se acomodando diante das situações, sempre buscando fazer o que ainda não foi nem tentado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bom Humor Sempre&lt;/strong&gt;&lt;br&gt;
Independente da situação pessoal/profissional, o líder precisa promover positividade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tendo Empatia&lt;/strong&gt;&lt;br&gt;
Compreender a forma de pensar e agir do outro, gerando uma liderança mais humanizada, promovendo um ambiente empático onde as pessoas se sentem livres e seguras para expressarem seus sentimentos sem a preocupação de serem mal interpretadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Motivando&lt;/strong&gt;&lt;br&gt;
O bom líder mostra àqueles que estão desmotivados que eles podem ir além de suas expectativas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Ser um bom gestor não significa ser o grande amigo da turma ou o linha dura da equipe. Um bom líder é aquele que consegue manter seus liderados motivados e traz os resultados necessários.”&lt;/em&gt; Lucas Oggiam&lt;/p&gt;

&lt;p&gt;Que este pequeno artigo possa nos ajudar a sermos bons líderes formais ou informais, influenciando os demais, seja por causa da confiança estabelecida com os colegas no dia a dia, pela capacidade técnica, história e exemplo de vida, ou pelo comprometimento com o trabalho.&lt;/p&gt;

&lt;p&gt;Que possamos ser agentes de mudança, promovendo um ambiente seguro e saudável.&lt;/p&gt;

&lt;p&gt;Aproveito para deixar um forte abraço para meus/minhas colegas que infelizmente viveram essa experiência de Layoff. Tenho toda certeza de que logo logo estarão de volta no mercado, pois, são excelentes profissionais.&lt;/p&gt;

&lt;p&gt;Há braços e até o próximo artigo!&lt;/p&gt;

&lt;p&gt;Thiago Luna - &lt;a href="https://www.linkedin.com/in/thiago-luna/"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>layoff</category>
      <category>lideranca</category>
      <category>teclead</category>
      <category>motivation</category>
    </item>
    <item>
      <title>SOLID no Laravel - Aplicando princípios e boas práticas para entregar melhores soluções.</title>
      <dc:creator>Thiago Luna</dc:creator>
      <pubDate>Wed, 03 Nov 2021 13:22:05 +0000</pubDate>
      <link>https://forem.com/thiagoluna/solid-no-laravel-aplicando-principios-e-boas-praticas-para-entregar-melhores-solucoes-1ogh</link>
      <guid>https://forem.com/thiagoluna/solid-no-laravel-aplicando-principios-e-boas-praticas-para-entregar-melhores-solucoes-1ogh</guid>
      <description>&lt;p&gt;Olá pessoal!&lt;/p&gt;

&lt;p&gt;Neste artigo, trago um assunto bastante importante e presente no nosso dia a dia como desenvolvedores e que, inclusive, tem sido bastante requisitado em entrevistas de emprego, sobretudo para as vagas de Sênior: Princípios do SOLID.&lt;/p&gt;

&lt;p&gt;SOLID é um acrônimo para os 5 princípios da programação orientada a objetos e design de código teorizados por Robert C. Martin (Tio Bob): Single responsability; Open-closed; Liskov substitution; Interface segregation; Dependency inversion.&lt;/p&gt;

&lt;p&gt;Existe bastante conteúdo na internet e meu objetivo neste artigo não é explicar detalhadamente cada princípio, mas mostrar alguns exemplos de como podemos usá-los para tonar nosso código de fácil entendimento, testável e de fácil manutenção.&lt;/p&gt;

&lt;p&gt;Vou utilizar nos exemplos o PHP usando o framework Laravel.&lt;/p&gt;

&lt;p&gt;Vamos começar com o S&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fn1cqamzl5fjt40njyxoz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fn1cqamzl5fjt40njyxoz.png" alt="Single Responsability"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Princípio da Responsabilidade Única
&lt;/h1&gt;

&lt;p&gt;Este provavelmente é o mais conhecido. Diz que toda entidade, toda classe ou todo método deve fazer apenas uma tarefa, ter apenas uma responsabilidade, apenas uma razão para ser modificado.&lt;/p&gt;

&lt;p&gt;No Laravel, ao invés do Controller fazer todas as tarefas, ele deve ser responsável por controlar a requisição, recebendo os parâmetros, chamando o método necessário de classes externas e, então, retornar o resultado ou fazer um redirecionamento.&lt;/p&gt;

&lt;p&gt;E um bom exemplo disso é não ter os Controllers carregados de tarefas.&lt;br&gt;
&lt;a href="https://media.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%2Flct4y5ihf9nbg4mkdkkn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Flct4y5ihf9nbg4mkdkkn.png" alt="Single Responsability Laravel"&gt;&lt;/a&gt;&lt;br&gt;
Na imagem acima, podemos observar 2 métodos de um Controller, onde ambos têm apenas a responsabilidade de distribuir as tarefas. No caso da function quotation, a responsabilidade de validação dos dados é do FormRequest. A tarefa principal fica sob a responsabilidade do método getQuotatiion que está em um serviço (classe externa). O envio de email para o usuário fica sob a responsabilidade de um outro serviço externo disparado por um Job. E, por fim, o Controller retorna para a view uma mensagem.&lt;/p&gt;

&lt;p&gt;Dessa forma separamos as responsabilidade e não temos mais um Controller enoooorme. Outra vantagem é termos um código menos complexo e mais fácil de entender e manter.&lt;/p&gt;

&lt;p&gt;O seguinte é o...&lt;br&gt;
&lt;a href="https://media.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%2F4cg5fi6mt6oddwkjq84i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F4cg5fi6mt6oddwkjq84i.png" alt="Open/Closed Laravel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Princípio do Aberto/Fechado
&lt;/h2&gt;

&lt;p&gt;Este princípio diz que entidades de software, sejam elas classes, módulos, funções, etc, devem ser abertas para expansão e fechadas para modificação. Um bom exemplo disso são as bibliotecas ou os pacotes que instalamos via composer. Tudo que for instalado na pasta Vendor permanece na pasta Vendor e não pode ser modificado.&lt;/p&gt;

&lt;p&gt;Como exemplo: digamos que eu instalei um pacote para conversão de moedas e que em algum momento vou precisar da descrição da moeda. Na imagem ao lado temos a classe Currency que possui somente 1 atributo. E agora? Altero a classe na pasta Vendor? #sqn&lt;br&gt;
&lt;a href="https://media.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%2F9pa5tewei9778xxl6fx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F9pa5tewei9778xxl6fx7.png" alt="Open/Closed Laravel"&gt;&lt;/a&gt;&lt;br&gt;
De acordo com este princípio vamos estender a classe Currency para, aí sim, termos a liberdade de fazer o que for necessário.&lt;br&gt;
&lt;a href="https://media.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%2F73fgvb0nuh10zpddzntb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F73fgvb0nuh10zpddzntb.png" alt="Open/Closed Laravel"&gt;&lt;/a&gt;&lt;br&gt;
Agora podemos definir uma descrição para a moeda através dessa nova classe que estendeu a classe original.&lt;br&gt;
&lt;a href="https://media.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%2Fs2he5u2mnvk6wiknsyia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fs2he5u2mnvk6wiknsyia.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Com isso, permanecemos fieis a este princípio, mantendo a classe Currency fechada para modificações e aberta para expansões.&lt;/p&gt;

&lt;p&gt;Vantagens? Sim! Facilidade para criar novos comportamentos e dar manutenção.&lt;/p&gt;

&lt;p&gt;Próximo princípio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ftiirt84uharrxu4j5pfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ftiirt84uharrxu4j5pfl.png" alt="Liskov"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Princípio da Substituição de Liskov
&lt;/h1&gt;

&lt;p&gt;Este princípio criado pela Barbara Liskov pode ser um pouco difícil de se entender no começo, mas podemos dizer que as classes devem ser intercambiáveis. Se temos 2 classes fazendo a mesma coisa, um cálculo, por exemplo, devemos ser possíveis de trocar uma classe pela outra sem parar a aplicação. Podemos, então, pensar que todos os parâmetros, tipos de retorno e exceções esperadas devem ser idênticos em ambas classes.&lt;br&gt;
&lt;a href="https://media.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%2Fk03tsqcyjrfctecirlrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fk03tsqcyjrfctecirlrw.png" alt="Liskov Laravel"&gt;&lt;/a&gt;&lt;br&gt;
Neste exemplo, temos 2 classes que calculam a taxa para pagamento em diferentes meios de pagamento. Segundo Liskov, podemos chamar o método calculate() de qualquer classe passando o mesmo parâmetro (float) e obtendo o mesmo retornor (float) sem quebrar a aplicação.&lt;br&gt;
&lt;a href="https://media.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%2Fdwqitvh33voudh4ilbph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fdwqitvh33voudh4ilbph.png" alt="Liskov Laravel"&gt;&lt;/a&gt;&lt;br&gt;
Para a aplicação deste princípio, Type Hinting e Return Type são fundamentais, permitindo que as classes sejam verdadeiramente intercambiáveis.&lt;/p&gt;

&lt;p&gt;As vantagens aqui são código facilmente reutilizável, mais fácil de se ler, entender e manter.&lt;/p&gt;

&lt;p&gt;Chegamos no 4º princípio:&lt;br&gt;
&lt;a href="https://media.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%2Feaapfqs4bo4luoo68ru9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Feaapfqs4bo4luoo68ru9.png" alt="Interface Segregation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Princípio da Segregação de Interfaces
&lt;/h1&gt;

&lt;p&gt;Vemos aqui que classes não devem ser forçadas a depender de métodos que não são utilizados. Já teve que declarar algum método e colocar apenas um "//" ou comentário dentro dele só porque precisou usar um outro método de uma Interface implementada na sua classe?&lt;/p&gt;

&lt;p&gt;Pois é, este princípio orienta a segregar, separar métodos de uma mesma interface em novas interfaces com métodos específicos.&lt;br&gt;
&lt;a href="https://media.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%2F3tev9f29v2yekfp9n3b5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3tev9f29v2yekfp9n3b5.png" alt="Interface Segregation"&gt;&lt;/a&gt;&lt;br&gt;
No exemplo acima, podemos observar que a classe ReportActivatedCurrencies precisa apenas usar o método getData() da interface ReportInterface. Contudo, é obrigada a declarar o método download também, mesmo sem utilizá-lo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Muitas interfaces específicas são melhores do que uma interface única.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Já no exemplo abaixo, veremos como o princípio Interface Segregation trata essa questão.&lt;/p&gt;

&lt;p&gt;Agora temos 2 interfaces distintas, cada uma contendo seu próprio método, e a classe concreta que precisar utilizar algum desses métodos implementará apenas a interface que contém o método.&lt;br&gt;
&lt;a href="https://media.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%2F8s0cjmwcyt4j7grgew4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F8s0cjmwcyt4j7grgew4s.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
O próprio Laravel utiliza bastante este princípio, como por exemplo as interfaces Jsonable, Responsable e Htmlable.&lt;/p&gt;

&lt;p&gt;E por fim, o 5º:&lt;br&gt;
&lt;a href="https://media.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%2F68f58arvteb688zyyfzv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F68f58arvteb688zyyfzv.png" alt="Dependency Inversion Laravel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Princípio da Inversão de Dependência
&lt;/h1&gt;

&lt;p&gt;Basicamente vemos aqui que não devemos depender de implementações, mas sim de abstrações, pois elas sofrem bem menos alterações ou praticamente nenhuma. Na prática, as classes devem depender de Interfaces e não de outras classes concretas.&lt;/p&gt;

&lt;p&gt;Na imagem abaixo, podemos observar um exemplo da classe concreta CurrencyService que, através da injecçao de dependência, depende de uma interface, que nesse caso é o CurrencyRepositoryInterface.&lt;br&gt;
&lt;a href="https://media.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%2Fzeitmrrrfx32pzkodhoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fzeitmrrrfx32pzkodhoq.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Os métodos dessa interface utilizam o Eloquent ORM para operações que envolvem acesso ao banco de dados.&lt;br&gt;&lt;br&gt;
Se por algum motivo eu tenha que utilizar o Doctrine, ao invés do Eloquent, basta apenas criar uma nova classe concreta com os métodos utilizando o Doctrine e, no Laravel, alterar o bind da interface com essa nova classe concreta.&lt;br&gt;
&lt;a href="https://media.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%2Frqmiahyvhiur39ztnkfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Frqmiahyvhiur39ztnkfo.png" alt="Dependency Inversion Laravel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma, com esse princípio aplicado, a classe CurrencyService não sofrerá nenhuma alteração. Tudo continuará do mesmo jeito, pois ela depende da Interface e não da classe concreta que implementa os métodos. Um detalhe é que as 2 classes concretas (CurrencyEloquentRepository e CurrencyDoctrineRepository) precisam ter os métodos exatamente iguais.&lt;/p&gt;

&lt;p&gt;Neste exemplo vemos também o Repository Design Pattern em ação.&lt;/p&gt;

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

&lt;p&gt;Seguindo esses princípios podemos entregar um código mais adaptável às mudanças de escopo, de fácil entendimento e manutenção, testável e bem mais reaproveitável no futuro.&lt;/p&gt;

&lt;p&gt;Quando codamos precisamos perguntar a nós mesmos 2 coisas: quem e como alguém usará meu código no futuro? O que pode mudar no futuro?&lt;/p&gt;

&lt;p&gt;Digamos que daqui a algum tempo seja preciso alterar o gateway de pagamento da empresa X para a Y. A implementação já feita está de fácil entendimento? Será fácil para outro Dev alterar o meio de pagamento?&lt;/p&gt;

&lt;p&gt;Os princípios do SOLID nos ajudam com isso.&lt;/p&gt;

&lt;p&gt;No entanto, como o próprio Tio Bob disse, vale ressaltar que esses princípios não são uma regra, mas sim um norte que contribuirá para a entrega de um bom código.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Os princípios SOLID não são regras. Eles não são leis. Eles não são verdades perfeitas. São declarações na ordem de "Uma maçã por dia mantém o médico longe." Este é um bom princípio, é um bom conselho, mas não é uma verdade pura, nem uma regra.” - Tio Bob&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E com isso chegamos ao final deste artigo com exemplos práticos do SOLID e espero que tenham te ajudado a entendê-lo um pouco melhor.&lt;/p&gt;

&lt;p&gt;Há braços e até o próximo artigo.&lt;/p&gt;

&lt;p&gt;Thiago Luna - &lt;a href="https://www.linkedin.com/in/thiago-luna/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>solid</category>
    </item>
    <item>
      <title>Xdebug 3 no PHPStorm com PHP 7.4</title>
      <dc:creator>Thiago Luna</dc:creator>
      <pubDate>Thu, 23 Sep 2021 21:56:08 +0000</pubDate>
      <link>https://forem.com/thiagoluna/xdebug-3-no-phpstorm-com-php-7-4-55jm</link>
      <guid>https://forem.com/thiagoluna/xdebug-3-no-phpstorm-com-php-7-4-55jm</guid>
      <description>&lt;p&gt;Olá Devs! Muitos bugs? Que bom que temos o Xdebug para nos ajudar!&lt;/p&gt;

&lt;p&gt;Existem vários tutoriais mostrando como configurar o Xdebug  em diferentes versões do PHP no PHPStorm.&lt;br&gt;&lt;br&gt;
Nesse artigo trago um Direto ao Ponto para configurar o Xdebug 3 no PHPStorm com PHP 7.4 e Docker - Linux.&lt;/p&gt;

&lt;p&gt;Primeiro, vamos instalar o xdebug no container.&lt;br&gt;
Em seguida, configurar o PHPStorm.&lt;/p&gt;

&lt;p&gt;Vamos lá!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1- Criar o arquivo docker-php-ext-xdebug.ini.&lt;/strong&gt;&lt;br&gt;
Pode ser na raiz do projeto ou em alguma outra pasta de sua preferência.&lt;br&gt;
Entrar no container e rodar &lt;code&gt;find / -name xdebug.so&lt;/code&gt; para saber o path certo e colocar no zend_extension conforme abaixo:&lt;br&gt;
&lt;code&gt;[xdebug]&lt;br&gt;
zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so&lt;br&gt;
xdebug.mode=debug&lt;br&gt;
xdebug.client_port=9003&lt;br&gt;
xdebug.start_with_request=yes&lt;br&gt;
xdebug.discover_client_host=0&lt;br&gt;
xdebug.client_host=host.docker.internal&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBS:&lt;/strong&gt; Se tiver algum problema com o Xdebug não conseguir se conectar ao host.docker.internal, verificar qual é o ip da máquina local rodando o comando ifconfig (sudo apt install net-tools) e colocar esse ip no xdebug.client_host&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2- Adicionar no Dockerfile:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;# Xdebug&lt;br&gt;
RUN pecl install xdebug &amp;amp;&amp;amp; docker-php-ext-enable xdebug&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# Conferir os paths corretos da pasta php dentro do container&lt;br&gt;
ADD docker-php-ext-xdebug.ini /usr/local/etc/php/conf.d/&lt;br&gt;
RUN echo "include_path=/usr/local/etc/php/conf.d/xdebug.ini" &amp;gt;&amp;gt; /usr/local/etc/php/php.ini&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;OBS: Entrar no container e rodar php --ini para saber os paths certos e colocar nessas linhas acima.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3- Adicionar no docker-compose.yaml a variável de ambiente&lt;/strong&gt; dentro do serviço que vai rodar a aplicação:&lt;br&gt;
&lt;code&gt;extra_hosts:&lt;/code&gt;&lt;br&gt;
&lt;code&gt;- "host.docker.internal:host-gateway"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;environment&lt;/code&gt;&lt;br&gt;
&lt;code&gt;- PHP_IDE_CONFIG=serverName=XdebugServer&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agora vamos seguir com as configurações no PHPStorm
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;4- Iniciar no PHPStorm a configuração&lt;/strong&gt; clicando no combobox que fica do lado esquerdo do ícone Play.&lt;br&gt;
Em seguida seleciona a opção Edit Configurations...&lt;br&gt;
&lt;a href="https://media.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%2Fs2d455gile90yko6f733.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fs2d455gile90yko6f733.png" alt="PHPStorm - Xdebug"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na tela seguinte, em Configuration &amp;gt; Server, clicar no ícone &lt;code&gt;…&lt;/code&gt; para adicionar um novo server.&lt;br&gt;
&lt;a href="https://media.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%2Fmrpzkx7fgmnh1bmels58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fmrpzkx7fgmnh1bmels58.png" alt="PHPStorm - Xdebug"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5- Preencher conforme imagem abaixo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.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%2Fnxturnvrgooi1whqvxqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnxturnvrgooi1whqvxqc.png" alt="PHPStorm - Xdebug"&gt;&lt;/a&gt;&lt;br&gt;
A Port deverá ser a que é usada no browser para rodar a aplicação&lt;br&gt;
No caso da aplicação ficar dentro do container na pasta /var/www, a mesma deverá ser usada no path mappings.&lt;br&gt;
Em File/Directory &amp;gt; Project files &amp;gt; path do projeto, na coluna Absolute path on the server adicionar o caminho da pasta www de dentro do container conforme imagem acima.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6- Após essas configurações, voltar para a tela da Imagem 2&lt;/strong&gt; &lt;br&gt;
Clicar em Validate.&lt;br&gt;
&lt;a href="https://media.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%2Fbp3rot2689k7kw32kxvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fbp3rot2689k7kw32kxvj.png" alt="PHPStorm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O resultado esperado deve ser conforme imagem abaixo:&lt;br&gt;
&lt;a href="https://media.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%2Fyzmtcupiktnpgma0xiqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fyzmtcupiktnpgma0xiqw.png" alt="PHPStorm Xdebug"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso, o Xdebug deverá funcinar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/thiagoluna/php-xdebug-mysql-nginx-redis-docker" rel="noopener noreferrer"&gt;Clique aqui&lt;/a&gt; para ver um exemplo de container configurado como descrito neste post.&lt;br&gt;
Use e abuse!&lt;/p&gt;

&lt;p&gt;Agradeço ao meu parceiro de Pair Programming &lt;strong&gt;Juliano Fritz&lt;/strong&gt; que me ajudou a montar essa configuração.&lt;/p&gt;

&lt;p&gt;Há braços e até o próximo Direto ao Ponto!&lt;/p&gt;

&lt;p&gt;Thiago Luna - &lt;a href="https://www.linkedin.com/in/thiago-luna/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>xdebug</category>
      <category>phpstorm</category>
      <category>docker</category>
    </item>
    <item>
      <title>Otimizando com Doctrine - find vs getReference</title>
      <dc:creator>Thiago Luna</dc:creator>
      <pubDate>Mon, 02 Aug 2021 04:03:52 +0000</pubDate>
      <link>https://forem.com/thiagoluna/otimizando-com-doctrine-find-vs-getreference-2187</link>
      <guid>https://forem.com/thiagoluna/otimizando-com-doctrine-find-vs-getreference-2187</guid>
      <description>&lt;p&gt;Nesse post quero compartilhar com vocês uma maneira de otimizarmos uma busca utilizando o ORM Doctrine.&lt;/p&gt;

&lt;h2&gt;
  
  
  find()
&lt;/h2&gt;

&lt;p&gt;Considerando uma aplicação que trabalha com Categoria e Post, se eu tiver que consultar uma determinada Categoria para relacioná-la com Post, posso usar o find() como vemos abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eh_bqDNj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zuubawz38kahxykhzv1a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eh_bqDNj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zuubawz38kahxykhzv1a.png" alt="image" width="800" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Colocando uma lupa nessa busca, podemos observar o seguinte resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5qrF6lxM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59g73kwtem7669vr626l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5qrF6lxM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59g73kwtem7669vr626l.png" alt="image" width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até aqui, tudo certo. O resultado trouxe todos os dados da entidade Categoria desejada (id=1).&lt;/p&gt;

&lt;p&gt;O ponto é que para relacionar essa Categoria a um Post, preciso apenas do id dela. Os demais campos, bem como as informações de posts, association, collection e outros são desnecessárias para este caso.&lt;/p&gt;

&lt;h2&gt;
  
  
  getReference()
&lt;/h2&gt;

&lt;p&gt;O Doctrine nos oferece um outro método chamado getReference().&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UAYMsMKJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3z4b8dfc8jkx35t8ert2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UAYMsMKJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3z4b8dfc8jkx35t8ert2.png" alt="image" width="800" height="42"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XbtFVDYj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dcl8ckuxl71mlk83lwem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XbtFVDYj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dcl8ckuxl71mlk83lwem.png" alt="image" width="564" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olhando agora para o resultado gerado pelo getReference(), vemos também a entidade Category, porém, tendo apenas o campo id hidratado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ou seja, o getReference é bem mais rápido que o find()!
&lt;/h3&gt;

&lt;p&gt;E isso é muito útil em casos onde é preciso ter apenas o id da entidade para realizar uma ação, como por exemplo a deleção, onde não preciso ter no resultado da busca todos os campos da entidade, mas apenas o id.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YDItj4CS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kq59j2oxb9nq7c4uyot5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YDItj4CS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kq59j2oxb9nq7c4uyot5.png" alt="image" width="800" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comparando o tempo de resposta entre o find() e o getReference() em nosso ambiente de desenvolvimento não vamos perceber praticamente diferença alguma. &lt;br&gt;
Contudo, no ambiente de produção, que certamente existem entidades com muito mais campos e relacionamentos e dezenas de centenas e até milhares de registros, essa diferença será significativa.&lt;/p&gt;

&lt;p&gt;Com o getReference() o processamento é menor, o uso de memória é menor, o aceso ao banco de dados é muito menor, pois o Doctrine se preocupará em pegar apenas o id.&lt;/p&gt;

&lt;p&gt;E isso é crucial para a aplicação que está rodando em produção. Imagine uma página que tem uma quantidade enorme de acessos simultâneos que realiza essa busca...&lt;/p&gt;

&lt;p&gt;Outro benefício está no custo. Se a aplicação está hospedada em algum Cloud Service Provider como o GCP, AWS ou Azure, usar menos processamento e memória significa ter uma conta menor no final do mês para pagar.&lt;/p&gt;

&lt;p&gt;E assim termino este post. Usei exemplos bem simples para demonstrar o getReference() e o benefício de usá-lo nos casos em que só precisamos ter o id da entidade.&lt;/p&gt;

&lt;p&gt;Agora é só por em prática!&lt;/p&gt;

&lt;p&gt;Há braços e até o próximo artigo.&lt;/p&gt;

&lt;p&gt;Thiago Luna - &lt;a href="https://www.linkedin.com/in/thiago-luna/"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>doctrine</category>
      <category>php</category>
      <category>getreference</category>
    </item>
    <item>
      <title>Mensageria com Apache Kafka</title>
      <dc:creator>Thiago Luna</dc:creator>
      <pubDate>Thu, 25 Feb 2021 12:42:18 +0000</pubDate>
      <link>https://forem.com/thiagoluna/mensageria-com-apache-kafka-aj6</link>
      <guid>https://forem.com/thiagoluna/mensageria-com-apache-kafka-aj6</guid>
      <description>&lt;p&gt;Nos dias atuais, com tanto recurso tecnológico disponível, cada vez mais sistemas computacionais geram dados e trocam esses dados entre si, ou seja, os usuários dos sistemas são os próprios sistemas.&lt;/p&gt;

&lt;p&gt;Um exemplo seria um sistema de monitoramento de frotas de caminhão.&lt;/p&gt;

&lt;p&gt;Vamos imaginar um caminhão que tem instalado em seu painel um Sistema A que fica enviando/publicando sua posição de latitude e longitude a cada 5 segundos para um Sistema B. O Sistema B, por sua vez, fica recebendo essas mensagens e marcando no mapa onde o caminhão está.&lt;/p&gt;

&lt;p&gt;Agora, se o Sistema B parar de funcionar por alguns minutos ou horas? Fatalmente, quando ele voltar a funcionar não vai conseguir saber por onde o caminhão passou e pode, provavelmente, ter causado algum problema no Sistema A que, por não conseguir falar com o Sistema B, também deu erro e parou.&lt;/p&gt;

&lt;p&gt;Uma das maneiras de resolver essa questão é ter um Broker, ou seja, um intermediador entre esses 2 sistemas, que vai receber essas mensagens do Sistema A e mantê-las guardadas até que o Sistema B as consuma. E é aí que entra o Apache Kafka.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apache Kafka, um Message Broker de Respeito!
&lt;/h2&gt;

&lt;p&gt;Com esse Broker, agora, o Sistema A envia seus dados de localização através de mensagens para o Kafka e o Sistema B as consome. E se ele cair novamente, as mensagens permanecerão no Kafka até que ele volte e as consuma, podendo assim marcar no mapa todo o trajeto feito pelo Caminhão.&lt;/p&gt;

&lt;p&gt;Então, uma das principais atividades do &lt;strong&gt;Apache Kafka&lt;/strong&gt; é ser esse &lt;strong&gt;Broker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Basicamente, o Kafka trabalha com streaming de dados, com o conceito de Tópicos, onde existe o &lt;strong&gt;Produtor&lt;/strong&gt; e o &lt;strong&gt;Consumidor&lt;/strong&gt;. O Produtor envia suas mensagens para o Tópico e elas ficam lá guardadas até o Consumidor ler esse tópico e pegá-las.&lt;/p&gt;

&lt;p&gt;Mas o Kafka vai muito além disso. Na verdade existe todo um ecossistema funcionando, com vários recursos disponíveis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alguns Recursos
&lt;/h3&gt;

&lt;h4&gt;
  
  
  - Armazena Mensagens já Consumidas
&lt;/h4&gt;

&lt;p&gt;O Kafka não elimina as mensagens que já foram consumidas, armazenando-as no banco de dados. Se por alguma razão o Consumidor precisar reprocessar as mensagens que já foram lidas, isso é totalmente possível.&lt;/p&gt;

&lt;h4&gt;
  
  
  - Atua de Forma Distribuída
&lt;/h4&gt;

&lt;p&gt;Não foi fornecido texto alternativo para esta imagem&lt;br&gt;
Quando cria um Tópico é possível criar partições para ele, onde cada partição vai guardar as mensagens do tópico. Além disso, cada partição pode ficar em uma máquina diferente, onde que, se uma máquina cair, as outras estão no ar permitindo que as mensagens continuem sendo lidas.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DkhgFMs7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQGpQNO779c3LQ/article-inline_image-shrink_1000_1488/0/1614254977292%3Fe%3D1619654400%26v%3Dbeta%26t%3D_ztRmFtWun-G2Kra3KzWuuponX4hw-jO-zv_a7ipb1s" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DkhgFMs7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQGpQNO779c3LQ/article-inline_image-shrink_1000_1488/0/1614254977292%3Fe%3D1619654400%26v%3Dbeta%26t%3D_ztRmFtWun-G2Kra3KzWuuponX4hw-jO-zv_a7ipb1s" alt="Partições Distribuídas" width="690" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fonte imagem: &lt;a href="https://whimsical.com/kafka-EbWjeGL3gDg9apxewMyGhB"&gt;https://whimsical.com/kafka-EbWjeGL3gDg9apxewMyGhB&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  - Zookeeper
&lt;/h4&gt;

&lt;p&gt;Com ele é possível gerenciar erros e fazer recuperação, como por exemplo, se o Broker A cair, ele pode redirecionar para o Broker B. Se precisar subir um novo Broker, o Zookeeper atua e faz a comunicação entre todos, ou seja, ele atua para manter tudo em perfeita ordem.&lt;/p&gt;

&lt;h4&gt;
  
  
  - Kafka Connect
&lt;/h4&gt;

&lt;p&gt;Com este recurso, através de conectores é possível se plugar em fontes externas e consumir as mensagens, como por exemplo, se conectar ao Twitter, ficar lendo as mensagens e quando encontrar alguma de seu interesse, enviar para o Tópico correspondente.&lt;/p&gt;

&lt;p&gt;Com certeza ainda tem muitos outros recursos como as Keys, Compacted Log, Replication Factor, Partition Leadership, Data Compatibility, REST Proxy, Confluent ksqlDB, pois o ecossistema do Kafka é bem grande, mas este artigo traz uma visão geral dessa ótima ferramenta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quem usa?
&lt;/h3&gt;

&lt;p&gt;Não foi fornecido texto alternativo para esta imagem&lt;br&gt;
   E se você está pensando em alguma solução para fazer seu sistema se comunicar com outros de forma segura e eficiente, com a possibilidade de reprocessar as mensagens, ou se está pensando em alguma solução para trabalhar com Microserviços, o Apache Kafka é uma solução para você considerar.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Apache Kafka Documentation - Acesso em: fevereiro de 2021. Disponível em: &lt;a href="https://kafka.apache.org/documentation/"&gt;https://kafka.apache.org/documentation/&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apache Kafka - FullCycle - Wesley Willians - Acesso em: fevereiro de 2021. Disponível em: &lt;a href="https://youtube.com/playlist?list=PL5aY_NrL1rjt_AZxj11kQjiTNLGg4ZaZA"&gt;https://youtube.com/playlist?list=PL5aY_NrL1rjt_AZxj11kQjiTNLGg4ZaZA&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Infográfico Apache Kafka - FullCycle - Wesley Willians - Acesso em: fevereiro de 2021. Disponível em: &lt;a href="https://whimsical.com/kafka-EbWjeGL3gDg9apxewMyGhB"&gt;https://whimsical.com/kafka-EbWjeGL3gDg9apxewMyGhB&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apache Kafka Crash Course - Hussein Nasser - Acesso em: fevereiro de 2021. Disponível em: &lt;a href="https://www.youtube.com/watch?v=R873BlNVUB4&amp;amp;list=WL&amp;amp;index=22"&gt;https://www.youtube.com/watch?v=R873BlNVUB4&amp;amp;list=WL&amp;amp;index=22&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Há braços e até o próximo artigo.&lt;/p&gt;

&lt;p&gt;Thiago Luna - &lt;a href="https://www.linkedin.com/in/thiago-luna/"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Resolvendo problema de Access-Control-Allow-Origin (CORS) no Laravel</title>
      <dc:creator>Thiago Luna</dc:creator>
      <pubDate>Fri, 15 May 2020 18:35:19 +0000</pubDate>
      <link>https://forem.com/thiagoluna/resolvendo-problema-de-access-control-allow-origin-cors-no-laravel-57g5</link>
      <guid>https://forem.com/thiagoluna/resolvendo-problema-de-access-control-allow-origin-cors-no-laravel-57g5</guid>
      <description>&lt;p&gt;Quando estamos desenvolvendo APIs RESTFULL, é comum esbarrarmos com erro de CORS do tipo&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.andyknight.net%2Fassets%2Fimg%2F2018-12-27%2Fcorserror.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.andyknight.net%2Fassets%2Fimg%2F2018-12-27%2Fcorserror.png" alt="Erro CORS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse bloqueio se da por conta do protocolo HTTP e precisamos resolver.&lt;/p&gt;

&lt;p&gt;Existem várias soluções na internet, como alterar o .htaccess, instalar pacotes como o &lt;a href="https://packagist.org/packages/barryvdh/laravel-cors" rel="noopener noreferrer"&gt;barryvdh/laravel-cors&lt;/a&gt; entre outros.  &lt;/p&gt;

&lt;p&gt;A solução que compartilho com vocês é bem simples e resolveu o meu problema no Laravel 6.&lt;br&gt;
Vamos lá!  &lt;/p&gt;

&lt;p&gt;1- Crie um novo Middleware&lt;br&gt;
&lt;code&gt;php artisan make:middleware Cors&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;2- Adicione neste novo Middleware, localizado em &lt;strong&gt;app/Http/Middleware/Cors.php&lt;/strong&gt;, o seguinte:&lt;br&gt;
Dentro do método &lt;strong&gt;handle&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;public function handle($request, Closure $next)&lt;br&gt;
{&lt;br&gt;
    return $next($request)&lt;br&gt;
        //Acrescente as 3 linhas abaixo&lt;br&gt;
        -&amp;gt;header('Access-Control-Allow-Origin', "*")&lt;br&gt;
        -&amp;gt;header('Access-Control-Allow-Methods', "PUT, POST, DELETE, GET, OPTIONS")&lt;br&gt;
        -&amp;gt;header('Access-Control-Allow-Headers', "Accept, Authorization, Content-Type");&lt;br&gt;
}&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;3- Edite o arquivo &lt;strong&gt;app\Http\Kernel.php&lt;/strong&gt; da seguinte forma:&lt;br&gt;
Dentro de &lt;strong&gt;$middleware&lt;/strong&gt; acrescente o middleware que acabou de criar:&lt;br&gt;
&lt;code&gt;protected $middleware = [&lt;br&gt;
    \App\Http\Middleware\TrustProxies::class,&lt;br&gt;
    ...&lt;br&gt;
        ...&lt;br&gt;
        \App\Http\Middleware\Cors::class, //acrescente essa linha&lt;br&gt;
    ];&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;4- Teste novamente sua aplicação e vida que segue! &lt;/p&gt;

&lt;p&gt;Tem muito conteúdo bom na internet explicando sobre CORS, porque acontece isso, n maneiras de resolver. Então, quis trazer um conteúdo curto e direto ao ponto, pois nosso prazo anda bem curto para as entregas, né?!&lt;/p&gt;

&lt;p&gt;Agora, vamos voltar a codar porque a sprint está quase acabando.&lt;/p&gt;

&lt;p&gt;Um abraço e até o próximo direto ao ponto.&lt;/p&gt;

&lt;p&gt;Thiago Luna - &lt;a href="https://www.linkedin.com/in/thiago-luna/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>cors</category>
      <category>accesscontrolalloworigin</category>
    </item>
    <item>
      <title>PHP - Uma das Linguagens de Programação mais Populares</title>
      <dc:creator>Thiago Luna</dc:creator>
      <pubDate>Fri, 10 Apr 2020 16:03:07 +0000</pubDate>
      <link>https://forem.com/thiagoluna/php-uma-das-linguagens-de-programacao-mais-populares-2g9a</link>
      <guid>https://forem.com/thiagoluna/php-uma-das-linguagens-de-programacao-mais-populares-2g9a</guid>
      <description>&lt;p&gt;Na área da tecnologia, os softwares são os grandes responsáveis pela interação do usuário com esse mundo hi-tech. Se alguém quiser consultar seu saldo, usa um software pelo computador ou celular para acessar o banco.&lt;/p&gt;

&lt;p&gt;Se quiser comprar algum eletrodoméstico, faz o mesmo. Se quiser comprar uma passagem aérea ou fazer a reserva em um hotel, também faz o mesmo. Alugar um carro, comprar comida, escrever um artigo para o LinkedIn, faz tudo isso através de um software.&lt;/p&gt;

&lt;p&gt;E todos esses softwares são desenvolvidos através de alguma linguagem de programação, onde o desenvolvedor escreve linhas de código que serão compiladas/interpretadas pelo computador para gerar o software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linguagens de Programação
&lt;/h2&gt;

&lt;p&gt;E nessa área de desenvolvimento de software existem várias linguagens de programação para todos os gostos e necessidades e neste artigo falo um pouco sobre quais as mais populares e, segundo uma pesquisa, qual a número 1 em popularidade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QA88brhF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQFwMJndPnz4Sw/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DT0TMJihvsjHf8I65HSKPOJZrG2_mLin0QrQX65tzafs" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QA88brhF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQFwMJndPnz4Sw/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DT0TMJihvsjHf8I65HSKPOJZrG2_mLin0QrQX65tzafs" alt="Linguagens de Programação" width="500" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olhando o site &lt;a href="http://w3techs.com"&gt;w3techs.com&lt;/a&gt;, que provê informações sobre o uso de vários tipos de tecnologia na internet, encontraremos a pesquisa sobre as linguagens de programação server-side (que rodam do lado do servidor) mais populares.&lt;/p&gt;

&lt;h2&gt;
  
  
  As mais Populares
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DFPidTVi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQFrV4Z85Q9Eag/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DD9tUlXe_Falk0nxyknFFeApJcJukTisXKIeENOH5C_I" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DFPidTVi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQFrV4Z85Q9Eag/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DD9tUlXe_Falk0nxyknFFeApJcJukTisXKIeENOH5C_I" alt="Linguagens mais populares" width="547" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  W3Techs
&lt;/h2&gt;

&lt;p&gt;Segundo o site W3Techs &lt;a href="http://w3techs.com"&gt;w3techs.com&lt;/a&gt;, os dados são coletados dos 10 milhões de sites classificados no serviço de monitoramento do Alexa (uma empresa da Amazon que fornece dados de tráfego na internet e análise de dados) através de um mecanismo de busca e posteriormente analisados, gerando os relatórios. Além disso, eles utilizam informações públicas divulgadas por empresas como Google, Microsoft e ipinfo.io.&lt;/p&gt;

&lt;p&gt;Eles procuram por padrões específicos nas páginas dos sites que identificam qual tecnologia está sendo utilizada.&lt;/p&gt;

&lt;h2&gt;
  
  
  PHP
&lt;/h2&gt;

&lt;p&gt;Como podemos ver no resultado acima, o PHP é a linguagem mais popular, alcançando 79% dos sites pesquisados que a usam. E é fácil de entender o porquê desse resultado.&lt;/p&gt;

&lt;p&gt;É uma linguagem de fácil aprendizagem, ótima performance, código aberto, com uma comunidade bastante atuante, documentação vasta na web e diversos tutoriais que ajudam os desenvolvedores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CRGLSddz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQH3jQrAkOvF2w/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3D-Us9ivMQNEFAspI4tOgV-mvj-kYNeAEfzHaY9eobkWI" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CRGLSddz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQH3jQrAkOvF2w/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3D-Us9ivMQNEFAspI4tOgV-mvj-kYNeAEfzHaY9eobkWI" alt="Código Fonte" width="500" height="291"&gt;&lt;/a&gt;&lt;br&gt;
Além disso, existem vários frameworks que utilizam PHP, como o CodeIgniter, o Zend e o Laravel, que são bastante conhecidos e usados pela comunidade e que facilitam e agilizam o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Um exemplo disso é usar, por exemplo, o Eloquent, um ORM (Object Relational Mapping) nativo do framework Laravel que facilita toda manipulação do banco de dados, sem falar do WordPress, um CMS (Content Management System) que também utiliza o PHP. Ou seja, se você precisa desenvolver um software simples ou complexo, em uma linguagem com documentação abundante e uma comunidade muito participativa e solícita em ajudar, o PHP é uma ótima opção.&lt;/p&gt;

&lt;p&gt;Em minha trajetória como desenvolvedor usando o PHP, desenvolvi desde sistemas simples com CRUD até sistemas mais complexos, interoperando com outros sistemas, criei e consumi APIs, realizei manutenção em sistemas com paradigma procedural e orientado a objetos, utilizei CMS como Drupal, WordPress e Joomla e posso dizer que é possível atender a qualquer necessidade, qualquer requisito com o PHP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nem Tudo São Flores
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fGaRwaLh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQH6d6GTh7Xv-w/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DrNbVIlJX3ysWn_HmEUHQth_l_Ixjk2H0SnRb9anhD_o" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fGaRwaLh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQH6d6GTh7Xv-w/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DrNbVIlJX3ysWn_HmEUHQth_l_Ixjk2H0SnRb9anhD_o" alt="Versões do PHP mais usadas" width="447" height="188"&gt;&lt;/a&gt;&lt;br&gt;
Neste resultado, podemos observar que praticamente 60% dos websites que usam PHP, estão usando a versão 5. E isso não é legal. A versão estável até o momento é a 7.4.&lt;/p&gt;

&lt;p&gt;Da versão 5 até a 7 houve muitas correções de bugs, novos recursos de linguagem foram implementados e teve um ganho considerável de desempenho. Além disso, uma nova biblioteca chegou para facilitar a utilização de criptografia, hash de senha e etc.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Permanecer com uma versão desatualizada é elevar o risco de problemas ao máximo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Exemplos de Sites com PHP
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Facebook.com&lt;/li&gt;
&lt;li&gt;Wikipedia.org&lt;/li&gt;
&lt;li&gt;Vk.com&lt;/li&gt;
&lt;li&gt;Babytree.com&lt;/li&gt;
&lt;li&gt;Wordpress.com&lt;/li&gt;
&lt;li&gt;Pinterest.com&lt;/li&gt;
&lt;li&gt;Ettoday.net&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Outros Números do W3Techs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GWPdb0sP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQEw2ArSSCEcMA/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DRKXltv5HDp5z8jEPV4KW2aHWBekROb5JZwmgu93PX0w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GWPdb0sP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQEw2ArSSCEcMA/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DRKXltv5HDp5z8jEPV4KW2aHWBekROb5JZwmgu93PX0w" alt="CMS" width="729" height="279"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xwOLiato--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQG0z7DxN_kNHQ/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DagrdlqI5bbS97QiGDH2nKlkFq880NLvbjFpq7PeYRco" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xwOLiato--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQG0z7DxN_kNHQ/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DagrdlqI5bbS97QiGDH2nKlkFq880NLvbjFpq7PeYRco" alt="Biblioteca Javascript" width="724" height="285"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rcjRVLG3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQGMEEb-U1cihw/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DPPhbSwtLfOibKtLyc41IyOMUwWqCHB-rI44hSIT9TRw" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rcjRVLG3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQGMEEb-U1cihw/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3DPPhbSwtLfOibKtLyc41IyOMUwWqCHB-rI44hSIT9TRw" alt="Estrutura de Dados" width="641" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas... E agora?
&lt;/h2&gt;

&lt;p&gt;São muitas as opções de linguagem de programação, mas, qual delas escolher?&lt;/p&gt;

&lt;p&gt;Bem, essa é uma pergunta que muitos devem fazer, seja quem está começando a desenvolver, seja quem já desenvolve e até fábricas de software ou empresas que não tem TI como área fim, mas que precisam manter/desenvolver seus sistemas.&lt;/p&gt;

&lt;p&gt;Só que a resposta para esta pergunta é um assunto para outro artigo...&lt;/p&gt;

&lt;p&gt;E você, o que achou dessa pesquisa? Qual sua experiência com PHP ou outra linguagem de programação e qual sua visão para o futuro da programação web?&lt;/p&gt;

&lt;p&gt;Compartilhe conosco sua opinião.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comunidade PHPRio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CNWpbFjR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQEfZCEzZPLF6Q/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3D94XUem6cLeJxK8r0nMrci-MIB3MlHcXGVlsPIVrsE2c" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CNWpbFjR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media-exp1.licdn.com/dms/image/C4E12AQEfZCEzZPLF6Q/article-inline_image-shrink_1000_1488/0%3Fe%3D1591833600%26v%3Dbeta%26t%3D94XUem6cLeJxK8r0nMrci-MIB3MlHcXGVlsPIVrsE2c" alt="Comunidade PHPRio" width="100" height="83"&gt;&lt;/a&gt;&lt;br&gt;
E se quiser conhecer mais um pouco sobre PHP e fazer parte de uma comunidade, indico a PHP Rio. Sou membro, acompanho pelo grupo no &lt;a href="//telegram.me/phprio"&gt;Telegram&lt;/a&gt; que é muito ativo e 1 vez por mês tem &lt;a href="//meetup.com/php-rio"&gt;Meetup&lt;/a&gt; com palestras muito boas e um super bate-papo com a galera.&lt;/p&gt;

&lt;p&gt;Há braços e até o próximo artigo.&lt;/p&gt;

&lt;p&gt;Thiago Luna - &lt;a href="https://www.linkedin.com/in/thiago-luna/"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://w3techs.com/"&gt;https://w3techs.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://w3techs.com/technologies/overview/programming_language/all"&gt;https://w3techs.com/technologies/overview/programming_language/all&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://w3techs.com/technologies/details/pl-php/all/all"&gt;https://w3techs.com/technologies/details/pl-php/all/all&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.php.net/"&gt;https://www.php.net/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/introducao-as-linguagens-de-programacao/25111"&gt;https://www.devmedia.com.br/introducao-as-linguagens-de-programacao/25111&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://becode.com.br/principais-linguagens-de-programacao/"&gt;https://becode.com.br/principais-linguagens-de-programacao/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://imasters.com.br/back-end/php-7-2-quais-sao-as-novidades-da-nova-versao-do-php"&gt;https://imasters.com.br/back-end/php-7-2-quais-sao-as-novidades-da-nova-versao-do-php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>php</category>
      <category>linguagemdeprogramacao</category>
      <category>w3techs</category>
    </item>
  </channel>
</rss>
