<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on ZachFi</title>
    <link>https://zach.fi/posts/</link>
    <description>Recent content in Posts on ZachFi</description>
    <image>
      <title>ZachFi</title>
      <url>https://zach.fi/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://zach.fi/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.148.2</generator>
    <language>en</language>
    <lastBuildDate>Tue, 04 Nov 2025 01:00:01 +0000</lastBuildDate>
    <atom:link href="https://zach.fi/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Brew Log: Hard Cider</title>
      <link>https://zach.fi/posts/2025/hard_cider_01/</link>
      <pubDate>Tue, 04 Nov 2025 01:00:01 +0000</pubDate>
      <guid>https://zach.fi/posts/2025/hard_cider_01/</guid>
      <description>&lt;h3 id=&#34;1122025&#34;&gt;11/2/2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Press&lt;/strong&gt; &lt;code&gt;300 lbs&lt;/code&gt; apples of mixed variety into &lt;code&gt;17.2 gallons&lt;/code&gt; of juice&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gala&lt;/li&gt;
&lt;li&gt;Golden Supreme&lt;/li&gt;
&lt;li&gt;Jonathan&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pasteurize&lt;/strong&gt; to &lt;code&gt;60C&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1132025&#34;&gt;11/3/2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Measure&lt;/strong&gt; &lt;code&gt;1.073 SG&lt;/code&gt; at &lt;code&gt;69F&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Measure&lt;/strong&gt; &lt;code&gt;3.34 g/L&lt;/code&gt; of malic acid&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Titrate using wine kit with &lt;code&gt;0.1&lt;/code&gt; normalcy
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;3ml sample&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;4 drops phenolphthalein&lt;/code&gt; indicator&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;1.5ml NaOH&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;0.25&lt;/code&gt; kit multiplier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;0.89&lt;/code&gt; tartaric to malic converstion multiplier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;1.5ml * 0.25 = 0.375 percent&lt;/code&gt; &lt;em&gt;tartaric&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.75 g/L = 0.375 * 10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.34 g/L malic = 3.75 * 0.89&lt;/p&gt;</description>
    </item>
    <item>
      <title>Brew Log: Lemon Hard Seltzer</title>
      <link>https://zach.fi/posts/2025/hard_seltzer_01/</link>
      <pubDate>Thu, 09 Oct 2025 01:28:23 +0000</pubDate>
      <guid>https://zach.fi/posts/2025/hard_seltzer_01/</guid>
      <description>&lt;h3 id=&#34;9202025&#34;&gt;9/20/2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sanitize&lt;/strong&gt; everything&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boil&lt;/strong&gt; &lt;code&gt;2.5 gallons&lt;/code&gt; &lt;em&gt;filtered water&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dissolve&lt;/strong&gt; &lt;code&gt;4 lbs corn sugar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Raise water&lt;/strong&gt; to &lt;code&gt;5 gallons&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cool&lt;/strong&gt; to &lt;code&gt;78F&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measure&lt;/strong&gt; &lt;code&gt;1.057 SG&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pitch&lt;/strong&gt; &lt;code&gt;Lalvin EC-118&lt;/code&gt; &lt;strong&gt;and nutrient&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;9282025&#34;&gt;9/28/2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finished&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-fill airlock&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Wait.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1062025&#34;&gt;10/6/2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mix&lt;/strong&gt; &lt;code&gt;5/8 cup cane sugar&lt;/code&gt; with &lt;code&gt;2 cups water&lt;/code&gt; and boil&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add&lt;/strong&gt; &lt;code&gt;~2 tbsp&lt;/code&gt; &lt;code&gt;lemon salt&lt;/code&gt; and &lt;code&gt;1/2 tiny vile lime oil&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prime&lt;/strong&gt; keg and &lt;strong&gt;drain&lt;/strong&gt; fermenter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bottle&lt;/strong&gt; several&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Force carbonate&lt;/strong&gt; to &lt;code&gt;30 PSI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wait.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1092025&#34;&gt;10/9/2025&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Reduce pressure to &lt;code&gt;15 PSI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pour. Splash. Drink. Delicious.&lt;/li&gt;
