<?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: Burke Holland</title>
    <description>The latest articles on DEV Community by Burke Holland (@burkeholland).</description>
    <link>https://dev.to/burkeholland</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%2F57943%2F4540c0b3-927d-4e1a-bd1a-cf2777411642.jpeg</url>
      <title>DEV Community: Burke Holland</title>
      <link>https://dev.to/burkeholland</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/burkeholland"/>
    <language>en</language>
    <item>
      <title>How to Replace Yourself with GitHub Copilot (And Still Get Paid)</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Thu, 06 Feb 2025 07:41:00 +0000</pubDate>
      <link>https://dev.to/burkeholland/how-to-replace-yourself-with-github-copilot-and-still-get-paid-5h9n</link>
      <guid>https://dev.to/burkeholland/how-to-replace-yourself-with-github-copilot-and-still-get-paid-5h9n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This article is mostly satire. I don’t think Copilot is going to replace you, nor do I think you should engage in any of the suggested behaviour. Feel free to wildly misinterpret my views to maximize engagement.&lt;/p&gt;




&lt;p&gt;You’ve probably seen all the articles telling you how to “supercharge your development workflow” with &lt;strong&gt;GitHub Copilot&lt;/strong&gt;. “Write code faster!” they say. “Boost productivity!” “Improve efficiency!”&lt;/p&gt;

&lt;p&gt;But not &lt;em&gt;one&lt;/em&gt; of them addresses the real potential here: &lt;strong&gt;replacing yourself entirely while still collecting a paycheck.&lt;/strong&gt; Let’s be honest—writing code is exhausting. And when you finally get into a flow state, someone interrupts you with a &lt;em&gt;“quick question”&lt;/em&gt; that derails everything.&lt;/p&gt;

&lt;p&gt;Wouldn’t it be nice if &lt;strong&gt;something else&lt;/strong&gt; did all the work for you? Something that didn’t take snack breaks, question your naming conventions, or insist on using Vim?&lt;/p&gt;

&lt;h2&gt;
  
  
  The secret to doing less and accomplishing more
&lt;/h2&gt;

&lt;p&gt;So, how do we completely offload our careers onto an AI without anyone noticing? I’m glad you asked. Here’s how I did it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Copilot
&lt;/h3&gt;

&lt;p&gt;Installation is easy, but you should &lt;strong&gt;act like it was incredibly complex&lt;/strong&gt; when explaining it to your manager. Bonus points if you casually drop phrases like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Yeah, I had to configure the LSP integrations manually.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“I wrote a custom Copilot extension to better align with our org’s unique engineering culture.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“Bro, it’s basically like GPT-4 but, like, for enterprise devs…”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now everyone thinks you’re some kind of wizard. Great. Let’s move on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Let the AI do the heavy lifting
&lt;/h3&gt;

