<?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: Rubens dos Santos</title>
    <description>The latest articles on Forem by Rubens dos Santos (@kaetaen).</description>
    <link>https://forem.com/kaetaen</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%2F656735%2F3e4bb629-eb76-4d59-9d52-dc30f9981e11.jpg</url>
      <title>Forem: Rubens dos Santos</title>
      <link>https://forem.com/kaetaen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kaetaen"/>
    <language>en</language>
    <item>
      <title>Padrões de Projeto em PHP: Singleton</title>
      <dc:creator>Rubens dos Santos</dc:creator>
      <pubDate>Wed, 30 Mar 2022 01:25:28 +0000</pubDate>
      <link>https://forem.com/kaetaen/padroes-de-projeto-em-php-singleton-1eel</link>
      <guid>https://forem.com/kaetaen/padroes-de-projeto-em-php-singleton-1eel</guid>
      <description>&lt;p&gt;Design Patterns, os padrões de projetos, são extremamente úteis e eficazes na escalabilidade, robustez e compreensão do código. Embora seja um nome que nos leve a pensar em complexidade, o principal intuito de um padrão de projeto é resolver um problema. Foram formulados pela tão estimada Gang of Four e são utilizados em larga escala. Pense neles como uma solução para situações onde você provavelmente reinventaria a roda se não os conhecesse.&lt;/p&gt;

&lt;p&gt;O padrão de projeto que vou apresentar hoje é um padrão criacional (uma das três categoria de padrões de projeto): o Singleton&lt;/p&gt;

&lt;p&gt;Tanto o conceito como a aplicabilidade do Singleton são simples. O Singleton preza que apenas uma instância seja retornada. Isso possui diversa aplicabilidades. Pense numa classe com funcionalidades genéricas que é utilizada em vários pontos de sua aplicação, mas que não possui um estado. Seria uma boa ideia utilizar um Singleton para essa classe, certo?&lt;/p&gt;

&lt;p&gt;Vou explicar por etapas a construção dessa classe para objetos solitários.&lt;/p&gt;

&lt;p&gt;Vamos voltar ao anime Naruto e fingir que o único Uchiha existente realmente é o Sasuke (embora saibamos que tenha mais Uchihas no mundo do que Almeidas). Logo só existe um Uchiha na face da terra.&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;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Uchiha&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;Ao declarar a palavra-chave &lt;code&gt;final&lt;/code&gt; no inicio da classe estamos dizendo que essa classe não pode ser herdada, isto é: não pode gerar classes filhas. É isso mesmo, vamos fingir que o Sasuke é estéril também (pobre Sasuke). &lt;/p&gt;

&lt;p&gt;Um dos modos efetivos de bloquear a instanciação de uma classe é impedir sua proliferação é não deixando que o metodo construtor seja invocado... e não, não adianta deixar de definir um construtor, a classe faz isso automaticamente. Uma técnica que podemos aplicar é utilizando o modificador de acesso &lt;code&gt;private&lt;/code&gt; em oposição ao &lt;code&gt;public&lt;/code&gt;, em nosso construtor:&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;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Uchiha&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&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;Outra situação que precisamos impedir é a clonagem do nosso Uchiha (afinal só se clona Senjus no anime). A técnica é a mesma: impedir acesso externo ao método especial.&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;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Uchiha&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&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="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__clone&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;Um cenário mais atípico: existe um método especial no PHP chamado o &lt;code&gt;__wakeup&lt;/code&gt;, ele permite a completa construção de objetos desserializados (o Google é seu amigo). Vamos prevenir essa arte de Orochimaru tornando também o método &lt;code&gt;__wakeup&lt;/code&gt; privado&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;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Uchiha&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&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="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__clone&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="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__wakeup&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;Por fim, vamos criar um método que permite retornar o nosso Uchiha.&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;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Uchiha&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Declaramos o atributo a ser retornado&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;?Uchiha&lt;/span&gt; &lt;span class="nv"&gt;$instance&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&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="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__clone&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="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__wakeup&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="c1"&gt;// Método para obter a instância&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;getInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;// Garantimos que somente uma instância seja criada&lt;/span&gt;
       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$instance&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$instance&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;static&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;

       &lt;span class="c1"&gt;// Por fim retornamos a instância&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$instance&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="c1"&gt;// criamos nosso objeto Singleton&lt;/span&gt;
