<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Wild Duck Theories Australia Pty. Limited]]></title><description><![CDATA[Wild Duck Theories Australia Pty. Limited]]></description><link>https://blog.wildducktheories.com/</link><generator>Ghost 0.7</generator><lastBuildDate>Fri, 11 Jul 2025 10:37:41 GMT</lastBuildDate><atom:link href="https://blog.wildducktheories.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[towards an automated git submodule tracking agent]]></title><description><![CDATA[<p>If you ask a moderately experienced git user about submodules they are likely to turn to you, look you earnestly in the eye and say: "don't use them, life is too short". Or, if they are a more experienced and helpful git user, they might <a href="https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407">explain</a> exactly why git submodules</p>]]></description><link>https://blog.wildducktheories.com/towards-an-automated-git-submodule-tracking-agent/</link><guid isPermaLink="false">dad4261a-3e0c-453a-88d5-6c85360c8e3f</guid><dc:creator><![CDATA[Jon Seymour]]></dc:creator><pubDate>Fri, 17 Jun 2016 11:56:25 GMT</pubDate><content:encoded><![CDATA[<p>If you ask a moderately experienced git user about submodules they are likely to turn to you, look you earnestly in the eye and say: "don't use them, life is too short". Or, if they are a more experienced and helpful git user, they might <a href="https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407">explain</a> exactly why git submodules are painful. Before telling you: "don't use them, life is too short"</p>

<p>And, it is true, git submodules are painful particularly if you have to interact with them manually before or after every push to a shared remote repo - there are too many moving parts that can make life hell when they get out of sync.</p>

<p>git submodules are ok for tracking the precise version of a few rarely updated external dependencies because the manual book keeping overhead their use normally implies is small if done only occasionally, but they are terrible for tracking the precise versions of frequently updated internal dependencies, particularly in the absence of a robust automated solution.</p>

<h2 id="whybother">why bother?</h2>

<p>Given the hassles, why bother using them at all? </p>

<p>It turns out that git submodules do provide quite a neat solution to the problem of tracking the configuration of multi-component releases.</p>

<p>To explain, consider a system comprised of multiple components where the source for each component is tracked by its own git repository. To track the configuration of a particular release of the system as a whole requires some way to track git commits of each component in the system and tracking particular commits of a collection of components is something that git submodules can do quite well - it's just the user experience that is horrible.</p>

<p>So, what if you could provide a user experience that didn't suck and still take advantage of git submodules for configuration management? That is what this article is about.</p>

<h2 id="theapproach">the approach</h2>

<p>This section sets forth the elements of the approach.</p>

<h3 id="trackingagent">tracking agent</h3>

<p>The approach assumes the existence of one or more tracking agents. Each tracking agent would be responsible for monitoring the tracking branches of one or more submodules and updating the tracking branch of a superproject as the submodules change.</p>

<h3 id="dedicatedworkspaces">dedicated workspaces</h3>

<p>The tracking agents would operate with a dedicated workspace - in particular, the tracking agent should never be run in a developer's workspace which might have untracked, unstaged or uncommitted work in it.</p>

<h3 id="centralisation">centralisation</h3>

<p>Most tools in the git suite operate in a distributed fashion without reference to a central repository. Submodule tracking agent should be centralised. The main reason is that we want remove the responsibility for maintaining the superproject from individual developers and also we want to simplify the solution to eliminate the possibility of multiple agents operating on the same superproject branch at the same time.</p>

<h3 id="readonlysuperprojects">read-only superprojects</h3>

<p>The intent is that developers never have to manually update a superproject, making them effectively read-only from the developer's point of view. Developers might choose to use superprojects to checkout all the components of a release, but would not be required to. </p>

<h3 id="submoduleonlysuperprojects">submodule-only superprojects</h3>

<p>One way to avoid the need for developers to manually update a superproject is to not store any files in the superproject. In other words, a superproject should be a pure collection of submodules and contain no other files.  If there are no other files, there is no need for a developer to edit them and if a developer doesn't need to edit them, then there is no need for a developer to update to the superproject directly and so there can be no possibility of merge conflicts between a developer's changes and the tracking agent's changes. </p>

