<?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: Leandro Henrique</title>
    <description>The latest articles on DEV Community by Leandro Henrique (@emtudo).</description>
    <link>https://dev.to/emtudo</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%2F151422%2F15910191-3dd8-4b51-8814-de0d006dee1f.jpg</url>
      <title>DEV Community: Leandro Henrique</title>
      <link>https://dev.to/emtudo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emtudo"/>
    <language>en</language>
    <item>
      <title>KVM - Compartilhando pasta entre host e convidado.</title>
      <dc:creator>Leandro Henrique</dc:creator>
      <pubDate>Mon, 05 Apr 2021 18:59:38 +0000</pubDate>
      <link>https://dev.to/emtudo/kvm-compartilhando-pasta-entre-host-e-convidado-ee6</link>
      <guid>https://dev.to/emtudo/kvm-compartilhando-pasta-entre-host-e-convidado-ee6</guid>
      <description>&lt;h2&gt;
  
  
  Problema
&lt;/h2&gt;

&lt;p&gt;Sábado eu tive uma surpresa que o Docker não funcionava por motivos ignorados, muita coisa estava estranha, então decidi formatar e usar o KVM para virtualizar máquinas para trabalho, escutando a ideia do meu amigo Alexandre que já trabalha assim.&lt;/p&gt;

&lt;p&gt;Porém eu não queria utilizar um arquivo como HD gigante, então defini um arquivo pequeno, e compartilhei uma pasta, a princípio utilizei o NFS e compartilhei os arquivos, estava tudo bem, até eu precisar executar o Docker e por algum motivo ele não executar em alguns projetos, parecia algo de permissão.&lt;/p&gt;

&lt;p&gt;Eu tentei compartilhar como "passthrough", mas não obtive exido, mas consegui usar no modo "mapped".&lt;/p&gt;

&lt;h2&gt;
  
  
  Solução
&lt;/h2&gt;

&lt;p&gt;No &lt;code&gt;Gerenciador de Máquinas Virtuais&lt;/code&gt; adicione um &lt;code&gt;sistema de arquivos&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Em &lt;code&gt;Caminho de Origem&lt;/code&gt; (Source Path), você coloca o caminho da sua pasta no host (máquina onde as vm estão).&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;Caminho Destino&lt;/code&gt; (To path), você coloca o nome do mapeamento que irá existir dentro da VM. NÃO crie (isso mesmo não crie) esta pasta na VM.&lt;/p&gt;

&lt;p&gt;Dentro da VM você adiciona no seu /etc/fstab o seguinte:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

/shared /pasta-dentro-da-vm 9p trans=virtio,version=9p2000.L,accessmode=mapped 0 0 


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

&lt;/div&gt;

&lt;p&gt;OU se quiser apenas testar: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

mount &lt;span class="nt"&gt;-t&lt;/span&gt; 9p &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;trans&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;virtio,version&lt;span class="o"&gt;=&lt;/span&gt;9p2000.L,accessmode&lt;span class="o"&gt;=&lt;/span&gt;mapped /shared /pasta-dentro-da-vm  


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Permissões
&lt;/h2&gt;

&lt;p&gt;Se você tiver problemas com permissões o que provavelmente terá, você precisará conceder permissão de gravação ao grupo &lt;code&gt;libvirt-qemu&lt;/code&gt; ao diretório compartilhado e todos os subdiretórios.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;chgrp&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; libvirt-qemu /home/shared
&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; g+w /home/shared


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

&lt;/div&gt;

&lt;p&gt;É isso!&lt;/p&gt;

&lt;p&gt;Se você sabe uma forma mais simples ou quer contribuir com outras formas, será de grande valia.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Benchmark PHP X Elixir</title>
      <dc:creator>Leandro Henrique</dc:creator>
      <pubDate>Sat, 20 Mar 2021 19:25:31 +0000</pubDate>
      <link>https://dev.to/emtudo/benchmark-php-x-elixir-2c13</link>
      <guid>https://dev.to/emtudo/benchmark-php-x-elixir-2c13</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Estou a 30 dias estudando Elixir, eu não tenho intenção nem de denegrir a imagem do Elixir que estou apaixonado e nem de enaltecer o PHP e minhas considerações sobre Elixir podem ser equivocadas aja visto que há muito ainda para eu aprender.&lt;/p&gt;

&lt;p&gt;Em uma das aulas propostas pelo curso tinha a leitura de um arquivo de 300 mil linhas para gerar um relatório. Depois de gerado o relatório uma melhoria no relatório dividindo o arquivo em 3 e processando fazendo uso do concorrência.&lt;/p&gt;

&lt;p&gt;Os resultados foi surpreendente ao fazer uso de concorrência, processando 3 arquivos ao mesmo tempo, foi aproximadamente 33% do tempo, mas aqui que começa ficar bom, eu pensei: E o PHP, quanto tempo ele levaria para fazer o mesmo processo?&lt;/p&gt;