&lt;li&gt;Reduce pressure to &lt;code&gt;12 PSI&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Pulling Cables</title>
      <link>https://zach.fi/posts/2023/pulling-cable/</link>
      <pubDate>Tue, 14 Mar 2023 03:14:04 +0000</pubDate>
      <guid>https://zach.fi/posts/2023/pulling-cable/</guid>
      <description>&lt;p&gt;The homelab has started to sprawl out of the tidy little closet it started in,
and I began wondering if I could relocate parts of it to a less visible part of
the house. The trouble is, that the ethernet connections all converged at this
one tiny closet, and the drywall was all buttoned-up and I had no intention of
drilling holes to run new cables.&lt;/p&gt;
&lt;p&gt;The angle was somewhat tricky, where I could fish a cable up the wall, but
could not get to it from across the ceiling. At the same time, I could get to
that same area through the ceiling, but not down the wall.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rotating Domains</title>
      <link>https://zach.fi/posts/2023_rotating_domains/</link>
      <pubDate>Sun, 05 Mar 2023 04:22:58 +0000</pubDate>
      <guid>https://zach.fi/posts/2023_rotating_domains/</guid>
      <description>&lt;p&gt;This last year has certainly been busy, both professionally, and personally. I&amp;rsquo;ve
not much made the time to reflect, but I expect to change that. As the new year
began, I was thinking of the future and wondering about the digital footprint
that I&amp;rsquo;ve left behind. With a meager couple decades of internet connectivity, I
give thanks for the alley behind my parents old house where I could ride my
bicycle, and the drainage ditch nearby that I was able to explore when I was
young. Instead of socializing online, I grew up interacting with the area
around me, and avoided much of what young people online today might learn to
regret.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes for a New Year, or the Next Ten</title>
      <link>https://zach.fi/posts/2021/kubernetes/</link>
      <pubDate>Fri, 31 Dec 2021 14:03:46 -0700</pubDate>
      <guid>https://zach.fi/posts/2021/kubernetes/</guid>
      <description>&lt;p&gt;After reading one book, taking a class, and a couple false starts, Kubernetes was
very much in front of me as something I needed to learn. As a long time
home-lab herder, often a great way for me to learn is to get hands-on. So I
decided to build a new lab and start migrating some services to it.&lt;/p&gt;
&lt;p&gt;With just a little bit of research and talking to some knowledgeable folks, I
landed on using &lt;a href=&#34;https://k3s.io/&#34;&gt;K3s&lt;/a&gt; on a three node cluster on fan-less hardware backed
with a PostgreSQL database somewhere off-cluster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Database Schema Generation with Protobuf</title>
      <link>https://zach.fi/posts/ldap_schema_generation/</link>
      <pubDate>Sat, 10 Apr 2021 10:53:57 -0600</pubDate>
      <guid>https://zach.fi/posts/ldap_schema_generation/</guid>
      <description>&lt;p&gt;As I look to reduce the number of touch points that are required to make a
change to my personal system, I&amp;rsquo;m always thinking about how to reduce
complexity and leverage existing tooling. In this way, we can continue to
leverage an existing foundation to build out further abstractions. One such
lever I have worked on over the last year was using my gRPC protobuf definitions
to generate LDAP schema files that could be loaded into the server to match the
objects that I&amp;rsquo;d be working with in Go.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Operational Overhead</title>
      <link>https://zach.fi/posts/operational-overhead/</link>
      <pubDate>Fri, 11 Oct 2019 16:45:14 -0700</pubDate>
      <guid>https://zach.fi/posts/operational-overhead/</guid>
      <description>&lt;p&gt;On the path to improving the reliability of a given system, the oscillation
between two modes of work is often necessary. The first mode here is that which
is &lt;em&gt;directly affecting the change&lt;/em&gt; on a system, and the second describes that
which is &lt;em&gt;improving the method by which change is made&lt;/em&gt; on a given system.&lt;/p&gt;
&lt;p&gt;These are references for a mental model that could be applied to a system as
simple as a lever, or as complicated as an automobile manufacturing plant. The
systems I tend to work most closely with are computer and network systems, but
this is likely applicable for other sorts of system operations where humans are
concerned.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Graphing with Environment Sensors</title>
      <link>https://zach.fi/posts/environment-monitoring/</link>
      <pubDate>Sun, 08 Sep 2019 21:04:37 -0700</pubDate>
      <guid>https://zach.fi/posts/environment-monitoring/</guid>
      <description>&lt;p&gt;A few years ago, I started dabbling with the ESP chips that have become so
