<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eduardo Donato</title>
    <description>The latest articles on DEV Community by Eduardo Donato (@ebdonato).</description>
    <link>https://dev.to/ebdonato</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F547737%2Fec1482e3-c41a-4937-b478-24c528858f99.png</url>
      <title>DEV Community: Eduardo Donato</title>
      <link>https://dev.to/ebdonato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ebdonato"/>
    <language>en</language>
    <item>
      <title>Transforming my Resume into an Interactive Terminal Business Card using NPM 🚀</title>
      <dc:creator>Eduardo Donato</dc:creator>
      <pubDate>Sun, 08 Feb 2026 04:18:35 +0000</pubDate>
      <link>https://dev.to/ebdonato/transforming-my-resume-into-an-interactive-terminal-business-card-using-npm-1665</link>
      <guid>https://dev.to/ebdonato/transforming-my-resume-into-an-interactive-terminal-business-card-using-npm-1665</guid>
      <description>&lt;p&gt;I decided to transform my resume and contact information into something more "dev-friendly": an interactive business card that runs directly in the terminal.&lt;/p&gt;

&lt;p&gt;This new version is actually a complete rewrite of a similar project I developed a while back in the &lt;a href="https://github.com/ebdonato/npx_card" rel="noopener noreferrer"&gt;npx_card&lt;/a&gt; repository. I chose to archive the old project and start from scratch to build something more robust and organized, which resulted in the new &lt;a href="https://github.com/ebdonato/card-tui" rel="noopener noreferrer"&gt;card-tui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple: instead of sending a PDF or a standard portfolio link, I can just say:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Got Node installed? Just run npx ebdonato in your terminal."&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;💡 The Inspiration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The project was originally inspired by &lt;a href="https://github.com/anmol098/npx_card" rel="noopener noreferrer"&gt;anmol098/npx_card&lt;/a&gt;. It turned the networking experience into something playful and technical at the same time. I’m not sure if he came up with the original idea, but it’s brilliant nonetheless.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🛠️ How to use&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To view the card, you don't need to install anything permanently. As long as you have Node.js installed, just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ebdonato
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;🏗️ What's under the hood?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To build &lt;strong&gt;card-tui&lt;/strong&gt;, I used (well, the AI used) some classic Node.js CLI libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inquirer.js&lt;/strong&gt;: To create the interactive menu.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boxen&lt;/strong&gt;: To create that sleek border around the information.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chalk&lt;/strong&gt;: To add color to the terminal and highlight links and job titles.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marked&lt;/strong&gt;: To render the Markdown content.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open&lt;/strong&gt;: To trigger and open links in the user's default browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🚀 Why do this?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Beyond being a creative way to introduce yourself, developing an NPM package focused on a &lt;strong&gt;TUI&lt;/strong&gt; (Terminal User Interface) helps you understand:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Package publishing and versioning on the NPM registry.
&lt;/li&gt;
&lt;li&gt;Handling input and output streams in Node.js.
&lt;/li&gt;
&lt;li&gt;Design focused on constraints (the terminal is limited, which forces simplicity).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The code is open-source on my GitHub for anyone who wants to use it as a template for their own: &lt;a href="https://github.com/ebdonato/card-tui" rel="noopener noreferrer"&gt;ebdonato/card-tui&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tui</category>
      <category>node</category>
      <category>npm</category>
      <category>cv</category>
    </item>
    <item>
      <title>Stop Nesting Try/Catch: How I Turned a Repetitive Pattern into an NPM Package (promise-tuple)</title>
      <dc:creator>Eduardo Donato</dc:creator>
      <pubDate>Sat, 31 Jan 2026 20:14:18 +0000</pubDate>
      <link>https://dev.to/ebdonato/stop-nesting-trycatch-how-i-turned-a-repetitive-pattern-into-an-npm-package-promise-tuple-4lia</link>
      <guid>https://dev.to/ebdonato/stop-nesting-trycatch-how-i-turned-a-repetitive-pattern-into-an-npm-package-promise-tuple-4lia</guid>
      <description>&lt;p&gt;Recently, I noticed that in almost every project, I was writing the same utility to handle Promises. I decided it was time to stop copy-pasting code and published a npm package: &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/promise-tuple" rel="noopener noreferrer"&gt;promise-tuple&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Motivation
&lt;/h3&gt;

