<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tobin Harding</title>
    <link>/</link>
    <description>Recent content on Tobin Harding</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 03 Oct 2025 21:59:47 +1100</lastBuildDate>
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Resume of Tobin Harding: Linux Programmer</title>
      <link>/resume/</link>
      <pubDate>Fri, 03 Oct 2025 21:59:47 +1100</pubDate>
      <guid>/resume/</guid>
      <description>9 years professional software development experience. Rust language expert. Proficient in C, Golang, Python. 250 mainline Linux kernel patches. Undergraduate and postgraduate degrees in computer science. 20+ years experience using Linux. Founder of Central Coast Linux Users Group. Open Source Experience Currently working full time as a maintainer of rust-bitcoin under an Open Source grant.&#xA;Open source contributions made to the following projects, among others:&#xA;rust-miniscript (Rust). rust-bitcoin (Rust). rust-secp256k1 (Rust).</description>
    </item>
    <item>
      <title>Why you should write your own Bitcoin Core RPC client</title>
      <link>/blog/core-rpc-client/</link>
      <pubDate>Fri, 03 Oct 2025 10:49:04 +1100</pubDate>
      <guid>/blog/core-rpc-client/</guid>
      <description>&lt;p&gt;If you are an application or library developer and you need something&#xA;from Bitcoin Core then you may want to use the JSON RPC API that Core&#xA;provides. So far so good. You might then wonder to yourself, &amp;ldquo;seems&#xA;pretty easy, surely someone has written a crate (Rust library) already&#xA;that does that, let me just grab it&amp;rdquo;. This post is about why that is&#xA;a bad idea.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About Me</title>
      <link>/about-me/</link>
      <pubDate>Sun, 20 Jul 2025 21:59:47 +1100</pubDate>
      <guid>/about-me/</guid>
      <description>Hello, I am Tobin C. Harding. I code in the Linux environment. I like command line interfaces and statically typed languages. When I&amp;rsquo;m not coding I like free diving, doing yoga, and eating beef - not necessarily in that order.&#xA;I currently work maintaining various libraries within the https://github.com/rust-bitcoin organisation. Previously I dabbled in Linux Kernel work, now I do Bitcoin - I write Rust all day.&#xA;For what its worth, I have undergraduate and postgraduate degrees in computer science and I live on the Central Coast of New South Wales Australia, and have three children.</description>
    </item>
    <item>
      <title>Presentations</title>
      <link>/talks/</link>
      <pubDate>Tue, 17 Oct 2023 10:07:59 +1000</pubDate>
      <guid>/talks/</guid>
      <description>Learning Bitcoin using Sparrow Wallet&#xA;October 2023 - Central Coast Bitcoin Meetup&#xA;Programming Bitcoin in Rust (git repo)&#xA;September 2023 - Popup workshop in Nashville (Bitcoin Park)&#xA;Programming Bitcoin in Rust (git repo)&#xA;September 2023 - TABConf&#xA;BTC Prague 2023 - rust-bitcoin workshop (git repo)&#xA;What do you open source devs do all day&#xA;25th March 2023 - Bitcoin Bush Bash&#xA;Advanced Testing in Rust (slides / git repo)</description>
    </item>
    <item>
      <title>Rust Bitcoin - Day 1</title>
      <link>/blog/rust-bitcoin-day-1/</link>
      <pubDate>Mon, 03 Jan 2022 08:25:28 +1100</pubDate>
      <guid>/blog/rust-bitcoin-day-1/</guid>
      <description>&lt;p&gt;Eight years ago at Perth &lt;a href=&#34;https://linux.org.au/linux-conf-au/&#34;&gt;LCA&lt;/a&gt; I sat in the&#xA;kernel mini-conf for the first time and listened to a bunch of kernel hackers&#xA;discuss patching the kernel - at that moment I said to myself &amp;ldquo;I want to do&#xA;that&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>rust-bitcoin - Altcoin Support</title>
      <link>/blog/altcoin-support/</link>
      <pubDate>Wed, 10 Nov 2021 13:21:39 +1100</pubDate>
      <guid>/blog/altcoin-support/</guid>
      <description>&lt;p&gt;Writing bitcoin wallets in Rust is easy with&#xA;&lt;a href=&#34;https://github.com/bitcoindevkit/bdk/&#34;&gt;bdk&lt;/a&gt;, what if we want to write a wallet&#xA;for one of the altcoins that forked off from &lt;code&gt;bitcoind&lt;/code&gt;. Well with some research&#xA;and a little bit of hacking we are off to the races.&lt;/p&gt;</description>
    </item>
    <item>
      <title>rust-libp2p over Tor - Version 2</title>
      <link>/blog/tor-libp2p-2/</link>
      <pubDate>Tue, 01 Sep 2020 11:17:01 +1000</pubDate>
      <guid>/blog/tor-libp2p-2/</guid>
      <description>&lt;p&gt;This is an update of the &lt;a href=&#34;../tor-libp2p&#34;&gt;initial&lt;/a&gt; blog post on running&#xA;&lt;a href=&#34;https://github.com/libp2p/rust-libp2p&#34;&gt;rust-libp2p&lt;/a&gt; traffic over the&#xA;Tor network. In that post we used the&#xA;&lt;a href=&#34;https://github.com/teawithsand/torut&#34;&gt;torut&lt;/a&gt; library to configure the&#xA;tor onion service in code. Turns out, for some use cases, there is a&#xA;more simple method. This post runs through that method.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anonymous peer to peer applications in Rust (rust-libp2p over Tor)</title>
      <link>/blog/tor-libp2p/</link>
      <pubDate>Fri, 26 Jun 2020 14:07:12 +1000</pubDate>
      <guid>/blog/tor-libp2p/</guid>
      <description>&lt;p&gt;We can write peer to peer applications in Rust using &lt;code&gt;rust-libp2p&lt;/code&gt;. We&#xA;can anonymize TCP streams by running them through the Tor network. How&#xA;about writing anonymous peer to peer applications in Rust that run&#xA;over the Tor network?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learning Rust</title>
      <link>/blog/learning-rust/</link>
      <pubDate>Wed, 31 Jul 2019 19:18:01 +1000</pubDate>
      <guid>/blog/learning-rust/</guid>
      <description>A few years ago I read about a code training method involving writing the same algorithm out every day. I liked the idea but never got around to doing it. A couple of months ago I got a job working on a code base in a language I had never used before - Rust. Not only did I want to come up to speed as quickly as I could but I wanted to get good at Rust fast.</description>
    </item>
    <item>
      <title>Reflections on working for a start up</title>
      <link>/blog/reflections-on-first-job/</link>
      <pubDate>Fri, 14 Dec 2018 08:58:20 +1100</pubDate>
      <guid>/blog/reflections-on-first-job/</guid>
      <description>Or &amp;ldquo;What I learned at my first job&amp;rdquo;. In this post I will reflect on what I learned from the 9 months I spent working my first software developer role for a US startup. As with all my posts I follow the philosophy to write as if no one is reading, this will be in part a way for me to pull my thoughts together but also a way to document my progress in becoming a software developer.</description>
    </item>
    <item>
      <title>Software Apprenticeship</title>
      <link>/blog/apprenticeship/</link>
      <pubDate>Tue, 05 Dec 2017 16:01:57 +1100</pubDate>
      <guid>/blog/apprenticeship/</guid>
      <description>In 2015 I had the very fortunate opportunity to invest some time in my skill as a programmer. At this time I had an undergraduate degree (Bachelor of Science) double majoring in software and computer networks. I had also completed the first two thirds of a masters degree, also in computer science. I chose not to complete the thesis because I felt I did not have anything to add to the field, graduating with a diploma of Computer Science (pass with high distinction).</description>
    </item>
    <item>
      <title>Kubernetes Colorize Help</title>
      <link>/blog/k8s-color-help/</link>
      <pubDate>Tue, 29 Aug 2017 20:20:12 +1000</pubDate>
      <guid>/blog/k8s-color-help/</guid>
      <description>&lt;p&gt;Recently I started hacking on the Kubernetes (k8s) project. The code base is in Golang and is super&#xA;fun work on. Development is done via &lt;a href=&#34;https://github.com/kubernetes/&#34;&gt;GitHub&lt;/a&gt; and&#xA;&lt;a href=&#34;https://kubernetes.slack.com&#34;&gt;Slack&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting Started with Linux Kernel Development - Part 2: The Process.</title>
      <link>/blog/kernel-dev-2/</link>
      <pubDate>Thu, 20 Jul 2017 08:28:24 +1000</pubDate>
      <guid>/blog/kernel-dev-2/</guid>
      <description>Part 2 of this series outlines a method for starting to learn the process of Linux kernel development. As stated in part 1, this is but one method. The aim of this post is to illuminate a pathway starting at the point when you have had your first patch merged into the mainline. If you have not had your first patch merged you may like to read part 1 of this series.</description>
    </item>
    <item>
      <title>Getting Started with Linux Kernel Development - Part 1: First Patch.</title>
      <link>/blog/kernel-dev-1/</link>
      <pubDate>Wed, 19 Jul 2017 10:28:42 +1000</pubDate>
      <guid>/blog/kernel-dev-1/</guid>
      <description>&lt;p&gt;This is the first in a series of posts about getting started in Linux&#xA;kernel development. Most of what is written in this post is already&#xA;available on the web. It is provided here for completeness and as a pre-amble to the next post in the series.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux Kernel Selftest Framework</title>
      <link>/blog/kselftests/</link>
      <pubDate>Thu, 02 Feb 2017 11:38:39 +1100</pubDate>
      <guid>/blog/kselftests/</guid>
      <description>&lt;p&gt;&lt;em&gt;Kselftest is an effort to enable a developer-focused unit test&#xA;framework in the kernel to ensure the quality of new kernel&#xA;releases.&lt;/em&gt;&lt;br&gt;&#xA;- Shua Khan&lt;/p&gt;&#xA;&lt;p&gt;Install and run Linux kernel selftests on Ubuntu 16.04&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fenwick Trees in Golang</title>
      <link>/blog/fenwick/</link>
      <pubDate>Sat, 07 Jan 2017 11:21:35 +1100</pubDate>
      <guid>/blog/fenwick/</guid>
      <description>&lt;p&gt;A Fenwick tree is a data structure that holds an ordered collection and supports&#xA;the operations &lt;code&gt;sum&lt;/code&gt; and &lt;code&gt;update&lt;/code&gt;, both in &lt;em&gt;O(log n)&lt;/em&gt; time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Graph Data Structures in Golang</title>
      <link>/blog/graph/</link>
      <pubDate>Thu, 05 Jan 2017 10:08:31 +1100</pubDate>
      <guid>/blog/graph/</guid>
      <description>&lt;p&gt;&lt;em&gt;&amp;hellip; understand just how astonishingly commonplace (and important) graph problems are&lt;/em&gt;&lt;br&gt;&#xA;&lt;em&gt;they should be part of every working programmer&amp;rsquo;s toolkit.&lt;/em&gt;&#xA;- &lt;a href=&#34;http://steve-yegge.blogspot.com.au/2008/03/get-that-job-at-google.html&#34;&gt;Stevey&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The graph data structure is of high utility across the field of computer&#xA;science. Graph problems come in many shapes and sizes but once modeled can&#xA;typically be represented by a limited number of graph data type variants.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HackerRank: First milestone reached.</title>
      <link>/blog/hackerrank1/</link>
      <pubDate>Tue, 06 Dec 2016 11:14:39 +1100</pubDate>
      <guid>/blog/hackerrank1/</guid>
      <description>&lt;p&gt;&lt;em&gt;To appreciate programming as an intellectual activity in its own right &amp;hellip; you&#xA;must read and write computer programs - many of them.&lt;/em&gt;[ASS96]&lt;/p&gt;&#xA;&lt;p&gt;For the past nine weeks I have been working on programming questions at&#xA;&lt;a href=&#34;http://hackerrank.com&#34;&gt;HackerRank&lt;/a&gt; completing questions in the &amp;lsquo;practice area&amp;rsquo; i.e I have&#xA;not competed in any competitive programming competitions offered by the&#xA;site. Today I reached the first milestone I had set, namely, to get a top 1000&#xA;ranking (96th percentile) in the algorithms sub domain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Heap Data Structure in Golang</title>
      <link>/blog/heap/</link>
      <pubDate>Thu, 10 Nov 2016 08:29:33 +1100</pubDate>
      <guid>/blog/heap/</guid>
      <description>&lt;p&gt;A heap is a data structure that supports the operations &lt;em&gt;insert&lt;/em&gt; and&#xA;&lt;em&gt;extract&lt;/em&gt;. Heaps typically come in two varieties, &lt;em&gt;min heap&lt;/em&gt; (for extracting the&#xA;minimum value) and &lt;em&gt;max heap&lt;/em&gt;. A heap is built using a binary tree where each&#xA;node is said to &lt;em&gt;dominate&lt;/em&gt; the nodes below it. The meaning of dominate depends&#xA;on the type of heap being implemented, for a &lt;em&gt;min heap&lt;/em&gt; the key of each node is&#xA;&lt;em&gt;less&lt;/em&gt; than the keys of both of child nodes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deque Data Structure in Golang</title>
      <link>/blog/deque/</link>
      <pubDate>Tue, 08 Nov 2016 11:14:55 +1100</pubDate>
      <guid>/blog/deque/</guid>
      <description>&lt;p&gt;A deque is type of queue which enables adding and removing items from both&#xA;ends. Deque ends have such names as &lt;em&gt;left&lt;/em&gt;/&lt;em&gt;right&lt;/em&gt;, &lt;em&gt;front&lt;/em&gt;/&lt;em&gt;rear&lt;/em&gt; or, as we&#xA;will use here, &lt;em&gt;front&lt;/em&gt; and &lt;em&gt;back&lt;/em&gt;. The &lt;em&gt;add/remove&lt;/em&gt; operations on a deque are&#xA;typically called &lt;em&gt;enqueue&lt;/em&gt; and &lt;em&gt;dequeue&lt;/em&gt;. For ease of explanation but without loss&#xA;of generality, we limit discussion to a deque of integers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Binary Search Tree in Golang</title>
      <link>/blog/bst/</link>
      <pubDate>Tue, 01 Nov 2016 11:37:27 +1100</pubDate>
      <guid>/blog/bst/</guid>
      <description>&lt;p&gt;A binary search tree (BST) is a binary tree where each node has a comparable key. As with&#xA;any tree, nodes may optionally contain satellite data.&lt;/p&gt;&#xA;&lt;p&gt;A BST can support many dynamic container operations, including search, minimum,&#xA;maximum, predecessor, successor, insert and delete. The defining feature of a&#xA;BST is that keys are maintained in an ordered fashion. This makes a BST a useful&#xA;data structure for implementing such things as ordered sets and bags.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bag Data Structure in Golang</title>
      <link>/blog/bag/</link>
      <pubDate>Wed, 26 Oct 2016 10:49:04 +1100</pubDate>
      <guid>/blog/bag/</guid>
      <description>&lt;p&gt;A bag is a container of non-unique items. Bags are defined by the following&#xA;operations &lt;em&gt;Length&lt;/em&gt;, &lt;em&gt;Add&lt;/em&gt;, &lt;em&gt;Delete&lt;/em&gt; and &lt;em&gt;Find&lt;/em&gt;. Bags often also need to support&#xA;&lt;em&gt;FindAll&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Bags can be ordered or un-ordered. This post will be discussing un-ordered&#xA;bags.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Queue Data Structure in Golang</title>
      <link>/blog/queue/</link>
      <pubDate>Wed, 26 Oct 2016 09:54:21 +1100</pubDate>
      <guid>/blog/queue/</guid>
      <description>&lt;p&gt;A queue is a container that supports retrieval by first-in, first-out (FIFO)&#xA;order. The &lt;em&gt;get&lt;/em&gt; and &lt;em&gt;put&lt;/em&gt; operations for a queue are usually called &lt;em&gt;enqueue&lt;/em&gt; and&#xA;&lt;em&gt;dequeue&lt;/em&gt;, other operations may include &lt;em&gt;isEmpty&lt;/em&gt;. A full description of&#xA;queues can be found online &lt;a href=&#34;http://opendatastructures.org&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Queue&amp;rsquo;s minimise the maximum time spent waiting, however the average wait time&#xA;will be the same whether a LIFO or a FIFO is used.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stack Data Structure in Golang</title>
      <link>/blog/stack/</link>
      <pubDate>Mon, 17 Oct 2016 08:28:17 +1100</pubDate>
      <guid>/blog/stack/</guid>
      <description>&lt;p&gt;A stack is a container that supports retrieval by last-in, first-out (LIFO)&#xA;order. The &lt;em&gt;get&lt;/em&gt; and &lt;em&gt;put&lt;/em&gt; operations for stacks are usually called &lt;em&gt;push&lt;/em&gt; and&#xA;&lt;em&gt;pop&lt;/em&gt;, other operations may include &lt;em&gt;peek&lt;/em&gt; and &lt;em&gt;isEmpty&lt;/em&gt;. A full description of&#xA;stacks can be found online &lt;a href=&#34;http://opendatastructures.org&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>initial commit</title>
      <link>/blog/initial-commit/</link>
      <pubDate>Tue, 11 Oct 2016 22:10:57 +1100</pubDate>
      <guid>/blog/initial-commit/</guid>
      <description>According to Apprenticeship Patterns by Bavid H. Hoover and Adewale Oshineye, in order to become a journeyman one must learn to explain their craft to others. This is one apprentices effort to learn these skills.</description>
    </item>
  </channel>
</rss>