popular. For me, the ease of WiFi, and the Arduino compatibility meant that I
was able to get up and running much faster. Not having a background in
electrical engineering, the simple things like having a good base with the PCB,
a couple sensors built-in and easy expansion makes all the difference.&lt;/p&gt;
&lt;p&gt;Before the ESP chips, I&amp;rsquo;d tried several other wireless communication chips that
were each challenging in their own way. Since my ultimate goal is to report the
sensor data to a monitoring service, getting up the stack so that I could use
IP communication was a big win, and the ESP chips are perfect for this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gratitude and Forgiveness</title>
      <link>https://zach.fi/posts/grattitude/</link>
      <pubDate>Fri, 30 Aug 2019 13:33:45 -0700</pubDate>
      <guid>https://zach.fi/posts/grattitude/</guid>
      <description>&lt;p&gt;I give thanks to all those in my life who have forgiven me for my humanity, for
my inability to act in the most dignified and uprightly manner at all times. I
give thanks for the opportunity to remember my blunders, and improve my
behavior and the manner in which I seek to conduct myself, without loosing the
relationships that that have grown with others, the forgiveness from whom I
work to either repay, or pay forward.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Action Required</title>
      <link>https://zach.fi/posts/action-required/</link>
      <pubDate>Tue, 27 Aug 2019 21:05:59 -0700</pubDate>
      <guid>https://zach.fi/posts/action-required/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a planner, and whether I want to be or not, my mind just starts to push out
and extrapolate on the present to derive the future. Lately I&amp;rsquo;ve been finding
that its quite difficult to plan in multiple areas of my life at the same time.
Each tendril of a plan tends to have its own agenda, calling on my attention to
meet its own conclusions, but attention is an increasingly limited resource.&lt;/p&gt;</description>
    </item>
    <item>
      <title>New Terminal</title>
      <link>https://zach.fi/posts/new-terminal/</link>
      <pubDate>Sat, 22 Jun 2019 22:08:36 -0700</pubDate>
      <guid>https://zach.fi/posts/new-terminal/</guid>
      <description>&lt;p&gt;For years I had it in my head that &lt;code&gt;urxvt&lt;/code&gt; was the best terminal emulator one
could find. I ignored all those little areas of Unix management where I&amp;rsquo;d have
to set my &lt;code&gt;TERM&lt;/code&gt; variable to something like &lt;code&gt;xterm-256color&lt;/code&gt; before some remote
shell would recognize my terminal correctly, or where F keys had to be
configured before they would be passed to the running application. Those little
moments when I&amp;rsquo;d load a new color scheme for mutt, or vim, and I could tell
that I wasn&amp;rsquo;t quite getting the same experience that everyone else who
installed the plug-in had. Its been a good number of years this way, and I&amp;rsquo;d
just gotten used to it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Junos Configuration Management</title>
      <link>https://zach.fi/posts/configuration-management-for-networks/</link>
      <pubDate>Sun, 13 Jan 2019 16:20:52 -0800</pubDate>
      <guid>https://zach.fi/posts/configuration-management-for-networks/</guid>
      <description>&lt;p&gt;Its been a year since my last post, and I&amp;rsquo;m thinking its time to make another.&lt;/p&gt;
&lt;p&gt;Lately I&amp;rsquo;ve been trying to work through some network management solutions to
try and define the problem more clearly. This is an interesting problem
primary because I&amp;rsquo;m unable to rely on my previous tool sets to get this done.
Namely, Puppet running on the host.&lt;/p&gt;
&lt;p&gt;There are a couple interesting Python tools for this purpose that I&amp;rsquo;d given a
spin, but the more I was working in them, the more I was wishing I was writing
in Go. Most of my actively maintained code these days is Go, and working in
two languages for personal infrastructure tooling means I can&amp;rsquo;t leverage the
libraries of one tool in another.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fuck Couscous</title>
      <link>https://zach.fi/posts/fuck_couscous/</link>
      <pubDate>Sat, 09 Jun 2018 10:00:50 -0700</pubDate>
      <guid>https://zach.fi/posts/fuck_couscous/</guid>
      <description>&lt;p&gt;So you&amp;rsquo;re at a conference in a foreign country, and its lunch time. The menu
