<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>gwax</title>
    <link>https://gwax.com/</link>
    <description>The personal website of George Leslie-Waksman.</description>
    <atom:link href="https://gwax.com/rss.xml" rel="self" type="application/rss+xml"/>
    <language>en</language>
    <copyright>Contents &amp;copy;2005-2025 &lt;a href="link://slug/about-person"&gt;George Leslie-Waksman&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;
    &lt;img
        src="https://i.creativecommons.org/l/by-sa/4.0/80x15.png"
        alt="Creative Commons License BY-SA"
        style="border:0;margin:0;"
    /&gt;
&lt;/a&gt;
</copyright>
    <lastBuildDate>Thu, 03 Jul 2025 05:37:28 GMT</lastBuildDate>
    <generator>Nikola (getnikola.com)</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <item>
      <title>Bemoaning the AI copy assistant</title>
      <link>https://gwax.com/blog/2023/09/bemoaning-the-ai-copy-assistant.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: LLMs have gotten a lot better in the past two years.&lt;/p&gt;
&lt;p&gt;I've been using &lt;a class="reference external" href="https://github.com/features/copilot"&gt;GitHub Copilot&lt;/a&gt; for about half a year now, and it feels
like an amazing piece of magic. Not only does it seem to do most of the rote
coding for me but it also gives me a new sense for what is &lt;em&gt;actually&lt;/em&gt; rote.&lt;/p&gt;
&lt;p&gt;Since I edit the content of this blog, and just about everything else I write,
in &lt;a class="reference external" href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt; and already use Copilot for work,
it tries to suggest things everywhere.&lt;/p&gt;
&lt;p&gt;Even, as I type this, it keeps suggesting things. Often, the things it suggests
are so close to what I want to say that it's tempting to hit the tab key but
it's voice is not quite my own.&lt;/p&gt;
&lt;p&gt;With code, the voice hardly matters and Copilot is quite good at knowing what
I want to say, of course, it's well constrained. With prose, not so much. Sure,
what it suggests would be fine but that's not the point.&lt;/p&gt;</description>
      <category>ai</category>
      <category>meta</category>
      <category>writing</category>
      <guid>https://gwax.com/blog/2023/09/bemoaning-the-ai-copy-assistant.html</guid>
      <pubDate>Mon, 18 Sep 2023 05:39:29 GMT</pubDate>
    </item>
    <item>
      <title>A proper Gimlet, sans corn syrup</title>
      <link>https://gwax.com/blog/2023/09/a-proper-gimlet-sans-corn-syrup.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;p&gt;A Gimlet is a refreshing cocktail with a subtle but distinct flavor profile. It
