<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ariel Barcellos</title>
    <description>The latest articles on DEV Community by Ariel Barcellos (@arielbarcellos).</description>
    <link>https://dev.to/arielbarcellos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F100514%2F3d692cce-1645-49d3-a376-7d3c4dccc7c7.jpg</url>
      <title>DEV Community: Ariel Barcellos</title>
      <link>https://dev.to/arielbarcellos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arielbarcellos"/>
    <language>en</language>
    <item>
      <title>Do JavaScript ao Python</title>
      <dc:creator>Ariel Barcellos</dc:creator>
      <pubDate>Fri, 19 Jun 2020 20:54:51 +0000</pubDate>
      <link>https://dev.to/arielbarcellos/do-javascript-ao-python-m5m</link>
      <guid>https://dev.to/arielbarcellos/do-javascript-ao-python-m5m</guid>
      <description>&lt;h2&gt;
  
  
  Percepções de transicionar do JavaScript para o Python
&lt;/h2&gt;

&lt;p&gt;Nesse artigo, eu vou contar quais foram as minhas percepções ao aprender Python em comparação com JavaScript, com a qual eu já programava.&lt;/p&gt;

&lt;p&gt;É claro que toda linguagem tem suas vantagens e desvantagens para determinado cenário, sendo assim, não vou especificar nenhum caso de uso, apenas as funcionalidades nativas da linguagem, que são comumente usadas em tutoriais/cursos.&lt;/p&gt;

&lt;p&gt;Para aprender uma linguagem ou framework, eu costumava usar um curso ou tutorial prático e só quando já estava usando a ferramenta buscava material mais conceitual. Com o Python, eu fiz diferente, comecei a aprender primeiro com o livro (Python Programming For Begginers), que me forneceu uma base conceitual da linguagem.&lt;/p&gt;

&lt;p&gt;Eu acho que essa abordagem é legal pra quem já tem outras linguagens na bagagem, porque você consegue visualizar o conceito aplicado. Pra quem está começando do zero, acho que nada melhor que pôr a mão na massa (saber fazer antes de saber porquê).&lt;/p&gt;

&lt;p&gt;Vamos para o que interessa, quais foram as minhas percepções de Python e porque eu acho que você deveria aprende-la:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Teoria dos conjuntos (Sets):
&lt;/h3&gt;

&lt;p&gt;Apesar do JavaScript ter uma classe nativa Set, é claro que a teoria dos conjuntos não foi uma preocupação, como é evidente em Python. As operações entre conjuntos são muito mais fáceis e intuitivas em Python.&lt;/p&gt;

&lt;p&gt;Pra quem não está por dentro da utilidade de se utilizar teoria dos conjuntos no desenvolvimento, a classe set (conjunto) é uma coleção não-ordenada de elementos únicos. Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# Lista com objetos repetidos
&lt;/span&gt;
&lt;span class="c1"&gt;# Para ter um set apenas com elementos únicos fazemos
&lt;/span&gt;&lt;span class="n"&gt;foo_set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# { 1, 2, 3, 4, 5 }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Em JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;foo_set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Set(5) { 1, 2, 3, 4, 5 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Até aí, beleza, tudo muito parecido.&lt;/p&gt;

&lt;p&gt;Mas a teoria dos conjuntos vai além disso. Digamos que eu tenho um conjunto &lt;code&gt;A = { 1, 2, 3, 4 }&lt;/code&gt; e um conjunto &lt;code&gt;B = { 3, 4, 5, 6 }&lt;/code&gt; e queremos chegar em um terceiro conjunto que pode ser a UNIÃO (todos os elementos de A e todos os elementos de B), INTERSECÇÃO (todos os elementos de A que também estão em B) ou DIFERENÇA (todos os elementos de A que não estão em B), em Python isso é tão simples quanto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;U&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;union&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# União de A e B: { 1, 2, 3, 4, 5, 6 }
&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;intersection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Intersecção de A e B: { 3, 4 }
&lt;/span&gt;&lt;span class="n"&gt;DA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;difference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Diferença de A em relação a B: { 1, 2 }
&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;difference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Diferença de B em relação a A: { 5, 6 }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Incrivelmente fácil e intuitivo. Já em JavaScript, não há método nativo, você teria que implementar os métodos. Nada muito complexo de fazer, mas ponto Python definitivamente.&lt;/p&gt;

