<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: High5Devs</title>
    <description>The latest articles on Forem by High5Devs (@high5devs).</description>
    <link>https://forem.com/high5devs</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%2Forganization%2Fprofile_image%2F5305%2Ff44184d5-f99f-4cda-9ec3-4dcb38bf42f7.png</url>
      <title>Forem: High5Devs</title>
      <link>https://forem.com/high5devs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/high5devs"/>
    <language>en</language>
    <item>
      <title>Quer acelerar o desenvolvimento de aplicações Angular? Conheça o po-ui!</title>
      <dc:creator>Arthur Fücher</dc:creator>
      <pubDate>Tue, 15 Mar 2022 13:33:50 +0000</pubDate>
      <link>https://forem.com/high5devs/quer-acelerar-o-desenvolvimento-de-aplicacoes-angular-conheca-o-po-ui-1n62</link>
      <guid>https://forem.com/high5devs/quer-acelerar-o-desenvolvimento-de-aplicacoes-angular-conheca-o-po-ui-1n62</guid>
      <description>&lt;p&gt;Um tempo atrás eu estava querendo reescrever uma aplicação que eu fiz para controle de cursos de uma escola. Para o backend eu escolhi C# para continuar meus estudos, e para o frontend eu estava na dúvida entre React e Angular.&lt;br&gt;&lt;br&gt;
A aplicação em sua maioria é composta por CRUD, vários cadastros simples. Ou seja, iria precisar muito de formulários e tabelas/listagens. Foi quando lembrei do PO-UI, dei uma chance e decidir por usar o Angular.&lt;/p&gt;




&lt;p&gt;O que é o PO-UI?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Biblioteca de componentes baseado em Angular&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;de acordo com o próprio &lt;a href="https://po-ui.io"&gt;site&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Ela nos disponibiliza uma série de componentes prontos, na sua maioria voltados para aplicações CRUD.&lt;br&gt;&lt;br&gt;
Acredito que isso se deva ao fato dele ser um projeto open source da TOTVS, empresa conhecida pelo desenvolvimento de ERPs, que tem a característica de ter uma quantidade de cadastros e listagens grande.&lt;/p&gt;

&lt;p&gt;Ao decidir usá-lo, os seguintes pontos me fizeram tomar a decisão:&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentação
&lt;/h3&gt;

&lt;p&gt;A documentação do projeto é bem completa. Todo componente possui documentação com todas as propriedades, exemplos de uso funcionando e com o código.&lt;br&gt;&lt;br&gt;
Todo desenvolvimento precisa ter documentação, isso faz parte do ciclo de desenvolvimento das features, portanto está sempre atualizada.&lt;/p&gt;

&lt;h3&gt;
  
  
  UX
&lt;/h3&gt;

&lt;p&gt;Uma coisa interessante do projeto é que por ter uma empresa por trás, os componentes desenvolvidos passam por uma equipe de UX para manter padrões de usabilidade e estilos. Então na minha perspectiva é uma vantagem na utilização do PO-UI, pois você não precisa se preocupar com estilos e padrões de utilização dos compoenentes.&lt;br&gt;&lt;br&gt;
Mesmo tendo um padrão de cores, é possível customizar e criar o seu próprio tema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Metadado
&lt;/h3&gt;

&lt;p&gt;Diversos componentes possui um componente maior (High Component) que possui facilitadores para construção do mesmo. Para criar por exemplo uma lista, existe um componente que recebe o &lt;em&gt;endpoint&lt;/em&gt; que deve fazer a chamada para retornar os dados e também recebe um parâmetro com o &lt;em&gt;endpoint&lt;/em&gt; de metadados.&lt;br&gt;&lt;br&gt;
Nesse endpoint nosso servidor retorna qual é a estrutura de dados que teremos, e com isso o PO-UI já monta as colunas e formatações. Isso é muito bom para deixar a visualização customizável e deixando a estrutura de dados no backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open source
&lt;/h3&gt;

&lt;p&gt;O projeto está hospedado no github: &lt;a href="http://github.com/po-ui/po-angular"&gt;github.com/po-ui/po-angular&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Fazer uso de uma biblioteca open source tem diversas vantagens, como por exemplo olhar e entender como as coisas estão sendo feitas nos componentes que você está usando.&lt;br&gt;&lt;br&gt;
Caso tenha uma necessidade, pode abrir uma issue, discutir com o time a implementação e até contribuir com um novo componente ou comportamento.&lt;br&gt;&lt;br&gt;
O time tem aprendido e evoluído cada vez mais na construção de um projeto open source, que não é fácil.&lt;br&gt;&lt;br&gt;
Inclusive ano passado fizemos uma live sobre projetos open source e o PO-UI foi um deles: &lt;a href="https://www.youtube.com/watch?v=w680VZ2ElTQ"&gt;assista aqui&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Eai, achou interessante? Para começar é bem simples, e eles disponibilizam um guia de primeiros passos &lt;a href="https://po-ui.io/guides/getting-started"&gt;aqui&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Depois me conta o que achou!&lt;br&gt;&lt;br&gt;
Abraços&lt;/p&gt;




