<?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>Velho Bit</title>
	<atom:link href="https://velhobit.com.br/feed" rel="self" type="application/rss+xml" />
	<link>https://velhobit.com.br</link>
	<description>Artigos, Notícias e Tutoriais sobre Web Design, Design Gráfico, Desenvolvimento e Programação Web... e um tico de games</description>
	<lastBuildDate>Thu, 19 Feb 2026 17:55:45 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://velhobit.com.br/wp-content/uploads/2024/10/cropped-minieu-32x32.png</url>
	<title>Velho Bit</title>
	<link>https://velhobit.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Como Resolver o Erro de Locale no Angular 20 com Native Federation</title>
		<link>https://velhobit.com.br/design-e-front-end/como-resolver-o-erro-de-locale-no-angular-20-com-native-federation.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Thu, 19 Feb 2026 17:52:03 +0000</pubDate>
				<category><![CDATA[Design e Front-End]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[programação]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=5461</guid>

					<description><![CDATA[Se você já tentou usar&#160;Angular 20&#160;com&#160;Native Module Federation&#160;e se deparou com erros do tipo: ou você sabe o quanto isso pode ser frustrante. Esse problema acontece devido a uma mudança significativa entre o Angular 19 e o 20 em como o&#160;Native Federation&#160;lida com locales e I18N. Por que isso acontece só no Angular 20 No&#160;Angular [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Se você já tentou usar&nbsp;<strong>Angular 20</strong>&nbsp;com&nbsp;<strong>Native Module Federation</strong>&nbsp;e se deparou com erros do tipo:</p>



<pre class="wp-block-code"><code><strong>Unable to resolve specifier '@angular/common/locales/pt'</strong></code></pre>



<p>ou</p>



<pre class="wp-block-code"><code><strong>NG0701: Missing locale data for the locale "pt-BR"</strong></code></pre>



<p>você sabe o quanto isso pode ser frustrante. Esse problema acontece devido a uma mudança significativa entre o Angular 19 e o 20 em como o&nbsp;<strong>Native Federation</strong>&nbsp;lida com locales e I18N.</p>



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



<h2 class="wp-block-heading">Por que isso acontece só no Angular 20</h2>



<p>No&nbsp;<strong>Angular 19</strong>, o Native Federation não tinha suporte nativo para I18N, então o carregamento de arquivos de locale precisava ser feito manualmente, usando helpers como&nbsp;<code>shareAngularLocales</code>&nbsp;com a flag&nbsp;<code>legacy: true</code>. Qualquer import de&nbsp;<code>@angular/common/locales/*</code>&nbsp;nos remotes geralmente passava despercebido, mesmo que estivesse bundlado de forma não ideal.</p>



<p>A partir do&nbsp;<strong>Angular 20.0.6</strong>, o Native Federation mudou o comportamento:</p>



<ul class="wp-block-list">
<li><strong>Suporte nativo a I18N:</strong>&nbsp;agora os remotes podem carregar arquivos de locale automaticamente.</li>



<li><strong><code>ignoreUnusedDeps</code>&nbsp;ativado:</strong>&nbsp;quando esta feature está ligada, o builder ignora dependências não usadas, o que evita que o esbuild tente transformar imports de locales (<code>@angular/common/locales/pt</code>) em módulos remotos via HTTP, eliminando o clássico erro&nbsp;<code>Unable to resolve specifier</code>.</li>



<li><strong>Por isso o problema só aparece agora:</strong>&nbsp;se você migrou de Angular 19 para 20 e ainda não ativou&nbsp;<code>ignoreUnusedDeps</code>, qualquer import de locale direto no remote explode, mesmo que você registre o locale no host.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Fonte oficial:&nbsp;<a href="https://github.com/angular-architects/module-federation-plugin/blob/main/libs/native-federation/README.md">Native Federation README &#8211; Angular I18N</a></p>
</blockquote>



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



<h2 class="wp-block-heading">A Solução Definitiva</h2>



<p>A solução é&nbsp;<strong>configurar o Native Federation corretamente</strong>&nbsp;e usar o helper&nbsp;<code>shareAngularLocales</code>&nbsp;para tornar os bundles compatíveis, sem precisar importar os arquivos de locale diretamente no remote.</p>



<h3 class="wp-block-heading"><code>federation.config.js</code>&nbsp;do Remote</h3>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >const { withNativeFederation, shareAll, shareAngularLocales } = require('@angular-architects/native-federation/config');

const shareConfig = {
  singleton: true,
  strictVersion: true,
  requiredVersion: 'auto',
  includeSecondaries: true
};

module.exports = withNativeFederation({
  name: 'core',
  
  // Ignora o próprio arquivo de configuração e checagem agressiva de dependências
  ignorePatterns: ['federation.config.js'],
  features: {
    ignoreUnusedDeps: true
  },

  shared: {
    ...shareAll(shareConfig),

    // Garante que os locales do Angular fiquem bundle-friendly
    ...shareAngularLocales(['pt'])
  }
});</textarea></pre>
</div>



<h3 class="wp-block-heading">Por que isso funciona</h3>



<ol class="wp-block-list">
<li><strong><code>ignorePatterns: ['federation.config.js']</code></strong>&nbsp;faz o builder ignorar o próprio arquivo de configuração, evitando que ele tente federar imports internos como os de locale.</li>



<li><strong><code>features: { ignoreUnusedDeps: true }</code></strong>&nbsp;evita que o esbuild transforme imports de locales em HTTP, eliminando o erro&nbsp;<code>Unable to resolve specifier</code>.</li>



<li><strong><code>shareAngularLocales(['pt'])</code></strong>&nbsp;prepara o bundle do remote para usar os arquivos de locale corretamente, sem precisar de imports diretos.</li>
</ol>



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



<h3 class="wp-block-heading">Registro do Locale no Host</h3>



<p>Mesmo com&nbsp;<code>shareAngularLocales</code>, os pipes do Angular (<code>DatePipe</code>,&nbsp;<code>CurrencyPipe</code>,&nbsp;<code>DecimalPipe</code>) precisam de&nbsp;<strong>registro no host</strong>:</p>



<pre class="wp-block-code"><code>import { registerLocaleData } from '@angular/common';
import localePt from '@angular/common/locales/pt';

registerLocaleData(localePt, 'pt-BR');
</code></pre>



<ul class="wp-block-list">
<li>Isso garante que o locale&nbsp;<code>pt-BR</code>&nbsp;esteja disponível para todos os remotes.</li>



<li>Nenhum remote deve importar ou registrar arquivos de locale diretamente.</li>
</ul>



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



<h2 class="wp-block-heading">Conclusão</h2>



<p>Com o Angular 20 e Native Federation, o gerenciamento de I18N mudou. O problema de&nbsp;<code>Unable to resolve specifier '@angular/common/locales/pt'</code>&nbsp;aparece apenas porque o esbuild tenta transformar imports de Node_modules em ESM remoto. A solução combina:</p>



<ul class="wp-block-list">
<li><strong>shareAngularLocales</strong>&nbsp;no remote</li>



<li><strong>ignoreUnusedDeps</strong>&nbsp;no remote</li>



<li><strong>registro do locale no host</strong></li>
</ul>



<p>Seguindo essas etapas, seu app vai rodar com&nbsp;<code>pt-BR</code>&nbsp;corretamente, sem travar o bundle, e compatível com os novos padrões do Angular 20.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Over-engineering</title>
		<link>https://velhobit.com.br/tirinhas/over-engineering.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Wed, 03 Dec 2025 19:13:08 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=5457</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="340" src="https://velhobit.com.br/wp-content/uploads/2025/12/over-engineering-1024x340.jpg" alt="“Tirinha em três quadros. No primeiro, um homem sentado à mesa pede: ‘Pode me passar o sal, por favor?’. O outro responde: ‘Claro!’. No segundo quadro, o homem espera, olhando de lado. No terceiro, o colega justifica: ‘Eu sei! Eu sei! É que eu estou criando um sistema que intercepta seu pedido de condimentos e te passa!’. O primeiro comenta: ‘É que já tem 20 minutos’. O outro termina: ‘Vai poupar tempo a longo prazo!’.”" class="wp-image-5458" srcset="https://velhobit.com.br/wp-content/uploads/2025/12/over-engineering-1024x340.jpg 1024w, https://velhobit.com.br/wp-content/uploads/2025/12/over-engineering-400x133.jpg 400w, https://velhobit.com.br/wp-content/uploads/2025/12/over-engineering-768x255.jpg 768w, https://velhobit.com.br/wp-content/uploads/2025/12/over-engineering-1536x510.jpg 1536w, https://velhobit.com.br/wp-content/uploads/2025/12/over-engineering-2048x680.jpg 2048w, https://velhobit.com.br/wp-content/uploads/2025/12/over-engineering-600x199.jpg 600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como Liberar Espaço no iPhone: Guia Completo para Otimizar Seu Dispositivo</title>
		<link>https://velhobit.com.br/tutoriais/como-liberar-espaco-no-iphone-guia-completo-para-otimizar-seu-dispositivo.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Thu, 24 Apr 2025 11:49:43 +0000</pubDate>
				<category><![CDATA[Aplicativos e Serviços]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[espaço]]></category>
		<category><![CDATA[iCloud]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[otimização]]></category>
		<guid isPermaLink="false">https://site.velhobit.com.br/?p=41</guid>

					<description><![CDATA[Se você está notando que seu&#160;iPhone&#160;está mais lento, com menos espaço de armazenamento disponível ou simplesmente deseja melhorar seu desempenho geral, limpar dados do sistema pode ser uma solução eficaz. No entanto, muitos usuários não sabem exatamente como realizar essa limpeza de maneira segura e eficiente. Neste artigo, explicaremos passo a passo como limpar dados [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Se você está notando que seu&nbsp;<strong>iPhone</strong>&nbsp;está mais lento, com menos espaço de armazenamento disponível ou simplesmente deseja melhorar seu desempenho geral, limpar dados do sistema pode ser uma solução eficaz. No entanto, muitos usuários não sabem exatamente como realizar essa limpeza de maneira segura e eficiente. Neste artigo, explicaremos passo a passo como limpar dados do sistema no iPhone, melhorar a performance do seu dispositivo e liberar espaço de armazenamento.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="471" height="1024" src="https://velhobit.com.br/wp-content/uploads/2025/04/screenshot-armazenamento-ios-471x1024-1.png" alt="" class="wp-image-44" srcset="https://velhobit.com.br/wp-content/uploads/2025/04/screenshot-armazenamento-ios-471x1024-1.png 471w, https://velhobit.com.br/wp-content/uploads/2025/04/screenshot-armazenamento-ios-471x1024-1-184x400.png 184w, https://velhobit.com.br/wp-content/uploads/2025/04/screenshot-armazenamento-ios-471x1024-1-276x600.png 276w" sizes="(max-width: 471px) 100vw, 471px" /></figure>



<h2 class="wp-block-heading">O que São &#8220;Dados do Sistema&#8221; no iPhone?</h2>



<p>No iPhone, os&nbsp;<strong>dados do sistema</strong>&nbsp;referem-se a uma série de arquivos essenciais para o funcionamento do dispositivo. Esses dados incluem:</p>



<ul class="wp-block-list">
<li><strong>Arquivos temporários</strong>: Cache de aplicativos, logs do sistema e outros arquivos temporários.</li>



<li><strong>Armazenamento de dados de aplicativos</strong>: Como arquivos de configuração e dados de cache.</li>



<li><strong>Arquivos do sistema operacional iOS</strong>: Componentes essenciais para o funcionamento do sistema.</li>
</ul>



<p>Embora os dados do sistema sejam necessários para que o iPhone funcione corretamente, eles podem se acumular ao longo do tempo, ocupando uma quantidade significativa de espaço de armazenamento e impactando o desempenho do dispositivo.</p>



<h3 class="wp-block-heading">Por Que Limpar os Dados do Sistema?</h3>



<p>Limpar os dados do sistema pode ajudar em diversas situações, tais como:</p>



<ul class="wp-block-list">
<li><strong>Liberar espaço</strong>: Com o tempo, o armazenamento do seu iPhone pode ficar saturado com caches e arquivos temporários que não são mais necessários.</li>



<li><strong>Melhorar o desempenho</strong>: A limpeza dos dados do sistema pode ajudar a reduzir o uso de recursos do dispositivo, tornando-o mais rápido e eficiente.</li>



<li><strong>Correção de falhas</strong>: Às vezes, arquivos corrompidos ou desnecessários podem causar problemas no iPhone, e uma limpeza pode ajudar a resolver essas falhas.</li>
</ul>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Libere Espaço no iPhone: Dicas Infalíveis para Aproveitar o iCloud!" width="500" height="375" src="https://www.youtube.com/embed/ug6Rfh146W0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Como Limpar Dados do Sistema no iPhone</h2>



<h3 class="wp-block-heading">1.&nbsp;<strong>Reiniciar o iPhone</strong></h3>



<p>Uma das maneiras mais simples de limpar parte dos dados do sistema no iPhone é reiniciar o dispositivo. Isso ajuda a limpar caches temporários e reiniciar o funcionamento normal dos aplicativos.</p>



<p><strong>Passos</strong>:</p>



<ol class="wp-block-list">
<li>Pressione e segure o botão de liga/desliga (ou o botão lateral, dependendo do modelo) até que apareça o slider de desligamento.</li>



<li>Arraste o slider para desligar o iPhone.</li>



<li>Após o dispositivo desligar, aguarde alguns segundos e ligue-o novamente pressionando o botão de liga/desliga.</li>
</ol>



<h3 class="wp-block-heading">2.&nbsp;<strong>Limpar o Cache de Aplicativos</strong></h3>



<p>Muitos aplicativos, como Safari, YouTube e WhatsApp, acumulam dados de cache ao longo do tempo. Limpar esses caches pode liberar uma quantidade significativa de espaço no iPhone.</p>



<h4 class="wp-block-heading">Limpar Cache do Safari:</h4>



<ol class="wp-block-list">
<li>Abra o <strong>Ajustes</strong> do iPhone.</li>



<li>Role para baixo e toque em <strong>Safari</strong>.</li>



<li>Toque em <strong>Limpar Histórico e Dados dos Sites</strong>.</li>



<li>Confirme a ação tocando em <strong>Limpar Histórico e Dados</strong>.</li>
</ol>



<p>Isso removerá o cache, cookies e o histórico de navegação do Safari, ajudando a liberar espaço de armazenamento.</p>



<h4 class="wp-block-heading">Limpar Cache de Outros Aplicativos:</h4>



<p>Para limpar o cache de outros aplicativos, a maioria dos apps não oferece uma opção direta no iPhone. No entanto, você pode desinstalar e reinstalar o aplicativo para limpar todos os dados temporários e o cache acumulado.</p>



<ol class="wp-block-list">
<li><strong>Desinstalar o aplicativo</strong>: Toque e segure o ícone do aplicativo até que ele comece a tremer e toque no &#8220;X&#8221; para remover.</li>



<li><strong>Reinstalar o aplicativo</strong>: Vá até a App Store e instale o aplicativo novamente.</li>
</ol>



<h3 class="wp-block-heading">3.&nbsp;<strong>Gerenciar Armazenamento do iPhone</strong></h3>



<p>O iPhone possui uma ferramenta integrada que permite gerenciar o espaço de armazenamento de maneira eficiente. Para acessar essas configurações:</p>



<ol class="wp-block-list">
<li>Abra <strong>Ajustes</strong> no seu iPhone.</li>



<li>Toque em <strong>Geral</strong>.</li>



<li>Selecione <strong>Armazenamento do iPhone</strong>.</li>



<li>Aqui você verá uma lista de aplicativos e a quantidade de espaço que cada um ocupa, incluindo <strong>Dados do Sistema</strong>.</li>
</ol>



<p>Se você notar que algum aplicativo está ocupando muito espaço com dados de sistema, você pode optar por excluir o aplicativo e reinstalá-lo para liberar espaço.</p>



<h3 class="wp-block-heading">4.&nbsp;<strong>Limpar Arquivos de Sistema e Dados de Backup Antigos</strong></h3>



<p>Alguns arquivos de sistema podem ser armazenados em seu iPhone, ocupando espaço sem que você perceba. Além disso, backups antigos do iCloud podem consumir espaço de forma desnecessária. Para limpar essas informações:</p>



<h4 class="wp-block-heading">Apagar Backups Antigos do iCloud:</h4>



<ol class="wp-block-list">
<li>Abra <strong>Ajustes</strong>.</li>



<li>Toque no seu nome no topo da tela para acessar o <strong>iCloud</strong>.</li>



<li>Selecione <strong>Gerenciar Armazenamento</strong>.</li>



<li>Toque em <strong>Backups</strong>.</li>



<li>Veja a lista de dispositivos que têm backups e exclua os backups antigos que você não precisa mais.</li>
</ol>



<h4 class="wp-block-heading">Limpar Dados de Sistema:</h4>



<p>Infelizmente, não há uma opção direta para limpar os dados do sistema do iPhone, mas com a limpeza dos caches e a remoção de backups antigos, você pode reduzir consideravelmente o uso de armazenamento pelo sistema.</p>



<h3 class="wp-block-heading">5.&nbsp;<strong>Restaurar o iPhone de Fábrica</strong></h3>



<p>Se, após seguir todas as etapas acima, você ainda sentir que o iPhone está lento ou com problemas relacionados aos dados do sistema, você pode realizar uma&nbsp;<strong>restauração de fábrica</strong>. Este processo apagará todos os dados do dispositivo, incluindo dados do sistema, e restaurará o iPhone para suas configurações originais.</p>



<p><strong>Passos</strong>:</p>



<ol class="wp-block-list">
<li>Faça um <strong>backup</strong> de todos os seus dados importantes (fotos, contatos, etc.).</li>



<li>Vá até <strong>Ajustes > Geral > Redefinir</strong>.</li>



<li>Selecione <strong>Apagar Conteúdo e Ajustes</strong>.</li>



<li>Confirme a ação e siga as instruções para restaurar o iPhone.</li>
</ol>



<p>Após a restauração, você precisará configurar seu iPhone novamente, como se fosse um dispositivo novo. Isso pode ser uma solução eficaz para liberar espaço e corrigir problemas com dados do sistema.</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p>Limpar dados do sistema no iPhone pode ser uma maneira eficaz de liberar espaço de armazenamento e melhorar o desempenho do dispositivo. Embora o processo de remoção de dados do sistema não seja totalmente automático, você pode utilizar as etapas mencionadas acima para otimizar o seu iPhone. Desde a reinicialização simples até a exclusão de backups antigos e a restauração de fábrica, existem várias formas de manter seu dispositivo funcionando de maneira eficiente.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como fazer backup ou transferência de cloud drive com rclone</title>
		<link>https://velhobit.com.br/tutoriais/como-usar-o-rclone-para-transferencias-seguras-e-personalizadas-de-arquivos-na-nuvem.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Fri, 18 Apr 2025 09:56:56 +0000</pubDate>
				<category><![CDATA[Aplicativos e Serviços]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[drive]]></category>
		<category><![CDATA[google drive]]></category>
		<category><![CDATA[iCloud]]></category>
		<category><![CDATA[onedrive]]></category>
		<guid isPermaLink="false">https://site.velhobit.com.br/?p=32</guid>

					<description><![CDATA[Ferramenta de linha de comando para gerenciar arquivos entre diferentes serviços de armazenamento em nuvem]]></description>
										<content:encoded><![CDATA[
<p>O <strong>rclone</strong> é uma ferramenta de linha de comando extremamente poderosa para quem precisa gerenciar arquivos entre diferentes serviços de armazenamento em nuvem. Ele é ideal para usuários que desejam:</p>



<ul class="wp-block-list">
<li>Fazer backup dos seus arquivos em nuvens diferentes</li>



<li>Sincronizar conteúdo entre um serviço e outro</li>



<li>Baixar todos os seus dados de uma conta antes de encerrá-la</li>



<li>Copiar arquivos em massa com muito mais controle e confiabilidade do que as ferramentas oficiais</li>
</ul>



<p>Em muitos casos, como no OneDrive, essa necessidade se tornou ainda mais comum devido ao aumento dos preços dos planos, em decorrências a outros serviços com preços mais em conta. Além disso, quando você tenta baixar muitos dados simultâneos em diversos serviços o download trava ou resulta em pastas vazias ao copiar dos aplicativos oficiais, ao transferir pastas.</p>



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



<h2 class="wp-block-heading">Instalação do rclone</h2>



<h3 class="wp-block-heading">macOS (via Homebrew)</h3>



<pre class="wp-block-code"><code>brew install rclone</code></pre>



<h3 class="wp-block-heading">Linux (Debian, Ubuntu e derivados)</h3>



<pre class="wp-block-code"><code>curl https://rclone.org/install.sh | sudo bash</code></pre>



<p>Ou via gerenciador de pacotes:</p>



<pre class="wp-block-code"><code>sudo apt install rclone</code></pre>



<h3 class="wp-block-heading">Windows</h3>



<ol start="1" class="wp-block-list">
<li>Acesse:&nbsp;<a>https://rclone.org/downloads/</a></li>



<li>Baixe a versão .zip para Windows</li>



<li>Extraia e coloque a pasta em um local fixo (ex:&nbsp;<code>C:\Program Files\rclone</code>)</li>



<li>Adicione o caminho da pasta ao Path do sistema para usar via terminal</li>
</ol>



<div class="observation">
<h3>Como adicionar o rclone ao PATH no Windows</h3>
<p>Localize a pasta onde está o executável</p>
<p>Após extrair o .zip do Rclone, você terá algo como:</p>
<code>
C:\Program Files\rclone ou C:\Users\SeuUsuario\Downloads\rclone-vXXX-windows-amd64
</code>
<p>Copie o caminho completo da pasta. Por exemplo:</p>
<code>
C:\Program Files\rclone
</code>
<p>Abra as variáveis de ambiente</p>
<p>Pressione Win + S e digite variáveis de ambiente</p>
<p>Clique em “Editar variáveis de ambiente do sistema”</p>
<p>Na janela que abrir, clique no botão “Variáveis de ambiente…” no canto inferior direito</p>
<p>Em Variáveis do sistema, encontre a variável chamada Path e clique em Editar…</p>
<p>Clique em Novo e cole o caminho da pasta que você copiou</p>
<p>Clique em OK em todas as janelas para confirmar</p>
</div>



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



<h2 class="wp-block-heading">Configurando o acesso ao OneDrive (ou outra nuvem)</h2>



<p>Execute:</p>



<pre class="wp-block-code"><code>rclone config</code></pre>



<p>Siga as instruções passo a passo:</p>



<ol start="1" class="wp-block-list">
<li>Digite&nbsp;<code>n</code>&nbsp;para criar uma nova configuração</li>



<li>Escolha um nome para ela (ex:&nbsp;<code>onedrive</code>)</li>



<li>Aparecerá uma lista numerada de serviços de nuvem. Escolha o número correspondente ao&nbsp;<strong>OneDrive</strong>.Importante: essa lista pode mudar de ordem conforme a versão do Rclone. Leia atentamente ao lado de cada número.</li>



<li>Quando for perguntado sobre &#8220;client_id&#8221; e &#8220;client_secret&#8221;, pode apenas pressionar Enter para usar os padrões do Rclone.</li>



<li>No prompt sobre &#8220;Edit advanced config?&#8221;, escolha&nbsp;<code>n</code>, a menos que saiba o que está fazendo.</li>



<li>Quando perguntado sobre usar &#8220;auto config&#8221;, escolha&nbsp;<code>y</code>&nbsp;se estiver em um computador com navegador instalado. Isso abrirá o login da Microsoft no navegador para autorização.</li>



<li>Depois de autorizado, volte ao terminal e confirme a gravação da configuração.</li>
</ol>



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



<h2 class="wp-block-heading">É obrigatório sincronizar os arquivos?</h2>



<p><strong>Não.</strong>&nbsp;O <strong>rclone</strong> permite tanto&nbsp;<strong>copiar</strong>&nbsp;quanto&nbsp;<strong>sincronizar</strong>&nbsp;arquivos:</p>



<ul class="wp-block-list">
<li><code>rclone copy</code>&nbsp;copia arquivos de origem para destino&nbsp;<strong>sem apagar nada</strong></li>



<li><code>rclone sync</code>&nbsp;sincroniza origem e destino,&nbsp;<strong>apagando do destino o que não existir mais na origem</strong></li>
</ul>



<p>Para a maioria dos usuários que estão apenas fazendo backup ou transferindo dados, o ideal é usar&nbsp;<code>copy</code>, pois é mais seguro.</p>



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



<h2 class="wp-block-heading">Exemplo: Copiar tudo do OneDrive (exceto algumas pastas)</h2>



<pre class="wp-block-code"><code>rclone copy onedrive: ~/OneDriveBackup \
  --progress \
  --exclude "Vídeos Compartilhados/**" \
  --exclude "Backup do GOG/**"</code></pre>



<p>Esse comando faz o seguinte:</p>



<ul class="wp-block-list">
<li>Copia todos os arquivos do OneDrive para a pasta local <code>~/OneDriveBackup</code> (você pode dar o nome que quiser à pasta)</li>



<li>Exibe o progresso durante a transferência</li>



<li><strong>Ignora</strong> as pastas <code>Vídeos Compartilhados</code> e <code>Backup do GOG</code>, assim como todos os arquivos e subpastas dentro delas</li>
</ul>



<p>Se quiser testar antes sem copiar nada, use a opção <code>--dry-run</code>:</p>



<pre class="wp-block-code"><code>rclone copy onedrive: ~/OneDriveBackup --dry-run --exclude "Videos Compartilhados/**"</code></pre>



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



<h2 class="wp-block-heading">Outras opções úteis</h2>



<h3 class="wp-block-heading">Listar as pastas da raiz:</h3>



<pre class="wp-block-code"><code>rclone lsd onedrive:</code></pre>



<h3 class="wp-block-heading">Listar arquivos:</h3>



<pre class="wp-block-code"><code>rclone ls onedrive:</code></pre>



<h3 class="wp-block-heading">Sincronizar (com cautela):</h3>



<pre class="wp-block-code"><code>rclone sync onedrive: ~/OneDriveBackup --progress</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Atenção:&nbsp;<code>sync</code>&nbsp;pode apagar arquivos locais se eles não existirem mais na nuvem.</p>
</blockquote>



<p>Validar arquivos por tamanho pode ser útil para quando você copia os arquivos de outra origem e não quer sobrevescrever um arquivo que você já possua na pasta.</p>



<pre class="wp-block-code"><code>rclone copy onedrive: ~/OneDriveBackup --size-only</code></pre>



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



<h2 class="wp-block-heading">Concluindo</h2>



<p>O <strong>rclone</strong> é uma ferramenta robusta para quem precisa mais controle sobre arquivos em nuvem. Ele não depende de interfaces gráficas, é multiplataforma, e é confiável mesmo para grandes volumes de dados.</p>



<p>Se você está migrando de um serviço para outro, fazendo backup, ou tentando contornar limitações do aplicativo oficial (como as do OneDrive), o <strong>rclone</strong> é uma solução altamente recomendada.</p>



<p>Manter o controle total dos seus dados nunca foi tão fácil.</p>



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



<p>Se quiser aprofundar ainda mais, você pode consultar a documentação oficial em:&nbsp;<a href="https://rclone.org/">https://rclone.org/</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como Excluir Todas as Postagens do Bluesky de Uma Vez</title>
		<link>https://velhobit.com.br/noticias/programacao-noticias/como-excluir-todas-as-postagens-do-bluesky-de-uma-vez.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Mon, 20 Jan 2025 20:48:43 +0000</pubDate>
				<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2277</guid>

					<description><![CDATA[Sse você deseja apagar todo o seu histórico de publicações, a solução é automatizar o processo. Com um simples script em JavaScript, é possível realizar essa tarefa de forma rápida e eficiente.]]></description>
										<content:encoded><![CDATA[
<p>Atualmente, o&nbsp;<strong>Bluesky</strong>&nbsp;não oferece uma ferramenta oficial para excluir todas as postagens de uma só vez. Por isso, se você deseja apagar todo o seu histórico de publicações, a solução é automatizar o processo. Com um simples script em JavaScript, é possível realizar essa tarefa de forma rápida e eficiente.</p>



<p>Tudo o que você precisa fazer é abrir o seu perfil no Bluesky, colar o código no console do navegador e deixar o script trabalhar para você.</p>



<h3 class="wp-block-heading"><strong>Passo a Passo para Excluir Todas as Postagens do Bluesky</strong></h3>



<ol class="wp-block-list">
<li><strong>Abra o Bluesky no Navegador</strong><br>Acesse o site oficial do Bluesky e faça login em sua conta.</li>



<li><strong>Vá para o Seu Perfil</strong><br>Certifique-se de estar na página do seu próprio perfil, onde todas as suas postagens aparecem.</li>



<li><strong>Abra o Console do Desenvolvedor</strong>
<ul class="wp-block-list">
<li>No navegador, pressione <code>F12</code> ou <code>Ctrl + Shift + I</code> (Windows/Linux) ou <code>Cmd + Option + I</code> (Mac) para abrir as ferramentas de desenvolvedor.</li>



<li>Clique na aba <strong>Console</strong>.</li>
</ul>
</li>



<li><strong>Cole o Código Abaixo no Console</strong><br>Copie e cole este código no console e pressione Enter:</li>
</ol>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >// Seleciona todos os botões com aria-haspopup="menu"
const buttons = document.querySelectorAll('button[aria-haspopup="menu"]');

// Função para executar as ações sequenciais com atraso
const processButton = (button, delay) => {
    setTimeout(() => {
        // Clica no botão do menu
        button.click();
        console.log('Menu aberto.');

        // Aguarda 500ms para clicar em "Excluir postagem"
        setTimeout(() => {
            const deleteDiv = Array.from(document.querySelectorAll('div')).find(div => div.textContent.trim() === 'Excluir postagem');
            if (deleteDiv) {
                deleteDiv.click();
                console.log('Clicou em "Excluir postagem".');

                // Aguarda mais 500ms para clicar no botão "Excluir"
                setTimeout(() => {
                    const deleteButton = document.querySelector('button[aria-label="Excluir"]');
                    if (deleteButton) {
                        deleteButton.click();
                        console.log('Clicou no botão "Excluir".');
                    } else {
                        console.log('Botão "Excluir" não encontrado.');
                    }
                }, 500); // Aguardar 500ms antes de clicar no botão "Excluir"
            } else {
                console.log('Div "Excluir postagem" não encontrada.');
            }
        }, 500); // Aguardar 500ms antes de clicar em "Excluir postagem"
    }, delay); // Aguardar o tempo configurado antes de iniciar o processamento do próximo botão
};

// Iterar pelos botões com um intervalo de 2 segundos entre cada
buttons.forEach((button, index) => {
    processButton(button, index * 2000); // Aguardar 2 segundos por botão
});

console.log(`Iniciado o processamento de ${buttons.length} botões.`);</textarea></pre>
</div>



<p>Para evitar travamentos faça aos poucos. Não precisa ser tudo de uma vez, caso tenhas muitas postagens.</p>



<ol class="wp-block-list">
<li><strong>Aguarde a Execução</strong><br>O script clicará em cada postagem do perfil, abrirá o menu, selecionará a opção <strong>&#8220;Excluir postagem&#8221;</strong>, e confirmará a exclusão. Isso será feito automaticamente para todas as postagens.</li>
</ol>



<figure class="wp-block-video"><video height="416" style="aspect-ratio: 640 / 416;" width="640" controls src="https://velhobit.com.br/wp-content/uploads/2025/01/remover.mov"></video></figure>



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



<h3 class="wp-block-heading"><strong>Por Que Usar Esse Método?</strong></h3>



<p>O&nbsp;<strong>Bluesky</strong>&nbsp;não oferece uma funcionalidade oficial para excluir múltiplas postagens ou apagar todo o histórico de uma vez. Isso pode ser frustrante para quem quer limpar seu perfil de forma prática. Com este script, você consegue realizar essa tarefa automaticamente, sem precisar excluir cada postagem manualmente.</p>



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



<h3 class="wp-block-heading"><strong>Dicas Importantes</strong></h3>



<ul class="wp-block-list">
<li><strong>Seja Paciente:</strong> Dependendo do número de postagens, o script pode levar algum tempo para concluir o processo.</li>



<li><strong>Revise Antes de Começar:</strong> Depois de excluídas, as postagens não podem ser recuperadas. Certifique-se de que deseja apagar todas elas.</li>



<li><strong>Evite Interromper o Processo:</strong> Não feche o navegador ou troque de aba enquanto o script está rodando.</li>
</ul>



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



<h3 class="wp-block-heading"><strong>Conclusão</strong></h3>



<p>Com este script, você pode apagar todas as postagens no&nbsp;<strong>Bluesky</strong>&nbsp;de forma prática e automatizada, resolvendo uma limitação atual da plataforma. Essa solução é ideal para quem quer começar do zero ou simplesmente deseja limpar o histórico de publicações.</p>



<p>Se você gostou da dica, compartilhe com amigos que também usam o Bluesky! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		<enclosure url="https://velhobit.com.br/wp-content/uploads/2025/01/remover.mov" length="0" type="video/quicktime" />

			</item>
		<item>
		<title>Libere Espaço no iPhone: Dicas Infalíveis para Aproveitar o iCloud!</title>
		<link>https://velhobit.com.br/tutoriais/libere-espaco-no-iphone-dicas-infaliveis-para-aproveitar-o-icloud.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Tue, 01 Oct 2024 20:51:16 +0000</pubDate>
				<category><![CDATA[Gestão]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[armazenamento]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[dicas de tecnologia]]></category>
		<category><![CDATA[dicas para iPhone]]></category>
		<category><![CDATA[iCloud]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[liberar espaço]]></category>
		<category><![CDATA[otimização de fotos]]></category>
		<category><![CDATA[vídeos no iPhone]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2229</guid>

					<description><![CDATA[Descubra dicas essenciais para liberar espaço no seu iPhone e aproveitar ao máximo o iCloud. Otimize backups, fotos e vídeos sem perder seus arquivos importantes!]]></description>
										<content:encoded><![CDATA[
<p>Uma das principais reclamações que ouço de usuários de iPhone é que, mesmo contratando vários terabytes de iCloud, o espaço do aparelho continua insuficiente. Mas por que isso acontece e como resolver?</p>



<p>A verdade é que o iCloud não funciona exatamente como um “backup mágico” que libera espaço no seu iPhone. Na realidade, ele é um serviço de <strong>sincronização em nuvem</strong>, projetado para compartilhar seus dados entre seus dispositivos e manter um backup em caso de perda ou roubo de algum deles.</p>



<p>No entanto, existem maneiras de usar o iCloud da forma como muitos imaginam – para economizar espaço no iPhone. Abaixo, confira algumas dicas de como otimizar o uso e liberar armazenamento no seu aparelho.</p>



<p>Dê play caso prefira assistir estas dicas no Youtube ao invés de ler:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Libere Espaço no iPhone: Dicas Infalíveis para Aproveitar o iCloud!" width="500" height="375" src="https://www.youtube.com/embed/ug6Rfh146W0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Dica 1 &#8211; Configuração econômica do iCloud</h2>



<p>Por padrão, o iPhone está configurado para fazer um backup completo do aparelho, e não apenas de arquivos e fotos. Esse backup pode ocupar quase o mesmo espaço no iCloud que você já consome no seu telefone, já que é uma imagem completa do estado atual do dispositivo. No entanto, a maioria das pessoas não precisa desse backup completo. Se você adquirir um iPhone novo porque perdeu o antigo, por exemplo, reconfigurar o aparelho do zero não é um grande inconveniente – o mais importante é não perder suas fotos e arquivos essenciais.</p>



<p>Para liberar espaço no iCloud, siga os passos abaixo:</p>



<p>Abra o app Ajustes, toque no seu nome no topo da tela e vá em <strong>iCloud > Backup do iPhone</strong>. Desative <strong>Fazer Backup Deste iPhone</strong>. Isso <strong>não</strong> desativará o backup das suas fotos.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="1015" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone1-1024x1015.png" alt="Tela de Ajustes:
- Principal
- Conta da Apple

com foco na opção iCloud" class="wp-image-2230" style="width:840px;height:auto" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone1-1024x1015.png 1024w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone1-400x397.png 400w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone1-768x761.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone1-600x595.png 600w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone1.png 1414w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1003" height="1024" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone2-1003x1024.png" alt="Telas de Ajustes
 - iCloud+  &gt; Backup do iCloud
- Backup &gt; Fazer Backup Deste iPhone desabilitado" class="wp-image-2231" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone2-1003x1024.png 1003w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone2-392x400.png 392w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone2-768x784.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone2-588x600.png 588w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone2.png 1373w" sizes="auto, (max-width: 1003px) 100vw, 1003px" /></figure>



<p>Agora, volte ao menu do iCloud e toque em <strong>Fotos</strong>. Role para baixo até encontrar a opção <strong>Otimizar no iPhone</strong> e mantenha-a ativada, caso ainda não esteja. Com essa configuração, o iPhone, quando precisar de espaço, substituirá o arquivo original da foto por uma versão otimizada e mais leve, deixando o arquivo completo apenas na nuvem. Quando você quiser editar ou compartilhar a imagem, o iPhone fará o download da versão final.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1003" height="1024" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone3-1003x1024.png" alt="Tela Ajustes
- iCloud + &gt; Fotos
- Fotos do iCloud &gt; Selecionado Otimizar no iPhone" class="wp-image-2232" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone3-1003x1024.png 1003w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone3-392x400.png 392w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone3-768x784.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone3-588x600.png 588w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone3.png 1373w" sizes="auto, (max-width: 1003px) 100vw, 1003px" /></figure>



<h2 class="wp-block-heading">Dica 2 &#8211; Salve as fotos que quer guardar fora da galeria em uma pasta não sincronizada</h2>



<p>Dentro do iPhone, há um app chamado <strong>Arquivos</strong>, que permite armazenar e acessar documentos, imagens, vídeos, PDFs, e outros formatos diretamente na nuvem ou no aparelho. Ele oferece a flexibilidade de manter esses arquivos exclusivamente na nuvem, liberando espaço no dispositivo.</p>



<p>Para criar um backup em uma pasta não sincronizada, siga os passos abaixo:</p>



<p>1. Abra o app <strong>Arquivos</strong>, toque nos três pontos no canto superior direito e selecione <strong>Nova Pasta</strong>. Nomeie a pasta como preferir.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1003" height="1024" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone4-1003x1024.png" alt="Home do iPhone - App arquivos selecionado
App Arquivos &gt; iCloud Drive &gt; Mais opções abertas selecionando Nova Pasta" class="wp-image-2233" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone4-1003x1024.png 1003w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone4-392x400.png 392w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone4-768x784.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone4-588x600.png 588w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone4.png 1373w" sizes="auto, (max-width: 1003px) 100vw, 1003px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1003" height="1024" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone5-1003x1024.png" alt="Tela do app Arquivos &gt; iCloud Drive - Pasta Backup selecionada
Tela do app Fotos &gt; botão Compartilhar selecionado e algumas fotos marcadas como seleção" class="wp-image-2234" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone5-1003x1024.png 1003w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone5-392x400.png 392w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone5-768x784.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone5-588x600.png 588w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone5.png 1373w" sizes="auto, (max-width: 1003px) 100vw, 1003px" /></figure>



<p>2. Vá ao app <strong>Fotos</strong>, selecione as imagens que deseja guardar e toque no botão de <strong>compartilhar</strong>. Em seguida, escolha a opção <strong>Salvar em Arquivos</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1003" height="1024" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone7-1003x1024.png" alt="Tela de compartilhamento &gt; Opção Salvar em Arquivos
Tela de Compartilhamento iCloud Drive &gt; Backup, com o texto &quot;A Pasta Está Vazia&quot;" class="wp-image-2235" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone7-1003x1024.png 1003w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone7-392x400.png 392w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone7-768x784.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone7-588x600.png 588w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone7.png 1373w" sizes="auto, (max-width: 1003px) 100vw, 1003px" /></figure>



<p>3. Volte ao app <strong>Arquivos</strong> e aguarde o upload ser concluído. Depois, pressione e segure a pasta recém-criada até que apareçam as opções e toque em <strong>Remover Download</strong>. Com isso, essas fotos ficarão salvas somente na nuvem, sem ocupar espaço no seu iPhone.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1003" height="1024" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone8-1003x1024.png" alt="App arquivos &gt; Backup &gt; Sincronizando
App arquivos &gt; Opções de Pasta &gt; Remover Download" class="wp-image-2236" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone8-1003x1024.png 1003w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone8-392x400.png 392w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone8-768x784.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone8-588x600.png 588w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone8.png 1373w" sizes="auto, (max-width: 1003px) 100vw, 1003px" /></figure>



<p>4. Por fim, retorne ao app <strong>Fotos</strong> e exclua as imagens que você acabou de fazer o backup. Elas permanecerão acessíveis pelo app Arquivos sempre que precisar.</p>



<h2 class="wp-block-heading">Dica 3 &#8211; Use a câmera de forma inteligente</h2>



<p>A câmera do iPhone pode ser sua aliada ou inimiga na hora de economizar espaço e dados. Muitas vezes, ao buscar a melhor qualidade possível, fazemos ajustes que acabam sendo desnecessários para nossas necessidades do dia a dia.</p>



<p>Um exemplo é o sensor de 48MP do iPhone, que, por padrão, gera fotos de 12MP. Isso acontece porque o iPhone utiliza um processo de pós-produção que combina e seleciona pixels para otimizar a iluminação da imagem, resultando em uma foto mais leve de 12MP. Apesar de usar os 48MP, o sistema reduz a imagem de forma inteligente, mantendo a qualidade ideal para redes sociais.</p>



<p>Por outro lado, o iPhone oferece o modo ProRAW, que gera imagens de 48MP com pouquíssimo pós-processamento, criando arquivos até 10 vezes maiores. A imagem fica mais “lavada”, ideal para quem quer editar posteriormente com maior controle das cores e detalhes.</p>



<p>Quando falamos de vídeo, as opções se expandem. Embora o iPhone permita gravar em várias resoluções e fps, é bom lembrar que plataformas como Instagram e TikTok utilizam apenas 1080p, tornando desnecessário gravar em 4K – a menos que você pretenda aplicar zoom na edição.</p>



<p>Há também o modo Cinema, que adiciona informações de profundidade, criando o famoso efeito de desfoque no fundo. Isso, junto com o HDR, aumenta significativamente o tamanho dos arquivos. Se o desfoque não for importante para você, evite usar esse modo.</p>



<p>O modo Câmera Lenta, apesar de impressionante, consome uma quantidade enorme de memória, especialmente nos modelos iPhone 16 e 16 Pro, que têm resoluções maiores. Use com cautela, principalmente em vídeos longos.</p>



<p>Por fim, o modo ProRes é voltado para profissionais de vídeo. Com uma média de 6GB por minuto, ele é extremamente pesado e gera vídeos crus, sem pós-processamento, perfeitos para edições detalhadas. No entanto, para a maioria dos usuários, o uso desse modo deve ser evitado.</p>



<p>Para ajustar as configurações ideais para suas necessidades, vá até o app <strong>Ajustes</strong>, selecione <strong>Câmera</strong> e ajuste conforme suas preferências. Não se esqueça de ativar a opção <strong>Alta Eficiência</strong> em <strong>Formatos</strong> para garantir que suas fotos e vídeos sejam salvos em HEIF, um formato mais leve e compatível com sistemas e aplicativos modernos.</p>



<p>Lembre-se que, a qualquer momento, você pode, diretamente na câmera, você pode fazer algum ajuste no momento de usar a câmera.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1003" height="1024" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone9-1003x1024.png" alt="App Ajustes &gt; Câmera
Opções de Câmera" class="wp-image-2237" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone9-1003x1024.png 1003w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone9-392x400.png 392w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone9-768x784.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone9-588x600.png 588w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone9.png 1373w" sizes="auto, (max-width: 1003px) 100vw, 1003px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1003" height="1024" src="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone10-1003x1024.png" alt="App Ajustes &gt; Camera &gt; Opção Formatos marcado como Alta Eficiência
Destaque nas opções das fotos, no app de Camera" class="wp-image-2238" srcset="https://velhobit.com.br/wp-content/uploads/2024/10/iPhone10-1003x1024.png 1003w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone10-392x400.png 392w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone10-768x784.png 768w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone10-588x600.png 588w, https://velhobit.com.br/wp-content/uploads/2024/10/iPhone10.png 1373w" sizes="auto, (max-width: 1003px) 100vw, 1003px" /></figure>



<p>Em conclusão, liberar espaço no iPhone vai muito além de apenas contratar mais armazenamento no iCloud. Compreender como o iCloud funciona como uma ferramenta de sincronização, ajustar corretamente as configurações de backup e otimizar o uso da câmera são passos essenciais para evitar a falta de espaço no dispositivo. Além disso, usar o app Arquivos para criar pastas não sincronizadas e escolher formatos mais eficientes como o HEIF garante um uso mais inteligente da memória. Seguindo essas dicas, você poderá aproveitar ao máximo o iCloud sem comprometer o desempenho ou o armazenamento do seu iPhone.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>De Volta Para o Futuro</title>
		<link>https://velhobit.com.br/tirinhas/de-volta-para-o-futuro.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sat, 11 Feb 2023 20:24:09 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[de volta para o futuro]]></category>
		<category><![CDATA[doutor brown]]></category>
		<category><![CDATA[física]]></category>
		<category><![CDATA[futuro]]></category>
		<category><![CDATA[Marty]]></category>
		<category><![CDATA[tempo]]></category>
		<category><![CDATA[tirinhas]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2207</guid>

					<description><![CDATA[Marty, você não está pensando em quatro dimensões!]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="746" src="https://velhobit.com.br/wp-content/uploads/2023/02/p1-1024x746.png" alt="Espera um pouco, Doutor.
Se a gente continuar, amos bater naquele muro!" class="wp-image-2211" srcset="https://velhobit.com.br/wp-content/uploads/2023/02/p1-1024x746.png 1024w, https://velhobit.com.br/wp-content/uploads/2023/02/p1-400x292.png 400w, https://velhobit.com.br/wp-content/uploads/2023/02/p1-768x560.png 768w, https://velhobit.com.br/wp-content/uploads/2023/02/p1-1536x1120.png 1536w, https://velhobit.com.br/wp-content/uploads/2023/02/p1-600x437.png 600w, https://velhobit.com.br/wp-content/uploads/2023/02/p1.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="746" src="https://velhobit.com.br/wp-content/uploads/2023/02/p2-1024x746.png" alt="Marty, você não está pensando em quatro dimensões!
Nós viajamos apenas no tempo e não no espaço. No momento que voltarmos, aquele muro não vai estar lá." class="wp-image-2212" srcset="https://velhobit.com.br/wp-content/uploads/2023/02/p2-1024x746.png 1024w, https://velhobit.com.br/wp-content/uploads/2023/02/p2-400x292.png 400w, https://velhobit.com.br/wp-content/uploads/2023/02/p2-768x560.png 768w, https://velhobit.com.br/wp-content/uploads/2023/02/p2-1536x1120.png 1536w, https://velhobit.com.br/wp-content/uploads/2023/02/p2-600x437.png 600w, https://velhobit.com.br/wp-content/uploads/2023/02/p2.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="746" src="https://velhobit.com.br/wp-content/uploads/2023/02/p3-1024x746.png" alt="Quadro mostrando apenas o fogo no chão e o raio deixado pelo Delorean (máquina do tempo)" class="wp-image-2213" srcset="https://velhobit.com.br/wp-content/uploads/2023/02/p3-1024x746.png 1024w, https://velhobit.com.br/wp-content/uploads/2023/02/p3-400x292.png 400w, https://velhobit.com.br/wp-content/uploads/2023/02/p3-768x560.png 768w, https://velhobit.com.br/wp-content/uploads/2023/02/p3-1536x1120.png 1536w, https://velhobit.com.br/wp-content/uploads/2023/02/p3-600x437.png 600w, https://velhobit.com.br/wp-content/uploads/2023/02/p3.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="746" src="https://velhobit.com.br/wp-content/uploads/2023/02/p4-1024x746.png" alt="Delorean vagando no espaço com a terra ao fundo.

..." class="wp-image-2214" srcset="https://velhobit.com.br/wp-content/uploads/2023/02/p4-1024x746.png 1024w, https://velhobit.com.br/wp-content/uploads/2023/02/p4-400x292.png 400w, https://velhobit.com.br/wp-content/uploads/2023/02/p4-768x560.png 768w, https://velhobit.com.br/wp-content/uploads/2023/02/p4-1536x1120.png 1536w, https://velhobit.com.br/wp-content/uploads/2023/02/p4-600x437.png 600w, https://velhobit.com.br/wp-content/uploads/2023/02/p4.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Vazamento de Dados</title>
		<link>https://velhobit.com.br/tirinhas/vazamento-de-dados.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Fri, 25 Jun 2021 19:45:17 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[goteira]]></category>
		<category><![CDATA[rede]]></category>
		<category><![CDATA[vazamento]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2169</guid>

					<description><![CDATA[Transcrição: — Rápido! Está havendo um vazamento de dados! Precisamos fazer algo!— Como você soube desse vazamento?GIF de uma goteira no cabo de rede]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="267" src="https://velhobit.com.br/wp-content/uploads/2021/06/vazamento-dados.gif" alt="" class="wp-image-2170"/></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background">— Rápido! Está havendo um<strong> vazamento de dados</strong>! Precisamos fazer algo!<br>— Como você soube desse vazamento?<br>GIF de uma goteira no cabo de rede</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como centralizar verticalmente elementos HTML com CSS</title>
		<link>https://velhobit.com.br/tutoriais/como-centralizar-verticalmente-elementos-html-com-css.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Wed, 02 Jun 2021 22:40:30 +0000</pubDate>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[ajustes]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[diagramação]]></category>
		<category><![CDATA[front-end]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[webdesign]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2151</guid>

					<description><![CDATA[Veja 3 técnicas diferentes de como alinhar elementos verticalmente usando CSS e como elas podem ser usadas.]]></description>
										<content:encoded><![CDATA[
<p>Uma das coisas mais comuns, mas ao mesmo tempo mais chatas de se fazer no CSS é alinhar verticalmente elementos em tela. Existem várias formas de fazer isso. Neste post, vou elencar as minhas formas favoritas de fazer isso.</p>



<h2 class="wp-block-heading">Alinhamento com Flexbox</h2>



<p>Flex é uma propriedade incrível do CSS que permite organizar elementos. Se outrora tínhamos que fazer inúmeras gambiarras com float, o flex nos permite controlar o comportamentos dos filhos de um container. Para centralizar verticalmente um objeto, podemos usar a direção de coluna, em seu container pai.</p>



<script async src="//jsfiddle.net/velhobit/q1xsybp9/embed/result,html,css/"></script>



<h2 class="wp-block-heading">Alinhamento com position</h2>



<p>Com um pouco de matemática, conseguimos fazer um alinhamento vertical com o position absolute. Porém, é importante lembrar que o objeto será flutuante e que seu pai, necessariamente, precisa ser um position relative. O problema de usar esse tipo de alinhamento é que o conteúdo da posição precisa ser fixo. Felizmente, hoje, conseguimos fazer cálculos com variáveis de CSS, o que facilita a forma de implementarmos essa técnica. A vantagem dessa técnica é poder usar, justamente, em ambientes flutuantes que se sobreponham. Porém, caso você não precise que ele se alinhe ao pai, mas à viewport, você pode usar também o position como fixed.</p>



<iframe loading="lazy" width="100%" height="500" src="//jsfiddle.net/velhobit/qd8fn6r9/1/embedded/result,html,css/" allowfullscreen="allowfullscreen" allowpaymentrequest frameborder="0"></iframe>



<h2 class="wp-block-heading">Alinhamento com Grid</h2>



<p>Outra forma moderna de alinhar verticalmente é através do uso de grids. A vantagem de usar grids é que o tamanho do conteúdo do elemento alinhado corresponderá ao tamanho da grid que se deseja utilizar. Ou seja, é adaptável de acordo com a viewport, e não referente ao seu conteúdo. Para isso, basta definirmos a quantidade de colunas e linhas que desejamos e estabelecemos onde o objeto alinhado vai iniciar e terminar.</p>



<iframe loading="lazy" width="100%" height="400" src="//jsfiddle.net/velhobit/r869swqz/embedded/result,html,css/" allowfullscreen="allowfullscreen" allowpaymentrequest frameborder="0"></iframe>



<h2 class="wp-block-heading">Exemplo de uso (Modal Alinhado ao Centro)</h2>



<p>Para mostrar como pode ser usado os alinhamentos, que tal criarmos um simples modal alinhado ao centro da tela? </p>



<p>Um modal é composto por uma cortina que reveste o conteúdo original, seguido de um painel com alguma informação dentro. É convenção de que os modals carreguem essas informações no centro da tela, afim de que a informação fique direcionada e encapsulada, levando, assim, o usuário à uma atenção maior àquela informação. Ou seja, isolar e destacar. O exemplo abaixo foi feito usando a primeira estratégia de alinhamento vertical aqui apresentada, pois, desta forma, o tamanho do modal que vai ser a referência para a centralização. Alguns efeitos foram adicionados para ilustrar melhor.</p>



<iframe loading="lazy" width="100%" height="500" src="//jsfiddle.net/velhobit/pbgmvu2x/embedded/result,css,html,js/" allowfullscreen="allowfullscreen" allowpaymentrequest frameborder="0"></iframe>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como centralizar verticalmente elementos HTML com CSS</title>
		<link>https://velhobit.com.br/tutoriais/como-centralizar-verticalmente-elementos-html-com-css-2.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Wed, 02 Jun 2021 15:55:00 +0000</pubDate>
				<category><![CDATA[Design e Front-End]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[front-end]]></category>
		<guid isPermaLink="false">https://site.velhobit.com.br/?p=79</guid>

					<description><![CDATA[Uma das coisas mais comuns, mas ao mesmo tempo mais chatas de se fazer no CSS é alinhar verticalmente elementos em tela. Existem várias formas de fazer isso. Neste post, vou elencar as minhas formas favoritas de fazer isso. Alinhamento com Flexbox Flex é uma propriedade incrível do CSS que permite organizar elementos. Se outrora [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p id="block-6649b4be-5663-4f89-88e0-637dda1ae9f9">Uma das coisas mais comuns, mas ao mesmo tempo mais chatas de se fazer no CSS é alinhar verticalmente elementos em tela. Existem várias formas de fazer isso. Neste post, vou elencar as minhas formas favoritas de fazer isso.</p>



<h2 class="wp-block-heading" id="block-044e5df1-377f-4af3-9fca-89873d318cc9">Alinhamento com Flexbox</h2>



<p id="block-76c3e40b-7e0a-4b6f-96fc-b607806b82e5">Flex é uma propriedade incrível do CSS que permite organizar elementos. Se outrora tínhamos que fazer inúmeras gambiarras com float, o flex nos permite controlar o comportamentos dos filhos de um container. Para centralizar verticalmente um objeto, podemos usar a direção de coluna, em seu container pai.</p>



<script async src="//jsfiddle.net/velhobit/q1xsybp9/embed/result,html,css/"></script>



<h2 class="wp-block-heading" id="block-67d6f3aa-0db2-4282-af69-76386eb87f4e">Alinhamento com position</h2>



<p id="block-2ea4513d-94ab-48e7-852d-60717d06ce04">Com um pouco de matemática, conseguimos fazer um alinhamento vertical com o position absolute. Porém, é importante lembrar que o objeto será flutuante e que seu pai, necessariamente, precisa ser um position relative. O problema de usar esse tipo de alinhamento é que o conteúdo da posição precisa ser fixo. Felizmente, hoje, conseguimos fazer cálculos com variáveis de CSS, o que facilita a forma de implementarmos essa técnica. A vantagem dessa técnica é poder usar, justamente, em ambientes flutuantes que se sobreponham. Porém, caso você não precise que ele se alinhe ao pai, mas à viewport, você pode usar também o position como fixed.</p>



<iframe loading="lazy" width="100%" height="500" src="//jsfiddle.net/velhobit/qd8fn6r9/1/embedded/result,html,css/" allowfullscreen="allowfullscreen" allowpaymentrequest frameborder="0"></iframe>



<h2 class="wp-block-heading" id="block-d8b5915e-f1e6-40f7-bcda-b1d4c3c87e33">Alinhamento com Grid</h2>



<p id="block-34c78db0-4bd9-4bf3-90ab-6be7cd1f11b2">Outra forma moderna de alinhar verticalmente é através do uso de grids. A vantagem de usar grids é que o tamanho do conteúdo do elemento alinhado corresponderá ao tamanho da grid que se deseja utilizar. Ou seja, é adaptável de acordo com a viewport, e não referente ao seu conteúdo. Para isso, basta definirmos a quantidade de colunas e linhas que desejamos e estabelecemos onde o objeto alinhado vai iniciar e terminar.</p>



<iframe loading="lazy" width="100%" height="400" src="//jsfiddle.net/velhobit/r869swqz/embedded/result,html,css/" allowfullscreen="allowfullscreen" allowpaymentrequest frameborder="0"></iframe>



<h2 class="wp-block-heading" id="block-524d9cba-b523-427b-a79e-c81a23ce8c7e">Exemplo de uso (Modal Alinhado ao Centro)</h2>



<p id="block-fb03f0a5-9a2b-4fc8-a6c4-648568030b0c">Para mostrar como pode ser usado os alinhamentos, que tal criarmos um simples modal alinhado ao centro da tela?</p>



<p id="block-46b25bbb-6bf5-445d-a3d2-281f12147810">Um modal é composto por uma cortina que reveste o conteúdo original, seguido de um painel com alguma informação dentro. É convenção de que os modals carreguem essas informações no centro da tela, afim de que a informação fique direcionada e encapsulada, levando, assim, o usuário à uma atenção maior àquela informação. Ou seja, isolar e destacar. O exemplo abaixo foi feito usando a primeira estratégia de alinhamento vertical aqui apresentada, pois, desta forma, o tamanho do modal que vai ser a referência para a centralização. Alguns efeitos foram adicionados para ilustrar melhor.</p>



<iframe loading="lazy" width="100%" height="500" src="//jsfiddle.net/velhobit/pbgmvu2x/embedded/result,css,html,js/" allowfullscreen="allowfullscreen" allowpaymentrequest frameborder="0"></iframe>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Quais as Novidades da Próxima Atualização do Windows 10?</title>
		<link>https://velhobit.com.br/tirinhas/quais-as-novidades-da-proxima-atualizacao-do-windows-10.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sun, 02 May 2021 15:22:54 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[colorido]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[sistema operacional]]></category>
		<category><![CDATA[tirinhas]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows 10]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2139</guid>

					<description><![CDATA[Um breve momento na reunião para definir as novidades para a próxima atualização do Windows 10.]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="1263" src="https://velhobit.com.br/wp-content/uploads/2021/05/tirinha-windows-10.jpg" alt="" class="wp-image-2141" srcset="https://velhobit.com.br/wp-content/uploads/2021/05/tirinha-windows-10.jpg 1000w, https://velhobit.com.br/wp-content/uploads/2021/05/tirinha-windows-10-317x400.jpg 317w, https://velhobit.com.br/wp-content/uploads/2021/05/tirinha-windows-10-811x1024.jpg 811w, https://velhobit.com.br/wp-content/uploads/2021/05/tirinha-windows-10-768x970.jpg 768w, https://velhobit.com.br/wp-content/uploads/2021/05/tirinha-windows-10-475x600.jpg 475w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p class="has-white-color has-black-background-color has-text-color has-background">&#8212; Precisamos urgente de novidades para a próxima atualização do Windows 10!<br>&#8212; Colocar clima e anúncios na barra de tarefas!<br>&#8212; Windows Hello com suporte a duas câmeras!<br>&#8212; Que tal corrigir o sistema de arquivos, implementar o Fluent Design e entregar o novo File Explorer?<br><br>Velho Bit é jogado pela janela do escritório da Microsoft</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Entendendo Lógica de Programação</title>
		<link>https://velhobit.com.br/tirinhas/entendendo-logica-de-programacao.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Tue, 16 Feb 2021 15:48:26 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[lógica]]></category>
		<category><![CDATA[lógica de programação]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[programacao]]></category>
		<category><![CDATA[quadrinhos]]></category>
		<category><![CDATA[tirinhas]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2125</guid>

					<description><![CDATA[Entendendo lógica de programação em 3 quadrinhos]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1371" height="1475" src="https://velhobit.com.br/wp-content/uploads/2021/02/logica-programacao.jpg" alt="" class="wp-image-2126" srcset="https://velhobit.com.br/wp-content/uploads/2021/02/logica-programacao.jpg 1371w, https://velhobit.com.br/wp-content/uploads/2021/02/logica-programacao-372x400.jpg 372w, https://velhobit.com.br/wp-content/uploads/2021/02/logica-programacao-952x1024.jpg 952w, https://velhobit.com.br/wp-content/uploads/2021/02/logica-programacao-768x826.jpg 768w, https://velhobit.com.br/wp-content/uploads/2021/02/logica-programacao-558x600.jpg 558w" sizes="auto, (max-width: 1371px) 100vw, 1371px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong>Placa: SE SEU CÃO FIZER COCÔ, COLOQUE-O NO SAQUINHO</strong><br>&#8212; cãozinho do Velho Bit faz cocô<br>&#8212; Velho Bit deixa o cocô perto da placa e sai com o cãozinho dentro de uma sacola</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como adicionar e remover dinamicamente campos HTML em um Formulário? (Javascript puro)</title>
		<link>https://velhobit.com.br/programacao/como-adicionar-e-remover-dinamicamente-um-elemento-html-a-partir-de-um-input-javascript-puro.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sun, 14 Feb 2021 21:47:36 +0000</pubDate>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[dinâmico]]></category>
		<category><![CDATA[dinamismo]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[formulário]]></category>
		<category><![CDATA[front-end]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[javascript puro]]></category>
		<category><![CDATA[programação]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2099</guid>

					<description><![CDATA[Adicione ou remova dinamicamente um ou mais campos em seu formulário, usando Javascript puro]]></description>
										<content:encoded><![CDATA[
<p>O Javascript nos permite criar conteúdos dinâmicos e podemos usar isso para adicionar remover e adicionar elementos de acordo com as opções do usuário. Dados como informações sobre dependentes,  links de mídias sociais, e-mails adicionais, etc. são curtos e não fazem sentido criarmos um formulário separado apenas para estes. Por isso, é interessante incluirmos a opção de adicionar diretamente esses campos em um subformulário dinâmico.</p>



<p class="has-black-color has-text-color has-background" style="background-color:#f3f3f3">Obs. Se quiser ir direto para o código final, procure o link do JsFiddle no final do post.</p>



<div class="dependentes">
  <button id="btnAdicionarDependentes">
  <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4dd.png" alt="📝" class="wp-smiley" style="height: 1em; max-height: 1em;" />Adicionar Dependentes
  </button>
  <div class="container" id="dependentesContainer">
  </div>
  <button class="green" id="btnCapturarDados">
  <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capturar Dados
  </button>
</div>
<pre id="containerDados">  
</pre>



<h2 class="wp-block-heading">HTML</h2>



<p>Para iniciarmos, basta criar um container no HTML onde você quer que os elementos sejam exibidos, além do botão simples de adição e um botão de captura de dados, para que, desta forma, possamos enviar o JSON resultante para o back-end.</p>



<p>A organização dos containers é sempre muito importante quando trabalhamos com Javascript e nos dedicamos ao uso correto da web semântica.</p>



<div class="my-syntax-highlighter"><pre><textarea id="mshighlighter" class="mshighlighter" language="html" name="mshighlighter" >
<div class="dependentes">
  <button id="btnAdicionarDependentes">
  &#x1f4dd;Adicionar Dependentes
  </button>
  <div class="container" id="dependentesContainer">
  </div>
  <button class="green" id="btnCapturarDados">
  &#x2705; Capturar Dados
  </button>
</div>
<pre id="containerDados"></pre></textarea></pre></div>



<h2 class="wp-block-heading">Javascript</h2>



<p>Como de praxe, usaremos o Javascript puro para realizar essa tarefa, dessa forma você poderá usar em qualquer lugar o que aprender aqui.</p>



<p>Para poder capturar e devolver os dados, usaremos um objeto JSON, dessa forma fica fácil remontar, tanto no <em>back-end</em>, quando no <em>front-end</em>, os dados nas formatações e/ou elementos que precisamos.</p>



<p>Vamos criar, como exemplo, o JSON abaixo, e vamos declará-lo em uma variável global chamada dependentes, seguindo a ideia de um cadastro de lista de dependentes, então temos:</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >
var dependentes = [{
  identificador: 13,
  nome: "Joana da Silva",
  idade: 12,
}];</textarea></pre>
</div>



<p>Agora vamos nos focar nas funções. A primeira coisa que vamos fazer é criar um método que pegue os dados do JSON e o converta para elementos HTML renderizados na tela. Dessa forma, usaremos um laço para ler o JSON e aplicamos seus dados em uma <em>template string</em> e o adicionamos no container específico:</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >
function carregarDependentes() {
  let dependentes_container = document.querySelector("#dependentesContainer");
  dependentes_container.innerHTML = "";
  dependentes.forEach((el) =&gt; {
    let identificador = el.identificador;
    let nome = el.nome;
    let idade = el.idade;
    let dependente_container = `<div class="dependente" data-id="${identificador}">
    								<input class="nome" placeholder="Digite o nome" type="text" value="${nome}">
                                    <input class="idade" placeholder="Digite a idade" type="number" value="${idade}">
                                    <div class="action">
                                        <a href="#" class="salvar">salvar &#x1f4be;</a>
                                        <a href="#" class="remover">&#x274c;</a>
									</div>
                                </div>`;
    dependentes_container.innerHTML += dependente_container;
  });
}</textarea></pre>
</div>



<p>Agora vem o segredo que facilita o processo e o deixa mais organizado. Ao invés de remover e adicionar os elementos na tela, iremos nos focar em remover e adicionar do JSON e, em seguida, regenerar os elementos a partir desse objeto. Ficando, assim, com um código mais limpo. Outro motivo pelo qual usamos a regeneração dos elementos é para evitar criarmos IDs únicos temporários. Ao regenerar, podemos usar os índices do próprio <em>array </em>como identificador.</p>



<p>Para adicionar um novo item, basta incluirmos um dado vazio no JSON, porém, seguindo nosso modelo, e mandamos gerar novamente os elementos:</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >function adicionarDependentes() {
  dependentes.push({ identificador: "", nome: "", idade: "" });
  carregarDependentes();
}</textarea></pre>
</div>



<p>Para remover, similar a criação de um novo, vamos usar um laço, porém para adicionar o evento aos botões de excluir. Usaremos então o método <em>splice </em>para remover o <em>array</em>. Depois, obviamente, vamos regenerar os elementos a partir da função carregarDependentes():</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >function removerDependentes() {
  document
    .querySelectorAll("#dependentesContainer .remover")
    .forEach((el, i) =&gt; {
      el.addEventListener("click", () =&gt; {
        dependentes.splice(i, 1); // O splice vai remover um item do array no JSON
        carregarDependentes(); // E chamamos o método para regenerar os elementos
      });
    });
}</textarea></pre>
</div>



<p>Uma vez que adicionamos uma nova linha em branco precisamos salvar seu preenchimento e aí iremos usar a mesma lógica de remoção, mas usaremos o <em>splice </em>para substituir e não para remover um dado do JSON. Porém, adicionaremos uma pequena validação para evitar entrar dados incompletos:</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >function salvarDependentes() {
  document
    .querySelectorAll("#dependentesContainer .salvar")
    .forEach((el, i) =&gt; {
      el.addEventListener("click", () =&gt; {
        let identificador = el.parentElement.parentElement.getAttribute(
          "data-id"
        );
        let nome = el.parentElement.parentElement.querySelector(".nome").value;
        let idade = el.parentElement.parentElement.querySelector(".idade")
          .value;

        if (!nome.length || !idade.length) { // Verifica se nome e idade foram preenchidos
          alert("Nome e idade precisam ser preenchidos para salvar.");
          return false;
        }
        dependentes.splice(i, 1, {
          identificador: identificador,
          nome: nome,
          idade: idade,
        }); // Substitui o dado no JSON
        carregarDependentes(); //  E chamamos o método para regenerar os elementos
      });
    });
}</textarea></pre>
</div>



<p>Um outro método que precisamos adicionar é uma forma de <strong>bloquear </strong>para que um usuário consiga clicar em outros elementos ao redor, sem antes finalizar a edição do item. Para isso, iremos fazer um laço que adiciona uma classe de CSS, que vamos chamar de <em>disabled</em>, em todos os elementos, exceto o que está sendo editado. Essa classe possui um <strong><em>point-events: 0</em></strong> e um <strong><em>opacity: 0.5</em></strong>. Para demonstrar que está desativado, você pode ainda adicionar outros efeitos, como filtros de baixo contraste ou escala de cinza.</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >function travarOutros(element) {
  if (element == false) { // Passar false como parâmetro para que todos os elementos fiquem habilitados novamente, ao invés de apenas o elemento que queremos liberar
    document
      .querySelectorAll(".dependentes button, .dependentes .container &gt; div")
      .forEach((el) =&gt; {
        el.classList.remove("disabled");
      });
    document.querySelector("#containerDados").innerHTML = "";
    return false;
  }
  document
    .querySelectorAll(".dependentes button, .dependentes .container &gt; div")
    .forEach((el) =&gt; {
      if (el != element) {  // Verifica se o elemento no laço é o que está sendo editado
        el.classList.add("disabled");
      }
    });
}</textarea></pre>
</div>



<p>Agora, antes de continuarmos, vamos revisitar as funções acima para chamar, quando necessário, uma função dentro da outra (leia os comentários no código para entender), ficando assim:</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >
function carregarDependentes() {
  let dependentes_container = document.querySelector("#dependentesContainer");
  dependentes_container.innerHTML = "";
  dependentes.forEach((el) =&gt; {
    let identificador = el.identificador;
    let nome = el.nome;
    let idade = el.idade;
    let dependente_container = `<div class="dependente" data-id="${identificador}">
    															<input class="nome" placeholder="Digite o nome" type="text" value="${nome}">
                                  <input class="idade" placeholder="Digite a idade" type="number" value="${idade}">
                                  <div class="action">
                                  	<a href="#" class="salvar">salvar &#x1f4be;</a>
                                    <a href="#" class="remover">&#x274c;</a>
																	</div>
															  </div>`;
    dependentes_container.innerHTML += dependente_container;
  });
  salvarDependentes(); // Adicionamos o método aqui para que o laço seja aplicado nos novos items adicionados
  removerDependentes(); // Adicionamos o método aqui para que o laço seja aplicado nos novos items adicionados
  travarOutros(false); // Adicionamos para destravar tudo
}

function removerDependentes() {
  document
    .querySelectorAll("#dependentesContainer .remover")
    .forEach((el, i) =&gt; {
      el.addEventListener("click", () =&gt; {
        dependentes.splice(i, 1);
        carregarDependentes(); // Regenerar os elementos HTML após remover do JSON
      });
    });
}

function adicionarDependentes() {
  dependentes.push({ identificador: "", nome: "", idade: "" });
  carregarDependentes(); // Regenerar os elementos HTML após remover do JSON
  travarOutros(
    document.querySelector("#dependentesContainer &gt; div:last-child")
  ); // Desabilitar todos os outros elementos, exceto o que acabou de ser adicionado
}

function salvarDependentes() {
  document
    .querySelectorAll("#dependentesContainer .salvar")
    .forEach((el, i) =&gt; {
      el.addEventListener("click", () =&gt; {
        let identificador = el.parentElement.parentElement.getAttribute(
          "data-id"
        );
        let nome = el.parentElement.parentElement.querySelector(".nome").value;
        let idade = el.parentElement.parentElement.querySelector(".idade")
          .value;

        if (!nome.length || !idade.length) {
          alert("Nome e idade precisam ser preenchidos para salvar.");
          return false;
        }
        dependentes.splice(i, 1, {
          identificador: identificador,
          nome: nome,
          idade: idade,
        });
        carregarDependentes(); // Regenerar os elementos HTML após remover do JSON
        travarOutros(false); // Liberar todos os elementos novamente
      });
    });
}

function travarOutros(element) {
  if (element == false) {
    document
      .querySelectorAll(".dependentes button, .dependentes .container &gt; div")
      .forEach((el) =&gt; {
        el.classList.remove("disabled");
      });
    document.querySelector("#containerDados").innerHTML = "";
    return false;
  }
  document
    .querySelectorAll(".dependentes button, .dependentes .container &gt; div")
    .forEach((el) =&gt; {
      if (el != element) {
        el.classList.add("disabled");
      }
    });
}</textarea></pre>
</div>



<p>Agora, tudo o que precisamos fazer é incluir os comandos de inicialização, onde aplicamos o método de adição ao evento de clique do botão e carregamos os dados iniciais do JSON:</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >
//init
document.querySelector("#btnAdicionarDependentes").addEventListener("click", adicionarDependentes);
carregarDependentes();</textarea></pre>
</div>



<p>Por fim, vamos criar uma função para o botão de capturar dados apenas para extrair e mostrar os dados em JSON. Você pode, eventualmente, usar esses dados e enviar via POST, por AJAX ou via campo oculto, e pegar no back-end para guardar ou processar os dados (como com um json_decoder, do PHP):</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="javascript" name="mshighlighter" >
//capturarDados
document.querySelector("#btnCapturarDados").addEventListener("click", ()=&gt;{
	document.querySelector("#containerDados").innerHTML = JSON.stringify(dependentes, undefined, 4);
});</textarea></pre>
</div>



<h2 class="wp-block-heading">CSS</h2>



<p>O único CSS que precisaremos usar é para aplicar a classe <em>disabled</em>. Se por acaso você está usando algum <em>framework </em>CSS, recomendo que você use o relativo a esta classe deste. Consulte a documentação, onde geralmente está relacionado aos <em>helpers</em>:</p>


<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="css" name="mshighlighter" >
.disabled{
  pointer-events: none;
  opacity: .5;
}</textarea></pre>
</div>



<p>Se você quer usar o CSS mais elaborado que usei aqui, veja abaixo o link do JsFiddle.</p>



<h2 class="wp-block-heading">Finalizando</h2>



<p>Criar formulários dinâmicos auxilia a usabilidade à medida que permite que o usuário adicione dados de forma mais rápida e com respostas visuais imediatas. O uso aqui do Javascript puro visa a facilidade para que você possa implementar em quaisquer projetos, incluindo os com Typescript. Trabalhe um pouco no código para adequá-lo à sua necessidade. E, como sempre, você poderá puxar o código e testar direto do JsFiddle.</p>



<script async src="//jsfiddle.net/velhobit/mwh8f2o1/embed/"></script>



<p>Aproveite e entre para nosso grupo de discussão no <a href="https://t.me/designprogramacao" target="_blank" rel="noreferrer noopener">Telegram</a>.</p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como adicionar e remover dinamicamente campos HTML em um form? (Javascript puro)</title>
		<link>https://velhobit.com.br/tutoriais/como-adicionar-e-remover-dinamicamente-campos-html-em-um-form-javascript-puro.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sun, 14 Feb 2021 16:04:00 +0000</pubDate>
				<category><![CDATA[Design e Front-End]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[estilo]]></category>
		<category><![CDATA[front-end]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascrip]]></category>
		<category><![CDATA[jsvanilla]]></category>
		<guid isPermaLink="false">https://site.velhobit.com.br/?p=82</guid>

					<description><![CDATA[O Javascript nos permite criar conteúdos dinâmicos e podemos usar isso para adicionar remover e adicionar elementos de acordo com as opções do usuário. Dados como informações sobre dependentes, links de mídias sociais, e-mails adicionais, etc. são curtos e não fazem sentido criarmos um formulário separado apenas para estes. Por isso, é interessante incluirmos a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p id="block-e8021681-0362-4698-bab1-e06ce8fcdc26">O Javascript nos permite criar conteúdos dinâmicos e podemos usar isso para adicionar remover e adicionar elementos de acordo com as opções do usuário. Dados como informações sobre dependentes, links de mídias sociais, e-mails adicionais, etc. são curtos e não fazem sentido criarmos um formulário separado apenas para estes. Por isso, é interessante incluirmos a opção de adicionar diretamente esses campos em um subformulário dinâmico.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p id="block-7b013644-fd16-427f-ad7f-0dac65241e16">Obs. Se quiser ir direto para o código final, procure o link do JsFiddle no final do post.</p>
</blockquote>



<h2 class="wp-block-heading" id="block-50427a97-6435-4fe2-b0db-0ab0a0900e76">HTML</h2>



<p id="block-38a0b969-940d-488c-97fd-4070c90e2c76">Para iniciarmos, basta criar um container no HTML onde você quer que os elementos sejam exibidos, além do botão simples de adição e um botão de captura de dados, para que, desta forma, possamos enviar o JSON resultante para o back-end.</p>



<p id="block-0cea6af6-c9bb-4ce3-8f87-10fcfb3593bf">A organização dos containers é sempre muito importante quando trabalhamos com Javascript e nos dedicamos ao uso correto da web semântica.</p>



<pre class="wp-block-code"><code>&lt;div class="dependentes">
  &lt;button id="btnAdicionarDependentes">
  &#x1f4dd;Adicionar Dependentes
  &lt;/button>
  &lt;div class="container" id="dependentesContainer">
  &lt;/div>
  &lt;button class="green" id="btnCapturarDados">
  &#x2705; Capturar Dados
  &lt;/button>
&lt;/div>
&lt;pre id="containerDados">  
&lt;/pre></code></pre>



<h2 class="wp-block-heading" id="block-79778471-435b-4794-a208-bf0e3f8ac0df">Javascript</h2>



<p id="block-740ad472-30ad-4f46-84c9-50f7fcb0c77c">Como de praxe, usaremos o Javascript puro para realizar essa tarefa, dessa forma você poderá usar em qualquer lugar o que aprender aqui.</p>



<p id="block-8418b415-53dc-42c7-8343-a447bc7bc2c4">Para poder capturar e devolver os dados, usaremos um objeto JSON, dessa forma fica fácil remontar, tanto no <em>back-end</em>, quando no <em>front-end</em>, os dados nas formatações e/ou elementos que precisamos.</p>



<p id="block-5e272e83-5318-45b2-832b-693f35e68ee3">Vamos criar, como exemplo, o JSON abaixo, e vamos declará-lo em uma variável global chamada dependentes, seguindo a ideia de um cadastro de lista de dependentes, então temos:</p>



<pre class="wp-block-code"><code>var dependentes = &#91;{
  identificador: 13,
  nome: "Joana da Silva",
  idade: 12,
}];</code></pre>



<p id="block-9661ff72-c21f-4444-939c-6b7f24254659">Agora vamos nos focar nas funções. A primeira coisa que vamos fazer é criar um método que pegue os dados do JSON e o converta para elementos HTML renderizados na tela. Dessa forma, usaremos um laço para ler o JSON e aplicamos seus dados em uma <em>template string</em> e o adicionamos no container específico:</p>



<pre class="wp-block-code"><code>function carregarDependentes() {
  let dependentes_container = document.querySelector("#dependentesContainer");
  dependentes_container.innerHTML = "";
  dependentes.forEach((el) =&amp;gt; {
    let identificador = el.identificador;
    let nome = el.nome;
    let idade = el.idade;
    let dependente_container = `&lt;div class="dependente" data-id="${identificador}">
    								&lt;input class="nome" placeholder="Digite o nome" type="text" value="${nome}">
                                    &lt;input class="idade" placeholder="Digite a idade" type="number" value="${idade}">
                                    &lt;div class="action">
                                        &lt;a href="#" class="salvar">salvar &#x1f4be;&lt;/a>
                                        &lt;a href="#" class="remover">&#x274c;&lt;/a>
									&lt;/div>
                                &lt;/div>`;
    dependentes_container.innerHTML += dependente_container;
  });
}</code></pre>



<p id="block-e3a01ded-6e1f-4742-968c-475a44d36414">Agora vem o segredo que facilita o processo e o deixa mais organizado. Ao invés de remover e adicionar os elementos na tela, iremos nos focar em remover e adicionar do JSON e, em seguida, regenerar os elementos a partir desse objeto. Ficando, assim, com um código mais limpo. Outro motivo pelo qual usamos a regeneração dos elementos é para evitar criarmos IDs únicos temporários. Ao regenerar, podemos usar os índices do próprio <em>array </em>como identificador.</p>



<p id="block-ff072f21-a361-4bf0-8520-f4ad84f120a7">Para adicionar um novo item, basta incluirmos um dado vazio no JSON, porém, seguindo nosso modelo, e mandamos gerar novamente os elementos:</p>



<pre class="wp-block-code"><code>function adicionarDependentes() {
  dependentes.push({ identificador: "", nome: "", idade: "" });
  carregarDependentes();
}</code></pre>



<p id="block-2639192c-d7f1-45ad-a887-05818f80f05a">Para remover, similar a criação de um novo, vamos usar um laço, porém para adicionar o evento aos botões de excluir. Usaremos então o método <em>splice </em>para remover o <em>array</em>. Depois, obviamente, vamos regenerar os elementos a partir da função carregarDependentes():</p>



<pre class="wp-block-code"><code>function removerDependentes() {
  document
    .querySelectorAll("#dependentesContainer .remover")
    .forEach((el, i) =&amp;gt; {
      el.addEventListener("click", () =&amp;gt; {
        dependentes.splice(i, 1); // O splice vai remover um item do array no JSON
        carregarDependentes(); // E chamamos o método para regenerar os elementos
      });
    });
}</code></pre>



<p id="block-f9a40aa0-2a1e-4949-a1be-e25e8d278dd2">Uma vez que adicionamos uma nova linha em branco precisamos salvar seu preenchimento e aí iremos usar a mesma lógica de remoção, mas usaremos o <em>splice </em>para substituir e não para remover um dado do JSON. Porém, adicionaremos uma pequena validação para evitar entrar dados incompletos:</p>



<pre class="wp-block-code"><code>unction salvarDependentes() {
  document
    .querySelectorAll("#dependentesContainer .salvar")
    .forEach((el, i) =&amp;gt; {
      el.addEventListener("click", () =&amp;gt; {
        let identificador = el.parentElement.parentElement.getAttribute(
          "data-id"
        );
        let nome = el.parentElement.parentElement.querySelector(".nome").value;
        let idade = el.parentElement.parentElement.querySelector(".idade")
          .value;

        if (!nome.length || !idade.length) { // Verifica se nome e idade foram preenchidos
          alert("Nome e idade precisam ser preenchidos para salvar.");
          return false;
        }
        dependentes.splice(i, 1, {
          identificador: identificador,
          nome: nome,
          idade: idade,
        }); // Substitui o dado no JSON
        carregarDependentes(); //  E chamamos o método para regenerar os elementos
      });
    });
}</code></pre>



<p id="block-5febd00c-a838-48a5-a8a6-ea01d4d76e6a">Um outro método que precisamos adicionar é uma forma de <strong>bloquear </strong>para que um usuário consiga clicar em outros elementos ao redor, sem antes finalizar a edição do item. Para isso, iremos fazer um laço que adiciona uma classe de CSS, que vamos chamar de <em>disabled</em>, em todos os elementos, exceto o que está sendo editado. Essa classe possui um <strong><em>point-events: 0</em></strong> e um <strong><em>opacity: 0.5</em></strong>. Para demonstrar que está desativado, você pode ainda adicionar outros efeitos, como filtros de baixo contraste ou escala de cinza.</p>



<pre class="wp-block-code"><code>function travarOutros(element) {
  if (element == false) { // Passar false como parâmetro para que todos os elementos fiquem habilitados novamente, ao invés de apenas o elemento que queremos liberar
    document
      .querySelectorAll(".dependentes button, .dependentes .container &amp;gt; div")
      .forEach((el) =&amp;gt; {
        el.classList.remove("disabled");
      });
    document.querySelector("#containerDados").innerHTML = "";
    return false;
  }
  document
    .querySelectorAll(".dependentes button, .dependentes .container &amp;gt; div")
    .forEach((el) =&amp;gt; {
      if (el != element) {  // Verifica se o elemento no laço é o que está sendo editado
        el.classList.add("disabled");
      }
    });
}</code></pre>



<p id="block-be0547a1-dea2-4448-8a5e-9514278a94d4">Agora, antes de continuarmos, vamos revisitar as funções acima para chamar, quando necessário, uma função dentro da outra (leia os comentários no código para entender), ficando assim:</p>



<pre class="wp-block-code"><code>function carregarDependentes() {
  let dependentes_container = document.querySelector("#dependentesContainer");
  dependentes_container.innerHTML = "";
  dependentes.forEach((el) =&amp;gt; {
    let identificador = el.identificador;
    let nome = el.nome;
    let idade = el.idade;
    let dependente_container = `&lt;div class="dependente" data-id="${identificador}">
    															&lt;input class="nome" placeholder="Digite o nome" type="text" value="${nome}">
                                  &lt;input class="idade" placeholder="Digite a idade" type="number" value="${idade}">
                                  &lt;div class="action">
                                  	&lt;a href="#" class="salvar">salvar &#x1f4be;&lt;/a>
                                    &lt;a href="#" class="remover">&#x274c;&lt;/a>
																	&lt;/div>
															  &lt;/div>`;
    dependentes_container.innerHTML += dependente_container;
  });
  salvarDependentes(); // Adicionamos o método aqui para que o laço seja aplicado nos novos items adicionados
  removerDependentes(); // Adicionamos o método aqui para que o laço seja aplicado nos novos items adicionados
  travarOutros(false); // Adicionamos para destravar tudo
}

function removerDependentes() {
  document
    .querySelectorAll("#dependentesContainer .remover")
    .forEach((el, i) =&amp;gt; {
      el.addEventListener("click", () =&amp;gt; {
        dependentes.splice(i, 1);
        carregarDependentes(); // Regenerar os elementos HTML após remover do JSON
      });
    });
}

function adicionarDependentes() {
  dependentes.push({ identificador: "", nome: "", idade: "" });
  carregarDependentes(); // Regenerar os elementos HTML após remover do JSON
  travarOutros(
    document.querySelector("#dependentesContainer &amp;gt; div:last-child")
  ); // Desabilitar todos os outros elementos, exceto o que acabou de ser adicionado
}

function salvarDependentes() {
  document
    .querySelectorAll("#dependentesContainer .salvar")
    .forEach((el, i) =&amp;gt; {
      el.addEventListener("click", () =&amp;gt; {
        let identificador = el.parentElement.parentElement.getAttribute(
          "data-id"
        );
        let nome = el.parentElement.parentElement.querySelector(".nome").value;
        let idade = el.parentElement.parentElement.querySelector(".idade")
          .value;

        if (!nome.length || !idade.length) {
          alert("Nome e idade precisam ser preenchidos para salvar.");
          return false;
        }
        dependentes.splice(i, 1, {
          identificador: identificador,
          nome: nome,
          idade: idade,
        });
        carregarDependentes(); // Regenerar os elementos HTML após remover do JSON
        travarOutros(false); // Liberar todos os elementos novamente
      });
    });
}

function travarOutros(element) {
  if (element == false) {
    document
      .querySelectorAll(".dependentes button, .dependentes .container &amp;gt; div")
      .forEach((el) =&amp;gt; {
        el.classList.remove("disabled");
      });
    document.querySelector("#containerDados").innerHTML = "";
    return false;
  }
  document
    .querySelectorAll(".dependentes button, .dependentes .container &amp;gt; div")
    .forEach((el) =&amp;gt; {
      if (el != element) {
        el.classList.add("disabled");
      }
    });
}</code></pre>



<p id="block-ab9c8db0-380f-4d31-b0a5-d84dda993870">Agora, tudo o que precisamos fazer é incluir os comandos de inicialização, onde aplicamos o método de adição ao evento de clique do botão e carregamos os dados iniciais do JSON:</p>



<pre class="wp-block-code"><code>//init
document.querySelector("#btnAdicionarDependentes").addEventListener("click", adicionarDependentes);
carregarDependentes();</code></pre>



<p id="block-d689a75a-a671-4218-878b-1e4b41b1034a">Por fim, vamos criar uma função para o botão de capturar dados apenas para extrair e mostrar os dados em JSON. Você pode, eventualmente, usar esses dados e enviar via POST, por AJAX ou via campo oculto, e pegar no back-end para guardar ou processar os dados (como com um json_decoder, do PHP):</p>



<pre class="wp-block-code"><code>//capturarDados
document.querySelector("#btnCapturarDados").addEventListener("click", ()=&amp;gt;{
	document.querySelector("#containerDados").innerHTML = JSON.stringify(dependentes, undefined, 4);
});</code></pre>



<h2 class="wp-block-heading" id="block-525d96fb-9ba9-40d1-b78e-867b44f386a7">CSS</h2>



<p id="block-1ed39d06-f9d5-405c-8d18-47bec57b5d66">O único CSS que precisaremos usar é para aplicar a classe <em>disabled</em>. Se por acaso você está usando algum <em>framework </em>CSS, recomendo que você use o relativo a esta classe deste. Consulte a documentação, onde geralmente está relacionado aos <em>helpers</em>:</p>



<pre class="wp-block-code"><code>.disabled{
  pointer-events: none;
  opacity: .5;
}</code></pre>



<p id="block-6f8b1d9a-075f-4ca6-9508-3128557d4d10">Se você quer usar o CSS mais elaborado que usei aqui, veja abaixo o link do JsFiddle.</p>



<h2 class="wp-block-heading" id="block-fa6cb5c7-c024-4cd6-bca2-b05c15a5988f">Finalizando</h2>



<p id="block-dc6ff86e-45f8-4824-a83a-c908fcc3dca2">Criar formulários dinâmicos auxilia a usabilidade à medida que permite que o usuário adicione dados de forma mais rápida e com respostas visuais imediatas. O uso aqui do Javascript puro visa a facilidade para que você possa implementar em quaisquer projetos, incluindo os com Typescript. Trabalhe um pouco no código para adequá-lo à sua necessidade. E, como sempre, você poderá puxar o código e testar direto do JsFiddle.</p>



<p id="block-5f910d6b-c133-434b-be75-bfeb33999629">Aproveite e entre para nosso grupo de discussão no <a href="https://t.me/designprogramacao" target="_blank" rel="noreferrer noopener">Telegram</a>.</p>



<script async="" src="//jsfiddle.net/velhobit/mwh8f2o1/embed/"></script>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Futura Programadora</title>
		<link>https://velhobit.com.br/tirinhas/futura-programadora.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Mon, 01 Feb 2021 18:49:00 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2130</guid>

					<description><![CDATA[for($i=0; $i<100.; $i++){
echo "não vou mais conversar durante a aula";
}]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="679" src="https://velhobit.com.br/wp-content/uploads/2021/02/122069296_655980165106179_2022075539229143089_o-1024x679.png" alt="" class="wp-image-2132" srcset="https://velhobit.com.br/wp-content/uploads/2021/02/122069296_655980165106179_2022075539229143089_o-1024x679.png 1024w, https://velhobit.com.br/wp-content/uploads/2021/02/122069296_655980165106179_2022075539229143089_o-400x265.png 400w, https://velhobit.com.br/wp-content/uploads/2021/02/122069296_655980165106179_2022075539229143089_o-768x509.png 768w, https://velhobit.com.br/wp-content/uploads/2021/02/122069296_655980165106179_2022075539229143089_o-600x398.png 600w, https://velhobit.com.br/wp-content/uploads/2021/02/122069296_655980165106179_2022075539229143089_o.png 1500w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong>&#8212; aluna segurando giz na frente do professor</strong><br>Escrito no Quadro:<br>for($i=0; $i&lt;100.; $i++){<br>echo &#8220;não vou mais conversar durante a aula&#8221;;<br>}</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fim do Flash &#8211; O que fazer com minha aplicação Flash?</title>
		<link>https://velhobit.com.br/programacao/fim-do-flash-o-que-fazer-com-minha-aplicacao-flash.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Mon, 18 Jan 2021 19:38:15 +0000</pubDate>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2090</guid>

					<description><![CDATA[Infelizmente o Flash acabou. Mas O que fazer com minha aplicação? Como vou atender meu cliente? Como transformar em Javascript?]]></description>
										<content:encoded><![CDATA[
<p>Vou entrar neste assunto apenas uma vez porque eu vi muitos coleguinhas stressados com isso. Contantemente eu tenho visto perguntas como: &#8220;Qual navegador ainda vai rodar Flash?&#8221;, &#8220;Como faço com a minha aplicação Flex?&#8221;, &#8220;Tem como converter Flex ou Flash para Javascript&#8221;?</p>



<h2 class="wp-block-heading"><strong>O que fazer com meu sistema?</strong></h2>



<p>Como você, caro leitor, deve saber, o Flash foi descontinuado de forma pesada e forte em 2021. E não adianta xingar, ficar irritado, ou gritar com a Adobe. O fato é que o ambiente ficou insustentável para a plataforma e correções foram abandonadas já a alguns anos e o suporte oficial também. Como o Flex foi uma plataforma extremamente forte em meados dos anos 2000, muitas aplicações, algumas nem tão antigas assim, e extremamente robustas, foram construídas em cima dele. Isso fez com que, mesmo diante de tanto aviso, muitas desenvolvedoras e desenvolvedores acabaram por não ter condições de desenvolver novas soluções completas que compensassem o fim da tecnologia. Por isso, para ajudar, vou sugerir duas soluções, uma de médio e outra de curto prazo, que pode auxiliar a você resolver seus problemas e continuar mantendo um suporte até ter condições de desenvolver uma solução definitiva.</p>



<h3 class="wp-block-heading"><strong>Solução 1 &#8211; Médio Prazo</strong></h3>



<p>Em 2011, a Adobe doou o Flex para o Apache, então, desde 2014-2016, eles trabalharam em uma forma de portar o Flex para JS, através do FlexJS. Porém, o projeto do Flex não morreu, ele foi convertido para o Apache Royale. Essa pode ser uma solução a médio prazo para a maioria de vocês que estão tendo essa dificuldade. Pode ser uma solução em curto prazo também, se seu projeto foi bem desenvolvido. Ele usa MXML e AS3 e transpila para Javascript e HTML5 ao invés de Flash.</p>



<p>A página do Apache Royale, junto com seus links, pode ser encontrada aqui:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="561" height="165" src="https://velhobit.com.br/wp-content/uploads/2021/01/apache-royale.png" alt="" class="wp-image-2091" srcset="https://velhobit.com.br/wp-content/uploads/2021/01/apache-royale.png 561w, https://velhobit.com.br/wp-content/uploads/2021/01/apache-royale-400x118.png 400w" sizes="auto, (max-width: 561px) 100vw, 561px" /></figure>



<h3 class="wp-block-heading"><strong>Solução 2 &#8211; CurtoPrazo</strong></h3>



<p>O Adobe AIR permite executar Flash em plataforma desktop. Ele teve seus esforços transferidos para o HARMAN, em 2019, uma empresa da SAMSUNG. Você pode simplesmente compilar sua aplicação Flex baixando o SDK do AIR através do link abaixo:</p>



<figure class="wp-block-image size-large"><a href="https://airsdk.harman.com/download"><img loading="lazy" decoding="async" width="561" height="165" src="https://velhobit.com.br/wp-content/uploads/2021/01/harman-adobe-air.png" alt="" class="wp-image-2092" srcset="https://velhobit.com.br/wp-content/uploads/2021/01/harman-adobe-air.png 561w, https://velhobit.com.br/wp-content/uploads/2021/01/harman-adobe-air-400x118.png 400w" sizes="auto, (max-width: 561px) 100vw, 561px" /></a></figure>



<p>Basta aceitar os termos e baixar. A plataforma continuará sendo mantida pela empresa. Porém, é necessário ficar atento a licença. Em geral, para a maioria dos usuários, a licença gratuita resolverá e sua dependência é por valor de receita.</p>



<h2 class="wp-block-heading">Update &#8211; Solução 3 &#8211; Ruffle</h2>



<figure class="wp-block-image size-large"><a href="https://ruffle.rs/" target="_blank" rel="noopener"><img loading="lazy" decoding="async" width="518" height="182" src="https://velhobit.com.br/wp-content/uploads/2021/05/image.png" alt="" class="wp-image-2143" srcset="https://velhobit.com.br/wp-content/uploads/2021/05/image.png 518w, https://velhobit.com.br/wp-content/uploads/2021/05/image-400x141.png 400w" sizes="auto, (max-width: 518px) 100vw, 518px" /></a></figure>



<p>Uma solução que tem tudo para ser permanente e até, quem sabe, dar uma sobrevida ao Flash, é o Ruffle. O Ruffle é um emulador de flash player construído em Rust, que pode ser usado para animações e aplicações. O mais legal é que ele pode ser usado não apenas em seu servidor, mas como extensão do navegador ou para quem possui aplicações desktop e não queiram usar o Adobe AIR da HARMAN.</p>



<p><strong><em>OBS: Eu não tenho NADA a ver com a Adobe, nem a Harman, mas trabalhei por muitos anos com a plataforma Flex e compreendo sua enorme importância e contribuição para o que temos hoje em termos de front-end e UX. Estou postando isso apenas para ajudar.</em></strong></p>



<p><strong>Caso eu saiba de mais alguma solução, eu vou atualizar este poste. Fica de olho no Facebook / Instagram ou no grupo, que eu sempre atualizo as coisas por lá.</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tendência: Pantone define Illuminating e Ultimate Grey como cores do ano de 2021</title>
		<link>https://velhobit.com.br/design/tendencia-pantone-define-illuminating-e-ultimate-grey-como-cores-do-ano-de-2021.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Fri, 11 Dec 2020 20:49:52 +0000</pubDate>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[cores]]></category>
		<category><![CDATA[iluminação]]></category>
		<category><![CDATA[impressão]]></category>
		<category><![CDATA[impressos]]></category>
		<category><![CDATA[paleta]]></category>
		<category><![CDATA[pantone]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2060</guid>

					<description><![CDATA[A Pantone sugere que as cores de 2021 deverão representar o casamento entre otimismo e força.]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://velhobit.com.br/wp-content/uploads/2020/12/4d56f05b-4a6f-4d91-b4de-9ea61ae47ddb-COTY21_HERO_IMAGE_30x20_1-1024x576.jpg" alt="Cores do ano da Paontone" class="wp-image-2067" srcset="https://velhobit.com.br/wp-content/uploads/2020/12/4d56f05b-4a6f-4d91-b4de-9ea61ae47ddb-COTY21_HERO_IMAGE_30x20_1-1024x576.jpg 1024w, https://velhobit.com.br/wp-content/uploads/2020/12/4d56f05b-4a6f-4d91-b4de-9ea61ae47ddb-COTY21_HERO_IMAGE_30x20_1-400x225.jpg 400w, https://velhobit.com.br/wp-content/uploads/2020/12/4d56f05b-4a6f-4d91-b4de-9ea61ae47ddb-COTY21_HERO_IMAGE_30x20_1-768x432.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/12/4d56f05b-4a6f-4d91-b4de-9ea61ae47ddb-COTY21_HERO_IMAGE_30x20_1-1536x864.jpg 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Todo ano a Pantone, maior empresa do mundo no ramo de sistemas de cores, elege as cores que serão usadas para representar o ano seguinte.</p>



<p>A ideia da empresa é, principalmente, criar um catálogo a fim de representar as tendências para o ano seguinte. Catálogo este criado pela The Pantone Color Institute, que busca utilizar de padrões e tons que são significativamente mais globais e genéricos em termos culturais, sobre o que se esperar do ano seguinte.</p>



<p>No ano de 2019, definiu-se que a cor que movimentaria o ano de 2020 foi o Classic Blue (19-4052):</p>



<div class="videoWrapper"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/m8tnsF8f7Y4" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="700" height="140" src="https://velhobit.com.br/wp-content/uploads/2020/12/pantone-paleta-2020.jpeg" alt="" class="wp-image-2061" srcset="https://velhobit.com.br/wp-content/uploads/2020/12/pantone-paleta-2020.jpeg 700w, https://velhobit.com.br/wp-content/uploads/2020/12/pantone-paleta-2020-400x80.jpeg 400w, https://velhobit.com.br/wp-content/uploads/2020/12/pantone-paleta-2020-600x120.jpeg 600w" sizes="auto, (max-width: 700px) 100vw, 700px" /></figure>



<h2 class="wp-block-heading">As Cores de 2021: <span style="background-color: rgb(245,233,77); color: rgb(147,149,151);">Otimismo</span> e <span style="background-color: rgb(147,149,151); color: rgb(245,233,77);">Força</span></h2>



<p>Diante da maior crise sanitária da era moderna, a Pantone sugere que as cores de 2021 deverão representar o casamento entre otimismo e força, e escolheu como suas representantes as cores PANTONE 13-0647&nbsp;Illuminating (similar ao amarelo canário) e o PANTONE 17-5104&nbsp; Ultimate Gray (similar ao cinza elefante).</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="764" height="510" src="https://velhobit.com.br/wp-content/uploads/2020/12/colors.png" alt="Cores do Ano Pantone" class="wp-image-2070" srcset="https://velhobit.com.br/wp-content/uploads/2020/12/colors.png 764w, https://velhobit.com.br/wp-content/uploads/2020/12/colors-400x267.png 400w, https://velhobit.com.br/wp-content/uploads/2020/12/colors-600x401.png 600w" sizes="auto, (max-width: 764px) 100vw, 764px" /></figure>



<p>“Ao combinar PANTONE 17-5104 Ultimate Grey e PANTONE 13-0647 Illuminating para ser nossa cor Pantone do ano em 2021, destacamos como dois elementos diferentes se unem para expressar uma mensagem de força e esperança, que é ao mesmo tempo duradoura e edificante, transmitindo a ideia de que não se trata de uma cor ou de uma pessoa, é sobre vários”. —  disse Laurie Pressman, vice presidente da Pantone Color Institute. — &#8220;Elas comunicam uma compreensão mais profunda da importância dos relacionamentos e da necessidade que temos uns dos outros. A união dessas duas cores diferentes mostra a força e o otimismo que resultam da junção de diferentes ingredientes&#8221;.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1400" height="790" src="https://velhobit.com.br/wp-content/uploads/2020/12/LDE7RKM3NZFX5DMQWOIYWKDZKU.jpg" alt="Exemplos cores pantone" class="wp-image-2071" srcset="https://velhobit.com.br/wp-content/uploads/2020/12/LDE7RKM3NZFX5DMQWOIYWKDZKU.jpg 1400w, https://velhobit.com.br/wp-content/uploads/2020/12/LDE7RKM3NZFX5DMQWOIYWKDZKU-400x226.jpg 400w, https://velhobit.com.br/wp-content/uploads/2020/12/LDE7RKM3NZFX5DMQWOIYWKDZKU-1024x578.jpg 1024w, https://velhobit.com.br/wp-content/uploads/2020/12/LDE7RKM3NZFX5DMQWOIYWKDZKU-768x433.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/12/LDE7RKM3NZFX5DMQWOIYWKDZKU-600x339.jpg 600w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></figure>



<p>É importante salientar que Pantone é uma empresa privada e seus sistemas são proprietários, então você não deverá encontrar atualizações em paletas automatizadas em aplicativos como GIMP e Inkscape, mas nada impede que você crie suas próprias paletas manualmente, replicando as cores, ou até encontre algumas na internet feitas por terceiros.</p>



<p>Todavia, as cores e assets já estão disponíveis em serviços como o Adobe Stock e Freepik Premium:</p>



<div class="videoWrapper"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/BU6Ve0RK9Us" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://velhobit.com.br/wp-content/uploads/2020/12/pantone-com-outras-cores.jpeg" alt="" class="wp-image-2072" srcset="https://velhobit.com.br/wp-content/uploads/2020/12/pantone-com-outras-cores.jpeg 1024w, https://velhobit.com.br/wp-content/uploads/2020/12/pantone-com-outras-cores-400x400.jpeg 400w, https://velhobit.com.br/wp-content/uploads/2020/12/pantone-com-outras-cores-500x500.jpeg 500w, https://velhobit.com.br/wp-content/uploads/2020/12/pantone-com-outras-cores-768x768.jpeg 768w, https://velhobit.com.br/wp-content/uploads/2020/12/pantone-com-outras-cores-600x600.jpeg 600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Algumas variações de paletas usando as cores Pantone 2021 já estão disponíveis publicamente no <a href="https://color.adobe.com/pt/search?q=2021%20Pantone" target="_blank" rel="noreferrer noopener">Adobe Color.</a> Dessa forma, já é possível usar as cores em novos projetos através da Creative Cloud, no Adobe XD, Illustrator, Photoshop e InDesign, além de plataformas para projetos de mídias sociais e vídeos, nos dispositivos móveis.</p>



<h2 class="wp-block-heading">Brasil</h2>



<p>No Brasil, através do Twitter, algumas pessoas tem manifestado reações sobre a decisão da Pantone.</p>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="500" data-dnt="true"><p lang="pt" dir="ltr">Essa é a verdadeira pantone do Brasil <a href="https://twitter.com/hashtag/Pantone2021?src=hash&amp;ref_src=twsrc%5Etfw">#Pantone2021</a> <a href="https://t.co/owm3DuiXb3">pic.twitter.com/owm3DuiXb3</a></p>&mdash; Greengo Dictionary <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f99c.png" alt="🦜" class="wp-smiley" style="height: 1em; max-height: 1em;" /> (@greengodict) <a href="https://twitter.com/greengodict/status/1337066402855981068?ref_src=twsrc%5Etfw">December 10, 2020</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
https://twitter.com/priguicil4/status/1337088108756602880
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="500" data-dnt="true"><p lang="pt" dir="ltr"><a href="https://twitter.com/metrosp_oficial?ref_src=twsrc%5Etfw">@metrosp_oficial</a> <a href="https://twitter.com/Via_Quatro?ref_src=twsrc%5Etfw">@Via_Quatro</a> Linha 4 amarela: esse é seu momento <a href="https://twitter.com/hashtag/Pantone2021?src=hash&amp;ref_src=twsrc%5Etfw">#Pantone2021</a> <a href="https://twitter.com/hashtag/Pantone?src=hash&amp;ref_src=twsrc%5Etfw">#Pantone</a> <a href="https://t.co/uEbtjOiNj4">pic.twitter.com/uEbtjOiNj4</a></p>&mdash; Millenial Esgotado <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f1f7-1f1fa.png" alt="🇷🇺" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f1f5-1f1f8.png" alt="🇵🇸" class="wp-smiley" style="height: 1em; max-height: 1em;" /> (@mazierismo) <a href="https://twitter.com/mazierismo/status/1337494132567273472?ref_src=twsrc%5Etfw">December 11, 2020</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="500" data-dnt="true"><p lang="pt" dir="ltr">As Cores do Ano 2021 da Pantone. <a href="https://t.co/4ygKcuohvV">pic.twitter.com/4ygKcuohvV</a></p>&mdash; Gil Marcel (@gilmarcel) <a href="https://twitter.com/gilmarcel/status/1337071724731518976?ref_src=twsrc%5Etfw">December 10, 2020</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
https://twitter.com/threuytt/status/1336866930330906625
</div></figure>



<p>Com informações do da Adobe, Dezeen, Freepik e Pantone.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP</title>
		<link>https://velhobit.com.br/tirinhas/php.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Thu, 03 Dec 2020 04:00:21 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[burros]]></category>
		<category><![CDATA[calculo]]></category>
		<category><![CDATA[coelhos]]></category>
		<category><![CDATA[notice]]></category>
		<category><![CDATA[numeros]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2052</guid>

					<description><![CDATA[Transcrição: Chiquinha: Se temos 15 burros e tiramos 8 coelhos, ficam 7 carneiros.Girafales: Mas é que de burros só podemos tirar burros!Chiquinha:&#60;?php$burros = “15 burros”;$coelhos = “8 coelhos”;echo ( $burros + $coelhos ) . “ Carneiros”;]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1016" height="1534" src="https://velhobit.com.br/wp-content/uploads/2020/12/php-1.jpg" alt="" class="wp-image-2055" srcset="https://velhobit.com.br/wp-content/uploads/2020/12/php-1.jpg 1016w, https://velhobit.com.br/wp-content/uploads/2020/12/php-1-265x400.jpg 265w, https://velhobit.com.br/wp-content/uploads/2020/12/php-1-678x1024.jpg 678w, https://velhobit.com.br/wp-content/uploads/2020/12/php-1-768x1160.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/12/php-1-397x600.jpg 397w" sizes="auto, (max-width: 1016px) 100vw, 1016px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong>Chiquinha</strong>: Se temos 15 burros e tiramos 8 coelhos, ficam 7 carneiros.<br><strong>Girafales</strong>: Mas é que de burros só podemos tirar burros!<br><strong>Chiquinha</strong>:<br>&lt;?php<br>$burros = “15 burros”;<br>$coelhos = “8 coelhos”;<br>echo ( $burros + $coelhos ) . “ Carneiros”;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cotidiano</title>
		<link>https://velhobit.com.br/tirinhas/cotidiano.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 02:29:34 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[cotidiano]]></category>
		<category><![CDATA[programador]]></category>
		<category><![CDATA[vida de programador]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2047</guid>

					<description><![CDATA[Transcrição: Trabalhando&#8230;Conversando&#8230;Se divertindo&#8230;ZZZZZZZZ]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1086" height="1077" src="https://velhobit.com.br/wp-content/uploads/2020/11/cotidiano.jpg" alt="" class="wp-image-2048" srcset="https://velhobit.com.br/wp-content/uploads/2020/11/cotidiano.jpg 1086w, https://velhobit.com.br/wp-content/uploads/2020/11/cotidiano-400x397.jpg 400w, https://velhobit.com.br/wp-content/uploads/2020/11/cotidiano-1024x1016.jpg 1024w, https://velhobit.com.br/wp-content/uploads/2020/11/cotidiano-768x762.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/11/cotidiano-600x595.jpg 600w" sizes="auto, (max-width: 1086px) 100vw, 1086px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background">Trabalhando&#8230;<br>Conversando&#8230;<br>Se divertindo&#8230;<br>ZZZZZZZZ</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Consertando Bugs</title>
		<link>https://velhobit.com.br/tirinhas/consertando-bugs.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 02:25:44 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[bugs]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2043</guid>

					<description><![CDATA[Transcrição: Chefe: Você terminou de corrigir os 10 bugs que te passei?VelhoBit: Já terminei 6&#8230; Agora só faltam 15]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1200" height="1464" src="https://velhobit.com.br/wp-content/uploads/2020/11/bugs.jpg" alt="" class="wp-image-2044" srcset="https://velhobit.com.br/wp-content/uploads/2020/11/bugs.jpg 1200w, https://velhobit.com.br/wp-content/uploads/2020/11/bugs-328x400.jpg 328w, https://velhobit.com.br/wp-content/uploads/2020/11/bugs-839x1024.jpg 839w, https://velhobit.com.br/wp-content/uploads/2020/11/bugs-768x937.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/11/bugs-492x600.jpg 492w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong>Chefe</strong>: Você terminou de corrigir os 10 bugs que te passei?<br><strong>VelhoBit: </strong>Já terminei 6&#8230; Agora só faltam 15</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Machine Learning</title>
		<link>https://velhobit.com.br/tirinhas/machine-learning.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 02:21:16 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[aprendizado]]></category>
		<category><![CDATA[emprego]]></category>
		<category><![CDATA[entrevista]]></category>
		<category><![CDATA[inteligência artificial]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2040</guid>

					<description><![CDATA[Transcrição: Entrevistadora: Muito bem! Me diga qual sua principal habilidade.VelhoBit: Ah! Eu sou muito bom com machine learning.Entrevistadora: OK! Quanto é 21+17?VelhoBit: É 5!Entrevistadora: Não chegou nem perto. É 38!VelhoBit: É 20!Entrevistadora: Eu disse 38!VelhoBit: É 35!Entrevistadora: Ainda é 38!VelhoBit: É 38!Entrevistadora: &#8230; Contratado!]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1086" height="2112" src="https://velhobit.com.br/wp-content/uploads/2020/11/machine-learning.jpg" alt="" class="wp-image-2041" srcset="https://velhobit.com.br/wp-content/uploads/2020/11/machine-learning.jpg 1086w, https://velhobit.com.br/wp-content/uploads/2020/11/machine-learning-206x400.jpg 206w, https://velhobit.com.br/wp-content/uploads/2020/11/machine-learning-527x1024.jpg 527w, https://velhobit.com.br/wp-content/uploads/2020/11/machine-learning-768x1494.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/11/machine-learning-790x1536.jpg 790w, https://velhobit.com.br/wp-content/uploads/2020/11/machine-learning-1053x2048.jpg 1053w, https://velhobit.com.br/wp-content/uploads/2020/11/machine-learning-309x600.jpg 309w" sizes="auto, (max-width: 1086px) 100vw, 1086px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong>Entrevistadora</strong>: Muito bem! Me diga qual sua principal habilidade.<br><strong>VelhoBit: </strong>Ah! Eu sou muito bom com machine learning.<br><strong>Entrevistadora:</strong> OK!  Quanto é 21+17?<br><strong>VelhoBit: </strong>É 5!<br><strong>Entrevistadora: </strong>Não chegou nem perto. É 38!<br><strong>VelhoBit: </strong>É 20!<br><strong>Entrevistadora: </strong>Eu disse 38!<br><strong>VelhoBit: </strong>É 35!<br><strong>Entrevistadora: </strong>Ainda é 38!<br><strong>VelhoBit: </strong>É 38!<br><strong>Entrevistadora: </strong>&#8230; Contratado!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Box Sizing</title>
		<link>https://velhobit.com.br/tirinhas/box-sizing.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 02:09:51 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[border-box]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[quadrinho]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2037</guid>

					<description><![CDATA[Transcrição: Código-Fonte: .quadrinho{ padding: 30px} Código-Fonte: .quadrinho{ padding: 30px; box-sizing: border-box}]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1086" height="1600" src="https://velhobit.com.br/wp-content/uploads/2020/11/box-sizing.jpg" alt="" class="wp-image-2038" srcset="https://velhobit.com.br/wp-content/uploads/2020/11/box-sizing.jpg 1086w, https://velhobit.com.br/wp-content/uploads/2020/11/box-sizing-272x400.jpg 272w, https://velhobit.com.br/wp-content/uploads/2020/11/box-sizing-695x1024.jpg 695w, https://velhobit.com.br/wp-content/uploads/2020/11/box-sizing-768x1131.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/11/box-sizing-1043x1536.jpg 1043w, https://velhobit.com.br/wp-content/uploads/2020/11/box-sizing-407x600.jpg 407w" sizes="auto, (max-width: 1086px) 100vw, 1086px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong>Código-Font</strong>e: .quadrinho{ padding: 30px}<br><br><strong>Código-Fonte</strong>: .quadrinho{ padding: 30px; box-sizing: border-box}</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Declaração de Guerra</title>
		<link>https://velhobit.com.br/tirinhas/declaracao-de-guerra.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 01:38:27 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[computação]]></category>
		<category><![CDATA[guerra]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2034</guid>

					<description><![CDATA[Transcrição: VelhoBit: Que raiva do Javascript! Eu vou declarar guerra! Código-Fonte: var guerra;]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1168" height="570" src="https://velhobit.com.br/wp-content/uploads/2020/11/guerra.jpg" alt="" class="wp-image-2035" srcset="https://velhobit.com.br/wp-content/uploads/2020/11/guerra.jpg 1168w, https://velhobit.com.br/wp-content/uploads/2020/11/guerra-400x195.jpg 400w, https://velhobit.com.br/wp-content/uploads/2020/11/guerra-1024x500.jpg 1024w, https://velhobit.com.br/wp-content/uploads/2020/11/guerra-768x375.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/11/guerra-600x293.jpg 600w" sizes="auto, (max-width: 1168px) 100vw, 1168px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong>VelhoBit</strong>: Que raiva do Javascript! Eu vou declarar guerra!<br><br><strong>Código-Fonte</strong>: var guerra;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ninguém Liga para Alertas</title>
		<link>https://velhobit.com.br/tirinhas/ninguem-liga-para-alertas.html</link>
		
		<dc:creator><![CDATA[Rodrigo Portillo]]></dc:creator>
		<pubDate>Sat, 28 Nov 2020 00:59:34 +0000</pubDate>
				<category><![CDATA[Tirinhas de Tecnologia e Design]]></category>
		<category><![CDATA[deus]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tirinha]]></category>
		<guid isPermaLink="false">https://velhobit.com.br/?p=2031</guid>

					<description><![CDATA[Transcrição: Tela de Computador: humanidade.jar Alerta: Potenciais problemas na programação (12.575 itens). Deseja compilar assim mesmo? Sim ou Não? Deus: Tudo bem, é só uma alerta. Dá nada não. Sim.]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1168" height="1070" src="https://velhobit.com.br/wp-content/uploads/2020/11/warning.jpg" alt="" class="wp-image-2032" srcset="https://velhobit.com.br/wp-content/uploads/2020/11/warning.jpg 1168w, https://velhobit.com.br/wp-content/uploads/2020/11/warning-400x366.jpg 400w, https://velhobit.com.br/wp-content/uploads/2020/11/warning-1024x938.jpg 1024w, https://velhobit.com.br/wp-content/uploads/2020/11/warning-768x704.jpg 768w, https://velhobit.com.br/wp-content/uploads/2020/11/warning-600x550.jpg 600w" sizes="auto, (max-width: 1168px) 100vw, 1168px" /></figure>



<h3 class="wp-block-heading">Transcrição:</h3>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong>Tela de Computador</strong>: humanidade.jar<br><br><strong>Alerta</strong>: Potenciais problemas na programação (12.575 itens). Deseja compilar assim mesmo? Sim ou Não?<br><br><strong>Deus</strong>: Tudo bem, é só uma alerta. Dá nada não.<br><br><strong>Sim</strong>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