at the head of the table is in a language you don&amp;rsquo;t read. Now to judge the
food by looks. All the food looks impossible. Even the vegetables are on the
same tray as the sandwiches, all mingling with a bit too much friendliness.
One dish looks like potatoes covered in a gravy dressing. Skipping over all
the sandwiches, the next, dish looks like Quinoa salad, so let&amp;rsquo;s try some of
that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo</title>
      <link>https://zach.fi/posts/hugo/</link>
      <pubDate>Sat, 13 Jan 2018 14:01:52 -0800</pubDate>
      <guid>https://zach.fi/posts/hugo/</guid>
      <description>&lt;p&gt;For the last few months I&amp;rsquo;ve been learning the Go programming language while
working on various work related projects, and as I do, I reflect on the older
tools and patterns that I&amp;rsquo;ve used and developed over the years and wonder if
there is a better approach.&lt;/p&gt;
&lt;p&gt;Each time I pick up a new language, every few years, I start this evaluation
process. In this case, a friend from work pointed out a new static website
generation tool. It turns out, I&amp;rsquo;ve been neglecting a couple static sites that
could use some updating!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Puppet Providers and Unit Testing</title>
      <link>https://zach.fi/2017/02/24/puppet-provider-unit-testing-the-property-hash/</link>
      <pubDate>Fri, 24 Feb 2017 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/2017/02/24/puppet-provider-unit-testing-the-property-hash/</guid>
      <description>&lt;p&gt;Sometimes Puppet providers execute their logic based on the contents of a
&lt;code&gt;@property_hash&lt;/code&gt;, which is just a representation of a resource&amp;rsquo;s actual state.
Its easy enough to test a provider for the basics, but populating the
&lt;code&gt;@property_hash&lt;/code&gt; for a unit test has always been something of a chore, and
often gets skipped, leaving large portions of provider code untested.  I wish
I&amp;rsquo;d understood this years ago, but now that I&amp;rsquo;ve got my head round it, its
pretty simple.&lt;/p&gt;</description>
    </item>
    <item>
      <title>LetsEncrypt Validation on Private Networks</title>
      <link>https://zach.fi/2016/10/28/letsencrypting-private-networks/</link>
      <pubDate>Fri, 28 Oct 2016 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/2016/10/28/letsencrypting-private-networks/</guid>
      <description>Using DNS to validate LetsEncrypt certificates for use on private networks</description>
    </item>
    <item>
      <title>User Management Patterns</title>
      <link>https://zach.fi/2016/03/26/user-management-patterns/</link>
      <pubDate>Sat, 26 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/2016/03/26/user-management-patterns/</guid>
      <description>&lt;p&gt;User management can be a bit of a sore subject for some admins, but I&amp;rsquo;ve found
it can really pay off when done correctly, though its not always clear what
that means.  I&amp;rsquo;ve been on both sides of that line in the past, sometimes when
the line moves, and sometimes not.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a believer that managing the users and groups in your organization
proficiently and with low overhead is important.  It should be done well, if
for no other reason, than to be able to state authoritatively &lt;em&gt;who&lt;/em&gt; should have
access to &lt;em&gt;what&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt;, ideally requiring as little administrative time
as possible once the system is in place.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using LDAP for Puppet classification</title>
      <link>https://zach.fi/posts/puppet-classification-with-ldap/</link>
      <pubDate>Mon, 23 Nov 2015 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/posts/puppet-classification-with-ldap/</guid>
      <description>&lt;p&gt;Over the last year, I&amp;rsquo;ve been slowly moving some of my private Puppet code to
