Jekyll2021-07-28T12:22:12+00:00https://fonini.github.io/feed.xmlJonnas FoniniGremista e programador
Obtendo o total de cobertura de testes em um projeto Go2021-07-28T12:15:40+00:002021-07-28T12:15:40+00:00https://fonini.github.io/2021/07/28/obtendo-o-total-de-cobertura-de-testes-em-um-projeto-go<p>Para obter a porcentagem total de cobertura de testes em um projeto Go, basta rodar os comandos abaixo:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">go <span class="nb">test</span> <span class="nt">-v</span> <span class="nt">-coverpkg</span><span class="o">=</span>./... <span class="nt">-coverprofile</span><span class="o">=</span>cover.out ./...
go tool cover <span class="nt">-func</span> cover.out</code></pre></figure>
<p>O segundo comando irá detalhar a cobertura de testes de todos os arquivos e ao final mostrará a porcentagem total.</p>
<p>Se desejar mostrar somente a porcentagem, sem o restante do output, substitua o segundo comando por:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">go tool cover <span class="nt">-func</span> cover.out | <span class="nb">grep </span>total | <span class="nb">awk</span> <span class="s1">'{print $3}'</span></code></pre></figure>foniniPara obter a porcentagem total de cobertura de testes em um projeto Go, basta rodar os comandos abaixo:Utilizando módulos privados do Go localmente2020-08-25T19:37:46+00:002020-08-25T19:37:46+00:00https://fonini.github.io/2020/08/25/utilizando-modulos-privados-do-go-localmente<p>Colocar no .bashrc ou .bash_profile a seguinte variável:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">export </span><span class="nv">GOPRIVATE</span><span class="o">=</span><span class="s2">"gitlab.com/seu_grupo_privado"</span></code></pre></figure>foniniColocar no .bashrc ou .bash_profile a seguinte variável:Comandos úteis do git2020-07-17T16:53:40+00:002020-07-17T16:53:40+00:00https://fonini.github.io/2020/07/17/comandos-uteis-do-git<h4 id="desfazer-o-último-commit-preservando-as-alterações-nos-arquivos">Desfazer o último commit, preservando as alterações nos arquivos</h4>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">git reset <span class="nt">--soft</span> HEAD~1</code></pre></figure>
<h4 id="desfazer-o-primeiro-commit-preservando-as-alterações-nos-arquivos">Desfazer o primeiro commit, preservando as alterações nos arquivos</h4>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">git update-ref <span class="nt">-d</span> HEAD</code></pre></figure>
<h4 id="desfazer-o-último-commit-não-preservando-as-alterações-nos-arquivos">Desfazer o último commit, <strong>não</strong> preservando as alterações nos arquivos</h4>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">git reset <span class="nt">--hard</span> HEAD~1</code></pre></figure>
<h4 id="criar-branch-a-partir-do-stash">Criar branch a partir do stash</h4>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">git stash branch testchanges</code></pre></figure>
<h4 id="desfazer-alterações-em-um-único-arquivo-sem-commit">Desfazer alterações em um único arquivo (sem commit)</h4>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">git checkout HEAD <span class="nt">--</span> my-file.txt</code></pre></figure>foniniDesfazer o último commit, preservando as alterações nos arquivosConvertendo certificados Let’s Encrypt standalone para webroot2020-01-02T18:58:54+00:002020-01-02T18:58:54+00:00https://fonini.github.io/2020/01/02/convertendo-certificados-lets-encrypt-standalone-para-webroot<p>Converter todos os certificados Let’s Encrypt obtidos no modo standalone para o modo webroot.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">sudo </span>certbot renew <span class="nt">-a</span> webroot <span class="nt">--force-renewal</span> <span class="nt">--webroot-path</span> /var/www</code></pre></figure>foniniConverter todos os certificados Let’s Encrypt obtidos no modo standalone para o modo webroot.Validando datas com o go-playground/validator2019-12-18T17:25:35+00:002019-12-18T17:25:35+00:00https://fonini.github.io/2019/12/18/validando-datas-com-o-go-playground-validator<p><a href="https://godoc.org/github.com/go-playground/validator#hdr-Custom_Validation_Functions">Custom Validator</a> para datas padrão <a href="https://pt.wikipedia.org/wiki/ISO_8601">ISO 8601</a> para <a href="https://golang.org/">Go</a>, utilizando o pacote <a href="https://github.com/go-playground/validator">go-playground/validator</a>.</p>
<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
<span class="s">"fmt"</span>
<span class="s">"regexp"</span>
<span class="s">"gopkg.in/go-playground/validator.v10"</span>
<span class="p">)</span>
<span class="k">func</span> <span class="n">IsISO8601Date</span><span class="p">(</span><span class="n">fl</span> <span class="n">validator</span><span class="o">.</span><span class="n">FieldLevel</span><span class="p">)</span> <span class="kt">bool</span> <span class="p">{</span>
<span class="n">regex</span> <span class="o">:=</span> <span class="s">"^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])((?:T|</span><span class="se">\\</span><span class="s">s)(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])?(Z)?)?$"</span>
<span class="n">ISO8601DateRegex</span> <span class="o">:=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">MustCompile</span><span class="p">(</span><span class="n">regex</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ISO8601DateRegex</span><span class="o">.</span><span class="n">MatchString</span><span class="p">(</span><span class="n">fl</span><span class="o">.</span><span class="n">Field</span><span class="p">()</span><span class="o">.</span><span class="n">String</span><span class="p">())</span>
<span class="p">}</span>
<span class="k">type</span> <span class="n">Dates</span> <span class="k">struct</span> <span class="p">{</span>
<span class="n">ISO8601DateTime</span> <span class="kt">string</span> <span class="s">`validate:"ISO8601date"`</span>
<span class="n">ISO8601Date</span> <span class="kt">string</span> <span class="s">`validate:"ISO8601date"`</span>
<span class="n">Invalid</span> <span class="kt">string</span> <span class="s">`validate:"ISO8601date"`</span>
<span class="p">}</span>
<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
<span class="n">validator</span> <span class="o">:=</span> <span class="n">validator</span><span class="o">.</span><span class="n">New</span><span class="p">()</span>
<span class="n">validator</span><span class="o">.</span><span class="n">RegisterValidation</span><span class="p">(</span><span class="s">"ISO8601date"</span><span class="p">,</span> <span class="n">IsISO8601Date</span><span class="p">)</span>
<span class="n">dates</span> <span class="o">:=</span> <span class="n">Dates</span><span class="p">{</span><span class="n">ISO8601DateTime</span><span class="o">:</span> <span class="s">"2019-12-18T14:19:30Z"</span><span class="p">,</span> <span class="n">ISO8601Date</span><span class="o">:</span> <span class="s">"2019-12-18"</span><span class="p">,</span> <span class="n">Invalid</span><span class="o">:</span> <span class="s">"2019-60-12"</span><span class="p">}</span>
<span class="n">err</span> <span class="o">:=</span> <span class="n">validator</span><span class="o">.</span><span class="n">Struct</span><span class="p">(</span><span class="n">dates</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span></code></pre></figure>foniniCustom Validator para datas padrão ISO 8601 para Go, utilizando o pacote go-playground/validator.Executar SQL em todos os bancos de dados2019-09-26T12:40:46+00:002019-09-26T12:40:46+00:00https://fonini.github.io/2019/09/26/executar-sql-em-todos-os-bancos-de-dados<p>Esse comando vai gerar diversos comandos psql para serem executados no terminal, cada um deles gerando um arquivo CSV, usando o Tenant ID como nome.
Útil para gerar estatísticas com dados de diversos bancos.</p>
<figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="k">select</span> <span class="s1">'psql -d '</span> <span class="o">||</span> <span class="n">d</span><span class="p">.</span><span class="n">database_name</span> <span class="o">||</span><span class="s1">' -c "COPY (select </span><span class="se">''</span><span class="s1">Test</span><span class="se">''</span><span class="s1"> as type from table) to </span><span class="se">''</span><span class="s1">/var/lib/pgsql/table/'</span> <span class="o">||</span> <span class="n">t</span><span class="p">.</span><span class="n">id</span> <span class="o">||</span><span class="s1">'.csv</span><span class="se">''</span><span class="s1"> delimiter</span><span class="se">''</span><span class="s1">,</span><span class="se">''</span><span class="s1">" '</span>
<span class="k">from</span> <span class="n">tenant</span> <span class="n">t</span>
<span class="k">inner</span> <span class="k">join</span> <span class="k">database</span> <span class="n">d</span> <span class="k">on</span> <span class="n">d</span><span class="p">.</span><span class="n">tenant_id</span> <span class="o">=</span> <span class="n">t</span><span class="p">.</span><span class="n">id</span>
<span class="k">order</span> <span class="k">by</span> <span class="n">t</span><span class="p">.</span><span class="n">id</span></code></pre></figure>
<p>Após, é só juntar os arquivos em um só.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cd</span> /var/lib/pgsql
<span class="nb">cat </span>table/<span class="k">*</span> <span class="o">></span> table.csv</code></pre></figure>foniniEsse comando vai gerar diversos comandos psql para serem executados no terminal, cada um deles gerando um arquivo CSV, usando o Tenant ID como nome. Útil para gerar estatísticas com dados de diversos bancos.Baixando MP3 em alta qualidade do YouTube2019-03-27T19:38:53+00:002019-03-27T19:38:53+00:00https://fonini.github.io/2019/03/27/baixando-mp3-em-alta-qualidade-do-youtube<p>Baixe o youtube-dl em <a href="https://youtube-dl.org">youtube-dl.org</a>.
O áudio será baixado com o cover do vídeo e os metadados.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">youtube-dl.exe <span class="nt">-f</span> 251 <span class="nt">--extract-audio</span> <span class="nt">--audio-format</span> mp3 <span class="nt">--audio-quality</span> 320k <span class="nt">--add-metadata</span> LINK_DO_VIDEO</code></pre></figure>foniniBaixe o youtube-dl em youtube-dl.org. O áudio será baixado com o cover do vídeo e os metadados.Plugin do OneSignal no Ionic AppFlow2019-03-08T14:33:08+00:002019-03-08T14:33:08+00:00https://fonini.github.io/2019/03/08/plugin-do-onesignal-no-ionic-appflow<p>Ao compilar apps no Ionic AppFlow, podem ocorrer erros EACCES quando utilizamos o plugin do OneSignal.</p>
<p>Para corrigir, basta dar permissão nos scripts do CocoaPods:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">git update-index <span class="nt">--chmod</span><span class="o">=</span>+x run_pods.sh
git update-index <span class="nt">--chmod</span><span class="o">=</span>+x update_pods.sh</code></pre></figure>foniniAo compilar apps no Ionic AppFlow, podem ocorrer erros EACCES quando utilizamos o plugin do OneSignal.Lista de números da Vivo para bloquear em seu celular2018-02-28T15:13:00+00:002018-02-28T15:13:00+00:00https://fonini.github.io/2018/02/28/lista-numeros-vivo-bloquear<p>Crie um contato chamado Vivo, adicione os números abaixo e bloqueie o contato.</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell">011 25359888
011 30192220
011 38277800
011 25239900
011 27479100</code></pre></figure>foniniCrie um contato chamado Vivo, adicione os números abaixo e bloqueie o contato.Lendo a temperatura da Raspberry Pi2017-10-19T16:58:04+00:002017-10-19T16:58:04+00:00https://fonini.github.io/2017/10/19/lendo-a-temperatura-da-raspberry-pi<p>Utilize o seguinte comando:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cat</span> /sys/class/thermal/thermal_zone0/temp
<span class="nt">--sa</span>ída: 54768</code></pre></figure>
<p>Para formatar a saída em graus Celsius, utilize o seguinte comando:</p>
<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">awk</span> <span class="s1">'{printf("%.1f °C\n",$1/1e3)}'</span> /sys/class/thermal/thermal_zone0/temp
<span class="nt">--sa</span>ída: 54.8 °C</code></pre></figure>foniniUtilize o seguinte comando: