<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://blog.tcelestino.dev.br/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Bloco de Notas por Tiago Celestino</title>
    <link>https://blog.tcelestino.dev.br/</link>
    <atom:link href="https://blog.tcelestino.dev.br/feed.xml" rel="self" type="application/rss+xml" />
    <description>Meu blog pessoal para anotações cotidianas.</description>
    <language>pt-BR</language>
      <item>
        <title>Como remover a coautoria do Claude Code dos seus commits</title>
        <link>https://blog.tcelestino.dev.br/2026/10/remover-coautoria-claude-code/</link>
        <description>&lt;p&gt;Inúmeras pessoas passaram a usar o Claude Code como ferramenta de desenvolvimento, seja para tirar dúvidas, sugerir arquiteturas e, principalmente, implementar ideias que estavam guardadas na gaveta há um tempo.&lt;/p&gt;
&lt;p&gt;Geralmente, quando você pede para o Claude Code fazer commits e/ou abrir um pull request no GitHub, ele adiciona automaticamente o Claude como colaborador, o que para muitos pode se tornar um &amp;quot;problema&amp;quot; (não me pergunte por quê).&lt;/p&gt;
&lt;p&gt;Nos commits, é publicada uma linha como esta:&lt;/p&gt;
&lt;pre tabindex=&quot;0&quot;&gt;&lt;code&gt;Co-authored-by: Claude &amp;lt;claude@anthropic.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Com isso, o Claude aparece como coautor do commit e, em alguns casos, na lista de contribuidores do repositório.&lt;/p&gt;
&lt;h2&gt;Removendo essas informações&lt;/h2&gt;
&lt;p&gt;Para remover essas informações é simples. No macOS e no Linux, o arquivo fica em &lt;code&gt;~/.claude/settings.json&lt;/code&gt;. No Windows, ele fica em &lt;code&gt;%USERPROFILE%&#92;.claude&#92;settings.json&lt;/code&gt;. Basta adicionar a chave &lt;code&gt;attribution&lt;/code&gt; ao arquivo:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;attribution&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;commit&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;pr&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Se o arquivo já existir, adicione apenas o bloco &lt;code&gt;attribution&lt;/code&gt; dentro do objeto principal, sem apagar as demais configurações.&lt;/p&gt;
&lt;p&gt;O que cada chave faz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;commit&lt;/code&gt;: desativa a linha &lt;code&gt;Co-authored-by&lt;/code&gt; nas mensagens de commit.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pr&lt;/code&gt;: desativa a linha &lt;code&gt;Co-authored-by&lt;/code&gt; nas descrições de pull request.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essa configuração vale para os commits e pull requests feitos a partir da sua máquina. Se quiser aplicá-la apenas a um projeto, coloque o mesmo bloco em &lt;code&gt;.claude/settings.json&lt;/code&gt; na raiz do repositório.&lt;/p&gt;
&lt;p&gt;Commits que já foram publicados não são alterados. Para remover a linha deles, é preciso reescrever o histórico, o que deve ser feito com cuidado, principalmente em branches compartilhadas.&lt;/p&gt;
</description>
        <pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2026/10/remover-coautoria-claude-code/</guid>
      </item>
      <item>
        <title>Por que o ::backdrop não funciona com o atributo open do &lt;dialog&gt;</title>
        <link>https://blog.tcelestino.dev.br/2026/07/backdrop-nao-funciona-com-atributo-open-dialog/</link>
        <description>&lt;p&gt;No meu tempo livre, estou estudando alguns elementos HTML que não existiam anos atrás e que surgiram para dar mais semântica às marcações, melhorar a usabilidade e a acessibilidade, além de reduzir a quantidade de scripts em JavaScript.&lt;/p&gt;
&lt;p&gt;A tag da vez é a &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;, que permite criar caixas de diálogo semânticas e acessíveis em HTML. Em vez de usar um &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; ou &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; para criar uma caixa de diálogo, o &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; oferece uma maneira mais semântica e acessível de fazer isso. Além disso, é fácil customizar o estilo com CSS e adicionar recursos interativos com JavaScript.&lt;/p&gt;
&lt;p&gt;Porém, descobri que, ao abrir o &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; com o atributo &lt;code&gt;open&lt;/code&gt;, o pseudo-elemento &lt;code&gt;::backdrop&lt;/code&gt; não é aplicado, o que pode ser um problema se você estiver usando um backdrop personalizado. Implementei o &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; no projeto &amp;quot;&lt;a href=&quot;https://neymar-jogou.onrender.com/&quot;&gt;Neymar Jogou?&lt;/a&gt;&amp;quot; e acabei descobrindo esse comportamento.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.dialog-modal::backdrop&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.65&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dialog&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dialog-modal&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Uma mensagem qualquer para exibir na modal&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dialog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Se usar o código acima em uma página HTML, vai notar que o &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; estará aberto, porém a formatação do &lt;code&gt;::backdrop&lt;/code&gt; não estará aplicada. Isso acontece porque o atributo &lt;code&gt;open&lt;/code&gt; abre o diálogo de forma não modal, e o backdrop só existe em diálogos modais.&lt;/p&gt;
&lt;p&gt;Dando uma fuçada no MDN, acabei encontrando essa nota de uso:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;O pseudo-elemento CSS &lt;code&gt;::backdrop&lt;/code&gt; pode ser usado para estilizar o plano de fundo de um elemento &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;, por exemplo, para escurecer o conteúdo inacessível enquanto uma janela de diálogo modal está aberta. Porém, o backdrop só é desenhado quando o diálogo é exibido com &lt;code&gt;HTMLDialogElement.showModal()&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Link: &lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/HTML/Reference/Elements/dialog#notas_de_uso&quot;&gt;Notas de uso do &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; no MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ou seja, se precisar usar o atributo &lt;code&gt;open&lt;/code&gt; para manter o &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; aberto sem necessidade de JavaScript, vai perder o backdrop personalizado. Caso precise do backdrop personalizado com o &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; já aberto ao carregar a página, por exemplo, vai precisar usar o método &lt;code&gt;HTMLDialogElement.showModal()&lt;/code&gt; e remover o atributo &lt;code&gt;open&lt;/code&gt; da marcação.&lt;/p&gt;
&lt;p&gt;Algo assim:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
  &lt;span class=&quot;token selector&quot;&gt;.dialog-modal::backdrop&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.65&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dialog&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dialog-modal&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Uma mensagem qualquer para exibir na modal&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dialog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; $dialog &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.dialog-modal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$dialog&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      $dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showModal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Resumindo: ao usar &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;, você enfrenta um &lt;em&gt;trade-off&lt;/em&gt; entre simplicidade e funcionalidade. O atributo &lt;code&gt;open&lt;/code&gt; oferece um diálogo sem JavaScript, mas perde o backdrop visual. O método &lt;code&gt;showModal()&lt;/code&gt; exige JS, mas traz a experiência completa. A escolha depende do seu caso de uso — se o backdrop é apenas estético, &lt;code&gt;open&lt;/code&gt; resolve; se é essencial para a usabilidade, &lt;code&gt;showModal()&lt;/code&gt; é o caminho.&lt;/p&gt;
</description>
        <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2026/07/backdrop-nao-funciona-com-atributo-open-dialog/</guid>
      </item>
      <item>
        <title>DefinitelyTyped Search: uma extensão Raycast para instalar @types</title>
        <link>https://blog.tcelestino.dev.br/2026/05/definitelytyped-search-extensao-raycast/</link>
        <description>&lt;p&gt;Depois de lançar minha &lt;a href=&quot;https://blog.tcelestino.dev.br/2026/03/minha-primeira-extensao-raycast/&quot;&gt;primeira extensão&lt;/a&gt; para o &lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt;, decidi criar mais uma. Se você não conhece o Raycast, ele é um lançador de aplicativos para macOS e Windows que permite acessar rapidamente aplicativos, arquivos e outras funcionalidades do sistema. Ele também suporta extensões, o que permite aos desenvolvedores criar suas próprias funcionalidades personalizadas utilizando ReactJS com TypeScript.&lt;/p&gt;
&lt;h2&gt;A extensão: DefinitelyTyped Search&lt;/h2&gt;
&lt;p&gt;Como muitos desenvolvedores que trabalham com &lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;TypeScript&lt;/a&gt;, sempre que preciso instalar um pacote (&lt;code&gt;npm i -S express&lt;/code&gt;, por exemplo), em muitos casos preciso instalar o pacote de tipos (&lt;code&gt;npm i -D @types/express&lt;/code&gt;, por exemplo) correspondente. Abrir o &lt;a href=&quot;https://www.npmjs.com/&quot;&gt;npmjs.com&lt;/a&gt; em busca de cada pacote de tipos pode ser um processo demorado, especialmente quando você não tem certeza do nome exato do pacote.&lt;/p&gt;
&lt;p&gt;Para facilitar esse processo, criei a extensão &amp;quot;&lt;a href=&quot;https://www.raycast.com/tcelestino/definitelytyped&quot;&gt;DefinitelyTyped Search&lt;/a&gt;&amp;quot; que permite pesquisar e instalar pacotes de tipos diretamente do Raycast.&lt;/p&gt;
&lt;p&gt;A extensão é simples de usar: basta digitar o nome do pacote que você deseja instalar, e a extensão irá mostrar os pacotes de tipos correspondentes disponíveis. Você pode então selecionar o pacote de tipos desejado e automaticamente o comando &lt;code&gt;npm install -D @types/nome-do-pacote&lt;/code&gt; é copiado para a área de transferência, pronto para colar no seu terminal.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/sdvtqGnm/raycast-definitelytyped.gif&quot; alt=&quot;Extensão DefinitelyTyped Search em ação&quot;&gt;
&lt;em&gt;Extensão em ação&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Além disso, você pode ver os detalhes do pacote de tipos selecionado no &lt;a href=&quot;https://www.npmjs.com/&quot;&gt;npmjs.com&lt;/a&gt;, &lt;a href=&quot;https://npmx.dev/&quot;&gt;npmx.dev&lt;/a&gt; ou no &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; antes de instalá-lo.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/cXZh9HJr/SCR-20260507-qrgr.png&quot; alt=&quot;Extensão DefinitelyTyped Search - Opções de visualização&quot;&gt;
&lt;em&gt;Opções de visualização&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Adicione aos favoritos&lt;/h2&gt;
&lt;p&gt;Para quem sempre precisa usar os mesmos &lt;code&gt;@types&lt;/code&gt;, a extensão permite adicioná-los aos favoritos. Assim, você pode acessar rapidamente os pacotes que usa com frequência sem precisar pesquisar por eles toda vez.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/wNBcMsGx/raycast-definitelytyped-favs.gif&quot; alt=&quot;Extensão DefinitelyTyped Search - Favoritos&quot;&gt;
&lt;em&gt;Adicionando um pacote de tipos aos favoritos&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A extensão está disponível para download na &lt;a href=&quot;https://www.raycast.com/tcelestino/definitelytyped&quot;&gt;Raycast Store&lt;/a&gt; e é compatível com macOS e Windows.&lt;/p&gt;
&lt;p&gt;Se você é um desenvolvedor que trabalha com TypeScript e utiliza o Raycast para aumentar sua produtividade, acredito que essa extensão pode ser uma ferramenta útil para agilizar seu fluxo de trabalho. Sinta-se à vontade para experimentar e enviar &lt;em&gt;feedbacks&lt;/em&gt; ou &lt;a href=&quot;https://github.com/raycast/extensions/issues/new?body=%3C!--%0APlease%20update%20the%20title%20above%20to%20consisely%20describe%20the%20feature%20request%0A--%3E%0A%0A%23%23%23%20Extension%0A%0Ahttps://www.raycast.com/tcelestino/definitelytyped%0A%0A%23%23%23%20Description%0A%0A%3C!--%0A%20%20Describe%20the%20feature%20and%20the%20current%20behavior/state.%0A--%3E%0A%0A%23%23%23%20Who%20will%20benefit%20from%20this%20feature?%0A%0A%23%23%23%20Anything%20else?%0A%0A%3C!--%0A%20%20Links?%20References?%20Anything%20that%20will%20give%20us%20more%20context!%0A%0A%20%20Tip:%20You%20can%20attach%20images%20or%20log%20files%20by%20clicking%20this%20area%20to%20highlight%20it%20and%20then%20dragging%20files%20in.%0A--%3E%0A&amp;amp;title=%5BDefinitelyTyped%5D%20...&amp;amp;template=extension_feature_request.yml&amp;amp;labels=extension,feature+request&amp;amp;extension-url=https://www.raycast.com/tcelestino/definitelytyped&quot;&gt;sugestões de melhorias&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2026/05/definitelytyped-search-extensao-raycast/</guid>
      </item>
      <item>
        <title>O que um especialista em box para banheiro me ensinou sobre a adoção real de IA</title>
        <link>https://blog.tcelestino.dev.br/2026/04/ia-fora-da-bolha-tecnologia/</link>
        <description>&lt;p&gt;&lt;em&gt;Originalmente postei no &lt;a href=&quot;https://manualdousuario.net/orbita&quot;&gt;Órbita&lt;/a&gt; esse relato. Caso queira conversar a respeito, fique à vontade: &lt;a href=&quot;https://manualdousuario.net/orbita-post/o-que-um-especialista-em-box-para-banheiro-me-ensinou-sobre-a-adocao-real-de-ia/&quot;&gt;https://manualdousuario.net/orbita-post/o-que-um-especialista-em-box-para-banheiro-me-ensinou-sobre-a-adocao-real-de-ia/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Na quarta-feira (22/04/2026), aconteceu uma situação que me abriu muito a mente sobre o uso de IA fora da bolha de tecnologia. Leio, assisto e converso com amigos e colegas sobre IA, agentes, etc., tudo mais voltado para o desenvolvimento de software e áreas afins. Seja para aumentar produtividade, &lt;em&gt;vibe coding&lt;/em&gt;, no final é muito voltado para tecnologia. Na quarta-feira, mais do que nunca, confirmei que as pessoas fora dessa bolha também estão usando, e usando muito bem as ferramentas disponíveis.&lt;/p&gt;
&lt;h2&gt;Contextualizando&lt;/h2&gt;
&lt;p&gt;Precisei ajustar o box do banheiro daqui de casa e contratei um técnico que encontrei via Google Maps. Tenho o hábito de conversar com os prestadores de serviços, sempre reforçando se estou atrapalhando o serviço, óbvio. Surgiu o papo sobre tecnologia. Geralmente começam perguntando o que faço da vida, etc. Bom, o técnico já me vem com esta: “faço algumas coisas com JS”. E como ele faz isso? Usando o ChatGPT. Não fiquei impressionado com o fato de ele usar a IA para gerar código — hoje qualquer pessoa pode fazer isso — mas o fato de ele saber o que é JavaScript, inclusive diferenciar backend e frontend, me impressionou. Todo esse conhecimento foi adquirido com o uso dessas ferramentas de IA. Um detalhe: ele nunca foi da área de tecnologia.&lt;/p&gt;
&lt;p&gt;A realidade é que, independentemente da qualidade do que essas ferramentas produzem, a maioria das automações para uso profissional não vai precisar escalar. Um especialista em boxes de banheiro não vai processar milhares de pedidos de orçamentos por hora, por exemplo.&lt;/p&gt;
&lt;h2&gt;O uso de ferramentas de IA&lt;/h2&gt;
&lt;p&gt;Assim como grande parte dos prestadores de serviços do país, ele usa o WhatsApp como &lt;a href=&quot;https://pt.wikipedia.org/wiki/Gest%C3%A3o_de_relacionamento_com_o_cliente&quot;&gt;CRM&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O fluxo dele atualmente é:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Capturar o lead, seja por telefone, WhatsApp, Google Ads, etc. Inclusive, usa o Gemini para extrair os números de múltiplas ligações.&lt;/li&gt;
&lt;li&gt;Enviar uma mensagem padrão (já salva no WhatsApp) de boas-vindas para o contato de forma manual.&lt;/li&gt;
&lt;li&gt;Solicitar um vídeo do problema do cliente, também com um texto salvo.&lt;/li&gt;
&lt;li&gt;Enviar o orçamento.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tem um detalhe no passo 4 que comento logo mais.&lt;/p&gt;
&lt;p&gt;Ele quer automatizar esses processos que realiza manualmente. Comentei sobre o uso da automação utilizando o &lt;a href=&quot;https://n8n.io/&quot;&gt;n8n&lt;/a&gt; (nunca usei, mas já ouvi falar). Ele não conhecia, mas ficou bem interessado e anotou para pesquisar depois. Engraçado que ele chegou a comentar sobre os custos de uso da API do WhatsApp, sabendo até como as empresas autorizadas pela Meta cobram (por mensagem enviada), o que para ele não faria sentido no momento.&lt;/p&gt;
&lt;h2&gt;Usando agentes&lt;/h2&gt;
&lt;p&gt;A cereja do bolo veio no final do serviço. Ao acompanhá-lo até a saída, ele me mostra um agente criado no ChatGPT que, a partir dos vídeos dos problemas que os clientes enviam e com as informações que ele forneceu, já consegue gerar o orçamento de forma automática. Assim, ele só copia e envia no WhatsApp. Ou seja, as pessoas (não estou generalizando, obviamente) estão antenadas e usando as ferramentas de IA, não só para pedir para escrever código JS, mas indo além.&lt;/p&gt;
&lt;p&gt;Fiquei de conversar com ele, até para ajudá-lo, porque vi que tem interesse genuíno no uso das ferramentas de IA. Inclusive, pensei em fazer uma permuta: ele me ensina a ajustar boxes de banheiro, eu ajudo-o a otimizar seu fluxo de trabalho, por que não?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nota: eu paguei pelo serviço&lt;/strong&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2026/04/ia-fora-da-bolha-tecnologia/</guid>
      </item>
      <item>
        <title>Minha primeira extensão para o Raycast</title>
        <link>https://blog.tcelestino.dev.br/2026/03/minha-primeira-extensao-raycast/</link>
        <description>&lt;p&gt;Para quem não conhece, o &lt;a href=&quot;https://raycast.com&quot;&gt;Raycast&lt;/a&gt; é um aplicativo similar ao Spotlight no macOS e a &amp;quot;Barra de Pesquisa&amp;quot; no Windows, só que com muito mais funcionalidades e aberto para o desenvolvimento de extensões que enriquecem o aplicativo. Essas extensões podem ser encontradas na &lt;a href=&quot;https://www.raycast.com/store&quot;&gt;Raycast Store&lt;/a&gt; e todas são totalmente gratuitas!&lt;/p&gt;
