<?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: Paulo Gabriel</title>
    <description>The latest articles on DEV Community by Paulo Gabriel (@pgjbz).</description>
    <link>https://dev.to/pgjbz</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%2F700616%2F19c2af11-d9b9-40ae-8bba-1cecf7147de9.jpeg</url>
      <title>DEV Community: Paulo Gabriel</title>
      <link>https://dev.to/pgjbz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pgjbz"/>
    <language>en</language>
    <item>
      <title>MISE - Gerenciando SDKs de maneira inteligente</title>
      <dc:creator>Paulo Gabriel</dc:creator>
      <pubDate>Tue, 02 Jan 2024 13:31:25 +0000</pubDate>
      <link>https://dev.to/pgjbz/rtx-sem-raytracing-gerenciando-sdks-de-maneira-inteligente-5efm</link>
      <guid>https://dev.to/pgjbz/rtx-sem-raytracing-gerenciando-sdks-de-maneira-inteligente-5efm</guid>
      <description>&lt;h2&gt;
  
  
  O que é mise?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mise.jdx.dev/"&gt;mise&lt;/a&gt; além de uma série de placas de vídeo da NVIDIA, também é uma ferramente para gerenciamento de SDKs, com ele gerenciamos automaticamente versões, variáveis de ambiente, task runners, etc. Podemos usá-lo no lugar do &lt;a href="https://asdf-vm.com/"&gt;asdf-vm&lt;/a&gt;, &lt;a href="https://www.jenv.be/"&gt;jenv&lt;/a&gt;, &lt;a href="https://github.com/nvm-sh/nvm"&gt;nvm&lt;/a&gt;, &lt;a href="https://sdkman.io/"&gt;sdkman&lt;/a&gt; e outras ferramentas, sim, ele substitui todas elas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como instalar?
&lt;/h2&gt;

&lt;p&gt;O processo de instalação do mise é bem simples, basta executarmos o seguinte comando, tanto para Linux quanto para MacOS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://mise.jdx.dev/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o processo de ativação do mise varia conforme o tipo de shell que você utiliza. Por exemplo para ativarmos ele no &lt;code&gt;zsh&lt;/code&gt; devemos usar da seguinte maneira:&lt;br&gt;
&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(mise activate zsh)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para bash:&lt;br&gt;
&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(~/.local/share/mise/bin/mise activate bash)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para fish:&lt;br&gt;
&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'~/.local/share/mise/bin/mise activate fish | source'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.config/fish/config.fish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para adicionarmos os shims devemos adiciona-los no PATH, com isso temos um maior suporte para IDEs como as da JetBrains e até mesmo o VSCode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="$HOME/.local/share/mise/shims:$PATH"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Plugins
&lt;/h2&gt;

&lt;p&gt;Por padrão o mise já vem com plugins para Go, Java, NodeJS, Python e Ruby. Mas podemos instalar plugins com facilidade, por exemplo rodando o fcomando abaixo, adicionamos o plugin para Bun&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise plugin add bun
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E com o seguinte comando conseguimos listar todas as versões de bun disponiveis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise ls-remote bun
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ps. Todos os plugins do &lt;code&gt;asdf&lt;/code&gt; são compatíveis com o mise.&lt;/p&gt;

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

&lt;p&gt;Para usar de exemplo vou utilizar o JDK, que é com o que eu trabalho diariamente, e eu também utilizo como gerenciador de dependencias o &lt;a href="https://maven.apache.org/"&gt;maven&lt;/a&gt;, então irei instalar o plugin do Maven, do do Java não tem necessidade, pois faz parte do core do mise.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise plugin add maven
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vou listar as versões do maven com&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise ls-remove maven
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vi que a última versão disponível é a &lt;code&gt;3.9.6&lt;/code&gt; para isso eu instalo esta versão usando o comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise &lt;span class="nb"&gt;install &lt;/span&gt;maven@3.9.6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E para configura-lo para o uso global uso o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise global maven@3.9.6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se eu for na minha home, eu encontro o seguinte arquivo &lt;code&gt;.tool-versions&lt;/code&gt; com o seguinte conteudo.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora vou listar todas as versões do Java usando os mesmos comandos, porém quero apenas os JDK que são opendjk.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise ls-remote java@openjdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usando o comando desta maneira eu consigo filtrar a grande lista de JDKs disponíveis, se eu não adicionar o &lt;code&gt;@openjdk&lt;/code&gt; ele ira listar todos os disponíveis, sendo Zulu, GraalVM, adopt, etc.&lt;/p&gt;

