<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.jonathanb.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.jonathanb.dev/" rel="alternate" type="text/html" /><updated>2026-04-11T19:29:57+00:00</updated><id>https://www.jonathanb.dev/feed.xml</id><title type="html">Jonathan Browne</title><subtitle>My personal website.</subtitle><author><name>Jonathan Browne</name></author><entry><title type="html">Freeing Purgeable Space on macOS</title><link href="https://www.jonathanb.dev/blog/2019/02/13/mac-free-purgeable-space" rel="alternate" type="text/html" title="Freeing Purgeable Space on macOS" /><published>2019-02-13T00:00:00+00:00</published><updated>2019-02-13T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2019/02/13/mac-free-purgeable-space</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2019/02/13/mac-free-purgeable-space"><![CDATA[<p>The biggest annoyance I have with my laptop is its lack of storage space. Right now, I use about 50 GB of storage for a Windows 10 virtual machine - and I can’t shrink it. The only way to make it smaller is to make a copy of the virtual hard drive in a different format.</p>

<p>Recently, I bit the bullet and tried a conversion.</p>

<p>It didn’t work. My hard drive was full.</p>

<p>Except it wasn’t - it supposedly had about 60 GB free. The problem? 40 GB of that was “purgeable” storage - storage that was used, but that could be freed up.</p>

<p>After looking online, I found a couple possible causes:</p>

<ul>
  <li>Some articles suggested turning on iCloud Drive’s “Optimize Mac Storage” option, which removes copies of files stored on your computer that are also on iCloud. However, I’m on the free iCloud plan, which only gives me 5 GB of storage. That left 35 GB of files.</li>
  <li>Some articles suggested creating a few giant files, forcing macOS to clear out space for them. However, that was exactly what I had been doing - trying to create a huge file. My computer wasn’t letting me do that, either.</li>
  <li>Some articles suggested downloading a cleaning program. I don’t recommend those - I don’t trust them, and they might break some files.</li>
</ul>

<p>After looking around, I found the culprit hidden in some comments: Time Machine. Even though I had told it to ignore my virtual machines (I back up any data separately), it somehow managed to grab a partial copy of my virtual hard drive in the middle of the conversion, filling up all that extra space. While it technically is purgeable (Time Machine eventually sends it to an external backup file), it wasn’t being cleared out automatically.</p>

<p>A user by the name of Andrew posted <a href="https://www.jackenhack.com/mac-os-remove-purgeable-high-sierra/#comment-54981">a comment</a> on an existing blog post giving some terminal commands to fix it. I adapted them to my own use case, and ended up with the following.</p>

<ol>
  <li>Go to System Preferences &gt; Time Machine and turn off “Back Up Automatically”.</li>
  <li>Open Terminal.</li>
  <li>Type the command <code class="language-plaintext highlighter-rouge">tmutil listlocalsnapshots /</code> and press Enter.</li>
  <li>You should end up with a list of Time Machine backups. Each one starts with <code class="language-plaintext highlighter-rouge">com.apple.TimeMachine.</code> and ends with a date and time.</li>
  <li>For each backup, type <code class="language-plaintext highlighter-rouge">tmutil deletelocalsnapshots "datetime"</code>, replacing <code class="language-plaintext highlighter-rouge">datetime</code> with the date and time at the end of the backup text. For example, to delete one of my snapshots, I typed <code class="language-plaintext highlighter-rouge">tmutil deletelocalsnapshots "2019-02-07-091157"</code>. Then press Enter. (If you know the time when you were messing with the large files, you may only need to pick the backups around that time.)</li>
  <li>Repeat for all the snapshots in the list.</li>
</ol>

<p>At this point, you should be able to see the amount of purgeable storage space decrease. In Finder, select the name of your computer, then right click “Macintosh HD” and click “Get Info”. The amount of space you have will be listed near the top.</p>

<p>Enjoy your new free space! (And remember to turn Time Machine back on in System Preferences when you’re done with the extra space.)</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[The biggest annoyance I have with my laptop is its lack of storage space. Right now, I use about 50 GB of storage for a Windows 10 virtual machine - and I can’t shrink it. The only way to make it smaller is to make a copy of the virtual hard drive in a different format.]]></summary></entry><entry><title type="html">Updated Git/PGP email address</title><link href="https://www.jonathanb.dev/blog/2019/01/02/noreply-update" rel="alternate" type="text/html" title="Updated Git/PGP email address" /><published>2019-01-02T00:00:00+00:00</published><updated>2019-01-02T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2019/01/02/noreply-update</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2019/01/02/noreply-update"><![CDATA[<p>I do my best to keep my email address private. Unfortunately, Git requires that all users provide their email address. As such, I’ve used a GitHub-provided email address that ignores all emails sent to it. Up until now, it was jbyoshi@users.noreply.github.com. As of today, I have upgraded the email address to 12983479+jbyoshi@users.noreply.github.com.</p>

