George V. Reilly http://www.georgevreilly.com/ george@reilly.org George V. Reilly tag:www.georgevreilly.com,2011-06-11:/atom/ http://www.georgevreilly.com/favicon.ico http://www.georgevreilly.com/feed-logo.png 2018-12-01T08:00:00Z acrylamid Review: The Heart's Invisible Furies tag:www.georgevreilly.com,2018-12-01:/blog/2018/12/01/ReviewHeartsInvisibleFuries.html 2018-12-01T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="http://www.amazon.com/dp/152476079X/?tag=georgvreill-20"><img alt="The Heart's Invisible Furies" class="right-float" src="http://images.amazon.com/images/P/152476079X.01.MZZZZZZZ.jpg"/></a> <div class="line-block"> <div class="line">Title: The Heart's Invisible Furies</div> <div class="line">Author: John Boyne</div> <div class="line">Rating: ★ ★ ★ ★ ½</div> <div class="line">Publisher: Hogarth</div> <div class="line">Copyright: 2017</div> <div class="line">ISBN: <a class="reference external" href="http://www.amazon.com/dp/152476079X/?tag=georgvreill-20">152476079X</a></div> <div class="line">Pages: 592</div> <div class="line">Keywords: fiction, gay, irish</div> <div class="line">Reading period: 30 October, 2018</div> </div> <p>Before I begin to describe <em>The Heart's Invisible Furies</em> with abundant spoilers, let me say two things. Despite what I describe below, the book is very funny, as Cyril recounts his frequent fuckups. You would never know, from reading the back cover or the excerpted reviews inside, that Cyril is gay. Yet Cyril's sexuality is the central theme of the book. I can only assume that this is a marketing decision, with which I strongly disagree.</p> <p>16-year-old Catherine is forced out of her Cork village by the parish priest, when her pregnancy is discovered. It's impossible to be a single, unwed mother in Ireland in 1945, so she puts her son up for adoption. Cyril Avery grows up in an odd, well-off household in Dublin, always being told by his adoptive father that he's not a <em>real</em> Avery. At seven, he develops a fascination with Julian, the son of his father's lawyer, whom he meets one fateful day. They meet again at fourteen, sharing a room in boarding school, and Cyril develops a full-blown but entirely secret obsession with the golden boy, Julian.</p> <p>Cyril begins to realize that he is that most despised creature, a homosexual in 1950s Catholic Ireland. By twenty-one, he is frequently meeting other men for furtive, anonymous sex. There is no outlet for romance or love, just hurried encounters. Homosexual acts are illegal in Ireland and discovery would mean social and professional ruin, perhaps even prosecution. He's still secretly in love with Julian, now a heterosexual hedonist in the swinging Sixties. At twenty-eight, deeply conflicted, he marries Julian's sister Alice, and abandons her hours after the wedding. Of all the stupid things that Cyril does, this is the worst. By thirty-five (1980), he's ended up in Amsterdam, where gay people can live openly, and he's in a relationship with Bastiaan, a Dutch doctor. In 1987, Bastiaan and Cyril are in New York, working with dying AIDS patients. Fear of AIDS is rampant and many of them have been rejected by their families. One of these patients is Julian, who is determined that no-one in Ireland should know that he's dying of such a shameful disease. From Julian, Cyril belatedly learns that Alice has a teenaged son, Liam. Julian insists that Cyril should have told him long ago, that he would have understood. Cyril knows better. Cyril couldn't be honest with the world for a long time, because the world—and Ireland—wouldn't let him be honest about himself. The episode ends with Bastiaan being killed by fagbashers who leave Cyril in a coma.</p> <p>After that, Cyril returns to Dublin, where he lives openly if quietly as a gay man. In time, he is reunited with his mother Catherine and makes peace with Alice and Liam. The final episode takes place in 2015, months after Ireland voted to <a class="reference external" href="https://www.theguardian.com/world/2015/may/23/gay-marriage-ireland-yes-vote">legalize same-sex marriage</a>. Cyril, now seventy, wonders at the New Ireland and he marvels at his own 17-year-old grandson openly expressing affection for his boyfriend. It's a bittersweet moment for Cyril. He thinks about Senator David Norris, Ireland's most famous gay rights campaigner for forty years, saying, when asked if he would take advantage of the new law, “It’s a little bit late for me ... I’ve spent so much time pushing the boat out that I forgot to jump on and now it’s out beyond the harbour on the high seas, but it’s very nice to look at.”</p> <p>In a <a class="reference external" href="https://www.powells.com/post/original-essays/the-most-truthful-paragraph-ive-written">somewhat bitter afterword</a>, the author John Boyne describes writing the book. He knew from a young age that he was gay, long before he knew what “gay” meant. Boyne drew upon his own early experiences in creating Cyril and regrets the potential that is lost to our generation. Boyne was born in Dublin in 1971, six years after me. I realized in my mid-teens that I am bisexual, something that I kept entirely buried for a decade. I found Ireland no more accepting than John Boyne did in the 1980s. If I were thirteen years old now in Dublin, instead of being thirteen in 1978, I wonder how things would be turning out for me. Would coming out as a bisexual teen be a near non-event, instead of the long-deferred and fearful-but-exhilarating landmark of my twenties? My mother gave me this book, after reading it herself, so I think it would be easier this time around.</p> Election Day 2018 tag:www.georgevreilly.com,2018-11-06:/blog/2018/11/06/ElectionDay2018.html 2018-11-06T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <img alt="Grab 'Em by the Midterms" class="right-float" src="http://www.georgevreilly.com/content/binary/grab-them-by-the-midterms.jpg" style="width: 400px;"/> <!-- source: http://chicagowomentakeaction.com/event/vote-in-2018/ --> <p>In 2016, I threw an Election Night victory party for Hillary Clinton. It turned into a wake.</p> <p>In 2016, it was obvious to me and to millions of others that Trump was unfit to be President. There were weak excuses that he might turn out to be more presidential after the campaign was over. Instead, we got the worst president we've ever seen in the US. Morally unfit. Temperamentally unfit. Ethically unfit. A pathological liar. A shatterer of alliances. A demagogue, stoking the flames of right-wing violent extremism.</p> <p>In 2018, there are no excuses for not seeing how dangerous Trump is. Trump himself is not on the ballot, but this is nonetheless a referendum on Trump. The Republican party have done nothing to rein in his excesses. They will continue to do nothing if they retain the House of Representatives.</p> <p>The Republicans must be voted out of power in the House. The Senate too, if that's possible. Trump is deeply unpopular outside his base, but structural inequalities, gerrymandering, and voter suppression all make it far from certain that the Democrats can win tonight.</p> <p>Brace yourselves for a backlash.</p> <p>If the Democrats win a narrow victory, expect rage and violence from the right-wing that dwarfs that of the last few weeks. Trump has been laying down a narrative of a stolen election again, just as he did before the 2016 election.</p> <p>If the Republicans retain control, what little restraint that was still in place will go. They will not be magnanimous in victory.</p> <p>We may not know the final results for weeks, as tight races are counted and recounted.</p> <p>The best outcome is for the Democrats to win a resounding victory and sweep the House. I don't know if we can pull that off. But the best way to be sure is for everyone to <em>vote Democrat</em> today.</p> <p>Please vote. It matters.</p> Brilliant Jerks in Engineering tag:www.georgevreilly.com,2017-12-30:/blog/2017/12/30/BrilliantJerksInEngineering.html 2017-12-30T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="http://www.brendangregg.com/blog/2017-11-13/brilliant-jerks.html"><img alt=""Do not tolerate brilliant jerks. The cost to teamwork is too high" — Reed Hastings, CEO Netflix" class="right-float" src="http://www.brendangregg.com/blog/images/2017/brilliantjerks.jpg" style="width: 400px;"/></a> <p>Brendan Gregg's <a class="reference external" href="http://www.brendangregg.com/blog/2017-11-13/brilliant-jerks.html">Brilliant Jerks in Engineering</a> is an excellent discussion of the &quot;No Asshole Rule&quot; applied to software engineers.</p> <p>He posits two kinds of brilliant jerks, the selfless and the selfish. You might call them unempathic and sociopathic, respectively. The former, if they develop some emotional intelligence, are worth saving. The latter are simply toxic and probably need to be fired.</p> How to talk to people you disagree with tag:www.georgevreilly.com,2017-12-27:/blog/2017/12/27/HowToTalkToPeopleYouDisagreeWith.html 2017-12-27T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>I came across an interesting post on Medium earlier tonight, <a class="reference external" href="https://medium.com/@jeremycaney/how-to-talk-to-people-you-disagree-with-420e12f695bc">How to talk to people you disagree with</a>.</p> <p>It can be hard to have a fruitful conversation with people you're at odds with, especially online.</p> <p>Jeremy Caney has 10 suggestions:</p> <ol class="arabic simple"> <li>Leave the insults at the door</li> <li>Understand what’s driving their views</li> <li>Speak to their values</li> <li>Know what you’re talking about</li> <li>Acknowledge when you’re wrong</li> <li>Stay focused on the issue at hand</li> <li>Be prepared to take heat from your team</li> <li>Don’t expect capitulation</li> <li>Know when to walk away</li> <li>Be mindful of the onlookers</li> </ol> Git Diff Tips tag:www.georgevreilly.com,2017-12-26:/blog/2017/12/26/GitDiffTips.html 2017-12-26T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>The <a class="reference external" href="https://git-scm.com/docs/git-diff">Git Diff</a> utility is much more functional than the standard command-line <tt class="docutils literal">diff</tt>.</p> <p>To see changes relative to the staging area (aka the index), use <tt class="docutils literal">git diff</tt>.</p> <p>To see <em>staged</em> changes, use <tt class="docutils literal">git diff <span class="pre">--staged</span></tt> (or <tt class="docutils literal"><span class="pre">--cached</span></tt>).</p> <p>To see changes side by side on a line (where it makes sense), use the <tt class="docutils literal"><span class="pre">--color-word</span></tt> option.</p> <p>To compare two arbitrary files in the file system, use <tt class="docutils literal">git diff <span class="pre">--no-index</span></tt>.</p> <p>To try some other <a class="reference external" href="https://stackoverflow.com/questions/4045017/what-is-git-diff-patience-for">diff algorithms</a>, use the <tt class="docutils literal"><span class="pre">--patience</span></tt>, <tt class="docutils literal"><span class="pre">--histogram</span></tt>, or <tt class="docutils literal"><span class="pre">--minimal</span></tt> options. The default diff algorithm is <tt class="docutils literal"><span class="pre">--myers</span></tt>.</p> <p>Lots more at the <a class="reference external" href="https://git-scm.com/docs/git-diff">docs</a>.</p> Review: Coco tag:www.georgevreilly.com,2017-12-25:/blog/2017/12/25/ReviewCoco.html 2017-12-25T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="https://en.wikipedia.org/wiki/Coco_(2017_film)"><img alt="Coco" class="right-float" src="https://upload.wikimedia.org/wikipedia/en/9/98/Coco_%282017_film%29_poster.jpg"/></a> <div class="line-block"> <div class="line">Title: Coco</div> <div class="line">Director: Lee Unkrich</div> <div class="line">Rating: ★ ★ ★ ★ ½</div> <div class="line">Released: 2017</div> <div class="line">Keywords: animation</div> <div class="line">Country: USA</div> <div class="line">Watched: 25 December, 2017</div> </div> <p><a class="reference external" href="https://en.wikipedia.org/wiki/Coco_(2017_film)">Coco</a> is another delightful movie from Pixar: It's a magical tale of a Mexican boy who passionately wants to play music, even though his shoemaking family has rejected music ever since his great-great-grandfather pursued his own musical ambitions and abandoned his wife and child—the eponymous Coco, who is now ancient. Miguel discovers that his despised ancestor is none other than Ernesto de la Cruz, the most famous musician of his time. In order to enter a talent competition on Día de los Muertos, he steals Ernesto's guitar from his mausoleum, whereupon he is transported to the Land of the Dead. Surrounded by lively skeletons, he must find his way home before the night is out.</p> <p>Coco is visually beautiful, musically satisfying, entertaining, and uplifting. While amusing, it manages to avoid the pitfalls of inanity that afflict so many animated films targeted at children, and it also deals sensitively with topics such as death, bereavement, and abandonment, as well as the difficulties of being in a family and the costs of following one's dreams.</p> <p>Highly recommended.</p> Seattle: Overturned Truck tag:www.georgevreilly.com,2017-02-27:/blog/2017/02/27/SeattleOverturnedTruck.html 2017-02-27T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>Seattle traffic ground to an eight-hour standstill today after a propane truck <a class="reference external" href="http://www.seattletimes.com/seattle-news/transportation/semi-rollover-on-i-5-near-west-seattle-bridge-blocking-lanes/">overturned</a> on southbound I-5. Both directions of I-5 were closed until the truck had been emptied enough so that it could be righted. The wet winter weather didn't help, as snow fell intermittently.</p> <p>Given the danger of a massive explosion, this was the right thing to do. Had the truck gone up, the outcome would have been much, much worse.</p> <p>Still, it drives home (heh) the fragility of our infrastructure. The closure's effect rippled throughout the region's roads, causing a systemic failure of the road network. Snarled traffic and chaos everywhere for miles.</p> <p>We've had two similar incidents in recent years, both involving spillages of seafood that caused multithour freeway closures. When the system is running hot most of the time, close to its capacity, it only takes one bad accident to trigger cascading traffic jams everywhere.</p> Stitches in my Finger tag:www.georgevreilly.com,2017-02-23:/blog/2017/02/23/StitchesInMyFinger.html 2017-02-23T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <img alt="Five Stitches in Left Index Finger" class="right-float" src="http://www.georgevreilly.com/content/binary/finger-stitches.jpg"/> <p>I've had stitches before, but never from a self-inflicted cut. Five stitches this morning from a bread knife slipping on a stale loaf that I was going to toast. I never did get that snack.</p> <p>Fortunately, it hasn't been painful. The stitches should come out in 7–9 days. Meanwhile, typing is awkward and slow.</p> <p>My brother David when he was eight or nine nearly ruined his thumb with a chisel. He was using it to make a wooden sign for his cub scout troop. The chisel slipped and jammed into the back of his left thumb. He didn't sever the tendon and he got the full use of his thumb back, but he still has an ugly scar.</p> <p>Within a year or two of David's accident, my father lost the tip of his index finger. He was making a deposit into a night safe when some keys got in the way as the door swung closed. He flipped them out of the way, but his fingertip didn't clear the gap in time. Fortunately his own father was present and took him for medical treatment. He has a divot missing from the tip of his right index finger. Vincent, unlike his children, is left-handed so it wasn't quite as much of a loss as it sounds.</p> <p>Life! No-one gets out without scars.</p> I Haz Shoes tag:www.georgevreilly.com,2017-02-22:/blog/2017/02/22/IHazShoes.html 2017-02-22T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>I've been wearing a surgical boot since my <a class="reference external" href="http://www.georgevreilly.com/blog/2017/01/17/KneeWalker.html">heel surgery</a> six weeks ago. The first month I spent getting around on a knee walker or crutches. For the last couple of weeks, I've been walking more and more, but always wearing the boot. The doctor told me today that I could start weaning myself off the boot, but not to rush it.</p> <p>I wore shoes on my right foot tonight for the first time. I tried on a Doc Marten shoe but found it too stiff. It rubbed against the scar at the back of my heel. A pair of sneakers were more comfortable. I'll bring the right sneaker to work with me tomorrow and wear it for a while.</p> <p>It's such a relief to let my ankle flex forward. As soon as I step off my right foot while wearing the surgical boot, the inability to lean forward crimps my stride. And the thick raised sole pushes me off-kilter and does my hips and lower back no good.</p> <p>Baby steps!</p> OrderedDict Initialization tag:www.georgevreilly.com,2017-02-21:/blog/2017/02/21/OrderedDictInitialization.html 2017-02-21T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>An <a class="reference external" href="https://docs.python.org/2/library/collections.html#collections.OrderedDict">OrderedDict</a> is a Python <tt class="docutils literal">dict</tt> which remembers insertion order. When iterating over an <tt class="docutils literal">OrderedDict</tt>, items are returned in that order. Ordinary <tt class="docutils literal">dicts</tt> return their items in an unspecified order.</p> <p>Ironically, most of the ways of constructing an initialized <tt class="docutils literal">OrderedDict</tt> end up breaking the ordering in Python 2.x and in Python 3.5 and below. Specifically, using keyword arguments or passing a <tt class="docutils literal">dict</tt> (mapping) will not retain the insertion order of the source code.</p> <div class="highlight"><pre><span></span><span class="go">Python 2.7.13 (default, Dec 18 2016, 07:03:39)</span> <span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">OrderedDict</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">odict</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">odict</span><span class="p">[</span><span class="s1">&#39;one&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">odict</span><span class="p">[</span><span class="s1">&#39;two&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">odict</span><span class="p">[</span><span class="s1">&#39;three&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">odict</span><span class="p">[</span><span class="s1">&#39;four&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">4</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">odict</span><span class="p">[</span><span class="s1">&#39;five&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">5</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">odict</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="go">[(&#39;one&#39;, 1), (&#39;two&#39;, 2), (&#39;three&#39;, 3), (&#39;four&#39;, 4), (&#39;five&#39;, 5)]</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">OrderedDict</span><span class="p">(</span><span class="n">one</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">two</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">three</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">four</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">five</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="go">[(&#39;four&#39;, 4), (&#39;one&#39;, 1), (&#39;five&#39;, 5), (&#39;three&#39;, 3), (&#39;two&#39;, 2)]</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">OrderedDict</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="n">one</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">two</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">three</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">four</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">five</span><span class="o">=</span><span class="mi">5</span><span class="p">))</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="go">[(&#39;four&#39;, 4), (&#39;five&#39;, 5), (&#39;three&#39;, 3), (&#39;two&#39;, 2), (&#39;one&#39;, 1)]</span> <span class="gp">&gt;&gt;&gt; </span><span class="n">OrderedDict</span><span class="p">({</span><span class="s2">&quot;one&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;two&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">&quot;three&quot;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;four&quot;</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span><span class="err">↩</span> <span class="go"> &quot;five&quot;: 5}).items()</span> <span class="go">[(&#39;four&#39;, 4), (&#39;three&#39;, 3), (&#39;five&#39;, 5), (&#39;two&#39;, 2), (&#39;one&#39;, 1)]</span> </pre></div> <p>Only passing an <em>iterable</em> of key-value pairs will retain the order.</p> <div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">OrderedDict</span><span class="p">([(</span><span class="s2">&quot;one&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="s2">&quot;two&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="s2">&quot;three&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span><span class="err">↩</span> <span class="go"> (&quot;four&quot;, 4), (&quot;five&quot;, 5)]).items()</span> <span class="go">[(&#39;one&#39;, 1), (&#39;two&#39;, 2), (&#39;three&#39;, 3), (&#39;four&#39;, 4), (&#39;five&#39;, 5)]</span> </pre></div> <p>Note that <tt class="docutils literal">OrderedDict</tt> is noticeably slower than <tt class="docutils literal">dict</tt> in Python 2.7, so only use <tt class="docutils literal">OrderedDict</tt> when insertion order matters.</p> <p>In Python 3.6, the <a class="reference external" href="https://www.python.org/dev/peps/pep-0468/">order of kwargs is preserved</a>, thanks to the <a class="reference external" href="https://mail.python.org/pipermail/python-dev/2016-September/146327.html">new compact implementation of dict</a>. <tt class="docutils literal">OrderedDict</tt> is also implemented in C and its performance is on par with that of <tt class="docutils literal">dict</tt>.</p> <p>Python 3.6 <tt class="docutils literal">dict</tt>s are now ordered too, but if you care about portable code (earlier CPython or other Python implementations such as Jython), use <tt class="docutils literal">OrderedDict</tt> rather than relying on this implementation detail.</p> <div class="highlight"><pre><span></span><span class="n">Python</span> <span class="mf">3.6</span><span class="o">.</span><span class="mi">0</span> <span class="p">(</span><span class="n">default</span><span class="p">,</span> <span class="n">Dec</span> <span class="mi">24</span> <span class="mi">2016</span><span class="p">,</span> <span class="mi">08</span><span class="p">:</span><span class="mo">01</span><span class="p">:</span><span class="mi">42</span><span class="p">)</span> <span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">OrderedDict</span> <span class="o">&gt;&gt;&gt;</span> <span class="n">OrderedDict</span><span class="p">(</span><span class="n">one</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">two</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">three</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">four</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">five</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="n">odict_items</span><span class="p">([(</span><span class="s1">&#39;one&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;two&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;three&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;four&#39;</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="err">…</span> <span class="o">&gt;&gt;&gt;</span> <span class="n">OrderedDict</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="n">one</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">two</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">three</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">four</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">five</span><span class="o">=</span><span class="mi">5</span><span class="p">))</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="n">odict_items</span><span class="p">([(</span><span class="s1">&#39;one&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;two&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;three&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;four&#39;</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="err">…</span> <span class="o">&gt;&gt;&gt;</span> <span class="n">OrderedDict</span><span class="p">({</span><span class="s2">&quot;one&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;two&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">&quot;three&quot;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">&quot;four&quot;</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span><span class="err">↩</span> <span class="s2">&quot;five&quot;</span><span class="p">:</span> <span class="mi">5</span><span class="p">})</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="n">odict_items</span><span class="p">([(</span><span class="s1">&#39;one&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;two&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;three&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;four&#39;</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="err">…</span> <span class="o">&gt;&gt;&gt;</span> <span class="n">OrderedDict</span><span class="p">([(</span><span class="s2">&quot;one&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="s2">&quot;two&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="s2">&quot;three&quot;</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span><span class="err">↩</span> <span class="p">(</span><span class="s2">&quot;four&quot;</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="p">(</span><span class="s2">&quot;five&quot;</span><span class="p">,</span> <span class="mi">5</span><span class="p">)])</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="n">odict_items</span><span class="p">([(</span><span class="s1">&#39;one&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;two&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;three&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;four&#39;</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="err">…</span> </pre></div> Review: Skinny Dip tag:www.georgevreilly.com,2017-02-19:/blog/2017/02/19/ReviewSkinnyDip.html 2017-02-19T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="http://www.amazon.com/dp/0446615129/?tag=georgvreill-20"><img alt="Skinny Dip" class="right-float" src="http://images.amazon.com/images/P/0446615129.01.MZZZZZZZ.jpg"/></a> <div class="line-block"> <div class="line">Title: Skinny Dip</div> <div class="line">Author: Carl Hiaasen</div> <div class="line">Rating: ★ ★ ★ ★</div> <div class="line">Publisher: Warner</div> <div class="line">Copyright: 2004</div> <div class="line">ISBN: <a class="reference external" href="http://www.amazon.com/dp/0446615129/?tag=georgvreill-20">978-0446-615129</a></div> <div class="line">Pages: 496</div> <div class="line">Keywords: humor, crime</div> <div class="line">Reading period: 18–19 February, 2017</div> </div> <p>Joey Perrone is very surprised to find herself thrown off a cruise ship on her second wedding anniversary. After a night of swimming, she washes up on a small Florida island in the company of a prematurely retired investigator. Joey persuades Mick Stranahan not to report the attempted murder, but instead to investigate and torment her worthless husband, Chaz, who turns out to be a <a class="reference external" href="http://www.urbandictionary.com/define.php?term=biostitute">biostitute</a> for a major polluter of the Everglades, as well as a relentless pussyhound, an inept killer, and an all-round shitheel.</p> <p>Hiaasen has a lot of fun at the expense of some of his characters, but his outrage at the despoliation of the Everglades is quite real. And once again, the grizzled cynical middleaged guy attracts the pretty younger woman.</p> HTML5 tables require tr inside thead tag:www.georgevreilly.com,2017-02-18:/blog/2017/02/18/HTML5TablesRequireTrInsideThead.html 2017-02-18T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>When I learned HTML tables back in the 90s, at some point I discovered the <tt class="docutils literal">&lt;thead&gt;</tt> element for grouping the <tt class="docutils literal">&lt;th&gt;</tt> column headers. What I missed was there should be a <tt class="docutils literal">&lt;tr&gt;</tt> element between the two. In other words, a well-formed HTML table with a header looks like this:</p> <div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">table</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">thead</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">tr</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">th</span><span class="p">&gt;</span>Name<span class="p">&lt;/</span><span class="nt">th</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">th</span><span class="p">&gt;</span>Value<span class="p">&lt;/</span><span class="nt">th</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">th</span><span class="p">&gt;</span>Date<span class="p">&lt;/</span><span class="nt">th</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">tr</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">thead</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">tbody</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">tr</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">td</span><span class="p">&gt;</span>USERNAME<span class="p">&lt;/</span><span class="nt">td</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">td</span><span class="p">&gt;</span>John.Smith<span class="p">&lt;/</span><span class="nt">td</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">td</span><span class="p">&gt;</span>2017-02-18T23:47<span class="p">&lt;/</span><span class="nt">td</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">tr</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">tbody</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">table</span><span class="p">&gt;</span> </pre></div> <p>and not:</p> <div class="highlight"><pre><span></span><span class="p">&lt;</span><span class="nt">table</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">thead</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">th</span><span class="p">&gt;</span>Name<span class="p">&lt;/</span><span class="nt">th</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">th</span><span class="p">&gt;</span>Value<span class="p">&lt;/</span><span class="nt">th</span><span class="p">&gt;</span> … </pre></div> <p>The latter form—<tt class="docutils literal">&lt;thead&gt;</tt> directly enclosing <tt class="docutils literal">&lt;th&gt;</tt>s—had always worked for me. Until yesterday when I ran afoul of an HTML5 validator on a remote API, which simply would not let me proceed until I wrapped my <tt class="docutils literal">&lt;th&gt;</tt> cells with a <tt class="docutils literal">&lt;tr&gt;</tt>.</p> <p>Who knew?</p> Review: The Italian Job tag:www.georgevreilly.com,2017-02-17:/blog/2017/02/17/ReviewTheItalianJob.html 2017-02-17T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="https://en.wikipedia.org/wiki/The_Italian_Job"><img alt="The Italian Job" class="right-float" src="https://upload.wikimedia.org/wikipedia/en/b/b3/The_Italian_Job_1969_poster.jpg"/></a> <div class="line-block"> <div class="line">Title: The Italian Job</div> <div class="line">Director: Peter Collinson</div> <div class="line">Rating: ★ ★ ★ ★</div> <div class="line">Released: 1969</div> <div class="line">Keywords: heist, comedy, cars</div> <div class="line">Country: UK</div> <div class="line">Watched: 17 Febuary, 2017</div> </div> <p><a class="reference external" href="https://en.wikipedia.org/wiki/The_Italian_Job">The Italian Job</a> movie is worth your time. One of the quintessential movies of the Swinging Sixties, its British sensibility wears well, almost 50 years on. The humour still works. And it's probably the best advertisement that the <a class="reference external" href="https://en.wikipedia.org/wiki/Mini#Mini_Cooper_and_Cooper_S:_1961.E2.80.932000">Mini</a> ever had.</p> <p>Charlie Croker (Michael Caine) has inherited a plan to rip off $4 million in gold bullion from Fiat in Turin. He and the lads are going to help the balance of payments by bringing the loot back from the Common Market. (They're proto-Euroskeptics.) And they're going to do it by causing the mother of all traffic jams and making their getaway in three little Mini Coopers.</p> <p>Don't expect too much coherence from the plot. There's at least 20 minutes of gloriously improbable chase scene set pieces where the three Minis perform balletic moves and lose another police Alfa Romeo or two. The literal cliffhanger ending is a classic. As with most comedies of the time, the characterization is weak—we learn a bit about what makes Croker and crime boss Bridger (Noël Coward) tick, but the rest are ciphers. No matter. The plot ticks along and it delivers.</p> Jenkins Pipelines tag:www.georgevreilly.com,2017-02-14:/blog/2017/02/14/JenkinsPipelines.html 2017-02-14T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>I just published a series of <a class="reference external" href="https://www.metabrite.com/devblog/posts/jenkins-01-migrating-pipelines/">blog posts</a> at the MetaBrite DevBlog about our experiences in migrating to Jenkins and Pipelines.</p> Review: Kill Me Three Times tag:www.georgevreilly.com,2017-02-10:/blog/2017/02/10/ReviewKillMeThreeTimes.html 2017-02-10T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="https://en.wikipedia.org/wiki/Kill_Me_Three_Times"><img alt="Kill Me Three Times" class="right-float" src="https://upload.wikimedia.org/wikipedia/en/2/2e/Kill_Me_Three_Times_poster.jpg"/></a> <div class="line-block"> <div class="line">Title: Kill Me Three Times</div> <div class="line">Director: Kriv Stenders</div> <div class="line">Rating: ★ ★ ★</div> <div class="line">Released: 2014</div> <div class="line">Keywords: black comedy thriller</div> <div class="line">Country: Australia</div> <div class="line">Watched: 10 February, 2017</div> </div> <p>A jealous husband engages a private detective-cum-killer for hire (Simon Pegg) to follow his wife. Upon proof of her infidelity, he orders a hit, which triggers a comedy of errors and double crosses, which ultimately leaves most of the cast dead at each other's hands.</p> <p>There's not much to like about this Australian noirish comedy. It's bloody but not that funny. The characters are thinly drawn and unengaging. They're a far cry from Tarantino's gonzo motormouths or the Coen Brother's quirky killers.</p> Review: I Shall Wear Midnight tag:www.georgevreilly.com,2017-02-09:/blog/2017/02/09/ReviewIShallWearMidnight.html 2017-02-09T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="http://www.amazon.com/dp/0061433063/?tag=georgvreill-20"><img alt="I Shall Wear Midnight" class="right-float" src="http://images.amazon.com/images/P/0061433063.01.MZZZZZZZ.jpg"/></a> <div class="line-block"> <div class="line">Title: I Shall Wear Midnight</div> <div class="line">Author: Terry Pratchett</div> <div class="line">Rating: ★ ★ ★ ★</div> <div class="line">Publisher: Harper</div> <div class="line">Copyright: 2010</div> <div class="line">ISBN: <a class="reference external" href="http://www.amazon.com/dp/0061433063/?tag=georgvreill-20">0061433063</a></div> <div class="line">Pages: 355</div> <div class="line">Keywords: humor, fantasy</div> <div class="line">Reading period: 3–5 February, 2017</div> </div> <p>Tiffany Aching is now the overworked and overly responsible Witch of the Chalk. People everywhere are fearing and distrusting witches more. When her patient, the ailing Baron dies, she is blamed. Other troubles multiply. Eventually she realizes that the Cunning Man, a long-dead witchfinder, is seeping poison into people's hearts. Aided by the troublemaking Nac Mac Feegle, she defeats him.</p> <p>Recommended.</p> <p><a class="reference external" href="https://en.wikipedia.org/wiki/I_Shall_Wear_Midnight">I Shall Wear Midnight</a> follows <a class="reference external" href="http://www.georgevreilly.com/blog/2008/05/19/ReviewTheWeeFreeMen.html">The Wee Free Men</a>, <a class="reference external" href="http://www.georgevreilly.com/blog/2010/01/28/ReviewAHatFullOfSky.html">A Hat Full of Sky</a>, and <em>Wintersmith</em>.</p> Old Presentations tag:www.georgevreilly.com,2017-02-07:/blog/2017/02/07/OldPresentations.html 2017-02-07T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>I uploaded some presentations to SpeakerDeck.com tonight.</p> <p>Here are various presentations of mine at <a class="reference external" href="https://speakerdeck.com/georgevreilly">SpeakerDeck.com</a> and <a class="reference external" href="http://www.slideshare.net/george_v_reilly">SlideShare.net</a>:</p> <ul class="simple"> <li><a class="reference external" href="https://speakerdeck.com/georgevreilly/lkrhash-the-design-of-a-scalable-hashtable">LKRhash: the design of a scalable hashtable</a>. I spoke about this at <a class="reference external" href="http://nwcpp.org/june-2012.html">NWCPP</a> (<a class="reference external" href="https://vimeo.com/44575071">video</a>) in June 2012.</li> <li><a class="reference external" href="https://speakerdeck.com/georgevreilly/software-performance-an-overview">Software Performance: an Overview</a>. I gave this talk at an internal brownbag at MetaBrite in January 2016.</li> <li><a class="reference external" href="https://speakerdeck.com/georgevreilly/flyingcloud-docker-containers-built-with-saltstack">FlyingCloud: Docker containers built with SaltStack</a>. I gave this talk at <a class="reference external" href="https://www.meetup.com/PSPPython/events/228878102/">PuPPy</a> (<a class="reference external" href="https://youtu.be/MbBzuI3p5xw?t=25m23s">video</a>) in March 2016.</li> <li><a class="reference external" href="http://www.slideshare.net/george_v_reilly/security-101-7567002">Security 101</a>. I gave this talk at an internal brownbag at Cozi in November 2011.</li> </ul> Trump: Media Suppresses Coverage of Terrorist Attacks tag:www.georgevreilly.com,2017-02-06:/blog/2017/02/06/TrumpMediaSuppressesCoverageTerroristAttacks.html 2017-02-06T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>Donald Trump is now <a class="reference external" href="https://www.washingtonpost.com/news/politics/wp/2017/02/06/president-trump-is-now-speculating-that-the-media-is-covering-up-terrorist-attacks/">claiming</a> (WaPo):</p> <blockquote> <p>Speaking to the U.S. Central Command on Monday, President Trump went off his prepared remarks to make a truly stunning claim: The media was intentionally covering up reports of terrorist attacks.</p> <p>“You’ve seen what happened in Paris, and Nice. All over Europe, it’s happening,” he said to the assembled military leaders. “It’s gotten to a point where it’s not even being reported. And in many cases the very, very dishonest press doesn’t want to report it. They have their reasons, and you understand that.”</p> </blockquote> <p>More: <a class="reference external" href="https://www.theatlantic.com/politics/archive/2017/02/trump-centcom-media-terror-cover-up/515823/">The Atlantic</a>, <a class="reference external" href="https://news.vice.com/story/trump-accused-the-media-of-ignoring-terrorist-attacks">Vice</a>.</p> <p>This is ridiculous on the face of it. With literally billions of cellphone cameras in circulation and hundreds of millions of people on social media, how could a real terrorist attack be covered up? And what would the media's motivation be for this coverup? And how would they all stay on message? Someone would scoop them. This is the kind of horseshit that <a class="reference external" href="https://www.washingtonpost.com/news/the-fix/wp/2017/02/06/trumps-suggestion-that-the-media-is-ignoring-terrorist-attacks-has-a-familiar-source-infowars/">InfoWars</a> flings around.</p> <p>It's another damned lie from Trump. Whether it's part of a deliberate plan or he's making shit up in the moment, it hardly matters. Trump and Kellyanne Conway and Sean Spicer and the rest of his administration are lying repeatedly and shamelessly.</p> <p>After Trump won the election, I entertained a faint hope that the grave responsibility of becoming the leader of the free world might cause Trump to become a little more serious and measured. As the presidential transition wore on, that hope died an ugly death. Two weeks after the Inauguration, it's very clear that Trump will lie about anything and pick a fight with anyone.</p> <p>There is worse to come.</p> Review: Gone, Baby, Gone tag:www.georgevreilly.com,2017-02-03:/blog/2017/02/03/ReviewGoneBabyGone.html 2017-02-03T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="http://www.amazon.com/dp/0061336211/?tag=georgvreill-20"><img alt="Gone, Baby, Gone" class="right-float" src="http://images.amazon.com/images/P/0061336211.01.MZZZZZZZ.jpg"/></a> <div class="line-block"> <div class="line">Title: Gone, Baby, Gone</div> <div class="line">Author: Dennis Lehane</div> <div class="line">Rating: ★ ★ ★ ★ ½</div> <div class="line">Publisher: William Morrow</div> <div class="line">Copyright: 1998</div> <div class="line">ISBN: <a class="reference external" href="http://www.amazon.com/dp/0061336211/?tag=georgvreill-20">0061336211</a></div> <div class="line">Pages: 256</div> <div class="line">Keywords: crime</div> <div class="line">Reading period: 7 January–3 February, 2017</div> </div> <p>Four-year-old Amanda McCready has disappeared. Her aunt, desperate to find her, engages PIs Patrick Kenzie and Angie Gennaro to find the child. The mother, Helene, is drunken, slatternly, and neglectful: in short, unfit and unsympathetic. Kenzie and Gennaro don't want the case—the odds of finding Amanda alive and unharmed are low. They'll go through hell before they succeed.</p> <p>This book veers from blackly funny to gutwrenching. Kenzie and Gennaro come up against the worst of the worst and against decent people doing wrong for reasons that seem right to them. Lehane pulls us through the wringer along with his characters.</p> <p>Recommended.</p> Seattle Accessibility tag:www.georgevreilly.com,2017-02-02:/blog/2017/02/02/SeattleAccessibility.html 2017-02-02T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>I've been using a <a class="reference external" href="http://www.georgevreilly.com/blog/2017/01/17/KneeWalker.html">knee walker</a> for the last couple of weeks. For the first time, I took public transportation by myself to attend <a class="reference external" href="https://www.meetup.com/Papers-We-Love-Seattle/events/236557338/">Papers We Love</a> tonight. I rolled myself from 1st Ave S &amp; Washington up to the Pioneer Square station, took the Light Rail one stop north to the University Street station at 3rd &amp; Seneca, then rolled down the hill to 2nd &amp; Spring. It's a trip I wouldn't have thought about twice if I were walking normally—and I probably would have walked the entire way rather than take the Light Rail only one short stop.</p> <p>It's a different matter on a knee scooter. I said “roll” but “bump” is a better verb. I pushed my way over the bumpy streets and sidewalks up to 3rd &amp; Yesler, waited in a piss-reeking alcove for the elevator down to the mezzanine, then rolled over to the second elevator down to the platform of the Pioneer Square station. Two elevators up at University Street station, then rolling down one steep block, clenching the brakes all the way, to Second Ave, avoiding uneven surfaces and metal grates.</p> <p>It's tiring and annoying. I have a renewed appreciation for how difficult it is for wheelchair users and others with low mobility to get around. Before the <a class="reference external" href="https://en.wikipedia.org/wiki/Americans_with_Disabilities_Act_of_1990">Americans with Disabilities Act of 1990</a>, it must have been a lot worse. I suspect that Seattle is probably one of the more accessible cities.</p> Review: The Rhesus Chart tag:www.georgevreilly.com,2017-02-01:/blog/2017/02/01/ReviewTheRhesusChart.html 2017-02-01T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="http://www.amazon.com/dp/0425256863/?tag=georgvreill-20"><img alt="The Rhesus Chart" class="right-float" src="http://images.amazon.com/images/P/0425256863.01.MZZZZZZZ.jpg"/></a> <div class="line-block"> <div class="line">Title: The Rhesus Chart</div> <div class="line">Author: Charles Stross</div> <div class="line">Rating: ★ ★ ★ ★ ½</div> <div class="line">Publisher: Ace</div> <div class="line">Copyright: 2014</div> <div class="line">ISBN: <a class="reference external" href="http://www.amazon.com/dp/0425256863/?tag=georgvreill-20">978-0425256862</a></div> <div class="line">Pages: 359</div> <div class="line">Keywords: Lovecraftian spy thriller</div> <div class="line">Series: <a class="reference external" href="http://www.antipope.org/charlie/blog-static/2016/04/faq-the-laundry-filesseries-ti.html">Laundry Files</a>, vol. 5</div> <div class="line">Reading period: 27–29 January, 2017</div> </div> <p><em>“Don't be silly,” Bob, said Mo, “everyone knows vampires don't exist!”</em> Thus opens <em>The Rhesus Chart</em>. We quickly come to realize that vampires do exist and we come to wonder why everyone in the Laundry is so dogmatically sure that they don't. One of the nest of baby vampires that sets the plot in motion is Bob's toxic ex-girlfriend, Mhari, who manages to convince the Laundry that they should recruit her clutch rather than exterminate them. But there are old vampires who have the Laundry's newest recruits in their sights.</p> <p>Sequel to <a class="reference external" href="http://www.georgevreilly.com/blog/2017/01/29/ReviewTheApocalypseCodex.html">The Apocalypse Codex</a>. More at Charlie Stross's <a class="reference external" href="http://www.antipope.org/charlie/blog-static/2015/07/crib-sheet-the-rhesus-chart.html">Crib Sheet</a> and the <a class="reference external" href="http://thelaundryfiles.wikia.com/wiki/The_Rhesus_Chart">Laundry Files Wiki</a>.</p> Negative Circled Digits tag:www.georgevreilly.com,2017-01-31:/blog/2017/01/31/NegativeCircledDigits.html 2017-01-31T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>I found something very useful in the <a class="reference external" href="http://graphemica.com/blocks/dingbats">dingbats</a> range of Unicode characters: the negative circled san-serif digits, ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ .</p> <p>I've started using them to label points of interest in code. They play well with the <tt class="docutils literal"><span class="pre">code-block</span></tt> directive in reStructuredText.</p> <div class="highlight"><pre><span></span>sudo docker images --format <span class="s1">&#39;{{.Repository}}:{{.Tag}}&#39;</span> <span class="se">\ </span> ➊ <span class="p">|</span> grep <span class="nv">$IMAGE_NAME</span> <span class="se">\ </span> ➋ <span class="p">|</span> grep -v latest <span class="se">\ </span> ➌ <span class="p">|</span> head -1 ➍ </pre></div> <ol class="arabic simple"> <li>A Golang Template format string for image-name and tag</li> <li>Match some Docker image name</li> <li>Exclude the <tt class="docutils literal">latest</tt> tag</li> <li>Take only the first</li> </ol> <p>Because these characters are extra-wide even in a monospaced font, Vim doesn't render them properly unless they're followed by a space.</p> JSON data from Docker Images tag:www.georgevreilly.com,2017-01-30:/blog/2017/01/30/JsonDataFromDockerImages.html 2017-01-30T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <p>I was trying to get some structured information from <tt class="docutils literal">docker images</tt>, hoping to replace some ugly Sed and AWK trickery. I could have used the <a class="reference external" href="https://docker-py.readthedocs.io/en/stable/">docker-py</a> library. Instead I chose to use the poorly documented <tt class="docutils literal"><span class="pre">--format</span></tt> option to <tt class="docutils literal">docker images</tt> (and some other Docker CLI commands). Adrian Mouat gives some useful starting points at <a class="reference external" href="http://container-solutions.com/docker-inspect-template-magic/">Docker Inspect Template Magic</a> and notes that formatting is built around <a class="reference external" href="https://golang.org/pkg/text/template/">Go templates</a>.</p> <p>I quickly figured out that this format would meet my immediate need.</p> <div class="highlight"><pre><span></span>sudo docker images --format <span class="s1">&#39;{{.Repository}}:{{.Tag}}&#39;</span> <span class="se">\</span> <span class="p">|</span> grep <span class="nv">$IMAGE_NAME</span> <span class="se">\</span> <span class="p">|</span> grep -v latest <span class="se">\</span> <span class="p">|</span> head -1 </pre></div> <p>That's fine, but I still had no idea what other possible names could be used in the format template. While getting there, I learned that <a class="reference external" href="https://nathanleclaire.com/blog/2015/11/12/using-curl-and-the-unix-socket-to-talk-to-the-docker-api/">Curl can be used with a Unix socket</a> to talk to the Docker daemon.</p> <div class="highlight"><pre><span></span>sudo curl --unix-socket /var/run/docker.sock <span class="se">\</span> http://localhost/images/json <span class="p">|</span> python -m json.tool </pre></div> <p>This produces a prettyprinted list of all the Docker images. However, the names are not the same as those that can be used in the format template.</p> <p>The actual field names that can be used in the format template can be found in <a class="reference external" href="https://github.com/docker/docker/blob/master/cli/command/formatter/image.go">cli/command/formatter/image.go</a>. They include:</p> <ul class="simple"> <li><tt class="docutils literal">.ID</tt> — 12-char SHA aka Image ID</li> <li><tt class="docutils literal">.Repository</tt> — aka image name</li> <li><tt class="docutils literal">.Tag</tt></li> <li><tt class="docutils literal">.Digest</tt> — unsure</li> <li><tt class="docutils literal">.CreatedSince</tt> — e.g., “4 weeks”</li> <li><tt class="docutils literal">.CreatedAt</tt> — date</li> <li><tt class="docutils literal">.Size</tt></li> <li><tt class="docutils literal">.Containers</tt></li> <li><tt class="docutils literal">.VirtualSize</tt></li> <li><tt class="docutils literal">.SharedSize</tt></li> <li><tt class="docutils literal">.UniqueSize</tt></li> </ul> Review: The Apocalypse Codex tag:www.georgevreilly.com,2017-01-29:/blog/2017/01/29/ReviewTheApocalypseCodex.html 2017-01-29T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="http://www.amazon.com/dp/1937007464/?tag=georgvreill-20"><img alt="The Apocalypse Codex" class="right-float" src="http://images.amazon.com/images/P/1937007464.01.MZZZZZZZ.jpg"/></a> <div class="line-block"> <div class="line">Title: The Apocalypse Codex</div> <div class="line">Author: Charles Stross</div> <div class="line">Rating: ★ ★ ★ ★ ½</div> <div class="line">Publisher: Ace</div> <div class="line">Copyright: 2012</div> <div class="line">ISBN: <a class="reference external" href="http://www.amazon.com/dp/1937007464/?tag=georgvreill-20">978-1937007461</a></div> <div class="line">Pages: 336</div> <div class="line">Keywords: Lovecraftian spy thriller</div> <div class="line">Series: <a class="reference external" href="http://www.antipope.org/charlie/blog-static/2016/04/faq-the-laundry-filesseries-ti.html">Laundry Files</a>, vol. 4</div> <div class="line">Reading period: 22–26 January, 2017</div> </div> <p>A major American fundamentalist preacher has drawn disturbingly close to the British Prime Minister, and the more the Laundry looks, they more alarmed they become. Hacker/computational demonologist/Laundry agent Bob Howard is leveling up with the Laundry and he has been assigned to “External Assets”, the wing that deals with deniable freelance agents. Bob, Persephone Hazard, and Johnny McTavish are sent to Colorado to investigate Golden Promise Ministries. There they find a hidden cult within the church where the members are possessed by alien parasites that are trying to hasten the Apocalypse by summoning a chained monster from another dimension.</p> <p>Sequel to <a class="reference external" href="http://www.georgevreilly.com/blog/2016/01/25/ReviewTheFullerMemorandum.html">The Fuller Memorandum</a>. More at Charlie Stross's <a class="reference external" href="http://www.antipope.org/charlie/blog-static/2013/07/crib-sheet-the-apocalypse-code.html">Crib Sheet</a> and the <a class="reference external" href="http://thelaundryfiles.wikia.com/wiki/The_Apocalypse_Codex">Laundry Files Wiki</a>.</p> Review: The Jennifer Morgue tag:www.georgevreilly.com,2017-01-28:/blog/2017/01/28/ReviewTheJenniferMorgue.html 2017-01-28T08:00:00Z George V. Reilly http://www.georgevreilly.com/ george@reilly.org <a class="reference external image-reference" href="http://www.amazon.com/dp/0441016715/?tag=georgvreill-20"><img alt="The Jennifer Morgue" class="right-float" src="http://images.amazon.com/images/P/0441016715.01.MZZZZZZZ.jpg"/></a> <div class="line-block"> <div class="line">Title: The Jennifer Morgue</div> <div class="line">Author: Charles Stross</div> <div class="line">Rating: ★ ★ ★ ★ ½</div> <div class="line">Publisher: Ace</div> <div class="line">Copyright: 2006</div> <div class="line">ISBN: <a class="reference external" href="http://www.amazon.com/dp/0441016715/?tag=georgvreill-20">0441016715</a></div> <div class="line">Pages: 401</div> <div class="line">Keywords: Lovecraftian spy thriller</div> <div class="line">Series: <a class="reference external" href="http://www.antipope.org/charlie/blog-static/2016/04/faq-the-laundry-filesseries-ti.html">Laundry Files</a>, vol. 2</div> <div class="line">Reading period: 13–20 January, 2017</div> </div> <p>Bob Howard is a computational demonologist who works for the occult British spy agency informally known as the Laundry. He's a computer hacker who's starting to get some field experience, but nobody would confuse him with a suave ladykilling man of action. A billionaire is intent upon raising an eldritch horror from the depths of the sea. Only Bob, who has been “destiny entangled” with a sultry American operative, can stop him. Bob is the last to realize that Ellis Billington has protected himself with a <a class="reference external" href="https://en.wikipedia.org/wiki/Geas">geas</a>, casting himself as a Bond villain re-enacting <a class="reference external" href="https://en.wikipedia.org/wiki/Thunderball_(film)">Thunderball</a>, and that Bob—and only Bob—has to step into the Bond role.</p> <p>Stross has a lot of fun with the Bond tropes and he pulls it off. Recommended.</p> <p>Sequel to <a class="reference external" href="http://www.georgevreilly.com/blog/2017/01/16/ReviewTheAtrocityArchives.html">The Atrocity Archives</a>. More at Charlie Stross's <a class="reference external" href="http://www.antipope.org/charlie/blog-static/2013/06/crib-sheet-the-jennifer-morgue.html">Crib Sheet</a> and the <a class="reference external" href="http://thelaundryfiles.wikia.com/wiki/The_Jennifer_Morgue">Laundry Files Wiki</a>.</p>