<?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: Lucien Risso Correia</title>
    <description>The latest articles on DEV Community by Lucien Risso Correia (@luciencorreia).</description>
    <link>https://dev.to/luciencorreia</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%2F670293%2F6c965f4c-994a-4398-98d4-c4a0052f9b4c.jpg</url>
      <title>DEV Community: Lucien Risso Correia</title>
      <link>https://dev.to/luciencorreia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luciencorreia"/>
    <language>en</language>
    <item>
      <title>Property Hooks no PHP 8.4</title>
      <dc:creator>Lucien Risso Correia</dc:creator>
      <pubDate>Tue, 08 Oct 2024 19:55:12 +0000</pubDate>
      <link>https://dev.to/luciencorreia/property-hooks-no-php-84-2jld</link>
      <guid>https://dev.to/luciencorreia/property-hooks-no-php-84-2jld</guid>
      <description>&lt;p&gt;Em novembro teremos o lançamento da versão 8.4 do nosso querido PHP e com ela teremos um novo recurso muito aguardado pela comunidade: o property hooks! Inspirado por outras linguagens como C#, Swift e Kotlin esse novo recurso tira a gambiarra dos métodos mágicos &lt;code&gt;__set()&lt;/code&gt; e &lt;code&gt;__get()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vou mostrar um exemplo de como faz atualmente para termos getter e setters sem precisar criar a propriedade como privativa e criar dois novos métodos com nomes diferentes da propriedades.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="nv"&gt;$bar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"!!!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"!!!"&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usando o &lt;code&gt;__get()&lt;/code&gt; e &lt;code&gt;__set()&lt;/code&gt; consigo deixar o $bar público quando defino valor e quando busco o valor, porém com implementação diferente e sem ter que criar métodos com nomes distintos da propriedade. Em exemplo visual ficaria assim o uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="nv"&gt;$foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"new release"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// aqui o valor que ficará salvo seria "new release!!!"&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// aqui retornaria "!!!new release!!!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora imagine como ficaria o &lt;code&gt;__get()&lt;/code&gt; e &lt;code&gt;__set()&lt;/code&gt; com outras propriedades, uma confusão total. Outra maneira de fazer isso seria criando um método &lt;code&gt;getBar()&lt;/code&gt; e um outro &lt;code&gt;setBar()&lt;/code&gt;, mas isso considerando apenas uma propriedade e no uso ficaria diferente do anterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="nv"&gt;$bar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"!!!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"!!!"&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'new release'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// aqui o valor que ficará salvo seria "new release!!!"&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$foo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getBar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// aqui retornaria "!!!new release!!!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eu particularmente acho meio chato criar novos métodos para esse caso de uso, prefiro muito usar a chamada direta da propriedade tanto para pegar quando definir seu valor. Esse novo recurso chega para resolver essa bagunça e permitir definir o &lt;code&gt;get&lt;/code&gt; e &lt;code&gt;set&lt;/code&gt; individualmente junto com a declaração na classe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="nv"&gt;$bar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;set&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"!!!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"!!! . &lt;/span&gt;&lt;span class="nv"&gt;$this-&amp;gt;bar&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse novo código faz a mesma coisa porém individualmente, sem criar novos métodos ou utilizar &lt;code&gt;__get()&lt;/code&gt; e &lt;code&gt;__set()&lt;/code&gt; que precisam de tratamento para cada propriedade e a classe tiver.&lt;/p&gt;

&lt;p&gt;Agora é só aguardar o lançamento desse novo recurso que deverá sair dia 21 de novembro!&lt;/p&gt;

</description>
      <category>php</category>
      <category>release</category>
    </item>
    <item>
      <title>Laravel 11</title>
      <dc:creator>Lucien Risso Correia</dc:creator>
      <pubDate>Tue, 12 Mar 2024 12:22:45 +0000</pubDate>
      <link>https://dev.to/luciencorreia/laravel-11-31c9</link>
      <guid>https://dev.to/luciencorreia/laravel-11-31c9</guid>
      <description>&lt;p&gt;Laravel 11 chegou com algumas mudanças que posso dizer "finalmente" e umas outras "pra que isso?".&lt;/p&gt;




