<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: André Sousa</title>
    <description>The latest articles on Forem by André Sousa (@andredss99).</description>
    <link>https://forem.com/andredss99</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%2F818458%2Fe6431fff-3b03-400a-8fe1-09fcc4f9dd8a.jpeg</url>
      <title>Forem: André Sousa</title>
      <link>https://forem.com/andredss99</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/andredss99"/>
    <language>en</language>
    <item>
      <title>[PHP] - Desafio Alura - 7 Days of Code - Dia 2</title>
      <dc:creator>André Sousa</dc:creator>
      <pubDate>Fri, 02 Jun 2023 17:08:41 +0000</pubDate>
      <link>https://forem.com/andredss99/php-desafio-alura-7-days-of-code-dia-2-i27</link>
      <guid>https://forem.com/andredss99/php-desafio-alura-7-days-of-code-dia-2-i27</guid>
      <description>&lt;p&gt;No post anterior, falamos um pouco sobre a iniciativa &lt;strong&gt;7 Days of Code&lt;/strong&gt; e também foi dada uma visão geral sobre o desafio de PHP, bem como a estrutura geral do projeto com o qual estamos trabalhando.&lt;/p&gt;

&lt;p&gt;Por enquanto, o código não está grande, porém, se não tomarmos cuidado, ele terá cada vez mais dívidas técnicas, causadas pela falta de boas práticas. Devemos nos atentar a isso, além de cumprir o desafio do dia. Dito isso...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bora pro segundo dia!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nossa segunda tarefa é bem simples: criar uma função que salve os dados dos usuários vindos do formulário de registro.&lt;/p&gt;

&lt;p&gt;Os usuários cadastrados ficarão salvos em &lt;strong&gt;data/users.json&lt;/strong&gt;. A extensão do arquivo já nos dá uma dica de funções que serão úteis para persistirmos os dados, como &lt;a href="https://www.php.net/manual/en/function.json-encode.php"&gt;&lt;code&gt;json_encode&lt;/code&gt;&lt;/a&gt; e &lt;a href="https://www.php.net/manual/en/function.json-decode.php"&gt;&lt;code&gt;json_decode&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para isso, um novo arquivo foi criado: &lt;strong&gt;crud.php&lt;/strong&gt;. Nele, implementei duas funções: a primeira, pega os dados vindos da requisição POST, insere no registro de usuários e grava os dados no arquivo.&lt;/p&gt;

&lt;p&gt;A segunda função serve apenas para retornar a lista de usuários devidamente formatada (como array) para que possamos manipula-la mais facilmente, e também por ser uma funcionalidade que, provavelmente, será utilizada mais vezes. Dessa forma, evitamos a repetição de código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;crud.php

&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;crudCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$usersList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getUsersList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nv"&gt;$usersList&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;$usersList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$usersList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DATA_LOCATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$usersList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getUsersList&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DATA_LOCATION&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outra alteração necessária foi no &lt;strong&gt;controller.php&lt;/strong&gt;, mais especificamente na função &lt;code&gt;doRegister()&lt;/code&gt;. Nele, eu precisei criar uma verificação para quando chegasse uma requisição via POST. Neste caso, o sistema deve realizar o registro do usuário e voltar para a tela de login. Caso contrário, ou seja, se for uma requisição via GET, deve apenas exibir a tela de registro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;doRegister&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'person'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;crudCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'person'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Location: /?page=login'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;renderView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'register'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, finalizamos o segundo dia do desafio! Até a próxima!&lt;/p&gt;

</description>
      <category>php</category>
      <category>challenge</category>
    </item>
    <item>
      <title>[PHP] - Desafio Alura - 7 Days of Code - Dia 1</title>
      <dc:creator>André Sousa</dc:creator>
      <pubDate>Thu, 01 Jun 2023 18:07:33 +0000</pubDate>
      <link>https://forem.com/andredss99/php-desafio-alura-7-days-of-code-dia-1-4mo4</link>
      <guid>https://forem.com/andredss99/php-desafio-alura-7-days-of-code-dia-1-4mo4</guid>
      <description>&lt;p&gt;Nesta série de posts, vou apresentar a vocês minha trajetória durante a execução do desafio de PHP &lt;strong&gt;7 Days of Code&lt;/strong&gt;, uma iniciativa da Alura.&lt;/p&gt;