<p>When I changed the address, GitHub removed the old one from my account and then unverified all my past commits (stating “The email in this signature doesn’t match the committer email”). GitHub still identifies the commit as mine, and provides the same PGP key; it just doesn’t recognize the email address as verified.</p>

<p>In case anyone cares, I declare that all Git commits prior to January 2, 2019, which are linked to JBYoshi on GitHub and signed using the PGP key with the fingerprint <code class="language-plaintext highlighter-rouge">E726 40D0 9D0C A9EE A098 79C5 468C 8081 1BCC 9A6A</code> (abbreviated <code class="language-plaintext highlighter-rouge">468C80811BCC9A6A</code>) shall be considered as valid as those created on and after January 2, 2019 which otherwise meet those requirements. As proof, I have <a href="https://github.com/JBYoshi/jbyoshi.github.io/commit/0137f390f3778e635ac5c592140775eb6c745074">signed the commit originally creating this message</a> with my new email and updated PGP key, and GitHub now shows it as verified.</p>

<p>My updated PGP key can be downloaded from the SKS key pool in the same way as my original PGP key once the update propagates. The fingerprint and key ID will be identical. If both email addresses show up in the search results, you should be good to go. As of the time of writing, the update is available on <a href="http://agora.cenditel.gob.ve:11371/pks/lookup?search=0x1BCC9A6A&amp;op=vindex">agora.cenditel.gob.ve:11371</a>, and will make its way to the rest of the servers during the day.</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[I do my best to keep my email address private. Unfortunately, Git requires that all users provide their email address. As such, I’ve used a GitHub-provided email address that ignores all emails sent to it. Up until now, it was jbyoshi@users.noreply.github.com. As of today, I have upgraded the email address to 12983479+jbyoshi@users.noreply.github.com.]]></summary></entry><entry><title type="html">JBYoshi, Spongineer</title><link href="https://www.jonathanb.dev/blog/2017/07/09/spongineer" rel="alternate" type="text/html" title="JBYoshi, Spongineer" /><published>2017-07-09T00:00:00+00:00</published><updated>2017-07-09T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2017/07/09/spongineer</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2017/07/09/spongineer"><![CDATA[<p>I’ve been helping with a project called <a href="https://spongepowered.org">Sponge</a> for some time. I have a few ways to describe it: If you’re a developer, Sponge is a community-built API for Minecraft. If you’re a Minecraft server owner, Sponge is a server mod and a spiritual successor to Bukkit/Craftbukkit. If you’re a general Minecraft player, Sponge is something that server owners use.</p>

<p>When I first got Minecraft, I set up a private minigame server for it. It started as vanilla with a few command blocks and a bunch of repeaters (probably several hundred). I eventually discovered the power of a server mod called Craftbukkit to trim down the number of repeaters and make everything more powerful by using actual code. Things were pretty stable for some time.</p>

<p>Then an interesting situation occurred in September 2014: Craftbukkit was bloodily murdered. First <a href="https://forums.bukkit.org/threads/bukkit-its-time-to-say.305106/">the developers tried to shut it down</a>, but the Minecraft developers stepped in and saved the day (in the opinions of many server owners) - it owned Craftbukkit, and had done so for a long time. This began a long controversy that shook the entire community - one of the Craftbukkit developers got upset. He found a hole in the legal side of things and used it to <a href="http://forums.bukkit.org/threads/bukkit-its-time-to-say.305106/">shut down Bukkit</a>, throwing the Minecraft community into chaos. I decided to cover this shaky state of things as a series of blog posts on my old, private blog.</p>

<p>In the research for my first post, I stumbled upon Sponge for the first time, and kept a careful watch. I got more and more interested, until June 20th, when I finally got a GitHub account. I submitted my first pull request two days later - <a href="https://github.com/SpongePowered/SpongeCommon/pull/72">SpongePowered/SpongeCommon#72</a> - and it was accepted three days after that. I was very excited about joining what I hoped would be a source of stability for years to come.</p>

