<?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>The Ops Community ⚙️: Francilio Araújo</title>
    <description>The latest articles on The Ops Community ⚙️ by Francilio Araújo (@francilio).</description>
    <link>https://community.ops.io/francilio</link>
    <image>
      <url>https://community.ops.io/images/MpketmICqVoW_aPPFrl_iAl2O78bBtLu3WqZg98xKs4/rs:fill:90:90/g:sm/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL3Vz/ZXIvcHJvZmlsZV9p/bWFnZS8xMTY0L2Iw/YWRiNjE0LWZkM2Et/NGY3NC05MzkzLTFi/ODMwMzJjMTIxZi5q/cGc</url>
      <title>The Ops Community ⚙️: Francilio Araújo</title>
      <link>https://community.ops.io/francilio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://community.ops.io/feed/francilio"/>
    <language>en</language>
    <item>
      <title>Como conseguir ajuda sobre TI e ajudar de forma eficiente</title>
      <dc:creator>Francilio Araújo</dc:creator>
      <pubDate>Fri, 09 Sep 2022 19:29:07 +0000</pubDate>
      <link>https://community.ops.io/francilio/como-conseguir-ajuda-sobre-ti-e-ajudar-de-forma-eficiente-441k</link>
      <guid>https://community.ops.io/francilio/como-conseguir-ajuda-sobre-ti-e-ajudar-de-forma-eficiente-441k</guid>
      <description>&lt;p&gt;Há diversas comunidades de tecnologia espalhadas por diversas plataformas, como telegram, slack, discord, gitter, matrix, twitter, etc. Estas comunidades podem ser utilizadas para compartilhar conhecimento, tirar dúvidas e auxiliar na resolução de problemas. Pessoas com os mais variados níveis de experiência interagem nestas comunidades. Neste texto reuni algumas dicas para conseguir ajuda e ajudar nessas comunidades de forma eficiente. Cada item é clicável para dar mais detalhes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para quem procura ajuda
&lt;/h3&gt;

&lt;p&gt;
  1. Não diga apenas olá, ou pergunte se pode perguntar
  &lt;p&gt;Ao enviar apenas um 'olá' ou similares e esperar alguém responder para poder mandar a pergunta, você estará perdendo o tempo que poderia estar respondendo a sua pergunta. Além disso, nada garante que a pessoa que responder estará disponível para dar uma segunda resposta.&lt;/p&gt;

&lt;p&gt;Da mesma forma, não pergunte coisas do tipo 'posso fazer uma pergunta sobre X aqui?', ou 'alguém aqui entende de X?'. Assumindo que você está no local certo, só estará perdendo tempo.&lt;/p&gt;

&lt;p&gt;As pessoas que estão ali para responder podem estar fazendo outras atividades ao mesmo tempo e é escolha delas se elas terão tempo para responder só uma pergunta, ou as perguntas subsequentes, ou até mesmo não responder.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nohello.net/pt-br/"&gt;No Hello!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dontasktoask.com/"&gt;Don't ask to ask!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://osprogramadores.com/blog/2020/09/11/como-perguntar/"&gt;Não pergunte se pode perguntar, apenas pergunte&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;

  2. Antes de recorrer à comunidade, use o Google e o manual
  &lt;p&gt;Saber utilizar bem o google é uma das mais poderosas ferramentas de uma pessoa que trabalha em tecnologia. É bem provável que outra pessoa tenha tido o mesmo problema e escreveu a solução em algum StackOverflow, fórum ou blog, ou até fez um vídeo. Procurar a solução no google pode te poupar tempo.&lt;/p&gt;

&lt;p&gt;A documentação oficial (ou manual) deve ser uma das primeiras fontes de informação sobre alguma linguagem, biblioteca, sistema ou ferramenta. Vários softwares atuais possuem boas documentações que abrangem todos os níveis de experiência, além de blogs com bastante informação extra. Ler a documentação oficial é um passo importante para utilizar um software de forma efetiva.&lt;/p&gt;



&lt;br&gt;

  3. Faça as perguntas certas nos locais corretos
  &lt;p&gt;Em um grupo sobre docker, perguntas sobre docker. Em um grupo de python, perguntas sobre python. Não pergunte sobre coisas que não tem a ver com o propósito do grupo. Isso é tratado como off-topic e alguns grupos possuem políticas rígidas contra isso. Caso você não conheça um grupo específico sobre isso, pode perguntar à comunidade se alguém conhece um local apropriado.&lt;/p&gt;

&lt;p&gt;Se você tem uma pergunta que parece pertencer a múltiplos grupos primeiro tente entender em que parte o problema está acontecendo para direcionar para o grupo correto. Por exemplo, 'tenho um código python executando em docker que está retornando X quando faço Y e deveria retornar Z'. A primeiro momento isso pode ser erro no código, então deveria ser perguntado em um grupo de python. Caso você tenha evidências de que o problema é com docker, então está no contexto do grupo de docker.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bolhaio/code-of-conduct/blob/master/README.md"&gt;Código de conduta das comunidades de TI brasileiras&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;

  4. Descreva sua questão de forma clara e concisa
  &lt;p&gt;A pessoa terá de entender bem a sua pergunta para dar respostas adequadas. No mínimo a pessoa precisará de uma descrição do problema e sob quais condições ele ocorre. Dependendo do problema, serão necessárias mais informações, como ambiente, execução e código. Se estas informações são importantes para entender o problema, entregue-as junto à pergunta, não espere alguém solicitá-las. Descreva também outras tentativas que você já fez para tentar resolver o problema.&lt;/p&gt;