&lt;span class="nv"&gt;$sasuke&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Uchiha&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por hoje é só pessoal.&lt;br&gt;
Até a próxima! 😊&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Swoole: o PHP concorrente</title>
      <dc:creator>Rubens dos Santos</dc:creator>
      <pubDate>Sun, 27 Mar 2022 15:22:35 +0000</pubDate>
      <link>https://forem.com/kaetaen/swoole-o-php-concorrente-10o4</link>
      <guid>https://forem.com/kaetaen/swoole-o-php-concorrente-10o4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Para sempre é muito tempo. O tempo não pára!"&lt;/em&gt;&lt;br&gt;
– Mario Quintana&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu comecei a programar em JavaScript no servidor (Node.js) bem antes de PHP, logo o conceito de assincronismo já estava naturalizado no meu jeito de fazer as coisas pois o JavaScript já é assíncrono por natureza.&lt;/p&gt;

&lt;p&gt;Quando comecei a programar em PHP a primeira coisa fora do básico que eu vi foi o funcionamento do php-curl, e gostei do quanto ele era procedural. PHP foi pensado como uma linguagem procedural e posteriormente foi implementa uma solução de orientação a objetos à linguagem. No mundo real, nem sempre podemos esperar que uma operação seja realizada para partir para a próxima, muitas vezes necessitamos que as coisas  ocorram ao mesmo tempo, que pelo menos pareça que ocorram dessa forma.&lt;/p&gt;

&lt;p&gt;Já existem técnicas conhecidas para resolver esse problema, nesse artigos usaremos corrotinas, uma oposição ao pthread do PHP. As corrotinas são parecidas com as threads e seu comportamento, porém consomem menos recursos. &lt;/p&gt;

&lt;p&gt;A solução que temos para esse problema é o OpenSwoole, que segundo a documentação do mesmo, ele foi pensando para &lt;br&gt;
 construir serviços de alto desempenho, escaláveis, TCP, UDP, Unix Socket, HTTP, WebSocket com PHP por meio de corrotinas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalação do Swoole
&lt;/h2&gt;

&lt;p&gt;A primeira coisa a ser feita é instalar a extensão do Swoole na nossa máquina. Eu recomendo fortemente o uso do PECL, se você não usa amigo, instale agora na sua máquina. Vamos usar a distribuição GNU/Linux Ubuntu como referência.&lt;/p&gt;

&lt;p&gt;Caso não possua o PECL instalado:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt-get install php-pear php-dev&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Em seguida vamos instalar o Swoole:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo sudo pecl install openswoole-4.9.1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para finalizar iremos habilitar a extensão do Swoole adicionando essa linha ao nosso php.ini&lt;/p&gt;

&lt;p&gt;&lt;code&gt;extension=openswoole.so&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Mão na massa
&lt;/h2&gt;

&lt;p&gt;Após instalar e habilitar o swoole uma série de classes e helpers ficam disponíveis para que possamos utiliza-lo em nossas aplicações. Nesse exemplo usaremos o &lt;code&gt;go();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A função go() nos permite encapsular uma função dentro de uma corrotina. &lt;/p&gt;

&lt;p&gt;Teremos funções encapsuladas por duas corrotinas, uma lista uma série de heróis de animes, e a outra lista os vilões. TNosso objetivo é que essa listagem ocorra "paralelamente".&lt;/p&gt;

&lt;p&gt;Esse exemplo nos permitirá um vislumbre do funcionamento do Swoole.&lt;/p&gt;

