<?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: itexto</title>
    <description>The latest articles on DEV Community by itexto (@itexto).</description>
    <link>https://dev.to/itexto</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%2Forganization%2Fprofile_image%2F1714%2Fb89dc918-b98e-4762-8524-4daeb3830360.png</url>
      <title>DEV Community: itexto</title>
      <link>https://dev.to/itexto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/itexto"/>
    <language>en</language>
    <item>
      <title>Dicas de Grails #2 - acessando o contexto do Spring</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 13:08:16 +0000</pubDate>
      <link>https://dev.to/itexto/dicas-de-grails-2-acessando-o-contexto-do-spring-d01</link>
      <guid>https://dev.to/itexto/dicas-de-grails-2-acessando-o-contexto-do-spring-d01</guid>
      <description>&lt;p&gt;Todo projeto Grails na realidade é uma aplicação Spring MVC (mais precisamente, &lt;a href="http://projects.spring.io/spring-boot"&gt;Spring Boot&lt;/a&gt; a partir do Grails 3.0). Há momentos nos quais é interessante obter acesso ao contexto do Spring (também conhecido como &lt;em&gt;Application Context&lt;/em&gt;) para poder obter os beans que compõem nossa aplicação.&lt;/p&gt;

&lt;p&gt;Mas quais seriam estes beans? Essencialmente seus controladores, classes de serviço, bibliotecas de tag ou mesmo aqueles que você possa vir a declarar no arquivo &lt;em&gt;grails-app/conf/spring/resources.groovy &lt;/em&gt;(isto fica para uma próxima dica).&lt;/p&gt;

&lt;p&gt;Em qualquer classe de domínio, controlador, serviço ou biblioteca de tags, para obter o contexto execute o código abaixo em seus métodos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;grailsApplication.mainContext
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sim, é só isto: o objeto &lt;em&gt;&lt;a href="http://docs.grails.org/latest/api/grails/core/GrailsApplication.html"&gt;grailsApplication&lt;/a&gt;&lt;/em&gt; é injetado em todos os artefatos acima mencionados e representa, como o próprio nome já diz, sua aplicação Grails em execução. A partir deste objeto é possível obter diversas informações sobre seu projeto, tais como a lista de classes de domínio, controladores, serviços, etc.&lt;/p&gt;

&lt;h3&gt;Aplicação rápida da dica&lt;/h3&gt;

&lt;p&gt;Um dos principais usos do contexto do Spring é validação de código de serviços através do Grails Console (o Grails também injeta um objeto grailsApplication nele!). O exemplo abaixo obtém um serviço e, na sequência, executa um método neste para validar seu funcionamento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def servicoArquivos = grailsApplication.mainContext.getBean(ServicoArquivos.class)
servicoArquivos.executeMetodo()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;Conhece o Grails Console?&lt;/h3&gt;

&lt;p&gt;Se não conhece o Grails Console, segue uma dica brinde: executando o comando "grails console" em seu projeto. Será iniciada uma aplicação desktop na qual você pode executar código Groovy que tem acesso a todas as suas classes de domínio, serviço, controladores, etc.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>grails</category>
      <category>sql</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Dicas de Grails #1 - como executar código SQL</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 13:04:12 +0000</pubDate>
      <link>https://dev.to/itexto/dicas-de-grails-1-como-executar-codigo-sql-56h8</link>
      <guid>https://dev.to/itexto/dicas-de-grails-1-como-executar-codigo-sql-56h8</guid>
      <description>&lt;p&gt;A partir de agora iremos publicar dicas rápidas de desenvolvimento aqui no site da itexto: então vamos estreiar com uma nova série, &lt;em&gt;Dicas de Grails&lt;/em&gt;, na qual iremos expor alguns usos pouco conhecidos do framework. E a dica de hoje é: &lt;em&gt;como executar código SQL de forma &lt;strong&gt;segura&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;Rápido background: conheça o Hibernate&lt;/h2&gt;

&lt;p&gt;Se você usa Grails sabe que por padrão o Hibernate é usado como mecanismo de persistência do framework através do GORM. Então, por que não tirar proveito disto? Uma dica que costumo passar a todos os nossos clientes e alunos é: &lt;strong&gt;se deseja dominar o GORM, estude o Hibernate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Este estudo nos possibilita ter um uso muito mais profundo e produtivo do GORM e, consequentemente, acaba evitando uma série de problemas que as pessoas enfrentam quando estão dando seus primeiros passos com o Grails. Quer ver um exemplo bacana? O acesso ao objeto &lt;em&gt;DataSource&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Há dois caminhos para se executar código SQL: um perigoso e outro correto.&lt;/p&gt;

&lt;h2&gt;Primeiro caminho: o perigoso&lt;/h2&gt;

&lt;p&gt;Simplesmente injete o &lt;em&gt;bean&lt;/em&gt; &lt;em&gt;DataSource&lt;/em&gt; em sua classe de domínio, controlador, serviço ou biblioteca de tags, tal como o exemplo abaixo:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;code&gt;class LogicaService {&lt;/code&gt;&lt;br&gt;
&lt;code&gt;   def dataSource&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;   def metodoDeNegocio() {&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;       def connection = dataSource.getConnection()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;     }&lt;/code&gt;&lt;br&gt;
&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;O objeto &lt;em&gt;dataSource&lt;/em&gt; é uma implementação interface &lt;a href="https://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html"&gt;javax.sql.DataSource&lt;/a&gt;. Ele foi &lt;em&gt;injetado&lt;/em&gt; pelo Spring como uma dependência ao seu objeto. Portanto você poderá usar aqui tanto a API JDBC padrão do Java ou, se preferir, o suporte do Groovy a&lt;a href="http://groovy-lang.org/databases.html"&gt; bancos de dados relacionais&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(Por trás dos panos quem domina o Grails é o Spring (seu projeto Grails é uma aplicação Spring MVC por baixo dos panos, sabia?). Sendo assim, o conhecimento deste framework lhe trará uma produtividade ordens de magnitude maior ao desenvolver com Grails!)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual o problema com esta abordagem?&lt;/strong&gt; Ao acessarmos o bean &lt;em&gt;dataSource &lt;/em&gt;diretamente não há garantia de que a conexão obtida esteja dentro do mesmo contexto transacional que o restante do seu código. E aí as coisas podem se complicar. Use este caminho apenas se tiver muita certeza do que está fazendo.&lt;/p&gt;

&lt;h2&gt;Segundo caminho: o seguro e correto&lt;/h2&gt;

&lt;p&gt;Lembra no início do post quando falei que o conhecimento do Hibernate é muito importante? Usando o método &lt;em&gt;withSession&lt;/em&gt;, injetado em todas as classes de domínio do Grails podemos ter acesso direto à sessão do Hibernate (&lt;a href="https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Session.html"&gt;JavaDoc&lt;/a&gt;). E na sessão há um método chamado &lt;em&gt;&lt;a href="https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Session.html#doWork-org.hibernate.jdbc.Work-"&gt;doWork&lt;/a&gt;&lt;/em&gt;, criado justamente para os casos nos quais precisamos executar código SQL nativo.&lt;/p&gt;

&lt;p&gt;Este método recebe como parâmetro um objeto que implemente a interface &lt;a href="https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/jdbc/Work.html"&gt;Work&lt;/a&gt; , que possuí um único método:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void execute(&lt;a title="class or interface in java.sql" href="http://download.oracle.com/javase/6/docs/api/java/sql/Connection.html?is-external=true"&gt;Connection&lt;/a&gt; connection)
      throws &lt;a title="class or interface in java.sql" href="http://download.oracle.com/javase/6/docs/api/java/sql/SQLException.html?is-external=true"&gt;SQLException&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como ficaria seu código então? Primeiro uma versão com a cara do Java:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ClasseDeDominio.withSession {session -&amp;gt; // olha a sessão do Hibernate aqui!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;  session.doWork(&lt;/code&gt;&lt;br&gt;
&lt;code&gt;        new org.hibernate.jdbc.Work() {&lt;/code&gt;&lt;br&gt;
&lt;code&gt;           public void execute(Connection connection) throws SQLException {&lt;/code&gt;&lt;br&gt;
&lt;code&gt;        // seu código SQL usando connection entra aqui&lt;/code&gt;&lt;br&gt;
&lt;code&gt;          }&lt;/code&gt;&lt;br&gt;
&lt;code&gt;      }&lt;/code&gt;&lt;br&gt;
&lt;code&gt;  }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ou, se preferir, pode simplesmente passar um objeto qualquer (ou mesmo um map) que contenha um método cuja assinatura seja equivalente à da interface Work ao método &lt;strong&gt;doWork&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;PS:&lt;/h4&gt;

&lt;p&gt;Aos interessados, estamos finalizando (finalmente) a preparação para nossas novas turmas de Groovy e Grails em nosso projeto Formação itexto. Inscreva-se &lt;a href="http://formacao.itexto.com.br"&gt;no site&lt;/a&gt; para saber mais novidades em breve!&lt;/p&gt;

</description>
      <category>grails</category>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Dicas de Spring #1 – simulando autenticação no Spring Security em testes automatizados</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:56:49 +0000</pubDate>
      <link>https://dev.to/itexto/dicas-de-spring-1-simulando-autenticacao-no-spring-security-em-testes-automatizados-24ib</link>
      <guid>https://dev.to/itexto/dicas-de-spring-1-simulando-autenticacao-no-spring-security-em-testes-automatizados-24ib</guid>
      <description>&lt;p&gt;Estamos iniciando nossa série "Dicas de Spring". Neste primeiro post vamos ver como proceder para simular uma autenticação na escrita dos seus testes unitários ou de integração.&lt;/p&gt;

&lt;p&gt;O primeiro passo é incluir a dependência &lt;em&gt;spring-security-test&lt;/em&gt; em seu projeto. Se estiver usando Maven, basta incluir este código em seu arquivo &lt;em&gt;pom.xml&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;spring-security-test&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;substitua pelo mesmo número da versão do seu Spring Security!&amp;lt;/version&amp;gt;
  &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
 &amp;lt;/dependency&amp;gt;&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Gradle? Igualmente fácil, inclua a dependência no seu arquivo &lt;em&gt;build.gradle&lt;/em&gt; tal como exposto a seguir:&lt;/p&gt;

&lt;pre&gt;testCompile "org.springframework.security:spring-security-test:[versão]"&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Muita atenção para o escopo da dependência (apenas teste) e o número da versão, que sempre deve ser o mesmo que o da sua instalação do Spring Security.&lt;/p&gt;

&lt;p&gt;Feito isto, simular um usuário autenticado é algo incrivelmente fácil: basta que você use a classe &lt;em&gt;&lt;a href="http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/test/context/TestSecurityContextHolder.html"&gt;TestSecurityContextHolder&lt;/a&gt;&lt;/em&gt; que vêm na dependência &lt;em&gt;spring-security-test&lt;/em&gt; (pacote &lt;em&gt;org.springframework.security.test.context&lt;/em&gt;), tal como no exemplo abaixo:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;pre&gt;TestSecurityContextHolder
     .getContext()
     .setAuthentication(new JwtUser(account, new ArrayList&amp;lt;GrantedAuthority&amp;gt;()));&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;A classe JwtUser é uma classe que inventamos e que implementa a interface &lt;a href="http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/core/Authentication.html"&gt;Authentication&lt;/a&gt; do Spring Security que recebe como parâmetro uma lista de permissões e o objeto que representa o usuário autenticado.&lt;/p&gt;

&lt;p&gt;E é simples assim. Não é muito difícil imaginar como podemos proceder para simular o mesmo efeito com Grails no plugin Spring Security Core, hein? Quem sabe não será nossa próxima &lt;em&gt;Dica de Grails&lt;/em&gt;?&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>ptbr</category>
      <category>spring</category>
    </item>
    <item>
      <title>Dicas de Java #1 - muito cuidado com SimpleDateFormat e seu aspecto "lenient"!</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:54:04 +0000</pubDate>
      <link>https://dev.to/itexto/dicas-de-java-1-muito-cuidado-com-simpledateformat-e-seu-aspecto-lenient-iai</link>
      <guid>https://dev.to/itexto/dicas-de-java-1-muito-cuidado-com-simpledateformat-e-seu-aspecto-lenient-iai</guid>
      <description>&lt;p&gt;Em Java (e Groovy) é muito comum validarmos uma data digitada usando a classe &lt;a href="http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html"&gt;SimpleDateFormat&lt;/a&gt; escrevendo código muito parecido com o exposto a seguir:&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="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;dataInvalida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"45/42/2017"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// mês 42???&amp;lt;/code&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;SimpleDateFormat&lt;/span&gt; &lt;span class="n"&gt;formatoData&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;SimpleDateFormat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dd/MM/yyyy"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;dataParseada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;formatoData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataInvalida&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// se parseou, data válida!&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ParseException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// data inválida! Não parseou&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por mais estranho que possa parecer, a data acima será considerada válida por SimpleDateFormat. Isto se deve ao aspecto "lenient" de sua implementação: um atributo do tipo boolean cujo valor default é true.&lt;/p&gt;

&lt;p&gt;Se está definido como verdadeiro, SimpleDateFormat irá executar eurísticas internas para descobrir qual a data a partir da loucura que você forneceu. No exemplo acima a data encontrada será 15/7/2020 (experimente com o código acima).&lt;/p&gt;

&lt;p&gt;Como resolver então? Simples: chamando o método setLenient e passando para este o valor false, tal como no exemplo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;String dataInvalida = "45/42/2017"; // mês 42???&lt;/code&gt;&lt;br&gt;
&lt;code&gt;SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");&lt;/code&gt;&lt;br&gt;
&lt;code&gt;formatoData.setLenient(false); // simples!&lt;/code&gt;&lt;br&gt;
&lt;code&gt;try {&lt;/code&gt;&lt;br&gt;
&lt;code&gt;   Date dataParseada = formatoData.parse(dataInvalida);&lt;/code&gt;&lt;br&gt;
&lt;code&gt;   // se parseou, data válida (de verdade)!&lt;/code&gt;&lt;br&gt;
&lt;code&gt;} catch (ParseException ex) {&lt;/code&gt;&lt;br&gt;
&lt;code&gt;   // data inválida! Não parseou. Bobagem enviada.&lt;/code&gt;&lt;br&gt;
&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Problema resolvido, e não, infelizmente você não descobriu um bug na classe SimpleDateFormat. :)&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>ptbr</category>
      <category>tutorial</category>
      <category>java</category>
    </item>
    <item>
      <title>Dicas de WordPress #1 – Melhorando a segurança</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:46:53 +0000</pubDate>
      <link>https://dev.to/itexto/dicas-de-wordpress-1-melhorando-a-seguranca-4l7m</link>
      <guid>https://dev.to/itexto/dicas-de-wordpress-1-melhorando-a-seguranca-4l7m</guid>
      <description>&lt;p&gt;Não uma, mas duas dicas rápidas que irão tornar mais segura a sua instalação do Wordpress.&lt;/p&gt;

&lt;h2&gt;Localização do arquivo wp-config.php&lt;/h2&gt;

&lt;p&gt;No arquivo wp-config.php ficam armazenadas as configurações essenciais do Wordpress, dentre as quais o modo como é realizada a conexão com o banco de dados. Por padrão este arquivo fica no diretório raiz da sua instalação do Wordpress, mas sabia que esta não é a única localização possível para este arquivo?&lt;/p&gt;

&lt;p&gt;Ele também pode ficar no diretório pai que contém a sua instalação do Wordpress. Sendo assim, se sua instalação fica em &lt;em&gt;/var/www/meu_site&lt;/em&gt;, você pode (e deve) armazena-lo em &lt;em&gt;/var/www&lt;/em&gt;, tornado com isto muito mais difícil a obtenção deste arquivo através de algum ataque realizado ao seu servidor.&lt;/p&gt;

&lt;p&gt;Por padrão o Wordpress sempre busca o arquivo primeiro no diretório de sua instalação e, não o encontrando, um diretório acima.&lt;/p&gt;

&lt;h2&gt;Prefixo no nome das tabelas&lt;/h2&gt;

&lt;p&gt;No momento em que o Wordpress é instalado, um dos campos a ser preenchido diz respeito ao prefixo a ser adotado no nome das tabelas.&lt;/p&gt;

&lt;p&gt;Muitos acham que a principal razão para este prefixo é diferenciar as tabelas em um banco de dados compartilhado. É: também é pra isto, mas a razão principal é &lt;strong&gt;segurança&lt;/strong&gt;. Se por algum acaso seu site vier a sofrer um ataque de &lt;a href="https://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_SQL"&gt;sql injection&lt;/a&gt;, o atacante irá ter uma maior dificuldade em descobrir o nome das suas tabelas (lembre que o esquema de tabelas do Wordpress é público e &lt;strong&gt;muito&lt;/strong&gt; difundido). Sendo assim, evite o prefixo padrão "wp_" sempre.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>braziliandevs</category>
      <category>ptbr</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Receita - expondo seu localhost ao mundo com Ngrok</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:39:07 +0000</pubDate>
      <link>https://dev.to/itexto/receita-expondo-seu-localhost-ao-mundo-com-ngrok-2mbg</link>
      <guid>https://dev.to/itexto/receita-expondo-seu-localhost-ao-mundo-com-ngrok-2mbg</guid>
      <description>&lt;p&gt;Em tempos de quarentena esta é uma receita bastante útil. Eis a situação: você desenvolve sua aplicação localmente e gostaria que outras pessoas a acessassem remotamente mas sem a necessidade de implantá-la em um servidor. Como fazer?&lt;/p&gt;

&lt;p&gt;Esta receita tem dois ingredientes: Linux e Ngrok, mas você pode substituir o primeiro por Windows ou MacOS se preferir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wrfKmC0F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads.metropoles.com/wp-content/uploads/2019/02/12115422/belagil2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wrfKmC0F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://uploads.metropoles.com/wp-content/uploads/2019/02/12115422/belagil2.jpg" alt="Bela Gil lança obra com receitas que levam raízes, folhas e sementes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;O que é o Ngrok?&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cOJ5QBbQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receita_ngrok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cOJ5QBbQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receita_ngrok.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trata-se de um serviço gratuito (há limitações, mas para uma demonstração ou implementação de uma integração dá bem pro gasto) que permite ao desenvolvedor abrir um túnel que exporá serviços executados localmente em sua máquina para o mundo. Seu uso é bastante simples.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inicie o serviço local em sua máquina.&lt;/li&gt;
&lt;li&gt;Execute o Ngrok para expor a porta do serviço ao mundo. Será gerada uma URL que você deverá compartilhar com quem deseja acessar seu serviço.&lt;/li&gt;
&lt;li&gt;Compartilhe a URL que será gerada para você.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Primeiro passo: instale em seu computador local&lt;/h2&gt;

&lt;p&gt;Acesse &lt;a href="https://ngrok.com"&gt;https://ngrok.com&lt;/a&gt; e crie uma conta no serviço. Opte pela opção gratuita e, na sequência, se autentique na plataforma. Baixe o cliente de acordo com seu sistema operacional (há versões pra Linux, Windows e MacOS).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mvoJiNai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mvoJiNai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O processo de instalação pode variar de acordo com seu sistema operacional. No caso do Linux é um arquivo zipado que você descompacta no diretório de sua preferência.&lt;/p&gt;

&lt;p&gt;Descompactado no diretório de sua preferência, execute o comando que irá aparecer, na página de download do cliente Ngrok, tal como na imagem a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kok-SK33--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kok-SK33--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Segundo passo: execute o Ngrok e compartilhe o acesso&lt;/h2&gt;

&lt;p&gt;O Ngrok pode apresentar ao mundo os protocolos HTTP, HTTPS e TCP executados em sua máquina. Em nossa receita iremos apresentar apenas o protocolo HTTP. Se sua aplicação estiver executando na porta 8080, basta executar o comando a seguir:&lt;/p&gt;

&lt;pre&gt;./ngrok http 8080&lt;/pre&gt;

&lt;p&gt;Você verá uma saída similar à apresentada à imagem a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--93JC8T2g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--93JC8T2g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tá vendo aquelas URLs de forwarding (notou que uma delas é inclusive HTTPS???)? Compartilhe com quem você quer que acesse seu serviço executado localmente e voilá: seu cliente pode ver o resultado em sua máquina sem a necessidade de um servidor.&lt;/p&gt;

&lt;p&gt;Experimente também aquele endereço apresentado como "Web Interface", pode ser uma mão na roda. &lt;/p&gt;

&lt;p&gt;Esta receita na versão gratuita do Ngrok manterá a URL gerada por até 8 horas, mas nas versões pagas do serviço este tempo pode ser esticado.&lt;/p&gt;

&lt;h2&gt;Modos de servir&lt;/h2&gt;

&lt;p&gt;Ngrok é muito útil não só quando você quer expor a alguém seu trabalho remotamente, mas também quando precisa implementar integrações. Já precisou, por exemplo, integrar com serviços como meios de pagamento que te mandam notificações por HTTP? Com Ngrok este trabalho fica muito mais fácil.&lt;/p&gt;

&lt;p&gt;Também é muito útil quando você precisa resolver um bug com seu cliente ou QA e quer reproduzir a situação localmente para resolver o problema.&lt;/p&gt;

&lt;h2&gt;As deliciosas receitas da itexto&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I6fwGPpQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receitas_itexto-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I6fwGPpQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receitas_itexto-1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recentemente começamos a divulgar nossas receitas ao grande público para compartilhar soluções rápidas para problemas comuns. Você pode aprender mais sobre nossa metodologia neste &lt;a href="https://www.itexto.com.br/site/receitas-da-itexto/"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Espero que esta lhes seja útil. Até a próxima!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>ptbr</category>
      <category>tutorial</category>
      <category>ngrok</category>
    </item>
    <item>
      <title>Receitas - Usando SonarQube em seu projeto Java (Maven) ou JavaScript</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:37:08 +0000</pubDate>
      <link>https://dev.to/itexto/receitas-usando-sonarqube-em-seu-projeto-java-maven-ou-javascript-pin</link>
      <guid>https://dev.to/itexto/receitas-usando-sonarqube-em-seu-projeto-java-maven-ou-javascript-pin</guid>
      <description>&lt;p&gt;Um hábito que recomendamos a todos os nossos clientes e adotamos em nosso dia a dia é a revisão de código. Esta prática sempre deve ser realizada por humanos, mas toda ajuda adicional é válida. E uma ferramenta que pode agregar bastante é o &lt;a href="https://www.sonarqube.org/"&gt;SonarQube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X4apx-WH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receita_sonarqube.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X4apx-WH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receita_sonarqube.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para quem não conhece, o SonarQube (também chamado de "Sonar" por muitos (eu, principalmente :) )) é uma poderosa ferramenta que realiza a análise estática de código fonte. Essencialmente o &lt;em&gt;Sonar&lt;/em&gt; possui uma base de dados contendo diversos padrões em muitas linguagens de programação que detectam erros comuns de programação e até mesmo algumas falhas de segurança.&lt;/p&gt;