&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@marcojodoin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Marc-Olivier Jodoin&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/fast?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O post &lt;a href="http://high5devs.com/2022/03/quer-acelerar-o-desenvolvimento-de-aplicacoes-angular-conheca-o-po-ui/"&gt;Quer acelerar o desenvolvimento de aplicações Angular? Conheça o po-ui!&lt;/a&gt; apareceu primeiro em &lt;a href="http://high5devs.com"&gt;High5Devs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Se faça substituível</title>
      <dc:creator>Arthur Fücher</dc:creator>
      <pubDate>Wed, 09 Feb 2022 01:32:11 +0000</pubDate>
      <link>https://forem.com/high5devs/se-faca-substituivel-j3p</link>
      <guid>https://forem.com/high5devs/se-faca-substituivel-j3p</guid>
      <description>&lt;p&gt;Eu percebi que era substituível e que fazia coisas para ser quando ouvi um dos melhores elogios que recebi até hoje. No meu último dia de trabalho na ThoughtWorks, Renato que trabalhava ao meu lado, me disse que aquele não tinha parecido meu último dia, parecia como qualquer outro.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você chegou e trabalhou normalmente, não rolou um desespero de tentar finalizar alguma tarefa ou passar para alguém. E também não estava lá sem fazer nada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Foi exatamente isso que aconteceu, eu cheguei, abri meu Mac, trabalhei, fiz pair, participei de reuniões. No final do dia, fechei meu computador e a única diferença é que dessa vez não guardei ele, devolvi para a empresa.&lt;/p&gt;




&lt;p&gt;No novo post do High5Devs eu compartilhei sobre o que acredito em ser substituível, confere lá: &lt;a href="http://high5devs.com/2022/02/se-faca-substituivel/"&gt;http://high5devs.com/2022/02/se-faca-substituivel/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>FSCheck: Gerando valores customizados para seu teste de propriedade</title>
      <dc:creator>Arthur Fücher</dc:creator>
      <pubDate>Thu, 11 Feb 2021 17:33:15 +0000</pubDate>
      <link>https://forem.com/high5devs/fscheck-gerando-valores-customizados-para-seu-teste-de-propriedade-25nn</link>
      <guid>https://forem.com/high5devs/fscheck-gerando-valores-customizados-para-seu-teste-de-propriedade-25nn</guid>
      <description>&lt;p&gt;Em um outro &lt;a href="http://high5devs.com/2020/05/fscheck-mudando-sua-visao-sobre-testes/"&gt;post&lt;/a&gt;, falamos um pouco sobre a utilização do FSCheck para criação de testes de propriedade usando C#. Mostrei os primeiros passos com o FSCheck, e a criação de testes de propriedade bem simples onde nosso teste dependia de um valor _uint p_ara representar uma porcentagem, porém esse tipo de valor pode ser maior do que 100, o que no nosso caso se encaixa muito bem dado que nossa porcentagem seria somente de 0 a 100.&lt;/p&gt;

&lt;p&gt;Nesse post iremos nos aprofundar um pouco mais na criação de parâmetros customizáveis, limitando os valores, criando alguns mais específicos e descritivos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Contexto
&lt;/h2&gt;

&lt;p&gt;No primeiro post que fiz sobre o FSCheck mostrei um contexto de uma aplicação de &lt;em&gt;FlashCards&lt;/em&gt; onde testávamos se um cartão tinha sua porcentagem de dificuldade diminuída caso o usuário acertasse a reposta ou se aumentava a dificuldade caso o usuário errasse. O código do nosso exemplo é esse aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[Property]
public Property DeveDiminuirDificuldadeQuandoAcertarAResposta(int porcentagem)
{
 var calculadora = new CalculadoraDeDificuldade();
 var cartão = new Cartão("qlqr pergunta", porcentagem);

 var novoCartão = calculadora.AjustaDificuldade(cartão, true);

 return (novoCartão.Porcentagem &amp;lt; porcentagem).ToProperty();
}

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

&lt;/div&gt;