can be quite tasty but is very hard to get right without accepting an awful lot
of high fructose corn syrup. I tend to avoid high fructose corn syrup, so I
rarely make a proper Gimlet, but I've been experimenting with syrups over the
years and think I've struck on a pretty good alternative.&lt;/p&gt;
&lt;section id="the-classic-gimlet"&gt;
&lt;h2&gt;The Classic Gimlet&lt;/h2&gt;
&lt;p&gt;The starting point for a Gimlet is a simple mix of gin and &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Rose%27s_Lime_Juice"&gt;Rose's Lime Juice&lt;/a&gt;.
Sadly, Rose's is mostly water, high fructose corn syrup, and a little bit of
flavoring. It gives the right taste (tuotologically) but isn't something I feel
good about drinking.&lt;/p&gt;
&lt;section id="gimlet"&gt;
&lt;h3&gt;Gimlet&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2 oz Gin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 oz Rose's Lime Juice&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shake with ice and serve in a Nick and Nora glass.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="the-gin-sour"&gt;
&lt;h2&gt;The Gin Sour&lt;/h2&gt;
&lt;p&gt;Commonly, one will find recipes calling for fresh lime juice an simple syrup.
While a good drink, the flavor profile is quite different from a true Gimlet.&lt;/p&gt;
&lt;section id="gin-sour"&gt;
&lt;h3&gt;Gin Sour&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2 oz Gin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3/4 oz Lime Juice&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3/4 oz Simple Syrup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shake with ice and serve in a Nick and Nora glass. Garnish with a lime slice.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="roll-your-own"&gt;
&lt;h2&gt;Roll Your Own&lt;/h2&gt;
&lt;p&gt;From here, the path forward is to start trying to make your own lime syrup. The
first recipes that I tried were based on a simple syrup infused with lime
zest. This works well enough but the flavor is a bit too subtle and not quite
right.&lt;/p&gt;
&lt;p&gt;From there, I largely set aside the matter until I came across a recipe trying
to &lt;a class="reference external" href="https://www.reddit.com/r/cocktails/comments/15uki9f/resurrecting_the_original_taste_of_a_gimlet/jwpuyrz/"&gt;resurrect the original Rose's recipe&lt;/a&gt; on Reddit. To
my taste, the recipe is much to tart, more like a Sour Patch Kid than something
I want to use in drinks. That said, the flavor profile was in the right direction.&lt;/p&gt;
&lt;p&gt;I played with the ratios, threw a few other tricks at the recipe, and ended up
with something that tastes really good to my taste.&lt;/p&gt;
&lt;section id="key-lime-syrup"&gt;
&lt;h3&gt;Key Lime Syrup&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;3/4 cup Water&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2 cups white Sugar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/4 tsp Cream of Tartar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 Tbsp Citric Acid&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;12 Key Limes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Procedure:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Zest the key limes and set the zest aside. Juice the limes and set the juice aside.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Put the sugar, cream of tartar, and water in a saucepan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bring to a gentle boil, stirring until the sugar is dissolved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove from heat and add the key lime zest.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cover and let steep for 30 minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use an ice bath to cool the saucepan / syrup to under 100°F.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the key lime juice and citric acid, stirring to combine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strain through a fine strainer (I use a nut milk bag) and bottle.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="the-homemade-gimlet"&gt;
&lt;h2&gt;The Homemade Gimlet&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2.5 oz Gin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.75 oz Key Lime Syrup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shake with ice and serve in a Coupe or Nick and Nora glass.&lt;/p&gt;
&lt;p&gt;Delicious.&lt;/p&gt;
&lt;/section&gt;</description>
      <category>cocktails</category>
      <category>recipes</category>
      <category>syrups</category>
      <guid>https://gwax.com/blog/2023/09/a-proper-gimlet-sans-corn-syrup.html</guid>
      <pubDate>Mon, 18 Sep 2023 03:36:56 GMT</pubDate>
    </item>
    <item>
      <title>Uncut Jewel</title>
      <link>https://gwax.com/blog/2019/10/uncut-jewel.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;p&gt;Once a year, I take a month off from Caffeine and Alcohol (sometimes I'll throw