&lt;p&gt;Por ser uma aplicação em React.js com Typescript, alguém que tenha o conhecimento básico consegue desenvolver uma extensão e pensando nisso, me motivei a criar uma. Nesse texto, faço um pequeno relato sobre o processo.&lt;/p&gt;
&lt;h2&gt;Iniciando o desenvolvimento&lt;/h2&gt;
&lt;p&gt;Lendo a &lt;a href=&quot;https://www.raycast.com/developers&quot;&gt;documentação&lt;/a&gt;, que é super didática, já é possível entender o ecossistema de desenvolvimento do Raycast. Seguindo o &lt;a href=&quot;https://developers.raycast.com/basics/getting-started&quot;&gt;passo-a-passo&lt;/a&gt;, é possível ter a base para a extensão rapidamente.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/nqnzCJ7B/raycast-developer.png&quot; alt=&quot;Screenshot do Raycast no modo desenvolvedor&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Ideia para extensão&lt;/h2&gt;
&lt;p&gt;Sou um usuário frequente do &lt;a href=&quot;https://manualdousuario.net/orbita/&quot;&gt;Órbita&lt;/a&gt;, que vejo como o equivalente português do &lt;a href=&quot;https://news.ycombinator.com/&quot;&gt;HackerNews&lt;/a&gt;. O site é mantido pelo Rodrigo Ghedin do blog &lt;a href=&quot;https://manualdousuario.net&quot;&gt;Manual do Usuário&lt;/a&gt;, que inclusive, super recomendo acompanhar. Diferente de outros sites/blogs de tecnologia, a leveza e a forma como os debates acontecem por lá lembram muito a velha época em que a internet era menos &amp;quot;oito ou oitenta&amp;quot;.&lt;/p&gt;
&lt;p&gt;Como sempre estou acompanhando o conteúdo postado no Órbita, resolvi criar uma extensão que me mostrasse as últimas postagens do Órbita. Como o site usa a tecnologia RSS, os posts publicados por lá podem ser lidos em diferentes leitores (&lt;a href=&quot;https://feedly.com&quot;&gt;Feedly&lt;/a&gt;, &lt;a href=&quot;https://netnewswire.com/&quot;&gt;NetNewsWire&lt;/a&gt;, por exemplo), além de servir como fonte de dados para minha extensão.&lt;/p&gt;
&lt;p&gt;A ideia era muito simples:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ler o RSS do Órbita;&lt;/li&gt;
&lt;li&gt;Listar todos os últimos posts com o autor e data da postagem;&lt;/li&gt;
&lt;li&gt;Clicando no título, abrir a página da postagem para leitura em detalhes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Início da implementação&lt;/h2&gt;
&lt;p&gt;Com a regra definida, iniciei a implementação e em poucas horas já tinha a extensão funcional rodando localmente. Caso queira ver o código, está nesse &lt;a href=&quot;https://github.com/tcelestino/orbita-raycast-extension&quot;&gt;repositório&lt;/a&gt; no GitHub.&lt;/p&gt;
&lt;p&gt;Mais um detalhe. Antes de enviar a extensão para revisão e publicação na Raycast Store, tinha que pedir autorização ao Rodrigo para o uso do nome Órbita e também do Manual do Usuário. Fiz o contato por email informando sobre a minha ideia e se podia dar sequência a publicá-la na loja oficial do aplicativo. A autorização veio sem problemas. No dia &lt;strong&gt;06/12/2025&lt;/strong&gt; abri o &lt;a href=&quot;https://github.com/raycast/extensions/pull/23472&quot;&gt;PR&lt;/a&gt; para revisão.&lt;/p&gt;
&lt;h2&gt;Da revisão à publicação&lt;/h2&gt;
&lt;p&gt;O processo de revisão do Raycast é gerido de forma híbrida. Eles possuem um &lt;em&gt;bot&lt;/em&gt; no GitHub que faz uma análise do código, adicionando comentários sobre as boas práticas para o uso das APIs, garantindo que as extensões sigam as diretrizes de desenvolvimento. Além do &lt;em&gt;bot&lt;/em&gt;, existe o revisor humano, que não foca tanto no código, mas sim se as extensões estão seguindo &lt;em&gt;guideline&lt;/em&gt; do aplicativo. Foi nesse processo que tive o maior &amp;quot;entrave&amp;quot;, apesar de entender que pelo tamanho do projeto e a quantidade enorme de &lt;em&gt;issues&lt;/em&gt; abertas, o trabalho humano deve ser bem exaustivo, independentemente da automação.&lt;/p&gt;
&lt;p&gt;Em relação ao código, houve poucas modificações. O ponto crucial envolveu o nome da extensão. Inicialmente, a ideia era manter a associação do Órbita ao Manual do Usuário, já que hoje faz parte do domínio do blog, porém o Raycast só aceita &lt;a href=&quot;https://github.com/raycast/extensions/pull/23472#pullrequestreview-3710545011&quot;&gt;extensões nomeadas em inglês&lt;/a&gt;, então ter o nome como &amp;quot;Órbita - Manual do Usuário&amp;quot; não era &amp;quot;permitido&amp;quot;. O &lt;a href=&quot;https://github.com/pernielsentikaer&quot;&gt;@pernielsentikaer&lt;/a&gt;, que por sinal foi muito solícito, trouxe esse &amp;quot;impasse&amp;quot; para a discussão. Procurei o Ghedin para informar sobre a situação e se seria um problema &amp;quot;desvincular&amp;quot; o Órbita do Manual do Usuário e o mesmo não viu problema. Até um nome genérico foi sugerido, mas chegamos à conclusão de que por se tratar de um nome próprio, não faria sentido alterar.&lt;/p&gt;
&lt;p&gt;No final, removi todas as referências ao Manual do Usuário e solicitei uma nova revisão. No dia &lt;strong&gt;16/03/2026&lt;/strong&gt;, 3 meses depois da abertura do PR, finalmente a extensão foi aprovada, &lt;a href=&quot;https://github.com/raycast/extensions/pull/23472#pullrequestreview-3953818121&quot;&gt;mergeda&lt;/a&gt; e oficialmente publicada na Raycast Store: &lt;a href=&quot;https://www.raycast.com/tcelestino/orbita&quot;&gt;&lt;strong&gt;https://www.raycast.com/tcelestino/orbita&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O resultado final foi esse:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://files.raycast.com/pesfbxxiabexbazum0khwxppgl3g&quot; alt=&quot;screenshot da extensão do Órbita no Raycast&quot;&gt;
&lt;em&gt;Baixe o Raycast e use a extensão do &lt;a href=&quot;https://www.raycast.com/tcelestino/orbita&quot;&gt;Órbita&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Apesar do tempo de revisão e publicação, tive uma comunicação bem saudável com o &lt;a href=&quot;https://github.com/pernielsentikaer&quot;&gt;@pernielsentikaer&lt;/a&gt;, que sempre trouxe de forma pertinente o que precisava ser alterado.&lt;/p&gt;
&lt;p&gt;Saber que agora posso acessar o Órbita a partir do aplicativo com o qual mais interajo, vai facilitar e ajudar ainda mais a participar da comunidade.&lt;/p&gt;
&lt;p&gt;Deixo aqui meus agradecimentos ao Rodrigo Ghedin, que apoiou a ideia e inclusive me disponibilizou a logo do Manual do Usuário para definir como ícone da extensão.&lt;/p&gt;
&lt;p&gt;Já estou pensando em mais duas extensões que quero entregar ainda esse ano. É provável que venha um outro post sobre elas no futuro...&lt;/p&gt;
</description>
        <pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2026/03/minha-primeira-extensao-raycast/</guid>
      </item>
      <item>
        <title>Como ativar o BC Protege+</title>
        <link>https://blog.tcelestino.dev.br/2026/03/como-ativar-bc-protege/</link>
        <description>&lt;p&gt;O &lt;a href=&quot;https://www.bcb.gov.br/meubc/bcprotege&quot;&gt;BC Protege+&lt;/a&gt; é um serviço gratuito do Banco Central do Brasil que bloqueia a abertura de contas em seu CPF ou CNPJ. Quando você ativa essa proteção, qualquer tentativa de alguém abrir uma conta usando seus dados será automaticamente negada. Desde dezembro de 2025, quando foi lançado, já bloqueou &lt;a href=&quot;https://tecnoblog.net/noticias/bc-protege-ja-defende-1-milhao-de-pessoas-contra-contas-bancarias-falsas/&quot;&gt;1 milhão de contas fraudulentas&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Se você não pretende abrir novas contas em breve, ative essa proteção. Veja como:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Faça o login no &lt;a href=&quot;https://www.bcb.gov.br/meubc&quot;&gt;Meu BC&lt;/a&gt;. Você deve usar sua conta Gov.br no &lt;a href=&quot;https://www.gov.br/governodigital/pt-br/identidade/conta-gov-br/niveis-da-conta-govbr&quot;&gt;nível prata ou ouro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Clique em &amp;quot;BC Protege+&amp;quot;.&lt;/li&gt;
&lt;li&gt;Marque a opção &amp;quot;Proteção ativada&amp;quot;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Se precisar abrir uma conta no futuro, desative a proteção seguindo os mesmos passos e desmarcando &amp;quot;Proteção ativada&amp;quot;.&lt;/p&gt;
</description>
        <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2026/03/como-ativar-bc-protege/</guid>
      </item>
      <item>
        <title>As 10 extensões essenciais que uso no Firefox</title>
        <link>https://blog.tcelestino.dev.br/2026/02/10-extensoes-firefox/</link>
        <description>&lt;p&gt;Depois de publicar sobre &lt;a href=&quot;https://blog.tcelestino.dev.br/2026/01/meus-apps-essenciais-em-2025/&quot;&gt;meus aplicativos essenciais em 2025&lt;/a&gt;, algumas pessoas me perguntaram quais extensões uso no Firefox. Como a grande maioria das pessoas que conheço usa o Google Chrome, resolvi compartilhar as dez extensões que considero essenciais no meu dia a dia.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/ublock-origin/&quot;&gt;uBlock Origin&lt;/a&gt;: essencial nos dias de hoje com a quantidade de scripts que muitos sites usam para rastrear o usuário. Desabilito para alguns sites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/bitwarden-password-manager/&quot;&gt;Bitwarden&lt;/a&gt;: gerenciador de senhas multiplataforma (tem versão para iOS, Android, Windows, Linux, terminal...). Uso a versão gratuita que atende bem para a grande maioria dos usuários.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/enhancer-for-youtube/&quot;&gt;Enhancer for YouTube&lt;/a&gt;: reduz distrações no YouTube, como comentários, e traz melhorias na interface e no player.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/linguist-translator/&quot;&gt;Linguist - web pages translator&lt;/a&gt;: uso para traduzir páginas automaticamente. O Firefox tem recurso nativo, mas ele se baseia no idioma do sistema operacional — que no meu caso é inglês. Para traduzir para pt-BR pelo recurso nativo, são necessários vários passos.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raindrop.io/&quot;&gt;Raindrop&lt;/a&gt;: sinto falta da simplicidade do del.icio.us, mas com o Raindrop consigo automatizar utilizando o &lt;a href=&quot;https://ifttt.com/&quot;&gt;IFTTT&lt;/a&gt;. Por exemplo: os vídeos que dou like no YouTube, são adicionados automaticamente no Raindrop.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/notion-web-clipper/&quot;&gt;Notion Web Clipper&lt;/a&gt;: uso o Notion como um banco de dados, então tenho uma lista de artigos para ler posteriormente, artigos que já li e que posso querer rever, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/marreta/&quot;&gt;Marreta&lt;/a&gt;: extensão para remover paywall de diversos sites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/multi-account-containers/&quot;&gt;Firefox Multi-Account Containers&lt;/a&gt;: uso para isolar os cookies entre serviços que utilizo.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/gesturefy/&quot;&gt;Gesturefy&lt;/a&gt;: cria ações para o Firefox usando o mouse. Exemplo: mover o mouse para baixo segurando o botão direito fecha a aba ativa.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pt-BR/firefox/addon/redirector/&quot;&gt;Redirector&lt;/a&gt;: uso para redirecionar automaticamente alguns sites para suas versões alternativas. Por exemplo, todo link do x.com é redirecionado para o nitter.net.&lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2026/02/10-extensoes-firefox/</guid>
      </item>
      <item>
        <title>Meus aplicativos essenciais em 2025</title>
        <link>https://blog.tcelestino.dev.br/2026/01/meus-apps-essenciais-em-2025/</link>
        <description>&lt;p&gt;Acabei esquecendo de compartilhar minha seleção de aplicativos essenciais para 2025, assim como &lt;a href=&quot;https://blog.tcelestino.dev.br/2024/12/meus-apps-essenciais-em-2024/&quot;&gt;fiz&lt;/a&gt; no ano passado. Como estamos no início do ano, acredito ser ainda válido compartilhar.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Launchers&lt;/strong&gt;: &lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt; (macOS) e &lt;a href=&quot;https://ulauncher.io/&quot;&gt;Ulauncher&lt;/a&gt; (Linux)&lt;/li&gt;
&lt;li&gt;📧 &lt;strong&gt;Cliente de email:&lt;/strong&gt; &lt;a href=&quot;https://gmail.com&quot;&gt;Gmail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Bloco de Notas&lt;/strong&gt;: &lt;a href=&quot;https://bear.app/&quot;&gt;Bear&lt;/a&gt; (macOS/iOS)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Lista de tarefas&lt;/strong&gt;: &lt;a href=&quot;https://todoist.com/pt-BR&quot;&gt;Todoist&lt;/a&gt; (macOS/iOS/Linux)&lt;/li&gt;
&lt;li&gt;📅 &lt;strong&gt;Calendário&lt;/strong&gt;: Apple Calendar&lt;/li&gt;
&lt;li&gt;☁️ &lt;strong&gt;Cloud Storage&lt;/strong&gt;: &lt;a href=&quot;https://workspace.google.com/products/drive/&quot;&gt;Google Drive&lt;/a&gt; / &lt;a href=&quot;https://www.icloud.com/&quot;&gt;iCloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📷 &lt;strong&gt;Câmera:&lt;/strong&gt; Apple Camera (iOS)&lt;/li&gt;
&lt;li&gt;📰 &lt;strong&gt;RSS:&lt;/strong&gt; &lt;a href=&quot;https://netnewswire.com/&quot;&gt;NetNewsWire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;👥 &lt;strong&gt;Lista de Contato:&lt;/strong&gt; Apple Contact&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Navegador:&lt;/strong&gt; &lt;a href=&quot;https://getfirefox.com&quot;&gt;Firefox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Chat:&lt;/strong&gt; &lt;a href=&quot;https://whatsapp.com/&quot;&gt;WhatsApp&lt;/a&gt; e &lt;a href=&quot;https://telegram.org/&quot;&gt;Telegram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🔖 &lt;strong&gt;Favoritos:&lt;/strong&gt; &lt;a href=&quot;https://raindrop.io/&quot;&gt;Raindrop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Lista de leitura:&lt;/strong&gt; &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Suite de escritório:&lt;/strong&gt; Google Workspace/Microsoft Office (faculdade)&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Financeiro:&lt;/strong&gt; &lt;a href=&quot;https://www.google.com/sheets/about/&quot;&gt;Google Sheets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🎵 &lt;strong&gt;Música:&lt;/strong&gt; &lt;a href=&quot;https://www.deezer.com/&quot;&gt;Deezer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🎧 &lt;strong&gt;Podcasts:&lt;/strong&gt; &lt;a href=&quot;https://overcast.fm/&quot;&gt;Overcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Gerenciador de senhas:&lt;/strong&gt; &lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Editor de código:&lt;/strong&gt; &lt;a href=&quot;https://cursor.com/&quot;&gt;Cursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Terminal:&lt;/strong&gt; &lt;a href=&quot;https://ghostty.org/&quot;&gt;Ghostty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Assistente IA:&lt;/strong&gt; &lt;a href=&quot;https://claude.ai/login&quot;&gt;Claude&lt;/a&gt; / &lt;a href=&quot;https://gemini.google.com/&quot;&gt;Gemini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;👨‍💻 &lt;strong&gt;Git:&lt;/strong&gt; &lt;a href=&quot;https://github.com/&quot;&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Troquei poucos apps essenciais em 2025, mas que me trouxeram melhorias na produtividade. Alguns destaques:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Voltei para o Firefox como meu navegador principal, já que o Floorp apresentou um bug com a extensão do Bitwarden e estava impossível de usá-lo.&lt;/li&gt;
&lt;li&gt;Conheci o NetNewsWire e apesar de não ter uma versão web, o fato de poder conectar ao Feedly ou poder assinar RSS de blogs no modo offline é uma grande vantagem.&lt;/li&gt;
&lt;li&gt;Com toda essa discussão de como usar IA para escrever código, acabei me adaptando bem ao Cursor como meu editor de código, destacando que o autocomplete é muito mais inteligente que o Github Copilot no VSCode.&lt;/li&gt;
&lt;li&gt;Troquei o Wrap pelo Ghostty por ser um terminal mais leve e minimalista. O Warp está indo por outro caminho, o que para mim deixou de ser um terminal funcional.&lt;/li&gt;
&lt;li&gt;Passei a usar o Gemini como uma outra fonte de IA para tarefas que não envolvem código, impressionante o quanto a Google evoluiu. Para tarefas que envolvem código, mantive o Claude, inclusive usando o Claude Code com o Sonnet e o Opus.&lt;/li&gt;
&lt;li&gt;Deixei de usar o Halide como app de câmera para voltar a usar o Apple Camera. Notei que não estava usando o Halide de forma completa, o que não justificava renovar a assinatura por mais um ano. O Apple Camera vem me atendendo muito bem.&lt;/li&gt;
&lt;li&gt;No meio do ano, voltei para a faculdade para terminar a graduação e obrigatoriamente precisei começar a usar a suíte Microsoft Office para atender os requisitos da faculdade. O bom é que não pago nada por isso.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Que venha 2026!&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Listas anteriores&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.tcelestino.dev.br/2024/12/meus-apps-essenciais-em-2024/&quot;&gt;2024&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2026/01/meus-apps-essenciais-em-2025/</guid>
      </item>
      <item>
        <title>Retrospectiva 2025</title>
        <link>https://blog.tcelestino.dev.br/2025/12/retrospectiva-2025/</link>
        <description>&lt;h2&gt;Janeiro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Início em um novo emprego em uma empresa em recuperação judicial do ramo de compra de viagens. Fácil de procurar qual empresa foi!&lt;/li&gt;
&lt;li&gt;Voltei a escrever no blog com mais frequência. Foram 14 postagens (contando com essa) no total.&lt;/li&gt;
&lt;li&gt;Oficialmente liberado para as atividades físicas depois da cirurgia no dedo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fevereiro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Voltei às atividades físicas (musculação e treino funcional).&lt;/li&gt;
&lt;li&gt;Demitido da empresa em recuperação judicial. Fiquei de escrever sobre minha experiência, mas no final nem compensou a perda do tempo.&lt;/li&gt;
&lt;li&gt;Depois de 10 anos, troquei de máquina de lavar, a minha LG durou o quanto podia. Troquei por uma Samsung.&lt;/li&gt;
&lt;li&gt;Consegui ler 4 livros no mês&lt;/li&gt;
&lt;li&gt;Importação Portugal &amp;gt; Brasil entregue depois de 3 meses estressantes com a UPS. Não recomendo usar essa empresa para importação.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Março&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mais uma vez saindo no bloco afro Filhos de Gandhy, dessa vez acompanhado com meu irmão.&lt;/li&gt;
&lt;li&gt;Obtive meu CNPJ (TC Tech).&lt;/li&gt;
&lt;li&gt;Li apenas 1 livro no mês. :/&lt;/li&gt;
&lt;li&gt;Criei um projeto no Github mostrando exemplo de diferentes design patterns. &lt;a href=&quot;https://github.com/tcelestino/aprendendo-design-patterns&quot;&gt;github.com/tcelestino/aprendendo-design-patterns&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Abril&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Voltei para o mercado de trabalho para atuar em uma empresa de pagamento.&lt;/li&gt;
&lt;li&gt;Conhecendo e usando pela primeira vez o &lt;a href=&quot;https://nestjs.com/&quot;&gt;NestJS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pausa do Linkedin, estava passando muito tempo por lá.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Maio&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Primeira Nota Fiscal gerada pela TC Tech.&lt;/li&gt;
&lt;li&gt;Visita do Aurelio para correr a Corrida do Leão e resenhar depois da volta dele para Goiânia.&lt;/li&gt;
&lt;li&gt;Comemoração entrega do doutorado da Verena.&lt;/li&gt;
&lt;li&gt;Não li nenhum livro. 😞&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Junho&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Comecei a acordar às 5h da manhã, sem seguir nenhum &amp;quot;guru&amp;quot; de internet.&lt;/li&gt;
&lt;li&gt;Segunda corrida do ano: Corrida Ecológica de Lauro de Freitas.&lt;/li&gt;
&lt;li&gt;Mais um contrato assinado pela TC Tech. Aproveitei e fiz o plano de saúde.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Julho&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Comemoração do meu aniversário fazendo aula funcional na praia.&lt;/li&gt;
&lt;li&gt;Voltando a faculdade para terminar a graduação. Faltam poucos semestres para terminar.&lt;/li&gt;
&lt;li&gt;Visita a Copa do Mundo de Robôs em Salvador.&lt;/li&gt;
&lt;li&gt;Aprendendo sobre &lt;a href=&quot;https://www.keycloak.org/&quot;&gt;Keycloak&lt;/a&gt;. Desenvolvi um módulo para o NestJS para usar o Keycloak como provider de autenticação.&lt;/li&gt;
&lt;li&gt;Viagem para SP - a primeira do ano.
&lt;ul&gt;
&lt;li&gt;Encontro com os amigos de SP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Comprei o Macbook Pro M4, já que meu Macbook Air já não suportava rodar vários containers Docker ao mesmo tempo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Agosto&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Comprei o AirPods 4 com cancelamento de ruídos. O meu AirPods 3 já não conseguia manter a carga de bateria por muito tempo.&lt;/li&gt;
&lt;li&gt;Voltei a ler o livro “1984”, do George Orwell. Ainda não consegui terminar.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Setembro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Entrega dos primeiros trabalhos da faculdade.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No resultado do checkup anual descobri que estava com a insulina alta (no limite) e meus rins estavam trabalhando muito mas não estavam sendo compensados com água. Tirar creatina e reduzir o consumo de doces. :/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Viagens para o interior da Bahia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Santo Antonio de Jesus&lt;/li&gt;
&lt;li&gt;Alagoinhas&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Primeiras provas online da faculdade realizadas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Assinei o Claude da Anthropic. Me surpreendi como o &lt;a href=&quot;https://claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt; está me ajudando na minha produtividade.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Outubro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Voltando a correr com mais intensidade.&lt;/li&gt;
&lt;li&gt;Comemoração do aniversário de minha mãe, mandamos uma cesta de café da manhã com algumas guloseimas.&lt;/li&gt;
&lt;li&gt;Testando o &lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt; como editor de código. Curti, mas ainda prefiro usar o &lt;a href=&quot;https://cursor.com/&quot;&gt;Cursor&lt;/a&gt; e seu autocomplete mais inteligente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Novembro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fui ver a peça “Aleluia” com Franklin Menezes. Tinha anos que não ia ao teatro.&lt;/li&gt;
&lt;li&gt;Visitando Goiânia pela primeira vez.&lt;/li&gt;
&lt;li&gt;Retorno ao médico ortopedista para confirmar o sucesso da cirurgia no dedo.&lt;/li&gt;
&lt;li&gt;Comprei um novo carro: Fiat Fastback.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Dezembro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fui ver meu time do coração (Esporte Clube Vitória) não ir para a Série B no Campeonato Brasileiro.&lt;/li&gt;
&lt;li&gt;Fechei o mês com 15 corridas.&lt;/li&gt;
&lt;li&gt;Passei em todas as matérias da faculdade, com a média em quase todas as matérias na casa dos 9.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Metas&lt;/h2&gt;
&lt;p&gt;Algumas metas que resolvi anotar esse ano:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bebi 707,05 litros de água.&lt;/li&gt;
&lt;li&gt;Corri 408,93km em 89 corridas.&lt;/li&gt;
&lt;li&gt;Horas totais da corrida: 44:55:55.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Leia outras retrospectivas:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.tcelestino.dev.br/2024/12/retrospectiva-2024/&quot;&gt;2024&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/12/retrospectiva-2025/</guid>
      </item>
      <item>
        <title>Habilitando o split view no Firefox</title>
        <link>https://blog.tcelestino.dev.br/2025/12/firefox-splitview/</link>
        <description>&lt;p&gt;Se estiver usando a última versão (146) do &lt;a href=&quot;https://www.firefox.com/&quot;&gt;Firefox&lt;/a&gt;, já é possível habilitar a funcionalidade de split view (dividir a tela em uma única janela). Essa funcionalidade é útil para quem precisa visualizar duas páginas ao mesmo tempo, como por exemplo, comparar duas páginas de um site ou comparar duas páginas de um documento.&lt;/p&gt;
&lt;h2&gt;Como habilitar o split view no Firefox&lt;/h2&gt;
&lt;p&gt;Por enquanto, essa funcionalidade está disponível apenas via &lt;code&gt;about:config&lt;/code&gt;, mas o que não impede de você testar.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abra o Firefox e vá para &lt;code&gt;about:config&lt;/code&gt;. Aceite o risco e clique em &lt;em&gt;&amp;quot;Accept the Risk and Continue&amp;quot;&lt;/em&gt; (Aceitar o Risco e Continuar).&lt;/li&gt;
&lt;li&gt;Localize a configuração &lt;code&gt;browser.tabs.splitView.enabled&lt;/code&gt; e mude o valor para &lt;code&gt;true&lt;/code&gt;. Não vai ser necessário reiniciar o Firefox para aplicar a configuração.&lt;/li&gt;
&lt;li&gt;Para usar o split view, basta clicar com o botão direito do mouse em uma aba e selecionar &amp;quot;Add Split View&amp;quot; (Adicionar Visualização Dividida, em português brasileiro literal).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/DPk8nX8H/SCR-20251224-labh.png&quot; alt=&quot;Habilitando o split view no Firefox&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://i.ibb.co/KxtmfbPJ/SCR-20251224-laed.png&quot;&gt;&lt;img src=&quot;https://i.ibb.co/KxtmfbPJ/SCR-20251224-laed.png&quot; alt=&quot;Screenshot do split view no Firefox&quot;&gt;&lt;/a&gt;
&lt;em&gt;Clique na imagem para ampliar&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Referências&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.omgubuntu.co.uk/2025/12/enable-firefox-split-view-feature&quot;&gt;OMG! Ubuntu! - Firefox is Adding Split View for Tabs, Here’s How to Enable It&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 24 Dec 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/12/firefox-splitview/</guid>
      </item>
      <item>
        <title>Como depreciar funções/métodos no Node.js</title>
        <link>https://blog.tcelestino.dev.br/2025/12/como-depreciar-funcoes-metodos-no-nodejs/</link>
        <description>&lt;p&gt;Estava lendo o post &amp;quot;&lt;a href=&quot;https://www.stefanjudis.com/today-i-learned/deprecate-method-in-node-js/&quot;&gt;How to &amp;quot;officially&amp;quot; deprecate methods with Node.js utilities&lt;/a&gt;&amp;quot; do Stefan Judis (recomendo a leitura do blog dele) e achei interessante compartilhar essa dica rápida para quem escreve código utilizando Node.js e precisa documentar que um método/função foi depreciado.&lt;/p&gt;
&lt;h2&gt;O método que conhecia até hoje: JSDoc&lt;/h2&gt;
&lt;p&gt;Muitas vezes precisamos depreciar métodos/funções e uma das formas mais comuns era utilizando o JSDoc para documentar o método/função como obsoleto. Se você não conhece o &lt;a href=&quot;https://jsdoc.app/&quot;&gt;JSDoc&lt;/a&gt;, ele é uma especificação de documentação para JavaScript que permite documentar o código de forma estruturada e consistente. Funciona tanto no JavaScript quanto no TypeScript.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Executa um console.log com o texto &#39;foo&#39;.
 * @deprecated Utilize a função `bar()` em seu lugar. Este método será removido em uma versão futura.
 * @returns {void}
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;foo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No seu editor de código, teremos uma mensagem de aviso quando passar o mouse sobre o método/função.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/VpbSWCWD/SCR-20251125-pvgr.png&quot; alt=&quot;Exemplo método depreciado com JSDoc/TSDoc em uma IDE&quot;&gt;
&lt;em&gt;exemplo no VS Code&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Para isso, usamos a marcação &lt;code&gt;@deprecated&lt;/code&gt; para indicar que o método foi depreciado, exibindo uma mensagem de aviso na sua IDE.&lt;/p&gt;
&lt;h2&gt;Uma nova abordagem mais prática: &lt;code&gt;util.deprecate&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Acabei descobrindo no artigo do Stefan Judis que é possível utilizar a API &lt;a href=&quot;https://nodejs.org/api/util.html#utildeprecatefn-msg-code-options&quot;&gt;util.deprecate&lt;/a&gt; para depreciar um método/função.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; deprecate &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;node:util&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; foo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;deprecate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Função obsoleta&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Função obsoleta. Utilize fooBar() em vez de foo()&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Se rodar o código acima usando o Node.js, você verá a seguinte resposta:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/nq7ftzGH/SCR-20251125-pywd.png&quot; alt=&quot;Exemplo método depreciado com util.deprecate&quot;&gt;
&lt;em&gt;exemplo da mensagem depreciada no terminal ao executar o código Node.js&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Com a API &lt;code&gt;util.deprecate&lt;/code&gt;, podemos passar uma mensagem para o usuário indicando qual é a migração recomendada quando o método/função for executado em tempo de execução.&lt;/p&gt;
&lt;h2&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;De maneira simples, conseguimos depreciar um método/função utilizando uma API oficial do Node.js sem a necessidade de usar bibliotecas externas. O mais interessante é que é possível fazer esse tipo de abordagem há &lt;a href=&quot;https://nodejs.org/docs/latest-v4.x/api/util.html#util_util_deprecate_function_string&quot;&gt;muito tempo&lt;/a&gt;. Vale lembrar que a API &lt;code&gt;util.deprecate&lt;/code&gt; é uma funcionalidade oficial do Node.js, não do JavaScript.&lt;/p&gt;
</description>
        <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/12/como-depreciar-funcoes-metodos-no-nodejs/</guid>
      </item>
      <item>
        <title>Habilitando RSS no 11ty</title>
        <link>https://blog.tcelestino.dev.br/2025/11/habilitando-rss-11yt/</link>
        <description>&lt;p&gt;Continuando com as melhorias do blog, finalmente habilitei o feed RSS. Para isso, usei o plugin oficial do Eleventy (11ty): &lt;a href=&quot;https://www.11ty.dev/docs/plugins/rss/&quot;&gt;@11ty/eleventy-plugin-rss&lt;/a&gt;. Como muita gente usa o 11ty, resolvi compartilhar os passos para você habilitar o feed RSS no seu blog ou site.&lt;/p&gt;
&lt;h2&gt;O que é RSS?&lt;/h2&gt;
&lt;p&gt;RSS é uma forma de acompanhar atualizações de sites sem precisar visitá-los diretamente. Funciona assim: o site disponibiliza um arquivo com as últimas publicações, e você usa um leitor de RSS para receber essas atualizações automaticamente.&lt;/p&gt;
&lt;p&gt;É como assinar um canal de notícias. Sempre que o site publicar algo novo, você recebe no seu leitor de RSS.&lt;/p&gt;
&lt;p&gt;Como leitor assíduo de vários blogs usando RSS, não fazia sentido meu blog não ter esse recurso. Além disso, o RSS facilita a indexação em diretórios de blogs.&lt;/p&gt;
&lt;h2&gt;Instalando o plugin&lt;/h2&gt;
&lt;p&gt;O 11ty tem um plugin oficial para RSS. Instale usando o gerenciador de pacotes que você utiliza:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; @11ty/eleventy-plugin-rss&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ou&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; @11ty/eleventy-plugin-rss&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Duas formas de configurar&lt;/h3&gt;
&lt;p&gt;O plugin oferece duas opções:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Automática&lt;/strong&gt;: configurar direto no &lt;code&gt;eleventy.config.js&lt;/code&gt; e o feed é gerado automaticamente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual&lt;/strong&gt;: criar um arquivo &lt;code&gt;feed.njk&lt;/code&gt; com o template customizado&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Optei pela segunda opção porque precisava de algo rápido e a versão automática apresentou problemas no meu blog. No seu caso, pode funcionar diferente.&lt;/p&gt;
&lt;h2&gt;Criando o template do feed&lt;/h2&gt;
&lt;p&gt;Crie o arquivo &lt;code&gt;feed.njk&lt;/code&gt; na pasta dos seus arquivos. No meu caso, criei em &lt;code&gt;src/feed.njk&lt;/code&gt;. Esse arquivo é o template que gera o feed RSS.&lt;/p&gt;
&lt;p&gt;O plugin suporta vários formatos (RSS, JSON, Atom). Escolhi RSS:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/tcelestino/c63389b8713637252f44714109486bfc.js&quot;&gt;&lt;/script&gt;
&lt;h3&gt;Entendendo as configurações&lt;/h3&gt;
&lt;p&gt;O template precisa de algumas informações básicas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;title&lt;/strong&gt;: título do blog&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;description&lt;/strong&gt;: descrição do blog&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;language&lt;/strong&gt;: idioma (ex: pt-BR)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;base&lt;/strong&gt;: URL completa do blog&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;author&lt;/strong&gt;: nome do autor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;permalink&lt;/strong&gt;: onde o feed será gerado (geralmente &lt;code&gt;/feed.xml&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No meu blog, os posts ficam em &lt;code&gt;src/posts/**/*.md&lt;/code&gt;, então uso &lt;code&gt;collections.posts&lt;/code&gt;. Se sua estrutura for diferente, ajuste conforme sua coleção de posts.&lt;/p&gt;
&lt;p&gt;Outros formatos de template estão na &lt;a href=&quot;https://www.11ty.dev/docs/plugins/rss/#sample-feed-templates&quot;&gt;documentação oficial&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Ativando o plugin no Eleventy&lt;/h2&gt;
&lt;p&gt;Agora adicione o plugin no arquivo &lt;code&gt;eleventy.config.js&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Se usar CommonJS:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; feedPlugin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;@11ty/eleventy-plugin-rss&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addPlugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;feedPlugin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Se usar ESM:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; feedPlugin &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@11ty/eleventy-plugin-rss&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addPlugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;feedPlugin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Testando&lt;/h2&gt;
&lt;p&gt;Pronto. Inicie seu blog e acesse &lt;code&gt;http://localhost:8080/feed.xml&lt;/code&gt; para verificar se o feed RSS foi gerado corretamente.&lt;/p&gt;
</description>
        <pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/11/habilitando-rss-11yt/</guid>
      </item>
      <item>
        <title>Desabilitando recursos de IA no Firefox</title>
        <link>https://blog.tcelestino.dev.br/2025/10/disabilitando-ai-no-firefox/</link>
        <description>&lt;p&gt;Recentemente houve o boom de navegadores com IA, como o ChatGPT Atlas, o Perplexity Comet, o Microsoft Edge, entre outros que devem surgir no futuro. O &lt;a href=&quot;https://www.firefox.com/pt-BR/&quot;&gt;Firefox&lt;/a&gt;, nas últimas atualizações, liberou a funcionalidade de usar os chatbots de IA, como o Claude, ChatGPT, Gemini, Mistral e o Copilot no navegador.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/F4bsxsr7/firefox-ia-chatbot.png&quot; alt=&quot;Chatbot Claude no Firefox&quot;&gt;
&lt;em&gt;Chatbot Claude no Firefox&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Não chega a ser um &amp;quot;agente&amp;quot; como os navegadores citados, mas é uma funcionalidade que para mim tem sido bem útil, seja para tirar dúvidas, traduzir textos em outros idiomas e realizar outras tarefas. Existem muitas preocupações com relação a IA em navegadores, seja por descaracterizar a forma de navegar pela internet e também por abrir diversas &lt;a href=&quot;https://venturebeat.com/ai/when-your-ai-browser-becomes-your-enemy-the-comet-security-disaster&quot;&gt;brechas de segurança&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Por sorte, no Firefox é possível desabilitar os recursos de IA, seguindo os passos abaixo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Acesse &lt;code&gt;about:config&lt;/code&gt; na barra de endereço do Firefox&lt;/li&gt;
&lt;li&gt;Aceite o risco e clique em &lt;em&gt;&amp;quot;Accept the Risk and Continue&amp;quot;&lt;/em&gt; (Aceitar o Risco e Continuar)&lt;/li&gt;
&lt;li&gt;Localize a configuração &lt;code&gt;browser.ml.enable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mude o valor de &lt;code&gt;true&lt;/code&gt; para &lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Com essa configuração, todos os recursos de IA serão desabilitados.&lt;/p&gt;
&lt;p&gt;Existem outras configurações caso não queira desabilitar todos os recursos de IA de uma só vez, veja a tabela abaixo:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuração&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.chat.enabled&lt;/td&gt;
&lt;td&gt;Habilita a integração do chatbot IA.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.chat.sidebar&lt;/td&gt;
&lt;td&gt;Exibe o painel de chat IA na barra lateral.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.chat.shortcuts&lt;/td&gt;
&lt;td&gt;Permite acionar o chat a partir de texto selecionado ou atalhos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.chat.page&lt;/td&gt;
&lt;td&gt;Exibe o menu de chat na página quando você seleciona texto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.chat.page.footerBadge&lt;/td&gt;
&lt;td&gt;Exibe o badge flutuante na parte inferior da página.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.chat.page.menuBadge&lt;/td&gt;
&lt;td&gt;Exibe o badge &lt;em&gt;&amp;quot;Ask AI&amp;quot;&lt;/em&gt; no menu da página.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.chat.menu&lt;/td&gt;
&lt;td&gt;Adiciona &lt;em&gt;&amp;quot;Chat about this&amp;quot;&lt;/em&gt; ao menu de clique com o botão direito.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.linkPreview.enabled&lt;/td&gt;
&lt;td&gt;Gera previsões e sugestões de links baseadas em IA.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;extensions.ml.enabled&lt;/td&gt;
&lt;td&gt;Permite que extensões do navegador usem a API ML do Firefox.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.ml.pageAssist.enabled&lt;/td&gt;
&lt;td&gt;Executa o assistente IA &lt;em&gt;&amp;quot;page assist&amp;quot;&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.tabs.groups.smart.enabled&lt;/td&gt;
&lt;td&gt;Usa IA para agrupar e rotular automaticamente suas abas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser.tabs.groups.smart.userEnable&lt;/td&gt;
&lt;td&gt;Permite que os usuários ativem manualmente o recurso de grupos de abas inteligentes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Referência: &lt;a href=&quot;https://flamedfury.com/posts/disable-ai-in-firefox/&quot;&gt;Disable AI In Firefox&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/10/disabilitando-ai-no-firefox/</guid>
      </item>
      <item>
        <title>Diário de atualizações realizadas no Bloco de Notas</title>
        <link>https://blog.tcelestino.dev.br/2025/10/changelog/</link>
        <description>&lt;p&gt;Inspirado pelo comentário do &lt;a href=&quot;http://www.pedro.dalbo.me/&quot;&gt;@dalbo1201&lt;/a&gt; depois de publicar o post &amp;quot;&lt;a href=&quot;https://blog.tcelestino.dev.br/2025/10/um-novo-comeco/&quot;&gt;Um novo começo&lt;/a&gt;&amp;quot; no &lt;a href=&quot;https://manualdousuario.net/orbita-post/um-novo-comeco/&quot;&gt;Manual do Usuário&lt;/a&gt;, resolvi criar uma página de &lt;em&gt;changelog&lt;/em&gt; para acompanhar as atualizações realizadas no Bloco de Notas, sejam de layout ou novas funcionalidades.&lt;/p&gt;
&lt;p&gt;A ideia é ir adicionando as atualizações tendo como base a estrutura de &amp;quot;&lt;a href=&quot;https://keepachangelog.com/pt-BR/1.1.0/&quot;&gt;CHANGELOG&lt;/a&gt;&amp;quot;, no qual cada atualização pode ser considerada um &lt;em&gt;release&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Se tiver interesse, acompanhe as atualizações na página &lt;a href=&quot;https://blog.tcelestino.dev.br/updates&quot;&gt;updates&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/10/changelog/</guid>
      </item>
      <item>
        <title>Um novo começo</title>
        <link>https://blog.tcelestino.dev.br/2025/10/um-novo-comeco/</link>
        <description>&lt;p&gt;Já faz tempo que queria mudar o layout do &lt;a href=&quot;https://blog.tcelestino.dev.br/&quot;&gt;Bloco de Notas&lt;/a&gt;, mas a preguiça ou falta de conhecimento em design sempre venciam. Usei o layout padrão do &lt;a href=&quot;https://11ty.dev/&quot;&gt;11ty&lt;/a&gt; com pequenas modificações, mas queria algo mais personalizado e simples, sem firulas de design ou código. Há um tempo, tentei usar &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind CSS&lt;/a&gt;, mas foi mais complicado que o esperado. Gastei mais tempo configurando o framework do que construindo o layout. Acabei desistindo.&lt;/p&gt;
&lt;h2&gt;Uma nova abordagem&lt;/h2&gt;
&lt;p&gt;Essa semana, decidi voltar a mexer no layout com uma abordagem diferente: sem revolucionar, apenas simplificar. Removi toda a formatação CSS, todas as classes HTML e deixei apenas o básico para manter a estrutura. &lt;strong&gt;E esse é o resultado! 🎉&lt;/strong&gt; Lembra a época em que as páginas eram apenas HTML com o mínimo de CSS, sem frameworks, JS ou builders? Velhos tempos que não voltam mais!&lt;/p&gt;
&lt;p&gt;A ideia é que a cada semana, vou acrescentar pequenas melhorias mantendo a simplicidade e performance. Sem framework CSS, mas garantindo que seja responsivo e compatível com todos os navegadores. Vou aproveitar as novidades do HTML, CSS e do 11ty. Espero que até o final do ano tenha o layout ideal e quem sabe cadastrar o Bloco de Notas no &lt;a href=&quot;https://www.11ty.dev/speedlify/&quot;&gt;ranking&lt;/a&gt; dos sites performáticos do 11ty.&lt;/p&gt;
&lt;h2&gt;Inspiração&lt;/h2&gt;
&lt;p&gt;Como referência, venho salvando alguns blogs minimalistas e simples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.seangoedecke.com/&quot;&gt;Sean Goedecke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cekrem.github.io/posts/&quot;&gt;Cekrem&#39;s blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jim-nielsen.com/&quot;&gt;Jim Nielsen&#39;s Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manualdousuario.net/&quot;&gt;Manual do Usuário&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://eduardoboucas.com/&quot;&gt;Eduardo Bouças&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://seldo.com/&quot;&gt;seldo.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://josh.mn/&quot;&gt;josh.mn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;São blogs que gosto de seguir e que vão me ajudar a criar meu próprio layout.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agora é ver até onde vou conseguir chegar!&lt;/strong&gt; 🤞&lt;/p&gt;
</description>
        <pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/10/um-novo-comeco/</guid>
      </item>
      <item>
        <title>Como saber quais arquivos do seu pacote serão publicados no npm</title>
        <link>https://blog.tcelestino.dev.br/2025/05/npm-pack/</link>
        <description>&lt;p&gt;Uma dica rápida para quem está desenvolvendo um pacote utilizando Node.js e quer publica-lo no npm. Para saber quais os arquivos que estarão presentes no pacote, você pode simplesmente usar o comando:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; pack&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E o resultado será algo como:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/nsJdw7Xv/npm-pack.png&quot; alt=&quot;resultado comando npm pack no terminal&quot;&gt;&lt;/p&gt;
&lt;p&gt;É gerado um arquivo &lt;code&gt;.tgz&lt;/code&gt; com o nome do pacote e a versão. Você pode validar se os arquivos que precisam existir no seu pacote estão corretos, além de ter algumas informações sobre o pacote, como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Versão do pacote;&lt;/li&gt;
&lt;li&gt;Tamanho do pacote comprimido e descomprimido;&lt;/li&gt;
&lt;li&gt;Total de arquivos no pacote.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Caso não queria gerar um arquivo &lt;code&gt;.tgz&lt;/code&gt;, você pode usar o comando:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; pack --dry-run&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nesse caso, terá como resultado:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/nNhKHBBg/npm-pack-dry-run.png&quot; alt=&quot;resultado comando npm pack --dry-run no terminal&quot;&gt;&lt;/p&gt;
&lt;p&gt;Com o &lt;code&gt;--dry-run&lt;/code&gt; você pode ver quais arquivos serão publicados, mas não é gerado o arquivo &lt;code&gt;.tgz&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Simples, não!?&lt;/p&gt;
</description>
        <pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/05/npm-pack/</guid>
      </item>
      <item>
        <title>Como remover propriedades de um objeto no JavaScript</title>
        <link>https://blog.tcelestino.dev.br/2025/04/como-remover-propriedades-objeto-js/</link>
        <description>&lt;p&gt;Em algum momento que você estava desenvolvendo algo em JavaScript, você precisou remover uma propriedade (podemos chamar de &amp;quot;chaves&amp;quot;) de um objeto. Por incrível que pareça, existem várias formas de fazer isso com JavaScript, o que pode ser bom por um lado, mas pode se tornar um problema para o outro, já que a depender da situação, uma abordagem menos eficiente pode impactar a performance da sua aplicação.&lt;/p&gt;
&lt;p&gt;Essa semana estive implementando uma funcionalidade a partir de uma API de terceiros, e precisava remover algumas propriedades de um objeto, e por curiosidade, decidi pesquisar sobre as diferentes formas de fazer isso e como cada uma pode impactar a performance da aplicação, saindo do tradicional &lt;code&gt;delete&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nesse post, vou listar algumas das abordagens conhecidas e outras que acabei descobrindo nas minhas pesquisas.&lt;/p&gt;
&lt;p&gt;Partiu!! 🚀&lt;/p&gt;
&lt;h2&gt;1. Usando o operador delete&lt;/h2&gt;
&lt;p&gt;É o método mais conhecido para remover uma propriedade de um objeto em JavaScript. Usando o operador &amp;quot;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete&quot;&gt;delete&lt;/a&gt;&amp;quot;, você consegue remover a propriedade especificada do objeto de forma direta.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;John&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;New York&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// A propriedade &#39;age&#39; foi removida do objeto.&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { name: &#39;John&#39;, city: &#39;New York&#39; }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Notas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Simples e direto. Funciona bem para objetos simples;&lt;/li&gt;
&lt;li&gt;O operador &lt;code&gt;delete&lt;/code&gt; pode afetar o desempenho, especialmente em loops, pois altera a estrutura do objeto;&lt;/li&gt;
&lt;li&gt;Não é recomendado para objetos que você deseja manter imutáveis.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Usando a desestruturação (destructuring)&lt;/h2&gt;
&lt;p&gt;Uma outra abordagem para remover propriedades de um objeto, que pode ser considerada moderna, é utilizando a &amp;quot;&lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Destructuring&quot;&gt;destructuring&lt;/a&gt;&amp;quot;. A partir dessa abordagem, você cria um novo objeto removendo a propriedade, sem mexer no objeto original, mantendo-o imutável.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;John&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;New York&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; age&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;newObj &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// A propriedade &#39;age&#39; foi removida.&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { name: &#39;John&#39;, city: &#39;New York&#39; }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Notas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mantém o objeto original imutável;&lt;/li&gt;
&lt;li&gt;É uma abordagem moderna e legível;&lt;/li&gt;
&lt;li&gt;Pode não ser tão intuitivo para quem não está familiarizado com a desestruturação;&lt;/li&gt;
&lt;li&gt;Em alguns casos, criar um novo objeto pode não ser ideal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. Usando a combinação de Object.keys() com reduce()&lt;/h2&gt;
&lt;p&gt;Ao usar o &amp;quot;&lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/keys&quot;&gt;Object.keys()&lt;/a&gt;&amp;quot; combinado com o método &lt;code&gt;reduce()&lt;/code&gt;, também conseguimos criar um novo objeto sem a propriedade que deseja remover. E de novo, conseguimos manter o objeto original imutável.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;John&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;New York&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; newObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;acc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;key &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;age&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    acc&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Adiciona a propriedade ao novo objeto se não for &#39;age&#39;.&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; acc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { name: &#39;John&#39;, city: &#39;New York&#39; }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Notas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mantém o objeto original imutável. É uma abordagem funcional e pode ser mais flexível;&lt;/li&gt;
&lt;li&gt;Pode ser mais verboso do que outras abordagens. Além disso, pode ser menos eficiente em termos de desempenho, especialmente para objetos com muitas propriedades.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. Usando Object.entries() e Object.fromEntries()&lt;/h2&gt;
&lt;p&gt;Usando &amp;quot;&lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/entries&quot;&gt;Object.entries()&lt;/a&gt;&amp;quot; obtemos um array de pares chave-valor e, em seguida, podemos fazer um filtro das propriedades que você deseja manter. Na sequência, usando &amp;quot;&lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries&quot;&gt;Object.fromEntries()&lt;/a&gt;&amp;quot; criamos um novo objeto a partir do &lt;em&gt;array&lt;/em&gt; que foi filtrado usando a função &lt;code&gt;filter()&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;John&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;New York&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; newObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromEntries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;entries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; key &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;age&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Filtra a propriedade &#39;age&#39;.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { name: &#39;John&#39;, city: &#39;New York&#39; }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Notas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mantém o objeto original imutável. É uma abordagem moderna e legível;&lt;/li&gt;
&lt;li&gt;Pode ser mais verboso do que outras abordagens. Além disso, pode não ser tão intuitivo para quem não está familiarizado com &lt;code&gt;Object.entries()&lt;/code&gt; e &lt;code&gt;Object.fromEntries()&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Pode trazer impacto na performance, já que é necessário fazer iteração em todas as propriedades do objeto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. Usando Object.defineProperty&lt;/h2&gt;
&lt;p&gt;Essa abordagem é menos conhecida, mas usando o &amp;quot;&lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty&quot;&gt;Object.defineProperty()&lt;/a&gt;&amp;quot; conseguimos definir a propriedade como não enumerável. Isso não remove a propriedade, mas impede que ela seja listada em loops.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;John&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;New York&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defineProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;age&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;enumerable&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Define a propriedade &#39;age&#39; como não enumerável.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { name: &#39;John&#39;, city: &#39;New York&#39; }&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// [&#39;name&#39;, &#39;city&#39;] - &#39;age&#39; não aparece na lista de chaves.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Notas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Esta seção fornece informações adicionais sobre as abordagens discutidas;&lt;/li&gt;
&lt;li&gt;Mantém a propriedade no objeto, mas a torna não enumerável. Isso pode ser útil em alguns casos;&lt;/li&gt;
&lt;li&gt;Pode se tornar complexo e não remover verdadeiramente a propriedade do objeto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;6. Usando Reflect.deleteProperty&lt;/h2&gt;
&lt;p&gt;Essa abordagem descobri nessa pesquisa. No caso, usando &lt;code&gt;Reflect.deleteProperty&lt;/code&gt; da &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect&quot;&gt;Reflect API&lt;/a&gt;, conseguimos ter abordagem semelhante ao operador &lt;code&gt;delete&lt;/code&gt;, porém com muito mais possibilidades de uso a partir dos outros métodos da API.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;John&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;New York&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
Reflect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deleteProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;age&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Remove a propriedade &#39;age&#39;.&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { name: &#39;John&#39;, city: &#39;New York&#39; }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Caso você queira remover uma propriedade de um objeto que não existe, o método &lt;code&gt;Reflect.deleteProperty&lt;/code&gt; retornará &lt;code&gt;true&lt;/code&gt;, diferente do operador &lt;code&gt;delete&lt;/code&gt;, que retornará &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Se tiver mais interesse em entender melhor sobre a API &lt;code&gt;Reflect&lt;/code&gt;, recomendo dar uma lida na documentação no &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect&quot;&gt;Mozilla Developer Network&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Notas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Problemas de performance parecidos com o uso do operador &lt;code&gt;delete&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Uma ampla possibilidade de uso dos métodos da API &lt;code&gt;Reflect&lt;/code&gt;, como &lt;code&gt;Reflect.get()&lt;/code&gt;, &lt;code&gt;Reflect.set()&lt;/code&gt;, entre outros;&lt;/li&gt;
&lt;li&gt;Pode confundir para quem não tem conhecimento da API &lt;code&gt;Reflect&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. Usando bibliotecas externas&lt;/h2&gt;
&lt;p&gt;Como notado, hoje em dia temos diversas maneiras de remover propriedades de um objeto em JavaScript, sem a necessidade de usar bibliotecas externas. Mas, se você estiver usando uma biblioteca externa, como &lt;code&gt;lodash&lt;/code&gt;, e ou &lt;code&gt;underscore&lt;/code&gt;, existem métodos específicos para remover propriedades de um objeto.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Usando lodash&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;lodash&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;John&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;New York&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; newObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;omit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;age&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Remove a propriedade &#39;age&#39;.&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { name: &#39;John&#39;, city: &#39;New York&#39; }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Recomendo dar uma lida no repositório &amp;quot;&lt;a href=&quot;https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore&quot;&gt;You Don&#39;t Need Lodash/Underscore&lt;/a&gt;&amp;quot; para entender como você pode substituir as bibliotecas &lt;code&gt;lodash&lt;/code&gt; e &lt;code&gt;underscore&lt;/code&gt; por outras abordagens mais performáticas.&lt;/p&gt;
&lt;h2&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Como a versatilidade do JavaScript, conseguimos ter várias diversas maneiras para remover propriedades de um objeto. A escolha da abordagem vai depender do caso de uso e do que o seu projeto precisa Usar o &lt;code&gt;delete&lt;/code&gt; é o mais comum e mais fácil de entender, mas as outras abordagens também são úteis em diferentes situações e que traz impactos positivos para a performance das suas aplicações.&lt;/p&gt;
</description>
        <pubDate>Tue, 29 Apr 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/04/como-remover-propriedades-objeto-js/</guid>
      </item>
      <item>
        <title>Criando textos responsivos sem media queries</title>
        <link>https://blog.tcelestino.dev.br/2025/03/criando-textos-responsivos-sem-media-queries/</link>
        <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A função &lt;code&gt;clamp()&lt;/code&gt; do CSS permite criar textos responsivos sem media queries;&lt;/li&gt;
&lt;li&gt;Apenas uma linha de código define os tamanhos mínimo, ideal e máximo da fonte;&lt;/li&gt;
&lt;li&gt;Facilita a manutenção do CSS e melhora a performance do site;&lt;/li&gt;
&lt;li&gt;Funciona em todos os navegadores modernos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Uma dica rápida e prática para quem precisa manter textos responsivos sem a necessidade de usar &lt;em&gt;media queries&lt;/em&gt;. Usando a função &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/clamp&quot;&gt;clamp&lt;/a&gt;, conseguimos ter textos que se adaptam automaticamente a diferentes tamanhos de tela sem precisar configurar tamanhos específicos para cada &lt;em&gt;breakpoint&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Como usar&lt;/h2&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;clamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1.5rem&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 8vw&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 3rem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Explicando a formatação CSS acima, temos o seguinte:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Valor mínimo&lt;/strong&gt;: 1.5rem - define que o tamanho mínimo da fonte não ficará abaixo de 1,5x em relação ao tamanho da fonte do elemento raiz: 16px × 1.5 = 24px.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valor ideal&lt;/strong&gt;: 8vw - define o tamanho da fonte como 8% da largura do &lt;em&gt;viewport&lt;/em&gt;. Se a medida da largura do &lt;em&gt;viewport&lt;/em&gt; mudar, o tamanho se alterará de acordo com a nova largura.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valor máximo&lt;/strong&gt;: 3rem - define o tamanho máximo como 3x o tamanho da fonte em relação ao elemento raiz: 16px × 3 = 48px.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Com apenas uma linha de código, você consegue manter os textos responsivos independentemente do tamanho da tela, garantindo uma experiência de leitura agradável em qualquer dispositivo.&lt;/p&gt;
&lt;h2&gt;Benefícios&lt;/h2&gt;
&lt;p&gt;Além da simplicidade, essa abordagem traz algumas vantagens interessantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Código mais limpo&lt;/strong&gt;: reduz a quantidade de &lt;em&gt;media queries&lt;/em&gt; no seu CSS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Melhor performance&lt;/strong&gt;: menos código significa carregamento mais rápido&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transições suaves&lt;/strong&gt;: o texto se ajusta gradualmente conforme o redimensionamento da tela&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manutenção facilitada&lt;/strong&gt;: alterações de tamanho podem ser feitas em um único lugar&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Compatibilidade&lt;/h2&gt;
&lt;p&gt;A função &lt;code&gt;clamp()&lt;/code&gt; é suportada por todos os navegadores modernos, incluindo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome (desde a versão 79)&lt;/li&gt;
&lt;li&gt;Firefox (desde a versão 75)&lt;/li&gt;
&lt;li&gt;Safari (desde a versão 13.1)&lt;/li&gt;
&lt;li&gt;Edge (desde a versão 79)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Referências&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/clamp&quot;&gt;MDN Web Docs - clamp()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://desenvolvimentoparaweb.com/css/textos-responsivos-com-css-clamp/&quot;&gt;Desenvolvimento para Web - Textos responsivos com CSS clamp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 06 Mar 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/03/criando-textos-responsivos-sem-media-queries/</guid>
      </item>
      <item>
        <title>Você sabe por que usamos o underscore no target=&quot;_blank&quot;?</title>
        <link>https://blog.tcelestino.dev.br/2025/02/voce-sabe-por-que-usamos-o-underscore-no-target-blank/</link>
        <description>&lt;p&gt;Alguma vez você já se perguntou por que usamos o &lt;em&gt;underscore&lt;/em&gt; em valores como &lt;code&gt;_blank&lt;/code&gt;, &lt;code&gt;_self&lt;/code&gt;, etc...? Eu não sabia até ler esse &lt;a href=&quot;https://kyrylo.org/html/2024/10/25/why-does-target-blank-have-an-underscore-in-front.html&quot;&gt;post&lt;/a&gt; do Kyrylo Silin.&lt;/p&gt;
&lt;h2&gt;Um pouco de história&lt;/h2&gt;
&lt;p&gt;Antes do surgimento do HTML5, abusávamos do uso de &lt;em&gt;frames&lt;/em&gt; para construção de páginas. Essas páginas eram criadas baseadas em &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frameset&quot;&gt;framesets&lt;/a&gt;. Eu mesmo escrevi muito código HTML utilizando &lt;em&gt;frames&lt;/em&gt;. Como nem tudo são flores, usar &lt;em&gt;frames&lt;/em&gt; para construção de páginas podia ser útil para organizar conteúdo em várias janelas na própria página (SPA, alguém aí? 😅), mas os &lt;em&gt;frames&lt;/em&gt; eram difíceis de manter e tinham sérios problemas de segurança.&lt;/p&gt;
&lt;h2&gt;Como funcionavam os framesets&lt;/h2&gt;
&lt;p&gt;Cada frame continha um nome único. Algo como &lt;code&gt;name=&amp;quot;footer&amp;quot;&lt;/code&gt;, &lt;code&gt;name=&amp;quot;content&amp;quot;&lt;/code&gt;, &lt;code&gt;name=&amp;quot;sidebar&amp;quot;&lt;/code&gt;. E quando precisávamos abrir um link em um frame específico, informávamos qual o name do frame onde o conteúdo do link seria carregado. Por exemplo: &lt;code&gt;&amp;lt;a href=&amp;quot;/sobre-mim.html&amp;quot; target=&amp;quot;content&amp;quot;&amp;gt;Sobre mim&amp;lt;/a&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ao clicar no link, a página &amp;quot;sobre-mim.html&amp;quot; era carregada no &lt;em&gt;frame&lt;/em&gt; nomeado &amp;quot;content&amp;quot;. Agora, imagine se houvesse um link assim: &lt;code&gt;&amp;lt;a href=&amp;quot;/outra-pagina.html&amp;quot; target=&amp;quot;blank&amp;quot;&amp;gt;Outra página&amp;lt;/a&amp;gt;&lt;/code&gt;. O que aconteceria?&lt;/p&gt;
&lt;p&gt;Como expliquei anteriormente, ao informar &lt;code&gt;target=&amp;quot;blank&amp;quot;&lt;/code&gt;, o link teria que ser aberto em um &lt;em&gt;frame&lt;/em&gt; nomeado como &amp;quot;&lt;em&gt;blank&lt;/em&gt;&amp;quot;, mas caso esse &lt;em&gt;frame&lt;/em&gt; não existisse, por padrão, o navegador criava uma nova janela identificando-a como &amp;quot;&lt;em&gt;blank&lt;/em&gt;&amp;quot;. O mais estranho é que ao clicar no mesmo link novamente, o navegador não abria uma nova janela. 🫣&lt;/p&gt;
&lt;h2&gt;A solução com underscore&lt;/h2&gt;
&lt;p&gt;Ao usar o &lt;em&gt;underscore&lt;/em&gt;, o navegador passou a entender que o valor &lt;code&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; não era um nome de um frame na tela, mas sim um valor especial, compreendendo que o conteúdo do link deveria ser aberto em uma nova janela/aba. Esse comportamento também se aplica para os valores &lt;code&gt;target=&amp;quot;_self&amp;quot;&lt;/code&gt;, &lt;code&gt;target=&amp;quot;_parent&amp;quot;&lt;/code&gt; e &lt;code&gt;target=&amp;quot;_top&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Relevância hoje&lt;/h2&gt;
&lt;p&gt;Mesmo com a obsolescência dos framesets com o surgimento do HTML5, esses valores especiais foram preservados na especificação. Hoje, quando usamos &lt;code&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt;, continuamos aproveitando essa convenção estabelecida há décadas, mas com propósitos modernos de navegação.&lt;/p&gt;
&lt;p&gt;Simples, porém eficiente, não é mesmo!? 😎&lt;/p&gt;
</description>
        <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/02/voce-sabe-por-que-usamos-o-underscore-no-target-blank/</guid>
      </item>
      <item>
        <title>Como organizei meus dotfiles e otimizei meu fluxo de trabalho</title>
        <link>https://blog.tcelestino.dev.br/2025/02/dotfiles/</link>
        <description>&lt;p&gt;Aproveitei a semana passada para aprofundar meus conhecimentos em &lt;em&gt;shell script&lt;/em&gt; e decidi usar meus &lt;a href=&quot;https://github.com/tcelestino/dotfiles&quot;&gt;dotfiles&lt;/a&gt; como laboratório prático para aplicar o que aprendi e devo continuar aprendendo ao longo desse ano.&lt;/p&gt;
&lt;h2&gt;O que são dotfiles?&lt;/h2&gt;
&lt;p&gt;Para quem não conhece, dotfiles são arquivos de configuração que geralmente começam com um ponto (.), tornando-se ocultos em sistemas Unix/Linux. Eles armazenam personalizações para aplicativos e ambientes de desenvolvimento, incluindo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.bashrc&lt;/code&gt;: Configurações do shell Bash;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.npmrc&lt;/code&gt;: Preferências do npm;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.gitconfig&lt;/code&gt;: Configurações globais do Git;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.zshrc&lt;/code&gt;: Arquivo principal de configuração do Zsh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esses arquivos permitem não só personalizar seu ambiente de trabalho, mas também manter consistência entre diferentes máquinas e sistemas.&lt;/p&gt;
&lt;p&gt;Meus &lt;a href=&quot;https://github.com/tcelestino/dotfiles&quot;&gt;dotfiles&lt;/a&gt; existem há 9 anos e estavam precisando de atualização. Combinei a necessidade de atualizar as configurações com meu interesse recente em &lt;em&gt;shell script&lt;/em&gt;. Durante o processo, utilizei o &lt;a href=&quot;https://code.visualstudio.com/docs/copilot/overview&quot;&gt;GitHub Copilot&lt;/a&gt; no VS Code (disponível gratuitamente com limites de uso) como assistente para verificar sintaxe, documentação e sugestões de boas práticas. Pretendo detalhar meu fluxo de trabalho com IAs assistivas em um futuro post.&lt;/p&gt;
&lt;h2&gt;Minha configuração&lt;/h2&gt;
&lt;p&gt;Nos meus dotfiles, gerencio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tcelestino/dotfiles/blob/main/zsh/aliases.zsh&quot;&gt;Aliases&lt;/a&gt; e &lt;a href=&quot;https://github.com/tcelestino/dotfiles/blob/main/zsh/.zshrc#L5&quot;&gt;plugins&lt;/a&gt; do Zsh;&lt;/li&gt;
&lt;li&gt;Instalação automatizada de aplicativos via &lt;a href=&quot;https://github.com/tcelestino/dotfiles/blob/main/Brewfile&quot;&gt;Homebrew&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Configurações específicas para &lt;a href=&quot;https://github.com/tcelestino/dotfiles/blob/main/.macos&quot;&gt;macOS&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Otimizações para &lt;a href=&quot;https://github.com/tcelestino/dotfiles/tree/main/git&quot;&gt;Git&lt;/a&gt; e &lt;a href=&quot;https://github.com/tcelestino/dotfiles/blob/main/.npmrc&quot;&gt;Node.js&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Toda instalação é executada por um único comando &lt;code&gt;./install&lt;/code&gt; no terminal. 🚀&lt;/p&gt;
&lt;p&gt;À medida que evoluo meu conhecimento em &lt;em&gt;shell scripting&lt;/em&gt;, vou implementando melhorias nessas configurações para aumentar a eficiência e ergonomia no meu fluxo de trabalho.&lt;/p&gt;
&lt;h2&gt;Comece seus próprios dotfiles&lt;/h2&gt;
&lt;p&gt;Se você ainda não tem dotfiles, sinta-se à vontade para usar &lt;a href=&quot;https://github.com/tcelestino/dotfiles&quot;&gt;meu repositório&lt;/a&gt; como base ou inspiração. O projeto é open source - contribuições são bem-vindas! Para explorar diferentes abordagens, recomendo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O portal &lt;a href=&quot;https://dotfiles.github.io/&quot;&gt;dotfiles.github.io&lt;/a&gt; com curadoria de exemplos;&lt;/li&gt;
&lt;li&gt;O repositório do &lt;a href=&quot;https://github.com/paulirish/dotfiles&quot;&gt;Paul Irish&lt;/a&gt; que me inspirou inicialmente;&lt;/li&gt;
&lt;li&gt;O repositório &lt;a href=&quot;https://github.com/webpro/awesome-dotfiles&quot;&gt;Awesome Dotfiles&lt;/a&gt; no GitHub, que possui uma lista de recursos e exemplos interessantes para explorar e implementar em seus dotfiles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O ponto principal é adaptar as configurações às suas necessidades específicas enquanto mantém a capacidade de replicar seu ambiente em qualquer computador rapidamente.&lt;/p&gt;
</description>
        <pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/02/dotfiles/</guid>
      </item>
      <item>
        <title>Compartilhamento de links usando Web Share API</title>
        <link>https://blog.tcelestino.dev.br/2025/01/web-share-api/</link>
        <description>&lt;p&gt;Dias atrás, o Rodrigo Ghedin, do &lt;a href=&quot;https://manualdousuario.net/&quot;&gt;Manual do Usuário&lt;/a&gt;, disponibilizou um recurso simples no blog, mas que, sem dúvida, trouxe uma experiência mais agradável para os usuários ao implementar o compartilhamento de link nativo dos navegadores. Dei uma fuçada e acabei confirmando o que imaginava: a implementação é baseada na &lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/API/Navigator/share&quot;&gt;Web Share API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lembrei da época em que trabalhava no elo7 e usamos a Web Share API na página de detalhes dos produtos do marketplace, no qual conseguimos garantir uma experiência mais fluida no marketplace. Inclusive, &lt;a href=&quot;https://blog.elo7.dev/web-share-api/&quot;&gt;escrevi&lt;/a&gt; sobre a API no blog da empresa.&lt;/p&gt;
&lt;h2&gt;O que é a Web Share API?&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;https://wicg.github.io/web-share/&quot;&gt;Web Share API&lt;/a&gt; é uma API em Javascript presente em diversos navegadores, na qual você pode usar o recurso nativo de compartilhamento de link sem a necessidade de implementação de plugins de terceiros na sua página. Segundo o &lt;a href=&quot;https://caniuse.com/web-share&quot;&gt;Can I Use&lt;/a&gt;, a Web Share API já tem um amplo suporte nos navegadores mais atuais:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://i.ibb.co/7J1bttp3/SCR-20250131-kccw.png&quot; alt=&quot;Screenshot exibindo compatibilidade da Web Share API&quot;&gt;
  &lt;figcaption&gt;Infelizmente, o Firefox para desktop ainda não possui o recurso. 😞&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2&gt;Como usar Web Share API&lt;/h2&gt;
&lt;p&gt;Antes de falarmos de como implementar a Web Share API, precisamos lembrar que, no passado não muito distante, existiam diversas formas de implementar o compartilhamento de link através do navegador. No Android, era possível implementar &lt;a href=&quot;https://www.chromium.org/developers/web-intents-in-chrome&quot;&gt;Web Intents&lt;/a&gt; e no iOS, era possível usar &lt;a href=&quot;https://css-tricks.com/create-url-scheme/&quot;&gt;Custom URL Schemes&lt;/a&gt;. Ou seja, uma salada de frutas para algo &amp;quot;simples&amp;quot;. 🤯 Sem contar os diversos plugins de terceiros existentes (Facebook, Twitter, etc.).&lt;/p&gt;
&lt;p&gt;A Web Share API surgiu para simplificar e garantir maior compatibilidade entre os sistemas operacionais e navegadores. Além de trazer uma melhor experiência com o uso de um comportamento nativo, em vez de pop-ups, modais e redirecionamentos.&lt;/p&gt;
&lt;p&gt;A implementação da Web Share API é muito simples:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/tcelestino/7b738d076654d1d2880cb67672149786.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;Com essa estrutura, você já tem uma implementação funcional de compartilhamento de link do próprio sistema operacional.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://i.ibb.co/b51X5YKB/RPReplay-Final1738330987.gif&quot; alt=&quot;Screenshot com o funcionamento da Web Share API em um dispositivo móvel&quot;&gt;
  &lt;figcaption&gt;Ao clicar no link &quot;Compartilhar link&quot;, a Web Share API entra em ação&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Caso queira visualizar no seu dispositivo, o exemplo está disponível em &lt;a href=&quot;https://tcelestino-web-share-api.netlify.app/&quot;&gt;https://tcelestino-web-share-api.netlify.app/
&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Destrinchando o código&lt;/h2&gt;
&lt;p&gt;Como a Web Share API é baseada em &lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot;&gt;Promise&lt;/a&gt;, podemos implementá-la de diferentes maneiras. Seja usando &lt;code&gt;try..catch&lt;/code&gt;, &lt;code&gt;then&lt;/code&gt; e &lt;code&gt;catch&lt;/code&gt;, etc., fica a critério do projeto e do gosto de quem está implementando, já que o resultado final será o mesmo. No exemplo, estou usando &lt;code&gt;try...catch&lt;/code&gt;, mas fique à vontade para adaptar à sua realidade.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/tcelestino/c6086cb811d1d745d1988ecfbcda3145.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;A Web Share API está disponível através do método &lt;code&gt;share&lt;/code&gt; do objeto &lt;code&gt;navigator&lt;/code&gt;. Sendo assim, precisamos verificar se o método está disponível no navegador; caso não esteja, podemos implementar uma ação de falha. No exemplo, implementei um &lt;code&gt;alert&lt;/code&gt;, mas não façam isso na vida real! 😅&lt;/p&gt;
&lt;p&gt;A &amp;quot;magia&amp;quot; do funcionamento da Web Share API está na seguinte configuração:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/tcelestino/185360f7691f9b4e793747e23bb927f9.js&quot;&gt;&lt;/script&gt;
&lt;ul&gt;
&lt;li&gt;title: título que será usado no compartilhamento do link;&lt;/li&gt;
&lt;li&gt;text: texto descritivo do compartilhamento que será adicionando no campo de texto (opcional);&lt;/li&gt;
&lt;li&gt;url: link para onde o usuário será redirecionado ao clicar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Caso não tenha notado, na chave &lt;code&gt;url&lt;/code&gt;, adicionei uma condicional na qual estou capturando o valor do href existente na tag &lt;code&gt;&amp;lt;link rel=&amp;quot;canonical&amp;quot; href=&amp;quot;https://tcelestino.github.io/bloco-de-notas/&amp;quot;&amp;gt;&lt;/code&gt;, e isso tem uma explicação.&lt;/p&gt;
&lt;p&gt;Imagine que um site tenha domínios específicos para desktop e mobile (https://m.site.com), ou até mesmo URLs baseadas no contexto do usuário, utilizando a estratégia &lt;a href=&quot;https://en.wikipedia.org/wiki/Canonical_link_element&quot;&gt;Canonical URL&lt;/a&gt; conseguimos garantir que o link compartilhado será &amp;quot;real&amp;quot;, mantendo a consistência e a experiência do usuário.&lt;/p&gt;
&lt;h2&gt;Pontos de atenção!&lt;/h2&gt;
&lt;p&gt;Apesar da implementação da Web Share API ser simples, temos alguns pontos de atenção:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seu servidor precisa ter HTTPS habilitado;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Os valores passados para API precisam ser no formato de texto;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Você só pode executar a API a partir de uma ação do usuário. Ou seja, a partir de uma ação de clique;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Não pode chamá-la no carregamento da página (onload, DOMContentLoaded, etc...).&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Por ser algo simples de implementar, a Web Share API pode trazer bons ganhos na experiência de usuário, principalmente por não haver interferência de terceiros e por proporcionar maior controle das ações realizadas pelo usuário em seu site.&lt;/p&gt;
&lt;p&gt;Ter uma solução nativa integrada com os sistemas operacionais, sem dúvidas, trará uma experiência mais fluida para os usuários, além de garantir a autonomia do funcionamento de todo o seu site.&lt;/p&gt;
</description>
        <pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/01/web-share-api/</guid>
      </item>
      <item>
        <title>Mapeando minhas entrevistas pós-demissão</title>
        <link>https://blog.tcelestino.dev.br/2025/01/mapeando-minhas-entrevistas-pos-demissao/</link>
        <description>&lt;p&gt;TLDR:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Criei um banco de dados no Notion para mapear e registrar informações sobre as entrevistas.&lt;/li&gt;
&lt;li&gt;Participei de entrevistas para cargos como Tech Lead, Team Lead e desenvolvedor.&lt;/li&gt;
&lt;li&gt;Feedbacks como melhorias para próximas entrevistas.&lt;/li&gt;
&lt;li&gt;A falta de respostas de algumas entrevistas e a adaptação ao modelo PJ, foram pontos impactantes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depois de sofrer uma demissão, a primeira coisa que você pensa é buscar uma nova recolocação. Inclusive &lt;a href=&quot;https://blog.tcelestino.dev.br/2024/10/um-mes-desempregado/&quot;&gt;escrevi&lt;/a&gt; sobre isso depois de um mês desempregado. Mesmo não buscando por vagas durante os últimos três meses, recebi alguns convites para entrevistas. Grande parte desses convites vieram via Linkedin. Seja por pessoas que viram a postagem da planilha com o nome das pessoas demitidas, por indicação de pessoas com quem já trabalhei (obrigado, inclusive) e/ou pela busca direta na plataforma.&lt;/p&gt;
&lt;h2&gt;Mapeamento das entrevistas&lt;/h2&gt;
&lt;p&gt;Sempre tive o hábito de anotar pontos-chave das entrevistas em que já participei, tanto para melhorar algum aspecto quanto para fazer perguntas sobre os assuntos abordados no processo. Dessa vez, resolvi fazer algo diferente. Em vez de apenas anotar, criei um banco de dados para registrar informações pertinentes (para mim, claro), com o objetivo de obter algumas métricas.&lt;/p&gt;
&lt;p&gt;Organizei o banco de dados com as seguintes informações:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nome da empresa;&lt;/li&gt;
&lt;li&gt;Cargo;&lt;/li&gt;
&lt;li&gt;Descrição da vaga (link para a vaga);&lt;/li&gt;
&lt;li&gt;Salário;&lt;/li&gt;
&lt;li&gt;Benefícios;&lt;/li&gt;
&lt;li&gt;Tipo de contrato;&lt;/li&gt;
&lt;li&gt;Formato de trabalho;&lt;/li&gt;
&lt;li&gt;Datas do primeiro e do último contato;&lt;/li&gt;
&lt;li&gt;Status da entrevista.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/DsVPv1U.png&quot; alt=&quot;Gráfico mapeamento entrevistas&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Cargos&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tech Lead&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desenvolvedor&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team Lead&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Como já mencionei, não fiz nenhuma busca ativa por vagas. Os contatos aconteceram principalmente com base na minha experiência como desenvolvedor. No caso da vaga de liderança (Team Lead), achei interessante que foi uma oportunidade para voltar para uma empresa que já tinha passado anteriormente. Tive feedbacks bem legais, tanto do pessoal de engenharia, quanto da recrutadora. Antes que me pergunte: não passei! 🙂&lt;/p&gt;
&lt;h3&gt;Salários&lt;/h3&gt;
&lt;p&gt;Os salários no formato PJ tendem a ser maiores. Já li relatos de profissionais recebendo 25k, 30k e até 40k como PJ. Grande parte dessas pessoas recebem em dólares, verdade seja dita, mas são PJs no final. Nunca ouvi algo semelhante no formato CLT, mas não duvido que haja alguém recebendo algo parecido em uma grande empresa tech brasileira.&lt;/p&gt;
&lt;p&gt;Os resultados que obtive foram estes:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Valor&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Salário mais alto (PJ)&lt;/td&gt;
&lt;td&gt;R$ 17.000,00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salário mais alto (CLT)&lt;/td&gt;
&lt;td&gt;R$ 15.000,00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salário mais baixo (PJ)&lt;/td&gt;
&lt;td&gt;R$ 15.000,00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salário mais baixo (CLT)&lt;/td&gt;
&lt;td&gt;R$ 11.060,00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Média de salário&lt;/td&gt;
&lt;td&gt;R$ 11.506,00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Vale mencionar que as vagas no modelo de contrato PJ, para quem nunca trabalhou nesse formato, lidar com todo o processo inicial – abertura de conta jurídica, contratação de contador ou serviços online – foi o que me deixou com dificuldade de aceitação. Amigos que já trabalham nesse modelo me deram dicas e indicações, mas mesmo assim, não me vejo pronto para me adaptar a esse novo formato.&lt;/p&gt;
&lt;h3&gt;Benefícios&lt;/h3&gt;
&lt;p&gt;As empresas que contratam no formato CLT ofereciam como principais benefícios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plano de Saúde/Odontológico;&lt;/li&gt;
&lt;li&gt;Vale Alimentação;&lt;/li&gt;
&lt;li&gt;Vale Refeição.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Algumas curiosidades:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ausência de feedbacks por parte de alguns recrutadores(as). Em um caso específico, enviei uma mensagem procurando saber se havia uma resposta negativa. Até hoje espero.&lt;/li&gt;
&lt;li&gt;No salário mais baixo no contrato CLT, os benefícios eram muito melhores do que no maior salário no formato CLT.&lt;/li&gt;
&lt;li&gt;No modelo PJ, apenas uma empresa oferecia férias remuneradas como benefício, o restante é aquele esquema PJ: você paga por tudo!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Como foi meu primeiro ano fazendo esse mapeamento, ao reunir os dados, observei que senti falta de fazer o registro das fases dos processos seletivos, como por exemplo, a entrevista que fiz no esquema de &lt;em&gt;whiteboard&lt;/em&gt;. Seria mais fácil visualizar o tempo de cada processo até o resultado final.&lt;/p&gt;
&lt;p&gt;Além disso, ao pedir feedbacks logo após as entrevistas só confirmou o quanto é importante se ter um feedback assertivo no frescor da situação, o que influencia muito na melhoria de desempenho para as próximas entrevistas.&lt;/p&gt;
&lt;p&gt;Se você está buscando novas oportunidades no momento, recomendo tentar algum tipo de registro. Começando com algo mais básico, como registrando os benefícios e ou incrementar com a suas necessidades. Eu fiz no Notion, mas em uma planilha também pode ser bem útil. Certeza que isso vai te ajudar a entender quais as melhores oportunidades farão sentido para você.&lt;/p&gt;
</description>
        <pubDate>Mon, 06 Jan 2025 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2025/01/mapeando-minhas-entrevistas-pos-demissao/</guid>
      </item>
      <item>
        <title>Retrospectiva 2024</title>
        <link>https://blog.tcelestino.dev.br/2024/12/retrospectiva-2024/</link>
        <description>&lt;p&gt;Mais um ano finalizando com a expectativa de que o próximo seja muito melhor, sempre! Resolvi listar os principais acontecimentos deste ano para minha vida pessoal e profissional.&lt;/p&gt;
&lt;p&gt;Esta lista não está em ordem cronológica nem por nível de importância, que fique bem claro.&lt;/p&gt;
&lt;h2&gt;Janeiro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Início do uso de prótese capilar com cabelo de verdade.
&lt;ul&gt;
&lt;li&gt;Desisti no segundo mês. 🙃&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fevereiro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Primeira vez no bloco afro Filhos de Gandhy no Carnaval de Salvador.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Março&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lollapalooza&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Abril&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Primeira consulta com ortopedista&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Maio&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Primeira viagem para a Europa.
&lt;ul&gt;
&lt;li&gt;Conheci as cidades: Évora, Lisboa, Braga, Porto, Amsterdã, Salamanca, Madrid e Móstoles.&lt;/li&gt;
&lt;li&gt;Encontrei os amigos: Gui e Gilvalso; Thiago (TedK) e família em Braga; Osmundo e família no Porto.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Trabalho remoto no fuso horário 4 horas à frente. 💥&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Junho&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Seek vende a Catho para a Redabor.
&lt;ul&gt;
&lt;li&gt;Ansiedade nas alturas!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Avaliações positivas sobre meu trabalho como gestor. Não rolou mérito dessa vez.&lt;/li&gt;
&lt;li&gt;Primeira vez na primeira classe. 🥂&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Julho&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Aniversário em casa com a família.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Agosto&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Início dos estudos sobre o Deno.js.&lt;/li&gt;
&lt;li&gt;Corrida Santander (10km) com o Aurélio.&lt;/li&gt;
&lt;li&gt;Jogo do Esporte Clube Vitória no estádio do time (foi o único jogo que fui esse ano).&lt;/li&gt;
&lt;li&gt;Mentoria de carreira com o Eduardo Galbiati.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Setembro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Demissão geral na Catho.&lt;/li&gt;
&lt;li&gt;Voltei a escrever no blog.&lt;/li&gt;
&lt;li&gt;Cirurgia para remoção de um encondroma no osso do dedo.&lt;/li&gt;
&lt;li&gt;Maratona Salvador (10km) com o clube de corrida da academia.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Outubro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Início de entrevistas para cargos de desenvolvedor em startups, empresas médias e grandes.
&lt;ul&gt;
&lt;li&gt;Mapeamento do processo, escrevo em breve sobre.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Início da formação em Product Management, na PM3.&lt;/li&gt;
&lt;li&gt;Primeira parcela do seguro-desemprego na conta.&lt;/li&gt;
&lt;li&gt;Knotfest.&lt;/li&gt;
&lt;li&gt;Resenha com os amigos em SP:
&lt;ul&gt;
&lt;li&gt;Encontro dos TTT (Tauan, Tiago e Thassio).&lt;/li&gt;
&lt;li&gt;Churrasco na casa do Cael.&lt;/li&gt;
&lt;li&gt;Encontro com os Diego’s e com o Hyun.&lt;/li&gt;
&lt;li&gt;Andanças com a Nayane.&lt;/li&gt;
&lt;li&gt;Café com os membros do meu ex-time (Larissa e Bruno).&lt;/li&gt;
&lt;li&gt;Jantar com o Sachetto e o Pita.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Novembro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Início da fisioterapia para garantir a mobilidade do dedo pós-cirurgia.&lt;/li&gt;
&lt;li&gt;Tentativa estressante de importar produtos da Europa para o Brasil via transportadora internacional.&lt;/li&gt;
&lt;li&gt;Primeira produção/organização de um evento musical.&lt;/li&gt;
&lt;li&gt;Primeira vez no estádio da Fonte Nova.
&lt;ul&gt;
&lt;li&gt;Jogo Brasil vs Uruguai.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Corrida do Leão (Esporte Clube Vitória) (10km).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Dezembro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Liberação da fisioterapia.&lt;/li&gt;
&lt;li&gt;Compartilhei meu escritório para os leitores do MdU: &lt;a href=&quot;https://manualdousuario.net/mesa-de-trabalho-tiago-celestino/&quot;&gt;https://manualdousuario.net/mesa-de-trabalho-tiago-celestino/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Um novo desafio profissional (conto mais em breve).&lt;/li&gt;
&lt;li&gt;Show despedida do Sepultura.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2024/12/retrospectiva-2024/</guid>
      </item>
      <item>
        <title>Configurando modo tela cheia do Firefox no macOS</title>
        <link>https://blog.tcelestino.dev.br/2024/12/otimize-modo-tela-cheia-firefox-macos/</link>
        <description>&lt;p&gt;Uma situação incômoda ocorre ao assistir vídeos no Firefox no macOS: quando habilito o modo tela cheia, o sistema automaticamente cria um novo &amp;quot;Space&amp;quot; (área de trabalho). Isso se torna irritante ao final do vídeo, pois sou “forçado” a visualizar uma animação desnecessária durante a transição entre as áreas de trabalho. Nem vou comentar o impacto na performance.&lt;/p&gt;
&lt;p&gt;Encontrei uma &lt;a href=&quot;https://www.reddit.com/r/osx/comments/ctqaa4/comment/lfucrni/&quot;&gt;solução&lt;/a&gt; simples através de uma discussão no reddit que resolve este &amp;quot;problema&amp;quot; específico do Firefox.&lt;/p&gt;
&lt;h2&gt;Passo a passo&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Acesse &lt;code&gt;about:config&lt;/code&gt; na barra de endereço do Firefox&lt;/li&gt;
&lt;li&gt;Localize a configuração &lt;code&gt;full-screen-api.macos-native-full-screen&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mude o valor de &lt;code&gt;true&lt;/code&gt; para &lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A mudança é aplicada instantaneamente, sem necessidade de reiniciar o navegador. &lt;strong&gt;Mais um motivo para usar o Firefox&lt;/strong&gt;! 🦊&lt;/p&gt;
&lt;p&gt;Até o momento, não há uma solução conhecida para outros navegadores como Chrome ou Edge.&lt;/p&gt;
&lt;p&gt;É importante mencionar que, embora os desenvolvedores possam criar suas próprias implementações para gerenciar o modo tela cheia, muitos optam por utilizar a API nativa do macOS.&lt;/p&gt;
&lt;p&gt;Assim como esse &lt;a href=&quot;https://www.reddit.com/r/osx/comments/ctqaa4/comment/kw4epf7&quot;&gt;comentário&lt;/a&gt; no reddit, seria interessante se a Apple considerasse olhar para este comportamento do sistema.&lt;/p&gt;
</description>
        <pubDate>Fri, 20 Dec 2024 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2024/12/otimize-modo-tela-cheia-firefox-macos/</guid>
      </item>
      <item>
        <title>Meus apps essenciais em 2024</title>
        <link>https://blog.tcelestino.dev.br/2024/12/meus-apps-essenciais-em-2024/</link>
        <description>&lt;p&gt;Inspirado na &lt;a href=&quot;https://amanhimself.dev/blog/default-apps-2024/&quot;&gt;lista&lt;/a&gt; do Aman Mittal, decidi compartilhar minha seleção de aplicativos essenciais para 2024.&lt;/p&gt;
&lt;p&gt;Sempre gostei dessas listas pois sempre acabo descobrindo novas ferramentas que me ajudam na minha produtividade. Espero que descobra apps que possam melhorar a sua também.&lt;/p&gt;
&lt;p&gt;Vamos lá!!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Launchers&lt;/strong&gt;: &lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt; (macOS) e &lt;a href=&quot;https://ulauncher.io/&quot;&gt;Ulauncher&lt;/a&gt; (Linux)&lt;/li&gt;
&lt;li&gt;📧 &lt;strong&gt;Cliente de email:&lt;/strong&gt; &lt;a href=&quot;https://gmail.com&quot;&gt;Gmail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Bloco de Notas&lt;/strong&gt;: &lt;a href=&quot;https://bear.app/&quot;&gt;Bear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Lista de tarefas&lt;/strong&gt;: &lt;a href=&quot;https://todoist.com/pt-BR&quot;&gt;Todoist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📅 &lt;strong&gt;Calendário&lt;/strong&gt;: Apple Calendar&lt;/li&gt;
&lt;li&gt;☁️ &lt;strong&gt;Cloud Storage&lt;/strong&gt;: &lt;a href=&quot;https://www.google.com/intl/pt-PT/drive/&quot;&gt;Google Drive&lt;/a&gt; / &lt;a href=&quot;https://www.icloud.com/&quot;&gt;iCloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📷 &lt;strong&gt;Câmera:&lt;/strong&gt; &lt;a href=&quot;https://halide.cam/&quot;&gt;Halide&lt;/a&gt; (iOS)&lt;/li&gt;
&lt;li&gt;📰 &lt;strong&gt;RSS:&lt;/strong&gt; &lt;a href=&quot;https://feedly.com/&quot;&gt;Feedly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;👥 &lt;strong&gt;Lista de Contato:&lt;/strong&gt; Apple Contact&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Navegador:&lt;/strong&gt; &lt;a href=&quot;https://floorp.app/en&quot;&gt;Floorp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Chat:&lt;/strong&gt; &lt;a href=&quot;https://whatsapp.com/&quot;&gt;WhatsApp&lt;/a&gt; e &lt;a href=&quot;https://telegram.org/&quot;&gt;Telegram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🔖 &lt;strong&gt;Favoritos:&lt;/strong&gt; &lt;a href=&quot;https://raindrop.io/&quot;&gt;Raindrop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Lista de leitura:&lt;/strong&gt; &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Suite de escritório:&lt;/strong&gt; Google Docs/Sheets/Slides&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Financeiro:&lt;/strong&gt; &lt;a href=&quot;https://www.google.com/sheets/about/&quot;&gt;Google Sheets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🎵 &lt;strong&gt;Música:&lt;/strong&gt; &lt;a href=&quot;https://www.deezer.com/&quot;&gt;Deezer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🎧 &lt;strong&gt;Podcasts:&lt;/strong&gt; &lt;a href=&quot;https://overcast.fm/&quot;&gt;Overcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Gerenciador de senhas:&lt;/strong&gt; &lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Editor de código:&lt;/strong&gt; &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Terminal:&lt;/strong&gt; &lt;a href=&quot;https://www.warp.dev/&quot;&gt;Warp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Assistente IA:&lt;/strong&gt; &lt;a href=&quot;https://claude.ai/login&quot;&gt;Claude&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;👨‍💻 &lt;strong&gt;Git:&lt;/strong&gt; &lt;a href=&quot;https://github.com/mobile&quot;&gt;Github Mobile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 03 Dec 2024 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2024/12/meus-apps-essenciais-em-2024/</guid>
      </item>
      <item>
        <title>Seja egoísta com sua carreira</title>
        <link>https://blog.tcelestino.dev.br/2024/11/seja-egoista-com-sua-carreira/</link>
        <description>&lt;p&gt;TLDR:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Livro escrito por Luciano Santos, aborda como evoluir na carreira profissional com uma linguagem simples e direta, sem jargões;&lt;/li&gt;
&lt;li&gt;Foca em priorizar o desenvolvimento profissional e os objetivos pessoais, impactando positivamente o engajamento e saúde mental;&lt;/li&gt;
&lt;li&gt;Destaca a importância de se manter atualizado profissionalmente e participar de entrevistas, mesmo estando empregado.&lt;/li&gt;
&lt;li&gt;Me ajudou a evitar tomadas de decisão baseadas na ansiedade do momento.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Com mais tempo disponível para atividades que havia negligenciado, coloquei em prática um dos meus principais objetivos: &lt;em&gt;&lt;strong&gt;ler uma quantidade maior de livros até o final do ano&lt;/strong&gt;&lt;/em&gt;. Decidi começar a compartilhar uma breve opinião sobre cada livro que termino de ler.&lt;/p&gt;
&lt;p&gt;Pois bem! Como desafio aceito geralmente é desafio cumprido, selecionei um livro na biblioteca física. O escolhido foi: &lt;a href=&quot;https://www.amazon.com.br/Seja-ego%C3%ADsta-com-sua-carreira/dp/6588523343&quot;&gt;&lt;strong&gt;Seja egoísta com sua carreira&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Escrito por &lt;a href=&quot;https://www.linkedin.com/in/lucianoresponde/&quot;&gt;Luciano Santos&lt;/a&gt;, o livro traz uma abordagem sem jargões, focando no que realmente desejamos para nossa carreira. Com uma escrita simples e direta, é possível identificar em diversos capítulos situações que vivenciei, as quais achava estar fazendo errado, mas que no final se revelaram como formas de auto-sabotagem.&lt;/p&gt;
&lt;p&gt;Pessoas que sofrem de ansiedade, como eu, têm o instinto de resolver situações desconfortáveis rapidamente, às vezes tomando decisões sem um pensamento crítico. Por exemplo, aceitando uma oferta de trabalho por uma necessidade específica (seja para manter as contas em dia, manter o padrão de vida ou se sentir relevante). No livro, Luciano consegue mostrar que focar plenamente no seu desenvolvimento profissional, priorizando seus objetivos, sejam eles quais forem, impactará positivamente o engajamento, a produtividade e, principalmente, a sua saúde mental. Não quero dizer que todos precisam recusar ofertas de trabalho que não condizem com sua vontade profissional, mas ser mais exigente quanto à qualidade e ao tipo de trabalho a escolher é, sem dúvida, algo reconfortante. &amp;quot;Seja egoísta com sua carreira&amp;quot; nos mostra que ser &amp;quot;egoísta&amp;quot; com a carreira não é algo ruim, mas sim benéfico.&lt;/p&gt;
&lt;p&gt;O que mais curti no livro, além da escrita de fácil compreensão, são os diversos casos (ou seriam &amp;quot;cases&amp;quot;?) que o próprio Luciano vivenciou ou que pessoas que foram mentoradas por ele experimentaram. Me identifiquei com vários deles. Um dos casos mais marcantes foi o de uma pessoa que trabalhava em uma empresa por muitos anos e acreditava no tal &amp;quot;espírito de família&amp;quot;. Ela se considerava insubstituível, acreditando que seu conhecimento pleno sobre o negócio a tornava indispensável. Sabemos como isso termina: com sua demissão. O que realmente me impactou nesse caso foi o fato de a pessoa não ter se mantido atualizada durante todos esses anos. Manter-se atualizado é crucial para qualquer profissão, não só em termos de ferramentas e metodologias, mas também em relação ao mercado. Deixar de participar de entrevistas por medo de alguém da empresa descobrir, ou por &amp;quot;se sentir confortável&amp;quot; na empresa, foi um dos meus erros. Lição aprendida!&lt;/p&gt;
&lt;p&gt;O livro também propõe exercícios práticos interessantes. Um deles consistia em investigar se pessoas que considero inspiradoras para minha carreira haviam planejado suas trajetórias e se tudo ocorreu conforme o esperado. Realizei uma breve pesquisa usando o Google Forms e a enviei para essas pessoas. As respostas obtidas foram esclarecedoras:  nem tudo sai como planejamos. Surpreendentemente, 100% dos respondentes afirmaram não ter planejado suas carreiras, o que me trouxe uma sensação de tranquilidade por não ter planejado a minha própria.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Obrigado a todos os amigos e amigas que dedicaram um tempo para responder minha breve pesquisa.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Um pontapé inicial para mudanças&lt;/h2&gt;
&lt;p&gt;Se você se encontra na incerteza quanto à sua carreira, sentindo que nada está acontecendo como planejado, ou buscando &amp;quot;coragem&amp;quot; para se desafiar em outra profissão/empresa, &amp;quot;&lt;a href=&quot;https://www.amazon.com.br/Seja-ego%C3%ADsta-com-sua-carreira/dp/6588523343&quot;&gt;&lt;strong&gt;Seja egoísta com sua carreira&lt;/strong&gt;&lt;/a&gt;&amp;quot; é um ótimo livro para dar o pontapé inicial. Por experiência própria, posso dizer que a leitura do livro proporcionará mais tranquilidade e, ao mesmo tempo, incentivará você a ser mais ambicioso com sua carreira. Você ganhará coragem para questionar nas entrevistas, para &amp;quot;se jogar&amp;quot; em oportunidades desejadas mesmo sem anos de experiência e, principalmente, para não tomar decisões baseadas na ansiedade do momento.&lt;/p&gt;
&lt;p&gt;Recomendo fortemente para quem deseja sair da zona de conforto e começar a enxergar sua carreira sob uma nova perspectiva.&lt;/p&gt;
</description>
        <pubDate>Mon, 18 Nov 2024 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2024/11/seja-egoista-com-sua-carreira/</guid>
      </item>
      <item>
        <title>Github Copilot Workspace</title>
        <link>https://blog.tcelestino.dev.br/2024/10/github-copilot-workspace/</link>
        <description>&lt;p&gt;TLDR:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Github liberou o Github Copilot Workspace, ferramenta para auxiliar desenvolvedores em brainstorming, planejamento, etc… Estou utilizando há duas semanas e estou achando excelente;&lt;/li&gt;
&lt;li&gt;Fiz uma pequena demonstração de como a ferramenta pode ajudar na produtividade;&lt;/li&gt;
&lt;li&gt;Enfatizo o surgimento cada vez mais ferramentas similares no futuro próximo.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;No início deste ano, em abril, o GitHub &lt;a href=&quot;https://github.blog/news-insights/product-news/github-copilot-workspace/&quot;&gt;apresentou&lt;/a&gt; uma prévia do &lt;strong&gt;GitHub Copilot Workspace&lt;/strong&gt; — uma ferramenta promissora para auxiliar desenvolvedores e entusiastas em tarefas como brainstorming, planejamento, refatoração e criação de testes.&lt;/p&gt;
&lt;p&gt;Alguns meses depois, o GitHub liberou o acesso, e eu comecei a testar a ferramenta. Estou usando-a há cerca de duas semanas, realizando tarefas básicas, e já posso afirmar: é bem útil!&lt;/p&gt;
&lt;p&gt;Para demonstrar seu potencial, fiz uma gravação simples, que você pode conferir nos dois vídeos a seguir.&lt;/p&gt;
&lt;h2&gt;Experimentando&lt;/h2&gt;
&lt;video width=&quot;100%&quot; height=&quot;480&quot; controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://i.imgur.com/RPtGXTD.mp4&quot; type=&quot;video/mp4&quot;&gt;
  Seu navegador não suporta o elemento de vídeo. Assista aqui: https://imgur.com/gallery/github-copilot-workspace-beta-phaItCC
&lt;/video&gt;
&lt;p&gt;Nesse primeiro vídeo, demonstro como gerei um brainstorm sobre o conteúdo necessário para o README.md do projeto. Em seguida, solicitei a criação do que foi planejado.&lt;/p&gt;
&lt;video width=&quot;100%&quot; height=&quot;480&quot; controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://i.imgur.com/afWblM8.mp4&quot; type=&quot;video/mp4&quot;&gt;
  Seu navegador não suporta o elemento de vídeo. Assista aqui: https://imgur.com/gallery/github-copilot-workspace-beta-phaItCC
&lt;/video&gt;
&lt;p&gt;Neste segundo vídeo, após validar as alterações e criar um pull request (PR), solicitei ao Copilot que gerasse uma descrição para o PR. Muitos desenvolvedores sabem como pode ser chato o processo de escrever uma descrição de PR. Com apenas um clique, consegui gerar uma descrição completa. 💥 Se você tiver interesse em ver o PR, acesse aqui: &lt;a href=&quot;https://github.com/tcelestino/learn-programming/pull/1&quot;&gt;https://github.com/tcelestino/learn-programming/pull/11&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Mais ferramentas&lt;/h2&gt;
&lt;p&gt;No Viteconf 2024, o pessoal da &lt;a href=&quot;https://stackblitz.com/&quot;&gt;StackBiltz&lt;/a&gt; surpreendeu com o lançamento do &lt;a href=&quot;https://bolt.new/&quot;&gt;&lt;strong&gt;Bolt.new&lt;/strong&gt;&lt;/a&gt;. Escrevendo &lt;em&gt;prompts&lt;/em&gt;, você consegue criar aplicações do zero, testa-la e se quiser, pode publica-la utilizando a ferramenta.&lt;/p&gt;
&lt;p&gt;Pode ver um exemplo de uso  nesse &lt;a href=&quot;https://x.com/stackblitz/status/1841873251313844631&quot;&gt;https://x.com/stackblitz/status/1841873251313844631&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ainda não testei o &lt;a href=&quot;http://Bolt.new&quot;&gt;Bolt.new&lt;/a&gt; e ainda estou fuçando o grande potencial do Github Copilot Workspace, mas parece que cada vez teremos ainda mais ferramentas desse tipo. 👀&lt;/p&gt;
&lt;p&gt;Não posso deixar de mencionar o &lt;a href=&quot;https://idx.google.com/&quot;&gt;&lt;strong&gt;Project IDX&lt;/strong&gt;&lt;/a&gt; do Google, uma IDE online que simplifica o desenvolvimento de soluções em várias linguagens e frameworks. Recentemente, a ferramenta ganhou suporte ao Gemini, ampliando ainda mais suas capacidades.&lt;/p&gt;
&lt;h2&gt;Referências&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/news-insights/product-news/github-copilot-workspace/&quot;&gt;https://github.blog/news-insights/product-news/github-copilot-workspace/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/ai-and-ml/github-copilot/5-tips-and-tricks-when-using-github-copilot-workspace/&quot;&gt;https://github.blog/ai-and-ml/github-copilot/5-tips-and-tricks-when-using-github-copilot-workspace/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.stackblitz.com/posts/viteconf-2024-recap/&quot;&gt;https://blog.stackblitz.com/posts/viteconf-2024-recap/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 30 Oct 2024 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2024/10/github-copilot-workspace/</guid>
      </item>
      <item>
        <title>Um mês desempregado</title>
        <link>https://blog.tcelestino.dev.br/2024/10/um-mes-desempregado/</link>
        <description>&lt;p&gt;TLDR:&lt;/p&gt;
&lt;p&gt;Fui demitido após 6 anos de trabalho em uma empresa que foi adquirida por outra companhia.&lt;/p&gt;
&lt;p&gt;A empresa passou por mudanças estratégicas, incluindo redução de custos e venda para uma empresa europeia. Apesar das promessas de que mudanças só ocorreriam em 2025, demissões em massa aconteceram antes.&lt;/p&gt;
&lt;p&gt;Me senti aliviado com a demissão, pois vinha enfrentando crises de ansiedade devido às incertezas.&lt;/p&gt;
&lt;p&gt;Estou aproveitando o período para realizar uma cirurgia, ler livros e assistir séries.&lt;/p&gt;
&lt;p&gt;Enfatizo a importância de se preparar financeiramente para situações de desemprego e alerto sobre a saturação do mercado de tecnologia e a necessidade de pensar no futuro.&lt;/p&gt;
&lt;p&gt;Caso queira saber mais detalhes, leia o texto abaixo.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;No dia 17/09/2024, fui chamado pelo CTO da empresa onde trabalhei por 6 anos para &amp;quot;tirar uma dúvida&amp;quot;. Desconfiei, até porque nunca fui chamado naquele horário para esse tipo de conversa. E estava certo! Fui demitido da empresa (prefiro não citar o nome) na qual entrei como desenvolvedor sênior e saí como coordenador (ou team lead, se preferir em inglês) e aprendi demais com todos que convivi durante esses anos,  principalmente por ter tido a oportunidade de enfrentar novos desafios. Sou grato, óbvio!&lt;/p&gt;
&lt;p&gt;Resolvi fazer o resumo de como me senti durante esse primeiro mês desempregado. Espero que sirva de suporte para as pessoas que vêm passando por esse tipo de situação.&lt;/p&gt;
&lt;h2&gt;Contexto&lt;/h2&gt;
&lt;p&gt;Vou simplificar para chegar ao foco principal deste &amp;quot;artigo&amp;quot;.&lt;/p&gt;
&lt;p&gt;A empresa na qual trabalhei por 6 anos fazia parte de um portfólio de empresas de uma grande empresa do outro lado do mundo. Essa companhia tem negócios na Ásia, Oceania e tinha também América Latina (Brasil e México). Posso dizer que é considerada uma das maiores no ramo.&lt;/p&gt;
&lt;p&gt;Algum tempo atrás, essa empresa mudou a pessoa responsável por administrar os negócios das subsidiárias na AL. Na época dessa mudança, comentei com algumas pessoas que algo iria acontecer. Estrategicamente, ouvimos que seria necessário alcançar o break-even e aumentar o número de pessoas assinando os serviços da plataforma. Toda empresa é assim, nada de anormal. Passaram-se alguns meses e houve reduções de custos com eliminação de serviços externos que não eram mais usados ou substituição por serviços menos caros. Ex.: Browserstack.&lt;/p&gt;
&lt;p&gt;Alguns meses se passaram e tudo parecia ocorrer bem, pelo menos era o que a gente acreditava. Ouviamos da “alta gestão” que estava tudo bem, que tudo estava caminhando como esperado que era para continuarmos buscando a economia e ações para trazer mais usuários pagantes. Em algum momento, as reduções dos custos operacionais surtiram efeito, conseguimos atingir o break-even. Sim, a empresa não estava mais gastando o que não tinha. Pelo menos foi isso que nos informaram.&lt;/p&gt;
&lt;p&gt;Vou dar um salto para maio de 2024. De surpresa, fomos comunicados que a empresa estava sendo vendida para outra companhia. Nesse caso, seriamos agora parte de um grupo de empresas de uma companhia europeia. Inclusive, essa companhia é dona de uma das concorrentes direta. Não é mais. É fato que quando há esse tipo de aquisição, ainda mais sendo empresas no mesmo segmento e público, em algum momento haverá reestruturação. Em uma reunião com o novo dono, onde estava pessoas presentes fisicamente e remotas, o novo dono trouxe quais eram as expectativas, algumas percepções de futuro, mas nada tão maduro. Além disso, enfatizaram que as futuras &lt;strong&gt;mudanças só aconteceriam em 2025&lt;/strong&gt; (vai vendo!). Nunca vou esquecer o momento mais “impactante” desse dia. Fomos informados que o trabalho remoto continuaria. As pessoas ficaram super animadas! Foi o momento em que as pessoas bateram palmas por minutos. Ouviram-se até gritos de “uhuuuu”. Foi engraçado!&lt;/p&gt;
&lt;h2&gt;Demissão em massa&lt;/h2&gt;
&lt;p&gt;Passados alguns meses, meu time, que atuava no segmento B2B, era responsável por uma integração importante para a plataforma de ATS da nova empresa. Mesmo na correria, priorizamos essa integração. Era algo que tinha data para ser entregue e as expectativas eram grandes para que tudo estivesse integrado no prazo esperado. Eu, mesmo sendo coordenador, nunca deixei de atuar como desenvolvedor e sempre que podia, participava das atividades para ajudar meu time. Tínhamos várias frentes de trabalho e poucos braços; nessas situações, precisamos ajudar como podemos. Abri alguns pull requests, revisei alguns códigos e continuei garantindo que meu time permanecesse engajado. E eles estavam!&lt;/p&gt;
&lt;p&gt;Novamente vou dar um salto e ir direto para o dia 17/09/2024.&lt;/p&gt;
&lt;p&gt;Geralmente, eu começava a trabalhar às 9h. Abria o Slack, checava os e-mails, a agenda do dia, verificava o dashboard de acompanhamento de performance do time, etc. Nesse dia, recebi uma mensagem do CTO no Slack. Na mensagem, sem exagerar, fui chamado para &amp;quot;tirar uma dúvida&amp;quot;. Estranhei, mas já tinha entendido do que se tratava, até porque nunca recebi mensagem dele nesse horário e principalmente para tirar uma dúvida. Em poucas palavras, fui comunicado que estava deixando a empresa. Já passei por esse tipo de situação antes e as pessoas que precisam comunicar tentam ao máximo amenizar a situação. Querem trazer segurança às pessoas, já que elas estarão deixando o dia a dia e o ganha-pão mensal. Compreensível. Passei alguns anos na empresa e, mesmo não lidando diretamente com o CTO, minha participação em diversos debates importantes me fez ter algum tipo de destaque. Não vou esquecer meu apelido: Celestino, o questionador. 😄 E isso foi enfatizado positivamente no desligamento. Legal, vida segue!&lt;/p&gt;
&lt;p&gt;Sinceramente, me senti aliviado. Gostava do que fazia, das pessoas que trabalhava, do ambiente colaborativo, mas com o aumento das incertezas após a aquisição pelo novo dono, crises de ansiedade bateram em todo mundo. Em mim, vinham mais forte todo início de mês. Eu ficava esperando ser chamado no Slack para &amp;quot;tirar uma dúvida&amp;quot;. Acabou essa sensação! Aquele ditado &amp;quot;foi bom enquanto durou&amp;quot; foi real para mim.&lt;/p&gt;
&lt;p&gt;Fui me despedir do meu time no grupo do WhatsApp e, para minha surpresa, outras pessoas estavam sendo demitidas. Do meu time, duas pessoas ficaram (o especialista e um dev pleno que estava de férias). O time fazia entregas importantes, trouxemos resultados positivos para a empresa, mas com a reestruturação — que só aconteceria em 2025, vale lembrar — resolveram encerrar. Acontece!&lt;/p&gt;
&lt;p&gt;Outros times de tecnologia e outros setores também foram impactados. Passei a acompanhar via LinkedIn e a cada momento recebia atualização de status, inclusão do selo &amp;quot;Open to Work&amp;quot; na foto do perfil, alguns fazendo textos de despedidas, etc. Pessoas boas e competentes que, com certeza, logo estarão em novos desafios profissionais. Se tiver interesse em conhecê-las profissionalmente, montamos uma planilha com o contato: &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1iREXbL2n5x45pKoOBvIMPn5hhsegk6fBIJqCjkREQRo/edit?gid=0#gid=0&quot;&gt;https://docs.google.com/spreadsheets/d/1iREXbL2n5x45pKoOBvIMPn5hhsegk6fBIJqCjkREQRo/edit?gid=0#gid=0&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Novos ares&lt;/h2&gt;
&lt;p&gt;No primeiro dia, você fica querendo se empregar rapidamente. A sensação de que precisa ocupar logo a mente com um emprego que te pague mensalmente bate forte demais. Não sei se foi o destino, mas, por incrível que pareça, no dia anterior (16.09) à minha demissão, recebi um contato de uma recrutadora sobre uma oportunidade de trabalho em uma empresa daqui da minha cidade (Salvador, Bahia). Respondi e fiz todo o processo. Consegui a vaga em uma semana. Achei impressionante! O processo foi muito bom, conduzido de maneira humana e assertiva. Demorei alguns dias para dar uma resposta se aceitaria ou não. A recrutadora e a empresa foram bem compreensíveis. No fim, decidi continuar desempregado, ou melhor, me energizando (soa estranho, mas é real). Precisava fazer uma cirurgia importante, e fiz! Precisava ler os livros pendentes, li um até agora (🤦). Queria poder assistir séries e filmes salvos nas diversas listas nos streamings, já assisti muitos. Fazer isso tudo sem precisar me preocupar é algo energizador; acredito que todo mundo precisa passar por isso, nem que seja por um mês (faça nas férias, por exemplo).&lt;/p&gt;
&lt;p&gt;Muitos que leram até aqui podem estar se perguntando se não tenho contas, dívidas, etc. Posso dizer que hoje estou bem. Tudo controlado e organizado para ficar um bom tempo sem me preocupar. Acompanho o subreddit &lt;a href=&quot;https://www.reddit.com/r/brdev/&quot;&gt;/r/brdev&lt;/a&gt; e o que mais vejo por lá são pessoas comentando que o mercado está saturado, que tem muitos profissionais com anos de experiência que não estão conseguindo emprego, etc. Me assusta, claro, mas também percebi que muita gente no mercado de tecnologia não pensa/pensou no futuro. Olha que fui aprender tarde a investir, mas ver pessoas com 10, 15 anos de experiência escrevendo posts em rede social alegando passar fome, só mostra o quanto as pessoas ainda não se conscientizaram de que nada é para sempre. Não quero julgar ninguém, até porque desconheço a realidade de muitos; cada um tem seu estilo de vida, seus objetivos, sonhos, etc. Mas pensar que estará sempre recebendo seu salário de 10k, 15k, 20k e não pensar no futuro, pode e está frustrando muita gente na área de tecnologia. É complicado pensar que muita gente acredita que estará na ativa para sempre.&lt;/p&gt;
&lt;p&gt;Como todo &amp;quot;guru de investimentos&amp;quot; costuma dizer: faça sua reserva de emergência. Independentemente do valor que consiga adicionar mensalmente, crie o hábito de guardar dinheiro. No futuro, se enfrentar uma demissão, você se sentirá mais tranquilo por um período, pelo menos.&lt;/p&gt;
&lt;p&gt;Quanto ao meu futuro, continuo participando de processos seletivos. Agora posso ser mais seletivo com as oportunidades, focando em empresas nas quais acredito, não apenas naquelas que oferecem um salário x ou y. Em breve, espero estar de volta ao mercado e torço para que todos os afetados na antiga empresa também encontrem novos desafios. Até lá, vou continuar colocando a leitura em dia, assistindo a séries e filmes, fazendo cursos e aproveitando meus dias de desempregado.&lt;/p&gt;
</description>
        <pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2024/10/um-mes-desempregado/</guid>
      </item>
      <item>
        <title>The State of JS 2021</title>
        <link>https://blog.tcelestino.dev.br/2022/02/state-of-js-2021/</link>
        <description>&lt;p&gt;Depois do &lt;a href=&quot;https://blog.tcelestino.dev.br/2022/01/state-of-css-2021/&quot;&gt;State of CSS 2021&lt;/a&gt;, temos agora o &lt;a href=&quot;https://2021.stateofjs.com/&quot;&gt;States of JS 2021&lt;/a&gt;. Se você é interessado em entender quais foram as ferramentas, bibliotecas baseadas no Javascript mais populares no ano de 2021, vai querer conferir &lt;a href=&quot;https://2021.stateofjs.com/&quot;&gt;conferir&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Mon, 21 Feb 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/02/state-of-js-2021/</guid>
      </item>
      <item>
        <title>Next.js Developer Survey</title>
        <link>https://blog.tcelestino.dev.br/2022/02/nextjs-developer-survey/</link>
        <description>&lt;p&gt;Se você utiliza o &lt;a href=&quot;https://nextjs.org&quot;&gt;Next.js&lt;/a&gt; em seus projetos pessoais, ou no trabalho, vale a pena responder a &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSeRWegF1xgt_mKkxQGSHZPyegADsMY0YhJSY61WYi_xgQfi3g/viewform&quot;&gt;pesquisa&lt;/a&gt; realizada pelo o time da &lt;a href=&quot;https://vercel.com&quot;&gt;Vercel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Não vai levar mais de 5 minutos!&lt;/p&gt;
</description>
        <pubDate>Sat, 19 Feb 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/02/nextjs-developer-survey/</guid>
      </item>
      <item>
        <title>A história do React.js</title>
        <link>https://blog.tcelestino.dev.br/2022/02/a-historia-do-reactjs/</link>
        <description>&lt;iframe width=&quot;100%&quot; height=&quot;500&quot; src=&quot;https://www.youtube.com/embed/Wm_xI7KntDs&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Sat, 12 Feb 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/02/a-historia-do-reactjs/</guid>
      </item>
      <item>
        <title>Novidades do Javascript para 2022</title>
        <link>https://blog.tcelestino.dev.br/2022/01/novidades-javascript-2022/</link>
        <description>&lt;p&gt;Esse ano não teremos tantas novidades planejadas para o Javascript (também pode chamar de ES2022), porém achei algumas dessas novidades interessantes.&lt;/p&gt;
&lt;h2&gt;Top-level await&lt;/h2&gt;
&lt;p&gt;Hoje, só conseguimos usar o operador &lt;code&gt;await&lt;/code&gt; a partir de uma função assíncrona (&lt;code&gt;async&lt;/code&gt;). A partir do ES2022, não haverá mais essa necessidade.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// antes&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getUserData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// agora&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getUserData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Não vamos precisar mais usar &lt;a href=&quot;https://developer.mozilla.org/pt-BR/docs/Glossary/IIFE&quot;&gt;IIFE (Immediately Invoked Function Expression)&lt;/a&gt; para definir uma função assíncrona e usar o &lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;at()&lt;/h2&gt;
&lt;p&gt;Quando precisamos capturar o último indíce de um array, hoje utilizamos a seguinte técnica:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; arr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;foo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;bar&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; lastItem &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;arr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// bar&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A partir do ES2022, teremos o método &lt;code&gt;at()&lt;/code&gt; para facilitar esse tipo de implementação.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; arr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;foo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;bar&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; lastItem &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// bar&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vale lembrar que também podemos utilizar o &lt;code&gt;at&lt;/code&gt; para recuperar qualquer indíce de um array.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; arr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;foo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;bar&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; lastItem &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// foo&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Muito mais simples!!&lt;/p&gt;
&lt;h2&gt;Classes sem construtor&lt;/h2&gt;
&lt;p&gt;Agora vai ser possível criar classes sem um &lt;code&gt;constructor&lt;/code&gt;. Se já criou componentes usando classes no &lt;a href=&quot;https://reactjs.org&quot;&gt;React.js&lt;/a&gt;, utilizando o &lt;a href=&quot;https://babeljs.io&quot;&gt;Babel&lt;/a&gt;, irá achar essa novidade bem interessante.&lt;/p&gt;
&lt;p&gt;Agora podemos escrever classes assim:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  foo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;bar&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  #bar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function-variable function&quot;&gt;getFoo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;foo&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function-variable function&quot;&gt;boom&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// apenas um exemplo&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;#bar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;#bar&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como você deve ter notado, também será possível usar informações privadas de uma classe utilizando o operador &lt;code&gt;#&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fonte: &lt;a href=&quot;https://bytes.dev/archives/83&quot;&gt;bytes.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 25 Jan 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/01/novidades-javascript-2022/</guid>
      </item>
      <item>
        <title>Configurar uma porta diferente no Next.js</title>
        <link>https://blog.tcelestino.dev.br/2022/01/configurar-porta-nextjs/</link>
        <description>&lt;p&gt;Por padrão, ao executar uma aplicação &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;, a aplicação será acessa na seguinte url http://localhost:3000. Caso queria alterar a porta padrão da aplicação, só é preciso fazer um pequeno ajuste no seu arquivo &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O padrão do &lt;code&gt;package.json&lt;/code&gt; no Next.js é assim (caso não use o Typescript):&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;meu-projeto-next&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;private&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;next dev&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;next build&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;next start&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;next&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;12.0.8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;17.0.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;react-dom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;17.0.2&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para alterar a porta, você só precisa alterar o script &lt;code&gt;&amp;quot;dev&amp;quot;: &amp;quot;next dev&amp;quot;&lt;/code&gt; para &lt;code&gt;&amp;quot;dev&amp;quot;: &amp;quot;next dev -p 3001&amp;quot;&lt;/code&gt;. Assim, quando rodar &lt;code&gt;npm dev&lt;/code&gt;, seu aplicação rodará na url http://localhost:3001 e não mais na porta &amp;quot;3000&amp;quot;.&lt;/p&gt;
&lt;p&gt;No final, o arquivo &lt;code&gt;package.json&lt;/code&gt; fica assim:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;meu-projeto-next&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;private&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;next dev -p 3001&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;next build&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;next start&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;next&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;12.0.8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;17.0.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;react-dom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;17.0.2&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description>
        <pubDate>Tue, 18 Jan 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/01/configurar-porta-nextjs/</guid>
      </item>
      <item>
        <title>Definições do front-end</title>
        <link>https://blog.tcelestino.dev.br/2022/01/definicao-frontend/</link>
        <description>&lt;h2&gt;Front-end UI&lt;/h2&gt;
&lt;p&gt;É focado em lidar com toda a parte visual da aplicação, e tem algumas obrigações, como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lidar com frameworks de layout;&lt;/li&gt;
&lt;li&gt;cuidar do styleguide;&lt;/li&gt;
&lt;li&gt;construir uma interface semântica;&lt;/li&gt;
&lt;li&gt;facilitar visualização de dados através de gráficos SVG/canvas;&lt;/li&gt;
&lt;li&gt;lidar com animações;&lt;/li&gt;
&lt;li&gt;participar e encabeçar das discussões de UX;&lt;/li&gt;
&lt;li&gt;desenvolver código acessível a pessoas com necessidades especiais;&lt;/li&gt;
&lt;li&gt;garantir que o progressive enhancement ou graceful degradation sejam aplicados;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Front-end Engineer&lt;/h2&gt;
&lt;p&gt;É responsável pela estrutura da aplicação. Suas responsabilidades se resumem a:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;criar ambiente de front de desenvolvimento e produção;&lt;/li&gt;
&lt;li&gt;definir tarefas de build;&lt;/li&gt;
&lt;li&gt;prover a sincronia entre back-end e front;&lt;/li&gt;
&lt;li&gt;escolher entre aplicar um framework de JavaScript ou não;&lt;/li&gt;
&lt;li&gt;criar os testes de interface/unitários;&lt;/li&gt;
&lt;li&gt;manter código padronizado;&lt;/li&gt;
&lt;li&gt;definir pattern de código;&lt;/li&gt;
&lt;li&gt;usar ferramentas compatíveis com browsers, lembrando sempre do cross-browser;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 17 Jan 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/01/definicao-frontend/</guid>
      </item>
      <item>
        <title>Newsletters sobre tecnologias e desenvolvimento</title>
        <link>https://blog.tcelestino.dev.br/2022/01/newsletters-ti-desenvolvimento/</link>
        <description>&lt;p&gt;Todas as newsletters abaixo são gratuitas!&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.braziljs.org/&quot;&gt;BrazilJS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Plataforma multicanal de produção e curadoria de conteúdo com foco nas Comunidades dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://filipedeschamps.com.br/newsletter&quot;&gt;Filipe Deschamps Newsletter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Notícias de Tecnologia para quem não tem tempo de ler notícias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://manualdousuario.net/acompanhe/&quot;&gt;Manual do Usuário&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A newsletter é a melhor maneira de acompanhar o Manual do Usuário&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.interfaces.news/&quot;&gt;Interfaces&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;o melhor da tecnologia na sua caixa de entrada, toda sexta-feira no seu e-mail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://buttondown.email/pinguinsmoveis&quot;&gt;Pinguins Móveis&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Esta é uma newsletter semanal documentando e analisando a marcha do Linux por todos os cantos da eletrônica de consumo - e, portanto, das nossas vidas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://css-weekly.com/&quot;&gt;CSS Weekly&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weekly e-mail roundup of CSS articles, tutorials, experiments, and tools curated by Zoran Jambor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://frontendfoc.us/&quot;&gt;Frontend focus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A once–weekly roundup of the best front-end news, articles and tutorials. HTML, CSS, WebGL, Canvas, browser tech, and more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://bytes.dev/?x=478660080&amp;amp;ck_subscriber_id=478660080&quot;&gt;bytes.dev&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Staying informed on the JavaScript ecosystem has never been so entertaining. Delivered every Monday, for free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.getrevue.co/profile/fridayfrontend&quot;&gt;Friday Front-end&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Front-end development links tweeted daily, emailed weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://javascriptweekly.com/&quot;&gt;Javascript Weekly&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A newsletter of JavaScript articles, news and cool projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://nodeweekly.com/&quot;&gt;Node Weekly&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A free, once–weekly e-mail round-up of Node.js news and articles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://jamstack.email&quot;&gt;Jamstacked&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;An email update on the evolving JAMstack ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.getrevue.co/profile/frontendhorse&quot;&gt;Frontend Horse Newsletter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A round-up of the web&#39;s best CodePens, websites, and articles, plus the latest Frontend Horse content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://react.statuscode.com/&quot;&gt;React Status&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A weekly roundup of the latest React and React Native links and tutorials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://daily-dev-tips.com/&quot;&gt;Daily Dev Tips&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;I write daily web development tips that help you become a more efficient software developer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://web-design-weekly.com/&quot;&gt;Web Design Weekly&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Be the first to know about the latest Web Design and Front-end trends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://serverless.email/&quot;&gt;Serverless Status&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A weekly newsletter on serverless and function-as-a-service (FaaS) architectures and platforms including AWS Lambda and Azure Functions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</description>
        <pubDate>Sat, 15 Jan 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/01/newsletters-ti-desenvolvimento/</guid>
      </item>
      <item>
        <title>As tendências de desenvolvimento em 2021</title>
        <link>https://blog.tcelestino.dev.br/2022/01/as-tendencias-de-2021/</link>
        <description>&lt;p&gt;Confira o que foi tendência em 2021 no mundo do desenvolvimento frontend, Node.js, React, Vue, entre outros.&lt;/p&gt;
&lt;p&gt;Confira na edição &amp;quot;&lt;a href=&quot;https://risingstars.js.org/2021/en&quot;&gt;2021 Javascript Rising Stars&lt;/a&gt;&amp;quot;&lt;/p&gt;
</description>
        <pubDate>Mon, 10 Jan 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/01/as-tendencias-de-2021/</guid>
      </item>
      <item>
        <title>Faker.js encerrado por seu criador</title>
        <link>https://blog.tcelestino.dev.br/2022/01/fakerjs-encerrado-por-seu-criador/</link>
        <description>&lt;p&gt;O &lt;a href=&quot;https://github.com/Marak/&quot;&gt;@marak&lt;/a&gt; fez um pull request encerrando o projeto do &lt;a href=&quot;https://github.com/Marak/faker.js&quot;&gt;Faker.js&lt;/a&gt;. Pelo o que entendi, seria uma forma de protestar sobre o fato da morte do &lt;a href=&quot;https://pt.wikipedia.org/wiki/Aaron_Swartz&quot;&gt;Aaron Swartz&lt;/a&gt;. Inclusive, recomendo assistir o documentário &lt;strong&gt;&amp;quot;The Internet&#39;s Own Boy: The Story of Aaron Swartz&amp;quot;&lt;/strong&gt; para conhecer os trabalhos do Swartz, que envolve grandes contribuições para Internet, como a criação da tecnologia &lt;a href=&quot;https://pt.wikipedia.org/wiki/RSS&quot;&gt;RSS&lt;/a&gt; e da rede social &lt;a href=&quot;https://reddit.com&quot;&gt;reddit&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;O que fazer?&lt;/h2&gt;
&lt;p&gt;Mantenha a versão 5.5.3 fixa no arquivo &lt;em&gt;package.json&lt;/em&gt; em seus projetos.&lt;/p&gt;
&lt;p&gt;Por ser um projeto de código aberto, foi feito um &lt;a href=&quot;https://github.com/withshepherd/faker.js&quot;&gt;fork&lt;/a&gt; no qual a comunidade pretende continuar mantendo o projeto.&lt;/p&gt;
&lt;h2&gt;E o futuro&lt;/h2&gt;
&lt;p&gt;Por enquanto não há nenhum indício de que o &lt;a href=&quot;https://twitter.com/marak&quot;&gt;@marak&lt;/a&gt; irá voltar oficialmente com o projeto. Em um tweet, ele expõem que o &lt;a href=&quot;https://github.com&quot;&gt;Github&lt;/a&gt; (dona do &lt;strong&gt;npm&lt;/strong&gt;) reverteu a versão do Faker.js com a remoção do código do projeto e suspendeu sua conta no site.&lt;/p&gt;
&lt;blockquote&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;NPM has reverted to a previous version of the faker.js package and Github has suspended my access to all public and private projects. I have 100s of projects. &lt;a href=&quot;https://twitter.com/hashtag/AaronSwartz?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#AaronSwartz&lt;/a&gt; &lt;a href=&quot;https://t.co/zFddwn631S&quot;&gt;pic.twitter.com/zFddwn631S&lt;/a&gt;&lt;/p&gt;&amp;mdash; marak 🗿 (@marak) &lt;a href=&quot;https://twitter.com/marak/status/1479200803948830724?ref_src=twsrc%5Etfw&quot;&gt;January 6, 2022&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Acompanhando os próximos capítulos dessa história.&lt;/p&gt;
</description>
        <pubDate>Fri, 07 Jan 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/01/fakerjs-encerrado-por-seu-criador/</guid>
      </item>
      <item>
        <title>State of CSS 2021</title>
        <link>https://blog.tcelestino.dev.br/2022/01/state-of-css-2021/</link>
        <description>&lt;p&gt;É notável que o CSS vem evoluindo de forma bem considerável durante esses anos, e olhando o resultado da pesquisa &lt;a href=&quot;https://2021.stateofcss.com&quot;&gt;State of CSS 2021&lt;/a&gt;, fica nítido a quantidade de recursos existentes que conseguem resolver problemas que antes eram resolvidos por Javascript.&lt;/p&gt;
&lt;p&gt;Vale a &lt;a href=&quot;https://2021.stateofcss.com&quot;&gt;conferida&lt;/a&gt;!&lt;/p&gt;
</description>
        <pubDate>Mon, 03 Jan 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/01/state-of-css-2021/</guid>
      </item>
      <item>
        <title>Iniciando</title>
        <link>https://blog.tcelestino.dev.br/2022/01/iniciando/</link>
        <description>&lt;p&gt;Em 2021 algumas mudanças foram realizadas, outras nem chegaram acontecer, mas pretendo fazer diferente esse ano.&lt;/p&gt;
&lt;p&gt;Nesse &lt;strong&gt;Blocos de Notas&lt;/strong&gt;, vou anotar irei aprender durante o ano, seja conhecimento técnico ou não.&lt;/p&gt;
&lt;p&gt;Ao longo do tempo, farei ajustes por aqui para deixar com minha &amp;quot;cara&amp;quot;.&lt;/p&gt;
</description>
        <pubDate>Sat, 01 Jan 2022 00:00:00 GMT</pubDate>
        <dc:creator>Tiago Celestino</dc:creator>
        <guid>https://blog.tcelestino.dev.br/2022/01/iniciando/</guid>
      </item>
  </channel>
</rss>