&lt;p&gt;Mais que isto: &lt;em&gt;Sonar&lt;/em&gt; deve ser visto também como uma ferramenta pedagógica, que ensina diversas boas práticas à sua equipe. Um caso no qual &lt;em&gt;Sonar&lt;/em&gt; agrega bastante é justamente quando estamos aprendendo novas linguagens de programação.&lt;/p&gt;

&lt;p&gt;Infelizmente nem todos sabem como configurar seus projetos para serem analisados pelo &lt;em&gt;Sonar&lt;/em&gt;. Então segue aqui não uma, mas duas receitas para que você possa usar o &lt;em&gt;Sonar&lt;/em&gt; tanto no seu back quanto no seu front-end.&lt;/p&gt;

&lt;h2&gt;Ingrediente principal: o SonarQube&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a1vAcUMb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.sonarqube.org/assets/logo-31ad3115b1b4b120f3d1efd63e6b13ac9f1f89437f0cf6881cc4d8b5603a52b4.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a1vAcUMb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.sonarqube.org/assets/logo-31ad3115b1b4b120f3d1efd63e6b13ac9f1f89437f0cf6881cc4d8b5603a52b4.svg" alt="SonarQube"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É necessário que você tenha o &lt;em&gt;Sonar&lt;/em&gt; (versão 7.1 ou posterior) em execução em algum lugar para poder prosseguir com estas receitas. Neste post não iremos lhe ensinar a instalá-lo ou usá-lo, mas aqui segue não um, mas &lt;em&gt;dois&lt;/em&gt; caminhos possíveis para instalar o &lt;em&gt;Sonar&lt;/em&gt; caso não tenha um servidor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usando Docker&lt;/strong&gt; (o mais fácil) - siga este &lt;a href="https://hub.docker.com/_/sonarqube/"&gt;tutorial&lt;/a&gt; presente na imagem oficial do &lt;em&gt;Sonar&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modo tradicional&lt;/strong&gt; (um pouco mais trabalhoso, mas nem tanto) - siga o que está descrito na documentação oficial neste &lt;a href="https://docs.sonarqube.org/latest/setup/install-server/"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mas não termina aí, você também precisará das seguintes informações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um usuário no &lt;em&gt;Sonar&lt;/em&gt; que possa criar novos projetos (seu login e senha).&lt;/li&gt;
&lt;li&gt;A URL de acesso ao seu servidor Sonar&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Primeira receita - Java e Maven&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--blLTRnQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Maven_logo.svg/1280px-Maven_logo.svg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--blLTRnQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Maven_logo.svg/1280px-Maven_logo.svg.png" alt="Mastering Maven: Getting Started | Oracle Developers Blog"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste momento lhe ensinaremos a proceder com &lt;a href="https://maven.apache.org"&gt;Maven&lt;/a&gt; por ser a opção mais popular entre desenvolvedores Java, mas não tenha dúvidas de que lhe mostraremos como proceder também com Gradle, no futuro.&lt;/p&gt;

&lt;h3&gt;Configuração por projeto&lt;/h3&gt;

&lt;p&gt;A beleza do Maven está no fato de ser baseado no conceito de convenções sobre configurações, ou seja, um conjunto de convenções são seguidas para que você não precise ficar gerenciando arquivos enormes: só é preciso alterar o que deve ser customizado. No caso do &lt;em&gt;Sonar&lt;/em&gt; você só precisa incluir três linhas na tag &lt;em&gt;&amp;lt;properties&amp;gt;&lt;/em&gt; do seu arquivo &lt;em&gt;pom.xml&lt;/em&gt;. Quais são estas propriedades?&lt;/p&gt;

&lt;pre&gt;&amp;lt;properties&amp;gt;
   &amp;lt;!-- O endereço que leva à sua instalação do Sonar --&amp;gt;
   &amp;lt;sonar.host.url&amp;gt;http://localhost:9000&amp;lt;/sonar.host.url&amp;gt;
   &amp;lt;!-- O login do seu usuário --&amp;gt;
   &amp;lt;sonar.login&amp;gt;admin&amp;lt;/sonar.login&amp;gt;
   &amp;lt;!-- a senha de acesso deste usuário --&amp;gt;
   &amp;lt;sonar.password&amp;gt;suasenhasupersecreta&amp;lt;/sonar.password&amp;gt;
&amp;lt;/properties&amp;gt;&lt;/pre&gt;

&lt;p&gt;E como fazer daqui pra frente? Para que o &lt;em&gt;Sonar&lt;/em&gt; realize sua análise, é necessário existir código compilado. Sendo assim basta executar o comando abaixo:&lt;/p&gt;

&lt;pre&gt;mvn compile sonar:sonar&lt;/pre&gt;

&lt;p&gt;Feito isto será criado um novo projeto em seu servidor Sonar, tal como na imagem a seguir. Aí é só seguir suas recomendações de melhoria e ver se algum bug foi detectado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vAorjf2x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vAorjf2x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Configuração global&lt;/h3&gt;

&lt;p&gt;Sim, acredite: é só isto. Mas e se você não quiser ficar enviando sua senha por aí? E se tiver uma instalação do Sonar compartilhada por toda a sua equipe e quiser ter a configuração centralizada para que não precise ficar alterando seus projetos um a um? Tão fácil quanto! Basta alterar o arquivo &lt;em&gt;settings.xml&lt;/em&gt; que estará no diretório &lt;em&gt;conf&lt;/em&gt; da sua instalação do Maven. Vamos lá?&lt;/p&gt;

&lt;p&gt;Na tag &lt;em&gt;&amp;lt;pluginGroups&amp;gt;&lt;/em&gt; inclua o plugin do Sonar, tal como no exemplo a seguir:&lt;/p&gt;

&lt;pre&gt;&amp;lt;pluginGroups&amp;gt;
   &amp;lt;pluginGroup&amp;gt;org.sonarsource.scanner.maven&amp;lt;/pluginGroup&amp;gt;