&lt;h4&gt;
  
  
  Controller simplificado
&lt;/h4&gt;

&lt;p&gt;O controller base foi simplicado, não extendendo o Controller interno do Laravel, sendo assim quando precisar do &lt;code&gt;AuthorizesRequests&lt;/code&gt; ou do &lt;code&gt;ValidatesRequests&lt;/code&gt; precisará adicionar a cada controller que for utilizar.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rate limit em segundos
&lt;/h4&gt;

&lt;p&gt;Agora é possível definir rate limits em segundos em vez de minutos, utilizando o &lt;code&gt;Limit::perSecond()&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Novos comandos de criação do artisan
&lt;/h4&gt;

&lt;p&gt;Agora temos comando para criação de class, enum, interface e trait:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Helper once
&lt;/h4&gt;

&lt;p&gt;Agora você pode cachear um retorno de função e sempre ter o mesmo retorno nas chamadas subsequentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;random_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 123&lt;/span&gt;
&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 123 (cached result)&lt;/span&gt;
&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 123 (cached result)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Menos arquivos padrões
&lt;/h4&gt;

&lt;p&gt;Se olhar a pasta &lt;code&gt;app/Http&lt;/code&gt; vai ver somente o controller agora, sem o &lt;code&gt;Kernel.php&lt;/code&gt; e a pasta &lt;code&gt;Middlewares&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Campo 'password' pode ser com outro nome agora
&lt;/h4&gt;

&lt;p&gt;Finalmente, depois de anos de espera os Devs BRs que cairam num projeto que o banco é em português poderão utilizar o nome da coluna senha na tabela de usuario como 'senha' em vez de 'password'. O método &lt;code&gt;getAuthPasswordName()&lt;/code&gt; foi adicionado ao &lt;code&gt;Authenticatable&lt;/code&gt; permitindo alterar o nome da propriedade da senha.&lt;/p&gt;

&lt;h4&gt;
  
  
  Migrations de alterações ficaram mais chatinhas
&lt;/h4&gt;

&lt;p&gt;Agora toda vez que alterar uma coluna pela migration precisará reescrever todas as alterações anteriores novamente para não voltar ao padrão. Digamos que na criação foi adicionado um comentário na coluna, e em uma migration posterior você altera para ter um valor padrão, para não perder o comentário terá que chamar o método novamente ou irá voltar para o padrão que é sem comentário. Particulamente achei isso ruim.&lt;/p&gt;

&lt;h4&gt;
  
  
  MariaDB
&lt;/h4&gt;

&lt;p&gt;Agora o Laravel possui um driver específico pro MariaDB, em vez de utilizar o driver do MySQL agora pode utilizar o mariadb nas configurações do banco. O que isso muda por enquanto é em relação ao &lt;code&gt;uuid&lt;/code&gt;, mas futuramente deverá ter mais coisas específicas pro banco.&lt;/p&gt;

&lt;h4&gt;
  
  
  Carbon 3
&lt;/h4&gt;

&lt;p&gt;Agora o Laravel suporta tanto o Carbon 2 quanto o Carbon 3, só atulizar nas dependencias do composer e fazer os ajustes conforme a documentação do Carbon no que precisar.&lt;/p&gt;

&lt;h4&gt;
  
  
  Registro de Providers
&lt;/h4&gt;