&lt;p&gt;Tais desafios consistem da apresentação de um problema inicial que, geralmente, é uma simulação de uma demanda do mundo real. A cada dia, nós devemos cuidar de uma parte específica do projeto, implementando uma funcionalidade nova, resolvendo algum problema, ou os dois.&lt;/p&gt;

&lt;p&gt;Para falar do primeiro dia, antes vou comentar brevemente sobre a estrutura inicial do projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── boot.php
├── config.php
├── 📁 data
│   └── users.json
├── index.php
├── 📁 resource
├── routes.php
├── 📁 view
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;boot.php&lt;/strong&gt;: Carrega os arquivos necessários para a execução do projeto;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;config.php&lt;/strong&gt;: Declaração de constantes;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;data/users.json&lt;/strong&gt;: Nosso "banco de dados" local;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;index.php&lt;/strong&gt;: Ponto inicial do projeto;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resource/&lt;/strong&gt;: Arquivos de imagem e de estilização;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;routes.php&lt;/strong&gt;: Chama a função específica do Controller (a ser implementado) de acordo com a página solicitada;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;view/&lt;/strong&gt;: Contém todos os arquivos de template, os quais serão mostrados de acordo com a rota acessada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tarefa do primeiro dia consistiu apenas em separar a responsabilidade do arquivo &lt;strong&gt;routes.php&lt;/strong&gt; que, além de checar qual página estava sendo requisitada, também mostrava o template correspondente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;routes.php

&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'page'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;??&lt;/span&gt;&lt;span class="s1"&gt;'login'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'.view'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;VIEW_FOLDER&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$page&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, foi requisitada a criação de dois arquivos: &lt;strong&gt;controller.php&lt;/strong&gt; e &lt;strong&gt;view.php&lt;/strong&gt;. O Controller abriga as funções que serão chamadas pelo arquivo de rotas e executadas de acordo com a página solicitada. Já a View contém a função responsável pela exibição do conteúdo em tela de acordo com  o template solicitado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;controller.php

&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;doRegister&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;renderView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'register'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;doLogin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;renderView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'login'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;doNotFound&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;renderView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'not_found'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;view.php

&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;renderView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$template&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;VIEW_FOLDER&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$template&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'.view'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$content&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;A refatoração em &lt;strong&gt;routes.php&lt;/strong&gt; consistiu em criar um &lt;code&gt;switch&lt;/code&gt; para a variável &lt;code&gt;$page&lt;/code&gt;. Dessa forma, eu posso &lt;strong&gt;controlar&lt;/strong&gt; melhor o que fazer em cada caso, além de melhorar a leitura do código. Também retirei as linhas de código que mostravam o conteúdo na tela e joguei para &lt;strong&gt;view.php&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;routes.php depois da refatoração

&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'page'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;'login'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'login'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;doLogin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'register'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;doRegister&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;doNotFound&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;break&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;Dessa forma, concluímos o primeiro dia do desafio. Nada muito complicado, porém ainda há muitas funcionalidades e melhorias a serem implementadas. Te vejo na próxima ou nos comentários!&lt;/p&gt;

</description>
      <category>php</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Configurando um ambiente de desenvolvimento no Ubuntu 22.04</title>
      <dc:creator>André Sousa</dc:creator>
      <pubDate>Wed, 01 Mar 2023 19:34:58 +0000</pubDate>
      <link>https://forem.com/andredss99/configurando-um-ambiente-de-desenvolvimento-no-ubuntu-2204-12ej</link>
      <guid>https://forem.com/andredss99/configurando-um-ambiente-de-desenvolvimento-no-ubuntu-2204-12ej</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;&lt;br&gt;
Neste artigo, eu mostro meu processo para instalação e configuração do meu ambiente de desenvolvimento web logo após uma instalação limpa do Ubuntu 22.04.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;Começando&lt;/li&gt;
&lt;li&gt;Configurando o Git&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;PHPStorm&lt;/li&gt;
&lt;li&gt;
Instalando a pilha LAMP (Apache, MySQL e PHP)

&lt;ul&gt;
&lt;li&gt;Apache&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;NodeJS&lt;/li&gt;
&lt;li&gt;
Bônus: Hyper Terminal e Oh-My-Zsh