&amp;lt;/pluginGroups&amp;gt;&lt;/pre&gt;

&lt;p&gt;E você também deverá criar um &lt;em&gt;profile&lt;/em&gt; padrão. Isto é fácil. Basta incluir texto similar ao apresentado a seguir na tag &lt;em&gt;&amp;lt;profiles&amp;gt;&lt;/em&gt; do seu arquivo &lt;em&gt;settings.xml&lt;/em&gt;.&lt;/p&gt;

&lt;pre&gt;&amp;lt;profiles&amp;gt;
  &amp;lt;profile&amp;gt;
    &amp;lt;id&amp;gt;sonar&amp;lt;/id&amp;gt;
    &amp;lt;activation&amp;gt;
       &amp;lt;activeByDefault&amp;gt;true&amp;lt;/activeByDefault&amp;gt;
    &amp;lt;/activation&amp;gt;
    &amp;lt;properties&amp;gt;
      &amp;lt;!-- as mesmas que você viu no pom.xml! --&amp;gt;
      &amp;lt;!-- O endereço que leva à sua instalação do Sonar --&amp;gt;
      &amp;lt;sonar.host.url&amp;gt;http://localhost:9000&amp;lt;/sonar.host.url&amp;gt;
      &amp;lt;!-- O login do seu usuário --&amp;gt;
      &amp;lt;sonar.login&amp;gt;admin&amp;lt;/sonar.login&amp;gt;
      &amp;lt;!-- a senha de acesso deste usuário --&amp;gt;
      &amp;lt;sonar.password&amp;gt;suasenha&amp;lt;/sonar.password&amp;gt;
    &amp;lt;/properties&amp;gt;
  &amp;lt;/profile&amp;gt;
&amp;lt;/profiles&amp;gt;&lt;/pre&gt;

&lt;h2&gt;Segunda receita - JavaScript&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gtvIvWN1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2017/08/logotipo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gtvIvWN1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2017/08/logotipo.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um ingrediente importante aqui será o &lt;strong&gt;NPM&lt;/strong&gt;. O primeiro passo consistirá em instalar o &lt;em&gt;sonar-scanner&lt;/em&gt;: este componente do &lt;em&gt;Sonar&lt;/em&gt; é o responsável por realizar a análise estática do código fonte. A instalação é simples:&lt;/p&gt;

&lt;pre&gt;npm install -g sonar-scanner&lt;/pre&gt;

&lt;p&gt;No diretório raiz que contenha o código fonte do seu projeto você deverá agora criar um arquivo chamado &lt;em&gt;sonar-project.properties&lt;/em&gt;. Em seu interior serão incluídas configurações no formato chave/valor tal como no exemplo a seguir:&lt;/p&gt;

&lt;pre&gt;# A identificação do projeto. Nome:versão
sonar.projectKey=nomeDoSeuProjeto:1.0.0
# O nome do projeto
sonar.projectName=Seu lindo projeto
# A partir de que diretório será lido o código fonte.
# Neste exemplo é a partir do mesmo diretório que
# o arquivo criado
sonar.sources=.
# Host do Sonar
sonar.host.url=http://localhost:9000
# Usuário - login
sonar.login=admin
# Senha de acesso
sonar.password=seuSegredoValioso!
# Qual diretório não deve estar na análise.
# Quer ver algo demorar? Inclua a pasta node_modules
# pra ser analisada também. :)
sonar.exclusions=&lt;strong&gt;/node_modules/&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Notou que as mesmas propriedades que usamos no exemplo com Java se repetem aqui? Sim, elas são padronizadas, mas há algumas novas aqui. Preste atenção nos comentários que foram incluídos no exemplo acima.&lt;/p&gt;

&lt;p&gt;Com o arquivo gerado e o &lt;em&gt;sonar-scanner&lt;/em&gt; instalado, como você analisa seu projeto? Simples! Executando o coamando abaixo no mesmo diretório em que o arquivo &lt;em&gt;sonar-project.properties&lt;/em&gt; se encontra.&lt;/p&gt;

&lt;pre&gt;sonar-scanner&lt;/pre&gt;

&lt;h2&gt;Incrementando as receitas&lt;/h2&gt;

&lt;p&gt;Você deve ter notado que algumas das chaves de configuração foram usadas tanto no Maven quanto no JavaScript, certo? É por que são padronizadas. Caso queira ver a lista completa de configurações possíveis, acesse este &lt;a href="https://docs.sonarqube.org/latest/analysis/analysis-parameters/"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Naturalmente há outras maneiras de se obter os mesmos resultados, porém o objetivo destas receitas é apenas lhe mostrar um caminho rápido possível pra poder dar seus primeiros passos. Quer incrementar estas receitas? Nos conte suas experiências!&lt;/p&gt;

&lt;h2&gt;As Deliciosas Receitas da itexto&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IcVuARKG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receitas_itexto_block.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IcVuARKG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receitas_itexto_block.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resolvemos recentemente abrir nosso livro de receitas que contém soluções rápidas para os principais problemas enfrentados por profissionais de desenvolvimento de software. Há uma metodologia na criação deste livro de receitas, e você pode aprender a escrever o seu conosco lendo este &lt;a href="https://www.itexto.com.br/site/receitas-da-itexto/"&gt;post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Esperamos que estas duas receitas rápidas lhe ajudem no dia a dia. Pode aguardar que mais receitas já estão a caminho, até lá!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>ptbr</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Receita: usar o AWS S3 localmente para desenvolvimento</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:35:16 +0000</pubDate>
      <link>https://dev.to/itexto/receita-usar-o-aws-s3-localmente-para-desenvolvimento-568b</link>
      <guid>https://dev.to/itexto/receita-usar-o-aws-s3-localmente-para-desenvolvimento-568b</guid>
      <description>&lt;p&gt;O serviço &lt;a href="https://aws.amazon.com/s3" rel="noopener noreferrer"&gt;S3&lt;/a&gt; da AWS é uma das melhores, mais baratas e mais populares soluções para armazenamento de arquivos na nuvem. Mas e se em desenvolvimento você precisar trabalhar offline ou, melhor ainda, quiser reduzir o seu custo mensal com a AWS enquanto estiver programando? Esta receita resolve estes problemas.&lt;/p&gt;

&lt;h2&gt;Ingredientes desta receita&lt;/h2&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%2Fwww.kenresearch.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F01%2FPhilippines-Food-Ingredients-Market-Research-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.kenresearch.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F01%2FPhilippines-Food-Ingredients-Market-Research-1.jpg" alt="Food Anti-Oxidants Market Philippines, Philippines Sweeteners ..."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;S3 Ninja - estamos usando aqui seu último release que é o 6.4&lt;/li&gt;
&lt;li&gt;Java - mas pode ser substituído pela linguagem de sua preferência&lt;/li&gt;
&lt;li&gt;SDK da AWS para o Java - usamos a versão 2.11.2 - mas você pode fazer adaptações fáceis para seu ambiente caso não seja o Java&lt;/li&gt;
&lt;li&gt;Linux - mas pode ser substituído por Windows ou MacOS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Ingrediente principal: S3 Ninja&lt;/h2&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%2Fs3ninja.net%2Fassets%2Fimages%2Fninja.jpg" 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%2Fs3ninja.net%2Fassets%2Fimages%2Fninja.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://s3ninja.net/" rel="noopener noreferrer"&gt;S3 Ninja&lt;/a&gt; implementa as APIs de manutenção de &lt;strong&gt;objetos&lt;/strong&gt; ("arquivos") providas pelo S3, sendo assim você conseguirá facilmente simular nele operações de obtenção, escrita e remoção de objetos. &lt;/p&gt;

&lt;p&gt;Atenção: observe que &lt;strong&gt;não há aqui suporte para a manutenção de buckets&lt;/strong&gt;. Para que seu ambiente de desenvolvimento esteja completo será necessário que estes buckets já existam no S3 Ninja. Há duas maneiras de se fazer isto: a primeira é usando a interface web que a ferramenta promove, manualmente, por tanto.&lt;/p&gt;

&lt;p&gt;A segunda forma é usando Docker, que é bem melhor e já automatiza esta tarefa pra você, evitando com isto o trabalho manual. Vou te ensinar como fazer isto, é bem simples.&lt;/p&gt;

&lt;h3&gt;Não envenene seus convidados&lt;/h3&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%2Ffleurmach.files.wordpress.com%2F2013%2F03%2For-cyanide.jpg" 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%2Ffleurmach.files.wordpress.com%2F2013%2F03%2For-cyanide.jpg" alt="horror | fleurmach | Page 5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apesar do S3 Ninja funcionar tal como quem emula ele não passa de um mock, e um mock &lt;strong&gt;muito limitado&lt;/strong&gt;. Você só consegue interagir com objetos aqui. &lt;/p&gt;

&lt;p&gt;S3 Ninja não é escalável, não não é seguro, não é robusto. É apenas o que se propõe ser: um &lt;strong&gt;mock&lt;/strong&gt; para que você consiga &lt;strong&gt;simular&lt;/strong&gt; o S3 no seu ambiente de desenvolvimento ou testes automatizados. &lt;strong&gt;Não use em produção e não conte com ele como um componente de alta qualidade.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;Primeiro passo: instalando o S3 Ninja&lt;/h2&gt;

&lt;p&gt;Eis algo que era muito mais fácil de ser feito no passado, então preste muita atenção a este ponto. &lt;/p&gt;

&lt;p&gt;A instalação do S3 Ninja hoje se dá a partir do Docker. Se você clicar no link "&lt;a href="https://hub.docker.com/r/scireum/s3-ninja/" rel="noopener noreferrer"&gt;Download&lt;/a&gt;" do &lt;a href="https://s3ninja.net" rel="noopener noreferrer"&gt;site oficial&lt;/a&gt; do projeto, será inclusive direcionado para o &lt;a href="https://hub.docker.com/r/scireum/s3-ninja/" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Infelizmente se você tentar executar a imagem provida no link de download acima mencionado talvez não consiga, tal como pode ser visto no print a seguir:&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%2Fwww.itexto.com.br%2Fsite%2Fwp-content%2Fuploads%2F2020%2F04%2Fimage-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.itexto.com.br%2Fsite%2Fwp-content%2Fuploads%2F2020%2F04%2Fimage-4.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por quê? Por quê?? Por quê??? Simples: por que no momento da escrita desta receita não existia uma imagem com a versão "latest". Durante a escrita deste post a última &lt;a href="https://hub.docker.com/r/scireum/s3-ninja/tags" rel="noopener noreferrer"&gt;versão era a 6.4&lt;/a&gt;. Sendo assim, se você executasse o comando abaixo, funcionaria.&lt;/p&gt;

&lt;pre&gt;docker pull scireum/s3-ninja:6.4&lt;/pre&gt;

&lt;p&gt;Mas não basta isto: você também irá querer iniciar o S3 Ninja com todos os buckets já criados, certo? Infelizmente na documentação você não encontrará nada lhe ensinando a fazer isto. Então resolvi te poupar tempo aqui. Segue um arquivo &lt;em&gt;Dockerfile&lt;/em&gt; customizado. Modifique as instruções "mkdir" para criar todos os buckets que você precisa.&lt;/p&gt;

&lt;pre&gt;FROM scireum/s3-ninja:6.4
USER sirius

# Inclua todos os buckets que precisa no comando a seguir

CMD mkdir -p /home/sirius/data/seu_primeiro_bucket &amp;amp;&amp;amp; \
    mkdir -p /home/sirius/data/seu_segundo_bucket &amp;amp;&amp;amp; \
    /home/sirius/run.sh

# O terceiro ponto irá iniciar o processo do S3 Ninja&lt;/pre&gt;



&lt;p&gt;Caso não saiba o que fazer com este arquivo &lt;em&gt;Dockerfile&lt;/em&gt;, crie um arquivo com este nome em um diretório qualquer em seu computador e, neste diretório, execute o seguinte comando:&lt;/p&gt;



&lt;pre&gt;docker build --tag=s3ninja-itexto:latest .&lt;/pre&gt;



&lt;p&gt;Isto irá criar uma imagem chamada &lt;em&gt;s3ninja-itexto.&lt;/em&gt; O próximo passo consiste em executar seu container. Caso não saiba como fazê-lo, segue um exemplo:&lt;/p&gt;



&lt;pre&gt;docker run -p 9444:9000 s3ninja-itexto:latest&lt;/pre&gt;



&lt;p&gt;Voilá: note que estamos direcionando a saída da porta 9000 (do container) para a 9444 do host. Para testar sua instalação abra seu browser e acesse este endereço: &lt;a href="http://localhost:9444/ui" rel="noopener noreferrer"&gt;http://localhost:9444/ui&lt;/a&gt; . Você verá uma página similar à exposta a seguir:&lt;/p&gt;



&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.itexto.com.br%2Fsite%2Fwp-content%2Fuploads%2F2020%2F04%2Fimage-5.png" alt=""&gt;



&lt;p&gt;Observe que o Access Key e Secret Key são criados por padrão e apresentados no painel esquerdo desta interface. &lt;strong&gt;Guarde esta informação&lt;/strong&gt;.&lt;/p&gt;



&lt;p&gt;Por esta interface você pode criar novos buckets, incluir arquivos em seu interior e verificar quais endpoints da API do S3 estão implementados no S3 Ninja. Pode ser muito útil!&lt;/p&gt;



&lt;p&gt;Quer os arquivos de referência? Criei um repositório no Github contendo inclusive um arquivo do Docker Compose pra você. Basta clicar &lt;a href="https://github.com/loboweissmann/receita-s3ninja" rel="noopener noreferrer"&gt;neste link&lt;/a&gt;.&lt;/p&gt;



&lt;h2&gt;Aplicando em seu código fonte&lt;/h2&gt;



&lt;h3&gt;Aplicável a qualquer ambiente de desenvolvimento&lt;/h3&gt;