&lt;p&gt;Usando o comando abaixo eu instalo a versão do java e configuro ele como o global em apenas uma linha comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise &lt;span class="nb"&gt;install &lt;/span&gt;java@openjdk-21.0.1 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mise global java@openjdk-21.0.1 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto usando os comandos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn &lt;span class="nt"&gt;--version&lt;/span&gt;
java &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tenho as seguintes saidas no terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ mvn &lt;span class="nt"&gt;--version&lt;/span&gt;
Apache Maven 3.9.6 &lt;span class="o"&gt;(&lt;/span&gt;bc0240f3c744dd6b6ec2920b3cd08dcc295161ae&lt;span class="o"&gt;)&lt;/span&gt;
Maven home: /home/pgjbz/.local/share/mise/installs/maven/3.9.6
Java version: 21.0.1, vendor: Oracle Corporation, runtime: /home/pgjbz/.local/share/mise/installs/java/openjdk-21.0.1
Default locale: en, platform encoding: UTF-8
OS name: &lt;span class="s2"&gt;"linux"&lt;/span&gt;, version: &lt;span class="s2"&gt;"6.1.69-1-lts"&lt;/span&gt;, &lt;span class="nb"&gt;arch&lt;/span&gt;: &lt;span class="s2"&gt;"amd64"&lt;/span&gt;, family: &lt;span class="s2"&gt;"unix"&lt;/span&gt;
❯ java &lt;span class="nt"&gt;--version&lt;/span&gt;
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;build 21.0.1+12-29&lt;span class="o"&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 21.0.1+12-29, mixed mode, sharing&lt;span class="o"&gt;)&lt;/span&gt;
❯ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;
/home/pgjbz/.local/share/mise/installs/java/openjdk-21.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Legal, mas até ai parece apenas um "apt", "pacman" da vida, porém configurando automaticamente variaveis de ambiente.&lt;/p&gt;

&lt;p&gt;Agora vamos ao que é mais legal, usando este meu projeto &lt;a href="https://github.com/pgjbz/twitch-loco-bot"&gt;https://github.com/pgjbz/twitch-loco-bot&lt;/a&gt; de 3 anos atrás, usando o Java 11, com o arquivo &lt;code&gt;.tool-versions&lt;/code&gt; dentro dele, configurado com o &lt;code&gt;java openjdk-11.0.1&lt;/code&gt;, podemos simplismente entrar no projeto e digitar o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso já temos o Java 11 instalado e configurado para este projeto.&lt;/p&gt;

&lt;p&gt;Para verifircar-mos vamos usar os comandos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ java &lt;span class="nt"&gt;--version&lt;/span&gt;
openjdk 11.0.1 2018-10-16
OpenJDK Runtime Environment 18.9 &lt;span class="o"&gt;(&lt;/span&gt;build 11.0.1+13&lt;span class="o"&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM 18.9 &lt;span class="o"&gt;(&lt;/span&gt;build 11.0.1+13, mixed mode&lt;span class="o"&gt;)&lt;/span&gt;
❯ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;
/home/pgjbz/.local/share/mise/installs/java/openjdk-11.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veja que a variável de ambiente trocou o seu valor, e agora, para voltar ao Java 21? Basta sairmos da pasta do projeto e podemos validar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ java &lt;span class="nt"&gt;--version&lt;/span&gt;
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;build 21.0.1+12-29&lt;span class="o"&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 21.0.1+12-29, mixed mode, sharing&lt;span class="o"&gt;)&lt;/span&gt;
❯ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;
/home/pgjbz/.local/share/mise/installs/java/openjdk-21.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, voltamos a configuração para o Java 21, isso vale para qualquer ferramenta, para go, node, deno, bun, ruby, ocaml, haskell, elixir, etc.&lt;/p&gt;