&lt;p&gt;Agora o registro de providers foi movido para o arquivo &lt;code&gt;bootstrap/Providers.php&lt;/code&gt; e retirado do &lt;code&gt;config/app.php&lt;/code&gt;. Para packages que criavam arquivos nessa pasta agora é precisa atualizar o método para o &lt;code&gt;ServiceProvider::addProviderToBootstrapFile()&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;Essas são as mudanças que achei interresante comentar, pra saber de todas é só ler o &lt;a href="https://laravel.com/docs/11.x/releases" rel="noopener noreferrer"&gt;release notes&lt;/a&gt; e o &lt;a href="https://laravel.com/docs/11.x/upgrade" rel="noopener noreferrer"&gt;upgrade guide&lt;/a&gt; na documentação do Laravel.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>backend</category>
    </item>
    <item>
      <title>Gerência de Estado no Flutter</title>
      <dc:creator>Lucien Risso Correia</dc:creator>
      <pubDate>Mon, 05 Feb 2024 20:09:48 +0000</pubDate>
      <link>https://dev.to/luciencorreia/gerencia-de-estado-no-flutter-1828</link>
      <guid>https://dev.to/luciencorreia/gerencia-de-estado-no-flutter-1828</guid>
      <description>&lt;p&gt;O ano era 2021 e a comunidade Flutter estava agitada demais com algumas tretas envolvendo o time do Flutter e desenvolvedores da comunidade, nessa mesma época o tal state management estava no hype de assuntos da comunidade. Fiz um texto originalmente no Medium, que também está publicado aqui, tirando sarro dessas polêmicas e satirizando os principais packages de gerenciamento de estado do Flutter.&lt;/p&gt;

&lt;p&gt;Em projetos futuros a esse texto ainda continuou a discussão sobre qual package utilizar para isso, e a treta sempre foi grande. Chegamos em 2024 e sinto que isso deixou de ser um richa e finalmente os devs Flutter entenderam que no final tudo é Streams ou Observers, ou talvez não...&lt;/p&gt;




&lt;h3&gt;
  
  
  Observer
&lt;/h3&gt;

&lt;p&gt;O Observer Pattern, também conhecido como Publish/Subscribe, é um padrão de design que define um mecanismo de comunicação entre objetos. Nesse padrão, um objeto, chamado Subject, mantém uma lista de objetos Observers que dependem dele. Quando o estado do Subject muda, ele notifica todos os Observers, que podem então atualizar suas próprias interfaces.&lt;/p&gt;

&lt;p&gt;No Flutter esse designer é implementado no ChangeNotifier, onde se pode criar uma classe com as propriedades desejadas pro estado que quer gerenciar e métodos que manipulam e notificam a mudança de estado pros Observers. Veja um exemplo de uso básico de gerenciamento de estado com Observer em Flutter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;ChangeNotifier&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;incrementCount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;notifyListeners&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyWidget&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;_MyWidgetState&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_MyWidgetState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_MyWidgetState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyWidget&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;MyState&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;initState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Count: &lt;/span&gt;&lt;span class="si"&gt;${state.count}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, a classe MyState é um Subject. Ela define uma interface para registrar e remover Observers (o método addListener()) e notifica os Observers quando seu estado muda (o método notifyListeners()).&lt;/p&gt;

&lt;p&gt;A classe MyWidget é um Observer. Ela se registra como um Observer da classe MyState no método initState(). Quando o estado da classe MyState muda, o método update() da classe MyWidget é chamado, o que faz com que o widget seja reconstruído.&lt;/p&gt;

&lt;p&gt;Com o Provider podemos simplificar a parte de widget e retirar a parte de implementação do trecho do &lt;code&gt;initState&lt;/code&gt;, já que o próprio widget dele já faz essa reconstrução quando recebe notificação que o estado mudou. Com isso temos pequenas mudanças no código de widget e ele ficaria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyWidget&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ChangeNotifierProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;create:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MyState&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyState&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Count: &lt;/span&gt;&lt;span class="si"&gt;${state.count}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;incrementCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Incrementar'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembre-se: o Provider tem como foco ser uma biblioteca para injeção de dependência utilizando a arvore de widgets, a classe Consumer auxilia no uso das dependências injetadas no contexto de Widget, o foco do Provider não é gerenciar estado.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Stream
&lt;/h3&gt;

&lt;p&gt;Stream é uma sequência assíncrona de eventos. Ela pode ser usada para representar dados que mudam ao longo do tempo, como a localização do usuário, a entrada do teclado ou a saída de um sensor.&lt;/p&gt;