&lt;p&gt;Você precisará de três informações apenas:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Access Key e Secret Key&lt;/strong&gt; - você o obtém na página pública do S3 Ninja - &lt;a href="http://localhost:9444/ui" rel="noopener noreferrer"&gt;http://localhost:9444/ui&lt;/a&gt; . Boa notícia: estas informações não mudam, então você pode aplicá-las em sua configuração de dev/teste. (não falei que não era seguro o S3 Ninja???)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint de requisições&lt;/strong&gt; - a AWS fornece endpoints padrão de requisições para o S3, mas também a possibilidade de você poder usar endpoints alternativos justamente pra situações muito específicas como esta. O endpoint do S3 Ninja contra o qual todas as requisições deverão ser feitas é o &lt;a href="http://localhost:9444/s3" rel="noopener noreferrer"&gt;http://localhost:9444/s3&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;O S3 Ninja vai ignorar qualquer região da AWS e também não vai aplicar ACLs tal como o serviço original, leve isto em consideração. Consulte sua ferramenta de desenvolvimento para que possa realizar esta integração.&lt;/p&gt;



&lt;h3&gt;Exemplo em Java&lt;/h3&gt;



&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fbeta.itexto.com.br%2Fwp-content%2Fuploads%2F2015%2F03%2Fjava_logo-300x2381-1.png" alt=""&gt;



&lt;p&gt;Se você não programa em Java, &lt;strong&gt;leia mesmo assim&lt;/strong&gt; pois há um detalhe importante ali.&lt;/p&gt;



&lt;p&gt;Tudo o que você precisará fazer é customizar o cliente S3 provido pelo SDK provido pela AWS. Em nosso exemplo iremos usar a versão 2.11.2 desta biblioteca. Leve em consideração que esperamos que você já saiba usar esta biblioteca. Vamos expor aqui apenas como usar junto com o S3 Ninja.&lt;/p&gt;



&lt;p&gt;Veja o exemplo a seguir escrito em Java no qual instanciamos o cliente S3 usando o SDK da AWS.&lt;/p&gt;



&lt;pre&gt;import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.S3Configuration;


// observe o exemplo com atenção. Se houver a configuração
// do endpoint, é por que estamos usando o S3 Ninja
// claro: pode haver variações, isto é apenas
// um exemplo!

public S3Client getS3Client() {
  String url = "http://localhost:9444/s3");
  S3Client result = S3Client.builder()
               .region(qualquerUma)
               .credentialsProvider(oQueSeAplica)
                // A mágica acontece aqui
               .endpointOverride(URI.create(endpoint))
            // O detalhe da maldade
             serviceConfiguration(
              S3Configuration.builder()
               .chunkedEncodingEnabled(false).build()
               )
               .build();
  return result;
}

&lt;/pre&gt;

&lt;p&gt;O primeiro detalhe é o uso do endpoint customizado. &lt;strong&gt;A maldade está no detalhe:&lt;/strong&gt; a opção "Chunked Encoding". Fizemos isto por que em versões mais antigas do S3 Ninja esta funcionalidade não estava implementada. Sua função consiste em validar o conteúdo recebido pelo S3. &lt;/p&gt;

&lt;h2&gt;As Deliciosas Receitas da itexto&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fbeta.itexto.com.br%2Fwp-content%2Fuploads%2F2020%2F04%2Freceitas_itexto_block.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/http%3A%2F%2Fbeta.itexto.com.br%2Fwp-content%2Fuploads%2F2020%2F04%2Freceitas_itexto_block.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta é mais uma receita do nosso livro que estamos tornando pública. O objetivo é te dar um pontapé inicial para resolver problemas comuns em seu dia a dia no desenvolvimento de software. Claro que há outras alternativas e modos de se resolver o mesmo problema (até melhores!). Caso tenha alguma sugestão, por favor, compartilhe conosco!&lt;/p&gt;

&lt;p&gt;Quer escrever seu próprio livro de receitas? Mostramos para você como criamos o nosso e lhe trazemos diversas dicas neste post para te ajudar neste processo. Leia mais &lt;a href="https://www.itexto.com.br/site/receitas-da-itexto/" rel="noopener noreferrer"&gt;clicando aqui&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Tomara que esta receita torne seu dia a dia um pouco melhor. Até a próxima!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>aws</category>
      <category>braziliandevs</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Receitas - comandos úteis de rede para devs!</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:32:36 +0000</pubDate>
      <link>https://dev.to/itexto/receitas-comandos-uteis-de-rede-para-devs-4gpc</link>
      <guid>https://dev.to/itexto/receitas-comandos-uteis-de-rede-para-devs-4gpc</guid>
      <description>&lt;p&gt;Se você escreve aplicações web ou precisa interagir com serviços remotos com certeza já passou por alguns dos problemas que vamos mostrar a solução aqui. Usaremos apenas duas ferramentas: os comandos telnet e netstat.&lt;/p&gt;

&lt;p&gt;E não daremos apenas uma receita, mas algumas!&lt;/p&gt;

&lt;h2&gt;Ingredientes&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hQSkbYmy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/ingredientes.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hQSkbYmy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/ingredientes.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sistema operacional - usaremos o Linux como exemplo, mas pode substituir por Windows ou MacOS&lt;/li&gt;
&lt;li&gt;netstat - nosso canivente suisso, disponível também pra Windows e MacOS&lt;/li&gt;
&lt;li&gt;telnet - cujo uso nós vamos subverter aqui. Se estiver usando Windows, uma implementação muito fácil de ser usada é o &lt;a href="https://www.putty.org/"&gt;putty&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você usa Linux é quase certo que o comando telnet já está instalado, assim como o netstat. Caso não esteja, consulte a documentação da sua distribuição para aprender como proceder.&lt;/p&gt;

&lt;p&gt;No caso do MacOS o netstat já vêm como padrão, mas não o telnet. Aprenda a instalá-lo neste &lt;a href="https://osxdaily.com/2018/07/18/get-telnet-macos/"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Usaremos o Linux como base e em algumas receitas usamos o comando | (pipe) usado para direcionar a saída de um comando para que seja a entrada de outro. Se não conhece este recurso, leia &lt;a href="https://www.guiafoca.org/cgs/guia/iniciante/ch-redir.html"&gt;este texto&lt;/a&gt; (seção 12.5) antes.&lt;/p&gt;

&lt;h2&gt;As receitas do dia&lt;/h2&gt;

&lt;h3&gt;Use o telnet para verificar se um serviço de rede é acessível a partir da sua máquina&lt;/h3&gt;

&lt;p&gt;O telnet é um protocolo de rede que te permite se conectar a outros serviços usando o modo texto no formato pergunta/resposta. Essencialmente você envia comandos, a outra ponta os recebe e te responde na sequência. Como boa parte dos protocolos da internet estão neste formato, você pode usá-lo para interagir com boa parte destes serviços. &lt;/p&gt;

&lt;p&gt;Mas você também pode subverter seu uso se quiser apenas verificar se um serviço está online. Imagine que você queira verificar se sua máquina é capaz de acessar um servidor MySQL, por exemplo, cuja porta de comunicação é a 3306 e nesta máquina local &lt;strong&gt;não exista um cliente MySQL&lt;/strong&gt;. Como você faz? Simples: use o modo "raw" do telnet com a sintaxe abaixo:&lt;/p&gt;

&lt;pre&gt;telnet [endereço/IP] [porta]&lt;/pre&gt;

&lt;p&gt;Vamos a um exemplo: quero ver se o MySQL está executando em minha máquina. Executo então o comando "telnet localhost 3306". Olha o resultado no meu console:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t6ike6N0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t6ike6N0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-6.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O MySQL usa um protocolo binário, por isto esta resposta com caracteres estranhos. Se você ver esta resposta é sinal de que o serviço &lt;strong&gt;é acessível.&lt;/strong&gt; Se eu quiser acessar um serviço que não está acessível, veja como seria a saída: no caso, supondo que a porta 1234 estivesse aberta no Google.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ktKaKxiI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ktKaKxiI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-7.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E você nunca terá uma resposta pois nada está escutando nesta porta (1234) no endereço google.com. Digite Ctrl-C para terminar a conexão. Você também pode obter uma resposta similar à exposta a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rFEdyg0m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rFEdyg0m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-8.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Verificar quais as portas ativas no seu computador com netstat&lt;/h3&gt;

&lt;p&gt;Já tentou subir um servidor na sua máquina e topou com mensagens de erro dizendo que a porta já está em uso? Esta receita com netstat te mostra como. Basta executar um comando:&lt;/p&gt;

&lt;pre&gt;netstat -tnlp&lt;/pre&gt;

&lt;p&gt;Você terá uma saída similar a esta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MB4Il6KP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-9-1024x282.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MB4Il6KP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-9-1024x282.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Descobrir qual processo está usando uma porta com netstat&lt;/h3&gt;

&lt;p&gt;E agora vamos resolver aquele problema do "não foi possível iniciar seu servidor por que a porta está em uso"? Precisamos saber qual o processo. Imagine que nosso desejo seja saber que processo está usando a porta 8080. Como fazer isto?&lt;/p&gt;

&lt;pre&gt;netstat -tulpn | grep 8080&lt;/pre&gt;

&lt;p&gt;Ali ela ó!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xFE1nIoR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xFE1nIoR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-11.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao final da linha você vê o código do processo e qual programa está executando a porta. &lt;/p&gt;

&lt;p&gt;O que quer dizer este "-tunlp"?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;t - lista apenas as conexões TCP&lt;/li&gt;
&lt;li&gt;n - mostra os endereços no formato numérico&lt;/li&gt;
&lt;li&gt;l - lista apenas os sockets que estão esperando conexões&lt;/li&gt;
&lt;li&gt;p - expõe o nome do processo e seu identificador &lt;/li&gt;
&lt;li&gt;u - expõe as conexões UDP caso deseje também&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Como saber quantas conexões estão ativas em uma porta com netstat&lt;/h2&gt;

&lt;p&gt;A receita final: você quer saber quantas conexões estão ocorrendo contra uma porta em seu servidor. Vamos ao comando mágico usando como exemplo a porta 443?&lt;/p&gt;

&lt;pre&gt;netstat -anp | grep :443 | wc -l&lt;/pre&gt;

&lt;p&gt;O parâmetro -a representa conexões ativas. Na sequência filtramos todas as conexões na porta 443 e, finalmente, o filtro final, usando o comando "wc -l" do Linux, que nos retorna o número de linhas da saída.&lt;/p&gt;

&lt;p&gt;Quer ver um exemplo?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6QkyEGDX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6QkyEGDX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-12.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ali: 33 conexões ativas usando a porta 443 deste servidor. Esta receita é muito útil quando você precisa, por exemplo, verificar se há conexões com o banco de dados, se estão acessando seu site, etc.&lt;/p&gt;

&lt;h2&gt;As deliciosas receitas da itexto&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YcynbLHj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receitas-rede.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YcynbLHj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://beta.itexto.com.br/wp-content/uploads/2020/04/receitas-rede.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estas receitas tem como objetivo te dar um pontapé inicial para que possa resolver rapidamente seus problemas mais comuns. Naturalmente há muitas outras soluções para estes mesmos problemas e estas não são as melhores soluções. Tem sugestões? Mande pra nós!&lt;/p&gt;

&lt;p&gt;Esta receita faz parte do Livro de Receitas da itexto que abrimos recentemente para todos. Toda semana publicamos ao menos duas de nossas receitas aqui. Acreditamos que o Livro de Receitas seja uma importante ferramenta para aumentar a produtividade da sua equipe. Quer aprender a escrever o seu? Te contamos como fazer neste post, &lt;a href="https://www.itexto.com.br/site/receitas-da-itexto/"&gt;clique aqui&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Até as próximas receitas!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>web</category>
    </item>
    <item>
      <title>Testes integrados com Arquillian e Java</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:21:53 +0000</pubDate>
      <link>https://dev.to/itexto/testes-integrados-com-arquillian-e-java-54p5</link>
      <guid>https://dev.to/itexto/testes-integrados-com-arquillian-e-java-54p5</guid>
      <description>&lt;h2&gt;As Ferramentas da itexto&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FJHtrs3O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/ferramental.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FJHtrs3O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/ferramental.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este post inicia uma nova série de posts aqui em nosso blog: "As Ferramentas da itexto", na qual iremos esporadicamente apresentar aqui ferramentas que podem fazer &lt;strong&gt;toda&lt;/strong&gt; a diferença no dia a dia do desenvolvedor e que muitas vezes são ignoradas pelo público. &lt;/p&gt;

&lt;p&gt;Todas as ferramentas aqui listadas são usadas em nosso dia a dia: sendo assim podemos contar a vocês as principais vantagens e, principalmente, desvantagens de cada uma delas.&lt;/p&gt;

&lt;p&gt;Naturalmente estes posts irão gerar mais &lt;a href="https://www.itexto.com.br/site/receitas-da-itexto/"&gt;receitas&lt;/a&gt; para que vocês possam tirar máximo proveito das mesmas. Sendo assim vamos lá!&lt;/p&gt;

&lt;h2&gt;O problema: testar aplicações Java EE ou Servlet based - especialmente projetos pré-existentes&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--spjCHvw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/javaee.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--spjCHvw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/javaee.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você desenvolve aplicações Java que são &lt;strong&gt;implantadas em servidores de aplicação ou servlet containers&lt;/strong&gt; você tem um problema: como realizar seus testes de integração de uma forma que seja o mais próxima possível do ambiente no qual seu projeto será executado?&lt;/p&gt;

&lt;p&gt;A solução mais comum consiste na implementação de mocks ou tirando máximo proveito das ferramentas oferecidas pelo seu framework (o Spring, por exemplo, oferece um suporte a testes que é &lt;strong&gt;muito &lt;/strong&gt;rico). Outra alternativa interessante é o uso de bibliotecas como &lt;a href="https://site.mockito.org/"&gt;Mockito&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;O problema das duas soluções é que elas se &lt;strong&gt;aproximam&lt;/strong&gt; do ambiente no qual a aplicação será executada, &lt;strong&gt;mas não são este ambiente&lt;/strong&gt;. Não raro em diversas aplicações o servidor de aplicações contém uma série de configurações que influenciam na execução do projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Datasources configurados por JNDI.&lt;/li&gt;
&lt;li&gt;Filas JMS.&lt;/li&gt;
&lt;li&gt;Bibliotecas compartilhadas.&lt;/li&gt;
&lt;li&gt;A configuração dos próprios.&lt;/li&gt;
&lt;li&gt;Mecanismos de autenticação configurados por JAAS.&lt;/li&gt;
&lt;li&gt;Configuração de clusters&lt;/li&gt;
&lt;li&gt;E todos os recursos que seu servidor de aplicações pode oferecer.&lt;/li&gt;
&lt;li&gt;Bundles no caso de containers OSGi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pra complicar um pouco mais a vida, talvez você tenha um produto que precise ser implantado em diferentes servidores de aplicação e containers e precise validar todas estas variações. Mocks ajudam, mas não testam a coisa em si ainda. Aliás, olha que interessante o que tá escrito no &lt;a href="http://arquillian.org"&gt;site oficial&lt;/a&gt; do Arquillian:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SkYB9Jmy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SkYB9Jmy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/image.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Projetos legados&lt;/h3&gt;