&lt;p&gt;O código abaixo:&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="c1"&gt;// Lista os heróis&lt;/span&gt;
&lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;static&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="nv"&gt;$heros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Kurosaki Ichigo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Uzumaki Naruto'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Kamado Tanjiro'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$heros&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$hero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Hero: '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$hero&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&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="c1"&gt;// Lista os vilões&lt;/span&gt;
&lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;static&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="nv"&gt;$villains&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Sosuke Aizen'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Otsutsuki Kaguya'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Muzan Kibutsuji'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$villains&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$villain&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Villain: '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$villain&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&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;Exibe o seguinte resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hero: Kurosaki Ichigo
Hero: Uzumaki Naruto
Hero: Kamado Tanjiro
Villain: Sosuke Aizen
Villain: Otsutsuki Kaguya
Villain: Muzan Kibutsuji

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

&lt;/div&gt;



&lt;p&gt;"Mas você não disse que era paralelo?"&lt;/p&gt;

&lt;p&gt;Sim, mas você não acha que é um código simples e rápido de mais para se perceber isso? Pois, de fato é. Então vamos adicionar uma pausa no processo de listagem para vermos o Swoole agir.&lt;/p&gt;

&lt;p&gt;A única mudança que faremos no código anterior é adicionar o &lt;code&gt;sleep();&lt;/code&gt; depois de cada &lt;code&gt;echo&lt;/code&gt;.&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="c1"&gt;// Lista os heróis&lt;/span&gt;
&lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;static&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="nv"&gt;$heros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Kurosaki Ichigo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Uzumaki Naruto'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Kamado Tanjiro'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$heros&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$hero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Hero: '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$hero&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;sleep&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Lista os vilões&lt;/span&gt;
&lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;static&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="nv"&gt;$villains&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Sosuke Aizen'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Otsutsuki Kaguya'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Muzan Kibutsuji'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$villains&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$villain&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Villain: '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$villain&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;sleep&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="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 novamente temos a saida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hero: Kurosaki Ichigo
Hero: Uzumaki Naruto
Hero: Kamado Tanjiro
Villain: Sosuke Aizen
Villain: Otsutsuki Kaguya
Villain: Muzan Kibutsuji

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

&lt;/div&gt;



&lt;p&gt;Não mudou nada. A única coisa diferente neesse segundo código foi a espera de 1 segundo para cada elemento ser impresso. Ainda não sentimos a sensação de que de fato as duas funções estão sendo executadas "ao mesmo tempo". A culpa disso é da  função &lt;code&gt;sleep()&lt;/code&gt;. A função &lt;code&gt;sleep()&lt;/code&gt; é bloqueante, isso faz com que nosso código seja procedural. para resolvermos isso  executaremos uma função auxiliar do Swoole que faz com que as funções bloqueates do PHP se comportem como não-bloqueantes&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="c1"&gt;// Método auxiliar que torna o código não-bloqueante bloqueante&lt;/span&gt;
&lt;span class="nc"&gt;Swoole\Runtime&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;enableCoroutine&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


&lt;span class="c1"&gt;// Lista os heróis&lt;/span&gt;
&lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;static&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="nv"&gt;$heros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Kurosaki Ichigo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Uzumaki Naruto'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Kamado Tanjiro'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$heros&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$hero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Hero: '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$hero&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;sleep&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Lista os vilões&lt;/span&gt;
&lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;static&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="nv"&gt;$villains&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Sosuke Aizen'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Otsutsuki Kaguya'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Muzan Kibutsuji'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$villains&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$villain&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Villain: '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$villain&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;sleep&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="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;Com isso finalmente temos nosso código sendo executado de modo alternado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hero: Kurosaki Ichigo
Villain: Sosuke Aizen
Hero: Uzumaki Naruto
Villain: Otsutsuki Kaguya
Villain: Muzan Kibutsuji
Hero: Kamado Tanjiro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É isso pessoal, até a próxima :)&lt;/p&gt;