&lt;p&gt;Um exemplo de uso se Stream para gerenciar estado no Flutter com um contador progressivo que incrementa o valor a cada segundo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;Stream&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;countStream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="n"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;periodic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyWidget&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;MyState&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;StreamBuilder&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;stream:&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;countStream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Count: &lt;/span&gt;&lt;span class="si"&gt;${snapshot.data}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Aguardando...'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo usamos o &lt;code&gt;StremBuilder&lt;/code&gt; para poder atualizar o widget a cada troca de valor, mas também podemos fazer sem ele com o famoso &lt;code&gt;setState&lt;/code&gt; escutando os eventos da Stream com o &lt;code&gt;listen&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyWidget&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;_MyWidgetState&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_MyWidgetState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_MyWidgetState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyWidget&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;MyState&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;initState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;countStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Count: &lt;/span&gt;&lt;span class="si"&gt;${state.count}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;E é sobre isso que venho lembrar e ajudar a fixar na cabecinha dos devs iniciantes em Flutter: quem gerencia o estado é você e não o package. O que quero lembrar é que independente de está usando BLoC ou MobX, Riverpod ou Solidart, GetX ou setState, o resultado final dependerá de como você escreveu a solução. E se não gostou de nenhuma implementação de Observer dos packages, crie sua própria, no final ou é feito em cima de Stream ou em cima de Observer.&lt;/p&gt;

&lt;p&gt;Vou listar qual usa o quê pra exemplificar:&lt;/p&gt;

&lt;h4&gt;
  
  
  Packages que utilizam Stream:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;BLoC&lt;/li&gt;
&lt;li&gt;RxDart&lt;/li&gt;
&lt;li&gt;GetX&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Packages que utilizam Observer:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;MobX&lt;/li&gt;
&lt;li&gt;ChangeNotifier&lt;/li&gt;
&lt;li&gt;Flutter Hooks&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Por trás dos panos eles utilizam basicamente a mesma lógica, porém com implementações diferentes que mudam como será escrito o código. Mas igualmente, quem faz o gerenciamento é quem escreve a aplicação em si. Além disso o que ocorre muito é confundirem state managment com dependencie injection, no caso de GetX ou Provider por exemplo, que possuem essa implementação a mais para compor o package e tornar mais completo. São coisas que costumam serem necessitas juntamente porém já não são mais em si state managment.&lt;/p&gt;




&lt;p&gt;Bom códigos e best reguards!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
    </item>
    <item>
      <title>Kubernetes: criando seu primeiro Pod</title>
      <dc:creator>Lucien Risso Correia</dc:creator>
      <pubDate>Wed, 10 Jan 2024 19:21:21 +0000</pubDate>
      <link>https://dev.to/luciencorreia/kubernetes-criando-seu-primeiro-pod-4jc0</link>
      <guid>https://dev.to/luciencorreia/kubernetes-criando-seu-primeiro-pod-4jc0</guid>
      <description>&lt;p&gt;Segundo a documentação do Kubernetes um Pod é a menor unidade computacional que você pode criar e gerenciar no Kubernetes. É um encapsulamento de um ou mais containers que utilizam recursos de hardware e rede compartilhados entre si, como se essas aplicações estivessem rodando em uma mesma máquina em servidores VPS por exemplo.&lt;/p&gt;

