<?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: Mayron Ceccon</title>
    <description>The latest articles on Forem by Mayron Ceccon (@mayronceccon).</description>
    <link>https://forem.com/mayronceccon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F24834%2Fb21f8fc5-200f-44bd-8750-71a812ffd72d.jpg</url>
      <title>Forem: Mayron Ceccon</title>
      <link>https://forem.com/mayronceccon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mayronceccon"/>
    <language>en</language>
    <item>
      <title>Instalar extensões do vscode no vscodium</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Mon, 15 Mar 2021 23:51:08 +0000</pubDate>
      <link>https://forem.com/mayronceccon/instalar-extensoes-do-vscode-no-vscodium-57m3</link>
      <guid>https://forem.com/mayronceccon/instalar-extensoes-do-vscode-no-vscodium-57m3</guid>
      <description>&lt;p&gt;Existem diversas extensões disponíveis para o &lt;code&gt;vscode&lt;/code&gt;, mas nem todas são listadas no &lt;code&gt;vscodium&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para instalar estas extensões, primeiramente devemos acessar o site de &lt;a href="https://marketplace.visualstudio.com/vscode" rel="noopener noreferrer"&gt;extensões do vscode&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1ss0ikqvsrqjl86jimo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1ss0ikqvsrqjl86jimo.png" alt="Selection_312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No campo de pesquisa buscamos pela extensão desejada e acessamos a página específica da extensão.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnaeezp6a1swyg0cj7s6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnaeezp6a1swyg0cj7s6.png" alt="Selection_313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na página da extensão, procure por &lt;em&gt;Resources&lt;/em&gt; (fica no lado direto da página) e faça o download clicando em &lt;em&gt;Download Extension&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1mp4eedsuushlclcjbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1mp4eedsuushlclcjbi.png" alt="Selection_314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após o termino do download, navegue até a pasta onde um arquivo &lt;code&gt;vsix&lt;/code&gt; foi salvo.&lt;/p&gt;

&lt;p&gt;Execute o comando abaixo trocando o &lt;code&gt;extension-name.vsix&lt;/code&gt; pelo arquivo baixado, assim a extensão será instalada no seu &lt;code&gt;vscodium&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;codium --install-extension extension-name.vsix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após reiniciar seu &lt;code&gt;vscodium&lt;/code&gt; a extensão estará disponível para utilização.&lt;/p&gt;

</description>
      <category>vscodium</category>
      <category>vscode</category>
      <category>ptbr</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Deadlock e Livelock</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Wed, 22 Jul 2020 11:40:34 +0000</pubDate>
      <link>https://forem.com/mayronceccon/deadlock-e-livelock-4pja</link>
      <guid>https://forem.com/mayronceccon/deadlock-e-livelock-4pja</guid>
      <description>&lt;h2&gt;
  
  
  Deadlock
&lt;/h2&gt;

&lt;p&gt;É quando um (se esse processo utiliza threads) ou mais processos esperam a liberação de um recurso para prosseguir, mas esse recurso nunca é liberado, pois o processo/thread A depende de um recurso que deve ser liberado pelo processo/thread B, e o processo/thread B depende de um recurso que deve ser liberado pelo processo/thread A.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--17TWRz92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ipuatrdwlhnbx5sxnhbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--17TWRz92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ipuatrdwlhnbx5sxnhbu.png" alt="Deadlock"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8co0RiWn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t42biufqfwfnnru6rve2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8co0RiWn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t42biufqfwfnnru6rve2.jpg" alt="Real Deadlock"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Livelock
&lt;/h2&gt;

&lt;p&gt;Quando o estado de dois processos mudam constantemente, mas ao mudar os estados ambos os processos continuam se bloqueando.&lt;/p&gt;