&lt;h2&gt;
  
  
  Brincadeira começa aqui.
&lt;/h2&gt;

&lt;p&gt;Bom para fazer comparação entre PHP e Elixir eu multipliquei as linhas fazendo o relatório ter 9 milhões de linhas.&lt;/p&gt;

&lt;p&gt;E vou utilizar o time, para medir o início e o fim de cada resultado, não vou postar vários resultados, você poderá testar ao final cada um quantas vezes quiser e ver o resultado por você mesmo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Versões utilizadas
&lt;/h3&gt;

&lt;p&gt;Elixir 1.12-dev e 1.11.3&lt;br&gt;
PHP 8.0 e 7.4&lt;/p&gt;
&lt;h3&gt;
  
  
  Elixir - Arquivo único
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;time -vvv mix run init-complete.exs&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;User time (seconds): 24.19&lt;br&gt;
Percent of CPU this job got: 124%&lt;/p&gt;

&lt;p&gt;Memória utilizada em todos os testes do Elixir variou de 28 a 33 megas. Usando :erlang.memory(:total) para saber a quantidade de memória utilizada.&lt;/p&gt;
&lt;h3&gt;
  
  
  PHP - Arquivo único teste 1 - com debug
&lt;/h3&gt;

&lt;p&gt;O primeiro teste foi similar ao do Elixir com a diferença de utilizar 3,7 gigas de memória, só que eu tentei executar o mesmo no Mac que só tem 8 Gigas de memória e não executou, somente no meu PC e no meu Notebook que tem 64GB de Memória ram, porém em outro teste com arquivo menor o de 300 linhas no Mac o tempo ganhava do Elixir. Eu fiquei intrigado, descobri o motivo: no Mac o Debug não estava ativado.&lt;br&gt;
Por isso não coloco o resultado do primeiro teste do php, acho irrelevante, mas acho relevante mencionar o debug ligado que pode alterar muito o resultado.&lt;/p&gt;
&lt;h3&gt;
  
  
  PHP - Arquivo único teste 2 - sem debug
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;time -vvv php reports/report.php&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;User time (seconds): 8.51&lt;br&gt;
Percent of CPU this job got: 99%&lt;br&gt;
Memória Utilizada: 3,7 Gigas&lt;/p&gt;

&lt;p&gt;Bom PHP ganha no tempo, no uso da CPU, mas perdeu de lavada no uso da memória. Foi então que meu amigo &lt;a href="http://github.com/ibrunotome"&gt;Bruno&lt;/a&gt; me lembrou da existência do yield no PHP que eu já tinha lido, mas nunca usei, fui procurar como usar e fiz um novo teste.&lt;/p&gt;
&lt;h3&gt;
  
  
  PHP - Arquivo único teste 3 - sem debug e com yield
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;time -vvv php reports/yield.php&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;User time (seconds): 6.13&lt;br&gt;
Percent of CPU this job got: 99%&lt;/p&gt;

&lt;p&gt;O uso da CPU continuou o mesmo,porém o tempo caiu quase 3 segundos, além que o uso de memória ganhou de lavada do Elixir neste caso, pois usou apenas 2 megas de memória, isso mesmo, você leu corretamente, 2 megas. Até no Mac eu consegui executar este teste, que antes não era possível pela capacidade de memória.&lt;/p&gt;

&lt;p&gt;Então eu dividi os arquivos em 3 e fui fazer o teste com concorrência.&lt;/p&gt;
&lt;h3&gt;
  
  
  Elixir concorrência - 10 arquivos
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;time -vvv mix run init-many10.exs&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;User time (seconds): 41.69&lt;br&gt;
Percent of CPU this job got: 903%&lt;/p&gt;

&lt;p&gt;Tempo aumentou muito, e o uso do processador, achei que coloquei muitos arquivos, então dividi em 3 apenas e depois com 2 arquivos vou colocar o resultado só com 2 arquivos que achei mais relevante e de menor tempo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Elixir concorrência - 2 arquivos
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;time -vvv mix run init-many2.exs&lt;/code&gt; (ops, usar o time para este teste pareceu injusto, visto que por algum motivo ele fica o dobro do tempo).&lt;/p&gt;