&lt;p&gt;E se você não lembrou de alguma situação onde conjuntos fariam todo sentido em seu código, guarde bem essa informação, porque vai ser útil um dia, assim como o próximo assunto.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Aritmética Modular
&lt;/h3&gt;

&lt;p&gt;Aritmética modular mudou o jogo pra mim. Realmente, eu vi isso em um livro sobre a história da criptografia e me surpreendeu como não ensinam isso da forma correta.&lt;/p&gt;

&lt;p&gt;Para entender o que é a aritmética modular basta pensar em relógio de parede. Um relógio de parede tem 12 posições e sempre que chega ao final, volta ao início. Ou seja, um relógio de parede está em módulo 12. Onde o número 12 também é o número 0.&lt;/p&gt;

&lt;p&gt;Imagine então que o ponteiro está na posição 0 (12), se andarmos 3 posições estaremos na posição 3. Se andarmos com o ponteiro 15 posições estaremos também na posição 3. Ou seja, 3 e 15 em módulo 12 é equivalente a 3. Isso coincide com o resto da divisão: &lt;code&gt;3 RESTO 12 = 3&lt;/code&gt; e &lt;code&gt;15 RESTO 12 = 3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Porém, a diferença entre módulo e resto fica clara quando fazemos operações com números negativos. De volta ao ponteiro do relógio, imagine que estamos na posição das 12 horas (posição 0), e agora andamos com o ponteiro 3 posições em sentido anti-horário. Chegaremos a posição 9 do relógio. Ou seja, se andarmos com o relógio -3 (menos três) posições, chegaremos ao 9, isso é dizer que &lt;code&gt;-3 MÓDULO 12 é equivalente a 9&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;E é nessa parte que o JavaScript decepciona, o JavaScript trata a operação de módulo como resto. Podemos ver isso ao fazer uma operação de módulo com números negativos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="c1"&gt;// Output: 3&lt;/span&gt;
&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="c1"&gt;// Output: 3&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="c1"&gt;// Output: -3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Em Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="c1"&gt;# Output: 3
&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="c1"&gt;# Output: 3
&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="c1"&gt;# Output: 9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Você pode chegar ao mesmo resultado em JavaScript com a seguinte operação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="c1"&gt;// Output: 3&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;  &lt;span class="c1"&gt;// Output: 9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ou seja, mais uma vez, por praticidade, ponto Python.&lt;/p&gt;

&lt;p&gt;E se você quer alguns exemplos de onde isso é útil, além de ser a base da criptografia e criptoanálise, pense nas vezes que você precisou converter o estilo de horas (24/12 horas), um carrossel de informações em loop. Pensa no jogo da cobrinha (Snake), que ao chegar ao final da tela a cobra aparece no início do lado oposto.&lt;/p&gt;

&lt;p&gt;De verdade, depois que você pega o jeito, começa a ver aritmética modular em todo lugar. Inclusive em grupos de WhatsApp quando mandam aquelas coisas que esse ano tem tal coisa que só acontece uma vez em cada &lt;em&gt;x&lt;/em&gt; anos.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. As pequenas coisas. Não há nada maior, certo? (Vanilla Sky)
&lt;/h3&gt;

&lt;p&gt;Por último, vem a praticidade de não ter que declarar &lt;code&gt;const&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt; ou &lt;code&gt;var&lt;/code&gt;. Não precisar de parênteses para uma condicional ou loop (&lt;code&gt;if&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;). Controlar o escopo com indentação, ao invés de precisar de chaves.&lt;/p&gt;

&lt;p&gt;Todas essas pequenas coisas que não parecem nada, mas faz com que quando você se acostuma com Python, programar em JavaScript fica um pouco desconfortável.&lt;/p&gt;

&lt;p&gt;Mais ou menos como quando você está acostumado com um carro onde a marcha passa super suave e depois pega um outro carro que tem que ter as manhas, pisar mais na embreagem, tem sempre aquela marcha que precisa dar um soquinho pra entrar.&lt;/p&gt;

&lt;p&gt;Espero me sair bem com essa analogia. Haha.&lt;/p&gt;