&lt;p&gt;Um exemplo real de livelock ocorre quando duas pessoas se encontram em um corredor estreito, e cada uma tenta ser educada movendo-se para o lado para deixar o outro passar, mas elas acabam balançando de um lado para o outro sem progredir, porque ambas se movem repetidamente da mesma maneira ao mesmo tempo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Deadlock"&gt;https://en.wikipedia.org/wiki/Deadlock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.stackoverflow.com/questions/421381/o-que-%C3%A9-livelock"&gt;https://pt.stackoverflow.com/questions/421381/o-que-%C3%A9-livelock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ptbr</category>
    </item>
    <item>
      <title>Input e Output (I/O)</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Tue, 21 Jul 2020 00:32:57 +0000</pubDate>
      <link>https://forem.com/mayronceccon/input-e-output-i-o-15cc</link>
      <guid>https://forem.com/mayronceccon/input-e-output-i-o-15cc</guid>
      <description>&lt;p&gt;&lt;strong&gt;Input&lt;/strong&gt; é a entrada de dados em uma unidade de processamento. Estas entradas podem ser feitas por meio físico (hardware) ou lógico (software), esses dispositivos de entrada podem ser, teclados, mouses, webcam, microfones, softwares, entre outros.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt; é a saída dos dados que foram inseridos, após serem processados. Temos diversos tipos de dispositivos de saída, monitor, impressora, caixas de som, arquivos gerados por um sistema, etc. &lt;/p&gt;

&lt;p&gt;Esses dados são trocados entre dispositivo de entrada, local de processamento e o dispositivo de saída em formato binário (0 e 1).&lt;/p&gt;

&lt;p&gt;O fluxo de &lt;strong&gt;input&lt;/strong&gt; e &lt;strong&gt;output&lt;/strong&gt; de maneira simplória é o seguinte:&lt;/p&gt;

&lt;p&gt;Ao digitar uma letra no teclado (exemplo a letra &lt;em&gt;a&lt;/em&gt;), esta letra será convertida para o formato binário (&lt;em&gt;01100001&lt;/em&gt;), o dispositivo de processamento irá receber esta informação e armazenará em sua memória, quando o CPU estiver livre este código binário será direcionado para o seu processamento (por exemplo converter para maiúscula), com o processamento realizado, este dado binário (&lt;em&gt;01000001&lt;/em&gt;) será enviado novamente para a memória, que fará o direcionamento para o dispositivo de saída apropriado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ndAcqpBH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6irsvvt4fpnsd13v56fd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ndAcqpBH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6irsvvt4fpnsd13v56fd.png" alt="I/O"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alguns links interessantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=MMzdKTtUIFM"&gt;https://www.youtube.com/watch?v=MMzdKTtUIFM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=PYdHib45nu8&amp;amp;t=104s"&gt;https://www.youtube.com/watch?v=PYdHib45nu8&amp;amp;t=104s&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Entrada/sa%C3%ADda#:%7E:text=Entrada%2Fsa%C3%ADda%2C%20sigla%20E%2F,de%20dados)%20ou%20retorno%20de"&gt;https://pt.wikipedia.org/wiki/Entrada/sa%C3%ADda#:~:text=Entrada%2Fsa%C3%ADda%2C%20sigla%20E%2F,de%20dados)%20ou%20retorno%20de&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pt.wikipedia.org/wiki/Arquitetura_de_von_Neumann#:%7E:text=A%20Arquitetura%20de%20von%20Neumann,podendo%20assim%20manipular%20tais%20programas"&gt;https://pt.wikipedia.org/wiki/Arquitetura_de_von_Neumann#:~:text=A%20Arquitetura%20de%20von%20Neumann,podendo%20assim%20manipular%20tais%20programas&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Comparar similaridade de strings com PHP</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Mon, 01 Jun 2020 11:58:13 +0000</pubDate>
      <link>https://forem.com/mayronceccon/comparar-similaridade-de-strings-com-php-1ndc</link>
      <guid>https://forem.com/mayronceccon/comparar-similaridade-de-strings-com-php-1ndc</guid>
      <description>&lt;p&gt;Para você que necessita comparar duas strings e verificar o quão parecidas estas são, no PHP temos a função &lt;a href="https://www.php.net/manual/pt_BR/function.similar-text.php"&gt;similar_text&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Esta função compara duas strings e pode retornar a quantidade de caracteres similares ou a porcentagem de similaridade das strings.&lt;/p&gt;

&lt;p&gt;Abaixo segue um modelo de utilização!&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


</description>
      <category>php</category>
      <category>string</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Pub/Sub messaging</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Sat, 23 May 2020 21:39:46 +0000</pubDate>
      <link>https://forem.com/mayronceccon/pub-sub-messaging-1n35</link>
      <guid>https://forem.com/mayronceccon/pub-sub-messaging-1n35</guid>
      <description>&lt;p&gt;Publish/subscribe messaging ou &lt;strong&gt;pub/sub&lt;/strong&gt; messaging, é uma forma de comunicação assíncrona service-to-service, utilizada em arquiteturas serverless e de micro-serviços.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;pub/sub&lt;/strong&gt; permite uma comunicação segura e altamente disponível entre aplicativos criados de modo independente.&lt;/p&gt;

&lt;p&gt;Em um modelo &lt;strong&gt;pub/sub&lt;/strong&gt;, qualquer mensagem publicada para um tópico é imediatamente recebida por todos os subscribers deste tópico.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VZI4hubV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d1.awsstatic.com/product-marketing/Messaging/sns_img_topic.e024462ec88e79ed63d690a2eed6e050e33fb36f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VZI4hubV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://d1.awsstatic.com/product-marketing/Messaging/sns_img_topic.e024462ec88e79ed63d690a2eed6e050e33fb36f.png" alt="pub-sub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mensagem:&lt;/strong&gt; é a combinação de dados e atributos (opcionais) que um editor envia a um tópico e que é entregue aos assinantes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tópico:&lt;/strong&gt; É um recurso nomeado para onde são enviadas as mensagens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publish:&lt;/strong&gt; É quem &lt;em&gt;envia&lt;/em&gt; a mensagem para um tópico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subscribe:&lt;/strong&gt; É aquele que esta assinando determinada fila, e &lt;em&gt;recebe&lt;/em&gt; as mensagens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Na prática
&lt;/h2&gt;

&lt;p&gt;Como exemplo criei um projeto, onde, tenho seis subscribers, que estão desenvolvidos em diferentes linguagens, Python, Go, Node, PHP. O publisher foi feito com Python.&lt;/p&gt;

&lt;p&gt;Os subscribers estão "assinados" ao tópico &lt;em&gt;topic_create_file&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A responsabilidade de cada subscriber é converter uma mensagem em JSON, para um outro tipo de arquivo, csv, html, xml, xls.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mayronceccon"&gt;
        mayronceccon
      &lt;/a&gt; / &lt;a href="https://github.com/mayronceccon/pub-sub-example"&gt;
        pub-sub-example
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Pub/Sub&lt;/h1&gt;
&lt;h2&gt;
Ambiente utilizado&lt;/h2&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;

&lt;th&gt;&lt;strong&gt;Versão&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ubuntu&lt;/td&gt;
&lt;td&gt;18.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docker&lt;/td&gt;
&lt;td&gt;19.03.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docker-compose&lt;/td&gt;
&lt;td&gt;1.25.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;python&lt;/td&gt;
&lt;td&gt;3.8.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;php&lt;/td&gt;
&lt;td&gt;7.4.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;node&lt;/td&gt;
&lt;td&gt;12.16.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;6.14.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;go&lt;/td&gt;
&lt;td&gt;1.14.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
Redis&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up --build
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;
Instalação&lt;/h2&gt;
&lt;h3&gt;
Python&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;
Node&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;
Go&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;go get github.com/gomodule/redigo/redis
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;
PHP&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;composer install
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;
Execução dos Subscribes&lt;/h2&gt;
&lt;h3&gt;
Python&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;python subscribes/service_csv.py
python subscribes/service_excel.py
python subscribes/service_html.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;
Node&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;node subscribes/service_xml.js
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;
Go&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;go run subscribes/service_csv.go
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;
PHP&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;php subscribes/service_csv.php
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;
Execução do Publisher&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;python publisher.py
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mayronceccon/pub-sub-example"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/pubsub/docs/overview?hl=pt-br"&gt;https://cloud.google.com/pubsub/docs/overview?hl=pt-br&lt;/a&gt;&lt;br&gt;
&lt;a href="https://aws.amazon.com/pub-sub-messaging/"&gt;https://aws.amazon.com/pub-sub-messaging/&lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/-KH5w-cUdhw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>pattern</category>
      <category>pubsub</category>
    </item>
    <item>
      <title>Utilizar "environment variables" no React fazendo build com Travis</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Thu, 23 Jan 2020 12:26:27 +0000</pubDate>
      <link>https://forem.com/mayronceccon/utilizar-environment-variables-no-react-fazendo-build-com-travis-5do9</link>
      <guid>https://forem.com/mayronceccon/utilizar-environment-variables-no-react-fazendo-build-com-travis-5do9</guid>
      <description>&lt;p&gt;Quando estiver utilizando environment variables (.env) em seu projeto React e o build estiver sendo feito através do &lt;a href="https://travis-ci.org"&gt;Travis&lt;/a&gt;, o arquivo .env não funcionará diretamente no servidor.&lt;/p&gt;