&lt;p&gt;A questão com esse teste é que o valor de porcentagem está variando entre todos os possíveis para uma variável do tipo &lt;em&gt;int&lt;/em&gt;, e a nossa propriedade só é válida quando o valor da porcentagem for entre 0 e 100. O FsCheck possui o método &lt;em&gt;When&lt;/em&gt; que faz exatamente isso, portanto podemos alterar a criação da nossa propriedade para que fique assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
return (novoCartão.Porcentagem &amp;lt; porcentagem)
         .ToProperty()
         .When(porcentagem != 0 &amp;amp;&amp;amp; porcentagem &amp;lt; 100); 

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

&lt;/div&gt;



&lt;p&gt;Utilizando o método &lt;em&gt;When&lt;/em&gt;  conseguimos limitar o valor do parâmetro porcentagem que será válido para a nossa Propriedade, porém agora todo teste que dependa desse valor teremos que adicionar esse código. O que precisamos é que o FSCheck saiba gerar corretamente os valores, e para isso ele disponibiliza uma maneira de criar os nossos próprios geradores de valores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerando valores customizáveis
&lt;/h2&gt;

&lt;p&gt;Para criar esse valores customizaveis iremos criar uma classe para agrupar os geradores, e esses geradores serão métodos estáticos que retornam um Arbitrary do valor que quer gerar.&lt;br&gt;&lt;br&gt;
O nome do método podemos colocar algo que deixe explícito o retorno.&lt;br&gt;&lt;br&gt;
No nosso caso o tipo que usamos é int, iremos criar um método estatico que irá retornar um Arbitrary de int e iremos dar o nome de Porcentagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
    public class Tipos
    {
        public static Arbitrary&amp;lt;int&amp;gt; Porcentagem() =&amp;gt;
            Arb.Default.Int32().Generator.
                Where(x =&amp;gt; x &amp;gt; 0 &amp;amp;&amp;amp; x &amp;lt;= 100).ToArbitrary();
    }

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

&lt;/div&gt;



&lt;p&gt;Olhando a implementação acima veja que utilizamos o próprio gerador de int da biblioteca &lt;em&gt;Arb.Default.Int32().Generator&lt;/em&gt; e depois usamos um Where para filtrar o intervalo de valores que queremos. E para retornar um Arbitrary basta chamar o método ToArbitrary.&lt;br&gt;&lt;br&gt;
Agora que criamos esse gerador, precisamos fazer indicar para o nosso teste que deve utilizar essa classe como fonte. Conseguimos fazer isso apenas alterando o atributo Property:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[Property(Arbitrary = new[] {typeof(Tipos)})]

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

&lt;/div&gt;



&lt;p&gt;Com isso quando o nosso teste solicita uma entrada to tipo int, ele acha o nosso gerador e chama ele ao invés do padrão, com isso nosso código não precisa mais lidar com o tratamento do valor e podemos remover o When que tínhamos colocado.&lt;/p&gt;

&lt;p&gt;Olhando nosso código, utilizamos a porcentagem para criar nosso objeto Cartão e usamos ele para fazer o teste. E se, ao invés de receber a porcentagem, nós recebessemos um objeto de Cartão já pronto?&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando nosso Cartão
&lt;/h2&gt;

&lt;p&gt;Para criar um novo gerador, precisamos alterar nossa classe Tipos, e adicionar agora um novo método que retorne um Arbitrary de Cartão. Nele podemos utilizar o gerador de Porcentagem que criamos e mapear para um Cartão. Veja como fica a implementação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
public static Arbitrary&amp;lt;Cartão&amp;gt; Cartão() =&amp;gt;
  Porcentagem().Generator
    .Select(porcentagem =&amp;gt; new Cartão(Arb.Default.String()
                                                 .Generator
                                                 .Sample(20, 1)
                                                 .Single(),
                                      porcentagem))
    .ToArbitrary();

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

&lt;/div&gt;



&lt;p&gt;Veja que estamos mapeando uma porcentagem para o nosso Cartão, e utilizamos outro gerador padrão do FSCheck para construir a descrição do cartão de maneira automática também. Agora basta alterar nosso teste para receber um Cartão&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
        [Property(Arbitrary = new[] {typeof(Tipos)})]
        public Property DeveDiminuirDificuldadeQuandoAcertarAResposta3(Cartão cartão)
        {
          var calculadora = new CalculadoraDeDificuldade();

          var novoCartão = calculadora.AjustaDificuldade(cartão, true);

          return (novoCartão.Porcentagem &amp;lt; cartão.Porcentagem).ToProperty();
        }

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

&lt;/div&gt;