&lt;ul&gt;
&lt;li&gt;Hyper&lt;/li&gt;
&lt;li&gt;Oh My Zsh&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Finalmente tomei coragem e instalei o Ubuntu 22.04 na minha máquina. O problema em si não é formatar o PC, mas sim ter que configurar todo o ambiente depois da instalação limpa, principalmente para quem programa.&lt;/p&gt;

&lt;p&gt;Dessa forma, decidi criar este artigo como uma espécie de roteiro com todas as aplicações e/ou pacotes a serem instalados (e como instalá-los) para que, das próximas vezes, este processo tome o menor tempo possível. E, claro, se ajudar alguém que estiver lendo este artigo, ficarei muito feliz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Começando
&lt;/h2&gt;

&lt;p&gt;Primeiro de tudo, atualize o gerenciador de pacotes e instale aqueles mais básicos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get install curl unzip git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Crie também uma pasta &lt;code&gt;Apps/&lt;/code&gt; na sua pasta pessoal. Nela, iremos guardar todos os arquivos do tipo &lt;code&gt;AppImage&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ ~/mkdir Apps&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o Git
&lt;/h2&gt;

&lt;p&gt;A configuração inicial e mais básica do Git é dada pelo seu nome e email:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git config --global user.name "Meu Nome"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git config --global user.email "meu@email.com"&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Visual Studio Code
&lt;/h2&gt;

&lt;p&gt;Vá até a &lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;página de download do VSCode&lt;/a&gt; e escolha a opção &lt;strong&gt;.deb&lt;/strong&gt;. Após a finalização do download, entre no terminal, navegue até a pasta em que o arquivo se encontra e o instale com o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo dpkg -i nome_do_arquivo.deb&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  PHPStorm
&lt;/h2&gt;

&lt;p&gt;Vá até a &lt;a href="https://www.jetbrains.com/pt-br/phpstorm/" rel="noopener noreferrer"&gt;página de download do PHPStorm&lt;/a&gt; e baixe o arquivo.&lt;/p&gt;

&lt;p&gt;O processo de instalação do PHPStorm é um pouco diferente, mas nós criamos a pasta &lt;code&gt;Apps/&lt;/code&gt; exatamente para este momento. Execute a seguinte sequência de comandos (em seguida eu explico o que cada um deles faz):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#1&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;PhpStorm-2022.3.2.tar.gz ~/Apps

&lt;span class="c"&gt;#2&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-zxf&lt;/span&gt; PhpStorm-2022.3.2.tar.gz

&lt;span class="c"&gt;#3&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;rm &lt;/span&gt;PhpStorm-2022.3.2.tar.gz

&lt;span class="c"&gt;#4&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;./PhpStorm-2022.3.2/bin/phpstorm.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Move o arquivo compactado para dentro de &lt;code&gt;Apps/&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Extrai a pasta do PHPStorm de dentro do arquivo compactado;&lt;/li&gt;
&lt;li&gt;Remove o arquivo compactado. Não precisaremos dele mais;&lt;/li&gt;
&lt;li&gt;Executa o script que inicia o programa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neste momento, você provavelmente está com o PHPStorm aberto. Para que não seja necessário ir até a pasta raíz toda vez que você for iniciar a IDE, temos duas opções:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Na barra de ferramentas vá até Tools &amp;gt; Create Command-line Launcher. O programa indicar o caminho em que o script será criado. Você pode definir o nome que você quiser em vez do nome sugerido pela IDE, por exemplo &lt;code&gt;/usr/local/bin/phpstorm&lt;/code&gt; em vez de &lt;code&gt;/usr/local/bin/pstorm&lt;/code&gt;, como sugerido;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ou então, ir até Tools &amp;gt; Create Desktop Entry. Dessa forma, o PHPStorm ficará disponível no menu de aplicativos do Ubuntu, e então você poderá fixá-lo na Dock.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Instalando a pilha LAMP (Apache, MySQL e PHP)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apache
&lt;/h3&gt;

