<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Chris&#39; Blog</title>
    <link>https://chriswheeler.dev/posts/</link>
    <description>Recent content in Posts on Chris&#39; Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 19 Jul 2026 21:32:46 -0700</lastBuildDate>
    <atom:link href="https://chriswheeler.dev/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Searching related files</title>
      <link>https://chriswheeler.dev/posts/searching-related-files/</link>
      <pubDate>Sun, 19 Jul 2026 21:32:46 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/searching-related-files/</guid>
      <description>Searching a category of files can be done in many ways. For example, a script that searches for a phrase in all GitHub Actions workflows on a computer could take only around a dozen lines of code in most languages.
The best way overall I&amp;rsquo;ve found so far is with rg (ripgrep) in a bash script. It&amp;rsquo;s great because writing it doesn&amp;rsquo;t take long, the output formatting is useful, and it&amp;rsquo;s easy to adjust the output without changing the script.</description>
    </item>
    <item>
      <title>Running terminal commands with Python</title>
      <link>https://chriswheeler.dev/posts/running-terminal-commands-with-python/</link>
      <pubDate>Sat, 18 Jul 2026 11:37:28 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/running-terminal-commands-with-python/</guid>
      <description>Running a terminal command with Python usually looks like this:
import subprocess subprocess.run([&amp;#34;git&amp;#34;, &amp;#34;init&amp;#34;], check=True) Using check=True will make subprocess.run throw an exception if the command fails. If you don&amp;rsquo;t use check=True, you should probably check the return code yourself or the command could fail silently.
You can catch errors like this:
try: subprocess.run([&amp;#34;git&amp;#34;, &amp;#34;init&amp;#34;], check=True) except subprocess.CalledProcessError as err: print(f&amp;#34;git init failed with return code {err.returncode}&amp;#34;) To get any error messages that may be in stderr, you can use capture_output=True and text=True.</description>
    </item>
    <item>
      <title>Docker healthchecks</title>
      <link>https://chriswheeler.dev/posts/docker-healthchecks/</link>
      <pubDate>Tue, 02 Jun 2026 22:58:12 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/docker-healthchecks/</guid>
      <description>Whether a Docker container is healthy is not just about whether it&amp;rsquo;s running. A service could stop working properly without crashing. Docker can detect some of those kinds of invalid states when we define custom healthchecks.
healthcheck in Docker Compose | Docker Docs HEALTHCHECK in Dockerfile | Docker Docs The way it works is you define a command for Docker to periodically run inside the container, and Docker uses that command&amp;rsquo;s exit code to determine whether the service is healthy.</description>
    </item>
    <item>
      <title>Daily math</title>
      <link>https://chriswheeler.dev/posts/daily-math/</link>
      <pubDate>Thu, 07 May 2026 23:59:38 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/daily-math/</guid>
      <description>I built something that makes my life a little easier, maybe: a tiny mental math quiz: Daily Math. I want to maintain a little bit of mental math skills with minimal effort, and I heard one of the best ways is to pick two random numbers and then add, subtract, multiply, and divide them. Daily Math takes care of coming up with two random numbers and checking whether your answers are correct.</description>
    </item>
    <item>
      <title>PDF generators</title>
      <link>https://chriswheeler.dev/posts/pdf-generators/</link>
      <pubDate>Sun, 26 Apr 2026 14:54:13 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/pdf-generators/</guid>
      <description>PDFs can be generated programmatically in several ways. A common use case is converting a website to PDF, but some of the tools listed below work for other use cases too.
Converting a website to PDF If you&amp;rsquo;re okay with text not being selectable or searchable, you could use html-to-image to turn the site into images, and then put the images into a new PDF with jsPDF. Use JPEGs so the resulting file isn&amp;rsquo;t too big.</description>
    </item>
    <item>
      <title>Restic and Time Machine</title>
      <link>https://chriswheeler.dev/posts/restic-and-time-machine/</link>
      <pubDate>Thu, 26 Mar 2026 22:04:37 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/restic-and-time-machine/</guid>
      <description>Restic and Time Machine (TM) are backup programs that complement each other with their different strengths and weaknesses. I now use both: Restic for remote backups and Time Machine for most local backups.
Platforms TM is only available for MacOS while Restic runs almost anywhere.
Ease of use TM is much easier to use than Restic. When you connect an external drive to your computer, a popup will appear asking if you want to back up your computer to that drive.</description>
    </item>
    <item>
      <title>How to install Ansible</title>
      <link>https://chriswheeler.dev/posts/how-to-install-ansible/</link>
      <pubDate>Sat, 07 Feb 2026 21:00:00 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/how-to-install-ansible/</guid>
      <description>Here&amp;rsquo;s a way to install Ansible that&amp;rsquo;s easier and more likely to work than the official instructions.
Install uv if you haven&amp;rsquo;t already uv tool install ansible-core That&amp;rsquo;s it. You should now be able to use commands such as ansible, ansible-playbook, etc.</description>
    </item>
    <item>
      <title>NGINX config for Immich</title>
      <link>https://chriswheeler.dev/posts/nginx-config-for-immich/</link>
      <pubDate>Mon, 26 Jan 2026 21:59:40 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/nginx-config-for-immich/</guid>
      <description>Immich is a self-hosted alternative to Google Photos. I&amp;rsquo;ve been running an instance for a few months now, and it&amp;rsquo;s great. Immich&amp;rsquo;s docs has a sample NGINX config, but there are a few changes you&amp;rsquo;ll probably want to make to it.
Prevent indexing In the location / { ... } block, you should probably add a line that says add_header X-Robots-Tag &amp;quot;noindex, nofollow&amp;quot;; to prevent search engine crawlers from indexing your site.</description>
    </item>
    <item>
      <title>Cross-compilation with Wails</title>
      <link>https://chriswheeler.dev/posts/cross-compilation-with-wails/</link>
      <pubDate>Wed, 10 Dec 2025 16:49:19 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/cross-compilation-with-wails/</guid>
      <description>On 2025-12-9, I tested the cross-compilation of the official Svelte template of Wails v2.11.0, a desktop app framework for Go, on my amd64 laptop running Ubuntu 24 with Go v1.25.5. Of course, the results may change in the future as Wails and Go are being improved. Go is known for making cross-compilation much easier than most other languages, and that is mostly still true when using frameworks like Wails. Creating executable files and/or installers for each of several platforms is sometimes as simple as listing those platforms in a command:</description>
    </item>
    <item>
      <title>Project generators</title>
      <link>https://chriswheeler.dev/posts/project-generators/</link>
      <pubDate>Fri, 05 Dec 2025 19:03:07 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/project-generators/</guid>
      <description>A software project generator sets up the starting boilerplate for a project, filling in the new project&amp;rsquo;s name and other details in various places throughout the new files. Project generators make starting new projects much faster and lowers the barrier to quickly trying an idea. Their output can be much more reliable than that of LLMs. Like all tools, they are useful in some situations and less so in others.</description>
    </item>
    <item>
      <title>Exit in Python</title>
      <link>https://chriswheeler.dev/posts/exit-in-python/</link>
      <pubDate>Sat, 22 Nov 2025 21:29:53 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/exit-in-python/</guid>
      <description>Python has several ways to make a program exit.
exit should probably only be used to exit a Python REPL because it&amp;rsquo;s not safe to assume it&amp;rsquo;s defined.
The sys.exit function is safe, but you might prefer to raise SystemExit instead because:
they do the same thing and have the same interface sys.exit requires an additional import (import sys) sys.exit raises SystemExit without being explicit about the fact it raises an exception You can exit with a status code, such as raise SystemExit(0) or raise SystemExit(1).</description>
    </item>
    <item>
      <title>Sync repos between devices using bash</title>
      <link>https://chriswheeler.dev/posts/copy-repos-between-devices-using-bash/</link>
      <pubDate>Tue, 21 Oct 2025 20:51:58 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/copy-repos-between-devices-using-bash/</guid>
      <description>Sometimes it&amp;rsquo;s helpful to sync a Git repository directly from one machine to another without using a Git host like GitHub. If you can SSH into the machine(s) involved, you can use Bash&amp;rsquo;s rsync command. Rsync&amp;rsquo;s defaults aren&amp;rsquo;t great for syncing repos for several reasons, but a Bash script can fix that.
I named the script ,sync-repo:
,sync-repo . staging:/home/chris/repos/url-shortener This syncs the current directory (.) to /home/chris/repos/url-shortener in a machine named staging as defined in an SSH config file.</description>
    </item>
    <item>
      <title>Python in Justfiles</title>
      <link>https://chriswheeler.dev/posts/python-in-justfiles/</link>
      <pubDate>Tue, 30 Sep 2025 23:41:21 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/python-in-justfiles/</guid>
      <description>Just is a tool for defining and running custom commands for specific projects. Justfiles are often compared favorably to makefiles. If you&amp;rsquo;re new to Just, check out Just Programmer&amp;rsquo;s Manual.
A command definition in a justfile (a recipe) usually contains code written in the system&amp;rsquo;s default shell language, but Just lets you choose from many other languages including Python! This is especially great because it allows more recipes to be cross-platform.</description>
    </item>
    <item>
      <title>Browser extensions are risky</title>
      <link>https://chriswheeler.dev/posts/browser-extensions-are-risky/</link>
      <pubDate>Sun, 31 Aug 2025 23:57:57 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/browser-extensions-are-risky/</guid>
      <description>During the time I&amp;rsquo;ve been making browser extensions, I&amp;rsquo;ve learned about the amazing things they can do and how helpful they are, but also how dangerous they can be. Below are some examples of risks and ways to mitigate them.
Some of the risks Even though browsers put limits on what extensions can do and require them to ask permission for some things, extensions can still do more than what most people expect.</description>
    </item>
    <item>
      <title>Disposable vs. masked email addresses</title>
      <link>https://chriswheeler.dev/posts/disposable-vs-masked-email-addresses/</link>
      <pubDate>Thu, 31 Jul 2025 12:34:29 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/disposable-vs-masked-email-addresses/</guid>
      <description>Sometimes it&amp;rsquo;s helpful to give the terms &amp;ldquo;disposable&amp;rdquo; and &amp;ldquo;masked&amp;rdquo; two different meanings when referring to types of email addresses.
Both disposable addresses and masked addresses are great at protecting you from spam and phishing emails. Instead of giving out your main address, you can give out ones that are temporary or easy to replace.
Some email protection services have different sets of features:
addresses with inboxes that are completely public addresses with private inboxes, but you only get access to a random address for a short time (say, 10 minutes) addresses that you keep access to as long as you want, and all emails they receive are automatically forwarded to your main address I&amp;rsquo;ll refer to the last of those as &amp;ldquo;masked addresses&amp;rdquo; and the others as &amp;ldquo;disposable addresses&amp;rdquo; even though Wikipedia&amp;rsquo;s page on disposable addresses doesn&amp;rsquo;t make a distinction between them.</description>
    </item>
    <item>
      <title>Restic vs. Duplicati</title>
      <link>https://chriswheeler.dev/posts/restic-vs-duplicati/</link>
      <pubDate>Mon, 02 Jun 2025 15:41:11 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/restic-vs-duplicati/</guid>
      <description>Restic and Duplicati are both great for making backups of your computer&amp;rsquo;s files. I have experience with both. They&amp;rsquo;re mostly the same, but they have some differences that might be important depending on your needs.
Similarities They&amp;rsquo;re the same in many ways, including:
free open source versioning of backups choose specific files and folders to back up encryption compression deduplication verification scheduling of backups and retention (I now use Resticprofile for this) support for many storage locations (I happen to use Backblaze B2) Differences Setup Duplicati requires less technical skill to set up because its user interface is graphical.</description>
    </item>
    <item>
      <title>Types of secrets management</title>
      <link>https://chriswheeler.dev/posts/types-of-secrets-management/</link>
      <pubDate>Mon, 05 May 2025 01:07:06 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/types-of-secrets-management/</guid>
      <description>When creating software, it&amp;rsquo;s common to deal with secrets like database passwords, API access tokens, etc. There are many ways to make secrets available to software. Below are notes on some of the ways. Threat Modeling might help you determine which way is best for what you are doing.
Environment variables Putting secrets in environment variables (env vars) is very easy and might be fine if your setup is simple and otherwise very secure.</description>
    </item>
    <item>
      <title>Security benefits of SQL stored procedures</title>
      <link>https://chriswheeler.dev/posts/security-benefits-of-sql-stored-procedures/</link>
      <pubDate>Wed, 30 Apr 2025 23:57:40 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/security-benefits-of-sql-stored-procedures/</guid>
      <description>Using stored procedures instead of putting SQL statements directly into a service&amp;rsquo;s code can increase security. There are multiple reasons why.
Reduced attack surface The main security benefit is that hackers will be more limited in what they can do if the database credentials they steal can only call stored procedures.
As a demonstration, let&amp;rsquo;s say your data can only be accessed by stored procedures that each take a Discord user ID as input.</description>
    </item>
    <item>
      <title>Making Discord bots</title>
      <link>https://chriswheeler.dev/posts/making-discord-bots/</link>
      <pubDate>Wed, 12 Mar 2025 20:14:50 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/making-discord-bots/</guid>
      <description>Discord bots run as web services that use Discord&amp;rsquo;s API. They listen for requests from Discord and send responses. They need their own databases if a way to persist data is necessary. However, some Discord bot features require saving some data about the bot in Discord&amp;rsquo;s servers, such as slash command names.
Automated testing of Discord bots tends to be very limited or nonexistent since Discord has rate limits and is too complex to practically mock.</description>
    </item>
    <item>
      <title>Pointers vs. references</title>
      <link>https://chriswheeler.dev/posts/pointers-vs-references/</link>
      <pubDate>Wed, 03 Jul 2024 14:17:41 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/pointers-vs-references/</guid>
      <description>Some differences between pointers and references can be confusing, especially since there are several different definitions for those words. This can make it difficult to answer simple questions like &amp;ldquo;Does Golang have reference types?&amp;rdquo; (TLDR: most people and the official Go FAQ say that Go does have reference types.)
Pointers In some languages like C++, pointers can point anywhere in memory. They can point to null, or to memory with data of the pointer&amp;rsquo;s type, or any other part of memory.</description>
    </item>
    <item>
      <title>Go dev tools</title>
      <link>https://chriswheeler.dev/posts/go-dev-tools/</link>
      <pubDate>Tue, 02 Jul 2024 01:14:26 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/go-dev-tools/</guid>
      <description>Below are a bunch of commonly used packages and other tools for software development with Go. Go has excellent backwards and forwards compatability, so tools that haven&amp;rsquo;t been updated in a long time may still be a great choice. Unless otherwise noted, each tool listed here appears to me to be good enough at what it does that I don&amp;rsquo;t feel the need to look at alternatives.
If you&amp;rsquo;re new to Go, check out Learning Go.</description>
    </item>
    <item>
      <title>Bookmarklets</title>
      <link>https://chriswheeler.dev/posts/bookmarklets/</link>
      <pubDate>Mon, 01 Jul 2024 00:20:37 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/bookmarklets/</guid>
      <description>Bookmarklets are browser bookmarks that run some JavaScript instead of navigating to a website. They can do anything JavaScript can do including change fonts, search for phone numbers, remove all images, change the background color, automatically fill a form, and so much more.
This guide by Hongkiat Lim explains bookmarklets in more detail and lists many of the most popular ones.
More examples Here&amp;rsquo;s one I made. You can drag it into your bookmarks bar: copy markdown link.</description>
    </item>
    <item>
      <title>PDF tools</title>
      <link>https://chriswheeler.dev/posts/pdf-tools/</link>
      <pubDate>Thu, 09 May 2024 12:22:27 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/pdf-tools/</guid>
      <description>Here are a bunch of tools I found for reading, editing, and more with PDFs. I have not tried all of these but they all look promising.
Read Sumatra PDF is the best PDF reader for Windows. The default PDF readers on other platforms seem to work well. Edit, annotate, sign, or fill SimplePDF is an in-browser PDF editor. Some browsers, such as Firefox, include PDF editing tools. You can select a PDF and &amp;ldquo;Open with&amp;rdquo; a browser.</description>
    </item>
    <item>
      <title>Stardown v1.0.0</title>
      <link>https://chriswheeler.dev/posts/stardown-v1/</link>
      <pubDate>Sun, 05 May 2024 21:01:23 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/stardown-v1/</guid>
      <description>The first full version of Stardown has been released! Stardown is a free browser extension I created for copying markdown links for websites. One click on its icon copies a markdown link for the current page. A double-click copies markdown links for all tabs. Right-clicking a website gives you a markdown link for where you right-clicked.
Although I have tons of bookmarks, I save even more website links into markdown files in Obsidian and notes about software I&amp;rsquo;m working on.</description>
    </item>
    <item>
      <title>Making browser extensions</title>
      <link>https://chriswheeler.dev/posts/making-browser-extensions/</link>
      <pubDate>Sun, 05 May 2024 00:03:55 -0700</pubDate>
      <guid>https://chriswheeler.dev/posts/making-browser-extensions/</guid>
      <description>Creating browser extensions is easier than I expected, but still has some challenging parts. A great way to start learning how to make extensions is the Chrome dev docs.
Creating your first extension requires a lot of trial and error. It gets easier as you learn how extensions work and how to use the browser APIs. On sites like Stack Overflow, many discussions have answers that make assumptions, such as that you&amp;rsquo;re creating a content script and so have access to the document variable (which is not accessible in background scripts).</description>
    </item>
    <item>
      <title>Docker</title>
      <link>https://chriswheeler.dev/posts/docker/</link>
      <pubDate>Wed, 24 Jan 2024 13:10:44 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/docker/</guid>
      <description>Docker is a tool that makes running software easier by creating a container, which is like a little virtual computer with a more predictable configuration than most computers. Containers are very portable, by which I mean they can be created in and run in any operating system that can run Docker. For example, a container could run Linux within it, and the container itself could run on Mac, Windows, and Linux.</description>
    </item>
    <item>
      <title>Value, reference, and move types and semantics</title>
      <link>https://chriswheeler.dev/posts/value-reference-and-move-types-and-semantics/</link>
      <pubDate>Tue, 23 Jan 2024 23:55:59 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/value-reference-and-move-types-and-semantics/</guid>
      <description>I see a lot of confusion about value types and references types. Although I&amp;rsquo;m not sure how common this perspective is, here&amp;rsquo;s how I think of it.
First of all, value types have value semantics and reference types have reference semantics. The semantics of a type is the behavior of variables of that type.
Let&amp;rsquo;s say there are two variables, a and b, that have already been created and have the same type.</description>
    </item>
    <item>
      <title>Don&#39;t put all your eggs in one account</title>
      <link>https://chriswheeler.dev/posts/dont-put-all-your-eggs-in-one-account/</link>
      <pubDate>Tue, 23 Jan 2024 16:19:35 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/dont-put-all-your-eggs-in-one-account/</guid>
      <description>Online accounts can be lost without warning, but making that loss less painful is easy.
Full disclosure, there is one referral link marked with an asterisk (*) below that gives me account credit and gives a discount to anyone who signs up for a paid service with it. How much do you depend on the services of big tech companies like Google, Apple, or Microsoft? If one of your accounts was suddenly stolen or an algorithm decided to lock it, how devastating would that be?</description>
    </item>
    <item>
      <title>Tech literacy</title>
      <link>https://chriswheeler.dev/posts/tech-literacy/</link>
      <pubDate>Sun, 21 Jan 2024 10:04:19 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/tech-literacy/</guid>
      <description>There&amp;rsquo;s always room for improvements worth their time to make. Over years of extensively using computers, there are some tricks I&amp;rsquo;ve found that I don&amp;rsquo;t see others use as often as I expect. I&amp;rsquo;m not affiliated with any of the services, products, or companies mentioned here.
learn about tech gradually and bravely Everyone becomes overwhelmed or frustrated by technology sometimes. People good with tech tend to:
return to difficult challenges to try again after some rest reduce how often they become frustrated by spreading out challenges over time take notes to make it easier to continue where they left off after breaks not be afraid to guess and try things ask others for help If this page gets overwhelming, maybe bookmark it, close it, and read another section later.</description>
    </item>
    <item>
      <title>Why does privacy matter?</title>
      <link>https://chriswheeler.dev/posts/why-does-privacy-matter/</link>
      <pubDate>Sat, 13 Jan 2024 11:20:53 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/why-does-privacy-matter/</guid>
      <description>Privacy is not about whether you have something to hide. It&amp;rsquo;s about whether bad people can do bad things to you, because security is impossible without privacy.
If others can look over your shoulder any time, they can see all your passwords. If you couldn&amp;rsquo;t hide the key to your home in a pocket or purse, others could copy the key. If the walls of your home were glass, anyone could see your home defenses, where you keep valuables, when you&amp;rsquo;re sleeping or away, and how to disarm or unlock any alarm systems, safes, etc.</description>
    </item>
    <item>
      <title>Publishing Go packages</title>
      <link>https://chriswheeler.dev/posts/publishing-go-packages/</link>
      <pubDate>Fri, 12 Jan 2024 17:14:08 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/publishing-go-packages/</guid>
      <description>There are many ways you can share Go code and applications. Here are a few.
publishing to the Go package index (pkg.go.dev) This allows anyone with Go installed to download your package with go get or go install. go get is for getting code, and go install is for installing executables. More details on those commands are in the Go docs and this Stack Overflow discussion.
Here are the official docs on publishing to pkg.</description>
    </item>
    <item>
      <title>Impressive programming languages</title>
      <link>https://chriswheeler.dev/posts/impressive-programming-languages/</link>
      <pubDate>Sat, 09 Dec 2023 15:06:36 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/impressive-programming-languages/</guid>
      <description>Here&amp;rsquo;s why some languages are impressive to me. The languages are sorted alphabetically.
C C is the oldest widely used language, and almost all of today&amp;rsquo;s widely used languages were heavily influenced by C (at least indirectly). It tends to have the fastest execution speed of all high-level languages and has relatively few features which makes it quick to learn. C is used in spaceships and space exploration rovers, among many other cases.</description>
    </item>
    <item>
      <title>Which language should you learn first?</title>
      <link>https://chriswheeler.dev/posts/which-language-should-you-learn-first/</link>
      <pubDate>Fri, 27 Oct 2023 10:52:47 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/which-language-should-you-learn-first/</guid>
      <description>Don&amp;rsquo;t spend too much time choosing your first programming language. It can be a difficult choice to make, so here are some notes on what several languages are good for.
If you will soon start a course, bootcamp, etc. that might choose a language for you, figure out which one and start learning ahead. It can be good to focus on just one language for a while when you&amp;rsquo;re learning your first language.</description>
    </item>
    <item>
      <title>Learning Go</title>
      <link>https://chriswheeler.dev/posts/learning-go/</link>
      <pubDate>Tue, 22 Nov 2022 17:39:10 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/learning-go/</guid>
      <description>Here are various resources that are good to know about while learning the Go programming language.
I created a list of commonly used Go packages and other dev tools at Go dev tools.
getting started if you&amp;rsquo;re new to programming, check out Golang Tutorial For Beginners - YouTube A Tour of Go is probably the best way for developers with experience in another language to start learning Go Go Playground is an online Go editor and runner Tutorial: Get started with Go Go by Example Organizing a Go module Go FAQs go.</description>
    </item>
    <item>
      <title>How to control the terminal&#39;s cursor</title>
      <link>https://chriswheeler.dev/posts/how-to-control-the-terminals-cursor/</link>
      <pubDate>Mon, 09 May 2022 14:37:51 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/how-to-control-the-terminals-cursor/</guid>
      <description>Ever wanted to move the cursor up while printing output in a program? You can. Here&amp;rsquo;s how with C++, and the same string works with any language in many terminals:
cout &amp;lt;&amp;lt; &amp;#34;\x1b[A&amp;#34;; That moves the cursor up one line. You can move it up by as many lines as you want; here&amp;rsquo;s how to move it up by 3 lines:
cout &amp;lt;&amp;lt; &amp;#34;\x1b[3A&amp;#34;; A variable works there too:
int lines = 3; cout &amp;lt;&amp;lt; &amp;#34;\x1b[&amp;#34; &amp;lt;&amp;lt; lines &amp;lt;&amp;lt; &amp;#34;A&amp;#34;; You can also move the cursor down, right, and left.</description>
    </item>
    <item>
      <title>Learning recursion with C&#43;&#43;</title>
      <link>https://chriswheeler.dev/posts/learning-recursion-with-cpp/</link>
      <pubDate>Mon, 02 May 2022 23:23:49 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/learning-recursion-with-cpp/</guid>
      <description>Every programmer should be comfortable with recursion. Recursion is a type of loop created by making a function call itself. Here&amp;rsquo;s a recursive function that loops infinitely (until the computer runs out of memory) when called:
void print_stars() { cout &amp;lt;&amp;lt; &amp;#34;*&amp;#34;; print_stars(); } Just like for loops and while loops, recursion can be used to do something repeatedly. Some problems are easier to solve with one kind of loop than another.</description>
    </item>
    <item>
      <title>How to print emoji with C&#43;&#43;</title>
      <link>https://chriswheeler.dev/posts/how-to-print-emoji-with-cpp/</link>
      <pubDate>Thu, 28 Apr 2022 17:21:23 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/how-to-print-emoji-with-cpp/</guid>
      <description>Printing emoji can be tricky because C++ running in Windows doesn&amp;rsquo;t always support UTF-8. Emoji and other Unicode symbols can be printed with C++ by copying the symbol itself into your code or by using a Unicode code point. You can find emoji and other symbols at sites like unicode-table.com or with a keyboard shortcut (Windows+. on Windows, ctrl+cmd+space on Mac, and ctrl+. on some Linux distros). On Mac and Linux, working with emoji in C++ is straightforward and doesn&amp;rsquo;t require any tricks.</description>
    </item>
    <item>
      <title>How to use colors in terminals</title>
      <link>https://chriswheeler.dev/posts/how-to-use-colors-in-terminals/</link>
      <pubDate>Thu, 24 Mar 2022 23:25:28 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/how-to-use-colors-in-terminals/</guid>
      <description>You don&amp;rsquo;t need another dependency to color text. With many programming languages, you can change the color and the style of your output to a terminal using ANSI codes.
Here&amp;rsquo;s how:
with C++:
cout &amp;lt;&amp;lt; &amp;#34;\x1b[31m This will be red! \x1b[0m This will be the default color.&amp;#34;; with Python:
print(&amp;#34;\x1b[31m This will be red! \x1b[0m This will be the default color.&amp;#34;) As you can see, the string did not need to change at all even with a different programming language.</description>
    </item>
    <item>
      <title>Learning SQL</title>
      <link>https://chriswheeler.dev/posts/learning-sql/</link>
      <pubDate>Fri, 15 Oct 2021 16:17:29 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/learning-sql/</guid>
      <description>SQL (Structured Query Language) is a commonly used and reliable way for programs to store and retrieve data. In many cases, it&amp;rsquo;s much better in many ways than just using files directly.
There&amp;rsquo;s a lot that can be learned about SQL. Here are some resources to get you started.
Learn SQL with SQLBolt and/or The SQL Murder Mystery. Choose a database technology and tools. Databases by Full Stack Python is a guide (not entirely for Python) with various resources about databases.</description>
    </item>
    <item>
      <title>Getting started with Git and GitHub</title>
      <link>https://chriswheeler.dev/posts/getting-started-with-git-and-github/</link>
      <pubDate>Tue, 07 Sep 2021 14:42:16 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/getting-started-with-git-and-github/</guid>
      <description>Here are some great resources for learning how to use Git and GitHub. There&amp;rsquo;s more here than any one person will need, so just learn what will be helpful to you in the very near future.
Watch these short videos: Version control with Git and GitHub by freeCodeCamp. Check out Better Explained&amp;rsquo;s guides to version control and Git, or the Learn X in Y minutes guide to Git. Consider starting with a Git client with a graphical interface, such as GitHub Desktop, GitButler, or Sublime Merge.</description>
    </item>
    <item>
      <title>Algorithms</title>
      <link>https://chriswheeler.dev/posts/algorithms/</link>
      <pubDate>Sun, 20 Jun 2021 15:27:51 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/algorithms/</guid>
      <description>Big-O Cheat Sheet Algorithm – Wikipedia Sorting algorithm – Wikipedia Why quicksort is better than other sorting algorithms in practice App Academy has a free section about data structures and algorithms. Click the menu icon in the corner to see the list. HackerEarth Programming Tutorials and Practice Problems (when you choose one of the main topics and see a list of problems, click the subtopic you want on the left and then the &amp;ldquo;tutorial&amp;rdquo; link near the top of the page) Python algorithms for job interviews by freeCodeCamp Lecture Slides for Algorithm Design by Jon Kleinberg and Éva Tardos machine learning papers – Distill The Deadlock Empire – a game for learning concurrency Nick Johnsonz&amp;rsquo;s algorithms blog posts visualizations sorting algorithms – Toptal Explorable Explanations Data Structure Visualizations by David Galles algorithm-visualizer.</description>
    </item>
    <item>
      <title>Legally free books</title>
      <link>https://chriswheeler.dev/posts/legally-free-books/</link>
      <pubDate>Sat, 10 Apr 2021 22:11:27 -0800</pubDate>
      <guid>https://chriswheeler.dev/posts/legally-free-books/</guid>
      <description>Here are a bunch of free online books. I update this page with new books occasionally.
computer science Software Engineering at Google by Titus Winters, Tom Manshreck, and Hyrum Wright A Data-Centric Introduction to Computing by Fisler, Krishnamurthi, Lerner, and Politz Programming Languages: Application and Interpretation by Shriram Krishnamurthi How to Design Programs by Felleisen, Findler, Flatt, Krishnamurthi The Nature of Code by Daniel Shiffman Everything curl by Daniel Stenberg et al.</description>
    </item>
  </channel>
</rss>