&lt;p&gt;Com isso conseguimos construir qualquer objeto nosso com as restrições que precisamos para determinada propriedade, e deixar nosso teste simples e descritivo.&lt;br&gt;&lt;br&gt;
Podemos também criar classes que representem estados dos nossos objetos, como por exemplo um _ &lt;strong&gt;CartãoComPorcentagemAcimaDe80&lt;/strong&gt; _ que estende o &lt;em&gt;Cartão&lt;/em&gt;. Dá para viajar nisso, mas falaremos disso em outro post.&lt;/p&gt;

&lt;p&gt;Se quiser dar uma olhada no código, ele está no meu github: &lt;a href="https://github.com/afucher/fscheck-examples"&gt;fscheck-examples&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Eai, o que achou da utilização de geradores customizáveis? Tem dúvidas? Já usou?&lt;br&gt;&lt;br&gt;
Deixe um comentário ?&lt;/p&gt;

&lt;p&gt;Abraços&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Imagem usada no post &lt;a href="https://unsplash.com/@vekonyorsi?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Orsolya Vékony&lt;/a&gt; em&lt;/em&gt; &lt;a href="https://unsplash.com/s/photos/hammer?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;&lt;em&gt;Unsplash&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O post &lt;a href="http://high5devs.com/2021/02/fscheck-gerando-valores-customizados-para-seu-teste-de-propriedade/"&gt;FSCheck: Gerando valores customizados para seu teste de propriedade&lt;/a&gt; apareceu primeiro em &lt;a href="http://high5devs.com"&gt;High5Devs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>bibliotecas</category>
      <category>testes</category>
      <category>csharp</category>
      <category>fscheck</category>
    </item>
    <item>
      <title>Um segredo: O repositório especial do Github!</title>
      <dc:creator>Arthur Fücher</dc:creator>
      <pubDate>Fri, 31 Jul 2020 18:33:02 +0000</pubDate>
      <link>https://forem.com/high5devs/um-segredo-o-repositorio-especial-do-github-4k54</link>
      <guid>https://forem.com/high5devs/um-segredo-o-repositorio-especial-do-github-4k54</guid>
      <description>&lt;p&gt;Muitas pessoas chamam o &lt;a href="https://github.com"&gt;Github&lt;/a&gt; de rede social para pessoas desenvolvedoras, e acho até que faz um sentido. Na minha visão o github faz um tempo que deixou de ser simplesmente uma plataforma para hospedar código. Hoje pessoas compartilham projetos, repositórios de conteúdo, hospedam iniciativas, seguem pessoas, propões ideias, &lt;a href="https://github.blog/2020-05-06-new-from-satellite-2020-github-codespaces-github-discussions-securing-code-in-private-repositories-and-more/#discussions"&gt;discutem&lt;/a&gt;! E o que é uma rede social sem perfil né?&lt;/p&gt;

&lt;h1&gt;
  
  
  Github Profile
&lt;/h1&gt;

&lt;p&gt;No github sempre foi possível colocar informações básicas sobre você, como por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nome;&lt;/li&gt;
&lt;li&gt;Empresa que trabalha;&lt;/li&gt;
&lt;li&gt;Links de redes sociais;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas sempre as informações eram limitadas ao que eles deixavam ser colocado.&lt;/p&gt;

&lt;p&gt;No final de maio apareceu um tweet mostrando uma nova feature do github, a possibilidade de fazer um perfil usando markdown.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quem me segue no &lt;a href="https://twitter.com/Thur/status/1266011862572896256"&gt;twitter&lt;/a&gt; ficou sabendo ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu fiquei bem empolgado, embora ainda não tínhamos muitos detalhes sobre como funcionaria. Pela imagem compartilhada dava para ver que era um markdown, pense nas possibilidades! Eu amo markdown, uma das melhores opções para fazer anotações.&lt;/p&gt;

&lt;p&gt;Algumas pessoas começaram a ter acesso para teste, e no começo de julho foi liberado para todas as pessoas.&lt;/p&gt;

&lt;p&gt;Beleza Arthur, legal que você gosta de markdown e tá empolgado, mas….&lt;/p&gt;

&lt;h2&gt;
  
  
  Como faço para usar?
&lt;/h2&gt;

&lt;p&gt;Isso é bem simples para quem já usa github, é só criar um repositório com o nome do seu usuário.&lt;/p&gt;

&lt;p&gt;Assim que você digitar o nome do seu repositório o github já vai mostrar um texto dizendo que você descobriu um segredo, o seu repositório especial!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://high5devs.com/wp-content/uploads/2020/07/Captura-de-Tela-2020-07-29-a%CC%80s-18.55.20-1.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vdAouisP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://high5devs.com/wp-content/uploads/2020/07/Captura-de-Tela-2020-07-29-a%25CC%2580s-18.55.20-1.png" alt="" width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse repositório que vai conter o seu perfil, para que o github possa deixar seu perfil público o seu repositório também deve ser público.&lt;/p&gt;