&lt;p&gt;Bom, essas foram as minhas percepções. E você, o que acha? Deixa aí nos comentários! Não esquece de me seguir no twitter: &lt;a href="https://twitter.com/arielbarcellos"&gt;@arielbarcellos&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>python</category>
      <category>programming</category>
      <category>português</category>
    </item>
    <item>
      <title>Cultura open source, liberdade e software livre</title>
      <dc:creator>Ariel Barcellos</dc:creator>
      <pubDate>Fri, 29 May 2020 19:33:41 +0000</pubDate>
      <link>https://dev.to/arielbarcellos/cultura-open-source-liberdade-e-software-livre-4k7o</link>
      <guid>https://dev.to/arielbarcellos/cultura-open-source-liberdade-e-software-livre-4k7o</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Antes de qualquer coisa, vamos tirar a ambiguidade existente no termo free software. Free software pode significar software livre e software gratuito. Nesse caso estamos falando de software livre.&lt;/p&gt;

&lt;p&gt;Tanto software livre, como software de código aberto podem ou não cobrar na distribuição de cópias. Conforme consta do site &lt;a href="https://www.gnu.org/philosophy/selling.pt-br.html"&gt;gnu.org&lt;/a&gt; e &lt;a href="https://opensource.org/faq#commercial"&gt;opensource.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Todo software livre, bem como de código aberto, deve dar a liberdade ao usuário para acessar, executar, modificar e redistribuir seu código fonte. E, na maioria dosfalse casos podemos usar software livre e de código aberto como sinônimos.&lt;/p&gt;

&lt;p&gt;Realmente, o site &lt;a href="https://opensource.org/faq#free-software"&gt;opensource.org&lt;/a&gt; coloca os dois como dois termos para a mesma coisa, porém na prática podemos ter um software de código aberto que não se trata de um software livre.&lt;/p&gt;

&lt;p&gt;Isso porque, no caso do software livre, todo material feito a partir desse código não pode restringir essa licença. Por exemplo, eu posso acessar o repositório do código fonte do Linux, copiar, modificar e redistribuir o meu código modificado, porém as modificações não podem restringir a licença livre.&lt;/p&gt;

&lt;p&gt;Por outro lado, um software de código aberto diz apenas respeito ao estado do seu código, que deve estar disponível ao usuário. Não, necessariamente, restringindo seu uso apenas para outros sofwares de código aberto.&lt;/p&gt;

&lt;p&gt;Podemos ver bem como isso funciona comparando Linux e FreeBSD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linux VS FreeBSD
&lt;/h2&gt;

&lt;p&gt;O Linux é distribuido sob a licença GNU/GPL (software livre), ou seja, não posso usar o código do Linux para fazer um sistema operacional de código fechado (proprietário).&lt;/p&gt;

&lt;p&gt;Também não posso distribuir o código Linux com softwares cujas licenças restrinjam a liberdade de acessar, modificar, copiar e redistribuir. Softwares proprietário são o caso, pois restringem de usuário acessar e modificar o código fonte.&lt;/p&gt;

&lt;p&gt;O FreeBSD é um sistema operacional de código aberto, já que você pode acessar, copiar, modificar e redistribuir seu código. Mas, diferente do Linux, você pode usar o código do FreeBSD para fazer o seu próprio sistema operacional e não deixar o código aberto, como é o caso do Mac OS X, que usa muitos componentes do FreeBSD.&lt;/p&gt;

&lt;p&gt;Com isso concluimos que para ser software livre tem que ser de código aberto, mas para ser de código aberto, não precisa ser livre.&lt;/p&gt;

&lt;p&gt;Outro jeito para lembrar é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Códigos derivados de software livre sempre serão software livre.&lt;/li&gt;
&lt;li&gt;Códigos derivados de software de código aberto, podem não ser software de código aberto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Se um software é livre, como pode restringir o seu uso?
&lt;/h2&gt;

&lt;p&gt;Bom, o fato de ser um software livre diz respeito apenas que ele atende às condições colocadas pela &lt;em&gt;Free Software Foundation&lt;/em&gt;, e tem em seu uso um contrato de licença de uso que é aceito voluntariamente pelo usuário. Do mesmo jeito que o Windows tem um outro tipo de licença.&lt;/p&gt;

&lt;p&gt;Ou seja, na prática o software livre pode ter um contrato de licença mais permissivo que o Windows, porém, ainda possui restrições.&lt;/p&gt;

&lt;p&gt;Outra coisa que podemos pensar é na competência das partes do contrato em fazer valer suas cláusulas. A licença do Windows não permite cópia e distribuição do sistema para terceiros, porém o Windows é distribuido sem autorização, independente dessa restrição.&lt;/p&gt;