&lt;p&gt;Para resolvermos esse problema devemos configurar em nosso Travis as "environment variables".&lt;/p&gt;

&lt;p&gt;Primeiro devemos adicionar os dados que vamos usar no arquivo &lt;strong&gt;.travis.yml&lt;/strong&gt;, como exemplo iremos adicionar REACT_APP_URL_API, onde, esta será a URL de consultas de nossa API.&lt;/p&gt;

&lt;p&gt;OBS: É obrigatório que a constante tenha o prefixo &lt;strong&gt;REACT_APP_&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;env&lt;/span&gt;:
    &lt;span class="nv"&gt;REACT_APP_URL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;url_api&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Agora precisamos referenciar a variável &lt;strong&gt;${url_api}&lt;/strong&gt; no Travis.&lt;/p&gt;

&lt;p&gt;Devemos entre no Travis, selecionar o repositório do projeto, encontrar o menu &lt;strong&gt;More options&lt;/strong&gt; e clicar em &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GEG_X7DN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n2hxdhjrqnbghs5pbpw9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GEG_X7DN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n2hxdhjrqnbghs5pbpw9.png" alt="Settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vá até a seção &lt;strong&gt;Environment Variables&lt;/strong&gt; e insira a mesma descrição que prencheu no parâmetro acima, no nosso caso "url_api".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6OXlhUKW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/97styf8mr8xkfm0vsxyc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6OXlhUKW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/97styf8mr8xkfm0vsxyc.png" alt="Environment Variables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso é somente fazer o build e direcionar para o servidor.&lt;/p&gt;

&lt;p&gt;Para utilizar em nosso projeto utilizamos &lt;strong&gt;process.env.REACT_APP_URL_API&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_URL_API&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>react</category>
      <category>travis</category>
      <category>build</category>
    </item>
    <item>
      <title>Postgresql com Backup Incremental — parte 4— Restore da base de dados</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Thu, 23 Jan 2020 12:15:42 +0000</pubDate>
      <link>https://forem.com/mayronceccon/postgresql-com-backup-incremental-parte-4-restore-da-base-de-dados-1g3</link>
      <guid>https://forem.com/mayronceccon/postgresql-com-backup-incremental-parte-4-restore-da-base-de-dados-1g3</guid>
      <description>&lt;p&gt;Para esta etapa, devemos ter o Postgresql instalado na máquina onde o restore será feito.&lt;/p&gt;

&lt;p&gt;Devemos copiar o arquivo &lt;strong&gt;base.tar.gz&lt;/strong&gt; criado a partir do comando pg_basebackup no servidor principal e os arquivos incrementais que estão sendo salvos na pasta &lt;strong&gt;/var/lib/postgresql/pg_log_archive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O aconselhável é sempre fazer a transferência destes arquivos para outro lugar, se ocorrer um problema físico na máquina principal, não será possível acessar estes arquivos e o backup não terá utilidade. Podemos utilizar scp, rsync, ou qualquer outro programa para a transferência.&lt;/p&gt;

&lt;p&gt;Devemos parar o serviço do Postgresql da máquina onde será feito o restore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;/etc/init.d/postgresql stop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Dentro da pasta &lt;strong&gt;/var/lib/pgsql&lt;/strong&gt; temos a pasta &lt;strong&gt;data&lt;/strong&gt;, esta pasta é onde encontramos os dados referentes ao Postgresql, como vamos fazer o restore do banco de outra máquina, devemos renomear a pasta data para tmp (ou qualquer outro nome)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; /var/lib/pgsql/data /var/lib/pgsql/tmp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Agora vamos descompactar o arquivo de backup feito no servidor principal. Se as versões do Linux forem as mesmas, a pasta será criada diretamente dentro de /var/lib/pgsql, se atentar onde a pasta data será criada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tar &lt;/span&gt;xvfP /var/lib/pgsql/base.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ao listar as pastas, você verá que foi criada novamente a pasta data, onde está é a cópia do servidor principal.&lt;/p&gt;