&lt;p&gt;Vamos subir um Pod simples com o nginx primeiramente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para aplicar as alterações vamos salvar esse código em um arquivo pod.yaml e rodar o comando do kubeclt: &lt;code&gt;kubectl apply -f pod.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para verificar se terminou certinho podemos rodar &lt;code&gt;kubectl get pods&lt;/code&gt; e o resultado deve ser algo parecido com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          20s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora temos um Pod rodando um container que utiliza a imagem do nginx, ou seja, se entrar dentro dele e fizermos uma requisição pro localhost deve retornar a página default do nginx. Para facilitar a visualização vamos permitir o acesso do pod externamente pela porta 8080 com o comando &lt;code&gt;kubectl port-forward pod/nginx 8080:80&lt;/code&gt;. Se você estiver utilizando o minikube irá precisar rodar o comando &lt;code&gt;minikube tunnel&lt;/code&gt;. Com isso podemos ver a página default do nginx acessando localhost:8080&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>devops</category>
    </item>
    <item>
      <title>Laravel - Parte 2</title>
      <dc:creator>Lucien Risso Correia</dc:creator>
      <pubDate>Thu, 27 Jul 2023 00:25:15 +0000</pubDate>
      <link>https://dev.to/luciencorreia/laravel-parte-2-27nj</link>
      <guid>https://dev.to/luciencorreia/laravel-parte-2-27nj</guid>
      <description>&lt;p&gt;Chegamos aos controladores da aplicação, que no artigo anterior seriam os próximos logo após da rota. Recapitulando: a aplicação recebe a chamada HTTP, leva pra rotas pra verificar para onde vai esse requisição e no caso atual ele vai ir para algum controller. Os controllers podem chamar classes e métodos de muitos lugares dependendo do tamanho e do design da aplicação, como por exemplo QueryBuilders, UseCases, Services, Repositories entre outros.&lt;/p&gt;

&lt;p&gt;Mas ainda não chegamos ao ponto de utilizar esses designs, vamos somente seguir o fluxo simples da requisição. Dentro do método do controller podemos literalmente colocar qualquer coisa e até mesmo nem dar retorno :), mas vou dar um exemplo mais decente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;metodoDoController&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// coloca o que quiser aqui mas vou dar um retorno do famoso hello world&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Hello World"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de continuar esqueci de dizer onde ficam os arquivos de controllers e como cria eles. Os arquivos ficam em &lt;code&gt;app/Http/Controllers&lt;/code&gt; e é possivel criar um novo com o comando &lt;code&gt;php artisan make:controller NomeDoController&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Isso é extremamente básico, vamos fazer algo útil mesmo, vamos pegar dados que vieram na requisição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;metodoDoController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$dadosDoRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora eu pedi a injeção do Request como parâmetro do método, o Laravel injeta automaticamente o objeto do Request, com essa injeção podemos fazer outras coisas mas mais adiante veremos mais afundo a injeção de dependência nos métodos de Controller. O método 'all' retorna um array com tudo de dado que veio no request. Vamos supor que esse é o método de login e deve receber email e senha na requisição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$senha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;senha&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'senha'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$senha&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora obtive o email e senha utilizando o request de uma maneira diferente, chamando diretamente a chave do dado como se fosse uma propriedade do objeto. No PHP temos os métodos mágicos, e o &lt;code&gt;__get()&lt;/code&gt; é um deles utilizado amplamente dentro do Laravel, em outros casos veremos esse mesmo esquema de chamar propriedades que não foram definidas na classe. E pra finalizar o método utilizei o &lt;code&gt;response()-&amp;gt;json()&lt;/code&gt; que retorna a resposta com o header 'application/json' para o cliente.&lt;/p&gt;

&lt;p&gt;Somente com isso já podemos fazer coisas legais, como a famosa calculadora :)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;somar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$numero1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;numero1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$numero2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;numero2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'resultado'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$numero1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$numero2&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Somente com isso já podemos realmente criar uma API que não precise de base de dados e ir explorando o Request e Response do Laravel. Use o wget, postman, insomnia, o navegador ou qualquer outra ferramenta para enviar requisições HTTP e teste sua API.&lt;/p&gt;

