<?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: Bruno Barros</title>
    <description>The latest articles on DEV Community by Bruno Barros (@brunobarros2093).</description>
    <link>https://dev.to/brunobarros2093</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F907321%2Fdcf90fd3-385d-4318-87cf-f1cd8d6578d5.jpg</url>
      <title>DEV Community: Bruno Barros</title>
      <link>https://dev.to/brunobarros2093</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brunobarros2093"/>
    <language>en</language>
    <item>
      <title>Introdução aos Testes Unitários com Pest em PHP</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Tue, 05 Mar 2024 23:38:23 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/introducao-aos-testes-unitarios-com-pest-em-php-4e6d</link>
      <guid>https://dev.to/brunobarros2093/introducao-aos-testes-unitarios-com-pest-em-php-4e6d</guid>
      <description>&lt;p&gt;Neste tutorial, vamos explorar os fundamentos dos testes unitários em PHP usando a biblioteca Pest. Pest é um framework de teste moderno, simples e elegante, que oferece uma sintaxe limpa e amigável para escrever testes. &lt;/p&gt;

&lt;p&gt;Pré-requisitos&lt;/p&gt;

&lt;p&gt;Antes de prosseguirmos, certifique-se de ter o seguinte instalado em sua máquina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP (versão mínima 7.3 ou superior)&lt;/li&gt;
&lt;li&gt;Composer (um gerenciador de dependências para PHP)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação do Pest
&lt;/h2&gt;

&lt;p&gt;Para instalar o Pest em seu projeto PHP, execute o seguinte comando no terminal:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;composer require pestphp/pest --dev&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração do Pest
&lt;/h2&gt;

&lt;p&gt;Após a instalação, crie um arquivo de configuração chamado pest.php na raiz do seu projeto. Aqui está um exemplo básico de configuração:&lt;br&gt;
&lt;/p&gt;

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