&lt;p&gt;Depois desta etapa devemos remover os logs antigos da pasta pg_xlog do arquivo descompactado, para evitar problemas com dados antigos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/pgsql/data/pg_xlog/&lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;No servidor master "Principal" temos os logs que ainda não foram salvos no arquivo incremental, estes logs estão dentro da pasta pg_xlog. Se não for possível recuperar estes logs, o restore de dados será feito somente a partir do último arquivo incremental.&lt;/p&gt;

&lt;p&gt;Se for possível acessar o servidor principal então devemos copiar os arquivos da pasta pg_xlog, para a pasta pg_xlog do servidor onde será feito o restore.&lt;/p&gt;

&lt;p&gt;Agora devemos criar um arquivo chamado recovery.conf dentro da pasta /var/lib/pgsql/data/, neste arquivo colocaremos a linha abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;restore_command &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'cp /var/lib/pgsql/pg_log_archive/%f %p'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Onde o caminho &lt;strong&gt;/var/lib/pgsql/pg_log_archive/&lt;/strong&gt; são os logs incrementais que buscamos do servidor principal.&lt;/p&gt;

&lt;p&gt;Devemos também dar permissão ao postgres executar o arquivo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chown &lt;/span&gt;postgres.postgres recovery.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Após estes passos devemos iniciar o Postgresql novamente, para a importação dos logs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;/etc/init.d/postgresql start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Com isso a rotina de backup e restore incremental esta concluída.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>backup</category>
      <category>database</category>
    </item>
    <item>
      <title>Postgresql com Backup Incremental — parte 3 — Fazendo a limpeza de logs (pg_archivecleanup)</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Thu, 23 Jan 2020 12:15:22 +0000</pubDate>
      <link>https://forem.com/mayronceccon/postgresql-com-backup-incremental-parte-3-fazendo-a-limpeza-de-logs-pgarchivecleanup-4k6a</link>
      <guid>https://forem.com/mayronceccon/postgresql-com-backup-incremental-parte-3-fazendo-a-limpeza-de-logs-pgarchivecleanup-4k6a</guid>
      <description>&lt;p&gt;Para a limpeza dos logs antigos usaremos o comando pg_archivecleanup.&lt;/p&gt;

&lt;p&gt;O pg_archivecleanup foi projetado para ser utilizado no archive_cleanup_command, após o recovery de um banco secundário. Mas como não estamos trabalhando com replicação, utilizamos de outra forma este comando, para facilitar criei um arquivo bash, onde verifico o último arquivo ".backup" da pasta de logs, e faço a exclusão a partir dele.&lt;/p&gt;

&lt;p&gt;Os arquivos .backup contém os dados referentes aos processos do pg_basebackup, informando quais são os logs anteriores a execução.&lt;/p&gt;

&lt;p&gt;O arquivo bash ficou com as seguintes linhas de comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DIR_LOGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'/var/lib/postgresql/pg_log_archive'&lt;/span&gt;
&lt;span class="nv"&gt;LAST_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DIR_LOGS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-rt&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.backup | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
/usr/lib/postgresql/9.3/bin/pg_archivecleanup &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DIR_LOGS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LAST_LOG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;onde,&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DIR_LOGS&lt;/strong&gt; é o local onde os logs (Wal) estão sendo gravados, e o &lt;strong&gt;LAST_LOG&lt;/strong&gt; é o último arquivo .backup salvo, após o processo de pg_basebackup.&lt;/p&gt;

&lt;p&gt;Ao executar o pg_archivecleanup, somente os logs (Wal), posteriores ao último basebackup continuam na pasta, com isso evitamos o acumulo de logs.&lt;/p&gt;