&lt;p&gt;O github irá mostrar como seu perfil é o README desse respositório, portanto se você marcar a opção de inicializar o repositório ele já vai deixar tudo o que você precisa criado.&lt;/p&gt;

&lt;p&gt;No meu caso eu já tinha um repositório criado com o meu nome :/ Um tempo atrás criei um pacote no npm com meu nome para mostrar umas informações minhas,  é bem legal! Se quiser ver só rodar&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Já ter o repositório criado para mim não foi um problema já que o pacote tinha o intuito de ter informações sobre mim, então só criei o README da maneira que eu queria.&lt;/p&gt;

&lt;p&gt;Agora basta deixar sua imaginação te levar! Como é um arquivo markdown em um repositório, você pode fazer tudo que o github suporta em um markdown. Algumas coisas que você são possíveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adicionar uma imagem como cabeçalho;&lt;/li&gt;
&lt;li&gt;Colocar links para sites, projetos e/ou redes sociais;&lt;/li&gt;
&lt;li&gt;Usar formatações do markdown (cabeçalhos, tabelas, negrito, etc…);&lt;/li&gt;
&lt;li&gt;Adicionar badges (medalhas) customizadas, exemplos: &lt;a href="https://shields.io/"&gt;shields.io&lt;/a&gt;, &lt;a href="https://badgen.net/"&gt;badgen.net&lt;/a&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Olha como ficou o meu ?:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://high5devs.com/wp-content/uploads/2020/07/Captura-de-Tela-2020-07-29-a%CC%80s-23.12.12.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0eXLfELu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://high5devs.com/wp-content/uploads/2020/07/Captura-de-Tela-2020-07-29-a%25CC%2580s-23.12.12.png" alt="" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode ver o meu perfil no github aqui: &lt;a href="https://github.com/afucher/"&gt;https://github.com/afucher/&lt;/a&gt; e o código do README aqui: &lt;a href="https://github.com/afucher/afucher/blob/trunk/README.md"&gt;https://github.com/afucher/afucher/blob/trunk/README.md&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Eai, o que achou? O que mais eu poderia colocar?&lt;/p&gt;

&lt;p&gt;Crie o seu e compartilhe aqui comigo! Adoraria ver outras ideias.&lt;/p&gt;

&lt;p&gt;Abraços&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@usinglight?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Stefan Steinbauer&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O post &lt;a href="http://high5devs.com/2020/07/um-segredo-o-repositorio-especial-github/"&gt;Um segredo: O repositório especial do Github!&lt;/a&gt; apareceu primeiro em &lt;a href="http://high5devs.com"&gt;High5Devs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>github</category>
      <category>markdown</category>
      <category>profile</category>
    </item>
    <item>
      <title>Onde está meu npm? Windows ou WSL?</title>
      <dc:creator>Arthur Fücher</dc:creator>
      <pubDate>Wed, 10 Jun 2020 18:33:47 +0000</pubDate>
      <link>https://forem.com/high5devs/onde-esta-meu-npm-windows-ou-wsl-1bk9</link>
      <guid>https://forem.com/high5devs/onde-esta-meu-npm-windows-ou-wsl-1bk9</guid>
      <description>&lt;p&gt;Eu já tinha usado linux durante um tempo, não sou super especialista, e agora que voltei a usar Windows resolvi experimentar o WSL. Para quem não conhece o WSL é o &lt;em&gt;Windows Subsystem for Linux&lt;/em&gt;, ou seja, na tradução literal é um subsistema windows para linux. Instalei a distribuição do Ubuntu e fui mexer um pouco! Minha ideia era ter minha aplicação node dentro do WSL enquanto uso o VSCode no windows.&lt;/p&gt;