in something else like high fructose corn syrup). It was fairly arbitrary for
a number of years but now, having learned it's kind of a thing, I tend to
take my temperance in January. This time around, I've moved things up a few
months and am abstaining in October.&lt;/p&gt;
&lt;p&gt;Giving up booze, even temporarily, doesn't mean that I want to give up
cocktails. Turns out, however, it's really hard to make something without
alcohol that doesn't end up tasting like juice or flavored water. &lt;a class="reference external" href="https://seedlipdrinks.com/us"&gt;Seedlip&lt;/a&gt;
is meant for this purpose and helps some but tends to fall pretty easily into
the juice or flavored water trap.&lt;/p&gt;
&lt;p&gt;Through a mix of experimenting, &lt;a class="reference external" href="https://seedlipdrinks.com/us"&gt;Seedlip&lt;/a&gt; recipe ideas, &lt;a class="reference external" href="https://www.theaviarybook.com/"&gt;Aviary Cocktail Book&lt;/a&gt;
inspiration, staring at my liquor shelf, and starting at my fridge, I've had a
modicum of success. I seem to have hit on a formula that works well stirred
with ice and served Up:&lt;/p&gt;
&lt;section id="a-non-alcoholic-up-formula"&gt;
&lt;h2&gt;A Non-Alcoholic Up formula&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;1 oz Seedlip (Spice 94 or Garden 108)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 oz Verjus Blanc (Fusion Napa Valley)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 oz Verjus Rouge (Fusion Napa Valley)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 oz Cranberry Juice&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 oz Syrup (Simple, Demerara, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1-2 dash(es) bitters&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gomme Syrup and Garden 108 seem to work well together but I think the best
that I've hit on so far is what I'm calling an Uncut Jewel:&lt;/p&gt;
&lt;a class="reference external image-reference" href="https://gwax.com/images/posts/2019/10/uncut_jewel.jpg"&gt;&lt;img alt="Uncut Jewel and its ingredients" class="align-right" src="https://gwax.com/images/posts/2019/10/uncut_jewel.thumbnail.jpg"&gt;&lt;/a&gt;
&lt;/section&gt;
&lt;section id="uncut-jewel-recipe"&gt;
&lt;h2&gt;Uncut Jewel recipe&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;1 oz Seedlip Spice 94&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 oz Verjus Blanc (Fusion Napa Valley)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 oz Verjus Rouge (Fusion Napa Valley)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 oz Cranberry Juice&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 oz Maple Syrup (Grade A Amber Color, Rich Taste)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 dash Salted Cacao Bitters (Workhorse Rye + Dandelion Chocolate)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stir with ice, serve up, and garnish with a Maraschino cherry.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="notes"&gt;
&lt;h2&gt;Notes&lt;/h2&gt;
&lt;p&gt;The drink leads with a note of allspice before taking on dominant notes of
fruit and nuts and finally closes with a hint of cocoa. Overall, it's well
balanced, sippable, and fairly complex, without assaulting the palette.&lt;/p&gt;
&lt;/section&gt;</description>
      <category>cocktails</category>
      <category>compositions</category>
      <category>food &amp; drink</category>
      <category>non-alcoholic</category>
      <category>recipes</category>
      <guid>https://gwax.com/blog/2019/10/uncut-jewel.html</guid>
      <pubDate>Mon, 21 Oct 2019 06:03:55 GMT</pubDate>
    </item>
    <item>
      <title>An Arbitrary map from SQL with Go</title>
      <link>https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;p&gt;I've been writing a lot of &lt;a class="reference external" href="https://golang.org/"&gt;Go&lt;/a&gt; lately and finding it a pleasant balance of
simplicity, power, functionality, and ecosystem support. In a lot of cases, I
am finding the guarantees afforded by type safety to be really nice but,
occasionally, the strict requirements can make some easy things much harder
than I want them to be.&lt;/p&gt;
&lt;p&gt;Recently, I found myself wanting to test the behavior of some code the hit a
SQL database. Specifically, I wanted to check the results of a handful of
queries with varied columns and column types. With &lt;a class="reference external" href="https://www.python.org/"&gt;Python&lt;/a&gt;, I'd approach this
with &lt;a class="reference external" href="https://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt;, and turn the result into a &lt;code&gt;list&lt;/code&gt; of &lt;code&gt;dict&lt;/code&gt;s.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_753b523f2f1941f2946da4519eeb79a8-1" name="rest_code_753b523f2f1941f2946da4519eeb79a8-1" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_753b523f2f1941f2946da4519eeb79a8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rows_to_dicts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_753b523f2f1941f2946da4519eeb79a8-2" name="rest_code_753b523f2f1941f2946da4519eeb79a8-2" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_753b523f2f1941f2946da4519eeb79a8-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;"""Covert a SQLAlchemy RowProxy into a list of dicts."""&lt;/span&gt;
&lt;a id="rest_code_753b523f2f1941f2946da4519eeb79a8-3" name="rest_code_753b523f2f1941f2946da4519eeb79a8-3" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_753b523f2f1941f2946da4519eeb79a8-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;From here, it's pretty straightforward to assert the result matches
expectations. If you're using &lt;a class="reference external" href="https://docs.pytest.org/en/latest/"&gt;pytest&lt;/a&gt;, you'll also get really clear details on
where the results aren't what you expect. If you don't have the expected
columns or column types spot on, you're assertion will be off but you won't
hit any underlying errors at this point of your testing.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://golang.org/"&gt;Go&lt;/a&gt;, on the other hand doesn't have quite as easy an option. The crux of the
problem is that the only way to get a result row out of a sql query is via
&lt;a class="reference external" href="https://golang.org/pkg/database/sql/#Rows.Scan"&gt;(*Rows) Scan&lt;/a&gt;, which
demands you know something about the structure of the result before you
query. Luckily &lt;code&gt;Scan&lt;/code&gt; is happy to read anything into a &lt;code&gt;*string&lt;/code&gt;
as long as you're asking for the right number of values so we can write an
equivalent function to the python list comprehension.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code go"&gt;&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-1" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-1" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-2" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-2" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;"database/sql"&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-3" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-3" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-4" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-4" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-5" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-5" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-5"&gt;&lt;/a&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RowsToMaps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kd"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-6" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-6" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Columns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-7" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-7" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-8" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-8" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-9" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-9" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-10" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-10" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;columnCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-11" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-11" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-11"&gt;&lt;/a&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-12" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-12" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-13" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-13" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-14" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-14" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-15" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-15" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;columnValue&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-16" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-16" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-17" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-17" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-17"&gt;&lt;/a&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-18" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-18" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resultMaps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kd"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-19" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-19" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-20" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-20" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-21" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-21" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-22" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-22" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resultMaps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-23" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-23" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-24" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-24" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;rowMap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-25" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-25" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnPtr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-26" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-26" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-27" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-27" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnStr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-28" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-28" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-28"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnStrPtr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnPtr&lt;/span&gt;&lt;span class="p"&gt;.(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnStrPtr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-29" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-29" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-29"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nx"&gt;columnStr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;columnStrPtr&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-30" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-30" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-30"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-31" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-31" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-31"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;rowMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;columnStr&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-32" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-32" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-32"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-33" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-33" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-33"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;resultMaps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultMaps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rowMap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-34" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-34" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-34"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-35" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-35" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-35"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-36" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-36" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-36"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resultMaps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-37" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-37" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-37"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-38" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-38" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-38"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resultMaps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;
&lt;a id="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-39" name="rest_code_4f48bc9e92fb4673a9f24399d054b9ca-39" href="https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html#rest_code_4f48bc9e92fb4673a9f24399d054b9ca-39"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This, much like the &lt;a class="reference external" href="https://www.python.org/"&gt;Python&lt;/a&gt; above, gives us a list of maps of column name
to column value, with the minor caveats that all values are strings and
&lt;code&gt;NULL&lt;/code&gt; values become empty strings. I found it a useful chunk of code,
so I thought I'd throw it up.&lt;/p&gt;
&lt;p&gt;Sure, it's more verbose but sometimes that's the price we pay for dealing
with dynamic results in a staticly typed language. There are other prices
paid in the other direction.&lt;/p&gt;</description>
      <category>code snippets</category>
      <category>golang</category>
      <guid>https://gwax.com/blog/2019/10/an-arbitrary-map-from-sql-with-go.html</guid>
      <pubDate>Mon, 21 Oct 2019 04:13:56 GMT</pubDate>
    </item>
    <item>
      <title>Grenadine</title>
      <link>https://gwax.com/blog/2017/11/grenadine.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;div&gt;&lt;p&gt;In my ongoing quest to make delicious alcoholic beverages, I have increasingly
found myself digging into my ingredients.  Syrups, as a class of ingredient,
have received a decent amount of my attention.  As an aside, if you're buying
simple syrup, you are doing a lot of things wrong.  In my experience, it is
decidedly tricky to find decent grenadine, where decent is defined as being
made with real pomegranate and without high fructose corn syrup or food
coloring.  So, I've started to make my own:&lt;/p&gt;
&lt;section id="grenadine-1"&gt;
&lt;h2&gt;Grenadine&lt;/h2&gt;
&lt;p&gt;A pomegranate syrup that adds a sweet tartness to drinks and a distinctive
red color.  Notable in small quantities in a great many drinks and also as
the second ingredient in a Shirley Temple, a drink the actress was apparently
never fond of.&lt;/p&gt;
&lt;section id="ingredients"&gt;
&lt;h3&gt;Ingredients&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;1 cup fresh Pomegranate Juice (~2 large pomegranates)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 oz Pomegranate Molasses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 1/2 cup White Sugar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/2 tsp Orange Blossom Water&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 oz over-proof grain neutral spirit (Everclear or vodka)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://gwax.com/blog/2017/11/grenadine.html"&gt;Read more…&lt;/a&gt; (2 min remaining to read)&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/div&gt;</description>
      <category>cocktails</category>
      <category>recipes</category>
      <category>syrups</category>
      <guid>https://gwax.com/blog/2017/11/grenadine.html</guid>
      <pubDate>Mon, 06 Nov 2017 05:30:20 GMT</pubDate>
    </item>
    <item>
      <title>Slowcooker Yogurt</title>
      <link>https://gwax.com/blog/2016/09/slowcooker-yogurt.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;div&gt;&lt;a class="reference external image-reference" href="https://gwax.com/images/posts/2016/09/yield.jpg"&gt;&lt;img alt="Some jars of homemade yogurt" class="align-right" src="https://gwax.com/images/posts/2016/09/yield.thumbnail.jpg"&gt;&lt;/a&gt;
&lt;p&gt;I have a 14 month old daughter, a wife that likes yogurt with granola, and I
kind of like the stuff too. Needless to say, we go through a lot of yogurt in
my house. Specifically, we go through a lot of plain, whole milk, Greek yogurt.&lt;/p&gt;
&lt;p&gt;We were recently visiting my wife's aunt and uncle (my daughter's graunt and
gruncle), and we had yogurt most mornings. They use an
&lt;a class="reference external" href="https://www.easiyo.com/"&gt;EasiYo&lt;/a&gt; to make their yogurt, which piqued my
curiosity.&lt;/p&gt;
&lt;p&gt;Fancy yogurt is pretty expensive at the store, upwards of $7 or $8 per 32oz
container. Yogurt is just fermented milk and I've fermented plenty of things
before. I should be able to make yogurt, right?&lt;/p&gt;
&lt;p&gt;So, how about &lt;a class="reference external" href="https://www.easiyo.com/"&gt;EasiYo&lt;/a&gt;? Turns out it's not that much cheaper.&lt;/p&gt;
&lt;p&gt;We can do better, let's &lt;a class="reference external" href="https://www.google.com/search?q=slowcooker+greek+yogurt"&gt;ask the Internet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Turns out it's pretty straightforward; I just finished our second batch
yesterday. It also turns out to be really good, and it's less than $2 per
32oz (milk choice depending).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gwax.com/blog/2016/09/slowcooker-yogurt.html"&gt;Read more…&lt;/a&gt; (3 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description>
      <category>recipes</category>
      <guid>https://gwax.com/blog/2016/09/slowcooker-yogurt.html</guid>
      <pubDate>Tue, 06 Sep 2016 06:30:48 GMT</pubDate>
    </item>
    <item>
      <title>Let's Encrypt on App Engine</title>
      <link>https://gwax.com/blog/2016/03/lets-encrypt-on-app-engine.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;div&gt;&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: &lt;a class="reference external" href="https://cloudplatform.googleblog.com/2017/09/introducing-managed-SSL-for-Google-App-Engine.html"&gt;As of September, 2017&lt;/a&gt;,
Google App Engine will &lt;a class="reference external" href="https://cloud.google.com/appengine/docs/standard/python/securing-custom-domains-with-ssl"&gt;manage SSL certificates for you&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils"&gt;
&lt;p&gt;&lt;a class="reference external" href="https://letsencrypt.org/"&gt;Let's Encrypt&lt;/a&gt; is a fantastically convenient way
to get SSL certificates for your website without paying a bunch of money or
resorting to a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Self-signed_certificate"&gt;self-signed certificate&lt;/a&gt;. It's also pretty easy to set up.&lt;/p&gt;
&lt;p&gt;Easy as it is to set up, the instructions don't really explain much about
setup for &lt;a class="reference external" href="https://cloud.google.com/appengine/"&gt;App Engine&lt;/a&gt;. It turns out to
be pretty straightforward.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gwax.com/blog/2016/03/lets-encrypt-on-app-engine.html"&gt;Read more…&lt;/a&gt; (2 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description>
      <category>code snippets</category>
      <category>meta</category>
      <guid>https://gwax.com/blog/2016/03/lets-encrypt-on-app-engine.html</guid>
      <pubDate>Sun, 13 Mar 2016 07:25:01 GMT</pubDate>
    </item>
    <item>
      <title>Internet Time Now script</title>
      <link>https://gwax.com/blog/2016/02/internet-time-now-script.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;p&gt;On account of being mentioned by &lt;a class="reference external" href="https://gimletmedia.com/show/reply-all/"&gt;Reply All&lt;/a&gt;,
I've been listening to back episodes of
&lt;a class="reference external" href="http://www.onthemedia.org/tags/tldr_podcast/"&gt;[TLDR]&lt;/a&gt;. Listening to
&lt;a class="reference external" href="http://www.onthemedia.org/story/15-internet-time/"&gt;#15 - Internet Time&lt;/a&gt; caught
my attention and made me aware of
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Swatch_Internet_Time"&gt;Swatch Internet Time&lt;/a&gt;.
It's kind of impractical but also kind of fun, especially as I've been a little
annoyed at recording times across timezones for something meant to persist,
like this blog.&lt;/p&gt;
&lt;p&gt;For fun, I whipped up a quick python implementation:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-1" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-1" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-2" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-2" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;decimal&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-3" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-3" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-4" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-4" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decimal_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-5" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-5" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-5"&gt;&lt;/a&gt;    &lt;span class="n"&gt;mus_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;minute&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;microsecond&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-6" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-6" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-6"&gt;&lt;/a&gt;    &lt;span class="n"&gt;mus_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-7" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-7" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;dec_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mus_ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mus_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-8" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-8" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-8"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dec_time&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-9" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-9" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-9"&gt;&lt;/a&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-10" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-10" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-10"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;internet_time_now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-11" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-11" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-12" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-12" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-13" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-13" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-13"&gt;&lt;/a&gt;    &lt;span class="n"&gt;format_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;precision&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-14" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-14" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-14"&gt;&lt;/a&gt;    &lt;span class="n"&gt;format_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'@{{:0&lt;/span&gt;&lt;span class="si"&gt;{l:d}&lt;/span&gt;&lt;span class="s1"&gt;.0&lt;/span&gt;&lt;span class="si"&gt;{p:d}&lt;/span&gt;&lt;span class="s1"&gt;f}}'&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;format_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-15" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-15" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-15"&gt;&lt;/a&gt;    &lt;span class="n"&gt;it_utc_p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-16" name="rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-16" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_bc5609ccf0414ef49ba5c4f79cdfe07d-16"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;format_str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decimal_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it_utc_p1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or, if you don't care about precision:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-1" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-1" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-2" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-2" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-3" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-3" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decimal_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-4" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-4" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;s_ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;minute&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-5" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-5" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-5"&gt;&lt;/a&gt;    &lt;span class="n"&gt;s_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-6" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-6" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-6"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;s_ts&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;s_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-7" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-7" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-8" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-8" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-8"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;internet_time_now&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-9" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-9" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;it_utc_p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-10" name="rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-10" href="https://gwax.com/blog/2016/02/internet-time-now-script.html#rest_code_ddd42e58fdf8426d9a9e9075a3b95e70-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'@&lt;/span&gt;&lt;span class="si"&gt;{:03d}&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decimal_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it_utc_p1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description>
      <category>code snippets</category>
      <category>time</category>
      <guid>https://gwax.com/blog/2016/02/internet-time-now-script.html</guid>
      <pubDate>Fri, 05 Feb 2016 19:40:05 GMT</pubDate>
    </item>
    <item>
      <title>Fixing Nikola Footnote Locations</title>
      <link>https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;p&gt;Personally, I prefer to intersperse my footnote declarations with the text
that is being footnoted when writing my. For example:&lt;a class="footnote-reference brackets" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;This is just an example.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;div class="code"&gt;&lt;pre class="code ReST"&gt;&lt;a id="rest_code_fdab8445365247adbdc274bec67d0601-1" name="rest_code_fdab8445365247adbdc274bec67d0601-1" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_fdab8445365247adbdc274bec67d0601-1"&gt;&lt;/a&gt;I might want to write something&lt;span class="s"&gt;[#]_&lt;/span&gt; where there's a footnote there.
&lt;a id="rest_code_fdab8445365247adbdc274bec67d0601-2" name="rest_code_fdab8445365247adbdc274bec67d0601-2" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_fdab8445365247adbdc274bec67d0601-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_fdab8445365247adbdc274bec67d0601-3" name="rest_code_fdab8445365247adbdc274bec67d0601-3" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_fdab8445365247adbdc274bec67d0601-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="nt"&gt;[#]&lt;/span&gt; I put the footnote definition here.
&lt;a id="rest_code_fdab8445365247adbdc274bec67d0601-4" name="rest_code_fdab8445365247adbdc274bec67d0601-4" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_fdab8445365247adbdc274bec67d0601-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_fdab8445365247adbdc274bec67d0601-5" name="rest_code_fdab8445365247adbdc274bec67d0601-5" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_fdab8445365247adbdc274bec67d0601-5"&gt;&lt;/a&gt;And then I continue on with the rest of my writing.
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Wherever they are declared, I prefer to have all of my footnotes appear at the
end of my posts. By default, &lt;a class="reference external" href="https://getnikola.com"&gt;Nikola&lt;/a&gt;  puts the
footnotes in wherever they are declared. A simple snippet of javascript can be
used to fix the locations of footnotes:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_0611471e57d14f2db3178da3c23d70d6-1" name="rest_code_0611471e57d14f2db3178da3c23d70d6-1" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_0611471e57d14f2db3178da3c23d70d6-1"&gt;&lt;/a&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_0611471e57d14f2db3178da3c23d70d6-2" name="rest_code_0611471e57d14f2db3178da3c23d70d6-2" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_0611471e57d14f2db3178da3c23d70d6-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.footnote'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_0611471e57d14f2db3178da3c23d70d6-3" name="rest_code_0611471e57d14f2db3178da3c23d70d6-3" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_0611471e57d14f2db3178da3c23d70d6-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;appendTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a id="rest_code_0611471e57d14f2db3178da3c23d70d6-4" name="rest_code_0611471e57d14f2db3178da3c23d70d6-4" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_0611471e57d14f2db3178da3c23d70d6-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.entry-content,.entry-summary'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;a id="rest_code_0611471e57d14f2db3178da3c23d70d6-5" name="rest_code_0611471e57d14f2db3178da3c23d70d6-5" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_0611471e57d14f2db3178da3c23d70d6-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;a id="rest_code_0611471e57d14f2db3178da3c23d70d6-6" name="rest_code_0611471e57d14f2db3178da3c23d70d6-6" href="https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html#rest_code_0611471e57d14f2db3178da3c23d70d6-6"&gt;&lt;/a&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Simply wrap in a &amp;lt;script&amp;gt; tag and include in the BODY_END section of conf.py
or add it to your theme.&lt;/p&gt;</description>
      <category>code snippets</category>
      <category>meta</category>
      <category>nikola</category>
      <guid>https://gwax.com/blog/2016/01/fixing-nikola-footnote-locations.html</guid>
      <pubDate>Sat, 23 Jan 2016 23:44:17 GMT</pubDate>
    </item>
    <item>
      <title>Will O' The Wisp</title>
      <link>https://gwax.com/blog/2011/01/will-o-the-wisp.html</link>
      <dc:creator>George Leslie-Waksman</dc:creator>
      <description>&lt;p&gt;Continuing &lt;a class="reference external" href="https://gwax.com/blog/2010/10/ironhide.html"&gt;my earlier work&lt;/a&gt;
in the realm of mixology, I would like to present my second cocktail
invention. The invention of this cocktail is the result of playing
around with gin,
&lt;a class="reference external" href="http://en.wikipedia.org/wiki/Chartreuse_%28liqueur%29"&gt;Chartreuse&lt;/a&gt;,
&lt;a class="reference external" href="http://en.wikipedia.org/wiki/St._Germain_%28liqueur%29"&gt;St. Germain&lt;/a&gt;, and
various other liqueurs in an attempt to make something tasty. This
cocktail earns its name, Will O' The Wisp, from its faint, ghostly,
green color.&lt;/p&gt;
&lt;section id="ingredients"&gt;
&lt;h2&gt;Ingredients&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;3/4 oz Green Chartreuse&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3/4 oz St. Germain&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3/4 oz White Vermouth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 dash Lavender Bitters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3 oz Dry Gin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1/4 oz Herbsaint or Absinth&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="recipe"&gt;
&lt;h2&gt;Recipe&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Pour the Chartreuse, St. Germain, Vermouth, Bitters, and Gin into a
cocktail shaker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pour the Herbsaint/Absinth into a chilled cocktail glass&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Swirl the cocktail glass, coating the sides, and pouring off any excess
Herbsaint/Absinth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ice to the cocktail shaker and shake&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pour shaken cocktail into the prepared glass&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;section id="notes"&gt;
&lt;h2&gt;Notes&lt;/h2&gt;
&lt;p&gt;The Herbsaint/Absinth can be skipped, though I don't recommend it. The Lavender
Bitters are also optional but very highly recommended. I would recommend
stirring this cocktail (instead of shaking) as the resulting beverage has a
very different appearance.&lt;/p&gt;
&lt;/section&gt;</description>
      <category>cocktails</category>
      <category>recipes</category>
      <guid>https://gwax.com/blog/2011/01/will-o-the-wisp.html</guid>
      <pubDate>Mon, 17 Jan 2011 04:04:00 GMT</pubDate>
    </item>
  </channel>
</rss>