</description>
      <category>php</category>
      <category>swoole</category>
      <category>web</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Paralisia por Análise: A Insegurança Derivada do Excesso de Informações.</title>
      <dc:creator>Rubens dos Santos</dc:creator>
      <pubDate>Sat, 18 Sep 2021 16:05:05 +0000</pubDate>
      <link>https://forem.com/kaetaen/paralisia-por-analise-a-inseguranca-derivada-do-excesso-de-informacoes-3n1h</link>
      <guid>https://forem.com/kaetaen/paralisia-por-analise-a-inseguranca-derivada-do-excesso-de-informacoes-3n1h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Agora eu sei que estou vivendo por quem eu sou."&lt;/em&gt;&lt;br&gt;
— Who I Am, Smile Empty Soul&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;
Durante nosso processo de evolução na carreira como profissional de tecnologia — específicamente programação —  passamos por boas e más fases, embora essa última seja desagradável é onde nós mais nos desenvolvemos. Você começa a programar entusiasmado com o universo diante de você e aí decide qual tecnologia estudar.&lt;/p&gt;

&lt;p&gt;Todo mundo diz a mesma coisa: &lt;em&gt;"foque numa linguagem."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Você presume: &lt;em&gt;ah, essa pessoa sabe do que está falando, ela está no mercado, vou seguir essa dica! Vou estudar &lt;strong&gt;JavaScript&lt;/strong&gt;! Pois com JavaScript eu posso fazer um montão de coisa!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Seu coração palpita pois você está começando, dando seus primeiros passos para embarcar numa viagem direto para Atlântida ou para Lua, Você é o verdadeiro &lt;a href="https://poignant.guide/images/dr.cham-1.gif" rel="noopener noreferrer"&gt;Dr. N. Howard Cham&lt;/a&gt; e nada o impedirá de alcançar seus objetivos.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Segunda Decisão
&lt;/h2&gt;

&lt;p&gt;Logo depois de aprender o básico de JavaScript você descobre duas coisas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Você não é o Dr. Cham&lt;/li&gt;
&lt;li&gt;A vida não é como um conto peculiar do Why's (poignant) Guide to Ruby&lt;/li&gt;
&lt;li&gt;Programar coisas legais é difícil.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Você quer estudar JavaScript mas em qual contexto? Front-end? Mobile? Back-end? Você não sabe em qual focar então tem uma ideia genial: &lt;em&gt;"vou virar fullstack! Com isso terei todo o poder do JavaScript nas minhas mãos."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Porém como dito no n° 3: programar coisas legais é difícil. Programar coisas concebendo todos as suas frentes é mais dificil ainda. &lt;em&gt;"SQL? Meu Deus, o que é isso? N:N, isso ainda é sobre programação?"&lt;/em&gt;.&lt;br&gt;
Mas você persiste: &lt;em&gt;"basta eu estudar."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O Mercado
&lt;/h2&gt;

&lt;p&gt;Você já está relativamente &lt;em&gt;mais ou menos&lt;/em&gt; bom na tecnologia que você escolheu, e em algum momento você diz pra si mesmo: &lt;em&gt;"estou pronto"&lt;/em&gt;. O próximo passo é buscar por vagas para desenvolvedor fullstack, você começa a interagir com mais frequência em grupos de Facebook, Telegram, LinkedIn e etc. E é aqui que começa: ao ficar exposto a diversas opiniões, exigências e perspectivas diferentes você fica confuso. O que você sabe não parece ser o melhor caminho. Você pensa no futuro.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Paralisia
&lt;/h2&gt;