return [
    'paths' =&amp;gt; [
        'app',
    ],
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, estamos configurando o diretório de testes para app, onde os testes serão armazenados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escrevendo Testes
&lt;/h2&gt;

&lt;p&gt;Crie um diretório chamado tests na raiz do seu projeto. Dentro deste diretório, você pode começar a escrever seus testes.&lt;/p&gt;

&lt;p&gt;Vamos criar um teste simples para uma classe de exemplo. Crie um arquivo chamado &lt;strong&gt;ExampleTest.php&lt;/strong&gt; dentro do diretório tests com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

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

use App\Example; // Suponha que esta seja a classe que estamos testando

it('can instantiate Example', function () {
    $example = new Example();

    expect($example)-&amp;gt;toBeInstanceOf(Example::class);
});

it('can get the name', function () {
    $example = new Example();
    $name = $example-&amp;gt;getName();

    expect($name)-&amp;gt;toBe('Example');
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para executar: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;vendor/bin/pest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Isso iniciará a execução dos testes no diretório tests e mostrará o resultado no terminal.&lt;/p&gt;

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

&lt;p&gt;Este tutorial cobre os conceitos básicos dos testes unitários em PHP usando Pest. Recomenda-se explorar a documentação oficial do Pest para aprender mais sobre recursos avançados e boas práticas de teste.&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>O que é CI/CD</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Wed, 28 Dec 2022 00:34:32 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/o-que-e-cicd-8np</link>
      <guid>https://dev.to/brunobarros2093/o-que-e-cicd-8np</guid>
      <description>&lt;p&gt;CI/CD é uma abreviação para "Integração Contínua/Entrega Contínua". Trata-se de um conjunto de práticas e técnicas que visam automatizar e acelerar o processo de desenvolvimento de software, garantindo a entrega de novas versões de forma rápida e confiável.&lt;/p&gt;

&lt;p&gt;A Integração Contínua (CI, do inglês Continuous Integration) refere-se ao processo de integrar o código de desenvolvimento com a branch principal de um projeto de forma frequente, geralmente várias vezes ao dia. Isso permite detectar problemas de integração de código de forma rápida e resolvê-los de maneira eficiente.&lt;/p&gt;

&lt;p&gt;A Entrega Contínua (CD, do inglês Continuous Delivery) refere-se ao processo de entregar novas versões do software de forma rápida e confiável. Isso inclui a automatização de todas as etapas do processo de entrega, desde o &lt;strong&gt;build&lt;/strong&gt; e &lt;strong&gt;testes&lt;/strong&gt; até o d*&lt;em&gt;eploy em produção&lt;/em&gt;*.&lt;/p&gt;

&lt;p&gt;Em resumo, o CI/CD é uma abordagem que visa agilizar e automatizar o processo de desenvolvimento de software, garantindo a entrega de novas versões de forma rápida e confiável.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>[Básico] Teste unitários em Java</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Tue, 27 Dec 2022 14:19:14 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/teste-unitarios-em-java-42ci</link>
      <guid>https://dev.to/brunobarros2093/teste-unitarios-em-java-42ci</guid>
      <description>&lt;p&gt;Neste tutorial, explicarei como criar testes unitários em Java usando o framework de teste JUnit.&lt;/p&gt;

&lt;p&gt;Antes de começar, você precisará instalar o JUnit em seu ambiente de desenvolvimento. No Eclipse, por exemplo, você pode fazer isso clicando em "&lt;strong&gt;Help &amp;gt; Install New Software&lt;/strong&gt;" e procurando pelo "JUnit" na lista de opções. Você também pode adicionar o JUnit ao seu projeto usando o Maven ou o Gradle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/junit/junit --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt;
    &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para criar um teste unitário, você precisará criar uma classe de teste e adicionar um método de teste a ela. O método de teste deve ter a anotação "&lt;a class="mentioned-user" href="https://dev.to/test"&gt;@test&lt;/a&gt;" e deve ser um método público que não possui nenhum parâmetro de entrada. O método de teste deve conter as verificações que você deseja realizar para garantir que o seu código esteja funcionando corretamente.&lt;/p&gt;

&lt;p&gt;Por exemplo, imagine que você tenha uma classe chamada "Calculadora" com um método "somar" que recebe dois números inteiros e retorna a soma desses números. Você pode criar um teste unitário para essa classe da seguinte maneira:&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="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.junit.Test&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;junit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Assert&lt;/span&gt;&lt;span class="o"&gt;.*;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CalculadoraTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;testSomar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Calculadora&lt;/span&gt; &lt;span class="n"&gt;calc&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;Calculadora&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;somar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Neste exemplo, estamos criando uma nova instância da classe "Calculadora" e chamando o método "somar" com os valores 1 e 2. Em seguida, verificamos se o resultado é igual a 3 usando o método "assertEquals" do JUnit. Esse método recebe dois valores e verifica se eles são iguais. Se eles forem, o teste passará. Caso contrário, o teste falhará.&lt;/p&gt;

&lt;p&gt;Existem muitos outros recursos e técnicas que você pode usar ao escrever testes unitários em Java, mas este é um exemplo básico para começar. &lt;/p&gt;

&lt;p&gt;Para obter mais informações e outros Asserts, consulte a documentação do &lt;a href="https://junit.org/junit4/javadoc/4.13/org/junit/Assert.html" rel="noopener noreferrer"&gt;JUnit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;** post gerado por AI e revisado por mim.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>testing</category>
      <category>programming</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Chamada HTTP em Rust</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Sat, 24 Dec 2022 14:15:48 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/chamada-http-em-rust-4d9m</link>
      <guid>https://dev.to/brunobarros2093/chamada-http-em-rust-4d9m</guid>
      <description>&lt;p&gt;Para fazer uma chamada HTTP em Rust, você pode usar a biblioteca &lt;strong&gt;&lt;em&gt;reqwest&lt;/em&gt;&lt;/strong&gt;. Você pode adicioná-la como uma dependência no seu arquivo Cargo.toml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;reqwest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.10.8"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, você pode importá-la no seu código e usá-la para fazer uma chamada HTTP. Aqui está um exemplo de como fazer uma chamada GET simples para a URL "&lt;a href="https://www.example.com%22:" rel="noopener noreferrer"&gt;https://www.example.com":&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt; &lt;span class="n"&gt;reqwest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;reqwest&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://www.example.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Falha ao fazer a chamada HTTP"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Status: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="nf"&gt;.status&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="nf"&gt;.text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Falha ao ler o corpo da resposta"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Corpo: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Isso faz uma chamada GET para a URL "&lt;a href="https://www.example.com" rel="noopener noreferrer"&gt;https://www.example.com&lt;/a&gt;" e imprime o status da resposta e o corpo da resposta.&lt;/p&gt;

&lt;p&gt;Você também pode fazer chamadas HTTP usando outros métodos, como POST, PUT e DELETE. Aqui está um exemplo de como fazer uma chamada POST com um corpo de solicitação JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt; &lt;span class="n"&gt;reqwest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt; &lt;span class="n"&gt;serde_json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;serde_json&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;reqwest&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new_object&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nn"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"age"&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nn"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="nf"&gt;.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://www.example.com/api/users"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.send&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Falha ao fazer a chamada HTTP"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Status: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="nf"&gt;.status&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;*** post gerado via AI e revisado por mim.**&lt;/p&gt;

</description>
      <category>welcome</category>
      <category>ai</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Chamadas HTTP com Java</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Thu, 22 Dec 2022 01:18:44 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/chamadas-http-com-java-32k3</link>
      <guid>https://dev.to/brunobarros2093/chamadas-http-com-java-32k3</guid>
      <description>&lt;p&gt;Para fazer uma requisição HTTP em Java, você pode usar a classe &lt;strong&gt;HttpURLConnection&lt;/strong&gt; do pacote &lt;strong&gt;java.net&lt;/strong&gt;. Aqui está um exemplo de como enviar uma requisição GET simples e ler a resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Main {
  public static void main(String[] args) throws Exception {
    // Cria a URL da requisição
    URL url = new URL("http://www.example.com");

    // Cria a conexão HTTP
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    // Define o método da requisição como GET
    connection.setRequestMethod("GET");

    // Envia a requisição e armazena a resposta
    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String inputLine;
    StringBuilder response = new StringBuilder();
    while ((inputLine = in.readLine()) != null) {
      response.append(inputLine);
    }
    in.close();

    // Exibe a resposta
    System.out.println(response.toString());
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode adicionar cabeçalhos à sua requisição usando o método setRequestProperty. Por exemplo, para adicionar um cabeçalho "User-Agent" à sua requisição, você pode fazer o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;connection.setRequestProperty("User-Agent", "My Java App");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para enviar dados com a sua requisição, como um corpo de solicitação em uma requisição POST, você pode usar os métodos &lt;strong&gt;setDoOutput&lt;/strong&gt; e &lt;strong&gt;getOutputStream&lt;/strong&gt;. Aqui está um exemplo de como enviar um corpo de solicitação em uma requisição POST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Main {
  public static void main(String[] args) throws Exception {
    // Cria a URL da requisição
    URL url = new URL("http://www.example.com");

    // Cria a conexão HTTP
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    // Define o método da requisição como POST
    connection.setRequestMethod("POST");

    // Adiciona o cabeçalho "Content-Type" com o tipo de conteúdo do corpo de solicitação
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    // Ativa a opção de envio de dados com a requisição
    connection.setDoOutput(true);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;_ Este post foi gerado pelo chatgpd e revisado por mim._&lt;/p&gt;

</description>
      <category>git</category>
      <category>discuss</category>
    </item>
    <item>
      <title>[Basico] Utilizando threads em Java</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Thu, 22 Dec 2022 01:08:23 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/basico-utilizando-threads-em-java-l7k</link>
      <guid>https://dev.to/brunobarros2093/basico-utilizando-threads-em-java-l7k</guid>
      <description>&lt;p&gt;O Java permite que você crie threads para que seus programas possam fazer mais de uma coisa ao mesmo tempo. Isso é especialmente útil quando você precisa realizar tarefas que levam muito tempo, como acessar a Internet ou ler arquivos grandes.&lt;/p&gt;

&lt;p&gt;Para criar uma thread em Java, você deve criar uma classe que implemente a interface Runnable. Essa interface possui apenas um método: run(). Você deve implementar esse método para conter o código que a thread deve executar. Por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;public class MinhaThread implements Runnable {&lt;br&gt;
  public void run() {&lt;br&gt;
    // código da thread aqui&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Para iniciar uma thread, você deve criar uma instância da classe Thread e passar sua instância de Runnable como argumento para o construtor da classe Thread. Em seguida, chame o método start() da classe Thread para iniciar a execução da thread. Por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MinhaThread minhaThread = new MinhaThread();&lt;br&gt;
Thread thread = new Thread(minhaThread);&lt;br&gt;
thread.start();&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Você também pode criar uma thread anônima diretamente ao passar um novo Runnable como argumento para o construtor da classe Thread. Por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Thread thread = new Thread(new Runnable() {&lt;br&gt;
  public void run() {&lt;br&gt;
    // código da thread aqui&lt;br&gt;
  }&lt;br&gt;
});&lt;br&gt;
thread.start();&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Você também pode usar a classe Thread para criar uma thread extendendo-a e sobrescrevendo o método run(). Por exemplo:&lt;/p&gt;

&lt;p&gt;`public class MinhaThread extends Thread {&lt;br&gt;
  public void run() {&lt;br&gt;
    // código da thread aqui&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;MinhaThread minhaThread = new MinhaThread();&lt;br&gt;
minhaThread.start();&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Existem várias outras coisas que você pode fazer com threads, como alterar a prioridade da thread, aguardar a conclusão de uma thread ou interromper uma thread. &lt;/p&gt;

&lt;p&gt;Consulte a documentação da classe Thread para obter mais informações.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Este post foi gerado automaticamente pelo chatGPT.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>Diferença entre os GenerationTypes do Hibernate</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Sat, 08 Oct 2022 21:57:49 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/diferenca-entre-os-generationtypes-do-hibernate-fp0</link>
      <guid>https://dev.to/brunobarros2093/diferenca-entre-os-generationtypes-do-hibernate-fp0</guid>
      <description>&lt;p&gt;Questão de entrevista de emprego! &lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;IDENTITY&lt;/strong&gt;: Talvez o mais usado, quando utilizamos IDENTITY o Hibernate utilizará a geração AUTO_INCREMENT para SQL/MySQL, já para o Postgres faz uso do tipo SERIAL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SEQUENCE&lt;/strong&gt;: Se permitido pelo banco, utiliza sequencias (sequences) para gerar a chave primária, do contrário, automaticamente será utilizado o padrão TABLE. (&lt;a href="https://lnkd.in/d8x5_3bx" rel="noopener noreferrer"&gt;https://lnkd.in/d8x5_3bx&lt;/a&gt;) - podemos customizar esse generation com nome e valores da sequencia. Atualmente o generation type recomendado pelo Hibernate.&lt;/p&gt;

&lt;p&gt;Podemos definir o gerador das sequências através da anotação @SequenceGenerator&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AUTO&lt;/strong&gt;: Default. Se nenhum valor for especificado para o GenerationType, este será utilizado. A implementação definirá que estratégia utilizar. No caso do Hibernate com JPA, seria a SEQUENCE para Postgres e oracle e TABLE para MySQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TABLE&lt;/strong&gt;: Funciona em todos os bancos relacionais. Porém, quando fazemos uso dela o Hibernate precisa necessariamente uma outra tabela para gerar e guardar as chaves primárias. Por motivos de locks e lentidão ao escalar a aplicação, é bom evitar o uso de TABLE.&lt;/p&gt;

&lt;p&gt;Mais detalhes e fontes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lnkd.in/dXm6RV3i" rel="noopener noreferrer"&gt;https://lnkd.in/dXm6RV3i&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lnkd.in/dAnHUnMW" rel="noopener noreferrer"&gt;https://lnkd.in/dAnHUnMW&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>sql</category>
      <category>oracl</category>
    </item>
    <item>
      <title>Builder Pattern em PHP</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Thu, 08 Sep 2022 10:52:34 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/builder-pattern-em-php-3lc4</link>
      <guid>https://dev.to/brunobarros2093/builder-pattern-em-php-3lc4</guid>
      <description>&lt;p&gt;O padrão Builder tem como objetivo simplificar a criação de objetos que possuem caracteristicas &lt;strong&gt;parecidas&lt;/strong&gt;, mas valores diferentes em seus atributos e/ou diferentes implementações de métodos.&lt;/p&gt;

&lt;p&gt;O Builder encapsula a criação do objeto, ocultando os detalhes de criação, delegando a responsabilidade para outras classes (mais especificas) implementarem a lógica. &lt;/p&gt;

&lt;p&gt;Com o padrão de projeto Builder separamos a &lt;strong&gt;construção&lt;/strong&gt; do objeto de suas &lt;strong&gt;representações&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Situação problema - &lt;a href="https://www.casadocodigo.com.br/products/livro-design-paterns-php" rel="noopener noreferrer"&gt;Capítulo 5 do livro Design Patterns&lt;/a&gt;: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Atualmente, uma grande empresa que constrói nada menos do&lt;br&gt;
que foguetes espaciais teve a necessidade de um software para a gestão dos seus produtos, e você foi contratado para executar este serviço. O sistema basicamente permitiria o cadastro dos foguetes que a empresa disponibiliza.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Posteriormente, os foguetes previamente cadastrados passariam por diversas rotinas de teste através do mesmo sistema usado como catálogo para apresentação e venda.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cada foguete possui suas respectivas características: seu&lt;br&gt;
modelo, um tipo de motor, tanque de combustível, número de&lt;br&gt;
assentos para os tripulantes, entre uma infinidade de outras&lt;br&gt;
características específicas de cada modelo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Todos&lt;/strong&gt; os modelos dentro do sistema possuirão uma classe em comum, porém, &lt;strong&gt;os atributos de cada um são diferentes&lt;/strong&gt; e devem ser informados quando criamos cada um dos objetos que os representa. Por exemplo, um foguete Modelo I possui 3 motores, já o foguete Modelo II possui 5; ou seja, são características particulares de cada um. Além disso, temos uma série de outros atributos que definem suas representações.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Product&lt;/strong&gt;: objeto complexo construido pelo Builder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builder&lt;/strong&gt; (construtor): interface que serve de contrato das partes do Product &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concrete Builder&lt;/strong&gt;: implementação concreta que constrói o Product &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Director&lt;/strong&gt;: classe responsável por definir a construção dos objetos utilizando a interface Builder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Começamos definindo nosso objeto complexo:&lt;br&gt;
&lt;/p&gt;

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

// Objeto complexo que define um foguete
class FogueteProduct
{


    protected float $tanqueCombustivel;
    protected string $modelo;
    protected int $numeroMotores;
    protected int $numeroLugares;

    // getters e setters omitidos!!!

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

&lt;/div&gt;



&lt;p&gt;Em seguida, definimos nossa interface Builder através de uma classe abstrata:&lt;br&gt;
&lt;/p&gt;

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

// esta é a interface que será extendida pelas outras classes
abstract class FogueteBuilder
{
    // sempre que uma classe implementar o Builder, teremos uma instancia de um foguete pronto para uso
    protected FogueteProduct $foguete;

    public function __construct()
    {
        $this-&amp;gt;foguete = new FogueteProduct();
    }

    public function getFoguete():FogueteProduct
    {
        return $this-&amp;gt;foguete;
    }

    // métodos que serão implementados por outros foguetes, especificando seus atributos variados que os diferem
    abstract public function buildTanqueCombustivel(): void;
    abstract public function buildModelo(): void;
    abstract public function buildMotores(): void;
    abstract public function buildNumeroLugares(): void;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class FogueteModeloIBuilder extends \Builder\FogueteBuilder
{

    // Repare que já possuimos acesso a um objeto do tipo foguete
    public function buildTanqueCombustivel(): void
    {
        $this-&amp;gt;foguete-&amp;gt;setTanqueCombustivel(1313);
    }

    public function buildModelo(): void
    {
        $this-&amp;gt;foguete-&amp;gt;setModelo('Foguete tipo 1');
    }

    public function buildMotores(): void
    {
        $this-&amp;gt;foguete-&amp;gt;setNumeroMotores(4);
    }

    public function buildNumeroLugares(): void
    {
        $this-&amp;gt;foguete-&amp;gt;setNumeroLugares(13);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Importante: Já possuímos uma instância de um foguete, assim como os métodos para criação do mesmo SEM CONHECERMOS verdadeiramente como essa criação é feita.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Isso não importa para as classes que implementarão os modelos, o montador (builder) do foguete não precisa conhecer a criação de cada parte do foguete, apenas implementar a especificação daquele objeto.&lt;/p&gt;

&lt;p&gt;Se criarmos outro foguete, modelo 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class FogueteModeloIIBuilder extends \Builder\FogueteBuilder
{

    // Repare que já possuimos acesso a um objeto do tipo foguete
    public function buildTanqueCombustivel(): void
    {
        $this-&amp;gt;foguete-&amp;gt;setTanqueCombustivel(850);
    }

    public function buildModelo(): void
    {
        $this-&amp;gt;foguete-&amp;gt;setModelo('Foguete tipo 2');
    }

    public function buildMotores(): void
    {
        $this-&amp;gt;foguete-&amp;gt;setNumeroMotores(54);
    }

    public function buildNumeroLugares(): void
    {
        $this-&amp;gt;foguete-&amp;gt;setNumeroLugares(133);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui a classe abstrata FogueteBuilder, serve como interface. Ela é a garantia para a classe FabricaFoguetesDirector de que todas as classes Builder conterão os métodos que precisamos para montar um foguete. &lt;/p&gt;

&lt;p&gt;Na propriedade $construtorDeFoguetes, uma instância de FogueteBuilder, corresponde aos nossos construtores concretos (Concrete Builder).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Builder\FogueteProduct;

class FoguetesDirectorFabrica
{
    protected \Builder\FogueteBuilder $construtorDeFoguetes;

    public function __construct(\Builder\FogueteBuilder $construtorDeFoguetes) {
        $this-&amp;gt;construtorDeFoguetes = construtorDeFoguetes;
    }

    public function getFoguete(): FogueteProduct
    {
        return $this-&amp;gt;construtorDeFoguetes-&amp;gt;getFoguete();
    }
    public function construirFoguete(): void
    {
        $this-&amp;gt;construtorDeFoguetes-&amp;gt;buildModelo();
        $this-&amp;gt;construtorDeFoguetes-&amp;gt;buildMotores();
        $this-&amp;gt;construtorDeFoguetes-&amp;gt;buildTanqueCombustivel();
        $this-&amp;gt;construtorDeFoguetes-&amp;gt;buildNumeroLugares();
    }

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

&lt;/div&gt;



&lt;p&gt;Implementação no index:&lt;br&gt;
&lt;/p&gt;

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

use Builder\FogueteProduct;

// implementação
$montadoraDeFoguetesTestI = new Builder\FoguetesDirectorFabrica(new FogueteModeloIBuilder());
$montadoraDeFoguetesTestII = new Builder\FoguetesDirectorFabrica(new FogueteModeloIIBuilder());

print_r($montadoraDeFoguetesTestI);
print_r($montadoraDeFoguetesTestII);

$montadoraDeFoguetesTestI-&amp;gt;construirFoguete();
$montadoraDeFoguetesTestI-&amp;gt;getFoguete();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repare como a utilização em si do objeto é simplificada, este é o principal objetivo do padrão Builder. &lt;/p&gt;

&lt;p&gt;Utilizando-o abstraimos a lógica de criação dos objetos, delegando para classes mais especificas implementarem as diferenças de propriedades e métodos (modelos 1 e 2), desta forma, o objeto final instanciado não precisa saber 'como' ele é feito, apenas que deve fazer.&lt;/p&gt;

&lt;p&gt;Código do post: &lt;a href="https://github.com/bbwithpointers/design-patterns-php" rel="noopener noreferrer"&gt;https://github.com/bbwithpointers/design-patterns-php&lt;/a&gt; &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>php</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Prototype Pattern em PHP</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Wed, 07 Sep 2022 23:05:18 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/prototype-pattern-em-php-m4l</link>
      <guid>https://dev.to/brunobarros2093/prototype-pattern-em-php-m4l</guid>
      <description>&lt;p&gt;Neste padrão os objetos criados servem como uma espécie de protótipo, que serão clonados para a criação de novos objetos. Diferente dos demais padrões de criação, o Prototype utiliza o &lt;strong&gt;próprio&lt;/strong&gt; objeto para criar as novas instâncias em vez de usar classes auxiliares para fazer isso.&lt;/p&gt;

&lt;p&gt;Este padrão é indicado principalmente quando se quer criar&lt;br&gt;
cópias exatas de um objeto, incluindo seus atributos. Assim, temos um custo muito menor de memória do que instanciar o mesmo objeto muitas vezes.&lt;/p&gt;

&lt;p&gt;Imagine que uma livraria precisa 'assinar' o nome do comprador em cada capa de livro. Se fossemos por uma abordagem sem padrões, teriamos que instanciar um novo objeto a cada livro comprado, certo? &lt;/p&gt;

&lt;p&gt;Todo esse 'esforço'computacional somente parar alterar uma propriedade do objeto.&lt;/p&gt;

&lt;p&gt;Para isso, vamos utilizar o padrão Prototype que nos da uma solução muito mais leve para esse problema.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prototype&lt;/strong&gt;: classe abstrata que define o contrato a ser 'clonado'&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concrete Type&lt;/strong&gt;: classe concreta que implementa a Prototype.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client&lt;/strong&gt;: classes que fazem uso dos objetos. 
_
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LivroPrototype: 

/**
 * Livro Design Patterns PHP 7
 *  Pagina 73 
 * O objetivo desse padrão é definir alguns objetos que servem
 *como uma instância de protótipo, clonada para a criação de novos
 *objetos. Diferente dos demais padrões de criação, o Prototype
 *utiliza o próprio objeto para criar as novas instâncias em vez de
 *usar classes auxiliares para fazer isso.
 *Este padrão é indicado principalmente quando se quer criar
 *cópias exatas de um objeto, incluindo seus atributos. Assim, temos
 *um custo muito menor de memória do que instanciar o mesmo
 *objeto muitas vezes e, em cada uma dessas vezes, setar exatamente
 *os mesmos valores em suas propriedades. 
 */

namespace Prototype;

abstract class LivroPrototype
{
    protected string $titulo;
    // método mágico __clone() é chamaod quando clonamos uma classe com a palavra clone - de forma abstrata, a implementação deve ser feita nas subclasses
    abstract public function __clone();

    public function  getTitulo(): string
    {
        return $this-&amp;gt;titulo;
    }

    public function setTitulo(string $titulo) : LivroPrototype 
    {
        $this-&amp;gt;titulo = $titulo;
        return $this;
    }
}

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

&lt;/div&gt;


&lt;p&gt;A classe LivroPrototype representa o nosso protótipo. Ela&lt;br&gt;
estende da classe abstrata LivroPrototype , herdando assim suas propriedades e 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;class LivroPhpPrototype extends LivroPrototype
{
    public function __construct()
    {
        $this-&amp;gt;setTitulo("Livro PHP");
    }

    public function __clone()
    {
        echo "Livro PHP Clonado\n";
    }
}

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

&lt;/div&gt;



&lt;p&gt;Abaixo, o código dos clientes:&lt;br&gt;
&lt;/p&gt;

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

$compradores = ['Gabriel', 'Anderson', 'Bruno'];

$livroPhp = new LivroPhpPrototype();
$livroPhp-&amp;gt;setTitulo("Padroes de projeto em PHP");
print_r($livroPhp);

// criando vários clones 

$livros = [];
foreach($compradores as $nomeComprador)
{
    $livroComprador = clone $livroPhp;
    $livroComprador-&amp;gt;setNome($nomeComprador);
    $livros[] = $livroComprador; 
}
print_r($livros);

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

&lt;/div&gt;



&lt;p&gt;Com isso, a nossa livraria agora pode gerar centenas de livros com assinatura, consumindo muito menos memória que uma solução sem o prototype. &lt;/p&gt;

&lt;p&gt;É importante observar que no ultimo loop, estamos trabalhando sempre com um clone do objeto já instanciado, motificando apenas o nome que seria 'assinado' no livro.&lt;/p&gt;

&lt;p&gt;Repositório com código: &lt;a href="https://github.com/bbwithpointers/design-patterns-php" rel="noopener noreferrer"&gt;https://github.com/bbwithpointers/design-patterns-php&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Factory Method com PHP</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Wed, 07 Sep 2022 00:16:59 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/factory-method-com-php-34dn</link>
      <guid>https://dev.to/brunobarros2093/factory-method-com-php-34dn</guid>
      <description>&lt;p&gt;No padrão Factory Method, temos uma interface que implementará o 'básico' que seus objetos deverão possuir. &lt;/p&gt;

&lt;p&gt;Este é mais um padrão de projeto do GOF, onde programamos voltados a interface, deixando a responsabilidade de implementação especificos para cada objeto particular.&lt;/p&gt;

&lt;p&gt;Um exemplo prático seria definirmos tipos de pagamentos, existem infinitos tipos e formas de realizarmos um pagamento, mas podemos resumi-los a alguns itens em comum: &lt;/p&gt;

&lt;p&gt;Todo pagamento tem um valor, a moeda (dólar, real), juros, parcelamento etc. Poderiamos ter então uma PagamentoProduct com esses métodos, e cada forma de pagamento deverá implementar esses métodos e definir suas regras. &lt;/p&gt;

&lt;p&gt;A 'programação voltada a interfaces'é muito utilizado em Golang, onde para podermos testar os objetos, precisamos primeiro de uma interface que modele o comportamento do mesmo. &lt;/p&gt;

&lt;p&gt;CarroProduct.php:&lt;br&gt;
&lt;/p&gt;

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

namespace FactoryMethod\Product;

// Todos os subprodutos de um carro, precisam implementar os métodos desta interface
interface CarroProduct
{
    public function acelerar(): void;
    public function frear(): void;
    public function trocarMarcha(): void;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro deste arquivo, para diminuir o número de arquivos, eu criei 2 classes diferentes que implementam nossa interface: TeslaModel e Fusca. Este dois são nossos objetos 'concretos' que implementam o modelo (interface).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Concrete product, ou seja, um objeto concreto que implementa a interface
class TeslaModel implements CarroProduct
{
    public function acelerar(): void
    {
        echo "Tesla acelerando\n";
    }

    public function frear(): void
    {
        echo "Tesla freando\n";
    }

    public function trocarMarcha(): void
    {
        echo "Tesla trocando marcha";
    }
}

// Concrete product, ou seja, um objeto concreto que implementa a interface
class Fusca implements CarroProduct
{
    public function acelerar(): void
    {
        echo "Fusca acelerando\n";
    }

    public function frear(): void
    {
        echo "Fusca freando\n";
    }

    public function trocarMarcha(): void
    {
        echo "Fusca trocando marcha";
    }
}

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

&lt;/div&gt;



&lt;p&gt;Agora, criamos outra interface, desta vez a que será responsável pelo controle de criação dos nossos objetos, ou seja, a interface responsável por definir nossa fábrica.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CarroFactory.php:

&amp;lt;?php

use FactoryMethod\Product\CarroProduct;

// A carro factory, permite que a gente crie qualquer objeto concreto que implemente a interface CarroProduct
interface CarroFactory 
{
    public function criarCarro(string $modeloDoCarro) : CarroProduct;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Faremos uso da classe CarroProduct acima, já que nossa Factory (fábrica) será responsável por criar objetos do tipo CarroProduct, ou seja, qualquer classe que implementar nossa interface. &lt;/p&gt;

&lt;p&gt;Agora, criaremos 2 classes FuscaFactory e TeslaFactory, que serão as classes responsáveis por criar nosso Fusca e nosso Tesla.&lt;br&gt;
&lt;/p&gt;

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

use FactoryMethod\Product\CarroProduct;
use FactoryMethod\Product\Fusca;

class FuscaFactory implements CarroFactory 
{
    public function criarCarro(string $modeloDoCarro): CarroProduct
    {
        if ($modeloDoCarro == "fusca")
        {
            return new Fusca();
        } else {
            throw new Exception("Modelo de carro invalido!");
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente, nosso index:&lt;br&gt;
&lt;/p&gt;

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

/**
 * 
 * No padrão Factory Method, temos uma interface que define
 *um contrato para os objetos a serem criados pelas fábricas, que
 *seriam nossos produtos finais. Também temos uma interface que
 *define como nossas classes-fábrica deverão ser construídas.
 * 
 * 
 */

 $teslaFactory = new TeslaFactory();
 $fuscaFactory = new FuscaFactory();

 try 
 {
    $teslas = $teslaFactory-&amp;gt;criarCarro('modeloX');
 } 
 catch(Exception $e)
 { 
    echo $e-&amp;gt;getMessage();
 }

 $teslas-&amp;gt;acelerar();
 $teslas-&amp;gt;trocarMarcha();
 $teslas-&amp;gt;frear();

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

&lt;/div&gt;



&lt;p&gt;Resumidamente, o método fábrica é muito util quando precisamos criar vários objetos que terão comportamentos similares. Claro que aqui foi um exemplo não tão prático, mas por exemplo, se fosse uma montadora de automóveis real, imagine quantos modelos de carro existem.&lt;/p&gt;

</description>
      <category>php</category>
      <category>programming</category>
      <category>webdev</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Padrão Singleton com PHP</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Tue, 06 Sep 2022 00:10:58 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/padrao-singleton-com-php-2m4a</link>
      <guid>https://dev.to/brunobarros2093/padrao-singleton-com-php-2m4a</guid>
      <description>&lt;p&gt;O padrão singleton tem como finalidade centralizar a criação de um objeto, mantendo o vivo durante todo o ciclo de execução.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SINGLETON, O ANTI-PATTERN&lt;br&gt;
Para muitos, o padrão Singleton é considerado um anti-&lt;br&gt;
pattern por conta do seu uso em forma estática (chamando a&lt;br&gt;
classe sem precisar instanciá-la) e, principalmente, pelo&lt;br&gt;
acesso global à instância da classe. Os problemas de utilizar&lt;br&gt;
classes estáticas são vários: não podemos trabalhar com&lt;br&gt;
interfaces, nosso código fica com um acoplamento mais alto,&lt;br&gt;
entre outros.&lt;br&gt;
(quote do livro: Design pattern com PHP 7 - página 43.) &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dito isso, o singleton ainda é muito utilizado no mercado quando precisamos de uma instância unica. &lt;/p&gt;

&lt;p&gt;Com esse controle, impedimos a criação descontralada de instancias de classes. Este padrão é muito utilizado quando estamos lidando com classes/frameworks de logs.&lt;br&gt;
&lt;/p&gt;

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

namespace Singleton; 

class LogsSingleton 
{

    /** @var self $singleton instância da classe de logs. */
    protected static LogsSingleton $instancia;

    /** os métodos construtor, clone e wake up precisam ser privados, para que a classe só seja criado via método getInstancia */
    private function __construct()
    {

    }
    private function __clone()
    {

    }
    private function __wakeup()
    {

    }

    public static function getInstancia() : self 
    { 
        // self =&amp;gt; se refere a própria classe 
        // Se a instancia estiver vazia, nenhuma classe foi criada ainda 
        if (empty(self::$instancia))
        {
            self::$instancia = new self();
        }
        return self::$instancia;
    }

    /** function para gravar dados em um arquivo de texto, simulando log */
    public function gravarLog(array $dados):void 
    {
        $nomeArquivo = 'logs.txt';

        $logsAnteriores = [];

        if (filesize($nomeArquivo) &amp;gt; 0)
        {
            $conteudoArquivo = file_get_contents($nomeArquivo);
            // com esse array vazio, impedimos erros casos o arquivo inicial esteja vazio
            $logsAnteriores = json_decode($conteudoArquivo, true);
        }
        $logsAnteriores[] = $dados;
        // escreve no arquivo 
        $arquivo = fopen($nomeArquivo, 'w');
        fwrite($arquivo, json_encode($logsAnteriores));
        fclose($arquivo);
    }
}

$instanciaLogs = LogsSingleton::getInstancia();
print_r($instanciaLogs);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criamos a propriedade $instancia de forma estática, já que ela será responsável por garantir o acesso único a instância da classe. Os métodos mágicas __construct, __wakeup e __clone estão privados para impedir que sejam chamados e criem instâncias da classe. &lt;/p&gt;

&lt;p&gt;Se tentarmos criar uma instância desta classe, sem utilizar o método getInstancia(), teremos um fatal error. &lt;/p&gt;

&lt;p&gt;Testando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
$instancia = LogsSingleton::getInstancia();
$instanciaNova = LogsSingleton::getInstancia(); 

if ($instancia === $instanciaNova) 
{ 
 echo "são iguais";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>php</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Fix: tailwind not working on Laravel 9 with Vite</title>
      <dc:creator>Bruno Barros</dc:creator>
      <pubDate>Sun, 04 Sep 2022 01:06:52 +0000</pubDate>
      <link>https://dev.to/brunobarros2093/fix-tailwind-not-working-on-laravel-9-with-vite-2869</link>
      <guid>https://dev.to/brunobarros2093/fix-tailwind-not-working-on-laravel-9-with-vite-2869</guid>
      <description>&lt;p&gt;If you having trouble loading your tailwind styles and everything looks fine. &lt;/p&gt;

&lt;p&gt;Try to add &lt;strong&gt;this line&lt;/strong&gt; on your vite.config.js, it solve the problem for me. &lt;/p&gt;

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

&lt;p&gt;This error happens when Vite doenst recognize the localhost as a server/host. &lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>tailwindcss</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