use LDAP as a data source. Through this process, a bit of strategy, some tool
and some schema has emerged I&amp;rsquo;ll share here.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s worth noting that Puppet has had an &lt;a href=&#34;https://docs.puppetlabs.com/guides/ldap_nodes.html&#34;&gt;LDAP Node Classifier&lt;/a&gt;
for quite some time, probably longer than I&amp;rsquo;ve been using Puppet. Though
looking over the documentation, you wouldn&amp;rsquo;t know it, but the most useful bit
of this whole work is that fact that Puppet supports the configuration
variables necessary to make a connection to an LDAP server, &lt;strong&gt;and&lt;/strong&gt; those
variables are available for reference.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Storing Jail data in LDAP</title>
      <link>https://zach.fi/posts/2015-06-14-ldap-jails/</link>
      <pubDate>Sun, 14 Jun 2015 20:17:14 +0000</pubDate>
      <guid>https://zach.fi/posts/2015-06-14-ldap-jails/</guid>
      <description>&lt;p&gt;For the past several years, I&amp;rsquo;ve been running the majority of my lab services
out of FreeBSD jails. I don&amp;rsquo;t have but a handful of services to run and some
underpowered hardware to put them on, but jails have grown to become a staple
in how I deploy my private infrastructure. One such service that I run is LDAP.
I got a wild hare yesterday and though I&amp;rsquo;d glue the two of them together with a
bit of Puppet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moving My Puppet Master to OpenBSD</title>
      <link>https://zach.fi/2015/02/11/openbsd-puppetmaster/</link>
      <pubDate>Wed, 11 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/2015/02/11/openbsd-puppetmaster/</guid>
      <description>&lt;p&gt;I recently had some network trouble that isolated a system I use to host
FreeBSD jails to be without network.  The bummer of it is, that I used this
particular system for hosting most of my primary working system.  Things like
CI and Puppet and such all lived in neat little jails, and while all the little
jails and all the little services are still on disk I have no access.  I
suspect the hand-me-down Cisco switch is the culprit, but after years of
service, meh.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Backups with Exported Resources</title>
      <link>https://zach.fi/2014/09/19/backups-with-exported-resources/</link>
      <pubDate>Fri, 19 Sep 2014 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/2014/09/19/backups-with-exported-resources/</guid>
      <description>&lt;p&gt;Failure happens. Its a part of working in technology, and as a techno worker
bee, my job is to ensure that those failures have as little impact on my team
and my company as can be summoned. Part of this (as the business peeps say)
&amp;ldquo;risk mitigation strategy&amp;rdquo;, is backups. Its a part of working in technology
that I want to give as little attention as possible, so its important its low
touch and that its done correctly and is available when I need it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Puppet with Fabric</title>
      <link>https://zach.fi/2014/08/15/fabric-with-puppet/</link>
      <pubDate>Fri, 15 Aug 2014 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/2014/08/15/fabric-with-puppet/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.fabfile.org/&#34;&gt;Fabric&lt;/a&gt; describes itself as a &amp;ldquo;library and command-line tool for
streamlining the use of SSH for application deployment or systems
administration tasks&amp;rdquo;. To get this work done, Fabric uses what are called
&amp;ldquo;fabfiles&amp;rsquo;, which is just some python stored in a file called &lt;code&gt;fabfile.py&lt;/code&gt;. In
terms of execution, it works a lot like Rake from the Ruby world. You have a
base command, in this case &lt;code&gt;fab&lt;/code&gt; and each task is read from the &lt;code&gt;fabfile.py&lt;/code&gt;
and executed on request. Nothing too earth shattering.&lt;/p&gt;</description>
    </item>
    <item>
      <title>First Ceph Cluster</title>
      <link>https://zach.fi/posts/first-ceph-cluster/</link>
      <pubDate>Thu, 29 May 2014 21:13:20 +0000</pubDate>
      <guid>https://zach.fi/posts/first-ceph-cluster/</guid>
      <description>&lt;p&gt;Storage clustering systems have been an interest of mine for many years. The
idea that you can put a bunch of similarly shaped systems together and make
them behave as a unit is fascinating. One could think of systems biological
terms; the kernel being analogous to the nucleus in a cell, bringing individual
cells together to serve a higher purpose of the organ or nerve ending.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve never really needed a high performance cluster, and when I studied the
technologies in the area of HPC, I didn&amp;rsquo;t have data that needed processing.
Though I did thirst for storage, and with it and, data redundancy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A New Start</title>
      <link>https://zach.fi/2014/05/23/starting-again/</link>
      <pubDate>Fri, 23 May 2014 23:00:33 +0000</pubDate>
      <guid>https://zach.fi/2014/05/23/starting-again/</guid>
      <description>&lt;p&gt;It struck me the other day, that this is probably as good a year as any to try