&lt;p&gt;You know those times when you need to run several asynchronous calls in sequence, but each one requires specific error handling? The traditional &lt;code&gt;try/catch&lt;/code&gt; pattern often results in "staircase code" or multiple variables declared with &lt;code&gt;let&lt;/code&gt; outside the block just so they can be accessed later.&lt;/p&gt;

&lt;p&gt;Example of the "problem":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handleUserError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchPosts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handlePostError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Solution: The Tuple Pattern
&lt;/h3&gt;

&lt;p&gt;Inspired by languages like &lt;strong&gt;Go&lt;/strong&gt;, the idea is to always return a tuple (a fixed array) containing &lt;code&gt;[data, error]&lt;/code&gt;. If an error occurs, it’s populated; otherwise, you have your data.&lt;/p&gt;

&lt;p&gt;Using &lt;strong&gt;promise-tuple&lt;/strong&gt;, the code above looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;promiseTuple&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;promise-tuple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userErr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;promiseTuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userErr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handleUserError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userErr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;postsErr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;promiseTuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetchPosts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postsErr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handlePostError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postsErr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why use it?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Readability:&lt;/strong&gt; The error flow is explicit and sits right next to the function call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native TypeScript:&lt;/strong&gt; The package was built with type inference in mind, so both &lt;code&gt;data&lt;/code&gt; and &lt;code&gt;error&lt;/code&gt; are correctly typed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimalist:&lt;/strong&gt; Zero external dependencies and extremely lightweight.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;I know there are other libraries that do similar things, but building my own allowed me to tailor it exactly to my needs and, in the process, give back to the community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it out here:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/promise-tuple" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/promise-tuple&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>javascript</category>
      <category>npm</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Bringing the Linux "touch" Command to Windows with a PowerShell Module</title>
      <dc:creator>Eduardo Donato</dc:creator>
      <pubDate>Thu, 29 Jan 2026 03:52:23 +0000</pubDate>
      <link>https://dev.to/ebdonato/bringing-the-linux-touch-command-to-windows-with-a-powershell-module-15ml</link>
      <guid>https://dev.to/ebdonato/bringing-the-linux-touch-command-to-windows-with-a-powershell-module-15ml</guid>
      <description>&lt;p&gt;If you frequently switch between Linux/macOS and Windows, or if you've recently migrated to Windows, you've likely experienced the frustration of opening PowerShell, instinctively typing &lt;code&gt;touch file.txt&lt;/code&gt;, and being hit with a "command not found" error.&lt;/p&gt;

&lt;p&gt;While PowerShell has the native &lt;code&gt;New-Item&lt;/code&gt; cmdlet, its syntax isn't as fluid or intuitive for daily use as the simple &lt;code&gt;touch&lt;/code&gt; command. To solve this and maintain my muscle memory, I developed the &lt;strong&gt;TouchCMD&lt;/strong&gt; module and made it available on the &lt;a href="https://www.powershellgallery.com/packages/TouchCMD/1.0.1" rel="noopener noreferrer"&gt;PowerShell Gallery&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Motivation
&lt;/h2&gt;

&lt;p&gt;On Windows, the standard way to create an empty file via the terminal is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even with the &lt;code&gt;ni&lt;/code&gt; alias, it still requires more effort than it should. On Linux, &lt;code&gt;touch&lt;/code&gt; is universal, simple, and direct. I wanted that same seamless experience in PowerShell without having to rely on WSL or Git Bash for basic file manipulations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;The idea gained momentum after reading &lt;a href="https://cassidoo.co/post/touch-on-ps" rel="noopener noreferrer"&gt;this post by Cassidy Williams&lt;/a&gt;, where she shares a simple function to emulate this behavior. I decided to take that concept and package it into a properly structured PowerShell module, making it easier to install and ensuring it persists across terminal sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Install
&lt;/h2&gt;

&lt;p&gt;Since it is published on the PowerShell Gallery, you can install it quickly with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Install-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TouchCmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CurrentUser&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can clone the repository directly from GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage Examples
&lt;/h2&gt;

&lt;p&gt;The goal is to mirror the simplicity of the original command:&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a new file
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;touch C:\path\to\newfile.txt&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Update the timestamp of an existing file
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;touch C:\path\to\existingfile.txt&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Using the pipeline
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;"file1.txt", "file2.txt", "file3.txt" | touch&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This is a simple project, but it removes a constant point of friction for developers working across multiple operating systems.&lt;/p&gt;