&lt;p&gt;Talvez você tenha pego um projeto pré-existente para evoluir. Não são raros os casos nos quais a execução encontra-se intrinsecamente dependente do servidor de aplicações nos quais o projeto é executado. Pra estes casos Arquillian é uma solução &lt;strong&gt;bem&lt;/strong&gt; interessante a ser levada em consideração.&lt;/p&gt;

&lt;h2&gt;O Arquillian&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g-as1qpK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://arquillian.org/images/arquillian_logo_200px.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g-as1qpK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://arquillian.org/images/arquillian_logo_200px.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma solução para os problemas que mencionei acima é o Arquillian: um projeto inicialmente desenvolvido pela JBoss (agora Red Hat). No &lt;a href="http://arquillian.org"&gt;site do projeto&lt;/a&gt; deixam bem claro seu objetivo: &lt;strong&gt;escrever testes integrados&lt;/strong&gt;. E é exatamente isto que ele consegue fazer.&lt;/p&gt;

&lt;p&gt;No caso do Arquillian os testes integrados necessariamente envolvem o carregamento do servidor de aplicações (daqui pra frente quando usar o termo &lt;em&gt;servidor de aplicações&lt;/em&gt; entenda que ele embarca também &lt;em&gt;servlet containers&lt;/em&gt;). Ele automatiza a execução dos seus testes usando &lt;strong&gt;toda&lt;/strong&gt; (ou quase) a infraestrutura do servidor que executará seu projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os mesmos datasources.&lt;/li&gt;
&lt;li&gt;As filas pré-configuradas.&lt;/li&gt;
&lt;li&gt;Usará as mesmas bibliotecas compartilhadas.&lt;/li&gt;
&lt;li&gt;Se quiser, pode executar inclusive a mesma versão da JVM.&lt;/li&gt;
&lt;li&gt;Enfim: &lt;strong&gt;o mesmo ambiente&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Arquillian cuidará das seguintes ações para você:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inicialização e finalização do servidor de aplicações.&lt;/li&gt;
&lt;li&gt;Inicialização dos frameworks necessários.&lt;/li&gt;
&lt;li&gt;Enriquecer os testes permitindo a injeção de beans nos mesmos.&lt;/li&gt;
&lt;li&gt;Execução do seu código como cliente (excelente pra testar endpoints JAX-RS, por exemplo)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sua execução é bastante simples e pode ser resumida nos passos a seguir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inicie o container.&lt;/li&gt;
&lt;li&gt;Empacote o código que será testado e, na sequência, implante-o no container.&lt;/li&gt;
&lt;li&gt;Injete o que for necessário nos testes (os beans) e execute-os.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pra melhor entender o Arquillian você precisa de alguns conceitos.&lt;/p&gt;

&lt;h2&gt;Conceitos essenciais&lt;/h2&gt;

&lt;p&gt;O conceito fundamental do Arquillian é que você escreva seus testes contra o ambiente no qual a aplicação é executada, ou seja, com a aplicação já implantada no container.&lt;/p&gt;

&lt;p&gt;Sendo assim o que o Arquillian faz essencialmente é empacotar nosso projeto, implantá-lo neste servidor e, na sequência, executar nossos testes contra este ambiente.&lt;/p&gt;

&lt;h3&gt;ShrinkWrap&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JpoWlXMZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.pexels.com/photos/3927238/pexels-photo-3927238.jpeg%3Fauto%3Dcompress%26cs%3Dtinysrgb%26h%3D750%26w%3D1260" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JpoWlXMZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.pexels.com/photos/3927238/pexels-photo-3927238.jpeg%3Fauto%3Dcompress%26cs%3Dtinysrgb%26h%3D750%26w%3D1260" alt="apresentar, arca, arco"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este é o processo de empacotamento do nosso código. Um dos componentes do Arquillian é o ShrinkWrap, que é o módulo responsável por gerar o pacote que contém o código a ser verificado e o implanta no servidor. Todos os formatos padrão do Java EE são suportados: WAR, EAR e JAR.&lt;/p&gt;

&lt;p&gt;O ShrinkWrap é &lt;strong&gt;muito rápido&lt;/strong&gt;: a velocidade na geração deste pacote chega a ser surpreendente. Em nossos testes com sistemas legados costumamos gerar o pacote completo (todas as libs, classes, recursos) para os testes integrados e este processo não costuma levar mais que alguns (realmente alguns) segundos.&lt;/p&gt;

&lt;p&gt;No entanto ele não é feito para que você crie um pacote completo, mas sim um que contenha apenas o que realmente é necessário para a execução dos seus testes. É possível gerar um pacote JAR, por exemplo, contendo um único bean (um único arquivo).&lt;/p&gt;

&lt;h3&gt;Container&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--InocOQiM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/container.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--InocOQiM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/container.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consiste no servidor de aplicações ou Servlet Container responsável por executar nossa aplicação. Por padrão o Arquillian não virá com um container pré-definido (ele não tem). Você terá de incluir o container necessário como uma dependência de testes em seu projeto. &lt;/p&gt;

&lt;p&gt;Esta "dependência" tem um nome: "&lt;a href="http://arquillian.org/modules/"&gt;container adapter&lt;/a&gt;". Você pode ver a lista completa de adaptadores neste &lt;a href="http://arquillian.org/modules/"&gt;link&lt;/a&gt;: mas já adiantando, há adaptadores para o Tomcat, Jetty, Websphere, Wildfly, Weblogic, JBoss, Glassfish e mais alguns outros.&lt;/p&gt;

&lt;p&gt;O container no Arquillian se divide em três categorias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embarcado.&lt;/li&gt;
&lt;li&gt;Gerenciado (managed).&lt;/li&gt;
&lt;li&gt;Remoto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando embarcado, o container será iniciado na mesma JVM que nossos testes. É o ideal para ambientes de integração contínua.&lt;/p&gt;

&lt;p&gt;O gerenciado requer que a distribuição do container esteja no mesmo computador que o nosso código fonte. Será criado um novo processo para a JVM que será responsável por iniciar o container, implantar nosso código e, finalmente, executar nossos testes.&lt;/p&gt;

&lt;p&gt;Externo ou remoto implica no container em execução em outra máquina (ou na mesma máquina, porém em um processo diferente). Todo o acesso a este container será feito a partir de chamadas de rede.&lt;/p&gt;

&lt;p&gt;A diferença entre o gerenciado e o externo é sutil: o gerenciado é aquele que pode ser iniciado ou finalizado pelo nosso código de teste.&lt;/p&gt;

&lt;h3&gt;Executor&lt;/h3&gt;

&lt;p&gt;O Arquillian não é dependente de um framework de teste específico. Atualmente oferece suporte a JUnit e TestNG. Sendo assim você mantém todo o seu conhecimento na escrita dos seus testes usando seu framework favorito.&lt;/p&gt;

&lt;h2&gt;Requisitos para usar o Arquillian&lt;/h2&gt;

&lt;p&gt;Ok, você agora tem uma ideia sobre o que o Arquillian pode fazer e quais problemas ele resolve. Do que você precisa para adotá-lo em seus projetos?&lt;/p&gt;

&lt;h3&gt;Ferramenta de build&lt;/h3&gt;

&lt;p&gt;O Arquillian pode ser usado com qualquer ferramenta de build &lt;strong&gt;que tenha gestão de dependências&lt;/strong&gt;. A documentação oficial está focada em Maven, mas você pode usar o Gradle também se quiser.&lt;/p&gt;

&lt;p&gt;Se você estiver na situação em que precise testar sua aplicação contra diferentes containers, recomendo uma ferramenta de build que possua o recurso de perfis (profiles), tal como o Maven. Isto lhe permitirá carregar as dependências necessárias para cada situação de acordo com a configuração desejada.&lt;/p&gt;

&lt;h3&gt;JDK&lt;/h3&gt;

&lt;p&gt;Há suporte para a versão 1.6 ou posterior do Java. Lembra quando disse que é uma ferramenta excelente para se aplicar a sistemas legados? Na página de módulos do Arquillian que lista os container adapters você verá alguns containers bem antigos (Tomcat 5, por exemplo).&lt;/p&gt;

&lt;h3&gt;Framework de testes&lt;/h3&gt;

&lt;p&gt;Tal como mencionado acima, você pode usar tanto JUnit quanto TestNG.&lt;/p&gt;

&lt;h3&gt;O Container a ser gerenciado&lt;/h3&gt;

&lt;p&gt;Finalmente, você precisará ter acesso ao container que será o responsável pela execução dos seus testes. Caso não tenha acesso ao container em si, verifique as opções de container embarcados disponíveis no site oficial do projeto neste &lt;a href="http://arquillian.org/modules/"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Vantagens e desvantagens&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h-T4pVW_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/balanca.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h-T4pVW_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/balanca.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Será que o Arquillian se aplica ao seu projeto? É importante primeiro entender a natureza do mesmo.&lt;/p&gt;

&lt;h3&gt;Vantagens&lt;/h3&gt;

&lt;p&gt;A principal vantagem do Arquillian é o fato de termos nossos testes executados contra o ambiente &lt;strong&gt;real&lt;/strong&gt; no qual o sistema será implantado. Isto permite à equipe compreender muito melhor as entranhas destes ambientes de execução.&lt;/p&gt;

&lt;p&gt;Outra vantagem muito interessante é o fato de não haver mudanças significativas no seu fluxo de trabalho: você continuará usando sua IDE de preferência tal como faz hoje. É possível depurar seus testes tal como faz hoje: não muda coisa alguma, a não ser algumas anotações que você aprenderá em posts futuros.&lt;/p&gt;

&lt;p&gt;A velocidade na execução também é surpreendente: a primeira coisa que você pensa ao ser apresentado ao Arquillian é que consiste em uma ferramenta lenta pelo trabalho que realiza. Não é o caso.&lt;/p&gt;

&lt;p&gt;No caso de projetos legados baseados em Java eu diria que seu uso no primeiro momento pode ser essencial, dado que o tempo que você gastaria levantando mocks pode ser proibitivo. Especialmente em casos nos quais exista o uso pesado de JNDI para obter recursos do sistema, tal como datasources e fontes externas de autenticação baseada em JAAS.&lt;/p&gt;

&lt;h3&gt;Desvantagens&lt;/h3&gt;

&lt;p&gt;Servidores de aplicação e Servlet Containers pouco a pouco estão perdendo a relevância no desenvolvimento de novos projetos. Cada vez usa-se menos os recursos disponibilizados por estas ferramentas, tais como os datasources obtidos por JNDI, por exemplo.&lt;/p&gt;

&lt;p&gt;Sendo assim, se for para pensar em adotar o Arquillian, deve-se ter a &lt;strong&gt;certeza&lt;/strong&gt; de que seu projeto será aplicado neste tipo de ambiente. Sinceramente não vemos muito sentido em sua adoção em projetos que fujam deste perfil neste momento.&lt;/p&gt;

&lt;p&gt;Outro fator a ser levado em consideração é o fato do projeto ter perdido o gás nos últimos anos. No momento da escrita deste post o último post em seu blog é de junho de 2018 (estamos em maio de 2020). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XSH5DfdS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XSH5DfdS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.itexto.com.br/site/wp-content/uploads/2020/05/image-1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isto não quer dizer que o projeto esteja morto, apenas que não é mais tão vibrante quanto antes. Os últimos commits até a escrita deste blog no módulo Core, do projeto, por exemplo, são de &lt;a href="https://github.com/arquillian/arquillian-core/commits/master"&gt;20 de abril&lt;/a&gt; no GitHub.&lt;/p&gt;

&lt;p&gt;Sua aplicação em projetos também pode ser um pouco mais trabalhosa que o esperado. Isto em parte se deve à própria documentação do Arquillian. &lt;/p&gt;

&lt;h2&gt;Para saber mais&lt;/h2&gt;

&lt;p&gt;Este é o nosso primeiro post sobre o Arquillian aqui no site da itexto. Em breve publicaremos também algumas receitas ensinando a aplicá-lo em seus projetos e a como executar tarefas importantes com ele. Esperamos que este conhecimento lhes seja útil.&lt;/p&gt;

&lt;p&gt;Mas enquanto isto, você pode aprender mais sobre o projeto nestes links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site oficial - &lt;a href="http://arquillian.org"&gt;http://arquillian.org&lt;/a&gt;  (notou que não é HTTPS?)&lt;/li&gt;
&lt;li&gt;Os guias oficiais - siga do início ao fim para aprender direito seu uso - &lt;a href="http://arquillian.org/guides/"&gt;http://arquillian.org/guides/&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;A lista de módulos que contém extensões ao Arquillian e também a lista de container adapters - &lt;a href="http://arquillian.org/modules/"&gt;http://arquillian.org/modules/&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;A nova documentação oficial - &lt;a href="http://arquillian.org/arquillian-core/"&gt;http://arquillian.org/arquillian-core/&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até os próximos posts!&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>braziliandevs</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Como ter janelas em seu terminal usando tmux</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:19:04 +0000</pubDate>
      <link>https://dev.to/itexto/como-ter-janelas-em-seu-terminal-usando-tmux-g46</link>
      <guid>https://dev.to/itexto/como-ter-janelas-em-seu-terminal-usando-tmux-g46</guid>
      <description>&lt;p&gt;Muitas vezes você lida com ambientes que possuem apenas uma interface de linha de comandos e precisa executar mais de uma ação ao mesmo tempo. Como resolver esta necessidade tendo uma única sessão/janela? Nesta receita apresentamos o &lt;a href="https://github.com/tmux/tmux/wiki"&gt;tmux&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Esta receita lhe fornecerá o &lt;strong&gt;essencial&lt;/strong&gt; para que possa dar os primeiros passos com esta &lt;strong&gt;super&lt;/strong&gt; ferramenta de produtividade que não é tão conhecida como deveria por usuários Linux. &lt;/p&gt;