&lt;p&gt;Da mesma maneira, se uma pessoa usa uma biblioteca javascript que está sob licença GNU GPL em um projeto que será distribuido e, que não terá seu código disponível para acesso, cópia e modificação, está infringindo o contrato.&lt;/p&gt;

&lt;p&gt;Ou seja, provavelmente existem muitas aplicações por aí que usam código de software livre, porém não são software livre. É claro que, em alguns casos, isso leva a um processo judicial, pricipalmente quando envolvem grandes empresas. Do mesmo jeito que acontece com a utilização de Windows pirata, como no caso em que a &lt;a href="https://tecnoblog.net/129416/microsoft-embraer-software-pirata/"&gt;Microsoft acusou Embraer de usar software pirata&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Código aberto como cultura de desenvolvimento
&lt;/h2&gt;

&lt;p&gt;No fim, essas licenças que restringem o uso do código acabam só por dificultar o progresso da cultura de código aberto, uma vez que a vantagem do Open Source não está em dizer como ou não seu código será utilizado por outros, mas, sim, por ter toda uma rede trabalhando de forma descentralizada em resolver um mesmo problema.&lt;/p&gt;

&lt;p&gt;E se a Canonical quiser distribuir o Ubuntu com softwares proprietários instalados por padrão? A ideia é que a cultura de código aberto é melhor e mais eficiente que a forma centralizada de desenvolvimento de software proprietário.&lt;/p&gt;

&lt;p&gt;Se realmente acreditamos nisso, porque temer que peguem um trabalho descentralizado e o centralizem? Pela lógica, eles estão apenas piorando um produto. Desde que isso não proiba de qualquer forma que o trabalho descentralizado siga o seu caminho.&lt;/p&gt;

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

&lt;p&gt;A cultura open source já se provou mais eficiente que a cultura de desenvolvimento centralizado, não devíamos ter medo de como vão usar o código, simplesmente porque não temos esse poder. Se uma pessoa quiser usar um código meu para algo que eu considero maléfico, eu não tenho como fazer nada. Da mesma forma, um fabricante de corda não tem como controlar um usuário dessa corda de se enforcar com ela. Ele pode até colocar nos termos de compra e uso da corda.&lt;/p&gt;

&lt;p&gt;Você pode até querer que seu código seja apenas utilizado de uma forma ou outra, mas na realidade o único jeito de você evitar isso é não publicar o código, mas, de novo, só estará piorando o produto.&lt;/p&gt;

&lt;p&gt;Espero que você tenha gostado desse artigo e se quiser estar sempre ligado em novas publicações me segue no Twitter: &lt;a href="https://twitter.com/arielbarcellos"&gt;@arielbarcellos&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>copyright</category>
      <category>copyleft</category>
      <category>português</category>
    </item>
    <item>
      <title>As ameaças à criptografia ponta-a-ponta (end-to-end encryption)</title>
      <dc:creator>Ariel Barcellos</dc:creator>
      <pubDate>Fri, 08 May 2020 14:57:55 +0000</pubDate>
      <link>https://dev.to/arielbarcellos/as-ameacas-a-criptografia-ponta-a-ponta-end-to-end-encryption-h25</link>
      <guid>https://dev.to/arielbarcellos/as-ameacas-a-criptografia-ponta-a-ponta-end-to-end-encryption-h25</guid>
      <description>&lt;p&gt;Não faz tanto tempo que o WhatsApp começou a utilizar criptografia ponta-a-ponta em suas mensagens e Mark Zuckerberg anunciou esse ano que o Facebook iria usar criptografia ponta-a-ponta em suas 3 plataformas de troca de mensagens. Isso é ótimo, certo? Garantir que sua mensagem só será lida por você e por quem você deseja que a leia. Porém, algumas pessoas não estão felizes com isso. Por que será?&lt;/p&gt;

&lt;p&gt;Para começar, o que é criptografia ponta-a-ponta? De maneira bem simples, esse tipo de criptografia quer dizer que a mensagem sai do celular remetente criptografada e só será descriptografada no celular da outra pessoa através de uma troca de chaves que só os dispositivos dos usuários terão. Nem a empresa desenvolvedora do aplicativo teria acesso à mensagem.&lt;/p&gt;

&lt;p&gt;Diferente de outros mecanismos de criptografia onde a mensagem é criptografada no seu celular, descriptografada no servidor de mensagens, que criptografa novamente a mensagem e envia ao destinatário, podendo no caminho armazenar em bancos de dados a mensagem. Veja que, nesse caso, se o servidor de mensagens for comprometido, outras pessoas podem ter acesso às suas mensagens.&lt;/p&gt;