&lt;p&gt;Não envie fotos de código, ou texto muito grande. As outras pessoas podem estar utilizando equipamentos com telas menores, ou terem problemas de visão, e uma imagem é bastante incômoda nestes cenários. Só envie imagens se forem realmente necessárias. Em casos de textos grandes, como logs, ou códigos grandes, utilize um site como &lt;a href="https://pastebin.com/"&gt;https://pastebin.com/&lt;/a&gt; e envie apenas o link.&lt;/p&gt;

&lt;p&gt;Filtre informações que possam não ser relevantes para o problema. É muito mais fácil uma pessoa ler um log de poucas linhas do que um log de 200 para resolver o problema de outra pessoa. Lembre que as outras pessoas podem estar realizando outras tarefas naquele instante.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pt.stackoverflow.com/help/how-to-ask"&gt;Como fazer uma boa pergunta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Problema_XY"&gt;Problema XY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogofscience.com/perguntas.html"&gt;Como fazer perguntas inteligentes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;br&gt;

  5. Seja paciente com as respostas
  &lt;p&gt;Caso sua pergunta não tenha sido respondida após alguns minutos, mas ela ainda é a última mensagem enviada, não envie outra para 'relembrar'. Podem haver diversos motivos para ninguém ter respondido ainda, como a pessoa não se sentir capaz de responder, ou não ter tempo. Caso sua mensagem esteja atrás de diversas outras mensagens, pode mandar um lembrete respondendo à própria mensagem.&lt;/p&gt;



&lt;br&gt;

  6. Não mande mensagem em privado sem o consentimento da pessoa
  &lt;p&gt;Imagina que você faz trabalho voluntário de dar aula de tricô e um dos alunos vai na sua casa pedir uma aula particular. Não é uma situação agradável, não é? Da mesma forma em comunidades online. É de bom tom perguntar pelo consentimento da pessoa antes de chamá-la por mensagem privada. A pessoa pode ter de dedicar a atenção a outros assuntos.&lt;/p&gt;

&lt;p&gt;Outro motivo para não fazer isso é que algumas plataformas são infestadas de spam. Por exemplo, no telegram é comum pessoas irem no privado para oferecer investimento em criptomoedas. Sem pedir o consentimento da pessoa, você pode ser confundido com um spam e ser ignorado ou até bloqueado.&lt;/p&gt;



&lt;br&gt;

  7. Se conseguir resolver por outros meios, adicione como resposta
  &lt;p&gt;O problema que você passou pode servir de referência para outra pessoa. Se você encontrou a solução, pode ajudar outra pessoa no futuro. Deixar uma mensagem 'encontrei a solução. Caso alguém tenha o mesmo problema é só entrar em contato comigo' não é produtiva, pois quem garante que você estará disponível para responder quando alguém precisar? E a solução que você encontrou pode servir de aprendizado para as pessoas que não estavam seguras em ajudar.&lt;/p&gt;



&lt;br&gt;

  8. Dê um retorno às respostas
  &lt;p&gt;Caso alguma resposta tenha resolvido, agradeça. Aquela pessoa dedicou atenção e tempo para pensar, pesquisar e responder à sua pergunta. Saber se deu certo ou não pode ser uma chance de aprendizado para a pessoa que respondeu. Mesmo que não tenha funcionado, retorne com o resultado.&lt;/p&gt;



&lt;/p&gt;

&lt;h3&gt;
  
  
  Para quem responde
&lt;/h3&gt;

&lt;p&gt;
  1. Se a pergunta não for pertinente, redirecione para o local correto
  &lt;p&gt;Pessoas com menos experiência podem ter dificuldade em afunilar a causa de um problema. Caso você esteja certo que a pergunta não pertence ao grupo, mas conhece outro que possa respondê-la, então responda com um direcionamento pro grupo e alguma informação que ajude a deixar a pergunta mais clara.&lt;/p&gt;



&lt;br&gt;

  2. Seja humilde. Deixe claro se você tem certeza da resposta, ou se é um palpite
  &lt;p&gt;A pessoa que está perguntando pode estar com pressa pela resposta. Evite 'tiros no escuro', a não ser que sejam necessários. A pessoa que pergunta pode aprender algo com a resposta. Caso demore a chegar no objetivo, mais difícil será tirar um aprendizado.&lt;/p&gt;

&lt;p&gt;Em um processo de troubleshoot pode ser necessário testar algumas hipóteses, neste caso deixe claro que é um teste, qual a hipótese e qual o resultado esperado.&lt;/p&gt;

&lt;p&gt;Melhor do que uma resposta que leva a lugar nenhum é nenhuma resposta. Uma comunidade não é sobre ego, mas sim sobre ajudar.&lt;/p&gt;



&lt;br&gt;

  3. Responda a pergunta, ou explique por que é uma resposta ruim e dê alternativas
  &lt;p&gt;&lt;a href="https://community.ops.io/images/SvtXcNpGoXyPmrGzZq2uTcnvAMq1C2EC1y3_zta6nA4/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3Z6aDM5/MDN5MHVyemJxYnZ3/dTlzLmpwZWc" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/SvtXcNpGoXyPmrGzZq2uTcnvAMq1C2EC1y3_zta6nA4/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3Z6aDM5/MDN5MHVyemJxYnZ3/dTlzLmpwZWc" alt="Um gato pedindo ajuda em um fórum" width="880" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se uma pessoa pergunta sobre 'A', não responda simplesmente que é melhor fazer 'B'. A pessoa não aprenderá nada assim. Explique por que fazer 'A' é ruim e aí fale como a alternativa 'B' é melhor. Assim a pessoa resolve o problema e ainda aprende boas práticas.&lt;/p&gt;



&lt;br&gt;

  4. Seja claro na resposta
  &lt;p&gt;A pessoa que está perguntando pode não ter o mesmo 'repertório' que você. Considere adicionar informações que considere relevantes e não utilize termos que não possam ser facilmente associados ao tema.&lt;/p&gt;

