<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[The Algomist]]></title><description><![CDATA[The Algomist]]></description><link>https://blog.neilbpatel.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1696930481781/hcorTvUSZ.png</url><title>The Algomist</title><link>https://blog.neilbpatel.com</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 13:59:37 GMT</lastBuildDate><atom:link href="https://blog.neilbpatel.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Brief Thoughts on Privacy and 2 Tricks Your Service Provider Don't Want You To Know]]></title><description><![CDATA[I’m not a philosopher, nor a legal expert. However, I am curious. At least in the United States of America, privacy is not guaranteed. Oftentimes, companies are playing a game of cat-and-mouse against governing bodies, B2B contractual obligations, an...]]></description><link>https://blog.neilbpatel.com/brief-thoughts-on-privacy-and-2-tricks-your-service-provider-dont-want-you-to-know</link><guid isPermaLink="true">https://blog.neilbpatel.com/brief-thoughts-on-privacy-and-2-tricks-your-service-provider-dont-want-you-to-know</guid><category><![CDATA[privacy]]></category><category><![CDATA[self-hosted]]></category><category><![CDATA[Consumer rights]]></category><category><![CDATA[consumer]]></category><category><![CDATA[TermsOfService]]></category><category><![CDATA[termsandconditions ]]></category><category><![CDATA[terms]]></category><category><![CDATA[privacy protection]]></category><category><![CDATA[privacypolicy]]></category><category><![CDATA[Policy]]></category><category><![CDATA[policies]]></category><category><![CDATA[generative ai]]></category><category><![CDATA[genai]]></category><category><![CDATA[AI]]></category><category><![CDATA[#ai-tools]]></category><dc:creator><![CDATA[Neil Patel]]></dc:creator><pubDate>Thu, 12 Feb 2026 09:15:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/JFk0dVyvdvw/upload/fabac9f0faadca5ecf25d59d84f650dc.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I’m not a philosopher, nor a legal expert. However, I am curious. At least in the United States of America, privacy is not guaranteed. Oftentimes, companies are playing a game of cat-and-mouse against governing bodies, <a target="_blank" href="https://en.wikipedia.org/wiki/Business-to-business">B2B</a> contractual obligations, and lawsuits. While the consumer is typically the primary focus of these conversations, oftentimes it is only to the extent of baseline requirements which aid in retaining and garnering more consumers, with many facets of the average consumer experience left as an afterthought.</p>
<p>Perhaps I’ll make this a series of posts which widen the discussion to consumer-centric agency and protection in the current technological landscape, such as copyright, right to repair, ownership, centralization, self-hosting, and personal projects concerning the aforementioned. Perhaps I won’t.</p>
<p>For now, let’s focus on something that most people are familiar with to some extent — Privacy Policies and Terms of Service.</p>
<h1 id="heading-privacy-policies-and-terms-of-service">Privacy Policies and Terms of Service</h1>
<blockquote>
<p>A <strong>privacy policy</strong> is a statement or legal document (in privacy law) that discloses some or all of the ways a party gathers, uses, discloses, and manages a customer or client's data, while a <strong>privacy notice</strong> tells clients or data subjects what data is held by an organisation and how that data will be handled.</p>
<p>- <a target="_blank" href="https://en.wikipedia.org/wiki/Privacy_policy">https://en.wikipedia.org/wiki/Privacy_policy</a></p>
<p><strong>Terms of Service</strong>, also known as <strong>Terms of Use</strong> and <strong>Terms and Conditions</strong>, are the legal agreements between service providers and the service consumers. The person must agree to abide by the terms of service in order to use the offered service. Terms of service can also be merely a disclaimer, especially regarding the use of websites.</p>
<p>- <a target="_blank" href="https://en.wikipedia.org/wiki/Terms_of_service">https://en.wikipedia.org/wiki/Terms_of_service</a></p>
</blockquote>
<p>You’ve been there. I’ve been there. We’re both guilty of it. You sign up for an account, see a wall of text and a green button moving you forward in the process. We could have just agreed to some ridiculous stipulations for using the service, or your data could be handled in such as a way that would make George Orwell sick to his stomach.</p>
<p>We’ve normalized scrolling to the bottom and clicking “Accept” without understanding how our privacy and service experience are impacted, and it’s no surprise. These documents are almost always verbose and overly comprehensive. At the end of the day, they are meant to minimize legal liability and fulfill regulations for companies, rather than be helpful notices to the consumer. It’s difficulty to argue that consumers are the ones at fault when these documents employ “legalese” along with a shotgun approach of trying to cover every edge case.</p>
<p>We’re left with a bleak, and almost hysterical, state of technological affairs where nearly every service requires signing away on documents that really should necessitate a lawyer to be at your beck-and-call. While we can hope for a day where services are required to provide “human-readable” versions of these documents, I’m tired of our current circumstances and want to look into what can be done now. While there’s still plenty more learning and research to be done on my end, I want to briefly discuss two suggestions on how we could mitigate the issue as consumers — GenAI and ToS;DR (no that’s not a typo).</p>
<h2 id="heading-potential-application-of-genai">Potential Application of GenAI</h2>
<p>Considering the foremost trend in technology (and many other facets of life to a lesser extent) is <a target="_blank" href="https://en.wikipedia.org/wiki/Generative_artificial_intelligence">generative artificial intelligence</a> (GenAI), the first idea I had was to leverage general-purpose <a target="_blank" href="https://en.wikipedia.org/wiki/Large_language_model">large-language models</a> (LLMs).</p>
<p>Given the plain-text-only nature of privacy policies and terms of services, integrating GenAI might be as simple as having a template prompt and uploading copy-pasted snippet(s) of the documents. <a target="_blank" href="https://en.wikipedia.org/wiki/Retrieval-augmented_generation">Retrieval-augmented generation</a> (RAG), chunking, and likely a slew of other AI techniques that have been/are being developed probably can make the process more efficient in terms of context window limitations and ingesting the content of said documents.</p>
<p>If I were to take a stab at this (which might be something I do and cover in the future) this could be a browser extension that parses the contents of the webpage, perhaps does some sort of more efficient chunking or stream processing of the contents, sends requests to a self-hosted open-source LLM, and displays the returned brief summary in the browser extension modal.</p>
<p>As an aside, if it was not clear yet, I claim no expertise in AI engineering and advanced techniques, and my approach might pose numerous inefficiencies or naive design decisions. Moreover, the irony is not lost on me that this approach hinges on open-source LLMs, which are often trained on data that was scraped, processed, and/or used in ways that violate and infringe upon other services’ advertised privacy policies and terms of service. Not to mention, they are typically developed by companies often at the center of these issues in the first place.</p>
<p>Getting back on track, the idea seems like it has promise, and it may also be a rare example of how GenAI could meaningfully be helpful to consumers. However, before reinventing the wheel and/or throwing AI at the problem, I want to begin looking for existing, mature tools and approaches that can help out with this issue. Let’s talk about the most promising option that I came across, so far.</p>
<h2 id="heading-tosdr-terms-of-service-didnt-read">ToS;DR (Terms of Service; Didn’t Read)</h2>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://tosdr.org/en">https://tosdr.org/en</a></div>
<p> </p>
<p>“Terms of Service; Didn’t Read” is a play on the phrase “<a target="_blank" href="https://en.wikipedia.org/wiki/TL;DR">Too Long; Didn’t Read</a>” (TLDR), often used in context of requesting/providing a summary of a lengthy text. Similarly, ToS;DR provides a summary of the Terms of Service and Privacy Policy for numerous services. It relies on human contributors akin to Wikipedia, and provides various browser/operating system integrations to make leveraging the existing summaries seamless.</p>
<p>I haven’t use ToS;DR to a great extent yet so, while this is not a comprehensive review, here are some initial thoughts I have on the service.</p>
<h3 id="heading-pros"><strong>Pros</strong></h3>
<ul>
<li><p>ToS;DR can help alleviate the pain that comes with scrolling through verbose text blocks by providing human-verified key points</p>
</li>
<li><p>Each listed service also is given a cumulative letter grade, based on how consumer-friendly the policies/terms are</p>
</li>
<li><p>Anyone can become a contributor, and contributions go through a review process</p>
</li>
<li><p><a target="_blank" href="https://tosdr.org/en/sites/download">Chrome, Firefox, and Safari browser extensions are available, along with Android and iOS apps</a></p>
</li>
</ul>
<h3 id="heading-cons"><strong>Cons</strong></h3>
<ul>
<li>Due to ToS:DR relying on human contributions, not every service will have an entry, and entries may be outdated or have inaccuracies</li>
</ul>
<hr />
<h1 id="heading-conclusion">Conclusion</h1>
<p>My eyes hurt typing this, so I’m going to stop now. Perhaps my retinas will allow for a slick conclusion next time. Please share this post with someone you love, hate, or know, particularly if they’d be interested in any of the potential future topics mentioned in the introduction.</p>
<p>Tune in for next time, where I will write about something, trying to pass off ideas from the depths of my stream of consciousness as an article that shows a semblance of polish, a hint of jest, and a handful of grammatical errors.</p>
<hr />
<p>Sent from my Web3-based, IoT, always-listening, AI-assisted, smart Generic Air Purifier X,</p>
<p><strong>The Algomist</strong></p>
]]></content:encoded></item><item><title><![CDATA[How Dotfiles could make your work less miserable]]></title><description><![CDATA[A Tale as Old as Time
Ch1. Humble Beginnings
Once upon a time, there existed a software engineer who resided continuously hunched within a dreary cubicle - adorned with demotivating motivational posters and speckled with horrendous fluorescent light ...]]></description><link>https://blog.neilbpatel.com/dotfiles-101</link><guid isPermaLink="true">https://blog.neilbpatel.com/dotfiles-101</guid><category><![CDATA[dotfiles]]></category><category><![CDATA[dotfile]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[Tips for Developers]]></category><category><![CDATA[workflow]]></category><category><![CDATA[automation]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Story]]></category><category><![CDATA[zshrc]]></category><category><![CDATA[zsh]]></category><category><![CDATA[Bash]]></category><category><![CDATA[bashrc]]></category><category><![CDATA[shell]]></category><category><![CDATA[shell scripting]]></category><category><![CDATA[shell script]]></category><dc:creator><![CDATA[Neil Patel]]></dc:creator><pubDate>Wed, 21 Feb 2024 15:30:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cPIP9PcaqkA/upload/98186223c27028585b01df538f7e941a.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-a-tale-as-old-as-time">A Tale as Old as Time</h1>
<h3 id="heading-ch1-humble-beginnings">Ch1. <strong>Humble Beginnings</strong></h3>
<p>Once upon a time, there existed a software engineer who resided continuously hunched within a dreary cubicle - adorned with demotivating motivational posters and speckled with horrendous fluorescent light from above. The day was coming to an end and they were just about ready to clock out.</p>
<p>Their eyes - gleaming with some sign of life, particularly boredom - glazed across their MacBook's fingerprint-smudged screen. The employee had realized that they needed to complete one last operational task before ending their remarkably unremarkable day. "Let's get this over with," they say with a rapturous murmur.</p>
<p>"Okay, simple enough, let's download a Docker image from the registry that this project uses for containerized builds. I'm sure the command is in my terminal history."</p>
<h3 id="heading-ch2-the-white-docker-whale">Ch2. <strong>The White (Docker) Whale</strong></h3>
<p>"<strong>Damn</strong>."</p>
<p>They don't see the command that they are looking for even after quickly tapping the up arrows roughly twenty times.</p>
<p>"No worries, you've done this enough that you can do type it out in no time!"</p>
<p>. . .</p>
<p>"<strong>Shit</strong>."</p>
<p>They forgot a dash in the internal Docker registry name.</p>
<p>"Alright no worries, up arrow once more and add the dash and enter."</p>
<p>They forgot to supply the registry API token.</p>
<p>"Oh yeah, this again. Let me pull up the secret, I'm sure I have it saved <em>somewhere</em> on my desktop," they say, unfazed. They attempt the command once again.</p>
<h3 id="heading-ch3-unabashed">Ch3. <strong>UnaBASHed</strong></h3>
<p>"Sweet, the image is downloading. This task is turning out to be no biggie."</p>
<p>Now, it's time to build the project. Lucky for them, it's only a poorly documented Bash command that is incomprehensible because there are twenty pipes (<code>|</code>) and seven ANDs (<code>&amp;&amp;</code>) littered throughout. They start praying that it's in their terminal history.</p>
<p>A bead of sweat drips down their forehead.</p>
<p>After a few minutes of terminal history-hunting, accompanied by a orchestra of shallow breathing and stressed-out grunts, they realize that instead of scouring through their terminal history, they could just search Slack to find the command posted in the past by their teammate.</p>
<p>"Brilliant, let's search Slack and just copy-and-paste it!"</p>
<h3 id="heading-ch4-pesky-platforms">Ch4. <strong>Pesky Platforms</strong></h3>
<p>"Bingo," they say with a smirk, as if they have finally hacked into the metaphorical mainframe everybody seems to mention. The job doesn't permit them to <em>be cool</em> often, or really at all. Thus, the employee has to milk any opportunity they get to <em>feel cool.</em></p>
<p>They've found it. After a simple copy-and-paste into the terminal session, they hit enter and...</p>
<p>"<strong>Fuck</strong>. Why is <code>glibc</code> for <code>node-rdkafka</code> throwing errors when compiling? What the hell is this <strong><em>shit</em></strong>!?"</p>
<p>. . .</p>
<p>"<em>Calm down</em>... It's just because you're using an ARM64 processor. Easy, all you have to do is redownload that image from the beginning for ARM64 - instead of X86 - and then pass in the platform as an argument in half of the commands. Wait, what were the commands, again?"</p>
<h3 id="heading-ch5-subjectively-a-matter-expert">Ch5. <strong>Subjectively, a Matter Expert</strong></h3>
<p>The employee left nearly two hours after everyone else. With one final "win" under their belt, they packed their sleek black laptop bag and swaggered to the elevators.</p>
<p>"This is the work of a hero - a champion. Somebody's got to do it, and just seems like the world has chosen me to be the paragon of excellence," they somehow convinced themselves.</p>
<p>. . .</p>
<p>Legends say that, to this day, the employee does not realize they were the cause of the complete production datacenter outage that cost their company at least a few million dollars.</p>
<hr />
<h3 id="heading-epilogue"><strong>Epilogue</strong></h3>
<p>"Drat," their tech lead says in the customer incident report. "They must have used an old version of the build scripts that didn't run the unit tests. Will make an action item to prevent this for next time!"</p>
<p>. . .</p>
<p>The action item remains in that team's evergrowing backlog of operational <s>burdens</s> tasks.</p>
<hr />
<h2 id="heading-moral-of-the-story">Moral of the Story?</h2>
<p>Wouldn't it be nice if you didn't have to type out the same thing over and over again? Save yourself the time scouring for it in your terminal history, on the web, and in your team chats. Just create your own dotfiles and maintain them!</p>
<h1 id="heading-dotfiles-101">Dotfiles 101</h1>
<p>What are "dotfiles"? Let's start with examples you are likely familiar with. Developers often encounter one of the following "dotfiles" relatively frequently:</p>
<ul>
<li><p><code>.bash_profile</code></p>
</li>
<li><p><code>.bashrc</code></p>
</li>
<li><p><code>.zshrc</code></p>
</li>
<li><p><code>.vimrc</code></p>
</li>
<li><p><code>.gitconfig</code></p>
</li>
<li><p><code>.gitignore</code></p>
</li>
<li><p><code>.npmrc</code></p>
</li>
<li><p><code>.yarnrc</code></p>
</li>
<li><p><code>.env</code></p>
</li>
</ul>
<p>If any of these look familiar, then congrats, you have experience with a dotfile! <mark>Dotfiles are plaintext files prefixed with a dot</mark>. Pretty straightforward right?</p>
<p>Dotfiles are typically used to define configurations for programs, such as shells (Bash, Zsh), text editors (Vim), version control systems (Git), and package managers (NPM, Yarn). In the case of <code>.env</code>, a dotfile can also be used to store static data such as environment variables.</p>
<p>They can be used in conjunction a special dotfile - your shell profile dotfile (e.g. <code>.bashrc</code> if your terminal uses Bash or <code>.zshrc</code> if it uses Zsh) - in order to significantly augment your terminal's "smartness"!</p>
<h2 id="heading-abstracting-responsibilities">Abstracting Responsibilities</h2>
<p>While you can add directly to your shell profile dotfile, I find that this can get unruly really quickly. Instead, I prefer adding to "external" dotfiles and importing them into my shell profile dotfile by using <code>source</code> to essentially import their contents. This way, I can <mark>create dotfiles with distinct responsibilities</mark>.</p>
<p>Other than the shell profile name (and other protected dotfile names like those listed above), the names of the following dotfiles are arbitrary. You can use whatever system of grouping works best for you.</p>
<h3 id="heading-secrets-and-exports">Secrets and Exports</h3>
<p>One example is a <code>.secrets</code> or <code>.exports</code> dotfile, which could export persistent global variables like API access tokens. Bonus points for this one, since it makes it easier for you to share your screen with a colleague or collaborator. This way, debugging sessions - which can often require editing shell profile dotfiles - won't result in you exposing sensitive secrets that you need to have stored locally.</p>
<p>Our starry-eyed employee could have just exported their registry's API token as a shell environment variable here to save themselves the hassle of finding and manually inputting the secret.</p>
<h3 id="heading-aliases-and-functions">Aliases and Functions</h3>
<p>More examples are a <code>.function</code> or <code>.alias</code> dotfile that could hold all your custom shell functions or aliases. In the case above, the employee could create functions/aliases (depending on the complexity of the logic) that make often repeated tasks much less arduous.</p>
<p>In the story above, the employee could have created an alias to download that specific image and assign it to an easy-to-remember command like <code>pull-my-img</code>.</p>
<p>Meanwhile, for the build command sequence, which was different depending on the platform required (i.e. X86, ARM64, etc.), they could have turned it a function. This function could then take a parameter, representing the platform, which could easily be substituted into all the commands in the sequence where the platform needed to be specified. Instead of a bulky, hard-to-remember, and easy-to-mess-up sequence of commands, the employee could have just run <code>build-my-project x86</code> or <code>build-my-project arm64</code>.</p>
<h2 id="heading-portability">Portability</h2>
<p>Last, but not least, dotfiles have the advantage of being hyper-portable. They are extremely lightweight, being plaintext files that are often small and can be made smaller by factoring them into separate files like mentioned above.</p>
<p>Store these on flash media like a thumb drive or SD card and you'll be quickly rolling with a souped-up terminal. <mark>Push them to a remote Git repository or cloud storage</mark>, and you'll be able to pull your favorite settings, custom functions, and time-saving aliases from nearly anywhere. This makes sharing your setup or setting up a new environment a breeze!</p>
]]></content:encoded></item><item><title><![CDATA[Turbocharge Your Workflow with Keyboard Shortcuts]]></title><description><![CDATA[In the quest for productivity and efficiency, we often overlook simple yet powerful tools that can make a significant impact on our daily work. Keyboard shortcuts, while not a panacea for all productivity challenges, are a hidden gem that can dramati...]]></description><link>https://blog.neilbpatel.com/turbocharge-your-workflow-with-keyboard-shortcuts</link><guid isPermaLink="true">https://blog.neilbpatel.com/turbocharge-your-workflow-with-keyboard-shortcuts</guid><category><![CDATA[keyboard shortcuts]]></category><category><![CDATA[keyboard]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Programming Tips]]></category><category><![CDATA[tiling window manager]]></category><category><![CDATA[window management]]></category><category><![CDATA[text manupulation]]></category><category><![CDATA[test management]]></category><category><![CDATA[Shortcuts]]></category><category><![CDATA[navigation]]></category><category><![CDATA[code editor]]></category><category><![CDATA[vscode]]></category><category><![CDATA[Visual Studio Code]]></category><category><![CDATA[Jetbrains]]></category><category><![CDATA[intellij]]></category><dc:creator><![CDATA[Neil Patel]]></dc:creator><pubDate>Tue, 20 Feb 2024 08:29:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/8ssNFn4VPLg/upload/b7d69faa215547cdebf21bc8208207f1.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the quest for productivity and efficiency, we often overlook simple yet powerful tools that can make a significant impact on our daily work. Keyboard shortcuts, while not a panacea for all productivity challenges, are a hidden gem that can dramatically boost your workflow without requiring a substantial investment of time or effort.</p>
<h1 id="heading-introduction">Introduction</h1>
<h2 id="heading-what-is-a-keyboard-shortcut">What is a Keyboard Shortcut?</h2>
<p>Keyboard shortcuts are, at their core, <mark>a series of key presses that map to specific actions</mark>, enabling you to perform tasks more swiftly and conveniently. Take, for example, the ubiquitous copy-and-paste operations. By using keyboard shortcuts, you can save valuable seconds that would otherwise be spent right-clicking and navigating through context menus.</p>
<h2 id="heading-why-should-i-care">Why should I care?</h2>
<p>You might wonder why these saved seconds matter in the grand scheme of things. After all, a few seconds here and there may not seem like a game-changer. However, the true impact of keyboard shortcuts becomes apparent when you consider how often you switch between your keyboard and mouse during a typical workday.</p>
<p>Each switch, no matter how brief, <mark>accumulates into a substantial amount of time</mark> over the course of a day, week, or month. Time that could have been better spent on tasks that truly matter. When you realize that these moments of inefficiency are limiting your overall output, you'll start to grasp the significance of this small yet impactful change in your workflow.</p>
<p>The importance of adopting keyboard shortcuts extends beyond simply producing more work. It's about reclaiming your most precious resource: time. As the saying goes, "Time is money," and that holds true for every person on the planet. We are all constrained by the same finite hours in a day.</p>
<p>The goal here isn't to pile on more tasks or obligations. It's about <mark>accomplishing the same tasks more efficiently</mark>, thus freeing up time for the things you genuinely cherish. Keyboard shortcuts aren't just a productivity hack; they are a strategic investment in reclaiming your time and redirecting it towards pursuits that bring you joy.</p>
<p>While keyboard shortcuts might appear as a minor adjustment in your daily routine, they have the potential to revolutionize the way you work. By implementing these time-saving tools, you can streamline your workflow, boost productivity, and ultimately find more time for the things that truly matter in life. So, why not embark on this journey to turbocharge your workflow with keyboard shortcuts and experience the transformative power they offer?</p>
<h1 id="heading-shortcuts">Shortcuts</h1>
<div data-node-type="callout">
<div data-node-type="callout-emoji">❗</div>
<div data-node-type="callout-text">Windows and macOS have slight differences in shortcuts. The main differences being that Windows uses "Control" (<code>CTRL</code>) and "Alt" (<code>ALT</code>) while macOS uses "Command" (<code>CMD</code>) and "Option" (<code>OPT</code>), respectively. Regardless, I'll include the equivalent shortcut for both just to be clear!</div>
</div>