<p>This is really more a guideline for superproject design than a strict rule that would be checked by the submodule tracking agents.</p>

<h3 id="norequirementfordevelopersuperprojectcheckout">no requirement for developer superproject checkout</h3>

<p>If a developer doesn't need to maintain the superproject, then there is no need for the developer to checkout the superproject. </p>

<p>That said, when used in a readonly fashion, superprojects can still be a handy way to initially checkout a group of related submodules or periodically resync them all with their origins at the latest revision levels.  </p>

<hr>  

<p>This post has described the requirements for a git submodule tracking agent. A future article will discuss the in detailed design of such an agent.</p>]]></content:encoded></item><item><title><![CDATA[a technique for duplicate detection with overlapping imports of key-less records]]></title><description><![CDATA[<p>My financial affairs are simple enough that I can keep track of them by exporting the transaction data from my bank accounts and annotating the exports in a Google sheet. The annotations allow me to classify each income or expenditure item with a category that allows me to generate reports</p>]]></description><link>https://blog.wildducktheories.com/a-technique-for-duplicate-detection-with-overlapping-data-imports/</link><guid isPermaLink="false">644a70f4-7384-4375-9d63-f5c09d97ce44</guid><dc:creator><![CDATA[Jon Seymour]]></dc:creator><pubDate>Sun, 26 Oct 2014 05:52:18 GMT</pubDate><content:encoded><![CDATA[<p>My financial affairs are simple enough that I can keep track of them by exporting the transaction data from my bank accounts and annotating the exports in a Google sheet. The annotations allow me to classify each income or expenditure item with a category that allows me to generate reports that aggregate the data across each category for reporting and analysis purposes.</p>

<p>One of the tedious aspects of this process is the need to export the transaction data from the bank. I will eventually write a Chrome extension to help me automate this, but for now on a weekly basis I manually export the transaction data from each account as a CSV file and then run an import process over the resulting files.</p>

<p>One challenge with this is that so that I don't miss any data I need to be able to overlap the periodic exports. The overlap means that the export files from consecutive exports may contain duplicate records. </p>

<p>Obviously, from an accounting point of view, it is important to eliminate the duplicates from the import and, from a tedium mimimisastion perpective, to do this automatically.</p>

<p>This would be a trivial problem if the source transaction data had a natural or surrogate key for each record but unfortunately it does not. In fact, each source record has the following fields:</p>

<ul>
<li>account</li>
<li>transaction date</li>
<li>narrative</li>
<li>credit amount</li>
<li>debit amount</li>
</ul>

<p>No combination of these fields is guaranteed to produce a unique key for a record - it is possible that two records may specify the same account, transaction date, narrative, credit and debit amounts. And, in fact, I have observed that the bank occasionally alters the narrative for a given transaction record between subsequent exports so the narrative cannot be used as part of a record key since to do so would risk creating two imported records, with different keys, for the same transaction.</p>

<p>The solution I chose for this problem is to extend the imported record with two additional fields: repetition and md5 sum. So:</p>

<ul>
<li>account</li>
<li>transaction date</li>
<li>narrative</li>
<li>credit amount</li>
<li>debit amount</li>
<li>repetition</li>
<li>md5 sum</li>
</ul>

<p>Repetition is initially blank. md5 sum is calculated over the account, transaction date, credit and debit amount and repetition fields. If two records in the same import duplicate the same fields, then the md5 for those two records will be identical. In this case, the repetition for the current record is set to 1 and the md5 sum for that record is recalculated. The process is repeated, incrementing repetition on each occasion, until the record obtains an md5 sum that is unique within the same import. </p>

<p>The md5 sum so calculated is then effectively a surrogate key for the record which can be assumed to identify the same transaction across all previous (and future) imports under the additional assumptions that all imports always contain a full days worth of data, the bank never changes the date of a transaction and never withdraws (as opposed to reverses) a transaction previously published. Should those assumptions be violated, a manual intervention would still be required to delete downstream references to the altered or deleted records.</p>