&lt;p&gt;Nesse sentido, a criptografia ponta-a-ponta é um ótimo recurso para garantir a confidencialidade da mensagem, porém alguns mecanismos podem comprometer a privacidade dos usuários. Veja abaixo três exemplos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Escaneamento no cliente (client-side scanning)&lt;/p&gt;

&lt;p&gt;No escaneamento no cliente, o aplicativo é configurado para escanear o conteúdo da sua mensagem e confrontar o conteúdo com um banco de dados. Caso exista em sua mensagem alguma coisa considerada problemática, o aplicativo pode negar o envio de tal mensagem ou até mesmo enviar a mensagem para terceiros sem o seu conhecimento.&lt;/p&gt;

&lt;p&gt;Apesar desse mecanismo poder ser usado para causas realmente importantes, como prevenir a dissipação de conteúdo de exploração infantil, ele também pode ser usado para perseguir indivíduos pacíficos em países onde seja crime, por exemplo, criticar o governo ou ser homossexual.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fantasmas em suas conversas&lt;/p&gt;

&lt;p&gt;Apesar de suas mensagens serem criptografadas e só quem está na conversa tem a chave para descriptografar a mensagem, o aplicativo pode esconder participantes fantasmas que receberão também as mensagens sem você saber. Esse caso é igual aos “grampos” que empresas telefônicas realizam através de mandados judiciais.&lt;/p&gt;

&lt;p&gt;Muitas pessoas até acham esse mecanismo legal desde que seja utilizado apenas pelos agentes do Estado para ajudar em investigações. Se você confia no governo e seus agentes, provavelmente é o seu caso. Porém, uma brecha de segurança é uma brecha de segurança e a invasão que pode ser usada para o bem hoje, pode ser usada para perseguição e opressão amanhã.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Backups não criptografados&lt;/p&gt;

&lt;p&gt;Muitas pessoas já estão expostas a esse risco. Aplicativos de mensagem frequentemente dão a opção de backup de mensagens aos usuários, porém se tal backup não está criptografado, suas mensagens estão expostas. Seja caso se comprometa sua conta Google ou o servidor onde as mensagens estão armazenadas, suas mensagens estarão visíveis.&lt;/p&gt;

&lt;p&gt;O melhor é não fazer backup de mensagens, mas se for estritamente necessário, certifique-se de que seu backup esteja criptografado e coloque uma senha segura para descriptografá-lo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Com o andar da carruagem é bem provável que nos próximos anos a maioria dos aplicativos de mensagens conhecidos hoje estarão expondo seus usuários a brechas de segurança. Mas, não nos desesperemos, soluções de código aberto e que utilizem criptografia de ponta-a-ponta junto com comunicação peer-to-peer (P2P — as mensagens não passam por um servidor e vão direto ao outro usuário) já existem e serão utilizadas cada vez mais.&lt;/p&gt;

&lt;h5&gt;
  
  
  Leia mais:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Criptografia_de_ponta-a-ponta"&gt;Wikipedia - Criptografia ponta-a-ponta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eff.org/deeplinks/2019/07/dont-let-encrypted-messaging-become-hollow-promise"&gt;EFF - Don't let encrypted messaging become hollow promise&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>criptografia</category>
      <category>encryption</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Seja mais produtivo com Linux #2</title>
      <dc:creator>Ariel Barcellos</dc:creator>
      <pubDate>Wed, 06 May 2020 16:35:50 +0000</pubDate>
      <link>https://dev.to/arielbarcellos/seja-mais-produtivo-com-linux-2-2obi</link>
      <guid>https://dev.to/arielbarcellos/seja-mais-produtivo-com-linux-2-2obi</guid>
      <description>&lt;p&gt;Como consultar e usar o histórico de comandos usados no terminal com &lt;code&gt;history&lt;/code&gt;, &lt;code&gt;!&lt;/code&gt; e &lt;code&gt;CTRL + R&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Três comandos que me ajudam muito no dia a dia desde que os aprendi são os comandos: &lt;code&gt;history&lt;/code&gt;, &lt;code&gt;!&lt;/code&gt; (&lt;em&gt;ponto de exclamação&lt;/em&gt;) e &lt;code&gt;CTRL + R&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  History
&lt;/h2&gt;