&lt;p&gt;Com essa ferramenta podemos facilitar a padronização nos projetos para o time, sempre deixando tudo com as versões corretas.&lt;/p&gt;

&lt;p&gt;Lembrando, o &lt;code&gt;mise&lt;/code&gt; ira priorizar os arquivos &lt;code&gt;.tool-versions&lt;/code&gt; da pasta atual, e caso não exista ele irá utilizar a global.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tools</category>
      <category>java</category>
      <category>programmers</category>
    </item>
    <item>
      <title>O mito do "Java é Difícil" e as melhorias da linguagem</title>
      <dc:creator>Paulo Gabriel</dc:creator>
      <pubDate>Fri, 25 Nov 2022 16:27:09 +0000</pubDate>
      <link>https://dev.to/pgjbz/o-mito-do-java-e-dificil-e-as-melhorias-da-linguagem-50bk</link>
      <guid>https://dev.to/pgjbz/o-mito-do-java-e-dificil-e-as-melhorias-da-linguagem-50bk</guid>
      <description>&lt;h2&gt;
  
  
  O mito
&lt;/h2&gt;

&lt;p&gt;Uma das coisas que eu mais vejo na internet e faculdade são falas como "Deus me livre de usar Java", "Java é muito difícil" e "Java é muito verboso" &lt;del&gt;"Precisei comprar um computador de R$ 10.000,00 para poder usar Java"&lt;/del&gt;, ta eu não trouxe muitos exemplos, aposto que você também viu algo parecido.&lt;br&gt;
O grande problema é que muitas pessoas, na verdade, não entendem o paradigma de Orientação a Objetos e culpam a linguagem em si, a linguagem nunca é a culpada por algo. Ela é só uma ferramenta, o grande ponto é o telefone sem fio que vai espalhando a "noticia" de que o problema está na linguagem, muitas pessoas sequer programaram em Java.&lt;br&gt;
Uma coisa que essas pessoas podem fazer é entender melhor o que é a Orientação a Objetos, que problemas ela resolve, tentar outra linguagem como C#, Ruby, ou qualquer outra que tenha esse paradigma, a pessoa entendendo o paradigma a linguagem vai ser o menor dos problemas.&lt;br&gt;
Um grande ponto é que não precisamos mais escrever Java como era escrito antigamente, temos frameworks que abstraem muitas coisas, como o Spring, com Spring conseguimos fazer um CRUD com poucas linhas de código, se usar Rest Repositories e JPA viish, em 10 minutos sai um CRUD, com tudo que é método e ainda implementando HATEOAS, paginação e tudo mais.&lt;/p&gt;

&lt;p&gt;A realidade é que as pessoas precisam perder o medo da linguagem e entender que ela é apenas uma ferramenta.&lt;/p&gt;
&lt;h2&gt;
  
  
  As melhorias
&lt;/h2&gt;

&lt;p&gt;A verbosidade da linguagem vem diminuindo com o tempo, por exemplo, no Java 17 (ultima LTS) temos os records, uma feature bem interessante para dados que são imutáveis, não precisamos criar aqueles famosos POJOS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desse modo temos um tipo de classe, mais compacto, com atributos imutáveis e métodos &lt;code&gt;get&lt;/code&gt; para eles.&lt;br&gt;
Agora também temos "switch expressions" que são blocos "switch" que podem também retornar algo, temos um modo melhor também para dar o "match" em um valor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em versões anteriores também temos o &lt;code&gt;for&lt;/code&gt; abstraindo iterators, temos a Stream API, conseguimos usar recursos de linguagens funcionais em Java também.&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
