<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dourado.net &#8211; o blog do Diogo Dourado (XiS)</title>
	<atom:link href="https://dourado.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://dourado.net</link>
	<description>desenvolvimento web, comentários diversos e dicas nem sempre úteis</description>
	<lastBuildDate>Sun, 17 May 2026 16:25:40 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>O bug do expo-updates que não era do expo-updates: como o `.env` local quebrou minha OTA em produção</title>
		<link>https://dourado.net/2026/05/17/o-bug-do-expo-updates-que-nao-era-do-expo-updates-como-o-env-local-quebrou-minha-ota-em-producao/</link>
					<comments>https://dourado.net/2026/05/17/o-bug-do-expo-updates-que-nao-era-do-expo-updates-como-o-env-local-quebrou-minha-ota-em-producao/#respond</comments>
		
		<dc:creator><![CDATA[Diogo Dourado]]></dc:creator>
		<pubDate>Sun, 17 May 2026 16:21:09 +0000</pubDate>
				<category><![CDATA[expo]]></category>
		<category><![CDATA[react]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[eas-update]]></category>
		<category><![CDATA[expo-updates]]></category>
		<category><![CDATA[ota-update]]></category>
		<category><![CDATA[react-native]]></category>
		<guid isPermaLink="false">https://dourado.net/?p=491</guid>

					<description><![CDATA[Spoiler: passei horas suspeitando do framework. O problema era uma única linha no meu .env. Se você usa Expo + EAS Update e bateu de cara com um destes sintomas, talvez esse post te poupe meio dia de cabeça: Você publica uma OTA com eas update --branch production O app baixa o update (isUpdatePending: true,<a class="more-link" href="https://dourado.net/2026/05/17/o-bug-do-expo-updates-que-nao-era-do-expo-updates-como-o-env-local-quebrou-minha-ota-em-producao/"><span class="more-text">Read More</span></a>]]></description>
										<content:encoded><![CDATA[<blockquote>
<p><strong>Spoiler:</strong> passei horas suspeitando do framework. O problema era uma única linha no meu <code>.env</code>.</p>
</blockquote>
<p>Se você usa Expo + EAS Update e bateu de cara com um destes sintomas, talvez esse post te poupe meio dia de cabeça:</p>
<ul>
<li>Você publica uma OTA com <code>eas update --branch production</code></li>
<li>O app baixa o update (<code>isUpdatePending: true</code>, banner aparece)</li>
<li>O usuário toca pra reiniciar</li>
<li>O app fecha, reabre&#8230; e continua na versão antiga</li>
<li><code>updateId</code> continua sendo o do bundle embedded</li>
<li><code>isUpdatePending</code> virou <code>false</code></li>
<li><code>isEmergencyLaunch</code> está <code>false</code> (sem rastro de rollback)</li>
<li><code>nativeLogs</code> vazio</li>
<li>Nada nos logs do Sentry</li>
</ul>
<p>Parece bug do <code>expo-updates</code>, né? Foi exatamente o que eu pensei.</p>
<h2>O caminho errado que eu tomei</h2>
<p>Encontrei a issue <a href="https://github.com/expo/expo/issues/42922" target="_blank" rel="noopener">#42922</a> no repositório do Expo: &#8220;Expo Updates Issue&#8221;. Título genérico, sintomas vagamente parecidos com os meus, e — bingo — eu estava na mesma versão (SDK 54, <code>expo-updates 0.29.16</code>, new architecture, React Native 0.81.5).</p>
<p>Achei que tinha encontrado meu bug. Implementei o workaround mais comentado pela comunidade: o &#8220;double-reload&#8221; — detectar <code>isUpdatePending &amp;&amp; isEmbeddedLaunch</code> no startup e chamar <code>reloadAsync()</code> automaticamente após 2 segundos. Counter no AsyncStorage limitando a 2 tentativas pra evitar loop infinito.</p>
<p>Buildei. Submeti pro Play Store. Testei.</p>
<p><strong>Não funcionou.</strong></p>
<p>Reli a issue #42922 com mais calma. <strong>Estava CLOSED.</strong> A solução do único comentário relevante era: &#8220;rodar <code>eas update:configure</code> pra adicionar <code>channel</code> no eas.json&#8221;. Não era nem o mesmo problema — era config de canal. Eu já tinha <code>channel: "production"</code> configurado.</p>
<p>Comecei a pesquisar SDK 55 upgrade. React Native 0.83. React 19.2. Era uma upgrade grande, com risco real de quebrar <code>react-native-reanimated</code>, <code>expo-router</code>, Sentry. Estimativa: 4-8 horas. Estava prestes a comprometer com isso quando resolvi investigar mais 30 minutos antes.</p>
<h2>A descoberta</h2>
<p>Comparei os bundles. O JS embarcado no APK (via <code>eas build</code>) usava as URLs corretas de produção. O JS publicado via OTA (via <code>eas update</code>)&#8230; eu não tinha como inspecionar diretamente, mas comecei a suspeitar.</p>
<p>Olhei o <code>.env</code> local:</p>
<pre><code>EXPO_PUBLIC_API_URL=https://api.exemplo.com
EXPO_PUBLIC_CHAT_URL=http://localhost:3500
EXPO_PUBLIC_SENTRY_DSN=https://...</code></pre>
<p>Olhei o <code>eas.json</code>:</p>
<pre><code>{
  "build": {
    "production": {
      "env": {
        "EXPO_PUBLIC_API_URL": "https://api.exemplo.com",
        "EXPO_PUBLIC_CHAT_URL": "https://chat.exemplo.com",
        "EXPO_PUBLIC_SENTRY_DSN": "https://..."
      }
    }
  }
}</code></pre>
<p><strong>Os arquivos têm <code>EXPO_PUBLIC_CHAT_URL</code> diferentes.</strong> O <code>.env</code> aponta pra <code>localhost:3500</code> (porque uso o chat-server localmente em desenvolvimento). O <code>eas.json</code> aponta pro endereço de produção.</p>
<p>Foi aí que caiu a ficha:</p>
<ul>
<li><code>eas build --profile production</code> lê env vars de <code>eas.json</code> ? URL de produção entra no bundle nativo</li>
<li><code>eas update --branch production</code> (sem <code>--environment</code>) lê env vars do <code>.env</code> local ? <strong>URL de localhost entra no bundle JS publicado pra produção</strong></li>
</ul>
<h2>O que acontecia exatamente</h2>
<ol>
<li>Usuário com a versão atual instalada (build nativo, URL correta) abria o app normalmente</li>
<li>Auto-check do expo-updates baixava a OTA em background</li>
<li>Banner &#8220;Atualização disponível&#8221; aparecia</li>
<li>Usuário tocava ? <code>reloadAsync()</code> ? bundle OTA carregava</li>
<li>No bootstrap, meu hook chamava a função de conexão do chat que tentava abrir um Socket.IO em <code>http://localhost:3500</code></li>
<li>Conexão falhava de forma fatal no JS runtime</li>
<li><code>expo-updates</code> detectava a falha e fazia rollback <strong>silencioso</strong> pro embedded</li>
<li>App reabria com a versão antiga</li>
<li>Cache da OTA limpo (<code>isUpdatePending: false</code>)</li>
<li><code>isEmergencyLaunch</code> ficava <code>false</code> porque o rollback foi tão limpo que não escalou como emergency</li>
</ol>
<p>O usuário via o app &#8220;não atualizando&#8221;, mas funcionando. Eu via dados que apontavam pra bug de framework. Na verdade era o meu próprio código JS crashando porque tentava bater em <code>localhost</code> no celular de quem instalou o app.</p>
<h2>A solução</h2>
<p>Duas coisas, juntas:</p>
<p><strong>1. Migrar as env vars <code>EXPO_PUBLIC_*</code> pro sistema do EAS:</strong></p>
<pre><code>eas env:create production --name EXPO_PUBLIC_API_URL --value "https://api.exemplo.com" --visibility plaintext --type string
eas env:create production --name EXPO_PUBLIC_CHAT_URL --value "https://chat.exemplo.com" --visibility plaintext --type string
eas env:create production --name EXPO_PUBLIC_SENTRY_DSN --value "https://..." --visibility plaintext --type string</code></pre>
<p><strong>2. Sempre passar <code>--environment production</code> no <code>eas update</code>:</strong></p>
<pre><code>eas update --branch production --environment production --platform android --message "..."
eas update --branch production --environment production --platform ios --message "..."</code></pre>
<p>Republiquei a OTA com o flag. Funcionou de primeira. Footer mudou de <code>ota.0</code> pra <code>ota.2</code>. Chat conectou normal. Sem crash. Sem rollback.</p>
<h2>Lições</h2>
<p><strong>1. <code>eas build</code> e <code>eas update</code> leem env vars de fontes diferentes por default.</strong></p>
<p><code>eas build</code> lê do <code>eas.json</code> (seção <code>build.production.env</code>). <code>eas update</code> lê do <code>.env</code> local. Se essas duas fontes divergem (e é provável que divirjam, porque <code>.env</code> geralmente tem valores de dev), seu OTA vai pra produção com config de dev.</p>
<p><strong>2. Falha silenciosa não significa falha do framework.</strong></p>
<p>Eu ficava olhando o <code>isEmergencyLaunch: false</code> e achando &#8220;tá tudo OK, mas o reload não aplica — só pode ser bug do reload&#8221;. O fato de o <code>expo-updates</code> não ter sinalizado emergency não significava que o bundle aplicou. Significava que o crash foi tratado tão rápido que não escalou como emergency.</p>
<p><strong>3. Antes de implementar workaround pra &#8220;bug de framework&#8221;, verifique se o sintoma é realmente do framework.</strong></p>
<p>Eu implementei um workaround inteiro (double-reload com counter no AsyncStorage). Buildei. Submeti. Testei. <strong>Nada disso teria funcionado</strong> porque o problema nem estava no <code>reloadAsync</code> — estava no bundle JS que ele aplicava. O workaround só atrasou o diagnóstico real.</p>
<p><strong>4. Issues fechadas com sintoma parecido nem sempre são o seu bug.</strong></p>
<p>A #42922 estava CLOSED. Eu li o título, vi as versões batendo, e assumi que era o mesmo problema. Não era. Sempre confira o status da issue e o conteúdo do fix.</p>
<p><strong>5. Documente as pegadinhas no próprio repo, perto do código.</strong></p>
<p>Tinha um aviso sobre essa exata pegadinha no meu <code>docs/VERSIONING.md</code> da release anterior. Eu mesmo escrevi. Não li antes de rodar OTA dessa vez. Reforcei o aviso depois do incidente.</p>
<h2>TL;DR</h2>
<p>Se sua OTA do Expo está &#8220;aplicando mas não aplicando&#8221; e os dados de diagnóstico parecem inocentes, <strong>antes de pesquisar bug do framework, verifique se seu OTA bundle não está empacotando URLs de <code>localhost</code> do <code>.env</code> local.</strong></p>
<p>O fix é uma flag: <code>--environment production</code>.</p>
<p>Espero que esse post poupe horas de alguém.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://dourado.net/2026/05/17/o-bug-do-expo-updates-que-nao-era-do-expo-updates-como-o-env-local-quebrou-minha-ota-em-producao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Integração com a API do Banco Santander &#8211; PHP</title>
		<link>https://dourado.net/2025/01/03/integracao-com-a-api-do-banco-santander-php/</link>
					<comments>https://dourado.net/2025/01/03/integracao-com-a-api-do-banco-santander-php/#comments</comments>
		
		<dc:creator><![CDATA[Diogo Dourado]]></dc:creator>
		<pubDate>Fri, 03 Jan 2025 21:21:51 +0000</pubDate>
				<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Banco Santander]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://dourado.net/?p=480</guid>

					<description><![CDATA[Desenvolvi uma solução em PHP para integrar com a API do Banco Santander, simplificando a automação de processos financeiros, como geração de boletos e PIX, e compartilhando conhecimento com a comunidade. ? Funcionalidades:Autenticação via Bearer Token.Geração, consulta e cancelamento de Workspaces/Webhooks.Geração, consulta e cancelamento de cobranças (Boleto/PIX). Acredito que a colaboração e o compartilhamento de<a class="more-link" href="https://dourado.net/2025/01/03/integracao-com-a-api-do-banco-santander-php/"><span class="more-text">Read More</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Desenvolvi uma solução em PHP para integrar com a API do Banco Santander, simplificando a automação de processos financeiros, como geração de boletos e PIX, e compartilhando conhecimento com a comunidade.<br><br>? Funcionalidades:<br>Autenticação via Bearer Token.<br>Geração, consulta e cancelamento de Workspaces/Webhooks.<br>Geração, consulta e cancelamento de cobranças (Boleto/PIX).<br><br>Acredito que a colaboração e o compartilhamento de conhecimento são essenciais para a inovação. Por isso, decidi compartilhar essa solução com a comunidade.<br>? <a href="https://github.com/diogodourado/banco-santander-api-php">https://github.com/diogodourado/banco-santander-api-php</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://dourado.net/2025/01/03/integracao-com-a-api-do-banco-santander-php/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Conversão de Certificados .pfx ou .p12 (PKCS#12), para .pem na Integração de APIs do Banco Santander com PHP</title>
		<link>https://dourado.net/2024/12/16/conversao-de-certificados-p12-para-pem-na-integracao-de-apis-do-banco-santander-com-php/</link>
					<comments>https://dourado.net/2024/12/16/conversao-de-certificados-p12-para-pem-na-integracao-de-apis-do-banco-santander-com-php/#respond</comments>
		
		<dc:creator><![CDATA[Diogo Dourado]]></dc:creator>
		<pubDate>Mon, 16 Dec 2024 14:53:43 +0000</pubDate>
				<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Banco Santander]]></category>
		<category><![CDATA[certificado]]></category>
		<category><![CDATA[converter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[segurança]]></category>
		<guid isPermaLink="false">https://dourado.net/?p=475</guid>

					<description><![CDATA[Quando integramos com APIs seguras, como as do Banco Santander, é comum que um certificado digital no formato .pfx ou .p12 (PKCS#12) seja fornecido para autenticação. No entanto, para utilizá-lo com ferramentas como cURL no PHP, é necessário convertê-lo para o formato .pem. Este artigo explica como realizar essa conversão e como configurá-lo no cURL.<a class="more-link" href="https://dourado.net/2024/12/16/conversao-de-certificados-p12-para-pem-na-integracao-de-apis-do-banco-santander-com-php/"><span class="more-text">Read More</span></a>]]></description>
										<content:encoded><![CDATA[
<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Quando integramos com APIs seguras, como as do Banco Santander, é comum que um certificado digital no formato .pfx ou .p12 (PKCS#12) seja fornecido para autenticação. No entanto, para utilizá-lo com ferramentas como cURL no PHP, é necessário convertê-lo para o formato <strong>.pem</strong>. Este artigo explica como realizar essa conversão e como configurá-lo no cURL.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Por que converter .pfx ou .p12 para .pem?</strong></h2>



<p class="wp-block-paragraph">O formato <code>.p12</code> (PKCS#12) (o arquivo .pfx é identifico) contém tanto o certificado público quanto a chave privada, mas o cURL no PHP trabalha melhor com arquivos separados no formato <code>.pem</code>. A conversão permite extrair:</p>



<ul class="wp-block-list">
<li>O certificado público.</li>



<li>A chave privada.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Como converter o .p12 para .pem?</strong></h2>



<p class="wp-block-paragraph">Use o <strong>OpenSSL</strong> (usei um servidor Linux) para realizar a conversão. Os comandos abaixo geram dois arquivos: um para o certificado público e outro para a chave privada.</p>



<h3 class="wp-block-heading">1. Exportar o certificado público:</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">openssl pkcs12 -in certificado.p12 -clcerts -nokeys -out certificado_publico.pem
</pre>



<h3 class="wp-block-heading">2. Exportar a chave privada:</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">openssl pkcs12 -in certificado.p12 -nocerts -nodes | openssl rsa -out chave_privada.pem
</pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Proteja seus arquivos</strong></h2>



<p class="wp-block-paragraph">Os arquivos <code>.pem</code> contêm informações sensíveis, especialmente a chave privada. Certifique-se de:</p>



<ul class="wp-block-list">
<li>Definir permissões restritas (ex.: <code>chmod 600</code>).</li>



<li>Armazená-los fora do diretório acessível pelo servidor web.</li>
</ul>



<h2 class="wp-block-heading"><strong>Outras observações</strong></h2>



<p class="wp-block-paragraph">Utilizei para o Banco Santander, mas o procedimento para conversão de qualquer certificado.</p>



<p class="wp-block-paragraph">Tentei no Windows, e por algum motivo não obtive o mesmo resultado, pode ser ate a versao do OpenSSL, então, subi para um servidor Linux e executei a conversão por la.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Agora você está pronto para integrar sua aplicação com as APIs do Banco Santander de maneira segura e eficiente. </p>



<p class="wp-block-paragraph"><em>Gerado com a ajuda do ChatGPT, incorporando instruções e ajustes específicos para facilitar a compreensão. </em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://dourado.net/2024/12/16/conversao-de-certificados-p12-para-pem-na-integracao-de-apis-do-banco-santander-com-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Erro ao criar usuário MySQL no CPanel</title>
		<link>https://dourado.net/2023/11/27/erro-ao-criar-usuario-mysql-no-cpanel/</link>
					<comments>https://dourado.net/2023/11/27/erro-ao-criar-usuario-mysql-no-cpanel/#respond</comments>
		
		<dc:creator><![CDATA[Diogo Dourado]]></dc:creator>
		<pubDate>Mon, 27 Nov 2023 15:00:07 +0000</pubDate>
				<category><![CDATA[cpanel]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[Mysql]]></category>
		<guid isPermaLink="false">https://dourado.net/?p=466</guid>

					<description><![CDATA[Sintomas Ao tentar criar um novo usuário de banco de dados MySQL no cPanel, a interface pode exibir: &#8220;A solicitação falhou. (ID do erro: f7kx27) Peça ao seu provedor de hospedagem para investigar este erro no log principal de erros do cPanel &#38; WHM.&#8221; Ao verificar o cPanel error_log, uma mensagem semelhante à seguinte é<a class="more-link" href="https://dourado.net/2023/11/27/erro-ao-criar-usuario-mysql-no-cpanel/"><span class="more-text">Read More</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Sintomas</strong></p>



<p class="wp-block-paragraph">Ao tentar criar um novo usuário de banco de dados MySQL no cPanel, a interface pode exibir:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;A solicitação falhou. (ID do erro: f7kx27) Peça ao seu provedor de hospedagem para investigar este erro no log principal de erros do cPanel &amp; WHM.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph">Ao verificar o cPanel error_log, uma mensagem semelhante à seguinte é encontrada:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;info [cpwrapd] ERRO na consulta MySQL: (XID vwqrz2) O sistema recebeu um erro do banco de dados &#8216;MySQL&#8217;: 1819 (Sua senha não atende aos requisitos atuais da política)&#8221;</p>
</blockquote>



<p class="wp-block-paragraph">ou em ingles:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Cpanel::Exception/(XID x6ry3c) Error from MySQL query :(XID qkvftx) The system received an error from the â&lt;80&gt;&lt;9c&gt;MySQLâ&lt;80&gt;&lt;9d&gt; database â&lt;80&gt;&lt;9c&gt;mysqlâ&lt;80&gt;&lt;9d&gt;: 1819 (Your password does not satisfy the current policy requirements):<br>at /usr/local/cpanel/Cpanel/Admin/Base/DB.pm line 103.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>Descrição</strong></p>



<p class="wp-block-paragraph">Esse problema pode ser causado pelo plugin &#8220;validate_password&#8221; do MySQL que está habilitado. Isso pode ser verificado da seguinte forma:</p>



<p class="wp-block-paragraph">Para o MySQL 5.7 ou inferior:</p>



<pre class="wp-block-code"><code>mysql -sse "SELECT name FROM mysql.plugin"
validate_password</code></pre>



<p class="wp-block-paragraph">Para o MySQL 8.0 ou superior:</p>



<pre class="wp-block-code"><code>mysql -sse "SELECT * FROM mysql.component"</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://dourado.net/2023/11/27/erro-ao-criar-usuario-mysql-no-cpanel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