&lt;p&gt;Se possível, indique links para a leitura, de preferência da documentação oficial ou de blogs relevantes.&lt;/p&gt;



&lt;br&gt;

  5. Seja educado ao responder
  &lt;p&gt;Evite emitir juízos sobre a pergunta, isso pode ser interpretado como ataque pessoal. Caso seja necessário emitir algum juízo, um alerta para má prática por exemplo, não faça parecer que a pergunta é estúpida. Se você expor dados concretos, dificilmente será interpretado como ataque pessoal. Lembre que seu filtro tátil pode ser diferente do filtro da outra pessoa.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mit.edu/~jcb/tact.html"&gt;Tact Filters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;/p&gt;

</description>
      <category>random</category>
    </item>
    <item>
      <title>Introdução ao prometheus</title>
      <dc:creator>Francilio Araújo</dc:creator>
      <pubDate>Tue, 06 Sep 2022 17:02:28 +0000</pubDate>
      <link>https://community.ops.io/francilio/introducao-ao-prometheus-4e01</link>
      <guid>https://community.ops.io/francilio/introducao-ao-prometheus-4e01</guid>
      <description>&lt;p&gt;Prometheus é um sistema open source de coleta, armazenamento, consulta e exibição de métricas. Ele foi construído dentro da SoundCloud por engenheiros que já tinham trabalhado com o sistema de monitoramento do Borg, antecessor do kubernetes. Prometheus foi o segundo projeto a fazer parte da Cloud Native Computing Foundation, logo após o kubernetes.&lt;br&gt;
O prometheus armazena as métricas como séries temporais, ou seja, os valores são armazenados junto ao timestamp de quando eles foram coletados e, opcionalmente, algumas labels.&lt;/p&gt;
&lt;h2&gt;
  
  
  Funcionalidades
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Um modelo de dados multi-dimensional com dados de séries temporais identificados por nome e pares chave/valor;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;PromQL&lt;/em&gt;, uma linguagem de consulta flexível e capaz de lidar com esta dimensionalidade;&lt;/li&gt;
&lt;li&gt;Não depende de armazenamento distribuído. Nós single server são autônomos;&lt;/li&gt;
&lt;li&gt;Coleta de séries temporais ocorre por pull sobre HTTP;&lt;/li&gt;
&lt;li&gt;Push de séries temporais é suportado por meio de um gateway intermediário;&lt;/li&gt;
&lt;li&gt;Alvos são listados por meio de service discovery ou configuração estática;&lt;/li&gt;
&lt;li&gt;Suporte a múltiplos modos para geração de gráficos e dashboards.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Arquitetura
&lt;/h2&gt;

&lt;p&gt;O diagrama a seguir ilustra os componentes do prometheus e a relação com outras ferramentas do ecosistema:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/qWpv1wFH-1e5ouj_PKXc-0uqlfv8qwhXoPMjfh4s3BI/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzJyN2py/eDJxbHh3Y2I2Mm55/MGUwLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/qWpv1wFH-1e5ouj_PKXc-0uqlfv8qwhXoPMjfh4s3BI/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzLzJyN2py/eDJxbHh3Y2I2Mm55/MGUwLnBuZw" alt="Arquitetura do Prometheus" width="852" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O prometheus gera uma lista de endpoints em que ele coletará os dados. Ele suporta listar endpoints de provedores de cloud, como AWS, Azure, GCP, Digital Ocean e Linode, de orquestradores, como Hashicorp Nomad e Kubernetes, de sistemas de service discovery, como Eureka e Hashicorp Consul, além de arquivos, endpoints HTTP, DNS, hosts docker e vários outros métodos.&lt;br&gt;
Após listar os alvos, o prometheus realiza uma requisição em cada um para coletar as métricas. Um alvo pode ser uma aplicação instrumentada, um exporter ou um pushgateway.&lt;br&gt;
Uma aplicação instrumentada é uma aplicação que utiliza uma biblioteca &lt;a href="https://prometheus.io/docs/instrumenting/clientlibs/"&gt;cliente do prometheus&lt;/a&gt;. Um &lt;a href="https://prometheus.io/docs/instrumenting/exporters/"&gt;exporter&lt;/a&gt; é uma aplicação que coleta dados de um processo ou serviço e os disponibiliza no formato do prometheus. O &lt;a href="https://github.com/prometheus/pushgateway"&gt;pushgateway&lt;/a&gt; é uma aplicação intermediária entre o prometheus e processos de curta duração. Como processos de curta duração podem terminar antes do prometheus realizar a coleta, pode-se enviar as métricas para o pushgateway e o prometheus fará a coleta nele.&lt;br&gt;
Os dados coletados são armazenados localmente no disco.&lt;br&gt;
O prometheus pode enviar notificações para o &lt;a href="https://github.com/prometheus/alertmanager"&gt;alertmanager&lt;/a&gt; para sinalizar valores fora do esperado.&lt;br&gt;
Outras ferramentas podem consultar os dados do prometheus utilizando &lt;em&gt;PromQL&lt;/em&gt; para visualização e exportação.&lt;/p&gt;
&lt;h2&gt;
  
  
  Primeiros passos com docker
&lt;/h2&gt;

&lt;p&gt;Para realizar este hands-on você vai precisar do &lt;a href="https://docs.docker.com/engine/install/"&gt;docker&lt;/a&gt; e &lt;a href="https://docs.docker.com/compose/install/linux/"&gt;docker compose&lt;/a&gt; (prefira o plugin). Como base vamos utilizar este repositório:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/francilioaraujo"&gt;
        francilioaraujo
      &lt;/a&gt; / &lt;a href="https://github.com/francilioaraujo/monitoring-labs"&gt;
        monitoring-labs
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  0. Preparação
&lt;/h3&gt;

