<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Home on austin j. adams</title>
    <link>https://austinjadams.com/</link>
    <description>Recent content in Home on austin j. adams</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 21 Feb 2017 14:14:38 -0500</lastBuildDate><atom:link href="https://austinjadams.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Survey of Qubit Representations</title>
      <link>https://austinjadams.com/blog/qubit-viz/</link>
      <pubDate>Fri, 27 Feb 2026 11:51:19 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/qubit-viz/</guid>
      <description>Because we humans are macroscopic beings who constantly interact with our environment, reasoning about the behavior of individual particles in a closed system &amp;mdash; quantum behavior &amp;mdash; can be difficult. Even the simplest quantum mechanic systems around, the spin-1/2 systems that people call quantum bits or qubits, aren&amp;rsquo;t much easier. Folks have designed many ways to represent qubit states. This post lists all the ones I have found.
Summary Name Example 1Q State Example 2Q State Refs.</description>
    </item>
    
    <item>
      <title>Proofs about Exponentials of Pauli Strings</title>
      <link>https://austinjadams.com/blog/exp-pauli-proofs/</link>
      <pubDate>Mon, 03 Feb 2025 12:06:55 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/exp-pauli-proofs/</guid>
      <description>This post is unfinished, so it may contain incorrect information. The paper &amp;ldquo;A Game of Surface Codes: Large-Scale Quantum Computing with Lattice Surgery&amp;rdquo; is a beautiful introduction to surface codes by Daniel Litinski. Figure 4 of the paper presents the following identities for exponentials of Pauli strings:
\[ \begin{alignat}{3} &amp;amp;(1)&amp;amp;\quad e^{-i\varphi P&amp;rsquo;} e^{-i(\pi/4)P} &amp;amp;= e^{-i(\pi/4)P} e^{-i\varphi P&amp;rsquo;} &amp;amp;\quad\text{if } PP&amp;rsquo; &amp;amp;= P&amp;rsquo;P \\ &amp;amp;(2)&amp;amp;\quad e^{-i\varphi P&amp;rsquo;} e^{-i(\pi/4)P} &amp;amp;= e^{-i(\pi/4)P} e^{-i\varphi (iPP&amp;rsquo;)} &amp;amp;\quad\text{if } PP&amp;rsquo; &amp;amp;= -P&amp;rsquo;P \\ &amp;amp;(3)&amp;amp;\quad P_\lambda&amp;rsquo; e^{-i(\pi/4) P} &amp;amp;= e^{i\theta}P_\lambda&amp;rsquo; &amp;amp;\quad\text{if } PP&amp;rsquo; &amp;amp;= P&amp;rsquo;P \\ &amp;amp;(4)&amp;amp;\quad P_\lambda&amp;rsquo; e^{-i(\pi/4) P} &amp;amp;= e^{i\theta}(iPP&amp;rsquo;)_\lambda &amp;amp;\quad\text{if } PP&amp;rsquo; &amp;amp;= -P&amp;rsquo;P \\ &amp;amp;(5)&amp;amp;\quad (e^{-i\phi P&amp;rsquo;} \otimes I^{\otimes d}) C(P_1,P_2) &amp;amp;= C(P_1, P_2) (e^{-i\phi P&amp;rsquo;} \otimes I^{\otimes d}) &amp;amp;\quad\text{if } P_1P&amp;rsquo; &amp;amp;= P&amp;rsquo;P_1 \\ &amp;amp;(6)&amp;amp;\quad (e^{-i\phi P&amp;rsquo;} \otimes I^{\otimes d}) C(P_1,P_2) &amp;amp;= C(P_1, P_2) e^{-i\phi(P&amp;rsquo; \otimes P_2)} &amp;amp;\quad\text{if } P_1P&amp;rsquo; &amp;amp;= -P&amp;rsquo;P_1 \\ &amp;amp;(7)&amp;amp;\quad (I^{\otimes d} \otimes e^{-i\phi P&amp;rsquo;}) C(P_1,P_2) &amp;amp;= C(P_1, P_2) (I^{\otimes d} \otimes e^{-i\phi P&amp;rsquo;}) &amp;amp;\quad\text{if } P_2P&amp;rsquo; &amp;amp;= P&amp;rsquo;P_2 \\ &amp;amp;(8)&amp;amp;\quad (I^{\otimes d} \otimes e^{-i\phi P&amp;rsquo;}) C(P_1,P_2) &amp;amp;= C(P_1, P_2) e^{-i\phi(P_1 \otimes P&amp;rsquo;)} &amp;amp;\quad\text{if } P_2P&amp;rsquo; &amp;amp;= -P&amp;rsquo;P_2 \end{alignat} \]</description>
    </item>
    
    <item>
      <title>Dissecting the Bloch Sphere</title>
      <link>https://austinjadams.com/blog/dissecting-the-bloch-sphere/</link>
      <pubDate>Mon, 26 Dec 2022 21:14:11 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/dissecting-the-bloch-sphere/</guid>
      <description>Learning quantum computing typically involves learning about the Bloch sphere, a representation of a qubit state as a point on the unit sphere. However, most sources don&amp;rsquo;t dig into how it really works, mathematically speaking. For example, neither the Qiskit textbook nor Mike &amp;amp; Ike attempt to explain the formula for the Bloch sphere to readers, only dumping the formula and saying &amp;ldquo;have fun!&amp;rdquo;