&lt;h2&gt;Ingredientes&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CE0hT1ii--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/04/ingredientes.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CE0hT1ii--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/04/ingredientes.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux (mas você pode substituir pelo WSL no Windows ou mesmo pelo macOS).&lt;/li&gt;
&lt;li&gt;tmux.&lt;/li&gt;
&lt;li&gt;Habilidade e memória manual mínima.&lt;/li&gt;
&lt;li&gt;Um pouco de paciência e persistência pois o primeiro contato pode não ser tão fácil assim.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Ingrediente principal: tmux&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MhRr6e6F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Tmux_logo.svg/1920px-Tmux_logo.svg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MhRr6e6F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Tmux_logo.svg/1920px-Tmux_logo.svg.png" alt="Tmux logo.svg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A melhor maneira de entender o problema é vendo-o em ação, sendo assim vamos a um caso real. Preciso iniciar dois processos, acompanhar seus logs de saída e editar um arquivo ao mesmo tempo. Consigo pensar em três soluções imediatas para o problema (há mais, a criatividade é infinita).&lt;/p&gt;

&lt;p&gt;Abro três janelas no meu desktop:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0EMAaaWA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/tmux_solucao_1-1024x627.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0EMAaaWA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/tmux_solucao_1-1024x627.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ou crio três abas na interface do meu terminal (também se estou em uma solução gráfica):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KsvL-lqZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KsvL-lqZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;que é uma solução bem ruim, pois não vejo todos os logs ao mesmo tempo. Ou... uso &lt;strong&gt;tmux&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--viQ_6_s2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-1-1024x550.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--viQ_6_s2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-1-1024x550.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As vantagens são nítidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não preciso de uma interface gráfica: o que é excelente quando vou lidar com servidores, por exemplo. Pense em você implantando a solução e acompanhando os logs ao mesmo tempo.&lt;/li&gt;
&lt;li&gt;Tenho acesso a todas as informações que preciso ao mesmo tempo diante dos meus olhos.&lt;/li&gt;
&lt;li&gt;Se estou em uma interface gráfica, são n janelas a menos com as quais preciso me preocupar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas o tmux &lt;strong&gt;não é uma ferramenta que você irá dominar de imediato&lt;/strong&gt;. Leva tempo e, principalmente, habilidade e memória manual, mas depois das dores iniciais ele é um forte candidato a aumentar exponencialmente sua produtividade no terminal. Então é importante ter três conceitos em mente.&lt;/p&gt;

&lt;h3&gt;Os conceitos&lt;/h3&gt;

&lt;p&gt;Tmux é um multiplexador de terminais (que termo "elegante"!), traduzindo: é um software capaz de a partir de uma única sessão do usuário com a interface de linha de comando, simular várias. Pense como o análogo ao conceito de multitarefa que temos em interfaces gráficas.&lt;/p&gt;

&lt;p&gt;E por sessão, estou falando de sessão mesmo, ou seja, um único processo de autenticação no computador, exatamente como você faz quando inicia seu Windows, macOS ou Linux: você fornece seu login e senha e na sequência inicia vários programas ao mesmo tempo com estas mesmas credenciais. Se achou esta descrição muito ruim, tem &lt;a href="https://en.wikipedia.org/wiki/Terminal_multiplexer"&gt;esta na Wikipedia&lt;/a&gt; que talvez você prefira.&lt;/p&gt;

&lt;p&gt;Para que eu tenha minhas "janelas" na linha de comando o tmux usa os conceitos de sessão (&lt;em&gt;session&lt;/em&gt;), janela (&lt;em&gt;window&lt;/em&gt;) e painel (&lt;em&gt;pane&lt;/em&gt;). Nesta receita lidaremos mais com janelas e painéis para simplificar, mas sou obrigado a falar um pouco sobre sessões também.&lt;/p&gt;

&lt;p&gt;A sessão é um conjunto de janelas (sério?). Pense nele como os desktops virtuais com os quais você já tenha experiência no ambiente gráfico do seu sistema operacional. É possível ter várias sessões ativas do tmux em paralelo inclusive, o que vai ser muito útil quando você tiver se empolgado e criado inúmeras janelas.&lt;/p&gt;

&lt;p&gt;Já a janela é um agregador de painéis. Fica difícil descrever textualmente, sendo assim observe a imagem a seguir: cada retângulo é um painel independente, todos contidos em uma mesma janela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--viQ_6_s2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-1-1024x550.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--viQ_6_s2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-1-1024x550.png" alt="O atributo alt desta imagem está vazio. O nome do arquivo é image-1-1024x550.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gravei minha interação entre janelas no tmux para que você possa ter uma ideia sobre o que estou falando. Note que parto de uma janela já com três painéis, crio uma nova e, na sequência, navego entre as diferentes janelas do sistema:&lt;/p&gt;



&lt;p&gt;Acho que com base nisto já podemos colocar a mão na massa.&lt;/p&gt;

&lt;h2&gt;Instalando o tmux&lt;/h2&gt;

&lt;p&gt;Talvez você já o tenha instalado em seu computador. Sendo assim, para testar, execute o comando &lt;strong&gt;tmux&lt;/strong&gt; em seu terminal e veja se já não está presente.&lt;/p&gt;

&lt;p&gt;Se não estiver presente, na esmagadora maioria das distribuições Linux que usam o APT este é um pacote que já se encontra presente, você pode instalá-lo com o comando a seguir:&lt;/p&gt;

&lt;pre&gt;apt-get install tmux&lt;/pre&gt;

&lt;p&gt;Caso o comando acima não te atenda, &lt;a href="https://github.com/tmux/tmux/wiki/Installing"&gt;neste link&lt;/a&gt; do site oficial do projeto há instruções que poderão resolver seu problema. Usa Windows, pelo WSL você consegue ter o mesmo resultado. MacOS? Não fique triste, há tutoriais sobre como executar a instalação &lt;a href="https://medium.com/@jeongwhanchoi/install-tmux-on-osx-and-basics-commands-for-beginners-be22520fd95e"&gt;neste&lt;/a&gt; e &lt;a href="https://gist.github.com/simme/1297707"&gt;neste&lt;/a&gt; link.&lt;/p&gt;

&lt;h2&gt;Iniciando tmux e vendo as sessões&lt;/h2&gt;

&lt;p&gt;Iniciar o tmux é simples: te mostrei ali em cima, mas só pra recordar, vamos lá. No seu shell execute o comando a seguir:&lt;/p&gt;

&lt;pre&gt;tmux&lt;/pre&gt;

&lt;p&gt;O tmux por padrão estará criando uma nova sessão sempre que executar este comando, que é um sinônimo do comando &lt;strong&gt;tmux new&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Talvez acidentalmente você tenha fechado a janela do seu terminal e queria voltar para a sua sessão: o que você faz? Primeiro execute o comando a seguir para listar todas as sessões do tmux:&lt;/p&gt;

&lt;pre&gt;tmux ls&lt;/pre&gt;

&lt;p&gt;E uma saída similar à exposta a seguir será exposta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fNF9v-Vw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fNF9v-Vw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para entrar de novo na sessão que saiu, execute o comando a seguir:&lt;/p&gt;

&lt;pre&gt;tmux attach-session -t [identificador da sessão]
Exemplo indo para a sessão 5 acima listada:
tmux attach-session -t 5&lt;/pre&gt;

&lt;p&gt;Ok, até aqui nada de novo, agora vamos ao que interessa: panes e windows.&lt;/p&gt;

&lt;h2&gt;Entenda os comandos&lt;/h2&gt;

&lt;p&gt;Para que o tmux seja produtivo você deve ter muito bem gravado em sua mente o conceito de "comando" no tmux. Se já usou o Emacs este não será um problema, mas se não usou, vai doer um pouquinho no início. Um comando no tmux é uma sequência de teclas.&lt;/p&gt;

&lt;p&gt;Esta sequência de teclas segue o seguinte padrão:&lt;/p&gt;

&lt;pre&gt;Ctrl + b [Comando]&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Calma agora&lt;/strong&gt;. Comando é qualquer outra tecla do seu teclado após o "Ctrl + b". E lembra quando disse que é importante ter habilidade e memória manual mínimas? Agora você vai entender.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não é pra pressionar todas as teclas ao mesmo tempo&lt;/strong&gt;. É um procedimento composto por dois passos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pressione Ctrl + b (minúsculo mesmo, nem precisa ficar com os dois pressionados o tempo todo, apenas digite na sequência)&lt;/li&gt;
&lt;li&gt;Libere Ctrl + b&lt;/li&gt;
&lt;li&gt;Pressione a tecla que representa o comando&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos a um exemplo: você já iniciou o tmux e quer dividir sua janela em dois painéis horizontais, tal como na imagem a seguir: o comando é &lt;em&gt;Ctrl b " &lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LA1k0zZz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-3-1024x557.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LA1k0zZz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-3-1024x557.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pressione Ctrl + B&lt;/li&gt;
&lt;li&gt;Digite " (é, aspas duplas, eu sei que é chato no início)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pronto, resultado obtido. Minha sugestão é que você pratique por um minuto pra poder ficar bom mesmo na coisa. Então segue a lista dos comandos que mais uso no tmux.&lt;/p&gt;

&lt;h2&gt;Comandos essenciais&lt;/h2&gt;

&lt;p&gt;Aqui seguem os comandos mais úteis para um uso &lt;strong&gt;simples&lt;/strong&gt; do tmux.&lt;/p&gt;

&lt;h3&gt;Gestão de painéis (os que mais uso sem sombra de dúvidas):&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Comando&lt;/td&gt;
&lt;td&gt;Efeito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b "&lt;/td&gt;
&lt;td&gt;Cria uma novo painel horizontal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b %&lt;/td&gt;
&lt;td&gt;Cria um novo painel vertical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b o&lt;/td&gt;
&lt;td&gt;Navega entre os paineis no sentido horário&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b (seta)&lt;/td&gt;
&lt;td&gt;Navega para o painel que está acima, abaixo, à esquerda ou à direita do atual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b x&lt;/td&gt;
&lt;td&gt;Mata o painel corrente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b espaço&lt;/td&gt;
&lt;td&gt;Muda o layout dos painéis. Você zoneou a sua janela e quer tentar salvá-la? Este é o comando.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dica: scroll! &lt;/strong&gt;Você muitas vezes precisará fazer scroll no conteúdo que um painel está expondo a você. É possível configurar o tmux para aceitar eventos de mouse, mas há uma solução mais simples usando apenas o teclado (convenhamos, o ideal aqui é usar só o teclado mesmo). Siga este procedimento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute o comando Ctrl b [&lt;/li&gt;
&lt;li&gt;Agora você pode navegar usando setas ou as teclas Page Up e Page Down&lt;/li&gt;
&lt;li&gt;Para sair do modo scroll digite q&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Gestão de janelas &lt;/h3&gt;

&lt;p&gt;Quando tiver se empolgado e criado uma infinidade de paineis você irá desejar criar o caos em outra janela. Sendo assim, segue uma pequena lista.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b w&lt;/td&gt;
&lt;td&gt;Lista as janelas abertas para que você possa navegar entre elas de um modo "quase gráfico"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b c&lt;/td&gt;
&lt;td&gt;Cria uma nova janela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b [número]&lt;/td&gt;
&lt;td&gt;O número representa o identificador da janela de 0 a 9. Serve para que você possa trocar de janelas de uma forma mais ágil (quando sabe o identificador da mesma)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b n&lt;/td&gt;
&lt;td&gt;Vai pra próxima janela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b p&lt;/td&gt;
&lt;td&gt;Vai pra janela anterior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b &amp;amp;&lt;/td&gt;
&lt;td&gt;Fecha a janela atual&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;Gestão de sessões&lt;/h3&gt;

&lt;p&gt;Depois de ter criado o caos entre suas janelas, você o transfere para as sessões. :)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b s&lt;/td&gt;
&lt;td&gt;Lista as sessões abertas e te permite navegar entre as sessões&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b (&lt;/td&gt;
&lt;td&gt;Muda para a sessão anterior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b )&lt;/td&gt;
&lt;td&gt;Muda para a próxima sessão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl b d&lt;/td&gt;
&lt;td&gt;Sai da sessão atual&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Você pode encontrar diversos outros comandos do tmux &lt;a href="https://tmuxcheatsheet.com/"&gt;neste link&lt;/a&gt;. São tantos que criaram até um site pra isto. O objetivo desta receita é apenas te dar o essencial para que possa dar seus primeiros passos por conta própria.&lt;/p&gt;

&lt;h2&gt;As deliciosas receitas da itexto&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XKqtJzOa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/04/receitas_itexto_block.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XKqtJzOa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/04/receitas_itexto_block.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta é apenas mais uma receita da itexto. Nosso objetivo não é nestes posts lhe fornecer todo o aprofundamento para que domine um assunto, mas sim dar aquele pontapé inicial para que você possa dar seus primeiros passos neste.&lt;/p&gt;

&lt;p&gt;É importante lembrar que o tmux não é a única solução para este problema: há diversas outras, como o &lt;a href="https://www.gnu.org/software/screen/"&gt;GNU Screen&lt;/a&gt; ou &lt;a href="https://www.byobu.org/"&gt;Byobu&lt;/a&gt;. Talvez a grande vantagem do tmux seja sua popularidade, mas sem dúvidas não é a melhor solução. Até a próxima receita!&lt;/p&gt;

&lt;p&gt;Não conhece as nossas receitas? Esta é uma metodologia que ensinamos a nossos clientes com o objetivo de facilitar a divulgação de conhecimento para o público interno ou externo, como neste post. Aprenda a ter seu livro de receitas &lt;a href="https://itexto.com.br/receitas-da-itexto/"&gt;neste link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>braziliandevs</category>
      <category>ptbr</category>
      <category>linux</category>
    </item>
    <item>
      <title>A linguagem de programação Groovy - Radar da itexto</title>
      <dc:creator>Henrique Lobo Weissmann (Kico)</dc:creator>
      <pubDate>Wed, 16 Jun 2021 12:14:28 +0000</pubDate>
      <link>https://dev.to/itexto/a-linguagem-de-programacao-groovy-radar-da-itexto-51ho</link>
      <guid>https://dev.to/itexto/a-linguagem-de-programacao-groovy-radar-da-itexto-51ho</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8zyCBQWP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/radar_itexto-1024x266.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8zyCBQWP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/radar_itexto-1024x266.png" alt="Radar da itexto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este post inicia a série "Radar da itexto" na qual apresentamos à comunidade as tecnologias que usamos e recomendamos. Nosso objetivo é responder a questões essenciais que deveriam nortear a escolha de qualquer tecnologia: o que é? onde aplicar? tem passado e futuro?&lt;/p&gt;

