<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Technology Posts on John Goetz</title>
    <link>https://metamost.com/post/tech/</link>
    <description>Recent content in Technology Posts on John Goetz</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sun, 20 Nov 2022 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://metamost.com/post/tech/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Some Useful Python Utilities</title>
      <link>https://metamost.com/post/tech/python-utilities/</link>
      <pubDate>Sun, 20 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/python-utilities/</guid>
      <description>&lt;p&gt;There are a number of small Python functions that I have copied around to several of my projects, both professional and personal. They are unrelated but generally useful and I have put them into a single repository at &lt;a href=&#34;https://gitlab.com/johngoetz/pyutil&#34;&gt;gitlab.com/johngoetz/pyutil&lt;/a&gt;. Here, I&amp;rsquo;ll talk about the smaller and more useful methods that I use almost daily.&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;h2 id=&#34;back-porting-features-from-older-versions-of-python&#34;&gt;Back-Porting Features from Older Versions of Python&lt;/h2&gt;&#xA;&lt;p&gt;When dealing with many different systems and platforms, such as in automated testing infrastructure for desktop application software, we can&amp;rsquo;t always keep Python up to date. This shouldn&amp;rsquo;t stop us from using new features however and there are a few specific methods that I always back-port to earlier versions of Python.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shallow Copy-On-Write VM Clones with LibVirt</title>
      <link>https://metamost.com/post/tech/libvirt-linked-clones/</link>
      <pubDate>Fri, 04 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/libvirt-linked-clones/</guid>
      <description>&lt;p&gt;The LibVirt utility &lt;code&gt;virt-clone&lt;/code&gt;, by default, makes a full copy of all &lt;code&gt;qcow2&lt;/code&gt; disks of the original. In this post, I show how to use Python to make new &lt;code&gt;qcow2&lt;/code&gt; disks using the originals as the &amp;ldquo;backing store&amp;rdquo; and linking these new images to the LibVirt clone. The resulting virtual machine takes seconds to create and takes up hardly any additional space.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrating from Docker Compose to Podman</title>
      <link>https://metamost.com/post/tech/podman-from-docker-compose/</link>
      <pubDate>Tue, 31 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/podman-from-docker-compose/</guid>
      <description>&lt;p&gt;For small operations, say 20 developers or so, deploying web services using &lt;em&gt;docker&lt;/em&gt; and &lt;em&gt;docker-compose&lt;/em&gt; seems to be plenty sufficient. When a single server can handle all the load requirements for a website, the simplicity and transparency of &lt;em&gt;docker-compose&lt;/em&gt; is great. I used to take a VM snap-shot, run &lt;code&gt;docker-compose pull&lt;/code&gt; followed by &lt;code&gt;docker-compose up -d&lt;/code&gt; and just like that, my GitLab instance was up and running the latest version. All of this convenience was threatened when I attempted to keep up with current developments in container technology and switch to Podman. However, with Podman came several benefits plus a kick in the direction of being able to scale my applications with Kubernetes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenGL with Python Part 2</title>
      <link>https://metamost.com/post/tech/opengl-with-python/02-opengl-with-python-pt2/</link>
      <pubDate>Mon, 20 May 2019 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/opengl-with-python/02-opengl-with-python-pt2/</guid>
      <description>&lt;p&gt;Building up a simple foundation of modern OpenGL with shaders using Python, PyOpenGL and GLFW, we introduce the model-view-projection matrix and uniform variables.&lt;/p&gt;</description>
    </item>
    <item>
      <title>First Steps with OpenGL Using Python</title>
      <link>https://metamost.com/post/tech/opengl-with-python/01-opengl-with-python/</link>
      <pubDate>Fri, 10 May 2019 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/opengl-with-python/01-opengl-with-python/</guid>
      <description>&lt;p&gt;Modern OpenGL with shaders is used with Python 3.7 via PyOpenGL and GLFW to create a simple hello world script that will be the starting point of diving deep into the GL shader language (GLSL).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Controlling Subprocess Window Position from the Terminal</title>
      <link>https://metamost.com/post/tech/subproc-window-position/</link>
      <pubDate>Fri, 26 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/subproc-window-position/</guid>
      <description>&lt;p&gt;I wanted a way to open processes from a script and have the resulting window placed in a specific position on the screen. There seems to be only a few options to get this done on Linux. The top contenders are: wmctrl, xdotool and devilspie2 but as far as I can tell, none of these tools assist in getting the window ID if it&amp;rsquo;s created in a child process. I started down the road of using the ps command, but switched to Python and the psutil module for it&amp;rsquo;s convenient Process.children() method. Also, I decided to use the wmctrl command to actually modify the window geometry.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comparing Python Script Performance Across Platforms</title>
      <link>https://metamost.com/post/tech/profiling-python/</link>
      <pubDate>Fri, 28 Sep 2018 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/profiling-python/</guid>
      <description>&lt;p&gt;Organizing the results from Python&amp;rsquo;s profiling module helps compare them across disparate platforms, especially when the code path is different between them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Write Python with the Ease of FORTRAN!</title>
      <link>https://metamost.com/post/tech/python-and-fortran/</link>
      <pubDate>Tue, 03 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/python-and-fortran/</guid>
      <description>&lt;p&gt;Using Forpy to write a FORTRAN program that links in the Python runtime. This is called &amp;ldquo;embedding&amp;rdquo; and is the opposite of what is typically done through &amp;ldquo;extending&amp;rdquo; with something like f2py.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ghost Platform Using Docker</title>
      <link>https://metamost.com/post/tech/ghost-on-docker/</link>
      <pubDate>Sun, 01 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://metamost.com/post/tech/ghost-on-docker/</guid>
      <description>&lt;p&gt;While ghost was great in that it provided a very convenient editor via the browser, I decided to switch to using Hugo hosting on GitLab. The maintenance of the Linux server hosting Ghost on Azure became too much and upgrading was always painful for some reason. However, I may still go back to Ghost and will keep this post here for future reference. Anywys, this post is mostly about Docker and less about Ghost.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