<p>With a surrogate key for each record now established, I can then merge the newly imported data with previously imported data by matching the new and existing records on the basis of their surrogate keys. </p>

<p>The key assignment process is both stateless and robust - I don't need access to all the data I previously imported in order to generate unique keys for each record and it doesn't matter if different imports at different times contain overlapping data -in both cases, the same keys will be generated for the same set of same transactions.*</p>

<p><em>*</em> It is technically true that if the order of transactions with identical dates and amounts is transposed between subsequent imports then the narratives for two records may be swapped on subsequent imports. This potentially becomes problematic if downstream processing depends on automated interpretation of the narrative. It might be necessary, in this case, to account for narrative changes during the merge process, if required.</p>

<p>To support this pattern, I have written some tools in golang that can generate additional fields to ensure that each record of a CSV input stream contains a unique natural key and another tool that can then generate a surrogate key from the MD5 sum of the unique natural key.</p>

<p>So, for example:</p>

<pre><code>uniquify \
  --partial-key BankAccount,Date,CreditAmount,DebitAmount \
  --additonal-key Repetition |
surrogate-keys \
   --natural-key \
     BankAccount,Date,CreditAmount,DebitAmount,Repetition \
   --surrogate-key KeyMD5
</code></pre>

<p>For more information, see: <a href="https://godoc.org/github.com/wildducktheories/go-csv/uniquify">https://godoc.org/github.com/wildducktheories/go-csv/uniquify</a>, <a href="https://godoc.org/github.com/wildducktheories/go-csv/surrogate-keys">https://godoc.org/github.com/wildducktheories/go-csv/surrogate-keys</a> and <a href="https://github.com/wildducktheories/go-csv">https://github.com/wildducktheories/go-csv</a> .</p>]]></content:encoded></item><item><title><![CDATA[building VirtualBox on OSX 10.9]]></title><description><![CDATA[<p>This post documents a guide to building VirtualBox on OSX 10.9. This document should be read in conjunction with the official <a href="https://www.virtualbox.org/wiki/Mac%20OS%20X%20build%20instructions">Mac OS X build instructions [1]</a>. Its intended audience are people relatively new to VirtualBox and/or OSX development who might find that the official instructions don't provide</p>]]></description><link>https://blog.wildducktheories.com/building-virtual-box-on-osx-10-9/</link><guid isPermaLink="false">7d3c883b-908a-49d4-a1d7-4226bed74330</guid><dc:creator><![CDATA[Jon Seymour]]></dc:creator><pubDate>Fri, 20 Jun 2014 10:32:37 GMT</pubDate><content:encoded><![CDATA[<p>This post documents a guide to building VirtualBox on OSX 10.9. This document should be read in conjunction with the official <a href="https://www.virtualbox.org/wiki/Mac%20OS%20X%20build%20instructions">Mac OS X build instructions [1]</a>. Its intended audience are people relatively new to VirtualBox and/or OSX development who might find that the official instructions don't provide quite enough guidance to navigate the obstacles introduced by the need to use an older version of Xcode to successfully execute the build.</p>

<p>Most of the information documented here was originally provided by Klaus Espenlaub and Vadim Galitsyn in a thread "Sketch of how to build on OSX 10.9?"  in the Virtual Box developers mailing list.<a href="https://www.virtualbox.org/pipermail/vbox-dev/2014-June/012380.html">[2]</a> <a href="https://www.virtualbox.org/pipermail/vbox-dev/2014-June/012390.html">[3]</a></p>

<p>The reason these additional instructions may be helpful for novices is that the VirtualBox source tree doesn't support building against XCode 5.1 which is the current set of development tools that a OSX 10.9 user is likely to have installed. To build VirtualBox successfully, the 10.9 user needs to obtain an earlier version of XCode (I chose 4.1) and manually unpack parts of it to obtain the necessary SDKs and gcc compiler required by the VirtualBox source tree. Later versions of XCode symlink gcc to clang/LLVM which does not support all the gcc and g++ options used by the VirtualBox build scripts.</p>

<p>Unlike the official instructions, these instructions also assume that other dependencies (such as openssl and Qt) are installed with homebrew rather than MacPorts.</p>