&lt;p&gt;A primeira coisa que fiz foi baixar o repositório do github, fácil já que temos o git ali. A segunda coisa foi rodar um &lt;em&gt;npm install&lt;/em&gt;, fui direto para o diretório da minha aplicação e rodei o comando. E pronto! ERRO! &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UHBXqrh6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://s.w.org/images/core/emoji/13.1.0/72x72/1f641.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UHBXqrh6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://s.w.org/images/core/emoji/13.1.0/72x72/1f641.png" alt="🙁" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você deve pensar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Claro que vai dar erro, você não instalou o &lt;em&gt;npm&lt;/em&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É… depois pensei isso também. Mas o erro não tinha sido que o npm não estava instalado, ele reclamava de um &lt;em&gt;module&lt;/em&gt; que ele não consegui rodar, num diretório que não tava entendendo direito. Depois que lembrei que não tinha instalado o &lt;em&gt;npm,&lt;/em&gt; resolvi usar o comando &lt;em&gt;which&lt;/em&gt; para saber onde estava. E advinha?&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde estava meu &lt;em&gt;npm&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://high5devs.com/wp-content/uploads/2020/06/which.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QAUbfoIY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://high5devs.com/wp-content/uploads/2020/06/which-300x68.png" alt="resultado do comando which dentro do wsl, mostrando que o npm estava apontando para o diretório do Windows" width="300" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ele estava num &lt;em&gt;mount&lt;/em&gt; que é feito automaticamente para o meu diretório no Windows! Po, lindo que já faz esse mapeamento… mas eu não queria que ele pegasse o &lt;em&gt;npm&lt;/em&gt; do Windows, afinal, quero rodar as minhas aplicações usando tudo no linux ¯_(ツ)_/¯&lt;/p&gt;

&lt;h2&gt;
  
  
  O que está acontecendo?
&lt;/h2&gt;

&lt;p&gt;Por padrão, o WSL vai colocar o &lt;em&gt;path&lt;/em&gt; do windows na variável &lt;em&gt;$PATH&lt;/em&gt; do linux. Com isso, todos os diretórios que você tem mapeado no windows no PATH para rodar via linha de comando, estarão disponíveis para você no linux.&lt;/p&gt;

&lt;p&gt;Nas versões mais novas o WSL provê uma maneira bem simples de alterar esse comportamento, ele usa um arquivo chamado &lt;em&gt;wsl.conf&lt;/em&gt; para definir algumas configurações. Esse arquivo fica dentro da sua distribuição, localizado em /etc/wsl.conf&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O arquivo não é criado por padrão, caso não exista, basta criar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Você tem que editar esse arquivo, e adicionar a seguinte configuração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[interop]
appendWindowsPath = false

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

&lt;/div&gt;



&lt;p&gt;Salve e feche o arquivo.&lt;/p&gt;

&lt;p&gt;Para que as novas configurações façam efeito você deve reiniciar o WSL. Para isso basta rodar no cmd/Powershell do windows o comando wsl –shutdown&lt;/p&gt;

&lt;p&gt;Se tiver feito tudo certo, ao entrar no WSL ele não terá mais o Path do Windows adicionado, e portanto não teremos influência dos programas que estavam configurados no Windows. Conseguimos verificar isso rodando novamente o comando &lt;em&gt;which npm&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://high5devs.com/wp-content/uploads/2020/06/which_after.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--StutH0ya--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/http://high5devs.com/wp-content/uploads/2020/06/which_after-300x89.png" alt="tela de console mostrando que o comando which npm não retorna nada, e que o npm não está instalado no linux" width="300" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja que o comando which não retorna nada, e ao tentarmos rodar o npm ele mostra uma mensagem que não encontrou o comando.&lt;/p&gt;

&lt;p&gt;Agora basta instalar o node/npm da maneira que achar melhor. Eu utilizo o &lt;a href="https://github.com/nvm-sh/nvm"&gt;nvm&lt;/a&gt; para instalar e controlar as versões que uso.&lt;/p&gt;

&lt;p&gt;Com isso você terá as instalações separadas no Windows e no WSL, podendo mexer a vontade e sem influenciar o outro.&lt;/p&gt;




&lt;p&gt;Queria saber de você, já tem usado WSL? Passou por isso também?&lt;/p&gt;

&lt;p&gt;Abraços&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@markuswinkler?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Markus Winkler&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/search?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O post &lt;a href="http://high5devs.com/2020/06/onde-esta-meu-npm-windows-ou-wsl/"&gt;Onde está meu npm? Windows ou WSL?&lt;/a&gt; apareceu primeiro em &lt;a href="http://high5devs.com"&gt;High5Devs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>wsl</category>
      <category>npm</category>
      <category>windows</category>
    </item>
    <item>
      <title>FsCheck: Mudando sua visão sobre Testes</title>
      <dc:creator>Arthur Fücher</dc:creator>
      <pubDate>Tue, 12 May 2020 19:08:44 +0000</pubDate>
      <link>https://forem.com/high5devs/fscheck-mudando-sua-visao-sobre-testes-56el</link>
      <guid>https://forem.com/high5devs/fscheck-mudando-sua-visao-sobre-testes-56el</guid>
      <description>&lt;p&gt;Existem momentos em um projeto que simplesmente testar os valores absolutos de entrada e saída de um método não são suficientes para eu me sentir seguro. Um exemplo simples é uma função de multiplicação, acho que nunca vou me sentir seguro de saber que pensei em todas entradas e saídas. Nestes casos uma opção é a criação de testes de propriedade, e para C# existe a biblioteca &lt;a href="https://github.com/fscheck/FsCheck"&gt;FsCheck&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A ideia desse post é apresentar a biblioteca FSCheck e como ela me ajudou a fazer um teste num projeto que estou participando.&lt;/p&gt;