&lt;h2&gt;O que é Groovy?&lt;/h2&gt;

&lt;p&gt;Uma linguagem de programação desenvolvida e pensada para a plataforma Java. Por "plataforma Java", entenda "executada pela e na JVM". Mas o que "mais esta linguagem" pra JVM trás pro jogo?&lt;/p&gt;

&lt;h3&gt;Ter como alicerces a JVM e a linguagem Java&lt;/h3&gt;

&lt;p&gt;Groovy convive muito bem com código Java pré-existente. Você pode executar código Java a partir do Groovy e vice-versa. Groovy, assim como Java, gera bytecode que é executado pela JVM de forma indiscriminada.&lt;/p&gt;

&lt;p&gt;Mas mais do que isto: Groovy respeita a estrutura de tipos e modelo de execução adotado pela linguagem Java, o que torna esta integração no nível mais baixo da linguagem (bytecode) um processo totalmente transparente. &lt;/p&gt;

&lt;p&gt;Como nota histórica, a linguagem aparece pela primeira vez em um &lt;a href="https://web.archive.org/web/20030901064404/http://radio.weblogs.com/0112098/2003/08/29.html"&gt;post do blog de James Strachan&lt;/a&gt; (seu criador) em 2003: o objetivo era ter uma linguagem dinâmica na plataforma Java que surgisse tendo a JVM em seu centro, ao contrário das linguagens Jython e JRuby que, na época, não tinham atingido com pleno sucesso este objetivo.&lt;/p&gt;

&lt;p&gt;Surge assim Groovy: "uma linguagem dinâmica para a plataforma Java", mas com um diferencial importantíssimo: sintaxe &lt;strong&gt;muito próxima à do Java&lt;/strong&gt;, o que reduz significativamente a curva de aprendizado.&lt;/p&gt;

&lt;h3&gt;Uma linguagem dinâmica (mas só se você quiser)&lt;/h3&gt;

&lt;p&gt;É importante entender um dos principais fatores de venda do Groovy que é o fato desta ser "uma linguagem dinâmica". Groovy é muito influenciado por Ruby e Python que também são linguagens dinâmicas.&lt;/p&gt;

&lt;p&gt;Em essência uma linguagem dinâmica permite que você modifique o comportamento do seu código em tempo de execução. Soa estranho em um primeiro momento: se você já colocou seu código em produção, pra que incluir novos comportamentos neste? Qual o sentido?&lt;/p&gt;

&lt;p&gt;A primeira forma como encontramos o aspecto dinâmico de linguagens diz respeito à tipagem. Uma linguagem possui tipagem dinâmica quando descobrimos seu tipo (inteiro, texto, booleano...) em tempo de execução e não de compilação. &lt;/p&gt;

&lt;p&gt;Há aqui um tradeoff entre desempenho e produtividade. Não raro do ponto de vista do desenvolvedor o tipo não é tão importante quanto parece. Pense em uma hierarquia de classes na qual precisemos da existência de um conjunto de comportamentos (métodos). Em uma linguagem estática criamos uma hierarquia ou estrutura de interfaces que identifiquem estes comportamentos. Em uma linguagem dinâmica só precisamos que o método exista: é o que chamamos de &lt;a href="https://pt.wikipedia.org/wiki/Duck_typing"&gt;duck typing&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Mas nem só de tipagem dinâmica vivem estas linguagens: você também pode incluir novos métodos e atributos em classes existentes ou mesmo interceptar a invocação de métodos usando recursos nativos da linguagem ao invés de frameworks como Spring ou AspectJ.&lt;/p&gt;

&lt;p&gt;No frigir dos ovos, entretanto, é importante salientar que estes recursos são usados mais por quem desenvolve código de infraestrutura (frameworks) que a esmagadora maioria dos desenvolvedores.&lt;/p&gt;

&lt;p&gt;Um aspecto importante a ser levado em consideração no caso do Groovy é que os aspectos dinâmicos da linguagem são opcionais: se quiser, você pode desenvolver com tipagem estática sem problema algum e com isto obter algum ganho de desempenho (não é tão significativo assim).&lt;/p&gt;

&lt;h3&gt;Um "Java++"?&lt;/h3&gt;

&lt;p&gt;Observamos em nosso time e de diversos clientes que a adoção do Groovy pode aumentar significativamente a produtividade da equipe devido aos pontos que trataremos aqui.&lt;/p&gt;

&lt;p&gt;Uma consequência interessante de estarmos lidando com uma linguagem dinâmica é que a equipe responsável pelo desenvolvimento do Groovy acabou evoluindo a própria API do Java.&lt;/p&gt;

&lt;p&gt;Como podemos incluir novos métodos em classes já existentes, Groovy acabou por adicionar uma pletora de novas funcionalidades na API padrão do Java, aumentando significativamente a produtividade do desenvolvedor. É o que chamamos de GDK (&lt;a href="http://groovy-lang.org/gdk.html"&gt;Groovy Development Kit&lt;/a&gt;). Observe os métodos incluídos na &lt;a href="https://docs.groovy-lang.org/latest/html/groovy-jdk/java/lang/String.html"&gt;classe String&lt;/a&gt;, por exemplo: inúmeras funcionalidades que você sempre quis mas precisava antes de outras bibliotecas encontram-se ali.&lt;/p&gt;

&lt;p&gt;Mas os ganhos não estão apenas no enriquecimento das bibliotecas padrão: a sintaxe também possui diversas melhorias. Como mencionado, você pode dar seus primeiros passos na linguagem usando o que já conhece do Java, mas pouco a pouco ir experimentando novas features, tais como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sobrecarga de operadores.&lt;/li&gt;
&lt;li&gt;Operadores para lidar com Collections, tais como "[]" para lidar com listas ao invés da classe java.util.List (e implementações) e "[:]" para lidar com mapas ao invés de java.util.Map (e implementações).&lt;/li&gt;
&lt;li&gt;Interpolação de valores em strings.&lt;/li&gt;
&lt;li&gt;Uma sintaxe que pode ser muito mais limpa por remover atributos que poderiam ser opcionais (";" ao final de cada comando quando há um único por linha, parênteses opcionais, expressão "return" opcional, método "main" opcional, e muitos outros).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E esta é uma lista bem pequena. Anos atrás (Windows Vista!) gravei um vídeo de quase uma hora só expondo estas funcionalidades que pode ser visto neste link: &lt;a href="https://youtu.be/eEUKRhPoJAY"&gt;https://youtu.be/eEUKRhPoJAY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com sua sintaxe menos burocrática e o enriquecimento da API padrão do Java,  Groovy trás para o universo Java uma experiência muito próxima da que desenvolvedores Python e Ruby tem em seu dia a dia. &lt;/p&gt;

&lt;p&gt;Indo além, acreditamos que temos aqui o que chamamos de "&lt;a href="https://devkico.itexto.com.br/?p=2025"&gt;tecnologia ponte&lt;/a&gt;": Groovy fornece aos menos experientes uma introdução suave a conceitos e bibliotecas mais complexas do ecossistema Java (incluindo Java EE).&lt;/p&gt;

&lt;h3&gt;Construa suas próprias linguagens (DSLs) com Groovy&lt;/h3&gt;

&lt;p&gt;A sintaxe do Groovy unida aos seus aspectos dinâmicos e a inclusão de funcionalidades como builders e outros o tornam a ferramenta ideal para a construção de linguagens específicas de contexto (DSLs - Domain Specific Language).&lt;/p&gt;

&lt;p&gt;Há alguns projetos de sucesso hoje que são essencialmente DSLs escritas com Groovy, sendo o mais famoso provavelmente o &lt;a href="https://gradle.org/"&gt;Gradle&lt;/a&gt;, seguido do &lt;a href="http://spockframework.org/"&gt;Spock&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://pt.wikipedia.org/wiki/Linguagem_de_dom%C3%ADnio_espec%C3%ADfico"&gt;DSLs&lt;/a&gt; são uma poderosa estratégia: permitem à equipe de desenvolvimento focar na construção de uma plataforma essencial que é enriquecida pelos seus usuários finais, responsáveis por implementar em uma linguagem próxima ao seu contexto regras de negócio que lhes atendam no dia a dia.&lt;/p&gt;

&lt;p&gt;Em nossa experiência já implementamos, por exemplo, linguagens específicas de contexto para os setores de engenharia, e-commerce,  comunicações e outros. Caso queira ler mais sobre Groovy para a construção de linguagens específicas de contexto, leia este &lt;a href="http://docs.groovy-lang.org/docs/latest/html/documentation/core-domain-specific-languages.html"&gt;link&lt;/a&gt; de sua documentação oficial ou leia &lt;a href="https://www.amazon.com/Groovy-Domain-Specific-Languages-Fergal-Dearle/dp/1849695407"&gt;este livro&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eOebKVam--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/groovy_aplicacoes-1024x372.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eOebKVam--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/groovy_aplicacoes-1024x372.jpg" alt="Aplicações do Groovy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Aplicações&lt;/h2&gt;

&lt;p&gt;Groovy é uma linguagem de uso geral: pode portanto ser usada, em teoria, para qualquer coisa, entretanto há usos para os quais esta se mostra uma alternativa interessante, e são estas que traremos aqui. Naturalmente há outras, entretanto estes são os usos que consideramos mais populares.&lt;/p&gt;

&lt;p&gt;Um problema que a linguagem enfrenta é o fato de na maior parte das vezes ter seu nome vinculado ao do framework &lt;a href="https://grails.org"&gt;Grails&lt;/a&gt;, o que limita bastante a sua percepção pelo público.&lt;/p&gt;

&lt;h3&gt;Complementando o Java&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FyIJH0T8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/java_groovy-1024x359.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FyIJH0T8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/java_groovy-1024x359.jpg" alt="Groovy complementando Java"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Como linguagem embarcada&lt;/h4&gt;

&lt;p&gt;É possível embarcar Groovy em projetos Java de uma forma relativamente simples, o que possibilita a construção de plataformas que possam ser estendidas em tempo de execução por seus usuários através da inclusão, edição e remoção de scripts Groovy a serem executados por esta.&lt;/p&gt;

&lt;p&gt;Em uma plataforma de vendas, por exemplo, é possível termos scripts que validem promoções em tempo de execução, podemos pensar também em fórmulas e cálculos definidos pelo usuário, algoritmos de processamento sinais e muitas outras funcionalidades cujo conhecimento está nas mãos dos usuários e não da equipe de desenvolvimento. Uma opção muito mais fácil de ser implantada que a adoção de motores de regras complexos como &lt;a href="https://www.drools.org/"&gt;Drools&lt;/a&gt;, por exemplo.&lt;/p&gt;

&lt;p&gt;A equipe de desenvolvimento passa portanto aqui a atuar como responsável pela evolução de uma plataforma a ser enriquecida por seus usuários finais, sem a necessidade de realizar complexos procedimentos de manutenção de código e implantação. Bateu aquela curiosidade pra saber como isto pode ser feito? Aqui segue um vídeo em que explico como proceder: &lt;a href="https://youtu.be/_njSd-efuCo"&gt;https://youtu.be/_njSd-efuCo&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Como ferramenta de automatização/integração com scripts&lt;/h4&gt;

&lt;p&gt;Código Groovy pode ser executado sob a forma de scripts. E dado que o acesso a código Java é direto, abrem-se aqui possibilidades de automatização bastante interessantes.&lt;/p&gt;

&lt;p&gt;É possível, por exemplo, incluir suas bibliotecas de negócio (arquivos JAR) ou de infraestrutura (como frameworks de persistência ou biblitoecas utilitárias) no classpath dos seus scripts e executar nativamente as funcionalidades ali implementadas.&lt;/p&gt;

&lt;p&gt;Um uso muito comum é a execução de tarefas agendadas de manutenção como, por exemplo, usando as regras de negócio distribuídas como arquivos JAR, invalidar registros, executar relatórios, etc através de agendamentos simples de sistema operacional (CRON).&lt;/p&gt;

&lt;p&gt;Você pode, por exemplo, tirando proveito das melhorias introduzidas pelo GDK inclusive executar ações como raspagem de dados, implementação de crawlers, processamento em massa de dados e muitas outras atividades que normalmente são implementadas como scripts simples.&lt;/p&gt;

&lt;h4&gt;Como ferramenta de onboarding de novos membros na equipe&lt;/h4&gt;

&lt;p&gt;Uma das maiores dificuldades de equipes que precisam contratar profissionais Java é encontrá-los. Então por que não usar Groovy como uma ponte para desenvolvedores Python, Ruby ou JavaScript?&lt;/p&gt;

&lt;p&gt;Esta é uma possibilidade real: muitas vezes profissionais habituados a estas linguagens possuem forte resistência ao ecossistema Java devido à linguagem (Java). Como Groovy apresenta uma sintaxe muito próxima do Python/Ruby, estes programadores tendem a sentirem-se mais confiáveis usando Groovy e, pouco a pouco, começam a se habituar ao ecossistema Java a partir desta ponte.&lt;/p&gt;

&lt;h3&gt;Desenvolvimento web&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dfxbAsiQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/web-1024x346.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dfxbAsiQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/web-1024x346.jpg" alt="Desenvolvimento Web com Groovy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desenvolvimento web com Groovy vai &lt;strong&gt;muito além do Grails&lt;/strong&gt; (em breve um texto aqui sobre este assunto). Sou obrigado a citá-lo, mas é fundamental que você saiba que há várias outras alternativas que também são de altíssima produtividade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grails - de longe a opção mais popular da linguagem, sendo fortemente inspirado em Ruby on Rails - &lt;a href="https://grails.org%20"&gt;https://grails.org &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Micronaut - desenvolvido pela equipe que desenvolveu o Grails, uma solução interessantíssima para o desenvolvimento de microserviços. - &lt;a href="https://micronaut.io"&gt;https://micronaut.io&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Spring Boot - é possível com pouquíssimo código Groovy escrever microserviços com este framework, &lt;a href="https://spring.io/guides/gs/spring-boot/"&gt;sabia&lt;/a&gt;? &lt;/li&gt;
&lt;li&gt;Ratpack - uma opção extremamente produtiva para a escrita de aplicações web no estilo de microserviços - &lt;a href="https://ratpack.io/"&gt;https://ratpack.io/&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Groovy Servlets - quer um desenvolvimento mais raíz? Que tal implementar seus próprios servlets com o mínimo de código? Aprenda mais &lt;a href="https://groovy-lang.org/servlet.html"&gt;aqui&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Desenvolvimento desktop&lt;/h3&gt;