&lt;p&gt;Realize o checkout da branch &lt;code&gt;part01&lt;/code&gt; e suba o contêiner pelo compose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git checkout part01
Switched to branch &lt;span class="s1"&gt;'part01'&lt;/span&gt;
Your branch is up to &lt;span class="nb"&gt;date &lt;/span&gt;with &lt;span class="s1"&gt;'origin/part01'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;
docker-compose.yaml &lt;span class="c"&gt;# Compose com todos os 'nós'&lt;/span&gt;
get-ip-for&lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="c"&gt;# Script para exibir o IP de um contêiner&lt;/span&gt;
prometheus/         &lt;span class="c"&gt;# Pasta com o Dockerfile para o prometheus&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Building 17.4s &lt;span class="o"&gt;(&lt;/span&gt;6/6&lt;span class="o"&gt;)&lt;/span&gt; FINISHED                                              
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;internal] load build definition from Dockerfile                      1.3s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; transferring dockerfile: 115B                                      0.3s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;internal] load .dockerignore                                         1.2s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; transferring context: 2B                                           0.0s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;internal] load metadata &lt;span class="k"&gt;for &lt;/span&gt;docker.io/library/debian:bullseye        0.2s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; CACHED &lt;span class="o"&gt;[&lt;/span&gt;1/2] FROM docker.io/library/debian:bullseye                   0.0s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;2/2] RUN apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;     apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; wget vim          14.4s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; exporting to image                                                    0.8s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; exporting layers                                                   0.8s
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; writing image sha256:a4106420c75c87f084254dd950583c6320c90f9767c2  0.0s 
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; naming to docker.io/library/monitoring-labs_prometheus             0.0s 
&lt;span class="o"&gt;[&lt;/span&gt;+] Running 3/3                                                                
 ⠿ Network monitoring-labs_lab             Created                        0.1s 
 ⠿ Network monitoring-labs_default         Created                        0.1s
 ⠿ Container monitoring-labs_prometheus_1  Started                        0.7s
&lt;span class="nv"&gt;$ &lt;/span&gt;docker compose ps
NAME                           SERVICE             STATUS              PORTS
monitoring-labs_prometheus_1   prometheus          running             
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir deste ponto, as linhas que iniciarem por &lt;code&gt;@prometheus $&lt;/code&gt; devem ser executadas dentro do contêiner prometheus e as linhas que iniciarem por &lt;code&gt;@host $&lt;/code&gt; devem ser executadas na máquina host. Entre no contêiner com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;@host &lt;span class="nv"&gt;$ &lt;/span&gt;docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;prometheus /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este contêiner é um contêiner &lt;code&gt;debian:bullseye&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Instalação
&lt;/h3&gt;

&lt;p&gt;Vá até &lt;a href="https://prometheus.io/download/#prometheus"&gt;esta&lt;/a&gt; para copiar o link de download. Faça o download dentro do contêiner prometheus, descompacte e entre na nova pasta. No exemplo a seguir usarei a versão &lt;code&gt;2.37.0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;@prometheus &lt;span class="nv"&gt;$ &lt;/span&gt;wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz
...
2022-09-06 00:48:02 &lt;span class="o"&gt;(&lt;/span&gt;22.8 MB/s&lt;span class="o"&gt;)&lt;/span&gt; - &lt;span class="s1"&gt;'prometheus-2.37.0.linux-amd64.tar.gz'&lt;/span&gt; saved
@prometheus &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzvf&lt;/span&gt; prometheus-2.37.0.linux-amd64.tar.gz     
prometheus-2.37.0.linux-amd64/
prometheus-2.37.0.linux-amd64/consoles/
prometheus-2.37.0.linux-amd64/consoles/index.html.example
prometheus-2.37.0.linux-amd64/consoles/node-cpu.html
prometheus-2.37.0.linux-amd64/consoles/node-disk.html
prometheus-2.37.0.linux-amd64/consoles/node-overview.html
prometheus-2.37.0.linux-amd64/consoles/node.html
prometheus-2.37.0.linux-amd64/consoles/prometheus-overview.html
prometheus-2.37.0.linux-amd64/consoles/prometheus.html
prometheus-2.37.0.linux-amd64/console_libraries/
prometheus-2.37.0.linux-amd64/console_libraries/menu.lib
prometheus-2.37.0.linux-amd64/console_libraries/prom.lib
prometheus-2.37.0.linux-amd64/prometheus.yml
prometheus-2.37.0.linux-amd64/LICENSE
prometheus-2.37.0.linux-amd64/NOTICE
prometheus-2.37.0.linux-amd64/prometheus
prometheus-2.37.0.linux-amd64/promtool
@prometheus &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;prometheus-2.37.0.linux-amd64
@prometheus &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;
LICENSE  console_libraries/  prometheus&lt;span class="k"&gt;*&lt;/span&gt;     promtool&lt;span class="k"&gt;*&lt;/span&gt;
NOTICE   consoles/           prometheus.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entre os arquivos extraídos temos o binário do prometheus, um binário utilitário chamado promtool e um exemplo de configuração. O exemplo de configuração junto com algumas explicações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Configurações globais&lt;/span&gt;
&lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt; &lt;span class="c1"&gt;# Configura o tempo entre cada coleta para 15s. O padrão é a cada 1 minuto.&lt;/span&gt;
  &lt;span class="na"&gt;evaluation_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt; &lt;span class="c1"&gt;# Calcula regras a cada 15s. O padrão é a cada 1 minuto.&lt;/span&gt;
  &lt;span class="c1"&gt;# scrape_timeout é configurado para o padrão global (10s).&lt;/span&gt;