<p>I continued contributing for some time, until I was contacted privately by <a href="https://github.com/Zidane">@Zidane</a>, one of the leaders of the Sponge project. It took some jumping through hoops, but I ended up being accepted as an official contributor. Technically, all you gain is access to a few new channels to contact them through; in practice, however, it means you become well-known among the internal Sponge team. (You can also get custom badges on the forums and, more recently, their Discord channel, though I never actually requested a forums badge.)</p>

<p>So well-known, in fact, that it seeped into their booth at Minecon 2016 back in November (of 2016, duh). I showed up and introduced myself to <a href="https://github.com/Mumfrey">@Mumfrey</a> as someone who had been following and contributing to the Sponge project for some time. He asked what my GitHub username was, and when I told him, it became instant access to being introduced to a bunch of the Sponge developers in person (plus some extra Sponge-related loot). Zidane even asked me if I wanted to become a core Sponge developer then. However, I was somewhat encumbered outside Minecon - specifically, a really tough <a href="https://en.wikipedia.org/wiki/AP_Latin">AP Latin</a> class, and couldn’t accept the responsibility at that time.</p>

<p>The other difficulty was that although I occasionally went on IRC, it was incredibly rare to see me on there. However, when I discovered the <a href="https://discord.gg/PtaGRAs">“official unofficial” SpongePowered Discord server</a>, I joined immediately. To date, I’m pretty much online all the time. (I’ll blame that on my phone, which is usually connected to the Internet 24/7. However, I am on “Do Not Disturb” at night, and the Discord app doesn’t sync the DND settings, so I’m not always available even when I’m online.) That all changed when <a href="https://github.com/Grinch">@Grinch</a> set up a <a href="https://github.com/SpongePowered/discord-irc">Discord-IRC bridge</a>. Now the Discord server has <s>reached the "official" status</s> dropped the “unofficial” status, and I’m on IRC whenever I’m on Discord, disguised as the <code class="language-plaintext highlighter-rouge">Spongie</code> bot (it will indicate when it’s from me).</p>

<p>That opened the door that someone stepped through today. <a href="https://github.com/gabizou">@gabizou</a> DM’ed me about becoming a core developer, and I accepted. Becoming a core developer (as far as I’ve seen) gives you direct access to modify the repository without having to go through a pull request (though the developers sometimes do use pull requests), manage issues and pull requests, and access to more internal communication channels. It’s pretty cool. And I finally get the title of “Spongineer”.</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[I’ve been helping with a project called Sponge for some time. I have a few ways to describe it: If you’re a developer, Sponge is a community-built API for Minecraft. If you’re a Minecraft server owner, Sponge is a server mod and a spiritual successor to Bukkit/Craftbukkit. If you’re a general Minecraft player, Sponge is something that server owners use.]]></summary></entry><entry><title type="html">C/C++/Objective-C/Java Comment Tricks</title><link href="https://www.jonathanb.dev/blog/2017/01/17/comment-tricks" rel="alternate" type="text/html" title="C/C++/Objective-C/Java Comment Tricks" /><published>2017-01-17T00:00:00+00:00</published><updated>2017-01-17T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2017/01/17/comment-tricks</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2017/01/17/comment-tricks"><![CDATA[<p>Today, I was working on a bit of code that I wanted to switch between two versions quickly. So I used a few commenting tricks to do it.</p>

<h2 id="1-end-a-comment-if-it-exists">1: End a comment, if it exists</h2>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//*/</span>
</code></pre></div></div>

<p>If there is a multi-line comment before this, it will end the comment here. If not, the rest of the line will simply be skipped.</p>

<p>Here’s a basic example of this:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">startOfMultiLineComment</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="cm">/*
Multi-line comment
//*/</span>
<span class="kt">int</span> <span class="n">endOfMultiLineComment</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="c1">//*/</span>
<span class="kt">int</span> <span class="n">notCommented</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="2-toggle-comments">2: Toggle comments</h2>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">/</span><span class="err">*/</span>
</code></pre></div></div>

<p>If there is a multi-line comment before this, it will be ended. If not, one will be started.</p>

<p>Here’s an example:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">startOfComment</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="cm">/*/
Commented out
/*/</span>
<span class="kt">int</span> <span class="n">endOfComment</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="3-not-the-start-of-a-comment">3: Not the start of a comment</h2>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//*</span>
</code></pre></div></div>

<p>I use this to say “maybe start a comment, maybe not”. This is the disabled state; only this line is commented. To enable it, just delete one of the <code class="language-plaintext highlighter-rouge">/</code>s.</p>

<p>An example:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//*</span>
<span class="kt">int</span> <span class="n">maybeCommented</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="c1">//*/   // See #1</span>
</code></pre></div></div>