<p>The build process, in overview:</p>

<ol>
<li>ensure you have enough disk space  </li>
<li>checkout the SVN source tree  </li>
<li>download the XCode 4.1 installer from Apple  </li>
<li>unpack and extract a portion of the XCode 4.1 installation  </li>
<li>build openssl from source (using brew)  </li>
<li>configure the build  </li>
<li>run the build  </li>
<li>fixup the permissions on the build results  </li>
<li>load the kernel extensions  </li>
<li>start VirtualBox  </li>
<li>(optionally) switch back to the official distribution.</li>
</ol>

<h3 id="ensureyouhaveenoughdiskspace">Ensure you have enough disk space</h3>

<p>To successfully build the VirtualBox tree you are going to need around 10GB of diskspace. 3GB for the XCode 4.1 image, 1.2GB for the partial XCode 4.1 extract and 2.2 GB for the VirtualBox source tree and build output plus some head room required during extraction from the XCode 4.1 disk image.</p>

<h3 id="checkoutthesvnsourcetree">Checkout the SVN source tree</h3>

<p>Run this command to checkout the source code from SVN.</p>

<pre><code>svn co http://www.virtualbox.org/svn/vbox/trunk vbox
cd vbox
</code></pre>

<p>The source tree I built was <a href="http://www.virtualbox.org/svn/vbox/trunk@51648">http://www.virtualbox.org/svn/vbox/trunk@51648</a> </p>

<p>The following instructions may need to be adapted if you want to build from a commit earlier than 51645 because that commit introduces support for the <strong>--with-xcode-dir</strong> option that these instructions use.</p>

<h3 id="downloadthexcode41installerfromapple">Download the XCode 4.1 installer from Apple</h3>

<p>On an OSX 10.9 system, Apple wants you to use XCode 5.1. Unfortunately, XCode 5.1 currently can't be used to build the VirtualBox source tree because of two reasons: the source tree doesn't recognize the 10.9 SDK and Xcode 5.1 doesn't provide a true implementation of gcc 4.2 which contains support for compiler options that the Virtual Box build scripts rely on (for example, <strong>-fcheck-new</strong>).</p>

<p>Fortunately, you can still download earlier versions of XCode from <a href="https://developer.apple.com/downloads/index.action?q=xcode">Apple's developer site [4]</a> [registration required].</p>

<p>The file you are looking for is called "Xcode 4.1 for Lion" and should download as a file called "installxcode_41_lion.dmg".</p>

<h3 id="unpackandextractaportionofthexcode41installation">Unpack and extract a portion of the XCode 4.1 installation</h3>

<p>Unfortunately the installer in the disk image prevents you from installing this version of XCode on an OSX 10.9 system. Instead, it is necessary to manually (or, at least, semi-automatically) unpack just the parts of XCode 4.1 that are actually needed to compile the VirtualBox source tree.</p>

<p>I've written a script called <a href="https://gist.github.com/jonseymour/f05d97da2b29d4a03192">extract-xcode41.sh [5]</a> that sequences the xar and cpio commands necessary to extract just those dependencies required to build the VirtualBox source tree. </p>

<p>Assuming you have downloaded installxcode_41_lion.dmg and extract-xcode41.sh script into the root of your VirtualBox source tree, then the following command will create a subdirectory called xcode41-partial containing just the necessary dependencies.</p>

<pre><code>./extract-xcode41.sh
</code></pre>

<p>For the record, the following is a list of packages that are extracted from the XCode 4.1 installer.</p>

<ul>
<li>DevSDK.pkg</li>
<li>MacOSX10.6.pkg </li>
<li>MacOSX10.7.pkg </li>
<li>XcodeTools.pkg </li>
<li>llvm-gcc4.2.pkg </li>
<li>gcc4.2.pkg </li>
<li>DeveloperTools.pkg</li>
</ul>

<h3 id="buildopensslfromsourceusingbrew">Build openssl from source (using brew)</h3>

<p>VirtualBox needs a copy of the openssl source tree. The easiest way to obtain this on a system which uses homebrew is to run the brew installer with the <strong>--build-from-source</strong> option. So:</p>