&lt;p&gt;Em um banco onde se tem muitas transações, sem o devido cuidado com a exclusão dos logs, podemos ficar sem espaço em disco em pouco tempo, por isso é de grande importância esta rotina.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>backup</category>
      <category>database</category>
    </item>
    <item>
      <title>Postgresql com Backup Incremental — parte 2 — Fazendo backup do sistema de arquivos (pg_basebackup)</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Thu, 23 Jan 2020 12:15:02 +0000</pubDate>
      <link>https://forem.com/mayronceccon/postgresql-com-backup-incremental-parte-2-fazendo-backup-do-sistema-de-arquivos-pgbasebackup-3lm5</link>
      <guid>https://forem.com/mayronceccon/postgresql-com-backup-incremental-parte-2-fazendo-backup-do-sistema-de-arquivos-pgbasebackup-3lm5</guid>
      <description>&lt;p&gt;Continuando os procedimentos para realizar o Backup Incremental no Postgresql, neste post faremos o backup dos dados do servidor principal, onde este backup será usado posteriormente para o restore.&lt;/p&gt;

&lt;p&gt;No servidor principal, vamos utilizar o comando &lt;a href="https://www.postgresql.org/docs/9.2/app-pgbasebackup.html"&gt;pg_basebackup&lt;/a&gt;, onde este comando faz o backup do cluster total do servidor principal, não sendo possível fazer o backup de somente um banco específico.&lt;/p&gt;

&lt;p&gt;Executamos o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;pg_basebackup &lt;span class="nt"&gt;-h127&lt;/span&gt;.0.0.1 &lt;span class="nt"&gt;-U&lt;/span&gt; user_replication &lt;span class="nt"&gt;-D&lt;/span&gt; backup &lt;span class="nt"&gt;-Ft&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;os parâmetros utilizados pode sem verificados no site do &lt;a href="https://www.postgresql.org/docs/9.2/app-pgbasebackup.html"&gt;Postgresql&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Após a execução e conclusão, você pode verificar que foi criada uma pasta chamada backup a partir do diretório onde você executou o comando e dentro desta o arquivo base.tar.gz.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>backup</category>
      <category>database</category>
    </item>
    <item>
      <title>Postgresql com Backup Incremental — parte 1 — Configurando o registro de Logs (Wal)</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Thu, 23 Jan 2020 12:14:40 +0000</pubDate>
      <link>https://forem.com/mayronceccon/postgresql-com-backup-incremental-parte-1-configurando-o-registro-de-logs-wal-4472</link>
      <guid>https://forem.com/mayronceccon/postgresql-com-backup-incremental-parte-1-configurando-o-registro-de-logs-wal-4472</guid>
      <description>&lt;p&gt;Para realizar o backup incremental do Postgresql, utilizaremos o "Continuous Archiving", está técnica permite utilizar o PITR &lt;a href="https://en.wikipedia.org/wiki/Point-in-time_recovery"&gt;(Point-in-Time Recovery)&lt;/a&gt;, onde assim é possível realizar a cópia do WAL &lt;a href="https://en.wikipedia.org/wiki/Write-ahead_logging"&gt;(Write Ahead Log)&lt;/a&gt; do PostgreSQL e utilizar estes logs para atualização de uma base de dados.&lt;/p&gt;

&lt;p&gt;Para este tutorial estou utilizando o SO Ubuntu 14.04.&lt;/p&gt;