&lt;p&gt;Na próxima veremos o início de banco de dados, já montando uma API mais dinâmica e legal :)&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>lumen</category>
    </item>
    <item>
      <title>As tais gerências de estado do Flutter</title>
      <dc:creator>Lucien Risso Correia</dc:creator>
      <pubDate>Wed, 31 May 2023 00:53:02 +0000</pubDate>
      <link>https://dev.to/luciencorreia/as-tais-gerencias-de-estado-do-flutter-ohe</link>
      <guid>https://dev.to/luciencorreia/as-tais-gerencias-de-estado-do-flutter-ohe</guid>
      <description>&lt;p&gt;Pra começar esse texto é uma sátira sobre as brigas que ocorrem na comunidade Flutter sobre gerência de estado, se levar isso a sério recomendo um psiquiatra.&lt;/p&gt;

&lt;p&gt;Quem não é do front provavelmente não tá ligado sobre gerência de estado, volte duas páginas por favor (procure no google, estou com preguiça de explicar nesse texto). Mas enfim, se já codou com Flutter provavelmente já mandou o setState para aquele lugar e se não mandou tá codando errado. Chegando no ponto principal, a partir disso você vai conhecer os famosos competidores do ringue: BLoC, MobX, Provider/Riverpod, Cubit, Getx, ValueNotifier/ChangeNotifier, Triple Pattern entre outros que você pode encontrar aqui mas que tá errado, onde que o GetIt é state management deus?? Absurdo, vou abrir PR no repositório do site…&lt;/p&gt;

&lt;p&gt;Vamos começar pelo mais polêmico, que rufem os tambores (som do tambor)… ELE, O GetX. Esse tal de GetX na verdade é um framework (ruim) dentro do flutter, que seria outro framework (talvez não, mas isso é assunto pra outro texto), o que pra mim não faz sentido nenhum. Esse package propõe tanta coisa que cansa só de ler a intro da documentação dele. Esse monstrinho feio tem coisas pra mostrar alertas, pra injetar dependências, pra traduzir texto, pra gerenciar as rotas e até pra SALVAR DADOS NO LOCAL STORAGE DO DISPOSITIVO, SÓ FALTA FAZER CAFÉ E CÓDIGO SOZINHO. Vou abrir uma issue pra isso, to sentindo falta do café.&lt;/p&gt;

&lt;p&gt;Seguindo, com o talvez segundo mais popular segundos pesquisas que não fiz temos o MobX. Esse é simples, o único problema é depender de geração de código que deixa o desenvolvimento mais lento que o Chrome com 2 abas abertas em um pc com 4GB de RAM e um Celeron. Até tem como utilizar sem geração de código, mas ai perde a graça e fica muito verboso.&lt;/p&gt;

&lt;p&gt;Na real, fui ver quantos tem pra falar e fiquei cansado, vou encerrar com o BLoC então. Esse lindão ai te faz ter que entender sobre orientação a objetos, quem quer entender isso em pleno 2021? Ainda mais a galera que vem do javascript, nem sabem o que é isso. Bom, só pra resumir, tu precisa criar classes pros eventos e pros estados, CADA EVENTO QUE TIVER É UMA CLASSE, E CADA ESTADO TAMBÉM É UMA CLASSE, isso é muito verboso, cansei só de pensar.&lt;/p&gt;

&lt;p&gt;Enfim, programar é chato mesmo, só aceite e pegue uma breja geladinha pra aguentar tanta coisa que rola no Flutter e na bolha dev.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>bolhadev</category>
    </item>
    <item>
      <title>Laravel - Parte 1</title>
      <dc:creator>Lucien Risso Correia</dc:creator>
      <pubDate>Mon, 29 May 2023 22:13:40 +0000</pubDate>
      <link>https://dev.to/luciencorreia/laravel-parte-1-4cdg</link>
      <guid>https://dev.to/luciencorreia/laravel-parte-1-4cdg</guid>
      <description>&lt;h1&gt;
  
  
  Ciclo de requisição básico
&lt;/h1&gt;

&lt;p&gt;Partindo do básico é necessário conhecer o básico de dois conceitos: route e controller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route
&lt;/h2&gt;