<pre><code>brew install openssl --build-from-source
</code></pre>

<p>By default, brew puts the openssl source tree into /usr/local/opt/openssl.</p>

<p>I didn't explicitly install Qt myself as part of this build but it appears that the configure script successfully located a copy of qt that had previously be installed by brew. If this doesn't apply to you, you might try:</p>

<pre><code>brew install qt
</code></pre>

<h3 id="configurethebuild">Configure the build</h3>

<p>This step uses a recently introduced option <strong>--with-xcode-dir</strong> to tell VirtualBox how to find the Xcode SDKs and tools it should use for the build. Per the official guide, I will also use the <strong>--disable-hardening</strong> option but note the warning in the official build notes against using this option with a build that you intend to distribute to others.</p>

<pre><code> ./configure --disable-hardening \
      --with-xcode-dir=$(pwd)/xcode41-partial \
      --with-openssl=/usr/local/opt/openssl
</code></pre>

<h3 id="runthebuild">Run the build</h3>

<p>The build should now be ready to run. You can build it with:</p>

<pre><code>source env.sh
kmk
</code></pre>

<p>I found that the build took about 20 minutes to run on my Mac Book Air.</p>

<h3 id="fixupthepermissions">Fixup the permissions</h3>

<p>For full functionality, some components of VirtualBox need to run as setuid root. In particular, the host-only network interface will only work correctly if these permissions are set correctly.</p>

<p>So, fixup the permissions as follows:</p>

<pre><code>pushd out/darwin.amd64/release/dist/VirtualBox.app/Contents/MacOS/
for b in VBoxHeadless VBoxNetAdpCtl VBoxNetDHCP VBoxNetNAT VirtualBoxVM; 
do 
    sudo chown root $b; 
    sudo chmod u+s $b; 
done
popd
</code></pre>

<h3 id="loadthekernelextensions">Load the kernel extensions</h3>

<p>VirtualBox needs some kernel extensions to operate correctly. To load these, run the loadall.sh script provided for the purpose.</p>

<pre><code>pushd out/darwin.amd64/release/dist
./loadall.sh
popd
</code></pre>

<p>If the load completes successfully, you should see messages like this:</p>

<pre><code>...
load.sh: Successfully unloaded org.virtualbox.kext.VBoxDrv
load.sh: loading /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxDrv.kext...
.sh: loading /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxDrv.kext... (kextutil -t "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxDrv.kext")
Diagnostics for /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxDrv.kext:
Code Signing Failure: not code signed
WARNING - Invalid signature -67062 0xFFFFFFFFFFFEFA0A for kext "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxDrv.kext"
  144    0 0xffffff7f82259000 0x46000    0x46000    org.virtualbox.kext.VBoxDrv (4.3.53) &lt;7 5 4 3 1&gt;
loadusb.sh: loading /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxUSB.kext... (kextutil -t -d "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxDrv.kext" "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxUSB.kext")
Diagnostics for /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxUSB.kext:
Code Signing Failure: not code signed
WARNING - Invalid signature -67062 0xFFFFFFFFFFFEFA0A for kext "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxUSB.kext"
  144    1 0xffffff7f82259000 0x46000    0x46000    org.virtualbox.kext.VBoxDrv (4.3.53) &lt;7 5 4 3 1&gt;
  146    0 0xffffff7f822a7000 0x8000     0x8000     org.virtualbox.kext.VBoxUSB (4.3.53) &lt;144 54 34 7 5 4 3 1&gt;
loadnetflt.sh: loading /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxNetFlt.kext... (kextutil -t -d "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxDrv.kext" "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxNetFlt.kext")
Diagnostics for /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxNetFlt.kext:
Code Signing Failure: not code signed
WARNING - Invalid signature -67062 0xFFFFFFFFFFFEFA0A for kext "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxNetFlt.kext"
  144    2 0xffffff7f82259000 0x46000    0x46000    org.virtualbox.kext.VBoxDrv (4.3.53) &lt;7 5 4 3 1&gt;
  146    0 0xffffff7f822a7000 0x8000     0x8000     org.virtualbox.kext.VBoxUSB (4.3.53) &lt;144 54 34 7 5 4 3 1&gt;
  147    0 0xffffff7f822af000 0x5000     0x5000     org.virtualbox.kext.VBoxNetFlt (4.3.53) &lt;144 7 5 4 3 1&gt;
