<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>(dev) Lucas Polo</title><link>https://blog.lucaspolo.dev/</link><description>Recent content on (dev) Lucas Polo</description><image><title>(dev) Lucas Polo</title><url>https://blog.lucaspolo.dev/images/og-default.png</url><link>https://blog.lucaspolo.dev/images/og-default.png</link></image><generator>Hugo -- 0.157.0</generator><language>pt-br</language><lastBuildDate>Wed, 23 Sep 2026 00:10:23 -0300</lastBuildDate><atom:link href="https://blog.lucaspolo.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Criando ciclos - A maneira abrangente</title><link>https://blog.lucaspolo.dev/posts/criando-ciclos-a-maneira-abrangente/</link><pubDate>Wed, 23 Sep 2026 00:10:23 -0300</pubDate><guid>https://blog.lucaspolo.dev/posts/criando-ciclos-a-maneira-abrangente/</guid><description>Como usar seno e cosseno para criar ciclos suaves, controlando amplitude, período, linha central e fase, com gráficos e um exemplo em Python.</description></item><item><title>Sobre</title><link>https://blog.lucaspolo.dev/about/</link><pubDate>Fri, 06 Mar 2026 11:44:08 -0300</pubDate><guid>https://blog.lucaspolo.dev/about/</guid><description>&lt;p&gt;Olá! Meu nome é Lucas, eu sou residente aqui do Brasil, radioamador, nerd e engenheiro de software. Gosto de ocasionalmente compartilhar o que estou aprendendo, principalmente para ajudar a consolidar os meus aprendizados.&lt;/p&gt;
&lt;p&gt;Para acompanhar o blog, assine o &lt;a href="https://blog.lucaspolo.dev/index.xml"&gt;RSS&lt;/a&gt; ou navegue pelo &lt;a href="https://blog.lucaspolo.dev/archives/"&gt;arquivo com todos os posts&lt;/a&gt;. Meus projetos ficam no &lt;a href="https://github.com/lucaspolo"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Se precisar entrar em contato, mande um e-mail para &lt;code&gt;contato [at] lucaspolo.dev&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Coisas grátis para estudantes</title><link>https://blog.lucaspolo.dev/posts/coisas-gratis-para-estudantes/</link><pubDate>Wed, 14 Jun 2023 23:52:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/coisas-gratis-para-estudantes/</guid><description>Descontos e licenças gratuitas de software e serviços para estudantes, e como comprovar o vínculo com a instituição de ensino.</description></item><item><title>Feliz 2022!</title><link>https://blog.lucaspolo.dev/posts/feliz-2022/</link><pubDate>Mon, 03 Jan 2022 12:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/feliz-2022/</guid><description>Um recomeço para o blog em 2022 e materiais sobre covariância, contravariância e invariância em Python, C# e Scala.</description></item><item><title>Usando o operador de módulo para criar ciclos</title><link>https://blog.lucaspolo.dev/posts/usando-o-operador-de-modulo-para-criar-ciclos/</link><pubDate>Mon, 06 Dec 2021 14:20:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/usando-o-operador-de-modulo-para-criar-ciclos/</guid><description>Como o operador de módulo cria ciclos numéricos que voltam ao início, como contar de 0 a 5 e recomeçar, com exemplos em código.</description></item><item><title>Fazendo queries em JSON com jq</title><link>https://blog.lucaspolo.dev/posts/fazendo-queries-em-json-com-jq/</link><pubDate>Mon, 22 Nov 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/fazendo-queries-em-json-com-jq/</guid><description>Como usar o jq para formatar, filtrar e transformar arquivos JSON na linha de comando, com exemplos de consultas, condições e interpolação.</description></item><item><title>Criando um bot no Telegram</title><link>https://blog.lucaspolo.dev/posts/criando-um-bot-no-telegram/</link><pubDate>Mon, 15 Nov 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/criando-um-bot-no-telegram/</guid><description>Como criar um bot no Telegram com Python: registrar o bot no BotFather, responder comandos e consultar CEPs na API do ViaCEP.</description></item><item><title>Enviando SMS via Amazon Web Services SNS com Python</title><link>https://blog.lucaspolo.dev/posts/enviando-sms-via-amazon-web-services-sns-com-python/</link><pubDate>Mon, 08 Nov 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/enviando-sms-via-amazon-web-services-sns-com-python/</guid><description>Como enviar SMS com o Amazon SNS em Python usando a biblioteca boto3, do usuário com permissão ao script de envio.</description></item><item><title>Gerando código que gera código</title><link>https://blog.lucaspolo.dev/posts/gerando-codigo-que-gera-codigo/</link><pubDate>Mon, 01 Nov 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/gerando-codigo-que-gera-codigo/</guid><description>A ideia de geração de código do Programador Pragmático aplicada a um gerador de classes a partir de uma descrição simples.</description></item><item><title>Criando tarefas periódicas com o Celery Beat</title><link>https://blog.lucaspolo.dev/posts/criando-tarefas-perodicas-com-o-celery-beat/</link><pubDate>Mon, 25 Oct 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/criando-tarefas-perodicas-com-o-celery-beat/</guid><description>Como agendar tarefas periódicas com o Celery Beat, executando tasks do Celery em intervalos ou horários definidos.</description></item><item><title>Utilizando conjuntos no Redis</title><link>https://blog.lucaspolo.dev/posts/utilizando-conjuntos-no-redis/</link><pubDate>Mon, 18 Oct 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/utilizando-conjuntos-no-redis/</guid><description>Como usar os conjuntos (sets) do Redis para guardar valores únicos com SADD, SCARD, SISMEMBER, SPOP e SMEMBERS.</description></item><item><title>Manual básico do JUnit</title><link>https://blog.lucaspolo.dev/posts/manual-basico-do-junit/</link><pubDate>Thu, 14 Oct 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/manual-basico-do-junit/</guid><description>&lt;p&gt;Alguns anos atrás comecei a estudar TDD e como desenvolvia principalmente em Java na época comecei a aprender um pouco mais sobre o JUnit, o principal framework de testes de unidade do Java e um dos primeiros de todas as linguagens. Para me ajudar eu criei um pequeno manual prático sobre ele:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;class&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;SimpleSnipetJUnitTest&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;private&lt;/span&gt; Calculator calculator;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * Este método é invocado antes de cada teste, a annotation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * facilita isso
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @Before
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;void&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;setUp&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;//Tudo aqui será executado antes, servindo por exemplo para inicializar.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; calculator &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; Calculator();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * Este método é invocado após os testes, servindo, como exemplo, para liberar recursos.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @After
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;void&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;finalize&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * Teste comum, o método assertEquals realiza a operação de teste de igualdade.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @Test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;void&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;testeSimples&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd"&gt;int&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; calculator.&lt;span style="color:#50fa7b"&gt;sum&lt;/span&gt;(1, 2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; assertEquals(3, result);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * Teste para números de ponto flutuante.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * Destaque para o terceiro parâmetro, o delta, que define
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * qual a diferença decimal entre cada parâmetro.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @Test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;void&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;testeDePontoFlutuante&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd"&gt;float&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; calculator.&lt;span style="color:#50fa7b"&gt;divide&lt;/span&gt;(5, 2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;//O terceiro parâmetro é a diferença máxima entre os floats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; assertEquals(2.&lt;span style="color:#50fa7b"&gt;5&lt;/span&gt;, result, 0.&lt;span style="color:#50fa7b"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * Teste para exceções
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * Se não disparar a exceção, o método falha.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @Test (expected&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; CalculatorException.&lt;span style="color:#50fa7b"&gt;class&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;void&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;testeDeExcecao&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd"&gt;int&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; calculator.&lt;span style="color:#50fa7b"&gt;divide&lt;/span&gt;(5, 0);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Fazendo upload de arquivos para o Google Cloud Storage com Python</title><link>https://blog.lucaspolo.dev/posts/fazendo-upload-de-arquivos-para-o-google-cloud-storage-com-python-2/</link><pubDate>Mon, 11 Oct 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/fazendo-upload-de-arquivos-para-o-google-cloud-storage-com-python-2/</guid><description>&lt;p&gt;Algum tempo atrás precisei aprender a fazer upload de arquivos para o Google Cloud Storage. Uma das coisas que eu gosto de fazer para me ajudar aprender a fazer algo é criar um scriptzinho com o conceito do que quero, sem aplicar em grandes projetos, evitando assim grandes complexidades.&lt;/p&gt;
&lt;p&gt;Assim na época eu criei este script simples que faz o upload do arquivo em um bucket do GCS. A primeira coisa que você precisa fazer é ter instalada a biblioteca, para isso temos o bom e velho pip:&lt;/p&gt;</description></item><item><title>Medindo o tempo de aplicações de linha de comando</title><link>https://blog.lucaspolo.dev/posts/medindo-o-tempo-de-aplicacoes-de-linha-de-comando/</link><pubDate>Thu, 07 Oct 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/medindo-o-tempo-de-aplicacoes-de-linha-de-comando/</guid><description>&lt;p&gt;Vira e mexe precisamos testar o tempo de algo que roda em linha de comando, seja uma requisição através de cURL ou algum scripts/aplicação que construímos.&lt;/p&gt;
&lt;p&gt;O jeito mais simples e onipresente nas interfaces de linha de comando do Linux é o &lt;strong&gt;time&lt;/strong&gt;. Ele executa o comando passado para ele através de parâmetro e diz qual foi o tempo de execução:&lt;/p&gt;
&lt;p&gt;&lt;img alt="time python fibonacci.py" loading="lazy" src="https://blog.lucaspolo.dev/images/posts/medindo-o-tempo-de-aplicacoes-de-linha-de-comando/Screenshot_from_2021-10-07_00-15-02.png"&gt;
&lt;em&gt;Resultado da execução do time&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;time&lt;/strong&gt; pode ajudar muito, principalmente quando queremos comparar escalas de tempo muito diferentes, por exemplo uma mudança de código que mudou o tempo de execução de 1s para 100ms. Porém como a medida pode variar muito de execução devido a diversos fatores (cache, resolução de DNS, etc) testar apenas uma única vez pode não trazer resultados muito acurados, pois não temos tempo médio nem a variância do tempo. Para isso encontrei uma outra aplicação chamada &lt;a href="https://github.com/sharkdp/hyperfine"&gt;&lt;strong&gt;hyperfine&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Casamento de padrões (Pattern Matching)</title><link>https://blog.lucaspolo.dev/posts/casamento-de-padroes-pattern-matching/</link><pubDate>Mon, 04 Oct 2021 11:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/casamento-de-padroes-pattern-matching/</guid><description>&lt;p&gt;Há alguma tempo atrás eu aprendi um pouco de Scala, uma linguagem muito interessante que roda sobre a JVM. Apesar de ser muito similar ao Java a primeira vista logo depois de um pouco mais de aprendizado lidamos com recursos muito diferentes do que temos na linguagem mais velha. Um recurso que me surpreendeu foi o casamento de padrões, ou pattern matching em inglês e vou usa-la de exemplo aqui pois até onde conheço o pattern matching do Scala é um dos mais completos. Diversas outras linguagens implementam também o recurso de maneira similar e as vezes com um pouco menos de poder, por isso vale conferir a documentação antes de prosseguir.&lt;/p&gt;</description></item><item><title>O novo (mas nem tanto) switch/case do Java</title><link>https://blog.lucaspolo.dev/posts/o-novo-mas-nem-tanto-switch-case-do-java/</link><pubDate>Mon, 27 Sep 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/o-novo-mas-nem-tanto-switch-case-do-java/</guid><description>&lt;p&gt;Recentemente voltei a mexer mais com Java devido ao trabalho e também alguns conteúdos que eu estava acompanhando que utilizam a linguagem. Como estou utilizando o IntelliJ como IDE ela sugeriu algo muito interessante e que passei adotar sempre que posso, o nova sintaxe do switch/case.&lt;/p&gt;
&lt;p&gt;A instrução switch case comum do Java segue algo muito similar a já implementada no C, um exemplo simples:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;package&lt;/span&gt; com.company;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;class&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;Main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;static&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;void&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;main&lt;/span&gt;(String&lt;span style="color:#ff79c6"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;var&lt;/span&gt; nome &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;Cebolinha&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;switch&lt;/span&gt;(nome) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;case&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;Lucas&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Bem vindo programador Lucas&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;case&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;Grace&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Bem vinda programadora Grace Hopper&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;default&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Bem vindx pessoa programadora &amp;#34;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; nome);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta é a estrutura comum que já conhecemos, como você pode ver temos os casos específicos que tratamos, o caso padrão e para que a avaliação do switch/case pare precisamos utilizar a clausula &lt;em&gt;break&lt;/em&gt;, o que chega a me dar &amp;ldquo;gastura&amp;rdquo; em switch/cases muito grandes.&lt;/p&gt;</description></item><item><title>Pytest: Pequeno manual para o dia a dia - Fixtures</title><link>https://blog.lucaspolo.dev/posts/pytest-pequeno-manual-para-o-dia-a-dia-fixtures/</link><pubDate>Mon, 20 Sep 2021 11:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/pytest-pequeno-manual-para-o-dia-a-dia-fixtures/</guid><description>&lt;p&gt;Depois que comecei a programar em Python no dia a dia eu me deparei com uma das ferramentas mais legais de teste que conheci, o Pytest. Por padrão o Python já vem com uma ferramenta de testes chamada Unittest, que é muito boa e funcional, porém como ela foi criada junto com o Python algumas arestas dela ficaram soltas, principalmente por não utilizar toda a potência que a própria linguagem oferece. Aqui eu vou deixar algumas coisas muito interessantes que uso no meu dia a dia e como podem servir principalmente como um guia rápido do Pytest.&lt;/p&gt;</description></item><item><title>Quem programa as linguagens de programação?</title><link>https://blog.lucaspolo.dev/posts/quem-programa-as-linguagens-de-programacao/</link><pubDate>Mon, 13 Sep 2021 11:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/quem-programa-as-linguagens-de-programacao/</guid><description>&lt;p&gt;Acredito que todo programador já se perguntou ou irá se perguntar como as linguagens de programação são feitas, principalmente se você não teve nenhuma disciplina como compiladores na faculdade. Eu me fiz essa pergunta algumas vezes e aprendi muito com ela. Se você pesquisar na internet sobre como compiladores são feitos ou perguntar por ai um dos conteúdos que irá descobrir é o excelente, porém bem complexo para iniciantes, Compiladores: Princípios, técnicas e ferramentas de Alfred V. Aho Et al.&lt;/p&gt;</description></item><item><title>Escrevendo um sistema operacional em Rust de Philipp Oppermann</title><link>https://blog.lucaspolo.dev/posts/escrevendo-um-sistema-operacional-em-rust-de-philipp-opperman/</link><pubDate>Mon, 06 Sep 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/escrevendo-um-sistema-operacional-em-rust-de-philipp-opperman/</guid><description>&lt;p&gt;Eu me lembro que em 2008 eu imaginei como seria criar um sistema operacional e na época eu busquei algo na internet para fazer uma introdução no assunto. Eu lembro que a primeira coisa que imaginei foi que pelo menos a &amp;ldquo;entrada&amp;rdquo; do sistema operacional precisaria ser escrita em Assembly. Procurando pela internet algo como &amp;ldquo;fazer um Hello World bootável&amp;rdquo;, ou como criar um programa que não precisa de sistema operacional para escrever algo na tela. Lembro-me que encontrei algo em C sobre um tal de endereço &lt;strong&gt;0x800000&lt;/strong&gt; mas ficou por isso mesmo, na época o assunto estava muito além do que eu conseguia fazer facilmente e também não continuei aprendendo para entender como fazer algo.&lt;/p&gt;</description></item><item><title>Fazendo queries SQL em arquivos CSV</title><link>https://blog.lucaspolo.dev/posts/fazendo-queries-sql-em-arquivos-csv/</link><pubDate>Thu, 02 Sep 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/fazendo-queries-sql-em-arquivos-csv/</guid><description>&lt;p&gt;Vira e mexe eu recebo alguns arquivos CSV que preciso fazer algum filtro ou alguma análise. Eu gosto muito de usar o Python para alguns processamentos, mas não é a coisa mais prática do mundo, ou abrir um script ou abrir um Jupyter Notebook para essa análise. Foi então que descobri que o DBeaver pode nos ajudar com este processo e é muito simples.&lt;/p&gt;
&lt;p&gt;Após abrirmos o DBeaver basta criarmos uma nova conexão e selecionarmos o diretório onde constará o(s) arquivo(s) CSV.&lt;/p&gt;</description></item><item><title>Realizando commits parciais no Git</title><link>https://blog.lucaspolo.dev/posts/realizando-commits-parciais-no-git/</link><pubDate>Mon, 30 Aug 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/realizando-commits-parciais-no-git/</guid><description>&lt;p&gt;Durante o desenvolvimento é comum alterarmos o mesmo arquivo diversas vezes e se você gosta de manter um histórico consistente de suas alterações você pode esbarrar na situação onde um arquivo foi alterado em mais de um ponto e quer separar em commits distintos essas alterações.&lt;/p&gt;
&lt;p&gt;Pra exemplificar este aqui é o código que iremos trabalhar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; collections &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; namedtuple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Cliente &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; namedtuple(&lt;span style="color:#f1fa8c"&gt;&amp;#39;Cliente&amp;#39;&lt;/span&gt;, &lt;span style="color:#f1fa8c"&gt;&amp;#39;nome,idade&amp;#39;&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;split(&lt;span style="color:#f1fa8c"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;inserir_cliente&lt;/span&gt;(cliente):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;Cliente &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;cliente&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;nome&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; inserido com sucesso&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;ok&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;test_inserir_cliente&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cliente &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; Cliente(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Monicão&amp;#34;&lt;/span&gt;, &lt;span style="color:#bd93f9"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; resultado &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; inserir_cliente(cliente)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;assert&lt;/span&gt; resultado &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;ok&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora o que queremos fazer é adicionar uma função que verifica se o cliente é valido (o nome deverá ter mais de três caracteres e a idade deve ser um número maior ou igual a zero).&lt;/p&gt;</description></item><item><title>O jeito pythonico das propriedades no Python - Parte 2</title><link>https://blog.lucaspolo.dev/posts/o-jeito-pythonico-das-propriedades-no-python-parte-2/</link><pubDate>Mon, 23 Aug 2021 11:01:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/o-jeito-pythonico-das-propriedades-no-python-parte-2/</guid><description>&lt;p&gt;Este post é uma sequência &lt;a href="https://blog.lucaspolo.dev/posts/o-jeito-pythonico-das-propriedades-no-python-parte-1/"&gt;deste outro post&lt;/a&gt; sobre os getters, vale apena conferi-lo antes.&lt;/p&gt;
&lt;p&gt;Após entendermos melhor como funcionam as propriedades em Python e aplicarmos os &lt;em&gt;getters&lt;/em&gt; em nossa classe Circulo, ficamos com a pendência de entender como podemos agora aplicarmos os &lt;em&gt;setters.&lt;/em&gt; O principio é muito similar e simples. Para isso basta definirmos o método em questão e decorá-lo com &lt;strong&gt;@nome_da_propriedade.setter&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; math
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;class&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;Circulo&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;__init__&lt;/span&gt;(&lt;span style="font-style:italic"&gt;self&lt;/span&gt;, raio):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-style:italic"&gt;self&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;_raio &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; raio
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @property
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;raio&lt;/span&gt;(&lt;span style="font-style:italic"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="font-style:italic"&gt;self&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;_raio
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @property
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;area&lt;/span&gt;(&lt;span style="font-style:italic"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="font-style:italic"&gt;self&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;raio &lt;span style="color:#ff79c6"&gt;**&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;2&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;*&lt;/span&gt; math&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;pi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @property
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;circunferencia&lt;/span&gt;(&lt;span style="font-style:italic"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="font-style:italic"&gt;self&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;raio &lt;span style="color:#ff79c6"&gt;*&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;2&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;*&lt;/span&gt; math&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;pi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @raio.setter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;raio&lt;/span&gt;(&lt;span style="font-style:italic"&gt;self&lt;/span&gt;, value):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;assert&lt;/span&gt; value &lt;span style="color:#ff79c6"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;0&lt;/span&gt;, &lt;span style="color:#f1fa8c"&gt;&amp;#39;O valor do raio deve ser maior que 0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-style:italic"&gt;self&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;_raio &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; Circulo(&lt;span style="color:#bd93f9"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(c&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;area)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;raio &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aproveitei também para já colocar uma validação no método e passei a utilizá-lo no método &lt;em&gt;__init__&lt;/em&gt;. A criação é muito simples e prática, apesar de a API do setter não ser tão intuitiva, seu funcionamento é tão simples como a criação dos getters. Por se tratar um método podemos inclusive fazer outras computações nele, como por exemplo criar um setter para a área:&lt;/p&gt;</description></item><item><title>Visualizando diferenças de código de maneira mais simples com o Delta</title><link>https://blog.lucaspolo.dev/posts/visualizando-diferencas-de-codigo-de-maneira-mais-simples-com-o-delta/</link><pubDate>Thu, 19 Aug 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/visualizando-diferencas-de-codigo-de-maneira-mais-simples-com-o-delta/</guid><description>&lt;p&gt;Eu sempre tive um pouco de dificuldade de assimilar as diferenças de código do jeito padrão do Git, que é feita da forma padrão do diff do GNU/Linux. É algo que vem muito com o hábito e em arquivos pequenos é até mais simples visualizar as diferenças:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Saída do git diff padrão em example.lox, com as linhas removidas em vermelho e as adicionadas em verde, uma abaixo da outra" loading="lazy" src="https://blog.lucaspolo.dev/images/posts/visualizando-diferencas-de-codigo-de-maneira-mais-simples-com-o-delta/Screenshot_from_2021-08-18_11-27-40.png"&gt;
&lt;em&gt;Visualização de diferença com o diff padrão&lt;/em&gt;&lt;/p&gt;</description></item><item><title>O jeito pythonico das propriedades no Python - Parte 1</title><link>https://blog.lucaspolo.dev/posts/o-jeito-pythonico-das-propriedades-no-python-parte-1/</link><pubDate>Mon, 16 Aug 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/o-jeito-pythonico-das-propriedades-no-python-parte-1/</guid><description>&lt;p&gt;Uma constante na orientação a objetos é a presença de propriedades dentro dos objetos quando precisamos armazenar dados para alguma manipulação posterior. É muito comum, principalmente quando viemos de outras linguagens, criarmos os  famosos getters and setters para manter também um bom nível de encapsulamento. Vamos ter como exemplo a classe &lt;em&gt;Circulo&lt;/em&gt; abaixo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; math
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;class&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;Circulo&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;__init__&lt;/span&gt;(&lt;span style="font-style:italic"&gt;self&lt;/span&gt;, raio):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-style:italic"&gt;self&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;raio &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; raio
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;area&lt;/span&gt;(&lt;span style="font-style:italic"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="font-style:italic"&gt;self&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;raio &lt;span style="color:#ff79c6"&gt;**&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;2&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;*&lt;/span&gt; math&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;pi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;circunferencia&lt;/span&gt;(&lt;span style="font-style:italic"&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="font-style:italic"&gt;self&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;raio &lt;span style="color:#ff79c6"&gt;*&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;2&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;*&lt;/span&gt; math&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;pi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; Circulo(&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(c&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;raio)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(c&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;area())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(c&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;circunferencia())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perceba que para definirmos um círculo temos que passar o seu raio, com isso podemos calcular facilmente a sua área e circunferência. Precisamos também acessar ocasionalmente esse raio, podemos fazer isso através de dos getters que comentamos, mas isso não é o jeito do Python, ou como falaremos, o jeito mais Pythonico.&lt;/p&gt;</description></item><item><title>Minha aventura com o DNS no Ubuntu - meu primeiro contato com o systemd</title><link>https://blog.lucaspolo.dev/posts/minha-aventura-com-o-dns-no-ubuntu-meu-primeiro-contato-com-o-systemd/</link><pubDate>Mon, 09 Aug 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/minha-aventura-com-o-dns-no-ubuntu-meu-primeiro-contato-com-o-systemd/</guid><description>&lt;p&gt;Há algum tempo eu precisei mexer com as configurações de DNS no meu computador para conseguir utilizar o excelente projeto Pi Hole. Para quem não conhece, o Pi Hole é um projeto de servidor de DNS que possui uma lista de servidores de propaganda e bloqueia elas. Ele é excelente pois ao contrário dos Ad-Blockers ele não é tão facilmente detectável e como o bloqueio ocorre já na requisição de DNS ele também ajuda a economizar banda.&lt;/p&gt;</description></item><item><title>Analisando queries no PostgreSQL</title><link>https://blog.lucaspolo.dev/posts/analisando-queries-no-postgresql/</link><pubDate>Mon, 02 Aug 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/analisando-queries-no-postgresql/</guid><description>&lt;p&gt;O banco de dados é uma das partes mais importantes de qualquer aplicação e da mesma forma que as linguagens de programação que usamos, as vezes é necessário depurar o que está acontecendo dentro dele.&lt;/p&gt;
&lt;p&gt;Uma das coisas que sempre devemos fazer ao digitar uma query nova que será utilizada pelo nosso programa é analisar o seu custo computacional no banco. Para conseguirmos fazer isso no PostgreSQL basta ativarmos uma diretriz antes da query (usaremos um banco de dados de filmes como exemplos que peguei &lt;a href="https://www.postgresqltutorial.com/postgresql-sample-database/"&gt;aqui&lt;/a&gt;):&lt;/p&gt;</description></item><item><title>O problema de Monty Hall e como estatística não é algo intuitivo</title><link>https://blog.lucaspolo.dev/posts/o-problema-de-monty-hall-e-como-estatistica-nao-e-algo-intuitivo/</link><pubDate>Thu, 29 Jul 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/o-problema-de-monty-hall-e-como-estatistica-nao-e-algo-intuitivo/</guid><description>&lt;p&gt;Quando estudamos estatística é muito comum esbarrarmos no problema de Monty Hall. Monty Hall era um programa de TV onde o apresentador oferecia três portas para uma pessoa, atrás de uma delas havia um prêmio e das outras duas alguma coisa desagradável para dar o tom de humor do programa. Aqui no Brasil tinhamos o nosso equivalente apresentado pelo Sérgio Malandra, a Porta dos Desesperados. Aqui temos uma explicação do problema com sua solução:&lt;/p&gt;</description></item><item><title>Melhorando as requisições assíncronas com Python - Parte 3</title><link>https://blog.lucaspolo.dev/posts/melhorando-as-requisicoes-assincronas-com-python-parte-3/</link><pubDate>Mon, 26 Jul 2021 13:45:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/melhorando-as-requisicoes-assincronas-com-python-parte-3/</guid><description>&lt;p&gt;Este post é uma continuidade dos posts &lt;a href="https://blog.lucaspolo.dev/posts/lendo-arquivos-csv-em-python-e-fazendo-requisicoes-parte-1/"&gt;Lendo arquivos CSV em Python e fazendo requisições&lt;/a&gt; e do post &lt;a href="https://blog.lucaspolo.dev/posts/fazendo-requests-concorrentemente-assincronas-no-python-parte-2/"&gt;Fazendo requests concorrentemente (assíncronas) no Python&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Após fazermos as requests assíncronas no último post obtivemos uma melhoria signifcativa em nosso processamento, conseguindo paralelizar as requests e reduzindo muito o tempo. Porém não estamos fazendo o melhor proveito da API async do Python, percebam que cada função async também é responsável por também imprimir o resultado e o ideal seria retornarmos os resultados para tratar posteriormente. Vamos fazer isso:&lt;/p&gt;</description></item><item><title>Executando scripts no banco PostgreSQL com o psql</title><link>https://blog.lucaspolo.dev/posts/executando-scripts-no-banco-postgresql-com-o-psql/</link><pubDate>Thu, 22 Jul 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/executando-scripts-no-banco-postgresql-com-o-psql/</guid><description>&lt;p&gt;As vezes precisamos executar scripts grandes, como inserir uma massa de dados muito grande ou fazer diversas queries ao mesmo tempo. As ferramentas de bancos de dados ajudam muito nisso, mas as vezes o script pode ser tão grande que a ferramenta não aguenta e pode encher muito a memória (caso que aconteceu comigo recentemente onde o DBeaver tinha onze mil inserts para fazer).&lt;/p&gt;
&lt;p&gt;Felizmente existe uma ferramenta de linha de comando muito prática chamada &lt;a href="https://www.postgresql.org/docs/9.2/app-psql.html"&gt;&lt;strong&gt;psql&lt;/strong&gt;&lt;/a&gt;, ele é mantido também pelas mesmas pessoas do PostgreSQL e é muito eficiente. O &lt;strong&gt;psql&lt;/strong&gt; é um utilitário de linha de comando que permite executar comandos no banco de dados e também executar scripts em lote. Um exemplo de execução poderia ser assim:&lt;/p&gt;</description></item><item><title>Adicionando alterações em commits antigos com o rebase interativo</title><link>https://blog.lucaspolo.dev/posts/adicionando-alteracoes-em-commits-antigos-com-o-rebase-interativo/</link><pubDate>Mon, 19 Jul 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/adicionando-alteracoes-em-commits-antigos-com-o-rebase-interativo/</guid><description>&lt;p&gt;Durante o desenvolvimento é muito comum encontrarmos alterações para fazermos em arquivos que já foram alterados e não estão mais no último PR. Para não gerar um grande número commits de ajustes pequenos podemos reorganizar estas alterações utilizando o rebase interativo.&lt;/p&gt;
&lt;p&gt;Preciso deixar apenas um aviso importante, como alteramos a ordem dos
commits isso irá gerar uma reescrita de histórico de commits, assim caso
você já tenha feito o push da versão anterior para uma branch remota
será necessário refazer o procedimento com o famigerado &lt;strong&gt;&amp;ndash;force&lt;/strong&gt;, o
que pode trazer perdas de commits caso essa branch esteja sendo usada
por outra pessoa, outro ponto, &lt;strong&gt;evite fazer reescrita de histórico na
branch principal do projeto&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Achados: aprendendo Node.js</title><link>https://blog.lucaspolo.dev/posts/achados-aprendendo-node-js/</link><pubDate>Thu, 15 Jul 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/achados-aprendendo-node-js/</guid><description>&lt;p&gt;Comecei a trabalhar recentemente com Node.js e estou curtindo bastante as particularidades dele. Além do Javascript existe todo um mundo de conceitos por trás do Node.js, na forma como ele foi construido e sua arquitetura.&lt;/p&gt;
&lt;p&gt;A único &amp;ldquo;defeito&amp;rdquo; do Node.js para mim, que na verdade é algo do Javascript, é que se você for iniciante em programação logo de cara terá que lidar com a questão de programação concorrente, eventos e coisas um pouco mais complexas, o que em outras linguagens muitas vezes ficam para um segundo momento serem aprendidas.&lt;/p&gt;</description></item><item><title>Fazendo requests concorrentemente (assíncronas) no Python - Parte 2</title><link>https://blog.lucaspolo.dev/posts/fazendo-requests-concorrentemente-assincronas-no-python-parte-2/</link><pubDate>Mon, 12 Jul 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/fazendo-requests-concorrentemente-assincronas-no-python-parte-2/</guid><description>&lt;p&gt;Este post é uma continuação direta do post &lt;a href="https://blog.lucaspolo.dev/posts/lendo-arquivos-csv-em-python-e-fazendo-requisicoes-parte-1/"&gt;Lendo arquivos CSV em Python e fazendo requisições - Parte 1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Depois de conseguirmos ler o CSV e conseguirmos fazer requisições em lote, podemos agora iniciar uma primeira otimização, realizar as cotações em paralelo. Para isto usaremos a API assíncrona do Python em conjunto com uma nova biblioteca de requests, a &lt;a href="https://www.python-httpx.org/"&gt;HTTPX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A primeira coisa que faremos é alterar a biblioteca Python que utilizamos, adaptar a requisição e nosso programa para começar a trabalhar assíncronamente. As alterações são principalmente na definição das funções e também nas mudanças para as chamadas das funções assíncronas que agora precisam do &lt;em&gt;await&lt;/em&gt; antes:&lt;/p&gt;</description></item><item><title>Aprendendo a desenvolver jogos</title><link>https://blog.lucaspolo.dev/posts/aprendendo-a-desenvolver-jogos/</link><pubDate>Thu, 08 Jul 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/aprendendo-a-desenvolver-jogos/</guid><description>&lt;p&gt;Já faz algum tempo em que estou interessado a aprender a desenvolver jogos, apenas por diversão e aprendizado mesmo. A área de desenvolvimento de jogos tem algumas coisas muito diferentes do desenvolvimento que estou acostumado, por exemplo, em alguns momentos é comum carregar tudo na memória no inicio da execução para depois só ir exibindo, algo que as vezes pode ser dispendioso em um programa que precisa atender diversas requisições o mais rápido possível.&lt;/p&gt;</description></item><item><title>A infraestrutura da minha mesa</title><link>https://blog.lucaspolo.dev/posts/a-infraestrutura-da-minha-mesa/</link><pubDate>Mon, 05 Jul 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/a-infraestrutura-da-minha-mesa/</guid><description>&lt;p&gt;Recentemente tirei uma certificação de analista de infraestrtura da minha mesa! 😂&lt;/p&gt;
&lt;p&gt;Piadas a parte, consegui deixar minha mesa de trabalho muito organizada utilizando alguns acessórios bem diferentes. Possuo dois computadores, sendo um notebook do trabalho e o meu desktop onde estudo, programo e jogo. Além dos computadores tenho dois monitores na minha mesa, um na vertical que costumo trabalhar dividido em dois (muito útil para deixar chats abertos) e outro widescreen (que também costuma trabalhar dividido) na horizontal.&lt;/p&gt;</description></item><item><title>Pequeno achado: Por que numeração deve iniciar em zero? De Edsger Dijkstra</title><link>https://blog.lucaspolo.dev/posts/pequeno-achado-por-que-numeracao-deve-iniciar-em-zero-de-edsger-dijkstra/</link><pubDate>Thu, 01 Jul 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/pequeno-achado-por-que-numeracao-deve-iniciar-em-zero-de-edsger-dijkstra/</guid><description>&lt;p&gt;Talvez você não conheça, mas Edsger W. Dijkstra é um dos nomes mais proeminentes da história da ciência da computação, sendo uma das pessoas que trabalhou na área ainda nos primeiros protótipos de computadores. Caso você tenha estudado algoritmos já deve ter esbarrado no algoritmo de Dijkstra, que é para encontrar o menor caminho em grafos, mas caso ainda não tenha esbarrado em nenhum trabalho dele, vale apena conhecer &lt;a href="https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html"&gt;este artigo&lt;/a&gt; (em inglês) em que ele explica por que a número em sequências numéricas deve iniciar em zero, artigo indicado no excelente livro &lt;a href="https://novatec.com.br/livros/pythonfluente/"&gt;Python Fluente do Luciano Ramalho&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Lendo arquivos CSV em Python e fazendo requisições - Parte 1</title><link>https://blog.lucaspolo.dev/posts/lendo-arquivos-csv-em-python-e-fazendo-requisicoes-parte-1/</link><pubDate>Mon, 28 Jun 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/lendo-arquivos-csv-em-python-e-fazendo-requisicoes-parte-1/</guid><description>&lt;p&gt;Algumas vezes surge a necessidade de fazermos algum processamento em uma base de dados, como requisições e afins. É muito comum neste momento recebermos um CSV ou até mesmo uma planilha do Excel, ai neste momento devemos escrever um script que processe essa informação. Suponhamos que precisamos atualizar o nome de algum cliente dado seus &lt;em&gt;id&amp;rsquo;s&lt;/em&gt; e nomes, seguindo um arquivo neste modelo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt;id&lt;/span&gt;,&lt;span style="color:#f1fa8c"&gt;nome&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt;1&lt;/span&gt;,&lt;span style="color:#f1fa8c"&gt;Cebolinha&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt;2&lt;/span&gt;,&lt;span style="color:#f1fa8c"&gt;Monica&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt;3&lt;/span&gt;,&lt;span style="color:#f1fa8c"&gt;Magali&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt;4&lt;/span&gt;,&lt;span style="color:#f1fa8c"&gt;Cascão&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt;5&lt;/span&gt;,&lt;span style="color:#f1fa8c"&gt;Penadinho&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt;6&lt;/span&gt;,&lt;span style="color:#f1fa8c"&gt;Alminha&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt;7&lt;/span&gt;,&lt;span style="color:#f1fa8c"&gt;Horácio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A abordagem mais simples que eu sigo é iniciar criando uma função primária, que no geral chamo de &lt;em&gt;main&lt;/em&gt; e iterar no arquivo CSV usando um &lt;a href="https://gist.github.com/lucaspolo/12cba1fad758ec0c541527a0aa4a5fbd"&gt;DictReader&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Fira Code: a fonte para programadores</title><link>https://blog.lucaspolo.dev/posts/fira-code-a-fonte-para-programadores/</link><pubDate>Thu, 24 Jun 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/fira-code-a-fonte-para-programadores/</guid><description>&lt;p&gt;As vezes não nos atentamos aos pequenos detalhes da nosso dia a dia, e após anos programando e lendo código eu esbarrei numa coisa muito interessante: fontes para desenvolvedores.&lt;/p&gt;
&lt;p&gt;Estas fontes específicas para programação ajudam a realçar algumas características específicas do nosso cotidiano, como simbolos e outros detalhes, como também proprorcionam uma leitura agradável do código.&lt;/p&gt;
&lt;p&gt;A que venho usando nos último tempos é a &lt;a href="https://github.com/tonsky/FiraCode"&gt;Fira Code&lt;/a&gt;, uma fonte criada com uma funcionalide muito interessante, as ligaturas, que são conexões entre simbolos que semanticamente significam uma única coisa. Por exemplo, por mais que &amp;gt;= sejam dois simbolos, o significado é únificado, assim a Fira Code faz o seguinte quando utilizamos ele:&lt;/p&gt;</description></item><item><title>O poder do coletivo e o caminho das formigas</title><link>https://blog.lucaspolo.dev/posts/o-poder-do-coletivo-e-o-caminho-das-formigas/</link><pubDate>Mon, 21 Jun 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/o-poder-do-coletivo-e-o-caminho-das-formigas/</guid><description>&lt;p&gt;Alguns anos atrás esbarrei em um vídeo incrível do Nerdologia sobre &lt;strong&gt;O poder do Coletivo&lt;/strong&gt;, que falava como a inteligência das populações poderiam chegar em resultados excelentes para diversas questões (salvo algumas exceções, como polarizações). Todo esse conceito anda lado a lado com o conceito de Big Data e inteligência artifical, onde analisando dados individuais podemos chegar a resultados ótimos pois o erro da multidão tende a se aproximar de zero:&lt;/p&gt;</description></item><item><title>Dependências de montagem (build) do Python</title><link>https://blog.lucaspolo.dev/posts/dependencias-de-montagem-build-do-python/</link><pubDate>Thu, 17 Jun 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/dependencias-de-montagem-build-do-python/</guid><description>&lt;p&gt;Ocasionalmente precisamos instalar o Python na máquina montando (buildando) ele pelo código fonte, seja através de ferramentas como o &lt;em&gt;pyenv&lt;/em&gt; ou o &lt;em&gt;asdf&lt;/em&gt; como até manualmente. Para isso são necessárias algumas bibliotecas instaladas, segue a lista delas e o comando para instalar em sistemas baseados no Debian:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install dpkg-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; build-essential &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; python-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; python3-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libncursesw5-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libsqlite3-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libreadline-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libbz2-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libffi-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libssl-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libgdbm-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; zlib1g-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libjpeg-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libtiff-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libpq-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libxml2-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libxslt1-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libsdl2-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libsm-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libxtst-dev &lt;span style="color:#f1fa8c"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; libcurl4-openssl-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Resenha do Livro: Fundamentos de Algoritmos para Jogos Digitais de David Santos</title><link>https://blog.lucaspolo.dev/posts/resenha-do-livro-fundamentos-de-algoritmos-para-jogos-digitais-de-david-santos/</link><pubDate>Mon, 14 Jun 2021 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/resenha-do-livro-fundamentos-de-algoritmos-para-jogos-digitais-de-david-santos/</guid><description>&lt;p&gt;Recentemente eu estava em uma empreitada para aprender um pouco mais sobre desenvolvimento de jogos e comecei a procurar alguns materiais na internet. Hoje em dia boa parte desses materiais são voltados para os grandes frameworks de desenvolvimento de jogos, como o Unit, o que é muito interessante, pois além de facilitarem fazer coisas complexas também já se encaixam com os requisitos do mercado que adotam em massa estes frameworks. Porém eu não estava necessariamente querendo aprender a fazer coisas complexas, mas aprender as bases do desenvolvimento de jogos e tive uma grata surpresa ao descobrir o livro &lt;a href="https://algol.dev/livros/gds1/"&gt;Fundamentos de algoritmos para jogos digitais do David V. Santiago (versão Java).&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Criando entradas de desktop no Ubuntu</title><link>https://blog.lucaspolo.dev/posts/criando-entradas-de-desktop-no-ubuntu/</link><pubDate>Fri, 11 Jun 2021 01:09:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/criando-entradas-de-desktop-no-ubuntu/</guid><description>&lt;p&gt;Ocasionalmente baixamos diretamente o binário ou até mesmo criamos as nossas aplicações e queremos que elas apareçam na lista de aplicações do Ubuntu com icones e tudo. Para fazer isso é bem simples, basta criar um arquivo no diretório ~/.local/share/applications/, exemplo ~/.local/share/applications/meu_aplicativo.desktop. Depois disso basta preencher o arquivo com o seguinte formato:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;[Desktop Entry]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#50fa7b"&gt;Encoding&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#50fa7b"&gt;Name&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;Nome da Aplicação&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#50fa7b"&gt;Exec&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;/caminho/para/executavel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#50fa7b"&gt;Icon&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;/caminho/para/imagem/do/icone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#50fa7b"&gt;Terminal&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#50fa7b"&gt;Type&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;Application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#50fa7b"&gt;Categories&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;Development;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora já estará disponível o ícone na lista de aplicativos e você poderá invocar o aplicativo pelo launcher.&lt;/p&gt;</description></item><item><title>Minhas ferramentas do dia a dia - Aplicações</title><link>https://blog.lucaspolo.dev/posts/minhas-ferramentas-do-dia-a-dia-aplicacoes/</link><pubDate>Mon, 07 Jun 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/minhas-ferramentas-do-dia-a-dia-aplicacoes/</guid><description>&lt;p&gt;No dia a dia utilizo muitas aplicações para auxiliar no meu processo de trabalho, as principais são estas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://dbeaver.io/"&gt;DBeaver Community&lt;/a&gt;: este aqui é um destaque, aplicativo que permite acesso a diversos bancos de dados para gerenciamento e execução de queries. Já utilizei ele com PostgreSQL, MySQL, SQLite, MS SQL Server, Oracle e até Informix. Não digo que ele é perfeito, mas como permite a utilização com diversos bancos, é muito prático pois mantém tudo concentrado num único app.&lt;/p&gt;</description></item><item><title>Achados - Cheat Sheet fácil e rápido</title><link>https://blog.lucaspolo.dev/posts/achados-cheat-sheet-facil-e-rapido/</link><pubDate>Thu, 03 Jun 2021 12:35:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/achados-cheat-sheet-facil-e-rapido/</guid><description>&lt;p&gt;Por muito tempo fui adepto de usar os guias de consulta rápida, que eram pequenos livros bem leves e pequenos com um conteúdo resumido e direto sobre algum tópico. Hoje em dia estes livrinhos são apenas história, pois com a internet podemos acessar qualquer manual mais rapidamente e leve (num smartphone, por exemplo). Porém as documentações as vezes são extensas e fica dificil acessar um ponto específico que temos dúvida. Para isso existem os cheat sheets, que são como os guias de consultas rápidas, uma página única, com uma exmplicação concisa e um exemplo sobre o tópico apresentando.&lt;/p&gt;</description></item><item><title>Minhas ferramentas do dia a dia - Compiladores, Interpretadores, IDEs e Editores</title><link>https://blog.lucaspolo.dev/posts/minhas-ferramentas-do-dia-a-dia-compiladores-interpretadores-ides-e-editores/</link><pubDate>Mon, 31 May 2021 14:40:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/minhas-ferramentas-do-dia-a-dia-compiladores-interpretadores-ides-e-editores/</guid><description>&lt;p&gt;Continundo pelas ferramentas que uso no meu dia a dia, agora seguem meus compiladores, interpretadores, IDEs e editores&lt;/p&gt;
&lt;h2 id="compiladores-e-interpretadores"&gt;Compiladores e Interpretadores&lt;/h2&gt;
&lt;p&gt;Tenho trabalhado com diversas linguagens de programação e destas linguagens também em diversas versões diferentes, por isso ferramentas que me ajudam a gerênciar as linguagens e suas versões são essênciais:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/install-build-essential-ubuntu/#:~:text=The%20build%2Dessentials%20packages%20are,required%20to%20compile%20a%20program."&gt;build-essentials&lt;/a&gt;: isso aqui não é um software em si, mas um conjunto de diversas ferramentas que ajudam no build de software diversos, principalmente coisas desenvolvidas em C e C++. É algo que não vem por padrão em uma instalação GNU/Linux, mas a partir do momento que você precisa compilar uma aplicação isso será exigido.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/asdf-vm/asdf"&gt;asdf-vm&lt;/a&gt;: O asdf-vm surge como uma ferramenta universal para o gerenciamento de versões de intepretadores, compiladores e outras ferramentas. Sua utilização é bem simples, hoje utilizo ela principalmente para Python, NodeJS e Go. &lt;a href="https://www.programandocomcarlos.com.br/2020/01/asdf-gerenciador-de-versao-extensivel.html"&gt;Aqui um artigo em português sobre a instalação dele&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=rustup&amp;amp;oq=rustup&amp;amp;aqs=chrome.0.69i59j0l9.962j0j7&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;rustup&lt;/a&gt;: A ferramenta criada para gerênciar versões da suíte da linguagem Rust é uma mão na roda, além de facilitar a instalação e gerênciar versões, também permite controlar os alvos de compilação (seus toolchains, exemplo: Linux, Windows, ARM, etc).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openjdk.java.net/"&gt;OpenJDK&lt;/a&gt;: A implementação de referência do Java tem sido a minha preferida nos ambientes de desenvolvimento e execução faz um tempo. Lembro de antigamente ela ter uma performance inferior, porém cada vez mais a comunidade se uniu em torno dela para aprimora-la.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ides-e-editores"&gt;IDEs e Editores&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;: o editor de texto criado pela Microsoft tem se destacado muito nos últimos anos, principalmente pela facilidade que oferece para a utilização de plugins que o tornam uma ferramenta muito poderosa. Tenho utilizado ele principalmente para o desenvolvimento Python, Rust, NodeJS e Go, com os seguintes plugins:&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python"&gt;Python&lt;/a&gt;: extensão para programar e debugar em Python.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer"&gt;rust-analyzer&lt;/a&gt;: extensão que faz o linter, autocomplete e análise estática do código Rust.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb"&gt;CodeLLDB&lt;/a&gt;: extensão que permite debugar códigos gerados pela LLVM, utilizo para debugara projetos Rust, mas funciona para outras ferramentas que utilizam LLVM.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=serayuzgur.crates"&gt;crates&lt;/a&gt;: extensão para exibir quais dependências estão atualizadas e desatualizadas.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/languages/go"&gt;Go&lt;/a&gt;: extensão para análise e debugger de código Go.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/pycharm/download/"&gt;PyCharm Community&lt;/a&gt; e a suíte da JetBrains: A IDE da Jetbrains dedicada ao Python oferece muitos recursos interessante, desde o linter até o debugger integrado. Por ser um pouco mais pesado eu só utilizado nos projetos grandes com muitos arquivos, pois ele facilita muito a busca e análise no projeto. Uso principalmente o PyCharm, mas também gosto de usar as outras ferramentas disponíveis da JetBrains para projetos maiores, como a IntelliJ e Webstorm.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://micro-editor.github.io/"&gt;Micro Editor&lt;/a&gt;: Esse cara eu descobri recentemente e tem sido muito útil, como o próprio nome indica ele é um editor de terminal maior que o Nano mas bem mais simples que o Vim pois permite utilizar atalhos do dia a dia como Ctrl+S para salvar, Ctrl+C/Ctrl+V para copiar e colar. Utilizo muito para a edição de scripts mais simples em Bash e Python.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Micro Editor no terminal editando um script Python, com o aviso undefined name &amp;lsquo;send&amp;rsquo; do Flake8 na barra inferior" loading="lazy" src="https://blog.lucaspolo.dev/images/posts/minhas-ferramentas-do-dia-a-dia-compiladores-interpretadores-ides-e-editores/Screenshot_from_2021-05-25_11-23-41.png"&gt;
&lt;em&gt;Micro Editor: um editor simples que roda direto no terminal e faz até análise estática quando junto com o Flake8 (no caso de Python)&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Achados - Rust Cheat Sheet</title><link>https://blog.lucaspolo.dev/posts/achados-rust-cheat-sheet/</link><pubDate>Thu, 27 May 2021 14:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/achados-rust-cheat-sheet/</guid><description>&lt;p&gt;Gosto muito da praticidade dos cheat sheets, que são pequenas páginas, que podem ser impressas ou não, que contém um resumo sobre algum assunto específico. Desta vez quero compartilhar uma que descobri recentemente sobre a linguagem Rust, que venho aprendendo nos últimos tempos. Clique na imagem para acessar!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cheats.rs/"&gt;&lt;img alt="Página do Rust Language Cheat Sheet com o índice de seções: construções da linguagem, biblioteca padrão, ferramentas e guias" loading="lazy" src="https://blog.lucaspolo.dev/images/posts/achados-rust-cheat-sheet/image.png"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Minhas ferramentas do dia a dia - Sistemas operacionais e Terminal</title><link>https://blog.lucaspolo.dev/posts/minhas-ferramentas-do-dia-a-dia-sistemas-operacionais-e-terminal/</link><pubDate>Tue, 25 May 2021 03:19:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/minhas-ferramentas-do-dia-a-dia-sistemas-operacionais-e-terminal/</guid><description>&lt;p&gt;Durante a minha jornada venho acumulando algumas ferramentas para ajudar no meu dia a dia no desenvolvimento de software, na maior parte são coisas simples mas que fazem muita diferença na produtividade.&lt;/p&gt;
&lt;p&gt;Nesta primeira parte irei abordar os sistemas operacionais que uso e os aplicativos de terminal.&lt;/p&gt;
&lt;h2 id="sistemas-operacionais"&gt;Sistemas Operacionais&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ubuntu.com/"&gt;Ubuntu GNU/Linux&lt;/a&gt;: O Ubuntu tem sido meu sistema operacional há mais de dez anos. Quando desenvolvemos para a web, sistemas tipo Unix são preferênciais devido as ferramentas que eles já oferecem por padrão, além de serem na maioria dos casos os ambientes de deploy das aplicações. Além de toda a &amp;ldquo;tralha&amp;rdquo; de desenvolvimento, o GNU/Linux tem cada vez mais ferramentas para o uso comum, como editores e jogos. Eu gosto de usar o Ubuntu pois já sou acostumado com sua interface, mas acredito que a indicação aqui seja principalmente utilizar uma distribuição que você goste e se adapte.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/pt-br/windows/get-windows-10"&gt;Windows 10&lt;/a&gt;: O Windows tem sido uma grata surpresa para mim, além de utiliza-lo para as aplicações que só rodam no Windows, junto com o WSL2 tenho conseguido utilizar qualquer ferramenta GNU/Linux nele, inclusive aplicações gráficas graças ao X410.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="terminal"&gt;Terminal&lt;/h2&gt;
&lt;p&gt;A primeira coisa que vale citar é o emulador de terminal que utilizo, o &lt;a href="https://gnunn1.github.io/tilix-web/"&gt;Tilix&lt;/a&gt;. Ele possui algumas ferramentas bem interessantes como split de janelas, abas e é bem leve. Além disso ele possui o modo Quake, que é um modo onde o terminal aparece no topo da tela (ou onde você configurar) de maneira rápida de mais prática.&lt;/p&gt;</description></item><item><title>Meus pequenos aprendizados diários</title><link>https://blog.lucaspolo.dev/posts/meus-pequenos-aprendizados-diarios/</link><pubDate>Mon, 26 Apr 2021 00:12:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/meus-pequenos-aprendizados-diarios/</guid><description>&lt;p&gt;Sempre estamos aprendendo, pelo menos todo dia podemos tirar uma lição do que aconteceu. Algumas coisas são mais marcantes que outras, inclusive podem e devem ser repassadas para outros, podendo ajudar pessoas que estão iniciando ou até as mais experientes.&lt;/p&gt;
&lt;p&gt;Para documentar as coisas de maneira mais direta criei uma pequena página onde documento meus aprendizados, principalmente devido a erros que cometi. O link para ler essa página é &lt;a href="http://aprendizado.lucaspolo.dev"&gt;http://aprendizado.lucaspolo.dev&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Programação Orientada a ob... classes</title><link>https://blog.lucaspolo.dev/posts/programacao-orientada-a-ob-classes/</link><pubDate>Tue, 12 May 2020 09:31:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/programacao-orientada-a-ob-classes/</guid><description>&lt;p&gt;A história da computação é algo muitas vezes cíclico, onde conceitos com quase 50 anos retornam, às vezes na mesma forma, as vezes em uma nova roupagem. Vamos dar um zoom num dos conceitos mais comuns da programação moderna, a programação orientada a objetos.&lt;/p&gt;
&lt;p&gt;A primeira coisa que eu gostaria de falar &lt;strong&gt;é que programamos orientado a classes mas os sistemas não rodam orientado a objetos.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cão-da-pradaria de costas virando dramáticamente e encarando a câmera." loading="lazy" src="https://blog.lucaspolo.dev/images/posts/programacao-orientada-a-ob-classes/beaver.gif"&gt;
&lt;em&gt;O QUE?&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Micro tutorial de como funcionam corrotinas</title><link>https://blog.lucaspolo.dev/posts/micro-tutorial-de-como-funcionam-corrotinas/</link><pubDate>Sun, 29 Mar 2020 00:18:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/micro-tutorial-de-como-funcionam-corrotinas/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; asyncio
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; random &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; randint
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; time
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;async&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;funcao_assincrona_com_possivel_chamada_sincrona&lt;/span&gt;(n: &lt;span style="color:#8be9fd;font-style:italic"&gt;int&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# A corrotina é uma função educadinha, que quando vai fazer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# algo que pode demorar fala assim:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# &amp;#34;Cara, isso aqui vai demorar pois é operação de IO, podem ir fazendo outra coisa&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Assin o interpretador é liberado para executar outras instruções.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;for&lt;/span&gt; i &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;range&lt;/span&gt;(&lt;span style="color:#bd93f9"&gt;10&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;Task &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;n&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; - &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;i&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Neste ponto (await) a corrotina concede o direito de execução&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# de volta, ai é permitido rodar outras corrotinas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# que estiverem aguardando, é aqui que a rotina fala&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# &amp;#34;Gente, pode continuar ai que vou demorar aqui um pouco&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Aqui poderia ser uma requisição web demorada,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# um acesso a bancos de dados e outras coisas, por exemplo.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;Liberando task &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;n&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; - &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;i&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;await&lt;/span&gt; asyncio&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;sleep(randint(&lt;span style="color:#bd93f9"&gt;0&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;3&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;Retomando task &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;n&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; - &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;i&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Aqui acontece a quebra, existe a chance (1 em 1000) de &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# ser executado um processo blocante que irá &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# blocar todos as tarefas que estão rodando concorrentemente&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Ela não é tão educada quanto parecia quando entra aqui.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sorte &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; randint(&lt;span style="color:#bd93f9"&gt;0&lt;/span&gt;, &lt;span style="color:#bd93f9"&gt;1000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; sorte &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;50&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;Task &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;n&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; blocou a GIL no passo &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;i&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;, que azar&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;sleep(&lt;span style="color:#bd93f9"&gt;3&lt;/span&gt;) &lt;span style="color:#6272a4"&gt;# Isso aqui blocante!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;Concluindo task &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;n&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; - &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;i&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;async&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;main&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Irá criar mil tarefinhas que serão disparadas em &amp;#34;paralelo&amp;#34; (na verdade concorrentemente)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tasks_assincronas_que_podem_blocar &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; asyncio&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;create_task(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; funcao_assincrona_com_coisa_assincrona(i)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;for&lt;/span&gt; i &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;range&lt;/span&gt;(&lt;span style="color:#bd93f9"&gt;10000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Executa todas elas, aguardando todas serem concluidas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;await&lt;/span&gt; asyncio&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;wait(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tasks_assincronas_que_podem_blocar,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; return_when&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;asyncio&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;ALL_COMPLETED
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;__name__&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; asyncio&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;run(main())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>JoKenPo em Python</title><link>https://blog.lucaspolo.dev/posts/jokenpo-em-python/</link><pubDate>Tue, 11 Feb 2020 00:23:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/jokenpo-em-python/</guid><description>&lt;p&gt;Fazer um jogo de JoKemPo em Python é simples, mas para complementar fiz alguns tratamentos diferentes, como a captura de &lt;strong&gt;KeyboardException&lt;/strong&gt; para tratar a saída do programa.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; random &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; choice &lt;span style="color:#6272a4"&gt;# Esta função serve para escolher aleatoriamente um elemento da lista!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;# Dicionário de movimentos, na chave a opção e no valor quem ela ganha!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MOVES &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;rock&amp;#39;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#39;scissors&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;paper&amp;#39;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#39;rock&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;scissors&amp;#39;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#39;paper&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;# Lista de opções&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OPTIONS &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;list&lt;/span&gt;(MOVES&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;keys())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;_get_user_choice&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; Recupera e valida a opção do usuário
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;while&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_choice &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;input&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#39;Choose one option [rock/paper/scissors] - ctrl+c to exit: &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; user_choice &lt;span style="color:#ff79c6"&gt;not&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; OPTIONS:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#39;Choose a valid option!&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; user_choice
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;_jokenpo&lt;/span&gt;(user_choice, computer_choice):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; Valida a regra do jogo, comparando a escolha do usuário com a do computador!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; MOVES[user_choice] &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; computer_choice:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#39;You win!&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;elif&lt;/span&gt; MOVES[computer_choice] &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; user_choice:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#39;I win!&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#39;Meh!&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;__name__&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;while&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;True&lt;/span&gt;: &lt;span style="color:#6272a4"&gt;# Roda infinitamente&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_choice &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; _get_user_choice()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;except&lt;/span&gt; KeyboardInterrupt:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;\n&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;Bye!&amp;#39;&lt;/span&gt;) &lt;span style="color:#6272a4"&gt;# Caso o usuário aperte ctrl+c sairá do loop infinito&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; computer_choice &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; choice(OPTIONS) &lt;span style="color:#6272a4"&gt;# Escolhe a opção do computador&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _jokenpo(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user_choice&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;user_choice,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; computer_choice&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;computer_choice,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Python que nem Javascript!</title><link>https://blog.lucaspolo.dev/posts/python-que-nem-javascript/</link><pubDate>Sun, 19 Jan 2020 23:20:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/python-que-nem-javascript/</guid><description>&lt;p&gt;Disclaimer: Nunca faça isso na real!&lt;/p&gt;
&lt;p&gt;Python tem uma natureza funcional muito boa (não tão boa quanto linguagens funcionais, é claro), o que de certo modo faz ele similar com Javascript, utilizando closures e afins. Inclusive permite construções similares a esta abaixo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;Pessoa&lt;/span&gt;(nome: &lt;span style="color:#8be9fd;font-style:italic"&gt;str&lt;/span&gt;, sobrenome:&lt;span style="color:#8be9fd;font-style:italic"&gt;str&lt;/span&gt;, idade:&lt;span style="color:#8be9fd;font-style:italic"&gt;int&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;getNome&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; nome
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;getSobrenome&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; sobrenome
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;getNomeCompleto&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;nome&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;sobrenome&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;getIdade&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; idade
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;getNome&amp;#39;&lt;/span&gt;: getNome,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;getSobrenome&amp;#39;&lt;/span&gt;: getSobrenome,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;getNomeCompleto&amp;#39;&lt;/span&gt;: getNomeCompleto,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;getIdade&amp;#39;&lt;/span&gt;: getIdade,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; Pessoa(&lt;span style="color:#f1fa8c"&gt;&amp;#39;Jar Jar&amp;#39;&lt;/span&gt;, &lt;span style="color:#f1fa8c"&gt;&amp;#39;Binks&amp;#39;&lt;/span&gt;, &lt;span style="color:#bd93f9"&gt;38&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(p[&lt;span style="color:#f1fa8c"&gt;&amp;#39;getNomeCompleto&amp;#39;&lt;/span&gt;](), p[&lt;span style="color:#f1fa8c"&gt;&amp;#39;getIdade&amp;#39;&lt;/span&gt;]())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python não define um meio de criar objetos dinâmicos como Javascript, devido a sua forte tipagem, por isso usei a estrutura de dicionário. O que acontece na verdade é que devolvemos uma coleção de funções que acessam os atributos do &amp;ldquo;construtor&amp;rdquo; através de closures.&lt;/p&gt;</description></item><item><title>Fazendo upload de arquivos para o Google Cloud Storage com Python (versão de 2020)</title><link>https://blog.lucaspolo.dev/posts/fazendo-upload-de-arquivos-para-o-google-cloud-storage-com-python/</link><pubDate>Fri, 10 Jan 2020 15:52:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/fazendo-upload-de-arquivos-para-o-google-cloud-storage-com-python/</guid><description>&lt;p&gt;O processo é bem simples, porém é necessário antes configurar algumas coisas no Google Cloud e gerar as credenciais necessárias, para este processo pode seguir &lt;a href="https://cloud.google.com/storage/docs/reference/libraries#client-libraries-install-python"&gt;este tutorial.&lt;/a&gt; Lembre-se também de criar uma variável de ambiente com o nome &lt;strong&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/strong&gt; apontando para o caminho do json, no Linux basta fazer:&lt;/p&gt;
&lt;p&gt;export GOOGLE_APPLICATION_CREDENTIALS=/caminho/para/arquivo.json&lt;/p&gt;
&lt;p&gt;Depois disso é possível executar o código abaixo (é claro, o bucket e o  arquivo indicado deve existir):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; datetime &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; timezone, datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; typing &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; BinaryIO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; google.cloud &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; storage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;upload_file&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data: BinaryIO,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket: &lt;span style="color:#8be9fd;font-style:italic"&gt;str&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file_path: &lt;span style="color:#8be9fd;font-style:italic"&gt;str&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link_lifetime: &lt;span style="color:#8be9fd;font-style:italic"&gt;int&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;3600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#ff79c6"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; Função que realiza o upload do arquivo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; storage_client &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; storage&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;Client()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; storage_client&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;bucket(bucket)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blob &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; bucket&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;blob(file_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blob&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;upload_from_file(data) &lt;span style="color:#6272a4"&gt;# Faz o upload do arquivo binário e cria um objeto associado ao arquivo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lifetime &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;int&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; datetime&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;now(tz&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;timezone&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;utc)&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;timestamp()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; link_lifetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Gera um link para o arquivo com tempo de expiração&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; blob&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;generate_signed_url(lifetime)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;main&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;meu-pequeno-bucket&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;# Bucket name in GCS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file_name &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;arquivo_legal.pdf&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;# Filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;with&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;open&lt;/span&gt;(file_name, &lt;span style="color:#f1fa8c"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; upload_file(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;f,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;bucket,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file_path&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;file_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;URL for file: &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;url&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;__name__&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; main()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Pense sobre o seu trabalho - O programador pragmático</title><link>https://blog.lucaspolo.dev/posts/pense-sobre-o-seu-trabalho-o-programador-pragmatico/</link><pubDate>Mon, 06 Jan 2020 23:53:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/pense-sobre-o-seu-trabalho-o-programador-pragmatico/</guid><description>&lt;p&gt;Os dias não são fáceis, você acorda cedo e se desloca para o seu trabalho, então você faz algumas coisas e chega o fim do dia, você faz o caminho inverso para sua casa. No fim do mês você é pago por isso, o que é bom, e se for da área de TI, é &amp;ldquo;mais bom&amp;rdquo; do que 90% do restante do Brasil.&lt;/p&gt;
&lt;p&gt;Agora voltemos ao &amp;ldquo;faz algumas coisas&amp;rdquo; do paragrafo acima, que coisas são essas? Onde você aprendeu elas? Como lida com elas? Todas essas coisas são a sua profissão, mas o que é profissão? Será que é apenas o seu trabalho? Aquilo que você é pago para fazer? Vamos buscar a definição de profissão:&lt;/p&gt;</description></item><item><title>Drops: Quicksort em Python</title><link>https://blog.lucaspolo.dev/posts/drops-quicksort-em-python/</link><pubDate>Fri, 03 Jan 2020 14:16:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/drops-quicksort-em-python/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; typing &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; List
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;quicksort&lt;/span&gt;(l: List):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; Recebe uma lista de elementos e devolve eles ordenados
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Caso base! Nunca se esqueça disso em funções recursivas@&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;not&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;len&lt;/span&gt;(l):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; l
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Escolhemos um pivot, removemos ele da lista!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Reduzir a entrada também é essêncial!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pivot &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; l&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;pop(&lt;span style="color:#bd93f9"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Separamos os elementos menores&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lower &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; [e &lt;span style="color:#ff79c6"&gt;for&lt;/span&gt; e &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; l &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; e &lt;span style="color:#ff79c6"&gt;&amp;lt;=&lt;/span&gt; pivot]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Separamos os maiores&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; uppper &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; [e &lt;span style="color:#ff79c6"&gt;for&lt;/span&gt; e &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; l &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; e &lt;span style="color:#ff79c6"&gt;&amp;gt;&lt;/span&gt; pivot]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Os menores ficam na esquerda do pivo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Os maiores ficam na direita&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Ai acontece a magia da recursão... &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Ordedamos os menores e os maiores com a mesma função.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; quicksort(lower) &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; [pivot] &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; quicksort(uppper)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;main&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; elems &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; [&lt;span style="color:#bd93f9"&gt;3&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;2&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;3&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;6&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;7&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;4&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;2&lt;/span&gt;,&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(quicksort(elems))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;__name__&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; main()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>O caminho do programador (pragmático) - Um pouco sobre a primeira edição do Programador Pragmático</title><link>https://blog.lucaspolo.dev/posts/o-caminho-do-programador-pragmatico-um-pouco-sobre-a-primeira-edicao-do-programa/</link><pubDate>Tue, 31 Dec 2019 01:53:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/o-caminho-do-programador-pragmatico-um-pouco-sobre-a-primeira-edicao-do-programa/</guid><description>&lt;p&gt;&lt;em&gt;Disclaimer&lt;/em&gt;: Este post é o primeiro de uma série sobre o livro O Programador Pragmático, tratando sobre a primeira edição, caso deseje compra-lo dá uma conferida no último parágrafo (o que já irá acontecer se você ler o post inteiro).&lt;/p&gt;
&lt;p&gt;Durante nossas carreiras existem alguns momentos enigmáticos que nos fazem refletir sobre o que realmente queremos para o nosso futuro, sobre o profissional que queremos ser e como iremos nos portar pelos próximos anos. Tais momentos são motivados por diversos fatores, como um perrengue no trabalho, um professor que sabe te direcionar, a comunidade, ou como é no caso, um livro.&lt;/p&gt;</description></item><item><title>Utilizando Celery junto com o SQS</title><link>https://blog.lucaspolo.dev/posts/utilzando-celery-junto-com-o-sqs/</link><pubDate>Sun, 17 Mar 2019 23:36:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/utilzando-celery-junto-com-o-sqs/</guid><description>&lt;p&gt;Uma das formas de lidar com processamento assíncrono no Python (e diversas outras linguagens) sem a necessidade de usar threads e afins é utilizando filas e tasks (que são aplicações que rodam conforme demanda, em um processamento similar a batches).&lt;/p&gt;
&lt;p&gt;Para isso o Python dispõe de uma biblioteca chamada Celery, que de uma maneira bem simples permite realizar o processamento assíncrono. Explicando de uma maneira simples, ao invocar uma função, ao invés de executar seu código, o Celery pega os parâmetros e mais algumas meta-informações da chamada e coloca numa fila, enquanto isso, em outro lugar (processo, computador ou continente), o Celery captura as mensagens desta fila e dispara as tasks. Aqui está uma implementação básica de uma task que soma dois valores:&lt;/p&gt;</description></item><item><title>Usando terminal e programando em Python no Android</title><link>https://blog.lucaspolo.dev/posts/usando-terminal-e-programando-em-python-no-android/</link><pubDate>Mon, 25 Feb 2019 01:59:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/usando-terminal-e-programando-em-python-no-android/</guid><description>&lt;p&gt;O terminal é uma das ferramentas mais poderosas que temos ao manipular informações no computador, desde o desenvolvimento de software até o hacking, passando por manipulação de texto, administração de sistemas e também para algumas brincadeiras. O acesso ao terminal é simples quando você está dentro de um Linux no computador (e até no Windows agora), porém nem sempre temos um notebook por perto, que por mais que seja portátil, não é simples de carregar por ai. Então, nas pesquisas pela internet, buscando uma alternativa para o tablet e smartphone, eu encontrei o &lt;a href="https://termux.com/"&gt;Termux&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Construindo um interpretador de Lisp em Python</title><link>https://blog.lucaspolo.dev/posts/construindo-um-interpretador-de-lisp-em-python/</link><pubDate>Tue, 22 Jan 2019 23:48:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/construindo-um-interpretador-de-lisp-em-python/</guid><description>&lt;p&gt;Ultimamente tenho me interessado cada vez mais em como linguagens de programação funcionam e encontrei um material bem legal, simples e prático para ajudar nos estudos. É um artigo do Peter Norvig sobre como criar um interpretador de Scheme em Python, confira: &lt;a href="http://norvig.com/lispy.html"&gt;http://norvig.com/lispy.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Git Squash: Agregando seus commits em um só!</title><link>https://blog.lucaspolo.dev/posts/git-squash-agregando-seus-commits-em-um-so/</link><pubDate>Fri, 11 Jan 2019 13:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/git-squash-agregando-seus-commits-em-um-so/</guid><description>&lt;p&gt;Durante o processo de desenvolvimento de software é comum que ao criarmos mais código, possamos enviar ele para o repositório de código, assim os colegas podem acompanhar o que está sendo alterado e também você criar um backup de suas informação.&lt;/p&gt;
&lt;p&gt;Mas surge uma dúvida na cabeça do programador: qual é o mínimo de código que deve criar antes de realizar um commit? Uma linha? Duas? Cem? Fica complexo definir isso, pois se criarmos muitos commits a nossa funcionalidade nova não fica atômica, mas se demorarmos para commitar e enviar para o repositório, corremos o risco de criar um commit grande demais para review, além é claro do risco de perder o código local.&lt;/p&gt;</description></item><item><title>Desempacotando parâmetros em Python</title><link>https://blog.lucaspolo.dev/posts/desempacotando-parametros-em-python/</link><pubDate>Fri, 04 Jan 2019 13:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/desempacotando-parametros-em-python/</guid><description>&lt;p&gt;Uma das coisas mais interessantes do Python é como ele interage com as suas estruturas de dados padrão, sendo um dos exemplos mais interessantes o desempacotamento de listas e dicionários. A situação é simples, vamos supor que você tenha uma lista de parâmetros e deseja passar para uma função, podemos testar a seguinte situação:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;funcao&lt;/span&gt;(parametro1, parametro2, parametro3):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(parametro1, parametro2, parametro3)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;parametros &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; [&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;2&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;3&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;funcao(parametros)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mas temos o seguinte erro:&lt;/p&gt;</description></item><item><title>Um pouco sobre cálculo lambda</title><link>https://blog.lucaspolo.dev/posts/um-pouco-sobre-calculo-lambda/</link><pubDate>Thu, 25 Oct 2018 22:11:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/um-pouco-sobre-calculo-lambda/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/eis11j_iGMs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Rodando automaticamente o Flake8 antes de todos os commits do Git</title><link>https://blog.lucaspolo.dev/posts/rodando-automaticamente-o-flake8-antes-de-todos-os-commits-do-git/</link><pubDate>Fri, 06 Jul 2018 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/rodando-automaticamente-o-flake8-antes-de-todos-os-commits-do-git/</guid><description>&lt;p&gt;Quando programamos em Python é importante verificarmos se o nosso código está de acordo com a &lt;a href="https://www.python.org/dev/peps/pep-0008/?"&gt;PEP 8&lt;/a&gt;, seguindo seu guia de estilos. Para isto muitas vezes rodamos o &lt;a href="http://flake8.pycqa.org/en/latest/"&gt;Flake8&lt;/a&gt;, que é uma aplicação que analisa o nosso código e avalia o que está seguindo e não está seguindo as boas práticas da PEP 8.&lt;/p&gt;
&lt;p&gt;Para instalar o Flake8 é muito simples, basta rodarmos o comando:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;pip install flake8&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Após instalarmos para podermos avaliar nosso código no diretório atual basta executarmos o comando:&lt;/p&gt;</description></item><item><title>Acessando webservices SOAP em Python</title><link>https://blog.lucaspolo.dev/posts/acessando-webservices-soap-em-python/</link><pubDate>Sat, 16 Jun 2018 01:09:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/acessando-webservices-soap-em-python/</guid><description>&lt;p&gt;Apesar da grande adoção de REST para a criação de webservices, ainda é muito comum (e necessário) termos que trocar mensagens com sistemas legados, inclusive em outras linguagens como Java e .NET, assim poder fazer em chamadas a endpoints SOAP se torna necessário muitas vezes.&lt;/p&gt;
&lt;p&gt;Esta necessidade surgiu para mim quando vi que testar serviços em SOAP seria muito mais fácil ser feito em Python, devido sua sintaxe idiomática e scripts muito simples de serem construídos. Buscando nas &amp;ldquo;internets&amp;rdquo; eu descobri uma biblioteca chamada &lt;a href="http://docs.python-zeep.org/en/master/"&gt;Zeep&lt;/a&gt;, que de tão simples que é o seu acesso não compensa nem discutir muito, mas já irmos direto ao código, utilizando o webservice dos Correios:&lt;/p&gt;</description></item><item><title>Nashorn: Javascript sobre a JVM</title><link>https://blog.lucaspolo.dev/posts/nashorn-javascript-sobre-a-jvm/</link><pubDate>Tue, 22 Aug 2017 01:23:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/nashorn-javascript-sobre-a-jvm/</guid><description>&lt;p&gt;Programar em Java está cada vez mais rápido e simples, desde as mudanças que começaram a surgir na versão 7 do Java, a verbosidade característica da linguagem foi reduzindo e agora no Java 8 alcançamos um nível muito superior com a programação funcional presente na linguagem.&lt;/p&gt;
&lt;p&gt;Porém, muitos ainda dizem que estas funcionalidades chegaram um pouco atrasadas na linguagem, e durante este tempo que ainda não tinhamos a programação funcional presente no Java, foram surgindo outras linguagens sobre a JVM que visavam trazer novos paradigmas para os programadores.&lt;/p&gt;</description></item><item><title>Iterando sobre uma matriz com um único loop</title><link>https://blog.lucaspolo.dev/posts/iterando-sobre-uma-matriz-com-um-unico-loop/</link><pubDate>Sat, 16 Jul 2016 15:26:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/iterando-sobre-uma-matriz-com-um-unico-loop/</guid><description>&lt;p&gt;Quando estamos nas aulas iniciais de programação, aprendemos a iterar sobre vetores e matrizes, sendo que no segundo caso é necessário criar um loop (for, while e etc) para cada dimensão de nossa matriz. Desta forma criamos muitas vezes um código com vários níveis de aninhamento no nosso código.&lt;/p&gt;
&lt;p&gt;Uma outra forma de lidar com isto é criando uma forma de a partir de um único índice extrair o valores dos sub-índices, uma tarefa simples se utilizarmos módulo.&lt;/p&gt;</description></item><item><title>Encurtando links em Java usando o Migre.me</title><link>https://blog.lucaspolo.dev/posts/encurtando-links-em-java-usando-o-migre-me/</link><pubDate>Sun, 18 May 2014 18:59:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/encurtando-links-em-java-usando-o-migre-me/</guid><description>&lt;p&gt;Uma pequena forma de como usar o &lt;a href="http://migre.me/"&gt;Migre.me&lt;/a&gt; dentro de sua aplicação para encurtar URLs. A requisição é feita utilizando alguns componentes da especificação JAX-RS, utilizando o Jersey como implementação.&lt;/p&gt;
&lt;p&gt;Para fazer parser do JSON recebido, utilizamos o Jackson, o que deixa as coisas muito simples.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;package&lt;/span&gt; br.com.lucaspolo.json.teste;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; java.net.URI;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; java.net.URISyntaxException;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; java.util.HashMap;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; java.util.Map;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; javax.naming.LimitExceededException;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; javax.ws.rs.client.Client;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; javax.ws.rs.client.ClientBuilder;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; javax.ws.rs.client.WebTarget;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; javax.ws.rs.core.Link;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; org.codehaus.jackson.map.ObjectMapper;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; org.codehaus.jackson.type.TypeReference;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * @author lucaspolo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * Classe de teste que faz a requisição do migre.me, encurta a URL e converte em um Hash.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * A dica do parser para Map foi retirada de
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * {@link http://www.mkyong.com/java/how-to-convert-java-map-to-from-json-jackson/}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * O POM com as dependencias do Maven para rodar este exemplo é este
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; * {@link https://gist.github.com/lucaspolo/7a2a0ea33f3ce0c93975}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;class&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;App&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;public&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;static&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;void&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;main&lt;/span&gt;( String&lt;span style="color:#ff79c6"&gt;[]&lt;/span&gt; args ) &lt;span style="color:#8be9fd;font-style:italic"&gt;throws&lt;/span&gt; Exception
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; URI uri &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; URI(&lt;span style="color:#f1fa8c"&gt;&amp;#34;http://migre.me/api.json?&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Client client &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; ClientBuilder.&lt;span style="color:#50fa7b"&gt;newClient&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WebTarget target &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; client.&lt;span style="color:#50fa7b"&gt;target&lt;/span&gt;(uri.&lt;span style="color:#50fa7b"&gt;toURL&lt;/span&gt;().&lt;span style="color:#50fa7b"&gt;toString&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#50fa7b"&gt;queryParam&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;, &lt;span style="color:#f1fa8c"&gt;&amp;#34;http://www.ocaminhodoprogramador.com.br&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String conteudo &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; target.&lt;span style="color:#50fa7b"&gt;request&lt;/span&gt;().&lt;span style="color:#50fa7b"&gt;get&lt;/span&gt;(String.&lt;span style="color:#50fa7b"&gt;class&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(conteudo);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Map&lt;span style="color:#ff79c6"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span style="color:#ff79c6"&gt;&amp;gt;&lt;/span&gt; map &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; HashMap&lt;span style="color:#ff79c6"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ObjectMapper mapper &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; ObjectMapper();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; map &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; mapper.&lt;span style="color:#50fa7b"&gt;readValue&lt;/span&gt;(conteudo, &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; TypeReference&lt;span style="color:#ff79c6"&gt;&amp;lt;&lt;/span&gt;HashMap&lt;span style="color:#ff79c6"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span style="color:#ff79c6"&gt;&amp;gt;&amp;gt;&lt;/span&gt;() {});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(map.&lt;span style="color:#50fa7b"&gt;get&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;migre&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Dando um close no Java 7: AutoCloseable</title><link>https://blog.lucaspolo.dev/posts/dando-um-close-no-java-7-autocloseable/</link><pubDate>Sun, 16 Mar 2014 14:16:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/dando-um-close-no-java-7-autocloseable/</guid><description>&lt;p&gt;Gerenciar recursos sempre foi algo muito chato, principalmente quando parte do ciclo de vida do objeto é fecha-lo, senão você poderá ter problemas na execução do seu programa. Vamos por exemplo analisar um código que abre um arquivo e itera sobre ele exibindo seu conteúdo linha a linha:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FileReader readerAntigo &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readerAntigo &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; FileReader(&lt;span style="color:#f1fa8c"&gt;&amp;#34;arquivo.txt&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Scanner scanner &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; Scanner(readerAntigo);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;while&lt;/span&gt;(scanner.&lt;span style="color:#50fa7b"&gt;hasNext&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(scanner.&lt;span style="color:#50fa7b"&gt;next&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#ff79c6"&gt;catch&lt;/span&gt; (FileNotFoundException e ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Arquivo não encontrado&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#ff79c6"&gt;finally&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readerAntigo.&lt;span style="color:#50fa7b"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#ff79c6"&gt;catch&lt;/span&gt; (IOException e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Erro ao fechar o arquivo&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perceba como é chato gerenciar o arquivo, para que eu possa abrir e fechar são necessário duas capturas de sessão, sem contar que ainda é necessário que o programador lembre-se de fechar o arquivo, algo que não pode ser tão crítico, mas se imaginarmos conexões JDBC, logo o banco começará a recusar conexões pois esquecemos de fecha-las anteriormente.&lt;/p&gt;</description></item><item><title>Mapeando e Reduzindo - Java 8</title><link>https://blog.lucaspolo.dev/posts/mapeando-e-reduzindo-java-8/</link><pubDate>Thu, 06 Mar 2014 14:00:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/mapeando-e-reduzindo-java-8/</guid><description>&lt;p&gt;As vezes precisamos processar dados em um volume maior, onde é necessário filtrar a informação, selecionar ou alterar o que queremos para depois realizar o processamento. Como exemplo, vamos imaginar uma lista de alunos, onde cada instância tem seu nome e nota. Desta lista queremos a média geral, a média dos alunos aprovados (ou seja, quem tirou nota seis ou mais) e a média dos reprovados (nota menor que seis). Para isso, vamos primeiro visualizar nossa lista:&lt;/p&gt;</description></item><item><title>Filtrando resultados (Predicados) - Java 8</title><link>https://blog.lucaspolo.dev/posts/filtrando-resultados-predicados-java-8/</link><pubDate>Sun, 02 Mar 2014 14:51:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/filtrando-resultados-predicados-java-8/</guid><description>&lt;p&gt;Muitas vezes precisamos filtrar listas, listas de todos os tipos, desde números básicos, passando por Strings, até tipos complexos. Abaixo temos um exemplo simples disto, onde temos uma lista com alguns nomes e queremos filtra-la e exibi-la para o usuário (no caso, todos os nomes que tiverem a letra &amp;ldquo;u&amp;rdquo; serão exibidos):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#ff79c6"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#ff79c6"&gt;&amp;gt;&lt;/span&gt; nomes &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#ff79c6"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nomes.&lt;span style="color:#50fa7b"&gt;add&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;João da Silva&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nomes.&lt;span style="color:#50fa7b"&gt;add&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Joaquim da Padaria&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nomes.&lt;span style="color:#50fa7b"&gt;add&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Lucas Polo&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nomes.&lt;span style="color:#50fa7b"&gt;add&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Chaves&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#ff79c6"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#ff79c6"&gt;&amp;gt;&lt;/span&gt; nomesFiltrados &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;new&lt;/span&gt; ArrayList&lt;span style="color:#ff79c6"&gt;&amp;lt;&amp;gt;&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Iniciando filtragem&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;for&lt;/span&gt; (String nome : nomes) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Avaliando: &amp;#34;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; nome);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (nome.&lt;span style="color:#50fa7b"&gt;contains&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;u&amp;#34;&lt;/span&gt;)) nomesFiltrados.&lt;span style="color:#50fa7b"&gt;add&lt;/span&gt;(nome);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;&amp;#34;Iniciando impressão&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;for&lt;/span&gt; (String nome : nomesFiltrados) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#50fa7b"&gt;out&lt;/span&gt;.&lt;span style="color:#50fa7b"&gt;println&lt;/span&gt;(nome);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A saida é:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Iniciando filtragem
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Avaliando: João da Silva
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Avaliando: Joaquim da Padaria
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Avaliando: Lucas Polo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Avaliando: Chaves
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Iniciando impressão
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Joaquim da Padaria
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Lucas Polo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Repare que primeiros os resultados são filtrados e depois exibidos, mas variando com o tamanho da lista, pode demorar muito tempo para filtrarmos uma lista inteira, e por isso, muitas vezes, é melhor avaliar se o elemento passa no filtro e trata-lo devidamente, ganhando assim mais velocidade. Na programação funcional, temos um meio de lidar com isso, chamado avaliação preguiçosa.&lt;/p&gt;</description></item><item><title>Inversão de Controle e Injeção de Dependências</title><link>https://blog.lucaspolo.dev/posts/inversao-de-controle-e-injecao-de-dependencias/</link><pubDate>Mon, 23 Sep 2013 16:37:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/inversao-de-controle-e-injecao-de-dependencias/</guid><description>&lt;p&gt;Quando comecei a programar na escola (curso técnico que fiz na época), comecei em uma das linguagens mais legais e, de certo modo, estranha que existe, a linguagem C. Alguns conceitos dela não são claros logo de inicio, pois não fazem nenhum paralelo com o mundo real. Um deles é o conceito de ponteiros e alocação de memória, onde você dinamicamente pode alocar memória para seu programa utilizar. Porém, como dizia o Tio Ben: &amp;ldquo;Grandes poderes trazem grandes responsabilidades&amp;rdquo;, logo você se via obrigado a &amp;ldquo;lembrar&amp;rdquo; de liberar toda a memória alocada quando não fizesse mais uso dela, senão seu programa logo travaria junto com o seu sistema operacional.&lt;/p&gt;</description></item><item><title>Métodos como parâmetros - Java 8</title><link>https://blog.lucaspolo.dev/posts/metodos-como-parametros-java-8/</link><pubDate>Sun, 22 Sep 2013 22:45:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/metodos-como-parametros-java-8/</guid><description>&lt;p&gt;O Java 8 que será lançado em breve e já possui versões de teste disponíveis para download tem uma novidade interessante, que é tratar métodos como objetos (criando assim o suporte a funções Lambda). Uma vez que métodos podem ser tratados como objetos, você pode passa-los como parâmetro ou cria-los em tempo de execução.&lt;/p&gt;
&lt;p&gt;Vamos dissecar mais sobre essas novidades no decorrer do tempo, mas por enquanto vamos ver um exemplo do que podemos fazer. Antigamente, para ler um arquivo e imprimir o seu conteúdo linha a linha poderíamos fazer algo assim:&lt;/p&gt;</description></item><item><title>Desconstruindo a orientação a objetos: Encapsulando de verdade os seus atributos</title><link>https://blog.lucaspolo.dev/posts/desconstruindo-a-orientacao-a-objetos-encapsulando-de-verdade-os-seus-atributos/</link><pubDate>Fri, 20 Sep 2013 02:07:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/desconstruindo-a-orientacao-a-objetos-encapsulando-de-verdade-os-seus-atributos/</guid><description>&lt;p&gt;Existe uma lei que rege todos os lugares do mundo, em todos os planos e dimensões. Esta lei é a Lei de Murphy, dizendo que você pode morrer e virar um superpolicial robô chamado Robocop. Brincadeiras a parte, a Lei de Murphy diz basicamente que se algo pode dar errado, isto irá dar errado, ou seja, você não deve deixar nenhuma fresta onde o erro pode ocorrer. O seu criador, Edward A. Murphy, um engenheiro aeroespacial, dizia que nunca devemos deixar uma brecha no projeto, pois será neste ponto onde ocorrerá a falha, e como muitas outras coisas que vieram do mundo da engenharia para a informática, esta lei também veio para o nosso ambiente.&lt;/p&gt;</description></item><item><title>Desconstruindo a Orientação a Objetos (ou esquecendo o que você aprendeu na escola) - Parte 1</title><link>https://blog.lucaspolo.dev/posts/desconstruindo-a-orientacao-a-objetos-ou-esquecendo-o-que-voce-aprendeu-na-escol/</link><pubDate>Wed, 18 Sep 2013 00:39:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/desconstruindo-a-orientacao-a-objetos-ou-esquecendo-o-que-voce-aprendeu-na-escol/</guid><description>&lt;p&gt;Lembro-me como se fosse ontem (que poético isso) a primeira vez que eu ouvi sobre a orientação a objetos. Depois de muito tempo lidando com linguagens puramente procedurais (C, COBOL, Visual Basic), eu ouvi falar sobre esse novo paradigma e é claro, sobre uma das linguagens que usa ele, o Java. A primeira coisa que eu ouvi foi &amp;ldquo;a orientação a objetos é ótima para construir interfaces gráficas&amp;rdquo;, e eu sei, que se você tem o mínimo de noção sobre o que é orientação a objetos, sabe que isso foi uma enorme canelada*.&lt;/p&gt;</description></item><item><title>Syntax highlighting no blog</title><link>https://blog.lucaspolo.dev/posts/syntax-highlighting-no-blog/</link><pubDate>Tue, 17 Sep 2013 01:27:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/syntax-highlighting-no-blog/</guid><description>&lt;p&gt;Não podemos ter um blog de programação sem uma das coisas mais úteis que o programador usa para destacar a facilitar a leitura de seu código, o syntax highlight! Uma rápida pesquisa me retornou uma das bibliotecas mais usadas para tratar isso, o &lt;a href="http://alexgorbatchev.com/SyntaxHighlighter"&gt;SyntaxHighlighter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sua instalação é muito simples, em dois minutos eu consegui incorporar as bibliotecas no blog e já fiz o código a seguir usando ele.&lt;/p&gt;
&lt;p&gt;Um pequeno teste, instalando o SyntaxHighlighter no blog:&lt;/p&gt;</description></item><item><title>Qual o caminho do programador?</title><link>https://blog.lucaspolo.dev/posts/qual-o-caminho-do-programador/</link><pubDate>Sun, 15 Sep 2013 21:42:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/qual-o-caminho-do-programador/</guid><description>&lt;p&gt;A pergunta do título com certeza tem mais de uma resposta, se você está na área de desenvolvimento já sabe disso. Uma pessoa que escolhe ser programador, apesar de ter filtrado todas as possíveis áreas da tecnologia da informação (aka T.I.), ainda precisa se decidir dentro da área de desenvolvimento o que fazer, quais tecnologias usar, quais paradigmas dominar e por ai segue. Trilhar esse caminho da maneira correta, sabendo quais escolhas fazer, o quer deixar para trás e para onde ir é o que separa os que apenas trabalham na área dos que realmente gostam de programar.&lt;/p&gt;</description></item></channel></rss>