<p>Then I can quickly switch to:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
int maybeCommented = 0; (This is commented out)
//*/</span> <span class="c1">// See #1</span>
</code></pre></div></div>

<p>So I use this to switch between two variations of a file quickly:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Variation 1</span>

<span class="c1">//*</span>
<span class="kt">int</span> <span class="n">variation1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="cm">/*/
int variation2 = 0;
//*/</span>

<span class="c1">// Variation 2</span>
<span class="cm">/*
int variation1 = 0;
/*/</span>
<span class="kt">int</span> <span class="n">variation2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="c1">//*/</span>
</code></pre></div></div>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[Today, I was working on a bit of code that I wanted to switch between two versions quickly. So I used a few commenting tricks to do it.]]></summary></entry><entry><title type="html">ChangeDataHolderEvent - Update</title><link href="https://www.jonathanb.dev/blog/2016/11/28/changedataholderevent-update" rel="alternate" type="text/html" title="ChangeDataHolderEvent - Update" /><published>2016-11-28T00:00:00+00:00</published><updated>2016-11-28T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2016/11/28/changedataholderevent-update</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2016/11/28/changedataholderevent-update"><![CDATA[<p>Sorry I haven’t posted anything on this, but here’s my status update.</p>

<p>I do have some work-in-progress ideas, but to implement them fully, I’ll need <a href="https://github.com/SpongePowered/SpongeAPI/pull/1370">SpongePowered/SpongeAPI#1370</a> to be merged. It’s been put on hold, as SpongeAPI version 6 is going to be for Minecraft 1.11 changes only. All other breaking changes (such as that pull request) will have to wait for API 7. Once it’s merged, I’ll get my ideas finished and implemented.</p>

<p>My current code is here: <a href="https://github.com/JBYoshi/SpongeAPI/tree/data-events">SpongeAPI</a> <span>|</span> <a href="https://github.com/JBYoshi/SpongeCommon/tree/data-events">SpongeCommon</a>.</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[Sorry I haven’t posted anything on this, but here’s my status update.]]></summary></entry><entry><title type="html">ChangeDataHolderEvent</title><link href="https://www.jonathanb.dev/blog/2016/11/21/changedataholderevent" rel="alternate" type="text/html" title="ChangeDataHolderEvent" /><published>2016-11-21T00:00:00+00:00</published><updated>2016-11-21T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2016/11/21/changedataholderevent</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2016/11/21/changedataholderevent"><![CDATA[<p>I’ve recently taken on the challenge of implementing the biggest event in Sponge: <a href="https://github.com/SpongePowered/SpongeCommon/issues/742#issuecomment-261692920"><code class="language-plaintext highlighter-rouge">ChangeDataHolderEvent</code></a>. It’s very difficult and confusing.</p>

<p>I’ve pushed a few minor API changes to <a href="https://github.com/JBYoshi/SpongeAPI/tree/data-events">my SpongeAPI fork</a>. I’ll post here as I work on it.</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[I’ve recently taken on the challenge of implementing the biggest event in Sponge: ChangeDataHolderEvent. It’s very difficult and confusing.]]></summary></entry><entry><title type="html">Creating Secure, Easy to Remember Passwords</title><link href="https://www.jonathanb.dev/blog/2016/11/07/passwords" rel="alternate" type="text/html" title="Creating Secure, Easy to Remember Passwords" /><published>2016-11-07T00:00:00+00:00</published><updated>2016-11-07T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2016/11/07/passwords</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2016/11/07/passwords"><![CDATA[<p>Recently, an idea popped into my head about creating secure passwords. Surprisingly, they’re very easy to remember. It’s based off some common tips for making secure passwords.</p>

<ol>
  <li>Length is more important than complexity. <a href="https://xkcd.com/936/">This xkcd comic</a> I saw some time ago demonstrates this concept pretty quickly.</li>
  <li>Although length is more important than complexity, complexity can help.</li>
  <li>Use different passwords on different websites. If you use the same password on multiple different websites, anyone who figures out one password can easily log in to all the others.</li>
</ol>

<p>So here’s the approach I thought of. It’s surprisingly simple.</p>

<ol>
  <li>Think of a random, easy-to-remember phrase tied to the website you use it on. In my opinion, funny is the best way to go for this. Just make sure nobody else thought of it first.</li>
  <li>Type it in to the password box unaltered. Keep the capital letters, spaces, punctuation, everything.</li>
</ol>

<p>Yep, it’s that simple.</p>