This post focuses on how the beloved Bloch sphere emerges.</description>
    </item>
    
    <item>
      <title>Proof of the Expectation Value of Z for a Qubit State</title>
      <link>https://austinjadams.com/blog/expectation-of-z/</link>
      <pubDate>Sat, 16 Apr 2022 12:05:52 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/expectation-of-z/</guid>
      <description>It has been a few years since I wrote a post on this blog, so I wanted to share a fun proof, even if it&amp;rsquo;s a little trivial.$ \newcommand{bra}[1]{\langle #1 |} \newcommand{ket}[1]{| #1 \rangle} \newcommand{braket}[2]{\langle #1 | #2 \rangle} \newcommand{bramket}[3]{\langle #1 | #2 | #3 \rangle} $
For many quantum applications, you care about $\bramket{\psi}{Z}{\psi}$. That is, the expectation value of the Pauli operator $Z$. I&amp;rsquo;m a computer scientist, so $\ket{\psi}$ is a qubit state for me, but this is defined for any quantum state $\ket{\psi}$.</description>
    </item>
    
    <item>
      <title>Fixing Spotify on HiDPI on Ubuntu</title>
      <link>https://austinjadams.com/blog/spotify-hidpi-ubuntu/</link>
      <pubDate>Wed, 02 Dec 2020 23:04:45 -0800</pubDate>
      
      <guid>https://austinjadams.com/blog/spotify-hidpi-ubuntu/</guid>
      <description>The official &amp;ldquo;Spotify for Linux&amp;rdquo; page states:
Spotify for Linux is a labor of love from our engineers that wanted to listen to Spotify on their Linux development machines. They work on it in their spare time and it is currently not a platform that we actively support.
These brave engineers should be commended &amp;hellip;for their incredible eyesight:
For those of us with HiDPI displays, here&amp;rsquo;s how to make the Spotify UI readable on Ubuntu.</description>
    </item>
    
    <item>
      <title>Acing a C Homework Using Inline Assembly</title>
      <link>https://austinjadams.com/blog/acing-a-c-homework/</link>
      <pubDate>Thu, 07 Feb 2019 05:36:59 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/acing-a-c-homework/</guid>
      <description>In courses taught in Java (such as a data structures class), you can build pretty robust autograders for homeworks &amp;mdash; after all, the student&amp;rsquo;s code runs in the JVM, which prevents it from doing spooky things like corrupting memory or branching to weird places. So you can run the grader instantly after submission on a service like Gradescope and boom, they&amp;rsquo;ve got their grade. But C homeworks provide students a lot more opportunities to write&amp;hellip; unconventional solutions.</description>
    </item>
    
    <item>
      <title>Praise</title>
      <link>https://austinjadams.com/praise/</link>
      <pubDate>Thu, 10 Jan 2019 23:39:28 -0500</pubDate>
      
      <guid>https://austinjadams.com/praise/</guid>
      <description>Here&amp;rsquo;s a cherrypicked list of the highest praise I&amp;rsquo;ve received in student evaluations:
TAing nothing except maybe less CS humor
communist
ought to watch more anime
This course was not just a disappointing course, but an embarrassment to Georgia Tech. [1400 words omitted] They need to seriously consider restructuring this course.
Very childish
Having half the class failing under your watch isn&amp;rsquo;t cool, even if you think it is. [link to proof of this]</description>
    </item>
    
    <item>
      <title>Autograding Gameboy Advance DMA Transfers</title>
      <link>https://austinjadams.com/blog/autograding-gba-dma/</link>
      <pubDate>Sat, 08 Dec 2018 00:00:00 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/autograding-gba-dma/</guid>
      <description>In CS 2110 at Georgia Tech, we use the Gameboy Advance to demonstrate how C code can interact directly with hardware. On a high level, students create games by reading button states directly from memory-mapped registers and write directly to a special region of memory called the &amp;ldquo;video buffer,&amp;rdquo; which the video controller continuously reads and draws on the screen.
But my favorite example of students poking with the GBA hardware introduces them to an important real-life example: Direct Memory Access (DMA)!</description>
    </item>
    
    <item>
      <title>Scanning a Book into a PDF</title>
      <link>https://austinjadams.com/blog/scanning-a-book-into-a-pdf/</link>
      <pubDate>Tue, 08 May 2018 17:55:38 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/scanning-a-book-into-a-pdf/</guid>
      <description>I&amp;rsquo;ve always wondered how the shady PDF wizards make those shady textbook PDFs you find online, and I was bored yesterday, so I decided to find out.
Preparing the Patient At first, I tried to spreading the book and placing each pair of pages on a flatbed scanner, but that led only to frustration because the pages made poor contact with the scanner. Instead of trying to sort out the blurring, I drove to Kinkos and paid $2.</description>
    </item>
    
    <item>
      <title>Opening .sim files in Roigisim (CircuitSim)</title>
      <link>https://austinjadams.com/blog/open-sim-in-roigisim/</link>
      <pubDate>Wed, 24 Jan 2018 10:20:07 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/open-sim-in-roigisim/</guid>
      <description>On GNU/Linux, to make .sim files have a Roigisim icon and open in Roigisim, run the following (except replace 1.6.0 with the version you want):
curl -Ls https://austinjadams.com/img/blog/open-sim-in-roigisim/roigisim-setup.sh | bash -s 1.6.0 After the script completes, log out and log back in, just in case.
This is a copy-paste job of my earlier script for Brandonsim.</description>
    </item>
    
    <item>
      <title>Install Debian with debootstrap</title>
      <link>https://austinjadams.com/blog/install-debian-with-debootstrap/</link>
      <pubDate>Sun, 31 Dec 2017 19:26:03 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/install-debian-with-debootstrap/</guid>
      <description>A driver on Ubuntu 16.04 was giving me some trouble, so I wanted to quickly install Debian sid on an external hard drive to see if later versions of Debian/Ubuntu fixed the issue. However, I didn&amp;rsquo;t want to bother with downloading and booting from an installer disc, so took the following chroot approach.
This bootstrap-and-chroot process isn&amp;rsquo;t new and is documented in bits and pieces all over the web (some other distributions even use it as their official install process!</description>
    </item>
    
    <item>
      <title>Opening .circ files in Brandonsim</title>
      <link>https://austinjadams.com/blog/open-circ-in-brandonsim/</link>
      <pubDate>Tue, 22 Aug 2017 09:23:22 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/open-circ-in-brandonsim/</guid>
      <description>Sometimes you gotta have pretty icons and pretty buttons, y&amp;rsquo;know? In the case of Brandonsim on GNU/Linux, specifically to give it and .circ files pretty icons which open Brandonsim when clicked, do one of the following:
Option 1: Use a Script Download Brandonsim-X.Y.Z.jar from T-Square, put it somewhere permanent (moving it will break the files the script creates), and run the following command:
curl -Ls https://austinjadams.com/img/blog/open-circ-in-brandonsim/brandonsim-setup.sh | bash After the script completes, log out and log back in, just in case.</description>
    </item>
    
    <item>
      <title>Including a List of Recent git Commits in a Hugo page</title>
      <link>https://austinjadams.com/blog/including-recent-commits-hugo/</link>
      <pubDate>Tue, 28 Feb 2017 17:24:44 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/including-recent-commits-hugo/</guid>
      <description>When redesigning my website recently, I realized I needed some meat on my homepage. Ideally, instead of a blank space, I could show off stuff I&amp;rsquo;m working on without having to maintain my show-off list by hand. Two ideas came to mind: recent blog posts and recent git commits.
Since I already stored my blog posts in the static site generator Hugo, adding them to the homepage took me only a few minutes.</description>
    </item>
    
    <item>
      <title>My Work</title>
      <link>https://austinjadams.com/work/</link>
      <pubDate>Tue, 21 Feb 2017 14:14:38 -0500</pubDate>
      
      <guid>https://austinjadams.com/work/</guid>
      <description>Selected publications (for more, see my Google Scholar profile):
Austin J. Adams, Sharjeel Khan, Arjun S. Bhamra, Ryan R. Abusaada, Jeffrey S. Young, and Thomas M. Conte. &amp;ldquo;Qwerty: A Basis-Oriented Quantum Programming Language.&amp;rdquo; 2025 IEEE International Conference on Quantum Computing and Engineering (QCE &amp;lsquo;25). September 2025. [website] [slides] Austin J. Adams, Sharjeel Khan, Arjun S. Bhamra, Ryan R. Abusaada, Anthony M. Cabrera, Cameron C. Hoechst, Travis S. Humble, Jeffrey S.</description>
    </item>
    
    <item>
      <title>Defeating dd-formmailer&#39;s Weak CAPTCHA</title>
      <link>https://austinjadams.com/blog/defeating-dd-formmailer/</link>
      <pubDate>Sat, 18 Feb 2017 10:55:59 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/defeating-dd-formmailer/</guid>
      <description>Yesterday, I visited a website that uses dd-formmailer, a Wordpress plugin that provides a form for sending an email, complete with a CAPTCHA intended to prevent automated abuse. Here&amp;rsquo;s a screenshot:
A screenshot of the dd-formmailer form I was bored and curious, so I looked at the CAPTCHA image and noticed it was always served from the same path: /wp-content/plugins/dd-formmailer/dd-formmailer.php?v=1. How, I wondered, does the script handling form submissions know if the user entered the right CAPTCHA?</description>
    </item>
    
    <item>
      <title>Counting Strings Recursively in Combinatorics</title>
      <link>https://austinjadams.com/blog/counting-strings-recursively/</link>
      <pubDate>Mon, 19 Dec 2016 08:42:58 -0500</pubDate>
      
      <guid>https://austinjadams.com/blog/counting-strings-recursively/</guid>
      <description>In my combinatorics class, we covered many neat subjects, some easier and some harder. But one topic performed a near 180° in difficulty once I understood the process: writing recursive functions to count strings meeting certain criteria.
Simple Example As an easy example, consider counting nonempty binary strings. Imagine such a string of length $n \in \mathbb{Z}$. We have two possibilities: it ends with $1$, preceded by a binary string of length $n - 1$; or it ends with $0$, preceded by another binary string of length $n - 1$.</description>
    </item>
    
    <item>
      <title>Setting Up a Java Development Environment on Ubuntu</title>
      <link>https://austinjadams.com/blog/setting-up-a-java-development-environment-on-ubuntu/</link>
      <pubDate>Mon, 29 Aug 2016 15:38:20 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/setting-up-a-java-development-environment-on-ubuntu/</guid>
      <description>On GNU/Linux, I suggest using the OpenJDK, a free implementation of Java, and IntelliJ, so this guide will use both.
First Steps Getting a Compatible Release You&amp;rsquo;ll need to install (or upgrade to) a recent release of Ubuntu to install Java 8. 14.04, for instance, has only Java 7. As the time of writing, 16.04 LTS is the most recent, so I&amp;rsquo;d suggest that.
If you have an earlier release installed, run:</description>
    </item>
    
    <item>
      <title>Unbricking a TP-Link Archer C7 v2 Router</title>
      <link>https://austinjadams.com/blog/unbricking-tp-link-archer-c7-v2/</link>
      <pubDate>Mon, 22 Aug 2016 23:55:03 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/unbricking-tp-link-archer-c7-v2/</guid>
      <description>I&amp;rsquo;m a pro at using things incorrectly, so of course I&amp;rsquo;d brick my Archer C7 v2 a few hours after I got it. Fortunately, however, I didn&amp;rsquo;t find flashing working firmware too difficult. Here&amp;rsquo;s a quick attempt at a guide:
Give your machine an IP address of 192.168.0.66/24, stopping any existing network daemons (e.g., NetworkManager). With iproute2 on GNU/Linux:
# systemctl stop NetworkManager # ip link set dev eth0 up # ip addr add 192.</description>
    </item>
    
    <item>
      <title>Using a Remote CUPS Printer from Windows and GNU/Linux</title>
      <link>https://austinjadams.com/blog/using-a-remote-cups-printer-from-windows-and-gnu-linux/</link>
      <pubDate>Sun, 21 Aug 2016 13:05:37 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/using-a-remote-cups-printer-from-windows-and-gnu-linux/</guid>
      <description>In my college dorm, my roommate and I have three machines on the same network:
My laptop (GNU/Linux) My roommate&amp;rsquo;s laptop (Windows) My desktop, a headless GNU/Linux server with my printer connected Because my roommate doesn&amp;rsquo;t have a printer and I often take my laptop places, I wanted my desktop to act as a print server.
Server Setup Install CUPS and if you&amp;rsquo;re on systemd, and make sure org.cups.cupsd.service is enabled and started.</description>
    </item>
    
    <item>
      <title>Running Select Applications through a Cisco AnyConnect VPN</title>
      <link>https://austinjadams.com/blog/running-select-applications-through-anyconnect/</link>
      <pubDate>Thu, 18 Aug 2016 12:00:00 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/running-select-applications-through-anyconnect/</guid>
      <description>This is outdated now. Please see the README of the nsdo GitHub repository instead In an earlier article specific to OpenVPN, I wrote:
To isolate VPN applications from applications running &amp;lsquo;bare,&amp;rsquo; I use the following method, which involves nsdo. It has the handy effect of putting each instance of the openvpn client in its own network namespace, allowing you to run a bunch of VPNs at the same time, each available only to programs you choose.</description>
    </item>
    
    <item>
      <title>Storing Big Directories on a Separate Disk</title>
      <link>https://austinjadams.com/blog/storing-big-directories-on-a-separate-disk/</link>
      <pubDate>Tue, 16 Aug 2016 22:53:00 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/storing-big-directories-on-a-separate-disk/</guid>
      <description>Don&amp;rsquo;t tell rms, but sometimes I play Steam games. Fitting a bunch of 10+ GiB games onto a Chromebook with a ~20 GiB disk, however, is practically impossible1. Two solutions came to mind:
Buy another drive Expand my storage with external media Option 1 requires hundreds of dollars and, worst of all, effort, so I took the second route using an SD card.
Putting Directories on an SD Card Overview I tell systemd via /etc/fstab to mount an SD card at /mnt/somewhere as soon as I connect it.</description>
    </item>
    
    <item>
      <title>Using git to Deploy a Hugo Blog... Atomically!</title>
      <link>https://austinjadams.com/blog/using-git-to-deploy-a-hugo-blog-atomically/</link>
      <pubDate>Sun, 14 Aug 2016 18:37:12 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/using-git-to-deploy-a-hugo-blog-atomically/</guid>
      <description>For years, I&amp;rsquo;ve been meaning to set up a blog, but characteristically I couldn&amp;rsquo;t muster the effort to even try. Yesterday, however, I found Hugo, a simple but useful static site generator, and finally decided to stop being lazy.
Despite the benefits (and despite writing a surprisingly similar tool myself ~4 years ago), I&amp;rsquo;d never felt drawn to static site generation. Often, I got stuck on how to (1) copy my changed content over to the webserver and (2) how to do it atomically.</description>
    </item>
    
    <item>
      <title>Running Select Applications through OpenVPN</title>
      <link>https://austinjadams.com/blog/running-select-applications-through-openvpn/</link>
      <pubDate>Sun, 09 Aug 2015 22:55:31 -0400</pubDate>
      
      <guid>https://austinjadams.com/blog/running-select-applications-through-openvpn/</guid>
      <description>This is outdated now. Please see the README of the nsdo GitHub repository instead Note: I base this method heavily on a great article by Sebastian Thorarensen.
To isolate VPN applications from applications running &amp;lsquo;bare,&amp;rsquo; I use the following method, which involves nsdo. It has the handy effect of putting each instance of the openvpn client in its own network namespace, allowing you to run a bunch of VPNs at the same time, each available only to programs you choose.</description>
    </item>
    
  </channel>
</rss>