&lt;span class="c1"&gt;# Configurações do Alertmanager&lt;/span&gt;
&lt;span class="na"&gt;alerting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;alertmanagers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# - alertmanager:9093&lt;/span&gt;

&lt;span class="c1"&gt;# Carrega regras uma vez e periodicamente as calcula de acordo com o 'evaluation_interval' global.&lt;/span&gt;
&lt;span class="na"&gt;rule_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# - "first_rules.yml"&lt;/span&gt;
  &lt;span class="c1"&gt;# - "second_rules.yml"&lt;/span&gt;

&lt;span class="c1"&gt;# Uma configuração de coleta contendo exatamente um endpoint para coletar:&lt;/span&gt;
&lt;span class="c1"&gt;# Aqui está o próprio prometheus.&lt;/span&gt;
&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# O nome do job é adicionado como uma label `job=&amp;lt;job_name&amp;gt;` para qualquer série temporal coletada desta configuração.&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prometheus"&lt;/span&gt;

    &lt;span class="c1"&gt;# metrics_path padrão é '/metrics'&lt;/span&gt;
    &lt;span class="c1"&gt;# scheme padrão é 'http'.&lt;/span&gt;

    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost:9090"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Iniciando
&lt;/h3&gt;

&lt;p&gt;O prometheus é iniciado com o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;@prometheus &lt;span class="nv"&gt;$ &lt;/span&gt;./prometheus &lt;span class="nt"&gt;--config&lt;/span&gt;.file&lt;span class="o"&gt;=&lt;/span&gt;prometheus.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No host execute &lt;code&gt;./get-ip-for prometheus&lt;/code&gt; para pegar o ip do contêiner e acesse no seu navegador com a porta 9090. Você verá uma tela similar a esta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/ibo-oZd0O5pOdLRwEqn57fWWCpzzSTcSkLFyAk1spnA/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3h3NHl1/NXpjY2kyMnhuZDVt/eHk5LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/ibo-oZd0O5pOdLRwEqn57fWWCpzzSTcSkLFyAk1spnA/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL3h3NHl1/NXpjY2kyMnhuZDVt/eHk5LnBuZw" alt="Tela do prometheus" width="803" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de utilizar a UI web, acesse o endereço &lt;code&gt;http://&amp;lt;ip do prometheus&amp;gt;:9090/metrics&lt;/code&gt; para ver como são as métricas. Exemplos de algumas métricas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 4.0051e-05
go_gc_duration_seconds{quantile="0.25"} 6.132e-05
go_gc_duration_seconds{quantile="0.5"} 9.129e-05
go_gc_duration_seconds{quantile="0.75"} 0.001359203
go_gc_duration_seconds{quantile="1"} 0.001720425
go_gc_duration_seconds_sum 0.005046295
go_gc_duration_seconds_count 10
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 35
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
# TYPE go_memstats_alloc_bytes_total counter
go_memstats_alloc_bytes_total 7.6876768e+07
# HELP prometheus_tsdb_tombstone_cleanup_seconds The time taken to recompact blocks to remove tombstones.
# TYPE prometheus_tsdb_tombstone_cleanup_seconds histogram
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.005"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.01"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.025"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.05"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.1"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.25"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.5"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="1"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="2.5"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="5"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="10"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="+Inf"} 0
prometheus_tsdb_tombstone_cleanup_seconds_sum 0
prometheus_tsdb_tombstone_cleanup_seconds_count 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada métrica inicia com duas linhas &lt;code&gt;# HELP &amp;lt;nome&amp;gt;&lt;/code&gt; e &lt;code&gt;# TYPE &amp;lt;nome&amp;gt;&lt;/code&gt;. A linha &lt;code&gt;# HELP&lt;/code&gt; diz o que é esta métrica e &lt;code&gt;# TYPE&lt;/code&gt; diz qual o tipo dela. O prometheus suporta quatro tipos de métricas, contadores, medidores, histogramas e sumários. Mais informações sobre cada tipo de métrica podem ser encontrados &lt;a href="https://prometheus.io/docs/concepts/metric_types/"&gt;aqui&lt;/a&gt;. As próximas linhas contém o nome da métrica, labels entre &lt;code&gt;{}&lt;/code&gt; e o valor da métrica. Cada linha é uma série. Cada série pode ter várias labels separadas por &lt;code&gt;,&lt;/code&gt;, ou nenhuma. No caso de não haverem labels, também não há &lt;code&gt;{}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na UI web temos os menus alertas, gráfico, status e ajuda. Dentro do menu status temos informação de build e runtime, status do TSDB, flags de linha de comando, configuração, regras, alvos e service discovery.&lt;/p&gt;

&lt;p&gt;Na página gráfico podemos ver os valores das métricas e gerar gráficos simples. Esta página é muito útil para debugar métricas. Na barra ao lado da lupa você pode escrever expressões em PromQL para executá-las. No botão com um planeta, logo ao lado, é possível explorar as métricas que estão no prometheus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/KtLZ9Db4aszCIA_p9Xi-Q5_VGKFqpOdpR0ocgH0bHjI/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2J5cDli/azN5YXAwbGc2ZG00/ZDltLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/KtLZ9Db4aszCIA_p9Xi-Q5_VGKFqpOdpR0ocgH0bHjI/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2J5cDli/azN5YXAwbGc2ZG00/ZDltLnBuZw" alt="página gráfico mostrando a métrica prometheus_http_requests_total" width="803" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para filtrar as séries com &lt;code&gt;code=200&lt;/code&gt; podemos escrever &lt;code&gt;prometheus_http_requests_total{code="200"}&lt;/code&gt; e para filtrar mais ainda podemos adicionar labels separadas por &lt;code&gt;,&lt;/code&gt;, como &lt;code&gt;prometheus_http_requests_total{code="200",handler="/metrics"}&lt;/code&gt;. Mais informações sobre PromQL podem ser encontrados &lt;a href="https://prometheus.io/docs/prometheus/latest/querying/basics/"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>prometheus</category>
      <category>o11y</category>
    </item>
    <item>
      <title>Comandos e atalhos do bash para produtividade</title>
      <dc:creator>Francilio Araújo</dc:creator>
      <pubDate>Fri, 26 Aug 2022 19:33:00 +0000</pubDate>
      <link>https://community.ops.io/francilio/comandos-e-atalhos-do-bash-3cn9</link>
      <guid>https://community.ops.io/francilio/comandos-e-atalhos-do-bash-3cn9</guid>
      <description>&lt;p&gt;Se você trabalha com tecnologia é bem provável que você faça uso de um shell por boa parte do dia. Por padrão o shell de sistemas GNU/linux é o bash, ou alternativas como o dash. Para facilitar o uso e aumentar a produtividade do usuário o bash tem várias funções que podem ser desconhecidas por alguns de seus usuários. Neste texto irei listar comandos e atalhos úteis para o dia a dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos
&lt;/h2&gt;

&lt;p&gt;A shell guarda um histórico de comandos executados e permite reutilizar comandos ou partes dele.&lt;br&gt;
A referência ao histórico é feita pelo caractere &lt;code&gt;!&lt;/code&gt;. Pode-se inserir apenas uma palavra de um comando do histórico e realizar modificações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selecionando um item do histórico
&lt;/h3&gt;

&lt;p&gt;Executando o comando &lt;code&gt;history&lt;/code&gt; são exibidos os comandos executados com um número. Referencia-se este comando adicionando o número após o &lt;code&gt;!&lt;/code&gt;. Por exemplo, na figura abaixo &lt;code&gt;!221&lt;/code&gt; seria o comando &lt;code&gt;history&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/y_5RgbDrYeJxcqGzKCnOJIRiXd6xa-Tfosa-PiT957Q/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2Nncmoy/M3pmZXQ5Znlzczl4/dHVtLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/y_5RgbDrYeJxcqGzKCnOJIRiXd6xa-Tfosa-PiT957Q/w:880/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL2Fy/dGljbGVzL2Nncmoy/M3pmZXQ5Znlzczl4/dHVtLnBuZw" alt="exemplo do comando history" width="374" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pode-se utilizar números negativos para fazer referências a comandos anteriores ao atual. Na imagem anterior o comando &lt;code&gt;history&lt;/code&gt; poderia ser referenciado também como &lt;code&gt;!-1&lt;/code&gt; e &lt;code&gt;!-2&lt;/code&gt; seria o comando &lt;code&gt;echo loren ipsum dolor sit amet&lt;/code&gt;. &lt;code&gt;!-1&lt;/code&gt; também pode ser escrito como &lt;code&gt;!!&lt;/code&gt;. A referência também pode ser feita como uma busca. &lt;code&gt;!foo&lt;/code&gt; referencia o comando mais recente que inicie com &lt;code&gt;foo&lt;/code&gt; e &lt;code&gt;!?bar?&lt;/code&gt; referencia o comando mais recente que contenha &lt;code&gt;bar&lt;/code&gt;. Pode-se referenciar também o comando que está sendo digitado com &lt;code&gt;!#&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Logo após a referência do comando pode ser adicionado um &lt;code&gt;:&lt;/code&gt; para fazer referência a apenas alguns parâmetros ou palavras. &lt;code&gt;!!:1&lt;/code&gt; é o primeiro argumento do comando anterior, &lt;code&gt;!!:0&lt;/code&gt; é o comando, &lt;code&gt;!!:$&lt;/code&gt; é o último e &lt;code&gt;!!:1-4&lt;/code&gt; são os argumentos de 1 a 4. Nos casos anteriores, no lugar de &lt;code&gt;!!&lt;/code&gt; poderia ser escrito só &lt;code&gt;!&lt;/code&gt;. Também é possível utilizar &lt;code&gt;!!:*&lt;/code&gt; para utilizar todos os argumentos (equivalente a &lt;code&gt;!!:1-$&lt;/code&gt;) ou &lt;code&gt;!!:3*&lt;/code&gt; para utilizar do terceiro até o último.&lt;/p&gt;

&lt;p&gt;É possível realizar modificações na linha ou palavra selecionada. Para adicionar uma modificação basta adicionar um &lt;code&gt;:&lt;/code&gt; e a modificação. Para realizar uma substituição utiliza-se &lt;code&gt;s&lt;/code&gt; para modificar uma vez e &lt;code&gt;gs&lt;/code&gt; para modificar todas ocorrências. Por exemplo, assuma que &lt;code&gt;!!&lt;/code&gt; seja o comando &lt;code&gt;echo Lorem ipsum dolor sit amet&lt;/code&gt;. Para substituir o &lt;code&gt;Lorem&lt;/code&gt; por &lt;code&gt;lorem&lt;/code&gt; utiliza-se &lt;code&gt;!!:s/Lorem/lorem/&lt;/code&gt;. Também podemos utilizar &lt;code&gt;^Lorem^lorem^&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Referência a um comando &lt;code&gt;n&lt;/code&gt; no histórico = &lt;code&gt;!n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência a um comando anterior = &lt;code&gt;!-n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência ao comando anterior = &lt;code&gt;!-1&lt;/code&gt; = &lt;code&gt;!!&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência ao último comando &lt;code&gt;cat&lt;/code&gt; = &lt;code&gt;!cat&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência ao último comando com &lt;code&gt;arquivo.txt&lt;/code&gt; = &lt;code&gt;!?arquivo.txt?&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência ao comando sendo digitado = &lt;code&gt;!#&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência a um argumento &lt;code&gt;n&lt;/code&gt; = &lt;code&gt;:n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência a todos os argumentos = &lt;code&gt;:*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência aos argumentos &lt;code&gt;m&lt;/code&gt; até &lt;code&gt;n&lt;/code&gt; = &lt;code&gt;:m-n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Referência aos argumentos &lt;code&gt;n&lt;/code&gt; até o último = &lt;code&gt;:n*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Realizar uma substituição = &lt;code&gt;:s/velho/novo/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Realizar todas substituições = &lt;code&gt;:gs/velho/novo/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Realizar uma substituição no último comando = &lt;code&gt;^velho^novo^&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Executando vários comandos
&lt;/h3&gt;