again at keeping a website online. There have been others before this, but
like a moth to the flame, I ended up spending more time hacking on the site
than I did writing entries, completely defeating the initial intention. As
such, I thought I would give &lt;a href=&#34;http://jekyllrb.com&#34;&gt;Jekyll&lt;/a&gt; a try. Looks simple, well
documented, customizable and looks to have a pretty strong community. All
good signs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PkgNG on FreeBSD with Puppet</title>
      <link>https://zach.fi/2012/06/30/pkgng-and-puppet/</link>
      <pubDate>Sat, 30 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/2012/06/30/pkgng-and-puppet/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently discovered FreeBSD&amp;rsquo;s new package manager and it looks poised to
become the default package manager soon in FreeBSD 10.&lt;/p&gt;
&lt;p&gt;After watching the &lt;a href=&#34;http://www.youtube.com/watch?v=4Hxq7AHZ27I&#34;&gt;video from BSDCAN&lt;/a&gt; I realized that there was some
pretty serious effort going into the project, but still a bit rough around the
edges.  Some wiki reading later, I was ready to dive in.&lt;/p&gt;
&lt;p&gt;More sources of information seem to be springing up about this new package
manager, and though it does not solve all of the issues surrounding package
management in FreeBSD such as custom options on your ports, it sure is a vast
improvement from previous tools that are available for FreeBSD for my use
cases.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generate Permutations of Puppet Resources</title>
      <link>https://zach.fi/2012/05/01/puppet-permute-module/</link>
      <pubDate>Tue, 01 May 2012 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/2012/05/01/puppet-permute-module/</guid>
      <description>&lt;p&gt;Here is a Puppet module that is a bit of a meta-module. Its only purpose is to
create other resources by computing the permutations of parameters and
generating new resources. The reason this is useful, is that it allows you to
create lots of similar resources that might have some common and some unique
parameters.&lt;/p&gt;
&lt;p&gt;Consider the following PXE example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-puppet&#34; data-lang=&#34;puppet&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;permute&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Debian Installers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;na&#34;&gt;resource&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;pxe::installer&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;na&#34;&gt;unique&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;na&#34;&gt;arch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;i386&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;na&#34;&gt;ver&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;squeeze&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wheezy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;na&#34;&gt;os&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;debian&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;na&#34;&gt;common&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;file&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;os_&amp;lt;%= os %&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;na&#34;&gt;kernel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;images/&amp;lt;%= os %&amp;gt;/&amp;lt;%= ver %&amp;gt;/&amp;lt;%= arch %&amp;gt;/linux&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;na&#34;&gt;append&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;initrd=images/&amp;lt;%= os %&amp;gt;/&amp;lt;%= ver %&amp;gt;/&amp;lt;%= arch %&amp;gt;/initrd.gz text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&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;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For every key in the unique parameter hash, a resource will be created for
every combination of things. The keys in the common parameter hash will get
passed through ERB before the resource is created. This allows you to do
interesting things like the above that allow you to determine the values of the
parameters before the resource is generated.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://zach.fi/posts/2020-tls-ciphers/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/posts/2020-tls-ciphers/</guid>
      <description>&lt;p&gt;Its time to update TLS ciphers.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssl::ciphers: &#39;ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#39;
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://zach.fi/posts/gpg-subkeys/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/posts/gpg-subkeys/</guid>
      <description></description>
    </item>
    <item>
      <title></title>
      <link>https://zach.fi/posts/key-transition/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://zach.fi/posts/key-transition/</guid>
      <description>&lt;p&gt;&amp;mdash;&amp;ndash;BEGIN PGP SIGNED MESSAGE&amp;mdash;&amp;ndash;
Hash: SHA256&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve created a new GnuPG key that, over the next few months, I will be
transitioning to use as my primary key for daily use.  My old key has not been
compromised and will continue to be valid for while during the transition.
I&amp;rsquo;ve begun signing mail with the new key and would prefer that all future
correspondence use the new key.&lt;/p&gt;
&lt;p&gt;The new key is signed by the old key, and would appreciated new signatures
against the new key.  The details are as follows.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