loadnetadp.sh: loading /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxNetAdp.kext... (kextutil -t -d "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxDrv.kext" "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxNetAdp.kext")
Diagnostics for /Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxNetAdp.kext:
Code Signing Failure: not code signed
WARNING - Invalid signature -67062 0xFFFFFFFFFFFEFA0A for kext "/Users/jonseymour/svn/vbox/out/darwin.amd64/release/dist/VBoxNetAdp.kext"
  144    3 0xffffff7f82259000 0x46000    0x46000    org.virtualbox.kext.VBoxDrv (4.3.53) &lt;7 5 4 3 1&gt;
  146    0 0xffffff7f822a7000 0x8000     0x8000     org.virtualbox.kext.VBoxUSB (4.3.53) &lt;144 54 34 7 5 4 3 1&gt;
  147    0 0xffffff7f822af000 0x5000     0x5000     org.virtualbox.kext.VBoxNetFlt (4.3.53) &lt;144 7 5 4 3 1&gt;
  148    0 0xffffff7f82327000 0x6000     0x6000     org.virtualbox.kext.VBoxNetAdp (4.3.53) &lt;144 5 4 1&gt;
</code></pre>

<p>The warnings about invalid signatures are expected and not indicative of a problem that should prevent local testing.</p>

<h3 id="startvirtualbox">Start VirtualBox</h3>

<p>To start VirtualBox, change into the directory containing the VirtualBox binary, and run it:</p>

<pre><code>pushd out/darwin.amd64/release/dist/\
VirtualBox.app/Contents/MacOS/
./VirtualBox
popd
</code></pre>

<h3 id="switchingbacktotheofficialdistribution">Switching back to the official distribution</h3>

<p>The following instructions will help you unload the privately built version of VirtualBox (and its kernel extensions) and restore the official distribution.</p>

<p>Copy the following <a href="https://gist.github.com/jonseymour/28423d881784e52e0f94">script [6]</a> into a file called 'reload-vbox.sh' somewhere on your path.</p>

<pre><code>#!/usr/bin/env bash
# based on https://gist.github.com/rtgibbons/2024307 with updates from comments of that gist for OSX 10.9

EXTDIR="/Library/Application Support/VirtualBox"

unload() {
    kextstat | grep "org.virtualbox.kext.VBoxUSB" &gt; /dev/null 2&gt;&amp;1 &amp;&amp; sudo kextunload -b org.virtualbox.kext.VBoxUSB
    kextstat | grep "org.virtualbox.kext.VBoxNetFlt" &gt; /dev/null 2&gt;&amp;1 &amp;&amp; sudo kextunload -b org.virtualbox.kext.VBoxNetFlt
    kextstat | grep "org.virtualbox.kext.VBoxNetAdp" &gt; /dev/null 2&gt;&amp;1 &amp;&amp; sudo kextunload -b org.virtualbox.kext.VBoxNetAdp
    kextstat | grep "org.virtualbox.kext.VBoxDrv" &gt; /dev/null 2&gt;&amp;1 &amp;&amp; sudo kextunload -b org.virtualbox.kext.VBoxDrv
}

load() {
    sudo kextload "$EXTDIR/VBoxDrv.kext" -r "$EXTDIR"
    sudo kextload "$EXTDIR/VBoxNetFlt.kext" -r "$EXTDIR"
    sudo kextload "$EXTDIR/VBoxNetAdp.kext" -r "$EXTDIR"
    sudo kextload "$EXTDIR/VBoxUSB.kext" -r "$EXTDIR"
}

case "$1" in
    unload|remove)
        unload
    ;;
    load)
        load
    ;;
    *|reload)
        unload
        load
    ;;
esac
</code></pre>

<p>Then run:</p>

<pre><code>reload-vbox.sh reload
</code></pre>