&lt;p&gt;Primeiramente devemos alterar o arquivo &lt;strong&gt;postgresql.conf&lt;/strong&gt;, adicionando os comandos abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;wal_level &lt;span class="o"&gt;=&lt;/span&gt; hot_standby
archive_mode &lt;span class="o"&gt;=&lt;/span&gt; on
archive_command &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'test ! -f /var/lib/postgresql/pg_log_archive/%f &amp;amp;&amp;amp; cp %p /var/lib/postgresql/pg_log_archive/%f'&lt;/span&gt;
max_wal_senders &lt;span class="o"&gt;=&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Após as modificações acima, devemos criar a pasta onde os logs serão salvos e dar permissão ao postgres para acesso da pasta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; /var/lib/postgresql/pg_log_archive 
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; postgres.postgres /var/lib/postgresql/pg_log_archive
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 /var/lib/postgresql/pg_log_archive/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Agora criaremos um usuário com privilégio de replicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;su - postgres
psql &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"CREATE ROLE user_replication REPLICATION LOGIN PASSWORD '123';"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Após a criação do usuário "user_replication" devemos alterar o &lt;strong&gt;pg_hba.conf&lt;/strong&gt;, adicionando a regra abaixo, assim, habilitando e permitindo a conexão para a replicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;host replication user_replication 127.0.0.1/32 trust
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Após as configurações, devemos fazer o restart do Postgresql.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;/etc/init.d/postgresql restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Agora seu servidor já esta configurado com o Continuous Archiving.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>backup</category>
      <category>database</category>
    </item>
    <item>
      <title>Releases PHP (PHP museum)</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Sat, 18 Jan 2020 15:38:15 +0000</pubDate>
      <link>https://forem.com/mayronceccon/releases-php-php-museum-1bpe</link>
      <guid>https://forem.com/mayronceccon/releases-php-php-museum-1bpe</guid>
      <description>&lt;p&gt;Para os que gostam de relembrar o passado, o PHP tem um repositório com todas as versões lançadas. Do PHP 1 ao PHP...(último lançamento).&lt;/p&gt;

&lt;p&gt;O link é &lt;a href="https://museum.php.net/"&gt;PHP museum&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
    </item>
    <item>
      <title>Instalar extensões PHP através do PECL</title>
      <dc:creator>Mayron Ceccon</dc:creator>
      <pubDate>Fri, 17 Jan 2020 17:55:20 +0000</pubDate>
      <link>https://forem.com/mayronceccon/instalar-extensoes-php-atraves-do-pecl-47da</link>
      <guid>https://forem.com/mayronceccon/instalar-extensoes-php-atraves-do-pecl-47da</guid>
      <description>&lt;h1&gt;
  
  
  PECL
&lt;/h1&gt;

&lt;p&gt;Algumas vezes necessitamos instalar pacotes para que nosso PHP se comporte de uma forma esperada. Para certas situações podemos usar o PECL. &lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o PECL
&lt;/h2&gt;

&lt;p&gt;É um repositório de extensões PHP&lt;/p&gt;

&lt;h2&gt;
  
  
  Ambiente
&lt;/h2&gt;

&lt;p&gt;Os testes foram feitos no ambiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fedora 31 - 5.4.8-200.fc31.x86_64&lt;/li&gt;
&lt;li&gt;PHP 7.3.13 (cli) (built: Dec 17 2019 10:29:15) ( NTS )&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;O PECL necessita do PEAR instalado, assim, devemos prosseguir com,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dnf install php-pear php-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Extensões
&lt;/h2&gt;

&lt;p&gt;Vocẽ pode encontrar diversas &lt;a href="https://pecl.php.net/packages.php"&gt;extensões&lt;/a&gt; no próprio site do PECL &lt;a href="https://pecl.php.net/packages.php"&gt;https://pecl.php.net/packages.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outra opção é utilizar o terminal para a pesquisa de extensões. Suponhamos que necessitamos instalar a extensão "memcache". No seu terminal digite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pecl search memcache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;para a pesquisa realizada teremos o retorno,&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f4F5xwe0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/d35kki9weg7v381re2ph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f4F5xwe0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/d35kki9weg7v381re2ph.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Depois de encontrar a extensão, devemos fazer a instalação, para isso, utilizaremos o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pecl install memcache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;o próximo passo será habilitar a extensão em nosso PHP, o pecl já nos informa o parâmetro a ser adicionado no php.ini&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build process completed successfully

Installing '/usr/lib64/php/modules/memcache.so'
install ok: channel://pecl.php.net/memcache-4.0.5.2

configuration option "php_ini" is not set to php.ini location
You should add "extension=memcache.so" to php.ini
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuração
&lt;/h2&gt;

&lt;p&gt;Podemos inserir o parãmetro "extension=memcache.so" diretamente no php.ini, ou criar um novo arquivo, exemplo memcache.ini, na pasta de pacotes do php, no meu caso em /etc/php.d/&lt;/p&gt;

&lt;p&gt;Agora é somente reiniciar o serviço&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl restart php-fpm.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;e utilizar o recurso instalado.&lt;/p&gt;

</description>
      <category>php</category>
      <category>ptbr</category>
      <category>pecl</category>
    </item>
  </channel>
</rss>