&lt;p&gt;O próximo passo é instalar o servidor web Apache para que possamos desenvolver as aplicações em PHP. Muito simples:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt-get install apache2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Quando a instalação tiver finalizado, acesse o endereço &lt;code&gt;localhost&lt;/code&gt; no navegado. Se você vir essa página, é porque deu tudo certo:&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%2F5324w6l6qtneopnl9vx5.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%2F5324w6l6qtneopnl9vx5.png" alt="Servidor web Apache configurado"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso ainda não tenha dado certo, pode ser que o serviço do Apache não tenha sido inicializado. Neste caso, execute o seguinte comando e verifique o navegador novamente:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo service apache2 start&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PHP
&lt;/h3&gt;

&lt;p&gt;Para instalar o PHP, o pacote &lt;code&gt;php-cli&lt;/code&gt; já basta. Porém, para desenvolvermos aplicações, precisaremos de alguns pacotes adicionais:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt-get install php-cli php-xdebug php-curl php-mbstring php-json php-mysql&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  MySQL
&lt;/h3&gt;

&lt;p&gt;A instalação do MySQL é mais simples, basta um único pacote:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ sudo apt-get install mysql-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para mais detalhes sobre a configuração do MySQL, recomendo este &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04" rel="noopener noreferrer"&gt;tutorial da Digital Ocean&lt;/a&gt;. Ele está bem completo em relação à parte de criação de usuário e segurança da instalação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker
&lt;/h2&gt;

&lt;p&gt;Essa instalação compreende tanto o Docker Engine, quanto o Docker Compose. Adicione a chave GPG do repositório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/docker.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione o repositório do Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atualize o gerenciador de pacotes e instale os pacotes do Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, é necessário que você adicione seu usuário ao grupo do Docker para não precisar utilizar o &lt;code&gt;sudo&lt;/code&gt; sempre que for executar algum comando Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;

newgrp docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  NodeJS
&lt;/h2&gt;

&lt;p&gt;Para instalar o NodeJS completo, precisamos, primeiramente, do nvm (Node Version Manager):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, instale a última versão LTS do NodeJS:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nvm install --stable&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bônus: Hyper Terminal e Oh-My-Zsh
&lt;/h2&gt;

&lt;p&gt;Tendo concluído os passos anteriores, a configuração do nosso ambiente de desenvolvimento, no geral, está pronta. Este passo é opcional, visto que não é essencial para o desenvolvimento, mas pode nos trazer algumas funcionalidades novas e, claro, uma aparência mais agradável ao terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hyper
&lt;/h3&gt;

&lt;p&gt;Para baixar o Hyper, acesse &lt;a href="https://releases.hyper.is/download/AppImage" rel="noopener noreferrer"&gt;este link&lt;/a&gt;. Assim como fizemos com o PHPStorm, mova o arquivo &lt;code&gt;AppImage&lt;/code&gt; para &lt;code&gt;~/Apps&lt;/code&gt;. No meu caso, alterei o atalho de teclado nas configurações para executar o arquivo do Hyper ao invés do terminal:&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%2Fxs2wxxu0r28sydiurvea.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%2Fxs2wxxu0r28sydiurvea.png" alt="Atribuindo um atalho de teclado para o Hyper"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Oh-My-Zsh
&lt;/h3&gt;

&lt;p&gt;O Oh My Zsh é um framework para o &lt;strong&gt;zsh&lt;/strong&gt;, que por sua vez, é uma alternativa ao terminal bash padrão. Esse framework serve, basicamente, para gerenciar as configurações do zsh. Com isso, podemos instalar plugins e temas facilmente no terminal.&lt;/p&gt;

&lt;p&gt;Primeiro, faça o download do zsh:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get install zsh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Depois, torne ele seu terminal padrão:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chsh -s $(which zsh)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para as alterações surtirem efeito, encerre sua sessão e relogue no sistema. Após isso, a saída para o comando &lt;code&gt;echo $SHELL&lt;/code&gt; deverá ser &lt;code&gt;/usr/bin/zsh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Finalmente, para instalar o Oh My Zsh, basta rodar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Talvez este passo-a-passo tenha ficado um pouco grande, mas certamente levarei menos tempo para instalar tudo na próxima vez do que levei para escrever aqui! Espero que te ajude de alguma forma também e, se tiver alguma dúvida ou sugestão, não deixe de comentar. Ficarei feliz em responder!&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>linux</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