&lt;p&gt;O comando &lt;code&gt;history&lt;/code&gt; mostra os comandos utilizados no pelo usuário até o limite especificado no arquivo &lt;code&gt;~/.bashrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HISTSIZE=1000
HISTFILESIZE=2000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Esse comando é legal pois ele permite que você filtre, utilizando o &lt;code&gt;grep&lt;/code&gt;, os comandos que você usou com determinado padrão. Por exemplo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ history | grep npm
1953 npm install
1955 npm run dev
1956 npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ou seja, ele mostra todos os registros do histórico do comando &lt;code&gt;npm&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ponto de Exclamção (!)
&lt;/h2&gt;

&lt;p&gt;O segundo comando &lt;code&gt;!&lt;/code&gt; serve para executar o último comando com determinada aplicação. No caso acima, vamos que a última entrada com o comando &lt;code&gt;npm&lt;/code&gt; é &lt;code&gt;npm start&lt;/code&gt;, logo se usarmos &lt;code&gt;!npm&lt;/code&gt; teremos:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ !npm
npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Se for dado o comando com duas exclamações &lt;code&gt;!!&lt;/code&gt;, será executado o último comando (&lt;em&gt;esse comando é equivalente a apertar a tecla para cima seguido de enter&lt;/em&gt;).&lt;/p&gt;
&lt;h2&gt;
  
  
  CTRL + R
&lt;/h2&gt;

&lt;p&gt;O comando &lt;code&gt;CTRL + R&lt;/code&gt; permite procurar por palavras chaves no seu histórico de comandos utilizados e retorna o último comando com aquela palavra-chave.&lt;/p&gt;

&lt;p&gt;Por exemplo, vamos dizer que você utilizou vários comandos com a aplicação &lt;code&gt;npm&lt;/code&gt;, sendo que o último comando foi &lt;code&gt;npm install --save axios&lt;/code&gt;, e você quer utilizar o comando &lt;code&gt;npm run dev&lt;/code&gt;. Você não pode usar o comando &lt;code&gt;!npm&lt;/code&gt; pois esse irá executar o último comando com &lt;code&gt;npm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Com o &lt;code&gt;CTRL + R&lt;/code&gt; você pode buscar o último comando com a palavra chave &lt;code&gt;dev&lt;/code&gt; e ele te retornará último comando que contenha essa palavra, conforme abaixo, depois de ativar o atalho com &lt;code&gt;CTRL + R&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(reverse-i-search)`': ~&amp;gt; assim irá aparecer ao ativar o atalho
(reverse-i-search)`dev': npm run dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Obs.: Note que utilizando este comando, ele encontrar qualquer comando que tenha a sequência ‘dev’. Ou seja, se houver outro comando mais recente com a palavra dev, esse será o comando mostrado.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Com esses três comandos você não precisará mais ficar apertando para cima e para baixo até encontrar o comando que está procurando. Você perceberá muito rápido como esses comandos facilitam seu dia a dia com Linux.&lt;/p&gt;
&lt;h2&gt;
  
  
  Mais dicas
&lt;/h2&gt;

