<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
    <title>Nathan Rosenquist</title>
    <link>https://nathanrosenquist.com/</link>
    <description>Nathan Rosenquist</description>
    <lastBuildDate>Tue, 03 Feb 2026 23:20:35 -0500</lastBuildDate>
    <image>
        <url>https://nathanrosenquist.com/favicon-32x32.png</url>
        <title>Nathan Rosenquist</title>
        <link>https://nathanrosenquist.com/</link>
        <width>32</width>
        <height>32</height>
    </image>
    <item>
        <title>diyaudioplayer.js</title>
        <link>https://nathanrosenquist.com/diyaudioplayer.js/</link>
        <description><![CDATA[<h1>diyaudioplayer.js</h1>

<p>A customizable JavaScript audio player, that you can embed on your web site.</p>

<p>
    <i>diyaudioplayer.js</i> handles the basic functionality you would expect
    from an audio player. The DIY part comes into play when you integrate the
    player into your own web site, and customize the user interface elements.
</p>

<p>Implemented as a single vanilla JavaScript file with no required dependencies.</p>

<h2>Download</h2>

<p><a href="https://nathanrosenquist.com/diyaudioplayer.js/diyaudioplayer.js.zip">diyaudioplayer.js.zip</a></p>

<p><a href="https://github.com/ratherlargerobot/diyaudioplayer.js">GitHub</a></p>]]></description>
        <category>downloads</category>
        <category>interactive</category>
        <category>javascript</category>
        <category>music</category>
        <category>opensource</category>
        <pubDate>Thu, 19 Jun 2025 15:23:25 -0500</pubDate>
    </item>
    <item>
        <title>dit</title>
        <link>https://nathanrosenquist.com/dit/</link>
        <description><![CDATA[<h1>dit</h1>

<p><img src="https://nathanrosenquist.com/dit/dit.jpg"
        alt="SD cards and USB thumb drives"></p>

<p>
    A command-line image copying tool with specialized features designed to
    work with redundant copies of digital photos and movie files.
</p>

<p>
    dit is designed to take one or more mostly-identical source directories,
    and copy their contents to one or more identical destination directories.
    It also has features to verify that presumably identical source files are
    actually identical, and to save both files if they turn out to differ.
    This can help minimize the effects of data corruption in the source
    material.
</p>

<p>
    I wrote this program for myself, because I needed to back up thousands of
    digital photos redundantly on a
    <a href="https://nathanrosenquist.com/photos/antarctica/">once-in-a-lifetime trip</a>,
    and didn't have enough SD card space to hold them all.
</p>

<p>
    The original use was to back up two redundant SD cards from a Fujifilm
    mirrorless camera onto two USB thumb drives, while verifying that the
    source SD cards did not have any data corruption.
</p>

<p>
    I have also found it useful when confronted with several photo directories
    that might have naming conflicts.
</p>

<p>
    Note that this is a specialized program, designed to work with image and
    movie files. It intentionally skips over files starting with a dot, to
    avoid false positives on file corruption warnings (e.g. on .DS_Store files
    and such).
</p>

<p>
    The name of the program is a nod to the
    <a href="https://en.wikipedia.org/wiki/Digital_imaging_technician">Digital Imaging Technician</a>
    role on a modern digital movie set. As one small but important part of
    their jobs, they routinely copy motion picture footage from the set to
    multiple drives for safekeeping.
</p>

<p>
    dit is implemented in Rust. It does not have any runtime dependencies,
    but you will need the Rust compiler and Cargo to build it.
</p>

<h2>Download</h2>

<p><a href="https://nathanrosenquist.com/dit/dit-0.9.0.tar.gz">dit-0.9.0.tar.gz</a></p>

<p><a href="https://github.com/ratherlargerobot/dit">GitHub</a></p>]]></description>
        <category>filmmaking</category>
        <category>opensource</category>
        <category>photography</category>
        <category>rust</category>
        <category>unix</category>
        <pubDate>Wed, 15 Mar 2023 19:26:07 -0500</pubDate>
    </item>
    <item>
        <title>Photo Gallery: Antarctica</title>
        <link>https://nathanrosenquist.com/photos/antarctica/</link>
        <description><![CDATA[<h1>Photo Gallery: Antarctica</h1>

<p><a href="https://nathanrosenquist.com/photos/antarctica/"><img src="https://nathanrosenquist.com/photos/antarctica/foggy-mountain-breakdown/thumbnail.jpg" alt="Foggy Mountain Breakdown"></a></p>
<p><a href="https://nathanrosenquist.com/photos/antarctica/">Click to view &ldquo;Antarctica&rdquo; photo gallery.</a></p>

<p><i>f</i>/8 and be there.</p>]]></description>
        <pubDate>Wed, 08 Feb 2023 23:56:47 -0500</pubDate>
    </item>
    <item>
        <title>Photo Gallery: Israel</title>
        <link>https://nathanrosenquist.com/photos/israel/</link>
        <description><![CDATA[<h1>Photo Gallery: Israel</h1>

<p><a href="https://nathanrosenquist.com/photos/israel/"><img src="https://nathanrosenquist.com/photos/israel/church-of-the-holy-sepulchre-altar-of-the-crucifixion/thumbnail.jpg" alt="Church of the Holy Sepulchre - Altar of the Crucifixion"></a></p>
<p><a href="https://nathanrosenquist.com/photos/israel/">Click to view &ldquo;Israel&rdquo; photo gallery.</a></p>

<p>Work trip, with a bit of sightseeing.</p>]]></description>
        <pubDate>Tue, 25 Oct 2022 00:00:00 -0500</pubDate>
    </item>
    <item>
        <title>To Make a Dadaist Poem</title>
        <link>https://nathanrosenquist.com/dadaist-poem/</link>
        <description><![CDATA[<h1>To Make a Dadaist Poem</h1>

<p class="noprint">
    <img src="https://nathanrosenquist.com/dadaist-poem/dada.jpg" alt="Dada artwork and publications (1919-1920)">
</p>

<form onsubmit="return false">

<div class="noprint">
<textarea name="in" rows="15" cols="80" style="font-family: SourceSerif4-Regular; font-size: 12pt; background-color: #EEEEEE;">Take a newspaper.
Take some scissors.
Choose from this paper an article of the length you want to make your poem.
Cut out the article.
Next carefully cut out each of the words that makes up this article and put them all in a bag.
Shake gently.
Next take out each cutting one after the other.
Copy conscientiously in the order in which they left the bag.
The poem will resemble you.
And there you are — an infinitely original author of charming sensibility, even though unappreciated by the vulgar herd.

Tristan Tzara
“To Make a Dadaist Poem” (1920)</textarea>
<br>

<input class="button noprint" type="submit" value="Make a Dadaist Poem" onclick="updatePage()">

<input class="button noprint" type="submit" value="Print" onclick="printPage()">

</div>
<br>

<div id="out" style="font-family: SourceSerif4-Semibold; font-size: 14pt;"></div>

</form>]]></description>
        <category>history</category>
        <category>interactive</category>
        <category>javascript</category>
        <category>nonsense</category>
        <pubDate>Tue, 23 Aug 2022 23:00:00 -0500</pubDate>
    </item>
    <item>
        <title>Photo Gallery: Somewhere in America</title>
        <link>https://nathanrosenquist.com/photos/somewhere-in-america/</link>
        <description><![CDATA[<h1>Photo Gallery: Somewhere in America</h1>

<p><a href="https://nathanrosenquist.com/photos/somewhere-in-america/"><img src="https://nathanrosenquist.com/photos/somewhere-in-america/nutmeg-paparazzi/thumbnail.jpg" alt="Nutmeg Paparazzi"></a></p>
<p><a href="https://nathanrosenquist.com/photos/somewhere-in-america/">Click to view &ldquo;Somewhere in America&rdquo; photo gallery.</a></p>

<p>Adventures in some of America&lsquo;s 50 states.</p>]]></description>
        <pubDate>Mon, 06 Sep 2021 23:00:00 -0500</pubDate>
    </item>
    <item>
        <title>Uriel</title>
        <link>https://nathanrosenquist.com/uriel/</link>
        <description><![CDATA[<h1>Uriel</h1>

<p><img src="https://nathanrosenquist.com/uriel/map-of-the-square-and-stationary-earth.jpg"
        alt="Map of the square and stationary Earth"
        title="God does not play roulette with the universe"></p>

<p>
    <i>Uriel</i> is a minimalistic, stable, feature complete static site
    generator, written in Python.
</p>

<p>
    Named for the archangel Uriel in the novel
    <a href="http://unsongbook.com/">Unsong</a>, whose job was to perform
    the fantastic and mundane work necessary to keep the world functioning.
</p>

<p>
    Built to last for years without requiring any maintenance. It is feature
    complete, and only depends on <a href="https://www.python.org/">Python</a>,
    with no third-party module dependencies. That means that it won't break
    unexpectedly years from now, after you've built a site around it.
</p>

<p>
    As long as you can still get a working copy of <i>python3</i>, your site
    will still build the same way in the future.
</p>

<h2>Download</h2>

<p><a href="https://nathanrosenquist.com/uriel/uriel-1.3.12.tar.gz">uriel-1.3.12.tar.gz</a></p>
<p><a href="https://github.com/ratherlargerobot/uriel">GitHub</a></p>
<p><a href="https://nathanrosenquist.com/uriel/boyds-toast.tar.gz">Example Project - Boyd&lsquo;s Toast</a></p>

<p>The example project is intentionally simplistic and ugly, so that you won&lsquo;t
be tempted to use it directly as a template for your own site.</p>

<p>Appreciate its raw simplicity, free from extraneous distractions. Figure out how it
works. Then build your own web site from scratch, with your own superior and fashionable
HTML, CSS, and refined sense of style.</p>

<h2>Features</h2>

<ul>
    <li>Generates a static website you can host on pretty much any web server</li>
    <li>Minimalistic philosophy and approach</li>
    <li>Useful error messages</li>
    <li>Built-in tag index system</li>
    <li>Built-in breadcrumb navigation support</li>
    <li>Flat URL support to make some or all content nodes top-level URLs</li>
    <li>Inheritance and override system for content node settings and values</li>
    <li>Optional dynamic naming of static files (to force browser cache misses for CSS and JavaScript files
        when content changes)</li>
    <li>RSS feed generator, with ability to include or exclude content nodes from feed</li>
    <li>sitemap.xml generator, with ability to include or exclude content nodes from sitemap</li>
    <li>Minimalistic robots.txt generator</li>
    <li>Ability to include unmodified static files</li>
    <li>Ability to selectively override dynamically generated files with static files when necessary</li>
    <li>Simple but flexible templating system</li>
    <li>Supports a variety of useful built-in node/template replacement parameters</li>
    <li>Supports arbitrary user-defined Python code in node/template replacement parameters</li>
    <li>Supports arbitrary user-defined Python code in lifecycle handlers during generation</li>
    <li>Ability to generate static pages dynamically from user-defined Python code</li>
    <li>Implemented in pure Python 3, using only the built-in library modules</li>
    <li>Stable platform to build on</li>
    <li>Feature complete</li>
    <li>Minimal dependencies, pure Python 3 with no third-party modules</li>
    <li>GPL version 3 license</li>
</ul>

<p>Why another static site generator? Why this one? Because I wanted an extremely stable
platform to build my own web sites on, that I would be able to maintain and understand
many years into the future. For this project, simplicity and stability is prioritized
over new features.</p>

<p>This web site is built with Uriel (along with various local
<a href="https://github.com/ratherlargerobot/uriel#soju">Soju</a> extensions). The
<a href="https://nathanrosenquist.com/photos/">photo gallery</a> is a good example of the
sort of non-trivial local customizations that can be built on top of Uriel.</p>

<p>If you prefer something with a maximal feature set, and all the latest features,
this probably won&lsquo;t be for you.</p>

<p>On the other hand, this system is so simple that it will pretty much keep working
indefinitely, without any ongoing maintenance. For me, this is the main appeal.</p>

<h2>Documentation</h2>

<p><a href="https://github.com/ratherlargerobot/uriel">README.md</a></p>
<p><a href="https://nathanrosenquist.com/uriel/cheatsheet/">Uriel Cheat Sheet</a></p>

<h2>Quick Start</h2>

<h3>Download and install Uriel</h3>

<p>(You can also use it from a different path without root privileges.)</p>

<p><pre>wget https://nathanrosenquist.com/uriel/uriel-1.3.12.tar.gz
tar -xzvf uriel-1.3.12.tar.gz
cd uriel-1.3.12/
sudo make install</pre></p>

<h3>Create a Uriel project directory for your new web site</h3>

<p><pre>uriel my-first-website</pre></p>

<p>
    You just created the beginning of your new web site.
    In the &ldquo;my-first-website&rdquo; directory you just created,
    go look around at your new web site project directory.
</p>

<p>
    The &ldquo;public&rdquo; directory is the generated web site, which is
    completely regenerated every time. Everything else in the
    directory outside of &ldquo;public&rdquo; is part of the project files.
    See the
    <a href="https://github.com/ratherlargerobot/uriel">README.md</a>
    and <a href="https://nathanrosenquist.com/uriel/cheatsheet/">Uriel Cheat Sheet</a> for more details.
</p>

<p>
    A <i>Makefile</i> was generated in the root of your new website
    project directory. Type `make` after you make any changes to
    the project files to regenerate everything in the &ldquo;public&rdquo;
    directory.
</p>

<p><pre>cd my-first-website
make</pre></p>

<p>
    When you're happy with your new masterpiece, copy all of the
    files under the &ldquo;public&rdquo; directory to the document root of
    your web server, e.g.:
</p>

<p><pre>rsync -av --delete public/ example.com:/path/to/my-first-website/public/</pre></p>]]></description>
        <category>downloads</category>
        <category>opensource</category>
        <category>python</category>
        <category>unix</category>
        <pubDate>Sun, 03 Jan 2021 17:03:05 -0500</pubDate>
    </item>
    <item>
        <title>GitHub Pull Request Workflow</title>
        <link>https://nathanrosenquist.com/github-pull-request-workflow/</link>
        <description><![CDATA[<h1>GitHub Pull Request Workflow</h1>

<p>
    <img src="https://nathanrosenquist.com/github-pull-request-workflow/pull-request.jpg" alt="GitHub pull request drawing">
</p>

<p>
    There are enough steps in the <a href="https://github.com/">GitHub</a>
    pull request workflow that I wrote them down for reference.
</p>

<h2>Fork a Project</h2>

<p>
    To fork a project, just go to the GitHub project page and click
    &ldquo;Fork&rdquo;. You'll need a GitHub account, and to be logged in for
    this to work. GitHub will create a fork of the upstream project in your
    account.
</p>

<p>
    Then you'll need to clone the project so that you have a copy of it
    checked out on your computer:
</p>
<pre><code>git clone git@github.com:YOUR-USERNAME/ORIGINAL-PROJECT.git</code></pre>

<p>
    Change directories so that you&rsquo;re at the root of the checked out
    project directory:
</p>
<pre><code>cd ORIGINAL-PROJECT/</code></pre>

<p>Track the upstream repo:</p>
<pre><code>git remote add upstream \
    https://github.com/UPSTREAM-USER/ORIGINAL-PROJECT.git</code></pre>

<p>Verify the new remote named &ldquo;upstream&rdquo;:</p>
<pre><code>git remote -v</code></pre>

<h2>Update Fork From Upstream</h2>

<p>Fetch upstream updates:</p>
<pre><code>git fetch upstream</code></pre>

<p>View all branches:</p>
<pre><code>git branch -va</code></pre>

<p>Merge &ldquo;upstream&rdquo; into our main branch:</p>
<pre><code>git checkout main
git merge upstream/main</code></pre>

<h2>Feature Development / Bug Fix Cycle</h2>

<p>
    Switch to the &ldquo;main&rdquo; branch, as the source of our new
    feature branch:
</p>
<pre><code>git checkout main</code></pre>

<p>Create the new feature branch and check it out as our local copy:</p>
<pre><code>git branch NEWFEATURE
git checkout NEWFEATURE</code></pre>

<br><br>
<p>Add your new feature or bug fix here...</p>
<br><br>

<p>Fetch upstream main branch and merge into our main branch:</p>
<pre><code>git fetch upstream
git checkout main
git merge upstream/main</code></pre>

<p>If there were any new commits, rebase development branch:</p>
<pre><code>git checkout NEWFEATURE
git rebase main</code></pre>

<p>Push local feature branch to remote feature branch:</p>
<pre><code># the first time you have to set it as the upstream branch
#git push --set-upstream origin NEWFEATURE
git push origin NEWFEATURE</code></pre>

<p>Create pull request. Go to the GitHub page for the feature branch
and click &ldquo;pull request&rdquo;.</p>

<p>The pull request gets accepted or rejected.</p>

<p>Delete feature branch once accepted:</p>
<pre><code>git push origin --delete NEWFEATURE
git branch -d NEWFEATURE</code></pre>]]></description>
        <category>opensource</category>
        <pubDate>Wed, 04 Nov 2020 10:46:23 -0500</pubDate>
    </item>
    <item>
        <title>rsnapshot</title>
        <link>https://nathanrosenquist.com/rsnapshot/</link>
        <description><![CDATA[<h1>rsnapshot</h1>

<p><img src="https://nathanrosenquist.com/rsnapshot/rsnapshot.jpg"
        alt="O'Reilly Books - Backup & Recovery / BSD Hacks"></p>

<p>
    I am the original author and former maintainer of
    <a href="https://rsnapshot.org/">rsnapshot</a>, an
    <a href="https://nathanrosenquist.com/tag/opensource/">open source</a> backup program for
    <a href="https://nathanrosenquist.com/tag/unix/">Unix</a> and Linux.
</p>

<p>
    I'm also extremely grateful to the current and former maintainers.
    Heartfelt thanks to David Cantrell, David Keegel, Benedikt Heine, and
    all of the many others who have contributed to the program over the
    years. It&lsquo;s better now than it has ever been.
</p>

<p>
    And of course thank you to Mike Rubel, who came up with the
    snapshot backup scripts that the program is based on.
</p>

<p><a href="https://rsnapshot.org/">rsnapshot - Official Web Site</a></p>

<p>
    <a href="https://archiveprogram.github.com/greatest-hits/">
        GitHub Archive Program - Greatest Hits
    </a>
</p>

<p>
    <a href="http://esr.ibiblio.org/?p=3124">
        Eric S. Raymond - rsnapshot: you&rsquo;re doing it right!
    </a>
</p>

<p>
    <a href="https://www.oreilly.com/library/view/backup-recovery/0596102461/">
        O&rsquo;Reilly - Backup &amp; Recovery, by W. Preston
    </a>
</p>

<p>
    <a href="https://www.oreilly.com/library/view/bsd-hacks/0596006799/">
        O&rsquo;Reilly - BSD Hacks, by Dru Lavigne
    </a>
</p>]]></description>
        <category>opensource</category>
        <category>unix</category>
        <pubDate>Mon, 26 Oct 2020 18:18:12 -0500</pubDate>
    </item>
    <item>
        <title>Flowblade</title>
        <link>https://nathanrosenquist.com/flowblade/</link>
        <description><![CDATA[<h1>Flowblade</h1>

<p><img src="https://nathanrosenquist.com/flowblade/flowblade.jpg"
        alt="Flowblade user interface"></p>

<p>
    <a href="https://jliljebl.github.io/flowblade/">Flowblade</a> is an
    <a href="https://nathanrosenquist.com/tag/opensource/">open source</a>, non-linear video
    editing program for Linux.  The primary author and lead developer is
    Janne Liljeblad.
</p>

<p>
    I contribute code to the project from time to time. Some of the
    highlights:

    <ul>
        <li>Added support for NTSC fractional frame rate timecode
            calculations</li>
        <li>Added atomic file write support for critical files to improve
            reliability</li>
        <li>Added structured audio timeline export to
            <a href="https://ardour.org/">Ardour</a> for post-production
            sound editing</li>
        <li>Added USB jog/shuttle support</li>
        <li>Various bug fixes</li>
    </ul>
</p>

<p>
    One of the cool things about open source software is that if you want to
    add a feature to a program, you can actually add it!
</p>

<p><a href="https://jliljebl.github.io/flowblade/">Flowblade - Official Web Site</a></p>]]></description>
        <category>filmmaking</category>
        <category>opensource</category>
        <category>python</category>
        <pubDate>Mon, 26 Oct 2020 03:12:35 -0500</pubDate>
    </item>
    <item>
        <title>Mamiya RB67 Extension Tube Light Loss</title>
        <link>https://nathanrosenquist.com/mamiya-rb67-extension-tube-light-loss/</link>
        <description><![CDATA[<h1>Mamiya RB67 Extension Tube Light Loss</h1>

<p>
    <img src="https://nathanrosenquist.com/mamiya-rb67-extension-tube-light-loss/mamiya-rb67-with-extension-tube.jpg"
         alt="Mamiya RB67 with extension tube">
</p>

<p>
    Below is a table that shows the light loss for every
    <a href="http://camera-wiki.org/wiki/Mamiya_RB67">Mamiya RB67</a> prime
    lens, when combined with each extension tube individually, and with both
    extension tubes together. This table also applies to the
    <a href="http://camera-wiki.org/wiki/Mamiya_RZ67">Mamiya RZ67</a>.
</p>

<table class="table_data">
    <tr>
        <th>Lens Focal Length</th>
        <th>No. 1 (45mm)</th>
        <th>No. 2 (82mm)</th>
        <th>No. 1 + No. 2 (127mm)</th>
    <tr>
    <tr style="text-align: right;">
        <td><b>37mm</b></td>
        <td>2.2 stops</td>
        <td>3.2 stops</td>
        <td>4.4 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>50mm</b></td>
        <td>1.9 stops</td>
        <td>2.6 stops</td>
        <td>3.5 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>65mm</b></td>
        <td>1.7 stops</td>
        <td>2.3 stops</td>
        <td>3.0 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>75mm</b></td>
        <td>1.6 stops</td>
        <td>2.1 stops</td>
        <td>2.7 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>90mm</b></td>
        <td>1.5 stops</td>
        <td>1.9 stops</td>
        <td>2.4 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>127mm</b></td>
        <td>1.4 stops</td>
        <td>1.6 stops</td>
        <td>2.0 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>140mm</b></td>
        <td>1.3 stops</td>
        <td>1.6 stops</td>
        <td>1.9 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>150mm</b></td>
        <td>1.3 stops</td>
        <td>1.5 stops</td>
        <td>1.8 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>180mm</b></td>
        <td>1.2 stops</td>
        <td>1.5 stops</td>
        <td>1.7 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>210mm</b></td>
        <td>1.2 stops</td>
        <td>1.4 stops</td>
        <td>1.6 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>250mm</b></td>
        <td>1.2 stops</td>
        <td>1.3 stops</td>
        <td>1.5 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>350mm</b></td>
        <td>1.1 stops</td>
        <td>1.2 stops</td>
        <td>1.4 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>360mm</b></td>
        <td>1.1 stops</td>
        <td>1.2 stops</td>
        <td>1.4 stops</td>
    </tr>
    <tr style="text-align: right;">
        <td><b>500mm</b></td>
        <td>1.1 stops</td>
        <td>1.2 stops</td>
        <td>1.3 stops</td>
    </tr>
</table>

<h2>Theory and Practice</h2>

<p>
    The Mamiya RB67 camera system has two different sizes of macro extension
    tubes available.
</p>

<ul>
    <li>The &ldquo;No. 1&rdquo; extension tube is 45mm long.</li>
    <li>The &ldquo;No. 2&rdquo; extension tube is 82mm long.</li>
</ul>

<p>
    It is also possible to connect the &ldquo;No. 1&rdquo; and &ldquo;No.
    2&rdquo; tubes together, for a total of 127mm of lens extension.
</p>

<p>
    Whenever you put a macro extension tube in between your lens and your
    camera, you will necessarily lose some light. Your f-stop is defined
    as the focal length of your lens divided by the width of the aperture.
    When you insert a lens extension tube, you are making the focal length
    of your lens longer, but the aperture stays the same size. Therefore,
    your <i>effective</i> f-stop becomes correspondingly smaller.
</p>

<p>
    For example, imagine that you are using the 127mm lens, and it is set
    to an aperture of f/4. This means that the aperture is 31.75mm, because
    127 divided by 4 is 31.75. Let&rsquo;s say that you add both macro
    extension tubes, which adds another 127mm to your focal length. Now, it's
    as if you are using a 254mm lens, but your aperture is still 31.75mm. 254
    divided by 31.75 is 8. Your new aperture after adding these extension
    tubes is effectively f/8, on a 254mm lens. An aperture of f/8 as compared
    to f/4 means that you have lost two stops of light in this scenario.
</p>

<p>
    You can calculate macro extension tube light loss yourself for any
    camera, any lens, and any length of extension tube. The formula is:
</p>

<p class="indent"><i>
    <b>( lens_focal_length + extension_tube_length ) / lens_focal_length</b>
</i></p>

<p>
    So, for example, if you have a 127mm lens, and a 45mm extension tube:
</p>

<p class="indent"><i>
    <nobr>( lens_focal_length + extension_tube_length ) / lens_focal_length</nobr><br>
    ( 127 + 45 ) / 127<br>
    172 / 127<br>
    1.3543307086614174<br>
</i></p>

<p>
    Then, after rounding to the nearest 1/10th of a stop, we get 1.4 stops of
    light loss. Then we can round some more because the Mamiya RB67 only lets
    you adjust the aperture in half stop increments. Assuming you are shooting
    negative film (which prefers overexposure to underexposure), your best bet
    in this case would be to overexpose by about 1.5 stops as compared to your
    meter reading to get a correct exposure.
</p>

<p>
    If doing math every time you change extension tubes sounds like a pain,
    you can also meter normally, and just plug the amount of macro extension
    tube light loss from the table above into the
    <a href="https://nathanrosenquist.com/photographic-exposure-calculator/">Photographic Exposure Calculator</a> on this
    website.
</p>]]></description>
        <category>film</category>
        <category>mamiyarb67</category>
        <category>mediumformat</category>
        <category>photography</category>
        <pubDate>Sun, 25 Oct 2020 23:24:16 -0500</pubDate>
    </item>
    <item>
        <title>Artisanal Lorem Ipsum</title>
        <link>https://nathanrosenquist.com/artisanal-lorem-ipsum/</link>
        <description><![CDATA[<h1>Artisanal Lorem Ipsum</h1>

<p><img src="https://nathanrosenquist.com/artisanal-lorem-ipsum/finnegans-wake.jpg" alt="Blurry picture of a book"></p>

<h2>Lorem Ipsum</h2>

<p><i>A <a href="https://en.wikipedia.org/wiki/Lorem_ipsum">true classic</a>. The one that started it all.</i></p>

<p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>

<h2>Doggo Ipsum</h2>

<p><i>
    From <a href="https://doggoipsum.com/">Doggo Ipsum</a>, the most trusted
    source for dog-themed lorem ipsum on the internet.
</i></p>

<p>Doggo ipsum borkf noodle horse you are doin me a concern pupper waggy wags, mlem big ol. Vvv smol sub woofer heckin good boys and girls super chub, very jealous pupper heckin angery woofer maximum borkdrive borkdrive, extremely cuuuuuute maximum borkdrive doing me a frighten. Many pats such treat much ruin diet length boy you are doin me a concern doggo the neighborhood pupper doge, sub woofer doggo puggo maximum borkdrive much ruin diet. super chub sub woofer. Pupperino doggorino snoot bork big ol, porgo borkdrive.  Porgo borkdrive you are doin me a concern aqua doggo pupperino very good spot wow very biscit heckin good boys smol mlem, big ol maximum borkdrive adorable doggo long woofer big ol pupper shibe you are doing me the shock. Puggorino wow very biscit pupper adorable doggo shooberino super chub, long woofer length boy very jealous pupper you are doing me a frighten ruff boof, you are doing me a frighten noodle horse dat tungg tho pats. Long doggo bork such treat puggo corgo, big ol you are doing me a frighten heckin good boys.</p>

<h2>Corporate Ipsum</h2>

<p><i>
    From <a href="https://www.corporate-ipsum.com/">Corporate Ipsum</a>, whose value
    proposition is right-sizing synergies on a go-forward basis in the
    pursuit of quality and excellence.
</i></p>

<p>Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.</p>

<p>Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.</p>

<p>Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.</p>

<h2>Lorem Gibson</h2>

<p><i>
    From <a href="http://loremgibson.com/">Lorem Gibson</a>.
    Based on the works of <a href="https://en.wikipedia.org/wiki/William_Gibson">William Gibson</a>,
    but run through a blender first.
</i></p>

<p>disposable pen voodoo god soul-delay modem euro-pop-ware fetishism office Legba semiotics courier. engine San Francisco monofilament 3D-printed dome office chrome lights shrine render-farm girl digital. otaku cartel motion semiotics rebar papier-mache market bridge convenience store range-rover. sunglasses industrial grade kanji lights drugs singularity paranoid systema construct towards realism. boy garage courier dome pre-computer youtube narrative tank-traps geodesic semiotics. faded Legba advert lights DIY rebar Kowloon face forwards nodality tower pen.</p>

<p>cyber-city spook dead paranoid-space footage refrigerator savant. shrine film math-drone systema rifle kanji-space jeans nodal point long-chain hydrocarbons. receding otaku denim numinous camera courier carbon pen computer man. woman futurity marketing wonton soup nodality saturation point sign modem post-rifle apophenia computer. carbon plastic long-chain hydrocarbons refrigerator city claymore mine tank-traps franchise BASE jump claymore mine vinyl assault dolphin singularity Tokyo motion saturation point garage drone courier camera corrupted drugs savant.</p>

<p>shoes engine man vinyl meta-euro-pop man assault carbon pistol military-grade beef noodles. savant dome pen physical realism knife lights-space tattoo digital plastic. woman industrial grade franchise hacker soul-delay dome tattoo 3D-printed military-grade spook bicycle Tokyo. realism tiger-team katana rain fluidity courier long-chain hydrocarbons cartel refrigerator long-chain hydrocarbons geodesic tank-traps. film nodal point fluidity tube alcohol savant shrine shanty town pen warehouse sign physical. tanto pen RAF stimulate artisanal rifle car Kowloon decay assault boat hacker.</p>

<h2>Hipster Ipsum</h2>

<p><i>From <a href="https://hipsum.co/">Hipster Ipsum</a>. Only use it ironically.</i></p>

<p>I'm baby distillery wolf green juice, taxidermy microdosing edison bulb tbh forage cloud bread brooklyn banh mi. Migas man bun PBR&B distillery, wolf intelligentsia activated charcoal plaid YOLO vice succulents prism before they sold out. Sartorial you probably haven't heard of them street art wayfarers XOXO jianbing neutra crucifix. Chillwave tbh affogato, venmo vice gluten-free shaman paleo kinfolk stumptown af. Pickled freegan yuccie glossier activated charcoal. Cornhole humblebrag mumblecore kickstarter, retro health goth chartreuse neutra bitters narwhal raw denim.</p>

<p>Chambray godard brunch offal adaptogen four dollar toast mlkshk cornhole pop-up snackwave. Pour-over cloud bread farm-to-table, paleo butcher migas XOXO irony offal. Shoreditch mustache helvetica la croix austin vaporware pop-up paleo next level everyday carry slow-carb jean shorts. Vice ethical portland subway tile ugh, affogato coloring book beard readymade humblebrag seitan godard pabst la croix. Mixtape vegan cray ugh copper mug coloring book. Adaptogen taxidermy wayfarers chambray letterpress.</p>

<p>Celiac try-hard occupy wayfarers chambray put a bird on it fashion axe hammock beard brunch copper mug. Vaporware truffaut woke, bushwick meditation offal shabby chic tousled yr pabst. Put a bird on it roof party cold-pressed blog vegan art party 3 wolf moon polaroid shabby chic iPhone. Pickled microdosing seitan lomo.</p>

<p>Hoodie unicorn fam, pork belly hell of tacos vice brooklyn flexitarian portland edison bulb. Readymade hella trust fund unicorn tattooed. Activated charcoal beard subway tile, distillery seitan cornhole vape intelligentsia hella pok pok pop-up everyday carry sriracha. Sustainable snackwave normcore, fanny pack helvetica brunch letterpress lumbersexual adaptogen yuccie single-origin coffee la croix poutine cronut artisan. Snackwave blue bottle four loko health goth yuccie. Keffiyeh synth mixtape, craft beer coloring book pabst listicle woke. Iceland umami venmo shoreditch fashion axe selvage.</p>

<h2>Gothic Ipsum</h2>

<p><i>
    From <a href="https://gothicipsum.com/">Gothic Ipsum</a>.
    I wish I was born in the seventeenth century.
</i></p>

<p>Friendless inexorably chapel darkness hesitation alarum raven? Prudent take the air moon veil shrouded blind familiar. Bitter, reverie lustreless cold heavy-hearted ill health darkening hale hour seraph. Voluminous stricken languid, gossamer veil dolorous nothing subterraneous interminable all-encompassing, abject bethought anguish. Lustre crimson cadence cadaverously Faustian deathly fervent state chamber ossification. Hale doomed horrific austere choler. Miserable black shadowed, casket brocade. Masonry innocent cadence alas ash. Somnambulist impassive torrent cast. Dignified gaunt curiously aquiline prudent rapturous innocent reverence love grotto haunted asylum lurking ad Misericordiam singular blind? I fear that my fateful betrayal uncanny demure caretaker dismay servant form; funereal, phantasm suffer myself to ruinous choler mournfully?</p>

<p>Gaunt coach and six plight suffocating shunned manorial smothered guilt all-encompassing revealed broken. Ossification versipellous hour coach and six misdeeds aberrant too great a passion. Pale evinced fog take the air wakened wandering alabaster untainted caretaker. Casket, dull fallen shorn revealed curiously perfectly admonition ineffable smothered. Wakened wicked ethereal ashes drawing martyred silken mysterious grotesquerie preternatural. Lurking fog doorstep twilight nightfall, cadence suffer dull dignity lachrymose. Raven uncanny despairing morose rapturous.</p>

<p>Memory, moors shadowed secretive too great a passion madness sullen take the air condemnatory manorial; undaunted ruin. Laconic fearful punctilious unwonted. Arcane spectre dismal give way to; faculty cadaverously. Ridden revelation oblivion chapel immortal. Shunned beyond such tower averse lightless composed grotto soured grotesquerie pronounced palliative. Admonition deathly upon undaunted. Spirit lassitude dreary dirge darkly unceasing. Suffer rapturous diminish pitiable darkened maddening piety fearful state ethereal concupiscence I know not why.</p>

<h2>Turbo Encabulator</h2>

<p><i><a href="https://www.cnet.com/roadshow/news/turbo-encabulator-history-engineers-joke/">A classic engineering joke dating back to 1944.</a></i></p>

<p>For a number of years now, work has been proceeding in order to bring perfection to the crudely conceived idea of a transmission that would not only supply inverse reactive current for use in unilateral phase detractors, but would also be capable of automatically synchronizing cardinal grammeters. Such an instrument is the turbo encabulator.</p>

<p>Now basically the only new principle involved is that instead of power being generated by the relative motion of conductors and fluxes, it is produced by the modial interaction of magneto-reluctance and capacitive diractance.</p>

<p>The original machine had a base plate of pre-famulated amulite surmounted by a malleable logarithmic casing in such a way that the two spurving bearings were in a direct line with the panametric fan. The latter consisted simply of six hydrocoptic marzlevanes, so fitted to the ambifacient lunar waneshaft that side fumbling was effectively prevented.</p>

<p>The main winding was of the normal lotus-o-delta type placed in panendermic semi-boloid slots of the stator, every seventh conductor being connected by a non-reversible tremie pipe to the differential girdle spring on the &ldquo;up&rdquo; end of the grammeters.</p>

<p>The turbo-encabulator has now reached a high level of development, and it’s being successfully used in the operation of novertrunnions. Moreover, whenever a forescent skor motion is required, it may also be employed in conjunction with a drawn reciprocation dingle arm, to reduce sinusoidal repleneration.</p>

<h2>Finnegans Wake</h2>

<p><i>The first page of <a href="https://archive.org/details/in.ernet.dli.2015.207614">Finnegans Wake</a>, the final book by <a href="https://en.wikipedia.org/wiki/James_Joyce">James Joyce</a>. A work of literature by a serious, acclaimed novelist. And if you like this, go read the book. It goes on like this for 628 pages!</i></p>

<p>riverrun, past Eve and Adam&rsquo;s, from swerve of shore to bend of bay, brings us by a commodius vicus of recirculation back to Howth Castle and Environs.</p>

<p>Sir Tristram, violer d&rsquo;amores, fr&rsquo;over the short sea, had passencore rearrived from North Armorica on this side the scraggy isthmus of Europe Minor to wielderfight his penisolate war: nor had topsawyer&rsquo;s rocks by the stream Oconee exaggerated themselse to Laurens County&rsquo;s gorgios while they went doublin their mumper all the time: nor avoice from afire bellowsed mishe mishe to tauftauf thuartpeatrick: not yet, though venissoon after, had a kidscad buttended a bland old isaac: not yet, though all&rsquo;s fair in vanessy, were sosie sesthers wroth with twone nathandjoe. Rot a peck of pa&rsquo;s malt had Jhem or Shen brewed by arclight and rory end to the regginbrow was to be seen ringsome on the aquaface.</p>

<p>The fall (bababadalgharaghtakamminarronnkonnbronntonner- ronntuonnthunntrovarrhounawnskawntoohoohoordenenthur- nuk!) of a once wallstrait oldparr is retaled early in bed and later on life down through all christian minstrelsy. The great fall of the offwall entailed at such short notice the pftjschute of Finnegan, erse solid man, that the humptyhillhead of humself prumptly sends an unquiring one well to the west in quest of his tumptytumtoes: and their upturnpikepointandplace is at the knock out in the park where oranges have been laid to rust upon the green since devlinsfirst loved livvy.</p>]]></description>
        <category>nonsense</category>
        <pubDate>Sat, 24 Oct 2020 23:19:38 -0500</pubDate>
    </item>
    <item>
        <title>Photo Gallery: Various</title>
        <link>https://nathanrosenquist.com/photos/various/</link>
        <description><![CDATA[<h1>Photo Gallery: Various</h1>

<p><a href="https://nathanrosenquist.com/photos/various/"><img src="https://nathanrosenquist.com/photos/various/purple-sky/thumbnail.jpg" alt="Purple Sky"></a></p>
<p><a href="https://nathanrosenquist.com/photos/various/">Click to view &ldquo;Various&rdquo; photo gallery.</a></p>

<p>Odds and ends.</p>]]></description>
        <pubDate>Thu, 22 Oct 2020 23:00:00 -0500</pubDate>
    </item>
    <item>
        <title>Film Leaders</title>
        <link>https://nathanrosenquist.com/film-leaders/</link>
        <description><![CDATA[<h1>Film Leaders</h1>

<video style="width: 800px;" controls poster="/film-leaders/movie.png">
    <source src="/film-leaders/movie.mp4" type="video/mp4">
    Your browser does not support the video tag.
</video>

<p>
    On this page you can find universal
    <a href="https://en.wikipedia.org/wiki/Film_leader">film leaders</a>
    available for download. Both head and tail leaders are included.
    The <a href="https://en.wikipedia.org/wiki/2-pop">2-pop</a> shows up
    in all the right places.
</p>

<p>Available in HD and DCI 2K/4K/8K resolutions. 23.976 frame rate only (NTSC).</p>

<p>The videos are encoded using the Apple ProRes 422 codec.</p>

<p>
    Use these on your next film, TV, or video project to make sure everything
    stays in sync when moving from editorial to sound and back again.
</p>

<h2>Download</h2>

<p>
    <a href="https://nathanrosenquist.com/film-leaders/Film Leaders 2K HD 23.976.zip">Film Leaders 2K HD 23.976</a><br>
    <a href="https://nathanrosenquist.com/film-leaders/Film Leaders 2K DCI 23.976.zip">Film Leaders 2K DCI 23.976</a><br>
    <a href="https://nathanrosenquist.com/film-leaders/Film Leaders 4K UHD 23.976.zip">Film Leaders 4K UHD 23.976</a><br>
    <a href="https://nathanrosenquist.com/film-leaders/Film Leaders 4K DCI 23.976.zip">Film Leaders 4K DCI 23.976</a><br>
    <a href="https://nathanrosenquist.com/film-leaders/Film Leaders 8K UHD 23.976.zip">Film Leaders 8K UHD 23.976</a><br>
    <a href="https://nathanrosenquist.com/film-leaders/Film Leaders 8K DCI 23.976.zip">Film Leaders 8K DCI 23.976</a><br>
</p>]]></description>
        <category>downloads</category>
        <category>filmmaking</category>
        <pubDate>Sun, 18 Oct 2020 21:50:57 -0500</pubDate>
    </item>
    <item>
        <title>Photographic Exposure Calculator</title>
        <link>https://nathanrosenquist.com/photographic-exposure-calculator/</link>
        <description><![CDATA[<h1>Photographic Exposure Calculator</h1>

<p><img src="https://nathanrosenquist.com/photographic-exposure-calculator/light-meter.jpg"
        alt="Analog light meter"></p>

<p class="bigtext">
    <a href="https://nathanrosenquist.com/photographic-exposure-calculator/mobile/">
        <b>Click here for the exposure calculator</b>
    </a>
</p>

<p>
    The exposure calculator is designed to be used on a mobile phone, on a
    single dark page, without any distractions. The rest of this page contains
    instructions on how to use the exposure calculator, including how to
    install it as an app on your phone.
</p>

<h2>About</h2>

<p>This is a photographic exposure calculator. It can help you calculate
   manual exposure settings in tricky situations.</p>

<p>Use this exposure calculator in these scenarios:</p>

<ul>
    <li>
        <a href="https://nathanrosenquist.com/tag/longexposure/">Long exposures</a>, on
        digital or <a href="https://nathanrosenquist.com/tag/film/">film</a>
    </li>
    <li>
        Using an external light meter along with filters on your camera
    </li>
    <li>
        Using
        <a href="https://nathanrosenquist.com/mamiya-rb67-extension-tube-light-loss/">
        macro extension tubes</a>
    </li>
    <li>
        Using a large or
        <a href="https://nathanrosenquist.com/tag/mediumformat/">medium format</a>
        camera with bellows, focused in close
    </li>
    <li>
        <a href="https://nathanrosenquist.com/tag/pinhole/">Pinhole</a> photography
    </li>
</ul>

<h2>Instructions</h2>

<ul>
    <li>
        Use a light meter to meter the scene.
    </li>
    <li>
        Plug the metered ISO, aperture, and shutter values into the
        <i>Metered Exposure</i> section.
    </li>
    <li>
        Use the <i>Light Loss</i> section to add the number of stops of light
        loss from your filters, macro extension tubes, and bellows extension.
    </li>
    <li>
        If you are shooting on film, you can select from a list of available
        film stocks to calculate reciprocity failure for long exposures.
    </li>
    <li>
        The <i>Priority</i> setting controls whether the possible exposures
        will try to match the aperture or shutter setting from your metered
        exposure.
    </li>
    <li>
        Use the <i>Possible Exposures</i> section to see the range of possible
        aperture and shutter settings that will result in a correct exposure.
    </li>
    <li>
        Dial your preferred aperture/exposure combination into your camera,
        and take a picture.
    </li>
</ul>

<h2>Installing on an iPhone</h2>

<p>
    The exposure calculator is implemented as a progressive web app in
    <a href="https://nathanrosenquist.com/tag/javascript/">Javascript</a>, and performs all of
    its calculations locally on your device. Once the exposure calculator is
    installed on your phone, it no longer requires an internet connection
    to function.
</p>

<ol>
    <li>
        Navigate to the actual
        <a href="https://nathanrosenquist.com/photographic-exposure-calculator/mobile/">exposure calculator</a>
        page in Safari.
    </li>
    <li>Tap on the <i>share</i> icon in Safari. It looks like a little box, with an upward facing arrow.</li>
    <li>Select &ldquo;Add to Home Screen&rdquo;</li>
    <li>Hit the &ldquo;Add&rdquo; button</li>
</ol>

<p>
    At this point, if all went well, you should have an icon for the exposure
    calculator on your phone, alongside your other apps.
</p>

<p>
    Please note that iOS changes all the time, and you might need to adapt a little
    bit if these instructions don&lsquo;t precisely describe what you see on
    your phone.
</p>

<p>
    If the method above doesn&lsquo;t work for some reason, you can also add the actual
    <a href="https://nathanrosenquist.com/photographic-exposure-calculator/mobile/">exposure calculator</a>
    page to your reading list in Safari, and access it that way.
</p>

<h2>Installing on Android / Chrome / etc.</h2>

<p>
    The exposure calculator is a progressive web app. It is likely to work on
    Android or other similar platforms as well. I just don&lsquo;t have them
    available for testing. I recommend looking up how to install a
    progressive web app (PWA) on your platform of choice.
</p>]]></description>
        <category>film</category>
        <category>interactive</category>
        <category>javascript</category>
        <category>longexposure</category>
        <category>mediumformat</category>
        <category>photography</category>
        <category>pinhole</category>
        <pubDate>Sun, 01 Dec 2019 16:44:48 -0500</pubDate>
    </item>
    <item>
        <title>contact-sheet</title>
        <link>https://nathanrosenquist.com/contact-sheet/</link>
        <description><![CDATA[<h1>contact-sheet</h1>

<p>
    contact-sheet is a Python script to turn a big directory full of photos
    into a bunch of thumbnails and HTML pages. If you have an enormous
    amount of photos on disk and browsing them is cumbersome,
    contact-sheet can give you a quick overview of what you have. I wrote
    it over the course of a few evenings in 2018.
</p>

<p>Here's a screen shot to give you a sense of what the output looks like:</p>

<img src="https://nathanrosenquist.com/contact-sheet/screenshot.jpg">

<h2>Download</h2>

<p>
    <a href="https://nathanrosenquist.com/contact-sheet/contact-sheet-0.2.tar.gz">contact-sheet-0.2.tar.gz</a>
    <br>

    <a href="https://nathanrosenquist.com/contact-sheet/ubuntu-font-family-0.83.zip">ubuntu-font-family-0.83.zip
    (dependency)</a>
</p>]]></description>
        <category>downloads</category>
        <category>opensource</category>
        <category>photography</category>
        <category>python</category>
        <category>unix</category>
        <pubDate>Wed, 18 Apr 2018 00:00:00 -0500</pubDate>
    </item>
    <item>
        <title>Metro Golden Maple</title>
        <link>https://nathanrosenquist.com/metro-golden-maple/</link>
        <description><![CDATA[<h1>Metro Golden Maple</h1>

<video style="width: 800px;" controls loop poster="/metro-golden-maple/movie.jpg">
    <source src="/metro-golden-maple/movie.mp4" type="video/mp4">
    Your browser does not support the video tag.
</video>]]></description>
        <category>dog</category>
        <category>filmmaking</category>
        <category>lighting</category>
        <category>maple</category>
        <category>nonsense</category>
        <pubDate>Sun, 08 Jan 2017 12:32:47 -0500</pubDate>
    </item>
    <item>
        <title>Johnny Awful</title>
        <link>https://nathanrosenquist.com/johnny-awful/</link>
        <description><![CDATA[<h1>Johnny Awful</h1>

<video style="width: 800px;" controls poster="/johnny-awful/movie.jpg">
    <source src="/johnny-awful/movie.mp4" type="video/mp4">
    Your browser does not support the video tag.
</video>

<p>
    <i>Johnny Awful</i> is a short film about rock and roll, lies, death,
    burning bridges, hoaxes, manipulation, and the fleeting nature of fame.
    It's a comedy. The film taps into the world of unsigned bands, the
    mythology of dead rock stars, and the problems that come with an
    entitlement mentality.
</p>

<p>
    I wrote and directed this film back in 2012. It would not have been
    possible without the help of a <i>lot</i> of great people!
</p>

<p><a href="https://www.imdb.com/title/tt2882148/">Johnny Awful on IMDb</a></p>]]></description>
        <category>filmmaking</category>
        <category>lighting</category>
        <pubDate>Sat, 01 Sep 2012 00:00:00 -0500</pubDate>
    </item>
    <item>
        <title>Nutmeg Goes For A Ride</title>
        <link>https://nathanrosenquist.com/nutmeg-goes-for-a-ride/</link>
        <description><![CDATA[<h1>Nutmeg Goes For A Ride</h1>

<video style="width: 800px;" controls poster="/nutmeg-goes-for-a-ride/movie.jpg">
    <source src="/nutmeg-goes-for-a-ride/movie.mp4" type="video/mp4">
    Your browser does not support the video tag.
</video>]]></description>
        <category>dog</category>
        <category>doggles</category>
        <category>filmmaking</category>
        <category>nutmeg</category>
        <category>street</category>
        <category>trees</category>
        <pubDate>Sun, 06 Mar 2011 01:29:50 -0500</pubDate>
    </item>
    <item>
        <title>xor</title>
        <link>https://nathanrosenquist.com/xor/</link>
        <description><![CDATA[<h1>xor</h1>

<p><img src="https://nathanrosenquist.com/xor/otp.jpg"
        alt="LFHNY ZAHSB JRNXK BYNFY"></p>

<p>
    This is an ANSI C implementation of both binary XOR and classic A-Z one
    time pad encryption. It does not generate keys. For best results, use
    truly random numbers, such as from a hardware random number generator, or
    by picking Scrabble tiles at random.
</p>

<p>
    One-time pad encryption is the only known theoretically unbreakable
    encryption available. However, it requires perfectly random numbers,
    completely secure key distribution, and each key can only be used once.
    This makes it highly impractical compared to most modern cryptography.
</p>

<p>
    The <a href="https://www.cryptomuseum.com/crypto/otp/">Crypto Museum</a>
    has more information about how one-time pads were used historically by
    spies during the Cold War.
</p>

<h2>Download</h2>

<p><a href="https://nathanrosenquist.com/xor/xor-1.0.0.tar.gz">xor-1.0.0.tar.gz</a></p>

<h2>Usage</h2>

<pre>------------------------------------------------------------------------------
xor 1.0.0
Usage: xor [-edx] keyfile [sourcefile] > outfile
------------------------------------------------------------------------------

xor implements both symmetrical binary XOR encryption/decryption, and the
classic One Time Pad encryption using only the capital letters A-Z.

You must specify a keyfile to use on the command line, and the source
data to be encrypted/decrypted can come from either a file specified
as the second argument, or from standard input.

The default mode of operation is XOR, which allows completely symmetrical
binary encryption/decryption both ways.

The classic One Time Pad using only capital letters is also implemented,
and requires the -e or -d flags for encrypt or decrypt mode.

The keyfile must contain either a series of truly random bits (such as
from a hardware random number generator, /dev/random isn't good enough),
or a series of random capital letters in the case of classic A-Z encryption.
The security of either method is only as good as the random numbers used.
Keys should be used only once, and then destroyed by both the sender and
recipient.

Some examples:

  XOR (binary) encryption:
    xor keyfile [sourcefile] > encrypted_file

  XOR (binary) decryption:
    xor keyfile [sourcefile] > original_file

  OTP classic A-Z encryption (key and source data must be all capital letters):
    xor -e keyfile [sourcefile] > encrypted_file

  OTP classic A-Z encryption (key and source data must be all capital letters):
    xor -d keyfile [sourcefile] > original_file</pre>]]></description>
        <category>c</category>
        <category>downloads</category>
        <category>history</category>
        <category>opensource</category>
        <category>unix</category>
        <pubDate>Thu, 16 Mar 2006 00:00:00 -0500</pubDate>
    </item>
    <item>
        <title>setuid-wrapper</title>
        <link>https://nathanrosenquist.com/setuid-wrapper/</link>
        <description><![CDATA[<h1>setuid-wrapper</h1>

<p>
    This is example C source code for a setuid wrapper program. This can be
    useful if you have a script that you want unprivileged users to be able
    to run with root permissions. All the usual security disclaimers apply.
</p>

<code><div class="highlight"><pre><span></span><span class="cm">/*</span>
<span class="cm"> * setuid-wrapper.c</span>
<span class="cm"> * by Nathan Rosenquist</span>
<span class="cm"> * https://nathanrosenquist.com/setuid-wrapper/</span>
<span class="cm"> *</span>
<span class="cm"> * This is a setuid program that simply becomes root and calls the</span>
<span class="cm"> * given script / executable. You will need to adapt it to your</span>
<span class="cm"> * particular situation. In particular, you will probably want to change</span>
<span class="cm"> * the following #define statements:</span>
<span class="cm"> *</span>
<span class="cm"> *   PROGRAM_NAME   this should match whatever you rename this program to</span>
<span class="cm"> *                  (e.g. my-program)</span>
<span class="cm"> *</span>
<span class="cm"> *   CMD_PATH       this should point to the full path of your script</span>
<span class="cm"> *                  (e.g. /usr/local/bin/my-program.py)</span>
<span class="cm"> *</span>
<span class="cm"> * Running programs setuid introduces the possibility of a root compromise.</span>
<span class="cm"> * Please only use this program if you already know what you are doing, and</span>
<span class="cm"> * have a concrete plan to keep your system safe. Please make sure you</span>
<span class="cm"> * understand all of the concepts involved with this program and the</span>
<span class="cm"> * possible failure modes before using this in a production environment.</span>
<span class="cm"> * You have been warned!</span>
<span class="cm"> *</span>
<span class="cm"> * To compile:</span>
<span class="cm"> *</span>
<span class="cm"> * cc -Wall -Werror --pedantic --ansi --static setuid-wrapper.c -o my-program</span>
<span class="cm"> *</span>
<span class="cm"> * To install:</span>
<span class="cm"> *</span>
<span class="cm"> * sudo cp my-program /usr/local/bin/my-program</span>
<span class="cm"> * sudo chown root:my-allowed-group /usr/local/bin/my-program</span>
<span class="cm"> * sudo chmod 4750 /usr/local/bin/my-program</span>
<span class="cm"> *</span>
<span class="cm"> * This code is placed in the public domain.</span>
<span class="cm"> */</span>

<span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;sys/types.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;errno.h&gt;</span><span class="cp"></span>

<span class="cm">/* the name of this wrapper program */</span>
<span class="cp">#define PROGRAM_NAME &quot;setuid-wrapper&quot;</span>

<span class="cm">/* the command to execute */</span>
<span class="cp">#define CMD_PATH &quot;/usr/bin/id&quot;</span>

<span class="cm">/* exit code */</span>
<span class="cp">#define EXIT_FAIL 1</span>

<span class="cm">/* environment variable pointer */</span>
<span class="k">extern</span> <span class="kt">char</span> <span class="o">**</span><span class="n">environ</span><span class="p">;</span>

<span class="cm">/* function prototypes */</span>
<span class="kt">int</span> <span class="nf">setenv</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">name</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">value</span><span class="p">,</span> <span class="kt">int</span> <span class="n">overwrite</span><span class="p">);</span>
<span class="kt">int</span> <span class="nf">setreuid</span><span class="p">(</span><span class="kt">uid_t</span> <span class="n">ruid</span><span class="p">,</span> <span class="kt">uid_t</span> <span class="n">euid</span><span class="p">);</span>
<span class="kt">int</span> <span class="nf">setregid</span><span class="p">(</span><span class="kt">gid_t</span> <span class="n">rgid</span><span class="p">,</span> <span class="kt">gid_t</span> <span class="n">egid</span><span class="p">);</span>
<span class="kt">int</span> <span class="nf">execve</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">filename</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="k">const</span> <span class="n">argv</span><span class="p">[],</span> <span class="kt">char</span> <span class="o">*</span><span class="k">const</span> <span class="n">envp</span><span class="p">[]);</span>
<span class="kt">void</span> <span class="nf">perror</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">s</span><span class="p">);</span>

<span class="cm">/* main program */</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
    <span class="cm">/* declare variable to capture system call results */</span>
    <span class="kt">int</span> <span class="n">result</span><span class="p">;</span>

    <span class="cm">/* construct the command that we want to execute */</span>
    <span class="kt">char</span> <span class="o">*</span><span class="n">cmd</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
    <span class="n">cmd</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">CMD_PATH</span><span class="p">;</span>
    <span class="n">cmd</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>

    <span class="cm">/* clear all existing environment variables */</span>
    <span class="n">environ</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>

    <span class="cm">/* overwrite the PATH environment variable with something sensible */</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">setenv</span><span class="p">(</span>
        <span class="s">&quot;PATH&quot;</span><span class="p">,</span>
        <span class="s">&quot;/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin&quot;</span><span class="p">,</span>
        <span class="mi">1</span>
    <span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="mi">0</span> <span class="o">!=</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">perror</span><span class="p">(</span><span class="n">PROGRAM_NAME</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">EXIT_FAIL</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="cm">/* set real and effective user id to root */</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">setreuid</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="mi">0</span> <span class="o">!=</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">perror</span><span class="p">(</span><span class="n">PROGRAM_NAME</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">EXIT_FAIL</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="cm">/* set real and effective group id to root */</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">setregid</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="mi">0</span> <span class="o">!=</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">perror</span><span class="p">(</span><span class="n">PROGRAM_NAME</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">EXIT_FAIL</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="cm">/* exec command */</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">execve</span><span class="p">(</span><span class="n">cmd</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">cmd</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="mi">0</span> <span class="o">!=</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">perror</span><span class="p">(</span><span class="n">PROGRAM_NAME</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">EXIT_FAIL</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;%s: could not execute command</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">PROGRAM_NAME</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">EXIT_FAIL</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</code>

<h2>Download</h2>

<p><a href="https://nathanrosenquist.com/setuid-wrapper/setuid-wrapper.c">setuid-wrapper.c</a></p>]]></description>
        <category>c</category>
        <category>downloads</category>
        <category>opensource</category>
        <category>unix</category>
        <pubDate>Mon, 08 Aug 2005 00:00:00 -0500</pubDate>
    </item>
    <item>
        <title>Game Boy Advance Video Poker</title>
        <link>https://nathanrosenquist.com/gba-video-poker/</link>
        <description><![CDATA[<h1>Game Boy Advance Video Poker</h1>

<p>
    <img src="https://nathanrosenquist.com/gba-video-poker/title.gif">
    <img src="https://nathanrosenquist.com/gba-video-poker/game.gif">
</p>

<p>
    This is a little project I created just for fun many years ago. It's a
    simple video poker game, written for the Nintendo Game Boy Advance.
</p>

<p>
    To play the game, you have to download the ROM, and install a Game Boy
    Advance emulator. Then you load the ROM up in the emulator.
</p>

<p>The source code is also available.</p>

<p>Both the source code and the game are placed in the public domain.</p>

<h2>Download</h2>

<p><a href="https://nathanrosenquist.com/gba-video-poker/poker.zip">Video Poker (Game Boy Advance ROM)</a></p>

<p><a href="https://nathanrosenquist.com/gba-video-poker/gba-video-poker.tar.gz">Video Poker (C Source Code)</a></p>]]></description>
        <category>c</category>
        <category>downloads</category>
        <category>opensource</category>
        <pubDate>Wed, 01 Jan 2003 00:00:00 -0500</pubDate>
    </item>
</channel>
</rss>