&lt;p&gt;Então para este teste, executei via terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;iex &lt;span class="nt"&gt;-S&lt;/span&gt; mix
:timer.tc&lt;span class="o"&gt;(&lt;/span&gt;fn -&amp;gt; ReportsGenerator.build_from_many&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"outaa"&lt;/span&gt;, &lt;span class="s2"&gt;"outab"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; end&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;10 segundos. Memória sempre se manteve aproximadamente a mesma.&lt;/p&gt;

&lt;p&gt;Uso de CPU caiu relacionado a processar 10 arquivos ficando em 300%, o tempo caiu pela metade, embora ainda assim o php sem concorrência ganhou no tempo.&lt;/p&gt;

&lt;h3&gt;
  
  
  PHP concorrência
&lt;/h3&gt;

&lt;p&gt;Eu não fiz o teste com concorrência em PHP, pois é necessário usar ferramenta como Swoole, além do tempo para refatorar o código de moda a usar coroutine.&lt;/p&gt;

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

&lt;p&gt;Os testes não são conclusivos, porém o PHP se mostrou com desempenho melhor mesmo sem usar concorrência, mas devemos considerar que eu executei o Elixir em modo de desenvolvimento, se executar em modo produção os valores podem serem alterados consideravelmente devido a bibliotecas que não serão carregadas em produção assim como aconteceu ao desativar o debug do PHP, mas ainda não coloquei nada em produção da forma correta para poder ser mais justo com Elixir, então fica a seu cargo testar.&lt;/p&gt;

&lt;p&gt;P.S.: PHP não usou o recurso de JIT, até achei que ele estava fazendo uso na versão 8.0, porém executei o teste utilizando a versão 7.4 que não tem JIT e o tempo foi o mesmo ou com tempo insignificante de diferença.&lt;/p&gt;

&lt;p&gt;Seria bacana ver os mesmos teste em Go e Rust, eu gostaria muito de ver os resultados, alguém se habilita?&lt;/p&gt;

&lt;p&gt;Se você quiser fazer seus próprios testes ou até mesmo colocar o PHP em concorrência, segue os scripts que utilizei: &lt;a href="https://github.com/emtudo/reports_generator"&gt;https://github.com/emtudo/reports_generator&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>php</category>
      <category>benchmark</category>
      <category>memory</category>
    </item>
    <item>
      <title>Qual arquivo está sendo modificado?</title>
      <dc:creator>Leandro Henrique</dc:creator>
      <pubDate>Sat, 25 May 2019 14:01:55 +0000</pubDate>
      <link>https://dev.to/emtudo/qual-arquivo-esta-sendo-modificado-10g0</link>
      <guid>https://dev.to/emtudo/qual-arquivo-esta-sendo-modificado-10g0</guid>
      <description>&lt;p&gt;Você já precisou automatizar algo e não sabe qual arquivo modificar?&lt;/p&gt;

&lt;p&gt;Você altera pela interface gráfica, mas não sabe o que realmente é alterado?&lt;/p&gt;

&lt;p&gt;Bom partindo pelo princípio que os arquivos de configuração no Linux fica no diretório /etc, nós podemos utilizar o inotifywait para saber quais arquivos foram modificados, para isso basta executar o comando:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;inotifywait &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; modify /etc |     &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read &lt;/span&gt;path _ file&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do         &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$path$file&lt;/span&gt; modified&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Pode ser que seja necessário instalar o inotifywait antes.&lt;/p&gt;

&lt;p&gt;Caso você tenha problema com a quantidade de leituras de arquivos, recomendo a leitura desse outro artigo: &lt;a href="https://dev.to/emtudo/atualizacao-de-arquivos-max-user-watches-15eh"&gt;https://dev.to/emtudo/atualizacao-de-arquivos-max-user-watches-15eh&lt;/a&gt;&lt;/p&gt;

</description>
      <category>arquivosmodificados</category>
      <category>arquivosalterados</category>
      <category>config</category>
    </item>
    <item>
      <title>Atualização de arquivos/Max user Watches</title>
      <dc:creator>Leandro Henrique</dc:creator>
      <pubDate>Sat, 25 May 2019 13:45:07 +0000</pubDate>
      <link>https://dev.to/emtudo/atualizacao-de-arquivos-max-user-watches-15eh</link>
      <guid>https://dev.to/emtudo/atualizacao-de-arquivos-max-user-watches-15eh</guid>
      <description>&lt;p&gt;Se você está tendo problemas com arquivos não atualizados no seu editor de texto, você cria um arquivo e ele não aparece ou apaga e continua vendo ele, seu problema pode ser a quantidade máxima de arquivos assistido por usuário.&lt;/p&gt;

&lt;p&gt;Como resolver?&lt;/p&gt;

&lt;p&gt;Adicione ao final do arquivo "/etc/sysctl.conf"&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;fs.inotify.max_user_watches&lt;span class="o"&gt;=&lt;/span&gt;524288
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Agora você precisa carregar as alterações, execute o comando:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;E quiser ver a quantidade atual, digite:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/fs/inotify/max_user_watches
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>maxuserwatches</category>
      <category>refreshfiles</category>
      <category>atualizararquivos</category>
    </item>
  </channel>
</rss>