&lt;p&gt;The code is open source, and contributions are more than welcome! If you use Windows and miss this convenience, feel free to check out the repository:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ebdonato/touch-powershell" rel="noopener noreferrer"&gt;ebdonato/touch-powershell&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Translated using AI, original in Portuguese: &lt;a href="https://www.tabnews.com.br/ebdonato/criei-um-modulo-powershell-para-trazer-o-comando-touch-do-linux-para-o-windows" rel="noopener noreferrer"&gt;tabnews&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>shell</category>
    </item>
    <item>
      <title>11 useful websites</title>
      <dc:creator>Eduardo Donato</dc:creator>
      <pubDate>Tue, 25 Nov 2025 22:00:20 +0000</pubDate>
      <link>https://dev.to/ebdonato/11-useful-websites-1p3o</link>
      <guid>https://dev.to/ebdonato/11-useful-websites-1p3o</guid>
      <description>&lt;p&gt;Here is the list of 11 useful websites:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pairdrop.net" rel="noopener noreferrer"&gt;Pairdrop &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instantly share files between your devices, no apps or sign-up required. You can connect via local network or create a public room and easily share files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vert.sh" rel="noopener noreferrer"&gt;Vert &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fast, unlimited, free, and open-source file converter. Supports images, audio, video, and documents, with advanced options and privacy focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://enclosed.cc" rel="noopener noreferrer"&gt;Enclosed&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For creating self-destructing notes and sharing them with encryption. You can set password, expiration, and delete-after-read settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://paint.sumo.app" rel="noopener noreferrer"&gt;Sumo Paint&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Free online image editor, with advanced features similar to Photoshop and support for PSD files directly in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://screenrec.com" rel="noopener noreferrer"&gt;Screenrec Pro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Record and edit your screen in the browser, no need to install programs. Offers live annotation tools and easy video sharing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://poindeo.com" rel="noopener noreferrer"&gt;Poindeo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tool for recording, editing, and exporting videos entirely online. Supports automatic subtitles and exports in various formats.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://atomicmail.io" rel="noopener noreferrer"&gt;Atomic Mail&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Provides secure and encrypted email, ad-free, easy to set up and maintain. The service is free, with paid aliases option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bentopdf.com" rel="noopener noreferrer"&gt;Bento PDF&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Complete toolkit for handling PDFs right in your browser, with merge, split, sign, compress, and edit. Works offline and is open-source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dewatermark.ai" rel="noopener noreferrer"&gt;DeWatermark AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Automatically removes watermarks from photos using AI. Simply upload the image, edit if needed, and download the clean version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://magiceraser.org" rel="noopener noreferrer"&gt;Magic Eraser&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remove unwanted objects from your images with AI directly in the browser — just select and erase.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ttsmaker.com" rel="noopener noreferrer"&gt;TTS Maker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Convert text to audio for free, in various languages and with customizable voices. Allows adding background music and adjusting audio speed.&lt;/p&gt;




&lt;p&gt;These sites focus on productivity, privacy, and ease of use, many being free and open-source, as presented in &lt;a href="https://youtube.com/watch?v=jHNH7hP_KJI" rel="noopener noreferrer"&gt;this video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/jHNH7hP_KJI"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>resources</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Desestruturação para variáveis já existentes</title>
      <dc:creator>Eduardo Donato</dc:creator>
      <pubDate>Sun, 02 Jan 2022 19:44:35 +0000</pubDate>
      <link>https://dev.to/ebdonato/desestruturacao-para-variaveis-ja-existentes-28je</link>
      <guid>https://dev.to/ebdonato/desestruturacao-para-variaveis-ja-existentes-28je</guid>
      <description>&lt;p&gt;É possível utilizar desestruturação para variáveis ao invés de sempre criar novas.&lt;/p&gt;

&lt;p&gt;Por exemplo, caso tenhamos um objeto como o a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Eduardo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;39&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos fazer a desestruturação com a seguinte sintaxe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Eduardo&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 39&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém se as variáveis &lt;code&gt;name&lt;/code&gt; e &lt;code&gt;age&lt;/code&gt; já tiverem sido declaradas no mesmo escopo, será necessário desestruturar e renomear ao mesmo tempo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newAge&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Eduardo&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newAge&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 39&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para atribuir a desestruturação para as variáveis declaradas anteriormente, utiliza-se a seguinte sintaxe (parênteses na declaração):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fulano&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Eduardo&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 39&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atualização: também funciona com &lt;em&gt;arrays&lt;/em&gt;. Inclusive, nesse caso, utilizando &lt;em&gt;;&lt;/em&gt; no fim das sentenças, não é necessário o parênteses. &lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
  </channel>
</rss>