&lt;p&gt;Route, ou se preferir chamar de rota mesmo é onde se cria as rotas HTTP, definindo sua assinatura, método HTTP e a resposta. Na pasta 'routes' existem quatro arquivos php: 'api.php', 'channels.php', 'console.php', 'web.php'. Numa aplicação poderá ter vários desses para organizar as rotas, mas como por enquanto é somente o básico vamos ficar somente no 'api.php'.&lt;/p&gt;

&lt;p&gt;Na versão 10 esse arquivo vem como o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Http\Request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Route&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/&lt;/span&gt;

&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth:sanctum'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em resumo essa rota possui um middleware do sanctum (package de autenticação) que retorna o usuário autenticado. Por enquanto deixaremos de lado e pra não confundir apagaremos esse trecho.&lt;/p&gt;

&lt;p&gt;Para definir rotas simples o Laravel possui a classe 'Route' juntamente com os métodos que definem o método HTTP da rota, seguindo os mesmos nomes 'get', 'post', 'put', 'patch', 'delete'.&lt;br&gt;
Cada um desses métodos recebe como primeiro parâmetro a assinatura da rota e como segundo parâmetro um callback.&lt;/p&gt;

&lt;p&gt;Assim podemos criar um endpoint '/hello-world' GET:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/hello-world'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Hello World'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso teremos um retorno de um texto 'Hello World' ao chamar a rota.&lt;/p&gt;

&lt;h3&gt;
  
  
  Response
&lt;/h3&gt;

&lt;p&gt;Até a parte anterior foi possível retornar algo simples como um texto com status code 200. Já adiantando um próximo assunto vou deixar como retornar qualquer coisa definindo o status code HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/error-500'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ERRO!!!'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código acima utilizou a função 'response', um helper do Laravel para facilitar o retorno da classe de Response do framework. Com esse helper podemos definir o retorno e em seguida como segundo parâmetro o status code HTTP desse retorno, que no exemplo foi 500 de erro no servidor.&lt;/p&gt;

&lt;p&gt;Para finalizar a parte básica de rotas vou deixar um &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" rel="noopener noreferrer"&gt;link da documentação da Mozilla de Status Code HTTP&lt;/a&gt; que utilizaremos adiante.&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>lumen</category>
    </item>
    <item>
      <title>Padrões de Desenvolvimento de Software NÃO são meras frescuras</title>
      <dc:creator>Lucien Risso Correia</dc:creator>
      <pubDate>Tue, 21 Mar 2023 23:47:08 +0000</pubDate>
      <link>https://dev.to/luciencorreia/padroes-de-desenvolvimento-de-software-nao-sao-meras-frescuras-3cl1</link>
      <guid>https://dev.to/luciencorreia/padroes-de-desenvolvimento-de-software-nao-sao-meras-frescuras-3cl1</guid>
      <description>&lt;p&gt;Conhece aqueles desenhos que os músicos de uma orquestra leem enquanto tocam a música? A partitura, cheia de linhas e símbolos. Na música ela é utilizada de forma universal, para qualquer músico, de qualquer lugar do mundo, que fale qualquer idioma, conseguir tocar qualquer música escrita ali. Isso só é possível porque a partitura foi padronizada como uma forma de escrever uma música, uma linguagem universal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mas o que partitura tem a ver com desenvolvimento de software?
&lt;/h3&gt;

&lt;p&gt;Numa conversa aleatória, na base da cerveja é claro, foi comentado sobre o tempo em que um desenvolvedor demora para se entender com o código. Nisso, foi relacionado a partitura com os padrões de desenvolvimento, assim como qualquer músico que saiba ler uma partitura consegue tocar qualquer música feita por outro músico sem sequer o conhecer, qualquer desenvolvedor que saiba os padrões da *stack *do projeto, consegue se entender rapidamente a ponto de em pouco tempo conseguir adicionar uma feature nova ou corrigir um bug.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os grandes projetos de software livre definem padrões
&lt;/h3&gt;