&lt;h2&gt;
  
  
  FSCheck
&lt;/h2&gt;

&lt;p&gt;O projeto consiste em mostrar uma pergunta e a pessoa responde, se a pessoa erra a dificuldade da pergunta aumenta e se a pessoa acerta a dificuldade diminui. Isso influencia para saber a periodicidade que devo mostrar a pergunta para a pessoa.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Esse post não tem a intenção de explicar conceitos básicos de teste de propriedade ou testes generativos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se acharem interessante fazer um post sobre isso, mandem nos comentários &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KynahQdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://s.w.org/images/core/emoji/13.1.0/72x72/1f642.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KynahQdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://s.w.org/images/core/emoji/13.1.0/72x72/1f642.png" alt="🙂" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quem faz o cálculo dessa dificuldade nova, são uns algoritmos bem legais (mas que eu não criei). Existem vários, e na real, não me importa muito o que eles fazem. Porém, eu quero ter certeza de que se uma pergunta tinha um nível de dificuldade e a pessoa acertou, o novo nível de dificuldade deve ser menor que o anterior.&lt;/p&gt;

&lt;p&gt;Resumindo, podemos ver que o meu método tem algumas propriedades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando acertar, a dificuldade tem que diminuir;&lt;/li&gt;
&lt;li&gt;Quando errar, a dificuldade tem que aumentar;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E é isso que quero testar, uma &lt;strong&gt;propriedade&lt;/strong&gt; do meu método.&lt;/p&gt;

&lt;p&gt;O código que tem a propriedade que quero testar é o método que é executado na primeira linha desse trecho de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
public Cartão AtualizarDadosDeRevisão(ResultadoEnum resultado, IEstratégia estratégia)
{
  var novaDificuldade = estratégia.AjustarDificuldade(this, resultado);
  this.PorcentagemDificuldade = novaDificuldade;
  return this;
}

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

&lt;/div&gt;



&lt;p&gt;Em um teste que estamos acostumados a fazer iríamos ter um código mais ou menos assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[Test]
public void DeveDiminuirDificuldadeQuandoAcertarAResposta()
{
  var estratégia = new SuperMemo2Estratégia();
  var cartão = new CartãoBuilder().ComPorcentagemDeDificuldade(100).Generate();

  var novaPorcentagem = estratégia.AjustarDificuldade(cartão, ResultadoEnum.Acertou);

  Assert.True(novaPorcentagem &amp;lt; cartão.PorcentagemDificuldade);

  //Temos que fazer esse Assert, pois como disse não sei (ou não me importo) com a implementação da estratégia.
  //Se tivesse certeza do resultado final, poderia fazer algo assim:
  //novaPorcentagem.Should().Be(96);
}

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

&lt;/div&gt;



&lt;p&gt;Esse teste em um primeiro momento, testa o que preciso e é bem simples. Porém, se for pensar, será que para a entrada 99 ele funciona? E para 98? E para 97? E para.. Bom acho que você entendeu hehehe&lt;/p&gt;

&lt;h3&gt;
  
  
  Então como testar uma propriedade e tentar garantir um número maior de entradas?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;FSCheck&lt;/strong&gt; é uma biblioteca que provê formas para testar automaticamente código baseado em propriedades.&lt;br&gt;&lt;br&gt;
Como no projeto estamos utilizando NUnit para testes, precisamos adicionar uma versão específica: &lt;a href="https://www.nuget.org/packages/FsCheck.Nunit/"&gt;FsCheck.NUnit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o FsCheck mudamos o teste de um teste de unidade para um teste de propriedade, portanto as duas primeiras alterações são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alterar a &lt;em&gt;annotation&lt;/em&gt; de Test para Property;&lt;/li&gt;
&lt;li&gt;O retorno do método de teste agora é Property ao invés de void;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com a mudança do retorno, devemos agora retornar qual a propriedade que queremos testar, que no nosso caso é se a &lt;em&gt;novaPorcentagem&lt;/em&gt; é menor que a anterior. Com essas mudanças nosso teste está assim por enquanto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[Property] 
public Property DeveDiminuirDificuldadeQuandoAcertarAResposta() 
{
 var estratégia = new SuperMemo2Estratégia();
 var cartão = new CartãoBuilder().ComPorcentagemDeDificuldade(100).Generate();
 var novaPorcentagem = estratégia.AjustarDificuldade(cartão, ResultadoEnum.Acertou);

 return (novaPorcentagem &amp;lt; cartão.PorcentagemDificuldade).ToProperty(); 
}

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