<h2 id="references">References</h2>

<ul>
<li>[1] - <a href="https://www.virtualbox.org/wiki/Mac%20OS%20X%20build%20instructions">https://www.virtualbox.org/wiki/Mac%20OS%20X%20build%20instructions</a></li>
<li>[2] - <a href="https://www.virtualbox.org/pipermail/vbox-dev/2014-June/012380.html">https://www.virtualbox.org/pipermail/vbox-dev/2014-June/012380.html</a></li>
<li>[3] - <a href="https://www.virtualbox.org/pipermail/vbox-dev/2014-June/012390.html">https://www.virtualbox.org/pipermail/vbox-dev/2014-June/012390.html</a></li>
<li>[4] - <a href="https://developer.apple.com/downloads/index.action?q=xcode">https://developer.apple.com/downloads/index.action?q=xcode</a></li>
<li>[5] - <a href="https://gist.github.com/jonseymour/f05d97da2b29d4a03192">https://gist.github.com/jonseymour/f05d97da2b29d4a03192</a></li>
<li>[6] - <a href="https://gist.github.com/jonseymour/28423d881784e52e0f94">https://gist.github.com/jonseymour/28423d881784e52e0f94</a></li>
</ul>]]></content:encoded></item><item><title><![CDATA[welcome to technically quacking]]></title><description><![CDATA[<div style="text-align:right">a blog by <a href="http://wildducktheories.com/">wild duck theories</a>  
</div>  

<p>"wild duck theories" is the name of a company I established after I resigned from IBM in Februrary 2014 after a career spanning 24 years; this blog "technically quacking" gives voice to my inner "wild duck".</p>

<p>The name, "wild duck theories", was inspired in</p>]]></description><link>https://blog.wildducktheories.com/welcome-to-technically-quacking/</link><guid isPermaLink="false">925ea96a-c7c3-4f1e-bf89-5c489d08fee5</guid><dc:creator><![CDATA[Jon Seymour]]></dc:creator><pubDate>Thu, 05 Jun 2014 18:08:34 GMT</pubDate><content:encoded><![CDATA[<div style="text-align:right">a blog by <a href="http://wildducktheories.com/">wild duck theories</a>  
</div>  

<p>"wild duck theories" is the name of a company I established after I resigned from IBM in Februrary 2014 after a career spanning 24 years; this blog "technically quacking" gives voice to my inner "wild duck".</p>

<p>The name, "wild duck theories", was inspired in part by a colleague's query, in response to news of my resignation, about whether IBM was losing "its last wild duck". The "theories" part of the name signifies the importance of the scientific method as the foundation of a good problem solving technique. "wild duck theories" will earn at least part of its income by exploiting my abilities to apply the scientific method to the solution of tricky customer problems.</p>

<p>My decision to resign from IBM was not the result of being unhappy with IBM. If anything, at the time I resigned I was having very good fun helping to solve a critical situation at an important customer. Rather, the decision to resign was motivated by an invigorating glimpse of a vision of life beyond IBM, a vision I had never had before. With this vision, I realised that by resigning I would be free to decide how I spent my time each day and free to decide to whom I would assign my intellectual property. Once glimpsed, this vision became irresistable, so my resignation became inevitable.</p>

<p>In the future, I intend to find a balance between doing things I enjoy, such as writing software, and things I need to do to earn income. Ideally, the software I write will help drive business towards a consultancy which in turn will help me earn the income I need to support my software development activities - a virtuous circle.</p>

<p>I intend to use this blog to explore topics that are of interest to me and might be of interest to potential clients. In future months, I will likely write about projects I push to github (such as <a href="http://github.com/wildducktheories/jsh">jsh</a>) , technologies such as <a href="http://www.docker.io">Docker</a> and <a href="http://logstash.net">logstash</a>, and how such technologies might be applied to enterprise software stacks, such as <a href="http://www-01.ibm.com/software/websphere/">IBM WebSphere</a>. I also plan to discuss <a href="http://gitscm.org/">git</a> workflows and techniques I have found useful in the past.</p>]]></content:encoded></item></channel></rss>