<div data-node-type="callout">
<div data-node-type="callout-emoji">❓</div>
<div data-node-type="callout-text">Keep in mind that not all applications are made equally! While the following should be generic to <em>most </em>applications, this list is not exhaustive! Every application can have context-specific shortcuts that may override the following (for better or for worse). Stay curious - <mark>when a shortcut below does not work for you, search for what will suit your needs</mark>!</div>
</div>

<h2 id="heading-text-manipulation">Text Manipulation</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Shortcut</td><td>Windows</td><td>macOS</td></tr>
</thead>
<tbody>
<tr>
<td>Copy selected text</td><td>CTRL + C</td><td>CMD + C</td></tr>
<tr>
<td>Cut selected text</td><td>CTRL + X</td><td>CMD + X</td></tr>
<tr>
<td>Paste selected text</td><td>CTRL + V</td><td>CMD + V</td></tr>
<tr>
<td>Undo</td><td>CTRL + Z</td><td>CMD + Z</td></tr>
<tr>
<td>Redo</td><td>CTRL + Y, CTRL + SHIFT + Z</td><td>CMD +SHIFT + Z</td></tr>
<tr>
<td>Select all</td><td>CTRL + A</td><td>CMD + A</td></tr>
<tr>
<td>Bold</td><td>CTRL + B</td><td>CMD + B</td></tr>
<tr>
<td>Italic</td><td>CTRL + I</td><td>CMD + I</td></tr>
<tr>
<td>Underline</td><td>CTRL + U</td><td>CMD + U</td></tr>
<tr>
<td>Highlight Left/Right from Cursor</td><td>SHIFT + Left/Right Arrow</td><td>SHIFT + Left/Right Arrow</td></tr>
<tr>
<td>Navigate to Previous/Next Word</td><td>CTRL + Left/Right Arrow</td><td>OPT + Left/Right Arrow</td></tr>
</tbody>
</table>
</div><h2 id="heading-navigation">Navigation</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Shortcut</td><td>Windows</td><td>macOS</td></tr>
</thead>
<tbody>
<tr>
<td>New Tab</td><td>CTRL + T</td><td>CMD + T</td></tr>
<tr>
<td>Close Tab</td><td>CTRL + W</td><td>CMD + W</td></tr>
<tr>
<td>Next Tab</td><td>CTRL + TAB</td><td>CTRL + TAB</td></tr>
<tr>
<td>Previous Tab</td><td>CTRL + SHIFT + TAB</td><td>CTRL + SHIFT + TAB</td></tr>
<tr>
<td>Reload</td><td>CTRL + R</td><td>CMD + R</td></tr>
<tr>
<td>Find</td><td>CTRL + F</td><td>CMD + F</td></tr>
<tr>
<td>Find Next</td><td>F3</td><td>CMD + G</td></tr>
<tr>
<td>Find Previous</td><td>SHIFT + F3</td><td>CMD + SHIFT + G</td></tr>
<tr>
<td>Back</td><td>ALT + Left Arrow</td><td>CMD + Left Arrow</td></tr>
<tr>
<td>Forward</td><td>ALT + Right Arrow</td><td>CMD + Right Arrow</td></tr>
</tbody>
</table>
</div><h2 id="heading-window-management">Window Management</h2>
<div data-node-type="callout">
<div data-node-type="callout-emoji">🪟</div>
<div data-node-type="callout-text">The Windows key will be substituted with <code>WIN</code>!</div>
</div>