&lt;/div&gt;



&lt;p&gt;Nesse teste, fica explícita a propriedade que queremos testar! Porém, continuamos com o valor fixo de 100, caindo no mesmo problema anterior. O FsCheck consegue cuidar disso para nós, para isso basta eu dizer para ele que quero que ele gere, expondo como um parâmetro do meu teste o que ele precisa gerar.&lt;/p&gt;

&lt;p&gt;Portanto vamos alterar a assinatura do nosso teste para receber a porcentagem e usá-la no teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[Property] 
public Property DeveDiminuirDificuldadeQuandoAcertarAResposta(uint porcentagem) 
{
 var estratégia = new SuperMemo2Estratégia();
 var cartão = new CartãoBuilder().ComPorcentagemDeDificuldade(porcentagem).Generate();
 var novaPorcentagem = estratégia.AjustarDificuldade(cartão, ResultadoEnum.Acertou);

 return (novaPorcentagem &amp;lt; cartão.PorcentagemDificuldade).ToProperty(); 
}

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

&lt;/div&gt;



&lt;p&gt;E ao rodar o teste temos a seguinte saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Executando AstroCards.test.AstroCards.UnitTests.AstroCards.UnitTests.Specs.EstrategiasRevisao.SuperMemo2EstratégiaTestes.DeveAumentarDificuldadeQuandoErrarAResposta ...
Ok, passed 100 tests.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pode gerar uma confusão, já que criamos apenas um teste. O que acontece é que o FsCheck por padrão gera 100 entradas para o nosso teste.&lt;/p&gt;

&lt;p&gt;Se quiser ver as entradas, pode utilizar o método Collect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
return (novaPorcentagem &amp;lt; porcentagem).ToProperty().Collect(porcentagem);

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

&lt;/div&gt;



&lt;p&gt;Ao rodar o teste teremos algo parecido com isso na saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ok, passed 100 tests.
7% 3u.
5% 6u.
5% 17u.
4% 7u.
4% 28u.
3% 9u.
3% 8u.
3% 5u.
3% 4u.
3% 1u.
2% 64u.
2% 48u.
2% 47u.
2% 42u.
2% 40u.
2% 2u.
2% 29u.
etc...

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

&lt;/div&gt;



&lt;p&gt;Ele mostra todas as entradas que foram testadas e, a esquerda delas, qual a % de vezes que aquela mesma entrada foi usada.&lt;/p&gt;

&lt;p&gt;O mais interessante, isso tudo rodou em 1.246s! Com isso consigo testar diversas entradas, e garantir que a propriedade do meu método funciona!&lt;/p&gt;

&lt;p&gt;Agora um ponto de atenção, só dissemos para o FsCheck que queremos uma entrada do tipo &lt;em&gt;uint&lt;/em&gt;, porém para nossa porcentagem queremos somente números de 0 até 100.&lt;/p&gt;

&lt;p&gt;O FsCheck disponibiliza formas de lidar com isso, mas isso é um assunto para um próximo post!&lt;/p&gt;




&lt;p&gt;Eai, gostou? Tem dúvidas? Quer saber mais sobre o FsCheck ou Testes de Propriedade?&lt;br&gt;&lt;br&gt;
Deixe um comentário &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KynahQdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://s.w.org/images/core/emoji/13.1.0/72x72/1f642.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KynahQdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://s.w.org/images/core/emoji/13.1.0/72x72/1f642.png" alt="🙂" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abraços&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Imagem usada no post &lt;a href="https://unsplash.com/@chrisliverani?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Chris Liverani&lt;/a&gt; on&lt;/em&gt; &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;&lt;em&gt;Unsplash&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O post &lt;a href="http://high5devs.com/2020/05/fscheck-mudando-sua-visao-sobre-testes/"&gt;FsCheck: Mudando sua visão sobre Testes&lt;/a&gt; apareceu primeiro em &lt;a href="http://high5devs.com"&gt;High5Devs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>net</category>
      <category>bibliotecas</category>
      <category>csharp</category>
      <category>fscheck</category>
    </item>
  </channel>
</rss>
