<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blog posts on Mark Holloway</title>
    <link>http://localhost:1313/blog/</link>
    <description>Recent content in Blog posts on Mark Holloway</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>© Mark Holloway</copyright>
    <lastBuildDate>Tue, 20 Jan 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://localhost:1313/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Quick testing with Terraform without a backend</title>
      <link>http://localhost:1313/blog/2026/01/20/quick-testing-with-terraform-without-a-backend/</link>
      <pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2026/01/20/quick-testing-with-terraform-without-a-backend/</guid>
      <description>&lt;p&gt;When working with complex Terraform expressions, such as string manipulation&#xA;using regular expressions, it is often useful to &lt;strong&gt;test them in isolation&lt;/strong&gt;&#xA;without needing to connect to a remote backend or authenticate with a cloud&#xA;provider.&lt;/p&gt;&#xA;&lt;h2 id=&#34;isolated-testing-using-a-plan&#34;&gt;Isolated testing using a plan&lt;/h2&gt;&#xA;&lt;p&gt;To test an expression, you can create a temporary configuration file, for&#xA;example &lt;code&gt;/tmp/tf-test/main.tf&lt;/code&gt;, with your variables and outputs:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-terraform&#34; data-lang=&#34;terraform&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;variable&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;test_inputs&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;default&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;CompanyEvent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTPSEvent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;URLParser&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;APIKeyEvent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ShipmentEvent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This pattern might not produce the desired snake_case output&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;output&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;current_pattern&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;test_inputs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;_&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;regexall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;[A-Z][a-z]*&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This pattern uses a lookahead-like approach to match Go&amp;#39;s convention&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;output&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;fixed_pattern&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;test_inputs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/([a-z])([A-Z])/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;You can then initialize &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://developer.hashicorp.com/terraform&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Terraform&lt;/a&gt;&#xA;(or &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://opentofu.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;OpenTofu&lt;/a&gt; while explicitly skipping the backend&#xA;configuration. This allows you to run a plan and inspect the results&#xA;immediately.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploying hidden dotfiles to GitHub Pages</title>
      <link>http://localhost:1313/blog/2025/12/30/deploying-hidden-dotfiles-to-github-pages/</link>
      <pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2025/12/30/deploying-hidden-dotfiles-to-github-pages/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re using GitHub Pages with the official&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/actions/upload-pages-artifact&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;code&gt;actions/upload-pages-artifact&lt;/code&gt;&lt;/a&gt;&#xA;action and need to serve files from a file/folder prefixed with a period (&lt;code&gt;.&lt;/code&gt;)&#xA;sign, like the &lt;code&gt;.well-known&lt;/code&gt; directory (e.g., for a custom Bluesky handle),&#xA;you&amp;rsquo;ll hit a problem: &lt;strong&gt;v4 of the action excludes all dotfiles by default&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go&#39;s secret weapon: the standard library interfaces</title>
      <link>http://localhost:1313/blog/2025/12/28/gos-secret-weapon-the-standard-library-interfaces/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2025/12/28/gos-secret-weapon-the-standard-library-interfaces/</guid>
      <description>&lt;p&gt;Go is peculiar in the sense that there&amp;rsquo;s a very tight social contract between&#xA;the community and the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://pkg.go.dev/std&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;standard library&lt;/a&gt;. Seemingly&#xA;universally, the community agrees to use these specific, small interfaces, as&#xA;glue between unrelated libraries. In fact, I think there&amp;rsquo;s even an expectation&#xA;that implementations should, whenever possible, snap nicely together with&#xA;standard library interfaces, like LEGO bricks.&lt;/p&gt;&#xA;&lt;p&gt;I think that at least one enabler to this community culture stems from Go&amp;rsquo;s&#xA;implicit interface design and the distinct level of composability that comes out&#xA;of it. In languages with explicit implementation (like Java or C#), you have to&#xA;plan to implement an interface. In Go, you can implement &lt;code&gt;io.Writer&lt;/code&gt; by accident&#xA;just by having a &lt;code&gt;Write([]byte) (int, error)&lt;/code&gt; method.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The &#34;new&#34; function changes in Go 1.26</title>
      <link>http://localhost:1313/blog/2025/12/26/the-new-function-changes-in-go-1.26/</link>
      <pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2025/12/26/the-new-function-changes-in-go-1.26/</guid>
      <description>&lt;p&gt;Here is how you can create a pointer to a boolean in&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://go.dev/doc/go1.26&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go 1.26&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// New way in Go 1.26&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;This is equivalent to the older, more verbose method:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Holiday update</title>
      <link>http://localhost:1313/blog/2025/12/23/holiday-update/</link>
      <pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2025/12/23/holiday-update/</guid>
      <description>&lt;p&gt;Inbetween eggnog and christmas carols, I figured I&amp;rsquo;d bring a short update about&#xA;things that have been on my mind that I wish to share before the new year.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;llms&#34;&gt;LLMs&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://deepmind.google/models/gemini/pro/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gemini 3 Pro Preview&lt;/a&gt; was released,&#xA;but I prefer &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.anthropic.com/news/claude-opus-4-5&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Opus 4.5&lt;/a&gt;&#xA;in &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://claude.com/product/claude-code&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; over Gemini for&#xA;anything coding related, most of the time. Claude is more consistent in my&#xA;opinion. Recently, with Opus, I do hit the rate limits &lt;em&gt;much&lt;/em&gt; faster with my&#xA;$20/month Claude Pro plan and sometimes fall back to Gemini 3. Apart from MCPs,&#xA;I&amp;rsquo;ve also started to rely more and more on skills, which I heard&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://simonwillison.net/2025/Dec/12/openai-skills/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;OpenAI is adopting too&lt;/a&gt;.&#xA;But for everything else, it&amp;rsquo;s Gemini 3 all the way. I&amp;rsquo;m even using it to plan an&#xA;upcoming Japan trip. I wonder if&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://deepmind.google/models/gemini/flash/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gemini 3 Flash&lt;/a&gt; will beat Claude&#xA;in coding tasks (it kind of&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://news.ycombinator.com/item?id=46301851&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;sounds like some people are very impressed&lt;/a&gt;)?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hello Hugo</title>
      <link>http://localhost:1313/blog/2025/12/22/hello-hugo/</link>
      <pubDate>Mon, 22 Dec 2025 10:00:00 +0100</pubDate>
      <guid>http://localhost:1313/blog/2025/12/22/hello-hugo/</guid>
      <description>&lt;h1 id=&#34;hello-hugo&#34;&gt;Hello Hugo&lt;/h1&gt;&#xA;&lt;p&gt;This is a &lt;strong&gt;short ingress&lt;/strong&gt; to test the new Hugo setup. We are migrating from&#xA;MkDocs to Hugo to have more control and a minimalist &amp;ldquo;terminal&amp;rdquo; aesthetic.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-body&#34;&gt;The Body&lt;/h2&gt;&#xA;&lt;p&gt;Here is some regular text body. We are testing various markdown features to&#xA;ensure the theme handles them correctly.&lt;/p&gt;&#xA;&lt;h3 id=&#34;code-block&#34;&gt;Code Block&lt;/h3&gt;&#xA;&lt;p&gt;Here is a static Python code snippet:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;hello_world&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello, Hugo!&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;hello_world&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;interactive-code-block&#34;&gt;Interactive Code Block&lt;/h3&gt;&#xA;&lt;p&gt;Now here&amp;rsquo;s an &lt;strong&gt;interactive&lt;/strong&gt; Python code snippet using Codapi. Click &amp;ldquo;Run&amp;rdquo; to&#xA;execute it in your browser!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gemini 2.5, MCP servers and Neovim v0.11.0</title>
      <link>http://localhost:1313/blog/2025/03/29/gemini-2.5-mcp-servers-and-neovim-v0.11.0/</link>
      <pubDate>Sat, 29 Mar 2025 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2025/03/29/gemini-2.5-mcp-servers-and-neovim-v0.11.0/</guid>
      <description>&lt;p&gt;Spring is coming, and the sun has been out a lot more. This weekend I’m meeting&#xA;up with childhood friends, without the logistics and responsibilities which&#xA;normally is part of my daily family life with young kids. I think sometimes&#xA;young adults, or just people who doesn’t have kids, would think I’m&#xA;exaggerating. I’m a simple man (and it&amp;rsquo;s fine if you call me &amp;ldquo;old&amp;rdquo; 😅) but I’m&#xA;&lt;em&gt;really&lt;/em&gt; looking forward to sipping on some newly brewed coffee outdoors and in&#xA;the sun, having adult conversations around - not work, not responsibilities, not&#xA;logistics - but what comes into mind, in the moment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claude Code, Go tool and Dependabot updates</title>
      <link>http://localhost:1313/blog/2025/03/01/claude-code-go-tool-and-dependabot-updates/</link>
      <pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2025/03/01/claude-code-go-tool-and-dependabot-updates/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;I &lt;em&gt;did&lt;/em&gt; end up dusting off my gravelbike and biked to work twice this week,&#xA;which translates into biking 11 km in ~35 minutes x2 (roundtrip). It ended up&#xA;taking the same time as commuting by bus/tram and was a great opportunity to&#xA;not only get excercise but to also listen in to some interesting Podcasts.&lt;/li&gt;&#xA;&lt;li&gt;I&amp;rsquo;m so happy about the&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.razer.com/ap-en/mobile-controllers/razer-kishi-ultra&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Razer Kishi Ultra&lt;/a&gt;&#xA;in combination with my &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.apple.com/ipad-mini/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;iPad Mini (USB-C)&lt;/a&gt;.&#xA;It&amp;rsquo;s the best hand-held experience when combined with&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://apps.apple.com/us/app/pxplay-remote-streaming/id1638586503&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PXPlay&lt;/a&gt;&#xA;(since it can map the touchbar button). Currently hooked on the somewhat weird&#xA;but fun &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Persona_5&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Persona 5&lt;/a&gt;. It&amp;rsquo;s got a&#xA;pretty neat&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://open.spotify.com/album/4pJT0WKggr4xk149X8A6KC?si=Fo6HN7KYTQ6Yfndw-6ymxw&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;soundtrack&lt;/a&gt;&#xA;for an RPG too!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://news.ycombinator.com/best&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hacker News | best&lt;/a&gt; - a hidden &amp;ldquo;best&amp;rdquo;&#xA;filter, which is for some reason invisible from the navigation unless you&#xA;visit that specific URL. For those of you who want a digest of the most&#xA;upvoted/commented on topics throughout the last couple of days (not sure&#xA;exactly what the algorithm is like).&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt;&#xA;was released next to the Sonnet 3.7 model. It looks similar to&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/Aider-AI/aider&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Aider&lt;/a&gt; but feels more polished. I really&#xA;like these TUI LLM tools as it complements my workflow really well, which is&#xA;centralized around working in the terminal. The big thing Aider has going for&#xA;it is supporting a wide variety of LLMs, including local models.&lt;/li&gt;&#xA;&lt;li&gt;Dependabot now supports&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/dependabot/dependabot-core/issues/390&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Docker compose files&lt;/a&gt;&#xA;and&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/dependabot/dependabot-core/issues/10478&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Python &lt;code&gt;uv.lock&lt;/code&gt; files&lt;/a&gt;&#xA;(requires enabling the feature flag &lt;code&gt;enable-beta-ecosystems: true&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.bitecode.dev/p/a-year-of-uv-pros-cons-and-should&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;All the reasons why Python&amp;rsquo;s &lt;code&gt;uv&lt;/code&gt; is the better choice&lt;/a&gt; -&#xA;in case you need help convincing anyone.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.alexedwards.net/blog/assets/how-to-manage-tool-dependencies-in-go-1.24-plus&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Alex Edwards&amp;rsquo; post on &lt;code&gt;go tool&lt;/code&gt;&lt;/a&gt; -&#xA;now that Go 1.24 is out, this could potentially be the definitive guide to&#xA;&lt;code&gt;go tool&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://gopherconeurope.substack.com/p/release-notes-v20246&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GopherCon Europe&amp;rsquo;s YouTube videos&lt;/a&gt;&#xA;are up, and the next conference is happening in Berlin, 16-19 July.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/yutkat/my-neovim-pluginlist/blob/main/go.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;yutkat&amp;rsquo;s Neovim plugins list for Go development&lt;/a&gt;&#xA;contains some interesting workflow enhancers. I already use&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/maxandron/goplements.nvim&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;maxandron/goplements&lt;/a&gt; but here&#xA;I found&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/edte/blink-go-import.nvim&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;edte/blink-go-import.nvim&lt;/a&gt;&#xA;which I was unaware of!&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/godoc.nvim&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;godoc.nvim&lt;/a&gt; now has support for&#xA;adapters, which means it could potentially support other languages/things you&#xA;want to use a picker with.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/dotfiles/blob/main/shell/bin/dependabot-fix&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;dependabot-fix&lt;/a&gt; -&#xA;a shell script I wrote this week which helps looping over all failing&#xA;dependabot PRs in a given repo and apply the command and commit necessary to&#xA;fix it.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/dotfiles/blob/main/shell/bin/go-mod-tidy&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;go-mod-tidy&lt;/a&gt; -&#xA;a small shell script which recursively runs &lt;code&gt;go mod tidy&lt;/code&gt; from you current&#xA;working directory. Great for monorepos and nested Go projects.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Gemini, Go Meetup and new Neovim tools dropped</title>
      <link>http://localhost:1313/blog/2025/02/22/gemini-go-meetup-and-new-neovim-tools-dropped/</link>
      <pubDate>Sat, 22 Feb 2025 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2025/02/22/gemini-go-meetup-and-new-neovim-tools-dropped/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;I&amp;rsquo;m fortunate to work at &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://einride.tech&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;a company&lt;/a&gt; which allows the&#xA;use of AI, and in this case Google Gemini Advanced. It&amp;rsquo;s really, really fast&#xA;but I still feel Claude (Sonnet 3.5) is a lot more accurate and has better&#xA;overall taste. But it&amp;rsquo;s still extremely helpful to have &amp;ldquo;AI chat&amp;rdquo; at your&#xA;disposal. A colleague of mine took a third-party API spec and asked Gemini to&#xA;write the Go types for it for him. Awesome!&lt;/li&gt;&#xA;&lt;li&gt;This week was the most sunny in Gothenburg since, I don&amp;rsquo;t even know when.&#xA;Toying with the idea to start commuting to work by bike.&lt;/li&gt;&#xA;&lt;li&gt;It was so fun and uplifting to be speaking at the latest&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.meetup.com/sweden-go-west/events/305475640/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go Meetup&lt;/a&gt; here in&#xA;Gothenburg. Let&amp;rsquo;s keep this momentum up!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://gitingest.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;gitingest&lt;/a&gt; - essentially replace the &lt;code&gt;github.com&lt;/code&gt; in&#xA;repository URLs with &lt;code&gt;gitingest.com&lt;/code&gt; and download the whole repo as one&#xA;structured text file that you can upload to AI chat of your choice. If the&#xA;text file becomes to large for &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://claude.ai&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude&lt;/a&gt; Sonnet 3.5 (my&#xA;favorite pair-programming LLM), try &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://gemini.google.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gemini&lt;/a&gt;,&#xA;which has support for a larger context window.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/jesseduffield/lazydocker&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;code&gt;lazydocker&lt;/code&gt;&lt;/a&gt; - I Use &lt;code&gt;lazygit&lt;/code&gt;&#xA;extensively and I recently saw there&amp;rsquo;s also this project with a very similar&#xA;UI that you can use to manage your containers. I have been using Podman&amp;rsquo;s GUI&#xA;dashboard as it gives a great overview of containers, images, volumes etc, but&#xA;I appreciate not having to leave the terminal. And with lazydocker, you get&#xA;even better overview IMHO.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/pr.nvim&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;pr.nvim&lt;/a&gt; - I was missing the&#xA;capability to quickly get to the pull request associated with the line under&#xA;the cursor. So I wrote this tool!&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/godoc.nvim&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;godoc.nvim&lt;/a&gt; - I wrote a small&#xA;tool for reading Go documentation from within Neovim.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/folke/snacks.nvim/blob/main/docs/image.md&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;snacks.nvim&amp;rsquo;s image&lt;/a&gt; -&#xA;Folke is at it again, and as part of his endevour to serve us the buffet that&#xA;is &lt;code&gt;snacks.nvim&lt;/code&gt;, you can now enable the &amp;ldquo;image&amp;rdquo; feature, which will show&#xA;images in Neovim. I use it to show images from markdown files primarily. It&amp;rsquo;s&#xA;absolutely awesome. Note that it requires a terminal with support for the&#xA;kitty graphics protocol. I had to also make sure to have ImageMagick&#xA;installed.&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/dotfiles/blob/main/shell/bin/git-remove-branches&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;code&gt;git-remove-branches&lt;/code&gt;&lt;/a&gt; -&#xA;a shell script I wrote to finally get control of all stale local (and remote)&#xA;branches. Put it on &lt;code&gt;$PATH&lt;/code&gt; and run!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;details&gt;&#xA;&lt;summary&gt;Example output of git-remove-branches&lt;/summary&gt;&#xA;&lt;p&gt;Here I&amp;rsquo;m running &lt;code&gt;git-remove-branches&lt;/code&gt; for the first time in a git repo:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Starting a blog series</title>
      <link>http://localhost:1313/blog/2025/02/21/starting-a-blog-series/</link>
      <pubDate>Fri, 21 Feb 2025 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2025/02/21/starting-a-blog-series/</guid>
      <description>&lt;p&gt;Thorsten Ball has a great blog series called &amp;ldquo;Joy and Curiosity&amp;rdquo; over at&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://registerspill.thorstenball.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Register Spill&lt;/a&gt; which celebrates the&#xA;interesting and joyful parts of the week that passed by. I initially heard about&#xA;this on the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://cupogo.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cup o&amp;rsquo; Go podcast&lt;/a&gt; and his ideas resonates&#xA;incredibly well on how I have come to view life as a software engineer.&lt;/p&gt;&#xA;&lt;p&gt;I really encourage you to listen in to that Cup o&amp;rsquo; Go&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://cupogo.dev/episodes/supply-chain-attacks-ghetto-logs-and-rust-ai-cold-takes-with-thorsten-ball&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;episode&lt;/a&gt;,&#xA;where Thorsten speaks his mind, not only on his very based and nuanced view on&#xA;AI or Rust vs Go, but also on generally sharing joy and positiveness throughout&#xA;this blog series of his.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Solving severe stuttering during Remote Play sessions</title>
      <link>http://localhost:1313/blog/2024/12/28/solving-severe-stuttering-during-remote-play-sessions/</link>
      <pubDate>Sat, 28 Dec 2024 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2024/12/28/solving-severe-stuttering-during-remote-play-sessions/</guid>
      <description>&lt;h2 id=&#34;tv-network-pings&#34;&gt;TV network pings&lt;/h2&gt;&#xA;&lt;p&gt;There are situations where the TV loses a packet every 20-30 pings. On each&#xA;packet loss, Remote Play hangs for a second.&lt;/p&gt;&#xA;&lt;p&gt;Disconnecting the HDMI cable between the TV and the PS5 is a workaround for the&#xA;problem. This prevents any potential interference between the TV&amp;rsquo;s HDMI-CEC&#xA;control signals and the PS5&amp;rsquo;s network communication.&lt;/p&gt;&#xA;&lt;p&gt;On Sony BRAVIA TVs, you can permanently fix this issue by enabling the &amp;ldquo;Simple&#xA;IP Protocol&amp;rdquo; under network settings. The Simple IP Protocol reduces network&#xA;complexity and overhead by using a more basic communication method, which helps&#xA;minimize packet loss and network latency between the TV and the console. This&#xA;does come at a cost, which is higher energy consumption.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ghostty on macOS</title>
      <link>http://localhost:1313/blog/2024/12/04/ghostty-on-macos/</link>
      <pubDate>Wed, 04 Dec 2024 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2024/12/04/ghostty-on-macos/</guid>
      <description>&lt;p&gt;I got private beta access (quite late), and&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://mitchellh.com/ghostty&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Ghostty&lt;/a&gt; is probably going to be out in its&#xA;first public release any day now (update: it was released on 2024-12-26). Here&#xA;are my initial impressions, having used it for a couple of weeks on macOS.&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Amendments 2025-01-02&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;This post has been amended with the following details since it was&#xA;originally posted:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Native per-project tools in Go 1.24</title>
      <link>http://localhost:1313/blog/2024/12/02/native-per-project-tools-in-go-1.24/</link>
      <pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2024/12/02/native-per-project-tools-in-go-1.24/</guid>
      <description>&lt;p&gt;There are&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/golang/go/issues/48429#issuecomment-2499281711&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;some exciting news&lt;/a&gt;&#xA;in the Go community as of recently on how to manage tools in Go projects. With&#xA;the next release of Go (&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://tip.golang.org/doc/go1.24&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go 1.24&lt;/a&gt;, expected&#xA;to be released in February 2025), it seems we&amp;rsquo;ll finally have a way to natively&#xA;define per-project tools! 🎉&lt;/p&gt;</description>
    </item>
    <item>
      <title>Session management in Wezterm (without tmux)</title>
      <link>http://localhost:1313/blog/2024/10/20/session-management-in-wezterm-without-tmux/</link>
      <pubDate>Sun, 20 Oct 2024 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2024/10/20/session-management-in-wezterm-without-tmux/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/neovim/neovim&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Neovim&lt;/a&gt; as my daily&#xA;IDE/editor for a bit more than a year now. I&amp;rsquo;ve also been using&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/tmux/tmux&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;tmux&lt;/a&gt; to manage sessions, first using&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/joshmedeski/t-smart-tmux-session-manager&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;t-smart-tmux-session-manager&lt;/a&gt;&#xA;and later &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/joshmedeski/sesh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;sesh&lt;/a&gt;, which supersedes the&#xA;former project. What&amp;rsquo;s great about this is that it doesn&amp;rsquo;t matter which terminal&#xA;emulator you use, you can still fall back to this kind of session management.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHub Pages and Google</title>
      <link>http://localhost:1313/blog/2024/08/24/github-pages-and-google/</link>
      <pubDate>Sat, 24 Aug 2024 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2024/08/24/github-pages-and-google/</guid>
      <description>&lt;p&gt;Turns out that if you publish a blog (like I do) on&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://pages.github.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub pages&lt;/a&gt;, and you want the site to be indexed&#xA;by Google, it&amp;rsquo;s not so easy.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m not sure entirely what the root cause is, but you have to manually add your&#xA;site in the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://search.google.com/search-console&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Google Search Console&lt;/a&gt;&#xA;and then manually add each URL individually for indexing.&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/orgs/community/discussions/50379&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;This discussion&lt;/a&gt; outlines&#xA;the problem perfectly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Export repo data from GitHub organization</title>
      <link>http://localhost:1313/blog/2023/09/01/export-repo-data-from-github-organization/</link>
      <pubDate>Fri, 01 Sep 2023 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2023/09/01/export-repo-data-from-github-organization/</guid>
      <description>&lt;p&gt;This is a quickie, using the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://cli.github.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub CLI&lt;/a&gt; and optionally some Python.&lt;/p&gt;&#xA;&lt;p&gt;Replace &lt;code&gt;YOUR_ORG&lt;/code&gt; with your organization and export all your organization&amp;rsquo;s repo data to &lt;code&gt;repos.json&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh api &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-GitHub-Api-Version: 2022-11-28&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        /orgs/YOUR_ORG/repos &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        --paginate &amp;gt; repos.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;details&gt;&#xA;&lt;summary&gt;Expand to see what data is exported&lt;/summary&gt;&#xA;&lt;p&gt;At the time of writing this post, this is the kind of data which will be exported from the organization&amp;rsquo;s repo(s):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Decoupling the ORM class from the data model class</title>
      <link>http://localhost:1313/blog/2023/07/02/decoupling-the-orm-class-from-the-data-model-class/</link>
      <pubDate>Sun, 02 Jul 2023 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2023/07/02/decoupling-the-orm-class-from-the-data-model-class/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m working on a rather large project where we would want to replace a &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;WSGI&lt;/a&gt; ORM with an &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Asynchronous_Server_Gateway_Interface&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ASGI&lt;/a&gt; ORM, but it&amp;rsquo;s tangled up into everything and ORM queries are executed from all over the business logic. If the ORM would&amp;rsquo;ve been decoupled from the objects tossed around in the business logic, it would&amp;rsquo;ve been much easier to replace the ORM.&lt;/p&gt;&#xA;&lt;p&gt;This blog post outlines an example of how this can be done with &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/pydantic/pydantic&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Pydantic&lt;/a&gt;. I&amp;rsquo;m also including a &amp;ldquo;bonus section&amp;rdquo; on decoupling the data store communication from the business logic with some inspiration of the &amp;ldquo;Repository pattern&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Access Python dict using dot notation</title>
      <link>http://localhost:1313/blog/2023/06/21/access-python-dict-using-dot-notation/</link>
      <pubDate>Wed, 21 Jun 2023 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2023/06/21/access-python-dict-using-dot-notation/</guid>
      <description>&lt;p&gt;Recently, an addition to Python 3.12 might be reverted in &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/python/cpython/pull/105948&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;cpython#105948&lt;/a&gt;, where a new &lt;code&gt;json.AttrDict&lt;/code&gt; class could enable accessing a dict using dot notation using a &lt;code&gt;json.load&lt;/code&gt; hook.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building Python wheels targeting different interpreter versions</title>
      <link>http://localhost:1313/blog/2023/06/02/building-python-wheels-targeting-different-interpreter-versions/</link>
      <pubDate>Fri, 02 Jun 2023 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2023/06/02/building-python-wheels-targeting-different-interpreter-versions/</guid>
      <description>&lt;p&gt;This is a short post on how you can publish wheels onto &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://pypi.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PyPi&lt;/a&gt;, using &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://hatch.pypa.io/latest/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hatchling&amp;rsquo;s&lt;/a&gt; custom metadata hook, that seamlessly targets different Python interpreter versions.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s say you want to distribute some generated contents, which is intended to be consumed by the same Python interpreter version which generated the contents. This could be solved in a few different ways, but here I&amp;rsquo;ve opted to use a matrix of Python versions in CI. For each Python version, I generate the desired content and then I build the wheel, using some custom hatchling hooks. The end result is a wheel (per Python version) that can only be installed by that same Python version.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google Calendar notes</title>
      <link>http://localhost:1313/blog/2023/04/02/google-calendar-notes/</link>
      <pubDate>Sun, 02 Apr 2023 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2023/04/02/google-calendar-notes/</guid>
      <description>&lt;h2 id=&#34;mobile-sync-with-apple-calendar&#34;&gt;Mobile sync with Apple Calendar&lt;/h2&gt;&#xA;&lt;p&gt;Most of the time when adding a new calendar to Google Calendar, and you don&amp;rsquo;t see it showing up on your Apple calendar (iOS/iPadOS/macOS), the reason might be that the calendar is not selected for &amp;ldquo;syncing&amp;rdquo;. Visit &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://calendar.google.com/calendar/syncselect&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;this&lt;/a&gt; arcane page to fix it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;webcal-urls-doesnt-sync-events&#34;&gt;Webcal URLs doesn&amp;rsquo;t sync events&lt;/h2&gt;&#xA;&lt;p&gt;If you want to subscribe to a calendar which URL starts with &lt;code&gt;webcal://&lt;/code&gt; and you notice it won&amp;rsquo;t sync, try replacing &lt;code&gt;webcal://&lt;/code&gt; with &lt;code&gt;https://&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using GitHub merge queue to ease the Dependabot churn</title>
      <link>http://localhost:1313/blog/2023/03/29/using-github-merge-queue-to-ease-the-dependabot-churn/</link>
      <pubDate>Wed, 29 Mar 2023 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2023/03/29/using-github-merge-queue-to-ease-the-dependabot-churn/</guid>
      <description>&lt;p&gt;Good morning, project!&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gh pr list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1626  chore(deps-dev): bump black from 23.1.0 t...  dependabot/pip/black-23.3.0                  about 7 hours ago&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1625  chore(deps-dev): bump types-requests from...  dependabot/pip/types-requests-2.28.11.17     about 7 hours ago&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1624  chore(deps-dev): bump mkdocs-include-mark...  dependabot/pip/mkdocs-include-markdown-p...  about 7 hours ago&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1623  chore(deps-dev): bump types-redis from 4....  dependabot/pip/types-redis-4.5.3.1           about 7 hours ago&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1622  chore(deps-dev): bump pre-commit from 3.1...  dependabot/pip/pre-commit-3.2.1              about 7 hours ago&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1621  chore(deps-dev): bump types-deprecated fr...  dependabot/pip/types-deprecated-1.2.9.2      about 7 hours ago&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1620  chore(deps-dev): bump types-python-dateut...  dependabot/pip/types-python-dateutil-2.8...  about 7 hours ago&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1619  chore(deps-dev): bump types-redis from 4....  dependabot/pip/types-redis-4.5.3.0           about 7 hours ago&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#1618  chore(deps-dev): bump moto from 4.1.4 to ...  dependabot/pip/moto-4.1.6                    about 7 hours ago&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;-Spits out coffee-&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker notes</title>
      <link>http://localhost:1313/blog/2022/12/18/docker-notes/</link>
      <pubDate>Sun, 18 Dec 2022 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/12/18/docker-notes/</guid>
      <description>&lt;h2 id=&#34;ssh-access&#34;&gt;SSH access&lt;/h2&gt;&#xA;&lt;p&gt;Make your SSH keys visible to the SSH agent:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-add -K&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# macOS&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-add --apple-use-keychain&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Verify your keys are visible to the SSH agent:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Load variables from .env file into current environment</title>
      <link>http://localhost:1313/blog/2022/12/18/load-variables-from-.env-file-into-current-environment/</link>
      <pubDate>Sun, 18 Dec 2022 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/12/18/load-variables-from-.env-file-into-current-environment/</guid>
      <description>&lt;p&gt;Load an .env file into the environment prior to running something which requires the environment variables:&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Contents of the &lt;code&gt;.env&lt;/code&gt; file&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-env&#34; data-lang=&#34;env&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MY_SUPER_SECRET_TOKEN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt; .env&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; +a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;You can now use the variables from the &lt;code&gt;.env&lt;/code&gt; file in scripts:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Datadog and custom tracing</title>
      <link>http://localhost:1313/blog/2022/12/17/datadog-and-custom-tracing/</link>
      <pubDate>Sat, 17 Dec 2022 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/12/17/datadog-and-custom-tracing/</guid>
      <description>&lt;p&gt;When using &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://datadog.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Datadog&lt;/a&gt; for monitoring, Datadog will only record a trace if there is an incoming request.&lt;/p&gt;&#xA;&lt;p&gt;If there is no incoming request, such as if a cronjob is running, then Datadog will not record a trace and you might not be alerted by an error.&lt;/p&gt;&#xA;&lt;p&gt;To solve this, you can use the &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/DataDog/dd-trace-py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;ddtrace-py&lt;/a&gt; library and create a custom trace/span whenever tag and tag a span with exception information. This will effectively make it possible to track errors in APM error tracking.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git notes</title>
      <link>http://localhost:1313/blog/2022/12/17/git-notes/</link>
      <pubDate>Sat, 17 Dec 2022 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/12/17/git-notes/</guid>
      <description>&lt;h2 id=&#34;sane-git-pull-configuration&#34;&gt;Sane &lt;code&gt;git pull&lt;/code&gt; configuration&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;code&gt;git pull&lt;/code&gt; command is a shorthand for &lt;code&gt;git fetch&lt;/code&gt; followed by &lt;code&gt;git merge&lt;/code&gt;. I like to avoid getting local merge commits on &lt;code&gt;git pull&lt;/code&gt;. Therefore I&amp;rsquo;ve add the following to my &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;pull&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;ff&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; only&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;This will cause &lt;code&gt;git pull&lt;/code&gt; to only do a fast-forward merge, which is what I want 99% of the time. It&amp;rsquo;s the same as running &lt;code&gt;git pull --ff-only&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHub Actions notes</title>
      <link>http://localhost:1313/blog/2022/12/17/github-actions-notes/</link>
      <pubDate>Sat, 17 Dec 2022 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/12/17/github-actions-notes/</guid>
      <description>&lt;h2 id=&#34;no-double-quotes&#34;&gt;No double quotes&lt;/h2&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-warning markdown-alert-warning&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Warning&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;Never use double quotes inside &lt;code&gt;${{ ... }}&lt;/code&gt; as it is simply not supported.&lt;/p&gt;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;tertiary&#34;&gt;Tertiary&lt;/h2&gt;&#xA;&lt;p&gt;GHA has a really funky tertiary: &lt;code&gt;${{ x &amp;amp;&amp;amp; &#39;ifTrue&#39; || &#39;ifFalse&#39; }}&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;This only works if &lt;code&gt;&amp;lt;ifTrue&amp;gt;&lt;/code&gt; isn&amp;rsquo;t the empty string. If &lt;code&gt;&amp;lt;ifTrue&amp;gt; == &#39;&#39;&lt;/code&gt; then &lt;code&gt;&#39;&#39;&lt;/code&gt; is considered as &lt;code&gt;false&lt;/code&gt;, which then evaluates the right hand side of the &lt;code&gt;||&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Graphite notes</title>
      <link>http://localhost:1313/blog/2022/12/17/graphite-notes/</link>
      <pubDate>Sat, 17 Dec 2022 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/12/17/graphite-notes/</guid>
      <description>&lt;h2 id=&#34;combos&#34;&gt;Combos&lt;/h2&gt;&#xA;&lt;h3 id=&#34;pull-down-default-branch-remove-merged-branches&#34;&gt;Pull down default branch, remove merged branches&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gt repo sync -fr&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Add &lt;code&gt;gt ss&lt;/code&gt; to restack all current stacks onto the newly pulled down default branch:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Postgres notes</title>
      <link>http://localhost:1313/blog/2022/12/17/postgres-notes/</link>
      <pubDate>Sat, 17 Dec 2022 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/12/17/postgres-notes/</guid>
      <description>&lt;h2 id=&#34;good-practice-when-running-sql-query-in-prod&#34;&gt;Good practice when running SQL query in prod&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Have a rollback strategy&#xA;&lt;ul&gt;&#xA;&lt;li&gt;For example, create a query which creates a temporary table which holds a list of ids so that this list can later be used to “roll back” changes made to other tables.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Run both the main query and the rollback query in staging first&lt;/li&gt;&#xA;&lt;li&gt;Run the queries with a transaction without commit first, to see that it completes without errors (&lt;code&gt;BEGIN;&lt;/code&gt; without &lt;code&gt;COMMIT;&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;repo-with-various-orm--raw-sql-queries&#34;&gt;Repo with various ORM / raw SQL queries&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/postgres-playground&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;fredrikaverpil/postgres-playground: A personal PostgreSQL playground (github.com)&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python notes</title>
      <link>http://localhost:1313/blog/2022/12/17/python-notes/</link>
      <pubDate>Sat, 17 Dec 2022 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/12/17/python-notes/</guid>
      <description>&lt;h2 id=&#34;exceptions&#34;&gt;Exceptions&lt;/h2&gt;&#xA;&lt;h3 id=&#34;custom-exception&#34;&gt;Custom exception&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;fm&#34;&gt;__init__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;super&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;__init__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;was-something-raised&#34;&gt;Was something raised?&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;exception_was_raised&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exc_info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;exception-hooks&#34;&gt;Exception hooks&lt;/h3&gt;&#xA;&lt;p&gt;You can register&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://docs.python.org/3/library/sys.html#sys.excepthook&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;custom exception hooks&lt;/a&gt;,&#xA;which can run code whenever an exception is raised, and just before the script&#xA;will exit.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Developing with Apple Silicon</title>
      <link>http://localhost:1313/blog/2021/12/17/developing-with-apple-silicon/</link>
      <pubDate>Fri, 17 Dec 2021 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2021/12/17/developing-with-apple-silicon/</guid>
      <description>&lt;p&gt;In software development, certain software were not designed to run on the ARM-based Apple Silicon. Thankfully, there are workarounds to install and run the Intel version of these applications. Like for the rest of this blog, this post aims to serve as a personal notebook and also for sharing this knowledge.&lt;/p&gt;&#xA;&lt;p&gt;When I started looking into solutions to my Macbook Pro M1 challenges, a huge chunk was solved when I had read &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://twitter.com/EVNikonova&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Ekaterina Nikonova&lt;/a&gt;&amp;rsquo;s excellent blog post on &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;http://sixty-north.com/blog/assets/pyenv-apple-silicon.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python virtual environments with pyenv on Apple Silicon&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Poetry system-wide</title>
      <link>http://localhost:1313/blog/2021/11/13/installing-poetry-system-wide/</link>
      <pubDate>Sat, 13 Nov 2021 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2021/11/13/installing-poetry-system-wide/</guid>
      <description>&lt;p&gt;I recently got some feedback (thank you &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/simmel&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;@simmel&lt;/a&gt;, much appreciated!) on a previous post on &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;../2021-04-17-debugging-poetry/&#34;&gt;debugging Poetry&lt;/a&gt;. I then realized it was a bit hard to follow if all you wanted to do was to install Poetry globally, with some added control from the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://python-poetry.org/docs/#installation&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;default installation method&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Debugging Poetry with Visual Studio Code</title>
      <link>http://localhost:1313/blog/2021/04/17/debugging-poetry-with-visual-studio-code/</link>
      <pubDate>Sat, 17 Apr 2021 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2021/04/17/debugging-poetry-with-visual-studio-code/</guid>
      <description>&lt;p&gt;A guide on how to set up debugging of &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://python-poetry.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Poetry&lt;/a&gt; in &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://code.visualstudio.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Visual Studio Code&lt;/a&gt;, using &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/pipxproject/pipx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Pipx&lt;/a&gt; and &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/pyenv/pyenv&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Pyenv&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Encoding UUIDs with base62</title>
      <link>http://localhost:1313/blog/2021/01/08/encoding-uuids-with-base62/</link>
      <pubDate>Fri, 08 Jan 2021 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2021/01/08/encoding-uuids-with-base62/</guid>
      <description>&lt;p&gt;This was just a fun experiment.&lt;/p&gt;&#xA;&lt;h2 id=&#34;base62-vs-base64&#34;&gt;Base62 vs base64&lt;/h2&gt;&#xA;&lt;p&gt;In the very common &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Base64&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;base64&lt;/a&gt; encoding scheme, 64 characters are used for binary-to-text encoding:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Sometimes, the &lt;code&gt;+&lt;/code&gt; and &lt;code&gt;/&lt;/code&gt; characters can be undesired in the encoded string. An example could be a base64-encoded &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Universally_unique_identifier&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;universally unique id&lt;/a&gt; to be used in a URL.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Visual Studio Code remote development with Windows 10</title>
      <link>http://localhost:1313/blog/2019/05/27/visual-studio-code-remote-development-with-windows-10/</link>
      <pubDate>Mon, 27 May 2019 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2019/05/27/visual-studio-code-remote-development-with-windows-10/</guid>
      <description>&lt;p&gt;Basically, how to set this up.&lt;/p&gt;&#xA;&lt;h2 id=&#34;remote-development-over-ssh&#34;&gt;Remote development over SSH&lt;/h2&gt;&#xA;&lt;p&gt;First make sure the following commands are executed from &lt;code&gt;C:\System32\OpenSSH&lt;/code&gt;: &lt;code&gt;ssh&lt;/code&gt;, &lt;code&gt;ssh-keygen&lt;/code&gt;, &lt;code&gt;scp&lt;/code&gt;. If they are located in e.g. Chocolatey&amp;rsquo;s bin folder, keys will be searched for in weird places. This can be verifed by installing &lt;code&gt;which&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;choco install which&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which ssh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;create-key-pair-in-windows-10-client&#34;&gt;Create key pair in Windows 10 client&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ~&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir .ssh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ssh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t rsa -b &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RSA is the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://security.stackexchange.com/questions/5096/rsa-vs-dsa-for-ssh-authentication-keys&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;recommended&lt;/a&gt; authentication security.&lt;/li&gt;&#xA;&lt;li&gt;The -b flag instructs &lt;code&gt;ssh-keygen&lt;/code&gt; to increase the number of bits used to generate the key pair, and is suggested for additional security.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;prepare-server&#34;&gt;Prepare server&lt;/h3&gt;&#xA;&lt;p&gt;I am using a CentOS 7 server.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building Windows Terminal</title>
      <link>http://localhost:1313/blog/2019/05/12/building-windows-terminal/</link>
      <pubDate>Sun, 12 May 2019 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2019/05/12/building-windows-terminal/</guid>
      <description>&lt;p&gt;The new Windows Terminal (codenamed &amp;ldquo;Cascadia&amp;rdquo;) was &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.youtube.com/watch?v=8gw0rXPMMPE&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;revealed&lt;/a&gt; at this year&amp;rsquo;s &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.microsoft.com/en-us/build&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Microsoft Build conference&lt;/a&gt; and quickly received a lot of attention, as it addresses the decades-old terminal experience in Windows.&lt;/p&gt;&#xA;&lt;p&gt;This is me jotting down notes on how to get up and running with the new Terminal before it gets officially released in the Windows store, using Visual Studio 2019. This is all possible thanks to the fact that Microsoft is &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/microsoft/Terminal&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;open sourcing the new Terminal&lt;/a&gt;!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Open source licenses</title>
      <link>http://localhost:1313/blog/2019/02/04/open-source-licenses/</link>
      <pubDate>Mon, 04 Feb 2019 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2019/02/04/open-source-licenses/</guid>
      <description>&lt;p&gt;In &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.pythonpodcast.com/software-licenses-for-developers-episode-196/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;episode 196 of the (Python) Podcast.&lt;strong&gt;init&lt;/strong&gt;&lt;/a&gt; a very commonly discussed topic among open source programmers is covered, which I wanted to share here.&lt;/p&gt;&#xA;&lt;p&gt;The big takeaway is that just because you put your code publicly visible online, it doesn&amp;rsquo;t mean that it&amp;rsquo;s &amp;ldquo;free&amp;rdquo; for anyone to use. At least not until you slap a license on top of it, and depending on what your goals are with putting the code publicly visible, you may want to choose the license carefully.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Control Docker containers from within container</title>
      <link>http://localhost:1313/blog/2018/12/14/control-docker-containers-from-within-container/</link>
      <pubDate>Fri, 14 Dec 2018 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/12/14/control-docker-containers-from-within-container/</guid>
      <description>&lt;p&gt;This is a short note on how to make a container access and control another container on the same host. The trick is to have the &amp;ldquo;controller&amp;rdquo; container map the host&amp;rsquo;s &lt;code&gt;docker.sock&lt;/code&gt; into the container.&lt;/p&gt;&#xA;&lt;p&gt;On the host, query the uid and gid of the user which is executing containers:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ id fredrik&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;uid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1026&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;fredrik&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;gid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;100&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;users&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;groups&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;100&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;users&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;,10&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;wheel&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The &lt;code&gt;Dockerfile&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nuke gizmos to groups</title>
      <link>http://localhost:1313/blog/2018/06/25/nuke-gizmos-to-groups/</link>
      <pubDate>Mon, 25 Jun 2018 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/06/25/nuke-gizmos-to-groups/</guid>
      <description>&lt;p&gt;Recursively replace all gizmos in Nuke script with a group. The only exception is the &lt;code&gt;Cryptomatte&lt;/code&gt; nodes, which will be maintained as gizmos.&lt;/p&gt;&#xA;&lt;p&gt;Copy-paste the below code into the Nuke script editor and run.&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;uuid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;nuke&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;is_gizmo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Return True if given node is a gizmo (and not allowed gizmo type)&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;allowed_gizmo_classes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Cryptomatte&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;knob&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;knobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;gizmo&amp;#39;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;knob&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;allowed_gizmo_classes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_gizmo_names&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Return the fullName attribute for all gizmos in script&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;gizmos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;all_nodes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nuke&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allNodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;recurseGroups&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;all_nodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;gizmos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fullName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;node&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;all_nodes&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is_gizmo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmos&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;deselect_all_nodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;De-select all nodes&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nuke&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allNodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;recurseGroups&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;knob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;selected&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;convert_gizmo_to_group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gizmo_full_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Convert given gizmo (gizmo.fullName) to group&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nuke&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toNode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gizmo_full_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;inputs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maximumInputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;inputs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;inputs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;original_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;knob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;xpos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xpos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ypos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ypos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;uid_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;uuid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uuid4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;knob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;uid_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;deselect_all_nodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;knob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;selected&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;new_group&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;makeGroup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;deselect_all_nodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;nuke&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gizmo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;new_group&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;knob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;original_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;new_group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;xpos&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xpos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;new_group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;ypos&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ypos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new_group&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maximumInputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;new_group&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setInput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;new_group&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connectInput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Main script&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Store the current selection&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;current_selection&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nuke&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;selectedNodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_gizmo_names&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;gizmo_full_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_gizmo_names&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;convert_gizmo_to_group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gizmo_full_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Converted &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gizmo_full_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Restore original selection&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current_selection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;selected&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Distributing Python script(s) as zip file</title>
      <link>http://localhost:1313/blog/2018/06/07/distributing-python-scripts-as-zip-file/</link>
      <pubDate>Thu, 07 Jun 2018 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/06/07/distributing-python-scripts-as-zip-file/</guid>
      <description>&lt;p&gt;A recent discussion on &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://3dpro.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;3DPRO&lt;/a&gt; sparked me to scribble down some ideas on how to somewhat painlessly distribute a Python package to be run in DCC applications such as Maya or Nuke as simply as possible. So this is an alternative to building a wheel and mucking around with virtual environments.&lt;/p&gt;&#xA;&lt;p&gt;You can make Python import your modules or packages even when zipped. Example, where &lt;code&gt;b&lt;/code&gt; is our package and &lt;code&gt;c.py&lt;/code&gt; is our actual program we want to run:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google Hangouts Chat incoming webhook using Python standard library only</title>
      <link>http://localhost:1313/blog/2018/06/06/google-hangouts-chat-incoming-webhook-using-python-standard-library-only/</link>
      <pubDate>Wed, 06 Jun 2018 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/06/06/google-hangouts-chat-incoming-webhook-using-python-standard-library-only/</guid>
      <description>&lt;p&gt;The &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://developers.google.com/hangouts/chat/quickstart/incoming-bot-python&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;official docs on setting up an incoming webhook&lt;/a&gt; uses the third-party &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/httplib2/httplib2&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;httplib2&lt;/a&gt;, which is not part of the Python 3.6 standard library. Here&amp;rsquo;s a quick snippet using only the standard library instead:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cartesian product in Python</title>
      <link>http://localhost:1313/blog/2018/04/18/cartesian-product-in-python/</link>
      <pubDate>Wed, 18 Apr 2018 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/04/18/cartesian-product-in-python/</guid>
      <description>&lt;p&gt;A &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cartesian_product&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;cartesian product&lt;/a&gt; operation can return a set of &amp;ldquo;combinations&amp;rdquo; based on given values.&lt;/p&gt;&#xA;&lt;p&gt;For example I could have the following values:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;a&lt;/th&gt;&#xA;          &lt;th&gt;b&lt;/th&gt;&#xA;          &lt;th&gt;c&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;2&lt;/td&gt;&#xA;          &lt;td&gt;2&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;3&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;I would then expect the cartesian product operation to return something like &lt;code&gt;a1b1c1, a1b1c2, a1b1c3, a1b2c1&lt;/code&gt; and so on&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Many, many times have had to solve this problem over and over in Python&amp;hellip; it&amp;rsquo;s time to jot down some notes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Switching between Docker and VirtualBox on Windows 10</title>
      <link>http://localhost:1313/blog/2018/03/15/switching-between-docker-and-virtualbox-on-windows-10/</link>
      <pubDate>Thu, 15 Mar 2018 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/03/15/switching-between-docker-and-virtualbox-on-windows-10/</guid>
      <description>&lt;p&gt;As outlined &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://stackoverflow.com/a/40261418/2448495&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here&lt;/a&gt;, Docker for Windows requires Hyper-V. This needs to be disabled before you can run VirtualBox.&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Run from elevated prompt (admin privileges)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;bcdedit&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;set &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hypervisorlaunchtype&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;off&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;And to start using Docker for Windows again, re-enable Hyper-V:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Official PySide2 wheels!</title>
      <link>http://localhost:1313/blog/2018/03/09/official-pyside2-wheels/</link>
      <pubDate>Fri, 09 Mar 2018 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/03/09/official-pyside2-wheels/</guid>
      <description>&lt;p&gt;The Qt Company has released official and pip-installable PySide2 wheel&#xA;snapshots!&lt;/p&gt;&#xA;&lt;p&gt;Simo posted the&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://lists.qt-project.org/pipermail/pyside/2018-March/002537.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;details&lt;/a&gt;&#xA;today on the PySide mailing list, but in a nutshell:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install --index-url&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;https://download.qt.io/snapshots/ci/pyside/5.9/latest/ pyside2 --trusted-host download.qt.io&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Update 2018-04-05&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;official docs are now also online at&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://doc-snapshots.qt.io/qtforpython/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://doc-snapshots.qt.io/qtforpython/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Standalone PySide2 wheels</title>
      <link>http://localhost:1313/blog/2018/02/20/standalone-pyside2-wheels/</link>
      <pubDate>Tue, 20 Feb 2018 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/02/20/standalone-pyside2-wheels/</guid>
      <description>&lt;p&gt;The Qt Company has yet to release official, standalone and pip-installable&#xA;PySide2 wheels. However, since they made it possible to build standalone wheels&#xA;successfully, I&amp;rsquo;m now building such unofficial, standalone wheels here using&#xA;free CI services (thanks &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://travis-ci.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Travis&lt;/a&gt; and&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.appveyor.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;AppVeyor&lt;/a&gt;!):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/pyside2-windows&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;fredrikaverpil/pyside2-windows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/pyside2-macos&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;fredrikaverpil/pyside2-macos&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/pyside2-linux&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;fredrikaverpil/pyside2-linux&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Update 2018-03-09&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;The Qt Company now offers official and standalone wheels, read more&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;../2018-03-09-official-pyside2-wheels/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dates and databases with Python</title>
      <link>http://localhost:1313/blog/2017/11/30/dates-and-databases-with-python/</link>
      <pubDate>Thu, 30 Nov 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/11/30/dates-and-databases-with-python/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s a bit tricky to deal with dates, timezones and daylight savings when you need to store dates in e.g. a database for later reading.&lt;/p&gt;&#xA;&lt;p&gt;To me, it&amp;rsquo;s a bit perplexing that all tools required to deal with this &lt;em&gt;doesn&amp;rsquo;t&lt;/em&gt; come with the Python standard library (meaning; batteries are not included). Instead we need to use three different modules: &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://docs.python.org/3/library/datetime.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;datetime&lt;/a&gt;, &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://pytz.sourceforge.net&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pytz&lt;/a&gt; and &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/regebro/tzlocal&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;tzlocal&lt;/a&gt; where the two latter ones are not part of the standard library and must be installed separately via e.g. &lt;code&gt;pip&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Querying the FPS preference in Maya</title>
      <link>http://localhost:1313/blog/2017/11/17/querying-the-fps-preference-in-maya/</link>
      <pubDate>Fri, 17 Nov 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/11/17/querying-the-fps-preference-in-maya/</guid>
      <description>&lt;p&gt;This tickles the funny bone.&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;maya.mel&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;mel&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;eval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;float $fps = `currentTimeUnitToFPS`&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;24.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Let me know in the comments below if this can be improved&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Maya 2018 file size bug</title>
      <link>http://localhost:1313/blog/2017/11/16/maya-2018-file-size-bug/</link>
      <pubDate>Thu, 16 Nov 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/11/16/maya-2018-file-size-bug/</guid>
      <description>&lt;p&gt;A very &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://forums.autodesk.com/t5/maya-forum/maya-2018-error-opening-large-mb-files-over-2gb/td-p/7466095&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;annoying bug&lt;/a&gt; came to light in mid-October which makes Maya 2018 binary scene files (*.mb) unreadable if they are larger than ~2 GB in size.&lt;/p&gt;&#xA;&lt;p&gt;To be exact, the bug is hit when the file size is larger than &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/2,147,483,647&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;2147483647&lt;/a&gt; bytes, the maximum positive value for a 32-bit signed binary integer.&lt;/p&gt;&#xA;&lt;p&gt;A workaround is to instead save your scenes in Maya ASCII format (*.ma), since they are not affected by this bug. Or perhaps restructure your binary scenes into using references, so that the data is split up among several scene files and won&amp;rsquo;t reach the problematic file size.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contributing to PySide2</title>
      <link>http://localhost:1313/blog/2017/09/30/contributing-to-pyside2/</link>
      <pubDate>Sat, 30 Sep 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/09/30/contributing-to-pyside2/</guid>
      <description>&lt;p&gt;This is reminder-to-self about how to get set up and contribute to PySide2 using Gerrit. It could also be a fun read &amp;ldquo;on the bus&amp;rdquo; before actually setting this up yourself, to get an overview on what&amp;rsquo;s required to get up and running with Gerrit.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: I discourage you to blindly follow these &lt;em&gt;highly personal&lt;/em&gt; notes without reading through the official docs when you actually get set up yourself. Anything can be changed in the official docs at any time, which isn&amp;rsquo;t reflected here. The point of this post is just to make a note-to-self and offer a &amp;ldquo;bigger picture&amp;rdquo; before actually digging in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Qt.py on conda-forge</title>
      <link>http://localhost:1313/blog/2017/08/29/qt.py-on-conda-forge/</link>
      <pubDate>Tue, 29 Aug 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/08/29/qt.py-on-conda-forge/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/mottosso/Qt.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Qt.py&lt;/a&gt; is now available on conda-forge!&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Enable conda-forge&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;conda config --add channels conda-forge&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create environment with Python 3.6, PySide2 and Qt.py&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;conda create --mkdir --prefix ~/condaenvs/myenv &lt;span class=&#34;nv&#34;&gt;python&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;3.6 pyside2 qt.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Run Python&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/condaenvs/myenv/bin/python --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Run pip&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/condaenvs/myenv/bin/pip --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>PySide2 easy install!</title>
      <link>http://localhost:1313/blog/2017/08/28/pyside2-easy-install/</link>
      <pubDate>Mon, 28 Aug 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/08/28/pyside2-easy-install/</guid>
      <description>&lt;p&gt;Yesterday, &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/jschueller&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;@jschueller&lt;/a&gt; added &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/conda-forge/pyside2-feedstock&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;code&gt;pyside2-feedstock&lt;/code&gt;&lt;/a&gt; to &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://conda-forge.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;conda-forge&lt;/a&gt;. This means we can now &lt;em&gt;finally&lt;/em&gt; install PySide2 &lt;strong&gt;easily&lt;/strong&gt; in Python 2.7, 3.5 and 3.6 on Windows, Linux and macOS using conda.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An alternative to building PySide2 from source</title>
      <link>http://localhost:1313/blog/2017/06/30/an-alternative-to-building-pyside2-from-source/</link>
      <pubDate>Fri, 30 Jun 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/06/30/an-alternative-to-building-pyside2-from-source/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve received questions lately on the issues that people are having while attempting to build PySide2 on Windows, macOS and Linux. Instead of building PySide2, there&amp;rsquo;s actually a workaround which works just as well for some people&amp;hellip;&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Update 2017-08-28&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;PySide2 can now be installed with &lt;code&gt;conda&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Find missing libs with repoquery</title>
      <link>http://localhost:1313/blog/2017/06/28/find-missing-libs-with-repoquery/</link>
      <pubDate>Wed, 28 Jun 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/06/28/find-missing-libs-with-repoquery/</guid>
      <description>&lt;p&gt;Not sure how I didn&amp;rsquo;t learn about this until today. Anyways, if you end up with missing libs on CentOS/RedHat, use &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://yum.baseurl.org/wiki/RepoQuery&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;repoquery&lt;/a&gt; to find missing libs.&lt;/p&gt;&#xA;&lt;p&gt;For example, I had an issue today where docker required &lt;code&gt;libltdl.so.7&lt;/code&gt; but this wasn&amp;rsquo;t installed.&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;repoquery -q -f */libltdl.so.*&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;The above is quering (&lt;code&gt;-q&lt;/code&gt;) for files (&lt;code&gt;-f&lt;/code&gt;) matching the pattern (&lt;code&gt;*/libltdl.so*&lt;/code&gt;). The first star is important since the query is looking for matches against the full paths of the files within the RPMs stored on the various YUM repos your system is aware of.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Async and await with subprocesses</title>
      <link>http://localhost:1313/blog/2017/06/20/async-and-await-with-subprocesses/</link>
      <pubDate>Tue, 20 Jun 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/06/20/async-and-await-with-subprocesses/</guid>
      <description>&lt;p&gt;A boilerplate which can be used on Windows and Linux/macOS in order to asynchronously run subprocesses. This requres Python 3.6.&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Update 2019-06-28&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;Fixed a problem where the loop got closed prematurely, added better progress messages, tested on Python 3.7.3.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Querying Render Setup in Maya 2017</title>
      <link>http://localhost:1313/blog/2017/05/07/querying-render-setup-in-maya-2017/</link>
      <pubDate>Sun, 07 May 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/05/07/querying-render-setup-in-maya-2017/</guid>
      <description>&lt;p&gt;It seems Autodesk did not create a Render Setup documentation. This is me collecting code snippets and exploring Python functions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;mel-code-snippets&#34;&gt;MEL code snippets&lt;/h2&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Return render layer names without the &amp;#34;rs_&amp;#34; prefix&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$renderLayerNames = `renderSetup -q -renderLayers`;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h2 id=&#34;python-code-snippets&#34;&gt;Python code snippets&lt;/h2&gt;&#xA;&lt;h3 id=&#34;render-layer-names&#34;&gt;Render layer names&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;maya.cmds&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;cmds&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Return render layer names without the &amp;#34;rs_&amp;#34; prefix&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;render_layer_names&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmds&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;renderSetup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;renderLayers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;render-layer-names-and-their-renderability&#34;&gt;Render layer names and their renderability&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;maya.app.renderSetup.model.renderSetup&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;renderSetup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;render_setup&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;renderSetup&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;render_layers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;render_setup&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getRenderLayers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;render_layer&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;render_layers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;render_layer_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;render_layer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Without &amp;#34;rs_&amp;#34; prefix&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;is_renderable&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;render_layer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isRenderable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;render_layer_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is_renderable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h2 id=&#34;exploring-render-setup&#34;&gt;Exploring Render Setup&lt;/h2&gt;&#xA;&lt;p&gt;If you run the following, you&amp;rsquo;re going to get all the callable attributes of &lt;code&gt;render_setup&lt;/code&gt; (such as strings, methods etc):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vendoring Qt.py</title>
      <link>http://localhost:1313/blog/2017/05/04/vendoring-qt.py/</link>
      <pubDate>Thu, 04 May 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/05/04/vendoring-qt.py/</guid>
      <description>&lt;p&gt;How do you know a user doesn&amp;rsquo;t have the wrong version of &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/mottosso/Qt.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Qt.py&lt;/a&gt; when running your application?&lt;br&gt;&#xA;– Simple, you bundle Qt.py with your application. Here&amp;rsquo;s a short write-up on how you could go about doing just that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker cleanup</title>
      <link>http://localhost:1313/blog/2017/01/29/docker-cleanup/</link>
      <pubDate>Sun, 29 Jan 2017 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/01/29/docker-cleanup/</guid>
      <description>&lt;p&gt;Quick and easy way to remove all containers (and their volumes) as well as all images:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Remove containers and their volumes&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker stop &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;docker ps -a -q&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker rm -v &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;docker ps -a -q&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Remove images&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker rmi -f &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;docker images -q&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Remove unused images&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker system prune --all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Combine filters, &lt;code&gt;&#39;xargs&lt;/code&gt; etc:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Notes on ffmpeg</title>
      <link>http://localhost:1313/blog/2016/12/28/notes-on-ffmpeg/</link>
      <pubDate>Wed, 28 Dec 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/12/28/notes-on-ffmpeg/</guid>
      <description>&lt;p&gt;Quick note on how to install ffmpeg (using Homebrew) and various mp4 conversion commands on Unix.&lt;/p&gt;&#xA;&lt;p&gt;Full &lt;code&gt;ffmpeg&lt;/code&gt; documentation available &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://ffmpeg.org/ffmpeg.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://ffmpeg.org/ffmpeg.html&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;install-ffmpeg-for-webmmp4-conversion&#34;&gt;Install ffmpeg for .webm/.mp4 conversion&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Uninstall any existing ffmpeg installation&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew uninstall ffmpeg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Install (macOS using Homebrew)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install ffmpeg --with-fdk-aac --with-sdl2 --with-freetype --with-libass --with-libvorbis --with-libvpx --with-opus --with-x265&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Verify ffmpeg build configuration&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -buildconf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# .webm -&amp;gt; .mp4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i input.webm -codec copy output.mp4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# .mp4 -&amp;gt; .webm&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i input.mp4 -strict -2 output.webm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;convert-all-files-in-the-same-directory-to-mp4&#34;&gt;Convert all files in the same directory to .mp4&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Replace [wildcard] with e.g. *webm&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Replace [options] with your options...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; i in &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;wildcard&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; ffmpeg -i &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;options&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;.mp4&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;merge-m4a-with-mp4&#34;&gt;Merge .m4a with .mp4&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i video.mp4 -i audio.m4a -codec copy output.mp4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;extract-still-image-at-given-time-from-video&#34;&gt;Extract still image at given time from video&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Enter time in hh:mm:ss&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Choose file format by changing extension of output to e.g. .png&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -ss 00:00:46 -i input.mp4 -vframes &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; output.jpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Bash on Ubuntu on Windows</title>
      <link>http://localhost:1313/blog/2016/11/21/bash-on-ubuntu-on-windows/</link>
      <pubDate>Mon, 21 Nov 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/11/21/bash-on-ubuntu-on-windows/</guid>
      <description>&lt;p&gt;This is a quick intro to – and some personal notes on working with – Bash in Windows 10 (Anniversary Update or Insider build requred). This will be updated on a sporadic basis.&lt;/p&gt;&#xA;&lt;h2 id=&#34;information-on-bash&#34;&gt;Information on Bash&lt;/h2&gt;&#xA;&lt;h3 id=&#34;what-is-bash-on-ubuntu-on-windows&#34;&gt;What is Bash on Ubuntu on Windows?&lt;/h3&gt;&#xA;&lt;p&gt;Bash on Ubuntu on Windows is part of the &amp;ldquo;Windows Subsystem for Linux&amp;rdquo; (WSL). Read more over at the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://docs.microsoft.com/en-us/windows/wsl/about&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;WSL MSDN page&lt;/a&gt;. This page also covers installation guide, command reference, account permissions, interoperability, FAQ and release notes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A treasure trove of learning Python videos</title>
      <link>http://localhost:1313/blog/2016/11/02/a-treasure-trove-of-learning-python-videos/</link>
      <pubDate>Wed, 02 Nov 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/11/02/a-treasure-trove-of-learning-python-videos/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a fantastic resource for anyone who wish they could learn from a Python&#xA;professional rather than reading a book: &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.youtube.com/playlist?list=PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Corey Schafer&amp;rsquo;s Python Tutorials&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Among Cory&amp;rsquo;s &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.youtube.com/user/schafer5/playlists&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;other playlists&lt;/a&gt;&#xA;there are playlists covering how to &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.youtube.com/playlist?list=PL-osiE80TeTt66h8cVpmbayBKlMTuS55y&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;set up a Python developer environment&lt;/a&gt;,&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.youtube.com/playlist?list=PL-osiE80TeTsqhIuOqKhwlXsIBIdSeYtc&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;object oriented programming with Python&lt;/a&gt; and &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.youtube.com/playlist?list=PL-osiE80TeTsnP0Nl1UDY8VZAlHu1m_MQ&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;general programming terms&lt;/a&gt; which also apply to Python.&lt;/p&gt;&#xA;&lt;p&gt;All in all, a fantastic starting point for anyone wanting to get into Python as well as wrapping your head around certain concepts which take you from beginner to intermediate Python developer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing and sandboxing with Docker</title>
      <link>http://localhost:1313/blog/2016/09/12/testing-and-sandboxing-with-docker/</link>
      <pubDate>Mon, 12 Sep 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/09/12/testing-and-sandboxing-with-docker/</guid>
      <description>&lt;p&gt;A quick way to enter an interactive docker container:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;docker run --rm --interactive --tty -v /localfolder:/containerfolder centos:7&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;On Windows, use forward slashes for the directory mapping.&lt;/p&gt;&#xA;&lt;p&gt;For a more complex setup, have a look at &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/sandbox-docker&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;sandbox-docker&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Compiling PySide2 from source</title>
      <link>http://localhost:1313/blog/2016/08/17/compiling-pyside2-from-source/</link>
      <pubDate>Wed, 17 Aug 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/08/17/compiling-pyside2-from-source/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s how to compile PySide2 on Linux, Mac OS X and Windows.&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Note&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;Before reading on, this blog post is now &lt;em&gt;very&lt;/em&gt; outdated. You may want to skip&#xA;this alltogether and go directly to my pre-built standalone Python wheels and&#xA;the most up to date build recipes there:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker for Mac and GUI applications</title>
      <link>http://localhost:1313/blog/2016/07/31/docker-for-mac-and-gui-applications/</link>
      <pubDate>Sun, 31 Jul 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/07/31/docker-for-mac-and-gui-applications/</guid>
      <description>&lt;p&gt;A quick guide on how to run containers requiring a GUI with Docker for Mac and XQuartz.&lt;/p&gt;&#xA;&lt;p&gt;This guide is assuming the following:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;OS X 10.11.5 (El Capitan)&lt;/li&gt;&#xA;&lt;li&gt;Docker for Mac 1.12 stable&lt;/li&gt;&#xA;&lt;li&gt;XQuartz 2.7.10 beta 2&lt;/li&gt;&#xA;&lt;li&gt;Jessie Frazelle&amp;rsquo;s Firefox Dockerfile&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;h4 id=&#34;xquartz&#34;&gt;XQuartz&lt;/h4&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll need &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.xquartz.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;XQuartz&lt;/a&gt;, and normally you would probably install it via &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://brew.sh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;brew&lt;/a&gt; (but not this time):&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew cask install xquartz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;XQuartz 2.7.9, which is the current one provided by brew, has &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://bugs.freedesktop.org/show_bug.cgi?id=95379&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;a bug&lt;/a&gt; which will prevent you from following this guide. So, head on over and download XQuartz 2.7.10 beta 2 from &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.xquartz.org/releases/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dealing with Maya 2017 and PySide2</title>
      <link>http://localhost:1313/blog/2016/07/25/dealing-with-maya-2017-and-pyside2/</link>
      <pubDate>Mon, 25 Jul 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/07/25/dealing-with-maya-2017-and-pyside2/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.autodesk.com/products/maya/overview&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Maya 2017&lt;/a&gt; was released today and with it comes a big change; PySide (and PyQt4) no longer works with Maya.&lt;/p&gt;&#xA;&lt;p&gt;This guide explains how to deal with that and make your Python and PySide/PyQt scripts compatible with Maya 2017 as well as older Maya versions.&lt;/p&gt;&#xA;&lt;p&gt;This guide is also applicable to e.g. &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.thefoundry.co.uk/products/nuke/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Nuke&lt;/a&gt; or any other Python-enabled DCC app which uses Qt.&lt;/p&gt;&#xA;&lt;h2 id=&#34;background-qt4-vs-qt5&#34;&gt;Background (Qt4 vs Qt5)&lt;/h2&gt;&#xA;&lt;p&gt;Starting with Maya 2011, Maya&amp;rsquo;s user interface is built using the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.qt.io&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Qt&lt;/a&gt; toolkit. Up until and including Maya 2016, Qt of version 4 (&amp;ldquo;Qt4&amp;rdquo;) which was &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_Qt_releases#Qt_4&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;released in 2005&lt;/a&gt; has been used. Today, roughly 11 years after the Qt4 release, and starting with Maya 2017, Qt was upgraded to version 5 (&amp;ldquo;Qt5&amp;rdquo;) to enable a host of enhancements to Maya. Unfortunately, this also breaks backwards compatibility to Qt4.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Developing with Qt.py</title>
      <link>http://localhost:1313/blog/2016/07/25/developing-with-qt.py/</link>
      <pubDate>Mon, 25 Jul 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/07/25/developing-with-qt.py/</guid>
      <description>&lt;p&gt;This post aims to give an introduction to the&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/mottosso/Qt.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Qt.py&lt;/a&gt; project and how to get set up with it&#xA;for PySide/PyQt4 and PySide2/PyQt5 development.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Qt.py (advanced methods)</title>
      <link>http://localhost:1313/blog/2016/07/25/installing-qt.py-advanced-methods/</link>
      <pubDate>Mon, 25 Jul 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/07/25/installing-qt.py-advanced-methods/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/mottosso/Qt.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;Qt.py&lt;/a&gt; can be installed in many ways, depending on your needs. This post aims to outline some common approaches:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Read node from Write node</title>
      <link>http://localhost:1313/blog/2016/05/23/read-node-from-write-node/</link>
      <pubDate>Mon, 23 May 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/05/23/read-node-from-write-node/</guid>
      <description>&lt;p&gt;Originally posted in 2011; A Python script for &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.thefoundry.co.uk/products/nuke/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Nuke&lt;/a&gt; which takes any selected Write (or Read) node and creates a Read node from it. Now updated to fix some bugs and support for a wider range of scenarios.&lt;/p&gt;&#xA;&lt;p&gt;The script will actually not look for Write nodes in the selection. Instead, it&amp;rsquo;ll look for a specific knob in each of the selected nodes. If the knob is found in the node, the script will attempt to detect an image sequence or movie file based on the knob value (expressions are supported) and then create a Read node with the detected imagery. By default, the script will look for the &lt;code&gt;file&lt;/code&gt; knob, which makes it compatible with Write, Read and possibly other nodes too. You can make the script look for other knobs by adding their names to the &lt;code&gt;FILEPATH_KNOBS&lt;/code&gt; list, which is particularly useful if you&amp;rsquo;re into customization.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Sublime Text 3 setup</title>
      <link>http://localhost:1313/blog/2016/05/20/my-sublime-text-3-setup/</link>
      <pubDate>Fri, 20 May 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/05/20/my-sublime-text-3-setup/</guid>
      <description>&lt;p&gt;This is my &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.sublimetext.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Sublime Text 3&lt;/a&gt; setup, with ambitions to create a custom Python IDE.&lt;/p&gt;&#xA;&lt;p&gt;All of the below assumes you&amp;rsquo;ve already installed &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://packagecontrol.io&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Package Control&lt;/a&gt;, the package manager for Sublime Text.&lt;/p&gt;&#xA;&lt;h3 id=&#34;general-packages&#34;&gt;General packages&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.sublimelinter.com/en/latest/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;SublimeLinter&lt;/code&gt;&lt;/a&gt; - Faster than in ST2&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/facelessuser/BracketHighlighter&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;code&gt;BracketHighlighter&lt;/code&gt;&lt;/a&gt; - Bracket and tag highlighter&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.sublimerge.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;Sublimerge Pro&lt;/code&gt;&lt;/a&gt; - Great tool for checking diffs&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;python-ide-setup&#34;&gt;Python IDE setup&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/SublimeLinter/SublimeLinter-flake8&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;code&gt;SublimeLinter-flake8&lt;/code&gt;&lt;/a&gt; - Flake and PEP8 checking&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/srusskih/SublimeJEDI&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;code&gt;Jedi - Python Autocompletion&lt;/code&gt;&lt;/a&gt; - Also known as SublimeJEDI&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/wuub/requirementstxt&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;code&gt;requirementstxt&lt;/code&gt;&lt;/a&gt; - Syntax highlighting for requirements.txt files&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Please note, SublimeLinter-flake8 requires you to &lt;code&gt;pip install flake8&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Systemd services and resource limits</title>
      <link>http://localhost:1313/blog/2016/04/27/systemd-services-and-resource-limits/</link>
      <pubDate>Wed, 27 Apr 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/04/27/systemd-services-and-resource-limits/</guid>
      <description>&lt;p&gt;We made the move to CentOS 7 and I switched out all init.d scripts with&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/chap-Managing_Services_with_systemd.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;systemd services&lt;/a&gt;.&#xA;Yesterday I noticed we started getting errors on our render farm for huge&#xA;scenes which required loading of thousands of files:&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert &#34;&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;V-Ray warning: Could not load mesh file &amp;hellip;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;One hint that this wasn&amp;rsquo;t due to scene misconfiguration was that the initial&#xA;~1000 vrmeshes were loaded successfully, and after that no other vrmesh file&#xA;could be loaded.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install PySide into OS X El Capitan</title>
      <link>http://localhost:1313/blog/2016/04/20/how-to-install-pyside-into-os-x-el-capitan/</link>
      <pubDate>Wed, 20 Apr 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/04/20/how-to-install-pyside-into-os-x-el-capitan/</guid>
      <description>&lt;h2 id=&#34;os-x-el-capitan&#34;&gt;OS X El Capitan&lt;/h2&gt;&#xA;&lt;p&gt;brew install python  # installs in /usr/local/Cellar/python/2.7.11&#xA;brew install qt  # installs in /usr/local/Cellar/qt/4.8.7_2&lt;/p&gt;&#xA;&lt;p&gt;brew install python cmake qt&lt;/p&gt;&#xA;&lt;p&gt;Do we need these?&#xA;brew install openssl&lt;/p&gt;&#xA;&lt;p&gt;Upgrade pip and wheel&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;$ which python&#xA;/usr/local/bin/python  # good, it&amp;rsquo;s using brew&amp;rsquo;s python&lt;/p&gt;&#xA;&lt;p&gt;$ brew list qt&lt;/p&gt;&#xA;&lt;p&gt;export MACOSX_DEPLOYMENT_TARGET=10.11  # ?????????????&lt;/p&gt;&#xA;&lt;p&gt;Download tar:&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/PySide/PySide/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;PySide/PySide&lt;/a&gt;&#xA;tar -xvzf PySide-1.2.4.tar.gz&#xA;cd PySide-1.2.4&#xA;python2.7 setup.py bdist_wheel&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Atom setup</title>
      <link>http://localhost:1313/blog/2016/04/06/my-atom-setup/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/04/06/my-atom-setup/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m in love with &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://atom.io&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Atom&lt;/a&gt;. Despite it being slow on large&#xA;files, I still haven&amp;rsquo;t been able to jump over the threshold of learning&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.vim.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;vim&lt;/a&gt; (or &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://neovim.io&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;neovim&lt;/a&gt;).&#xA;I&amp;rsquo;m way too comfortable with Atom right now. Here&amp;rsquo;s my setup.&lt;/p&gt;&#xA;&lt;h3 id=&#34;base-linter&#34;&gt;Base linter&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;linter&lt;/code&gt; - a base linter for Atom&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;An important setting here is to decide whether you wish &amp;ldquo;Lint as you type&amp;rdquo;&#xA;enabled or disabled. For large, unlinted files, you may want to disable this&#xA;feature to avoid hiccups.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Install psutil in CentOS 6</title>
      <link>http://localhost:1313/blog/2016/03/11/install-psutil-in-centos-6/</link>
      <pubDate>Fri, 11 Mar 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/03/11/install-psutil-in-centos-6/</guid>
      <description>&lt;p&gt;Don&amp;rsquo;t use &lt;code&gt;yum install python-psutil&lt;/code&gt; as this will give you a super old&#xA;version. Instead use:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;yum install gcc python-devel&#xA;pip install psutil&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Backslash in Atom</title>
      <link>http://localhost:1313/blog/2016/03/07/backslash-in-atom/</link>
      <pubDate>Mon, 07 Mar 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/03/07/backslash-in-atom/</guid>
      <description>&lt;p&gt;On Windows 10, Swedish keyboard. When I hit &lt;code&gt;AltGr&lt;/code&gt; (right &lt;code&gt;Alt&lt;/code&gt; button) and &lt;code&gt;+&lt;/code&gt; (which is supposed to give me &lt;code&gt;\&lt;/code&gt;), I get nothing in &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://atom.io&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Atom&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;After having installed the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://atom.io/packages/keyboard-localization&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;keyboard-localization&lt;/a&gt; package, I now get &lt;code&gt;~&lt;/code&gt; when I hit this key combo, which is not correct. If I hold down &lt;em&gt;both&lt;/em&gt; &lt;code&gt;Alt&lt;/code&gt; keys and hit &lt;code&gt;+&lt;/code&gt; I get &lt;code&gt;\&lt;/code&gt; with this package installed. However this is not acceptable behavior.&lt;/p&gt;&#xA;&lt;p&gt;The workaround which worked for me was to uninstall the keyboard-localization package and follow the instructions posted by @csvn &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/atom/atom/issues/8820#issuecomment-146959203&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;here&lt;/a&gt; which explains to add the following to the &lt;code&gt;keymap.cson&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Visual Studio for Python 2.7</title>
      <link>http://localhost:1313/blog/2016/01/18/installing-visual-studio-for-python-2.7/</link>
      <pubDate>Mon, 18 Jan 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/01/18/installing-visual-studio-for-python-2.7/</guid>
      <description>&lt;h3 id=&#34;install-using-microsoft-installer&#34;&gt;Install using Microsoft installer&lt;/h3&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.microsoft.com/en-us/download/details.aspx?id=44266&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.microsoft.com/en-us/download/details.aspx?id=44266&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;using-chocolatey&#34;&gt;Using Chocolatey&lt;/h3&gt;&#xA;&lt;p&gt;Install using &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://chocolatey.org/packages/vcpython27&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Chocolatey&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;choco install vcpython27&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Chocolatey on Windows 10</title>
      <link>http://localhost:1313/blog/2016/01/03/chocolatey-on-windows-10/</link>
      <pubDate>Sun, 03 Jan 2016 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2016/01/03/chocolatey-on-windows-10/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently started taking a look at &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://chocolatey.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Chocolatey&lt;/a&gt; –&#xA;&amp;ldquo;apt-get for Windows&amp;rdquo; – and here are a couple of how-to&amp;rsquo;s&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;install-chocolatey-on-windows-10-64-bit&#34;&gt;Install Chocolatey on Windows 10 64-bit&lt;/h2&gt;&#xA;&lt;p&gt;First off, you might want to know why I&amp;rsquo;m not using the built-in OneGet,&#xA;which is a &amp;ldquo;package manager manager&amp;rdquo; [sic]?&lt;br&gt;&#xA;Well, it turns out there&amp;rsquo;s no good way of upgrading an installed package&#xA;using e.g. Chocolatey via OneGet. Duh. Keep an eye on this github issue:&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/OneGet/oneget/issues/6&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;OneGet/oneget#6&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Install CentOS 7 remotely using Kickstart and GRUB</title>
      <link>http://localhost:1313/blog/2015/12/30/install-centos-7-remotely-using-kickstart-and-grub/</link>
      <pubDate>Wed, 30 Dec 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/12/30/install-centos-7-remotely-using-kickstart-and-grub/</guid>
      <description>&lt;p&gt;This guide assumes the target host is already running CentOS (a derivate of&#xA;Red Hat Enterprise Linux) or at least running the GRUB boot loader and that you&#xA;have root access to this host.&lt;/p&gt;&#xA;&lt;h2 id=&#34;whats-this-all-about&#34;&gt;What&amp;rsquo;s this all about?&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m going to install CentOS 7 onto a machine which I do not have physical access&#xA;to. In order to achieve this, I&amp;rsquo;m going to need a Kickstart file, some files&#xA;from the CentOS 7 installation and create a custom GRUB boot loader entry.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python simple web server</title>
      <link>http://localhost:1313/blog/2015/12/28/python-simple-web-server/</link>
      <pubDate>Mon, 28 Dec 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/12/28/python-simple-web-server/</guid>
      <description>&lt;p&gt;The absolutely fastest way to get a simple web server up and running using&#xA;Python 3, for development purposes.&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; my_web_root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python -m http.server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Or if you are on Python 2.x:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Compiling PyQt5 for Python 2.7 on OS X</title>
      <link>http://localhost:1313/blog/2015/11/25/compiling-pyqt5-for-python-2.7-on-os-x/</link>
      <pubDate>Wed, 25 Nov 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/11/25/compiling-pyqt5-for-python-2.7-on-os-x/</guid>
      <description>&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Note&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;Guide updated for Qt5 5.6 and PyQt5 5.6.&lt;/p&gt;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;This quick guide details compiling sip and PyQt5 on OS X 10.11 (El Capitan) using &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://brew.sh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Homebrew&lt;/a&gt; for Qt5 installtion.&lt;/p&gt;&#xA;&lt;p&gt;In case you don’t have Homebrew installed:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;ruby -e &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Let’s start with installing the latest version of Python 2.x, Qt5, as well as wget using brew:&lt;/p&gt;</description>
    </item>
    <item>
      <title>CentOS 6 yum errors (and fixes)</title>
      <link>http://localhost:1313/blog/2015/11/18/centos-6-yum-errors-and-fixes/</link>
      <pubDate>Wed, 18 Nov 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/11/18/centos-6-yum-errors-and-fixes/</guid>
      <description>&lt;h3 id=&#34;issues&#34;&gt;Issues&lt;/h3&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert &#34;&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;or&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert &#34;&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;Error: xz compression not available&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;h3 id=&#34;fix&#34;&gt;Fix&lt;/h3&gt;&#xA;&lt;pre&gt;&lt;code&gt;yum remove epel-release&#xA;rm -rf /var/cache/yum/x86_64/6/epel&#xA;yum install epel-release&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Turning your renders up to 11</title>
      <link>http://localhost:1313/blog/2015/10/16/turning-your-renders-up-to-11/</link>
      <pubDate>Fri, 16 Oct 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/10/16/turning-your-renders-up-to-11/</guid>
      <description>&lt;p&gt;An interview with me on our cloud rendering solutions is now published over&#xA;at &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.cgsociety.org/news/article/1379/turning-your-renders-up-to-11&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CGSociety&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert &#34;&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;“We need to make sure that we’re working with the best technology, as some of our projects can be very render intensive,” he begins. “But our motto is to spend time focusing on the creative side of building beautiful images, and let the machines do the hard work.”&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Check it out &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.cgsociety.org/news/article/1379/turning-your-renders-up-to-11&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Identifying Chrome extensions on Chrome OS eating up too much disk space</title>
      <link>http://localhost:1313/blog/2015/10/07/identifying-chrome-extensions-on-chrome-os-eating-up-too-much-disk-space/</link>
      <pubDate>Wed, 07 Oct 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/10/07/identifying-chrome-extensions-on-chrome-os-eating-up-too-much-disk-space/</guid>
      <description>&lt;p&gt;I just recently realized I had only 300 MB of free disk space on my Chromebook, when I should have about 8 GB of free disk space. After some investigation, I found that one of my extensions where not deleting its previous versions when it got updated. Here’s how you can detect and fix such an issue.&lt;/p&gt;&#xA;&lt;p&gt;Type &lt;strong&gt;chrome://system&lt;/strong&gt; into a Chrome tab, scroll down to “user_files” and click the “expand” button for it. This will generate a (quite long) list of files with file size. Then search for the following in in Chrome using &lt;strong&gt;alt+f&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Flickr dumpr</title>
      <link>http://localhost:1313/blog/2015/09/24/flickr-dumpr/</link>
      <pubDate>Thu, 24 Sep 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/09/24/flickr-dumpr/</guid>
      <description>&lt;p&gt;Downloads all of your flickr albums (original photo/video files). Requires Python 2.7 with the flickrapi module.&lt;/p&gt;&#xA;&lt;p&gt;Check out the code &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/flickrdumpr&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;over at its Github repository&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing Python&#39;s insecure platform warning</title>
      <link>http://localhost:1313/blog/2015/09/15/fixing-pythons-insecure-platform-warning/</link>
      <pubDate>Tue, 15 Sep 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/09/15/fixing-pythons-insecure-platform-warning/</guid>
      <description>&lt;p&gt;Here’s how to fix that nagging InsecurePlatformWarning warning in Python.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-issue&#34;&gt;The issue&lt;/h3&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert &#34;&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Assuming you have pip for python installed, read on&amp;hellip;&lt;/p&gt;&#xA;&lt;h3 id=&#34;ubuntu-1404-fix&#34;&gt;Ubuntu 14.04 fix&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install libffi-dev libssl-dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pip install -U requests&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;security&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Installing PySide into a virtualenv</title>
      <link>http://localhost:1313/blog/2015/09/11/installing-pyside-into-a-virtualenv/</link>
      <pubDate>Fri, 11 Sep 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/09/11/installing-pyside-into-a-virtualenv/</guid>
      <description>&lt;p&gt;I’ve been struggling to install a portable/relocatable virtualenv with PySide 1.2.2 for Python 2.7. On Windows, this works out of the box but it’s more difficult on Linux and OS X, although I came up with &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/PySide/PySide/issues/129#issuecomment-145138706&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;a patch for OS X&lt;/a&gt;. This guide will not go into detail on portability/relocatability and will merely touch upon how to get started with PySide in a virtualenv. It looks like PySide 1.2.3 will have substantial changes which will allow for easier portability/relocatability and I will make a post on that as soon as it is generally available.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Maya 2016 on Ubuntu 14.04 (trusty)</title>
      <link>http://localhost:1313/blog/2015/09/10/installing-maya-2016-on-ubuntu-14.04-trusty/</link>
      <pubDate>Thu, 10 Sep 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/09/10/installing-maya-2016-on-ubuntu-14.04-trusty/</guid>
      <description>&lt;p&gt;It took some trial and error to successfully install and license Maya 2016 in Ubuntu 14.04, and here’s how I did it.&lt;/p&gt;&#xA;&lt;p&gt;First off, let’s install some libraries. It’s possible that not all these libraries are needed as the list of libraries stem from installation instructions from an earlier version of Maya.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo apt-get install csh tcsh libaudiofile-dev libglw1-mesa elfutils gamin libglw1-mesa-dev mesa-utils xfstt ttf-liberation ttf-mscorefonts-installer xfonts-100dpi xfonts-75dpi alien&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Maya needs write access to a temp folder, which does not exist by default in Ubuntu 14.04. Let’s create it and make it writeable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting quick access to new Google Cloud SDK features</title>
      <link>http://localhost:1313/blog/2015/05/19/getting-quick-access-to-new-google-cloud-sdk-features/</link>
      <pubDate>Tue, 19 May 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/05/19/getting-quick-access-to-new-google-cloud-sdk-features/</guid>
      <description>&lt;p&gt;There is a two-week delay before gsutil gets updated with the latest and greatest. If you want to try the new stuff out, pip install the SDK!&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo yum install gcc openssl-devel python-devel python-setuptools libffi-devel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo yum install python-pip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pip install -U gsutil&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Then execute gsutil like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>File copy progress window with PyQt/PySide and shutil</title>
      <link>http://localhost:1313/blog/2015/05/12/file-copy-progress-window-with-pyqt/pyside-and-shutil/</link>
      <pubDate>Tue, 12 May 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/05/12/file-copy-progress-window-with-pyqt/pyside-and-shutil/</guid>
      <description>&lt;p&gt;I recently wanted to show the progress of a file copy made from a python script (or actually, from a python script running inside of Maya and Nuke). First I looked to piggyback on the OS native ways of copying a file, but oddly enough it turned out there was no way of showing a progress bar when doing this.&lt;/p&gt;&#xA;&lt;p&gt;So I turned to Python&#xA;’s &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://docs.python.org/2/library/shutil.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;shutil&lt;/a&gt; and &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://wiki.qt.io/Category:LanguageBindings::PySide&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PySide&lt;/a&gt; (but &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.riverbankcomputing.co.uk/software/pyqt/intro&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PyQt&lt;/a&gt; would work just as well for this). Shutil cannot show progress by itself, but when asking around about this, I &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://stackoverflow.com/questions/29967487/get-progress-back-from-shutil-file-copy-thread&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;learned&lt;/a&gt; that you can implement your own copy function in Python using its built-in &lt;code&gt;copyfileobj&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kill process by search string</title>
      <link>http://localhost:1313/blog/2015/05/06/kill-process-by-search-string/</link>
      <pubDate>Wed, 06 May 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/05/06/kill-process-by-search-string/</guid>
      <description>&lt;p&gt;In Linux, you can kill all processes by name (or by username etc) using something like this:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kill -9 $(ps aux | grep &amp;#39;some_process_name&amp;#39; | awk &amp;#39;{print $2}&amp;#39;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>3D rendering in the Google Cloud</title>
      <link>http://localhost:1313/blog/2015/05/01/3d-rendering-in-the-google-cloud/</link>
      <pubDate>Fri, 01 May 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/05/01/3d-rendering-in-the-google-cloud/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://cloudplatform.googleblog.com/2015/05/3D-imagery-rendering-in-the-cloud-with-Industriromantik-and-Compute-Engine.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Guest blogging&lt;/a&gt; for Google!&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert &#34;&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;As a small design and visualization studio, we focus on creating beautiful 3D imagery – be it high-resolution product images or TV commercials. To successfully do this, we need to ensure we have access to enough rendering power, and at times, we find ourselves in a situation where our in-house render farm’s capacity isn’t cutting it. That’s where Google Compute Engine comes in.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;Read more over at the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://cloudplatform.googleblog.com/2015/05/3D-imagery-rendering-in-the-cloud-with-Industriromantik-and-Compute-Engine.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Google Cloud Platform blog&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Copying Maya to network share</title>
      <link>http://localhost:1313/blog/2015/04/15/copying-maya-to-network-share/</link>
      <pubDate>Wed, 15 Apr 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/04/15/copying-maya-to-network-share/</guid>
      <description>&lt;p&gt;If you would like to run a thin client installation of Maya, which means you run it off a network share rather from a local installation, you need to make sure to copy symlinks on Linux.&lt;/p&gt;&#xA;&lt;p&gt;If you just perform a simple copy, you’ll probably get something like this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;error: unpacking of archive failed on file /my_mount/maya_installation/lib/libGLEW.so;544612b1: cpio: symlink failed - Operation not supported&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;The solution is to copy the files which are symlinked:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Find file or folder in Linux</title>
      <link>http://localhost:1313/blog/2015/04/15/find-file-or-folder-in-linux/</link>
      <pubDate>Wed, 15 Apr 2015 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/04/15/find-file-or-folder-in-linux/</guid>
      <description>&lt;p&gt;Ever needed to do a simple search for an application, a file or a folder in Linux and when &lt;code&gt;whereis&lt;/code&gt; doesn’t return anything useful?&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo find / -name &lt;span class=&#34;s2&#34;&gt;&amp;#34;some_folder&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Run gsutil from crontab</title>
      <link>http://localhost:1313/blog/2014/12/15/run-gsutil-from-crontab/</link>
      <pubDate>Mon, 15 Dec 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/12/15/run-gsutil-from-crontab/</guid>
      <description>&lt;p&gt;Setting up gsutil to sync files over to Google Cloud Storage (on CentOS 6) requires some environment variables to be set, which seems oddly undocumented at the moment. Turning to &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://stackoverflow.com/questions/27439326/how-to-properly-run-gsutil-from-crontab/27480249&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Stackoverflow&lt;/a&gt; was the solution, and here’s a summary from that.&lt;/p&gt;&#xA;&lt;p&gt;Also, the &lt;code&gt;-d&lt;/code&gt; flag is required to truly catch all errors/warnings, but on very large data volumes you may want to omit this flag as it generates quite a large log file. The &lt;code&gt;&amp;gt; gsutil.log 2&amp;gt;&amp;amp;1&lt;/code&gt; pipe is necessary to pipe both stdout and stderr to file. You can change this to &lt;code&gt;&amp;gt;&amp;gt; gsutil.log 2&amp;gt;&amp;amp;1&lt;/code&gt; if you wish to append to file rather than overwrite a previous sync log.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What&#39;s hogging that folder?</title>
      <link>http://localhost:1313/blog/2014/12/02/whats-hogging-that-folder/</link>
      <pubDate>Tue, 02 Dec 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/12/02/whats-hogging-that-folder/</guid>
      <description>&lt;p&gt;Well, at least in Linux you might find out using this command:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsof &amp;lt;folder name&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Fabric on CentOS 6.6</title>
      <link>http://localhost:1313/blog/2014/11/28/fabric-on-centos-6.6/</link>
      <pubDate>Fri, 28 Nov 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/11/28/fabric-on-centos-6.6/</guid>
      <description>&lt;p&gt;When installing &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.fabfile.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fabric&lt;/a&gt; on CentOS 6.6 using &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://pypi.python.org/pypi/pip&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pip&lt;/a&gt;, it seems &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;      &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fabric/fabric/issues/1105&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;a bug&lt;/a&gt; is being hit.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stop using print and do some logging</title>
      <link>http://localhost:1313/blog/2014/11/10/stop-using-print-and-do-some-logging/</link>
      <pubDate>Mon, 10 Nov 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/11/10/stop-using-print-and-do-some-logging/</guid>
      <description>&lt;p&gt;This will print to stdout, similar to a regular print, but it will also log to file.&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;logging&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Logging setup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;LOG_FILEPATH&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;/path/to/log_file.log&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;My logger&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setLevel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;formatter&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Formatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(asctime)s&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(levelname)s&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(message)s&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Logging to file&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;file_handler&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FileHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LOG_FILEPATH&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;file_handler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFormatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;formatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;file_handler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setLevel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file_handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Logging to stdout&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;stdout_handler&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StreamHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;stdout_handler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFormatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;formatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;stdout_handler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setLevel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout_handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Usage&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Hello&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;       &lt;span class=&#34;c1&#34;&gt;# Log infos&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Oops&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;# Log warnings&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Dang!&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;# Log errors&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Another way of configuring logging can be seen below, which makes for easier reading if using multiple handlers. In this case I am only logging WARNING levels and above to file but printing INFO levels and above to stdout:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to create large temp files quickly (for testing purposes)</title>
      <link>http://localhost:1313/blog/2014/11/07/how-to-create-large-temp-files-quickly-for-testing-purposes/</link>
      <pubDate>Fri, 07 Nov 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/11/07/how-to-create-large-temp-files-quickly-for-testing-purposes/</guid>
      <description>&lt;p&gt;Quick and dirty way to just create a 10GB temp file for testing e.g. network transfer speeds.&lt;/p&gt;&#xA;&lt;h3 id=&#34;linux&#34;&gt;Linux&lt;/h3&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fallocate -l 10G temp_10GB_file&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;windows&#34;&gt;Windows&lt;/h3&gt;&#xA;&lt;p&gt;The file size is defined in bytes. Use Google to do the conversion if you’re unsure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Modal QMainWindow setup in Maya (or Nuke) without Shiboken/SIP</title>
      <link>http://localhost:1313/blog/2014/10/06/modal-qmainwindow-setup-in-maya-or-nuke-without-shiboken/sip/</link>
      <pubDate>Mon, 06 Oct 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/10/06/modal-qmainwindow-setup-in-maya-or-nuke-without-shiboken/sip/</guid>
      <description>&lt;p&gt;An easy way to get going with PySide in Maya (or Nuke for that matter) without the hassle of dealing with the shiboken/sip layer.&lt;/p&gt;&#xA;&lt;p&gt;Just a word of caution: The QtCore.QApplication.activeWindow() returns the currently active window (the one in focus). It could be wise to ask the API of e.g. Maya for the main Maya window rather than using this approach, just to be 100% sure the Maya window will be returned by the function in all situations. But for any other window that you may want to open from there on, you could safely use this approach, as you would know your own windows.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Set Maya project and create folder structure</title>
      <link>http://localhost:1313/blog/2014/08/06/set-maya-project-and-create-folder-structure/</link>
      <pubDate>Wed, 06 Aug 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/06/set-maya-project-and-create-folder-structure/</guid>
      <description>&lt;p&gt;After having done a quick Google search, it seems nobody has yet posted a quick Python snippet that does this.&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip; so without further ado:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;maya.cmds&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;cmds&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;maya.mel&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;mel&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;create_folder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;makedirs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;maya_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;//server/share/path/to/maya&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;create_folder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maya_dir&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;mel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;eval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;setProject &amp;#34;&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maya_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file_rule&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmds&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;workspace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fileRuleList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;file_rule_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmds&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;workspace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fileRuleEntry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file_rule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;maya_file_rule_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maya_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file_rule_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;create_folder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maya_file_rule_dir&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Maya and relativity</title>
      <link>http://localhost:1313/blog/2014/06/07/maya-and-relativity/</link>
      <pubDate>Sat, 07 Jun 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/06/07/maya-and-relativity/</guid>
      <description>&lt;p&gt;A short note on how to work with relative paths in Autodesk’s Maya.&lt;/p&gt;&#xA;&lt;h3 id=&#34;sourceimages&#34;&gt;Sourceimages&lt;/h3&gt;&#xA;&lt;p&gt;You can define a relative path (from where your Maya project is set) using workspace.mel or the “File -&amp;gt; Project Window”. Here, set the sourceimages folder to e.g. &lt;code&gt;../textures&lt;/code&gt;. It is important that you do not use the word “sourceimages” in the path or this won’t work.&lt;/p&gt;&#xA;&lt;p&gt;For any file texture that you wish loaded from there, enter sourceimages/myTex.tif in the filepath of the file node.&lt;/p&gt;</description>
    </item>
    <item>
      <title>64-bit Python package building with VS2008</title>
      <link>http://localhost:1313/blog/2014/06/05/64-bit-python-package-building-with-vs2008/</link>
      <pubDate>Thu, 05 Jun 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/06/05/64-bit-python-package-building-with-vs2008/</guid>
      <description>&lt;p&gt;This was a real PITA to get working. After having installed Visual C++ 2008 Express, I tried to build both &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://code.google.com/archive/p/psutil/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;psutil&lt;/a&gt; and &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://sourceforge.net/projects/mysql-python/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MySQLdb&lt;/a&gt; using setuptools and/or pip. Both resulted in various errors…&lt;/p&gt;&#xA;&lt;p&gt;For anyone barking up the same tree… here’s the solution that worked for me.&lt;/p&gt;&#xA;&lt;p&gt;Make sure you have both &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://pypi.python.org/pypi/pip&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pip&lt;/a&gt; and &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://pypi.python.org/pypi/setuptools&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;setuptools&lt;/a&gt; installed to be able to build, and obviously 64-bit Python 2.6 or 2.7. Also, when you do the building, I would recommend you do it in a &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.tylerbutler.com/2012/05/how-to-install-python-pip-and-virtualenv-on-windows-with-powershell/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;virtualenv with Powershell&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Search and replace</title>
      <link>http://localhost:1313/blog/2014/02/16/search-and-replace/</link>
      <pubDate>Sun, 16 Feb 2014 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/02/16/search-and-replace/</guid>
      <description>&lt;p&gt;A very simple and quite rudimental search and replace script with a UI. It will only search and replace &lt;em&gt;contents&lt;/em&gt; of files and not the filenames.&lt;/p&gt;&#xA;&lt;p&gt;It won’t win any design awards but it could prove very useful when being run on large amounts of huge files as it will only keep the current file it is processing in the RAM.&lt;/p&gt;&#xA;&lt;p&gt;Be very careful before running this script and make sure to read through the readme before using. And ALWAYS make a backup of what you intend to process. You can download this over at &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/searchReplace&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Load latest Maya crash file</title>
      <link>http://localhost:1313/blog/2013/12/13/load-latest-maya-crash-file/</link>
      <pubDate>Fri, 13 Dec 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/12/13/load-latest-maya-crash-file/</guid>
      <description>&lt;p&gt;This simple python script looks for the latest file with .ma file extension in the path given and prompts the user whether to load it or not. Just verify that the searchDir variable is pointing to your temp dir.&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;glob&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;time&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;maya.cmds&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;cmds&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;crashFileLoader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;searchDir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;environ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;TEMP&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;files&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isfile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;glob&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;glob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;searchDir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;*.ma&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;files&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getmtime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;latestCrashFile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;files&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;files&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;timeStamp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getctime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latestCrashFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;messageString&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Are you sure you want to open &amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;latestCrashFile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39; created on &amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timeStamp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;retVal&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmds&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;confirmDialog&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Confirm&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;messageString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Yes&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;No&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;defaultButton&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Yes&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cancelButton&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;No&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dismissString&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;No&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;retVal&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Yes&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;cmds&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latestCrashFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;force&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Launch the script with:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Catching string from stdout with Python</title>
      <link>http://localhost:1313/blog/2013/10/11/catching-string-from-stdout-with-python/</link>
      <pubDate>Fri, 11 Oct 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/10/11/catching-string-from-stdout-with-python/</guid>
      <description>&lt;p&gt;Using a Python “wrapper” script you can catch the output of an executing application, which is very useful when you want to perform certain tasks depending on what is being printed to stdout by the application.&lt;/p&gt;&#xA;&lt;p&gt;This is a simplified example of how I do it:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Imports&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;subprocess&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Build command&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;python&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;/path/to&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;scriptFile.py&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Execute command&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;subprocess&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Popen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;subprocess&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PIPE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;subprocess&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;STDOUT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Read stdout and print each new line&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;iter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;readline&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;c1&#34;&gt;# Print line&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;gt;&amp;gt;&amp;gt; &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rstrip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;c1&#34;&gt;# Look for the string &amp;#39;Render done&amp;#39; in the stdout output&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Render done&amp;#39;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rstrip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;c1&#34;&gt;# Write something to stdout&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Nice job on completing the render, I am executing myFunction()&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;c1&#34;&gt;# Execute something&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;myFunction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;catching-stuff-from-stdout-for-pixars-tractor&#34;&gt;Catching stuff from stdout for Pixar&amp;rsquo;s Tractor&lt;/h3&gt;&#xA;&lt;p&gt;Here’s an example of catching the output of a V-Ray for Maya render and outputting &lt;code&gt;TR_PROGRESS nnn%&lt;/code&gt; to stdout whenever a percentage is being printed to stdout, which makes &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://renderman.pixar.com/view/pixars-tractor&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pixar’s Tractor&lt;/a&gt; show a task progress in the task node tree.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A PySide/PyQt4 boilerplate for Maya, Nuke or standalone</title>
      <link>http://localhost:1313/blog/2013/10/06/a-pyside/pyqt4-boilerplate-for-maya-nuke-or-standalone/</link>
      <pubDate>Sun, 06 Oct 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/10/06/a-pyside/pyqt4-boilerplate-for-maya-nuke-or-standalone/</guid>
      <description>&lt;p&gt;Ever wanted to be able to run the same user interface in Maya, Nuke as well as completely standalone (with or without app-specific modifications) and on any platform, using PySide and/or PyQt?&lt;/p&gt;&#xA;&lt;p&gt;– That’s exactly why I created a boilerplate Python script, which could serve as a good starting point for most PySide/PyQt projects to be used in the VFX pipeline.&lt;/p&gt;&#xA;&lt;p&gt;As my experience is limited to some VFX applications, you are most welcome to fork or contribute to make it also run in other PyQt/PySide enabled applications.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Send MEL/Python commands from Sublime Text to Maya</title>
      <link>http://localhost:1313/blog/2013/07/15/send-mel/python-commands-from-sublime-text-to-maya/</link>
      <pubDate>Mon, 15 Jul 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/07/15/send-mel/python-commands-from-sublime-text-to-maya/</guid>
      <description>&lt;p&gt;This is a step by step to set you up with sending selected MEL/Python code snippets or whole scripts from &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.sublimetext.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Sublime Text&lt;/a&gt; to Maya using Justin Israel’s &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/justinfx/MayaSublime&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;MayaSublime&lt;/a&gt; package.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fujifilm X100S camera profiles and presets</title>
      <link>http://localhost:1313/blog/2013/06/16/fujifilm-x100s-camera-profiles-and-presets/</link>
      <pubDate>Sun, 16 Jun 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/06/16/fujifilm-x100s-camera-profiles-and-presets/</guid>
      <description>&lt;h3 id=&#34;background&#34;&gt;Background&lt;/h3&gt;&#xA;&lt;p&gt;Ever since I replaced my trusty old X100 (see my review &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;../2012/06/12/the-fujifilm-x100-a-year-in-retrospect/&#34;&gt;here&lt;/a&gt;) with its newer incarnation, the X100S (see ,my review &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;../2013/03/08/the-fujifilm-x100s-compared-to-the-x100/&#34;&gt;here&lt;/a&gt;), I have been struggling with color rendition in Lightroom, which is my weapon of choice when editing RAW files.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update 8&lt;sup&gt;th&lt;/sup&gt; April, 2014:&lt;/strong&gt; Adobe today released Adobe Camera RAW 8.4 which includes huge improvements on color rendition in Lightroom 5.4 and Photoshop CC (version 14.2.1). This more or less renders my camera profiles obsolete. But do read on if you like…&lt;/p&gt;</description>
    </item>
    <item>
      <title>Maya Bonus Tools 2014 – arbitrary installation</title>
      <link>http://localhost:1313/blog/2013/06/07/maya-bonus-tools-2014-arbitrary-installation/</link>
      <pubDate>Fri, 07 Jun 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/06/07/maya-bonus-tools-2014-arbitrary-installation/</guid>
      <description>&lt;p&gt;Here’s how to install Maya Bonus Tools 2014 in an arbitrary location. I’ve covered two different methods (which can actually be mixed, if you will). The simple method (#1) is probably the best bet for most people while the “thorough” method (#2) could be interesting for some other folks. Take your pick.&lt;/p&gt;&#xA;&lt;h3 id=&#34;method-1-simple&#34;&gt;Method #1: Simple&lt;/h3&gt;&#xA;&lt;p&gt;Please note: This method comes from &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://area.autodesk.com/blogs/stevenr/bonustools&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Steven&lt;/a&gt;. I haven’t tried this and instead I went with the next approach (“Method #2: Thorough”), and that’s working great for me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PyQt4 in Maya 2014 on OS X</title>
      <link>http://localhost:1313/blog/2013/06/06/pyqt4-in-maya-2014-on-os-x/</link>
      <pubDate>Thu, 06 Jun 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/06/06/pyqt4-in-maya-2014-on-os-x/</guid>
      <description>&lt;p&gt;There are some official Autodesk &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://around-the-corner.typepad.com/adn/2013/04/building-sip-and-pyqt-for-maya-2014.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;instructions&lt;/a&gt; floating around on how to get PyQt4 support in of Maya 2014, but I found them a bit unclear and hard to follow. I also found an error (although minor)… so I’ve typed down my own little step-by-step reminder below, based off that.&lt;/p&gt;&#xA;&lt;p&gt;However, if you are in a hurry and just want the PyQt4 and SIP site-packages contents you can just go ahead and download the partial result of the long procedure below: &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://raw.githubusercontent.com/fredrikaverpil/maya/master/PyQt4/maya2014_osx/site-packages.zip&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;site-packages.zip&lt;/a&gt; – PyQt4 for Maya 2014 on OS X 10.8 Mountain Lion (PyQt 4.10 and SIP 4.14.5). Copy the contents into the following folder and you should have PyQt4 working in Maya 2014:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fujifilm X100S feedback</title>
      <link>http://localhost:1313/blog/2013/05/29/fujifilm-x100s-feedback/</link>
      <pubDate>Wed, 29 May 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/05/29/fujifilm-x100s-feedback/</guid>
      <description>&lt;p&gt;The information in this blog post was &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://twitter.com/fujiguys/status/339794906274988034&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;originally sent to @fujiguys&lt;/a&gt;, who in turn would forward it to Tokyo.&lt;/p&gt;&#xA;&lt;h2 id=&#34;excessive-skin-tone-smoothening-at-iso-6400&#34;&gt;Excessive skin tone smoothening at ISO 6400&lt;/h2&gt;&#xA;&lt;p&gt;Images shot at high ISO values, such as ISO 6400, exhibit excessive smoothening, especially visible in skin tones. As the RAF does not exhibit this at all it must be possible for the camera to develop a much less smoothened JPEG?&lt;/p&gt;&#xA;&lt;p&gt;If this entails showing more grain, I think that less smoothening and more grain is a much better trade-off.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Fujifilm X100S – compared to the X100</title>
      <link>http://localhost:1313/blog/2013/03/08/the-fujifilm-x100s-compared-to-the-x100/</link>
      <pubDate>Fri, 08 Mar 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/03/08/the-fujifilm-x100s-compared-to-the-x100/</guid>
      <description>&lt;p&gt;Having used the previous model, the X100, I will primarily focus on the&#xA;differences between these two models (that really makes a difference to me,&#xA;personally).&lt;/p&gt;&#xA;&lt;p&gt;I have linked random shots of mine from&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.flickr.com/photos/fredrik/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;flickr&lt;/a&gt; into this blog post along with&#xA;some RAW file samples. I am writing this blog post using firmware 1.0 on the&#xA;X100S.&lt;/p&gt;&#xA;&lt;h3 id=&#34;feature-comparison-rundown&#34;&gt;Feature comparison rundown&lt;/h3&gt;&#xA;&lt;p&gt;Fujifilm UK has posted somewhat of an official&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://plus.google.com/&amp;#43;fujifilmcameras/posts/a25FkWuXhhV&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;list of the 68 improvements&lt;/a&gt;&#xA;the X100S has over the X100 on Google+, but there seems to be some errors in it.&#xA;And of course DPReview has also compiled their changelog … but if you are&#xA;looking for the more hands-on experience related changes, read on…&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing &#34;read-only&#34; files in Maya</title>
      <link>http://localhost:1313/blog/2013/02/01/fixing-read-only-files-in-maya/</link>
      <pubDate>Fri, 01 Feb 2013 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2013/02/01/fixing-read-only-files-in-maya/</guid>
      <description>&lt;p&gt;Recently we ended up with a Maya scene with locked, read-only, nodes which prohibited us from deleting them from the scene. This usually happens to nodes having been part of a locked reference which has been imported into the scene. In our case, we had no access to the original referenced file, so we had to unlock these nodes from being read-only.&lt;/p&gt;&#xA;&lt;p&gt;For some reason it didn’t work to unlock them using the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://download.autodesk.com/global/docs/maya2012/en_us/CommandsPython/lockNode.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;lockNode&lt;/a&gt; command from within Maya and I had to write a Python script which would read each line of the Maya ASCII file and strip out any lines containing “lockNode”.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Happy holidays!</title>
      <link>http://localhost:1313/blog/2012/12/21/happy-holidays/</link>
      <pubDate>Fri, 21 Dec 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/12/21/happy-holidays/</guid>
      <description>&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe src=&#34;https://player.vimeo.com/video/56115398&#34; allowfullscreen title=&#34;Vimeo Video&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;For our digital company greeting card this holiday, I took some already created environments and mashed them together into this. And yes, just to be über-clear, it was all done with V-Ray for Maya with some Nuke comping on top. :)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generating a spherical HDR image with V-Ray for Maya</title>
      <link>http://localhost:1313/blog/2012/12/12/generating-a-spherical-hdr-image-with-v-ray-for-maya/</link>
      <pubDate>Wed, 12 Dec 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/12/12/generating-a-spherical-hdr-image-with-v-ray-for-maya/</guid>
      <description>&lt;ol&gt;&#xA;&lt;li&gt;Create a camera and place it where your objects resides which the HDR dome should affect.&lt;/li&gt;&#xA;&lt;li&gt;Add the V-Ray attribute “Camera Settings” to the camera and scroll down to “Extra Attributes” in the Attribute Editor. Here, set Type to “Spherical”. Override the FOV and set it to 360 degrees.&lt;/li&gt;&#xA;&lt;li&gt;In the render settings, set the output image format to .hdr, turn subpixel mapping off and do not clamp output.&lt;/li&gt;&#xA;&lt;li&gt;Render with width/height ratio 2:1, e.g. 2048x1024 px.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;sample-scene&#34;&gt;Sample scene&lt;/h2&gt;&#xA;&lt;p&gt;Example Maya scene provided &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;http://localhost:1313/blog/assets/vray/spherical_hdr_gen_maya.ma&#34;&gt;here&lt;/a&gt; (save as); a simple cube environment, an area light and a camera.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing PyQt4 in Nuke 6.3 on Windows</title>
      <link>http://localhost:1313/blog/2012/11/26/installing-pyqt4-in-nuke-6.3-on-windows/</link>
      <pubDate>Mon, 26 Nov 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/11/26/installing-pyqt4-in-nuke-6.3-on-windows/</guid>
      <description>&lt;p&gt;A few steps to get PyQt working inside of Nuke 6.3 (Windows only for now).&lt;/p&gt;&#xA;&lt;p&gt;Please note that you need your own menu.py in place for this to work. In case you need this set up first, check out one of my previous articles, &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;../2011-10-28-nuke-63-small-studio-setup-for-windows-osx/&#34;&gt;Nuke 6.3 Small studio setup for Win/Mac&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Install 64-bit Python 2.6 from &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.python.org/download/releases/2.6/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.python.org/download/releases/2.6/&lt;/a&gt; into C:\python26.&lt;/li&gt;&#xA;&lt;li&gt;Install the PyQt 4.6 snapshot from &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://code.google.com/p/pyqt4-win64-binaries/downloads/detail?name=PyQt-Py2.6-gpl-4.6-snapshot-20090810-1.exe&amp;amp;can=2&amp;amp;q=&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://code.google.com/p/pyqt4-win64-binaries/downloads/detail?name=PyQt-Py2.6-gpl-4.6-snapshot-20090810-1.exe&amp;amp;can=2&amp;amp;q=&lt;/a&gt; into C:\python26_64 and make sure to untick the “Qt runtime” checkbox.&lt;/li&gt;&#xA;&lt;li&gt;Copy all the files inside of C:\Python26_64\Lib\site-packages to &lt;Nuke installation&gt;\lib\site-packages or to a server location of your choice.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;If you copied the files to a folder residing on the server, add the following to your menu.py (and modify):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wilson tennis ball</title>
      <link>http://localhost:1313/blog/2012/10/29/wilson-tennis-ball/</link>
      <pubDate>Mon, 29 Oct 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/10/29/wilson-tennis-ball/</guid>
      <description>&lt;p&gt;A personal weekend project. Everything created from scratch in 3D and completed within the same day (that rarely happens these days&amp;hellip;). It feels good to be back! :)&lt;/p&gt;&#xA;&lt;h2 id=&#34;wireframe&#34;&gt;Wireframe&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;http://localhost:1313/blog/assets/wilson/wilson_wireframe.jpg&#34; alt=&#34;&#34;&gt;&#xA;&lt;em&gt;Maya viewport screengrab.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;I started out with a 24x12 sphere, extracted parts of it which I then rotated and welded back in place. This caused a symmetric and natural flow.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Metadata and EXIF in Nuke</title>
      <link>http://localhost:1313/blog/2012/08/18/metadata-and-exif-in-nuke/</link>
      <pubDate>Sat, 18 Aug 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/08/18/metadata-and-exif-in-nuke/</guid>
      <description>&lt;p&gt;In &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.thefoundry.co.uk/products/nuke/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;The Foundry’s Nuke&lt;/a&gt;, accessing the metadata of an image sequence’s Read node can be done via the ViewMetaData node. But if you wish to extract values out of the metadata and e.g. burn the timestamp for each frame into a render, it is actually easier to just do some python scripting.&lt;/p&gt;&#xA;&lt;p&gt;In the example below, I am using JPEG footage from a GoPro HD Hero2 but this technique also works fine for Cineon and DPX files etc.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fujifilm Finepix X100 – LCD/EVF observations</title>
      <link>http://localhost:1313/blog/2012/08/09/fujifilm-finepix-x100-lcd/evf-observations/</link>
      <pubDate>Thu, 09 Aug 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/08/09/fujifilm-finepix-x100-lcd/evf-observations/</guid>
      <description>&lt;p&gt;Some people have asked whether the “Preview Depth of Field” function is different from the regular LCD/EVF view or not (which it is), why the histogram is acting up (which it sometimes can do) and I’ve also seen questions regarding why exposure lock (AE-L) mapped to the AFL/AEL-button does not seem to be happening when pressing the AFL/AEL-button. Here’s an attempt to try and explain why this is so.&lt;/p&gt;&#xA;&lt;p&gt;Below, the two stages of what the LCD/EVF will show when shooting a picture, explained.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fujifilm Finepix X100 – RAW and film simulation</title>
      <link>http://localhost:1313/blog/2012/08/04/fujifilm-finepix-x100-raw-and-film-simulation/</link>
      <pubDate>Sat, 04 Aug 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/08/04/fujifilm-finepix-x100-raw-and-film-simulation/</guid>
      <description>&lt;p&gt;– Why film simulations are not disabled when shooting RAW?&lt;/p&gt;&#xA;&lt;p&gt;A RAW file is a photo that hasn’t been developed yet and simply consist of numerical values representing the amount of light that has been recorded by the sensor (in the case of the X100 this is 12-bit per pixel). It has to be somehow converted into RGB in order to be viewable on a computer screen (or the camera’s LCD/EVF) as an image that you can look at. This can be done through RAW converters or image viewers which know how to interpret the RAW file into an RGB image.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Fujifilm X100 – a year in retrospect</title>
      <link>http://localhost:1313/blog/2012/06/12/the-fujifilm-x100-a-year-in-retrospect/</link>
      <pubDate>Tue, 12 Jun 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/06/12/the-fujifilm-x100-a-year-in-retrospect/</guid>
      <description>&lt;p&gt;Simply put: the best camera I’ve ever owned.&lt;/p&gt;&#xA;&lt;p&gt;Back in 2001, I used to carry a Canon Digital IXUS/Elph everywhere I went. I took photos on my way to work, in the office and with friends in the weekends. Like a reflex, like bicycling, whenever I found myself with a photo opportunity I would fling the camera out of my pocket, position and shoot. For me, it was half the fun editing everything in Photoshop.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create .app to launch Python script in Mac OS X</title>
      <link>http://localhost:1313/blog/2012/06/04/create-.app-to-launch-python-script-in-mac-os-x/</link>
      <pubDate>Mon, 04 Jun 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/06/04/create-.app-to-launch-python-script-in-mac-os-x/</guid>
      <description>&lt;p&gt;Quick step-by-step to create clickable .app to launch your python scripts.&lt;/p&gt;&#xA;&lt;p&gt;Launch the ApplecScript Editor (located in /Applications/Utilities/) and type in the following into the editor:&lt;/p&gt;&#xA;&lt;div class=&#34;code-block-wrapper&#34;&gt;&#xA;  &lt;button class=&#34;copy-code-button&#34; aria-label=&#34;Copy code to clipboard&#34;&gt;&#xA;    &lt;svg class=&#34;copy-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;&#xA;      &lt;path d=&#34;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&#34;&gt;&lt;/path&gt;&#xA;      &lt;rect x=&#34;8&#34; y=&#34;2&#34; width=&#34;8&#34; height=&#34;4&#34; rx=&#34;1&#34; ry=&#34;1&#34;&gt;&lt;/rect&gt;&#xA;    &lt;/svg&gt;&#xA;    &lt;svg class=&#34;check-icon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; style=&#34;display: none;&#34;&gt;&#xA;      &lt;polyline points=&#34;20 6 9 17 4 12&#34;&gt;&lt;/polyline&gt;&#xA;    &lt;/svg&gt;&#xA;  &lt;/button&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-applescript&#34; data-lang=&#34;applescript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;tell&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;application&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Terminal&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;nv&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;python /path/to/your/script.py&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;tell&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;And simply hit save. Choose to save as application.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nuke and CPU usage in Windows</title>
      <link>http://localhost:1313/blog/2012/03/28/nuke-and-cpu-usage-in-windows/</link>
      <pubDate>Wed, 28 Mar 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/03/28/nuke-and-cpu-usage-in-windows/</guid>
      <description>&lt;p&gt;On Windows, sometimes Nuke and Maya fights over resources, especially the CPU. This can become apparent when background rendering with Maya.&lt;/p&gt;&#xA;&lt;h2 id=&#34;priority&#34;&gt;Priority&lt;/h2&gt;&#xA;&lt;p&gt;By launching the Task Manager, you can right-click the Nuke6.3.exe process and choose to set its priority to “Realtime”. This will make Nuke respond without having to fight with a background Maya render.&lt;/p&gt;&#xA;&lt;p&gt;In order to launch Nuke with realtime priority already set, launch this command (or make a shortcut):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting V-Ray to render Nuke-style Z-depth</title>
      <link>http://localhost:1313/blog/2012/02/21/getting-v-ray-to-render-nuke-style-z-depth/</link>
      <pubDate>Tue, 21 Feb 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/02/21/getting-v-ray-to-render-nuke-style-z-depth/</guid>
      <description>&lt;p&gt;If you have come this far you might be interested in a couple of small tips and tricks on how to get that 32-bit floating point depth channel to render out of V-Ray and into Nuke, similar to what you might be used to from Mental Ray and the IFF file format.&lt;/p&gt;&#xA;&lt;h2 id=&#34;table-of-contents&#34;&gt;Table of contents&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Creating a V-Ray Z-depth pass in Maya&lt;/li&gt;&#xA;&lt;li&gt;Bringing the V-Ray Z-depth pass into Nuke&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;creating-a-v-ray-z-depth-pass-in-maya&#34;&gt;Creating a V-Ray Z-depth pass in Maya&lt;/h2&gt;&#xA;&lt;h3 id=&#34;render-settings&#34;&gt;Render settings&lt;/h3&gt;&#xA;&lt;p&gt;Open up the render settings, go to the &lt;code&gt;V-Ray&lt;/code&gt; tab and make sure that &lt;code&gt;Image format&lt;/code&gt; is set to &lt;code&gt;OpenEXR&lt;/code&gt; (multichannel) and that &lt;code&gt;OpenEXR data type&lt;/code&gt; is set to &lt;code&gt;32-bit float&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>V-Ray for Maya</title>
      <link>http://localhost:1313/blog/2012/02/16/v-ray-for-maya/</link>
      <pubDate>Thu, 16 Feb 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/02/16/v-ray-for-maya/</guid>
      <description>&lt;p&gt;Running V-Ray for Maya in a production environment has its quirks. I have collected some bits and pieces off the &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.chaosgroup.com/forums/vbulletin/showthread.php?51035-maintaining-Vray-builds-with-workstations-and-the-render-frarm/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Chaos Group forum&lt;/a&gt; and assembled it all here.&lt;/p&gt;&#xA;&lt;h2 id=&#34;table-of-contents&#34;&gt;Table of contents&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Arbitrary location installation&lt;/li&gt;&#xA;&lt;li&gt;Arbitrary location configuration&lt;/li&gt;&#xA;&lt;li&gt;Python launch script and MEL sourcing&lt;/li&gt;&#xA;&lt;li&gt;Launching the V-Ray render slave from the arbitrary location&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;arbitrary-location-installation&#34;&gt;Arbitrary location installation&lt;/h2&gt;&#xA;&lt;p&gt;Choose a server location for all your builds and create a folder for the specific build you are installing. I am going to refer to this as the &lt;code&gt;[build folder]&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fujifilm X100 settings &amp; notes</title>
      <link>http://localhost:1313/blog/2012/02/02/fujifilm-x100-settings-notes/</link>
      <pubDate>Thu, 02 Feb 2012 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2012/02/02/fujifilm-x100-settings-notes/</guid>
      <description>&lt;p&gt;Some facts about the camera which are easy to forget as well some notes to self.&lt;/p&gt;&#xA;&lt;h2 id=&#34;iso&#34;&gt;ISO&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The hardware is only capable of maximum ISO 1600. Any higher ISO value is pushed with software in camera.&lt;/li&gt;&#xA;&lt;li&gt;ISO value also serves as lowest ISO value allowed when Auto ISO is on.&lt;/li&gt;&#xA;&lt;li&gt;Auto-ISO can be set to a maximum ISO value between 400 - 3200.&lt;/li&gt;&#xA;&lt;li&gt;When shooting RAW (with Auto-ISO turned off), ISO can be set to a minimum of 200 and a maximum of 6400.&lt;/li&gt;&#xA;&lt;li&gt;When shooting in JPG mode (with Auto-ISO turned off), ISO can be set to a minimum of 100 and a maximum of 12800.&lt;/li&gt;&#xA;&lt;li&gt;When in Auto-ISO, the “Min shutter” value will not be respected if you hit the Max ISO value. The Min shutter value could therefore be regarded as a “soft limit” Min shutter value.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;dynamic-range-tone-mapping&#34;&gt;Dynamic range (tone mapping)&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DR100 is the default setting for the camera.&lt;/li&gt;&#xA;&lt;li&gt;DR200 (changes minimum ISO to 400) will stop down the RAW 1 stop.&lt;/li&gt;&#xA;&lt;li&gt;DR400 (changes minimum ISO to 800) will stop down the RAW 2 stops.&lt;/li&gt;&#xA;&lt;li&gt;RAW files with DR200 or DR400 will appear darker in post production as they are stopped down, and there is currently no way for e.g. Lightroom to interpret this feature in order to compensate (the way the JPG engine does).&lt;/li&gt;&#xA;&lt;li&gt;Dynamic range is really only good if you use the camera’s JPG engine. If you shoot RAW only, you should set this to DR100 and tweak exposure in post production.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;auto-focus&#34;&gt;Auto focus&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The X100 uses Contrast Detection Auto Focus (CD AF), which means you should never try to find focus at the edge between two objects of different distance from the camera. More details &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.x100forum.com/index.php?/topic/1713-focus-101/page__view__findpost__p__19694&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;by Arjay&lt;/a&gt; on this over at the X100 Forum.&lt;/li&gt;&#xA;&lt;li&gt;The X100 is not a true rangefinder camera, thus is not great at manual focus. For best AF performance, use AF-S with smallest AF window in Electrical View Finder (EVF).&lt;/li&gt;&#xA;&lt;li&gt;The X100 will have more difficulty locking AF onto horizontal lines than on vertical lines.&lt;/li&gt;&#xA;&lt;li&gt;The AFL/AEL button is by default set to Auto Exposure Lock (AE-L), by setting this to AF-L, auto focus can be locked instead.&lt;/li&gt;&#xA;&lt;li&gt;Optical View Finder (OVF) Power Save Mode set to “on” will reduce AF performance, according to the manual.&lt;/li&gt;&#xA;&lt;li&gt;AF-C is reportedly increasing chances of an AF lock in dim-lit situations.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;lens-characteristics&#34;&gt;Lens characteristics&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prime f/2.0 23mm, equivalent to 35mm on a 35mm camera.&lt;/li&gt;&#xA;&lt;li&gt;The lens is at its sharpest at f/4-f/5.6 and is very, very soft at f/2. For high depth-of-field, f/11 is a good compromise but at f/16 effects of diffraction increases.&lt;/li&gt;&#xA;&lt;li&gt;Built in ND filter (equivalent f-stop reduction of 3).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;memory-card-speed-tests&#34;&gt;Memory card speed tests&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;Type of test&#x9;&#x9;&#x9;45MB/s&#x9;&#x9;95MB/s&#xA;------------------------------------------------------&#xA;1 RAW+F&#x9;&#x9;&#x9;&#x9;5.3s&#x9;&#x9;3.5s&#xA;5 RAW+F (continuous burst)&#x9;26.3s&#x9;&#x9;19.8s&#xA;1 JPG/F&#x9;&#x9;&#x9;&#x9;1.5s&#x9;&#x9;1.5s&#xA;5 JPG/F (continuous burst)&#x9;15.6s&#x9;&#x9;15.6s&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;It seems there is no reason for JPG-only shooters to upgrade their cards for faster speeds but some speed gains are seen when shooting RAW.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nuke script</title>
      <link>http://localhost:1313/blog/2011/11/12/nuke-script/</link>
      <pubDate>Sat, 12 Nov 2011 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2011/11/12/nuke-script/</guid>
      <description>&lt;p&gt;Launch the source directory of the selected Read or Write node.&lt;/p&gt;&#xA;&lt;p&gt;The script will take the selected Read or Write node’s file path, and open it using Explorer on Windows or Finder on Mac OS X. Optionally, you can feed the script with your own path of choice and make that open up. The script was built for Nuke 6.3 and has support for filenamefilter callback.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;&#xA;&lt;p&gt;Download: &#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;    &#xA;    &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;  &#xA;  &#xA;&#xA;  &lt;a href=&#34;https://github.com/fredrikaverpil/nuke/raw/master/scripts/browseDir.py&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; class=&#34;feather feather-github&#34;&gt;&lt;path d=&#34;M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22&#34;&gt;&lt;/path&gt;&lt;/svg&gt;browseDir.py&lt;/a&gt; (v1.1, 2013-10-13)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Read node from Write node</title>
      <link>http://localhost:1313/blog/2011/11/11/read-node-from-write-node/</link>
      <pubDate>Fri, 11 Nov 2011 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2011/11/11/read-node-from-write-node/</guid>
      <description>&lt;p&gt;Written in Python, with Nuke 6.9 in mind, generate a Read node from the selected Write node.&lt;/p&gt;&#xA;&lt;p&gt;Howdy! There&amp;rsquo;s a newer version of this script &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;../2016-05-23-nuke-script-read-node-from-write-node/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The script will attempt to load an image sequence or a single file (such as a movie file), based off the selected Write node. If the first and last frame can not be determined, it will fall back to the project settings’ frame range and throw a warning.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nuke 6.3 small studio setup for Windows/OS X</title>
      <link>http://localhost:1313/blog/2011/10/28/nuke-6.3-small-studio-setup-for-windows/os-x/</link>
      <pubDate>Fri, 28 Oct 2011 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2011/10/28/nuke-6.3-small-studio-setup-for-windows/os-x/</guid>
      <description>&lt;p&gt;This is a quick guide to setting Nuke 6.3 up with a custom menu and make it work more seamlessly across operating systems.&lt;/p&gt;&#xA;&lt;p&gt;Since I jump between my Mac laptop and a Windows based workstation, I used to mess around with broken file read nodes in The Foundry’s Nuke and other stuff related to file paths being different on Windows and Mac OS X. Well&amp;hellip; no more!&lt;/p&gt;&#xA;&lt;p&gt;In this article, I will explain how to set up Nuke with a few handy extras that will make it fly even smoother across Windows and Mac computers, and with custom menus. Let me know if there are any specific Windows/Mac switching woes that you are experiencing, which are not covered here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Remote Windows management with PsTools, part 3</title>
      <link>http://localhost:1313/blog/2011/06/02/remote-windows-management-with-pstools-part-3/</link>
      <pubDate>Thu, 02 Jun 2011 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2011/06/02/remote-windows-management-with-pstools-part-3/</guid>
      <description>&lt;p&gt;In this third article on PsTools I talk about how to control V-Ray DR slaves remotely with the PsTools suite.&lt;/p&gt;&#xA;&lt;p&gt;You can launch the V-Ray render slave either as a service or in a stand-alone command line window. I prefer the latter, because it is easy to run into file server permissions issues with the service (it needs to be set up with proper access to the file server’s share). PsTools then will help launch and kill the V-Ray slave whether your weapon of choice is service or stand-alone command line window.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Remote Windows management with PsTools, part 2</title>
      <link>http://localhost:1313/blog/2011/05/15/remote-windows-management-with-pstools-part-2/</link>
      <pubDate>Sun, 15 May 2011 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2011/05/15/remote-windows-management-with-pstools-part-2/</guid>
      <description>&lt;p&gt;In this second part of managing Windows machines using the PsTools suite, we will look at how to automate processes involving interacting with a server.&lt;/p&gt;&#xA;&lt;p&gt;Examples of task scripts for installing Nuke, Maya and V-Ray can be found further down in this article. A zip package is available here with all scripts explained in this article.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-concept&#34;&gt;The concept&lt;/h2&gt;&#xA;&lt;p&gt;This is the main concept; from a local managing machine (such as a laptop), have workstations and farm machines run a remote script to carry out a task. Have a look at the diagram below:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Remote Windows management with PsTools, part 1</title>
      <link>http://localhost:1313/blog/2011/05/13/remote-windows-management-with-pstools-part-1/</link>
      <pubDate>Fri, 13 May 2011 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2011/05/13/remote-windows-management-with-pstools-part-1/</guid>
      <description>&lt;p&gt;One of the advantages of running Linux on render farm machines is the possibility to remotely manage them using the command line. However if you are running the farm on Windows, this is a whole different kind of story.&lt;/p&gt;&#xA;&lt;p&gt;By using Mark Russinovich’s &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://technet.microsoft.com/en-us/sysinternals/bb896649&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PsTools&lt;/a&gt; it is possible to remotely manage render farm machines running on Windows with otherwise quite daunting tasks and without very little (if any) programming experience. You can use the suite of tools to easily restart machines, silently install software, manage services and environment variables or even distribute files onto remote machines on your network. The only prerequisite is that you are running Windows on both the managing machine as well as on the target machine and that both computers are residing on the same local network. Perfect for a small VFX shop without an elaborate IT department.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing Maya scenes on multiple platforms</title>
      <link>http://localhost:1313/blog/2010/11/24/managing-maya-scenes-on-multiple-platforms/</link>
      <pubDate>Wed, 24 Nov 2010 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2010/11/24/managing-maya-scenes-on-multiple-platforms/</guid>
      <description>&lt;p&gt;Ever found yourself trying to open a complex Maya scene with nested references on a Windows/Linux network using your Macbook (or any of the other OS combos)?&lt;/p&gt;&#xA;&lt;p&gt;I work in a Windows Server environment where PC drive letters are being used – and as I’m on a Mac system this poses a big problem when trying to open a complex Maya scene, linking to files outside of the Maya project; meaning I have to click through numerous dialogues and set the path so that my Mac will find the files. However, the &lt;code&gt;dirmap&lt;/code&gt; command comes to the rescue!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linear workflow, part 2</title>
      <link>http://localhost:1313/blog/2010/06/27/linear-workflow-part-2/</link>
      <pubDate>Sun, 27 Jun 2010 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2010/06/27/linear-workflow-part-2/</guid>
      <description>&lt;p&gt;This is how I would deal with the linear workflow (including non-linear preview) between Maya 2010 and Nuke 6.0v6.&lt;/p&gt;&#xA;&lt;p&gt;If you are new to linear workflows and do not really understand what this is for, please read the Linear Workflow, &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;../2010-05-27-linear-workflow-part-1/&#34;&gt;part 1&lt;/a&gt; article before continuing.&lt;/p&gt;&#xA;&lt;h2 id=&#34;default-render-no-gamma-correction&#34;&gt;Default render, no gamma correction&lt;/h2&gt;&#xA;&lt;p&gt;Make sure mental ray is loaded by enabling the mrtomaya.mll plugin in the plug-in manager. Put your favourite model in the scene, create a camera and some lights. Hit render.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enabling Iray in Maya 2011</title>
      <link>http://localhost:1313/blog/2010/05/27/enabling-iray-in-maya-2011/</link>
      <pubDate>Thu, 27 May 2010 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2010/05/27/enabling-iray-in-maya-2011/</guid>
      <description>&lt;p&gt;Mental images and/or Autodesk has intentionally not made Iray available in the latest release of Autodesk Maya; version 2011. But there is a workaround&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;The initial version of &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.mentalimages.com/products/Iray.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Iray&lt;/a&gt; is bundled with mental ray 3.8 (stand alone and reality server) and takes advantage of the GPU when lighting, shading and rendering. According to a &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://forum.mentalimages.com/showthread.php?t=6503&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mental forums thread&lt;/a&gt;, Iray was intentionally left out of mental ray bundled with Maya 2011 since it’s still under heavy development. It was only included in the stand alone and reality server flavours and provided “as is” without further support.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linear workflow, part 1</title>
      <link>http://localhost:1313/blog/2010/05/27/linear-workflow-part-1/</link>
      <pubDate>Thu, 27 May 2010 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2010/05/27/linear-workflow-part-1/</guid>
      <description>&lt;p&gt;There seems to be a general confusion on linear workflows and how 3D/compositing packages work, what sRGB/gamma 2.2 is for and why it’s a good idea to render images in linear data throughout the pipeline. This is my take on a linear workflow with Maya and Nuke as well as a bit of history on the subject.&lt;/p&gt;&#xA;&lt;p&gt;Most graphics software use a linear data model. Simply put, this means that the math used when creating digital images works in a linear fashion, e.g. 2 + 2 = 4. In effect, you can say that linear math is applied when a 3D renderer is calculating what the resulting image should be like. However, our display devices, such as monitors, do not use linear math when visualizing this data as images. They use non-linear (logarithmic) math due to the technology used in recording and displaying images. For them this could in some cases mean that the linear data of e.g. 2 + 2 = 4 is interpreted as 2 + 2 = 10. In order make the linear data which makes up an image show on a device that needs to visualize non-linear data, we need to convert or rather “correct” the linear data image. This is done using &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.poynton.com/notes/colour_and_gamma/GammaFAQ.html#gamma&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;gamma&lt;/a&gt;. The gamma varies depending on the display device but the most common gamma for laptops and computer display devices these days is gamma 2.2, also known as &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/SRGB&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;sRGB&lt;/a&gt; (although sRGB is not exactly gamma 2.2). So a &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.poynton.com/notes/colour_and_gamma/GammaFAQ.html#gamma_correction&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;gamma correction&lt;/a&gt; curve is applied and baked into the image file by the graphics software so that the image is shown correctly on our display devices. The gamma correction for sRGB devices (with a gamma of approximately 2.2) is ½.2 = 0.4545.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enabling the mental ray production shaders</title>
      <link>http://localhost:1313/blog/2010/05/19/enabling-the-mental-ray-production-shaders/</link>
      <pubDate>Wed, 19 May 2010 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2010/05/19/enabling-the-mental-ray-production-shaders/</guid>
      <description>&lt;p&gt;The production shader library contains a set of shaders aimed at production&#xA;users of mental ray. The library contains a diverse collection of shaders,&#xA;ranging from small utilities such as ray type switching and card opacity to&#xA;large complex shaders such as the fast 2d motion blur shader.&lt;/p&gt;&#xA;&lt;p&gt;In order to enable the mental ray production shader library, you can edit the&#xA;&lt;code&gt;mentalrayCustomNodeClass.mel&lt;/code&gt; or simply type the following into the script&#xA;editor:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kenny Begins</title>
      <link>http://localhost:1313/blog/2009/12/10/kenny-begins/</link>
      <pubDate>Thu, 10 Dec 2009 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2009/12/10/kenny-begins/</guid>
      <description>&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe src=&#34;https://player.vimeo.com/video/9684926&#34; allowfullscreen title=&#34;Vimeo Video&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Eleven years after the successful TV series “Kenny Starfighter”, galaxy hero Kenny returns in “Kenny Begins”. The ambitions of the film, shot with the Red One camera, was to become the biggest feature film of the action comedy genre ever made in Sweden, sporting more than 600 visual effects shots.&lt;/p&gt;&#xA;&lt;p&gt;My work on this project started early on with script breakdown (into VFX shots) followed by on-set VFX supervision and previz as well as look development of the fully-3D sequences. After having been on-set the serious work started to get all shots done in time. I primarily worked with animation, shading, lighting, rendering in Maya and compositing in Nuke throughout the project together with the excellent team at Filmgate.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Digital visual effects showreel 2008</title>
      <link>http://localhost:1313/blog/2008/12/25/digital-visual-effects-showreel-2008/</link>
      <pubDate>Thu, 25 Dec 2008 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2008/12/25/digital-visual-effects-showreel-2008/</guid>
      <description>&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe src=&#34;https://www.youtube.com/embed/qoUwYdO2emY&#34; allowfullscreen title=&#34;YouTube Video&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;This is a showcase of some assorted hands-on work done by me at&#xA;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.filmgate.se&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Filmgate&lt;/a&gt;.&#xA;Besides working on the graphics (and generally running the company with my&#xA;co-founders), I was responsible for script breakdowns and on-set supervision&#xA;for many feature film productions. A full list of productions can be seen over&#xA;at &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.imdb.com/name/nm1972642/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IMDB&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Some of the later productions before leaving Filmgate in 2009 is unfortunately&#xA;not included in the showreel.&lt;/p&gt;&#xA;&lt;h2 id=&#34;breakdown&#34;&gt;Breakdown&lt;/h2&gt;&#xA;&lt;h3 id=&#34;lasers&#34;&gt;Lasers&lt;/h3&gt;&#xA;&lt;p&gt;Animation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ramlösa</title>
      <link>http://localhost:1313/blog/2007/07/09/raml%C3%B6sa/</link>
      <pubDate>Mon, 09 Jul 2007 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2007/07/09/raml%C3%B6sa/</guid>
      <description>&lt;p&gt;While working at &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.filmgate.se&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Filmgate&lt;/a&gt;, I assisted &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.bobby.se&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Bobby&lt;/a&gt; in completing two 3D “Eurosize” ad board prints: “Ramlösa Kaktus” and “Ramlösa Persimon &amp;amp; Grape”.&lt;/p&gt;&#xA;&lt;p&gt;This was my first encounter with V-Ray (for 3D Studio Max) in a production environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Island of Lost Souls</title>
      <link>http://localhost:1313/blog/2007/02/10/island-of-lost-souls/</link>
      <pubDate>Sat, 10 Feb 2007 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2007/02/10/island-of-lost-souls/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.filmgate.se&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Filmgate&lt;/a&gt; were offered the opportunity by Ghost A/S to work, as sub-contractors, on this exciting Zentropa production which at the time was the largest visual effects movie to be made in Scandinavia.&lt;/p&gt;&#xA;&lt;p&gt;The work for Filmgate involved working on 457 shots out of 627 which consisted of compositing, roto, matte paintings, set extensions and various small 3D work. On this project I primarily worked with green screen keying and compositing in Nuke as well as minor 3D work in Maya.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pistvakt</title>
      <link>http://localhost:1313/blog/2005/10/10/pistvakt/</link>
      <pubDate>Mon, 10 Oct 2005 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2005/10/10/pistvakt/</guid>
      <description>&lt;p&gt;One of my very first feature film visual effects projects, where I primarily performed compositing and blue screen keying in Shake as well as some minor 3D work in Maya while working at Farmland, Trollhättan.&lt;/p&gt;&#xA;&lt;p&gt;This was, at the time, the largest blue screen production to have been made in Scandinavia.&lt;/p&gt;&#xA;&lt;h2 id=&#34;vfx-breakdown-samples&#34;&gt;VFX breakdown samples&lt;/h2&gt;&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe src=&#34;https://player.vimeo.com/video/1164699&#34; allowfullscreen title=&#34;Vimeo Video&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe src=&#34;https://player.vimeo.com/video/1139497&#34; allowfullscreen title=&#34;Vimeo Video&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe src=&#34;https://player.vimeo.com/video/1139165&#34; allowfullscreen title=&#34;Vimeo Video&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;additional-information&#34;&gt;Additional information&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.imdb.com/title/tt0451160/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IMDB&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Maya particle shading script</title>
      <link>http://localhost:1313/blog/2005/05/09/maya-particle-shading-script/</link>
      <pubDate>Mon, 09 May 2005 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2005/05/09/maya-particle-shading-script/</guid>
      <description>&lt;p&gt;A MEL script that hooks your particle system up with a camera automatically, resulting in a z-depth/focus depth/height/age/etc shader, that can be used to render images meant to serve as an aid during compositing. This way you can e.g. render out hardware particles’ depth channel with motion blur.&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Note&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;The script was written by &#xA;&#xA;&#xA;&#xA;&lt;a href=&#34;https://www.bhenriksson.se&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Björn Henriksson&lt;/a&gt; and myself and has been tested on Maya version 5.0 and 6.5.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Z composit with IFF in Shake</title>
      <link>http://localhost:1313/blog/2005/03/15/z-composit-with-iff-in-shake/</link>
      <pubDate>Tue, 15 Mar 2005 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2005/03/15/z-composit-with-iff-in-shake/</guid>
      <description>&lt;p&gt;Utilizing the Z channel (depth information) of Maya’s IFF files in Shake is a bit tricky because of the way Maya stores depth information… here’s a quick tutorial to get you started.&lt;/p&gt;&#xA;&lt;blockquote class=&#34;callout markdown-alert callout-note markdown-alert-note&#34;&gt;&lt;div class=&#34;callout-title markdown-alert-title&#34;&gt;&#xA;    &lt;svg class=&#34;callout-icon&#34; viewBox=&#34;0 0 24 24&#34; width=&#34;16&#34; height=&#34;16&#34; aria-hidden=&#34;true&#34; fill=&#34;currentColor&#34;&gt;&lt;path d=&#34;M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xA;    Note&#xA;  &lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;This tutorial is applicable on not only Maya’s IFF files but also on other image format files rendered out of other 3D applications. Example files are available for download below. Happy shaking!&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