&lt;p&gt;Muito provável que o repositório daquele seu framework favorito tenha um arquivo chamado *CONTRUIBUTING.md *com todas as instruções e padrões para aquela sua PR **linda **ser aceita e ir pra *branch *principal. Vou deixar o exemplo do &lt;a href="https://github.com/flutter/flutter/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;*flutter&lt;/a&gt; *para dar uma olhadinha. Procure pelo repositório de seus frameworks favoritos, eles provavelmente devem seguir padrões.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Ser escalável não é hospedar na Amazon&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sabe aquele tio ou primo, um gênio incompreendido, que viu alguma palestra sobre *startups *e brotou com uma ideia estranha? E que quer alguém que saiba mexer com *AWS *pro produto genial dele ser escalável? Então, eu ainda não entendi o que faz pensar que é só tacar lá que vira um *puta software escalável. *Ser escalável não se limita ao custo de servidores, abrange também o custo humano, nisso existem duas frentes, a galera que cria as novidades e a galera que corrige o que já está rodando. Nessa segunda frente, um software mal feito, pode acabar pesando no custo, e com isso nessa tal de escalabilidade.&lt;/p&gt;

&lt;p&gt;Querendo ou não, é impossível pegar todos os bugs e erros de um sistema grande antes de enviar pra produção. Pode ter 100% de cobertura de testes automatizados e mais os testes manuais que sempre terá alguma coisa que não foi prevista. E para conseguir diminuir ao máximo os erros e bugs em produção, o processo de desenvolvimento deve ser muito cuidadoso e rigoroso, obrigando os desenvolvedores a testarem e escreverem testes, seguir o design do código e os padrões de desenvolvimento estabelecidos. Tudo isso colabora para evitar problemas em produção e não criar a bola de neve que código ruim causa e evitando custos adicionais como horas extras da galera que trampa no feriado pra corrigir um erro 500 naquele módulo indispensável pros clientes.&lt;/p&gt;

&lt;h3&gt;
  
  
  O ciclo de vida não pode terminar em um “software novo”
&lt;/h3&gt;

&lt;p&gt;Não são poucos casos que escutei de software que precisaram serem reescritos pra poderem receber novas features. E todos esses casos foram por ir criando a base de “duas coxadas e uma barrigada”, cuspindo código adoidado pra entregar logo porque tem que ter tal coisa pro próximo &lt;em&gt;pitch *com investidores ou com uma apresentação pra um possível grande cliente. Esse famoso atrito do pessoal de vendas/gestão com o pessoal técnico pode custar muito ao longo do tempo. Mas ainda existe a outra ponta, a ponta dos software que nunca termina as correções de erros e bugs, que cada vez mais se contrata desenvolvedor para ir corrigindo, e a cada correção se cria um novo bug ou erro. Repita comigo: “&lt;a href="https://www.linkedin.com/posts/paulo-chiodi_oi-repita-comigo-encher-a-empresa-com-devs-activity-6801280066199293952-QT7f" rel="noopener noreferrer"&gt;*Encher a empresa de devs não faz as coisas serem mais rápidas&lt;/a&gt;”&lt;/em&gt;. Um código fonte ruim gera desanimo, e desanimo pode gerar alta rotatividade, e trocar de funcionário custa muito mais que manter. Até esse novo chegar ao nível de desempenho do anterior demora. É claro que é impossível ter um código totalmente limpo, simples e fácil de entender em um sistema grande, mas é aquele ditado: &lt;em&gt;faça o seu melhor nas condições que você tem, até ter melhores condições para fazer melhor ainda&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aquele velho blá blá blá de sempre
&lt;/h3&gt;

&lt;p&gt;Sim, vou terminar esse texto repetindo o que provavelmente o sênior do teu trampo já repetiu várias vezes, padrões de desenvolvimento não são frescuras e se vocês acha que é frescura, releia esse texto.&lt;/p&gt;

&lt;h2&gt;
  
  
  tl;dr:
&lt;/h2&gt;

&lt;p&gt;Esse texto foi escrito baseado em experiência própria e em conversas com outros devs e galera da área. Não leve nada ao pé da letra, ou leve, particularmente eu to nem ai :)&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
