<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[sysvale - Medium]]></title>
        <description><![CDATA[Writing code and stories. - Medium]]></description>
        <link>https://medium.com/sysvale?source=rss----4280bac0b2f3---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>sysvale - Medium</title>
            <link>https://medium.com/sysvale?source=rss----4280bac0b2f3---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 11 Nov 2026 21:26:30 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/sysvale" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[A relevância do desenvolvimento contínuo de um código limpo]]></title>
            <link>https://medium.com/sysvale/a-relev%C3%A2ncia-do-desenvolvimento-cont%C3%ADnuo-de-um-c%C3%B3digo-limpo-584f42655f27?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/584f42655f27</guid>
            <dc:creator><![CDATA[Gilmara Alves de Castro]]></dc:creator>
            <pubDate>Mon, 11 Sep 2023 12:09:29 GMT</pubDate>
            <atom:updated>2023-09-11T12:09:29.311Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YFatvxAl8vdMeiqK0FnF5A.jpeg" /></figure><p>Com as tecnologias que constituem o cenário da programação em constante evolução, falar sobre boas práticas no desenvolvimento e manutenção de um software se torna cada vez mais relevante. Em um cenário como o atual, que aprecia a velocidade e a agilidade nas entregas das soluções tecnológicas, pode parece tentador sacrificar a clareza e organização do código em prol de uma entrega cada vez mais rápida. Entretanto, nessa corrida incessante, a importância de se ter um código limpo se mantém inalterada.</p><p>Apesar das ferramentas tecnológicas alterarem constantemente, o conceito do que pode ser um código limpo é atemporal, criar um código limpo não é em vão, considerando que ele é a base para se ter sistemas robustos e com fácil manutenção. Diante disso, existem alguns livros que abordam esse tema, dos quais trago aqui o livro: <strong>Código Limpo: Habilidades Práticas do Agile Software.</strong></p><p>Este livro foi escrito por Robert C. Martin, também conhecido como o famoso Uncle Bob (Tio Bob), que aborda preocupações, princípios, práticas e padrões para garantir a existência de um código limpo no desenvolvimento de sistemas.</p><p>O livro inicia abordando o conceito do que é um código limpo. Traz definições segundo alguns autores, como o Bjarne Stroustrup, que também foi o criador do C++, ele afirma que:</p><blockquote>A lógica de um código limpo deve ser direta para dificultar o encobrimento de bugs, as dependências devem ser minimas para facilitar a manutenção e finaliza enfatizando que o código limpo faz bem uma única coisa.</blockquote><p>Um conceito que combina com todas as definições propostas e se alinha perfeitamente com a abordagem do livro é que o código para ser limpo, ele precisa ser feito por alguém que se importa.</p><p>Para o autor existem várias formas de se importar com o código e ele traz isso a partir de exemplos e práticas ao longo dos seguintes temas:</p><ul><li><strong>Nomes significativos</strong> — Como criar nomes de variáveis, funções, parâmetros, classes entre outros que dê significado ao que está sendo proposto.</li><li><strong>Funções</strong> — Destaca que elas são a primeira linha de organização em qualquer programa e da ênfase em como podem ser melhor descritas.</li><li><strong>Formatação</strong> — Traz a importância da boa impressão que é causada quando se tem um código polido.</li><li><strong>Objetos e estruturas de dados</strong> — Aborda questionamentos sobre a utilização de métodos que expõe suas variáveis como se fossem públicas.</li><li><strong>Tratamento de erros</strong> — Ressalta técnicas e considerações para criar um código que seja limpo e robusto e ainda assim, trate erros com elegância e estilo.</li><li><strong>Limites</strong> — Apresenta técnicas para manter limpo os limites do software mesmo integrando com sistemas externos.</li><li><strong>Classes</strong> — Exemplifica e discute sobre como deixar uma classe limpa.</li><li><strong>Sistemas</strong> — Usa de analogias para facilitar o entendimento e aplicação dentro do desenvolvimento.</li></ul><p>Além disso, ainda fala sobre <strong>emergência</strong>, <strong>concorrência</strong>, <strong>refinamento</strong>, <strong>JUnit</strong>, <strong>refatoramento</strong>, <strong>odores e heurísticas</strong> e muitos casos com exemplos práticos e análises específicas de uso.</p><p>Este livro não é um livro para se ler uma única vez e deixá-lo de lado, é um livro de cabeceira que vale a pena ser revisitado vez ou outra. O autor usa a linguagem em java para explorar cada exemplo mostrado, mas pode facilmente ser entendido e aplicado em outras linguagens.</p><p>Também vale destacar que o livro contempla várias fases do desenvolvimento de um software e da vida profissional do desenvolvedor, isso significa que os conceitos ali contidos vão com certeza acrescentar na vida de qualquer profissional, independente da sua experiência.</p><p>Você já leu esse livro? Se sim, qual capítulo mais te cativou? E por quê?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=584f42655f27" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/a-relev%C3%A2ncia-do-desenvolvimento-cont%C3%ADnuo-de-um-c%C3%B3digo-limpo-584f42655f27">A relevância do desenvolvimento contínuo de um código limpo</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Fazendo um CRUD e conhecendo o Laravel]]></title>
            <link>https://medium.com/sysvale/fazendo-um-crud-e-conhecendo-o-laravel-cd2b0a137c62?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/cd2b0a137c62</guid>
            <category><![CDATA[crud]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[php]]></category>
            <dc:creator><![CDATA[Hosana Barcelos]]></dc:creator>
            <pubDate>Fri, 02 Jun 2023 18:10:14 GMT</pubDate>
            <atom:updated>2023-08-29T18:38:25.145Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vkiwtRtwXCt9Ctr4nCaSOg.png" /></figure><blockquote>Laravel é um framework PHP livre e open-source criado para o desenvolvimento de sistemas web que utilizam o padrão MVC e tem como principal característica, ajudar a desenvolver aplicações seguras e performáticas de forma rápida, com código limpo e simples.</blockquote><p>Oi! Me chamo Hosana Barcelos e sou Desenvolvedora na <a href="https://sysvale.com/">Sysvale Softgroup</a>. Esse artigo tem como objetivo mostrar como foi minha experiência com o Framework Laravel. Bora embarcar nessa viagem espacial?</p><p>Por diversas vezes passei olhando alguns arquivos PHP usando o Laravel e sempre saia deles com algumas (ou muitas) dúvidas sobre o funcionamento desse <em>cara</em>!</p><p>Fiz um projeto usando o Vue como SPA e o Laravel como API que cria e gerencia frases, para começar a entender como funciona o famoso Laravel e todo o seu fluxo. E como no fim tudo é CRUD, tinha que ser um <em>CRUDzinho,</em> né?</p><p>Apesar de ser um projeto básico e iniciante, dá pra absorver a base necessária para começar a usar o framework.</p><h3>Requisitos</h3><p>Para começar o desenvolvimento da API, foi importante entender as etapas necessárias. Primeiramente, é nececessário atender os requisitos básicos do framework conforme a <a href="https://laravel.com/docs/7.x">documentação oficial</a> do Laravel:</p><ul><li>PHP &gt;= 7.2.5</li><li>BCMath PHP Extension</li><li>Ctype PHP Extension</li><li>Fileinfo PHP extension</li><li>JSON PHP Extension</li><li>Mbstring PHP Extension</li><li>OpenSSL PHP Extension</li><li>PDO PHP Extension</li><li>Tokenizer PHP Extension</li><li>XML PHP Extension</li></ul><h3>Instalação</h3><p>Após, foi necessário utilizar o gerenciador de pacotes composer para fazer a instalação do Laravel. Com o composer instalado e no diretório escolhido, bastou rodar o seguinte comando para começar a instalação:</p><pre>composer create-project --prefer-dist laravel/laravel crud-laravel</pre><p>E para iniciar o servidor, é só acessar o diretório que acabou de ser criado e rodar o comando:</p><pre>php artisan serve</pre><h3>Informações do Banco</h3><p>No diretório raiz onde o projeto crud-laravel foi criado, é possível visualizar um arquivo <strong>.env</strong> e é nesse arquivo que realizamos as configurações de ambiente. Essa parte requer atenção pois se as configurações do Banco de Dados não estiverem corretas, o projeto não funcionará como o esperado. As informações do meu Banco de Dados ficaram assim:</p><pre>DB_CONNECTION=mysql<br>DB_HOST=127.0.0.1<br>DB_PORT=3306<br>DB_DATABASE=laravel<br>DB_USERNAME=root<br>DB_PASSWORD=</pre><p><strong>IPC</strong>: Caso você visualize o erro Access denied for user <strong>‘root’@’localhost’ (using password: NO)</strong> no navegador, significa que você está tentando acessar a base de dados pelo usuário root sem informar a senha. Verifique no seu banco de dados qual a senha desse usuário e tente acessar a base com a senha.</p><p>Mais informações no link: <a href="https://pt.stackoverflow.com/questions/70151/erro-access-denied-for-user-rootlocalhost-using-passwordno-ao-aceder-a">https://pt.stackoverflow.com/questions/70151/erro-access-denied-for-user-rootlocalhost-using-passwordno-ao-aceder-a</a></p><h3>Desenvolvimento</h3><ol><li>Para o começo do desenvolvimento, primeiro criamos um Model:</li></ol><pre>php artisan make:model Phrase -m</pre><p>2. Após a criação do modelo, iremos criar as tabelas do banco no arquivo presente em database/migrations (o Laravel já possui algumas migrations nativas e é possível visualizá-las a partir do diretório citado). Essa tabela terá os atributos <em>category</em> e <em>phrase</em>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W3Mp3QeAEKHO2OO611j4Tw.png" /></figure><p>3. Agora vamos criar efetivamente essa tabela em em nosso banco, rodando as migrations. E para isso, iremos utilizar o <em>artisan</em> com o seguinte comando:</p><pre>php artisan migrate</pre><p>Se as migrations foram rodadas com sucesso, podemos partir para a criação das rotas.</p><p>4. Para criarmos as rotas, iremos até o arquivo <em>api.php</em> presente em <em>/routes/api.php</em>. Criamos 5 rotas:</p><ul><li>Rota GET para listar as frases;</li><li>Rota POST para adicionar uma nova frase na lista;</li><li>Rota GET para retornar os dados de uma frase específica;</li><li>Rota PUT para editar uma frase;</li><li>Rota DELETE para excluir uma frase.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_QrvXaiiNo0G5i5s-Z9fiw.png" /></figure><p>5. Após a criação das rotas, iremos criar o Controller com o seguinte comando:</p><pre>php artisan make:controller PhraseController</pre><p>6. Dentro do Controller (presente no diretório Http/Controllers/PhraseController.php) iremos criar nossas funções para os métodos vistos anteriormente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NEkRnSTR8F1CfJF_CjHc5w.png" /></figure><p>Após a criação dos métodos, nosso back-end está pronto e tudo já pode ser testado! Para visualizar a interação com os métodos, precisei integrar o back-end ao front-end com ajuda do Axios. Você pode ver o consumo da API e criação dos métodos no Vue através da pasta <em>/app</em> presente no repositório.</p><p>7. Ao acessar a rota de listagem, é possível visualizar todas as frases que foram cadastradas no banco:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/809/1*s-jeG-bIAOVW5vwn0wWJOA.png" /></figure><p>Foi uma experiência interessante desenvolver um CRUD com Laravel pois consegui absorver o fluxo de funcionamento, tanto começando um projeto novo, quanto gerenciando um já existente. 🚀</p><p>O projeto está disponível no GitHub e você consegue acessar por esse link: <a href="https://github.com/hosanabarcelos/crud-laravel">https://github.com/hosanabarcelos/crud-laravel</a>.</p><p>Você pode acompanhar o escritor em outras redes acessando <a href="https://www.hosana.me/">hosana.me</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cd2b0a137c62" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/fazendo-um-crud-e-conhecendo-o-laravel-cd2b0a137c62">Fazendo um CRUD e conhecendo o Laravel</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Persistindo dados no Docker: Uma visão geral das opções]]></title>
            <link>https://medium.com/sysvale/persistindo-dados-no-docker-uma-vis%C3%A3o-geral-das-op%C3%A7%C3%B5es-702750c68019?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/702750c68019</guid>
            <category><![CDATA[bind-mount]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[volume]]></category>
            <dc:creator><![CDATA[Eduardo de Sá]]></dc:creator>
            <pubDate>Fri, 02 Jun 2023 18:09:56 GMT</pubDate>
            <atom:updated>2023-06-02T18:09:55.904Z</atom:updated>
            <content:encoded><![CDATA[<p>Quando um contêiner é iniciado no Docker, ele cria uma camada somente de leitura e outra de leitura e gravação na imagem.</p><p>Todos os arquivos criados em contêiner são armazenados na camada gravável do contêiner. Isso significa 3 coisas:</p><ul><li>Os dados não persistem quando o contêiner deixa de existir, e pode ser difícil extrair os dados do contêiner se outro processo precisar deles.</li><li>A camada gravável de um contêiner está intimamente ligada à máquina host onde o contêiner está sendo executado. Não é fácil mover os dados para outro local.</li><li>Escrever na camada gravável de um contêiner requer um driver de armazenamento para gerenciar o filesystem. O driver de armazenamento fornece um filesystem de união, usando o kernel do Linux. Essa abstração adicional reduz o desempenho em comparação com o uso de volumes, que escrevem diretamente no filesystem do host.</li></ul><p>O Docker nos fornece 2 alternativas para que possamos persistir os dados após o contêiner ser parado: volumes e bind mount.</p><p>Vamos ver como utilizar cada uma.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/501/1*09Ds1vQ2Y1_ljGen9pNxrw.png" /></figure><p><strong>Persistindo dados com bind mount</strong></p><p>Primeiramente, vamos precisar criar na sua pasta home, uma pasta chamada volume-docker.</p><p>No terminal, verifique se esta no home e crie a pasta com o seguinte comando:</p><pre>mkdir volume-docker</pre><p>Ou crie pelo gerenciador de arquivos do seu sistema. Em seguida, rodamos o comando:</p><pre>docker run -it --mount type=bind,source=&quot;/home/&lt;seu-usuario&gt;/volume-docker&quot;,target=/app ubuntu bash</pre><ul><li>— mount e type=bind = indicam que vamos fazer um mount do tipo bind</li><li>target=/app = indica a pasta dentro do contêiner onde iremos salvar os dados</li><li>source = indica onde os dados serão persistidos</li><li>ubuntu = é image que usaremos para criar o contêiner</li><li>bash = vai abrir o shell do container em execução.</li></ul><p>Quando o shell do bash abrir iremos executar o comando</p><pre>cd app/</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/725/1*QTD3JsK6QHwWmb46sjO1bw.png" /></figure><p>após essa etapa iremos criar um arquivo executando o comando</p><pre>touch arquivo-qualquer.txt</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/725/1*QGINC1Rf-7tqhOM6fwWjgg.png" /></figure><p>Se abrirmos o gerenciador de arquivos e navegarmos até pasta volume-docker, conseguiremos visualizar o arquivo “arquivo-qualquer.txt” que foi criado.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/891/1*y9aSU5PleAHx7Q5y8AGtsg.png" /></figure><p>Podemos sair do shell pressionando CTRL + D.</p><p>Vamos criar um novo contêiner rodando o seguinte comando:</p><pre>docker run -it --mount type=bind,source=&quot;/home/&lt;seu-usuario&gt;/volume-docker&quot;,target=/app ubuntu bash</pre><p>Agora, vamos para a pasta app</p><pre>cd /app</pre><p>Vamos executar em seguida</p><pre>ls</pre><p>Veja que o arquivo “arquivo-qualquer.txt” ainda existe, apesar de termos criado um novo contêiner e essa ser uma nova camada gravável. Ainda temos acesso ao arquivo criado. Se não fosse o bind mount, essa informação teria se perdido. Portanto, agora conseguimos persistir informações entre containers. Caso um contêiner pare de funcionar de alguma maneira e queiramos preservar os dados que estejam lá, já conseguimos fazer isso agora.</p><p><strong>Persistindo dados com volume:</strong></p><p>Quando utilizamos volumes, o próprio Docker vai fazer a gerência do nosso filesystem, o que faz com que ele seja mais confiável de utilizar.</p><p>Podemos criar volumes de 2 formas. A primeira é por utilizar o comando:</p><pre>docker volume create meu-volume</pre><p>podemos ver o volume criado rodando:</p><pre>docker volume ls</pre><p>Para utilizarmos esse volume podemos utilizar o comando:</p><pre>docker run -it --mount source=meu-volume,target=/app ubuntu bash</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*O_KscQSch38LV24DjgzeAg.png" /></figure><p>Agora ele vai utilizar o meu-volume para armazenar as informações. Entrando no bash dele iremos executar:</p><pre>cd /app</pre><pre>touch arquivo-qualquer-volume.txt</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*SRtB36ARBcflBJ9xFA3eww.png" /></figure><p>Após a execução, podemos observar que o arquivo “arquivo-qualquer-volume.txt” não é mais exibido no gerenciador de arquivos como anteriormente. Mas por que isso acontece? Porque nosso source (onde iremos salvar os arquivos) agora é o meu-volume.</p><p>Para acessar precisamos rodar os seguintes comando</p><pre>sudo su</pre><pre>cd /var/lib/docker/volumes/meu-volume/_data</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/736/1*ykx5j3dReeHbSZ8H7Ccj6A.png" /></figure><p>Isso acontece porque agora os arquivos são salvos em uma área do Docker e não no filesystem do dispositivo.</p><p>A 2 forma de criar é colocar o nome do novo volume já quando for executar, exemplo:</p><pre>docker run -it - mount source=meu–novo-volume, target=/app ubuntu bash</pre><p>Sobre o autor: <strong>Eduardo de Sá Lima </strong>é desenvolvedor estagiário na <a href="https://sysvale.com/">Sysvale Softgroup</a> e cursa Licenciatura em Computação no IFSertãoPE.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=702750c68019" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/persistindo-dados-no-docker-uma-vis%C3%A3o-geral-das-op%C3%A7%C3%B5es-702750c68019">Persistindo dados no Docker: Uma visão geral das opções</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Explorando o Eloquent: Relacionamentos]]></title>
            <link>https://medium.com/sysvale/explorando-o-eloquent-relacionamentos-4ef649af7f86?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/4ef649af7f86</guid>
            <dc:creator><![CDATA[Henrique França]]></dc:creator>
            <pubDate>Fri, 02 Jun 2023 16:01:45 GMT</pubDate>
            <atom:updated>2023-06-02T16:01:45.561Z</atom:updated>
            <content:encoded><![CDATA[<h3>Introdução</h3><p>Para começarmos a falar sobre o eloquent vamos precisar de uma breve definição. Bem de forma simples, eloquent é um <em>Object-Relational-Mapper</em> (ORM) que vêm integrado ao Laravel. Por que ele é importante ? O eloquent busca facilitar a interação do Laravel com uma base de dados, permitindo estabelecer relacionamentos entre as tabelas e executar diversas operações como update, insert, delete.</p><h3>Relacionamentos</h3><p>Antes de começarmos vamos tornar o conceito de relacionamento mais claro. O que são relacionamentos? Os relacionamentos no banco de dados são associações estabelecidas entre tabelas. Como exemplo, no banco de dados existe uma tabela de Clientes e uma de Endereços onde é estabelecido que um cliente está associado a um endereço, para vincular as informações do cliente e endereço é criado um relacionamento entre essas tabelas.</p><p>No Laravel o Eloquent cria seus relacionamentos através de métodos, a construção de relacionamentos auxiliam a realização de <em>query’s </em>na base de dados.</p><p>Os tipos de relacionamentos explorados nesse artigo serão:</p><ul><li>Um para um (<em>One to One</em>)</li><li>Um para Muitos (<em>One to Many</em>)</li><li>Muitos para muitos (<em>Many to Many</em>)</li></ul><h3>Um pra um</h3><p>O relacionamento “um pra um” e a forma mais básica de relacionamento, onde define a relação que um item possui um outro item. Para exemplificar utilizaremos o exemplo anterior, onde temos uma tabela de clientes e endereços, em que cada cliente vai estar associado a um endereço. E como seria isso no Laravel com Eloquent?</p><p>Primeiramente criamos suas respectivas tabelas, vamos optar por executar o comando de criação de model com a opção <em>-m, </em>pois assim será criado uma migração para o model em questão.</p><pre>php artisan make:model Client -m</pre><pre>php artisan make:model Address -m</pre><p>Adicionamos a chave externa da tabela de Cliente (<em>Foreign Key</em>) na tabela de migração Endereço e executamos a migração.</p><pre>&lt;?php<br> <br>use Illuminate\Database\Migrations\Migration;<br>use Illuminate\Database\Schema\Blueprint;<br>use Illuminate\Support\Facades\Schema;<br> <br>class Address extends Migration<br>{<br>    /**<br>     * Run the migrations.<br>     */<br>    public function up(): void<br>    {<br>        Schema::create(&#39;address&#39;, function (Blueprint $table) {<br>            $table-&gt;id();<br>            $table-&gt;string(&#39;name&#39;);<br>            $table-&gt;timestamps();<br><br>            $table-&gt;foreignId(&#39;client_id&#39;);<br>        });<br>    }<br> <br>    /**<br>     * Reverse the migrations.<br>     */<br>    public function down(): void<br>    {<br>        Schema::drop(&#39;address&#39;);<br>    }<br>};</pre><p>Após, devemos criar o relacionamento na tabela de Cliente, criando o método e utilizando o <strong><em>hasOne</em></strong> para indicar que a tabela de cliente possui um endereço.</p><pre>public function address(): HasOne<br>{<br>    return $this-&gt;hasOne(Address::class);<br>}</pre><p>Devemos então adicionar a logica reversa do relacionamento na tabela de endereços. Para isso criamos o método e utilizamos o <strong><em>belongsTo</em></strong> para indicar que o endereço pertence a um cliente.</p><pre>public function client(): BelongsTo<br>{<br>    return $this-&gt;belongsTo(Client::class);<br>}</pre><h3>Um para muitos</h3><p>Outro relacionamento importante a ser explorado é o “um para muitos”, onde define a relação que um item possui muitos outros itens. Seguindo o exemplo que estabelecemos, podemos definir que um cliente possa realizar vários pedidos. A aplicação e similar ao relacionamento “um para um”.</p><p>Primeiramente, devemos criar a tabela de Pedidos.</p><pre>php artisan make:model Order -m</pre><p>Adicionamos a tabela de Cliente o método que define a relação de pedidos utilizando o <strong><em>hasMany</em></strong>, para indicar que um cliente possui vários pedidos.</p><pre>public function orders(): HasMany<br>{<br>    return $this-&gt;hasMany(Order::class);<br>}</pre><p>Aplicando a logica inversa do relacionamento a tabela de Pedidos. Para isso criamos o método e utilizamos o <strong><em>belongsTo</em></strong> para indicar que o pedido pertence a um cliente.</p><pre>public function client(): BelongsTo<br>{<br>    return $this-&gt;belongsTo(Client::class);<br>}</pre><h3>Muitos para muitos</h3><p>A relação “muitos para muitos” possui uma complexidade maior. O relacionamento define que um item pode ser relacionado a vários outros itens e vice-versa. Assim, voltando para o nosso exemplo, se temos pedidos e produtos, um pedido pode possuir vários produtos, entretanto um produto pode estar associado a vários outros pedidos.</p><p>E como lidaremos com as chaves externa nesse relacionamento? para esse relacionamento é necessário uma tabela intermediária, chamada de tabela pivô, que irá armazenar a chave externa da tabela de pedido e produto, com isso conseguimos relacionar cada pedido a um produto.</p><p>E como seria no Laravel? Primeiro criamos a migração da tabela pivô.</p><pre>php artisan make:migration create_order_product_table --create=order_product</pre><p>A seguir adicionamos as chaves externas das tabelas pedido e produto na migração da tabela pivô dentro do método <em>up.</em></p><pre>&lt;?php<br> <br>use Illuminate\Database\Migrations\Migration;<br>use Illuminate\Database\Schema\Blueprint;<br>use Illuminate\Support\Facades\Schema;<br> <br>class CreateOrderProductTable extends Migration<br>{<br>    /**<br>     * Run the migrations.<br>     */<br>    public function up(): void<br>    {<br>        Schema::create(&#39;order_product&#39;, function (Blueprint $table) {<br>            $table-&gt;id();<br>            $table-&gt;string(&#39;name&#39;);<br>            $table-&gt;timestamps();<br><br>            $table-&gt;foreignId(&#39;order_id&#39;);<br>            $table-&gt;foreignId(&#39;product_id&#39;);<br>        });<br>    }<br> <br>    /**<br>     * Reverse the migrations.<br>     */<br>    public function down(): void<br>    {<br>        Schema::drop(&#39;order_product&#39;);<br>    }<br>};</pre><p>Seguimos criando a tabela de produtos e adicionamos o relacionamento na tabela de produtos utilizando o <strong><em>belongsToMany</em></strong>.</p><pre>php artisan make:model Product -m</pre><pre>public function orders(): BelongsToMany<br>{<br>    return $this-&gt;belongsToMany(Order::class);<br>}</pre><p>E por fim, adicionando o relacionamento na tabela de pedidos com o <strong><em>belongsToMany</em></strong>.</p><pre>public function products(): BelongsToMany<br>{<br>    return $this-&gt;belongsToMany(Product::class);<br>}</pre><h3>Conclusão</h3><p>Bem chegamos ao final desse artigo, nesse artigo procurei definir o Eloquent e os conceitos básicos de relacionamentos e como ele trabalha. Os relacionamentos explorados nesse artigo são os mais comuns e utilizados em conceitos básicos. Alguns exemplos comentam sobre migrações (<em>migrations</em>), o que não foi explorado nesse artigo, em caso de duvidas consulte: <a href="https://laravel.com/docs/10.x/migrations">https://laravel.com/docs/10.x/migrations</a>.</p><p>Espero que este artigo tenha lhe sido útil, torço para que continue buscando conhecimento no Laravel e se aprofundando no Eloquent.</p><p>Boa sorte na sua Jornada!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4ef649af7f86" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/explorando-o-eloquent-relacionamentos-4ef649af7f86">Explorando o Eloquent: Relacionamentos</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Testes de usabilidade na pesquisa de experiência]]></title>
            <link>https://medium.com/sysvale/testes-de-usabilidade-na-pesquisa-de-experi%C3%AAncia-1b46d6d56650?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/1b46d6d56650</guid>
            <category><![CDATA[teste-de-usabilidade]]></category>
            <category><![CDATA[tecnologia]]></category>
            <category><![CDATA[ux]]></category>
            <category><![CDATA[pesquisa-com-usuários]]></category>
            <category><![CDATA[experiência-do-usuário]]></category>
            <dc:creator><![CDATA[Joao Paulo Castro]]></dc:creator>
            <pubDate>Fri, 02 Jun 2023 16:01:26 GMT</pubDate>
            <atom:updated>2023-06-02T16:01:26.832Z</atom:updated>
            <content:encoded><![CDATA[<p>Acredito que seja de comum acordo que, no mundo cada vez mais digital em que vivemos, a experiência do usuário (UX) é um fator crucial para o sucesso ou fracasso de uma marca. Ela se refere à percepção e resposta do usuário em relação ao uso de um produto ou serviço, logo, uma boa experiência do usuário pode aumentar a satisfação do cliente e sua fidelidade à marca, enquanto uma experiência ruim pode levar à insatisfação e perda de clientes.</p><p>Para garantir uma UX de qualidade, existem diversas técnicas e abordagens de pesquisa que podem ser utilizadas (chamamos de <strong>pesquisa de experiência</strong>). Neste artigo, iremos focar em uma das mais importantes e eficazes: os testes de usabilidade.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/604/1*_dUMWlFSAKSKSeks-rGKcw.png" /><figcaption>Ilustração por Freepik em <a href="http://www.storyset.com/">www.storyset.com</a></figcaption></figure><p>Como mencionado, existem outros tipos de técnicas para realizar pesquisas de experiência, como entrevistas, questionários e observação de campo, cada um com suas vantagens e desvantagens, necessitando que o pesquisador saiba ponderar e escolher qual é a melhor técnica para a sua problemática. No caso dos testes de usabilidade, eles se destacam por oferecerem uma abordagem prática e direta, além de serem capazes de revelar <em>insights </em>sobre a interação entre os usuários e um produto ou sistema, identificando problemas e oportunidades de melhoria.</p><p>Neste texto, vamos falar sobre a importância de testes de usabilidade, desde a sua preparação até a análise dos resultados. Discutiremos as etapas necessárias para realizar testes eficazes, como definir objetivos, preparar o ambiente, recrutar participantes e analisar os dados coletados cuidadosamente.</p><p>Para preparar um teste de usabilidade, é preciso fazer um plano detalhado. Esse plano nos ajuda a comunicar os detalhes do teste, as responsabilidades da equipe e definir a quantidade de recursos necessários. O plano deve ter o objetivo do teste, o perfil dos participantes, o cenário de uso, as tarefas que os usuários devem fazer, os critérios de avaliação e os resultados esperados. É necessário ter os recursos certos para fazer o teste, como equipamentos de gravação de vídeo, software de análise de usabilidade e um lugar para fazer o teste.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/592/1*KYkXEEDJt6WHwSeAZdeFXw.png" /><figcaption>Feita por autor</figcaption></figure><h3><strong>O escopo</strong></h3><p>Para definir o escopo, é muito importante que nos façamos as seguintes perguntas:</p><p>— Para quem é o produto?</p><p>— Quais são as necessidades que o produto atende?</p><p>— O produto é novo?</p><p>— O produto substitui algo existente ou complementa algo já disponível?</p><p>Essas perguntas são fundamentais para que possamos descrever o produto, compreender as suas funcionalidades, estabelecer seus objetivos com o teste e definir o público-alvo do produto. Para isso, é necessário descrever as funcionalidades do produto do ponto de vista do usuário, ou seja, considerar as situações em que o produto seria utilizado.</p><h3><strong>Recrutamento</strong></h3><p>Para obter resultados significativos nos testes de usabilidade, é importante selecionar os participantes corretos. Como principais ações nessa parte do planejamento, temos:</p><ul><li><strong>Definir critérios:</strong> É necessário estabelecer critérios claros para selecionar os participantes e buscar levar em consideração idade, gênero e características específicas relacionadas à experiência e habilidades relevantes para seu produto ou serviço.</li><li><strong>Tamanho da amostra:</strong> Determinar o tamanho da amostra é essencial para obter <em>insights </em>confiáveis. No geral, um grupo de 5 a 8 participantes é o recomendado, sendo suficiente para identificar os principais problemas de usabilidade.</li></ul><h3><strong>Criação das tarefas</strong></h3><p>É na criação das tarefas que descrevemos detalhadamente a execução do teste, incluindo o passo a passo, os dados a serem coletados, as métricas de sucesso e as tarefas a serem realizadas pelos usuários. Para isso, precisamos responder às seguintes perguntas:</p><p>— Quais ações as pessoas devem ser capazes de realizar com o produto?</p><p>— Quais são os passos envolvidos na interação dos usuários?</p><p>— Como avaliaremos se o produto atende às necessidades dos usuários?</p><p>— Quanto tempo é necessário para que o usuário conclua uma tarefa usando o produto?</p><p>Essas perguntas são de extrema importância na criação das tarefas do teste e nas métricas de avaliação, e respondê-las nos ajuda a compreender melhor o processo e evita que cometamos erros na idealização das atividades.</p><p>Para o momento de criação de atividades, é necessário que o pesquisador tenha em mente que as tarefas precisam ser específicas, não permitindo que haja ambiguidade na sua realização, que ela aborde cenários do mundo real e que tenha um objetivo claro a ser alcançado. A partir disso, podemos destacar alguns pontos desta etapa:</p><ul><li><strong>Seja específico e realista:</strong> As tarefas devem ser claras e precisas, fornecendo instruções detalhadas sobre o que os participantes devem fazer. Evite tarefas vagas ou ambíguas que possam levar a interpretações errôneas.</li><li><strong>Aborde cenários do mundo real:</strong> Pense em cenários do mundo real em que os usuários podem se encontrar ao usar o produto ou serviço.</li><li><strong>Estabeleça metas e objetivos claros:</strong> Além de descrever a tarefa em si, forneça aos participantes metas e objetivos específicos a serem alcançados durante a execução da tarefa.</li><li><strong>Varie a complexidade das tarefas:</strong> Ao criar um conjunto de tarefas, varie a complexidade e a dificuldade delas. Inclua tarefas mais simples e diretas, bem como tarefas mais desafiadoras que exijam um maior conhecimento ou habilidade do usuário.</li><li><strong>Observe a sequência das tarefas:</strong> Outro ponto para se atentar é a ordem em que as tarefas serão apresentadas aos participantes. No geral, recomenda-se inicar com as tarefas mais simples e introdutórias, para que os participantes se familiarizem com o produto e ganhem confiança.</li></ul><p>Lembre-se sempre de que as tarefas devem ser adaptadas ao contexto do produto/serviço. É interessante, também, testar com antecedência as tarefas com colegas ou pessoas que não estejam envolvidas no projeto para identificar possíveis problemas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/632/1*7EDOmnVkgA8WxmjlNs9heA.png" /><figcaption>Ilustração por Freepik em <a href="http://www.storyset.com/">www.storyset.com</a></figcaption></figure><h3><strong>Análise dos Resultados</strong></h3><p>Após finalizar os testes de usabilidade, é hora de analisar os resultados e extrair ideias valiosas. E nesse momento da pesquisa, podemos dividir o trabalho mais uma vez, criando um passo a passo para uma análise mais precisa e adequada. No processo de análise, é importante que os dados estejam bem organizados, pois o teste de usabilidade pode criar uma enxurrada de informações e nós podemos nos perder nelas se não tivermos cuidado. Assim, toda a organização desses dados vai tornar mais fácil o trabalho seguinte, de identificação de padrões e geração de <em>insights</em>.</p><ul><li><strong>Passo 1: Organize os dados -</strong> Comece por oganizar todas as informações coletadas durante os testes. Isso inclui anotações, gravações em vídeo, capturas de tela e respostas dos participantes a questionários ou entrevistas pós-teste. Certifique-se de ter todas as informações necessárias disponíveis para análise.</li><li><strong>Passo 2: Identifique padrões - </strong>Procure por padrões e tendências nos dados coletados e observe quais problemas ou dificuldades foram relatados por vários participantes. Identifique pontos em comum nas interações dos usuários e faça anotações sobre problemas que se repetem.</li><li><strong>Passo 3: Priorize os problemas - </strong>Classifique os problemas identificados com base em seu impacto na experiência do usuário. Determine quais problemas têm maior urgência e devem ser corrigidos imediatamente.</li><li><strong>Passo 4: Gere <em>insights </em>-</strong> Analise os dados de forma a extrair <em>insights</em> e compreenda as motivações e necessidades dos usuários. Busque sempre entender o contexto por trás dos problemas e como eles afetam a experiência do usuário.</li><li><strong>Passo 5: Compartilhe os resultados -</strong> Una todas as descobertas e novas ideias<em> </em>em um relatório claro e conciso para ser apresentado aos membros da equipe responsável pelo projeto. Nessa apresentação, destaque os principais problemas e forneça recomendações para melhorias.</li></ul><h3><strong>Conclusão</strong></h3><p>Os testes de usabilidade são essenciais para compreender e melhorar a experiência do usuário em produtos e serviços. Ao planejar e executar um teste de forma adequada, as equipes podem obter ideias sobre como os usuários interagem com o produto, além de identificar possíveis problemas de usabilidade.</p><p>Embora existam diversas outras técnicas de pesquisa de UX disponíveis, os testes de usabilidade se destacam por sua abordagem prática e direta. Eles permitem que os usuários reais interajam com o produto, revelando informações valiosas que não seriam obtidas apenas por meio de entrevistas ou questionários, por exemplo.</p><p>Portanto, ao projetar e desenvolver produtos e serviços voltados para os usuários, tenha em mente a poderosa ferramenta que os testes de usabilidade são. Analise se, para o seu produto, é um método que faz sentido e pode trazer as repostas que você precisa.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/115/1*eFbZU9qVFucdPmAwGV8Xvg.png" /></figure><p>Sobre o autor: <strong>João Paulo Castro</strong> é UX/UI Designer na <a href="http://sysvale.com/">Sysvale Softgroup</a>, tem formação em Engenharia da Computação pela Universidade Federal do Vale do São Francisco e é pós-graduando em Ciência de Dados pela UNAMA.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1b46d6d56650" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/testes-de-usabilidade-na-pesquisa-de-experi%C3%AAncia-1b46d6d56650">Testes de usabilidade na pesquisa de experiência</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Código organizado, elegante e de fácil manutenção: dicas de Laravel]]></title>
            <link>https://medium.com/sysvale/c%C3%B3digo-organizado-elegante-e-de-f%C3%A1cil-manuten%C3%A7%C3%A3o-dicas-de-laravel-17efd86591b6?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/17efd86591b6</guid>
            <category><![CDATA[clean-code]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[backend]]></category>
            <dc:creator><![CDATA[Rodrigo Barboza]]></dc:creator>
            <pubDate>Thu, 01 Jun 2023 12:24:18 GMT</pubDate>
            <atom:updated>2023-06-02T01:27:34.261Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GDknErfOjm2A7B4NKAkI2w.jpeg" /></figure><p>O Laravel é muito mais do que apenas um framework de desenvolvimento de aplicações web em PHP. Ele se destaca pela sua <strong>robustez </strong>e pela ampla gama de ferramentas que oferece, permitindo que os desenvolvedores escrevam códigos de forma moderna, elegante e seguindo as melhores práticas da programação.</p><p>O objetivo deste artigo é de auxiliar principalmente os desenvolvedores iniciantes, fornecendo dicas valiosas para que eles possam explorar mais o potencial do Laravel e aproveitar ao máximo suas ferramentas, fazendo com que olhem para o Laravel com uma nova perspectiva e se sintam confiantes ao utilizá-lo de maneira adequada.</p><p>Ao longo deste texto, vou compartilhar conhecimentos e experiências para que você possa aprimorar suas habilidades no desenvolvimento com Laravel. Abordaremos algumas dicas, passando por recursos essenciais do framework.</p><p>Sabemos o quão apaixonados somos pelo Laravel e entendemos o impacto que ele tem na nossa <strong>produtividade </strong>e na <strong>qualidade </strong>dos nossos projetos. Portanto, vamos abordar dicas que vão impulsionar sua produtividade, melhorar a eficiência do seu código e elevar a qualidade das suas aplicações Laravel.</p><h3>Dica 1: Utilize arquivos de rotas separados</h3><p>Quem já utilizou o Laravel seja para criar uma aplicação web ou api, sabe que facilmente um arquivo de rotas começa a ficar muito grande, e isso acaba tornando a manutenção e o trabalho mais difícil.</p><p>Um exemplo simples é: quem nunca criou uma rota e quando foi testar a rota ela estava dando um problema que não fazia sentido nenhum e ao final você se dá conta que o problema é que existia uma rota que tinha sido declarada previamente, que sua estrutura era muito parecida ou de nome igual, e a requisição ao invés de cair na sua rota estava caindo em outra rota que não tinha nada a ver? Pois é, essa é uma das situações que um arquivo lotado de rotas pode ocasionar. Para isso o Laravel nos dá a possibilidade de separar nossas rotas em arquivos diferentes.</p><p>E como podemos fazer isso? Temos duas formas:</p><h4>1 — Adicionando os caminhos dos arquivos de rota no app/Providers/RouteServiceProvider.php :</h4><p>No método boot é possível encontrar um trecho de código da seguinte forma:</p><pre>Route::prefix(&#39;api&#39;)<br>    -&gt;middleware(&#39;api&#39;)<br>    -&gt;namespace($this-&gt;namespace)<br>    -&gt;group(base_path(&#39;routes/api.php&#39;));<br><br>Route::middleware(&#39;web&#39;)<br>    -&gt;namespace($this-&gt;namespace)<br>    -&gt;group(base_path(&#39;routes/web.php&#39;));</pre><p>Se você quiser adicionar múltiplos arquivos de rota nas rotas “web”, você pode passar no método group uma closure:</p><pre>Route::middleware(&#39;web&#39;)<br>    -&gt;namespace($this-&gt;namespace)<br>    -&gt;group(function() {<br>	require base_path(&#39;routes/users.php&#39;);<br>	require base_path(&#39;routes/products.php&#39;);<br>    });</pre><h4>2 — Adicionando os caminhos dos arquivos de rota no próprio web.php ou api.php:</h4><p>Este método é o mais simples, basta apenas adicionar o seguinte trecho ao final do arquivo:</p><pre>Route::prefix(&#39;users&#39;)-&gt;group(base_path(&#39;routes/users&#39;));<br>Route::prefix(&#39;products&#39;)-&gt;group(base_path(&#39;routes/products&#39;));</pre><p>Neste caso é necessário declarar um prefixo antes, com isso todas as rotas de users virão com users/{path da rota}, da mesma forma que o nome da rota também receberá o prefixo, por exemplo:</p><p>Se eu tenho a rota em routes/users.php:</p><pre>// users.php<br>Route::get(&#39;posts&#39;, [PostController::class, &#39;index&#39;])-&gt;name(&#39;index&#39;);</pre><p>Ao adicionar no arquivo de rotas com o prefixo users eu terei:</p><ul><li>path: users/posts</li><li>name: users.index</li></ul><h3>Dica 2: Utilize form request ao invés de validação no controller</h3><p>O Form Request no Laravel é uma funcionalidade que permite validar os dados recebidos de uma requisição HTTP antes que eles sejam processados pelo controlador. É uma forma de centralizar e organizar as regras de validação em uma classe separada, conhecida como classe de Form Request.</p><p>Normalmente, ao lidar com formulários ou requisições de entrada de dados, é necessário validar os dados recebidos para garantir que eles atendam aos critérios desejados. O Laravel fornece várias maneiras de realizar essa validação, e uma delas é através do Form Request.</p><p>Utilizar o form request traz uma série de vantagens, como: a separação de responsabilidades, reutilização das regras de validação, centralização das regras de validação, validação automática, melhor segurança e facilidade de personalização.</p><p>Não é intuito deste artigo explicar em detalhes o funcionamento do form request, porque ele possui muitas ferramentas e essas informações estão disponíveis na documentação. Dito isto vamos trazer um exemplo simples de utilização:</p><p>Vamos supor que você tenha uma página de cadastro de usuários, e você enviará informações do usuário ao qual se deseja cadastrar para o <em>back</em> através de uma requisição POST, estes dados chegarão no Laravel através do Request, porém sem o form request eles chegarão ao controller sem validação alguma, normalmente faríamos:</p><pre>public function store(Request $request)<br>{<br>    $validated_data = $request-&gt;validate([<br>        &#39;name&#39; =&gt; &#39;required|string|max:255&#39;,<br>        &#39;email&#39; =&gt; &#39;required|email|unique:users&#39;,<br>        &#39;password&#39; =&gt; &#39;required|string|min:6&#39;,<br>    ]);<br>    <br>    if ($validated_data) {<br>        // ...<br>    }<br>}</pre><p>Apesar de funcional, esta não é uma boa prática e podemos melhorar este método para que nosso controller fique bem mais enxuto, com o comando: php artisan make:request StoreUserRequest podemos criar uma classe FormRequest, que é uma classe semelhante a esta:</p><pre>&lt;?php<br><br>namespace App\Http\Requests;<br>use Illuminate\Foundation\Http\FormRequest;<br><br>class StoreUserRequest extends FormRequest<br>{<br>    public function authorize()<br>    {<br>        return true; <br>        // Defina a lógica de autorização de acordo com suas necessidades<br>    }<br>  <br>    public function rules()<br>    {<br>        return [<br>            &#39;name&#39; =&gt; &#39;required|string|max:255&#39;,<br>            &#39;email&#39; =&gt; &#39;required|email|unique:users&#39;,<br>            &#39;password&#39; =&gt; &#39;required|string|min:6&#39;,<br>        ];<br>    }<br>}</pre><p>Os método authorize e rules vêm por padrão ao criar um form request com o artisan. O método authorize pode ser utilizado para verificar por exemplo uma permissão para o usuário autenticado, se ele não tiver autorização o método retornará false, e a requisição retornará HTTP 403 <em>Forbidden</em> (Acesso Negado). Já o rules é onde você define as regras (para mais detalhes consulte a documentação).</p><p>Com isso, no nosso exemplo agora teremos:</p><pre>public function store(StoreUserRequest $request)<br>{<br>    // se chegou aqui, os dados foram validados corretamente<br>}</pre><p>Desta forma nós teremos um controller muito mais limpo e passamos a responsabilidade de validação para uma classe que só vai fazer a validação dos dados do usuário.</p><p>Estendendo um pouco mais nosso exemplo e melhorando ainda mais este método, podemos utilizar a técnica do model bind e adicionar os tipos dos parâmetros e do retorno:</p><pre>public function store(StoreUserRequest $request, User $user): UserResource<br>{<br>    $new_user = $user-&gt;create($request-&gt;validated());<br>    return new UserResource($new_user); <br>    // o resource será explicado na próxima dica<br>}</pre><h3>Dica 3: Utilize resources</h3><p>Em alguns casos é comum não enviar por exemplo o id de um registro porque para o <em>front</em> ele não interessa, ou é comum fazer uma transformação em algum dado no front quando a gente poderia fazer essa transformação no <em>back</em> e deixar essa responsabilidade para apenas uma classe.</p><p>No Laravel, uma resource (recurso) é uma classe que permite estruturar e formatar os dados de um modelo para serem enviados como resposta em uma API ou em uma representação específica, como JSON. As resources são usadas para transformar os dados do modelo em um formato adequado para a saída.</p><p><strong>Quando usar o resource?</strong> Em cenários em que você precise transformar e formatar os dados do seu modelo para serem retornados como resposta em uma API ou em uma representação específica.</p><p><strong>Qual tipo de resource eu devo utilizar?</strong></p><p>Você quer retornar do controller um registro ou um conjunto de registros?</p><ul><li>Retornando apenas um registro: com o seguinte comando artisan é possível criar um resource: php artisan make:resource UserStoreResource</li></ul><p>A classe gerada será semelhante a esta:</p><pre>&lt;?php<br><br>namespace App\Http\Resources;<br>use Illuminate\Http\Resources\Json\JsonResource;<br><br>class UserStoreResource extends JsonResource<br>{<br>    public function toArray($request)<br>    {<br>        return [<br>            &#39;id&#39; =&gt; $this-&gt;id,<br>            &#39;name&#39; =&gt; $this-&gt;name,<br>            &#39;email&#39; =&gt; $this-&gt;email,<br>            &#39;created_at&#39; =&gt; $this-&gt;created_at,<br>            &#39;updated_at&#39; =&gt; $this-&gt;updated_at,<br>        ];<br>    }<br>}</pre><p>No método toArray é possível especificar os atributos que quer retornar, e também é possível alterar o nome deles se for o interesse. Nessa etapa também é possível fazer transformações nos dados como por exemplo no nome do usuário:</p><pre>return [<br>   &#39;id&#39; =&gt; $this-&gt;id,<br>   &#39;name&#39; =&gt; strtoupper($this-&gt;name),<br>   &#39;email&#39; =&gt; $this-&gt;email,<br>   &#39;created_at&#39; =&gt; $this-&gt;created_at,<br>   &#39;updated_at&#39; =&gt; $this-&gt;updated_at,<br>];</pre><p>Utilizando o <em>resource</em> criado no <em>controller</em> (lembre-se de importar a classe):</p><pre>public function store(UserStoreRequest $request): UserStoreResource<br>{<br>    $user = User::create($request-&gt;validated());<br>    return new UserStoreResource($user);<br>}<br><br>// ou de forma alternativa se preferir, você pode utilizar o método <br>// statico da classe JsonResource, o make()<br>return UserStoreResource::make($user);</pre><ul><li>Retornando uma coleção de registros:</li></ul><p>Para retornar uma coleção de registro, ao invés de utilizar o resource que estende a classe JsonResponse, utilizaremos o resource collection que estende a classe ResourceCollection. Podemos criar uma resource collection da mesma forma pelo artisan: php artisan make:resource UserCollection</p><p>O artisan é inteligente o suficiente para entender (se você nomear suas classes seguindo as convenções do Laravel, neste caso se no nome da classe tiver “Collection”), que você está criando um resource do tipo collection e já adiciona a classe ResourceCollection ao invés de JsonResouce. Se por acaso você não queira seguir a convenção, você pode adicionar uma flag ao comando artisan: php artisan make:resource User --collection</p><p>Com isso você terá uma classe semelhante a esta:</p><pre>&lt;?php<br><br>namespace App\Http\Resources;<br><br>use Illuminate\Http\Resources\Json\ResourceCollection;<br><br>class UserCollection extends ResourceCollection<br>{<br>    public function toArray($request)<br>    {<br>        return [<br>            &#39;data&#39; =&gt; $this-&gt;collection-&gt;map(function ($user) {<br>                return [<br>                    &#39;nome&#39; =&gt; $user-&gt;nome,<br>                    &#39;email&#39; =&gt; $user-&gt;email,<br>                ];<br>            }),<br>        ];<br>    }<br>}</pre><p>No contexto da classe UserCollection, $this-&gt;collection refere-se à coleção de recursos (usuários) que está sendo manipulada pela <em>resource</em>. É como se eu tivesse $user = User::all() e fizesse um map em $user→map(). Os métodos mais utilizados no resource collection são o map e o transform, a diferença principal entre map() e transform() é a forma como eles afetam os itens da coleção original:</p><ol><li><strong>map()</strong>: O método <strong>map()</strong> cria uma nova coleção a partir dos itens da coleção original, aplicando uma transformação a cada item. A coleção original permanece inalterada. O resultado é uma nova coleção com os itens transformados.</li><li><strong>transform()</strong>: O método <strong>transform()</strong> modifica diretamente os itens da coleção original. Ele aplica uma transformação a cada item, modificando-os na própria coleção original. Não é criada uma nova coleção separada.</li></ol><p>Portanto, a escolha entre <strong>map()</strong> e <strong>transform()</strong> depende do seu caso de uso específico e dos requisitos do seu código. Se você precisa modificar a coleção original diretamente, use <strong>transform()</strong>. Se você precisa retornar uma nova coleção com os itens transformados, sem modificar a coleção original, use <strong>map().</strong></p><p>Como utilizar esse resource collection no controller:</p><pre>public function store(): UserCollection<br>{<br>    $users = User::all();<br>    return new UserCollection($users);<br>}<br><br>// ou de maneira alternativa, também utilizando o método statico make<br>return UserCollection::make($users);</pre><p>Mais um exemplo interessante para o dia dia: vamos supor que agora quero retornar todos os meus usuários com seus respectivos endereços, onde um usuário possui N endereços e um endereço pertence a um usuário. Vamos supor também que temos a seguinte query:</p><pre>// pega todos usuários do tipo colaborador com seus respectivos endereços<br>$collaborators = User::whereType(&#39;collaborator&#39;)-&gt;with(&#39;address&#39;)-&gt;get();</pre><p>Esta query vai me retornar todos os usuários colaboradores com seus respectivos endereços (o with é da técnica <em>eager loading que veremos na dica 6).</em></p><p>Agora criando o <em>resource</em>:</p><pre>&lt;?php<br><br>namespace App\Http\Resources;<br>use Illuminate\Http\Resources\Json\ResourceCollection;<br>use App\Http\Resources\AddressResource;<br><br>class UserCollection extends ResourceCollection<br>{<br>    public function toArray($request)<br>    {<br>        return [<br>            &#39;data&#39; =&gt; $this-&gt;collection-&gt;map(function ($collaborator) {<br>                return [<br>                    &#39;nome&#39; =&gt; $collaborator-&gt;nome,<br>                    &#39;email&#39; =&gt; $collaborator-&gt;email,<br>		    &#39;addresses&#39; =&gt; AddressResource::collection($collaborator-&gt;address),<br>                ];<br>            }),<br>        ];<br>    }<br>}</pre><p>Como um colaborador pode ter mais de um endereço, eu posso adicionar uma chave “addresses” e no seu valor adicionar um resource de endereço. Note que ao invés de utilizar um AddressCollection eu utilizei um AddressResource, porque a classe JsonResponse também possui um método estático chamado collection que pode ser utilizado para criar uma collection a partir de um resource. Assim, na minha saída eu teria algo assim:</p><pre>&quot;data&quot;: [<br>   {<br>      &quot;nome&quot;:&quot;fulaninho 1&quot;,<br>      &quot;email&quot;:&quot;fulanilho1@mail.com&quot;,<br>      &quot;addresses&quot;:[<br>         {<br>            &quot;rua&quot;:&quot;tal&quot;,<br>            &quot;numero&quot;:123<br>         }<br>      ]<br>   },<br>   {<br>      &quot;nome&quot;:&quot;fulaninho 2&quot;,<br>      &quot;email&quot;:&quot;fulanilho2@mail.com&quot;,<br>      &quot;addresses&quot;:[<br>         {<br>            &quot;rua&quot;:&quot;tal 2&quot;,<br>            &quot;numero&quot;:321<br>         },<br>         {<br>            &quot;rua&quot;:&quot;tal 3&quot;,<br>            &quot;numero&quot;:555<br>         }<br>      ]<br>   }<br>]</pre><p>Os resources do Laravel são uma ferramenta muito poderosa e você pode e deve utilizar em seus projetos. Existem várias coisas que podemos fazer em uma classe resource, portanto é sempre muito bem vindo explorar essas funcionalidades na documentação.</p><h3>Dica 4: Utilize as collections</h3><p>Se você já teve alguma experiência com PHP, especialmente sem o uso de grandes frameworks como o Laravel, é provável que esteja familiarizado com os métodos <strong>in_array</strong>, <strong>array_reduce</strong>, <strong>array_map</strong>, <strong>array_filter</strong>, <strong>array_keys</strong>, entre outros. Essas funções são nativas do PHP e não há problema em utilizá-las. No entanto, quando estamos trabalhando com o Laravel, que é uma framework robusta e completa, temos acesso a uma ferramenta poderosa chamada collections que são estruturas de dados poderosas que fornecem uma variedade de métodos para manipular e trabalhar com conjuntos de dados de forma concisa e expressiva. Então se o Laravel nos dá essa ferramenta, porque não utilizar, não é mesmo? Vamos explorar e aproveitar ao máximo das collections do Laravel, pois elas são incrivelmente úteis, e além de deixarem nosso código mais elegante, deixa com mais carinha de Laravel!</p><p>Uma vantagem incrível do Laravel é a ampla gama de métodos disponíveis nas collections. Embora não seja possível abordar todos os métodos aqui, é altamente recomendado explorar a documentação oficial do Laravel para descobrir a variedade de métodos que podem auxiliá-lo no desenvolvimento. Com certeza, você encontrará métodos úteis que atendam às suas necessidades.</p><h3>Dica 5: Utilize injeção de dependência</h3><p>No contexto do Laravel, a injeção de dependência refere-se à prática de fornecer as dependências necessárias para uma classe ou objeto, em vez de criar ou gerenciá-las internamente. Isso é feito por meio do mecanismo de injeção de dependência fornecido pelo contêiner de serviços do Laravel.</p><p>Ao usar a injeção de dependência, você pode aproveitar vários benefícios, como a modularidade, reutilização de código, testabilidade e flexibilidade. Ele ajuda a reduzir o acoplamento entre as classes e torna o código mais extensível e fácil de manter.</p><p>Exemplo de uso da injeção de dependência:</p><pre>&lt;?php<br><br>class ActivityController extends Controller<br>{<br>    // sem injenção de dependência:<br>    <br>    public function index()<br>    {<br>        $activity_service = new ActivityService();<br>	// ...<br>    }<br><br>    // com injeção de dependência<br>    public function index(ActivityService $activity_service):<br>    {<br>	/// ...<br>    }			<br>}</pre><p>Embora as duas formas sejam corretas e funcionais, utilizar a injeção de dependência vai nos dá algumas vantagens como: desacoplamento de código, reutilização de código, testabilidade, manutenção simplificada, extensibilidade, código mais limpo e legível. Vamos para mais um exemplo:</p><pre>&lt;?php<br><br>class ActivityController extends Controller<br>{<br>    public function index()<br>    {<br>        $activity_repository = new ActivityRepository();<br>	return $activity_repository-&gt;get();<br>    }<br><br>    public function store(Request $request)<br>    {<br>        $activity_repository = new ActivityRepository();<br>	return $activity_repository-&gt;create($request-&gt;all());<br>    }			<br>}</pre><p>Para melhorar este código eu posso utilizar um construtor:</p><pre>class ActivityController extends Controller<br>{<br>    private ActivityRepository $activity_repository;<br><br>    public function __construct()<br>    {<br>        $this-&gt;activity_repository = new ActivityRepository();<br>    }<br><br>    public function index()<br>    {<br>        return $this-&gt;activity_repository-&gt;get();<br>    }<br><br>    public function store(Request $request)<br>    {<br>        return $this-&gt;activity_repository-&gt;create($request-&gt;all());<br>    }			<br>}</pre><p>Assim já está bem bacana, mas pode ficar ainda melhor! Por isso utilizaremos a injeção de dependência:</p><pre>class ActivityController extends Controller<br>{<br>    private ActivityRepository $activity_repository;<br><br>    public function __construct(ActivityRepository $activity_repository)<br>    {<br>        $this-&gt;activity_repository = $activity_repository;<br>    }<br><br>    public function index()<br>    {<br>        return $this-&gt;activity_repository-&gt;get();<br>    }<br><br>    public function store(Request $request)<br>    {<br>        return $this-&gt;activity_repository-&gt;create($request-&gt;all());<br>    }			<br>}</pre><p>A dependência <strong>ActivityRepository</strong> é injetada no construtor através da injeção de dependência. Isso permite que a instância da classe <strong>ActivityRepository</strong> seja fornecida de fora, em vez de criar uma nova instância dentro do construtor. A injeção de dependência é preferível, pois torna o código mais flexível, testável e reutilizável.</p><p>Com essas melhorias, a classe <strong>ActivityController</strong> agora depende da abstração <strong>ActivityRepository</strong> em vez de uma implementação concreta específica. Isso permite que você substitua facilmente a implementação do repositório por outra, se necessário, e também torna a classe mais fácil de testar, pois você pode injetar um mock do repositório nos testes.</p><p><strong>Extra</strong>: deixando nossa classe exemplo mais “gatinha” com a inicialização da propriedade no construtor (disponível a partir do php 8):</p><pre>class ActivityController extends Controller<br>{<br>    public function __construct(<br>      private ActivityRepository $activity_repository<br>    ){}<br><br>    public function index()<br>    {<br>       return $this-&gt;activity_repository-&gt;get();<br>    }<br><br>    public function store(Request $request)<br>    {<br>        return $this-&gt;activity_repository-&gt;create($request-&gt;all());<br>    }			<br>}</pre><h3>Dica 6: Evite a query N + 1 com Eager Loading</h3><p>Eager loading é um conceito do Laravel que se refere ao carregamento antecipado de relacionamentos entre modelos. No Laravel, quando você recupera um model que possui relacionamentos definidos, o framework carrega automaticamente os dados dos relacionamentos quando você acessa esses relacionamentos.</p><p>No entanto, quando você tem um cenário em que precisa recuperar vários modelos com seus relacionamentos, o carregamento automático de relacionamentos pode resultar em um problema conhecido como “N+1 queries”. Isso significa que o Laravel executará uma consulta para recuperar os models principais e em seguida, uma consulta adicional para cada modelo relacionado, resultando em um número excessivo de consultas ao banco de dados, por exemplo:</p><pre>$users = User::all();<br><br>foreach ($users as $user) {<br>    echo &quot;Usuário: &quot; . $user-&gt;name . &quot;\\n&quot;;<br>    <br>    // consulta adicional para cada post de cada usuário<br>    foreach ($user-&gt;posts as $post) {<br>        echo &quot;Post: &quot; . $post-&gt;title . &quot;\\n&quot;;<br>    }<br>}</pre><p>Para resolver esse problema e melhorar o desempenho, o Laravel oferece o <em>eager loading</em>. Com o <em>eager loading</em>, você pode carregar antecipadamente os dados dos relacionamentos associados aos modelos principais em uma única consulta, em vez de executar consultas separadas para cada relacionamento.</p><pre>$users = User::with(&#39;posts&#39;)-&gt;get();<br><br>foreach ($users as $user) {<br>    echo &quot;Usuário: &quot; . $user-&gt;name . &quot;\\n&quot;;<br>    <br>    foreach ($user-&gt;posts as $post) {<br>        echo &quot;Post: &quot; . $post-&gt;title . &quot;\\n&quot;;<br>    }<br>}</pre><p>Nesse exemplo, usamos o método <strong>with(&#39;posts&#39;)</strong> para carregar antecipadamente os posts relacionados aos usuários em uma única consulta. Dessa forma, o Laravel executará apenas duas consultas: uma para recuperar os usuários e outra para recuperar todos os posts relacionados. Isso evita o problema de &quot;N+1 queries&quot; e melhora o desempenho da aplicação.</p><p>Com o with, também é possível carregar vários relacionamentos antecipadamente:</p><pre>$users = User::with([&#39;posts&#39;, &#39;comments&#39;, &#39;profile&#39;])-&gt;get();</pre><p>O uso do <em>eager loading</em> é especialmente útil quando você tem uma grande quantidade de dados e relacionamentos complexos. Ele permite que você carregue antecipadamente os dados relacionados necessários de forma eficiente, reduzindo o número de consultas e melhorando o desempenho geral da aplicação.</p><h3>Dica 7: Utilize o método chunk para lidar com grandes volumes de dados</h3><p>O método <strong>chunk()</strong> do Laravel é utilizado para processar um grande conjunto de resultados de consulta em partes menores (chunks) em vez de recuperar todos os registros de uma só vez. Ele é útil quando você precisa realizar operações em lotes em grandes conjuntos de dados, evitando a sobrecarga de memória e melhorando o desempenho da sua aplicação.</p><p>Exemplo:</p><pre>User::query()-&gt;chunk(100, function ($users) {<br>    // Processar os resultados da consulta<br>});</pre><p>O primeiro parâmetro do método chunk é a quantidade de registros que quero pegar por lote, o segundo parâmetro é uma <em>closure</em> que recebe como parâmetro uma instância do conjunto de resultados (users) que contém os registros a serem processados em cada iteração.</p><p>Dentro da função de retorno do <strong>chunk()</strong>, você pode realizar qualquer operação que precise ser feita nos registros retornados. Por exemplo, você pode atualizar os registros, executar cálculos complexos ou realizar outras operações de processamento em lote.</p><h3>Dica 8: Reduza o consumo de memória com o método cursor</h3><p>O método <strong>cursor()</strong> do Laravel é usado para recuperar registros do banco de dados de forma eficiente e em um modo de &quot;<em>lazy loading</em>&quot; (carregamento sob demanda). Em vez de retornar todos os registros de uma só vez, o <strong>cursor()</strong> permite que você itere sobre os registros um por um, mantendo um consumo mínimo de memória.</p><p>Exemplo:</p><pre>foreach (User::cursor() as $user) {<br>    // Processar cada usuário individualmente<br>    echo &quot;Usuário: &quot; . $user-&gt;name . &quot;\\n&quot;;<br>}</pre><p>Neste exemplo, estamos usando o <strong>cursor()</strong> para iterar sobre cada registro da tabela de usuários. A cada iteração, um único registro é recuperado do banco de dados e o loop é executado. Isso permite que você trabalhe com os registros de forma eficiente, sem carregar todos eles na memória de uma vez.</p><p>Certo, e qual a diferença de fazer esse cursor do exemplo a cima e fazer:</p><pre>User::query()-&gt;chunk(1, function ($user) {<br>    echo &quot;Usuário: &quot; . $user-&gt;name . &quot;\\n&quot;;<br>});</pre><p>O resultado seria o mesmo, porém, o <strong>cursor()</strong> é mais apropriado quando você precisa iterar sobre registros individualmente com o mínimo consumo de memória, enquanto o <strong>chunk()</strong> é mais adequado para operações em lotes, mesmo que o tamanho do lote seja pequeno.</p><p>Este artigo apresenta algumas dicas e exemplos que tiveram um grande impacto na minha experiência como desenvolvedor Laravel. Embora eu tenha abordado apenas alguns pontos, tentei ser breve e objetivo. Gostaria de explorar mais algumas das dicas, mas o artigo ficaria muito grande. Espero que essas dicas sejam úteis para você e que você comece a enxergar o Laravel de uma maneira diferente, assim como aconteceu comigo. Vamos expandir nosso conhecimento e nos desafiar a explorar novas ferramentas e abordagens, abandonando o modo automático de programar. Acredito que isso nos ajudará a evoluir como desenvolvedores.</p><p><strong>Sobre o autor:</strong> Meu nome é <strong>Rodrigo Barboza</strong>, sou estudante de Engenharia de Computação na Universidade Federal do Vale do São Francisco e desenvolvedor na <a href="https://sysvale.com/"><strong>Sysvale Softgroup</strong></a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=17efd86591b6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/c%C3%B3digo-organizado-elegante-e-de-f%C3%A1cil-manuten%C3%A7%C3%A3o-dicas-de-laravel-17efd86591b6">Código organizado, elegante e de fácil manutenção: dicas de Laravel</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Descubra o poder do Metabase]]></title>
            <link>https://medium.com/sysvale/descubra-o-poder-do-metabase-6d5b2169521c?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/6d5b2169521c</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[metabase]]></category>
            <category><![CDATA[busines-intelligence]]></category>
            <dc:creator><![CDATA[Genival Rocha Machado]]></dc:creator>
            <pubDate>Thu, 01 Jun 2023 12:10:20 GMT</pubDate>
            <atom:updated>2023-06-01T12:10:20.605Z</atom:updated>
            <content:encoded><![CDATA[<p>Como transformar seus dados em insights valiosos</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Bs0g9awFIC99sDc35tKFFg.png" /><figcaption>Fonte: metabase.com</figcaption></figure><p>Mergulhe no mundo do Metabase e desvende sua capacidade de transformar dados em insights valiosos. Explore as etapas essenciais, desde a instalação até a criação de dashboards personalizados, e descubra como essa poderosa plataforma de análise de dados pode <strong>ajudá-lo a extrair o máximo valor de suas informações</strong>.</p><p><strong>O Metabase</strong></p><p>O Metabase é uma ferramenta de Business Intelligence (BI) de código aberto que permite ao usuário <strong>visualizar e analisar seus dados de forma fácil e intuitiva</strong>. Também possui uma interface amigável para criação de dashboards interativos, consultas, relatórios e compartilhar insights.</p><p>Uma de suas principais características é a interface de arrastar e soltar, a qual permite que usuários não técnicos criem visualizações de dados facilmente. Pode-se criar gráficos, tabelas, mapas e outros tipos de visualizações com apenas alguns cliques.</p><p>Outra grande vantagem do Metabase é ser uma ferramenta de código aberto, o que significa que você pode baixar, instalar e personalizar de acordo com suas necessidades. Além de oferecer uma comunidade ativa de desenvolvedores e usuários que fornecem suporte e contribuem com recursos adicionais.</p><p><strong>Disponibilização do Metabase</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*nGbXQFo0cluDlQwKPsrtgA.jpeg" /><figcaption>Fonte: metabase.com</figcaption></figure><p>O Metabase é construído e empacotado como um arquivo <strong>Java JAR</strong>, portanto bastar ter o Java configurado na sua máquina para poder utilizar o sistema.</p><p>Além do Java JAR a própria equipe do Metabase também disponibiliza o sistema em <strong>Docker</strong> e <strong>Metabase Cloud</strong>. Para mais informações basta acessar a <a href="https://www.metabase.com/docs/latest/installation-and-operation/start">documentação oficial</a> referente à instalação.</p><p><strong>Conhecendo o banco de dados</strong></p><p>Antes de falar sobre como explorar os dados vale frisar que o Metabase tem suporte a uma variedade de fontes de dados, dentre elas temos MySQL, PostgreSQL, SQL Server, MongoDB, Google Analytics, Amazon Redshift, Google BigQuery e muitas outras.</p><p>Em relação a explorar os dados o Metabase tem uma funcionalidade, chamada <strong>Explorar dados</strong>, que oferece uma interface amigável e interativa para explorar, filtrar, resumir e visualizar seus dados em tempo real, permitindo que você faça descobertas valiosas de forma rápida e intuitiva.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AAaO1_sIIpWzWjF6HFPLJA.png" /><figcaption>Fonte: metabase.com</figcaption></figure><p>Ao selecionar esta funcionalidade você será direcionado para uma interface onde pode selecionar a fonte de dados desejada e explorar as tabelas e colunas disponíveis nessa fonte de dados. A partir daqui, você pode realizar diversas ações para explorar seus dados.</p><p><strong>Criando dashboards</strong></p><p>Antes de criar um dashboard é necessário criar os gráficos, as tabelas e os indicadores que a mesma possuirá. Para criar esses elementos o Metabase dispõe a funcionalidade <strong>Pergunta</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/808/1*6uxrdWVal8zkbmBqLEKC9Q.png" /><figcaption>Fonte: o autor</figcaption></figure><p>As <strong>Perguntas</strong> são uma funcionalidade que permite fazer consultas e obter respostas rápidas e interativas sobre os dados. São uma forma mais simplificada de interagir com os dados, onde você pode fazer perguntas de forma livre, usando termos comuns da linguagem cotidiana, e o Metabase fará o trabalho de traduzir essas perguntas em consultas compreensíveis pelos bancos de dados.</p><p>Mas caso o usuário queria criar consultas mais complexas ou nativas existe a funcionalidade <strong>Consulta nativa</strong>, ao optar por esta opção será mostrada uma tela na qual o usuário poderá fazer consultas via código.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zmRz9-O0pfcYxXOI.png" /><figcaption>Fonte: metabase.com</figcaption></figure><p>A resposta de ambas, <strong>Perguntas</strong> e <strong>Consultas nativas</strong>, podem ser exibidas como tabelas, gráficos ou outros tipos de visualização, dependendo da natureza dos dados e da pergunta feita. Após obter o resultado desejado basta salvar sua pergunta.</p><p>Agora sim podemos criar nossas dashboards interativas utilizando os elementos salvos anteriormente. Para tal basta utilizar a interface arrasta e solta para posicionar os gráficos, tabelas e indicadores conforme desejado. Além disso também pode-se agrupar os elementos por seções, adicionar filtros e links externos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*19vgbLe5ykDk7FvGpgir1g.gif" /><figcaption>Fonte: metabase.com</figcaption></figure><p>Continua…</p><p><strong>Sobre o autor:</strong> Meu nome é <a href="https://www.linkedin.com/in/genival-rocha-machado/">Genival Rocha Machado</a>, sou formado em <strong>Engenharia da Computação</strong> pela Universidade Federal do Vale do São Francisco e pós-graduando em <strong>Data Science e Analytics</strong> pela USP/ESALQ e atualmente trabalho como Scrum Master na <a href="https://sysvale.com/"><strong>Sysvale Softgroup</strong></a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6d5b2169521c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/descubra-o-poder-do-metabase-6d5b2169521c">Descubra o poder do Metabase</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lógica de programação para iniciantes]]></title>
            <link>https://medium.com/sysvale/l%C3%B3gica-de-programa%C3%A7%C3%A3o-para-iniciantes-42ef50a899e1?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/42ef50a899e1</guid>
            <dc:creator><![CDATA[Jozian Rodrigues]]></dc:creator>
            <pubDate>Tue, 30 May 2023 12:43:51 GMT</pubDate>
            <atom:updated>2023-05-30T20:03:14.541Z</atom:updated>
            <content:encoded><![CDATA[<p>Olá, prezado leitor! É uma grande satisfação ter você aqui comigo nesse breve artigo para iniciantes em lógica de programação. Sou Jozian de Sousa Rodrigues, natural de São Caetano do Sul — SP, mas boa parte da minha vida peregrinei pelo Nordeste, moro em Petrolina — PE, casado, pai de 3 Gatas e 22 peixes. Sou Gestor de Tecnologia da Informação formado pela Faculdade de Ciências Aplicadas e Sociais de Petrolina-PE (Facape). Sou pós-graduado em Tecnologias Digitais Aplicadas à Educação pelo Instituto Federal do Sertão Pernambucano (IFSertãoPE).</p><p>Com o conhecimento adquirido fui motivado a escrever este artigo com a intenção de auxiliá-lo(a) na caminhada de aprendizagem a conceitos básicos sobre à Lógica da Programação para iniciantes. Ao longo desta leitura, você irá adquirir os principais conceitos fundamentais da programação e será capaz de entender pequenos comandos de programas utilizando a lógica de programação.</p><p><strong>CAPÍTULO 1: O MUNDO DA PROGRAMAÇÃO</strong></p><p>Segundo o levantamento feito pelo g1.globo.com o setor de Tecnologia deve gerar aproximadamente 420 mil vagas até 2025. Uma coisa que não é clara para muitos e talvez ainda não esteja claro na sua mente é que, uma das chaves para ingressar nesse mercado desafiador é definida por uma simples palavra <strong>“Qualificação”.</strong> Acredito que muitas empresas desejam que esta seja uma prática ou se torne comum para pessoas de diferentes idades.</p><p>E pensando nos avanços tecnológicos diversas empresas estão aderindo à políticas internas com foco em capacitação continua para seus colaboradores, desde adesão ou no desenvolvimento de plataformas que disponibilizam diversos cursos com apoio de vídeos, pdf, e-books, livros e muito mais. Posso dizer a você que sou prova viva disso, a empresa a qual faço parte, a Sysvale, me proporcionou a experiência de poder começar meus estudos nesse mundo de desenvolvimento ou como muitos dizem o mundo Dev.</p><p>Programar é basicamente ensinar uma máquina a resolver problemas, todos já resolvemos problemas e tomamos decisões diariamente, mesmo sem perceber. Um exemplo claro é: lembra aquela receita do bolo? Ou aquele passo a passo para você chegar ao seu trabalho? Ao programar, você organiza e compreende a maneira de como se resolve os problemas. Na verdade, você já toma decisões e realiza tarefas constantemente; programar é apenas ensinar uma máquina a fazer o mesmo.</p><p>A programação nada mais é que automatizar decisões e atividades através de instruções para que um dispositivo eletrônico consiga executar tarefas de forma automática. Quando você entende esse conceito, os códigos começam a fazer mais sentido. Para quem quer explorar o mundo da programação, entender o mundo da programação e seus conceitos e a base para a construção de programas de computador e entender como os programas funcionam e como desenvolvê-los de maneira eficiente. Neste artigo, iremos tratar o que é a lógica de programação, como ela funciona e apresentar alguns exemplos básicos.</p><p><strong>CAPÍTULO 2: HISTÓRIA DA COMPUTAÇÃO</strong></p><p>A história da computação é uma jornada fascinante vivida já a alguns anos. Os primeiros dispositivos de contagem até os sofisticados computadores que temos hoje, tais evoluções vem transformando o mundo. Cientistas, inventores e visionários desenvolveram tecnologias inovadoras ao longo do tempo que permitem o processamento de forma rápida das informações, automação de tarefas e conectividade universal. Podemos afirmar que os principais marcos dessa jornada nos mostram como os computadores se tornaram a força da nossa sociedade atual.</p><p>Através da tabela abaixo podemos mostrar de forma detalhada um pouco da evolução até os tempos atuais.</p><p><em>Tabela 1 — História da computação</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oms4scjhC-JABZZeRKojfA.jpeg" /><figcaption>Fonte: elaborado pelo autor (2023).</figcaption></figure><p>Tais computadores ainda utilizam números para processar informações, mas agora não precisamos nos comunicar com eles apenas pelos números. Isso não significa que você precise ser um expert em matemática para trabalhar com computadores. Mas possa te falar que é necessário ter uma mente super aberta para melhorar o pensamento lógico, que é crucial na programação.</p><p><strong>Evolução dos computadores:</strong></p><p><em>Figura 1 — Evolução dos computadores</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*S3i-fvBiz1Adig3B6A_Skw.png" /><figcaption>Fonte: <a href="https://www.conquerplus.com.br/course/6304127">https://www.conquerplus.com.br/course/6304127</a></figcaption></figure><p><strong>CAPÍTULO 3: LÓGICA DA PROGRAMAÇÃO</strong></p><p>A lógica de programação é a maneira de organizar instruções de forma lógica e sequencial, permitindo a criação de algoritmos para solucionar problemas. Que requerem habilidades como pensamento estruturado, tomada de decisões, repetição de ações e manipulação de dados, com o objetivo de desenvolver soluções eficientes e funcionais. Tal habilidade é extremamente fundamental na programação, possibilitando que os programadores criem programas de computador de maneira clara, lógica e assertiva.</p><p>As informações que visualizamos na tela de um computador podem ser transformadas em uma sequência de “zeros” e “uns”. Porém, seria muito complicado se tivéssemos que escrever e modificar a linguagem dos computadores usando somente “zeros” e “uns”, como era feito no passado com os cartões perfurados lembram? Com isto, foram desenvolvidas as linguagens de programação. Ao contrário dos “zeros” e “uns”, essas linguagens utilizam palavras comuns que são mais fáceis de entender e trabalhar com elas. Por exemplo, o branco puro na tela pode ser representado como 11111111 e o número 8 como 1000. As linguagens de programação possuem suas próprias regras e boas práticas, tornando a comunicação entre as pessoas e o computador, assim como entre os programadores, mais simples e eficiente.</p><p>Você ainda pode se perguntar qual a diferença entre lógica de programação e linguagem de programação?</p><p>A lógica de programação é a maneira de estruturar e organizar instruções de maneira lógica e sequencial, com foco em resolver problemas, já a linguagem de programação são regras e símbolos somados para escrever as instruções de forma compreensível para o computador. Nada mais é que a lógica de programação é a capacidade de pensar e planejar a solução de um problema, independentemente da linguagem utilizada e a linguagem de programação é a ferramenta que permite expressar essa solução em um formato que o computador possa entender e executar.</p><p>Ter uma boa lógica de programação é essencial para criar algoritmos eficientes e solucionar problemas de forma lógica, independentemente da linguagem escolhida.</p><p>Sequência lógica é a ordem e a conexão coerente de eventos, ações ou instruções, seguindo uma lógica ou raciocínio específico. É a capacidade de organizar passos ou elementos de forma sequencial e coerente, garantindo que cada etapa esteja corretamente relacionada à próxima. Uma sequência lógica é fundamental na programação, pois permite que as instruções sejam executadas na ordem correta e que a lógica do programa seja seguida de maneira consistente.</p><p>A lógica pode ser definida como a maneira que usamos para analisar se uma proposição é verdadeira ou falsa. E essa é a sua principal aplicação na programação. Usamos letras do alfabeto para representar as proposições</p><p>P, Q, R.</p><ul><li><strong>características obrigatórias de uma proposição:</strong></li><li>Sujeito definido</li><li>Sentido completo</li><li>Verbo</li><li>Possibilidade de ser</li><li>classificada em V ou F</li><li><strong>Não são proposições:</strong></li><li>Sentenças muito abertas</li><li>Sentenças muito amplas</li><li>Sentenças não objetivas</li></ul><p>Os conectivos lógicos são operadores que permitem combinar proposições e construir expressões lógicas mais complexas. Os principais conectivos lógicos são:</p><ul><li><strong>Conjunção (E):</strong> Representada pelo símbolo “E” ou “^”, a conjunção une duas proposições e só é verdadeira se ambas as proposições forem verdadeiras.</li><li><strong>Disjunção (OU):</strong> Representada pelo símbolo “OU” ou “∨”, a disjunção une duas proposições e é verdadeira se pelo menos uma das proposições for verdadeira.</li></ul><p><em>Figura 2 — Conectivos Lógicos</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wetwNGmoyuc3QnukzZn3Bw.png" /><figcaption>Fonte: <a href="https://www.conquerplus.com.br/course/6304127">https://www.conquerplus.com.br/course/6304127</a></figcaption></figure><ul><li><strong>Disjunção exclusiva</strong> <strong>(→):</strong> “ou p, ou q” podemos dizer que é um conectivo lógico que retorna verdadeiro quando apenas uma das proposições é verdadeira e a outra é falsa. Se as proposições tiverem os mesmos valores de verdade, o resultado é falso. É frequentemente usado para verificar a exclusividade de opções em lógica e programação.</li><li><strong>Condicional (→): </strong>Representado pelo símbolo “se…então”, o condicional estabelece uma relação de implicação entre duas proposições. Se a primeira proposição é verdadeira, a segunda também deve ser verdadeira.</li></ul><p><em>Figura 3 — Conectivos Lógicos</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Eyq47xFQkQvzG3jDEqQTTw.png" /><figcaption>Fonte: <a href="https://www.conquerplus.com.br/course/6304127">https://www.conquerplus.com.br/course/6304127</a></figcaption></figure><ul><li><strong>Bicondicional (↔):</strong> Representado pelo símbolo “se e somente se”, o bi condicional afirma que duas proposições são verdadeiras ou falsas em conjunto. Ambas as proposições devem ter o mesmo valor de verdade para que o bi condicional seja verdadeiro.</li></ul><p>Figura 4 — Conectivos Lógicos</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/437/1*RoEjZ_mvI5WOfBYj2qqb7A.png" /><figcaption>Fonte: <a href="https://www.conquerplus.com.br/course/6304127">https://www.conquerplus.com.br/course/6304127</a></figcaption></figure><p><strong>CAPÍTULO 4: ORGANIZAÇÃO COMPUTACIONAL</strong></p><p>Entendemos que a programação não apenas se concentra na criação de software, é essencial também compreender o hardware a parte física do computador. O primeiro passo consiste em compreender a organização de um computador, podemos dividir essa organização computacionais da seguinte maneira:</p><ul><li>Dispositivos de Entrada;</li><li>Memórias;</li><li>Unidade Central de Processamento (CPU);</li><li>Armazenamento de dados;</li><li>Dispositivos de Saída;</li></ul><p><em>Figura 5 — Componente básicos de um computador</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ytCt5ak3kB7zK-_c0mJKIQ.jpeg" /><figcaption>Fonte: elaborado pelo autor (2023).</figcaption></figure><p><strong>CAPÍTULO 5: O QUE SÃO ALGORITIMOS?</strong></p><p>Algoritmos é um conjunto de instrução sequencial e lógicas que descrevem um procedimento, ou seja, um passo a passo para resolver um problema. Na programação eles são a base ou o ponto chave, permitindo que os desenvolvedores desenvolvam soluções eficientes e automatizadas. Os algoritmos podem ser expressos em linguagens de programação ou de forma mais genérica, usando pseudocódigo. Eles são essenciais para a resolução de problemas computacionais, fornecendo uma abordagem estruturada e organizada para a solução de tarefas simples ou complexas.</p><p>A descrição narrativa, o fluxograma convencional e o pseudocódigo são formas de como podemos representar os algoritmos vejamos a explicação detalhada e exemplos de cada um:</p><p><strong>Descrição narrativa</strong>: é maneira de linguagem natural, onde as fases do algoritmo são descritas em sequência.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/438/1*1DddEnMFHmZ5AiQ6VkgcQQ.png" /><figcaption>Fonte: elaborado pelo autor (2023).</figcaption></figure><p><strong>Fluxograma convencional:</strong> poderá ser utilizados símbolos e setas para visualizar o fluxo das instruções, ajudando de forma mais clara a entender a ordem e as possíveis decisões no algoritmo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/239/1*UqFy5jjjn2Wp-GQ_ZWJdcA.png" /><figcaption>Fonte: elaborado pelo autor (2023).</figcaption></figure><p><strong>Pseudocódigo:</strong> é uma junção de linguagem natural com elementos de programação, possibilitando uma descrição mais detalhada das fases do algoritmo.</p><p><strong><em>Vamos para prática:</em></strong></p><pre>programa {<br>  funcao inicio() {<br>    escreva(&quot;Olá, Mundo novo!&quot;)<br>  }<br>}</pre><p>Nosso retorno em tela: <strong>Olá, Mundo novo!</strong></p><p>Cada caso terá suas vantagens e qualquer uma delas poderá ser escolhida de acordo com as preferências e necessidade do programador. Fica a seu critério escolher de acordo com seu contexto específico, das habilidades e proximidade do programador, bem como da clareza e eficiência desejadas na comunicação do algoritmo.</p><p><strong>CAPÍTULO 5: VARIÁVEIS E OPERADORES ARITMÉTICOS:</strong></p><p>Variáveis constantes são espaços reservados na memória do computador que armazenam valores que não se alteram ao longo do tempo. Ao contrário das variáveis, que podem ser modificadas, as constantes possuem um valor fixo e não são alteradas durante a execução do programa. Por exemplo, o valor de PI é uma constante que não muda. Enquanto as variáveis representam espaços na memória que podem ser alterados, as constantes servem para armazenar valores estáticos e imutáveis.</p><p>Podemos dizer que a memória de um computador é o local onde os dados e programas são armazenados e existem dois tipos de memórias:</p><ul><li><strong>Memória principal</strong>, que é aquela que guarda as informações usadas pelo sistema operacional e aplicativos.</li><li><strong>Memória secundária:</strong> que é utilizada para armazenar grandes volumes de dados. Exemplos de memória secundária incluem HDs, SSDs, pen drives e cartões Micro SD.</li></ul><p>Para armazenar os dados, a memória funciona como um arquivo com várias gavetas, onde cada gaveta guarda um valor específico.</p><p><strong>Tipos de dados:</strong></p><p>Em uma memória de um computador, encontramos duas classificações: instruções e dados. As instruções são aquelas responsáveis por orientar o funcionamento de uma máquina e caracterizar como os dados irão ser processados. Por fim os dados são conjuntos de objetos que compartilham um comportamento em relação a um conjunto de operações específicas. Por exemplo, podemos ter dados que representam números ou caracteres, e as instruções indicarão como realizar cálculos ou manipular esses dados de acordo com as necessidades do programa.</p><p><em>Figura 7 — Tipos de dados</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hoaPB7PXv6aCHXJKmXPKrg.jpeg" /><figcaption>Fonte: elaborado pelo autor (2023).</figcaption></figure><p><strong>Operadores de atribuição e aritmético:</strong></p><p>O operador de atribuição é usado para definir o valor de uma variável em um algoritmo ou programa. Ele é representado pelo sinal de igual (=), que indica que o valor à direita será aplicado à variável à esquerda. Por exemplo, ao escrevermos “x = 5”, estamos atribuindo o valor 5 à variável x. Essa operação é fundamental para armazenar e manipular dados durante a execução de um programa.</p><pre>programa {<br>  funcao inicio() {<br>    x: inteiro<br>    x = 10 // Utilizando o operador de atribuição para definir o valor de x como 10<br>    escreva(&quot;O valor de x é: &quot;, x)<br>  }<br>}</pre><p>Nosso retorno em tela: <strong>O valor de x é: 10</strong></p><p>Acredito que você lembre das expressões matemáticas que resolvíamos na escola, cheias de números e operadores como SOMA, SUBTRAÇÃO e MULTIPLICAÇÃO etc. Você sabe que na expressão 2 + 2 o sinal <strong>+</strong> é um operador que representa a soma. Correto? E sabe que essa expressão resulta no valor de (4). Procede? Então, você já entendeu o sentido dos operadores, assim devemos relacionar valores para resultar um outro valor.​</p><p>Existem 3 tipos de operadores: <strong>Aritméticos​,</strong> <strong>Lógicos</strong>​ e <strong>Relacionais​.</strong> Entender como funciona cada operador é muito importante para aprender programação mesmo que a representação simbólica possa variar entre as linguagens. Todos os programas utilizam operadores para realizar suas tarefas.</p><p><strong>Operadores relacionais e lógicos:</strong></p><p>Operadores relacionais são usados para comparar valores (de qualquer tipo), e dar como resultado de uma expressão relacional, ou seja, um valor booleano (VERDADEIRO ou FALSO). Representados por: igual​, diferente​, maior​, menor​, maior ou igual​, menor ou igual ​(Representados na tabela abaixo).</p><p>Não requer aqui explicar cada um, pois eles são autoexplicativos. Mas vale lembrar que para quem está iniciando em desenvolvimento de softwares, algumas informações podem ser importantes, principalmente pelo fato de haver diferença entre linguagens de programação se liga.</p><p><em>Tabela 3 — Operadores lógicos</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/431/1*ykjEsODynkVZKQs5F8Uddg.png" /><figcaption>Fonte: elaborado pelo autor (2023).</figcaption></figure><p>Os Operadores lógicos também conhecido como operadores booleanos, são usados para combinar resultados de expressões relacionais e retornar um valor booleano, que pode ser verdadeiro ou falso. Esses operadores nos permitem ter opções de criar condições mais complexas quando lidamos com a programação, pois proporcionam a avaliação de múltiplas expressões e a tomada de decisões com base nesses resultados.</p><ul><li>O operador <strong>“e”</strong> retorna verdadeiro apenas se ambas as expressões forem verdadeiras.</li><li>O operador <strong>“ou”</strong> retorna verdadeiro se pelo menos uma das expressões for verdadeira.</li><li>O operador <strong>“não”</strong> inverte o valor de verdadeiro para falso e vice-versa.</li></ul><p><em>Tabela 4 — Operadores lógicos</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/483/1*DEsq8EkYX3kkfS1aSm4raQ.png" /><figcaption>Fonte: elaborado pelo autor (2023).</figcaption></figure><pre>programa {<br>  funcao inicio() {<br>    real nota, frequencia<br>    escreva(&quot;Nota: &quot;) leia(nota)<br>    escreva(&quot;Frequência: &quot;) leia(frequencia)<br>    se (nota &gt; 7 e frequencia &gt;70){ escreva (&quot;Aprovado.&quot;)<br>  }<br>}</pre><p>Nosso retorno em tela:</p><p><strong>Nota: 10</strong></p><p><strong>Frequência: 100</strong></p><p><strong>Aprovado.</strong></p><p><strong>CAPÍTULO 6: ESTRUTURAS DE DECISÃO E REPETIÇÃO</strong></p><p>Podemos dizer que as estruturas de decisão foram criadas para gerir o fluxo e a execução de um programa com base em afirmações específicas, vejamos:</p><ul><li>A estrutura <strong>“SE”</strong> executa um bloco de código se uma condição for verdadeira.</li><li>A estrutura <strong>“ENQUANTO”</strong> executa repetidamente um bloco de código enquanto uma condição for verdadeira.</li><li>A estrutura <strong>“FAÇA-ENQUANTO”</strong> executa um bloco de código pelo menos uma vez e, em seguida, verifica se uma condição seja verdadeira para continuar executando ou não. Tais fluxos nos permitem criar programas mais dinâmicos e adaptáveis, controlando a execução com base em condições específicas.</li></ul><p><em>Tabela 5 — Estrutura de decisão</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/1*m9dqOL2a2PYA5m-O4sAJ7Q.png" /><figcaption>Fonte: elaborado pelo autor (2023).</figcaption></figure><p>Algumas possibilidades de como usar as estruturas:</p><pre>se media &lt; 10 entao<br>  escreva(&quot;Reprovado&quot;)<br><br>enquanto media &lt; 10 entao<br>  escreva(&quot;Reprovado&quot;)<br><br>faca {<br>    escreva(&quot;Esse é meu resultado \n&quot;)<br>} enquanto nota1 &lt;= 5</pre><p>A lógica de programação é um pontapé inicial na área da programação, podemos dizer que é o alicerce inicial, é onde iremos desenvolver pequenas soluções simples e eficientes, no começo confesso que é de forma desorganizada as vezes de maneira meio confusa, mas à medida que formos praticando vamos entendendo e melhorando aos poucos. Um dia por vez, mas calma MACHO, com foco e determinação iremos entender os princípios básicos da lógica de programação, e nós vulgos iniciantes iremos adquirindo mais habilidades essenciais e continuaremos crescendo e aprendendo a resolver problemas e desenvolver melhores e novos algoritmos.</p><p>Em resumo, a lógica de programação é o ponto de partida crucial para qualquer pessoa iniciante na programação. Ela no auxilia com fundamentos necessários para construir algoritmos eficientes, desenrolando problemas e desenvolvendo as famosas habilidades de pensamento lógico. Com uma estrutura firme em lógica de programação, por fim nós meros iniciantes estamos designados á explorar diferentes linguagens de programação e aumentar nossos conhecimentos no campo da computação.</p><p>Deus abençoe.</p><p>Bons estudos!</p><p><strong>REFERÊNCIAS</strong></p><p>G1.GLOBO.COM/. Área de TI deve gerar quase 420 mil vagas até 2025, mas faltam profissionais. Disponível em: <a href="https://g1.globo.com/jornal-hoje/noticia/2023/03/13/area-de-ti-deve-gerar-quase-420-mil-vagas-ate-2025-mas-faltam-profissionais.ghtml.">https://g1.globo.com/jornal-hoje/noticia/2023/03/13/area-de-ti-deve-gerar-quase-420-mil-vagas-ate-2025-mas-faltam-profissionais.ghtml.</a> Acesso em: 12 mai. 2023.</p><p>CONQUERPLUS.COM.BR. Lógica de programação. Disponível em: <a href="https://www.conquerplus.com.br/search?keyword=L%C3%B3gica+de+programa%C3%A7%C3%A3o.">https://www.conquerplus.com.br/search?keyword=L%C3%B3gica+de+programa%C3%A7%C3%A3o.</a> Acesso em: 1 mai. 2023.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=42ef50a899e1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/l%C3%B3gica-de-programa%C3%A7%C3%A3o-para-iniciantes-42ef50a899e1">Lógica de programação para iniciantes</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Iniciando com Kubernetes — Parte 2/2]]></title>
            <link>https://medium.com/sysvale/iniciando-com-kubernetes-parte-2-2-30f85037e05a?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/30f85037e05a</guid>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[containers]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Edwildson Coelho Rodrigues]]></dc:creator>
            <pubDate>Tue, 30 May 2023 12:06:37 GMT</pubDate>
            <atom:updated>2023-05-30T12:06:37.221Z</atom:updated>
            <content:encoded><![CDATA[<h3>Iniciando com Kubernetes — Parte 2/2</h3><p>Salve guys!</p><p>Eu me chamo Edwildson e sou desenvolvedor na Sysvale. Estão prontos para continuar nessa jornada fascinante do Kubernetes? Se você não leu a parte 1 deste arquivo <a href="https://medium.com/sysvale/iniciando-com-kubernetes-dd119597a267">clique aqui</a> para visualizá-lo.</p><p>Na primeira parte vimos como configurar o ambiente, criar clusters, implantar e gerenciar aplicações. Agora veremos como configurar recursos e técnicas avançadas, lidar com escalabilidade e tolerância a falhas, observar e monitorar o cluster.</p><h4>Configuração e Gerenciamento de Recursos:</h4><p>Ao utilizar o Kubernetes, é essencial entender como configurar e gerenciar os recursos que compõem sua infraestrutura e serviços.</p><ol><li><strong>Noções básicas sobre objetos Kubernetes</strong>:</li></ol><ul><li><strong>Pods, Services e Deployments</strong>: Se você chegou até aqui já deve saber o que são, então bora para os demais.</li><li><strong>ConfigMaps</strong>: Os ConfigMaps são objetos que permitem armazenar dados de configuração em formato de chave-valor. Eles são usados para injetar configurações em contêineres, evitando a necessidade de codificar configurações diretamente nos arquivos de imagem.</li><li><strong>Secrets</strong>: Os Secrets são objetos que fornecem uma maneira segura de armazenar e gerenciar informações sensíveis, como senhas, tokens de acesso e certificados. Eles são usados para proteger dados confidenciais em aplicativos e são frequentemente utilizados em conjunto com ConfigMaps.</li></ul><p>2. <strong>Utilização de arquivos de manifesto YAML</strong>:</p><ul><li>O Kubernetes utiliza arquivos de manifesto YAML para descrever a configuração da infraestrutura e dos serviços. Esses arquivos contêm definições dos objetos Kubernetes, como Pods, Services, Deployments, ConfigMaps e Secrets.</li><li>No arquivo de manifesto YAML, você especificará os detalhes de cada objeto, como nome, tipo, portas expostas, volume mounts e outras configurações relevantes.</li><li>Depois de criar ou atualizar o arquivo de manifesto, você pode aplicá-lo ao cluster Kubernetes usando o comando <strong>kubectl apply -f &lt;nome-do-arquivo.yaml&gt;</strong>. O Kubernetes lerá o arquivo e fará as alterações necessárias na infraestrutura e serviços.</li></ul><p>3. <strong>Configuração de redes, volumes e variáveis de ambiente</strong>:</p><ul><li><strong>Configuração de redes</strong>: O Kubernetes oferece diferentes opções de configuração de redes para os Pods se comunicarem entre si e com o mundo externo. Isso inclui a configuração de serviços, DNS interno, políticas de rede e definição de endereços IP.</li><li><strong>Configuração de volumes</strong>: Os volumes no Kubernetes permitem que os contêineres acessem e armazenem dados de forma persistente. Existem vários tipos de volumes disponíveis, como Volumes vazios, PersistentVolumes (PVs) e PersistentVolumeClaims (PVCs), que fornecem diferentes níveis de persistência e compartilhamento de dados.</li><li><strong>Variáveis de ambiente</strong>: As variáveis de ambiente podem ser configuradas em contêineres Kubernetes para fornecer configurações específicas, como chaves de API, URLs de serviços e outras informações dinâmicas. Essas variáveis podem ser definidas no arquivo de manifesto YAML ou em ConfigMaps e Secrets.</li></ul><p>Dominar a configuração e o gerenciamento de recursos no Kubernetes é essencial para aproveitar ao máximo essa plataforma. À medida que você ganha experiência, poderá explorar recursos mais avançados e personalizados para atender às necessidades específicas de sua aplicação.</p><h4>Escalabilidade e Tolerância a Falhas:</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/626/0*yekz7YZhX6e47M-b" /><figcaption>Imagem de <a href="https://br.freepik.com/fotos-gratis/conceito-de-negocio-com-holografia-grafica_20034608.htm#query=scalability&amp;position=0&amp;from_view=search&amp;track=sph">Freepik</a></figcaption></figure><p>A <strong>escalabilidade </strong>e a <strong>tolerância a falhas</strong> são aspectos cruciais ao executar aplicações no Kubernetes.</p><ol><li><strong>Dimensionamento automático de aplicações com base na demanda</strong>:</li></ol><ul><li><strong>HPA (Horizontal Pod Autoscaler)</strong>: O HPA é um recurso do Kubernetes que permite dimensionar automaticamente o número de réplicas de um Deployment com base na demanda de recursos. Ele monitora métricas, como utilização de CPU ou tráfego, e ajusta o número de réplicas para garantir que a aplicação tenha recursos suficientes para lidar com o tráfego.</li><li><strong>VPA (Vertical Pod Autoscaler)</strong>: O VPA é um recurso que ajusta automaticamente os limites de recursos (CPU e memória) atribuídos a um Pod, com base na utilização real desses recursos. Isso permite otimizar o uso de recursos e garantir que a aplicação tenha recursos adequados para funcionar corretamente.</li></ul><p>2. <strong>Configuração de políticas de recuperação automática</strong>:</p><ul><li><strong>Probes</strong>: As Probes são usadas para verificar a disponibilidade de um aplicativo em um Pod. Existem dois tipos principais de Probes: Liveness Probe e Readiness Probe. A Liveness Probe verifica se o aplicativo está em execução corretamente, e a Readiness Probe verifica se o aplicativo está pronto para receber tráfego.</li><li><strong>Restart Policy</strong>: A política de reinicialização define o comportamento do Kubernetes quando um contêiner falha ou termina. É possível configurar a política de reinicialização para determinar se o Kubernetes deve reiniciar automaticamente os contêineres em caso de falha.</li><li><strong>Recursos de recuperação automática</strong>: O Kubernetes oferece recursos de recuperação automática, como Rolling Updates, que permitem atualizar ou fazer rollbacks de implantações de forma controlada e gradual. Isso garante que a aplicação permaneça disponível durante as atualizações e permite reverter para uma versão anterior em caso de problemas.</li></ul><p>3. <strong>Estratégias para lidar com falhas em nós do cluster</strong>:</p><ul><li><strong>Tolerância a falhas</strong>: O Kubernetes é projetado para lidar com falhas de nós do cluster de forma transparente. Ele pode redistribuir automaticamente as cargas de trabalho para outros nós saudáveis e garantir a disponibilidade contínua da aplicação.</li><li><strong>Replicação e balanceamento de carga</strong>: Ao implantar uma aplicação no Kubernetes, é possível configurar várias réplicas de Pods para distribuir a carga entre os nós do cluster. Isso garante que, se um nó falhar, outros nós possam assumir a carga de trabalho e manter a aplicação em execução.</li><li><strong>Armazenamento persistente</strong>: Utilize volumes persistentes para armazenar dados de forma persistente. Ao usar volumes persistentes, os dados não são perdidos quando um nó falha ou é reiniciado.</li></ul><p>Ao implementar essas práticas de escalabilidade e tolerância a falhas, você estará construindo uma infraestrutura resiliente que pode se adaptar à demanda e lidar com falhas de forma eficiente. É importante considerar as necessidades específicas de sua aplicação e ajustar as configurações de acordo.</p><h4>Observabilidade e Monitoramento:</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/626/0*oWXSwPNjK5wdCjcE" /><figcaption><a href="https://br.freepik.com/fotos-gratis/homem-em-um-estudio-de-gravacao-producao-musical_7200229.htm#query=monitoring&amp;position=0&amp;from_view=search&amp;track=sph">Imagem de senivpetro</a> no Freepik</figcaption></figure><p>A <strong>observabilidade </strong>e o <strong>monitoramento </strong>são fundamentais para garantir o bom funcionamento do seu cluster Kubernetes.</p><ol><li><strong>Ferramentas e práticas para monitorar e observar clusters Kubernetes</strong>:</li></ol><ul><li><strong>Kubernetes Dashboard</strong>: O Kubernetes Dashboard é uma interface web que permite visualizar informações detalhadas sobre o cluster, como o estado dos nós, dos Pods e dos serviços. Ele fornece uma visão geral dos recursos e permite fazer inspeções mais detalhadas.</li><li><strong>kubectl</strong>: A ferramenta de linha de comando kubectl oferece vários comandos para monitorar e inspecionar o cluster Kubernetes. Você pode usar comandos como <strong>kubectl get</strong>, <strong>kubectl describe</strong> e <strong>kubectl logs</strong> para obter informações sobre os recursos e visualizar logs dos contêineres em execução.</li><li><strong>APIs do Kubernetes</strong>: O Kubernetes expõe APIs que permitem acessar e monitorar o estado do cluster e dos recursos. Você pode utilizar essas APIs para obter informações detalhadas e criar suas próprias ferramentas de monitoramento personalizadas.</li></ul><p>2. <strong>Registro de eventos, métricas e análise de logs</strong>:</p><ul><li><strong>Eventos do Kubernetes</strong>: O Kubernetes registra eventos para informar sobre ações e mudanças ocorridas no cluster. Os eventos fornecem informações úteis para entender o comportamento e o estado do cluster, ajudando a identificar problemas e tomar ações corretivas.</li><li><strong>Métricas do Kubernetes</strong>: O Kubernetes expõe várias métricas que podem ser coletadas e monitoradas para obter insights sobre o desempenho do cluster, dos nós e das aplicações. Essas métricas incluem utilização de CPU, memória, tráfego de rede e muito mais.</li><li><strong>Análise de logs</strong>: É importante coletar e analisar os logs dos contêineres em execução no cluster Kubernetes. Os logs podem conter informações valiosas para identificar problemas, depurar aplicações e entender o comportamento do sistema. Ferramentas como o Elasticsearch, Fluentd e Kibana (EFK) ou o Elasticsearch, Logstash e Kibana (ELK) são comumente utilizadas para coletar e visualizar logs.</li></ul><p>3. <strong>Utilização de soluções externas, como Prometheus e Grafana</strong>:</p><ul><li><strong>Prometheus</strong>: O Prometheus é uma popular solução de monitoramento e coleta de métricas que pode ser integrada ao Kubernetes. Ele coleta métricas de diferentes componentes do cluster e permite consultas flexíveis e alertas com base nessas métricas.</li><li><strong>Grafana</strong>: O Grafana é uma plataforma de visualização e monitoramento que pode ser utilizada em conjunto com o Prometheus para criar painéis e gráficos personalizados. Ele permite a criação de dashboards visualmente atraentes e oferece recursos avançados de consulta e análise de métricas.</li></ul><p>Integrar essas ferramentas e práticas de observabilidade e monitoramento ao seu cluster Kubernetes ajudará a <strong>identificar problemas, otimizar o desempenho e garantir uma operação confiável do sistema</strong>. Lembre-se de configurar alertas para ser notificado sobre eventos importantes e estar sempre atento às métricas relevantes para a saúde do seu cluster e das aplicações em execução.</p><h4>Avançado: Recursos e Técnicas Avançadas:</h4><p>Para aproveitar ao máximo o Kubernetes, é importante explorar recursos avançados e técnicas que permitem maior flexibilidade e integração com outros sistemas. Aqui estão alguns tópicos relacionados a esse tema:</p><ol><li><strong>Exploração de recursos avançados do Kubernetes</strong>:</li></ol><ul><li><strong>StatefulSets</strong>: Os StatefulSets são usados para lidar com aplicações que exigem identificadores únicos e armazenamento persistente, como bancos de dados. Eles garantem que cada Pod tenha um estado único e estável, permitindo a escala e a atualização dessas aplicações de forma segura.</li><li><strong>DaemonSets</strong>: Os DaemonSets permitem executar um Pod em cada nó do cluster. Isso é útil para tarefas que precisam ser executadas em todos os nós, como coleta de métricas ou configuração de serviços de monitoramento.</li><li><strong>Jobs</strong>: Os Jobs são usados para executar tarefas em lotes, que são executadas uma única vez até a conclusão. Isso é útil para trabalhos pontuais, como processamento de dados em massa ou migrações de bancos de dados.</li></ul><p>2. <strong>Integração com sistemas externos</strong>:</p><ul><li><strong>Bancos de dados</strong>: É possível integrar o Kubernetes com bancos de dados externos, como MySQL, PostgreSQL ou MongoDB. Isso envolve a criação de serviços e a configuração correta das conexões com os bancos de dados dentro dos Pods.</li><li><strong>Sistemas de mensageria</strong>: O Kubernetes pode ser integrado a sistemas de mensageria, como RabbitMQ ou Apache Kafka, para criar arquiteturas de microsserviços assíncronas e escaláveis. É possível utilizar bibliotecas ou adaptadores específicos para se conectar aos sistemas de mensageria.</li></ul><p>3. <strong>Uso de recursos personalizados e extensões do Kubernetes</strong>:</p><ul><li><strong>Custom Resource Definitions (CRDs)</strong>: Os CRDs permitem a criação de recursos personalizados no Kubernetes. Isso permite estender a funcionalidade do Kubernetes e definir recursos específicos do domínio da sua aplicação.</li><li><strong>Operators</strong>: Os Operators são controladores personalizados que automatizam a operação e o gerenciamento de aplicativos complexos no Kubernetes. Eles utilizam CRDs para definir e gerenciar recursos específicos de um aplicativo, simplificando as operações diárias.</li><li><strong>Extensões do Kubernetes</strong>: Além dos recursos nativos, o Kubernetes possui várias extensões e integrações disponíveis na forma de plugins e addons. Essas extensões podem adicionar recursos adicionais, como autenticação, autorização, monitoramento avançado ou gerenciamento de rede.</li></ul><p>Explorar esses recursos e técnicas avançadas do Kubernetes permitirá que você crie arquiteturas mais complexas, integre-se com sistemas externos e estenda a funcionalidade do Kubernetes para atender às necessidades específicas da sua aplicação. É importante lembrar de considerar as melhores práticas, manter a segurança e garantir a estabilidade e confiabilidade do seu cluster.</p><figure><img alt="E por fim…" src="https://cdn-images-1.medium.com/max/626/0*XSzqGvWQj4Rh1j6y" /><figcaption><a href="https://br.freepik.com/fotos-gratis/homem-surpreendido-horizontal-olhando-para-o-relogio-de-pulso-tocando-sua-cabeca-sendo-tarde-posando-isolado-sobre-cinza_6514169.htm#query=at%20last&amp;position=27&amp;from_view=search&amp;track=ais">Imagem de drobotdean</a> no Freepik</figcaption></figure><p>E por fim… Neste artigo, exploramos os fundamentos do Kubernetes, desde sua definição e <strong>conceitos básicos</strong> até a comparação com outras soluções de orquestração de contêineres.</p><p>O Kubernetes se tornou a escolha preferida para orquestração de contêineres devido à sua <strong>flexibilidade</strong>, <strong>escalabilidade </strong>e recursos avançados. Ao seguir as etapas abordadas neste artigo, você estará preparado para dar seus primeiros passos com o Kubernetes e começar a aproveitar seus benefícios.</p><p>É importante ressaltar a importância de continuar aprendendo e explorando os recursos e práticas recomendadas do Kubernetes à medida que você ganha mais experiência. A comunidade do Kubernetes está sempre em constante evolução, com atualizações e novos recursos sendo lançados regularmente. Portanto, manter-se atualizado e participar de eventos e comunidades relacionadas ao Kubernetes é fundamental para aprimorar suas habilidades e se manter atualizado com as melhores práticas.</p><p>Lembre-se de que, embora o Kubernetes possa ser desafiador no início, com dedicação, prática e o uso adequado dos recursos disponíveis, você estará bem encaminhado para dominar essa poderosa plataforma de orquestração de contêineres.</p><p>Agora que você está familiarizado com os conceitos e práticas iniciais do Kubernetes, sinta-se à vontade para explorar ainda mais, experimentar e aplicar o Kubernetes em seus projetos. Não tenha medo de explorar além do básico e buscar soluções personalizadas que se adaptem às suas necessidades específicas.</p><p>Esperamos que este artigo tenha sido útil para você começar sua jornada com o Kubernetes. <strong>Aproveite o poder do Kubernetes para orquestrar suas aplicações em contêineres de forma eficiente, escalável e confiável</strong>. Boa sorte em suas explorações com o Kubernetes!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/153/0*xXNt9F4R7RembmyC.png" /></figure><p>Sobre o autor:<strong> </strong><a href="https://www.linkedin.com/in/edwildson/"><strong>Edwildson Coelho Rodrigues</strong></a><strong> </strong>— É desenvolvedor na <a href="https://sysvale.com/">Sysvale Softgroup</a> e formando no curso de Engenharia da Computação.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=30f85037e05a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/iniciando-com-kubernetes-parte-2-2-30f85037e05a">Iniciando com Kubernetes — Parte 2/2</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Iniciando com Kubernetes]]></title>
            <link>https://medium.com/sysvale/iniciando-com-kubernetes-dd119597a267?source=rss----4280bac0b2f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/dd119597a267</guid>
            <category><![CDATA[contêineres]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[orquestração]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[escalabilidade]]></category>
            <dc:creator><![CDATA[Edwildson Coelho Rodrigues]]></dc:creator>
            <pubDate>Tue, 30 May 2023 12:05:45 GMT</pubDate>
            <atom:updated>2023-05-30T12:07:41.102Z</atom:updated>
            <content:encoded><![CDATA[<h3>Iniciando com Kubernetes — Parte 1/2</h3><p>Salve guys!</p><p>Eu me chamo Edwildson e sou desenvolvedor na Sysvale. Estão prontos para embarcar na jornada fascinante do Kubernetes? Se você está começando agora e deseja entender o que exatamente é essa tal de orquestração de contêineres, você está no lugar certo! Neste guia, <strong>vamos simplificar o Kubernetes para você</strong> que está dando os primeiros passos nesse mundo empolgante.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/626/0*Mr9gxlR3njLLV5Rt" /><figcaption><a href="https://br.freepik.com/vetores-gratis/personagens-de-pessoas-segurando-uma-rede-blockchain_2921442.htm#query=kubernetes&amp;position=2&amp;from_view=search&amp;track=ais">Imagem de rawpixel.com</a> no Freepik</figcaption></figure><p><strong>O Kubernetes é como um super-herói dos contêineres</strong>. Ele ajuda no gerenciamento de aplicativos e serviços que rodam dentro desses contêineres. Mas o que são contêineres? São como pacotes autossuficientes que abraçam tudo que seu aplicativo precisa para funcionar: código, bibliotecas, dependências e até configurações. E a <strong>orquestração é a prática de gerenciar um grupo de contêineres de forma eficiente</strong>.</p><p>O Kubernetes veio para <strong>simplificar </strong>a vida dos desenvolvedores. Com ele, você pode se concentrar em criar seus aplicativos incríveis sem se preocupar tanto com a infraestrutura por trás. Ele possui <strong>recursos poderosos</strong>, como dimensionamento automático, recuperação automática de falhas e distribuição de carga. Tudo isso para manter seus aplicativos em execução de maneira confiável, mesmo em situações desafiadoras.</p><p><strong>Neste artigo, vamos abordar os conceitos fundamentais do Kubernetes</strong>, bem facinho. Vamos mostrar como configurar seu ambiente, criar um cluster do Kubernetes e implantar seus aplicativos. Vamos também explorar as principais ferramentas do Kubernetes, como Pods, Services e Deployments.</p><h4>Fundamentos do Kubernetes:</h4><p>O Kubernetes é uma plataforma de código aberto que permite a orquestração de contêineres. Mas o que isso realmente significa? <strong>Vamos desvendar</strong>!</p><p>— <strong>Contêineres</strong>: Comecemos com o conceito de contêineres. Eles são como pacotes que contêm todos os componentes necessários para executar um aplicativo, incluindo código, bibliotecas e dependências. Os contêineres são leves, portáteis e isolados uns dos outros, o que facilita a implantação consistente de aplicativos em diferentes ambientes.</p><p>— <strong>Orquestração</strong>: Agora, imagine que você tem vários contêineres de diferentes aplicativos que precisam ser implantados, gerenciados e escalados. Aqui é onde entra a orquestração. <strong>O Kubernetes permite coordenar e automatizar</strong> todas essas tarefas complexas para que seus contêineres funcionem em harmonia.</p><p>— <strong>Unidades básicas</strong> do Kubernetes:</p><ul><li><strong>Pod</strong>: É a unidade fundamental no Kubernetes. Um pod é um grupo de um ou mais contêineres que compartilham o mesmo ambiente de execução, como endereço IP e espaço de armazenamento. Os contêineres em um pod são geralmente co-localizados e se comunicam entre si.</li><li><strong>Node (nó)</strong>: É uma máquina (física ou virtual) que executa o Kubernetes. Cada nó é responsável por executar os contêineres e outros componentes do Kubernetes.</li><li><strong>Cluster</strong>: É um conjunto de nós (nodes) que trabalham juntos para executar aplicativos. O Kubernetes gerencia e distribui as tarefas de forma inteligente entre os nós do cluster para garantir que tudo funcione de maneira eficiente e resiliente.</li><li><strong>Serviço (Service)</strong>: É um recurso abstrato que define um conjunto lógico de pods e uma política de acesso a esses pods. Um serviço permite que os pods sejam descobertos e acessados de forma confiável, independentemente de sua localização no cluster.</li></ul><p>Esses são apenas alguns dos conceitos básicos do Kubernetes. À medida que você se aprofunda, descobrirá mais recursos e conceitos poderosos que o Kubernetes oferece.</p><h4>Configuração do Ambiente:</h4><figure><img alt="Configurando o ambiente." src="https://cdn-images-1.medium.com/max/626/0*tujfCOC27D1j21S9" /><figcaption><a href="https://br.freepik.com/fotos-gratis/trabalhador-com-configuracoes-de-tablet_5399980.htm#query=setting&amp;position=1&amp;from_view=search&amp;track=sph">Imagem de pressfoto</a> no Freepik</figcaption></figure><p>Antes de começar a utilizar o Kubernetes, é importante configurar o ambiente de maneira adequada.</p><ol><li><strong>Opções de instalação</strong> do Kubernetes em diferentes plataformas:</li></ol><ul><li><strong>Instalação local</strong>: Você pode instalar o Kubernetes em seu ambiente de desenvolvimento local usando ferramentas como Minikube ou Kind. Isso permite que você experimente o Kubernetes em uma configuração de cluster de um único nó.</li><li><strong>Nuvem pública</strong>: As principais provedoras de nuvem pública, como Amazon Web Services (AWS), Google Cloud Platform (GCP) e Microsoft Azure, oferecem serviços gerenciados de Kubernetes, como o Amazon Elastic Kubernetes Service (EKS), Google Kubernetes Engine (GKE) e Azure Kubernetes Service (AKS). Essas opções simplificam a configuração e o gerenciamento do cluster Kubernetes em uma infraestrutura em nuvem.</li><li><strong>Nuvem privada</strong>: Se você possui uma infraestrutura própria, é possível implantar o Kubernetes em um ambiente de nuvem privada usando ferramentas como o Rancher ou OpenShift. Essas soluções permitem a criação e o gerenciamento de clusters Kubernetes em sua própria infraestrutura.</li></ul><p>2. <strong>Requisitos de hardware e software</strong>:</p><ul><li><strong>Hardware</strong>: Os requisitos de hardware podem variar dependendo do tamanho do cluster e dos recursos necessários para suas cargas de trabalho. Em geral, você precisará de nós (nodes) com recursos como CPU, memória e armazenamento suficientes para executar os contêineres e os serviços do Kubernetes de maneira eficiente. Além disso, é recomendável ter uma rede com boa conectividade entre os nós do cluster.</li><li><strong>Software</strong>: O Kubernetes pode ser executado em diferentes sistemas operacionais, incluindo Linux, Windows e macOS. Você precisará de uma versão compatível do sistema operacional, além de ferramentas como o Docker para executar os contêineres. É importante garantir que as versões do Kubernetes, Docker e outras dependências estejam em conformidade com os requisitos da versão que você está instalando.</li></ul><p>3. <strong>Ferramentas úteis</strong> para o gerenciamento do Kubernetes:</p><ul><li><strong>Kubectl</strong>: É uma ferramenta de linha de comando utilizada para interagir com o cluster Kubernetes. Ela permite criar, modificar e gerenciar recursos no cluster, além de fornecer informações sobre o estado do cluster e dos pods.</li><li><strong>Dashboard</strong>: O Kubernetes Dashboard é uma interface gráfica que fornece uma visão geral do cluster e permite visualizar e gerenciar os recursos do Kubernetes de forma intuitiva. É uma opção conveniente para aqueles que preferem uma abordagem mais visual.</li><li><strong>Helm</strong>: É um gerenciador de pacotes para o Kubernetes que simplifica a implantação e o gerenciamento de aplicativos. Com o Helm, você pode instalar, atualizar e desinstalar aplicativos em seu cluster Kubernetes de forma simples e padronizada.</li><li><strong>Monitoramento e logs</strong>: Existem várias ferramentas de monitoramento e logs disponíveis para o Kubernetes, como o Prometheus e o Grafana. Essas ferramentas permitem monitorar a saúde do cluster, coletar métricas e analisar registros para solução de problemas e otimização de desempenho.</li></ul><p>Lembre-se de consultar a <a href="https://kubernetes.io/pt-br/docs/home/">documentação oficial do Kubernetes</a> e das ferramentas específicas para obter instruções detalhadas sobre como configurar o ambiente de acordo com sua plataforma e requisitos específicos.</p><h4>Criação do Primeiro Cluster:</h4><figure><img alt="Criando o primeiro cluster." src="https://cdn-images-1.medium.com/max/626/0*oPALFJ7akSA9p9hp" /><figcaption><a href="https://br.freepik.com/free-ai-image/dispositivos-de-mainframe-em-racks-na-sala-com-conteudo-de-internet-cibernetica-de-big-data-luz-neon-gabinete-de-servidor-de-computacao-em-nuvem-moderno-sistema-de-hardware-de-armazenamento-de-comunicacao_40583175.htm#query=Cluster&amp;position=2&amp;from_view=search&amp;track=sph">Imagem de svstudioart</a> no Freepik</figcaption></figure><p>Segue um <strong>passo a passo simplificado para criar um cluster Kubernetes</strong> básico usando a ferramenta Minikube:</p><ol><li><strong>Instalação do Minikube e das dependências:</strong></li></ol><ul><li>Verifique se você tem o hypervisor adequado instalado em sua máquina, como o VirtualBox ou o KVM, dependendo do seu sistema operacional.</li><li>Faça o download e instale o Minikube de acordo com as instruções específicas do seu sistema operacional.</li></ul><p>2. <strong>Inicialização do cluster com Minikube:</strong></p><ul><li>Abra um terminal ou prompt de comando e execute o seguinte comando: <strong>minikube start</strong>. Isso irá inicializar o cluster Kubernetes local usando o Minikube.</li><li>Aguarde enquanto o Minikube configura o cluster. Isso pode levar alguns minutos.</li></ul><p>3. <strong>Verificação do cluster:</strong></p><ul><li>Após a inicialização bem-sucedida, execute o comando <strong>kubectl cluster-info</strong> para verificar o estado do cluster e obter informações sobre o servidor API do Kubernetes.</li><li>Execute o comando <strong>kubectl get nodes</strong> para verificar se o nó do cluster está em execução e pronto para receber cargas de trabalho.</li></ul><p>4. <strong>Implantação de um aplicativo de exemplo:</strong></p><ul><li>Você pode implantar um aplicativo de exemplo para testar o cluster. Por exemplo, execute o comando <strong>kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4</strong> para implantar um aplicativo &quot;echoserver&quot; simples no cluster.</li><li>Em seguida, execute o comando <strong>kubectl expose deployment hello-minikube --type=NodePort --port=8080</strong> para expor o aplicativo como um serviço no cluster.</li></ul><p>5. <strong>Acesso ao aplicativo</strong>:</p><ul><li>Para acessar o aplicativo, execute o comando <strong>minikube service hello-minikube</strong> para abrir o aplicativo no navegador padrão.</li><li>Você verá uma página exibindo uma resposta do aplicativo “echoserver”, confirmando que o aplicativo foi implantado com sucesso.</li></ul><p>Esse é um exemplo simplificado de criação de um cluster Kubernetes usando o Minikube.</p><h4>Implantação e Gerenciamento de Aplicações:</h4><figure><img alt="Gerenciando contêiners" src="https://cdn-images-1.medium.com/max/626/0*QdUTOBDjm49oY0KR" /><figcaption><a href="https://br.freepik.com/fotos-gratis/close-up-do-homem-de-negocios-com-tabuleta-digital_855036.htm#query=management&amp;position=3&amp;from_view=search&amp;track=sph">Imagem de pressfoto</a> no Freepik</figcaption></figure><p>Implantar e gerenciar aplicações no Kubernetes é uma das principais vantagens dessa plataforma.</p><ol><li><strong>Criação de imagens de contêineres adequadas para o Kubernetes</strong>:</li></ol><ul><li><strong>Escolha uma base adequada</strong>: Comece selecionando uma imagem base adequada para o seu aplicativo. Existem várias opções disponíveis, como imagens oficiais do Docker Hub ou imagens personalizadas baseadas em suas necessidades específicas.</li><li><strong>Dockerfile</strong>: Utilize um arquivo Dockerfile para definir as etapas necessárias para criar a imagem do contêiner. O Dockerfile contém as instruções para instalar dependências, configurar o ambiente e copiar os arquivos do aplicativo para o contêiner.</li><li><strong>Build da imagem</strong>: Utilize o comando <strong>docker build</strong> para construir a imagem do contêiner com base no Dockerfile. Certifique-se de especificar um nome e uma tag adequados para a imagem.</li><li><strong>Registro de imagens</strong>: Envie a imagem criada para um registro de imagens, como o Docker Hub ou um registro privado, para que ela possa ser acessada pelos nós do cluster Kubernetes durante a implantação.</li></ul><p>2. <strong>Implantação de uma aplicação em um cluster Kubernetes:</strong></p><ul><li><strong>Manifesto de implantação</strong>: Crie um manifesto de implantação em formato YAML ou JSON para definir como a aplicação deve ser implantada no cluster Kubernetes. O manifesto inclui detalhes como nome da implantação, imagem do contêiner, portas expostas, réplicas desejadas e outros recursos necessários.</li><li><strong>Aplicação do manifesto</strong>: Utilize o comando <strong>kubectl apply -f &lt;nome-do-arquivo.yaml&gt;</strong> para aplicar o manifesto de implantação ao cluster. Isso iniciará o processo de implantação da aplicação nos nós disponíveis.</li><li><strong>Verificação da implantação</strong>: Utilize o comando <strong>kubectl get deployments</strong> para verificar o status da implantação da aplicação. Você poderá ver o número de réplicas em execução, a disponibilidade e outros detalhes relevantes.</li></ul><p>3. <strong>Escalonamento, atualização e rollbacks de aplicações</strong>:</p><ul><li><strong>Escalonamento</strong>: Utilize comandos como <strong>kubectl scale</strong> para aumentar ou diminuir o número de réplicas de uma implantação. Isso permite ajustar a capacidade da aplicação de acordo com as demandas do tráfego.</li><li><strong>Atualização</strong>: Para atualizar a aplicação, faça alterações no manifesto de implantação, como a versão da imagem do contêiner. Em seguida, utilize o comando <strong>kubectl apply -f &lt;nome-do-arquivo.yaml&gt;</strong> novamente para aplicar as alterações ao cluster. O Kubernetes irá gerenciar a atualização de forma gradual e controlada, garantindo a disponibilidade contínua da aplicação.</li><li><strong>Rollbacks</strong>: Em caso de problemas com uma atualização, é possível realizar um rollback para uma versão anterior da aplicação. Utilize o comando <strong>kubectl rollout undo deployment &lt;nome-da-implantação&gt;</strong> para reverter para a versão anterior da implantação.</li></ul><p>4. <strong>Monitoramento e logs das aplicações</strong>:</p><ul><li><strong>Monitoramento</strong>: Utilize ferramentas de monitoramento, como Prometheus e Grafana, para coletar métricas e monitorar o desempenho da aplicação no cluster Kubernetes. Configure alertas para ser notificado em caso de problemas.</li></ul><p>Para que este artigo não se torne cansado para se ler este foi dividido em 2 partes. Então <a href="https://medium.com/sysvale/iniciando-com-kubernetes-parte-2-2-30f85037e05a">nos vemos lá</a>, até mais!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/153/0*xXNt9F4R7RembmyC.png" /></figure><p>Sobre o autor:<strong> </strong><a href="https://www.linkedin.com/in/edwildson/"><strong>Edwildson Coelho Rodrigues</strong></a><strong> </strong>— É desenvolvedor na <a href="https://sysvale.com/">Sysvale Softgroup</a> e formando no curso de Engenharia da Computação.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dd119597a267" width="1" height="1" alt=""><hr><p><a href="https://medium.com/sysvale/iniciando-com-kubernetes-dd119597a267">Iniciando com Kubernetes</a> was originally published in <a href="https://medium.com/sysvale">sysvale</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>