&lt;p&gt;Leia também o artigo sobre como otimizar a navegação entre diretórios:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/arielbarcellos" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hCpOkqV2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--zo2Aviu---/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/100514/3d692cce-1645-49d3-a376-7d3c4dccc7c7.jpg" alt="arielbarcellos image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/arielbarcellos/seja-mais-produtivo-com-linux-1-2c18" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Seja mais produtivo com Linux #1&lt;/h2&gt;
      &lt;h3&gt;Ariel Barcellos ・ May  5 ・ 2 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#linux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#produtividade&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#terminal&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bash&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>linux</category>
      <category>produtividade</category>
      <category>terminal</category>
      <category>bash</category>
    </item>
    <item>
      <title>Seja mais produtivo com Linux #1</title>
      <dc:creator>Ariel Barcellos</dc:creator>
      <pubDate>Tue, 05 May 2020 19:01:57 +0000</pubDate>
      <link>https://dev.to/arielbarcellos/seja-mais-produtivo-com-linux-1-2c18</link>
      <guid>https://dev.to/arielbarcellos/seja-mais-produtivo-com-linux-1-2c18</guid>
      <description>&lt;h2&gt;
  
  
  &lt;code&gt;pushd&lt;/code&gt;, &lt;code&gt;popd&lt;/code&gt; e &lt;code&gt;dirs&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Esses três comandos servem para facilitar a sua navegação entre diretórios. Normalmente, usamos o comando &lt;code&gt;cd [caminho_do_diretorio]&lt;/code&gt;, porém com os comandos &lt;code&gt;pushd&lt;/code&gt;, &lt;code&gt;popd&lt;/code&gt; e &lt;code&gt;dirs&lt;/code&gt; podem agilizar e muito a navegação entre diretórios, pois cria um registro dos diretórios em forma de uma pilha &lt;em&gt;(stack)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Basicamente, os comandos funcionam da seguinte maneira: o comando &lt;code&gt;pushd&lt;/code&gt; adiciona um diretório à pilha de diretórios. O comando &lt;code&gt;popd&lt;/code&gt; remove o último diretório adicionado da pilha de diretórios, navegando até o diretório que estava posterior na pilha. Por último, o comando &lt;code&gt;dirs&lt;/code&gt; mostra todos os diretórios na pilha.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navegue até o diretório &lt;code&gt;/tmp&lt;/code&gt; e crie alguns diretórios para o exemplo:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;diretorio&lt;span class="o"&gt;{&lt;/span&gt;0,1,2,3,4&lt;span class="o"&gt;}&lt;/span&gt; ~&amp;gt; esse comando criará 5 diretórios
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Veja quais diretórios estão na pilha usando o comandodirs e depois navegue até o &lt;code&gt;diretorio0&lt;/code&gt; com o comando &lt;code&gt;pushd diretorio0&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;dirs
&lt;/span&gt;output: /tmp

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pushd &lt;/span&gt;diretorio0
output: /tmp/diretorio0 /tmp
&lt;/code&gt;&lt;/pre&gt;


&lt;blockquote&gt;
&lt;p&gt;Note que toda vez que você adiciona ou remove um diretório da pilha, será mostrado o novo estado da pilha na tela.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agora temos dois diretórios na pilha, se quisermos navegar até o &lt;code&gt;diretório1&lt;/code&gt;, usamos novamente o comando &lt;code&gt;pushd&lt;/code&gt; com o caminho (relativo ou absoluto):&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pushd&lt;/span&gt; /tmp/diretorio1
output: /tmp/diretorio1 /tmp/diretorio0 /tmp
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Para retornar ao &lt;code&gt;diretorio0&lt;/code&gt; basta usarmos o comando &lt;code&gt;popd&lt;/code&gt; e remover o diretorio1 da pilha:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;popd
&lt;/span&gt;output: /tmp/diretorio0 /tmp
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Para pular para um diretório específico da pilha sem remover nenhum, fazemos como abaixo:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pushd&lt;/span&gt; /tmp/diretorio0
output: /tmp/diretorio0 /tmp

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pushd&lt;/span&gt; /tmp/diretorio1
output: /tmp/diretorio1 /tmp/diretorio0 /tmp

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pushd&lt;/span&gt; /tmp/diretorio2
/tmp/diretorio2 /tmp/diretorio1 /tmp/diretorio0 /tmp
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se queremos pular do diretório atual (&lt;code&gt;diretorio2&lt;/code&gt;) para o &lt;code&gt;diretorio0&lt;/code&gt; temos que andar duas posições na pilha. Então utilizamos o comando &lt;code&gt;pushd&lt;/code&gt; conforme abaixo:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;pushd&lt;/span&gt; +2
output: /tmp/diretorio0 /tmp /tmp/diretorio2 /tmp/diretorio1
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Caso você use o comando &lt;code&gt;pushd&lt;/code&gt; sem o argumento &lt;code&gt;+2&lt;/code&gt;, você será direcionado para o último diretório antes desse, ou seja, você pode usar o comando &lt;code&gt;pushd&lt;/code&gt; para revezar entre dois diretórios &lt;em&gt;(como se fosse um &lt;code&gt;alt + tab&lt;/code&gt; entre diretórios)&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note que, ao caminhar pelas posições na pilha, os diretórios que antecediam o diretório de destino foram para o final da pilha. Isso pode fazer que a navegação se torne confuso se a pilha está muito grande. Porém, sempre se pode limpar a pilha utilizando o comando &lt;code&gt;dirs -c&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com o tempo e costume isso ajuda muito na navegação, principalmente quando se tem que ficar indo de um lado pro outro em diretórios de configuração.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>produtividade</category>
      <category>terminal</category>
      <category>bash</category>
    </item>
  </channel>
</rss>