&lt;p&gt;Você passa a analisar diversos parâmetros para focar em algo:  o que você gosta &lt;em&gt;versus&lt;/em&gt; qual tecnologia é a mais promissora para o futuro &lt;em&gt;versus&lt;/em&gt; qual tecnologia está menos &lt;em&gt;saturada&lt;/em&gt; &lt;em&gt;versus&lt;/em&gt; qual tecnologia possui uma entrada mais fácil para o mercado &lt;em&gt;versus&lt;/em&gt; qual tecnologia é mais usada atualmente... e você fica que nem macaco, pulando de galho em galho, uma hora você aprende Go, outra você aprende Java, Python, PHP. O que você busca é a escolha &lt;em&gt;certa&lt;/em&gt;, mas nunca escolhe nada pois teme investir na escolha &lt;em&gt;errada&lt;/em&gt; e fica nesse processo da validação constante. Vivendo no raso, o que é pior que medíocre. Sabe um monte de coisas, mas não é bom em nada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todos os Caminhos Levam a Roma
&lt;/h2&gt;

&lt;p&gt;Foi em meados de 2019, eu estava cursando Redes de Computadores no Instituto Federal e no Dia da Mulher foram convidadas algumas mulheres que trabalhavam com tecnologia. Uma delas era uma desenvolvedora Ruby que colaborava com projetos open-source. Lembro-me claramente dela perguntar para uma plateia de calouros do curso de Sistemas da Informação: &lt;em&gt;"alguém aqui conhece o Github?"&lt;/em&gt;, e eu ser o único a levantar a mão.&lt;br&gt;
Fiquei fascinado por ela, a história dela era incrível! Depois da palestra fui pedir conselhos. Dentre as perguntas que eu fiz a mais importante foi: &lt;em&gt;"Qual maior conselho você daria para alguém que está começando a programar?"&lt;/em&gt;. A resposta foi imediata, sem hesitação: &lt;em&gt;"foque em uma tecnologia"&lt;/em&gt;.&lt;br&gt;
Todo mundo diz isso, mas ninguém explica o porquê, e consequentemente quem ouve não entende o que realmente significa e a importância disso.&lt;br&gt;
Quando você foca em uma tecnologia você atinge um patamar de conhecimento na mesma que os detalhes dela deixam de ser um empecilho e assim você pode focar em conceitos mais avançados como padrões de projeto, paralelismo eficaz, boas práticas e afins. Quando você fica pulando de tecnologia em tecnologia, os detalhes da tecnologia sempre serão um empecilho e você nunca consegue sair dessa primeira camada. &lt;br&gt;
Eu tive uma base sólida em Python, estudei desenvolvimento web com Python e a partir disso não tive nenhuma dificuldade em aprender outras ferramentas. O mesmo vale se você começa com PHP, Java, JavaScript. Realmente tanto faz, comece por alguma lugar e quando estiver pronto estude o que descobriu ser o que você realmente quer fazer. Não seja um programador dependente da linguagem, embora seja quase uma anáfora dizer isso, afirmo: linguagem é só ferramenta. Um meio para um fim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Respire
&lt;/h2&gt;

&lt;p&gt;O excesso de opiniões mina nosso caminho. Ninguém sabe do futuro e não existe mercado saturado para bons profissionais. Lembro-me de ter deixado de estudar Python e ido para JavaScript porque aparentemente haviam mais vagas para desenvolvedores JavaScript. Uma belo dia surgiu uma vaga Python perfeita para mim, mas eu já não me sentia mais capaz (Sindrome do Impostor? Talvez), fazia muito tempo que não desenvolvia web com Python e eu estava muito envolvido com JavaScript. Respeite seu tempo como iniciante. Não pule etapas. Busque o que você gosta. &lt;/p&gt;

&lt;h2&gt;
  
  
  A Decisão
&lt;/h2&gt;

&lt;p&gt;Só escolha. Sério. Qualquer coisa que você escolher vai ser uma boa escolha. Não é a tecnologia que vai te definir. Se você for dedicado e esforçado, nada será uma barreira para você. Filtre bem as opiniões, a maioria das pessoas são tão inseguras quanto você e sabem tanto do futuro quanto você. Não corra, não se desespere e o mais importante: não pule etapas!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>healthydebate</category>
    </item>
  </channel>
</rss>