&lt;p&gt;Quem disse que o desenvolvimento desktop acabou? Groovy é uma opção muito interessante nesta área. Duas alternativas bastante interessantes:&lt;/p&gt;

&lt;h4&gt;Griffon&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4ahh_aPr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4ahh_aPr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-4.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pense no Griffon como se fosse um Grails/Ruby on Rails/Django para o desenvolvimento desktop. Os mesmos princípios de convenção sobre configuração e não se repita (DRY - Don't Repeat Yourself) se aplicam aqui. &lt;/p&gt;

&lt;p&gt;Saiba mais &lt;a href="http://griffon-framework.org/"&gt;neste link&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Swing Builder&lt;/h4&gt;

&lt;p&gt;Em sua biblioteca padrão Groovy trás um recurso muito interessante que é o &lt;a href="http://groovy-lang.org/swing.html"&gt;Swing Builder&lt;/a&gt;. Com ele é possível desenvolver aplicações desktop na plataforma Java usando um ambiente que desenvolvedores JavaFX (especialmente em sua primeira versão) acharão bastante familiar ;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wWreV-2L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/groovy_road-1024x500.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wWreV-2L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/groovy_road-1024x500.jpg" alt="Adoção e Futuro do Groovy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Adoção e futuro&lt;/h2&gt;

&lt;h3&gt;Uso no mercado&lt;/h3&gt;

&lt;p&gt;Por muitos anos Groovy foi a segunda linguagem mais popular na plataforma Java (atrás do próprio Java). Com a adoção do Kotlin no desenvolvimento Android a situação mudou e esta não é mais a realidade. &lt;/p&gt;

&lt;p&gt;No índice TIOBE de novembro/2020, a linguagem &lt;strong&gt;quase&lt;/strong&gt; chega ao TOP 10 global, encontrando-se na décima primeira posição, tal como pode ser visto &lt;a href="https://www.tiobe.com/tiobe-index/"&gt;neste link&lt;/a&gt;. Este crescimento vêm sendo observado pela mídia internacional nos últimos meses, tal como pode ser visto &lt;a href="https://www.zdnet.com/article/programming-languages-python-rides-high-but-groovy-is-cool-again-with-developers/"&gt;neste&lt;/a&gt;, &lt;a href="https://jaxenter.com/tiobe-index-february-2019-groovy-155403.html"&gt;neste&lt;/a&gt; e neste &lt;a href="https://insights.dice.com/2019/03/20/groovy-enjoying-grooviest-rise-programming/"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Entretanto popularidade não deve ser levada em consideração na adoção de uma tecnologia, especialmente o índice TIOBE, que mede apenas menções a tecnologias na web (e fora do Brasil). Há muito hype que deve ser filtrado, o que realmente interessa são outras métricas em relação ao futuro do projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Atividade do repositório:&lt;/strong&gt; &lt;strong&gt;bastante ativa&lt;/strong&gt; como pode ser vista no &lt;a href="https://github.com/apache/groovy"&gt;Github&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frequência na liberação de releases&lt;/strong&gt;: há pelo menos uns dois ou três por ano, tal como pode ser visto &lt;a href="http://groovy-lang.org/releases.html"&gt;neste link&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoção em outros projetos&lt;/strong&gt;: são realmente muitos, tais como pode ser visto &lt;a href="https://awesomeopensource.com/projects/groovy"&gt;neste&lt;/a&gt; (Awesome Opensource) e neste &lt;a href="https://github.com/topics/groovy"&gt;link&lt;/a&gt; (Github).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunidade&lt;/strong&gt; - a comunidade Slack do Groovy é bastante ativa e há muita movimentação no StackOverflow também, como pode ser visto &lt;a href="https://stackoverflow.com/questions/tagged/groovy"&gt;aqui&lt;/a&gt;. Entretanto é importante salientar que temos aqui comunidades difusas, dado que estas se distribuem entre os diferentes projetos que se baseiam na linguagem (Gradle, Grails, Jenkins, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoção pelo mercado e maturidade&lt;/strong&gt;: Groovy surge em 2003, já tem 17 anos de idade e adoção nos mais variados cenários.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Livros publicados a respeito:&lt;/strong&gt; há muito material publicado a respeito, o que pode ser verificado, por exemplo, no site da &lt;a href="https://www.amazon.com/s?k=groovy+programming"&gt;Amazon&lt;/a&gt; ou na &lt;a href="http://groovy-lang.org/learn.html#books"&gt;documentação oficial&lt;/a&gt; da linguagem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Portanto há desenvolvimento e também uma comunidade ativa que usa a linguagem em seu dia a dia, o que lhe confere relevância. Levando em consideração que temos um projeto open source, é seguro dizer que não desaparecerá tão cedo do nosso radar.&lt;/p&gt;

&lt;p&gt;Recentemente saiu a versão 4.0 do Groovy, que trás uma série de melhorias e avanços, que podem ser vistos &lt;a href="https://groovy-lang.org/releasenotes/groovy-4.0.html"&gt;neste link&lt;/a&gt;. Entretanto, dado que seu uso mais popular ainda é o Grails, poderá levar um tempo até que este último release se popularize, dado que o último release do Grails (4.0.5) &lt;a href="https://groovy-lang.org/releasenotes/groovy-4.0.html"&gt;ainda usa a versão 2.5.6 da linguagem&lt;/a&gt;. Outro fator que impactará sua adoção é o fato de depender da versão 9 ou posterior do JDK, em um mundo no qual o Java 8 ainda domina, mas estes dois pontos são questão de tempo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ftCctzCZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/pare.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ftCctzCZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/pare.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Dificuldades na adoção em equipes&lt;/h3&gt;

&lt;p&gt;Em nossa experiência encontramos alguns fatores que devem ser levados em consideração caso seu time opte pro adotar Groovy como linguagem de programação. É muito importante levar estes pontos em consideração caso esteja considerando adotar esta tecnologia.&lt;/p&gt;

&lt;h4&gt;Cuidado com o primeiro contato&lt;/h4&gt;

&lt;p&gt;A principal dificuldade na adoção do Groovy é o modo como profissionais tem o primeiro contato com a linguagem, normalmente a partir de um framework (Grails). Um comportamento muito similar que observamos com a linguagem Ruby em relação ao Ruby on Rails (e poderíamos também mencionar Python com Django).&lt;/p&gt;

&lt;p&gt;Muitas vezes o desenvolvedor se limita ao que é apresentado pelo framework, acabando por não se aprofundar na linguagem e, com isto, usando apenas uma pequena parte do que esta tem a oferecer.&lt;/p&gt;

&lt;h4&gt;Vícios do Java&lt;/h4&gt;

&lt;p&gt;Groovy oferece uma sintaxe que é muito próxima à do Java. A vantagem desta abordagem é que a curva de aprendizado é realmente muito pequena para quem já conhece a linguagem, entretanto há um perigo aqui.&lt;/p&gt;

&lt;p&gt;A escrita de código Groovy muito similar ao do Java deve ocorrer somente nos primeiros contatos com a linguagem. Com o passar do tempo a equipe deve ser incentivada a escrever código que seja o mais próximo possível do estilo Groovy para que possa tirar máximo proveito do que esta tem a oferecer e, também, evitar uma série de problemas difíceis de serem detectados se lermos código Groovy como se fosse Java.&lt;/p&gt;

&lt;p&gt;Caso enfrente este problema, recomendamos que os dois textos a seguir sejam divulgados para o time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://groovy-lang.org/style-guide.html"&gt;Guia de estilo da linguagem&lt;/a&gt; - mostra os padrões adotados na escrita de código Groovy&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://groovy-lang.org/differences.html"&gt;Diferenças em relação ao Java&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Dinamismo&lt;/h4&gt;

&lt;p&gt;O dinamismo da linguagem também pode ser considerado uma dificuldade por equipes habituadas a trabalhar com linguagens estáticas. Essencialmente vemos aqui estas equipes tendo o mesmo tipo de dificuldade com outras linguagens, tais como Ruby ou Python, o que talvez justifique, nos mesmos times, o sucesso de linguagens como TypeScript.&lt;/p&gt;

&lt;p&gt;É muito importante que a equipe esteja consciente do significado de uma linguagem dinâmica para que possa tirar máximo proveito do que esta tem a oferecer, caso contrário há o risco &lt;strong&gt;real&lt;/strong&gt; de comportamentos esperados da linguagem serem mal interpretados como defeitos e não como o que realmente são: funcionalidades.&lt;/p&gt;

&lt;h3&gt;Ferramental&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NKc2D6dv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NKc2D6dv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://itexto.com.br/wp-content/uploads/2020/11/image-5.png" alt="Ferramental Groovy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após tantos anos no mercado é natural que tenha surgido todo um ferramental que rodeia a linguagem. Seguem algumas ferramentas que consideramos essenciais para a adoção e aprendizado da tecnologia.&lt;/p&gt;

&lt;h4&gt;SDKMan&lt;/h4&gt;

&lt;p&gt;Hoje a principal ferramenta para se instalar o Groovy e qualquer outra ferramenta do ecossistema Java é o SDKMan, que nos permite gerenciar diferentes versões das principais ferramentas do ecossistema Java.&lt;/p&gt;

&lt;p&gt;Maiores detalhes sobre o SDKMan podem ser obtidas em seu &lt;a href="https://sdkman.io"&gt;site oficial&lt;/a&gt;. Caso queira se aprofundar no assunto, recomendo que leia &lt;a href="https://itexto.com.br/configurando-seu-ambiente-de-desenvolvimento-java-com-sdkman/"&gt;nosso guia do SDKMan&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;IDEs e editores de texto&lt;/h4&gt;

&lt;p&gt;O fato de Groovy ser uma linguagem dinâmica torna o desenvolvimento de IDEs uma tarefa mais difícil se comparado às linguagens estáticas. Felizmente existem boas opções no mercado que podem ser adotadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.jetbrains.com/idea/features/groovy.html"&gt;Intellij IDEA&lt;/a&gt; - a melhor IDE para se trabalhar com Groovy e Grails.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/groovy/groovy-eclipse"&gt;Eclipse Groovy Development Tools&lt;/a&gt; - a instalação pode ser um pouco mais complicada, mas oferece o essencial para quem está habituado a trabalhar com Eclipse.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt; - apesar de não oferecer recursos avançados como "code complete", já possui plugins que permitem a refatoração de código e, ao que tudo indica, é questão de tempo até que alternativas melhores apareçam no editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É possível ter acesso a mais opções na documentação oficial da linguagem neste &lt;a href="http://groovy-lang.org/ides.html"&gt;link&lt;/a&gt;, entretanto é importante ter em mente que as opções sempre são bem mais limitadas, devido à natureza da linguagem, que aquelas que temos com linguagens de tipagem estática como Java ou Kotlin.&lt;/p&gt;

&lt;p&gt;Um ponto importante a ser levado em consideração é que na maior parte das vezes observamos que as equipes optam por não usar IDEs completas, mas sim editores de texto para escreverem seus sistemas com Groovy. &lt;/p&gt;

&lt;p&gt;Para praticamente todos os editores do mercado existem plug-ins que possibilitam aplicar estilos e formatações a código Groovy, atendendo bem a este segmento. Dentre os editores os mais populares são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://notepad-plus-plus.org/"&gt;Notepad++&lt;/a&gt; (Windows)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atom.io"&gt;Atom&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;REPL&lt;/h4&gt;

&lt;p&gt;Pelo fato da linguagem poder ser executada como scripts, esta oferece opções interessantes de interfaces REPL (Read Eval Process Loop), tal como o IRB do Ruby ou o interpretador do Python. Dentre estas, destacamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://groovyconsole.appspot.com/"&gt;Groovy Web Console&lt;/a&gt; - que permite experimentar código Groovy na web sem a necessidade de tê-lo instalado localmente.&lt;/li&gt;
&lt;li&gt;Groovy Console - interface desktop provida pela instalação padrão da linguagem (comando groovyConsole) que permite editar e executar pequenos scripts (inclusive depurá-los).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambas as ferramentas são bastante úteis no dia a dia em momentos nos quais é necessário avaliar possibilidades da linguagem e, principalmente, no aprendizado da mesma.&lt;/p&gt;

&lt;h4&gt;SonarQube&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.sonarqube.org/"&gt;SonarQube&lt;/a&gt; é um analisador estático de código que possui &lt;a href="https://docs.sonarqube.org/display/SONARQUBE45/Groovy+Plugin"&gt;suporte a Groovy&lt;/a&gt;. Recomendamos seu uso na adoção da linguagem por poder ser uma poderosa ferramenta pedagógica que ensina diversas boas práticas à equipe de desenvolvimento.&lt;/p&gt;

&lt;h2&gt;Para saber mais&lt;/h2&gt;

&lt;p&gt;O objetivo deste post é apresentar, do ponto de vista gerencial, uma tecnologia que pode agregar valor a seus projetos e que dominamos na itexto. &lt;/p&gt;

&lt;p&gt;Caso deseje se aprofundar no assunto, segue uma pequena lista de recursos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site oficial do projeto Groovy - &lt;a href="https://groovy-lang.org"&gt;https://groovy-lang.org&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Comunidade Groovy e Grails Brasil - mantida pela itexto - &lt;a href="https://grailsbrasil.com.br"&gt;https://grailsbrasil.com.br&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Greach - evento anual que ocorre na Espanha sobre desenvolvimento Groovy e Grails - &lt;a href="https://www.greachconf.com/"&gt;https://www.greachconf.com/&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Gr8 Conf - outro evento anual de desenvolvedores Groovy e Grails na Europa - &lt;a href="http://gr8conf.eu/"&gt;http://gr8conf.eu/&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Canais de suporte oficial a Grovoy - &lt;a href="http://groovy-lang.org/support.html"&gt;http://groovy-lang.org/support.html&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Meu livro de Grails (trata de Grails 2.5, bem ultrapassado), que contém uma introdução à linguagem Groovy - &lt;a href="https://www.casadocodigo.com.br/products/livro-grails"&gt;https://www.casadocodigo.com.br/products/livro-grails&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Meu canal no YouTube no qual há diversos vídeos sobre o assunto - &lt;a href="https://youtube.com/kicolobo"&gt;https://youtube.com/kicolobo&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>braziliandevs</category>
      <category>groovy</category>
      <category>java</category>
      <category>ptbr</category>
    </item>
  </channel>
</rss>