<p>Most password strength meters will give this a high rating. The capital letters and punctuation are also helpful for using it on websites that have requirements on complexity. And making the phrase related to the website you’re using it on helps with duplicate passwords (#3) and memory.</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[Recently, an idea popped into my head about creating secure passwords. Surprisingly, they’re very easy to remember. It’s based off some common tips for making secure passwords.]]></summary></entry><entry><title type="html">Sharing a Git Submodule between Multiple Parent Projects</title><link href="https://www.jonathanb.dev/blog/2016/09/12/shared-git-submodules" rel="alternate" type="text/html" title="Sharing a Git Submodule between Multiple Parent Projects" /><published>2016-09-12T00:00:00+00:00</published><updated>2016-09-12T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2016/09/12/shared-git-submodules</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2016/09/12/shared-git-submodules"><![CDATA[<p>One of the problems I’ve been working with for some time with Git is using a single clone of a submodule with multiple containing repositories. I tried using symbolic links, but Git refuses to interpret the symbolic links as real submodules. Then I found an interesting workaround via the Git configuration:</p>

<ol>
  <li>Set up the repositories individually, as you would normally do.</li>
  <li>Choose a location to place the submodule. Place exactly one checkout of the submodule there.</li>
  <li>Delete the submodule directory from all other locations. In their place, add an empty directory (for compatibility reasons).</li>
  <li>Run <code class="language-plaintext highlighter-rouge">git config --local submodule.SubmoduleName.path /path/to/submodule</code> in each repository you want to share the submodule
between. The path should either be relative to the repository root or absolute.</li>
</ol>

<p>Now you have a single checkout of the submodule shared among all repositories. I made a sample repository using <a href="https://github.com/SpongePowered/SpongeForge">SpongeForge</a> and <a href="https://github.com/SpongePowered/SpongeVanilla">SpongeVanilla</a>; you can view it <a href="https://github.com/JBYoshi/SpongeAll">here</a>. See the README file for usage instructions; the <code class="language-plaintext highlighter-rouge">init</code> script contains all the logic.</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[One of the problems I’ve been working with for some time with Git is using a single clone of a submodule with multiple containing repositories. I tried using symbolic links, but Git refuses to interpret the symbolic links as real submodules. Then I found an interesting workaround via the Git configuration:]]></summary></entry><entry><title type="html">TextArea</title><link href="https://www.jonathanb.dev/blog/2016/05/09/textarea" rel="alternate" type="text/html" title="TextArea" /><published>2016-05-09T00:00:00+00:00</published><updated>2016-05-09T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2016/05/09/textarea</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2016/05/09/textarea"><![CDATA[<p>I’ve had a small HTML file on my desktop for a while now that I use for those times when I just need to dump some text
somewhere. I decided to publish it. You can find it at https://www.jonathanb.dev/textarea/.</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[I’ve had a small HTML file on my desktop for a while now that I use for those times when I just need to dump some text somewhere. I decided to publish it. You can find it at https://www.jonathanb.dev/textarea/.]]></summary></entry><entry><title type="html">Where’s JBYoshi?</title><link href="https://www.jonathanb.dev/blog/2016/02/24/wheres-jbyoshi" rel="alternate" type="text/html" title="Where’s JBYoshi?" /><published>2016-02-24T00:00:00+00:00</published><updated>2016-02-24T00:00:00+00:00</updated><id>https://www.jonathanb.dev/blog/2016/02/24/wheres-jbyoshi</id><content type="html" xml:base="https://www.jonathanb.dev/blog/2016/02/24/wheres-jbyoshi"><![CDATA[<p>You might have noticed that my commits in the past few weeks have been few and far between. I can explain.</p>

<p>I decided to start on a new program. Right now, it’s just called “Robot Game”, but that’s the best I could think of. It allows you
to write Java programs to control virtual robots. I’m almost ready to push out the first commits, but I’m trying to add in a few
more features first:</p>

<ul>
  <li>An automatic updater. Every few minutes, your client will check for an update, and download one if it exists. I’ll need a CI
setup, though, (although it could just be a .git/hooks file), and I’m still working on writing the updater code.</li>
  <li>Right now, the program just looks for a file named <code class="language-plaintext highlighter-rouge">RobotGameScript.java</code> in your working directory. I’d like to change that
up before release, although it’s not a priority.</li>
</ul>

<p>I’ll hopefully get it pushed out sometime in the next couple days. Stay tuned!</p>]]></content><author><name>Jonathan Browne</name></author><summary type="html"><![CDATA[You might have noticed that my commits in the past few weeks have been few and far between. I can explain.]]></summary></entry></feed>