<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Welcome to purpleidea.com on purpleidea.com</title>
    <link>https://purpleidea.com/</link>
    <description>Recent content in Welcome to purpleidea.com on purpleidea.com</description>
    <generator>Hugo</generator>
    <language>en-ca</language>
    <lastBuildDate>Wed, 24 Jun 2026 04:35:00 -0400</lastBuildDate>
    <atom:link href="https://purpleidea.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>My perspectives on AI/LLMs</title>
      <link>https://purpleidea.com/blog/2026/06/24/perspectives-on-ai-llms/</link>
      <pubDate>Wed, 24 Jun 2026 04:35:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2026/06/24/perspectives-on-ai-llms/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s a lot of talk about &amp;ldquo;AI&amp;rdquo; and &amp;ldquo;LLMs&amp;rdquo; recently. Here are my thoughts,&#xA;experiences, and perspectives about all that. There seems to be a growing rift&#xA;in the software industry about these tools. I&amp;rsquo;m publishing this post to make my&#xA;opinions as clear as possible. Of note, I&amp;rsquo;ve provided specific git commit&#xA;examples of some interesting results I&amp;rsquo;ve had when using these models.&lt;/p&gt;&#xA;&lt;br /&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2026/06/24/perspectives-on-ai-llms/watercolour.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2026/06/24/perspectives-on-ai-llms/watercolour.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Watercolour painted by a human artist.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Background&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;For a very long time, I have been, and still am, a strong Free Software&#xA;advocate. Everyone who knows me knows what I stand for. I&amp;rsquo;m about actions and&#xA;results, not just talk. I&amp;rsquo;ve spent a great amount of personal time and money&#xA;&lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;writing Free Software&lt;/a&gt; because I believe&#xA;it&amp;rsquo;s an important thing that our society needs. Without the four freedoms, we&#xA;empower hegemons to control our computing, our data and our lives. AI and LLMs&#xA;will accelerate our demise or uplift us. Let&amp;rsquo;s be smart about this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The switch as an ordinary GNU/Linux server</title>
      <link>https://purpleidea.com/blog/2026/04/09/the-switch-as-an-ordinary-gnulinux-server/</link>
      <pubDate>Thu, 09 Apr 2026 02:23:52 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2026/04/09/the-switch-as-an-ordinary-gnulinux-server/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://purpleidea.com/blog/2014/11/04/the-switch-as-an-ordinary-gnulinux-server/&#34;&gt;In 2014 I wrote an article about the switch as an ordinary GNU/Linux server.&lt;/a&gt;&#xA;This had been my dream since my early days using Linux to build routers and I&#xA;didn&amp;rsquo;t know why we didn&amp;rsquo;t use the same management interfaces on switches as we&#xA;did on Linux. The folks at &lt;em&gt;Cumulus Networks&lt;/em&gt; made this a reality and in 2014&#xA;they were kind enough to give me access to some hardware to test things out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>10 years of mgmt</title>
      <link>https://purpleidea.com/blog/2025/09/25/10-years-of-mgmt/</link>
      <pubDate>Thu, 25 Sep 2025 01:07:56 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2025/09/25/10-years-of-mgmt/</guid>
      <description>&lt;p&gt;I publicly released &lt;a href=&#34;https://mgmtconfig.com/&#34;&gt;mgmt&lt;/a&gt; to the internet 10 years&#xA;ago. I can&amp;rsquo;t believe it&amp;rsquo;s been 10 years. In this post I&amp;rsquo;ll talk about:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The new &lt;code&gt;mgmt&lt;/code&gt; company&lt;/li&gt;&#xA;&lt;li&gt;A one-time new customer offer&lt;/li&gt;&#xA;&lt;li&gt;Unexpected wins&lt;/li&gt;&#xA;&lt;li&gt;Past failures&lt;/li&gt;&#xA;&lt;li&gt;Some history&lt;/li&gt;&#xA;&lt;li&gt;A new release&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And more&amp;hellip;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The company&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;ve officially started a company. I&amp;rsquo;ve been working on this for some time now,&#xA;and it&amp;rsquo;s time to let you all know about it officially. As you already know&#xA;(&lt;code&gt;mgmt&lt;/code&gt;, &lt;code&gt;purpleidea&lt;/code&gt;, etc&amp;hellip;) I&amp;rsquo;ve never been great at naming. The company is&#xA;called:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Better git status</title>
      <link>https://purpleidea.com/blog/2025/08/04/better-git-status/</link>
      <pubDate>Mon, 04 Aug 2025 21:10:30 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2025/08/04/better-git-status/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using &lt;code&gt;git status&lt;/code&gt; for quite a long time now. Let&amp;rsquo;s make it better.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;My old aliases&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;My &lt;code&gt;~/.gitconfig&lt;/code&gt; has had:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[alias]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;s = status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;d = diff&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;l = log --show-signature&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;for as long as I can remember. They&amp;rsquo;ve served me well.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The problem&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;In one of my &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;projects&lt;/a&gt;, I occasionally&#xA;have a bunch of untracked files, particularly when I&amp;rsquo;m hacking on something new&#xA;that isn&amp;rsquo;t committed yet. This may include notes, new tests, and so on. My&#xA;terminal is usually between &lt;code&gt;24&lt;/code&gt; and &lt;code&gt;37&lt;/code&gt; lines tall. (Eg: run &lt;code&gt;tput lines&lt;/code&gt;.) If&#xA;there&amp;rsquo;s a lot of untracked stuff here, I&amp;rsquo;ll quickly go over this limit and have&#xA;to scroll to see what&amp;rsquo;s staged and so on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running etcd over SSH</title>
      <link>https://purpleidea.com/blog/2025/05/14/running-etcd-over-ssh/</link>
      <pubDate>Wed, 14 May 2025 19:45:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2025/05/14/running-etcd-over-ssh/</guid>
      <description>&lt;p&gt;Want to tunnel etcd traffic over SSH? Here&amp;rsquo;s a pitfall I ran into.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The problem&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://mgmtconfig.com/&#34;&gt;Mgmt&lt;/a&gt; supports tunnelling the &lt;code&gt;etcd&lt;/code&gt; traffic over SSH.&#xA;This is quite useful, because it means that for it to connect to etcd, it&#xA;doesn&amp;rsquo;t need to open up any new ports other than &lt;code&gt;22&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;You can run the agent like so:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mgmt run --ssh-url&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;etcd@etcdserver:22 --seeds&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;http://127.0.0.1:2379 --no-server --no-magic empty&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and it just works!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Working around an iPXE issue</title>
      <link>https://purpleidea.com/blog/2025/01/23/working-around-an-ipxe-issue/</link>
      <pubDate>Thu, 23 Jan 2025 21:34:56 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2025/01/23/working-around-an-ipxe-issue/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://ipxe.org/&#34;&gt;iPXE&lt;/a&gt; is a terrific tool, but despite their very respectable&#xA;documentation, it has some rough edges, and it still feels like an &amp;ldquo;in crowd&amp;rdquo;&#xA;kind of thing, where you have to learn the common tricks by knowing someone.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The problem&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;ve been building a &lt;a href=&#34;https://purpleidea.com/blog/2024/03/27/a-new-provisioning-tool/&#34;&gt;provisioning tool&lt;/a&gt;&#xA;in &lt;a href=&#34;https://mgmtconfig.com/&#34;&gt;mgmt&lt;/a&gt; and instead of always relying on&#xA;distro-specific boot images, I decided to use &lt;em&gt;iPXE&lt;/em&gt; to handle the early boot,&#xA;and have it hand-off to the kernel installer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Modules and imports in mgmt</title>
      <link>https://purpleidea.com/blog/2024/12/03/modules-and-imports-in-mgmt/</link>
      <pubDate>Tue, 03 Dec 2024 02:56:37 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2024/12/03/modules-and-imports-in-mgmt/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;Mgmt&lt;/a&gt; modules are used for structuring&#xA;your code across multiple files. This keeps things readable and allows for code&#xA;reusability. For example, it should be easy to write a single module which can&#xA;be effectively used by many different parties. To me, it never felt like code&#xA;reuse was a core design objective with other tools. In mgmt it has been since&#xA;the very beginning. I&amp;rsquo;m very proud of our module system, so let me introduce you&#xA;to it properly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mgmt Configuration Language: Functions</title>
      <link>https://purpleidea.com/blog/2024/11/22/functions-in-mgmt/</link>
      <pubDate>Fri, 22 Nov 2024 18:16:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2024/11/22/functions-in-mgmt/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a little while since I introduced the&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2018/02/05/mgmt-configuration-language/&#34;&gt;Mgmt Configuration Language&lt;/a&gt;. I&#xA;originally wrote this article in 2019, and as I was working on it alongside the&#xA;code for functions, when I realized that lambdas didn&amp;rsquo;t work properly. It took&#xA;some time to finally solve that properly. Since then I&amp;rsquo;ve been working to get &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt;&#xA;production ready. It&amp;rsquo;s properly useful for production now, and so it&amp;rsquo;s time for&#xA;me to catch up on my documentation. I&amp;rsquo;ve revived and updated this article, let&amp;rsquo;s&#xA;go&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Better dmesg in five minutes</title>
      <link>https://purpleidea.com/blog/2024/11/17/better-dmesg/</link>
      <pubDate>Sun, 17 Nov 2024 15:52:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2024/11/17/better-dmesg/</guid>
      <description>&lt;p&gt;I last wrote about &lt;code&gt;dmesg&lt;/code&gt; in &lt;a href=&#34;https://purpleidea.com/blog/2016/08/29/live-dmesg-following/&#34;&gt;2016&lt;/a&gt;. It&#xA;has mostly not changed since then, but I&amp;rsquo;ve changed my setup slightly. Here&amp;rsquo;s a&#xA;short article about what I did so that you can do it too, and so that I can&#xA;remember for the next time.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Previously&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;Previous I had a bash alias which looked like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias dmesg=&amp;#39;dmesg --follow || dmesg&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;since some machines didn&amp;rsquo;t yet support the &lt;code&gt;--follow&lt;/code&gt; flag.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A new provisioning tool built with mgmt</title>
      <link>https://purpleidea.com/blog/2024/03/27/a-new-provisioning-tool/</link>
      <pubDate>Wed, 27 Mar 2024 16:58:57 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2024/03/27/a-new-provisioning-tool/</guid>
      <description>&lt;p&gt;Today I&amp;rsquo;m announcing a new type of provisioning tool. This is both the&#xA;culmination of a long road, and the start of a new era. Please read on for all&#xA;of the details. Feel free to skip to the relevant sections you&amp;rsquo;re interested in&#xA;if you don&amp;rsquo;t want all of the background.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Ten years&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;The vision for this specific tool started around ten years ago. Previously, as a&#xA;sysadmin, I spent a lot of my time using a configuration management tool called&#xA;&lt;code&gt;puppet&lt;/code&gt;. I eventually realized and accepted the shortcomings of the tool after&#xA;a failed attempt to combine &lt;code&gt;puppet&lt;/code&gt; and some python scripts into a provisioning&#xA;and clustering tool that I was trying to build for greenfield environments. The&#xA;idea is that it would bootstrap a whole suite of infrastructure services for a&#xA;new data centre.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bash $PATH filtering</title>
      <link>https://purpleidea.com/blog/2024/03/02/bash-path-filtering/</link>
      <pubDate>Sat, 02 Mar 2024 19:54:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2024/03/02/bash-path-filtering/</guid>
      <description>&lt;p&gt;As most modern GNU+Linux distro users already know, you get a lot of &lt;a href=&#34;https://en.wikipedia.org/wiki/GNU&#34;&gt;tools&lt;/a&gt;&#xA;included for free! Many of these may clutter up your &lt;code&gt;$PATH&lt;/code&gt; and make &lt;code&gt;bash&lt;/code&gt; tab&#xA;completion more difficult than it has to be. Here&amp;rsquo;s a way to improve this!&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;A mess&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;Here&amp;rsquo;s what I see when I tab-complete &lt;code&gt;cd&amp;lt;TAB&amp;gt;&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:~$ &lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt;                 cddb_query         cd-info            cd-read&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd-convert         cd-drive           cd-it8             cdrecord&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd-create-profile  cd-fix-profile     cdmkdir            cdtmpmkdir&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cdda-player        cd-iccdump         cd-paranoia&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I genuinely only use three of those commands.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upcoming Speaking and Events</title>
      <link>https://purpleidea.com/blog/2024/01/31/upcoming-speaking-and-events/</link>
      <pubDate>Wed, 31 Jan 2024 09:57:30 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2024/01/31/upcoming-speaking-and-events/</guid>
      <description>&lt;p&gt;There are &lt;em&gt;three&lt;/em&gt; upcoming &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmtconfig&lt;/a&gt;&#xA;events happening within the next &lt;em&gt;seven&lt;/em&gt; days!&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;mgmt @ FOSDEM&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;On February 3rd, I&amp;rsquo;ll be giving a talk in the &lt;a href=&#34;https://fosdem.org/2024/schedule/event/fosdem-2024-2575-single-binary-full-stack-provisioning/&#34;&gt;golang devroom at FOSDEM&lt;/a&gt;. Please come early (1hr+) if you want to get a seat, usually this&#xA;room is especially full. This happens in Brussels, but it should be recorded if&#xA;there aren&amp;rsquo;t any technical glitches.&lt;/p&gt;&#xA;&lt;p&gt;(I got rejected for the main track, but it&amp;rsquo;s my fault because I need to make my&#xA;work more generally appealing first.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git branch filtering</title>
      <link>https://purpleidea.com/blog/2024/01/28/git-branch-filtering/</link>
      <pubDate>Sun, 28 Jan 2024 17:04:30 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2024/01/28/git-branch-filtering/</guid>
      <description>&lt;p&gt;If you have more than one git branch up in the air at the same time, having a&#xA;system to track them and filter them is essential. Here are the stages I went&#xA;through with &lt;code&gt;git branch&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://xkcd.com/1597/&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2024/01/28/git-branch-filtering/git_2x.png&#34;  width=&#34;50%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;xkcd reminds us that we&amp;#39;re insane&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Prefixes&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;My first tip involves using a memorable prefix. For new features I name my&#xA;branches with &lt;code&gt;feat/&lt;/code&gt;. For example &lt;code&gt;feat/my-new-feature&lt;/code&gt;. Yes the slash and the&#xA;dashes are treated like any regular character. I also commonly use &lt;code&gt;bug/&lt;/code&gt;. You&#xA;can see all of the branches with &lt;code&gt;git branch -a&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Five minute hacks: Swapping left and right headphone audio in wireplumber</title>
      <link>https://purpleidea.com/blog/2023/11/22/swapping-left-and-right-headphone-audio-in-wireplumber/</link>
      <pubDate>Wed, 22 Nov 2023 17:25:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2023/11/22/swapping-left-and-right-headphone-audio-in-wireplumber/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m on Fedora 37 at the moment. My headphone audio is backwards. How do we fix&#xA;it? I&amp;rsquo;ve apparently never found the right magic until now.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The Setup&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I have a crappy &amp;ldquo;couch computer&amp;rdquo;. It&amp;rsquo;s used for casual internet browsing and&#xA;video watching. It has an analog audio out which goes to my speakers. I&amp;rsquo;d like&#xA;to use headphones for when I don&amp;rsquo;t want to annoy my neighbours. I have a pair of&#xA;wireless headphones that I got for free, but the battery doesn&amp;rsquo;t last longer&#xA;than an hour. I also have an old pair of analog headphones that work okay and&#xA;don&amp;rsquo;t run out of battery! I got a free USB to analog dongle, but for some reason&#xA;the left and right audio channels are reversed!&lt;/p&gt;</description>
    </item>
    <item>
      <title>One minute hacks: Saving time inserting images in Libreoffice</title>
      <link>https://purpleidea.com/blog/2023/08/02/one-minute-hacks-saving-time-inserting-images-in-libreoffice/</link>
      <pubDate>Wed, 02 Aug 2023 13:35:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2023/08/02/one-minute-hacks-saving-time-inserting-images-in-libreoffice/</guid>
      <description>&lt;p&gt;You&amp;rsquo;ve probably used libreoffice. You opened a document, and proceeded to insert&#xA;an image into the text. It wiggles all over and never rests where you want it&#xA;to.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The solution&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;You most likely want the &amp;ldquo;anchor as character&amp;rdquo; option. Right-click on the newly&#xA;inserted image, go to the &lt;code&gt;Anchor&lt;/code&gt; menu item, and choose &lt;code&gt;As Character&lt;/code&gt;. You&#xA;will have to do this for each image you insert which is annoying&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>UEFI booting, and with a new kernel module</title>
      <link>https://purpleidea.com/blog/2023/07/24/uefi-booting-and-with-a-new-kernel-module/</link>
      <pubDate>Mon, 24 Jul 2023 17:22:22 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2023/07/24/uefi-booting-and-with-a-new-kernel-module/</guid>
      <description>&lt;p&gt;Picture this. You&amp;rsquo;ve got a supermicro server. It&amp;rsquo;s got eight hot-swappable 3.5&amp;quot;&#xA;HDD&amp;rsquo;s. You want to use all of those for storage, so you buy a &lt;a href=&#34;#addon&#34;&gt;nifty add-on&lt;/a&gt;&#xA;that let&amp;rsquo;s you add four additional 2.5&amp;quot; SSD&amp;rsquo;s. Those are great for your OS.&#xA;That&amp;rsquo;s a great way to keep your data separate. The motherboard only supports&#xA;eight drives, so you&amp;rsquo;ll need an &lt;a href=&#34;https://en.wikipedia.org/wiki/Host_adapter&#34;&gt;HBA&lt;/a&gt;&#xA;for the additional four&amp;hellip; What are some catches and things you need to watch&#xA;out for?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Improving git diff output in 5 min</title>
      <link>https://purpleidea.com/blog/2023/06/01/improving-git-diff-output-in-5-min/</link>
      <pubDate>Thu, 01 Jun 2023 18:20:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2023/06/01/improving-git-diff-output-in-5-min/</guid>
      <description>&lt;p&gt;Everyone uses &lt;code&gt;git diff&lt;/code&gt;. But there&amp;rsquo;s that odd annoyance that you&amp;rsquo;ve probably&#xA;seen before but are so used to that you&amp;rsquo;ve forgotten about it. The &lt;code&gt;a/&lt;/code&gt; and &lt;code&gt;b/&lt;/code&gt;&#xA;prefixes&amp;hellip;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Example&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:~/code/mgmt &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;feat/cool-feature&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;$ git diff&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;diff --git a/lang/funcs/core/os/readfile_func.go b/lang/funcs/core/os/readfile_func.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;index 206ba798d..48ac29dc7 &lt;span style=&#34;color:#666&#34;&gt;100644&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--- a/lang/funcs/core/os/readfile_func.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+++ b/lang/funcs/core/os/readfile_func.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ -228,6 +228,8 @@ func &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;obj *ReadFileFunc&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt; Stream&lt;span style=&#34;color:#666&#34;&gt;()&lt;/span&gt; error &lt;span style=&#34;color:#666&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; // Close runs some shutdown code &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;for&lt;/span&gt; this &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;function&lt;/span&gt; and turns off the stream.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; func &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;obj *ReadFileFunc&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt; Close&lt;span style=&#34;color:#666&#34;&gt;()&lt;/span&gt; error &lt;span style=&#34;color:#666&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+       // TODO: Port to the new ctx-in-Stream close API.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+       // Hello blog readers!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        close&lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;obj.closeChan&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        obj.wg.Wait&lt;span style=&#34;color:#666&#34;&gt;()&lt;/span&gt;     // block so we don&lt;span style=&#34;&#34;&gt;&amp;#39;&lt;/span&gt;t &lt;span style=&#34;color:#a2f&#34;&gt;exit&lt;/span&gt; by the closure of obj.events&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        close&lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;obj.events&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;What are they for?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;The &lt;code&gt;git diff&lt;/code&gt; command shows these to help you differentiate between the source&#xA;and the destination files. In most cases you are in the midst of looking at and&#xA;writing code, so you&amp;rsquo;ll probably instinctively know whether you or something&#xA;just added or deleted those lines. (Because if you flipped &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; you&amp;rsquo;d&#xA;have the opposite diff.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blocked select logging (deadlock finding) in golang</title>
      <link>https://purpleidea.com/blog/2023/05/26/blocked-select-logging-in-golang/</link>
      <pubDate>Fri, 26 May 2023 01:21:22 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2023/05/26/blocked-select-logging-in-golang/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been writing some massively concurrent code for &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt;&#xA;lately. The concurrency makes it incredibly bug prone. In this case it&amp;rsquo;s usually&#xA;races or deadlocks. I&amp;rsquo;ve got a new trick to make the process more pleasant.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The Problem&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;m sure many of you have written some code like this before:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-golang&#34; data-lang=&#34;golang&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// just a small excerpt&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&#x9;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;select&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&#x9;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;case&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;&amp;lt;-&lt;/span&gt;someEvent:&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// some awesome thing happened!&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&#x9;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;case&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;&amp;lt;-&lt;/span&gt;ctx.&lt;span style=&#34;color:#00a000&#34;&gt;Done&lt;/span&gt;():&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ctx.&lt;span style=&#34;color:#00a000&#34;&gt;Err&lt;/span&gt;()&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&#x9;&lt;/span&gt;}&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;}&lt;span style=&#34;color:#bbb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And during debugging, you might have gotten frustrated and added some printf&amp;rsquo;s:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deadline context test cancellation in golang</title>
      <link>https://purpleidea.com/blog/2023/02/24/deadline-context-test-cancellation-in-golang/</link>
      <pubDate>Fri, 24 Feb 2023 22:36:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2023/02/24/deadline-context-test-cancellation-in-golang/</guid>
      <description>&lt;p&gt;I decided to write a fancy test harness in golang today. The test wraps a big&#xA;internal engine for &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt; and at the&#xA;top-level it takes a &lt;a href=&#34;https://pkg.go.dev/context&#34;&gt;context&lt;/a&gt; for cancellation. If&#xA;you don&amp;rsquo;t know about the &lt;code&gt;context&lt;/code&gt; package, then you should go understand that&#xA;and then come back here&amp;hellip; Don&amp;rsquo;t feel bad, I had no idea what it was about at&#xA;first either!&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The Problem&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I assumed there would be some way to follow a notification from the test runner&#xA;down into my test to tell it when it was time to cleanup and exit early&amp;hellip; I&#xA;expected that making my own &lt;code&gt;^C&lt;/code&gt; signal handler wouldn&amp;rsquo;t be correct, and I&#xA;(incorrectly) assumed that the interface I&amp;rsquo;d be looking for would offer a golang&#xA;&lt;code&gt;context&lt;/code&gt; that I could pass into my code. I was wrong, but I was on the right&#xA;track and it did help me find what I was looking for. Let me explain the subtlety&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Magic typing with shortcuts on Linux</title>
      <link>https://purpleidea.com/blog/2021/06/15/magic-typing-with-shortcuts-on-linux/</link>
      <pubDate>Wed, 16 Jun 2021 00:40:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2021/06/15/magic-typing-with-shortcuts-on-linux/</guid>
      <description>&lt;p&gt;Ever find yourself typing more characters than is necessary when using some&#xA;annoying application or website? Here&amp;rsquo;s a quick hack around that.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Intro&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;There&amp;rsquo;s a magic program called &lt;code&gt;xdotool&lt;/code&gt; written by &lt;a href=&#34;https://twitter.com/jordansissel/&#34;&gt;Jordan Sissel&lt;/a&gt;&#xA;that solves this problem. I&amp;rsquo;ve known about his excellent work for years, but&#xA;only today did I learn he also wrote &lt;code&gt;xdotool&lt;/code&gt;. It&amp;rsquo;s named as such because it&#xA;tells the &lt;code&gt;X&lt;/code&gt; server to do something for you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>USB Audio on a Boombox</title>
      <link>https://purpleidea.com/blog/2021/01/11/usb-audio-on-a-boombox/</link>
      <pubDate>Mon, 11 Jan 2021 04:00:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2021/01/11/usb-audio-on-a-boombox/</guid>
      <description>&lt;p&gt;In an earlier post, &lt;a href=&#34;https://purpleidea.com/blog/2020/08/11/usb-car-audio-in-a-civic/&#34;&gt;I got USB audio working on my used, manual, 2013 Honda Civic EX&lt;/a&gt;.&#xA;Today I&amp;rsquo;ll do the same for a Sony ZS-RS60BT &lt;a href=&#34;https://en.wikipedia.org/wiki/Boombox&#34;&gt;boombox&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2021/01/11/usb-audio-on-a-boombox/boombox.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2021/01/11/usb-audio-on-a-boombox/boombox.jpg&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Here it is in all its used glory after a little cleaning.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Background&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I decided I should get a small portable boombox to practice my &lt;a href=&#34;https://en.wikipedia.org/wiki/Popping&#34;&gt;dope dance moves&lt;/a&gt;.&#xA;I currently still suck because I think I spend more time computering than out on&#xA;the floor. In any case, in a stroke of luck, I happened upon a used boombox that&#xA;was getting discarded due to a broken CD player. Nobody seemed either able or&#xA;interested in getting USB audio working, so I took it home and gave it a go!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Working at Amazon</title>
      <link>https://purpleidea.com/blog/2020/12/28/working-at-amazon/</link>
      <pubDate>Mon, 28 Dec 2020 08:27:35 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2020/12/28/working-at-amazon/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I&amp;rsquo;ve got a new job working for &lt;a href=&#34;https://aws.amazon.com/&#34;&gt;Amazon&lt;/a&gt;, in&#xA;the &amp;ldquo;Open Source Program Office&amp;rdquo;. I&amp;rsquo;m now an Amazoner!&#xA;More information below&amp;hellip;&#xA;&lt;br /&gt;&#xA;&lt;br /&gt;&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2020/12/28/working-at-amazon/amazon.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2020/12/28/working-at-amazon/amazon.jpg&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The Amazon. Source: https://en.wikipedia.org/wiki/Amazon_rainforest&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Background&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;A little over three months ago, &lt;a href=&#34;https://purpleidea.com/blog/2020/09/10/james-is-available-for-hire/&#34;&gt;I decided to get back into full-time work&lt;/a&gt;.&#xA;For the past 2.5 years since &lt;a href=&#34;https://purpleidea.com/blog/2018/04/04/leaving-redhat/&#34;&gt;I left my job at Red Hat&lt;/a&gt;,&#xA;I&amp;rsquo;ve been mostly working full-time on &lt;a href=&#34;https://purpleidea.com/projects/mgmt-config/&#34;&gt;Mgmt Config&lt;/a&gt; and&#xA;my &lt;a href=&#34;https://purpleidea.com/projects/mentoring-program/&#34;&gt;DevOps/SWE Mentoring Program&lt;/a&gt;. To do such&#xA;things, I had to live off of my savings, which isn&amp;rsquo;t sustainable long-term. I am&#xA;thankful that I was able to do so for so long. It was time to dive back in, and&#xA;here I am.&lt;/p&gt;</description>
    </item>
    <item>
      <title>James is available for hire!</title>
      <link>https://purpleidea.com/blog/2020/09/10/james-is-available-for-hire/</link>
      <pubDate>Thu, 10 Sep 2020 08:00:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2020/09/10/james-is-available-for-hire/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I&amp;rsquo;m available for hire. Experienced at Linux/Golang/Mentoring/etc.&#xA;More information below!&lt;/p&gt;&#xA;&lt;br /&gt;&#xA;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2020/09/10/james-is-available-for-hire/james-working.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2020/09/10/james-is-available-for-hire/james-working.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A drawing of me coding away.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;/td&gt;&lt;td&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2020/09/10/james-is-available-for-hire/james-speaking.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2020/09/10/james-is-available-for-hire/james-speaking.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A photo of me giving a talk to a sold-out crowd.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Background&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;Two years ago, &lt;a href=&#34;https://purpleidea.com/blog/2018/04/04/leaving-redhat/&#34;&gt;I left my job at Red Hat&lt;/a&gt; to&#xA;work on &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt config&lt;/a&gt; full-time. I&amp;rsquo;m still&#xA;passionate about this project, and I&amp;rsquo;m proud of the progress that has been made&#xA;in the last two years, but it&amp;rsquo;s time for me to explore new opportunities as&#xA;well. My years of experience building mgmt has taught me a lot about open&#xA;source, golang and mentoring others, and I hope this makes me a valuable&#xA;addition to your team.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Inexpensive Dynamic DNS over IRC</title>
      <link>https://purpleidea.com/blog/2020/09/01/inexpensive-dns-over-irc/</link>
      <pubDate>Tue, 01 Sep 2020 17:08:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2020/09/01/inexpensive-dns-over-irc/</guid>
      <description>&lt;p&gt;The one thing that I&amp;rsquo;ve been using for longer than &lt;code&gt;ssh&lt;/code&gt; is dynamic dns. In this&#xA;article I&amp;rsquo;ll explain how I built an inexpensive, reliable, private alternative&#xA;to the mainstream tools commonly available today using only golang and &lt;a href=&#34;https://en.wikipedia.org/wiki/Internet_Relay_Chat&#34;&gt;IRC&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Background&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;ve had an account with &lt;code&gt;dyndns.org&lt;/code&gt; for a long time. They used to be free, but&#xA;then they cut off the free tier, but left existing accounts alone, until they&#xA;eventually cut all the non-payers off entirely. I think we need an inexpensive&#xA;way of giving up-and-coming GNU+Linux hackers a way to &lt;code&gt;ssh&lt;/code&gt; home, and run their&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2013/10/18/desktop-notifications-for-irssi-in-screen-through-ssh-in-gnome-terminal/&#34;&gt;irssi sessions&lt;/a&gt;,&#xA;without having to pay. I also wanted something reliable that wouldn&amp;rsquo;t disappear&#xA;the way dyndns did.&lt;/p&gt;</description>
    </item>
    <item>
      <title>USB Car Audio in a Civic</title>
      <link>https://purpleidea.com/blog/2020/08/11/usb-car-audio-in-a-civic/</link>
      <pubDate>Mon, 24 Aug 2020 01:30:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2020/08/11/usb-car-audio-in-a-civic/</guid>
      <description>&lt;p&gt;Transportation is very important to me. My whole life I&amp;rsquo;ve never owned a car. I&#xA;have gotten by with biking, public transit, and various car sharing services.&#xA;Sadly, biking is incredibly dangerous and stressful, because most cars don&amp;rsquo;t&#xA;respect bicycles, and in the winter it&amp;rsquo;s not very practical, the&#xA;&lt;a href=&#34;https://www.stm.info/en&#34;&gt;STM&lt;/a&gt; (public transit) offers an incredibly unreliable&#xA;and unpleasant service, and &lt;a href=&#34;https://www.car2go.com/&#34;&gt;Car2Go&lt;/a&gt; (car sharing) now&#xA;requires that you use their proprietary smart phone app (you used to be able to&#xA;just swipe the membership card) so I finally gave up and decided to buy a used&#xA;car.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mgmt Configuration Language: Class and Include</title>
      <link>https://purpleidea.com/blog/2019/07/26/class-and-include-in-mgmt/</link>
      <pubDate>Fri, 26 Jul 2019 06:35:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2019/07/26/class-and-include-in-mgmt/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a little over a year since I introduced the&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2018/02/05/mgmt-configuration-language/&#34;&gt;Mgmt Configuration Language&lt;/a&gt;. A&#xA;lot has happened since then, and I&amp;rsquo;d like to introduce some of the missing&#xA;features that weren&amp;rsquo;t available when the language was first introduced. If you&#xA;haven&amp;rsquo;t already read that &lt;a href=&#34;https://purpleidea.com/blog/2018/02/05/mgmt-configuration-language/&#34;&gt;post&lt;/a&gt;,&#xA;please start there and come back when you&amp;rsquo;re finished. In this article we&amp;rsquo;ll&#xA;learn about classes.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Classes&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;You might remember that the &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;&lt;em&gt;mgmt&lt;/em&gt;&lt;/a&gt;&#xA;language called &lt;code&gt;mcl&lt;/code&gt; has both &lt;code&gt;statements&lt;/code&gt;, and &lt;code&gt;expressions&lt;/code&gt;. Statements&#xA;ultimately produce the &lt;code&gt;resources&lt;/code&gt; and &lt;code&gt;edges&lt;/code&gt; that make up our output graph,&#xA;and expressions produce the values (strings, integers, lists, etc) that make up&#xA;the inputs to those statements.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upcoming Speaking and Events</title>
      <link>https://purpleidea.com/blog/2019/02/02/upcoming-speaking-and-events/</link>
      <pubDate>Sat, 02 Feb 2019 03:00:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2019/02/02/upcoming-speaking-and-events/</guid>
      <description>&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;mgmt @ FOSDEM&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;Later today I&amp;rsquo;m giving four talks about &lt;a href=&#34;https://github.com/purpleidea/mgmt&#34;&gt;mgmt&lt;/a&gt;&#xA;at &lt;a href=&#34;https://fosdem.org/2019/schedule/speaker/james_shubin/&#34;&gt;FOSDEM&lt;/a&gt;. I&amp;rsquo;m also&#xA;giving two more on the following day. (One is a 5 min lightning talk.) I don&amp;rsquo;t&#xA;know how I got accepted for so many talks, I just replied to the CFP for every&#xA;room where I thought I had something interesting to share, and well, here we&#xA;are!&lt;/p&gt;&#xA;&lt;p&gt;I got rejected for the main track again, but I guess it&amp;rsquo;s up to me to make my&#xA;work more generally appealing first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A guide to fighting with a Cisco access point</title>
      <link>https://purpleidea.com/blog/2018/12/21/a-guide-to-fighting-with-a-cisco-access-point/</link>
      <pubDate>Fri, 21 Dec 2018 07:45:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2018/12/21/a-guide-to-fighting-with-a-cisco-access-point/</guid>
      <description>&lt;p&gt;In my hands is a &lt;strong&gt;Cisco AIR-CAP-3502-E-A-K9&lt;/strong&gt; that I saved from the landfill.&#xA;After about eight hours of suffering, and what was surely a cancer causing dose&#xA;of &lt;a href=&#34;https://en.wikipedia.org/wiki/Radio_frequency&#34;&gt;RF-radiation&lt;/a&gt;, I now know:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;How to convince this access point to provide me with wifi.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Why Cisco products are probably best left in the garbage.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;What follows is my setup guide and review for using a Cisco Aironet device. This&#xA;guide will likely be useful with other models of Cisco devices, but use your own&#xA;best judgment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The End of a Red Giant</title>
      <link>https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/</link>
      <pubDate>Tue, 30 Oct 2018 08:39:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/</guid>
      <description>&lt;p&gt;As I&amp;rsquo;m sure you&amp;rsquo;ve now heard, &lt;a href=&#34;https://www.redhat.com/en/about/press-releases/ibm-acquire-red-hat-completely-changing-cloud-landscape-and-becoming-world%E2%80%99s-1-hybrid-cloud-provider&#34;&gt;Red Hat is being acquired by IBM&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Reactions have ranged from:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/reddit1.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/reddit1.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The first two emotions everyone experienced.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;p&gt;to:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/twitter1.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/twitter1.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The classic humourous response.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;p&gt;to:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/twitter2.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/twitter2.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The classy response.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;p&gt;to:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/reddit2.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2018/10/30/the-end-of-a-red-giant/reddit2.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The thing we&amp;#39;re all curious about.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;p&gt;to everything in between. If someone were to leak me a copy of the memo-list&#xA;&lt;em&gt;2018-October.txt.gz&lt;/em&gt; mailman archive, I&amp;rsquo;d sure love to see that! (Of course I&amp;rsquo;m&#xA;joking and I wouldn&amp;rsquo;t actually ask anyone to do this.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hyperlinks in GNOME terminal</title>
      <link>https://purpleidea.com/blog/2018/06/29/hyperlinks-in-gnome-terminal/</link>
      <pubDate>Fri, 29 Jun 2018 21:45:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2018/06/29/hyperlinks-in-gnome-terminal/</guid>
      <description>&lt;p&gt;Over the years I&amp;rsquo;ve learned about many of the advantages of using a modern&#xA;terminal and shell. I&amp;rsquo;m talking about using &lt;a href=&#34;https://www.gnu.org/software/bash/&#34;&gt;&lt;code&gt;bash&lt;/code&gt;&lt;/a&gt;&#xA;with &lt;a href=&#34;https://en.wikipedia.org/wiki/GNOME_Terminal&#34;&gt;GNOME terminal&lt;/a&gt; on a modern&#xA;&lt;a href=&#34;https://getfedora.org/&#34;&gt;GNU/Linux&lt;/a&gt; distribution.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://purpleidea.com/blog/2013/03/22/running-your-file-manager-from-a-terminal/&#34;&gt;I particularly like switching between the terminal and GUI applications.&lt;/a&gt;&#xA;It&amp;rsquo;s now even better.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Automatic Hyperlinks&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;Occasionally, some program running in your shell might output what looked like a&#xA;link:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/blog/2018/06/29/hyperlinks-in-gnome-terminal/gnome-terminal-link.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/blog/2018/06/29/hyperlinks-in-gnome-terminal/gnome-terminal-link.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;gnome terminal and vte will automatically add links to text that looks like a web hyperlink or an email address&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;p&gt;They can be seen when you hover over them, and a right-click will display a&#xA;useful context menu:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Breaking out of the Slack walled garden</title>
      <link>https://purpleidea.com/blog/2018/06/22/breaking-out-of-the-slack-walled-garden/</link>
      <pubDate>Fri, 22 Jun 2018 13:50:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2018/06/22/breaking-out-of-the-slack-walled-garden/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m old school cool. Real hackers chat on open, distributed platforms. Most&#xA;technical discussion can be found on the &lt;a href=&#34;https://libera.chat/&#34;&gt;Libera.chat&lt;/a&gt; IRC&#xA;network. It&amp;rsquo;s not perfect, but the advantages clearly outweigh the drawbacks.&lt;/p&gt;&#xA;&lt;p&gt;Recently, I needed to join an existing large &amp;ldquo;community&amp;rdquo; on the centralized,&#xA;proprietary &lt;a href=&#34;https://en.wikipedia.org/wiki/Closed_platform&#34;&gt;walled garden&lt;/a&gt; that&#xA;is the &lt;a href=&#34;https://slack.com/&#34;&gt;Slack&lt;/a&gt; network.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The Problem&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;Connecting to the the Slack server requires that you use either the proprietary&#xA;client or their proprietary web app. There&amp;rsquo;s zero chance I will install the&#xA;former on my machine, and the latter uses an absurd amount of browser memory and&#xA;CPU. I&amp;rsquo;m already happy with my &lt;a href=&#34;https://irssi.org/&#34;&gt;&lt;em&gt;irssi&lt;/em&gt;&lt;/a&gt; experience, and I&#xA;didn&amp;rsquo;t want to need another app.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A new sync primitive in golang</title>
      <link>https://purpleidea.com/blog/2018/05/20/a-new-sync-primitive-in-golang/</link>
      <pubDate>Sun, 20 May 2018 18:00:00 -0400</pubDate>
      <guid>https://purpleidea.com/blog/2018/05/20/a-new-sync-primitive-in-golang/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on lots of new stuff in &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt;&#xA;and I had a synchronization problem that needed solving&amp;hellip; Long story short, I&#xA;built it into a piece of re-usable functionality, exactly like you might find in&#xA;the &lt;em&gt;&lt;a href=&#34;https://golang.org/pkg/sync/&#34;&gt;sync&lt;/a&gt;&lt;/em&gt; package. For details and examples,&#xA;please continue reading&amp;hellip;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The Problem&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I want to multicast a signal to an arbitrary number of goroutines. As you might&#xA;already know, this can already be done with a &lt;code&gt;chan struct{}&lt;/code&gt;. You simply&#xA;&lt;code&gt;close&lt;/code&gt; the channel to send the signal, and anyone running a &lt;code&gt;select&lt;/code&gt; on that&#xA;channel will return when it closes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Leaving Red Hat</title>
      <link>https://purpleidea.com/blog/2018/04/04/leaving-redhat/</link>
      <pubDate>Wed, 04 Apr 2018 06:27:35 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2018/04/04/leaving-redhat/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve spent about &lt;a href=&#34;https://purpleidea.com/blog/2014/04/02/working-at-redhat/&#34;&gt;four years at Red Hat&lt;/a&gt;,&#xA;and now it&amp;rsquo;s time to move on&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;TL;DR:&lt;/em&gt; had to leave Red Hat and start &lt;a href=&#34;https://www.patreon.com/purpleidea&#34;&gt;Patreon&lt;/a&gt;&#xA;to fund &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;What follows is a bit of historical rambling, and some forward looking&#xA;statements.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;Retrospective&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;Long-time readers of my blog will know that I was very active in the&#xA;&lt;a href=&#34;https://purpleidea.com/tags/puppet/&#34;&gt;puppet ecosystem&lt;/a&gt; for many years. I learned a lot while writing&#xA;puppet code, and while building some of my&#xA;&lt;a href=&#34;https://www.youtube.com/watch?v=hXIEJEE5d_4&#34;&gt;outrageous puppet hacks&lt;/a&gt;. Over&#xA;this time, I had quietly put together some design notes and a prototype for some&#xA;&amp;ldquo;future tool&amp;rdquo; ideas. I had code-named this project &amp;ldquo;&lt;em&gt;puppet-ng&lt;/em&gt;&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running `make` from anywhere</title>
      <link>https://purpleidea.com/blog/2018/03/10/running-make-from-anywhere/</link>
      <pubDate>Sat, 10 Mar 2018 02:00:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2018/03/10/running-make-from-anywhere/</guid>
      <description>&lt;p&gt;Sometimes while I&amp;rsquo;m deep inside &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt;&amp;rsquo;s&#xA;project directory, I want to run an operation from the &lt;code&gt;Makefile&lt;/code&gt; which lives in&#xA;the root! Unfortunately, if you do so while nested, you&amp;rsquo;ll just get:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:~/code/mgmt/resources$ make build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make: *** No rule to make target &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;build&amp;#39;&lt;/span&gt;.  Stop.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;br /&gt;&lt;span style=&#34;text-decoration:underline; font-weight: bold;&#34;&gt;The Ten Minute Solution&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&#xA;&#xA;&lt;p&gt;I figured I&amp;rsquo;d hack out a quick solution. What I came up with looks like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# James Shubin, 2018&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# run `make` in the first directory (or its parent recursively) that it works in&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;MF&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Makefile&amp;#39;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# looks for this file, could look for others, but that&amp;#39;s silly&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;CWD&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;pwd&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# starting here&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;while&lt;/span&gt; true; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;[&lt;/span&gt; -e &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$MF&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;make &lt;span style=&#34;color:#b8860b&#34;&gt;$@&lt;/span&gt;&#x9;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# run make!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#b8860b&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$?&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$CWD&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# go home first&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#a2f&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$e&lt;/span&gt;&#x9;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# pass on the exit status&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# stop if we get home&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;pwd&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$HOME&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$CWD&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#a2f&#34;&gt;exit&lt;/span&gt; 2&#x9;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# the exit status of `make` when it errors&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#echo &amp;#34;searching...&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; ..&#x9;&#x9;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# go up one dir&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can probably figure it out quite easily from the code, but what this does is&#xA;it searches upwards until it finds a &lt;code&gt;Makefile&lt;/code&gt;, and then runs your command from&#xA;there!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mgmt Configuration Language</title>
      <link>https://purpleidea.com/blog/2018/02/05/mgmt-configuration-language/</link>
      <pubDate>Mon, 05 Feb 2018 00:00:00 -0500</pubDate>
      <guid>https://purpleidea.com/blog/2018/02/05/mgmt-configuration-language/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;Mgmt&lt;/a&gt; has given us a lot of great&#xA;features, demos, and insight into how infrastructure automation should be&#xA;managed. Unfortunately it wasn&amp;rsquo;t a complete tool yet, because it was missing a&#xA;crucial piece for its completeness. That all changes today with the addition of:&#xA;the &lt;strong&gt;language&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;br /&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;An ideal language allows us to express easily what is useful for the programming task, and at the same time makes it difficult to write what leads to incomprehensible or incorrect programs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hello World!</title>
      <link>https://purpleidea.com/blog/hello-world/</link>
      <pubDate>Mon, 13 Nov 2017 09:18:15 -0500</pubDate>
      <guid>https://purpleidea.com/blog/hello-world/</guid>
      <description>&lt;p&gt;Hello! This is a new version of my website and blog. If you experience any&#xA;issues, please let me know!&lt;/p&gt;&#xA;&lt;p&gt;Happy Hacking,&#xA;James&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Copyleft is Dead. Long live Copyleft!</title>
      <link>https://purpleidea.com/blog/2017/10/17/copyleft-is-dead-long-live-copyleft/</link>
      <pubDate>Tue, 17 Oct 2017 21:22:05 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2017/10/17/copyleft-is-dead-long-live-copyleft/</guid>
      <description>&lt;p&gt;As you may have noticed, we recently re-licensed &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt; from the &lt;a href=&#34;https://www.gnu.org/licenses/why-affero-gpl.html&#34;&gt;AGPL&lt;/a&gt; (&lt;em&gt;Affero&lt;/em&gt; General Public License) to the regular &lt;a href=&#34;https://www.gnu.org/licenses/quick-guide-gplv3.html&#34;&gt;GPL&lt;/a&gt;. This is a post explaining the decision and which hopefully includes some insights at the intersection of technology and legal issues.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Disclaimer&lt;/span&gt;:&lt;/p&gt;&#xA;&lt;p&gt;I am not a lawyer, and these are not necessarily the opinions of my employer. I think I&amp;rsquo;m knowledgeable in this area, but I&amp;rsquo;m happy to be corrected in the comments. I&amp;rsquo;m friends with a number of lawyers, and they like to include disclaimer sections, so I&amp;rsquo;ll include this so that I blend in better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Extracting movies from libreoffice</title>
      <link>https://purpleidea.com/blog/2017/07/12/extracting-movies-from-libreoffice/</link>
      <pubDate>Wed, 12 Jul 2017 10:09:46 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2017/07/12/extracting-movies-from-libreoffice/</guid>
      <description>&lt;p&gt;I have a short movie that I imported into a &lt;a href=&#34;https://libreoffice.org/&#34;&gt;libreoffice&lt;/a&gt; presentation. I wanted a copy of that movie back, but I couldn&amp;rsquo;t figure out how to extract a copy. In desperation, I figured I&amp;rsquo;d try opening the file with &lt;a href=&#34;https://wiki.gnome.org/Apps/FileRoller&#34;&gt;file-roller&lt;/a&gt;, the &lt;a href=&#34;https://gnome.org/&#34;&gt;GNOME&lt;/a&gt; archive manager.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:/tmp$ file mgmt-berlin-osdc-17may2017.odp &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mgmt-berlin-osdc-17may2017.odp: OpenDocument Presentation&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:/tmp$ mkdir out&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:/tmp$ file-roller -f mgmt-berlin-osdc-17may2017.odp -e out/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[snip]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:/tmp$ cd out/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:/tmp/out$ ls&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configurations2/ Media/ meta.xml Pictures/ styles.xml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;content.xml META-INF/ mimetype settings.xml Thumbnails/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:/tmp/out$&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To my amazement, this worked perfectly! I found my video in the &lt;em&gt;Media/&lt;/em&gt; folder, and out it came! You can do this entirely with the GUI if you prefer:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Declarative vs. Imperative paradigms</title>
      <link>https://purpleidea.com/blog/2017/05/05/declarative-vs-imperative-paradigms/</link>
      <pubDate>Fri, 05 May 2017 17:35:17 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2017/05/05/declarative-vs-imperative-paradigms/</guid>
      <description>&lt;p&gt;Recently, while operating two different remote-controlled appliances, I realized that it was high time for a discussion about declarative and imperative paradigms. Let&amp;rsquo;s start by looking at the two remotes:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;declarative-imperative.png&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-2110&#34; src=&#34;declarative-imperative.png&#34; alt=&#34;declarative-imperative&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Two different &#34;remotes&#34;. The one on the left operates a television, and the one on the right controls a central heating and cooling system.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;At first glance you will notice that one of these remotes is dark, and the other is light. You might also notice that my photography skills are terrible. Neither of these facts is very important to the discussion at hand. Is there anything interesting that you can infer?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Osmocom femtocell un-boxing</title>
      <link>https://purpleidea.com/blog/2017/04/30/osmocom-femtocell-un-boxing/</link>
      <pubDate>Sun, 30 Apr 2017 17:56:13 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2017/04/30/osmocom-femtocell-un-boxing/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://twitter.com/LaF0rge&#34;&gt;LaForge&lt;/a&gt; and the fine folks at &lt;a href=&#34;https://osmocom.org/&#34;&gt;Osmocom&lt;/a&gt; (&lt;a href=&#34;https://www.sysmocom.de/&#34;&gt;Sysmocom&lt;/a&gt;) &lt;a href=&#34;https://osmocom.org/news/62&#34;&gt;recently had a femtocell giveaway&lt;/a&gt;. I didn&amp;rsquo;t expect to have much time to hack on things, but they were still quite generous in sending me one. It arrived, and I took some un-boxing photos for anyone who is curious.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;IMG_20170317_211113.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-2064&#34; src=&#34;IMG_20170317_211113.jpg&#34; alt=&#34;IMG_20170317_211113&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A box arrived in the mail...&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;IMG_20170317_211256.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-2065&#34; src=&#34;IMG_20170317_211256.jpg&#34; alt=&#34;IMG_20170317_211256&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Which recurses into an inner box...&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;IMG_20170317_211348.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-2066&#34; src=&#34;IMG_20170317_211348.jpg&#34; alt=&#34;IMG_20170317_211348&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Inner box is box like.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;IMG_20170317_211402.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-2067&#34; src=&#34;IMG_20170317_211402.jpg&#34; alt=&#34;IMG_20170317_211402&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finally... The unit is displayed.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;IMG_20170317_211440.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-2068&#34; src=&#34;IMG_20170317_211440.jpg&#34; alt=&#34;IMG_20170317_211440&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Here it is in all its glory.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;IMG_20170317_211600.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-2069&#34; src=&#34;IMG_20170317_211600.jpg&#34; alt=&#34;IMG_20170317_211600&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;It came complete with all the cables and power adapters necessary.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;IMG_20170317_212813.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-2070&#34; src=&#34;IMG_20170317_212813.jpg&#34; alt=&#34;IMG_20170317_212813&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The sysmocom folks even included some special test sim cards so that you can use the femtocell with your own phones.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;I&amp;rsquo;m very excited about the work the project is doing in their efforts to create and support free software telephony. If you are a telecom, please check out the various &lt;a href=&#34;https://www.sysmocom.de/&#34;&gt;Sysmocom products and services available&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Metaparameters in mgmt</title>
      <link>https://purpleidea.com/blog/2017/03/01/metaparameters-in-mgmt/</link>
      <pubDate>Wed, 01 Mar 2017 16:11:59 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2017/03/01/metaparameters-in-mgmt/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt; we have &lt;em&gt;meta parameters&lt;/em&gt;. They are similar in concept to what you might be familiar with from other tools, except that they are more clearly defined (in a single struct) and vastly more powerful.&lt;/p&gt;&#xA;&lt;p&gt;In mgmt, a meta parameter is a parameter which is codified entirely in the engine, and which can be used by any resource. In contrast with &lt;a href=&#34;https://docs.puppet.com/puppet/4.6/metaparameter.html#require&#34;&gt;Puppet, require/before are considered meta parameters&lt;/a&gt;, whereas in mgmt, the equivalent is a graph edge, which is not a meta parameter. [1]&lt;/p&gt;</description>
    </item>
    <item>
      <title>Faster golang builds</title>
      <link>https://purpleidea.com/blog/2017/02/26/faster-golang-builds/</link>
      <pubDate>Sun, 26 Feb 2017 17:02:35 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2017/02/26/faster-golang-builds/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been hacking in &lt;a href=&#34;https://en.wikipedia.org/wiki/Golang&#34;&gt;golang&lt;/a&gt; since before version 1.4, and the speed at which my builds finished has been mostly trending downwards. Let&amp;rsquo;s look into the reasons and some fixes. TL;DR click-bait title: &amp;ldquo;Get 4x faster golang builds with this one trick!&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Here are the three reasons my builds got slower:&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;The compiler&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before version 1.5, the compiler was written in C but &lt;a href=&#34;https://golang.org/doc/go1.5#c&#34;&gt;with that release, it moved to being pure golang&lt;/a&gt;. This unfortunately reduced build performance quite measurably, even though it was the right decision for the project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ten minute hacks: Process pause &amp; resume</title>
      <link>https://purpleidea.com/blog/2017/01/06/ten-minute-hacks-process-pause-resume/</link>
      <pubDate>Fri, 06 Jan 2017 05:57:08 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2017/01/06/ten-minute-hacks-process-pause-resume/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m old school and still rocking an old X220 laptop &lt;a href=&#34;https://purpleidea.com/blog/2014/02/02/scathing-review-of-the-lenovo-x240/&#34;&gt;because I didn&amp;rsquo;t like the new ones&lt;/a&gt;. My battery life isn&amp;rsquo;t as great as I&amp;rsquo;d like it to be, but it gets worse when some &amp;ldquo;webapp&amp;rdquo; (which I&amp;rsquo;d much rather have as a native &lt;a href=&#34;https://en.wikipedia.org/wiki/GTK%2B&#34;&gt;GTK+&lt;/a&gt; app) causes Firefox to rev my CPU with their websocket (hi gmail!) poller.&lt;/p&gt;&#xA;&lt;p&gt;This seems to happen most often on planes or when I&amp;rsquo;m disconnected from the internet. Since it&amp;rsquo;s difficult to know which tab is the offending one, and since I might want to keep that tabs state anyway, I decided to write a little shell script to pause and resume misbehaving processes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Send/Recv in mgmt</title>
      <link>https://purpleidea.com/blog/2016/12/07/sendrecv-in-mgmt/</link>
      <pubDate>Wed, 07 Dec 2016 07:00:20 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/12/07/sendrecv-in-mgmt/</guid>
      <description>&lt;p&gt;I previously published &amp;ldquo;&lt;a href=&#34;https://purpleidea.com/blog/2016/11/30/a-revisionist-history-of-configuration-management/&#34;&gt;A revisionist history of configuration management&lt;/a&gt;&amp;rdquo;. I meant for that to be the intro to this article, but it ended up being long enough that it deserved a separate post. I &lt;em&gt;will&lt;/em&gt; explain Send/Recv in this article, but first a few clarifications to the aforementioned article.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Clarifications&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;I mentioned that my &amp;ldquo;revisionist history&amp;rdquo; was inaccurate, but I failed to mention that it was also not exhaustive! Many things were left out either because they were proprietary, niche, not well-known, of obscure design or simply for brevity. My apologies if you were involved with Bcfg2, Bosh, Heat, Military specifications, SaltStack, SmartFrog, or something else entirely. I&amp;rsquo;d love it if someone else wrote an &amp;ldquo;exhaustive history&amp;rdquo;, but I don&amp;rsquo;t think that&amp;rsquo;s possible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A revisionist history of configuration management</title>
      <link>https://purpleidea.com/blog/2016/11/30/a-revisionist-history-of-configuration-management/</link>
      <pubDate>Wed, 30 Nov 2016 23:59:49 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/11/30/a-revisionist-history-of-configuration-management/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve got a brand new core feature in mgmt called &lt;em&gt;send/recv&lt;/em&gt; which I plan to show you shortly, but first I&amp;rsquo;d like to start with some background.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;History&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is &lt;em&gt;my&lt;/em&gt; historical perspective and interpretation about the last twenty years in configuration management. It&amp;rsquo;s likely inaccurate and slightly revisionist, but it should be correct enough to tell the design story that I want to share.&lt;/p&gt;&#xA;&lt;p&gt;Sometime after people started to realize that writing bash scripts wasn&amp;rsquo;t a safe, scalable, or reusable way to automate systems, &lt;em&gt;CFEngine&lt;/em&gt; burst onto the scene with the first real solution to this problem. I think it was mostly all quite sane, but it wasn&amp;rsquo;t a tool which let us build autonomous systems, so people eventually looked elsewhere.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Remote execution in mgmt</title>
      <link>https://purpleidea.com/blog/2016/10/07/remote-execution-in-mgmt/</link>
      <pubDate>Fri, 07 Oct 2016 15:33:17 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/10/07/remote-execution-in-mgmt/</guid>
      <description>&lt;p&gt;Bootstrapping a cluster from your laptop, or managing machines without needing to first setup a separate config management infrastructure are both very reasonable and fundamental asks. I was particularly inspired by &lt;a href=&#34;https://github.com/ansible/ansible&#34;&gt;Ansible&lt;/a&gt;&amp;rsquo;s agent-less remote execution model, but never wanted to build a centralized orchestrator. &lt;a href=&#34;https://en.wikipedia.org/wiki/You_can%27t_have_your_cake_and_eat_it&#34;&gt;I soon realized that I could have my ice cream and eat it too.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Prior knowledge&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you haven&amp;rsquo;t read the earlier articles about mgmt, then I recommend you start with those, and then come back here. The first and fourth are essential if you&amp;rsquo;re going to make sense of this article.&lt;/p&gt;</description>
    </item>
    <item>
      <title>mgmt has a logo</title>
      <link>https://purpleidea.com/blog/2016/09/30/mgmt-has-a-logo/</link>
      <pubDate>Fri, 30 Sep 2016 08:41:06 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/09/30/mgmt-has-a-logo/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt config project&lt;/a&gt; got a logo! The &lt;a href=&#34;https://github.com/purpleidea/mgmt/commit/8a96dfdc8a1540e379ead81323e178ce73d035f5&#34;&gt;full commit is here&lt;/a&gt;. Thanks to Sarah Jane Cox for creating it.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;mgmt.png&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-1881&#34; src=&#34;mgmt.png&#34; alt=&#34;mgmt&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;p&gt;Happy Hacking,&lt;/p&gt;&#xA;&lt;p&gt;James&lt;/p&gt;&#xA;&lt;p&gt;PS: I might have a few stickers to give out too! Ask me next time you see me if you&amp;rsquo;d like one! Alternatively, use the artwork to make your own and share with your friends!&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Live dmesg following</title>
      <link>https://purpleidea.com/blog/2016/08/29/live-dmesg-following/</link>
      <pubDate>Mon, 29 Aug 2016 09:00:39 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/08/29/live-dmesg-following/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://purpleidea.com/blog/2012/11/18/continuous-display-of-log-files-better-tail-f/&#34;&gt;All good sysadmins eventually learn about using tail -F to tail files. Yes upper-case F is superior.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Around the time I wrote that article, I remember wanting to stream &lt;code&gt;dmesg&lt;/code&gt; output too! The functionality wasn&amp;rsquo;t available without some sort of polling hack, but it turns out that kernel support for this actually landed around the same time in version 3.5.0!&lt;/p&gt;&#xA;&lt;p&gt;Most GNU/Linux distros are probably running a new enough version by now, and you can now &lt;code&gt;dmesg &amp;ndash;follow&lt;/code&gt; (or &lt;code&gt;dmesg -w&lt;/code&gt;):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Seen in downtown Montreal...</title>
      <link>https://purpleidea.com/blog/2016/08/03/seen-in-downtown-montreal/</link>
      <pubDate>Wed, 03 Aug 2016 01:59:23 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/08/03/seen-in-downtown-montreal/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://purpleidea.com/blog/&#34;&gt;The Technical Blog of James&lt;/a&gt; was seen on an outdoor electronic display in downtown Montreal! Thanks to one of my readers for sending this in.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;ttboj-downtown.png&#34;&gt;&lt;img class=&#34;size-large wp-image-1866&#34; src=&#34;ttboj-downtown.png&#34; alt=&#34;I guess the smart phone revolution is over, and people are taking to reading my articles on bigger screens!&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; I guess the smart phone revolution is over, and people are taking to reading my articles on bigger screens! The &#34;poutine&#34; is decent proof that this is probably Montreal.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;If you&amp;rsquo;ve got access to a large electronic display, put up the blog, snap a photo, and send it my way! I&amp;rsquo;ll post it here and send you some random stickers!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ten minute hacks: Hacking airplane headphones</title>
      <link>https://purpleidea.com/blog/2016/07/18/ten-minute-hacks-hacking-airplane-headphones/</link>
      <pubDate>Mon, 18 Jul 2016 16:41:47 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/07/18/ten-minute-hacks-hacking-airplane-headphones/</guid>
      <description>&lt;p&gt;I was stuck on a 14 hour flight last week, and to my disappointment, only one of the two headphone speakers were working. The plane&amp;rsquo;s media centre has an audio connector that looks like this:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;airplane-headphones-jack.jpg&#34;&gt;&lt;img class=&#34;wp-image-1856 size-large&#34; src=&#34;airplane-headphones-jack.jpg&#34; alt=&#34;airplane-headphones-jack&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; Someone should consider probing this USB port.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;The hole to the left is smaller than a 3.5mm headphone jack, and designed for a proprietary headphone connector that I didn&amp;rsquo;t have, and the two holes to the right are part of a different proprietary connector which match with the cheap airline headphones to provide the left and right audio channels.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automatic clustering in mgmt</title>
      <link>https://purpleidea.com/blog/2016/06/20/automatic-clustering-in-mgmt/</link>
      <pubDate>Mon, 20 Jun 2016 12:28:51 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/06/20/automatic-clustering-in-mgmt/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt;, deploying and managing your clustered config management infrastructure needs to be as automatic as the infrastructure you&amp;rsquo;re using mgmt to manage. With mgmt, instead of a centralized data store, we function as a distributed system, built on top of &lt;a href=&#34;https://github.com/coreos/etcd&#34;&gt;etcd&lt;/a&gt; and the &lt;a href=&#34;https://en.wikipedia.org/wiki/Raft_(computer_science)&#34;&gt;raft protocol&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In this article, I&amp;rsquo;ll cover how this feature works.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Foreword&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Mgmt is a next generation configuration management project. If you haven&amp;rsquo;t heard of it yet, or you don&amp;rsquo;t remember why we use a distributed database, start by reading the previous articles:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upcoming speaking In Hong Kong and South Africa</title>
      <link>https://purpleidea.com/blog/2016/06/20/upcoming-speaking-in-hong-kong-and-south-africa/</link>
      <pubDate>Mon, 20 Jun 2016 04:08:59 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/06/20/upcoming-speaking-in-hong-kong-and-south-africa/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m thrilled to tell you that I&amp;rsquo;ll be speaking about &lt;a href=&#34;https://purpleidea.com/tags/mgmtconfig/&#34;&gt;mgmt&lt;/a&gt; in Hong Kong and South Africa. It will be my first time to both countries and my first time to &lt;a href=&#34;https://en.wikipedia.org/wiki/Asia&#34;&gt;Asia&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Africa&#34;&gt;Africa&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;p&gt;In Hong Kong I&amp;rsquo;ll be speaking at &lt;a href=&#34;https://2016.opensource.hk/topics/next-generation-config-mgmt/&#34;&gt;HKOSCon2016&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In South Africa I&amp;rsquo;ll be speaking at &lt;a href=&#34;https://debconf16.debconf.org/schedule/&#34;&gt;DebConf16&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m looking forward to meeting with many of the hard-working Debian hackers, and collaborating with them to build and promote excellent Free Software. The &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt; project considers both Fedora and Debian to be first class platforms, and parity is a primary design goal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>One hour hacks: Remote LUKS over SSH</title>
      <link>https://purpleidea.com/blog/2016/04/25/one-hour-hacks-remote-luks-over-ssh/</link>
      <pubDate>Mon, 25 Apr 2016 13:46:53 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/04/25/one-hour-hacks-remote-luks-over-ssh/</guid>
      <description>&lt;p&gt;I have a &lt;a href=&#34;https://gnu.org/&#34;&gt;GNU/Linux&lt;/a&gt; server which I mount a few &lt;a href=&#34;https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup&#34;&gt;LUKS&lt;/a&gt; encrypted drives on. I only ever interact with the server over SSH, and I never want to keep the LUKS credentials on the remote server. I don&amp;rsquo;t have anything especially sensitive on the drives, but I think it&amp;rsquo;s a good security practice to &lt;a href=&#34;http://www.theguardian.com/commentisfree/2013/jul/15/crux-nsa-collect-it-all&#34;&gt;encrypt it all&lt;/a&gt;, if only to add noise into the system and for solidarity with &lt;a href=&#34;https://en.wikipedia.org/wiki/Whistleblower&#34;&gt;those&lt;/a&gt; who harbour much more sensitive data.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automatic grouping in mgmt</title>
      <link>https://purpleidea.com/blog/2016/03/30/automatic-grouping-in-mgmt/</link>
      <pubDate>Wed, 30 Mar 2016 06:03:47 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/03/30/automatic-grouping-in-mgmt/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll tell you about the recently released &amp;ldquo;automatic grouping&amp;rdquo; or &amp;ldquo;AutoGroup&amp;rdquo; feature in &lt;em&gt;&lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;mgmt&lt;/a&gt;&lt;/em&gt;, a next generation configuration management prototype. If you aren&amp;rsquo;t already familiar with mgmt, I&amp;rsquo;d recommend you start by reading the &lt;a href=&#34;https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/&#34;&gt;introductory post&lt;/a&gt;, and the &lt;a href=&#34;https://purpleidea.com/blog/2016/03/14/automatic-edges-in-mgmt/&#34;&gt;second post&lt;/a&gt;. There&amp;rsquo;s also an &lt;a href=&#34;https://www.youtube.com/watch?v=GVhpPF0j-iE&amp;html5=1&#34;&gt;introductory video&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Resources in a graph&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;Most configuration management systems use something called a &lt;a href=&#34;https://en.wikipedia.org/wiki/Directed_acyclic_graph&#34;&gt;directed acyclic graph, or DAG&lt;/a&gt;. This is a fancy way of saying that it is a bunch of circles (vertices) which are connected with arrows (edges). The arrows must be connected to exactly two vertices, and you&amp;rsquo;re only allowed to move along each arrow in one direction (directed). Lastly, if you start at any vertex in the graph, you must never be able to return to where you started by following the arrows (acyclic). If you can, the graph is not fit for our purpose.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automatic edges in mgmt</title>
      <link>https://purpleidea.com/blog/2016/03/14/automatic-edges-in-mgmt/</link>
      <pubDate>Mon, 14 Mar 2016 00:50:48 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/03/14/automatic-edges-in-mgmt/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been &lt;a href=&#34;https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/&#34;&gt;two months since I announced mgmt&lt;/a&gt;, and now it&amp;rsquo;s time to continue the story by telling you more about the design of &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;what&amp;rsquo;s now in git master&lt;/a&gt;. Before I get into those details, let me quickly &lt;a href=&#34;https://www.youtube.com/watch?v=M4vqr3_ROIk&amp;t=748&amp;html5=1&#34;&gt;recap&lt;/a&gt; what&amp;rsquo;s happened since then.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Mgmt community recap&lt;/span&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;    &lt;li&gt;I gave the first public presentation about mgmt at &lt;a href=&#34;http://cfgmgmtcamp.eu/schedule/speakers/JamesShubin.html&#34;&gt;CfgMgmtCamp&lt;/a&gt;.&lt;/li&gt;&#xA;    &lt;li&gt;I repeated the talk at &lt;a href=&#34;https://devconfcz2016.sched.org/event/5m14/next-generation-config-mgmt&#34;&gt;DevConf.cz&lt;/a&gt;. &lt;a href=&#34;https://www.youtube.com/watch?v=GVhpPF0j-iE&amp;html5=1&#34;&gt;The video recording is available.&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;Felix wrote about his work &lt;a href=&#34;https://ffrank.github.io/features/2016/02/18/from-catalog-to-mgmt/&#34;&gt;cross compiling puppet code to mgmt&lt;/a&gt;.&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/mgmt/graphs/contributors&#34;&gt;Three new contributors&lt;/a&gt; got their feet wet in git master.&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/mgmt/#on-the-web&#34;&gt;Mgmt got a lot more attention on the web...&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Okay, time to tell you what&amp;rsquo;s new in mgmt!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing: git tpush</title>
      <link>https://purpleidea.com/blog/2016/02/16/introducing-git-tpush/</link>
      <pubDate>Tue, 16 Feb 2016 12:15:06 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/02/16/introducing-git-tpush/</guid>
      <description>&lt;p&gt;On today&amp;rsquo;s issue of &amp;ldquo;one hour hacks&amp;rdquo;, I&amp;rsquo;ll show you how you can stop your git drive-by&amp;rsquo;s to git master from breaking your CI tests&amp;hellip; Let&amp;rsquo;s continue!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;The problem&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sometimes I&amp;rsquo;ve got a shitty one-line patch that I want to push to &lt;code&gt;git master&lt;/code&gt;. I&amp;rsquo;m usually right, and everything tests out fine, but usually isn&amp;rsquo;t always, and then I look silly while I frantically try to fix &lt;code&gt;git master&lt;/code&gt; on a &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;project that I maintain&lt;/a&gt;. Let&amp;rsquo;s use tools to hide our human flaws!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Debugging golang programs</title>
      <link>https://purpleidea.com/blog/2016/02/15/debugging-golang-programs/</link>
      <pubDate>Mon, 15 Feb 2016 16:47:57 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/02/15/debugging-golang-programs/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been writing a lot of &lt;a href=&#34;https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/&#34;&gt;golang&lt;/a&gt; lately. &lt;a href=&#34;https://purpleidea.com/blog/2015/07/27/golang-parallelism-issues-causing-too-many-open-files-error/&#34;&gt;I&amp;rsquo;ve hit painful problems in the past.&lt;/a&gt; Here are some debugging tips. Hopefully they help you out. I bet you don&amp;rsquo;t know #2.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;#0 Use log.Printf&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This should go without saying, but I&amp;rsquo;m ashamed to say it&amp;rsquo;s what I use the most. We&amp;rsquo;ve only been &lt;a href=&#34;https://en.wikipedia.org/wiki/C_%28programming_language%29&#34;&gt;C programming&lt;/a&gt; for 44+ years, and it&amp;rsquo;s still what is most useful!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;#1 Use go run -race&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Since many problems are caused by random races, ensuring you use the built-in tools will help you catch some problems. One of these is a race detector. You can use it by adding the &lt;code&gt;-race&lt;/code&gt; flag to the &lt;code&gt;go run&lt;/code&gt;, &lt;code&gt;go build&lt;/code&gt; or &lt;code&gt;go test&lt;/code&gt; commands. In practice, it only ever caught beginner issues, and it hasn&amp;rsquo;t set off any alarms since. Maybe I need to write more test cases! Maybe &lt;a href=&#34;https://github.com/purpleidea/mgmt/compare?expand=1&#34;&gt;&lt;strong&gt;&lt;em&gt;you&lt;/em&gt;&lt;/strong&gt; need to write more test cases!&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Next generation configuration mgmt</title>
      <link>https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/</link>
      <pubDate>Mon, 18 Jan 2016 00:52:10 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/01/18/next-generation-configuration-mgmt/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s no secret to the readers of this blog that I&amp;rsquo;ve been active in the configuration management space for some time. I owe most of my knowledge to what I&amp;rsquo;ve learned while working with &lt;a href=&#34;https://en.wikipedia.org/wiki/Puppet_%28software%29&#34;&gt;Puppet&lt;/a&gt; and from other hackers working in and around various other communities.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://purpleidea.com/blog/2013/11/17/iteration-in-puppet&#34;&gt;I&amp;rsquo;ve published&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2013/02/20/automatic-hiera-lookups-in-puppet-3-x&#34;&gt;a number&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2012/11/07/preventing-duplicate-parameter-values-in-puppet-types&#34;&gt;of articles&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2013/05/14/overriding-attributes-of-collected-exported-resources&#34;&gt;in an&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2012/08/23/how-to-avoid-cluster-race-conditions-or-how-to-implement-a-distributed-lock-manager-in-puppet&#34;&gt;attempt&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2014/07/24/hybrid-management-of-freeipa-types-with-puppet&#34;&gt;to push&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2014/06/06/securely-managing-secrets-for-freeipa-with-puppet&#34;&gt;the field&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2014/06/04/hiera-data-in-modules-and-os-independent-puppet&#34;&gt;forwards&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2014/03/24/introducing-puppet-execagain&#34;&gt;and to&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2012/11/14/setting-timed-events-in-puppet&#34;&gt;share the&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2013/06/04/collecting-duplicate-resources-in-puppet&#34;&gt;knowledge&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2013/09/28/finite-state-machines-in-puppet&#34;&gt;that I&amp;rsquo;ve&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2012/11/20/recursion-in-puppet-for-no-particular-reason&#34;&gt;learned&lt;/a&gt;, &lt;a href=&#34;https://purpleidea.com/blog/2013/11/27/advanced-recursion-and-memoization-in-puppet&#34;&gt;with others&lt;/a&gt;. I&amp;rsquo;ve spent many nights thinking about these problems, but it is not without some chagrin that I realized that the current state-of-the-art in configuration management cannot easily (or elegantly) solve all the problems for which I wish to write solutions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upcoming speaking</title>
      <link>https://purpleidea.com/blog/2016/01/18/upcoming-speaking/</link>
      <pubDate>Mon, 18 Jan 2016 00:32:52 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2016/01/18/upcoming-speaking/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve got a few upcoming speaking engagements. If you&amp;rsquo;ll be attending one of these events, come see me or any of the other excellent speakers!&lt;/p&gt;&#xA;&lt;p&gt;Please remember to check the official schedules in case there are any changes!&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll be speaking at the &lt;a href=&#34;https://wiki.centos.org/Events/Dojo/Brussels2016&#34;&gt;Brussels CentOS Dojo&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;h2&gt;&lt;a href=&#34;https://lists.centos.org/pipermail/centos-promo/2015-November/001572.html&#34;&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Automated Infrastructure Testing with Oh-My-Vagrant&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&#xA;...and the CentOS CI&lt;/h2&gt;&#xA;&lt;em&gt;Time/date unconfirmed&lt;/em&gt;: I&#39;ll be showing some CI tricks, and showing you how the CentOS CI is the perfect CI for multi-machine test environments.&#xA;&lt;p&gt;~&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trying out Ceph with Oh-My-Vagrant</title>
      <link>https://purpleidea.com/blog/2015/12/28/trying-out-ceph-with-oh-my-vagrant/</link>
      <pubDate>Mon, 28 Dec 2015 14:59:23 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/12/28/trying-out-ceph-with-oh-my-vagrant/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.berrange.com/posts/2015/12/21/ceph-single-node-deployment-on-fedora-23/&#34;&gt;Daniel P. Berrangé wrote about trying out a single node ceph cluster.&lt;/a&gt; I decided to take his article and turn it into an Oh-My-Vagrant &lt;code&gt;omv.yaml&lt;/code&gt; file. It took me about two minutes to do so, and two hours to debug a problem caused by something I had broken on my laptop.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;d like to replicate his article in less than 5 minutes, pull down the &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant/blob/master/examples/ceph-deploy.yaml&#34;&gt;omv.yaml&lt;/a&gt; file that I&amp;rsquo;ve just published and run &lt;code&gt;omv up&lt;/code&gt;. Here&amp;rsquo;s the full terminal output of my session:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Matching arbitrary URL&#39;s to custom Firefox profiles</title>
      <link>https://purpleidea.com/blog/2015/11/14/matching-arbitrary-urls-to-custom-firefox-profiles/</link>
      <pubDate>Sat, 14 Nov 2015 06:50:35 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/11/14/matching-arbitrary-urls-to-custom-firefox-profiles/</guid>
      <description>&lt;p&gt;We&amp;rsquo;re constantly clicking on all sorts of different URL&amp;rsquo;s throughout the day. These clickable links appear in webpages (including in &amp;ldquo;&lt;a href=&#34;https://www.gnu.org/philosophy/who-does-that-server-really-serve.html&#34;&gt;web apps&lt;/a&gt;&amp;rdquo; like gmail) in mail clients like &lt;a href=&#34;https://en.wikipedia.org/wiki/Evolution_%28software%29&#34;&gt;Evolution&lt;/a&gt;, in terminals such as &lt;a href=&#34;https://wiki.gnome.org/Apps/Terminal&#34;&gt;GNOME-terminal&lt;/a&gt;, and any other &lt;a href=&#34;https://en.wikipedia.org/wiki/GTK%2B&#34;&gt;GTK+&lt;/a&gt; app on your GNU/Linux desktop. I wanted to perform custom actions when arbitrary URL&amp;rsquo;s are clicked, including running certain links in separate Firefox profiles. There are a bunch of different steps you have to do to get this working, but it should be easy to follow along. I&amp;rsquo;m doing all of this on &lt;a href=&#34;https://getfedora.org/&#34;&gt;Fedora 23&lt;/a&gt;, but it should work on other GNU/Linux environments.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Thanking Oh-My-Vagrant contributors for version 1.0.0</title>
      <link>https://purpleidea.com/blog/2015/08/18/thanking-oh-my-vagrant-contributors-for-version-1-0-0/</link>
      <pubDate>Tue, 18 Aug 2015 03:12:26 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/08/18/thanking-oh-my-vagrant-contributors-for-version-1-0-0/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant&#34;&gt;Oh-My-Vagrant project&lt;/a&gt; became public about one year ago and at the time it was more of a fancy template than a robust project, but 188 commits (and counting) later, it has gotten surprisingly useful and mature.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:~/code/oh-my-vagrant$ git rev-list HEAD --count&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;188&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:~/code/oh-my-vagrant$ git log $(git log --pretty=format:%H|tail -1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;commit 4faa6c89cce01c62130ef5a6d5fa0fff833da371&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Author: James Shubin &amp;lt;james@shubin.ca&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date:   Thu Aug 28 01:08:03 2014 -0400&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Initial commit of vagrant-puppet-docker-template...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    This is an attempt to prototype a default environment for&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vagrant+puppet+docker hacking. More improvements are needed for it to be&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    useful, but it&amp;#39;s probably already useful as a reference for now.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It would be easy to take most of the credit for taking the project this far, as I&amp;rsquo;ve been responsible for about 87% of the commits, but as is common, the numbers don&amp;rsquo;t tell the whole story. It is also a bug (but hopefully just an artifact) that I&amp;rsquo;ve had such a large percentage of commits. It&amp;rsquo;s quite common for a new project to start this way, but for &lt;a href=&#34;https://www.gnu.org/philosophy/free-sw.html&#34;&gt;Free Software&lt;/a&gt; to succeed long-term, it&amp;rsquo;s essential that the users become the contributors. Let&amp;rsquo;s try to change that going forward.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vagrant and Oh-My-Vagrant on RHEL7</title>
      <link>https://purpleidea.com/blog/2015/08/11/vagrant-and-oh-my-vagrant-on-rhel7/</link>
      <pubDate>Tue, 11 Aug 2015 15:09:16 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/08/11/vagrant-and-oh-my-vagrant-on-rhel7/</guid>
      <description>&lt;p&gt;My &lt;a href=&#34;https://redhat.com/&#34;&gt;employer&lt;/a&gt; keeps paying me, which I appreciate, so it&amp;rsquo;s good to spend some time to make sure RHEL7 customers get a great developer experience! So here&amp;rsquo;s how to make vagrant, vagrant-libvirt and &lt;a href=&#34;https://purpleidea.com/tags/oh-my-vagrant/&#34;&gt;Oh-My-Vagrant&lt;/a&gt; work on &lt;a href=&#34;http://red.ht/1Aowjfh&#34;&gt;RHEL 7+&lt;/a&gt;. The same steps should work for CentOS 7+.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll first paste the commands you need to run, and then I&amp;rsquo;ll explain what&amp;rsquo;s happening for those that are interested:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# run these commands, and then get hacking!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# this requires the rhel-7-server-optional-rpms repo enabled&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo subscription-manager repos --enable rhel-7-server-optional-rpms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo yum install -y gcc ruby-devel libvirt-devel libvirt qemu-kvm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start libvirtd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo yum install -y vagrant_1.7.4_x86_64.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant plugin install vagrant-libvirt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://copr.fedoraproject.org/coprs/purpleidea/vagrant-libvirt/repo/epel-7/purpleidea-vagrant-libvirt-epel-7.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo cp -a purpleidea-vagrant-libvirt-epel-7.repo /etc/yum.repos.d/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo yum install -y vagrant-libvirt    # noop plugin for oh-my-vagrant dependency&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://copr.fedoraproject.org/coprs/purpleidea/oh-my-vagrant/repo/epel-7/purpleidea-oh-my-vagrant-epel-7.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo cp -a purpleidea-oh-my-vagrant-epel-7.repo /etc/yum.repos.d/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo yum install -y oh-my-vagrant&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;. /etc/profile.d/oh-my-vagrant.sh # logout/login or source&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s go through it line by line.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making an empty RPM</title>
      <link>https://purpleidea.com/blog/2015/08/11/making-an-empty-rpm/</link>
      <pubDate>Tue, 11 Aug 2015 13:25:58 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/08/11/making-an-empty-rpm/</guid>
      <description>&lt;p&gt;I am definitely not an RPM expert, in fact, I&amp;rsquo;m afraid of it, but with recent tools such as &lt;a href=&#34;https://copr.fedoraproject.org/coprs/purpleidea/oh-my-vagrant/&#34;&gt;COPR&lt;/a&gt;, and &lt;a href=&#34;https://purpleidea.com/blog/2014/01/20/building-base-images-for-vagrant-with-a-makefile/&#34;&gt;my glorious Makefile&lt;/a&gt;, some aspects of it have become palatable. This post will be about a recent journey I had building the most useless RPM ever.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;cat-typing.gif&#34;&gt;&lt;img class=&#34;size-full wp-image-1128&#34; src=&#34;cat-typing.gif&#34; alt=&#34;A video of what my work building this RPM looked like.&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; A video of my journey building this RPM.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;Because of reasons, I wanted to satisfy an RPM dependency for a package that I wanted to install without rebuilding that RPM. As a result, I wanted to build as small an RPM as possible. This took me down a much longer path than I thought it would.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang parallelism issues causing “too many open files” error</title>
      <link>https://purpleidea.com/blog/2015/07/27/golang-parallelism-issues-causing-too-many-open-files-error/</link>
      <pubDate>Mon, 27 Jul 2015 11:39:45 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/07/27/golang-parallelism-issues-causing-too-many-open-files-error/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been hacking in &lt;a href=&#34;https://en.wikipedia.org/wiki/Go_%28programming_language%29&#34;&gt;golang&lt;/a&gt; for a while, but I&amp;rsquo;ll admit that I didn&amp;rsquo;t get too deep into some of the language nuances until more recently. Since some of them have started to bite me, here&amp;rsquo;s a little post-mortem of one of the problems I was having.&lt;/p&gt;&#xA;&lt;p&gt;After hacking and testing code all day, I made a seemingly innocuous change, and when running my program, I saw the following error:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2015/07/10 14:34:12 too many open files&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I didn&amp;rsquo;t know what I broke, but it was obviously my fault. I reverted my recent changes, but still the error persisted. Internet searches and many painful hours of debugging ensued.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git archive with submodules and tar magic</title>
      <link>https://purpleidea.com/blog/2015/07/23/git-archive-with-submodules-and-tar-magic/</link>
      <pubDate>Thu, 23 Jul 2015 20:32:27 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/07/23/git-archive-with-submodules-and-tar-magic/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://git-scm.com/book/en/v2/Git-Tools-Submodules&#34;&gt;Git submodules&lt;/a&gt; are actually a very beautiful thing. You might prefer the word powerful or elegant, but that&amp;rsquo;s not the point. The downside is that they are sometimes misused, so as always, use with care. I&amp;rsquo;ve used them in projects like &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;puppet-gluster&lt;/a&gt;, &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant&#34;&gt;oh-my-vagrant&lt;/a&gt;, and others. If you&amp;rsquo;re not familiar with them, do a bit of reading and come back later, I&amp;rsquo;ll wait.&lt;/p&gt;&#xA;&lt;p&gt;I recently did some work &lt;a href=&#34;https://purpleidea.com/blog/2015/07/08/oh-my-vagrant-mainstream-mode-and-copr-rpms/&#34;&gt;packaging Oh-My-Vagrant as RPM&amp;rsquo;s&lt;/a&gt;. My primary goal was to make sure the entire process was automatic, as I have no patience for manually building RPM&amp;rsquo;s. Any good packager knows that the pre-requisite for building a SRPM is a source tarball, and I wanted to build those automatically too.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Oh-My-Vagrant “Mainstream” mode and COPR RPM&#39;s</title>
      <link>https://purpleidea.com/blog/2015/07/08/oh-my-vagrant-mainstream-mode-and-copr-rpms/</link>
      <pubDate>Wed, 08 Jul 2015 01:14:19 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/07/08/oh-my-vagrant-mainstream-mode-and-copr-rpms/</guid>
      <description>&lt;p&gt;Making &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant&#34;&gt;Oh-My-Vagrant&lt;/a&gt; (OMV) more developer accessible and easy to install (from a distribution package like RPM) has always been a goal, but was previously never a priority. This is all sorted out now. In this article, I&amp;rsquo;ll explain how &amp;ldquo;mainstream&amp;rdquo; mode works, and how the RPM work was done. (I promise this will be somewhat interesting!)&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Prerequisites&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you haven&amp;rsquo;t read any of the &lt;a href=&#34;https://purpleidea.com/tags/oh-my-vagrant/&#34;&gt;previous articles about Oh-My-Vagrant&lt;/a&gt;, I&amp;rsquo;d recommend you start there. Many of the articles include screencasts, and combined with the &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant/tree/master/examples&#34;&gt;examples/&lt;/a&gt; folder, this is probably the best way to learn OMV, because the &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant/issues/79&#34;&gt;documentation could use some love&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A super privileged Puppet container</title>
      <link>https://purpleidea.com/blog/2015/06/12/a-super-privileged-puppet-container/</link>
      <pubDate>Fri, 12 Jun 2015 18:06:55 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/06/12/a-super-privileged-puppet-container/</guid>
      <description>&lt;p&gt;In this new crazy world of &lt;a href=&#34;https://en.wikipedia.org/wiki/Docker_%28software%29&#34;&gt;containers&lt;/a&gt; and immutable hosts, one might still want to run previous generation software such as &lt;a href=&#34;https://duckduckgo.com/l/?kh=-1&amp;uddg=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FPuppet_(software)&#34;&gt;Puppet&lt;/a&gt; on a current generation &lt;a href=&#34;https://www.projectatomic.io/&#34;&gt;Atomic host&lt;/a&gt;. This article will explain how you can do that, and offer some &lt;a href=&#34;https://github.com/purpleidea/spc-puppet-apply&#34;&gt;proof of concept code&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The atomic host doesn&amp;rsquo;t provide a &lt;a href=&#34;https://en.wikipedia.org/wiki/Yellowdog_Updater,_Modified&#34;&gt;yum&lt;/a&gt; or &lt;a href=&#34;https://fedoraproject.org/wiki/Dnf&#34;&gt;dnf&lt;/a&gt; command, because the software is pre-baked into a read-only &lt;code&gt;/usr/&lt;/code&gt; partition. To &amp;ldquo;&lt;em&gt;install&lt;/em&gt;&amp;rdquo; (to use) additional software, it usually needs to be distributed and run as a container.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes clusters with Oh-My-Vagrant</title>
      <link>https://purpleidea.com/blog/2015/05/02/kubernetes-clusters-with-oh-my-vagrant/</link>
      <pubDate>Sat, 02 May 2015 00:07:11 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/05/02/kubernetes-clusters-with-oh-my-vagrant/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve added the ability to deploy a &lt;a href=&#34;https://github.com/GoogleCloudPlatform/kubernetes&#34;&gt;Kubernetes&lt;/a&gt; cluster with &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant&#34;&gt;Oh-My-Vagrant&lt;/a&gt; (&lt;em&gt;omv&lt;/em&gt;). I&amp;rsquo;ve also built an automated developer experience so that you can test your Kubernetes powered app in minutes. If you want to redeploy a new version, or see how your app behaves during a &lt;a href=&#34;https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl_rolling-update.md&#34;&gt;rolling update&lt;/a&gt;, you can use &lt;em&gt;omv&lt;/em&gt; to test this out in minutes! I&amp;rsquo;ve recorded a &lt;a href=&#34;https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/oh-my-vagrant-kubernetes-screencast.ogv&#34;&gt;screencast&lt;/a&gt; (~15 min), if you&amp;rsquo;d like to see some of this in action.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker containers in Oh-My-Vagrant</title>
      <link>https://purpleidea.com/blog/2015/04/20/docker-containers-in-oh-my-vagrant/</link>
      <pubDate>Mon, 20 Apr 2015 04:35:43 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/04/20/docker-containers-in-oh-my-vagrant/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant&#34;&gt;Oh-My-Vagrant&lt;/a&gt; (omv) project is an easy way to bootstrap a development environment. It is particularly useful for spinning up an arbitrary number of virtual machines in Vagrant without writing ruby code. For multi-machine container development, &lt;em&gt;omv&lt;/em&gt; can be used to help this happen more naturally.&lt;/p&gt;&#xA;&lt;p&gt;Oh-My-Vagrant can be very useful as a docker application development environment. I&amp;rsquo;ve made a quick (&amp;lt;9min) screencast demoing this topic. Please have a look:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/oh-my-vagrant-docker-screencast.ogv&#34;&gt;&lt;a href=&#34;https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/oh-my-vagrant-docker-screencast.ogv&#34;&gt;https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/oh-my-vagrant-docker-screencast.ogv&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sharing dev environments with Oh-My-Vagrant</title>
      <link>https://purpleidea.com/blog/2015/04/08/sharing-dev-environments-with-oh-my-vagrant/</link>
      <pubDate>Wed, 08 Apr 2015 03:37:18 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/04/08/sharing-dev-environments-with-oh-my-vagrant/</guid>
      <description>&lt;p&gt;With &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant&#34;&gt;Oh-My-Vagrant&lt;/a&gt; (omv) you can set up a dev environment in seconds. (Read the &lt;a href=&#34;https://purpleidea.com/blog/2014/09/03/introducing-oh-my-vagrant/&#34;&gt;omv introduction&lt;/a&gt; if you&amp;rsquo;ve never used it before!) Since everything is defined in a single &lt;code&gt;omv.yaml&lt;/code&gt; file, it is easy to share your cluster prototype with a friend! The one missing feature was associating code with this config file. This is now possible! Let me show you how it works&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;code&gt;omv.yaml&lt;/code&gt; file there is an &lt;code&gt;extern&lt;/code&gt; variable. It is a list of each &lt;em&gt;external&lt;/em&gt; repository which you&amp;rsquo;d like to include. Each element in this list is a hash of key value pairs. Currently four are supported: &lt;em&gt;type&lt;/em&gt;, &lt;em&gt;system&lt;/em&gt;, &lt;em&gt;repository&lt;/em&gt;, &lt;em&gt;directory&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fancy git aliases and git cherryfetch</title>
      <link>https://purpleidea.com/blog/2015/03/16/fancy-git-aliases-and-git-cherryfetch/</link>
      <pubDate>Mon, 16 Mar 2015 05:36:19 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/03/16/fancy-git-aliases-and-git-cherryfetch/</guid>
      <description>&lt;p&gt;Here are two quick &lt;a href=&#34;https://en.wikipedia.org/wiki/Git_%28software%29&#34;&gt;git&lt;/a&gt; tricks that I&amp;rsquo;ve added to my toolbox lately&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;I wanted to create a git alias that takes in argv from the command, but in the middle of the command. Here&amp;rsquo;s the hack that I came up with for the &lt;code&gt;[alias]&lt;/code&gt; section of my &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[alias]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # cherryfetch fetches a repo ($1) / branch ($2) and applies it rebased!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # the &amp;amp;&amp;amp; true at the end eats up the appended args&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cherryfetch = !git fetch &amp;#34;$1&amp;#34; &amp;#34;$2&amp;#34; &amp;amp;&amp;amp; git cherry-pick HEAD..FETCH_HEAD &amp;amp;&amp;amp; true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Explanation&lt;/span&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building RHEL Vagrant Boxes with Vagrant-Builder</title>
      <link>https://purpleidea.com/blog/2015/02/23/building-rhel-vagrant-boxes-with-vagrant-builder/</link>
      <pubDate>Mon, 23 Feb 2015 22:48:39 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/02/23/building-rhel-vagrant-boxes-with-vagrant-builder/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Vagrant_%28software%29&#34;&gt;Vagrant&lt;/a&gt; is a great tool for development, but &lt;a href=&#34;https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux&#34;&gt;Red Hat Enterprise Linux&lt;/a&gt; (RHEL) customers have typically been left out, because it has been impossible to get RHEL boxes! It would be extremely elegant if hackers could quickly test and prototype their code on the same OS as they&amp;rsquo;re running in production.&lt;/p&gt;&#xA;&lt;p&gt;Secondly, when hacking on projects that have a long initial setup phase (eg: a long rpm install) it would be excellent if hackers could roll their own modified base boxes, so that certain common operations could be re-factored out into the base image.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing: Silent counter</title>
      <link>https://purpleidea.com/blog/2015/02/09/introducing-silent-counter/</link>
      <pubDate>Mon, 09 Feb 2015 07:31:58 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2015/02/09/introducing-silent-counter/</guid>
      <description>&lt;p&gt;You might want to write code that can tell how many iterations have passed since some action occurred. Alternatively, you might want to know if it&amp;rsquo;s the first time a machine has run &lt;a href=&#34;https://en.wikipedia.org/wiki/Puppet_%28software%29&#34;&gt;Puppet&lt;/a&gt;. To do these types of things, you might wish to have a &lt;a href=&#34;https://en.wikipedia.org/wiki/Monotonic_function&#34;&gt;monotonically&lt;/a&gt; increasing counter in your Puppet manifest. Since one did not exist, I set out to build one!&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;The code&lt;/span&gt;:&lt;/p&gt;&#xA;&lt;p&gt;If you just want to try the code, and skip the ramble, you can include &lt;a href=&#34;https://github.com/purpleidea/puppet-common/blob/master/manifests/counter.pp#L18&#34;&gt;common::counter&lt;/a&gt; into your manifest. The entire class is part of my puppet-common module:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Replying to mailing lists with Evolution</title>
      <link>https://purpleidea.com/blog/2014/11/27/replying-to-mailing-lists-with-evolution/</link>
      <pubDate>Thu, 27 Nov 2014 20:28:54 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/11/27/replying-to-mailing-lists-with-evolution/</guid>
      <description>&lt;p&gt;I use the &lt;a href=&#34;http://en.wikipedia.org/wiki/Evolution_%28software%29&#34;&gt;Evolution&lt;/a&gt; mail &lt;a href=&#34;https://en.wikipedia.org/wiki/Mail_user_agent&#34;&gt;client&lt;/a&gt;. It does have a few annoying bugs, but it has a plethora of great features too! Hopefully this post will inspire you to help hack on this piece of software and fix the bugs!&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Mailing list etiquette&lt;/span&gt;:&lt;/p&gt;&#xA;&lt;p&gt;When replying to mailing lists, it&amp;rsquo;s typically very friendly to include the email address of the person you&amp;rsquo;re replying to in the &lt;em&gt;to&lt;/em&gt; or &lt;em&gt;cc&lt;/em&gt; fields along with the mailing list address. This lets that person know that someone has answered their question. In some cases, if they&amp;rsquo;re not subscribed to that mailing list, (if you don&amp;rsquo;t do this), then they might not see your reply at all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Captive web portals are considered harmful</title>
      <link>https://purpleidea.com/blog/2014/11/27/captive-web-portals-are-considered-harmful/</link>
      <pubDate>Thu, 27 Nov 2014 00:46:06 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/11/27/captive-web-portals-are-considered-harmful/</guid>
      <description>&lt;p&gt;Recently, when I tried to access &lt;a href=&#34;http://slashdot.org/&#34;&gt;&lt;a href=&#34;http://slashdot.org/&#34;&gt;http://slashdot.org/&lt;/a&gt;&lt;/a&gt; in Firefox, I would see my browser title bar flash briefly to &amp;ldquo;AT&amp;amp;T GUI&amp;rdquo;, and then I would get redirected to: &lt;code&gt;&lt;a href=&#34;http://slashdot.org/&#34;&gt;http://slashdot.org/&lt;/a&gt;&lt;strong&gt;cgi-bin/redirect.ha&lt;/strong&gt;&lt;/code&gt; which returns slashdot&amp;rsquo;s custom error 404 page! What is going on? (Read on for answer&amp;hellip;)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;Did slashdot mess up their &lt;a href=&#34;http://httpd.apache.org/docs/current/mod/mod_rewrite.html&#34;&gt;mod_rewrite&lt;/a&gt; config?&#xA;(Nope, works fine in a different browser...)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Did my &lt;a href=&#34;https://www.eff.org/https-everywhere&#34;&gt;HTTPS everywhere&lt;/a&gt; extension go crazy?&#xA;(Nope, still broken when disabled...)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Are my HTTP requests being &lt;a href=&#34;https://en.wikipedia.org/wiki/Man-in-the-middle_attack&#34;&gt;MITM&lt;/a&gt;-ed?&#xA;(Yes, &lt;a href=&#34;https://www.schneier.com/blog/archives/2013/09/new_nsa_leak_sh.html&#34;&gt;probably by the NSA&lt;/a&gt;, but they wouldn&#39;t make this kind of mistake...)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Is my computer p0wned?&#xA;(I use &lt;a href=&#34;https://fedoraproject.org/&#34;&gt;GNU/Linux&lt;/a&gt;, so probably not...)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;a href=&#34;https://duckduckgo.com/?q=AT%26T+GUI+cgi-bin%2Fredirect.ha&#34;&gt;A keyword search&lt;/a&gt; will show you that others are also affected by this, except that the base domain (slashdot.org) is usually different... One thing that all the links I viewed have in common: none of them seem to know what&#39;s happening.&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Some background&lt;/span&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>The switch as an ordinary GNU/Linux server</title>
      <link>https://purpleidea.com/blog/2014/11/04/the-switch-as-an-ordinary-gnulinux-server/</link>
      <pubDate>Tue, 04 Nov 2014 02:23:52 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/11/04/the-switch-as-an-ordinary-gnulinux-server/</guid>
      <description>&lt;p&gt;The fact that we manage the &lt;a href=&#34;https://en.wikipedia.org/wiki/Network_switch&#34;&gt;switches&lt;/a&gt; in our data centres differently than any other server is patently absurd, but we do so because we want to harness the power of a tiny bit of &lt;a href=&#34;https://en.wikipedia.org/wiki/Silicon#Electronic_grade&#34;&gt;silicon&lt;/a&gt; which happens to be able to dramatically speed up the switching bandwidth.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;absurd.png&#34;&gt;&lt;img class=&#34;wp-image-984 size-full&#34; src=&#34;absurd.png&#34; alt=&#34;absurd&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; beware of proprietary silicon, it&#39;s absurd!&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;That tiny bit of silicon is known as an &lt;a href=&#34;https://en.wikipedia.org/wiki/Application-specific_integrated_circuit&#34;&gt;ASIC&lt;/a&gt;, or an &lt;a href=&#34;https://en.wikipedia.org/wiki/Application-specific_integrated_circuit&#34;&gt;&lt;em&gt;application specific integrated circuit&lt;/em&gt;&lt;/a&gt;, and one particularly well performing ASIC (which is present in many commercially available switches) is called the &lt;a href=&#34;https://www.broadcom.com/products/Switching/Data-Center/BCM56850-Series&#34;&gt;Trident&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing Evolution&#39;s git master and GNOME continuous</title>
      <link>https://purpleidea.com/blog/2014/10/22/testing-evolutions-git-master-and-gnome-continuous/</link>
      <pubDate>Wed, 22 Oct 2014 17:22:56 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/10/22/testing-evolutions-git-master-and-gnome-continuous/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve wanted a feature in &lt;a href=&#34;https://wiki.gnome.org/Apps/Evolution/&#34;&gt;Evolution&lt;/a&gt; for a while. It was &lt;a href=&#34;https://bugzilla.gnome.org/show_bug.cgi?id=223621&#34;&gt;formally requested in 2002&lt;/a&gt;, and it just recently &lt;a href=&#34;https://git.gnome.org/browse/evolution/commit/?id=f6c0c8226ef8895f15c0221c94869ac5c663694f&#34;&gt;got fixed in git master&lt;/a&gt;. I only started &lt;a href=&#34;https://bugzilla.gnome.org/show_bug.cgi?id=223621#c9&#34;&gt;publicly groaning about this missing feature in 2013&lt;/a&gt;, and mcrha finally patched it. I tested the feature and found a small bug, &lt;a href=&#34;https://git.gnome.org/browse/evolution/commit/?id=ba3c08c7108519658b1d46a49ea3b2a834bc8e79&#34;&gt;mcrha patched that too&lt;/a&gt;, and I finally re-tested it. Now I&amp;rsquo;m blogging about this process so that you can get involved too!&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Why Evolution&lt;/span&gt;?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;Evolution supports GPG (&lt;a href=&#34;https://bugzilla.gnome.org/show_bug.cgi?id=713403&#34;&gt;Geary doesn&#39;t&lt;/a&gt;, Gmail doesn&#39;t)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Evolution has a beautiful composer (Gmail&#39;s sucks, just try to reply inline)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Evolution is &lt;a href=&#34;https://www.gnu.org/philosophy/free-sw.html&#34;&gt;Open Source&lt;/a&gt; and &lt;a href=&#34;https://www.gnu.org/philosophy/why-free.html&#34;&gt;Free Software&lt;/a&gt; (Gmail is proprietary)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Evolution integrates with GNOME (Gmail doesn&#39;t)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Evolution has lots of fancy, mature features (Geary doesn&#39;t)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Evolution cares about your privacy (&lt;a href=&#34;https://en.wikipedia.org/wiki/Gmail#Criticism&#34;&gt;Gmail doesn&#39;t&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;span style=&#34;text-decoration:underline;&#34;&gt;The feature&lt;/span&gt;:&#xA;&lt;p&gt;I&amp;rsquo;d like to be able to select a bunch of messages and click an archive action to move them to a specific folder. &lt;a href=&#34;https://en.wikipedia.org/wiki/Gmail&#34;&gt;Gmail popularized this idea in 2004&lt;/a&gt;, two years after it was proposed for Evolution. It has finally landed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hacking out an Openshift app</title>
      <link>https://purpleidea.com/blog/2014/10/18/hacking-out-an-openshift-app/</link>
      <pubDate>Sat, 18 Oct 2014 16:43:00 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/10/18/hacking-out-an-openshift-app/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/a4bf5cad81ca66212f4c8e52edb2e816b8895690&#34;&gt;I had an itch to scratch&lt;/a&gt;, and I wanted to get a bit more familiar with &lt;a href=&#34;https://www.openshift.com/&#34;&gt;Openshift&lt;/a&gt;. I had used it in the past, but it was time to have another go. The &lt;a href=&#34;https://pdfdoc-purpleidea.rhcloud.com/&#34;&gt;app&lt;/a&gt; and the &lt;a href=&#34;https://github.com/purpleidea/pdfdoc/&#34;&gt;code&lt;/a&gt; are now available. Feel free to check out:&lt;/p&gt;&#xA;&lt;h2 style=&#34;text-align:center;&#34;&gt;&lt;a href=&#34;https://pdfdoc-purpleidea.rhcloud.com/&#34;&gt;https://pdfdoc-purpleidea.rhcloud.com/&lt;/a&gt;&lt;/h2&gt;&#xA;This is a simple app that takes the URL of a markdown file on GitHub, and outputs a &lt;a href=&#34;https://github.com/jgm/pandoc/&#34;&gt;&lt;em&gt;pandoc&lt;/em&gt;&lt;/a&gt; converted PDF. I wanted to use &lt;em&gt;pandoc&lt;/em&gt; specifically, because it produces PDF&#39;s that were beautifully created with &lt;a href=&#34;https://en.wikipedia.org/wiki/Latex&#34;&gt;LaTeX&lt;/a&gt;. To embed a link in your upstream documentation that points to a PDF, just append the file&#39;s URL to this app&#39;s url, under a &lt;em&gt;/pdf/&lt;/em&gt; path. For example:&#xA;&lt;p&gt;&lt;a href=&#34;https://pdfdoc-purpleidea.rhcloud.com/pdf/https://github.com/purpleidea/puppet-gluster/blob/master/DOCUMENTATION.md&#34;&gt;&lt;a href=&#34;https://pdfdoc-purpleidea.rhcloud.com/pdf/&#34;&gt;https://pdfdoc-purpleidea.rhcloud.com/pdf/&lt;/a&gt;&lt;em&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/blob/master/DOCUMENTATION.md&#34;&gt;https://github.com/purpleidea/puppet-gluster/blob/master/DOCUMENTATION.md&lt;/a&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Continuous integration for Puppet modules</title>
      <link>https://purpleidea.com/blog/2014/10/10/continuous-integration-for-puppet-modules/</link>
      <pubDate>Fri, 10 Oct 2014 15:34:53 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/10/10/continuous-integration-for-puppet-modules/</guid>
      <description>&lt;p&gt;I just patched &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;puppet-gluster&lt;/a&gt; and &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa&#34;&gt;puppet-ipa&lt;/a&gt; to bring their infrastructure up to date with the current state of affairs&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;What&amp;rsquo;s new&lt;/span&gt;?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;Better README&#39;s&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-ipa/blob/master/Rakefile&#34;&gt;Rake syntax checking&lt;/a&gt; (fewer oopsies)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Continuous_integration&#34;&gt;CI&lt;/a&gt; (testing) with &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa/blob/master/.travis.yml&#34;&gt;travis&lt;/a&gt; on git push (automatic testing for everyone)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Use of &lt;a href=&#34;https://projects.puppetlabs.com/issues/14651&#34;&gt;&lt;code&gt;.pmtignore&lt;/code&gt;&lt;/a&gt; to ignore files from puppet module packages (finally)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Pushing modules to the forge with &lt;a href=&#34;https://github.com/maestrodev/puppet-blacksmith&#34;&gt;blacksmith&lt;/a&gt; (sweet!)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;This last point deserves another mention. Puppetlabs created the &#34;forge&#34; to try to provide some sort of added value to their stewardship. Personally, I like to look for code on &lt;a href=&#34;https://github.com/purpleidea/&#34;&gt;github&lt;/a&gt; instead, but nevertheless, some do use the forge. The problem is that to upload new releases, &lt;a href=&#34;https://twitter.com/purpleidea/status/520635052850675712&#34;&gt;you need to click your mouse like a windows user&lt;/a&gt;! Someone has finally solved that problem! If you use blacksmith, a new build is just a &lt;code&gt;rake push&lt;/code&gt; away!&#xA;&lt;p&gt;Have a look at &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/f24cca2ac8d138aae71c019a9bf6f311395f562d&#34;&gt;this example commit&lt;/a&gt; if you&amp;rsquo;re interested in seeing the plumbing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing dropbox “conflicted copy” problems</title>
      <link>https://purpleidea.com/blog/2014/09/30/fixing-dropbox-conflicted-copy-problems/</link>
      <pubDate>Tue, 30 Sep 2014 01:05:07 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/09/30/fixing-dropbox-conflicted-copy-problems/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.gnu.org/philosophy/who-does-that-server-really-serve.html&#34;&gt;I usually avoid proprietary cloud services because of freedom, privacy and vendor lock-in concerns.&lt;/a&gt; In addition, there are some excellent &lt;em&gt;libre&lt;/em&gt; (and hosted) services such as &lt;a href=&#34;https://wordpress.com/&#34;&gt;WordPress&lt;/a&gt;, &lt;a href=&#34;https://www.wikipedia.org/&#34;&gt;Wikipedia&lt;/a&gt; and &lt;a href=&#34;https://www.openshift.com/&#34;&gt;OpenShift&lt;/a&gt; which don&amp;rsquo;t have the above problems. Thirdly, there are every day &lt;a href=&#34;https://www.gnu.org/philosophy/free-sw.html&#34;&gt;Free Software&lt;/a&gt; tools such as &lt;a href=&#34;https://fedoraproject.org/&#34;&gt;Fedora GNU/Linux&lt;/a&gt;, &lt;a href=&#34;https://www.libreoffice.org/&#34;&gt;Libreoffice&lt;/a&gt;, and &lt;a href=&#34;http://git-annex.branchable.com/assistant/&#34;&gt;git-annex-assistant&lt;/a&gt; which make &lt;em&gt;my&lt;/em&gt; computing much more powerful. Finally, there are some hosted services that I use that don&amp;rsquo;t lock me in because I use them as push-only mirrors, and I only interact with them using Free Software tools. The two examples are &lt;a href=&#34;https://github.com/purpleidea/&#34;&gt;GitHub&lt;/a&gt; and &lt;a href=&#34;https://db.tt/svmqLvX7&#34;&gt;Dropbox&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing: Oh My Vagrant!</title>
      <link>https://purpleidea.com/blog/2014/09/03/introducing-oh-my-vagrant/</link>
      <pubDate>Wed, 03 Sep 2014 23:19:19 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/09/03/introducing-oh-my-vagrant/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re a reader of my &lt;a href=&#34;https://github.com/purpleidea/&#34;&gt;code&lt;/a&gt; or of &lt;a href=&#34;https://purpleidea.com/blog/&#34;&gt;this blog&lt;/a&gt;, it&amp;rsquo;s no secret that I hack on a lot of &lt;a href=&#34;https://en.wikipedia.org/wiki/Puppet_%28software%29&#34;&gt;puppet&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Vagrant_%28software%29&#34;&gt;vagrant&lt;/a&gt;. Recently I&amp;rsquo;ve fooled around with a bit of &lt;a href=&#34;https://en.wikipedia.org/wiki/Docker_%28software%29&#34;&gt;docker&lt;/a&gt;, too. I realized that the &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/blob/master/vagrant/Vagrantfile&#34;&gt;vagrant&lt;/a&gt;, &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa/blob/master/vagrant/Vagrantfile&#34;&gt;environments&lt;/a&gt; I built for &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;puppet-gluster&lt;/a&gt; and &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa/&#34;&gt;puppet-ipa&lt;/a&gt; needed to be generalized, and they needed new features too. Therefore&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Introducing: &lt;strong&gt;Oh My Vagrant!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Oh My Vagrant&lt;/em&gt; is an attempt to provide an &lt;em&gt;easy&lt;/em&gt; to use development environment so that you can be up and hacking &lt;em&gt;quickly&lt;/em&gt;, and focusing on the real &lt;em&gt;devops&lt;/em&gt; problems. The &lt;a href=&#34;https://github.com/purpleidea/oh-my-vagrant/blob/master/README&#34;&gt;README&lt;/a&gt; explains my choice of project name.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rough data density calculations</title>
      <link>https://purpleidea.com/blog/2014/08/27/rough-data-density-calculations/</link>
      <pubDate>Wed, 27 Aug 2014 05:52:47 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/08/27/rough-data-density-calculations/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://hardware.slashdot.org/story/14/08/26/2325203/seagate-ships-first-8-terabyte-hard-drive&#34;&gt;Seagate has just publicly announced 8TB HDD&amp;rsquo;s in a 3.5&amp;quot; form factor.&lt;/a&gt; I decided to do some &lt;em&gt;rough&lt;/em&gt; calculations to understand the density a bit better&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Note: I have decided to ignore the distinction between &lt;a href=&#34;https://en.wikipedia.org/wiki/Terabyte&#34;&gt;Terabytes (TB)&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Tebibyte&#34;&gt;Tebibytes (TiB)&lt;/a&gt;, since I always work in base 2, but I hate the -bi naming conventions. Seagate is most likely announcing an 8&lt;em&gt;TB&lt;/em&gt; HDD, which is actually smaller than a true 8TiB drive. If you don&amp;rsquo;t know the difference it&amp;rsquo;s worth learning.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hybrid management of FreeIPA types with Puppet</title>
      <link>https://purpleidea.com/blog/2014/07/24/hybrid-management-of-freeipa-types-with-puppet/</link>
      <pubDate>Thu, 24 Jul 2014 00:41:08 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/07/24/hybrid-management-of-freeipa-types-with-puppet/</guid>
      <description>&lt;p&gt;&lt;em&gt;(Note: this hybrid management technique is being demonstrated in the &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa&#34;&gt;puppet-ipa&lt;/a&gt; module for &lt;a href=&#34;https://www.freeipa.org/&#34;&gt;FreeIPA&lt;/a&gt;, but the idea could be used for other modules and scenarios too. See below for some use cases&amp;hellip;)&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The error message that puppet hackers are probably most familiar is:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error: Duplicate declaration: Thing[/foo/bar] is already declared in file /tmp/baz.pp:2; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cannot redeclare at /tmp/baz.pp:4 on node computer.example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Typically this means that there is either a bug in your code, or someone has defined something more than once. As annoying as this might be, a compile error happens for a reason: puppet detected a problem, and it is giving you a chance to fix it, without first running code that could otherwise leave your machine in an undefined state.&lt;/p&gt;</description>
    </item>
    <item>
      <title>One minute hacks: the nautilus scripts folder</title>
      <link>https://purpleidea.com/blog/2014/06/26/one-minute-hacks-the-nautilus-scripts-folder/</link>
      <pubDate>Thu, 26 Jun 2014 00:01:10 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/06/26/one-minute-hacks-the-nautilus-scripts-folder/</guid>
      <description>&lt;p&gt;Master &lt;a href=&#34;https://en.wikipedia.org/wiki/Software_Defined_Networking&#34;&gt;SDN&lt;/a&gt; hacker &lt;a href=&#34;https://twitter.com/guteusa&#34;&gt;Flavio&lt;/a&gt; sent me some tunes. They were sitting on my desktop in a folder:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ls ~/Desktop/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uncopyrighted_tunes_from_flavio/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I wanted to listen them while hacking, but what was the easiest way&amp;hellip;? I wanted to use the &lt;em&gt;nautilus&lt;/em&gt; file browser to select which folder to play, and the &lt;em&gt;totem&lt;/em&gt; music/video player to do the playing.&lt;/p&gt;&#xA;&lt;p&gt;Drop a file named &lt;code&gt;totem&lt;/code&gt; into:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/.local/share/nautilus/scripts/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;with the contents:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# o hai from purpleidea&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;exec&lt;/span&gt; totem -- &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$@&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and make it executable with:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Securely managing secrets for FreeIPA with Puppet</title>
      <link>https://purpleidea.com/blog/2014/06/06/securely-managing-secrets-for-freeipa-with-puppet/</link>
      <pubDate>Fri, 06 Jun 2014 06:12:19 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/06/06/securely-managing-secrets-for-freeipa-with-puppet/</guid>
      <description>&lt;p&gt;Configuration management is an essential part of securing your infrastructure because it can make sure that it is set up correctly. It is essential that configuration management only enhance security, and not weaken it. Unfortunately, the status-quo of secret management in puppet is pretty poor.&lt;/p&gt;&#xA;&lt;p&gt;In the worst (and most common) case, plain text passwords are found in manifests. If the module author tried harder, sometimes these password strings are pre-hashed (and sometimes salted) and fed directly into the consumer. (This isn&amp;rsquo;t always possible without modifying the software you&amp;rsquo;re managing.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hiera data in modules and OS independent puppet</title>
      <link>https://purpleidea.com/blog/2014/06/04/hiera-data-in-modules-and-os-independent-puppet/</link>
      <pubDate>Wed, 04 Jun 2014 03:47:23 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/06/04/hiera-data-in-modules-and-os-independent-puppet/</guid>
      <description>&lt;p&gt;Earlier this year, &lt;a href=&#34;https://github.com/ripienaar&#34;&gt;R.I.Pienaar&lt;/a&gt; released his brilliant &lt;a href=&#34;https://github.com/ripienaar/puppet-module-data/&#34;&gt;data in modules hack&lt;/a&gt;, a few months ago, I got the chance to start &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/32fdb618625f011b7d7387428520441a91321e0e&#34;&gt;implementing it in Puppet-Gluster&lt;/a&gt;, and today I have found the time to blog about it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;What is it&lt;/span&gt;?&lt;/p&gt;&#xA;&lt;p&gt;R.I.&amp;rsquo;s hack lets you store &lt;a href=&#34;https://github.com/puppetlabs/hiera&#34;&gt;hiera&lt;/a&gt; data inside a puppet module. This can have many uses including letting you throw out the nested mess that is commonly &lt;code&gt;params.pp&lt;/code&gt;, and replace it with something file based that is elegant and hierarchical. For my use case, I&amp;rsquo;m using it to build OS independent puppet modules, without storing this data as code. The secondary win is that porting your module to a new GNU/Linux distribution or version could be as simple as adding a &lt;a href=&#34;https://en.wikipedia.org/wiki/YAML&#34;&gt;YAML&lt;/a&gt; file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Restarting GNOME shell via SSH</title>
      <link>https://purpleidea.com/blog/2014/05/29/restarting-gnome-shell-via-ssh/</link>
      <pubDate>Thu, 29 May 2014 02:18:35 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/05/29/restarting-gnome-shell-via-ssh/</guid>
      <description>&lt;p&gt;When GNOME shell breaks, you get to keep both pieces. The nice thing about shell failures in GNOME 3, is that if you&amp;rsquo;re able to do a restart, the active windows are &lt;a href=&#34;https://bugzilla.gnome.org/show_bug.cgi?id=695487&#34;&gt;mostly not disturbed&lt;/a&gt;. The common way to do this is to type &lt;em&gt;ALT-F2&lt;/em&gt;, &lt;em&gt;r&lt;/em&gt;, &amp;laquo;em&amp;gt;ENTER&lt;/em&gt;&amp;gt;.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, you can&amp;rsquo;t always type that in if your shell is very borked. If you are lucky enough to have SSH access, and another machine, you can log in remotely and run this script:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vagrant on Fedora with libvirt (reprise)</title>
      <link>https://purpleidea.com/blog/2014/05/13/vagrant-on-fedora-with-libvirt-reprise/</link>
      <pubDate>Tue, 13 May 2014 18:58:06 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/05/13/vagrant-on-fedora-with-libvirt-reprise/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.vagrantup.com/&#34;&gt;Vagrant&lt;/a&gt; has become the &lt;em&gt;de facto&lt;/em&gt; tool for &lt;em&gt;devops&lt;/em&gt;. Faster iterations, clean environments, and less overhead. This &lt;em&gt;isn&amp;rsquo;t&lt;/em&gt; an article about &lt;em&gt;why&lt;/em&gt; you should use Vagrant. This is an article about &lt;em&gt;how&lt;/em&gt; to get up and running with Vagrant on Fedora with libvirt &lt;em&gt;easily&lt;/em&gt;!&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Background&lt;/span&gt;:&lt;/p&gt;&#xA;&lt;p&gt;This article is an update of my original &lt;a href=&#34;https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/&#34;&gt;Vagrant on Fedora with libvirt&lt;/a&gt; article. There is still lots of good information in that article, but this one should be easier to follow and uses updated versions of Vagrant and vagrant-libvirt.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Keeping git submodules in sync with your branches</title>
      <link>https://purpleidea.com/blog/2014/05/06/keeping-git-submodules-in-sync-with-your-branches/</link>
      <pubDate>Tue, 06 May 2014 19:34:13 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/05/06/keeping-git-submodules-in-sync-with-your-branches/</guid>
      <description>&lt;p&gt;This is a quick trick for making working with &lt;a href=&#34;http://www.git-scm.com/book/en/Git-Tools-Submodules&#34;&gt;&lt;em&gt;git submodules&lt;/em&gt;&lt;/a&gt; more magic.&lt;/p&gt;&#xA;&lt;p&gt;One day you might find that using &lt;em&gt;git submodules&lt;/em&gt; is needed for your project. It&amp;rsquo;s probably not necessary for everyday hacking, but if you&amp;rsquo;re glue&lt;em&gt;-ing&lt;/em&gt; things together, it can be quite useful. &lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;Puppet-Gluster&lt;/a&gt; uses &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/tree/master/vagrant/gluster/puppet/modules&#34;&gt;this technique&lt;/a&gt; to easily include all the dependencies needed for a &lt;a title=&#34;Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!&#34; href=&#34;https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/&#34;&gt;Puppet-Gluster+Vagrant automatic deployment&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re a good hacker, you develop things in separate feature branches. Example:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Working at RedHat</title>
      <link>https://purpleidea.com/blog/2014/04/02/working-at-redhat/</link>
      <pubDate>Wed, 02 Apr 2014 14:27:35 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/04/02/working-at-redhat/</guid>
      <description>&lt;p&gt;&lt;em&gt;So this happened&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;james-redhat.jpg&#34;&gt;&lt;img class=&#34;size-large wp-image-804&#34; src=&#34;james-redhat.jpg&#34; alt=&#34;James just James at RedHat headquarters in North Carolina&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; James just James at RedHat headquarters in North Carolina wearing his new red hat.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.redhat.com/&#34;&gt;RedHat&lt;/a&gt; made me an offer, and I am happy to say that I have just started this week!&lt;/p&gt;&#xA;&lt;p&gt;I am proud to have joined a company that employs many of the worlds foremost, highly professional and clever &lt;a href=&#34;https://en.wikipedia.org/wiki/Hacker_%28term%29&#34;&gt;hackers&lt;/a&gt;. It is indubitably the best &lt;a href=&#34;https://www.gnu.org/philosophy/selling.html&#34;&gt;Free Software&lt;/a&gt; [1] / &lt;a href=&#34;https://www.gnu.org/philosophy/free-sw.html&#34;&gt;Open Source&lt;/a&gt; company out there, and they ship some of the greatest and most elegant software available.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Puppet-Gluster now available as RPM</title>
      <link>https://purpleidea.com/blog/2014/03/27/puppet-gluster-now-available-as-rpm/</link>
      <pubDate>Thu, 27 Mar 2014 20:32:41 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/03/27/puppet-gluster-now-available-as-rpm/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been afraid of &lt;a href=&#34;https://en.wikipedia.org/wiki/RPM_Package_Manager&#34;&gt;RPM&lt;/a&gt; and package maintaining [1] for years, but thanks to &lt;a href=&#34;http://www.keithley.org/kaleb/kaleb.html&#34;&gt;Kaleb Keithley&lt;/a&gt;, I have finally made some RPM&amp;rsquo;s that weren&amp;rsquo;t generated from a &lt;a href=&#34;http://docs.python.org/3/distutils/builtdist.html&#34;&gt;high level tool&lt;/a&gt;. Now that I have the &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/241956937f9778c332335267fac1256792c71155&#34;&gt;boilerplate&lt;/a&gt; done, it&amp;rsquo;s a relatively painless process!&lt;/p&gt;&#xA;&lt;p&gt;In case you don&amp;rsquo;t know &lt;a href=&#34;https://twitter.com/kalebkuechle&#34;&gt;kkeithley&lt;/a&gt;, he is a wizard [2] who happens to also be especially cool and hardworking. If you meet him, be sure to buy him a &lt;a href=&#34;https://en.wikipedia.org/wiki/Beer&#34;&gt;&lt;em&gt;$BEVERAGE&lt;/em&gt;&lt;/a&gt;. &amp;lt;/plug&amp;gt;&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;wizard_penguin.png&#34;&gt;&lt;img class=&#34;size-large wp-image-799&#34; src=&#34;wizard_penguin.png&#34; alt=&#34;A photo of kkeithley after he (temporarily) transformed himself into a wizard penguin.&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; A photo of kkeithley after he (temporarily) transformed himself into a wizard penguin.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/241956937f9778c332335267fac1256792c71155&#34;&gt;The full source of my changes is available in git.&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing Puppet Exec[&#39;again&#39;]</title>
      <link>https://purpleidea.com/blog/2014/03/24/introducing-puppet-execagain/</link>
      <pubDate>Mon, 24 Mar 2014 18:37:23 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/03/24/introducing-puppet-execagain/</guid>
      <description>&lt;p&gt;Puppet is missing a number of much-needed features. That&amp;rsquo;s the bad news. The good news is that I&amp;rsquo;ve been able to write some of these as modules that don&amp;rsquo;t need to change the Puppet core! This is an article about one of these features.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Posit&lt;/span&gt;:&lt;/strong&gt; It&amp;rsquo;s not possible to apply all of your Puppet manifests in a single run.&lt;/p&gt;&#xA;&lt;p&gt;I believe that this holds true for the current implementation of Puppet. Most manifests can, do and &lt;em&gt;should&lt;/em&gt; apply completely in a single run. If your Puppet run takes more than one run to converge, then chances are that you&amp;rsquo;re doing something wrong.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Preserving your working directory in gnome-terminal</title>
      <link>https://purpleidea.com/blog/2014/03/20/preserving-your-working-directory-in-gnome-terminal/</link>
      <pubDate>Thu, 20 Mar 2014 18:01:24 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/03/20/preserving-your-working-directory-in-gnome-terminal/</guid>
      <description>&lt;p&gt;I use gnome-terminal for most of my hacking. In fact, I use it so much, that I&amp;rsquo;ll often have multiple tabs open for a particular project. Here&amp;rsquo;s my workflow:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&#x9;&lt;li&gt;&lt;em&gt;Control+Alt+t&lt;/em&gt; (My shortcut to open a new gnome-terminal window.)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;code&gt;cd ~/code/some_cool_hack/ # directory of some cool hack&lt;/code&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;em&gt;Control-Shift-t&lt;/em&gt; (Shortcut to open a new gnome-terminal tab.)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Hack, hack, hack...&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;The problem is that the new tab that I&#39;ve created will have a &lt;em&gt;$PWD&lt;/em&gt; of &lt;code&gt;~&lt;/code&gt;, instead of keeping the &lt;em&gt;$PWD&lt;/em&gt; of &lt;code&gt;~/code/some_cool_hack/&lt;/code&gt;, which is the project I&#39;m working on!&#xA;&lt;p&gt;The solution is to add:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Speaking at SCALE today!</title>
      <link>https://purpleidea.com/blog/2014/02/21/speaking-at-scale-today/</link>
      <pubDate>Fri, 21 Feb 2014 13:54:47 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/02/21/speaking-at-scale-today/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ll be giving a talk at &lt;a href=&#34;http://www.socallinuxexpo.org/scale12x&#34;&gt;SCALE&lt;/a&gt; today about automatically deploying GlusterFS with Puppet-Gluster and Vagrant. I&amp;rsquo;ll be giving some live demos, and this will cover some of the material from:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/&#34;&gt;Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;and it will contain excerpts from:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://purpleidea.com/blog/2014/01/27/screencasts-of-puppet-gluster-vagrant/&#34;&gt;Screencasts of Puppet-Gluster + Vagrant&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll also be talking about some new upcoming features, and am happy to answer all of your questions!&lt;/p&gt;&#xA;&lt;p&gt;The talk will be part of &lt;a href=&#34;http://www.infranext.org/?page_id=18&#34;&gt;Infrastructure.next&lt;/a&gt; and is starting around 1:30 or 2pm in the &lt;a href=&#34;http://www.socallinuxexpo.org/scale12x/schedule/friday&#34;&gt;Century AB&lt;/a&gt; room.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building a snow shelter</title>
      <link>https://purpleidea.com/blog/2014/02/17/building-a-snow-shelter/</link>
      <pubDate>Mon, 17 Feb 2014 18:23:27 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/02/17/building-a-snow-shelter/</guid>
      <description>&lt;p&gt;To give you a break from the usual GNU/Linux/DevOps/Puppet/GlusterFS drab, I&amp;rsquo;ve decided to have a go at writing a &lt;em&gt;different&lt;/em&gt; kind of technical article. This article will show you how to build the traditional &lt;a href=&#34;https://en.wikipedia.org/wiki/Canada&#34;&gt;Canadian&lt;/a&gt; snow dwelling known as a &lt;a href=&#34;https://en.wikipedia.org/wiki/Quinzee&#34;&gt;quinzee&lt;/a&gt;. If you will be travelling to Canada, I recommended that you read through this article ahead of time, so that you don&amp;rsquo;t offend your host by being unfamiliar with their traditional living accommodations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scathing review of the Lenovo X240</title>
      <link>https://purpleidea.com/blog/2014/02/02/scathing-review-of-the-lenovo-x240/</link>
      <pubDate>Sun, 02 Feb 2014 15:15:10 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/02/02/scathing-review-of-the-lenovo-x240/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m using a Lenovo X201 with 8GiB of RAM. Apart from some minor issues, I&amp;rsquo;ve been very satisfied with this laptop. It&amp;rsquo;s over four years old, and so I decided to see what&amp;rsquo;s available on the horizon. I &lt;em&gt;did not&lt;/em&gt; buy an X240 because of the following reasons:&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;The X240 has only &lt;strong&gt;one&lt;/strong&gt; slot for RAM and thus supports a &lt;em&gt;maximum&lt;/em&gt; of 8GiB.&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;I think it&amp;rsquo;s pretty ridiculous for any successor to the X230 to support less RAM. In and of itself this is a &lt;strong&gt;&lt;em&gt;deal breaker!&lt;/em&gt;&lt;/strong&gt; My X201 has 8GiB, and I wish it had more! It doesn&amp;rsquo;t make sense to settle for less on new kit. In other words, Lenovo is stating that &lt;a href=&#34;https://en.wikiquote.org/wiki/Bill_Gates&#34;&gt;8GiB ought to be enough for anybody&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Show the exit status in your $PS1</title>
      <link>https://purpleidea.com/blog/2014/01/29/show-the-exit-status-in-your-ps1/</link>
      <pubDate>Wed, 29 Jan 2014 19:43:44 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/01/29/show-the-exit-status-in-your-ps1/</guid>
      <description>&lt;p&gt;As an update &lt;a href=&#34;https://purpleidea.com/blog/2013/10/10/show-current-git-branch-in-ps1-when-branch-is-not-master/&#34;&gt;to my earlier article&lt;/a&gt;, a friend gave me an idea of how to make my &lt;code&gt;$PS1&lt;/code&gt; even better&amp;hellip; First, the relevant part of my &lt;code&gt;~/.bashrc&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps1_prompt&lt;span style=&#34;color:#666&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;ps1_exit&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$?&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$ps1_exit&lt;/span&gt; -eq &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#ps1_status=`echo -e &amp;#34;\[&amp;amp;#092;&amp;amp;#048;33[32m\]&amp;#34;&amp;#39;\$&amp;#39;&amp;#34;\[&amp;amp;#092;&amp;amp;#048;33[0m\]&amp;#34;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#b8860b&#34;&gt;ps1_status&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;\$&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#b8860b&#34;&gt;ps1_status&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;echo&lt;/span&gt; -e &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\[&amp;amp;#092;&amp;amp;#048;33[1;31m\]&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;\$&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\[&amp;amp;#092;&amp;amp;#048;33[0m\]&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#b8860b&#34;&gt;ps1_git&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;__git_ps1 %s&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt; !&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; -a &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;__git_ps1 %s&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt; !&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;master&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#b8860b&#34;&gt;ps1_git&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34; (\[&amp;amp;#092;&amp;amp;#048;33[32m\]&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;__git_ps1 &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;%s&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;\[&amp;amp;#092;&amp;amp;#048;33[0m\])&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#b8860b&#34;&gt;PS1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;debian_chroot&lt;/span&gt;:+(&lt;span style=&#34;color:#b8860b&#34;&gt;$debian_chroot&lt;/span&gt;)&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;\u@\h:\[&amp;amp;#092;&amp;amp;#048;33[01;34m\]\w\[&amp;amp;#092;&amp;amp;#048;33[00m\]&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;ps1_git&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;ps1_status&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt; &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# preserve earlier PROMPT_COMMAND entries...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;ps1_prompt;&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;$PROMPT_COMMAND&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;If you haven&amp;rsquo;t figured it out, the magic is that the trailing &lt;strong&gt;$&lt;/strong&gt; prompt gets coloured in &lt;strong&gt;&lt;span style=&#34;color:#ff0000;&#34;&gt;red&lt;/span&gt;&lt;/strong&gt; when the previous command exited with a non-zero value. Example:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Screencasts of Puppet-Gluster &#43; Vagrant</title>
      <link>https://purpleidea.com/blog/2014/01/27/screencasts-of-puppet-gluster-vagrant/</link>
      <pubDate>Mon, 27 Jan 2014 16:13:10 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/01/27/screencasts-of-puppet-gluster-vagrant/</guid>
      <description>&lt;p&gt;I decided to record some screencasts to show how easy it is to deploy &lt;a href=&#34;https://gluster.org/&#34;&gt;GlusterFS&lt;/a&gt; using &lt;a title=&#34;Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!&#34; href=&#34;https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/&#34;&gt;Puppet-Gluster+Vagrant&lt;/a&gt;. You can follow along even if you don&amp;rsquo;t know anything about Puppet or Vagrant. The hardest part of this process was producing the actual videos!&lt;/p&gt;&#xA;&lt;p&gt;If recommend first reading my earlier articles if you&amp;rsquo;re planning on following along:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;&#xA;&#x9;&#x9;&lt;blockquote&gt;&lt;a href=&#34;https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/&#34;&gt;Vagrant on Fedora with libvirt&lt;/a&gt;&lt;/blockquote&gt;&#xA;&#x9;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&#xA;&#x9;&#x9;&lt;blockquote&gt;&lt;a href=&#34;https://purpleidea.com/blog/2013/12/21/vagrant-vsftp-and-other-tricks/&#34;&gt;Vagrant vsftp and other tricks&lt;/a&gt;&lt;/blockquote&gt;&#xA;&#x9;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&#xA;&#x9;&#x9;&lt;blockquote&gt;&lt;a href=&#34;https://purpleidea.com/blog/2014/01/02/vagrant-clustered-ssh-and-screen/&#34;&gt;Vagrant clustered SSH and &#39;screen&#39;&lt;/a&gt;&lt;/blockquote&gt;&#xA;&#x9;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&#xA;&#x9;&#x9;&lt;blockquote&gt;&lt;a href=&#34;https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/&#34;&gt;Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!&lt;/a&gt;&lt;/blockquote&gt;&#xA;&#x9;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;Without any further delay, here are the screencasts:&#xA;&lt;p&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/puppet-gluster-screencast.part1.ogv&#34;&gt;Intro, and provisioning of the Puppet server.&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building base images for Vagrant with a Makefile</title>
      <link>https://purpleidea.com/blog/2014/01/20/building-base-images-for-vagrant-with-a-makefile/</link>
      <pubDate>Mon, 20 Jan 2014 11:46:31 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/01/20/building-base-images-for-vagrant-with-a-makefile/</guid>
      <description>&lt;p&gt;I needed a base image &amp;ldquo;&lt;a href=&#34;https://docs.vagrantup.com/v2/boxes.html&#34;&gt;box&lt;/a&gt;&amp;rdquo; for my &lt;a title=&#34;Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!&#34; href=&#34;https://purpleidea.com/blog/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/&#34;&gt;Puppet-Gluster+Vagrant&lt;/a&gt; work. It would have been great if good boxes already existed, and even better if it were easy to build my own. As it turns out, I wasn&amp;rsquo;t able to satisfy either of these conditions, so I&amp;rsquo;ve had to build one myself! &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/blob/master/builder/README&#34;&gt;I&amp;rsquo;ve published all of my code&lt;/a&gt;, so that you can use these techniques and &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/blob/master/builder/Makefile&#34;&gt;tools&lt;/a&gt; too!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing GlusterFS during “Glusterfest”</title>
      <link>https://purpleidea.com/blog/2014/01/16/testing-glusterfs-during-glusterfest/</link>
      <pubDate>Thu, 16 Jan 2014 20:28:17 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/01/16/testing-glusterfs-during-glusterfest/</guid>
      <description>&lt;p&gt;The GlusterFS community is having a &amp;ldquo;test day&amp;rdquo;. &lt;a title=&#34;Automatically deploying GlusterFS with Puppet-Gluster + Vagrant!&#34; href=&#34;https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/&#34;&gt;Puppet-Gluster+Vagrant&lt;/a&gt; is a great tool to help with this, and it has now been patched to support &lt;em&gt;alpha&lt;/em&gt;, &lt;em&gt;beta&lt;/em&gt;, &lt;em&gt;qa&lt;/em&gt;, and &lt;em&gt;rc&lt;/em&gt; releases! Because it was built so well (&lt;strong&gt;*&lt;/strong&gt;&lt;em&gt;cough&lt;/em&gt;&lt;strong&gt;*&lt;/strong&gt;, shameless plug), it only took &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/30392fd0cb4e2bd0e39faea83915bfe8a6574bbc&#34;&gt;one patch&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Okay, first make sure that your Puppet-Gluster+Vagrant setup is working properly. I have only tested this on Fedora 20. Please read:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automatically deploying GlusterFS with Puppet-Gluster &#43; Vagrant!</title>
      <link>https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/</link>
      <pubDate>Wed, 08 Jan 2014 23:00:22 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/01/08/automatically-deploying-glusterfs-with-puppet-gluster-vagrant/</guid>
      <description>&lt;p&gt;&lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;Puppet-Gluster&lt;/a&gt; was always about automating the deployment of &lt;a href=&#34;https://www.gluster.org/&#34;&gt;GlusterFS&lt;/a&gt;. Getting your own Puppet server and the associated infrastructure running was never included &amp;ldquo;&lt;em&gt;out of the box&lt;/em&gt;&amp;rdquo;. &lt;strong&gt;Today, it is!&lt;/strong&gt; (This is big news!)&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve used &lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant&lt;/a&gt; to automatically build these GlusterFS clusters. I&amp;rsquo;ve tested this with &lt;a href=&#34;https://fedoraproject.org/&#34;&gt;Fedora 20&lt;/a&gt;, and &lt;a href=&#34;https://github.com/pradels/vagrant-libvirt/&#34;&gt;vagrant-libvirt&lt;/a&gt;. This won&amp;rsquo;t work with Fedora 19 because of &lt;a href=&#34;https://bugzilla.redhat.com/show_bug.cgi?id=876541&#34;&gt;bz#876541&lt;/a&gt;. I recommend first reading my earlier articles for Vagrant and Fedora:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;&#xA;&lt;blockquote&gt;&lt;a href=&#34;https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/&#34;&gt;Vagrant on Fedora with libvirt&lt;/a&gt;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&#xA;&lt;blockquote&gt;&lt;a href=&#34;https://purpleidea.com/blog/2013/12/21/vagrant-vsftp-and-other-tricks/&#34;&gt;Vagrant vsftp and other tricks&lt;/a&gt;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&#xA;&lt;blockquote&gt;&lt;a href=&#34;https://purpleidea.com/blog/2014/01/02/vagrant-clustered-ssh-and-screen/&#34;&gt;Vagrant clustered SSH and &#39;screen&#39;&lt;/a&gt;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;Once you&#39;re comfortable with the material in the above articles, we can continue...&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;The short answer&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vagrant clustered SSH and ‘screen’</title>
      <link>https://purpleidea.com/blog/2014/01/02/vagrant-clustered-ssh-and-screen/</link>
      <pubDate>Thu, 02 Jan 2014 00:40:49 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2014/01/02/vagrant-clustered-ssh-and-screen/</guid>
      <description>&lt;p&gt;Some fun updates for vagrant hackers&amp;hellip; I wanted to use the venerable clustered SSH (&lt;code&gt;cssh&lt;/code&gt;) and &lt;code&gt;screen&lt;/code&gt; with vagrant. I decided to expand on my &lt;a href=&#34;https://gist.github.com/purpleidea/8071962#file-bashrc_vagrant-sh-L17&#34;&gt;&lt;code&gt;vsftp&lt;/code&gt;&lt;/a&gt; script. First read:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p style=&#34;text-align:center;&#34;&gt;&lt;strong&gt;&lt;a title=&#34;Vagrant on Fedora with libvirt&#34; href=&#34;https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/&#34;&gt;Vagrant on Fedora with libvirt&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;and&#xA;&lt;blockquote&gt;&#xA;&lt;p style=&#34;text-align:center;&#34;&gt;&lt;strong&gt;&lt;a title=&#34;Vagrant vsftp and other tricks&#34; href=&#34;https://purpleidea.com/blog/2013/12/21/vagrant-vsftp-and-other-tricks/&#34;&gt;Vagrant vsftp and other tricks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;to get up to speed on the background information.&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Vagrant screen&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;First, a simple &lt;code&gt;screen&lt;/code&gt; hack&amp;hellip; I often use my &lt;code&gt;vssh&lt;/code&gt; alias to quickly ssh into a machine, but I don&amp;rsquo;t want to have to waste time with &lt;code&gt;sudo&lt;/code&gt;-ing to &lt;em&gt;root&lt;/em&gt; and then running &lt;code&gt;screen&lt;/code&gt; each time. Enter &lt;code&gt;vscreen&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vagrant vsftp and other tricks</title>
      <link>https://purpleidea.com/blog/2013/12/21/vagrant-vsftp-and-other-tricks/</link>
      <pubDate>Sat, 21 Dec 2013 11:58:49 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/12/21/vagrant-vsftp-and-other-tricks/</guid>
      <description>&lt;p&gt;&lt;a title=&#34;Vagrant on Fedora with libvirt&#34; href=&#34;https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/&#34;&gt;As I previously wrote, I&amp;rsquo;ve been busy with Vagrant on Fedora with libvirt&lt;/a&gt;, and have even been &lt;a href=&#34;https://github.com/mitchellh/vagrant/pull/2677&#34;&gt;submitting&lt;/a&gt;, &lt;a href=&#34;https://github.com/fgrehm/vagrant-cachier/pull/68&#34;&gt;patches&lt;/a&gt; and &lt;a href=&#34;https://github.com/mitchellh/vagrant/issues/2680&#34;&gt;issues&lt;/a&gt;! (&lt;a href=&#34;https://github.com/pradels/vagrant-libvirt/issues/107&#34;&gt;This &amp;ldquo;&lt;em&gt;closed&lt;/em&gt;&amp;rdquo; issue needs solving!&lt;/a&gt;) Here are some of the tricks that I&amp;rsquo;ve used while hacking away.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Default provider&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I should have mentioned this in my earlier article but I forgot: If you&amp;rsquo;re always using the same provider, you might want to set it as the default. In my case I&amp;rsquo;m using &lt;a href=&#34;https://github.com/purpleidea/vagrant-libvirt&#34;&gt;vagrant-libvirt&lt;/a&gt;. To do so, add the following to your &lt;code&gt;.bashrc&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vagrant on Fedora with libvirt</title>
      <link>https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/</link>
      <pubDate>Mon, 09 Dec 2013 20:14:51 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/12/09/vagrant-on-fedora-with-libvirt/</guid>
      <description>&lt;p&gt;Apparently lots of people are using &lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant&lt;/a&gt; these days, so I figured I&amp;rsquo;d try it out. I wanted to get it working on Fedora, and without Virtualbox. This is an intro article on Vagrant, and what I&amp;rsquo;ve done. I did this on Fedora 19. Feel free to suggest improvements.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Intro&lt;/span&gt;:&lt;/p&gt;&#xA;&lt;p&gt;Vagrant is a tool that easily provisions virtual machines, and then kicks off a configuration management deployment like &lt;a href=&#34;https://en.wikipedia.org/wiki/Puppet_%28software%29&#34;&gt;Puppet&lt;/a&gt;. It&amp;rsquo;s often used for development. I&amp;rsquo;m planning on using it to test some &lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;Puppet-Gluster&lt;/a&gt; managed GlusterFS clusters.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Now syndicated on “Planet Fedora”</title>
      <link>https://purpleidea.com/blog/2013/12/09/now-syndicated-on-planet-fedora/</link>
      <pubDate>Mon, 09 Dec 2013 19:18:56 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/12/09/now-syndicated-on-planet-fedora/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m now syndicated on the &lt;a href=&#34;http://planet.fedoraproject.org/&#34;&gt;Fedora Project planet&lt;/a&gt;. If you haven&amp;rsquo;t read through &lt;a href=&#34;https://purpleidea.com/blog/&#34;&gt;my blog&lt;/a&gt; yet, let me introduce myself, I&amp;rsquo;m &lt;a href=&#34;http://purpleidea.fedorapeople.org/&#34;&gt;James&lt;/a&gt;, and I write &lt;strong&gt;&lt;a href=&#34;https://purpleidea.com/blog/&#34;&gt;The Technical Blog of James&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m a sysadmin, DevOps/Puppet hacker, I.T./network architect and physiologist. Hi! I run Fedora as my primary desktop, but I also use it for servers, particularly for development before future versions of &lt;a href=&#34;https://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux&#34;&gt;RHEL&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/CentOS&#34;&gt;CentOS&lt;/a&gt; release.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m most well-known for &lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;Puppet-Gluster&lt;/a&gt;, but I&amp;rsquo;ve also written a decent &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa&#34;&gt;Puppet-IPA&lt;/a&gt; (&lt;a href=&#34;http://www.freeipa.org/&#34;&gt;FreeIPA&lt;/a&gt;) module. I&amp;rsquo;m currently working on porting Puppet-Gluster to Fedora and looking forward to the &lt;a href=&#34;https://fedoraproject.org/wiki/Releases/20/Schedule&#34;&gt;upcoming release of Fedora 20&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Advanced recursion and memoization in Puppet</title>
      <link>https://purpleidea.com/blog/2013/11/27/advanced-recursion-and-memoization-in-puppet/</link>
      <pubDate>Wed, 27 Nov 2013 00:03:15 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/11/27/advanced-recursion-and-memoization-in-puppet/</guid>
      <description>&lt;p&gt;As a follow-up to my original article on &lt;a title=&#34;recursion in puppet (for no particular reason)&#34; href=&#34;https://purpleidea.com/blog/2012/11/20/recursion-in-puppet-for-no-particular-reason/&#34;&gt;recursion in Puppet&lt;/a&gt;, and in my attempt to &lt;a title=&#34;Pushing Puppet at Puppet Camp DC, LISA 2013&#34; href=&#34;https://purpleidea.com/blog/2013/11/05/pushing-puppet-at-puppet-camp-dc-lisa-2013/&#34;&gt;Push Puppet (to its limit)&lt;/a&gt;, I&amp;rsquo;ll now attempt some more advanced recursion techniques in Puppet.&lt;/p&gt;&#xA;&lt;p&gt;In my original &lt;a href=&#34;https://github.com/purpleidea/puppet-pushing/blob/master/standalone/recursion.pp&#34;&gt;recursion example&lt;/a&gt;, the type does recurse, but the &lt;em&gt;callee&lt;/em&gt; cannot return any value to the &lt;em&gt;caller&lt;/em&gt; because it is a type, and not strictly a function. This limitation immediately limits the usefulness of this technique, but I&amp;rsquo;ll try to press on! Let&amp;rsquo;s try to write a &lt;a href=&#34;https://en.wikipedia.org/wiki/Fibonacci_number&#34;&gt;Fibonacci series&lt;/a&gt; function in native Puppet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Documentation for Puppet-Gluster</title>
      <link>https://purpleidea.com/blog/2013/11/20/documentation-for-puppet-gluster/</link>
      <pubDate>Wed, 20 Nov 2013 06:36:19 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/11/20/documentation-for-puppet-gluster/</guid>
      <description>&lt;p&gt;Ironically, one of the reasons that I started writing Puppet code, was so that I could spend more time designing and building, and less time writing documentation. I suppose I&amp;rsquo;m a victim of my success, because &lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;Puppet-Gluster&lt;/a&gt; has grown large enough to warrant its own documentation.&lt;/p&gt;&#xA;&lt;p&gt;So I gave in, and put together some documentation.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/blob/master/DOCUMENTATION.md&#34;&gt;It&amp;rsquo;s available as markdown&lt;/a&gt;, and, &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/raw/master/puppet-gluster-documentation.pdf&#34;&gt;also as a pdf&lt;/a&gt;. As before, there is an &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/tree/master/examples&#34;&gt;examples/ directory&lt;/a&gt; which you might want to use as additional reference.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Iteration in Puppet</title>
      <link>https://purpleidea.com/blog/2013/11/17/iteration-in-puppet/</link>
      <pubDate>Sun, 17 Nov 2013 04:25:01 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/11/17/iteration-in-puppet/</guid>
      <description>&lt;p&gt;People often ask how to do &lt;a href=&#34;https://en.wikipedia.org/wiki/Iteration&#34;&gt;iteration&lt;/a&gt; in &lt;a href=&#34;https://en.wikipedia.org/wiki/Puppet_%28software%29&#34;&gt;Puppet&lt;/a&gt;. Most Puppet users have a background in &lt;a href=&#34;https://en.wikipedia.org/wiki/Imperative_programming&#34;&gt;imperative programming&lt;/a&gt;, and are already very familiar with &lt;a href=&#34;https://en.wikipedia.org/wiki/For_loop&#34;&gt;&lt;em&gt;for&lt;/em&gt;&lt;/a&gt; loops. Puppet is sometimes confusing at first, because it is actually (or technically, contains) a &lt;a href=&#34;https://en.wikipedia.org/wiki/Declarative_programming&#34;&gt;declarative&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Domain-specific_language&#34;&gt;domain-specific language&lt;/a&gt;. In general, DSL&amp;rsquo;s aren&amp;rsquo;t always &lt;a href=&#34;https://en.wikipedia.org/wiki/Turing_completeness&#34;&gt;Turing complete&lt;/a&gt;, nor do they need to support &lt;a href=&#34;https://en.wikipedia.org/wiki/While_loop&#34;&gt;loops&lt;/a&gt;, but this doesn&amp;rsquo;t mean you can&amp;rsquo;t iterate.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://docs.puppetlabs.com/puppet/3/reference/lang_experimental_3_2.html&#34;&gt; Until recently&lt;/a&gt;, Puppet didn&amp;rsquo;t have an explicit looping construct, and it is quite possible to build &lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;complex&lt;/a&gt; &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa&#34;&gt;modules&lt;/a&gt; without using this new construct. There are even some who believe that the language shouldn&amp;rsquo;t even contain this feature. I&amp;rsquo;ll abstain from that debate for now, but instead, I would like to show you some iteration techniques that you can use to get your desired result.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pushing Puppet at Puppet Camp DC, LISA 2013</title>
      <link>https://purpleidea.com/blog/2013/11/05/pushing-puppet-at-puppet-camp-dc-lisa-2013/</link>
      <pubDate>Tue, 05 Nov 2013 15:00:19 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/11/05/pushing-puppet-at-puppet-camp-dc-lisa-2013/</guid>
      <description>&lt;p&gt;Hi there,&lt;/p&gt;&#xA;&lt;p&gt;I hope you enjoyed my &amp;ldquo;&lt;strong&gt;Pushing Puppet&lt;/strong&gt; (to its limit)&amp;rdquo; talk and demos from &lt;a href=&#34;https://puppetcampdc2013.eventbrite.com/&#34;&gt;Puppet Camp D.C., LISA 2013&lt;/a&gt;. As requested, I&amp;rsquo;ve posted the code and slides.&lt;/p&gt;&#xA;&lt;p&gt;Here is the code:&#xA;&lt;a href=&#34;https://github.com/purpleidea/puppet-pushing&#34;&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-pushing&#34;&gt;https://github.com/purpleidea/puppet-pushing&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This module will require three modules as dependencies. The dependencies are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;My Puppet-Common module&lt;/span&gt;&#xA;&lt;a href=&#34;https://github.com/purpleidea/puppet-common&#34;&gt;https://github.com/purpleidea/puppet-common&lt;/a&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;My Puppet-Runonce module&lt;/span&gt;&#xA;&lt;a href=&#34;https://github.com/purpleidea/puppet-runonce&#34;&gt;https://github.com/purpleidea/puppet-runonce&lt;/a&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;My Puppet-FSM module&#xA;&lt;a href=&#34;https://github.com/purpleidea/puppet-fsm&#34;&gt;https://github.com/purpleidea/puppet-fsm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;Each example doesn&#39;t require all the dependencies, so if you&#39;re only interested in the &lt;a href=&#34;https://en.wikipedia.org/wiki/Finite-state_machine&#34;&gt;FSM&lt;/a&gt;, you only need that module.&#xA;&lt;p&gt;Here are the slides:&#xA;&lt;a href=&#34;https://github.com/purpleidea/puppet-pushing/blob/master/talks/pushing-puppet.pdf&#34;&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-pushing/blob/master/talks/pushing-puppet.pdf&#34;&gt;https://github.com/purpleidea/puppet-pushing/blob/master/talks/pushing-puppet.pdf&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gluster Community Day, LISA 2013, Monday</title>
      <link>https://purpleidea.com/blog/2013/11/05/gluster-community-day-lisa-2013-monday/</link>
      <pubDate>Tue, 05 Nov 2013 01:30:05 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/11/05/gluster-community-day-lisa-2013-monday/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m here at LISA 2013 at the &lt;a href=&#34;http://glusterday-lisa.eventbrite.com/&#34;&gt;Gluster Community Day&lt;/a&gt;. I&amp;rsquo;ve been asked by &lt;a href=&#34;https://twitter.com/jzb&#34;&gt;Joe Brockmeier&lt;/a&gt; to give a little recap about what&amp;rsquo;s been going on. So here it is!&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://twitter.com/wphotos&#34;&gt;Wesley Duffee-Braun&lt;/a&gt; started off with a nice overview talk about &lt;a href=&#34;http://www.gluster.org/&#34;&gt;GlusterFS&lt;/a&gt;. The great thing about his talk was that he gave a live demo, running on virtual machines, on his laptop. If you&amp;rsquo;re a new GlusterFS user, this is good exposure to help you get started. He also has the nicest slides I&amp;rsquo;ve ever seen. Someone needs to send me the .&lt;em&gt;odp&lt;/em&gt; template!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Speaking at LISA 2013 about Puppet and GlusterFS</title>
      <link>https://purpleidea.com/blog/2013/11/03/speaking-at-lisa-2013-about-puppet-and-glusterfs/</link>
      <pubDate>Sun, 03 Nov 2013 19:40:08 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/11/03/speaking-at-lisa-2013-about-puppet-and-glusterfs/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m speaking at &lt;a href=&#34;https://www.usenix.org/conference/lisa13&#34;&gt;LISA 2013&lt;/a&gt;, the &amp;ldquo;Large Installation System Administration&amp;rdquo; conference. This conference runs all week in &lt;a href=&#34;https://en.wikipedia.org/wiki/Washington,_DC&#34;&gt;Washington&lt;/a&gt;. I&amp;rsquo;ll be giving two talks during the week, and attending at least one BOF.&lt;/p&gt;&#xA;&lt;p&gt;My first talk is on Monday during the &lt;a href=&#34;https://www.usenix.org/conference/lisa13/gluster-community-day&#34;&gt;Gluster Community Day&lt;/a&gt;. I&amp;rsquo;ll be speaking about &lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;puppet-gluster&lt;/a&gt;, and giving a live demo. I&amp;rsquo;ll be showing some new features too. If you&amp;rsquo;d like to talk more about puppet-gluster, or want to attend the talk, give me a shout, or sign up at the above &lt;em&gt;Gluster Community Day&lt;/em&gt; link.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Easier strace of scripts with pidof -x</title>
      <link>https://purpleidea.com/blog/2013/10/26/easier-strace-of-scripts-with-pidof-x/</link>
      <pubDate>Sat, 26 Oct 2013 16:02:12 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/10/26/easier-strace-of-scripts-with-pidof-x/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a &lt;span style=&#34;text-decoration:underline;&#34;&gt;one minute read&lt;/span&gt;, about a trick which I discovered today:&lt;/p&gt;&#xA;&lt;p&gt;When running an &lt;em&gt;strace&lt;/em&gt;, it&amp;rsquo;s common to do something like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;strace -p&amp;lt;pid&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Smarter hackers know that they can use some bash magic and do:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;strace -p`pidof &amp;lt;process name&amp;gt;`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, if you&amp;rsquo;re tracing a script named &lt;em&gt;foo.py&lt;/em&gt;, this won&amp;rsquo;t work because the real process is the script&amp;rsquo;s interpreter, and &lt;em&gt;pidof python&lt;/em&gt;, might return other unrelated python scripts.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;strace -p`pidof foo.py` # won&amp;#39;t work&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[failure]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[user sifting through ps output for real pid]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[computer explodes]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The trick is to use the &lt;em&gt;-x&lt;/em&gt; flag of &lt;em&gt;pidof&lt;/em&gt;. This will let you pass in your script&amp;rsquo;s name, and &lt;em&gt;pidof&lt;/em&gt; will take care of the rest:&lt;/p&gt;</description>
    </item>
    <item>
      <title>first release of puppet-shorewall</title>
      <link>https://purpleidea.com/blog/2013/10/21/first-release-of-puppet-shorewall/</link>
      <pubDate>Mon, 21 Oct 2013 00:07:06 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/10/21/first-release-of-puppet-shorewall/</guid>
      <description>&lt;p&gt;Oh, hi there.&lt;/p&gt;&#xA;&lt;p&gt;In case you&amp;rsquo;re interested, I&amp;rsquo;ve just made a &lt;a href=&#34;https://github.com/purpleidea/puppet-shorewall&#34;&gt;first release of my puppet-shorewall module&lt;/a&gt;. This isn&amp;rsquo;t meant as an exhaustive shorewall module, but it does provide most of the usual functionality that most users need.&lt;/p&gt;&#xA;&lt;p&gt;In particular, it&amp;rsquo;s the module dependency that I use for many of &lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;my&lt;/a&gt; &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa&#34;&gt;other&lt;/a&gt; &lt;a href=&#34;https://github.com/purpleidea/puppet-nfs&#34;&gt;puppet&lt;/a&gt; &lt;a href=&#34;https://github.com/purpleidea/puppet-cobbler&#34;&gt;modules&lt;/a&gt; that provide firewalling. This is probably where you&amp;rsquo;re most likely to consume it.&lt;/p&gt;&#xA;&lt;p&gt;In general most modules just implement &lt;em&gt;shorewall::rule&lt;/em&gt;, so if you really don&amp;rsquo;t want to use this code, you can implement that signature yourself, or not use automatic firewalling. The &lt;em&gt;shorewall::rule&lt;/em&gt; type has two main signatures, so have a &lt;a href=&#34;https://github.com/purpleidea/puppet-shorewall&#34;&gt;look at the source&lt;/a&gt;, or a &lt;a href=&#34;https://github.com/purpleidea/puppet-shorewall/blob/master/examples/misc-example.pp&#34;&gt;simple example&lt;/a&gt; if you want to get more familiar with the specifics. Using this module is highly recommended, specifically with &lt;a title=&#34;puppet-gluster&#34; href=&#34;https://github.com/purpleidea/puppet-gluster/&#34;&gt;puppet-gluster&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Desktop Notifications for Irssi in Screen through SSH in Gnome Terminal</title>
      <link>https://purpleidea.com/blog/2013/10/18/desktop-notifications-for-irssi-in-screen-through-ssh-in-gnome-terminal/</link>
      <pubDate>Fri, 18 Oct 2013 06:00:49 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/10/18/desktop-notifications-for-irssi-in-screen-through-ssh-in-gnome-terminal/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m usually on &lt;a href=&#34;https://libera.chat/&#34;&gt;IRC&lt;/a&gt;, but I don&amp;rsquo;t often notice incoming pings until after the fact. I had to both write, and modify various scripts to get what I wanted, but now it&amp;rsquo;s all done, and you can benefit from my hacking by following along&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;The Setup&lt;/span&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Laptop -&amp;gt; Gnome-Terminal -&amp;gt; SSH -&amp;gt; Screen -&amp;gt; Irssi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This way, I&amp;rsquo;m connected to IRC, even when my laptop isn&amp;rsquo;t. I run &lt;a href=&#34;http://irssi.org/&#34;&gt;irssi&lt;/a&gt; in a &lt;a href=&#34;https://www.gnu.org/software/screen/&#34;&gt;screen&lt;/a&gt; session on an SSH server that I manage, and I use &lt;a href=&#34;https://en.wikipedia.org/wiki/GNOME_Terminal&#34;&gt;gnome-terminal&lt;/a&gt; on my laptop. If you don&amp;rsquo;t understand this setup, then you&amp;rsquo;ll need to get more comfortable with these tools first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GNOME Montreal Summit</title>
      <link>https://purpleidea.com/blog/2013/10/15/gnome-montreal-summit/</link>
      <pubDate>Tue, 15 Oct 2013 16:52:29 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/10/15/gnome-montreal-summit/</guid>
      <description>&lt;p&gt;This October 12th to 14th Montreal hosted the &lt;a href=&#34;https://www.gnome.org/&#34;&gt;GNOME&lt;/a&gt; &lt;del&gt;boston&lt;/del&gt; summit. Many thanks to &lt;a href=&#34;http://www.canonical.com/&#34;&gt;Canonical&lt;/a&gt; for sponsoring breakfast, &lt;a href=&#34;http://www.savoirfairelinux.com/en/&#34;&gt;Savoir Faire Linux&lt;/a&gt; for hosting a great &lt;em&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cinq_%C3%A0_sept&#34;&gt;6 à 10&lt;/a&gt;&lt;/em&gt; with fancy snacks, and &lt;a href=&#34;http://www.redhat.com/&#34;&gt;RedHat&lt;/a&gt; for sponsoring a &lt;a href=&#34;https://en.wikipedia.org/wiki/Pool_%28cue_sports%29&#34;&gt;pool&lt;/a&gt; night. What follows is some technical commentary about stuff that went on.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;JHBuild&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://wiki.gnome.org/Jhbuild&#34;&gt;JHBuild&lt;/a&gt; is a tool to make it easy to download/clone (from git) and compile all the GNOME modules and applications. It was easy to get going. I (mostly) followed the steps listed on the &lt;a href=&#34;https://wiki.gnome.org/HowDoI/Jhbuild&#34;&gt;JHBuild HowDoI wiki page&lt;/a&gt;. I kept my &lt;em&gt;.jhbuildrc&lt;/em&gt; in my home directory instead of &lt;em&gt;~/.config/&lt;/em&gt;. On my Fedora 19 machine, I found certain unlisted dependencies were missing to build everything. You can figure these out yourself when your builds fail, or just run the following command to install them beforehand:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Show current git branch in PS1 when branch is not master</title>
      <link>https://purpleidea.com/blog/2013/10/10/show-current-git-branch-in-ps1-when-branch-is-not-master/</link>
      <pubDate>Thu, 10 Oct 2013 22:16:28 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/10/10/show-current-git-branch-in-ps1-when-branch-is-not-master/</guid>
      <description>&lt;p&gt;Short post, long command&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve decided to start showing the current &lt;a title=&#34;git&#34; href=&#34;http://github.com/purpleidea/&#34;&gt;git&lt;/a&gt; branch in my &lt;em&gt;PS1&lt;/em&gt;. However, since I don&amp;rsquo;t want to know when I&amp;rsquo;m on &lt;em&gt;master&lt;/em&gt;, I had to write a new PS1 that I haven&amp;rsquo;t yet seen anywhere. Add the following to your &lt;em&gt;.bashrc&lt;/em&gt;:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;PS1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;${debian_chroot:+($debian_chroot)}\u@\h:\w\$ &amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;[&lt;/span&gt; -e /usr/share/git-core/contrib/completion/git-prompt.sh &lt;span style=&#34;color:#666&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    . /usr/share/git-core/contrib/completion/git-prompt.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b8860b&#34;&gt;PS1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;${debian_chroot:+($debian_chroot)}\u@\h:\w$([ &amp;#34;$(__git_ps1 %s)&amp;#34; != &amp;#34;&amp;#34; -a &amp;#34;$(__git_ps1 %s)&amp;#34; != &amp;#34;master&amp;#34; ] &amp;amp;&amp;amp; (echo -e &amp;#34; (\[33[32m\]&amp;#34;$(__git_ps1 &amp;#34;%s&amp;#34;)&amp;#34;\[33[0m\])&amp;#34;) || echo &amp;#34;&amp;#34;)\$ &amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Finite state machines in puppet</title>
      <link>https://purpleidea.com/blog/2013/09/28/finite-state-machines-in-puppet/</link>
      <pubDate>Sat, 28 Sep 2013 06:09:08 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/28/finite-state-machines-in-puppet/</guid>
      <description>&lt;p&gt;In my attempt to &lt;a title=&#34;setting timed events in puppet&#34; href=&#34;https://purpleidea.com/blog/2012/11/14/setting-timed-events-in-puppet/&#34;&gt;push puppet to its limits&lt;/a&gt;, (for &lt;a title=&#34;recursion in puppet (for no particular reason)&#34; href=&#34;https://purpleidea.com/blog/2012/11/20/recursion-in-puppet-for-no-particular-reason/&#34;&gt;no particular reason&lt;/a&gt;), to &lt;a title=&#34;Collecting duplicate resources in puppet&#34; href=&#34;https://purpleidea.com/blog/2013/06/04/collecting-duplicate-resources-in-puppet/&#34;&gt;develop more powerful puppet modules&lt;/a&gt;, to&lt;a title=&#34;How to avoid cluster race conditions or: How to implement a distributed lock manager in puppet&#34; href=&#34;https://purpleidea.com/blog/2012/08/23/how-to-avoid-cluster-race-conditions-or-how-to-implement-a-distributed-lock-manager-in-puppet/&#34;&gt; build in a distributed lock manager&lt;/a&gt;, and to &lt;a title=&#34;Dynamically including classes in puppet&#34; href=&#34;https://purpleidea.com/blog/2013/01/16/dynamically-including-classes-in-puppet/&#34;&gt;be more dynamic&lt;/a&gt;, I&amp;rsquo;m now attempting to build a &lt;a href=&#34;https://en.wikipedia.org/wiki/Finite-state_machine&#34;&gt;Finite State Machine&lt;/a&gt; (FSM) in puppet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>No Ads!</title>
      <link>https://purpleidea.com/blog/2013/09/26/no-ads/</link>
      <pubDate>Thu, 26 Sep 2013 23:18:34 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/26/no-ads/</guid>
      <description>&lt;p&gt;I just shelled out to wordpress.com to buy the No Ads upgrade. I think they&amp;rsquo;re good people. I hope you all appreciate it. Let me know if you do.&lt;/p&gt;&#xA;&lt;p&gt;Happy hacking,&lt;/p&gt;&#xA;&lt;p&gt;James&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing missing GNOME games</title>
      <link>https://purpleidea.com/blog/2013/09/26/installing-missing-gnome-games/</link>
      <pubDate>Thu, 26 Sep 2013 00:43:50 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/26/installing-missing-gnome-games/</guid>
      <description>&lt;p&gt;I just realized that my Fedora 19 installation didn&amp;rsquo;t have any of the GNOME games installed by default any more. I guess there&amp;rsquo;s no love for &lt;a href=&#34;https://en.wikipedia.org/wiki/Nibbles_%28video_game%29&#34;&gt;nibbles&lt;/a&gt;. Here&amp;rsquo;s a quick one-liner to get them all back:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;$&lt;/span&gt; sudo yum search game &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; grep gnome &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; awk &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; xargs sudo yum install &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Loaded plugins: etckeeper, langpacks, refresh&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;packagekit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;nibbles&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 already installed &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;and&lt;/span&gt; latest version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Resolving Dependencies&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;--&amp;gt;&lt;/span&gt; Running transaction check&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;chess&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;--&amp;gt;&lt;/span&gt; Processing Dependency: gnuchess &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;for&lt;/span&gt; package: gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;chess&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;hearts&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;0.3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;12.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;klotski&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mahjongg&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mines&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;robots&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;sudoku&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;noarch &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;tetravex&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;--&amp;gt;&lt;/span&gt; Running transaction check&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;---&amp;gt;&lt;/span&gt; Package gnuchess&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;6.0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1.&lt;/span&gt;fc19 will be installed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;--&amp;gt;&lt;/span&gt; Finished Dependency Resolution&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dependencies Resolved&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;================================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Package               Arch          Version                Repository     Size&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;================================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;chess           x86_64        &lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19           fedora        &lt;span style=&#34;color:#666&#34;&gt;2.6&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;hearts          x86_64        &lt;span style=&#34;color:#666&#34;&gt;0.3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;12.&lt;/span&gt;fc19            fedora        &lt;span style=&#34;color:#666&#34;&gt;365&lt;/span&gt; k&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;klotski         x86_64        &lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19           fedora        &lt;span style=&#34;color:#666&#34;&gt;1.2&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mahjongg        x86_64        &lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19           fedora        &lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mines           x86_64        &lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19           fedora        &lt;span style=&#34;color:#666&#34;&gt;2.7&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;robots          x86_64        &lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19           fedora        &lt;span style=&#34;color:#666&#34;&gt;1.4&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;sudoku          noarch        &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19         fedora        &lt;span style=&#34;color:#666&#34;&gt;2.5&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;tetravex        x86_64        &lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19           fedora        &lt;span style=&#34;color:#666&#34;&gt;1.7&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;for&lt;/span&gt; dependencies:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; gnuchess              x86_64        &lt;span style=&#34;color:#666&#34;&gt;6.0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1.&lt;/span&gt;fc19           fedora        &lt;span style=&#34;color:#666&#34;&gt;2.6&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Transaction Summary&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;================================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Install  &lt;span style=&#34;color:#666&#34;&gt;8&lt;/span&gt; Packages (&lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt; Dependent package)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Total download size: &lt;span style=&#34;color:#666&#34;&gt;19&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installed size: &lt;span style=&#34;color:#666&#34;&gt;54&lt;/span&gt; M&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downloading packages:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;chess&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm                 &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2.6&lt;/span&gt; MB   &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;04&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mines&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm                 &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2.7&lt;/span&gt; MB   &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;05&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;klotski&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm               &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1.2&lt;/span&gt; MB   &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;05&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;robots&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm                &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1.4&lt;/span&gt; MB   &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;01&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;tetravex&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm                                                                                          &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1.7&lt;/span&gt; MB  &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;03&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;hearts&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0.3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;12.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm                                                                                             &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;365&lt;/span&gt; kB  &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;10&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnuchess&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;6.0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm                                                                                                &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2.6&lt;/span&gt; MB  &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;04&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mahjongg&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm                                                                                          &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt; MB  &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;11&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;): gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;sudoku&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;noarch&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rpm                                                                                            &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2.5&lt;/span&gt; MB  &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;06&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;--------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Total                                                                                                                         &lt;span style=&#34;color:#666&#34;&gt;1.5&lt;/span&gt; MB&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;s &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt;  &lt;span style=&#34;color:#666&#34;&gt;19&lt;/span&gt; MB     &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;12&lt;/span&gt;     &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Running transaction check&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Running transaction test&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Transaction test succeeded&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Running transaction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etckeeper: pre transaction commit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : gnuchess&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;6.0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                               &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;chess&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                            &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;klotski&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                          &lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;tetravex&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                         &lt;span style=&#34;color:#666&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mines&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                            &lt;span style=&#34;color:#666&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;:gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;sudoku&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;noarch                                                                                                         &lt;span style=&#34;color:#666&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;hearts&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0.3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;12.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                            &lt;span style=&#34;color:#666&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mahjongg&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                         &lt;span style=&#34;color:#666&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Installing : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;robots&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                           &lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etckeeper: post transaction commit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;chess&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                            &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : gnuchess&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;6.0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                               &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;robots&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                           &lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mahjongg&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                         &lt;span style=&#34;color:#666&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;hearts&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0.3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;12.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                            &lt;span style=&#34;color:#666&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;:gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;sudoku&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;noarch                                                                                                         &lt;span style=&#34;color:#666&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mines&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                            &lt;span style=&#34;color:#666&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;tetravex&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                         &lt;span style=&#34;color:#666&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Verifying  : gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;klotski&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64                                                                                                          &lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;9&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installed:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;chess&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19    gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;hearts&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;0.3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;12.&lt;/span&gt;fc19     gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;klotski&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19    gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mahjongg&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19   &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;mines&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19    gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;robots&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19    gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;sudoku&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;noarch &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3.&lt;/span&gt;fc19     gnome&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;tetravex&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;3.8&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2.&lt;/span&gt;fc19   &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dependency Installed:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  gnuchess&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;x86_64 &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;6.0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1.&lt;/span&gt;fc19                                                                                                                              &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Complete&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;$&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This isn&amp;rsquo;t a master hack, but it&amp;rsquo;s good to think about using command line magic to do your day-to-day tasks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bittorent sync for repository mirroring</title>
      <link>https://purpleidea.com/blog/2013/09/23/bittorent-sync-for-repository-mirroring/</link>
      <pubDate>Mon, 23 Sep 2013 02:06:28 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/23/bittorent-sync-for-repository-mirroring/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://twitter.com/theronconrey&#34;&gt;Theron Conrey&lt;/a&gt; writes about using:&lt;/p&gt;&#xA;&lt;blockquote&gt;&lt;a href=&#34;http://conrey.org/2013/05/21/bittorrent-sync-as-geo-replication-for-storage/&#34;&gt;BitTorrent Sync as Geo-Replication for Storage&lt;/a&gt;&lt;/blockquote&gt;&#xA;We got a chance to talk about this idea at Linuxcon. I&#39;m not entirely convinced there aren&#39;t some problem edge cases with this solution, but I think it will be hard to tell as long as the BitTorrent sync library is proprietary. I did come up with a special case of Theron&#39;s idea that I believe could work well.&#xA;&lt;p&gt;The special case uses the optimization that the synchronization (or file transferring) is unidirectional. This avoids any coherency complications involved if both sides were to write to the same file. Combined with the BitTorrent protocol, this does what normal torrent usage does, except with BitTorrent sync, we&amp;rsquo;re looking at a folder full of files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gluster Community Day, Thursday</title>
      <link>https://purpleidea.com/blog/2013/09/20/gluster-community-day-thursday-2/</link>
      <pubDate>Fri, 20 Sep 2013 16:23:12 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/20/gluster-community-day-thursday-2/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m here in New Orleans &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;hacking up a storm&lt;/a&gt; and getting to meet fellow &lt;a href=&#34;http://blog.gluster.org/blog/&#34;&gt;gluster&lt;/a&gt; users IRL. John Mark Walker started off with a great &amp;ldquo;State of the GlusterFS union&amp;rdquo; style talk.&lt;/p&gt;&#xA;&lt;p&gt;Today Louis (semiosis) gave a great talk about running glusterfs on amazon. It was highly pragmatic and he explained how he chose the number of bricks per host. The talk will be posted online shortly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://twitter.com/marcoceppi&#34;&gt;Marco Ceppi&lt;/a&gt; from Canonical gave a talk about juju and gluster. I haven&amp;rsquo;t had much time to look at juju, so it was good exposure. Marco&amp;rsquo;s gluster charm suffers from a lack of high availability peering, but I&amp;rsquo;m sure that is easily solved, and it isn&amp;rsquo;t a big issue. I had the same issue when working on puppet-gluster. &lt;a title=&#34;How to avoid cluster race conditions or: How to implement a distributed lock manager in puppet&#34; href=&#34;https://purpleidea.com/blog/2012/08/23/how-to-avoid-cluster-race-conditions-or-how-to-implement-a-distributed-lock-manager-in-puppet/&#34;&gt;I&amp;rsquo;ve written an article about how I solved this problem.&lt;/a&gt; I think it&amp;rsquo;s the most elegant solution, but if anyone has a better idea, please let me know. The solutions I used for puppet, can be applied to juju too. Marco and I talked about porting puppet-gluster to ubuntu. We also talked about using puppet inside of juju, &lt;em&gt;with&lt;/em&gt; a puppetmaster, but we&amp;rsquo;re not sure how useful that would be beyond pure hack value.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linuxcon day three, Wednesday</title>
      <link>https://purpleidea.com/blog/2013/09/18/linuxcon-day-three-wednesday/</link>
      <pubDate>Wed, 18 Sep 2013 23:59:28 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/18/linuxcon-day-three-wednesday/</guid>
      <description>&lt;p&gt;After hacking away on &lt;a title=&#34;Linuxcon day one, Monday&#34; href=&#34;https://purpleidea.com/blog/2013/09/18/linuxcon-day-one-monday/&#34;&gt;Monday&lt;/a&gt; and &lt;a title=&#34;Linuxcon day two, Tuesday&#34; href=&#34;https://purpleidea.com/blog/2013/09/18/linuxcon-day-two-tuesday/&#34;&gt;Tuesday&lt;/a&gt; and meeting fellow nerds IRL, I&amp;rsquo;ve landed even more changes to &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;puppet-gluster&lt;/a&gt;. &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commits/master&#34;&gt;My git master branch now sits at 47 commits.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git clone https://github.com/purpleidea/puppet-gluster.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Cloning into &amp;#39;puppet-gluster&amp;#39;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote: Counting objects: 317, done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote: Compressing objects: 100% (144/144), done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote: Total 317 (delta 187), reused 275 (delta 148)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Receiving objects: 100% (317/317), 82.17 KiB | 12.00 KiB/s, done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Resolving deltas: 100% (187/187), done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd puppet-gluster/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git log | grep &amp;#39;^commit&amp;#39; | wc -l&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;47&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git log | head&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;commit &amp;lt;a href=&amp;#34;https://github.com/purpleidea/puppet-gluster/commit/fa3fd2eb4bab499031274e0918a40e7a99fe0086&amp;#34;&amp;gt;fa3fd2eb4bab499031274e0918a40e7a99fe0086&amp;lt;/a&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Author: James Shubin &amp;lt;&amp;lt;em&amp;gt;hidden&amp;lt;/em&amp;gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date:   Wed Sep 18 17:53:13 2013 -0400&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Added fancy volume creation.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    This moves the command into a separate file. This also adds temporary&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    saving of stdout and stderr to /tmp for easy debugging of command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    output.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you can see above, volume creation is now &amp;ldquo;&lt;em&gt;fancier&lt;/em&gt;&amp;rdquo; and more robust. In case things go wrong, it&amp;rsquo;s easy to get fast access to gluster command line output (saved in &lt;em&gt;/tmp/&lt;/em&gt;), and the volume creation commands are individually stored in your puppet-gluster working directory. Usually this is &lt;em&gt;/var/lib/puppet/tmp/gluster/&lt;/em&gt;, and each volume creation command is in the &lt;em&gt;volume&lt;/em&gt; subdirectory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linuxcon day two, Tuesday</title>
      <link>https://purpleidea.com/blog/2013/09/18/linuxcon-day-two-tuesday/</link>
      <pubDate>Wed, 18 Sep 2013 23:05:05 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/18/linuxcon-day-two-tuesday/</guid>
      <description>&lt;p&gt;&lt;a title=&#34;Linuxcon day one, Monday&#34; href=&#34;https://purpleidea.com/blog/2013/09/18/linuxcon-day-one-monday/&#34;&gt;Continuing on from yesterday&lt;/a&gt;, I&amp;rsquo;ve met even more interesting people. I chatted with &lt;a href=&#34;https://twitter.com/pythondj&#34;&gt;Dianne Mueller&lt;/a&gt; about some interesting ideas for gluster+&lt;a href=&#34;https://www.openshift.com/&#34;&gt;openshift&lt;/a&gt;. More to come on that front soon. Hung out with &lt;a href=&#34;https://twitter.com/jonobacon&#34;&gt;Jono Bacon&lt;/a&gt; and talked a bit about &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;puppet-gluster&lt;/a&gt; on &lt;a href=&#34;http://www.ubuntu.com/&#34;&gt;Ubuntu&lt;/a&gt;. If there is interest in the community for this, please let me know. Thanks to John Mark Walker and RedHat for sponsoring me and introducing me to many of these folks. Hello to all the others that I didn&amp;rsquo;t mention.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linuxcon day one, Monday</title>
      <link>https://purpleidea.com/blog/2013/09/18/linuxcon-day-one-monday/</link>
      <pubDate>Wed, 18 Sep 2013 22:32:16 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/18/linuxcon-day-one-monday/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m here in New Orleans at Linux Con, hacking on &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;puppet-gluster&lt;/a&gt; and talking to lots of interesting folks. I&amp;rsquo;ve met gluster hacker &lt;a href=&#34;https://twitter.com/theronconrey&#34;&gt;Theron Conrey&lt;/a&gt;, and my host &lt;a href=&#34;https://twitter.com/johnmark&#34;&gt;John Mark Walker&lt;/a&gt;, Fedora and Raspberry Pi experts &lt;a href=&#34;https://twitter.com/spotrh&#34;&gt;Spot&lt;/a&gt; and &lt;a href=&#34;https://twitter.com/suehle&#34;&gt;Ruth Suehle&lt;/a&gt;, and many others too.&lt;/p&gt;&#xA;&lt;p&gt;The hotel is very nice. The bathroom sink has two taps of course, but both of them are hot. The New Orleans heat is probably the cause of this.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m hacking at full speed to get some new features and testing in before my talk on Thursday. I&amp;rsquo;ve been &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/1d423ade0362a01acf2cbc35399808b4befe0864&#34;&gt;reworking the simple firewall support&lt;/a&gt; in my puppet module. For those that want automated and correct firewall configuration, expect some improvements soon.&lt;/p&gt;</description>
    </item>
    <item>
      <title>New puppet-gluster features before Linuxcon</title>
      <link>https://purpleidea.com/blog/2013/09/08/new-puppet-gluster-features-before-linuxcon/</link>
      <pubDate>Sun, 08 Sep 2013 04:51:14 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/08/new-puppet-gluster-features-before-linuxcon/</guid>
      <description>&lt;p&gt;Hey there,&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve done a bit of &lt;a title=&#34;puppet-gluster&#34; href=&#34;http://github.com/purpleidea/puppet-gluster/&#34;&gt;puppet-gluster&lt;/a&gt; hacking lately to try to squeeze some extra features and testing in before &lt;a title=&#34;Puppet-Gluster and me at Linuxcon&#34; href=&#34;https://purpleidea.com/blog/2013/09/02/puppet-gluster-and-me-at-linuxcon/&#34;&gt;Linuxcon&lt;/a&gt;. Here&amp;rsquo;s a short list:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/7c2dc0cadc03bc5dd2da3155e5773ad4471563df&#34;&gt;SELinux fixes&lt;/a&gt; to keep &lt;a href=&#34;http://danwalsh.livejournal.com/&#34;&gt;Dan Walsh&lt;/a&gt; happy :)&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/4345cf9e625259585f7f8541e08c0e79a914e78c&#34;&gt;Ping and status checks before volume creation.&lt;/a&gt; Now puppet-gluster will be less noisy about failures or missing executions that are due to the necessary incremental nature of puppet-gluster runs. You&#39;ll need multiple puppet runs to get a complete setup, so don&#39;t let puppet complain part way through. This is due to the design of puppet.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/231e4b9ff771d33514d78518e14fe13148e7b431&#34;&gt;Simple filesystem paths for bricks.&lt;/a&gt; This is very useful for prototyping with virtual machines.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/commit/24844a892c07001bb50eeb443005d3c2fe5d4025&#34;&gt;Automatic UUID assignment for hosts.&lt;/a&gt; This requires &lt;a href=&#34;http://docs.puppetlabs.com/puppet/2.7/reference/lang_exported.html&#34;&gt;exported resources&lt;/a&gt;.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster/tree/master/examples&#34;&gt;Updated examples&lt;/a&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;And more...&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;If there are features or bugs that you&#39;d like to see added or removed (respectively) please let me know &lt;em&gt;ASAP&lt;/em&gt; so that I can try to get something ready for you before my &lt;a href=&#34;https://events.linuxfoundation.org/events/linuxcon-north-america/program/co-located-events&#34;&gt;Linuxcon talk&lt;/a&gt;. I also don&#39;t have any hardware RAID or physical hardware to test external storage partitions (bricks) on. If you have any that you can donate or let me hack on for a while, there are some features I&#39;d like to test. &lt;a title=&#34;contact&#34; href=&#34;https://purpleidea.com/contact/&#34;&gt;Contact me&lt;/a&gt;!&#xA;&lt;p&gt;I&amp;rsquo;ve got a few more things queued up too, but you&amp;rsquo;ll have to wait and see. Until then,&lt;/p&gt;</description>
    </item>
    <item>
      <title>Puppet-Gluster and me at Linuxcon</title>
      <link>https://purpleidea.com/blog/2013/09/02/puppet-gluster-and-me-at-linuxcon/</link>
      <pubDate>Mon, 02 Sep 2013 05:50:23 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/09/02/puppet-gluster-and-me-at-linuxcon/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.johnmark.org/blog/&#34;&gt;John Mark Walker&lt;/a&gt;, (from &lt;a href=&#34;http://www.redhat.com/&#34;&gt;Redhat&lt;/a&gt;) has been kind enough to invite me to speak at the &lt;a href=&#34;https://events.linuxfoundation.org/events/linuxcon-north-america/program/co-located-events&#34;&gt;Linuxcon Gluster Workshop&lt;/a&gt; in &lt;a href=&#34;https://events.linuxfoundation.org/events/linuxcon-north-america/extend-the-experience/about-new-orleans&#34;&gt;New Orleans&lt;/a&gt;. I&amp;rsquo;ll be speaking about &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;puppet-gluster&lt;/a&gt;, giving demos, and hopefully showing off some new features. I&amp;rsquo;m also looking forward to meeting up with &lt;a href=&#34;http://www.gluster.org/&#34;&gt;gluster&lt;/a&gt; expert &lt;a href=&#34;http://joejulian.name/&#34;&gt;Joe Julian&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If there are features that puppet-gluster is missing, or you have a use case that I haven&amp;rsquo;t covered, please let me know, and I&amp;rsquo;ll try to work on it for you ahead of the conference. If you want to meet up for some puppet-gluster help, or to hack on code, I&amp;rsquo;ll be around from the 16th to the 20th of September. My talk is on the 19th.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Finding YAML errors in puppet</title>
      <link>https://purpleidea.com/blog/2013/08/25/finding-yaml-errors-in-puppet/</link>
      <pubDate>Sun, 25 Aug 2013 04:31:49 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/08/25/finding-yaml-errors-in-puppet/</guid>
      <description>&lt;p&gt;I love tabs, they&amp;rsquo;re so much easier to work with, but YAML doesn&amp;rsquo;t like them. I&amp;rsquo;m constantly adding them in accidentally, and puppet&amp;rsquo;s error message is a bit cryptic:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error: Could not retrieve catalog from remote server: Error 400 on SERVER: malformed format string - %S at /etc/puppet/manifests/foo.pp:18 on node bar.example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This happens during a puppet run, which in my case loads up YAML files. The tricky part was that the error wasn&amp;rsquo;t at all related to the &lt;em&gt;foo.pp&lt;/em&gt; file, it just happened to be the first time hiera was run. So where&amp;rsquo;s the real error?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upgrading from Fedora 18 to Fedora 19</title>
      <link>https://purpleidea.com/blog/2013/08/04/upgrading-from-fedora-18-to-fedora-19/</link>
      <pubDate>Sun, 04 Aug 2013 05:02:18 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/08/04/upgrading-from-fedora-18-to-fedora-19/</guid>
      <description>&lt;p&gt;It was time to take the plunge and upgrade from Fedora 18 to Fedora 19. &lt;a title=&#34;Picking up the pieces after a Fedora 18 install&#34; href=&#34;https://purpleidea.com/blog/2013/02/12/picking-up-the-pieces-after-a-fedora-18-install/&#34;&gt;Fedora 18 was one of the worst releases ever&lt;/a&gt;, so I figured it could only get better. I ran my backups as usual, however this time I didn&amp;rsquo;t seem to need them, the upgrade process went off without a hitch! &lt;a href=&#34;https://fedoraproject.org/wiki/FedUp&#34;&gt;I used the fedup-cli process over the network.&lt;/a&gt; I always run these things inside of screen.&lt;/p&gt;</description>
    </item>
    <item>
      <title>a puppet-ipa user type and a new difference engine</title>
      <link>https://purpleidea.com/blog/2013/07/09/a-puppet-ipa-user-type-and-a-new-difference-engine/</link>
      <pubDate>Tue, 09 Jul 2013 06:41:54 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/07/09/a-puppet-ipa-user-type-and-a-new-difference-engine/</guid>
      <description>&lt;p&gt;A simple hack to add a &lt;em&gt;user&lt;/em&gt; type to my &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa&#34;&gt;puppet-ipa&lt;/a&gt; module turned out to cause quite a stir. I&amp;rsquo;ve just pushed these changes out for your testing:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3 files changed, 1401 insertions(+), 215 deletions(-)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should now have a highly capable user type, along with &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa/blob/master/examples/simple-usage3.pp#L13&#34;&gt;some quick examples&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve also done a rewrite of the &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa/blob/master/files/diff.py&#34;&gt;difference engine&lt;/a&gt;, so that it is cleaner and more robust. It now uses function decorators and individual function comparators to help wrangle the data into easily comparable forms. This should make adding future types easier, and less error prone. If you&amp;rsquo;re not comfortable with ruby, that&amp;rsquo;s okay, because it&amp;rsquo;s written in python!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fresh releases! puppet-ipa, puppet-nfs, puppet-gluster</title>
      <link>https://purpleidea.com/blog/2013/06/23/fresh-releases-puppet-ipa-puppet-nfs-puppet-gluster/</link>
      <pubDate>Sun, 23 Jun 2013 09:22:32 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/06/23/fresh-releases-puppet-ipa-puppet-nfs-puppet-gluster/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been a little slow in making release announcements, so here&amp;rsquo;s some news:&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve just released the third stage of my &lt;a href=&#34;https://github.com/purpleidea/puppet-ipa&#34;&gt;puppet-ipa&lt;/a&gt; module. At the moment it now supports installation, managing of hosts, and managing of services. It integrates with my &lt;a href=&#34;https://github.com/purpleidea/puppet-nfs&#34;&gt;puppet-nfs&lt;/a&gt; module to allow you to easily setup and run an NFSv4 kerberized server and client.&lt;/p&gt;&#xA;&lt;p&gt;While we&amp;rsquo;re at it, that&amp;rsquo;s some more news: I&amp;rsquo;ve just released a &lt;a href=&#34;https://github.com/purpleidea/puppet-nfs&#34;&gt;puppet-nfs&lt;/a&gt; module to make your &lt;em&gt;/etc/exports&lt;/em&gt; management easier. It&amp;rsquo;s designed to manage other security types, or even to work without kerberos or any authentication at all, but I haven&amp;rsquo;t tested those.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Playing with FreeIPA and puppet</title>
      <link>https://purpleidea.com/blog/2013/06/18/playing-with-freeipa/</link>
      <pubDate>Tue, 18 Jun 2013 12:36:54 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/06/18/playing-with-freeipa/</guid>
      <description>&lt;p&gt;So I just rolled a new vm to hack around with &lt;a href=&#34;http://www.freeipa.org/&#34;&gt;FreeIPA&lt;/a&gt;. Here are some things that I&amp;rsquo;ve come across so far. I was planning on configuring LDAP, and Kerberos manually, but the included webui looks like a lovely tool to have for the data entry, user administrator type who likes to click on things. Let&amp;rsquo;s explore&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;&lt;strong&gt;/etc/hosts&lt;/strong&gt;&lt;/span&gt;:&lt;/p&gt;&#xA;&lt;p&gt;FreeIPA is choosy about how your &lt;em&gt;/etc/hosts&lt;/em&gt; is formatted. It requires an entry that has a particular order, that is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>puppet lsi hardware raid module</title>
      <link>https://purpleidea.com/blog/2013/06/17/puppet-lsi-hardware-raid-module/</link>
      <pubDate>Mon, 17 Jun 2013 18:11:02 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/06/17/puppet-lsi-hardware-raid-module/</guid>
      <description>&lt;p&gt;In response to some discussion in the gluster community, I am releasing my &lt;a href=&#34;https://github.com/purpleidea/puppet-lsi/&#34;&gt;puppet-lsi&lt;/a&gt; module. It&amp;rsquo;s quite simple, but it is very useful for rebuilding machines. It could do a lot more, but I wanted to depend on the proprietary LSI tools as little as possible. Running &lt;em&gt;megacli&lt;/em&gt; with puppet would be a very doable hack, but I&amp;rsquo;m not sure enough devops out there who would use that feature.&lt;/p&gt;&#xA;&lt;p&gt;Usage is straightforward if you like the sensible defaults:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Collecting duplicate resources in puppet</title>
      <link>https://purpleidea.com/blog/2013/06/04/collecting-duplicate-resources-in-puppet/</link>
      <pubDate>Tue, 04 Jun 2013 23:39:08 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/06/04/collecting-duplicate-resources-in-puppet/</guid>
      <description>&lt;p&gt;I could probably write a long design article explaining why &lt;em&gt;identical&lt;/em&gt; duplicate resources should be allowed [1] in puppet. If puppet is going to survive in the long-term, they will have to build in this feature. In the short-term, I will have to hack around deficiency. As luck would have it, &lt;a href=&#34;https://twitter.com/bodepd&#34;&gt;Mr. Bode&lt;/a&gt; has already written part one of the hack: &lt;a href=&#34;https://github.com/puppetlabs/puppetlabs-stdlib#ensure_resource&#34;&gt;ensure_resource&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Suppose you have a given infrastructure with &lt;em&gt;N&lt;/em&gt; vaguely identical nodes. &lt;em&gt;N&lt;/em&gt; could equal &lt;strong&gt;2&lt;/strong&gt; for a &lt;em&gt;dual primary&lt;/em&gt; or &lt;em&gt;active-passive&lt;/em&gt; cluster, or &lt;em&gt;N&lt;/em&gt; could be greater than &lt;strong&gt;2&lt;/strong&gt; for a more elaborate N-ary cluster. It is sufficient to say, that each of those &lt;em&gt;N&lt;/em&gt; nodes might export an identical puppet resource which one (or many) clients might need to collect, to operate correctly. It&amp;rsquo;s important that each node export this, so that there is no single point of failure if one or more of the cluster nodes goes missing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>puppet matlab module</title>
      <link>https://purpleidea.com/blog/2013/06/04/puppet-matlab-module/</link>
      <pubDate>Tue, 04 Jun 2013 02:46:27 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/06/04/puppet-matlab-module/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t like repetitive work, and installing matlab counts doubly as so. Once I figured out the correct steps, I automated it with a puppet module. The downside is that the install takes a while because puppet needs to copy the &lt;em&gt;iso&lt;/em&gt; locally. This is okay because I can be busy doing something else while this is happening.&lt;/p&gt;&#xA;&lt;p&gt;Using the module is quite easy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;matlab::install { &amp;#39;R2011a&amp;#39;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    iso =&amp;gt; &amp;#39;puppet://files/matlab/MATHWORKS_R2011A.iso&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    licensekey =&amp;gt; &amp;#39;#####-#####-#####-#####&amp;#39;,    # provide your own here&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    licensefile =&amp;gt; &amp;#39;puppet:///files/matlab/license.lic&amp;#39;,    # get your own!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    licenseagree =&amp;gt; true,    # setting this to true &amp;#39;acknowledges&amp;#39; their (C)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prefix =&amp;gt; &amp;#39;/usr/local&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You might notice that this supports installing multiple releases on the same machine. You will have to provide your own license key and license file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>puppet rsnapshot module</title>
      <link>https://purpleidea.com/blog/2013/06/04/puppet-rsnapshot-module/</link>
      <pubDate>Tue, 04 Jun 2013 02:29:35 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/06/04/puppet-rsnapshot-module/</guid>
      <description>&lt;p&gt;Today I am releasing a puppet module for &lt;a href=&#34;http://www.rsnapshot.org/&#34;&gt;rsnapshot&lt;/a&gt;. The nice feature of this module, is that it lets you configure multiple different instances of rsnapshot, so that they could all run in parallel. Rsnapshot doesn&amp;rsquo;t support this directly, so this puppet module does the heavy lifting of separating out and managing each instance.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-rsnapshot&#34;&gt;&lt;a href=&#34;https://github.com/purpleidea/puppet-rsnapshot&#34;&gt;https://github.com/purpleidea/puppet-rsnapshot&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The &lt;em&gt;examples/&lt;/em&gt; directory should give you a hint on how to use it. For everything else, have a look at the code, or feel free to leave me a comment. I hope you find it useful!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Forcing firefox to remember passwords</title>
      <link>https://purpleidea.com/blog/2013/05/17/forcing-firefox-to-remember-passwords/</link>
      <pubDate>Fri, 17 May 2013 07:39:06 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/05/17/forcing-firefox-to-remember-passwords/</guid>
      <description>&lt;p&gt;There are a handful of websites out there that decide that they know better than your browser and tell it to not offer to save passwords. They do this by setting a form autocomplete attribute to &lt;em&gt;off&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Since we already agree that &lt;a href=&#34;https://github.com/tomerfiliba/rpyc/tree/master/demos/web8&#34;&gt;HTML and the web are a terrible idea&lt;/a&gt;, hopefully we can find a way to hack around this. It turns out that I didn&amp;rsquo;t have to, because many others have solved this hack before me. The cleanest version I found is here: &lt;a href=&#34;http://www.howtogeek.com/62980/how-to-force-your-browser-to-remember-passwords/&#34;&gt;&lt;a href=&#34;http://www.howtogeek.com/62980/how-to-force-your-browser-to-remember-passwords/&#34;&gt;http://www.howtogeek.com/62980/how-to-force-your-browser-to-remember-passwords/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Overriding attributes of collected exported resources</title>
      <link>https://purpleidea.com/blog/2013/05/14/overriding-attributes-of-collected-exported-resources/</link>
      <pubDate>Tue, 14 May 2013 01:41:23 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/05/14/overriding-attributes-of-collected-exported-resources/</guid>
      <description>&lt;p&gt;This post is about a particularly elegant (and crucial) feature in &lt;a href=&#34;https://en.wikipedia.org/wiki/Puppet_%28software%29&#34;&gt;puppet&lt;/a&gt; &lt;a href=&#34;http://docs.puppetlabs.com/guides/exported_resources.html&#34;&gt;exported resources&lt;/a&gt;: &lt;span style=&#34;text-decoration:underline;&#34;&gt;attribute overriding&lt;/span&gt;. If you&amp;rsquo;re not already familiar with exported resources, you should start there, as they are &lt;em&gt;the&lt;/em&gt; killer feature that makes configuration management with puppet awesome. (I haven&amp;rsquo;t found any explicit docs about this feature either, so feel free to comment if you know where they&amp;rsquo;re hidden.)&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Setup&lt;/span&gt;:&lt;/strong&gt; I&amp;rsquo;ve got a virtual machine which exports a resource to &lt;em&gt;N&lt;/em&gt; different nodes. I&amp;rsquo;d like to define the resource with just one exported (&lt;em&gt;@@&lt;/em&gt;) definition on my virtual machine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mothers day hacks</title>
      <link>https://purpleidea.com/blog/2013/05/12/mothers-day-hacks/</link>
      <pubDate>Sun, 12 May 2013 07:32:45 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/05/12/mothers-day-hacks/</guid>
      <description>&lt;p&gt;Firstly Happy Mother&amp;rsquo;s day to my mother.&lt;/p&gt;&#xA;&lt;p&gt;Google is, as usual, busily releasing &lt;a href=&#34;http://www.google.com/doodles/&#34;&gt;doodles&lt;/a&gt;. Today, the doodle takes you through a &lt;a href=&#34;https://en.wikipedia.org/wiki/Rube_Goldberg&#34;&gt;Rube Goldberg&lt;/a&gt; -esque sequence, giving you four decisions to make along the way. Each decision gives you one of three different choices, and at the end, a unique drawing is displayed. I expect:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3 * 3 * 3 * 3 = 81&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;different permutations. At the end of the process, you can print your image. I got directed to:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upgrading to centos 6.4 with shorewall onboard</title>
      <link>https://purpleidea.com/blog/2013/04/25/upgrading-to-centos-6-4-with-shorewall-onboard/</link>
      <pubDate>Thu, 25 Apr 2013 04:10:10 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/04/25/upgrading-to-centos-6-4-with-shorewall-onboard/</guid>
      <description>&lt;p&gt;In case you upgrade your CentOS 6.x box to version 6.4, the shorewall service might complain. With a scary message:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ERROR: Your kernel/iptables do not include state match support.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;No version of Shorewall will run on this system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is selinux at work, and the problem can easily be solved by running:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# restorecon -Rv /sbin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thanks shorewall-users and&lt;/p&gt;&#xA;&lt;p&gt;Happy hacking,&lt;/p&gt;&#xA;&lt;p&gt;James&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing jerky scrolling in Firefox</title>
      <link>https://purpleidea.com/blog/2013/04/11/fixing-jerky-scrolling-in-firefox/</link>
      <pubDate>Thu, 11 Apr 2013 05:53:28 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/04/11/fixing-jerky-scrolling-in-firefox/</guid>
      <description>&lt;p&gt;Fedora did a lovely job of updating me to the latest version (v. 20) of &lt;a href=&#34;http://getfirefox.com&#34;&gt;Firefox&lt;/a&gt;. One problem I found, was that scrolling on certain pages was quite jerky. Performance was worse (or more likely) on pages with a frameset, and pages which were long. Pages with many images made this problem worse.&lt;/p&gt;&#xA;&lt;p&gt;It turns out that the workaround is to disable hardware acceleration:&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;firefox-disable-hardware-scrolling.png&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-394&#34; alt=&#34;firefox-disable-hardware-scrolling&#34; src=&#34;firefox-disable-hardware-scrolling.png&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;After you&amp;rsquo;ve unchecked this box, restart Firefox, and scrolling is now considerably smoother.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Knowing when to release and deploy your code (...and a mini script)</title>
      <link>https://purpleidea.com/blog/2013/04/08/knowing-when-to-release-and-deploy-your-code-and-a-mini-script/</link>
      <pubDate>Mon, 08 Apr 2013 21:27:29 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/04/08/knowing-when-to-release-and-deploy-your-code-and-a-mini-script/</guid>
      <description>&lt;p&gt;Knowing when to release and deploy your code can turn into a complicated discussion. In general, In general, I tend to support &lt;a href=&#34;https://en.wikipedia.org/wiki/Release_early,_release_often&#34;&gt;releasing early and often&lt;/a&gt;, for some value of &lt;em&gt;$early&lt;/em&gt; and &lt;em&gt;$often&lt;/em&gt;. I&amp;rsquo;ve decided to keep this simple and introduce you to one metric that I use&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;I think that I am fairly diligent in adding plenty of comments to my source code. I might even sometimes add too many. I create plenty of XXX, FIXME, or TODO tagged comments as reminders of things to work on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>running your file manager from a terminal</title>
      <link>https://purpleidea.com/blog/2013/03/22/running-your-file-manager-from-a-terminal/</link>
      <pubDate>Fri, 22 Mar 2013 23:34:59 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/03/22/running-your-file-manager-from-a-terminal/</guid>
      <description>&lt;p&gt;I do a lot of my work in a terminal. For the unfamiliar, this might seem strange, however once you&amp;rsquo;re comfortable with your shell, this is the best place to be. I don&amp;rsquo;t restrict myself to it though. I often want to spawn a file manager, or a graphical text editor. When I run nautilus, I usually see something like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:~/some/awesome/directory$ nautilus .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Initializing nautilus-open-terminal extension&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Shutting down nautilus-open-terminal extension&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@computer:~/some/awesome/directory$&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is useful, because I can open a file browser right where I want it, it&amp;rsquo;s annoying, because nautilus runs in that terminal until I close it. (This doesn&amp;rsquo;t happen if the nautilus process is always running, but since GNOME 3, it isn&amp;rsquo;t.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>adding range support to python&#39;s http server to kickstart with anaconda</title>
      <link>https://purpleidea.com/blog/2013/03/14/adding-range-support-to-pythons-http-server-to-kickstart-with-anaconda/</link>
      <pubDate>Thu, 14 Mar 2013 00:34:19 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/03/14/adding-range-support-to-pythons-http-server-to-kickstart-with-anaconda/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on automatic installs using &lt;a href=&#34;https://fedoraproject.org/wiki/Anaconda/Kickstart&#34;&gt;kickstart&lt;/a&gt; and puppet. I&amp;rsquo;m using a modified &lt;em&gt;python httpserver&lt;/em&gt; because it&amp;rsquo;s lightweight, and easy to integrate into my existing python code base. The server was churning away perfectly until anaconda started downloading the full rpm&amp;rsquo;s for installation. What was going wrong?&lt;/p&gt;&#xA;&lt;pre&gt;&#xA;Traceback (most recent call last):&#xA;[...]&#xA;error: [Errno 32] Broken pipe&#xA;BorkedError: See &lt;a href=&#34;https://purpleidea.com/blog/&#34;&gt;TTBOJ&lt;/a&gt; for explanation and discussion&#xA;&lt;/pre&gt;&#xA;&lt;p&gt;As it turns out, anaconda first downloads the headers, and then later requests the full rpm with an &lt;a href=&#34;https://en.wikipedia.org/wiki/Byte_serving&#34;&gt;http range request&lt;/a&gt;. This second range request which begins at byte 1384, causes the &amp;ldquo;simple&amp;rdquo; httpserver to bork, because it doesn&amp;rsquo;t support this more elaborate feature.&lt;/p&gt;</description>
    </item>
    <item>
      <title>learn how to do one minute hacks, in three minutes</title>
      <link>https://purpleidea.com/blog/2013/03/07/learn-how-to-do-one-minute-hacks-in-three-minutes/</link>
      <pubDate>Thu, 07 Mar 2013 18:38:45 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/03/07/learn-how-to-do-one-minute-hacks-in-three-minutes/</guid>
      <description>&lt;p&gt;I write this technical blog for you to enjoy, and to help me remember. So where do I get all this knowledge? I figure it out! Here&amp;rsquo;s how I learned to fix a small gedit annoyance in one minute, and within the next three, you&amp;rsquo;ll be able to do the same for other types of problems too. Ready? Set? Go!&lt;/p&gt;&#xA;&lt;p&gt;I use gedit enough, that when I hack, I often end up using up more than the five allotted spaces in the &amp;ldquo;recent files&amp;rdquo; sections. I wanted to see eight. Since I knew it would have been silly for the developers to hard code the number five, I decided there was a chance that they stored it in the &lt;a href=&#34;https://live.gnome.org/dconf&#34;&gt;dconf&lt;/a&gt; settings. (BTW, there&amp;rsquo;s also an amazing &amp;ldquo;&lt;a href=&#34;http://seilo.geekyogre.com/2011/12/gedit-plugins-now-has-the-dashboard/&#34;&gt;Dashboard&lt;/a&gt;&amp;rdquo; plugin which I use for more complex recent-files searching&amp;hellip;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>A quick anaconda trick</title>
      <link>https://purpleidea.com/blog/2013/03/04/a-quick-anaconda-trick/</link>
      <pubDate>Mon, 04 Mar 2013 05:00:43 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/03/04/a-quick-anaconda-trick/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a quick &lt;a href=&#34;https://fedoraproject.org/wiki/Anaconda/Kickstart&#34;&gt;anaconda&lt;/a&gt; solution that I am now using in some of my kickstart files&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;I wanted to bootstrap a machine and do all the partitioning and logical volume creation, but not format or mount one of the logical volumes. The magic parameter I needed was:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--fstype=none&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This seems to work perfectly for me. It&amp;rsquo;s not 100% intuitive to me, but it does work. I hope it&amp;rsquo;s not an accidental bug in the anaconda code! The full text of my partitioning is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automatic hiera lookups in puppet 3.x</title>
      <link>https://purpleidea.com/blog/2013/02/20/automatic-hiera-lookups-in-puppet-3-x/</link>
      <pubDate>Wed, 20 Feb 2013 00:43:35 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/02/20/automatic-hiera-lookups-in-puppet-3-x/</guid>
      <description>&lt;p&gt;Dear readers,&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve started the slow migration of code from puppet 2.6 all the way to 3.x+. There were a few things I wasn&amp;rsquo;t clear on, so hopefully this will help to discuss these and make your migration easier!&lt;/p&gt;&#xA;&lt;p&gt;I used hiera in 2.6, and I actually like it a lot so far. I was concerned that automatic lookups would pull in values that I wasn&amp;rsquo;t expecting. This is not the case or a worry. Let&amp;rsquo;s dive in and let the code speak:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Picking up the pieces after a Fedora 18 install</title>
      <link>https://purpleidea.com/blog/2013/02/12/picking-up-the-pieces-after-a-fedora-18-install/</link>
      <pubDate>Tue, 12 Feb 2013 01:15:38 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/02/12/picking-up-the-pieces-after-a-fedora-18-install/</guid>
      <description>&lt;p&gt;I love GNOME and Fedora, but &amp;ldquo;upgrading&amp;rdquo; from Fedora 17 to 18 did not go well for me. I recommend you wait until either these are all fixed, or Fedora 19+ suits your needs. Here are a list of problems I had, and some workarounds. Hopefully proper patches to these bugs will get merged quickly, so that you don&amp;rsquo;t need to use these fixes.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Problem&lt;/span&gt;:&lt;/strong&gt; Boot fails after upgrade from Fedora 17 to Fedora 18. I used the new &amp;ldquo;fedup&amp;rdquo; method.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to send and receive files like a professional</title>
      <link>https://purpleidea.com/blog/2013/02/04/how-to-send-and-receive-files-like-a-professional/</link>
      <pubDate>Mon, 04 Feb 2013 10:56:35 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/02/04/how-to-send-and-receive-files-like-a-professional/</guid>
      <description>&lt;p&gt;Everyone needs to send and receive files sometimes. Traditionally people send files as email attachments. This still works great, and supports encryption, but many mail servers are slow and cap the upper file size limit.&lt;/p&gt;&#xA;&lt;p&gt;ICQ was a great solution back in the 1990&amp;rsquo;s, but those days are now over. (I still remember my number.)&lt;/p&gt;&#xA;&lt;p&gt;A lot of folks use dropbox, which requires a dropbox account, and for you to trust them with your files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Renaming a GNOME keyring (for seahorse, the passwords and keyrings application)</title>
      <link>https://purpleidea.com/blog/2013/01/27/renaming-a-gnome-keyring-for-seahorse-the-passwords-and-keyrings-application/</link>
      <pubDate>Sun, 27 Jan 2013 15:33:50 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/01/27/renaming-a-gnome-keyring-for-seahorse-the-passwords-and-keyrings-application/</guid>
      <description>&lt;p&gt;The GNOME Keyring is a great tool to unify password management across the desktop. Sadly, Firefox is the one application that doesn&amp;rsquo;t support this natively. (Chrome actually does!)&lt;/p&gt;&#xA;&lt;p&gt;Seahorse is a useful tool to browse and manage your keyrings. Each keyring is physically stored in: &lt;em&gt;~/.gnome2/keyrings/&lt;strong&gt;$something&lt;/strong&gt;.keyring&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Usually the &amp;ldquo;&lt;strong&gt;&lt;em&gt;$something&lt;/em&gt;&lt;/strong&gt;&amp;rdquo;, matches the name of the keyring, however the real name comes from within the file. I had an older ubuntu machine running GNOME, and I wanted to import my keyring. Here&amp;rsquo;s how I did it:&lt;/p&gt;</description>
    </item>
    <item>
      <title>SElinux causes pain when using puppet 2.x with hiera</title>
      <link>https://purpleidea.com/blog/2013/01/17/selinux-causes-pain-when-using-puppet-2-x-with-hiera/</link>
      <pubDate>Thu, 17 Jan 2013 03:03:36 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/01/17/selinux-causes-pain-when-using-puppet-2-x-with-hiera/</guid>
      <description>&lt;p&gt;So hiera wasn&amp;rsquo;t working when used through my puppetmaster. It worked perfectly when I was running my scripts manually with: &lt;em&gt;puppet apply site.pp&lt;/em&gt; but the moment I switched over to regular &lt;em&gt;puppetmasterd&lt;/em&gt; usage, everything went dead.&lt;/p&gt;&#xA;&lt;p&gt;I realized a while back, that I could always expect some hiera failures from time to time. Whether this is hiera&amp;rsquo;s fault or not is irrelevant, the relevant part is that I quickly added:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dynamically including classes in puppet</title>
      <link>https://purpleidea.com/blog/2013/01/16/dynamically-including-classes-in-puppet/</link>
      <pubDate>Wed, 16 Jan 2013 07:29:14 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/01/16/dynamically-including-classes-in-puppet/</guid>
      <description>&lt;p&gt;As you might already know, I like pushing the boundaries of what puppet is able to do. Today, I realized that I needed to &lt;em&gt;include&lt;/em&gt; a class by variable name. A simple way to do this is possible with:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$foo = &amp;#39;world&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;class { &amp;#34;hello::${foo}::params&amp;#34;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I then realized that you could also do this with the standard include keyword:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$foo = &amp;#39;world&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;include &amp;#34;hello::${foo}::params&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;re really insane enough to need to have your include depend on a variable, then this should suit your needs. The advantage of the second form is that if that statement appears more than once, you won&amp;rsquo;t cause a &amp;ldquo;duplicate definition&amp;rdquo; error.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Clustering virtual machines with rgmanager and clusvcadm</title>
      <link>https://purpleidea.com/blog/2013/01/03/clustering-virtual-machines-with-rgmanager-and-clusvcadm/</link>
      <pubDate>Thu, 03 Jan 2013 04:25:15 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2013/01/03/clustering-virtual-machines-with-rgmanager-and-clusvcadm/</guid>
      <description>&lt;p&gt;This &lt;em&gt;could&lt;/em&gt; be a post detailing how to host clustered virtual machines with &lt;a href=&#34;https://fedorahosted.org/cluster/wiki/RGManager&#34;&gt;rgmanager&lt;/a&gt; and clusvcadm, but that is a longer story and there is much work to do. For now, I will give you a short version including an informative &amp;ldquo;gotcha&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;With my cluster up and running, I added a virtual machine entry to my &lt;em&gt;cluster.conf&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;vm name=&amp;#34;test1&amp;#34; domain=&amp;#34;somedomain&amp;#34; path=&amp;#34;/shared/vm/&amp;#34; autostart=&amp;#34;0&amp;#34; exclusive=&amp;#34;0&amp;#34; recovery=&amp;#34;restart&amp;#34; use_virsh=&amp;#34;1&amp;#34; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This goes inside the &lt;em&gt;&lt;rm&gt;&lt;/em&gt; block. As a benchmark, please note that starting the machine with &lt;em&gt;virsh&lt;/em&gt; worked perfectly:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I broke (and fixed) my rgmanager service</title>
      <link>https://purpleidea.com/blog/2012/12/31/how-i-broke-and-fixed-my-rgmanager-service/</link>
      <pubDate>Mon, 31 Dec 2012 00:34:45 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/12/31/how-i-broke-and-fixed-my-rgmanager-service/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://fedorahosted.org/cluster/wiki/RGManager&#34;&gt;Rgmanager&lt;/a&gt;, clustat and clusvcadm are useful tools in cluster land. I recently built a custom resource which I added to one of my service chains. Upon inspecting clustat, I noticed:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[root@server1 ~]# clustat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Member Status: Quorate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Member Name                             ID   Status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;------ ----                             ---- ------&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;server1                                 1 Online, Local, rgmanager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;server2                                 2 Online, rgmanager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Service Name                   Owner (Last)                   State&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;------- ----                   ----- ------                   -----&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service:service-main-server1   (server1)                      failed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Looking at &lt;em&gt;/var/log/messages&lt;/em&gt;, I found:&lt;/p&gt;</description>
    </item>
    <item>
      <title>visible close buttons on every firefox tab (including the last one)</title>
      <link>https://purpleidea.com/blog/2012/11/26/visible-close-buttons-on-every-firefox-tab-including-the-last-one/</link>
      <pubDate>Mon, 26 Nov 2012 05:42:20 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/11/26/visible-close-buttons-on-every-firefox-tab-including-the-last-one/</guid>
      <description>&lt;p&gt;&lt;a title=&#34;more rows and columns on firefox new tab page&#34; href=&#34;https://purpleidea.com/blog/2012/11/24/more-rows-and-columns-on-firefox-new-tab-page/&#34;&gt;After hacking around with a few firefox internals the other day&lt;/a&gt;, I decided there was another little annoyance that I had&amp;hellip; When I&amp;rsquo;m acting insane and &lt;a href=&#34;http://reddit.com/&#34;&gt;using my mouse to open and close tabs&lt;/a&gt;, the per tab close button disappears when there is only one tab left! &lt;a href=&#34;https://bugzilla.mozilla.org/show_bug.cgi?id=455990&#34;&gt;This is apparently a feature&lt;/a&gt;, and while I can respect it as a default, it certainly isn&amp;rsquo;t an option for me. Thankfully, there are a lot of common minded individuals on the net, and the (hack) solution already existed. Here&amp;rsquo;s to explaining it clearly:&lt;/p&gt;</description>
    </item>
    <item>
      <title>more rows and columns on firefox new tab page</title>
      <link>https://purpleidea.com/blog/2012/11/24/more-rows-and-columns-on-firefox-new-tab-page/</link>
      <pubDate>Sat, 24 Nov 2012 19:09:37 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/11/24/more-rows-and-columns-on-firefox-new-tab-page/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://firefox.com/&#34;&gt;Firefox&lt;/a&gt; has a &amp;ldquo;new tab&amp;rdquo; &lt;em&gt;speed dial&lt;/em&gt; type page available. I use it as my homepage (hint, use: about:newtab) and find it very useful for launching my often used favourites.&lt;/p&gt;&#xA;&lt;p&gt;My one gripe is that it only shows you a default grid of 3 x 3. You can easily change that if you look in the secret preferences. Open a new tab and type in: &lt;em&gt;about:config&lt;/em&gt;, accept the warning, and then search for: &lt;em&gt;browser.newtabpage.rows&lt;/em&gt; and &lt;em&gt;browser.newtabpage.columns&lt;/em&gt;. These values are easily editable by double clicking on the row. (Bold indicates non defaults.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>hello planet puppet</title>
      <link>https://purpleidea.com/blog/2012/11/23/hello-planet-puppet/</link>
      <pubDate>Fri, 23 Nov 2012 05:59:30 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/11/23/hello-planet-puppet/</guid>
      <description>&lt;p&gt;Hello &lt;a href=&#34;http://www.planetpuppet.org/&#34;&gt;planet puppet&lt;/a&gt; readers!&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.masterzen.fr/&#34;&gt;Brice Figureau&lt;/a&gt;[1] who runs &lt;a href=&#34;http://www.planetpuppet.org/&#34;&gt;planet puppet&lt;/a&gt; has just syndicated my blog, so thanks go out to him.&lt;/p&gt;&#xA;&lt;p&gt;To all readers, I hope you enjoy my content, and please don&amp;rsquo;t be shy to comment and let me know if there are particular subjects or posts that I should elaborate on. I&amp;rsquo;ve got a whack of technical posts in the archives, so feel free to browse and let me know what&amp;rsquo;s good!&lt;/p&gt;</description>
    </item>
    <item>
      <title>recursion in puppet (for no particular reason)</title>
      <link>https://purpleidea.com/blog/2012/11/20/recursion-in-puppet-for-no-particular-reason/</link>
      <pubDate>Tue, 20 Nov 2012 06:25:51 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/11/20/recursion-in-puppet-for-no-particular-reason/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m working on some &lt;em&gt;fancy&lt;/em&gt; puppet &amp;ldquo;code&amp;rdquo;, and I realized recursion could be very useful. I decided to try out a little hack to see if I could get it to work. I&amp;rsquo;ll jump right into the code:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#!/usr/bin/puppet&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;define recursion(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b8860b&#34;&gt;$count&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    notify { &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;count-${count}&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b8860b&#34;&gt;$minus1&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; inline_template(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;lt;%= count.to_i - 1 %&amp;gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;${minus1}&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        notify { &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;done counting!&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# recurse&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        recursion { &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;count-${minus1}&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            count &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$minus1&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# kick it off...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;recursion { &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;start&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;4&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>continuous display of log files (better tail -f)</title>
      <link>https://purpleidea.com/blog/2012/11/18/continuous-display-of-log-files-better-tail-f/</link>
      <pubDate>Sun, 18 Nov 2012 01:02:22 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/11/18/continuous-display-of-log-files-better-tail-f/</guid>
      <description>&lt;p&gt;All good sysadmins know about using &lt;em&gt;tail -f&lt;/em&gt; to &lt;em&gt;follow&lt;/em&gt; a log file. I use this all the time to follow &lt;em&gt;/var/log/messages&lt;/em&gt; and my gluster logs in particular. Maybe everyone already knows this, but it deserves a PSA: after a certain amount of time (~days) it seems that new messages don&amp;rsquo;t appear!&lt;/p&gt;&#xA;&lt;p&gt;What happens by default is that &lt;em&gt;tail -f&lt;/em&gt; follows the file &lt;span style=&#34;text-decoration:underline;&#34;&gt;descriptor&lt;/span&gt;, not the file &lt;span style=&#34;text-decoration:underline;&#34;&gt;name&lt;/span&gt;, so when your log files get rotated, the file descriptor still points to the (now renamed) file which no longer gets updates any more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>setting timed events in puppet</title>
      <link>https://purpleidea.com/blog/2012/11/14/setting-timed-events-in-puppet/</link>
      <pubDate>Wed, 14 Nov 2012 01:31:43 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/11/14/setting-timed-events-in-puppet/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve tried to push puppet to its limits, and so far I&amp;rsquo;ve succeeded. When you hit &lt;a href=&#34;http://projects.puppetlabs.com/issues/1565&#34;&gt;the kind of bug that forces you to hack around it&lt;/a&gt;, you know you are close. In any case, this isn&amp;rsquo;t about that embarrassing bug, it&amp;rsquo;s about how to set delayed actions in puppet.&lt;/p&gt;&#xA;&lt;p&gt;Enter puppet-runonce, a module that I&amp;rsquo;ve just finished writing. It starts off with the realization that you can exec an action which also writes to a file. If it sees this file, then it knows that it has already completed, and shouldn&amp;rsquo;t run itself again. The relevant parts are here:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;define runonce&lt;span style=&#34;color:#666&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;exec&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b8860b&#34;&gt;$command&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;/bin/true&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b8860b&#34;&gt;$notify&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;undef&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b8860b&#34;&gt;$repeat_on_failure&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f&#34;&gt;include&lt;/span&gt; runonce&lt;span style=&#34;color:#666&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;exec&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;::&lt;/span&gt;base&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b8860b&#34;&gt;$date&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/bin/date &amp;gt;&amp;gt; /var/lib/puppet/tmp/runonce/exec/${name}&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b8860b&#34;&gt;$valid_command&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$repeat_on_failure&lt;/span&gt; ? {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a2f&#34;&gt;false&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;${date} &amp;amp;&amp;amp; ${command}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        default &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;${command} &amp;amp;&amp;amp; ${date}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f&#34;&gt;exec&lt;/span&gt; { &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;runonce-exec-${name}&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        command &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;${valid_command}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        creates &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/var/lib/puppet/tmp/runonce/exec/${name}&amp;#34;&lt;/span&gt;,    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# run once&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        notify &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$notify&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# TODO: add any other parameters here that users wants such as cwd and environment...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a2f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#800&#34;&gt;File&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;/var/lib/puppet/tmp/runonce/exec/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;]&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>preventing duplicate parameter values in puppet types</title>
      <link>https://purpleidea.com/blog/2012/11/07/preventing-duplicate-parameter-values-in-puppet-types/</link>
      <pubDate>Wed, 07 Nov 2012 18:30:31 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/11/07/preventing-duplicate-parameter-values-in-puppet-types/</guid>
      <description>&lt;p&gt;I am writing a &lt;a href=&#34;http://www.keepalived.org/&#34;&gt;keepalived&lt;/a&gt; module for puppet. It will naturally be called: &amp;ldquo;puppet-keepalived&amp;rdquo;, and I will be releasing the code in the near future! In any case, if you&amp;rsquo;re familiar with &lt;a href=&#34;http://en.wikipedia.org/wiki/Virtual_Router_Redundancy_Protocol&#34;&gt;VRRP&lt;/a&gt;, you&amp;rsquo;ll know that each managed link (eg: resource or &lt;a href=&#34;http://en.wikipedia.org/wiki/Virtual_IP_address&#34;&gt;VIP&lt;/a&gt;) has a common &lt;em&gt;routerid&lt;/em&gt; and &lt;em&gt;password&lt;/em&gt; which are shared among all members in the group. It is important that these parameters are unique across the type definitions on a single node.&lt;/p&gt;</description>
    </item>
    <item>
      <title>changing *that* keyboard shortcut right there (in gnome)</title>
      <link>https://purpleidea.com/blog/2012/11/03/changing-that-keyboard-shortcut-right-there-in-gnome/</link>
      <pubDate>Sat, 03 Nov 2012 03:12:39 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/11/03/changing-that-keyboard-shortcut-right-there-in-gnome/</guid>
      <description>&lt;p&gt;I love my keyboard shortcuts, and I sometimes I want to change them. If you&amp;rsquo;re ever in a gnome application and wanted to change &lt;em&gt;that one right there&lt;/em&gt;, you can now live-edit them!&lt;/p&gt;&#xA;&lt;p&gt;In a terminal, first enable this feature:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gsettings set org.gnome.desktop.interface can-change-accels true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, hover over the menu item shortcut that you want to change. Enter the shortcut you want. It should update immediately! I like to disable this live-editing, so that I don&amp;rsquo;t accidentally change any shortcuts. To do so run:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Multifile mode for text editors</title>
      <link>https://purpleidea.com/blog/2012/10/24/multifile-mode-for-text-editors/</link>
      <pubDate>Wed, 24 Oct 2012 04:08:38 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/10/24/multifile-mode-for-text-editors/</guid>
      <description>&lt;p&gt;Dear internets,&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m a sysadmin/architect, which means I spend a good amount of time &lt;a href=&#34;http://developers.slashdot.org/story/12/10/22/2257222/system-admins-should-know-how-to-code&#34;&gt;coding&lt;/a&gt; in &lt;a href=&#34;http://en.wikipedia.org/wiki/Puppet_%28software%29&#34;&gt;puppet&lt;/a&gt; and other languages. Puppet is a great tool, however the puppet community is a bit &lt;del&gt;anal&lt;/del&gt; strict about their style policies. I can respect this because I understand how important uniformity is when many developers are sharing code.&lt;/p&gt;&#xA;&lt;p&gt;(&lt;a href=&#34;http://www.kernel.org/doc/Documentation/CodingStyle&#34;&gt;On a side note, I absolutely can&amp;rsquo;t stand using spaces for indentation, but that&amp;rsquo;s another story. Please, just tell people to use tabs - preferably with a width of eight spaces.&lt;/a&gt;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Our fusion future</title>
      <link>https://purpleidea.com/blog/2012/10/20/our-fusion-future/</link>
      <pubDate>Sat, 20 Oct 2012 03:02:22 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/10/20/our-fusion-future/</guid>
      <description>&lt;p&gt;I always find myself reading about &lt;a href=&#34;http://en.wikipedia.org/wiki/Nuclear_fusion&#34;&gt;fusion&lt;/a&gt;. This time, I&amp;rsquo;ve come across &lt;a href=&#34;http://hardware.slashdot.org/story/12/04/11/0435231/mit-fusion-researchers-answer-your-questions&#34;&gt;an excellent Q&amp;amp;A on slashdot by some MIT Fusion Researchers&lt;/a&gt;. It&amp;rsquo;s well worth the read, and so is the &lt;a href=&#34;http://www.fusionfuture.org/&#34;&gt;&lt;a href=&#34;http://www.fusionfuture.org/&#34;&gt;http://www.fusionfuture.org/&lt;/a&gt;&lt;/a&gt; website for some clear explanations about nuclear fusion.&lt;/p&gt;&#xA;&lt;p&gt;Enjoy,&lt;/p&gt;&#xA;&lt;p&gt;James&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>including a recursive tree of files with distutils</title>
      <link>https://purpleidea.com/blog/2012/10/01/including-a-recursive-tree-of-files-with-distutils/</link>
      <pubDate>Mon, 01 Oct 2012 06:17:58 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/10/01/including-a-recursive-tree-of-files-with-distutils/</guid>
      <description>&lt;p&gt;It turns out it is non trivial (afaict) to include a tree of files (a directory) in a python distutils data_files argument. Here&amp;rsquo;s how I managed to do it, while also allowing the programmer to include manual entries:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;project_name&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;distutils&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;core&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;setup(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data_files&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;share/&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;%&lt;/span&gt; NAME, [&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;README&amp;#39;&lt;/span&gt;]),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;share/&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;%&lt;/span&gt; NAME, [&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;files/somefile&amp;#39;&lt;/span&gt;]),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;share/&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;/templates&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;%&lt;/span&gt; NAME, [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;files/templates/template1.tmpl&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;files/templates/template2.tmpl&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ] &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; [(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;share/&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;%&lt;/span&gt; (NAME, x[&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;]), &lt;span style=&#34;color:#a2f&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;lambda&lt;/span&gt; y: x[&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt;y, x[&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;])) &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;in&lt;/span&gt; os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;walk(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;the_directory/&amp;#39;&lt;/span&gt;)],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>finding your software install $prefix from inside python</title>
      <link>https://purpleidea.com/blog/2012/09/20/finding-your-software-install-prefix-from-inside-python/</link>
      <pubDate>Thu, 20 Sep 2012 04:12:00 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/09/20/finding-your-software-install-prefix-from-inside-python/</guid>
      <description>&lt;p&gt;Good python software developers tend to use &lt;a href=&#34;http://docs.python.org/library/distutils.html&#34;&gt;distutils&lt;/a&gt; and include a setup.py with their code. The problem I often encounter is finding out which prefix your software has been installed in from within the python code. This might be necessary if you want to interact with some data that you&amp;rsquo;ve installed into: $prefix/share/projectname/ Here are the various steps:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1) &lt;span style=&#34;text-decoration:underline;&#34;&gt;Distutils&lt;/span&gt;:&lt;/strong&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;someproject&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;distutils&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;core&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;setup(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;NAME,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    version&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;0.1&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    author&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;James Shubin&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    author_email&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;secret@purpleidea.com&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    url&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;https://purpleidea.com/&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    description&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;This is an example project&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# http://pypi.python.org/pypi?%3Aaction=list_classifiers&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    classifiers&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Environment :: Console&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Intended Audience :: System Administrators&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;License :: OSI Approved :: GNU Affero General Public License v3&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Operating System :: POSIX :: Linux&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Programming Language :: Python&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Topic :: Utilities&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    packages&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;[NAME],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    package_dir&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;{NAME: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;src&amp;#39;&lt;/span&gt;},&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data_files&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;share/&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;%&lt;/span&gt; NAME, [&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;README&amp;#39;&lt;/span&gt;]),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;share/&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;%&lt;/span&gt; NAME, [&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;images/something.png&amp;#39;&lt;/span&gt;]),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    scripts&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;somebin&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to avoid cluster race conditions or: How to implement a distributed lock manager in puppet</title>
      <link>https://purpleidea.com/blog/2012/08/23/how-to-avoid-cluster-race-conditions-or-how-to-implement-a-distributed-lock-manager-in-puppet/</link>
      <pubDate>Thu, 23 Aug 2012 16:14:44 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/08/23/how-to-avoid-cluster-race-conditions-or-how-to-implement-a-distributed-lock-manager-in-puppet/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on a puppet module for gluster. Both this, my puppet-gfs2 module, and other puppet clustering modules all share a common problem: How does one make sure that only certain operations happen on one node at a time?&lt;/p&gt;&#xA;&lt;p&gt;The inelegant solutions are simple:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&#x9;&lt;li&gt;Specify manually (in puppet) which node the &#34;master&#34; is, and have it carry out all the special operations. &lt;span style=&#34;text-decoration:underline;&#34;&gt;Downside:&lt;/span&gt; Single point of failure for your distributed cluster, and you&#39;ve also written ugly asymmetrical code. Build a beautiful, decentralized setup instead.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Run all your operations on all nodes. Ensure they&#39;re idempotent, and that they check the cluster state for success first. &lt;span style=&#34;text-decoration:underline;&#34;&gt;Downside:&lt;/span&gt; Hope that they don&#39;t run simultaneously and &lt;a href=&#34;http://en.wikipedia.org/wiki/Race_condition&#34;&gt;race&lt;/a&gt; somehow. This is actually how I engineered my first version of puppet-gluster! It was low risk, and I just wanted to get the cluster up; my module was just a tool, not a product.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;Use the built-in puppet &lt;a href=&#34;http://en.wikipedia.org/wiki/Distributed_lock_manager&#34;&gt;DLM&lt;/a&gt; to coordinate running of these tasks. &lt;span style=&#34;text-decoration:underline;&#34;&gt;Downside:&lt;/span&gt; Oh wait, puppet can&#39;t do this, you misunderstand the puppet architecture. I too thought this was possible for a short duration. Woops! There is no DLM.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Note:&lt;/span&gt; I know this is ironic, since by default puppet requires a master node for coordination, however you &lt;a href=&#34;http://docs.puppetlabs.com/guides/scaling_multiple_masters.html&#34;&gt;&lt;em&gt;can&lt;/em&gt;&lt;/a&gt; have multiple masters, and if they&#39;re down, puppetd still runs on the clients, it just doesn&#39;t receive new information. (You could also reconfigure your manifests to work around these downsides as they arise, but this takes the point out of puppet: keeping it automatic.)&#xA;&lt;p&gt;Mostly elegant: Thoughts of my other cluster crept into my head. Out of nowhere, I realized the solution was: &lt;a href=&#34;http://en.wikipedia.org/wiki/Virtual_Router_Redundancy_Protocol&#34;&gt;VRRP&lt;/a&gt;! You may use a different mechanism if you like, but at the moment I&amp;rsquo;m using &lt;a href=&#34;http://www.keepalived.org/&#34;&gt;keepalived&lt;/a&gt;. Keepalived runs on my gluster pool to provide a &lt;a href=&#34;http://en.wikipedia.org/wiki/Virtual_IP_address&#34;&gt;VIP&lt;/a&gt; for the cluster. This allows my clients to use a highly available IP address to download volume files (mount operation) otherwise, if that particular server were down, they wouldn&amp;rsquo;t be about to mount. The trick: I tell each node what the expected VIP for the cluster is, and if that IP is present in a facter $ipaddress_, then I let that node execute!&lt;/p&gt;</description>
    </item>
    <item>
      <title>puppet gluster module now in git</title>
      <link>https://purpleidea.com/blog/2012/07/27/puppet-gluster-module-now-in-git/</link>
      <pubDate>Fri, 27 Jul 2012 00:48:50 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/07/27/puppet-gluster-module-now-in-git/</guid>
      <description>&lt;p&gt;The thoughtful &lt;a href=&#34;https://twitter.com/bodepd/&#34;&gt;bodepd&lt;/a&gt; has been kind enough to help me get my &lt;a href=&#34;https://github.com/purpleidea/puppet-gluster&#34;&gt;puppet-gluster&lt;/a&gt; module off the ground and publicized a bit too. My first few commits have been all clean up to get my initial hacking up to snuff with the puppet style guidelines. Sadly, I love indenting my code with tabs, and this is against the puppet rules :(&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&#34;tabsspacesboth.png&#34;&gt;&lt;img class=&#34;size-full wp-image-154&#34; title=&#34;TabsSpacesBoth&#34; src=&#34;tabsspacesboth.png&#34; alt=&#34;i&#39;m actually a vim user though, sorry rms.&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; http://www.emacswiki.org/emacs/TabsSpacesBoth&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll be accepting patches by email, but I&amp;rsquo;d prefer discussion first, especially since I&amp;rsquo;ve got a few obvious things brewing in my mental queue that should hit master shortly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>a puppet module for gluster</title>
      <link>https://purpleidea.com/blog/2012/07/24/a-puppet-module-for-gluster/</link>
      <pubDate>Tue, 24 Jul 2012 15:56:40 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/07/24/a-puppet-module-for-gluster/</guid>
      <description>&lt;p&gt;I am an avid &lt;a href=&#34;http://cobbler.github.com/about.html&#34;&gt;cobbler&lt;/a&gt;+&lt;a href=&#34;http://puppetlabs.com/puppet/what-is-puppet/&#34;&gt;puppet&lt;/a&gt; user. This allows me to rely on my cobbler server and puppet manifests to describe how servers/workstations are setup. I only backup my configs and data, and I regenerate failed machines PRN.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll be publishing my larger cobbler+puppet infrastructure in the future once it&amp;rsquo;s been cleaned up a bit, but for now I figured I&amp;rsquo;d post my work-in-progress &amp;ldquo;puppet-gluster&amp;rdquo; module, since it seems there&amp;rsquo;s a real interest.&lt;/p&gt;</description>
    </item>
    <item>
      <title>now syndicated on “planet gluster”</title>
      <link>https://purpleidea.com/blog/2012/07/24/now-syndicated-on-planet-gluster/</link>
      <pubDate>Tue, 24 Jul 2012 15:11:05 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/07/24/now-syndicated-on-planet-gluster/</guid>
      <description>&lt;p&gt;Many thanks to johnmark in #gluster for syndicating my &amp;ldquo;gluster&amp;rdquo; tagged blog posts on &lt;a href=&#34;http://www.gluster.org/blog/&#34;&gt;&lt;a href=&#34;http://www.gluster.org/blog/&#34;&gt;http://www.gluster.org/blog/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I aim to keep these posts technical and informative, aimed mostly at other sysadmins and gluster users. Please don&amp;rsquo;t  be shy to comment on my writing style or to let me know if you need more information about a particular subject. If you have any ideas about things you&amp;rsquo;d like me to write about, let me know and I&amp;rsquo;ll try to do my best. I like feedback!&lt;/p&gt;</description>
    </item>
    <item>
      <title>building intel nic driver (igb) for gluster on centos</title>
      <link>https://purpleidea.com/blog/2012/07/20/building-intel-nic-driver-igb-for-gluster-on-centos/</link>
      <pubDate>Fri, 20 Jul 2012 18:47:50 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/07/20/building-intel-nic-driver-igb-for-gluster-on-centos/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been having some strange networking issues with gluster. &amp;ldquo;Eco__&amp;rdquo; from #gluster suggested I try an up to date Intel nic driver. Here are the steps I followed to make that happen. No news yet on if that solved the problem.&lt;/p&gt;&#xA;&lt;p&gt;Currently my system is using the igb (intel gigabit) driver. To find out what version you are running:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# modinfo -F version igb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3.2.10-k&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I found a newer version from the &lt;a href=&#34;ftp://ftp.supermicro.com/driver/LAN/Intel/&#34;&gt;supermicro ftp site&lt;/a&gt;. A download and a decompress later, I found an: igb-3.4.7.tar.gz file hiding out. Thanks to the kind people at Intel, this was fairly easy to compile and install. First install some deps:&lt;/p&gt;</description>
    </item>
    <item>
      <title>my gluster setup, described</title>
      <link>https://purpleidea.com/blog/2012/07/19/my-gluster-setup-described/</link>
      <pubDate>Thu, 19 Jul 2012 18:26:54 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/07/19/my-gluster-setup-described/</guid>
      <description>&lt;p&gt;For the last ~two or so years I&amp;rsquo;ve played and tested &lt;a href=&#34;http://download.gluster.com/pub/gluster/glusterfs/LATEST/CentOS/&#34;&gt;gluster&lt;/a&gt; on and off and hanging out in the awesome #gluster channel on &lt;a href=&#34;https://libera.chat/&#34;&gt;Libera.chat&lt;/a&gt;. In case you haven&amp;rsquo;t heard, gluster was &lt;a href=&#34;http://www.redhat.com/promo/storage/press-release.html&#34;&gt;acquired&lt;/a&gt; by RedHat back in October 2011. This post describes my current setup. I urge you to send your comments and suggestions for improvement. I&amp;rsquo;ll update this as needed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Hardware&lt;/span&gt;:&#xA;Ideology: I wanted to build individual self-contained storage hosts. I didn&amp;rsquo;t want to have servers with separate (serial) attached storage (SAS) like Dell is often pushing. Supermicro fit the design goal, and sold me when I realized I could have the OS drives swappable out the back.&lt;/p&gt;</description>
    </item>
    <item>
      <title>gnome3&#43;others glipper/klipper replacement</title>
      <link>https://purpleidea.com/blog/2012/07/05/gnome3others-glipperklipper-replacement/</link>
      <pubDate>Thu, 05 Jul 2012 18:56:40 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/07/05/gnome3others-glipperklipper-replacement/</guid>
      <description>&lt;p&gt;So a friend of mine uses kde4 for its klipper feature. Turns out he&amp;rsquo;s right that it&amp;rsquo;s an awesome feature! I realized I couldn&amp;rsquo;t let gnome3 take second place to a clipboard app, so after a bit of searching&amp;hellip;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo yum install gnome-shell-extension-gpaste gpaste xsel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next hit up: &lt;a href=&#34;https://extensions.gnome.org/local/&#34;&gt;&lt;a href=&#34;https://extensions.gnome.org/local/&#34;&gt;https://extensions.gnome.org/local/&lt;/a&gt;&lt;/a&gt; to flip on the extension. I had to first type: ALT-F2, &amp;ldquo;r&amp;rdquo; (to restart the gnome shell). Don&amp;rsquo;t worry your apps won&amp;rsquo;t die. And then I flipped it on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>fedora 14 to 17 upgrade</title>
      <link>https://purpleidea.com/blog/2012/06/04/fedora-14-to-17-upgrade/</link>
      <pubDate>Mon, 04 Jun 2012 22:31:41 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/06/04/fedora-14-to-17-upgrade/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been reluctantly dreading the switch to gnome 3 + shell until it&amp;rsquo;s been ironed out a little bit more than gnome 3.0 - finally took the plunge. overall it&amp;rsquo;s working well. here are some (hopefully) useful notes:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;preupgrade 14-&amp;gt;17 in one step doesn&#39;t work. it lets you wait an hour for all the downloads to finish, but once you&#39;ve rebooted, the preupgrade installer tells you it can&#39;t jump this far. fail. reboot into f14, yum clean all, rm -rf /var/cache/yum/preupgrade/* ? and preupgrade to f15. boot into that, and then jumping directly to f17 works great.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;remove default f17 ugly fireworks background. the gnome3 default is pretty.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;gnome-tweak-tool is essential. try all the options until you figure out which ones you want. listing my personal preferences here is far too boring for the internet.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;dash click fix extension was essential for me. also: https://extensions.gnome.org/review/download/1323.shell-extension.zip which does the same thing, but for application launcher entries. this allows gnome-shell to behave properly and launch applications where i want them.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;i also added: &#34;Remove user name&#34; and &#34;Remove a11y&#34; extensions.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&#34;system-monitor&#34;, is close to what i want, but is not good enough yet. disks access/writes don&#39;t show, and it&#39;s got a super ugly popup window. old gnome-system-monitor applet was PERFECT. Please bring it back or fix this one.&lt;/li&gt;&#xA;&#x9;&lt;li&gt;choose non-ugly background for gdm: # sudo -u gdm dbus-launch gnome-control-center&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;Hope this helped! Happy hacking,&#xA;&lt;p&gt;James&lt;/p&gt;</description>
    </item>
    <item>
      <title>IPMI for linux professionals</title>
      <link>https://purpleidea.com/blog/2012/04/25/ipmi-for-linux-professionals/</link>
      <pubDate>Wed, 25 Apr 2012 01:22:22 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/04/25/ipmi-for-linux-professionals/</guid>
      <description>&lt;p&gt;The nostalgia of serial console servers, kvm&amp;rsquo;s and switched PDU&amp;rsquo;s is hopefully no longer visible in your server room. If not, you must definitely start playing catch up. Please forgive my ignorance, but these things might still be common for big windows shops, however if that&amp;rsquo;s the case, you&amp;rsquo;ve got an entirely different set of problems ;)&lt;/p&gt;&#xA;&lt;p&gt;IPMI is an IP based protocol that allows you to talk directly to a little computer, usually built in to your server. It lets you remotely manage power (on, off, reboot, cycle&amp;hellip;) get a serial console, collect sensor readings like temperatures, and do other magical things too if you care to figure them out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>how to use ssh escape characters</title>
      <link>https://purpleidea.com/blog/2012/04/25/how-to-use-ssh-escape-characters/</link>
      <pubDate>Wed, 25 Apr 2012 00:59:01 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/04/25/how-to-use-ssh-escape-characters/</guid>
      <description>&lt;p&gt;So you&amp;rsquo;ve learned screen, ssh and vim. Time to take your skills to level two.&lt;/p&gt;&#xA;&lt;p&gt;Day one: You&amp;rsquo;ve logged in to your server remotely via ssh. You run &amp;ldquo;screen -xRR&amp;rdquo;, and two minutes later you&amp;rsquo;re busy chatting away in irssi and vim is running in the other window, because, you know, real sysadmins don&amp;rsquo;t use emacs.&lt;/p&gt;&#xA;&lt;p&gt;Lunch time: You grab your laptop and head off for lunch. When you open the lid and look at your terminals, they&amp;rsquo;re all frozen, because the tcp connections have died. You force quit the terminals, and you&amp;rsquo;re back in 30 seconds with new tcp connections.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dear internets</title>
      <link>https://purpleidea.com/blog/2012/02/22/dear-internets/</link>
      <pubDate>Wed, 22 Feb 2012 23:04:41 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/02/22/dear-internets/</guid>
      <description>&lt;p&gt;Dear internets,&lt;/p&gt;&#xA;&lt;p&gt;During my daily grind of computer architecturing, I often learn something new that I wish a mentor had taught me earlier. I will post my babbles here, so that the interested might learn, and for the wiser to comment on.&lt;/p&gt;&#xA;&lt;p&gt;Happy Hacking!&lt;/p&gt;&#xA;&lt;p&gt;James&lt;/p&gt;&#xA;&lt;p&gt;PS: I had a previous blog, but that server was taken down. It has been merged into this one!&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>sparse rsync magic</title>
      <link>https://purpleidea.com/blog/2012/02/22/sparse-rsync-magic/</link>
      <pubDate>Wed, 22 Feb 2012 18:50:51 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2012/02/22/sparse-rsync-magic/</guid>
      <description>&lt;p&gt;Dear internets,&lt;/p&gt;&#xA;&lt;p&gt;Once upon a time, I had one of those &amp;ldquo;brain teaser-of-the-day&amp;rdquo; calendars. Free business tip: someone should make an &amp;lsquo;rsync&amp;rsquo; version. That would be brilliant. (If you don&amp;rsquo;t know what rsync is, then you should probably go read a different blog.)&lt;/p&gt;&#xA;&lt;p&gt;Anyone who&amp;rsquo;s used kvm might know, linux virtual machines can have sparse .raw file backing stores. This means the operating system could think it has one TiB of space, when it is actually sharing a one TiB physical harddrive with many others.&lt;/p&gt;</description>
    </item>
    <item>
      <title>git, gitosis, gitweb and friends...</title>
      <link>https://purpleidea.com/blog/2010/08/19/git-gitosis-gitweb-and-friends/</link>
      <pubDate>Thu, 19 Aug 2010 11:03:46 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/08/19/git-gitosis-gitweb-and-friends/</guid>
      <description>&lt;p&gt;In case it wasn&amp;rsquo;t already obvious, I am a huge fan of &lt;a href=&#34;http://git-scm.com/&#34;&gt;git&lt;/a&gt;, and often prefer it over &lt;a href=&#34;http://en.wikipedia.org/wiki/Sliced_bread&#34;&gt;sliced bread&lt;/a&gt;. Recently to help a small team of programmers collaborate, I decided to setup a private git server for them to use. By no claim of mine is the following tutorial unique, however I am writing this to aid those who had trouble following &lt;a href=&#34;http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way&#34;&gt;other&lt;/a&gt;&lt;a href=&#34;http://eagain.net/gitweb/?p=gitosis.git;a=blob;f=README.rst&#34;&gt; online&lt;/a&gt; &lt;a href=&#34;http://hokietux.net/blog/?p=58&#34;&gt;tutorials&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;span style=&#34;text-decoration:underline;&#34;&gt;Goal&lt;/span&gt;:&#xA;Setup a central git server for private or public source sharing, without having to give everyone a separate shell account.&lt;/p&gt;</description>
    </item>
    <item>
      <title>gnome-do trick</title>
      <link>https://purpleidea.com/blog/2010/03/31/gnome-do-trick/</link>
      <pubDate>Wed, 31 Mar 2010 12:17:21 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/03/31/gnome-do-trick/</guid>
      <description>&lt;p&gt;I use gnome-do. It&amp;rsquo;s fairly useful. One quick trick: press SHIFT - &amp;lt;ENTER&amp;gt; instead of plain &amp;lt;ENTER&amp;gt; to launch without closing the launcher box. Therefore, if you want three terminals, type: &amp;lt;SUPER&amp;gt; - &amp;lt;SPACE&amp;gt;, t(erminal), (&amp;lt;SHIFT&amp;gt; - &amp;lt;ENTER&amp;gt; X 2), &amp;lt;ENTER&amp;gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>lecturing and git-bisect</title>
      <link>https://purpleidea.com/blog/2010/03/31/lecturing-and-git-bisect/</link>
      <pubDate>Wed, 31 Mar 2010 10:13:48 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/03/31/lecturing-and-git-bisect/</guid>
      <description>&lt;p&gt;I was recently asked to give a lecture for the &lt;a href=&#34;http://www.cs.mcgill.ca/~prelude/Prelude/Home.html&#34;&gt;PRELUDE&lt;/a&gt; series at McGill. Here was my abstract:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;blockquote&gt;I don&#39;t like computers, and neither should you.&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;We spend too much time figuring out how to talk to them, instead of having them figure out how to understand us.&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;There&#39;s a big discontinuity between what software is providing, and the killer features we want!&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;We&#39;re not completely lost though. There are a lot of good tools and methodologies available!&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;Until the feature gap closes, let me introduce you to some of these tools, and show you how I use the computer.&lt;/blockquote&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;I spoke about a variety of topics with the intention of filling in everyone&#39;s knowledge about the useful tools available to users and developers. I included a section about &lt;a href=&#34;http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html&#34;&gt;git-bisect&lt;/a&gt; and have posted the script in the examples section of the &lt;a href=&#34;http://www.cs.mcgill.ca/~james/code/&#34;&gt;bash-tutor&lt;/a&gt; tarball. It is now available for you to download and share.&lt;/span&gt;&#xA;&lt;p&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;I hope everyone enjoyed the lecture, and I always appreciate feedback!&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>scary cool bash scripting inside a Makefile</title>
      <link>https://purpleidea.com/blog/2010/03/31/scary-cool-bash-scripting-inside-a-makefile/</link>
      <pubDate>Wed, 31 Mar 2010 10:05:21 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/03/31/scary-cool-bash-scripting-inside-a-makefile/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.gnu.org/software/make/manual/make.html&#34;&gt;Makefiles&lt;/a&gt; are both scary and wonderful. When both these adjectives are involved, it often makes for interesting hacking. This is likely the reason I use &lt;a href=&#34;http://www.gnu.org/software/bash/&#34;&gt;bash&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In any case, I digress, back to real work. I use Makefiles as a general purpose tool to launch any of a number of shell scripts which I use to maintain my code, and instead of actually having external shell scripts, I just build any necessary bash right into the Makefile.&lt;/p&gt;</description>
    </item>
    <item>
      <title>getting gedit to work like magic</title>
      <link>https://purpleidea.com/blog/2010/03/09/getting-gedit-to-work-like-magic/</link>
      <pubDate>Tue, 09 Mar 2010 17:17:51 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/03/09/getting-gedit-to-work-like-magic/</guid>
      <description>&lt;p&gt;i use &lt;a href=&#34;http://en.wikipedia.org/wiki/GNU/Linux&#34;&gt;gnu/linux&lt;/a&gt;. it&amp;rsquo;s probably no secret. what is more of a secret, is that i secretly (well actually not so secretly) love using &lt;a href=&#34;http://projects.gnome.org/gedit/&#34;&gt;gedit&lt;/a&gt; for editing text. i still use &lt;a href=&#34;http://www.vim.org/&#34;&gt;vim&lt;/a&gt;, echo (&lt;a href=&#34;http://www.gnu.org/&#34;&gt;gnu&lt;/a&gt; bash) and &lt;a href=&#34;http://www.gnu.org/software/emacs/&#34;&gt;emacs&lt;/a&gt; (but only for &lt;a href=&#34;http://orgmode.org/&#34;&gt;org-mode&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;vim is really, really great. but for day to day full-screen coding, i love working in gedit. i only have one [1] longstanding gripe, and today i believe that it is solved. here is the magic combination which appeases my troubled spirit:&lt;/p&gt;</description>
    </item>
    <item>
      <title>n900 features that should be added</title>
      <link>https://purpleidea.com/blog/2010/03/02/n900-features-that-should-be-added/</link>
      <pubDate>Tue, 02 Mar 2010 17:59:47 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/03/02/n900-features-that-should-be-added/</guid>
      <description>&lt;p&gt;i decided i&amp;rsquo;d compile a short list of features / functionality which should be added to the new &lt;a href=&#34;http://maemo.nokia.com/n900/&#34;&gt;nokia N900&lt;/a&gt; to make it totally pro. it&amp;rsquo;s pretty good as it is, despite it not working with the &lt;a href=&#34;http://www.bell.ca/&#34;&gt;bell&lt;/a&gt; networks. i&amp;rsquo;ve attempted to order this list in order of importance (more or less).&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;all the closed source bits must become free software under a &lt;a href=&#34;http://www.gnu.org/licenses/gpl.html&#34;&gt;GPL&lt;/a&gt; or &lt;a href=&#34;http://www.fsf.org/licensing/licenses/agpl-3.0.html&#34;&gt;AGPL&lt;/a&gt; license.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;it should support a fully encrypted file system. if i lose my phone, i shouldn&#39;t worry that all my data or contacts get stolen!&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;addresses that are stored in contacts should integrate with maps program. (currently they only display)&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;the stock maps tool should integrate nicely with the rest of the phone. currently it&#39;s a bit of a sore thumb. confusing too. also it&#39;s green.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;screen/interfaces should support multi touch.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;user should be able to choose username instead of default &#34;user&#34;&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;hostname should match bluetooth name, etc... on device, one name.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;it should support the &#34;usb on the go&#34; host functionality. i&#39;d like to be able to plug in a usb key and be able to copy files to and from it.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;better battery, if even only an upgrade to the 1500mAh version.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;once plugged in via usb, it would be nice to be able to unmount as usb device while retaining the charging functionality. currently, when you click on the notification area thing, usb mass storage mode is connected, but there is no software way to disconnect. (that i know of) this is important because you can&#39;t access the files through your phone when mounted.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;user should be able to specify which accounts notify you of new messages and which don&#39;t. same for which do periodic updates and when.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;default shell should be bash, not busybox, and it should include usual software like &#34;man&#34;.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;should include stock ir remote control software, that has a large database of hardware including radios, air conditioners and weird tvs. irreco needs some serious work.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;people sometimes click on contacts to view data eg a phone number or address to use on a different phone or otherwise. it should be easy to zoom into to read.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;my gps should just work. (it doesn&#39;t seem to at the moment for some reason)&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;since i change my wireless WEP keys often, and always forget them, the phones wireless manager should integrate nicely with aircrack-ng to easily help me recover my lost WEP key.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;it could be a little thinner. it&#39;s a bit of a brick as it stands. i could overlook this problem if it did everything above.&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;battery life indicator could benefit from having a countdown timer (sure it would change based on usage, but it would give users an approximate idea)&lt;/span&gt;&lt;/li&gt;&#xA;&#x9;&lt;li&gt;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;the cameras should be able to function as a usb camera for the computer when the device is plugged in. (over bluetooth could be nice too)&lt;/span&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;unfortunately i haven&#39;t mentioned this phones positive features-- many before me have-- there are many! overall it&#39;s a nice package and i look forward to seeing improvements to the above.&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>a custom epiphany location bar</title>
      <link>https://purpleidea.com/blog/2010/02/22/a-custom-epiphany-location-bar/</link>
      <pubDate>Mon, 22 Feb 2010 17:04:38 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/02/22/a-custom-epiphany-location-bar/</guid>
      <description>&lt;p&gt;since i do much research on the internets, i often find myself in a web browser. my favourite of the lot is &lt;a href=&#34;http://projects.gnome.org/epiphany/&#34;&gt;epiphany&lt;/a&gt;. this post isn&amp;rsquo;t about its merits or failures, but about the awesome way to make my location bar be exactly how i like it: monospaced.&lt;/p&gt;&#xA;&lt;p&gt;just add the following into your ~/.gtkrc-2.0 file and then restart epiphany. feel free to modify as you wish.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# ~/.gtkrc-2.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;style &amp;#34;Epiphany_Locationbar&amp;#34; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# leave out the font size if you wish&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;font_name = &amp;#34;Monospace 12&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#bg[NORMAL] = &amp;#34;#ff0000&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# both of these seem to work...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#widget &amp;#34;*.EphyLocationEntry.*&amp;#34; style &amp;#34;Epiphany_Locationbar&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;widget_class &amp;#34;*.EphyLocationEntry.*&amp;#34; style &amp;#34;Epiphany_Locationbar&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;thanks to &lt;a href=&#34;http://raphael.slinckx.net/blog/2006-03-01/epiphany-url-entry-in-monospace&#34;&gt;raphael&lt;/a&gt; for the original post, and the #epiphany developers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>reading obscure documentation</title>
      <link>https://purpleidea.com/blog/2010/02/08/reading-obscure-documentation/</link>
      <pubDate>Mon, 08 Feb 2010 13:05:23 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/02/08/reading-obscure-documentation/</guid>
      <description>&lt;p&gt;Sometimes the interfaces you need just aren&amp;rsquo;t well documented, but &lt;span style=&#34;background-color:#ffffff;&#34;&gt;thanks to the &lt;a href=&#34;http://en.wikipedia.org/wiki/Internets&#34;&gt;internets&lt;/a&gt;, some &lt;a href=&#34;http://google.com/&#34;&gt;websearches&lt;/a&gt;, and a useful &lt;a href=&#34;http://www.chiark.greenend.org.uk/ucam/chat/FAQ.0.8.html#3%2010&#34;&gt;dictionary&lt;/a&gt;, you can often decipher random web documentation jargon to help you produce useful &lt;a href=&#34;http://www.cs.mcgill.ca/~james/code/&#34;&gt;code&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&#xA;&lt;span style=&#34;background-color:#ffffff;&#34;&gt;&#xA;&lt;/span&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>getopt vs. optparse vs. argparse</title>
      <link>https://purpleidea.com/blog/2010/02/03/getopt-vs-optparse-vs-argparse/</link>
      <pubDate>Wed, 03 Feb 2010 12:25:08 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/02/03/getopt-vs-optparse-vs-argparse/</guid>
      <description>&lt;p&gt;sooner or later you&amp;rsquo;ll end up needing to do some argument parsing. the foolish end up writing their own yucky parser that ends up having a big if statement filled with things like:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;if len(sys.argv) &amp;gt; 1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;in it. don&amp;rsquo;t do this unless you have a &lt;b&gt;really&lt;/b&gt; good excuse.&lt;/p&gt;&#xA;&lt;p&gt;sooner or later, someone directs you to &lt;a href=&#34;http://docs.python.org/library/getopt.html&#34;&gt;getopt&lt;/a&gt;, and you happily continue on with buggy manual parsing thinking you&amp;rsquo;ve &amp;ldquo;&lt;i&gt;found the way&lt;/i&gt;&amp;rdquo;. useful in some circumstances, but should generally be avoided.&lt;/p&gt;</description>
    </item>
    <item>
      <title>sorting out the confusion</title>
      <link>https://purpleidea.com/blog/2010/01/27/sorting-out-the-confusion/</link>
      <pubDate>Wed, 27 Jan 2010 13:03:51 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2010/01/27/sorting-out-the-confusion/</guid>
      <description>&lt;p&gt;if i&amp;rsquo;ve been silent as of late, it&amp;rsquo;s because i&amp;rsquo;ve been furiously coding away. i&amp;rsquo;ve got what i think are some elegant implementations cooking, and with any luck my extra work will pay off in hours and days and months of time saved down the road. i&amp;rsquo;ve got a few interesting (interesting with respect to your average rating of the blog posts on this site) posts cooking in my mind, and hopefully they&amp;rsquo;ll appear shortly!&lt;/p&gt;</description>
    </item>
    <item>
      <title>piping data through ssh</title>
      <link>https://purpleidea.com/blog/2009/12/09/piping-data-through-ssh/</link>
      <pubDate>Wed, 09 Dec 2009 22:36:05 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/12/09/piping-data-through-ssh/</guid>
      <description>&lt;p&gt;not that what i&amp;rsquo;m about to tell you is brilliant, new or revolutionary, however i thought i&amp;rsquo;d mention it in case you&amp;rsquo;re not doing it. also feel free to let me know if there is a better way.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;problem:&lt;/strong&gt; i have some stdout which comes from a command and i want it in a file on another machine.&lt;/p&gt;&#xA;&lt;p&gt;i &lt;em&gt;could&lt;/em&gt; first send it to a temp file, scp that over, and then remove the temp file; but instead, i&amp;rsquo;ll just:&lt;/p&gt;</description>
    </item>
    <item>
      <title>really well written article</title>
      <link>https://purpleidea.com/blog/2009/11/16/really-well-written-article/</link>
      <pubDate>Mon, 16 Nov 2009 13:14:15 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/11/16/really-well-written-article/</guid>
      <description>&lt;p&gt;i&amp;rsquo;m sure that most (if not all) of the technically inclined readers know about this already, but since it&amp;rsquo;s such a well written article (and detailed in the right places), i felt i should bump up it&amp;rsquo;s link count.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Binary_prefix&#34;&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Binary_prefix&#34;&gt;http://en.wikipedia.org/wiki/Binary_prefix&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;as an aside, i really liked Knuth&amp;rsquo;s suggestion; in the meantime let&amp;rsquo;s use the stupid kibi&amp;rsquo;s.&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>IPVS &#43; shorewall</title>
      <link>https://purpleidea.com/blog/2009/11/05/ipvs-shorewall/</link>
      <pubDate>Thu, 05 Nov 2009 11:29:16 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/11/05/ipvs-shorewall/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.linuxvirtualserver.org/&#34;&gt;lvs&lt;/a&gt; load balancing always felt like an elusive task. here i will document how to get it working with the excellent &lt;a href=&#34;http://www.shorewall.net/&#34;&gt;shorewall&lt;/a&gt; firewall, as an extension to their &lt;a href=&#34;http://www.shorewall.net/two-interface.htm&#34;&gt;two interface&lt;/a&gt; common use case. this was all necessary for a group of grad students that needed to test out and develop some distributed algorithms. it turns out that once you get going, all this is quite easy and fun!&lt;/p&gt;&#xA;&lt;p&gt;the various components and files used for this setup include:&lt;/p&gt;</description>
    </item>
    <item>
      <title>scary man pages</title>
      <link>https://purpleidea.com/blog/2009/11/02/scary-man-pages/</link>
      <pubDate>Mon, 02 Nov 2009 23:21:57 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/11/02/scary-man-pages/</guid>
      <description>&lt;p&gt;while doing a little reading and research,  i ended up reading a bit of the hdparm man page. never in my life have i read such a scary man page. i guess it &lt;em&gt;is&lt;/em&gt; appropriate for halloween, but it came 2 days late in my case. as a result of my being so impressed with the sheer amount of warnings in the manual, i have decided to compile them here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>multi monitors and how it should all work (long babble)</title>
      <link>https://purpleidea.com/blog/2009/10/23/multi-monitors-and-how-it-should-all-work-long-babble/</link>
      <pubDate>Fri, 23 Oct 2009 21:09:13 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/10/23/multi-monitors-and-how-it-should-all-work-long-babble/</guid>
      <description>&lt;p&gt;at work i use two screens for my day to day workflow. i find it&amp;rsquo;s much more efficient for doing work, like coding. i&amp;rsquo;ll often have at least one terminal open, a full screen text editor, and usually a number of references, such as the &lt;a href=&#34;http://dbus.freedesktop.org/doc/dbus-specification.html&#34;&gt;dbus specification&lt;/a&gt; open in a &lt;a href=&#34;http://projects.gnome.org/epiphany/&#34;&gt;web browser&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;i recently just realized that one of the reasons multiple monitors are so useful to me, isn&amp;rsquo;t because of the increased screen real estate (although that certaintly is an important factor) but because of how the window manager deals with the windows. for example, when i click maximize, the chosen window expands to fill that monitors capacity, and not the entire set of monitors. it would be nice for this type of behaviour to be configurable somewhere for people with ultra large screens, who want to manage their windows better. the closest i&amp;rsquo;ve found is: &lt;a href=&#34;https://launchpad.net/winwrangler&#34;&gt;winwrangler&lt;/a&gt; which i&amp;rsquo;ve started using at home where i only have one screen. it works sort of along those lines, however i still want more. multiple &amp;ldquo;workspaces&amp;rdquo; are essential. no matter how many screens i have, i&amp;rsquo;ll always need a few workspaces to be able to flip between email and coding&amp;ndash; there is no sense in mixing it all together.&lt;/p&gt;</description>
    </item>
    <item>
      <title>tech support for a keyboard</title>
      <link>https://purpleidea.com/blog/2009/10/23/tech-support-for-a-keyboard/</link>
      <pubDate>Fri, 23 Oct 2009 13:14:43 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/10/23/tech-support-for-a-keyboard/</guid>
      <description>&lt;p&gt;so my &lt;a href=&#34;http://www.cs.mcgill.ca/&#34;&gt;boss&lt;/a&gt; was recently kind enough to purchase a new keyboard and mouse combo to attempt to relieve the elbow-and-down pain that i endure due to constant programming and mouse moving. thanks.&lt;/p&gt;&#xA;&lt;p&gt;i received my &amp;ldquo;&lt;a href=&#34;http://www.logitech.com/index.cfm/keyboards/keyboard_mice_combos/devices/4677&amp;amp;cl=US,EN&#34;&gt;logitech cordless desktop wave pro&lt;/a&gt;&amp;rdquo; today, and 15 seconds later i&amp;rsquo;m up and running in linux. the keyboard and mouse seem to be really nice, however i won&amp;rsquo;t dwell on their merits here, i&amp;rsquo;m sure you can read about that &lt;a href=&#34;http://www.aselabs.com/articles.php?id=279&#34;&gt;elsewhere&lt;/a&gt; on the internets. what i &lt;em&gt;would&lt;/em&gt; like to point out is that for some stupid reason, the keyboard only sports a battery indicator light. that&amp;rsquo;s right, NO NUM LOCK, CAPS LOCKS OR SCROLL LOCK LIGHTS. (woops, sorry didn&amp;rsquo;t realize caps was on.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>vanilla: my favourite flavour of gnome</title>
      <link>https://purpleidea.com/blog/2009/10/22/vanilla-my-favourite-flavour-of-gnome/</link>
      <pubDate>Thu, 22 Oct 2009 17:14:47 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/10/22/vanilla-my-favourite-flavour-of-gnome/</guid>
      <description>&lt;p&gt;after a recent upgrade to ubuntu 9.04, it seems that i&amp;rsquo;ve been pushed into using some &amp;ldquo;unfeatures&amp;rdquo; that i didn&amp;rsquo;t ask for. well apparently they won&amp;rsquo;t be unfeatures forever, but for me, &lt;a href=&#34;https://wiki.ubuntu.com/NotifyOSD&#34;&gt;notify-osd&lt;/a&gt; and &lt;a href=&#34;https://launchpad.net/indicator-applet&#34;&gt;indicator-applet&lt;/a&gt; aren&amp;rsquo;t quite ready for my consumption. i realize that ubuntu is trying to improve the desktop experience, but i&amp;rsquo;m going to need to wait for some more polish first.&lt;/p&gt;&#xA;&lt;p&gt;so how do i get rid of these horrible things ? i really liked the look of the notification-daemon, and i wanted it back. turns out i can do:&lt;/p&gt;</description>
    </item>
    <item>
      <title>why linux is powerful or: how to erase half your system and then fix it</title>
      <link>https://purpleidea.com/blog/2009/10/14/why-linux-is-powerful-or-how-to-erase-half-your-system-and-then-fix-it/</link>
      <pubDate>Wed, 14 Oct 2009 16:00:57 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/10/14/why-linux-is-powerful-or-how-to-erase-half-your-system-and-then-fix-it/</guid>
      <description>&lt;p&gt;after a brief bout of stupidity i quickly realized that my makefile had gone awry and was quickly eating through my filesystem.&lt;/p&gt;&#xA;&lt;p&gt;after ^C killing it, it seems i only took out most of /lib/* and /usr/sbin/* &amp;ndash; who needs those anyways&amp;hellip; apparently almost everyone.&lt;/p&gt;&#xA;&lt;p&gt;what happened next. well it turns out i was lucky and had a few shells and a webbrowser open&amp;ndash; attempts to launch new programs will fail, but existing programs are already loaded in memory so i was able to work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>the python subprocess module</title>
      <link>https://purpleidea.com/blog/2009/10/07/the-python-subprocess-module/</link>
      <pubDate>Wed, 07 Oct 2009 10:24:53 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/10/07/the-python-subprocess-module/</guid>
      <description>&lt;p&gt;i&amp;rsquo;m sure that i won&amp;rsquo;t be able to tell you anything revolutionary which can&amp;rsquo;t be found out by reading the &lt;a href=&#34;http://docs.python.org/library/subprocess.html&#34;&gt;manual&lt;/a&gt;, but i thought i would clarify it, and by showing you a specific example which i needed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;subprocess.Popen&lt;/em&gt; accepts a bunch or args, one of which is the &lt;strong&gt;shell&lt;/strong&gt; argument, which is False by default. If you specify &lt;em&gt;shell=True&lt;/em&gt; then the first argument of popen should be a &lt;strong&gt;string&lt;/strong&gt; which is what gets parsed by the shell and then eventually run. (nothing revolutionary)&lt;/p&gt;</description>
    </item>
    <item>
      <title>the power to yield a better console interface</title>
      <link>https://purpleidea.com/blog/2009/08/20/the-power-to-yield-a-better-console-interface/</link>
      <pubDate>Thu, 20 Aug 2009 13:15:51 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/08/20/the-power-to-yield-a-better-console-interface/</guid>
      <description>&lt;p&gt;as part of a different project, i needed to duplicate some existing terminal magic in python. what i needed to write was something similar to the getch() function in curses. it can be found in: ncurses*/base/lib_getch.c after doing an: apt-get source libncurses5&lt;/p&gt;&#xA;&lt;p&gt;what&amp;rsquo;s the magic? i need to stay in a continuous loop reading from the file descriptor, however i want to return periodically so that gobject doesn&amp;rsquo;t block and the interface can remain responsive. enter: yield, who comes in and saves the day. see the accompanying code for specifics.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ssh hanging</title>
      <link>https://purpleidea.com/blog/2009/07/29/ssh-hanging/</link>
      <pubDate>Wed, 29 Jul 2009 09:40:46 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/07/29/ssh-hanging/</guid>
      <description>&lt;p&gt;i&amp;rsquo;m sure everyone who has used ssh has experienced this, but couldn&amp;rsquo;t put their finger on what was happening exactly. &lt;a href=&#34;http://www.snailbook.com/faq/background-jobs.auto.html&#34;&gt;this&lt;/a&gt; article explains.&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>cheetah == fortran</title>
      <link>https://purpleidea.com/blog/2009/07/21/cheetah-fortran/</link>
      <pubDate>Tue, 21 Jul 2009 16:59:50 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/07/21/cheetah-fortran/</guid>
      <description>&lt;p&gt;turns out the &lt;a href=&#34;http://www.cheetahtemplate.org/&#34;&gt;cheetah&lt;/a&gt; python templating engine (2.0 since year 2006) is quite reminiscent of &lt;a href=&#34;http://en.wikipedia.org/wiki/Fortran&#34;&gt;fortran&lt;/a&gt; (since the 1950&amp;rsquo;s) in their use of the &lt;strong&gt;#slurp&lt;/strong&gt; directive (cheetah) and the &lt;strong&gt;$&lt;/strong&gt; string. either one, when appended to the end of a string, remove the implicit newline which usually gets printed. it took me ages to figure out how to suppress newline printing back when i did someone&amp;rsquo;s fortran homework, now i&amp;rsquo;ve had to struggle with it all over again.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[py]inotify, polling, gtk and gio</title>
      <link>https://purpleidea.com/blog/2009/07/21/pyinotify-polling-gtk-and-gio/</link>
      <pubDate>Tue, 21 Jul 2009 10:19:52 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/07/21/pyinotify-polling-gtk-and-gio/</guid>
      <description>&lt;p&gt;i have this software with a gtk mainloop, using dbus and all that fun stuff that seems to play together nicely. i know about the kernel &lt;a href=&#34;http://en.wikipedia.org/wiki/Inotify&#34;&gt;inotify&lt;/a&gt; support, and i wanted it to get integrated with that above stack. i thought i was supposed to do it with &lt;a href=&#34;http://trac.dbzteam.org/pyinotify&#34;&gt;pyinotify&lt;/a&gt; and &lt;a href=&#34;http://www.pygtk.org/pygtk2reference/gobject-functions.html#function-gobject--io-add-watch&#34;&gt;io_add_watch&lt;/a&gt;, but on closer inspection into the pyinotify code it turns out that it seems to actually use &lt;a href=&#34;http://trac.dbzteam.org/pyinotify/browser/pyinotify.py&#34;&gt;polling&lt;/a&gt;! (search for: select.poll)&lt;/p&gt;&#xA;&lt;p&gt;thinking i was confused, i emailed a friend to see if he could confirm my suspicions. we both weren&amp;rsquo;t 100% sure, a little searching later i was convinced when i found &lt;a href=&#34;http://www.tenshu.net/archives/2008/10/24/using-inotify-in-a-pygtk-application-without-pyinotify/&#34;&gt;this&lt;/a&gt; blog posting. i&amp;rsquo;m surprised i didn&amp;rsquo;t find out about this sooner. in any case, my application seems to be happy now.&lt;/p&gt;</description>
    </item>
    <item>
      <title>evanescent 0.3</title>
      <link>https://purpleidea.com/blog/2009/07/14/evanescent-03/</link>
      <pubDate>Tue, 14 Jul 2009 14:53:30 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/07/14/evanescent-03/</guid>
      <description>&lt;p&gt;new &lt;a href=&#34;http://www.cs.mcgill.ca/~james/code/&#34;&gt;evanescent&lt;/a&gt; released. get your tar balls today. now with pro dbus support, and happier than 0.2 in every way. please send in any patches and bug reports.&lt;/p&gt;&#xA;&lt;p&gt;ps: easy one line installation too!&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>logging out of $SESSION</title>
      <link>https://purpleidea.com/blog/2009/07/13/logging-out-of-session/</link>
      <pubDate>Mon, 13 Jul 2009 10:05:05 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/07/13/logging-out-of-session/</guid>
      <description>&lt;p&gt;the &lt;a href=&#34;http://www.cs.mcgill.ca/~james/code/&#34;&gt;software&lt;/a&gt; (evanescent) that i&amp;rsquo;m working on is supposed to log out the user from its current X session. originally i had some yucky looking code that ran a kill on gnome-session, which quickly got replaced with:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;os.system(&amp;#39;gnome-session-save --logout-dialog&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;i&amp;rsquo;ve decided this was still a little crufty, so i&amp;rsquo;ve recently replaced this with:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bus = dbus.SessionBus()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote_object = bus.get_object(&amp;#39;org.gnome.SessionManager&amp;#39;, &amp;#39;/org/gnome/SessionManager&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# specify the dbus_interface in each call&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote_object.Logout(0, dbus_interface=&amp;#39;org.gnome.SessionManager&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# or create an Interface wrapper for the remote object&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#iface = dbus.Interface(remote_object, &amp;#39;org.gnome.SessionManager&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#iface.Logout(0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# introspection is automatically supported&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#print remote_object.Introspect(dbus_interface=&amp;#39;org.freedesktop.DBus.Introspectable&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Logout&#34;&gt;documentation&lt;/a&gt; can be found, although it took a little digging. the only catch is that this is gnome specific, and you need different code for kde, and each other DE. thanks to &lt;a href=&#34;http://www.purinchu.net/wp/2009/06/12/oh-fun/&#34;&gt;&lt;a href=&#34;http://www.purinchu.net/wp/2009/06/12/oh-fun/&#34;&gt;http://www.purinchu.net/wp/2009/06/12/oh-fun/&lt;/a&gt;&lt;/a&gt; for the kde version of the above.&lt;/p&gt;</description>
    </item>
    <item>
      <title>convert .ai to .svg using uniconverter</title>
      <link>https://purpleidea.com/blog/2009/06/16/convert-ai-to-svg-using-uniconverter/</link>
      <pubDate>Tue, 16 Jun 2009 11:32:23 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/06/16/convert-ai-to-svg-using-uniconverter/</guid>
      <description>&lt;p&gt;needed to convert a proprietary vector .ai adobe illustrator file to the open .svg format, inkscape failed, ai2svg failed, uniconverted worked! yay. very easy just do:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;$ uniconverter Martlet.ai Martlet.svg&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>brilliant: get rid of mono</title>
      <link>https://purpleidea.com/blog/2009/06/08/brilliant-get-rid-of-mono/</link>
      <pubDate>Mon, 08 Jun 2009 14:08:14 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/06/08/brilliant-get-rid-of-mono/</guid>
      <description>&lt;p&gt;fedora announces that they&amp;rsquo;ll be replacing potentially patent encumbered mono based note taking application tomboy with the line for line port to c++ called &lt;a href=&#34;http://live.gnome.org/Gnote&#34;&gt;gnote&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p style=&#34;padding-left:30px;&#34;&gt;&lt;a href=&#34;https://www.redhat.com/archives/fedora-desktop-list/2009-June/msg00003.html&#34;&gt;https://www.redhat.com/archives/fedora-desktop-list/2009-June/msg00003.html&lt;/a&gt;&lt;/p&gt;&#xA;with any luck we&#39;ll be able to replace &lt;a href=&#34;http://f-spot.org/&#34;&gt;f-spot&lt;/a&gt;, and &lt;a href=&#34;http://banshee-project.org/&#34;&gt;banshee&lt;/a&gt; too. have a look at:&#xA;&lt;p style=&#34;padding-left:30px;&#34;&gt;&lt;a href=&#34;http://santanu-sinha.blogspot.com/2009/06/solang.html&#34;&gt;http://santanu-sinha.blogspot.com/2009/06/solang.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>coloured tab completion</title>
      <link>https://purpleidea.com/blog/2009/06/02/coloured-tab-completion/</link>
      <pubDate>Tue, 02 Jun 2009 15:06:58 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/06/02/coloured-tab-completion/</guid>
      <description>&lt;p&gt;i &amp;lt;3 tab completion, coloured grep, and coloured ls, however i would love to see &lt;strong&gt;&lt;span style=&#34;color:#000080;&#34;&gt;coloured&lt;/span&gt;&lt;/strong&gt; tab completion.&lt;/p&gt;&#xA;&lt;p&gt;what would this entail? imagine you have files: &amp;ldquo;apply&amp;rdquo;, &amp;ldquo;applied&amp;rdquo; and &amp;ldquo;applications&amp;rdquo; in a directory, and you typed: &amp;ldquo;cat ap&amp;rdquo; &amp;lt;TAB&amp;gt;, then i would expect to see: &lt;strong&gt;app&lt;span style=&#34;color:#ff0000;&#34;&gt;ly&lt;/span&gt; app&lt;span style=&#34;color:#ff0000;&#34;&gt;lied&lt;/span&gt; app&lt;span style=&#34;color:#ff0000;&#34;&gt;lications&lt;/span&gt;&lt;/strong&gt; (highlighting the rest of the words / options. or perhaps there could be a mode that just highlights the next letter that needs to be typed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>grep, shopt:dotglob and (hidden) dot files</title>
      <link>https://purpleidea.com/blog/2009/06/02/grep-shoptdotglob-and-hidden-dot-files/</link>
      <pubDate>Tue, 02 Jun 2009 11:56:08 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/06/02/grep-shoptdotglob-and-hidden-dot-files/</guid>
      <description>&lt;p&gt;i thought grep was broken, but it&amp;rsquo;s not. see below:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ echo $0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ echo &amp;#39;hello world&amp;#39; &amp;gt; .hello&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ grep &amp;#39;hello world&amp;#39; *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ grep &amp;#39;hello world&amp;#39; .*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.hello:hello world&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ shopt | grep dotglob&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dotglob            off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ shopt -s dotglob&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ shopt | grep dotglob&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dotglob            on&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ grep &amp;#39;hello world&amp;#39; *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.hello:hello world&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ shopt -u dotglob&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ shopt | grep dotglob&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dotglob            off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$ rm .hello&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;james@dazzle:~$&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;the problem as it turns out is that the glob character `*&amp;rsquo; (the asterisk) doesn&amp;rsquo;t expand to include dot files unless you have the shopt variable set. so you can either use to workaround shown above or set it. personally i&amp;rsquo;ll keep mine off.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Server Fault</title>
      <link>https://purpleidea.com/blog/2009/05/27/server-fault/</link>
      <pubDate>Wed, 27 May 2009 11:10:37 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/05/27/server-fault/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://serverfault.com/&#34;&gt;Server Fault&lt;/a&gt;, the question and answer forum for systems administrators opened their doors today to the public. It is created by the same notorious bloggers who brought you &lt;a href=&#34;http://stackoverflow.com/&#34;&gt;Stack Overflow&lt;/a&gt;, &lt;a href=&#34;http://www.joelonsoftware.com/&#34;&gt;Joel on Software&lt;/a&gt; and the &lt;a href=&#34;http://thedailywtf.com/&#34;&gt;Daily WTF&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Go have a look, ask a question, answer a question and have fun!&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>community</title>
      <link>https://purpleidea.com/blog/2009/05/27/community/</link>
      <pubDate>Wed, 27 May 2009 09:36:11 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/05/27/community/</guid>
      <description>&lt;p&gt;so the idea was to open this up to sys admins in other mcgill departments, so if we don&amp;rsquo;t know about you, drop us a &lt;a href=&#34;mailto:james@cs.mcgill.ca&#34;&gt;line&lt;/a&gt; and we&amp;rsquo;ll get you added to the blog. if people like the idea, then we&amp;rsquo;ll host this on a better cs machine than &lt;a href=&#34;http://dazzle.cs.mcgill.ca/&#34;&gt;dazzle&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>first babble</title>
      <link>https://purpleidea.com/blog/2009/05/22/hello-world/</link>
      <pubDate>Fri, 22 May 2009 16:16:04 +0000</pubDate>
      <guid>https://purpleidea.com/blog/2009/05/22/hello-world/</guid>
      <description>&lt;p&gt;hello! this blog is intended to be a place where ramblings and discoveries, by and for systems administrators and programmers can be posted and seen by many to ultimately help in the dissemination of useful findings that we wish we had been able to have read here earlier.&lt;/p&gt;&#xA;&lt;p&gt;if that didn&amp;rsquo;t make too much sense, perhaps i could rephrase it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;hire James&lt;/a&gt; and his team at &lt;a target=&#34;_blank&#34; href=&#34;https://m9rx.com/&#34;&gt;m9rx corporation&lt;/a&gt;.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://mastodon.social/@purpleidea&#34;&gt;follow James on Mastodon&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://twitter.com/intent/follow?screen_name=purpleidea&#34;&gt;follow James on Twitter&lt;/a&gt; for more frequent updates and other random thoughts.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://github.com/sponsors/purpleidea/&#34;&gt;support James on GitHub&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&#xA;&lt;br /&gt;&lt;i&gt;You can &lt;a target=&#34;_blank&#34; href=&#34;https://www.patreon.com/purpleidea&#34;&gt;support James on Patreon&lt;/a&gt; if you&#39;d like to help sustain this kind of content.&lt;/i&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dinner</title>
      <link>https://purpleidea.com/misc/dinner/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/dinner/</guid>
      <description>&lt;p&gt;This page has some more information about the annual &lt;a href=&#34;https://purpleidea.com/projects/dinner/&#34;&gt;dinner&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;statistics&#34;&gt;Statistics&lt;/h3&gt;&#xA;&lt;style&gt;&#xA;&#x9;th, td {&#xA;&#x9;&#x9;padding: 10px; /* applies 10 pixels of padding to all sides */&#xA;&#x9;}&#xA;&lt;/style&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;th&gt;Year&lt;/th&gt;&#xA;&#x9;&#x9;&lt;th&gt;Meals served&lt;/th&gt;&#xA;&#x9;&#x9;&lt;th&gt;Location&lt;/th&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2025&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;921 (565+356)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;Concordia&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2024&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;980 (550+430)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;Concordia&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2023&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;893 (584+309)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2022&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;&gt; 731 (counting stopped before the end)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2021&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;cancelled&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;N/A&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2020&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;0 (covid)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;N/A&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2019&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;1126&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2018&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;1097 (742+355)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2017&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;1035&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2016&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;899&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2015&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;1222&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2014&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;~850?&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2013&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;872 (shannon)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2012&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;852 (shannon)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;2011&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;762 (shannon)&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Ignatius of Loyola&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;?&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;?&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;Chez Mes Amis&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;1994&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;?&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;St. Columba&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&lt;td&gt;1988&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;125?&lt;/td&gt;&#xA;&#x9;&#x9;&lt;td&gt;?&lt;/td&gt;&#xA;&#x9;&lt;/tr&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;history&#34;&gt;History&lt;/h3&gt;&#xA;&lt;p&gt;In 1988, a group of individuals got together to run an annual free dinner for&#xA;anyone in need. The dinner welcomed poor, homeless, lonely, low income, or&#xA;anyone otherwise in need of a free meal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dinner</title>
      <link>https://purpleidea.com/projects/dinner/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/projects/dinner/</guid>
      <description>&lt;p&gt;Every year on December 25th, a free meal is served to the community. We welcome&#xA;poor, homeless, lonely, low income, or anyone otherwise in need of a free meal.&lt;/p&gt;&#xA;&lt;p&gt;The date coincides with christmas day, but the event is non-religious, and is&#xA;open to anyone of any faith, including agnostics and atheists.&lt;/p&gt;&#xA;&lt;p&gt;The event is run entirely by volunteers using donated time, money and food. We&#xA;typically serve a meal consisting of turkey, mashed potatoes, stuffing, cooked&#xA;vegetables, cranberry sauce, gravy, and dessert. All of the items except for the&#xA;turkey are 100% vegetarian. (We have our standard turkey gravy and a vegetarian&#xA;alternative.) We&amp;rsquo;ll typically have additional donated dishes in limited&#xA;quantities, many of which have included vegan options as well.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>DJ</title>
      <link>https://purpleidea.com/misc/dj/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/dj/</guid>
      <description>&lt;p&gt;I DJ occasionally. Mostly for fun, as I like to put on a good show. I invest&#xA;almost 100% of my performance fees into paying for show consumables (fire,&#xA;smoke, bubbles, etc&amp;hellip;) and for buying new equipment to improve the shows.&lt;/p&gt;&#xA;&lt;p&gt;I play almost entirely Old School Hip-Hop and Rap, combined with some Break&#xA;Beats and occasional slow jams.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;d like to hire me to play at your bar, club, or venue, please &lt;a href=&#34;https://purpleidea.com/contact/&#34;&gt;contact me&lt;/a&gt;.&#xA;I&amp;rsquo;m happy to play weddings, funerals, and other private events as well.&#xA;I&amp;rsquo;m happy to perform at fundraising events for non-profits at cost if I can.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Donate</title>
      <link>https://purpleidea.com/misc/donate/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/donate/</guid>
      <description>&lt;p&gt;If you like my blog, and you like my &lt;a title=&#34;code&#34; href=&#34;https://github.com/purpleidea/&#34;&gt;code&lt;/a&gt;, please leave me a &lt;a href=&#34;https://paypal.me/purpleidea&#34; target=&#34;_blank&#34;&gt;tip&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;p&gt;You can also donate money via my &lt;a href=&#34;https://www.patreon.com/purpleidea&#34;&gt;patreon&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Funds and other resources give me more time to spend on code and articles for you!&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m often in need of hardware, so if you have something you can donate or sponsor, please let me know.&lt;/p&gt;&#xA;&lt;p&gt;If your company wants to fly me somewhere to come hack on my code in your office, that could be arranged.&#xA;Maybe you need help installing it, integrating it, or adding a feature?&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to cook a turkey</title>
      <link>https://purpleidea.com/misc/how-to-cook-a-turkey/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/how-to-cook-a-turkey/</guid>
      <description>&lt;p&gt;What follows are instructions for cooking a turkey. This page is mostly intended&#xA;for folks that donate turkeys to the annual &lt;a href=&#34;https://purpleidea.com/projects/dinner/&#34;&gt;dinner&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;lets-talk-turkey&#34;&gt;&amp;ldquo;Let&amp;rsquo;s Talk Turkey&amp;rdquo;&lt;/h3&gt;&#xA;&lt;h4 id=&#34;based-on-an-article-from-gourmet-magazine-november-2005&#34;&gt;(based on an article from Gourmet Magazine, November 2005)&lt;/h4&gt;&#xA;&lt;h3 id=&#34;instructions&#34;&gt;Instructions&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;If frozen, make sure the turkey has been thawing the refrigerator for one or&#xA;two days depending on the size of the turkey. You can remove it one hour before&#xA;cooking to allow it to warm up even more.&lt;/li&gt;&#xA;&lt;li&gt;Pre-heat oven to 230 Celsius (450F).&lt;/li&gt;&#xA;&lt;li&gt;Remove feathers and quills (if any).&lt;/li&gt;&#xA;&lt;li&gt;Some turkeys will contain a bag with the neck and organs (giblets) inside the&#xA;turkey. Remove them and cook outside the turkey.&lt;/li&gt;&#xA;&lt;li&gt;Rinse turkey inside and out and pat dry.&lt;/li&gt;&#xA;&lt;li&gt;Mix salt and pepper in a small bowl and sprinkle evenly in turkey cavities&#xA;and over the skin.&lt;/li&gt;&#xA;&lt;li&gt;Put turkey on oven rack in lower third of oven.&lt;/li&gt;&#xA;&lt;li&gt;Rotate turkey 180 degrees (π radians) half-way through roasting.&lt;/li&gt;&#xA;&lt;li&gt;Use an instant-read thermometer inserted into the fleshy part of the thigh&#xA;close to (but not touching) the bone.&lt;/li&gt;&#xA;&lt;li&gt;Also test the temperature in the turkey&amp;rsquo;s breast.&lt;/li&gt;&#xA;&lt;li&gt;Check that the space where the drumstick touches the body is roasted.&#xA;Sometimes, because it&amp;rsquo;s hidden, it doesn&amp;rsquo;t roast as fast as the rest of the&#xA;bird.&lt;/li&gt;&#xA;&lt;li&gt;Temperature must register 77 Celsius (170F) for turkey to be cooked.&lt;/li&gt;&#xA;&lt;li&gt;Once out of oven let turkey stand for 30 minutes. Temperature of thigh meat&#xA;should rise to 82 Celsius (180F).&lt;/li&gt;&#xA;&lt;li&gt;They really do come out tender and juicy.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;notes&#34;&gt;Notes&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t stuff the turkey. If you do, then by the time the stuffing is at a safe&#xA;temperature to eat, the turkey will be well overcooked.&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t cover it with tented aluminum foil.&lt;/li&gt;&#xA;&lt;li&gt;All ovens are different but an 8 kg (16 pound) turkey should be done in about&#xA;75 to 90 minutes. But always check the temperature.&lt;/li&gt;&#xA;&lt;li&gt;Please make sure to &lt;strong&gt;not&lt;/strong&gt; add bacon, milk, butter, soy, or any other meats&#xA;or ingredients other than salt, pepper and vegetables. We try to make sure folks&#xA;who can&amp;rsquo;t eat those items can enjoy the turkey as well.&lt;/li&gt;&#xA;&lt;li&gt;Please do not carve the turkey. Our group of volunteers will do so on site to&#xA;make sure that all the donated turkeys are carved similarly. (So that they all&#xA;get reheated at the same rate.) You can either bring it in fresh from the oven,&#xA;or you can refrigerate it and bring it in cold. Please do not freeze it after&#xA;cooking as we won&amp;rsquo;t be able to use it.&lt;/li&gt;&#xA;&lt;li&gt;Make sure you use a meat thermometer to ensure the turkey is cooked in the&#xA;centre to a minimum of 77 degrees celsius. (170 degrees fahrenheit.)&lt;/li&gt;&#xA;&lt;li&gt;Save the turkey drippings, they help make good gravy.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;br /&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;turkey.jpg&#34;&gt;&lt;img src=&#34;https://purpleidea.com/misc/how-to-cook-a-turkey/turkey.jpg&#34; width=&#34;100%&#34; height=&#34;100%&#34;&gt;&lt;/a&gt;&#xA;&lt;/figure&gt;</description>
    </item>
    <item>
      <title>Les Garderies K.I.D.S. Infrastructure</title>
      <link>https://purpleidea.com/projects/les-garderies-kids/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/projects/les-garderies-kids/</guid>
      <description>&lt;p&gt;&lt;em&gt;Les Garderies K.I.D.S.&lt;/em&gt; is a chain of daycares in the Montreal region. I completed a&#xA;number of projects for this group. Below you can find a select list of projects,&#xA;some associated photos, and &lt;a href=&#34;#testimonials&#34;&gt;testimonials&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;video-viewing-screens&#34;&gt;Video Viewing Screens&lt;/h3&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/projects/les-garderies-kids/viewscreen1.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/projects/les-garderies-kids/viewscreen1.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;One of the video viewing screens.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;p&gt;Daycare staff needed access to live video streams of different areas of the&#xA;daycares so that they can keep watch of everything going on. For this I&#xA;installed a number of PoE cameras alongside custom video viewing screens which&#xA;were placed around the daycares.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mentoring Program</title>
      <link>https://purpleidea.com/misc/mentoring-program/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/mentoring-program/</guid>
      <description>&lt;p&gt;I run a very small mentoring program. The format has been evolving over time.&#xA;The program is intended to be very difficult, but fulfilling. Some information&#xA;about the program can be found on this page.&lt;/p&gt;&#xA;&lt;p&gt;I currently offer two streams, each with a different specialization:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;em&gt;Stream A&lt;/em&gt;: Software Engineering &amp;amp; Programming&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;em&gt;Stream B&lt;/em&gt;: Systems Administration &amp;amp; DevOps&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I started this program because I was disappointed with the quality of many new&#xA;hackers these days, and in particular the shift away from strong basic skills. I&#xA;wanted to give something back in return for everyone who helped point me in the&#xA;right direction over the years.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mentoring Program</title>
      <link>https://purpleidea.com/projects/mentoring-program/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/projects/mentoring-program/</guid>
      <description>&lt;p&gt;Some time ago, I started a small mentoring program, to help interested learners&#xA;improve their computer skills. I&amp;rsquo;ve taken on a small number of participants to&#xA;keep quality high, and I think I&amp;rsquo;ve had some great results. Here are some of&#xA;their testimonials.&lt;/p&gt;&#xA;&lt;h3 id=&#34;testimonials&#34;&gt;Testimonials&lt;/h3&gt;&#xA;&#xA;&lt;blockquote&gt;When I decided to get back into IT after more than half a decade away from the field, I was in dire need of some direction and James came to the rescue. Within a week I was becoming proficient in Go and getting experience designing elegant solutions to real world problems. James was an extremely effective mentor, technically and professionally. At the end of the program I secured a fantastic job at a consulting firm, and have been very happy there for nearly two years.&#xA;&lt;br /&gt;&#xA;&lt;br /&gt;&#xA;&lt;span style=&#34;float: right;&#34;&gt;– Jonathan&lt;/span&gt;&lt;/blockquote&gt;&#xA;&lt;br /&gt;&#xA;&#xA;&#xA;&lt;blockquote&gt;I have been participating in the mentorship program for about a year. I joined the mentorship program to improve my knowledge of systems programming and open source development. Purpleidea (My mentor) has been very helpful in facilitating my learning. The program uses a hands-off approach that allows for the necessary struggling to develop problem solving and self-learning skills. I would recommend this to anyone interested in open source development, Golang or systems programming.&#xA;&lt;br /&gt;&#xA;&lt;br /&gt;&#xA;&lt;span style=&#34;float: right;&#34;&gt;– Donald&lt;/span&gt;&lt;/blockquote&gt;&#xA;&lt;br /&gt;&#xA;&#xA;&#xA;&lt;blockquote&gt;James introduced me to the world of GNU&amp;#43;Linux and has guided me through learning its ins and outs. Ever since, I truly can&amp;#39;t imagine going back to proprietary operating systems. Through hacking with him, he has helped me learn the best practices of free / open source development, which is an invaluable skill that can be hard to learn all alone.&#xA;&lt;br /&gt;&#xA;&lt;br /&gt;&#xA;&lt;span style=&#34;float: right;&#34;&gt;– Adam&lt;/span&gt;&lt;/blockquote&gt;&#xA;&lt;br /&gt;&#xA;&#xA;&#xA;&lt;blockquote&gt;James is a great mentor since on top of being knowledgable he is also able to effectively understand the skills that you can improve on and guide you towards the goal of becoming a better hacker based on your current skill level. He also has the ability to know when to give hints and when not to give hints which enriched my learning experience under him. I was happy to have him as a mentor since I could see my skills in Golang and Git increase significantly. He is also a fun person to hack with so the more you can meet with him the better.&#xA;&lt;br /&gt;&#xA;&lt;br /&gt;&#xA;&lt;span style=&#34;float: right;&#34;&gt;– Raunak&lt;/span&gt;&lt;/blockquote&gt;&#xA;&lt;br /&gt;&#xA;&#xA;&lt;h3 id=&#34;more-information&#34;&gt;More Information&lt;/h3&gt;&#xA;&lt;p&gt;More information about the program is &lt;a href=&#34;https://purpleidea.com/misc/mentoring-program/&#34;&gt;available here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mgmt Config</title>
      <link>https://purpleidea.com/projects/mgmt-config/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/projects/mgmt-config/</guid>
      <description>&lt;p&gt;After having spent well over five years using and writing&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Puppet_(software)&#34;&gt;Puppet&lt;/a&gt;, I decided that I had&#xA;some designs for a next generation automation tool. This eventually became what&#xA;is now known as &lt;a href=&#34;https://github.com/purpleidea/mgmt/&#34;&gt;&lt;code&gt;Mgmt Config&lt;/code&gt; or &lt;code&gt;mgmt&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/projects/mgmt-config/graph8.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/projects/mgmt-config/graph8.png&#34;  width=&#34;50%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mgmt runs as a distributed system.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;p&gt;The project has a number of novel features, including an event-based execution&#xA;engine, a reactive domain specific language (DSL) and the ability to execute in&#xA;parallel. A cluster of &lt;code&gt;mgmt&lt;/code&gt; agents can self-coordinate and run as a&#xA;distributed system using the &lt;a href=&#34;https://en.wikipedia.org/wiki/Raft_(computer_science)&#34;&gt;&lt;code&gt;raft&lt;/code&gt;&lt;/a&gt;&#xA;consensus algorithm.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Open Technical Problems</title>
      <link>https://purpleidea.com/misc/open-technical-problems/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/open-technical-problems/</guid>
      <description>&lt;p&gt;What follows is my personal list of what I&amp;rsquo;ve decided to call &amp;ldquo;Open Technical&#xA;Problems&amp;rdquo;. Each of these items is a description of an open technical problem&#xA;that I think would be really excellent to have solved. I believe all of these&#xA;could be reasonably easy to solve if someone has the time, money, and will to do&#xA;so.&lt;/p&gt;&#xA;&lt;p&gt;If you are working on any of these ideas, of if one is solved, please&#xA;&lt;a href=&#34;https://purpleidea.com/contact/&#34;&gt;let me know&lt;/a&gt;!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pendeli&#39;s Pizza Cote-St-Luc</title>
      <link>https://purpleidea.com/misc/pendelis-pizza-cote-st-luc/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/pendelis-pizza-cote-st-luc/</guid>
      <description>&lt;p&gt;Their telephone operator usually sounds very unhappy, but their pizza is fairly good.&#xA;Ask them not to burn it! I recommend the &amp;ldquo;cheese and tomato&amp;rdquo;, aka plain.&#xA;Tell them &lt;em&gt;The Technical Blog of James&lt;/em&gt; sent you.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the most recent menu:&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&gt;&lt;a href=&#34;pendelis-2.png&#34;&gt;&lt;img src=&#34;https://purpleidea.com/misc/pendelis-pizza-cote-st-luc/pendelis-2.png&#34; width=&#34;100%&#34; height=&#34;100%&#34;&gt;&lt;/a&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;br /&gt;&#xA;&lt;figure&gt;&lt;a href=&#34;pendelis-1.png&#34;&gt;&lt;img src=&#34;https://purpleidea.com/misc/pendelis-pizza-cote-st-luc/pendelis-1.png&#34; width=&#34;100%&#34; height=&#34;100%&#34;&gt;&lt;/a&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;I posted this because there&amp;rsquo;s no menu to be found online.&lt;/p&gt;&#xA;&lt;p&gt;Happy Hacking!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Seymour Smith - Dorothy</title>
      <link>https://purpleidea.com/misc/seymour-smith-dorothy/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/seymour-smith-dorothy/</guid>
      <description>&lt;p&gt;My favourite piece of piano music is called&#xA;&amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Dorothy&#34;&gt;&lt;em&gt;Dorothy&lt;/em&gt;&lt;/a&gt;&amp;rdquo; by &amp;ldquo;&lt;em&gt;Seymour Smith&lt;/em&gt;&amp;rdquo;. My&#xA;grandmother &lt;a href=&#34;#footnotes%5B1%5D&#34;&gt;[1]&lt;/a&gt; used to play it to me when I was young. When&#xA;she died, I asked if I could keep the piano music.&lt;/p&gt;&#xA;&lt;p&gt;If you know anything about Seymour Smith, have a copy of any of his sheet music,&#xA;or would like to send me a recording of &lt;em&gt;Dorothy&lt;/em&gt; of any of his other music,&#xA;please &lt;a href=&#34;https://purpleidea.com/contact/&#34;&gt;contact&lt;/a&gt; me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Technical CAPTCHA</title>
      <link>https://purpleidea.com/misc/the-technical-captcha/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/the-technical-captcha/</guid>
      <description>&lt;p&gt;This was intended to be a &lt;a href=&#34;https://en.wikipedia.org/wiki/CAPTCHA&#34;&gt;CAPTCHA&lt;/a&gt; for recruiters.&lt;/p&gt;&#xA;&lt;h4 id=&#34;the-captcha&#34;&gt;&lt;strong&gt;The CAPTCHA&lt;/strong&gt;&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Comment or write a question on one of my &lt;a href=&#34;https://purpleidea.com/blog/&#34;&gt;technical articles&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://purpleidea.com/contact/&#34;&gt;Contact me&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;If your comment was good, you&amp;rsquo;ll get a reply back!&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;It need not be long, but you do get points for &lt;em&gt;cleverness&lt;/em&gt; if it asks an interesting question, or makes light of a fun corner case that I haven&amp;rsquo;t covered.&#xA;The &lt;em&gt;clever&lt;/em&gt; part about this, is that you get to think of it as a way of quizzing me, and I get to engage with people whose interest is technology.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wisdom</title>
      <link>https://purpleidea.com/misc/wisdom/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/misc/wisdom/</guid>
      <description>&lt;blockquote&gt;An ideal language allows us to express easily what is useful for the programming task, and at the same time makes it difficult to write what leads to incomprehensible or incorrect programs.&#xA;&lt;br /&gt;&#xA;&lt;br /&gt;&#xA;&lt;span style=&#34;float: right;&#34;&gt;– Nico Habermann&lt;/span&gt;&lt;/blockquote&gt;&#xA;&lt;br /&gt;</description>
    </item>
    <item>
      <title>yesiscan</title>
      <link>https://purpleidea.com/projects/yesiscan/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://purpleidea.com/projects/yesiscan/</guid>
      <description>&lt;p&gt;&lt;strong&gt;yesiscan&lt;/strong&gt; is a tool for performing automated license scanning. It takes many&#xA;forms of user input, then runs a bunch of different analysis tools in parallel,&#xA;and finally produces a customizable report which can easily be shared with your&#xA;team. It has been designed to make license analysis simple for users, and easy&#xA;to manage and configure for centralized legal teams.&lt;/p&gt;&#xA;&lt;table style=&#34;text-align:center; width:80%; margin:0 auto;&#34;&gt;&lt;tr&gt;&lt;td&gt;&#xA;&lt;a href=&#34;https://purpleidea.com/projects/yesiscan/yesiscan-web.png&#34;&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;https://purpleidea.com/projects/yesiscan/yesiscan-web.png&#34;  width=&#34;100%&#34; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;yesiscan has a friendly web ui.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/br /&gt;&#xA;&#xA;&lt;p&gt;It can be used via a CLI, web ui, http API, or even imported as a library and&#xA;built into your existing software.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