<div class="hn-table">
<table>
<thead>
<tr>
<td>Shortcut</td><td>Windows</td><td>macOS</td></tr>
</thead>
<tbody>
<tr>
<td>Minimize</td><td>WIN + Down Arrow</td><td>CMD + M</td></tr>
<tr>
<td>Maximize</td><td>WIN + Up Arrow</td><td>CMD + L</td></tr>
<tr>
<td>Close Window</td><td>ALT + F4</td><td>CMD + W</td></tr>
<tr>
<td>New Window</td><td>CTRL + N</td><td>CMD + N</td></tr>
<tr>
<td>Switch App</td><td>ALT + TAB</td><td>CMD + TAB</td></tr>
<tr>
<td>Cycle Window Next</td><td>ALT + `</td><td>CMD + `</td></tr>
<tr>
<td>Cycle Window Previous</td><td>SHIFT + ALT + `</td><td>SHIFT + ALT + `</td></tr>
</tbody>
</table>
</div><h2 id="heading-code-editor">Code Editor</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Shortcut</td><td>Windows</td><td>macOS</td></tr>
</thead>
<tbody>
<tr>
<td>Save</td><td>CTRL + S</td><td>CMD + S</td></tr>
<tr>
<td>Comment Line</td><td>CTRL + /</td><td>CMD + /</td></tr>
</tbody>
</table>
</div><h3 id="heading-visual-studio-code">Visual Studio Code</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Shortcut</td><td>Windows</td><td>macOS</td></tr>
</thead>
<tbody>
<tr>
<td>Show Command Palette</td><td>CTRL + SHIFT + P</td><td>CMD + SHIFT + P</td></tr>
<tr>
<td>Go to File</td><td>CTRL + P</td><td>CMD + P</td></tr>
<tr>
<td>New Window</td><td>CTRL + SHIFT + N</td><td>CMD + SHIFT + N</td></tr>
<tr>
<td>User Settings</td><td>CTRL + ,</td><td>CMD + ,</td></tr>
<tr>
<td>Format Code</td><td>SHIFT + ALT + F</td><td>OPT + CMD + F</td></tr>
<tr>
<td>Go to Definition</td><td>F12</td><td>F12</td></tr>
<tr>
<td>Show/Hide Sidebar</td><td>CTRL + B</td><td>CMD + B</td></tr>
<tr>
<td>Toggle Terminal</td><td>CTRL + `</td><td>CMD + `</td></tr>
<tr>
<td>Move Line Up</td><td>ALT + Up Arrow</td><td>ALT + Up Arrow</td></tr>
<tr>
<td>Move Line Down</td><td>ALT + Down Arrow</td><td>ALT + Down Arrow</td></tr>
<tr>
<td>Delete Line</td><td>CTRL + SHIFT + K</td><td>CMD + SHIFT + K</td></tr>
<tr>
<td>Insert Line Below</td><td>CTRL + ENTER</td><td>CMD + ENTER</td></tr>
<tr>
<td>Insert Line Above</td><td>CTRL + SHIFT + ENTER</td><td>CMD + SHIFT + ENTER</td></tr>
</tbody>
</table>
</div><h3 id="heading-jetbrains-intellij">JetBrains IntelliJ</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Shortcut</td><td>Windows</td><td>macOS</td></tr>
</thead>
<tbody>
<tr>
<td>Build</td><td>CTRL + F9</td><td>CMD + F9</td></tr>
<tr>
<td>Run</td><td>SHIFT + F10</td><td>CTRL + R</td></tr>
<tr>
<td>Debug</td><td>SHIFT + F9</td><td>CTRL + D</td></tr>
<tr>
<td>Refactor</td><td>CTRL + ALT + SHIFT + T</td><td>CTRL + T</td></tr>
<tr>
<td>File Structure</td><td>CTRL + F12</td><td>CMD + 7</td></tr>
</tbody>
</table>
</div><h2 id="heading-terminal-emulators">Terminal Emulators</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Shortcut</td><td>Windows Terminal</td><td>iTerm (macOS)</td></tr>
</thead>
<tbody>
<tr>
<td>New Tab</td><td>CTRL + SHIFT + T</td><td>CMD + T</td></tr>
<tr>
<td>Close Tab</td><td>CTRL + SHIFT + W</td><td>CMD + W</td></tr>
<tr>
<td>Previous Tab</td><td>CTRL + Page Up</td><td>CMD + OPT + Left Arrow</td></tr>
<tr>
<td>Next Tab</td><td>CTRL + Page Down</td><td>CMD + OPT + Right Arrow</td></tr>
<tr>
<td>Clear Screen</td><td>CTRL + L</td><td>CMD + K</td></tr>
<tr>
<td>Copy Text</td><td>CTRL + SHIFT + C</td><td>CMD + SHIFT + C</td></tr>
</tbody>
</table>
</div><h1 id="heading-conclusion">Conclusion</h1>
<p>Hopefully, I have convinced you to take the time to learn these shortcuts, as well as to actively seek out other ways to improve your workflow. However, software engineering, web development, and <mark>work, in general, is not the end-all-be-all</mark>.</p>
<p>Remember, the goal of improving your workflow is <em>not</em> to cram more work into the same block of time. We should instead see it as a way to get the same amount of work done more efficiently, freeing up time to <strong>do what you want to do</strong>.</p>
<p>Cheers, and stay tuned for more productivity content!</p>
]]></content:encoded></item><item><title><![CDATA[Manipulating Files between a WSL Instance and Host Machine]]></title><description><![CDATA[Although WSL (Windows Subsystem for Linux) changed the game for developing on Windows, I inevitably will come across pain points in my workflow. One issue I frequently encountered was manipulating files between the host machine's drives and a WSL ins...]]></description><link>https://blog.neilbpatel.com/manipulating-files-between-a-wsl-instance-and-host-machine</link><guid isPermaLink="true">https://blog.neilbpatel.com/manipulating-files-between-a-wsl-instance-and-host-machine</guid><category><![CDATA[WSL]]></category><category><![CDATA[wsl2]]></category><category><![CDATA[Windows]]></category><category><![CDATA[file system]]></category><dc:creator><![CDATA[Neil Patel]]></dc:creator><pubDate>Mon, 09 Oct 2023 01:44:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/9XngoIpxcEo/upload/5b2e18fb55a77351d7c0d7ae5567390a.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Although WSL (Windows Subsystem for Linux) changed the game for developing on Windows, I inevitably will come across pain points in my workflow. One issue I frequently encountered was manipulating files between the host machine's drives and a WSL instance.</p>
<h3 id="heading-manipulating-files-within-a-wsl-instance">Manipulating files within a WSL instance</h3>
<p>Let's say we have a file named <code>alice.txt</code> located on a Windows drive with the file address of <code>C:\Users\&lt;WIN_USER_NAME&gt;\Documents\</code>. To move the file to a WSL instance to the present working directory, run the following in a WSL terminal instance:</p>
<pre><code class="lang-bash">mv /mnt/c/Users/&lt;WIN_USER_NAME&gt;/Documents/ .
</code></pre>
<p>Note how they are essentially the same file path with just two key differences! First, <code>/mnt</code> prepends any file address. Second, backslashes (<code>\</code>) are swapped for slashes (<code>/</code>). Now that we know this, we can easily leverage other file manipulation commands, such as <code>ls</code>, <code>cp</code>, <code>cat</code>, <code>vi</code>, <code>file</code>, and so on.</p>
<h3 id="heading-manipulating-files-in-a-wsl-instance-from-windows">Manipulating files in a WSL instance from Windows</h3>
<p>Let's say we have the same file as before, <code>alice.txt</code>, but we've moved it to the WSL instance and it now has the file path of <code>/home/&lt;WSL_USER_NAME&gt;/</code>. To manipulate this file from your Windows host machine, the most straightforward way is to simply use File Explorer and navigate to <code>\\wsl$</code>.</p>
<p>Here you'll see a folder for each of your WSL instances, where the folder names should map to the Linux distro that each instance uses (e.g. Ubuntu). Likely, you'll only have a single WSL instance so it should be simple to locate the correct folder. Navigate into the WSL instance folder, then <code>home</code>, and finally <code>&lt;WSL_USER_NAME&gt;</code>. Congrats, you'll find <code>alice.txt</code> in this folder and can manipulate it accordingly!</p>
<p>You can even leverage the knowledge of these file addresses for CMD or PowerShell commands. To quickly check the current file address, simply right-click on the File Explorer address bar at the top and click "Edit Address" to display the file address in place or "Copy Address as Text" to copy the file address to your clipboard.</p>
]]></content:encoded></item></channel></rss>