&lt;p&gt;O comando &lt;code&gt;fc&lt;/code&gt; permite abrir comandos do histórico em um editor de textos para que eles possam ser executados. Para editar o último comando &lt;code&gt;make&lt;/code&gt;, utiliza-se &lt;code&gt;fc -s make&lt;/code&gt;. Para editar os 3 últimos comandos, utiliza-se &lt;code&gt;fc -3 -1&lt;/code&gt;. Para executar do comando 16 ao 20 no histórico, utiliza-se &lt;code&gt;fc 16 20&lt;/code&gt;. &lt;code&gt;fc -l&lt;/code&gt; também pode ser utilizado para mostrar os últimos comandos.&lt;/p&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Editar e executar o último comando make = &lt;code&gt;fc -s make&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Editar e executar os últimos 5 comandos = &lt;code&gt;fc -5 -1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Editar e executar os comandos de 7 a 15 = &lt;code&gt;fc 7 15&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Listar os últimos comandos = &lt;code&gt;fc -l&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Atalhos
&lt;/h2&gt;

&lt;p&gt;Ao digitar texto no prompt do bash é possível realizar alguns comandos de edição por meio da biblioteca &lt;a href="https://tiswww.cwru.edu/php/chet/readline/rltop.html"&gt;GNU readline&lt;/a&gt;. Os atalhos podem ser configurados por meio de um arquivo. Mais detalhes sobre a configuração e atalhos padrão podem ser encontrados na &lt;a href="https://www.man7.org/linux/man-pages/man3/readline.3.html"&gt;página do man&lt;/a&gt;, na &lt;a href="https://en.wikipedia.org/wiki/GNU_Readline"&gt;página da wikipédia&lt;/a&gt;, ou no &lt;a href="https://tiswww.cwru.edu/php/chet/readline/rluserman.html"&gt;manual do usuário&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Movimento
&lt;/h3&gt;

&lt;p&gt;As teclas ⬅️, ➡️, &lt;code&gt;Home&lt;/code&gt; e &lt;code&gt;End&lt;/code&gt; já são conhecidas. Além delas você pode utilizar &lt;code&gt;Ctrl + seta&lt;/code&gt; ou &lt;code&gt;Alt + seta&lt;/code&gt; para mover o cursor por palavra.&lt;/p&gt;

&lt;p&gt;Além destas opções, a biblioteca permite utilizar &lt;code&gt;Ctrl + b&lt;/code&gt; e &lt;code&gt;Alt + b&lt;/code&gt; para mover o cursor para a esquerda um caractere e uma palavra, respectivamente, &lt;code&gt;Ctrl + f&lt;/code&gt; e &lt;code&gt;Alt + f&lt;/code&gt; para mover para a direita, &lt;code&gt;Ctrl + a&lt;/code&gt; para mover para o início da linha e &lt;code&gt;Ctrl + e&lt;/code&gt; para mover para o final. &lt;code&gt;Ctrl + l&lt;/code&gt; é utilizado para limpar a tela e &lt;code&gt;Ctrl + Alt + l&lt;/code&gt; para limpar a tela e o scroll.&lt;/p&gt;

&lt;p&gt;Poderíamos resumir desta forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⬅️ = &lt;code&gt;Ctrl + b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;➡️ = &lt;code&gt;Ctrl + f&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + &amp;lt;-&lt;/code&gt; ou &lt;code&gt;Alt + &amp;lt;-&lt;/code&gt; = &lt;code&gt;Alt + b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl + -&amp;gt;&lt;/code&gt; ou &lt;code&gt;Alt + -&amp;gt;&lt;/code&gt; = &lt;code&gt;Alt + f&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Home&lt;/code&gt; = &lt;code&gt;Ctrl + a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;End&lt;/code&gt; = &lt;code&gt;Ctrl + e&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em teclados menores que exigem o uso da tecla &lt;code&gt;Fn&lt;/code&gt; para acessar as teclas de seta, &lt;code&gt;Home&lt;/code&gt; e &lt;code&gt;End&lt;/code&gt; pode ser mais confortável utilizar os atalhos do readline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Histórico de comandos
&lt;/h3&gt;

&lt;p&gt;Utiliza-se comumente as teclas ⬆️ e ⬇️ para percorrer a lista de comandos no histórico e a tecla &lt;code&gt;Enter&lt;/code&gt; para executá-los. Pode-se utilizar &lt;code&gt;Ctrl + p&lt;/code&gt;, &lt;code&gt;Ctrl + n&lt;/code&gt; e &lt;code&gt;Ctrl + j&lt;/code&gt; para os mesmos fins. Para ir até o comando mais antigo do histórico utiliza-se &lt;code&gt;Alt + &amp;lt;&lt;/code&gt; e &lt;code&gt;Alt + &amp;gt;&lt;/code&gt; para o mais novo.&lt;/p&gt;