&lt;p&gt;Here’s the pro move: &lt;strong&gt;don’t just let Copilot assist you—let Copilot BE you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You start typing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function calculateTax(income) {

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

&lt;/div&gt;



&lt;p&gt;Copilot finishes the function &lt;strong&gt;before you even remember how tax brackets work.&lt;/strong&gt; Boom. Done.&lt;/p&gt;

&lt;p&gt;Now, just sit back and let Copilot generate entire modules, utils, and even documentation. You’ll want to sprinkle in a few manual edits &lt;strong&gt;so it looks like you put in effort&lt;/strong&gt; —maybe change a parameter name here and there. Something subtle, like renaming &lt;code&gt;calculateTax&lt;/code&gt; to &lt;code&gt;determineTaxObligation&lt;/code&gt; so it &lt;em&gt;feels&lt;/em&gt; like craftsmanship.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Ship it before anyone realizes what happened
&lt;/h3&gt;

&lt;p&gt;Now that you’ve got Copilot doing 80% of the work, you need to &lt;strong&gt;commit and push frequently&lt;/strong&gt; to establish dominance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write exactly &lt;strong&gt;two&lt;/strong&gt; lines of real code.&lt;/li&gt;
&lt;li&gt;Let Copilot autocomplete the rest.&lt;/li&gt;
&lt;li&gt;Commit with something vague and impressive like:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat: optimize tax calculation algorithm  

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Profit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Congratulations. You just outperformed half your team.&lt;/p&gt;

&lt;h3&gt;
  
  
  But what if the code doesn’t work?
&lt;/h3&gt;

&lt;p&gt;Hahaha, oh, &lt;strong&gt;sweet summer child.&lt;/strong&gt; That’s not your problem. That’s what &lt;strong&gt;code reviews&lt;/strong&gt; are for. Your PR will get torn apart, but you can just say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Yeah, I had considered that but wanted to get early feedback.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“Great catch! Totally meant to address that.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“Ah, good call—I think Copilot auto-filled that from an older function.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This shifts blame &lt;strong&gt;onto the AI&lt;/strong&gt; while making you look super thoughtful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The inevitable downfall
&lt;/h2&gt;

&lt;p&gt;At some point, teams will realize that Copilot is doing all the work. Managers will start asking questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;“Why did you try to implement a GraphQL client in our backend which literally doesn’t use GraphQL?”&lt;/strong&gt;
&lt;em&gt;(Uh, because Copilot said so?)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Why are all your commits five seconds apart but in perfect English?”&lt;/strong&gt;
&lt;em&gt;(Listen, AI is just built different, okay?)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Why did you commit an entire Stack Overflow thread into utils.js?”&lt;/strong&gt;
&lt;em&gt;(Research-based development, obviously.)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sooner or later, someone’s going to push a &lt;strong&gt;bug-ridden AI-generated nightmare&lt;/strong&gt; to production. And then… well, I wouldn’t know. I don’t work here anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot is &lt;strong&gt;an insane game-changer&lt;/strong&gt; , but let’s be real: it still makes dumb mistakes &lt;strong&gt;because it learned from us.&lt;/strong&gt; That’s not Copilot’s fault. That’s a &lt;em&gt;you&lt;/em&gt; problem.&lt;/p&gt;

&lt;p&gt;So, should you use Copilot to write every line of code? &lt;strong&gt;Definitely not.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Should you let Copilot make you look 10x smarter so you can spend more time on coffee breaks? &lt;strong&gt;Absolutely.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Look, I don’t make the rules. This is just how business works.&lt;/p&gt;

&lt;p&gt;Go forth and generate recklessly.&lt;/p&gt;



&lt;p&gt;If you made it to the end of this post, it’s time to tell you that this post was written entirely by AI. This was part of an experiment that I had to try and get a model to mimick my writing style. I was pleasantly suprised by the ouput here. Sarcasm isn’t easy, and GPT-4o is doing a pretty remarkable job at it.&lt;/p&gt;

&lt;p&gt;I did this by feeding GPT-4o &lt;a href="https://css-tricks.com/how-to-increase-your-page-size-by-1500-with-webpack-and-vue/" rel="noopener noreferrer"&gt;an old CSS Tricks article&lt;/a&gt; I wrote where I was particularly out of pocket. Then I gave it a &lt;em&gt;very&lt;/em&gt; simple prompt…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write a blog post about GitHub Copilot in the style of this author

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

&lt;/div&gt;



&lt;p&gt;Which means the AI translated my prompt into a pretty engaging idea - replacing yourself with GitHub Copilot. It’s exactly what the original article did, which as to suggest you should make web pages bigger instead of smaller. It was also satire.&lt;/p&gt;

&lt;p&gt;There are some parts here that I think are particularly hilarious…&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Commit with something vague and impressive like: &lt;/li&gt;
&lt;/ol&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat: optimize tax calculation algorithm  

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


&lt;p&gt;Congratulations. You just outperformed half your team.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think my favorite was…&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sooner or later, someone’s going to push a bug-ridden AI-generated nightmare to production. And then… well, I wouldn’t know. I don’t work here anymore.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I mean - that’s &lt;em&gt;pretty&lt;/em&gt; great. I think it is at least. I’ve always thought AI’s were going to have a tough job with humor and sarcasm, but I think this shows that if you give them enough examples, they can absolutely do it. Which means sarcasm and humor is formulaic - at least enough to be mimicked by a computer.&lt;/p&gt;

&lt;p&gt;It’s also ironic that it wrote a blog post about replacing yourself with Copilot while replacing me as the author at the same time. So meta!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>humor</category>
      <category>programming</category>
    </item>
    <item>
      <title>Essential custom instructions for GitHub Copilot</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Sun, 05 Jan 2025 11:58:00 +0000</pubDate>
      <link>https://dev.to/burkeholland/essential-custom-instructions-for-github-copilot-fo6</link>
      <guid>https://dev.to/burkeholland/essential-custom-instructions-for-github-copilot-fo6</guid>
      <description>&lt;p&gt;Prompt engineering - or should I say &lt;a href="//./2024-04-21-prompt-engineering.md"&gt;“Prompt Negotiation”&lt;/a&gt; - is (currently) an important part of working with GitHub Copilot. Your success in working with the various available models will be directly related to how well you prompt them. While GitHub Copilot tries to handle much of the prompt engineering for you behind the scenes, there is still a lot you can do yourself to improve the accuracy of answers with the use of Custom Instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Instructions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/copilot-customization" rel="noopener noreferrer"&gt;Custom Instructions&lt;/a&gt; are exactly that - custom prompts that get sent to the model with every request.&lt;/p&gt;

&lt;p&gt;You can define these at a project level or at an editor level. Often these are demonstrated as specific project level instructions such as a command like &lt;code&gt;prefer fetch over axios&lt;/code&gt;. These project specifc custom instructions are quite powerful and can be checked in and shared. You can create a custom instructions file for your project by adding a &lt;code&gt;.github/gopilot-instructions.md&lt;/code&gt; file, or by adding a &lt;a href="https://code.visualstudio.com/docs/copilot/copilot-customization#_use-settings" rel="noopener noreferrer"&gt;file attribute to the instructions settings&lt;/a&gt;. You can have multiple of these file attributes which means you can have multiple different instructions files.&lt;/p&gt;

&lt;p&gt;These very specific types of project instructions are super helpful with getting better help from your AI pair progammer. But it’s less obvious what you can/should do with the more global, editor level instructions.&lt;/p&gt;

&lt;p&gt;I’ve been working heavily with GitHub Copilot for the past several months, and I’ve added 4 custom instructions that I’ve found greatly increase my productivity with GitHub Copilot. These are more generic prompt engineering “best practices” will help you avoid pitfalls and get better code from the LLM.&lt;/p&gt;

&lt;p&gt;You can add the “global instructions” that I’m about to give you by going to your User Settings (JSON) file and adding keys like so…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"github.copilot.chat.codeGeneration.instructions": [
    { "text": "this is an example of a custom instruction" }
]

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

&lt;/div&gt;



&lt;p&gt;Ok - let’s do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask for missing context
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Avoid making assumptions. If you need additional context to accurately answer the user, ask the user for the missing information. Be specific about which context you need.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The achilles heal of LLM’s is that they are designed to provide a response no matter what. It’s &lt;a href="https://cepr.org/voxeu/columns/ai-and-paperclip-problem" rel="noopener noreferrer"&gt;the paperclip problem&lt;/a&gt; applied to LLM’s. If you design a system to provide an answer, it is going to do that at all costs. This is why we get hallucinations.&lt;/p&gt;

&lt;p&gt;If I said to you, “make a GET request to the api”, you would likely ask me several follow-up questions so that you could actually complete that task in a way that works. An LLM will just write a random GET request because it &lt;em&gt;does not actually care&lt;/em&gt; if the code works or not.&lt;/p&gt;

&lt;p&gt;Copilot tries to mitigate a lot of this for you with its sytem prompt, but you can reduce hallucinations further by instructing the AI to ask you for clarification if it needs more context.&lt;/p&gt;

&lt;p&gt;This isn’t bullet proof. LLM’s seem so hell bent on answering you at all costs that often I find this instruction is just ignored. But on the occasions that it works, it’s a nice surprise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvcucmy3tqrmf1td4q21w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvcucmy3tqrmf1td4q21w.png" alt="Copilot asking for missing context" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Provide file names
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Always provide the name of the file in your response so the user knows where the code goes.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’ve noticed that Copilot will sometimes give me back several blocks of code, but won’t mention where they belong. I then have to figure out which files it is referring to which takes an extra cycle. This prompt forces the LLM to always provide the file name.&lt;/p&gt;

&lt;p&gt;If you are working in theoretical space where you aren’t talking about specific project files, Copilot will provide made up file names for the code snippets. This is fine because it’s a detail that doesn’t matter in that context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write modular code
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Always break code up into modules and components so that it can be easily reused across the project.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I tend to write a lot of frontend code, which is all about components these days. I’ve found that Copilot will often try and do too much in a single file when it should ideally break out UI code into separate components. AI’s are fairly good at organization, so if you ask it to break things out into components, Copilot will do an impressive job of suggesting the right places to decouple. I’ve found this prompt works quite well in non-UI code as well. If I ask for a change in an API, this prompt helps Copilot break out services, repositories, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code quality incentives
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“All code you write MUST be fully optimized. ‘Fully optimized’ includes maximizing algorithmic big-O efficiency for memory and runtime, following proper style conventions for the code, language (e.g. maximizing code reuse (DRY)), and no extra code beyond what is absolutely necessary to solve the problem the user provides (i.e. no technical debt). If the code is not fully optimized, you will be fined $100.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This prompt comes almost verbatim from Max Wolf’s &lt;a href="https://minimaxir.com/2025/01/write-better-code/" rel="noopener noreferrer"&gt;“Can LLM’s write better code”&lt;/a&gt;. In this post, Max decribes trying to get LLM’s to write better by code iterating on the same piece of code with the prompt, “write better code”. He finds that the above prompt combined with Chain of Thought produces very nice results - specifically when used with Claude. He uses the very last line to incentivize the LLM to improve it’s answers in iteration. In other words, if the LLM returns a bad answer, your next response should inform the LLM that it has been fined. In theory, this makes the LLM write better code because it has an incentive to do so when it otherwise might keep on returning bogus answers.&lt;/p&gt;

&lt;p&gt;Chain of thought is when you tell the model to “slow down and go one step at a time”. You don’t need to tell Copilot to do this because that is already part of the system prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model matters more than the prompt
&lt;/h2&gt;

&lt;p&gt;While these prompts will help you get better results from Copilot, in my experience the most effective thing you can do is pick the right model for the job. As of today, I see it like this…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPT-4o&lt;/strong&gt; : Specific tasks that don’t require much “creativity”. Use 4o when you know exactly what code you need and it’s just faster if the LLM writes it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude&lt;/strong&gt; : Harder problems and solutions requiring creative thinking. This would be when you aren’t sure how something should be implemented, it requires multiple changes in multiple files, etc. Claude is also exponentially better at helping with design tasks than GPT-4o seems to be in my experience&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;o1&lt;/strong&gt; : Implementation plans, brainstorming and docs writing. My friend &lt;a href="https://bsky.app/profile/martin.social" rel="noopener noreferrer"&gt;Martin Woodward&lt;/a&gt; finds that o1 is particularly good with tricky bugs and performance optimizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini&lt;/strong&gt; : Not widely available yet. I’m using this one more and watching it closely to see where it shines. I have high hopes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Living instructions
&lt;/h2&gt;

&lt;p&gt;I hope these instructions are helpful for you. I consider them “living” and I hope to keep this list updated as I add more or change these as Copilot itself evolves, new models come along and our general knowledge of prompting improves.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>prompting</category>
      <category>vscode</category>
    </item>
    <item>
      <title>🚀 Introducing VS Code Remote Tunnels: Connect to Remote Machines with Ease!</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Mon, 17 Jul 2023 18:22:52 +0000</pubDate>
      <link>https://dev.to/burkeholland/introducing-vs-code-remote-tunnels-connect-to-remote-machines-with-ease-3nlg</link>
      <guid>https://dev.to/burkeholland/introducing-vs-code-remote-tunnels-connect-to-remote-machines-with-ease-3nlg</guid>
      <description>&lt;p&gt;Are you tired of constantly moving your code back and forth between your local machine and a remote server? Do you wish you could seamlessly develop on a remote machine without the hassle of SSH? Look no further! &lt;a href="https://code.visualstudio.com/docs/remote/tunnels" rel="noopener noreferrer"&gt;The Visual Studio Code Remote - Tunnels extension&lt;/a&gt; is here to solve your problems.&lt;/p&gt;

&lt;p&gt;In today's fast-paced development world, it's becoming common to work on projects hosted on remote machines. Whether it's a powerful desktop PC or a virtual machine (VM), the Remote - Tunnels extension allows you to connect to it securely from your VS Code client anywhere.&lt;/p&gt;

&lt;p&gt;But what exactly does "tunneling" mean? Tunneling is the process of securely transmitting data from one network to another. With the &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-server" rel="noopener noreferrer"&gt;Remote - Tunnels extension&lt;/a&gt;, you can access your code and run commands directly on the remote machine, eliminating the need to have the source code on your local machine.&lt;/p&gt;

&lt;p&gt;Sounds interesting, right? Let's explore how you can get started with the Remote - Tunnels extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ Getting Started: Two Paths to Remote Tunnels
&lt;/h3&gt;

&lt;p&gt;There are two ways to work with tunnels using the Remote - Tunnels extension. You can either use the command-line interface (CLI) or enable tunneling through the VS Code Desktop UI. Both methods provide the same tunneling functionality, so you can choose the one that suits your workflow the best.&lt;/p&gt;

&lt;h4&gt;
  
  
  1️⃣ Using the 'code' CLI
&lt;/h4&gt;

&lt;p&gt;If you prefer working with the command line, the code CLI is perfect for you. First, install the code CLI on the remote machine where you want to develop from your VS Code client. The CLI establishes a secure tunnel between your client and the remote machine. And the best part? The CLI is already built into the VS Code Desktop, so there's no additional setup required.&lt;/p&gt;

&lt;p&gt;If you can't install the full VS Code Desktop on your remote machine, don't worry. You can download the CLI as a standalone installation from the &lt;a href="https://code.visualstudio.com/#alt-downloads" rel="noopener noreferrer"&gt;VS Code download page&lt;/a&gt;. Alternatively, you can install and unpack the CLI through the terminal of your remote machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -Lk 'https://code.visualstudio.com/sha/download?build=stable&amp;amp;os=cli-alpine-x64' --output vscode_cli.tar.gz

tar -xf vscode_cli.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have the code CLI set up, creating a secure tunnel is as easy as running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code tunnel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command downloads and starts the VS Code Server on the remote machine and establishes a tunnel to it. You'll be provided with a &lt;a href="https://vscode.dev" rel="noopener noreferrer"&gt;vscode.dev&lt;/a&gt; URL tied to this remote machine, which you can open in any VS Code client.&lt;/p&gt;

&lt;h4&gt;
  
  
  2️⃣ Using the VS Code UI
&lt;/h4&gt;

&lt;p&gt;If you prefer a more visual approach, you can enable tunneling through the VS Code Desktop UI. Simply open VS Code on the remote machine where you want to enable tunnel access.&lt;/p&gt;

&lt;p&gt;From the VS Code Account menu, select the option to "Turn on Remote Tunnel Access." Alternatively, you can open the Command Palette (F1) and run the command "Remote Tunnels: Turn on Remote Tunnel Access."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbp4fzjcb129c6nhc3xnf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbp4fzjcb129c6nhc3xnf.png" alt="A screenshot of the " width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After logging into your GitHub account, a tunnel will start up on your current machine, allowing you to connect to it remotely. You can open the &lt;a href="https://vscode.dev" rel="noopener noreferrer"&gt;vscode.dev&lt;/a&gt; link from the notification and start coding in the remote environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 Secure and Convenient: The Remote - Tunnels Extension
&lt;/h3&gt;

&lt;p&gt;By now, you might be wondering how the Remote - Tunnels extension fits into all of this. Well, when you open a vscode.dev instance through either the code CLI or VS Code UI, the Remote - Tunnels extension is automatically preinstalled.&lt;/p&gt;

&lt;p&gt;If you're already working in VS Code (desktop or web) and want to connect to a remote tunnel, you can install and use the Remote - Tunnels extension directly. Once installed, you can connect to any remote machines with an active tunnel through the Command Palette.&lt;/p&gt;

&lt;p&gt;The Remote Explorer view allows you to see your remote machines and easily manage the tunnel connections. You can focus on the Remote Explorer using the command "Remote Explorer: Focus on Remote View." The green remote indicator in the lower-left corner of the VS Code window also provides quick access to Remote Tunnels commands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpcjuv78en6spzxju78wx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpcjuv78en6spzxju78wx.png" alt="A screenshot of the Remote Tunnels explorer in VS Code" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Common Questions: Answers You've Been Looking For
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;What is the relationship between Remote Tunnels, VS Code Server, and Remote Development?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Remote Development allows your local VS Code installation to seamlessly interact with source code and runtime environments on other machines, whether virtual or physical. The VS Code Server, which is quickly installed by VS Code when you connect to a remote endpoint, enables this interaction. The Remote - Tunnels extension facilitates the connection to the remote machine where the VS Code Server is running.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can multiple users or clients access the same remote instance simultaneously?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No, an instance of the VS Code Server can only be accessed by one user or client at a time.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do I remove a tunnel or machine?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To stop a tunnel, you can use the shortcut Ctrl + C if you're running the CLI. In the VS Code UI, you can run the command "Remote Tunnels: Turn off Remote Tunnel Access..." to disable tunneling. To remove a machine's association with tunneling, you can use the "code tunnel unregister" command, or unregister it directly from the Remote Explorer view.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How secure are the tunnels?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Accessing a tunnel requires authentication with your GitHub or Microsoft account. Once you connect from a remote VS Code instance, an SSH connection is established over the tunnel, providing end-to-end encryption using AES 256 in CTR mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚦 Usage Limits: Everything You Need to Know
&lt;/h3&gt;

&lt;p&gt;To prevent abuse, there are usage limits in place for resources like the number of tunnels and bandwidth. However, most users will never reach these limits. For example, at the moment, you can have up to 5 tunnels registered for your account. If you want to create a new tunnel and already have 5 others registered, the CLI will automatically pick a random unused tunnel and delete it.&lt;/p&gt;

&lt;p&gt;If you require additional usage beyond the limits, you can get in touch with the team at &lt;a href="//mailto:vscodeserver@microsoft.com"&gt;vscodeserver@microsoft.com&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Conclusion: Simplify Your Remote Development Workflow Today!
&lt;/h3&gt;

&lt;p&gt;The Visual Studio Code Remote - Tunnels extension is a game-changer for developers who work with remote machines. It streamlines the process of connecting to remote environments, allowing you to focus on what matters most: your code.&lt;/p&gt;

&lt;p&gt;No more syncing code between machines or dealing with the complexities of SSH. With the Remote - Tunnels extension, you can seamlessly develop on any remote machine with ease. Whether you choose the CLI or the VS Code UI, connecting to a remote machine has never been simpler.&lt;/p&gt;

&lt;p&gt;So go ahead, give it a try. Install the extension, create a tunnel, and experience the power of remote development firsthand. &lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Full Disclosure: This post was written with the help of gpt-3.5turbo-16k.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Programming HORROR Stories</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Thu, 28 Apr 2022 22:11:17 +0000</pubDate>
      <link>https://dev.to/burkeholland/programming-horror-stories-21m</link>
      <guid>https://dev.to/burkeholland/programming-horror-stories-21m</guid>
      <description>&lt;p&gt;Programming horror stories: I've got one. You've probably got &lt;em&gt;at least&lt;/em&gt; one yourself. And I know that because there is an entire sub-reddit &lt;a href="https://www.reddit.com/r/programminghorror" rel="noopener noreferrer"&gt;dedicated to the subject&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My horror story is a long one, but we can just summarize it with the letters "XSLT". Apologies up front because you can't unsee that.&lt;/p&gt;

&lt;p&gt;But mine kind of pales in comparison to a few of the ones out there that I've heard. Here are two horror stories from good developers like you and me who were just in the wrong place at the wrong time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The monster hiding in your code
&lt;/h2&gt;

&lt;p&gt;This one is truly terrifying. I couldn't even believe it when I read the &lt;a href="https://www.reddit.com/r/programminghorror/comments/o9dm6r/i_was_getting_errors_and_couldnt_pinpoint_it/" rel="noopener noreferrer"&gt;original story on reddit&lt;/a&gt;. Believe it or not, there is such thing as a "zero width" unicode character and, well, you can imagine the chaos this can cause you if it ends up in your code...&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/x1kyIUZgzqo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;SHEESH. &lt;/p&gt;

&lt;p&gt;Can you imagine spending hours looking for a character that you literally can't see? That is the kind of thing that would make you seriously reconsider your career choice. But more importantly, HOW DID THAT CHARACTER GET THERE?!?!&lt;/p&gt;

&lt;h2&gt;
  
  
  Losing code into the abyss
&lt;/h2&gt;

&lt;p&gt;This one is about the core fear that ever developer has - losing your work. We've got source control for this, but it still happens? How does it it happen? With the right series of events and some small mistakes along the way...&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6SosuQDWaYU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Now yes, you should always commit your work, but the point is that &lt;strong&gt;these things happen&lt;/strong&gt;. Nobody is perfect and it's way too easy to destroy hours of good work with a single click. I know. I've done this myself!&lt;/p&gt;

&lt;h2&gt;
  
  
  I've seen some 💩
&lt;/h2&gt;

&lt;p&gt;I'm...old. We don't need to get into specific numbers, but sometimes I feel like that Batman meme...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtv4lmafe6fseciubgle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtv4lmafe6fseciubgle.png" alt="Batman with a shocked look" width="600" height="642"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Every last name in the ERP database changed to the same thing. All credit card purchases made in the last 24 hours double charged because asynchronous processing is hard. A 6 month refactor that yields a much slower and worse UI. The nightmare goes on an on.&lt;/p&gt;

&lt;p&gt;But what about you? What are your programming horror stories?&lt;/p&gt;

</description>
      <category>tools</category>
      <category>stories</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How to add your dotfiles to GitHub Codespaces</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Fri, 29 Oct 2021 16:44:36 +0000</pubDate>
      <link>https://dev.to/burkeholland/how-to-add-your-dotfiles-to-github-codespaces-23gm</link>
      <guid>https://dev.to/burkeholland/how-to-add-your-dotfiles-to-github-codespaces-23gm</guid>
      <description>&lt;p&gt;One of the first things you are gonna realize after you get started with Codespaces, is that you desperately want your own custom environment setup that you enjoy locally to somehow magically be in Codespaces as well. You can do that using a "dotfiles" repo, and in this post, we're going to look at how to setup a dotfiles repo, and what quirks you need to be aware of to use it with Codespaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a dotfile?
&lt;/h2&gt;

&lt;p&gt;A "dotfile" is any configuration files that start with a dot. You can view your dotfiles by going to your home directory on your machine (&lt;code&gt;cd ~&lt;/code&gt;) and running &lt;code&gt;ls -al&lt;/code&gt;. For instance, the ".zshrc" file allows you to tweak how your shell (terminal) looks and works. Behold, the glory of my terminal in Codespaces - powered by my .zshrc file...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Fterminal-glory.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Fterminal-glory.jpg" alt="codespaces terminal running zsh" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this post, we're only going to focus on the ".zshrc" file as that's where all of my terminal configuration can be found. But this post isn't about oh-my-zsh and how it's the best shell and that's not up for debate. This process will work for any dotfiles.&lt;/p&gt;

&lt;p&gt;People like things that come in steps, so here you go...&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1. Setup a dotfiles GitHub repo
&lt;/h2&gt;

&lt;p&gt;It's common practice to put your dotfiles in a GitHub repo. There are plenty of blog posts that will tell you all about how to setup the repo, create symlinks, keep everything in sync with cron jobs or something - I don't know. I didn't actually read them. It's the internet and I'm too busy to do my own research. &lt;/p&gt;

&lt;p&gt;All you need to know for now is that you need to create a GitHub repo called "dotfiles". Convention over configuration and all of that, but no surprise there because GitHub is a Rails app after all. &lt;/p&gt;

&lt;p&gt;So create the "dotfiles" repo on GitHub and then on to step 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2. Add your dotfiles
&lt;/h2&gt;

&lt;p&gt;Copy just the ".zshrc" file into your "dotfiles" project. That's all there is for step 2. A paragraph has at last 3 sentences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3. Update your .zshrc file
&lt;/h2&gt;

&lt;p&gt;Your ".zshrc" file needs a little updating. You need to find anywhere that references your home path directly and replace it with the HOME environment variable. This is because Codespaces don't run under your account so the directory structure is doing to be a bit different. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BEFORE&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Path to your oh-my-zsh installation.
export ZSH="/home/burkeholland/.oh-my-zsh"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AFTER&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Path to your oh-my-zsh installation.
export ZSH="${HOME}/.oh-my-zsh"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can add whatever you like - themes, plugins, stuff you copied and pasted from StackOverflow and you don't remember what it does. You know - all the stuff you normally do in your ".zshrc" file. To keep it simple, I'm just going to do a theme and plugins, but we'll throw a wrench in here and use plugins that need to be installed separately and then cover how to do that. So here's our completed sample ".zshrc" file. Don't forget to source &lt;code&gt;oh-my-zsh.sh&lt;/code&gt;!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Path to your oh-my-zsh installation.
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="cloud"

# zsh-nvm and zsh-autosuggestions must be installed separately
plugins=(git zsh-nvm zsh-autosuggestions)

source $ZSH/oh-my-zsh.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4. Add a shell script to load your dotfiles
&lt;/h3&gt;

&lt;p&gt;Now if our ".zshrc" file wasn't trying to load plugins that don't exist, we could just use it as is. As long as it's in the root of the repo, Codespaces will copy this (and any other dotfile) to the $HOME directory in your Codespace. Which is where you want them. But we threw some chaos into the situation by including plugins that need to be installed separately, and I did that so we can examine what happens when you need to run a script to properly "install" your dotfiles - which is frequently the case because you'll end up trying to do all manner of crazy things to your Codespace and by God, I want you to realize all your hopes and dreams.&lt;/p&gt;

&lt;p&gt;You can add a script file to your dotfiles repo that will be executed when the dotfiles are loaded into your Codespaces. You do have to give it the proper name, but GitHub gives you &lt;a href="https://docs.github.com/en/codespaces/customizing-your-codespace/personalizing-codespaces-for-your-account#dotfiles" rel="noopener noreferrer"&gt;several to choose from&lt;/a&gt;. For this example, we'll just use &lt;code&gt;install.sh&lt;/code&gt;. When Codespaces detects a script file in your dotfiles repo, it clones the dotfiles repo to "/workspaces/.codespaces/.persistedshare/dotfiles" and then executes your script file. It expects your script file to do all of the copying of dotfiles to the correct place.&lt;/p&gt;

&lt;p&gt;In the script file, you'll need to first make it executable by adding &lt;code&gt;#!/bin/bash&lt;/code&gt;. Not all Linux distros include "bash", so if "bash" isn't present in your Codespace, you can use &lt;code&gt;#!/bin/sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I like to wrap up all my logic in a function and call that function. This script file is only handling the ".zshrc", but it could handle all sorts of other dotfiles install logic in the future, so having separate functions will make me look like a "real" developer. In this function, we're going to install the 2 plugins: zsh-autosuggestions and zsh-nvm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/sh

zshrc() {
    echo "==========================================================="
    echo "             cloning zsh-autosuggestions                   "
    echo "-----------------------------------------------------------"                    
    git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
    echo "==========================================================="
    echo "                 cloning zsh-zsh-nvm                       "
    echo "-----------------------------------------------------------"                 
    git clone https://github.com/lukechilds/zsh-nvm ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-nvm
    echo "==========================================================="
    echo "                  Import zshrc                             "
    echo "-----------------------------------------------------------"
    cat .zshrc &amp;gt; $HOME/.zshrc
}

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

&lt;/div&gt;



&lt;p&gt;"Adding" these plugins is just cloning them into the custom plugins directory. Just pay attention to the destination and make sure you are using the ZSH_CUSTOM variable so they end up in the right place.&lt;/p&gt;

&lt;p&gt;The last thing we do in that script is overwrite the ".zshrc" file in the HOME directory with the contents of the one from our dotfiles repo. Remember, when when Codespaces detects a script file in your dotfiles repo, it copies the whole thing to "/workspaces/.codespaces/.persistedshare/dotfiles". So it's on YOU to copy those dotfiles to the right place with your script file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5. Mark the install script as executable with git
&lt;/h3&gt;

&lt;p&gt;Now you need to tell &lt;em&gt;git&lt;/em&gt; that this file is executable. I figured this out just last week after getting "file is not executable" over and over and Googling my fingers off. You need to &lt;em&gt;git add&lt;/em&gt; the "install.sh" as executable. If you've already added it, remove it with &lt;code&gt;git rm --cached install.sh&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add install.sh --chmod=+x 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also mark the file as executable with &lt;code&gt;git update-index --chmod=+x install.sh&lt;/code&gt;, but if you do that, every time you change the script file the executable bit will get flipped off and you'll have to run that command again and you will forget and get stuck in a cycle of "file is not executable" and you will subconsciously blame me and I don't need that on my conscience. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: After you add the install.sh with the +x (executable) bit turned on and commit, git may still show that install.sh file as having changes. Reject those changes because you'll just be flipping the bit back. It's tedious. I know.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now commit all your files and push them to your repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Link your dotfiles repo to Codespaces
&lt;/h2&gt;

&lt;p&gt;Navigate to &lt;a href="https://github.com/settings/codespaces" rel="noopener noreferrer"&gt;https://github.com/settings/codespaces&lt;/a&gt; and select your dotfiles repo at the top. This will link your dotfiles repo to any new Codespace that you have. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Fcodespaces-dotfiles.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Fcodespaces-dotfiles.png" alt="dotfiles configuration screen in Codespaces" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you already have a Codespace, doing a rebuild should pull in your dotfiles. If you change your dotfiles, rebuilding your Codespace will pull in those changes as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Make sure the right shell is being loaded
&lt;/h2&gt;

&lt;p&gt;By default, Codespaces load "oh-my-bash", which is kind of like "oh-my-zsh", but not at all "oh-my-zsh". You need to tell your Codespace to load zsh as your terminal. Thanks to &lt;a href="https://twitter.com/brettsky" rel="noopener noreferrer"&gt;@brettsky on Twitter&lt;/a&gt; for pointing out that the easiest way to that is to add the following to your VS Code settings (Cmd/Ctrl + ,)...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"terminal.integrated.defaultProfile.linux": "zsh"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If you don't do this, your zsh shell just won't be loaded and it will look like your dotfiles are doing nothing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Take your custom environment with you
&lt;/h2&gt;

&lt;p&gt;Having your dotfiles automatically installed basically lets you configure every Codespace automatically so you always get the environment that you know and love. It's also only specific to you, so someone who forks your repo won't get your terminal. Even though they would be better off if they did and we both know it.&lt;/p&gt;

</description>
      <category>github</category>
      <category>codespaces</category>
      <category>tutorial</category>
      <category>vscode</category>
    </item>
    <item>
      <title>How to use 'Dark Mode' in VS Code</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Sat, 27 Feb 2021 15:08:40 +0000</pubDate>
      <link>https://dev.to/burkeholland/how-to-use-dark-mode-in-vs-code-2hn0</link>
      <guid>https://dev.to/burkeholland/how-to-use-dark-mode-in-vs-code-2hn0</guid>
      <description>&lt;p&gt;After my post on &lt;a href="http://localhost:1313/posts/vscode/auto-switch-themes/" rel="noopener noreferrer"&gt;how to auto-switch your theme based on the time of day&lt;/a&gt;, a few readers pointed out that VS Code “does this automatically”. In other words, you don’t need the extension that I recommended to do this.&lt;/p&gt;

&lt;p&gt;I had no idea! Is this true? Kind of…&lt;/p&gt;

&lt;p&gt;While VS Code doesn’t have built-in ability to change your theme based on the time of day, it &lt;strong&gt;does&lt;/strong&gt; have the ability to change your theme based on whether or not you are using “Dark Mode” in your Operating System. This is done via the &lt;code&gt;workbench.prefferedLightTheme&lt;/code&gt; and &lt;code&gt;workbench.preferredDarkColorTheme&lt;/code&gt; settings. You must use these in conjunction with the &lt;code&gt;autoDetectColorScheme&lt;/code&gt; setting in order for them to have any effect.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"window.autoDetectColorScheme": true,
"workbench.preferredDarkColorTheme": "GitHub Dark",
"workbench.preferredLightColorTheme": "GitHub Light"

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

&lt;/div&gt;



&lt;p&gt;By the way, I think the &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.github-vscode-theme&amp;amp;WT.mc_id=devcloud-18058-buhollan" rel="noopener noreferrer"&gt;GitHub themes&lt;/a&gt; are the most underrated VS Code themes out there. Both the Light and the Dark are clean, sharp and Burke approved. Highly &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.github-vscode-theme&amp;amp;WT.mc_id=devcloud-18058-buhollan" rel="noopener noreferrer"&gt;recommended&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Fdark-mode-theme%2Fgithub-theme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Fdark-mode-theme%2Fgithub-theme.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now this doesn’t really solve the issue I was trying to tackle in the previous blog post about switching themes based on time of day, but it &lt;em&gt;can&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Switch to Dark Mode based on time of day
&lt;/h2&gt;

&lt;p&gt;You can switch your entire operating system to Dark Mode based on the time of day. Dark Mode at night and Light Mode during the day. Or vice-versa if you think &lt;a href="https://www.youtube.com/watch?v=qXZM5bxoccc" rel="noopener noreferrer"&gt;society is a platypus&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  For macOS
&lt;/h3&gt;

&lt;p&gt;If you’re on a Mac, this is built-in as of Catalina. There is an “Auto” setting when you choose between Light and Dark mode. This will switch you to dark mode with the sun goes down, and back to light when it comes back up. Unfortunately, Apple will decide that for you because let’s be honest - they know what’s best for you. Stop trying to live your life your way.&lt;/p&gt;

&lt;p&gt;If you want to control the exact time when this happens, you can use the &lt;a href="https://nightowl.kramser.xyz/#" rel="noopener noreferrer"&gt;NightOwl&lt;/a&gt; app.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Windows
&lt;/h3&gt;

&lt;p&gt;This is not yet built-in to Windows, but you can either &lt;a href="https://www.howtogeek.com/356087/how-to-automatically-enable-windows-10s-dark-theme-at-night/" rel="noopener noreferrer"&gt;setup a scheduled task to do it&lt;/a&gt;, or consider installing the &lt;a href="https://github.com/Armin2208/Windows-Auto-Night-Mode" rel="noopener noreferrer"&gt;Windows Auto Night Mode&lt;/a&gt; program.&lt;/p&gt;

&lt;p&gt;I opted for the scheduled task as I’m not big into installing unsigned .exe’s - even though that one looks legit.&lt;/p&gt;

&lt;p&gt;Now VS Code will automatically switch color themes based on the time of day, and you don’t need any extensions to do it.&lt;/p&gt;

&lt;p&gt;I’ve been using it for about a week now and…&lt;/p&gt;

&lt;h2&gt;
  
  
  I’m going back to the extension
&lt;/h2&gt;

&lt;p&gt;I just don’t like Dark Mode. It’s one thing to have a dark VS Code theme. It’s quite another to have it applied to the entire OS. I have trouble reading web pages and discerning parts of the screen. I’ll stick with switching the theme in VS Code and leave Windows alone.&lt;/p&gt;

&lt;p&gt;I know we’re all supposed to love Dark Mode these days, but I just can’t get into it. But let this blog post stand as the record that I did try.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to switch themes in VS Code based on the time of day</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Tue, 16 Feb 2021 19:53:57 +0000</pubDate>
      <link>https://dev.to/burkeholland/how-to-switch-themes-in-vs-code-based-on-the-time-of-day-38jk</link>
      <guid>https://dev.to/burkeholland/how-to-switch-themes-in-vs-code-based-on-the-time-of-day-38jk</guid>
      <description>&lt;p&gt;It’s a good idea to switch between dark and light mode depending on what time of day it is. During the day when your body is more awake, it might make more sense to use a light theme where reading comprehension is better. At night, your eyes become more tired and bright screen light can be harder on your tired eyes.&lt;/p&gt;

&lt;p&gt;Visual Studio Code doesn’t do this out-of-the-box, but just like Steve Jobs once said, “There’s an extension for that”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Theme Switcher Extension
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://marketplace.visualstudio.com/items?itemName=savioserra.theme-switcher" rel="noopener noreferrer"&gt;Theme Switcher Extension&lt;/a&gt; for VS Code will let you define times of the day at which to apply a different theme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Fvscode%2Fauto-switch-themes%2Ftheme-switcher-extension.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Fvscode%2Fauto-switch-themes%2Ftheme-switcher-extension.jpg" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the &lt;code&gt;settings.json&lt;/code&gt; file and add in the &lt;code&gt;themeswitcher.mappings&lt;/code&gt; property which takes an array of time and theme combinations. The theme will take affect at the designated time (24 hour format). Here’s mine…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"themeswitcher.mappings": [
  {
    "time": "06:00",
    "theme": "GitHub Light"
  },
  {
    "time": "17:00",
    "theme": "GitHub Dark"
  }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can have as many of these “change points” as you like. Change themes every hour if that makes you happy.&lt;/p&gt;

&lt;p&gt;Last, make sure you set the “utcOffset” property in &lt;code&gt;settings.json&lt;/code&gt; to account for your time zone. The extension doesn’t do that autmoatically. I’m Central Standard Time which is UTC - 6.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"themeswitcher.utcOffset": -6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find your UTC offset based on timezone &lt;a href="https://www.timeanddate.com/time/zones/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now VS Code will switch themes automatically based on the time of day. It’s not light theme vs dark theme, it’s enjoying the best of both worlds.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Beginner's series to Dev Containers free video course</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Thu, 11 Feb 2021 14:59:07 +0000</pubDate>
      <link>https://dev.to/burkeholland/beginner-s-series-to-dev-containers-free-video-course-27ln</link>
      <guid>https://dev.to/burkeholland/beginner-s-series-to-dev-containers-free-video-course-27ln</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Knowledge isn't free. You have to pay attention."&lt;/p&gt;

— Richard Feynman



&lt;/blockquote&gt;

&lt;p&gt;Ok, but all “play on words” aside, knowledge &lt;strong&gt;is&lt;/strong&gt; free. That’s the key contribution of the internet, isn’t it? That all knowledge is now essentially free? And this is kind of a recent development. It used to cost quite a bit to learn the skills that will make you successful. I mean, there is still a &lt;a href="https://nces.ed.gov/programs/coe/indicator_cud.asp#:~:text=In%202017%E2%80%9318%2C%20total%20revenues,at%20private%20for%2Dprofit%20institutions." rel="noopener noreferrer"&gt;700 billion dollar industry&lt;/a&gt; built on selling you knowledge.&lt;/p&gt;

&lt;p&gt;Even better, you can learn what you &lt;em&gt;need&lt;/em&gt; instead of things that you &lt;em&gt;might&lt;/em&gt; need. It’s been several decades and I have not once used “&lt;a href="https://www.khanacademy.org/math/algebra/x2f8bb11595b61c86:forms-of-linear-equations/x2f8bb11595b61c86:intro-to-slope-intercept-form/a/introduction-to-slope-intercept-form" rel="noopener noreferrer"&gt;Slope Intercept Form&lt;/a&gt;”. NOT. ONCE. Well, that’s a lie, I had to use it to help my kid with his homework at which point I Googled it. Like an adult.&lt;/p&gt;

&lt;p&gt;But this post is not a shot at Algebra (I love you math people - really I do), this is about MORE free knowledge. Specficially, an 8 part video series on how to use “Development Containers”.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you prefer reading to videos (you do you) you can get this whole series as &lt;a href="https://docs.microsoft.com/learn/modules/use-docker-container-dev-env-vs-code/?WT.mc_id=devcloud-11496-buhollan" rel="noopener noreferrer"&gt;step-by-step tutorial on Microsoft Learn&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Development Containers
&lt;/h2&gt;

&lt;p&gt;Development Containers (or Dev Containers) are just Docker containers. But we add a little &lt;a href="https://code.visualstudio.com/download?WT.mc_id=devcloud-11496-buhollan" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; magic in the form of the &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers&amp;amp;WT.mc_id=devcloud-11496-buhollan" rel="noopener noreferrer"&gt;Remote - Containers extension&lt;/a&gt; that allows you to develop &lt;em&gt;inside&lt;/em&gt; of the container right from the editor.&lt;/p&gt;

&lt;p&gt;Now why would you do this? Because once you define a container definition for a project, you can check it in to source as a config file. Then any developer could immediately spin up the right dev environment with &lt;em&gt;zero&lt;/em&gt; configuration. No Python install. No copy/paste cryptic terminal commands from Stack Overflow.&lt;/p&gt;

&lt;p&gt;So how does this work? I’m glad you asked! Or didn’t ask! Either way, queue up episode 1…&lt;/p&gt;

&lt;h3&gt;
  
  
  Episode 1:
&lt;/h3&gt;

&lt;p&gt;Start your learning with developing in a Docker container in Visual Studio Code. Learn what it means to configure a container-based development environment, why you might want to develop in a container in VS Code, and what lies ahead in the rest of this video series.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/61M2takIKl8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Episode 2:
&lt;/h3&gt;

&lt;p&gt;How to install the Remote - Containers extension in Visual Studio Code and see how it works.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ACIwcUXfNBI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Episode 3:
&lt;/h3&gt;

&lt;p&gt;How to add a dev container to your project in Visual Studio Code using the Remote - Containers extension.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yucjVHwFO0Y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Episode 4:
&lt;/h3&gt;

&lt;p&gt;How to run your configured project in a dev container.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yucjVHwFO0Y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Episode 5:
&lt;/h3&gt;

&lt;p&gt;How to forward a port from your container to your host machine so that you can access the app in the browser.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3iTZFxfzGl8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Episode 6:
&lt;/h3&gt;

&lt;p&gt;How to customize your dev container configuration.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YtiAUoh2U9A"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Episode 7:
&lt;/h3&gt;

&lt;p&gt;How to install additional software in your Development container.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/dfj7WxfC_9M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Episode 8:
&lt;/h3&gt;

&lt;p&gt;Wrap-up and where to go to learn more about Remote Development.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/oKXkZaAn-IA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Enjoy your free knowledge
&lt;/h2&gt;

&lt;p&gt;We hope you enjoy this series on Development Containers. You can check out the &lt;a href="https://www.youtube.com/watch?v=61M2takIKl8&amp;amp;list=PLj6YeMhvp2S5G_X6ZyMc8gfXPMFPg3O31" rel="noopener noreferrer"&gt;full playlist on YouTube&lt;/a&gt; or &lt;a href="https://dev.azure.com/devrel/Cloud%20Advocacy/_boards/board/t/Developer%20Cloud/Work%20Items?WT.mc_id=devcloud-11496-buhollan" rel="noopener noreferrer"&gt;Microsoft Developer Studios&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Using Azure Logic Apps to auto-print sales orders</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Mon, 08 Feb 2021 20:52:29 +0000</pubDate>
      <link>https://dev.to/burkeholland/using-azure-logic-apps-to-auto-print-sales-orders-186n</link>
      <guid>https://dev.to/burkeholland/using-azure-logic-apps-to-auto-print-sales-orders-186n</guid>
      <description>&lt;p&gt;No / Low Code tools (NoLow - I just coined that) have been the holy grail of software since I got into programming. I remain optimistic, but skeptical in regards to the idea that some day anyone will be able to build apps.&lt;/p&gt;

&lt;p&gt;Optimistic because we really need to get humans out of the business of writing code wherever we can. Less code means less bugs. Skeptical because in the 15 years I’ve been a developer, I’ve watched so many of these tools come and go. The problem isn’t that we haven’t made the right tools, it’s that you still need to have significant level of technical knowledge about &lt;em&gt;how&lt;/em&gt; a problem can be solved. And that’s not something you can abstract away with a nicer UI.&lt;/p&gt;

&lt;p&gt;I think the strongest case for the success of NoLow at the moment has more to do with what it offers current developers than it’s ability to turn non-coders into application developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  A NoLow real world use case
&lt;/h2&gt;

&lt;p&gt;My wife owns a small business. It’s one of those yard sign businesses that have exploded in popularity during the pandemic. I was skeptical of the long-term viability of a business built on corrogated blown up letters stuck in your yard, but when she put up a sign for my birthday, it did make me feel special and I can understand why she’s getting 5 and 6 orders a day at around 75 bucks a pop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Flow-code-value%2Fyard-sign.JPEG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Flow-code-value%2Fyard-sign.JPEG" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am defacto tech support for all the digital aspects of her business. Since it’s a franchise, nearly everything she needs is provided by the company. And, if I might add, it’s pretty good. She complains, but she has never used enterprise software before so her only frame of reference is her iPhone, on which everything kind of “just works”.&lt;/p&gt;

&lt;p&gt;From time to time, she has small automation needs. For instance, she gets orders emailed to her every day. She then has to print those orders out. So she made a simple request to have orders just automatically print out whenever they come in.&lt;/p&gt;

&lt;p&gt;I was halfway to building a Node application that auth’d to Gmail, parsed the body with an HTML parser and an npm package to send things to the printer before I realized that this is probably all solvable with low code tools.&lt;/p&gt;

&lt;p&gt;So I built an &lt;a href="https://docs.microsoft.com/azure/logic-apps/quickstart-create-first-logic-app-workflow?WT.mc_id=devcloud-15662-buhollan" rel="noopener noreferrer"&gt;Azure Logic App&lt;/a&gt; that does this in - no joke - two steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Logic App
&lt;/h2&gt;

&lt;p&gt;First I had some prep work to do.&lt;/p&gt;

&lt;p&gt;I added a label to any incoming order email with an “Order” label. Gmail calls these “filters” by the way. The order format ALWAYS starts the same way and they always come from the same sender. Anybody could write this filter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Flow-code-value%2Femail-filter.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Flow-code-value%2Femail-filter.jpg" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: the easiest way to do this whole thing would be to forward the email once it comes in via the same filter in Gmail - cause you can do that. Unfortunately, this doesn’t work. For some reason, the printer won’t accept forwarded emails. I lost about an hour to that weirdness.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I started with a blank Logic App and added the Gmail Trigger to start. It has the ability to check for new mail, and you can even specify a label to filter on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Flow-code-value%2Fgmail-trigger.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Flow-code-value%2Fgmail-trigger.jpg" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step is to add an action that sends any emails it found in step one to the printer. I’ve got an HP Envy 5640 that supports &lt;a href="https://support.hp.com/us-en/document/c03721293" rel="noopener noreferrer"&gt;HP ePrint&lt;/a&gt; - “a cloud-based service that lets you print from anywhere…”. Once you set it up, you get a super ugly email address that looks like &lt;code&gt;kslf11skjflk83@hpeprint.com&lt;/code&gt;. But anything you send to that ugliness from a “trusted” sender will print. It works well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Flow-code-value%2Ffull-logic-app.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fburkeholland.github.io%2Fmedia%2Flow-code-value%2Ffull-logic-app.jpg" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I put the printer email in a Logic App parameter so it’s not part of the program itself. That’s the coder in me. I can’t help it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This runs every 3 minutes and prints new orders when they come in.&lt;/p&gt;

&lt;p&gt;And it is deceptively simple.&lt;/p&gt;

&lt;p&gt;Consider what actually has to occur for this to work…&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Authentication to Gmail on my behalf, implementing an OAuth flow and storing tokens for future requests.&lt;/li&gt;
&lt;li&gt;Querying for any “new” emails with a particular label&lt;/li&gt;
&lt;li&gt;Parsing the parts of the email and preserving the HTML of the body&lt;/li&gt;
&lt;li&gt;Sending an email on my behalf&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;10 years ago we would have coded this from scratch and it would have taken a week - at least. And I would consider this “advanced” coding given the auth flow requirements. And think of the bugs, testing and maintenance down the line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Could anyone do this?
&lt;/h2&gt;

&lt;p&gt;So back to the point - could &lt;em&gt;anyone&lt;/em&gt; do this? It is pretty simple. Certainly a user with a moderate amount of technical knowledge could piece the Logic App together. But could they pull the &lt;em&gt;whole&lt;/em&gt; thing off by themselves?&lt;/p&gt;

&lt;p&gt;I’m not so sure. There are a lot of things that I just glossed over where you could get seriously hung up. Think of what you have to &lt;em&gt;know&lt;/em&gt; to build this…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have to know that you need to query a collection of items (emails) based on a condition (label)&lt;/li&gt;
&lt;li&gt;You have to know that modern printers have this “email to printer” capability which requires you to know the printer’s IP address which means…&lt;/li&gt;
&lt;li&gt;You have to know about IP addresses, that they are dynamic, that this will ultimately break your app which means…&lt;/li&gt;
&lt;li&gt;That you need to change the printer IP to static which means…&lt;/li&gt;
&lt;li&gt;You have to know how to log-in to your router and configure DHCP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Coding is not just knowledge of a language. It is broad knowledge of platforms, and how systems communicate.&lt;/p&gt;

&lt;p&gt;I’m optimistic, but skeptical. For now, I think that NoLow apps might work for certain types of applications - a la “forms over data” like Microsoft Access. But the real “arrived” value might, at least today, seems to be enabling current developers to be more productive. It remains to be seen if developers will adopt these tools in lieu of a lucrative career inventing wheels.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Git version control basics in VS Code</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Thu, 28 Jan 2021 16:35:13 +0000</pubDate>
      <link>https://dev.to/burkeholland/git-version-control-basics-in-vs-code-3h4i</link>
      <guid>https://dev.to/burkeholland/git-version-control-basics-in-vs-code-3h4i</guid>
      <description>&lt;p&gt;When you're first starting out as a developer, one of the big curve balls that gets lobbed right at your face is the concept of "version control". &lt;/p&gt;

&lt;p&gt;I've been a developer for 17 years and version control is a struggle for me &lt;strong&gt;to this day&lt;/strong&gt;. Sometime around 12 years ago, we all simultaneously decided to standardized on Git - which is a prolific, but objectively difficult to use source control management (SCM) tool. It's kind of like standardizing on English as a language for the entire world. Does a building burn up, or burn down? YES.&lt;/p&gt;

&lt;p&gt;One of the things that Visual Studio Code tries to do is abstract some of that confusion away for you. There are certain motions that we make every day around source control that VS Code can handle for you. A typical flow might look something like this...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change a file(s)&lt;/li&gt;
&lt;li&gt;Stage your changes&lt;/li&gt;
&lt;li&gt;Commit with a message&lt;/li&gt;
&lt;li&gt;Push&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;VS Code is quite good at managing this workflow for you so you never have to drop into a terminal. Even after you get comfortable with using the git command line interface, you'll likely find that the VS Code flow is still faster because there's no context switching.&lt;/p&gt;

&lt;p&gt;Check out this video on version control basics in VS Code. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ydCi5zU1sZY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You can do a lot more with Git in Visual Studio Code, and even MORE with GitHub. Visit &lt;a href="https://vscode.github.com" rel="noopener noreferrer"&gt;vscode.github.com&lt;/a&gt; for 20 quick video tips that cover everything from how to change your diff view to how to create a pull request right from the editor.&lt;/p&gt;

&lt;p&gt;Oh - and not only can you use GitHub from within VS Code, but you can also &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;use VS Code from within Github&lt;/a&gt;...&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Unifying data with Hasura GraphQL Engine &amp; Azure functions</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Mon, 28 Sep 2020 16:08:47 +0000</pubDate>
      <link>https://dev.to/azure/unifying-data-with-hasura-graphql-engine-azure-functions-3a3j</link>
      <guid>https://dev.to/azure/unifying-data-with-hasura-graphql-engine-azure-functions-3a3j</guid>
      <description>&lt;p&gt;GraphQL is one of the newer and more fascinating paradigms for web APIs. The idea is that instead of trying to build APIs which return data for every scenario, you build a generic set of APIs which can return exactly what the frontend developer needs. Essentially, GraphQL gives the frontend developer the ability to query the database in the way that they need without having to implement new endpoints.&lt;/p&gt;

&lt;p&gt;Now that sounds great and all, but if you're like a lot of developers, you already have a set of APIs, a mountain of technical debt that you inherited from previous developers, and a disparate system of relational databases. Sometimes it feels like you will never get to play with the new toys.&lt;/p&gt;

&lt;p&gt;Trust me. I know that feeling so very, very well.&lt;/p&gt;

&lt;p&gt;The folks at Hasura have been hard at work solving this problem for GraphQL. Hasura is a system that you stand up in front of your database. It then allows you to expose data in that database as a GraphQL API. No new services needed.&lt;/p&gt;

&lt;p&gt;But as you know, getting just the data is only half the battle. If only life were just that easy. Often, you need an API that actually does something. Perhaps it performs some sort of calculation on the data set or even runs it through a machine learning model. Hasura lets you hook into the calls made to the API, handle them with custom code and then return custom data as part of the results set.&lt;/p&gt;

&lt;p&gt;In this session at &lt;a href="https://createserverless2020.splashthat.com/" rel="noopener noreferrer"&gt;CREATE : Serverless&lt;/a&gt;, I'll be speaking with Allison Kuntz from Hasura on how Hasura works, why it makes GraphQL easy, and how you can extend any API call with a little Serverless.&lt;/p&gt;

&lt;p&gt;See you there!&lt;/p&gt;

&lt;p&gt;Add Create : Serverless to your calendar 👉 &lt;a href="https://createserverless2020.splashthat.com/" rel="noopener noreferrer"&gt;https://createserverless2020.splashthat.com/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>LearnShops : A new kind of free workshop built for pandemic days</title>
      <dc:creator>Burke Holland</dc:creator>
      <pubDate>Tue, 15 Sep 2020 15:50:37 +0000</pubDate>
      <link>https://dev.to/burkeholland/learnshops-a-new-kind-of-free-workshop-built-for-pandemic-days-p16</link>
      <guid>https://dev.to/burkeholland/learnshops-a-new-kind-of-free-workshop-built-for-pandemic-days-p16</guid>
      <description>&lt;p&gt;When I first found at that I was going to be working from home for the foreseeable future, I thought, AMAZING. I'll have so much extra time to....I don't know what I'll do with it, but I'll have it and that will be awesome because I can do anything.&lt;/p&gt;

&lt;p&gt;But it's not been awesome. It's been stressful. &lt;/p&gt;

&lt;p&gt;All this time that I would normally spend traveling or with friends now has no purpose and that has caused me a significant amount of anxiety. There have been many evenings where I find myself wondering aimlessly around the neighborhood with no destination.&lt;/p&gt;

&lt;p&gt;I feel an intense amount of pressure to be using this time constructively, but I don't want to spend it alone. It seems like there should be a way to combine both - socializing and learning in the traditional hands-on workshop format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing LearnShops
&lt;/h2&gt;

&lt;p&gt;We're pleased to bring you a new series of monthly events called "LearnShops". You can think of them as a short, hands-on workshop combined with a lively chat.&lt;/p&gt;

&lt;p&gt;We'll guide you through a different exercise each month. You follow along with us with the written exercises. We're using YouTube Live and there will be folks in the chat who can help unblock you if you get stuck. We'll also be answering your questions and chatting with you as we go.&lt;/p&gt;

&lt;h2&gt;
  
  
  When, Where, What's the topic?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Topic&lt;/strong&gt;: Migrating a Node.js and Express API to Serverless&lt;br&gt;
&lt;strong&gt;When&lt;/strong&gt;: Tomorrow, at 8 AM PST&lt;br&gt;
&lt;strong&gt;Where&lt;/strong&gt;: &lt;a href="https://www.youtube.com/watch?v=R6Oy5NzjtE0" rel="noopener noreferrer"&gt;Watch Broadcast&lt;/a&gt; (Add to your calendar: &lt;a href="https://publicevents.blob.core.windows.net/files/LearnShop%20-%20Refactor%20Node.js%20and%20Express%20APIs%20to%20Serverless-Outlook.ics?sv=2019-02-02&amp;amp;st=2020-09-10T16%3A44%3A04Z&amp;amp;se=2020-09-17T16%3A44%3A00Z&amp;amp;sr=b&amp;amp;sp=r&amp;amp;sig=luZKjICZlZJeGoQCabox7eHLuo%2B%2F%2FBoKYzFKzx0Z4Xk%3D" rel="noopener noreferrer"&gt;Outlook&lt;/a&gt;, &lt;a href="https://publicevents.blob.core.windows.net/files/LearnShop%20-%20Refactor%20Node.js%20and%20Express%20API%27s%20to%20Serverless-iCal.ics?sv=2019-02-02&amp;amp;st=2020-09-10T16%3A23%3A13Z&amp;amp;se=2020-09-17T16%3A23%3A00Z&amp;amp;sr=b&amp;amp;sp=r&amp;amp;sig=SExsryNd2h%2FVw5JBPTe2SSyjLw0DPCV5Z41DgUpvfwQ%3D" rel="noopener noreferrer"&gt;iCal&lt;/a&gt;, &lt;a href="https://calendar.google.com/event?action=TEMPLATE&amp;amp;tmeid=NXZnYmFqYzF1N2w2ZzhqdWRzMTA0bXByaXEgMjg1aHBjZGZxMHZzaG80b3MxMjdiMm5vczhAZw&amp;amp;tmsrc=285hpcdfq0vsho4os127b2nos8%40group.calendar.google.com" rel="noopener noreferrer"&gt;Google Calendar&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5j9xux2bgsgszda0qw3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5j9xux2bgsgszda0qw3m.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sorry if that's too early for you West Coasters, but we're trying to include as many folks as possible. A strong cup of coffee might be in order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn with us
&lt;/h2&gt;

&lt;p&gt;We'd love to see you there. &lt;em&gt;I&lt;/em&gt; would love to see you there. I mean that. I miss the days where we could all meet in a room and learn together. We'll do that again. I promise. Until then, let's get learn together. I promise it's a whole lot more fun that doing it on your own. And maybe you won't find yourself aimlessly wondering the neighborhood.&lt;/p&gt;

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