<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us">
  <title type="text">Texas Expat</title>
  <subtitle type="text"></subtitle>
  <id>http://texasexpat.net/</id>
  <link rel="alternate" type="application/xhtml+xml" href="http://texasexpat.net/" />
  <link rel="self" type="application/atom+xml" href="http://texasexpat.net/atom.xml"/>
  <author>
    <name>Trevor Fountain</name>
    <email>trevor@blazinggriffin.com</email>
  </author>
  <rights>Creative Commons Attribution-NonCommercial 3.0 Unported</rights>
  <generator uri="http://www.sixapart.com/movabletype/" version="5.2.13">Movable Type</generator>
  
  
  <updated>2021-07-19T12:46:40Z</updated>
  <entry>
    <title type="text">Stop tracking TODOs. Start getting things DONE.</title>
    <summary type="text">I don't know about you, but I'm an absolute sucker for productivity systems. Cards, pomodoro, todo lists -- I've tried 'em all, and stuck with a few. But the only thing I've found that actually encourages me to get shit...</summary>
    <content type="html"><![CDATA[<p>I don't know about you, but I'm an absolute <em>sucker</em> for productivity systems. Cards, pomodoro, todo lists -- I've tried 'em all, and stuck with a few. But the only thing I've found that actually encourages me to <em>get shit done</em> and doesn't encourage me to waste time organising lists and making plans is keeping a done list.</p>

<p>What's a done list? Think of it as an anti-TODO list: your DONE list is where you write down everything that you've, well, done. You know that little dopamine kick you get from filing a neatly-tagged TODO or marking off something that you've finished? A done list is <em>just that</em>, and the only way to use it is to train yourself to stop organising and just get stuff done. </p>

<p>Try keeping your own done list for a week, and you'll be amazed at how you can hack your brain into actively looking for projects you can finish and tasks you can check off, just so you can write down one more thing as DONE. You don't need fancy tools to write down a list, but if you're like me and you <em>like</em> having fancy tools check out <a href="Donel.ist">https://donel.ist</a> -- the fast, easy-to-use done list tracker I built for myself. It's 100% free (no ads, "pro" tiers, or feature unlocks). And if you want to automate your done list or use it to automate other things, there's an easy-to-use <a href="https://donel.ist/developer">REST API</a> too.</p>

<p><img src="https://donel.ist/donelist_opengraph.png" alt="Donel.ist" title="" /></p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2021/07/stop-tracking-todos-start-getting-things-done</id>
    <link rel="alternate" href="http://texasexpat.net/2021/07/stop-tracking-todos-start-getting-things-done" type="application/xhtml+xml" hreflang="en" />
    <published>2021-07-19T12:44:45Z</published>
    <updated>2021-07-19T12:46:40Z</updated>
  </entry>
  <entry>
    <title type="text">12 Startups in 12 Months</title>
    <summary type="text">Way back in the halcyon days of September 2010, I threw my hat in the ring for the first Ludum Dare October Challenge, where a bunch of hobbyist gamedevs built indie games in public, for a month, with the end...</summary>
    <content type="html"><![CDATA[<p>Way back in the halcyon days of September 2010, I threw my hat in the ring for the first <a href="https://expatgames.net/2010/09/distant-star">Ludum Dare October Challenge</a>, where a bunch of hobbyist gamedevs built indie games in public, for a month, with the end
 goal of getting them out for sale before the end of October. The idea was to turn a bunch of hobbyists (i.e., us) into professionals (i.e., what we wanted to be) -- and if the definition of a "professional" is "someone who gets paid for their work", well, 
all we had to do was make a game, release it, and earn at least $1 from it.</p>

<p>Fast forward to 2020, and even though I've been out of the games industry for almost a decade (I did, in fact, <a href="https://expatgames.net/2011/06/distant-star-a-retrospective-with-numbers">win my own personal October challenge</a>) that idea of the October challenge has stuck with me ever since. 
After leaving Palantir (I was, ahem, <strong>fired</strong> -- let's not mince words, there) I spent the next year getting, well, basically nothing done. I kept <a href="https://quailhq.com">Quail</a> ticking over, 
responded to a zillion bug reports and requests for help, and generally kept things on an even keel. But no new projects really made it out into the world.</p>

<p>Turns out being fired, even from a job you hate, can really <em>knock the professional/creative stuffing out of you</em>. Who knew?</p>

<p>But from March 2021, that's changing! To kick myself back into entrepreneurial thinking I'm setting myself a possibly-unrealistic goal of launching 12 projects in the next year, one per month from April 2021 until at least April 2022. I'm two months into this meta-project, and so far I'm two for two:</p>

<ul>
<li>in April 2021 Chris and I launched <a href="https://sandpiperhq.com">Sandpiper</a> -- an inventory tracking tool for people who hate inventory tracking.</li>
<li>in May 2021 I conceived, built, and launched <a href="https://saascast.io">Saascast</a> -- a neat little tool that shows you your Stripe dashboard, but <em>from the future</em>.</li>
</ul>

<p>...and so far I'm on track to ship <a href="https://donel.ist">Donel.ist</a> in June 2021 -- a place to throw away your TODOs and track your done list (sneak peek at a public list here: <a href="https://donel.ist/u/doches">donel.ist/u/doches</a>).</p>

<p>Are these amazing business ideas? No, not really. Are they flawlessly executed, investor-ready products with product-market fit and a knockout marketing story? Of course not. But designing them, building them, and getting them out the door (plus marketing, feedback, maintenance, &amp;c) is forcing
 me to work out muscles that I've let atrophy for far, far too long. Forward to 2021 -- let's mint some new <em>Founders</em>, shall we?</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2021/05/12-startups-in-12-months</id>
    <link rel="alternate" href="http://texasexpat.net/2021/05/12-startups-in-12-months" type="application/xhtml+xml" hreflang="en" />
    <published>2021-05-27T15:00:28Z</published>
    <updated>2021-05-27T15:23:00Z</updated>
  </entry>
  <entry>
    <title type="text">Quick Bootstrapping with Yeoman</title>
    <summary type="text">When I started at my last-but-one job, my very first task was to take a whole bunch of internal coding &#8220;best practice&#8221; formalisms and find a way to gently enforce them on new projects. For my first pass at this...</summary>
    <content type="html"><![CDATA[<p>When I started at my last-but-one job, my very first task was to take a whole bunch of internal coding &#8220;best practice&#8221; formalisms and find a way to gently enforce them on new projects.
For my first pass at this I set up a couple of git repositories: one frontend, one backend. Whenever you started a new project, the rule was that you started off by forking from the relevant &#8220;standard&#8221; repo.
This&#8230;worked, but that tedious rename-and-update-everything step never really sat right with me, or the rest of my team.</p>

<p>A couple of years later we came across <a href="https://yeoman.io">Yeoman</a>, a general-purpose tool for scaffolding new projects. It made our cumbersome git repos look <em>amazingly</em> cumbersome by comparison &#8212; and just a few months after I refactored our standard repositories into Yeoman generators, we were getting serious results.
People were experimenting with new projects, structuring code in a sane way instead of cutting corners and just sticking it in some place that already worked. 
We started moving faster, and &#8212; true miracle &#8212; we noticed a few months later that we weren&#8217;t getting bogged down in anything like as much technical debt as before.</p>

<p>Ever since then, I&#8217;ve tried to maintain a similar set of standard generators for myself. At the moment, my preferred tech stack for personal projects is <a href="https://mcfunley.com/choose-boring-technology">deeply boring</a>: Java+Dropwizard on the backend, and Typescript+React on the frontend. Pretty much any new project I start, or new idea I want to play around with, starts with either:</p>

<p><code>
yo dropwizard-gradle
</code></p>

<p>&#8230;for a backend service that&#8217;s turnkey-deployable, or:</p>

<p><code>
yo tfountain-webstack
</code></p>

<p>&#8230;for a bare-bones single-page web app that&#8217;s ready for hacking. If either of those sound like your cup of (instant) tea, you can grab respective Yeoman generators from <a href="https://github.com/doches/generator-dropwizard-gradle">doches/generator-dropwizard-gradle</a> and <a href="https://github.com/doches/generator-tfountain-webstack">doches/generator-tfountain-webstack</a>, or just install &#8216;em with <code>yarn global add generator-dropwizard-gradle generator-tfountain-webstack</code>. </p>

<p>But what I&#8217;d <em>really</em> suggest you do is look at &#8216;em as meta-templates, and maintain your own personal generator. 
Just the act of keeping these two up to date has forced me to stay on top of upgrades, changing trends, and new technologies that I might have missed otherwise.
And those changes get more-or-less <em>automatically</em> rolled into everything I do over time.</p>

<p>Also, Yeoman&#8217;s just a dude.</p>

<pre>
     _-----_     
    |       |    ╭──────────────────────────╮
    |--(o)--|    │        Welcome to        │
   `---------´   │    tfountain-webstack    │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |     
   __'.___.'__   
 ´   `  |° ´ Y ` 
</pre>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2020/02/quick-bootstrapping-with-yeoman</id>
    <link rel="alternate" href="http://texasexpat.net/2020/02/quick-bootstrapping-with-yeoman" type="application/xhtml+xml" hreflang="en" />
    <published>2020-02-23T22:28:28Z</published>
    <updated>2020-02-23T22:48:17Z</updated>
  </entry>
  <entry>
    <title type="text">Continuous delivery with git hooks</title>
    <summary type="text">One of the tricks that helps me move super fast on Quail and related projects is a continuous delivery setup that I use to iterate quickly (on the browser-based portions, anyway). And what&#8217;s great about this workflow is that once...</summary>
    <content type="html"><![CDATA[<p>One of the tricks that helps me move <em>super fast</em> on <a href="https://quailhq.com">Quail</a> and related projects is a continuous delivery setup that I use to iterate quickly (on the browser-based portions, anyway). And what&#8217;s great about this workflow is that once you&#8217;ve got it set up then publishing a release fits <em>exactly</em> into your already-existing workflow, and setting it up requires tools you&#8217;re <em>already using</em>.</p>

<p>The trick, of course, is to rely on <code>git</code>. </p>

<p>This first bit is optional, but I like to maintain a <code>master</code> branch that always reflects what&#8217;s actually deployed in production. Pushing commits to this master branch logically means that those commits should be immediately deployed, but <a href="http://threevirtues.com/">programmers are lazy</a> and I realised long ago that if I could simply automate away the devops-y step of &#8220;ssh into the host, build a distribution of static files, and update nginx&#8221; then I&#8217;d never forget to deploy a finished release again.</p>

<p>So. Let&#8217;s automate this puppy.</p>

<p>First, you&#8217;ll need a git host running on your production server (I like <a href="http://gitolite.com/gitolite/">Gitolite</a> because it <em>also</em> relies on a git-push-to-deploy model, but your mileage may vary). In the project you want to auto-deploy with git, add this host as a new remote:</p>

<p><code>git remote add production git@&lt;your production host&gt;:&lt;repo&gt;.git</code></p>

<p>In your remote repository (e.g. <code>&lt;repo&gt;.git/</code> wherever you&#8217;ve set up Gitolite on your host) you&#8217;ll find a directory called <code>hooks</code>. Git hooks are an <a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks">incredibly powerful tool</a> that I won&#8217;t go into the details of, but basically they&#8217;re scripts that are triggered by events happening in your repository. Create a file called <code>post-receive</code> in your <code>&lt;repo&gt;.git/hooks</code> directory with the following (obviously replacing <code>&lt;repo&gt;</code> with a more helpful name!):</p>

<pre><code>#!/bin/bash
sudo -u integration /home/integration/&lt;repo&gt;.sh
</code></pre>

<p>Because we&#8217;re <code>sudo</code>ing, we&#8217;ll need to add an exception to <code>/etc/sudoers</code> to allow our <code>git</code> user to execute this script (and only this script!) as the <code>integration</code> user. Add the following to the end of <code>/etc/sudoers</code>:</p>

<pre><code>git ALL=(integration) NOPASSWD: /home/integration/&lt;repo&gt;.sh
</code></pre>

<p>I like to keep my git hooks super-simple, so the above simply runs <em>another</em> script as a lower-privilege user that we&#8217;ll use to actually do the work of deploying our pushed application. Go ahead and create that user (<code>sudo useradd integration</code>) , then become them (<code>su integration; cd ~</code>). Clone the repository you just created (<code>git clone git@localhost:&lt;repo&gt;.git</code> &#8212; you may need to set up key authentication for the integration user in Gitolite), then create the script we referenced in your <code>post-receive</code> hook at <code>&lt;repo&gt;.sh</code>:</p>

<pre><code>#!/bin/bash

REPO=&lt;repo&gt;
INTEGRATION=/home/integration
PUBLISH_DIR=/srv/www/&lt;deploy directory&gt;/public_html

# Publish master branch to &lt;deploy directory&gt;
cd $INTEGRATION/$REPO

# Fetch the latest production push
git checkout master
git pull origin master

# Compile a distribution
yarn install
yarn compile

# Remove the existing distribution
rm -rf $PUBLISH_DIR/*

# Copy the compiled static files into a place where nginx can serve them
cp -R dist/* $PUBLISH_DIR

# Update permissions on the published files
chgrp -R nginx $PUBLISH_DIR/*
chmod -R 775 $PUBLISH_DIR/*
</code></pre>

<p>Obviously your commands to turn your uncompiled code into static assets will differ. </p>

<p>And that&#8217;s it! Work happily on your <code>develop</code> branch, and when it comes time to push code to production just commit on <code>master</code> and <code>git push production master</code>. You&#8217;ll see the forwarded output from your <code>&lt;repo&gt;.sh</code> above (in my case, the output of <code>yarn install</code> and <code>yarn compile</code>, and &#8212; assuming everything compiles properly &#8212; your production-ready assets will be pushed out all the way to where your web server can serve &#8216;em.</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2017/08/continuous-delivery-with-git-hooks</id>
    <link rel="alternate" href="http://texasexpat.net/2017/08/continuous-delivery-with-git-hooks" type="application/xhtml+xml" hreflang="en" />
    <published>2017-08-01T16:57:00Z</published>
    <updated>2017-08-01T17:24:17Z</updated>
  </entry>
  <entry>
    <title type="text">Write Beautiful Commit Logs</title>
    <summary type="text">No, seriously. Writing succinct, helpful commit messages is the VCS equivalent of eating your vegetables &#8212; everyone knows they should be doing it, but it&#8217;s really hard in the moment to keep up a good habit. My personal trick for...</summary>
    <content type="html"><![CDATA[<p>No, <a href="https://chris.beams.io/posts/git-commit/">seriously</a>.</p>

<p>Writing succinct, helpful commit messages is the VCS equivalent of eating your vegetables &#8212; everyone knows they should be doing it, but it&#8217;s really hard in the moment to keep up a good habit. My personal trick for training myself in good habits like this is, like all lazy programmers, to try and automate it as much as possible &#8212; and when I can&#8217;t automate, I try to have my tools at least guide me in the right direction. </p>

<p>To that end I&#8217;ve been collaborating on a nifty editor for commit logs called <a href="https://github.com/zorgiepoo/Komet">Komet</a>:</p>

<p><img alt="Komet, a Cocoa text editor designed for creating commit messages." src="http://texasexpat.net/2017/08/01/dark.png" width="612" height="441" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<p>Komet highlights messages that are too long, and automatically formats your commit messages to conform to some (very low-touch) norms that will make your (and your collaborators&#8217;) <code>git log</code>s much more informative. <a href="https://github.com/zorgiepoo/Komet">Check it out!</a></p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2017/07/write-beautiful-commit-logs</id>
    <link rel="alternate" href="http://texasexpat.net/2017/07/write-beautiful-commit-logs" type="application/xhtml+xml" hreflang="en" />
    <published>2017-07-10T15:21:46Z</published>
    <updated>2017-08-01T17:32:09Z</updated>
  </entry>
  <entry>
    <title type="text">Quail</title>
    <summary type="text">I've been pretty quiet for the last few months, but today I can finally announce the reason why: by way of explanation, let me introduce Quail, the world's best store management software for antique stores, vendor malls, and consignment shops....</summary>
    <content type="html"><![CDATA[I've been pretty quiet for the last few months, but today I can finally announce the reason why: by way of explanation, let me introduce <strong>Quail</strong>, the world's best store management software for antique stores, vendor malls, and consignment shops. I've worked before with the lovely folks at <em><a href="https://www.facebook.com/nacogdochesdecades/?ref=br_rs">Decades</a></em>, and when their existing point-of-sale software finally hit the breaking point we realized that we could certainly put together something a little better.

We couldn't have been more wrong; it turns out that we could put together something <em>amazingly better</em>.

<a href="https://quailhq.com"><img alt="creative_1.png" src="http://texasexpat.net/2016/12/27/creative_1.png" width="600" class="mt-image-center" style="text-align: center; display: block; margin: 20px auto 20px; border-radius: 4px" /></a>

if you're a antique store or vendor mall owner, check out <a href="https://quailhq.com">QuailHQ.com</a>. Whatever point-of-sale and store management program you're currently using, I can guarantee that Quail will be light-years ahead. From it's easy-to-use sale screen that will speed up your clerks to its detailed, automatically-generated rent, vendor, and store reports to its dedicated vendor portal (no more constant daily printouts for over-zealous vendors!), Quail will take care of the drudge work and let you focus on running your store.]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2016/12/quail</id>
    <link rel="alternate" href="http://texasexpat.net/2016/12/quail" type="application/xhtml+xml" hreflang="en" />
    <published>2016-12-27T21:45:33Z</published>
    <updated>2016-12-27T21:58:55Z</updated>
  </entry>
  <entry>
    <title type="text">Quick-starting web apps with Yeoman</title>
    <summary type="text">For years, I&#8217;ve kept running representation of how I set up, build, and deploy applications in the various technologies I use in example repos. Usually these aren&#8217;t interesting enough to bother open-sourcing them &#8212; nobody but me really needs a...</summary>
    <content type="html"><![CDATA[<p>For years, I&#8217;ve kept running representation of how I set up, build, and deploy applications in the various technologies I use in example repos. Usually these aren&#8217;t interesting enough to bother open-sourcing them &#8212; nobody but me really needs a skeletal SpriteKit+Swift project they can fork for a weekend&#8217;s gamedev doodling, for example. But lately I&#8217;ve been doing a ton of full-stack web development, both for work and in my personal projects, and as I move across projects I&#8217;ve started building up a really nice set of tools that I can use to build out minimal, robust apps <em>really quickly</em>.</p>

<p>The last time I was doing considerable web work, I kept my working knowledge of how to set up a project and start developing in the form of a <a href="http://yeoman.io">Yeoman</a> generator that I called <a href="https://github.com/doches/generator-chassis">Chassis</a>. That repo evolved over the couple of years I used it, from a basic directory structure and starter Gruntfile to a full-fledged multi-page application in Coffeescript built by a complex Gulpfile. </p>

<p>All things must end, however, and I&#8217;ve made a pretty clean break with most of the technologies and best practices encoded in Chassis. For one thing, I&#8217;ve started building my web apps in a single repo for both server and client; for another, the technologies on the server side have <em>completely changed</em>. To that end, I&#8217;ve put together a new Yeoman generator for bootstrapping full-stack web projects, unimaginatively called: <a href="https://github.com/doches/generator-dropwizard-angular-gradle">dropwizard-angular-gradle</a>. </p>

<p>The technologies it relies on are basically right there in the name: the API server is built in Java 8 using the lovely Dropwizard framework, with dependencies and distribution handled by Gradle; the client is written in Typescript using Angular.js (1.x), with dependencies handled by Bower and building/live-reloading handled by Gulp. You can go from zero to <em>fully working, deployable, testable</em> application with just: </p>

<pre><code>$ npm install -g yo
$ npm install -g generator-dropwizard-angular-gradle
$ mkdir awesome
$ cd awesome
$ yo dropwizard-angular-gradle
</code></pre>

<p>The generator will fetch some baseline Java, Node, &amp; Bower dependencies, and set up an Intellij project for the API. You can start the server from within Intellij or using <code>./gradlew run</code>; start a live-reloading auto-compiler for your Typescript and Less files with <code>cd awesome-app; gulp watch</code>. When you&#8217;re ready to deploy, build the whole kaboodle into a distribution with <code>./gradlew distZip</code>.</p>

<p>Now if you&#8217;ll excuse me, I&#8217;m going to go bash out another couple of sweet prototypes. Shouldn&#8217;t take more than half an hour or so :).</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2016/07/quick-starting-web-apps-with-yeoman</id>
    <link rel="alternate" href="http://texasexpat.net/2016/07/quick-starting-web-apps-with-yeoman" type="application/xhtml+xml" hreflang="en" />
    <published>2016-07-03T01:26:43Z</published>
    <updated>2016-07-03T02:02:27Z</updated>
  </entry>
  <entry>
    <title type="text">Transactional database updates with JDBI</title>
    <summary type="text">I just figured out a super-useful feature of JDBI: how to use @Transaction blocks to neatly group a set of related inserts into a single, transactional query. As an example, suppose you had a DAO like: public abstract class JdbiDatabaseBackend...</summary>
    <content type="html"><![CDATA[<p>I just figured out a <em>super-useful</em> feature of JDBI: how to use <code>@Transaction</code> blocks to neatly group a set of related
inserts into a single, transactional query. </p>

<p>As an example, suppose you had a DAO like:</p>

<pre><code>public abstract class JdbiDatabaseBackend {
    @SqlUpdate("INSERT INTO users (username, email) VALUES " + 
        "(:username, :email) RETURNING id")
    public abstract int createUser(@Bind("username") String username, 
        @Bind("email") String email);

    @SqlUpdate("INSERT INTO ACCOUNTS (user_id, created) VALUES " +
        "(:user_id, current_timestamp)")
    public abstract void createUserAccount(@Bind("user_id") int userID);
}
</code></pre>

<p>and you wanted to chain these two queries together into one logical &#8216;create-user-and-account&#8217; call:</p>

<pre><code>// In e.g. a Jersey resource:
int userID = databaseBackend.createUser("ahamilton", "ahamilton@treasury.gov");
databaseBackend.createUserAccount(userID);
</code></pre>

<p>The above works fine, but I ran into the case where the second query (<code>createUserAccount</code>) could sometimes fail, leaving
me with an orphaned row in my <code>Users</code> table. How much better would it be if I could ensure that either both queries succeeded or neither did?</p>

<p>Enter JDBI&#8217;s handy <code>@Transaction</code> annotation! Create a new method on your DAO that represents the transaction, and make your queries there:</p>

<pre><code>public abstract class JdbiDatabaseBackend {
    @SqlUpdate("INSERT INTO users (username, email) VALUES " + 
        "(:username, :email) RETURNING id")
    public abstract int createUser(@Bind("username") String username, 
        @Bind("email") String email);

    @SqlUpdate("INSERT INTO ACCOUNTS (user_id, created) VALUES " +
        (:user_id, current_timestamp)")
    public abstract void createUserAccount(@Bind("user_id") int userID);

    @Transaction
    public void createUserAndAccount(String username, String email) {
        int userID = this.createUser("ahamilton", "ahamilton@treasury.gov");
        this.createUserAccount(userID);
    }
}
</code></pre>

<p>&#8230;replace your previous separate calls to <code>createUser</code> and <code>createUserAccount</code> with a single call to the transactional
<code>createUserAndAccount</code>:</p>

<pre><code>// In e.g. a Jersey resource:
databaseBackend.createUserAndAccount("ahamilton", "ahamilton@treasury.gov");
</code></pre>

<p>&#8230;and you&#8217;re good to go! No more orphaned rows, as JDBI will roll back any successful updates inside a method annotated
with <code>@Transaction</code> if anything fails.</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2016/03/transactional-database-updates-with-jdbi</id>
    <link rel="alternate" href="http://texasexpat.net/2016/03/transactional-database-updates-with-jdbi" type="application/xhtml+xml" hreflang="en" />
    <published>2016-03-03T02:30:00Z</published>
    <updated>2016-03-03T02:34:32Z</updated>
  </entry>
  <entry>
    <title type="text">Show Notes.io</title>
    <summary type="text">For the last few months I&#8217;ve been doing a lot of web and java development, both of which can be quite tedious at times. To help me stay focused, I&#8217;ve started listening to a lot of developer podcasts. While I&#8217;ve...</summary>
    <content type="html"><![CDATA[<p>For the last few months I&#8217;ve been doing a lot of web and java development, both of which can be quite tedious at times. To help me stay focused, I&#8217;ve started listening to a lot of developer podcasts. While I&#8217;ve got a couple of great shows, I quickly caught up on my backlog of episodes and went hunting for great new shows &mdash; and it turns out that the list of tools that exist to help listeners find new shows pretty much starts and ends with the iTunes search bar.</p>

<p>This will not do.</p>

<p><img alt="Show Notes.io" title="Find your next favourite podcast" src="http://texasexpat.net/shownotes_banner.png" class="mt-image-none" style="border-radius: 2px; width: 100%; max-width: 800px; margin: 1em auto;" /></p>

<p>With that, I&#8217;d like to introduce Show Notes, a podcast search and recommendation engine. Recommendations are driven by a mix of natural language queries (keywords, episode titles, descriptions), social recommendations (what combinations of shows have other users looked at?), and curated lists (5by5, RelayFM, &#8216;Shows featuring John Siracusa&#8217;, etc.). You can <a href="https://shownotes.io">pre-register to get notification when the final results go live</a>, or to <a href="mailto:trevor@shownotes.io">become a list curator</a>.</p>

<p>If you&#8217;re feeling brave, you can even check out the <a href="http://beta.shownotes.io">beta</a>.</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2015/12/shownotes</id>
    <link rel="alternate" href="http://texasexpat.net/2015/12/shownotes" type="application/xhtml+xml" hreflang="en" />
    <published>2015-12-20T17:02:04Z</published>
    <updated>2015-12-23T15:43:53Z</updated>
  </entry>
  <entry>
    <title type="text">rTypeset - A typographic pre-processor for HTML</title>
    <summary type="text">I was hanging out on Hacker News yesterday and, as is usual, saw a bunch of cool projects come up. One of &#8216;em was a typographic pre-processor for HTML written in Javascript, Typeset &#8212; a beautiful little project that produced...</summary>
    <content type="html"><![CDATA[<p>I was hanging out on Hacker News yesterday and, as is usual, saw a bunch of cool projects come up. One of &#8216;em was a typographic pre-processor for HTML written in Javascript, <a href="https://github.com/davidmerfield/Typeset">Typeset</a> &#8212; a beautiful little project that produced some really lovely looking output. In the HN discussion I noticed a couple people <a href="https://news.ycombinator.com/item?id=10075728">clamoring for a way to use it from Ruby</a>, and I thought to myself &#8220;yeah, that <em>would</em> be useful!&#8221;</p>

<p>And so I present to you <a href="http://doches.github.io/rtypeset/">rTypeset</a>, a typographic pre-processor for HTML written in pure Ruby. Check out the code for <a href="https://github.com/doches/rtypeset">rTypeset on Github</a>, or install it yourself and have a play around with the output by installing the gem:</p>

<pre><code>gem install rtypeset
</code></pre>

<p>That&#8217;s literally all it takes to get started. <code>require</code> the typeset gem and you&#8217;re good to go to produce beautiful, typeset HTML from your Rails apps or Jekyll blogs:</p>

<pre><code>require 'typeset'

raw_html = &lt;&lt;HTM
&lt;p&gt;Yjarni Sigurðardóttir spoke to NATO from Iceland yesterday:
"Light of my life, fire of my florins -- my sin, my soul.
The tip of the tongue taking a trip to 118° 19' 43.5".":&lt;/p&gt;
HTM

# Output beautifully-formatted HTML
puts Typeset.typeset(raw_html)
</code></pre>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2015/08/rtypeset</id>
    <link rel="alternate" href="http://texasexpat.net/2015/08/rtypeset" type="application/xhtml+xml" hreflang="en" />
    <published>2015-08-19T05:08:12Z</published>
    <updated>2015-08-19T05:15:13Z</updated>
  </entry>
  <entry>
    <title type="text">The App Classifieds</title>
    <summary type="text">I&#8217;ve taken a break from app development to launch something a little different: a classified listings site for mobile, desktop, and web apps: If you&#8217;re a hobbyist iOS developer with a few spare apps sitting in iTunes Connect (like me),...</summary>
    <content type="html"><![CDATA[<p>I&#8217;ve taken a break from app development to launch something a little different: <a href="https://theappclassifieds.com">a classified listings site for mobile, desktop, and web apps</a>:</p>

<div style="text-align: center; width: 100%; margin: 25px 0px;"><a href="https://theappclassifieds.com" style='text-decoration: none; border-bottom: none;'><img src="http://swiftalicio.us/wp-content/uploads/2015/07/Logomark-Invert.png" width=375 alt="The App Classifieds Logomark" /></a></div>

<p>If you&#8217;re a hobbyist iOS developer with a few spare apps sitting in iTunes Connect (like me), then The App Classifieds can help you turn those apps into something useful by connecting you with like-minded app buyers. There are plenty of markets for apps, sure, but most of them are either borderline scammy, auction-only, or too expensive to make sense for smaller apps. The App Classifieds is a place to list apps that you&#8217;d be willing to sell but aren&#8217;t necessarily looking to auction right now &#8212; and listing an app is totally free. Promoted listings are also available, if you want to maximise the number of potential buyers who see your app &#8212; use the code <code>SWIFTALICIOUS</code> (a reference to my <a href="http://swiftalicio.us">iOS developer blog</a>) to get promoted listings for just $1.25/month (50% off of $5/month).</p>

<p>I wrote a little more about why we need <a href="http://blog.theappclassifieds.com/2015/06/18/lets-fix-app-sales/">a better way market for apps</a> over at The App Classifieds blog; check it out for a better introduction. And if you&#8217;ve never sold an app or taken over someone else&#8217;s, I&#8217;d give it a shot. You&#8217;ll be surprised!</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2015/07/the-app-classifieds</id>
    <link rel="alternate" href="http://texasexpat.net/2015/07/the-app-classifieds" type="application/xhtml+xml" hreflang="en" />
    <published>2015-07-23T09:01:00Z</published>
    <updated>2015-07-23T09:09:03Z</updated>
  </entry>
  <entry>
    <title type="text">Far Off Places</title>
    <summary type="text">Just a quick note to point out that we&#8217;ve just launched the iOS version of Far Off Places, the magazine of written whimsy I help publish. The magazine&#8217;s app is available in both iPhone and iPad versions (I prefer the...</summary>
    <content type="html"><![CDATA[<p>Just a quick note to point out that we&#8217;ve just launched the iOS version of <a href="http://faroffplaces.org"><em>Far Off Places</em></a>, the magazine of written whimsy I help publish. The magazine&#8217;s app is available in both iPhone and iPad versions (I prefer the iPhone/iPod Touch version myself!); you can find it listed as <a href="https://itunes.apple.com/app/id613653270"><em>Far Off Places</em> under Newsstand</a>, where it is (at the time of this writing) #1 on the U.S. and U.K. charts for literary journals.</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2013/09/far-off-places</id>
    <link rel="alternate" href="http://texasexpat.net/2013/09/far-off-places" type="application/xhtml+xml" hreflang="en" />
    <published>2013-09-06T22:01:58Z</published>
    <updated>2013-09-14T22:06:36Z</updated>
  </entry>
  <entry>
    <title type="text">Convert for Alfred</title>
    <summary type="text">Download One of my least favourite things in life is converting between units of measurement, especially when cooking. All my mum&#8217;s recipes use imperial units, you see, yet my kitchen&#8217;s supply of measuring widgets is exclusively metric. Constantly launching a...</summary>
    <content type="html"><![CDATA[<div style="float:right;padding:4px;margin:4px 8px;background-color:#fff;border:1px solid #ddd"><a href="/media/Convert.zip"><img src="/media/alfred.png" alt="Alfred"><h2 style="text-align:center"><strong>Download</strong></h2></a></div>

<p>One of my least favourite things in life is converting between units of measurement, especially when cooking. All my mum&#8217;s recipes use imperial units, you see, yet my kitchen&#8217;s supply of measuring widgets is exclusively metric. Constantly launching a web browser and running the conversion through Google is just tiresome &#8212; but having just made the switch from Quicksilver to <a href="http://www.alfredapp.com">Alfred</a>, I decided to have a go at building an <a href="http://www.alfredapp.com/powerpack">Alfred Extension</a> to do quick unit conversions using Google&#8217;s calculator API.</p>

<p>To use it, <a href="/media/Convert.zip">download the extension</a> and install it via Alfred&#8217;s preferences window. Summon Alfred as usual, then make unit conversions with:</p>

<pre><code>convert AMOUNT UNIT to UNIT
</code></pre>

<p>It can handle anything Google knows about, so queries like</p>

<ul>
<li>&#8220;convert 500 grams to lbs&#8221;</li>
<li>&#8220;convert 375 fahrenheit to celsius&#8221;</li>
<li>&#8220;convert 2 cups to liters&#8221;</li>
</ul>

<p>will work just fine. For brevity&#8217;s sake, you can omit the &#8216;to&#8217;. Happy trans-cultural baking!</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2011/10/convert-for-alfred</id>
    <link rel="alternate" href="http://texasexpat.net/2011/10/convert-for-alfred" type="application/xhtml+xml" hreflang="en" />
    <published>2011-10-09T10:34:31Z</published>
    <updated>2011-10-09T11:03:16Z</updated>
  </entry>
  <entry>
    <title type="text">c_progressbar</title>
    <summary type="text">I do a lot of programming, in a lot of different languages. Each language evokes a particular sort of mindset when I&#8217;m using it, as well: Python and Objective-C are for games, Ruby and C are for research, PHP is...</summary>
    <content type="html"><![CDATA[<p>I do a lot of programming, in a lot of different languages. Each language evokes a particular sort of mindset when I&#8217;m using it, as well: Python and Objective-C are for games, Ruby and C are for research, PHP is for webdev. Within each mindset, though, there&#8217;s a fair amount of blending &#8212; and I can&#8217;t tell you how often I wish I was writing in Ruby when I find myself writing in C. </p>

<p>My usual workflow for research-oriented coding involves prototyping a tool or model in Ruby (fast to write, easy to understand), then porting the final, working version into C for use with real data (my models are usually trained on massive statistical corpora, something Ruby is, unfortunately, ill-equipped to handle). This is all well and good, but I always miss the usability that I can so easily sprinkle into the Ruby version. <a href="http://ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html"><code>OptionParser</code></a> is one such gem; <a href="http://0xcc.net/ruby-progressbar/"><code>Ruby/ProgressBar</code></a> is another.</p>

<p>In a moment of frustration, I re-implemented <code>Ruby/ProgressBar</code> in pure, unadulterated C99. If you&#8217;re interested in that sort of thing, you can grab a copy from my <a href="http://github.com/doches/progressbar">GitHub</a> repository:</p>

<pre><code>git clone git@github.com:doches/progressbar.git
</code></pre>

<p>For comparison, here is how you use a progressbar in Ruby:</p>

<pre><code>require 'rubygems'
require 'progressbar'

progress = ProgressBar.new("Loading",100)
(0..99).each do |i| 
  # Do some stuff
  progress.inc
end
progress.finish
</code></pre>

<p>&#8230;and in C:</p>

<pre><code>#include "progressbar.h"

progressbar *progress = progressbar_new("Loading",100);
for(int i=0;i&lt;100;i++) {
  // Do some stuff
  progressbar_inc(progress);
}
progressbar_finish(progress);
</code></pre>

<p>More examples, including custom formatting and indeterminate progress, are in <code>test/progressbar_demo.c</code>.</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2010/08/c-progressbar</id>
    <link rel="alternate" href="http://texasexpat.net/2010/08/c-progressbar" type="application/xhtml+xml" hreflang="en" />
    <published>2010-08-30T12:40:25Z</published>
    <updated>2010-08-30T12:56:50Z</updated>
  </entry>
  <entry>
    <title type="text">CogSci 2010</title>
    <summary type="text">I just got back from CogSci 2010, to which I had successfully submitted a paper, &#8220;Meaning Representation in Natural Language Categorization.&#8221; Unfortunately, I wasn&#8217;t invited to present it as a talk &#8212; but on the upside, I was invited to...</summary>
    <content type="html"><![CDATA[<p>I just got back from <abbr title="The Annual Meeting of the Cognitive Science Society"><a href="http://www.cognitivesciencesociety.org/conference2010/">CogSci 2010</a></abbr>, to which I had successfully submitted a paper, &#8220;Meaning Representation in Natural Language Categorization.&#8221; Unfortunately, I wasn&#8217;t invited to present it as a talk &#8212; but on the upside, I <em>was</em> invited to present it as a <a href="http://texasexpat.net/media/cogsci_2010_poster.pdf">poster</a>. As a consequence, I may now write the following sentence, of which I am more proud than practically anything I have done in my life to date:</p>

<blockquote>
Fountain, T. & Lapata, M. (2010). Meaning Representation in Natural Language Categories. In S. Ohlsson & R. Catrambone (Eds.), <em>Proceedings of the 32nd Annual Conference of the Cognitive Science Society</em>. Austin, TX: Cognitive Science Society.
</blockquote>

<p>Squee.</p>

<p>The work I presented deals with whether corpus co-occurrence can be used as a stand-in for norming data, at least in the context of a categorization task; as part of that work I collected a rather large amount of data that I am now making <a href="http://bit.ly/categorization">publicly available</a>. The dataset extends the McRae et al feature norms by grouping the words in forty-one categories, and includes norming data, integrated into the standard McRae features, for each of the newly-added category labels.</p>
]]></content>
    <category term="/" scheme="http://texasexpat.net/" label="" />
    <id>http://texasexpat.net/2010/08/cogsci-2010</id>
    <link rel="alternate" href="http://texasexpat.net/2010/08/cogsci-2010" type="application/xhtml+xml" hreflang="en" />
    <published>2010-08-27T17:51:24Z</published>
    <updated>2010-08-27T18:05:26Z</updated>
  </entry>
  
</feed>