&lt;p&gt;Se você frequentemente fica utilizando a seta ⬆️ para encontrar o comando, existem atalhos para realizar buscas no histórico. &lt;code&gt;Ctrl + r&lt;/code&gt; é utilizado para buscar comandos mais antigos que o atual e &lt;code&gt;Ctrl + s&lt;/code&gt; é utilizado para buscar comandos mais novos. Ao utilizar um destes atalhos o prompt vai mudar e você pode ir digitando o que deve ser buscado.&lt;/p&gt;

&lt;p&gt;Para reutilizar o primeiro argumento do comando anterior utiliza-se &lt;code&gt;Ctrl + Alt + y&lt;/code&gt;. Pode-se selecionar outro argumento teclando a tecla &lt;code&gt;Esc + número&lt;/code&gt; e &lt;code&gt;Ctrl + Alt + y&lt;/code&gt;. Para o último argumento utiliza-se &lt;code&gt;Alt + .&lt;/code&gt; ou &lt;code&gt;Alt + _&lt;/code&gt;. Por exemplo, assuma que o comando anterior seja &lt;code&gt;echo Lorem ipsum dolor sit amet&lt;/code&gt;. Ao utilizar &lt;code&gt;Ctrl + Alt + y&lt;/code&gt; a palavra &lt;code&gt;Lorem&lt;/code&gt; seria inserida, &lt;code&gt;Esc + 3&lt;/code&gt; a palavra &lt;code&gt;dolor&lt;/code&gt; e &lt;code&gt;Alt + .&lt;/code&gt; a palavra &lt;code&gt;amet&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ao executar vários comandos sucessivos repetidas vezes, no lugar de executar o primeiro com &lt;code&gt;Enter&lt;/code&gt; ou &lt;code&gt;Ctrl + j&lt;/code&gt;, você pode utilizar &lt;code&gt;Ctrl + o&lt;/code&gt; e já será inserido o próximo comando do histórico.&lt;/p&gt;

&lt;p&gt;Resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⬆️ = &lt;code&gt;Ctrl + p&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;⬇️ = &lt;code&gt;Ctrl + n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Enter&lt;/code&gt; = &lt;code&gt;Ctrl + j&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;início do histórico = &lt;code&gt;Alt + &amp;lt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;fim do histórico = &lt;code&gt;Alt + &amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;busca "acima" = &lt;code&gt;Ctrl + r&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;busca "abaixo" = &lt;code&gt;Ctrl + s&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Inserir o primeiro argumento do comando anterior = &lt;code&gt;Ctrl + Alt + y&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Inserir o n-ésimo argumento = &lt;code&gt;Esc + n&lt;/code&gt; e após &lt;code&gt;Ctrl + Alt + y&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Inserir o último argumento = &lt;code&gt;Alt + .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Executar um comando do histórico e inserir o próximo = &lt;code&gt;Ctrl + o&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Edição da linha
&lt;/h3&gt;

&lt;p&gt;As teclas &lt;code&gt;&amp;lt;- Backspace&lt;/code&gt; e &lt;code&gt;Delete&lt;/code&gt; já são conhecidas. No lugar da tecla &lt;code&gt;&amp;lt;- Backspace&lt;/code&gt; pode-se utilizar &lt;code&gt;Ctrl + ?&lt;/code&gt;. No lugar da tecla &lt;code&gt;Delete&lt;/code&gt; pode-se utilizar &lt;code&gt;Ctrl + d&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para trocar duas palavras de lugar, utiliza-se &lt;code&gt;Alt + t&lt;/code&gt;. Utiliza-se &lt;code&gt;Alt + u&lt;/code&gt; e &lt;code&gt;Alt + l&lt;/code&gt; para transformar a palavra em maiúsculas e minúsculas, respectivamente. &lt;code&gt;Alt + c&lt;/code&gt; transforma a letra sob o cursor para maiúscula e todas as outras da palavra em minúscula.&lt;/p&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;- Backspace&lt;/code&gt; = &lt;code&gt;Ctrl + ?&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Delete&lt;/code&gt; = &lt;code&gt;Ctrl + d&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Transformar palavra em maiúsculas = &lt;code&gt;Alt + u&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Transformar palavra em minúsculas = &lt;code&gt;Alt + l&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Capitalizar letra na palavra = &lt;code&gt;Alt + c&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Recortar e Colar
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Ctrl + w&lt;/code&gt; e &lt;code&gt;Alt + d&lt;/code&gt; são utilizados para recortar do cursor para o início e fim da palavra, respectivamente. &lt;code&gt;Ctrl + y&lt;/code&gt; é utilizado para colar texto recortado. &lt;code&gt;Ctrl + u&lt;/code&gt; e &lt;code&gt;Ctrl + k&lt;/code&gt; são utilizados para recortar do cursor para o início e fim da linha, respectivamente.&lt;/p&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recortar do cursor pro início da linha = &lt;code&gt;Ctrl + u&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Recortar do cursor pro início da palavra = &lt;code&gt;Ctrl + w&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Recortar do cursor pro fim da palavra = &lt;code&gt;Alt + d&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Recortar do cursor pro fim da linha = &lt;code&gt;Ctrl + k&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Colar texto recortado = &lt;code&gt;Ctrl + y&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Utiliza-se &lt;code&gt;Tab&lt;/code&gt; para completar a palavra até o cursor. Para exibir todas as possíveis compleções utiliza-se &lt;code&gt;Alt + ?&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completar = &lt;code&gt;Tab&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mostrar todas possibilidades para completar = &lt;code&gt;Alt + ?&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Outros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Abortar um comando sem executar = &lt;code&gt;Ctrl + g&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Desfazer edição = &lt;code&gt;Ctrl + _&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Busca por caractere até final da linha = &lt;code&gt;Ctrl + ]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Busca por caractere até início da linha = &lt;code&gt;Ctrl + Alt + ]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>linux</category>
      <category>shell</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
