<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title></title>
	<description>Father, Husband, Metal Head, Homebrewer</description>
	<link>https://tomohulk.github.io</link>
	<atom:link href="https://tomohulk.github.io/search.xml" rel="self" type="application/rss+xml" />
	
		
		<item>
			<title>ConvertFrom-AppLockerPolicyXml</title>
			<description>&lt;p&gt;Hey-Oh!  Its been a while!  Even though I’ve been locked at home for the past year, I haven’t published any new content in forever.  Well, life has been pretty boring so I haven’t come across much worth sharing, and I’m also lazy.  But I do have something today finally worth blerg’n about.  So anyway, away we go!&lt;/p&gt;

&lt;p&gt;So, in my not so distant past, I was rolling out Windows AppLocker to our organization, I did get it out to most sites, but other stuff came up, other projects, yada yada yada, and I never got it all the way finished.  Now, its back on the todo list, and one of my peers is working on finishing it up.  Anyway, I am assisting with the KB transfer, and I’m also helping to troubleshoot issues that come up as he moves forward.  Well a few days back I was helping him out, and I was on the users computer, who was having a program being blocked that should not have been.  It was based on a recent exception we had made, so I wanted to verify the new policy was in fact being applied from within the GPO.  So, I started using the AppLocker PowerShell cmdlets.  Long story short, what a disappointment those are.&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-Command&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;*AppLocker*&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-AppLockerFileInformation                       1.0        AppLocker
Function        Get-AppLockerPolicy                                1.0        AppLocker
Function        New-AppLockerPolicy                                1.0        AppLocker
Function        Set-AppLockerPolicy                                1.0        AppLocker
Function        Test-AppLockerPolicy                               1.0        AppLocker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wow, a lot to choose from there right.  Also I think &lt;a href=&quot;https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/applocker-overview&quot;&gt;AppLocker&lt;/a&gt; came out with Windows 7, SP1 maybe, and these are still v1……anyway.  I was pretty sure the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-AppLockerPolicy&lt;/code&gt; cmdlet is going to be the one I want, so I can see exactly what rules are being applied.  So, I did the obvious thing right?  &lt;em&gt;wink wink&lt;/em&gt;.  I ran &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-Help&lt;/code&gt; and checked out the Syntax”:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-Help&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;SYNTAX
    Get-AppLockerPolicy -Local [-Xml] [&amp;lt;CommonParameters&amp;gt;]

    Get-AppLockerPolicy -Domain -Ldap &amp;lt;string&amp;gt; [-Xml] [&amp;lt;CommonParameters&amp;gt;]

    Get-AppLockerPolicy -Effective [-Xml] [&amp;lt;CommonParameters&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ok, so it looks like you can either get the Domain or Local policy, or the Effective policy, which would be the combination of both I would guess.  So lets do that and see what is actually being applied.&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;RunspaceId          : a3c075e3-c5c8-4120-8f37-b69d9deb38af
Version             : 1
RuleCollections     : {Microsoft.Security.ApplicationId.PolicyManagement.PolicyModel.FilePublisherRule, ,
                      Microsoft.Security.ApplicationId.PolicyManagement.PolicyModel.FilePublisherRule
                      Microsoft.Security.ApplicationId.PolicyManagement.PolicyModel.FilePublisherRule
                      Microsoft.Security.ApplicationId.PolicyManagement.PolicyModel.FilePublisherRule
                      Microsoft.Security.ApplicationId.PolicyManagement.PolicyModel.FilePublisherRule
                      Microsoft.Security.ApplicationId.PolicyManagement.PolicyModel.FileHashRule…}
RuleCollectionTypes : {Appx, Dll, Exe, Msi…}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So wow, thats great info there, looks like all the conditions are in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RuleCollections&lt;/code&gt; property, lets dig in and see what info is in there.&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Select-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ExpandProperty&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;RuleCollections&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Select-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-First&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Property&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Capacity       : 4
Count          : 1
IsFixedSize    : False
IsReadOnly     : False
IsSynchronized : False
SyncRoot       : {Microsoft.Security.ApplicationId.PolicyManagement.PolicyModel.FilePublisherRule}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So, nothing, like literally nothing…am I missing something?  Maybe in SyncRoot?&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Select-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ExpandProperty&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;RuleCollections&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Select-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-First&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ExpandProperty&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;SyncRoot&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Select-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Property&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Length
------
    79
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Length 79&lt;/em&gt;?  So all this is doing is just giving me a string?  And the &lt;em&gt;value&lt;/em&gt; of that string is just the object type name?  Like WTF is going on?  So then I tried diving into that other property, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RuleCollectionTypes&lt;/code&gt; maybe?  Seems like a long shot for sure:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Select-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ExpandProperty&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;RuleCollectionTypes&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Appx
Dll
Exe
Msi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;JFC!  Where are the RULES!  &lt;em&gt;Insert Batman meme here…GIVE EM TO ME!&lt;/em&gt;  I guess lets try that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-Xml&lt;/code&gt; parameter, I mean, what other options are there…(see help output above, there are none):&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Xml&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Not going to paste the out of that here, because its huge.  But its not even true &lt;em&gt;Xml&lt;/em&gt;, its just a string that has all the Xml tags, so you still have to cast it to Xml yourself:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Xml&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Xml&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;AppLockerPolicy
---------------
AppLockerPolicy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Hey, look at that, an actual true Xml object that can be manipulated like any other Xml document.  So, from what I can tell, the only &lt;em&gt;real option&lt;/em&gt; you have here is to just spit out the Xml string to your clipboard and then paste it in a text editor and the use the find function to look for any rule or condition you maybe after. If you are just trying to be quick anyway.  But that still seems like the worst solution ever!  So, I decided to make a PowerShell function that would parse the Xml for you into usable, and more importantly, readable objects.  This also gave me an excuse to spend some time in the IDE, which I jumped on, as I don’t get to do that near as much as I used to.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;So, the &lt;strong&gt;TLDR&lt;/strong&gt;: I created a cmdlet called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ConvertFrom-AppLockerPolicyXml&lt;/code&gt;.  This will take in Xml generated from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-AppLockerPolicy&lt;/code&gt; and convert it to usable objects.  It also does a few other things under the hood, such as converting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UserOrGroupSid&lt;/code&gt; property to the corresponding user or group name, it also bundles all the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Conditions&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Exceptions&lt;/code&gt; into a single properties:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Xml&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ConvertFrom-AppLockerPolicyXml&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Id              : bef5d95f-da42-4e68-b3bc-06f9e683891f
Name            : All My Stuff
Description     :
Type            : Exe
EnforcementMode : AuditOnly
UserOrGroup     : domain\tomohulk
Action          : Allow
Conditions      : {FilePathCondition}
Exceptions      :
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And you can dive into the Conditions if you want or need to:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Xml&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ConvertFrom-AppLockerPolicyXml&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Select-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-First&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ExpandProperty&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Conditions&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ConditionType: FilePathCondition
Path: %OSDRIVE%\AllMyStuff\*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mind you these are broad and very fake outputs here, but I think you get the idea.  I did use PowerShell Classes to make it easy to cast to custom objects, in my case, hundreds of rule objects.  So you need at least PowerShell 5.1.  I Did all my development and testing for this in pwsh v7.1.2.  And one other bonus from classes is I like that my &lt;em&gt;custom&lt;/em&gt; (casted really) objects have valid descriptive type names:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Effective&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Xml&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ConvertFrom-AppLockerPolicyXml&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;GetType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    AppLockerRule                            System.Object
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And when I say &lt;em&gt;casting&lt;/em&gt; I mean it.  There really isn’t much &lt;em&gt;logic&lt;/em&gt; to this.  It just iterates and then passes in the Xml nodes to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AppLockerRule&lt;/code&gt; class, and lets the class definition do all the heavy lifting and format the output.  Here is the only &lt;em&gt;executing code&lt;/em&gt; really (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$Xml&lt;/code&gt; being the Xml string from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-AppLockerPolicy -Xml&lt;/code&gt;):&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kr&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$fileType&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Appx&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Dll&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Exe&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Msi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Script&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$rules&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Xml&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;AppLockerPolicy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SelectNodes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;//RuleCollection[@Type=&apos;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$fileType&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&apos;]&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ruleType&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;FilePublisherRule&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;FilePathRule&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;FileHashRule&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$rule&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$rules&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ruleType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AppLockerRule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$rules&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;EnforcementMode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$rules&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$rule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Cheers, and enjoy!&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/e92ff6e8d85862cb0e8a5b69774e38b3.js&quot;&gt; &lt;/script&gt;

</description>
			<pubDate>Tue, 02 Mar 2021 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/convertfrom-applockerpolicyxml/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/convertfrom-applockerpolicyxml/</guid>
		</item>
		
	
		
		<item>
			<title>Motorizing Your Grain Mill</title>
			<description>&lt;p&gt;If you are like me, and most others I know who crush their own grain, you set up is pretty simple, a mill, and either you are hand cranking it, which sounds terrible, or you hooking your drill to it, and powering it that way.  I personally am the latter, I hook my battery powered DeWalt drill to the mill and try to hold the speed slow and steady.  This is a PITA for two reasons.  First, I can never hold the speed the same for the entire crush, especially if its a rather large grain bill, and, this may not be true, but I feel like it cannot be great for my drill to run it with the trigger barely pressed for 15 minutes.  And second, I cannot multitask when im grinding.  I have to just sit there and hold the drill with one hand and add additional grains to the hopper with the other.  I feel like its just a huge waste of time.  I have seen setups where people mount a drill and set the speed buy using a zip tie to get the trigger just right.  This wasn’t going to work for me because I don’t have a spare drill laying around I can donate to something like this, as it would have no other use.  And if I’m going to buy a drill for this purpose, then I might as well just buy a motor to power this thing.  And thats what I did.&lt;/p&gt;

&lt;h2 id=&quot;parts-list&quot;&gt;Parts list&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/FERRODAY-Crusher-Stainless-Homebrew-Adjustable/dp/B07CMKN4B2/ref=sr_1_3?keywords=grain+mill&amp;amp;qid=1566772604&amp;amp;s=gateway&amp;amp;sr=8-3&quot;&gt;Grain Mill&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.aliexpress.com/item/4000060286950.html&quot;&gt;Motor (12V, 160RPM)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.aliexpress.com/item/32366750867.html?spm=a2g0s.9042311.0.0.49844c4dQxdnus&quot;&gt;Coupler&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/gp/product/B07GFLFTV2/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&amp;amp;psc=1&quot;&gt;Power Supply&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;During my &lt;em&gt;experimentation&lt;/em&gt; of this project I went through 3 different power supply units before settling on this one. I mean it needed to be 12v DC so that part was obvious, but I started with a 7A, the motor wouldn’t even turn on, then went to a 10A.  This one worked, however, if it got even slightly jambed up, it would stop, and I would have to clear out the entire hopper to get it going again.  It was terrible, especially as I wanted to do this build so I could fill the hopper and let it grind and go do other things, not babysit the grinder.  After upgrading to the 20A its a beast and it has not jambed up on me not once.&lt;/p&gt;

&lt;h2 id=&quot;wire-it-up&quot;&gt;Wire it up&lt;/h2&gt;
&lt;p&gt;This build is extremely easy, you run in the AC wire to the +/- and ground.  Then the motor has red and black wires, its DC, so red goes to V+ and black goes goes to V-.  Now, if you read any of my other blergs, I had an extra AC Rocker switch laying around from my &lt;a href=&quot;https://tomohulk.github.io/piless-brewpi/&quot;&gt;BrewPiLess build&lt;/a&gt;, so I added that to my build to make it easy to turn the grinder on and off (you can find a wiring diagram on that post, just put it on the AC input in front of the PSU).&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Thats pretty much it, I have this mounted up in my brew table, as you can see in the video, I secured it down with a U-bolt.  Let me know if you have any questions, but this is a pretty straight forward build out, and saves me a lot of time, and I didn’t have to sacrifice a drill.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/iY3-GoD2tAE&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;

&lt;p&gt;Thats it!  Pour one for me, cheers!&lt;/p&gt;
</description>
			<pubDate>Wed, 21 Aug 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/motorizing-your-grain-mill/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/motorizing-your-grain-mill/</guid>
		</item>
		
	
		
		<item>
			<title>Nobody Got Time For That</title>
			<description>&lt;p&gt;I have been tinkering with NEIPAs for a while now, in theory, they shouldn’t be &lt;em&gt;too&lt;/em&gt; hard to make, and to get an OK one, they really aren’t.  But I wanted something better then just OK.  After about 10 attempts and lots of trial and error and even more picking the brains of the Homebrewing Slack team (Bender, if you’re reading this, this is your shout out), I think I have finally done it, I mean just absolutely nailed it!  I personally think it all really came down to the water, but also, the now more readily available Kveik yeasts out there helped me as well.  Especially &lt;a href=&quot;https://omegayeast.com/yeast/norwegian-ales/voss-kveik&quot;&gt;Omega Voss&lt;/a&gt;, allowing to ferment at 90F+ you can turn beers around in 5-7 days.  And they are some of the best NEIPAs I’ve ever had, second to maybe &lt;a href=&quot;https://www.arvonbrewingco.com&quot;&gt;Arvon Brewing&lt;/a&gt;.  Anyway, I wanted to share my findings and what seems to really be working for me.  The best part is that the grain and water pretty much always stay the same, and you can just tinker with hops.&lt;/p&gt;

&lt;h2 id=&quot;water&quot;&gt;Water&lt;/h2&gt;
&lt;p&gt;OK, so first and foremost, the water.  In all my experimentation with these HaziBois, I have found that water seems to play the most important roll in what makes the hops &lt;em&gt;POP&lt;/em&gt;.  Here is my water chemistry (the report is about a year old, I am due to have it updated again):&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Ca: 41&lt;/li&gt;
  &lt;li&gt;Mg: 12&lt;/li&gt;
  &lt;li&gt;Na: 10&lt;/li&gt;
  &lt;li&gt;Cl: 16&lt;/li&gt;
  &lt;li&gt;SO4: 32&lt;/li&gt;
  &lt;li&gt;HCO3: 135&lt;/li&gt;
  &lt;li&gt;pH: 7.6&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have heard lots of people talk about Sulfate to Chloride ratios and flaked adjuncts to produce this slick, soft, or pillowy mouthfeel that is pinnacle to a NEIPA.  After my experimenting, and trial and error, the best NEIPAs I am making I am going for a 1:1:1 ration of SO4:Cl:Ca, and I would ideally like to have them all at a 150ppm range, but, without cutting my water, I cannot get the numbers that high without getting my Mg and Na too high for my comfort range.  But, I am able to get them all to 135ppm and that seems to work just fine, so that what I have been using&lt;/p&gt;

&lt;p&gt;Target NEIPA Water Profile:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Ca: 150&lt;/li&gt;
  &lt;li&gt;Mg: 0&lt;/li&gt;
  &lt;li&gt;Na: 0&lt;/li&gt;
  &lt;li&gt;Cl: 150&lt;/li&gt;
  &lt;li&gt;SO4: 150&lt;/li&gt;
  &lt;li&gt;HCO3: 0&lt;/li&gt;
  &lt;li&gt;pH: 5.4&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actual NEIPA Water Profile After Treatment:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Ca: 136&lt;/li&gt;
  &lt;li&gt;Mg: 20&lt;/li&gt;
  &lt;li&gt;Na: 10&lt;/li&gt;
  &lt;li&gt;Cl: 134&lt;/li&gt;
  &lt;li&gt;SO4: 135&lt;/li&gt;
  &lt;li&gt;HCO3: 135&lt;/li&gt;
  &lt;li&gt;pH: 5.4 (takes me about 4.5mL of lactic)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know I should probably cut my water with RO and get that hardness down, but to be honest, these batches are turning out so well, I don’t really feel the need to.  And thats just one more thing I would need to prep, the best part of this beer is that it is a short brew day, less steps and a super fast ferment.&lt;/p&gt;

&lt;h2 id=&quot;mash&quot;&gt;Mash&lt;/h2&gt;
&lt;p&gt;Grain bill:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;80% base malt, I personally use Rahr 2-row, I bet a Pilsen would be great too!&lt;/li&gt;
  &lt;li&gt;20% White Wheat, I use Briess.&lt;/li&gt;
  &lt;li&gt;1.33lb/qt grist (this is just a personal preference i use this number for everything).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only other thing I really have to say about this is, mash high, like a stout.  I have been mashing at 156-157 for 45 minutes.  Leaving some residual sugar post ferment to help with mouthfeel and softness.  It seems to be working very well.  And to be frank, Voss Kveik is a madman, if you mash at 152, its going to finish sub 1.010, and be too dry for a NEIPA.&lt;/p&gt;

&lt;h2 id=&quot;boil&quot;&gt;Boil&lt;/h2&gt;
&lt;p&gt;F*** the boil, &lt;em&gt;Nobody Got Time For That&lt;/em&gt;.  Just bring the wort up to boil and insert your immersion chiller and start your whirlpool pump, and kill the flame.  I do this to sanitize everything.&lt;/p&gt;

&lt;h2 id=&quot;whirlpool&quot;&gt;Whirlpool&lt;/h2&gt;
&lt;p&gt;So after killing the flame, I turn on my chiller for about 1-2 minutes, this will bring the wort to 190ish.  Even after killing the flame, the temperature still seems to drop pretty quick to about 182ish.  Time to hop the piss out this thing.  I have been doing a half pound whirlpool only hop.  I use 4oz Citra, 2oz Mosiac, and 2oz tuttie fruity hop of your choice, I have done Amarillo, and El Dorado, and at the time of this writing, a batch with Azzaca is in the fermenter.  The El Dorado was amazing, one of the best NEIPAs I have ever had.&lt;/p&gt;

&lt;p&gt;Now, I feel like my brew house is a bit prone to clogs during a heavy whirlpool, so I generally do it slowly.  I add the Citra over about a minute, then Mosaic, then whatever I’m, using for the last happy hop.  After this the temp is usually about 179.  I start my timer for a 20 minute whirlpool and turn on a very low flame, with my banjo burner I can hold a temp to a degree or two, so I do my best to hold at 180F.  Usually by the time the 20 minutes has passed, its at 181-182.&lt;/p&gt;

&lt;p&gt;After the whirlpool, chill to 100F, rack to fermenter.&lt;/p&gt;

&lt;h2 id=&quot;ferment&quot;&gt;Ferment&lt;/h2&gt;
&lt;p&gt;Heres the good stuff, &lt;em&gt;Voss is Boss&lt;/em&gt; set your temperature controller 90, And let it roll, you could probably go hotter if you wanted, I’ve heard of people pushing Voss over the 100F mark.  I also DO NOT make a starter for a 5 gallon batch with this yeast, trying to stress it a bit for some esters.&lt;/p&gt;

&lt;h2 id=&quot;dry-hop&quot;&gt;Dry Hop&lt;/h2&gt;
&lt;p&gt;I do everything in 24 hour increments.  24 hours after pitch, I do a dry hop, 2oz Citra, 1oz, Mosaic, 1oz same hop I used to finish the whirlpool.  48 hours post pitch, hit with that hop dosage again, totalling one pound of hops.  By 48 hours, the primary ferment will have already completed (again &lt;em&gt;Voss is Boss&lt;/em&gt;).  Let it sit for at least another 24 hours for hop utilization, but ideally I target 48 hours.  So a four day total ferment.  Next is up to you, cold crash.  Your call.  I usually do it for 24 hours just to let some hops fall out of solution, so I don’t get clogged dip tubes in my kegs.  But this is not a mandatory step.&lt;/p&gt;

&lt;h2 id=&quot;drink-up&quot;&gt;Drink Up&lt;/h2&gt;
&lt;p&gt;Last thing is to package and serve, do what you do here, nothing special.  I close transfer and try to carbonate and serve as soon as possible.  Fresher is better!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-08-14-nobody-got-time-for-that/beer.jpg&quot; alt=&quot;Beer&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Thats it, cheers!&lt;/p&gt;
</description>
			<pubDate>Wed, 14 Aug 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/nobody-got-time-for-that/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/nobody-got-time-for-that/</guid>
		</item>
		
	
		
		<item>
			<title>Replace Failed Storage Pool HDD</title>
			<description>&lt;p&gt;In my day to day jobby, I manage multiple Hyper-V clusters, and these clusters use shared storage.  Most of the storage is a JBOD shelf with dual SAS connections to the hypervisor nodes.  Because the shelf is JBOD, Windows is the &lt;em&gt;brains&lt;/em&gt; for the storage.  Enter &lt;a href=&quot;https://docs.microsoft.com/en-us/windows-server/storage/storage-spaces/overview&quot;&gt;Windows Storage Spaces&lt;/a&gt;.  This is basically a Software RAID that you configure a &lt;em&gt;pool&lt;/em&gt; of disks, and then you layer a VHD over that pool.  After a volume is created on the VHD, it can be used by the hosts.  These volumes can be added to &lt;a href=&quot;https://docs.microsoft.com/en-us/windows-server/failover-clustering/failover-cluster-csvs&quot;&gt;Cluster Shared Volumes&lt;/a&gt; which allows the volume to move between host nodes, creating redundancy.  All the VMs hosted in the cluster, live on the CSV, making them Highly Available.&lt;/p&gt;

&lt;p&gt;As hardware always does, physical disks in the pool fail.  Most of the Microsoft docs on fixing this issue are quite cumbersome to follow, and even more so, they tend to deal with &lt;a href=&quot;https://docs.microsoft.com/en-us/windows-server/storage/storage-spaces/storage-spaces-direct-overview&quot;&gt;Storage Spaces Direct&lt;/a&gt;, which is not the same technology.  So I thought I would make up a quick little walk through on replacing a failed HDD in a storage pool.  I have to do this about once a month, so this is just as much for me, as it is for you.&lt;/p&gt;

&lt;p&gt;In my configuration, I run Windows Server Core exclusively for Hypervisors, so we will tackling this with PowerShell, tbh, not really even sure how to do this with a GUI.&lt;/p&gt;

&lt;h2 id=&quot;identifying-a-failed-hdd&quot;&gt;Identifying a failed HDD&lt;/h2&gt;
&lt;p&gt;Identifying a failed HDD is pretty simple, it can be done with a simple PowerShell command:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;HealthStatus&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-ne&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Healthy&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This will show you any disks that have failed, I typically use a 3-way mirror on my Storage Pools, so if that number is greater then 2, then well, might as well just start over.  Anyway, if the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Usage&lt;/code&gt; property of the failed disk is not marked as &lt;em&gt;Retired&lt;/em&gt;, you will need to mark it as such:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;HealthStatus&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-ne&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Healthy&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Usage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Retired&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So, this next part tends to vary between JBOD models, but to actually &lt;em&gt;identify&lt;/em&gt; the failed HDD for physical replacement, there are a few things you can do, first off, you can actually trigger the slots LED to indicate the failed drive:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# This command assumes you already completed the previous command and &apos;Retired&apos; the failed disks.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Usage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Retired&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Enable-PhysicalDiskIdentification&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also get the physical &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SlotNumber&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Usage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Retired&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;SlotNumber&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, this number is 0 indexed so when looking at the JBOD shelf, be sure to start counting at 0.&lt;/p&gt;

&lt;h2 id=&quot;replacing-the-hdd&quot;&gt;Replacing the HDD&lt;/h2&gt;
&lt;p&gt;After you have identified the failed HDD and marked it as retired, you can now physically replace the drive.  In my experience, after the new drive is inserted and running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-PhysicalDisk&lt;/code&gt; the new drive always hangs in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Starting&lt;/code&gt; Operational Status.  And because of this you cannot add it to the storage pool (notice the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CanPool&lt;/code&gt; Property will be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;False&lt;/code&gt;).  This can be cleared up by Resetting the disk:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;OperationalStatus&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-eq&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Starting&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Reset-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After this is complete, running the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-PhysicalDisk&lt;/code&gt; will show the disk is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Healthy&lt;/code&gt; and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CanPool&lt;/code&gt; property will be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;True&lt;/code&gt;.  Now, you need to identify the Storage Pool’s Friendly Name, this can be found by running the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-StoragePool&lt;/code&gt; command.  Once you have the Friendly Name, you can add the new disk to the pool:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Add-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-StoragePoolFriendlyName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;MyStoragePool&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PhysicalDisks&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-CanPool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now that the drive is replaced, go ahead and repair the virtual disk:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Get-VirtualDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;HealthStatus&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-ne&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Healthy&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Repair-VirtualDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This will take some time depending on how large the virtual disk is, resiliency settings, and hardware, but there will be a progress bar.  Or you can add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-AsJob&lt;/code&gt; switch to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Repair-VirtualDisk&lt;/code&gt; command and let it run in the background.  You can fetch the status with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-StorageJob&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Be sure to disable the LED identification:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# I always just run this on against all the disks, it won&apos;t hurt anything for the ones where its not enabled.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Disable-PhysicalDiskIdentification&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After the repair is complete, the last step is to remove the failed drive from the pool.  Remember, the repair has to fully complete before removing the failed drive from the pool, else data loss will occur.&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Remove-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-StoragePoolFriendlyName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;MyStoragePool&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PhysicalDisks&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Usage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Retired&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And thats it, good to go!  Cheers.&lt;/p&gt;
</description>
			<pubDate>Mon, 05 Aug 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/replacing-failed-storage-pool-hdd/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/replacing-failed-storage-pool-hdd/</guid>
		</item>
		
	
		
		<item>
			<title>Installing PKI SSL Certificate on HPE iLO</title>
			<description>&lt;p&gt;I work with HPE Systems almost exclusively, and as of late I have been getting very irritated with the browser warning about the self signed SSL cert that is installed on the HPE iLO by default.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-07-25-installing-pki-ssl-certificate-on-hpe-ilo/security-error.png&quot; alt=&quot;Security Error&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You have to jump through a few clicky hoops and the browser remembers none of it the next time you visit the page.  So, the real solution for this, and probably something that should be done anyway, is to install a certificate issued by a corporate certificate authority.  The process for doing this isn’t very difficult, its more just cumbersome and, with HPE iLOs, its quite time consuming as well.  Anyway, I put together a script to make this much easier, I put it together fairly quickly as well, so I’m sure that there are things could be improved, but the concept is solid.&lt;/p&gt;

&lt;h2 id=&quot;manual-steps&quot;&gt;Manual steps&lt;/h2&gt;
&lt;p&gt;I suppose before we jump into the automation portion, as with anything that is being automated, its best we cover the manual steps for reaching our goal so we fully understand what needs to be done, and what information is needed to get it done.&lt;/p&gt;

&lt;p&gt;After signing into the iLO, in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Administration&lt;/code&gt; section in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Security&lt;/code&gt; workspace, there is an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSL Certificate&lt;/code&gt; tab.  On that tab you select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Customize Certificate&lt;/code&gt; button, and from there you will get a dialog, asking for the basic information to build the &lt;em&gt;Certificate Signing Request&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-07-25-installing-pki-ssl-certificate-on-hpe-ilo/default-certificate.png&quot; alt=&quot;Default Certificate&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Required values:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Country&lt;/li&gt;
  &lt;li&gt;State or Province&lt;/li&gt;
  &lt;li&gt;Locality or City&lt;/li&gt;
  &lt;li&gt;Organization&lt;/li&gt;
  &lt;li&gt;Common Name (this can be the FQDN or the short name, despite what the warning says, the short name works too.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Optional values:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Organizational Unit or Department&lt;/li&gt;
  &lt;li&gt;Include the iLO IP Address in the CSR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After filling these in, hit the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Generate Request&lt;/code&gt; button.  Now this part is really dumb, the CSR is generating, but it takes a random amount of time (0-10 minutes), with no progress control.  You just keep hitting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Generate Request&lt;/code&gt; again and again until the dialog pops up&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The iLO subsystem is currently generating a Certificate Signing Request (CSR). This may take 10 minutes or more. In order to view the CSR, wait 10 minutes or more, and then click the “Generate CSR” button again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once the dialog opens, you will need to copy the entire CSR output, including the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-----Begin/End Certificate Request-----&lt;/code&gt; portions.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-07-25-installing-pki-ssl-certificate-on-hpe-ilo/csr-generation.png&quot; alt=&quot;CSR-Generation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After you have the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CSR&lt;/code&gt;, browse out to your CA and generate an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Advanced Certificate Request&lt;/code&gt;, paste in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CSR&lt;/code&gt;, select your desired template, and submit the request.  (I’m not going into info on CAs and templates in this walk through, I’m sure either you know how to do this, else ask your PKI admin).  On the certificate download page, select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BASE64&lt;/code&gt; encoding, and download the certificate, you do not the entire chain.  Lastly, on the same screen in the iLO, you select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Import Certificate&lt;/code&gt; button, and in the dialog, you will paste your cert data.  You get this by right clicking the certificate file you generated and downloaded, and select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Open With -&amp;gt; Notepad&lt;/code&gt; and there you will get a similar result as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CSR&lt;/code&gt;, but a longer string of random characters, that is what you paste in the iLO dialog.  If this was all done correctly the iLO will reset, and you will have a custom certificate installed.  And no more security warning if you browse to it by the name you entered into the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Common Name&lt;/code&gt; property.&lt;/p&gt;

&lt;p&gt;Whew!  Lets automate this.&lt;/p&gt;

&lt;p&gt;As you can see, there really isn’t that many steps, but I have hundreds of HPE servers, and there is no way in Hell I am going to sign into each one, generate a CSR, wait, wait, wait, then go to my CA, submit the request, save it, open it, and paste it in the web page hundreds of times.  So I started messing with the &lt;a href=&quot;https://www.powershellgallery.com/packages/HPEiLOCmdlets/2.2.0.0&quot;&gt;HPEiLOCmdlets&lt;/a&gt; PowerShell Module, and using those its pretty easy to start the CSR generation, and once its created, use &lt;a href=&quot;https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1&quot;&gt;certreq.exe&lt;/a&gt; to submit the request, and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HPEiLOCmdlets&lt;/code&gt; can be used to install the certificate as well.&lt;/p&gt;

&lt;h2 id=&quot;breaking-down-the-code&quot;&gt;Breaking Down The Code&lt;/h2&gt;

&lt;p&gt;The cmdlet I created is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New-HPEiLOPKICertificate&lt;/code&gt;  Here is the usage:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;New-HPEiLOPKICertificate.ps1 [-Credential] &amp;lt;pscredential&amp;gt; [-iLOName] &amp;lt;string[]&amp;gt; [[-Country] &amp;lt;string&amp;gt;] [[-State] &amp;lt;string&amp;gt;] [[-Locality] &amp;lt;string&amp;gt;] [[-Organization] &amp;lt;string&amp;gt;] [[-OrganizationalUnit] &amp;lt;string&amp;gt;] [[-CertificateAuthorityName] &amp;lt;string&amp;gt;] [[-CertificateTemplateName] &amp;lt;string&amp;gt;] [[-FirmwareMinimumVersion] &amp;lt;version&amp;gt;] [-IncludeiLOIP] [&amp;lt;CommonParameters&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The parameters pretty much all line up with the values discribed above, with the exception of a few:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Credential&lt;/code&gt; - This is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PSCredential&lt;/code&gt; object for the iLO login credentials, use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Get-Credential&lt;/code&gt; to populate this value.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iLOName&lt;/code&gt; - This is the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CommonName&lt;/code&gt; can be the FQDN or the shortname.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CertificateAuthorityName&lt;/code&gt; - This is your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CA&lt;/code&gt; instance, you can find this by just typing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;certreq&lt;/code&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CMD&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CertificateTemplateName&lt;/code&gt; - The template to submit your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CSR&lt;/code&gt; against.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FirmwareMinimumVersion&lt;/code&gt; - The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HPEiLOCmdlets&lt;/code&gt; seem to only like newer iLO versions, I can tell you 2.55 does not work, but 2.70 does.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want you can set default parameter values in the script, so your really only have to change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iLOName&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;New-HPEiLOPKICertifacte.ps1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-iLOName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;myHPEiLO.tomohulk.io&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Credential&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-Credential&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The workflow of the cmdlet is pretty straight forward:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Connect to the iLO.&lt;/li&gt;
  &lt;li&gt;Verify the firmware version is a minimum version.&lt;/li&gt;
  &lt;li&gt;Begin the CSR generation with the supplied values.&lt;/li&gt;
  &lt;li&gt;Looping every 5 seconds, query the iLO to see if the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CSR&lt;/code&gt; has been generated.&lt;/li&gt;
  &lt;li&gt;Export the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CSR&lt;/code&gt; to a temp file.&lt;/li&gt;
  &lt;li&gt;Submit the request to the the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CA&lt;/code&gt; using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;certreq.exe&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Use resulting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.pem&lt;/code&gt; file to upload the new certificate to the iLO.&lt;/li&gt;
  &lt;li&gt;Delete the temporary &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.csr&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.pem&lt;/code&gt; files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This cmdlet accepts pipeline input for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iLOName&lt;/code&gt; as well as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringArray&lt;/code&gt;, so as long as they have the same credentials, you can complete this on multiple systems at once:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;@(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ilo1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ilo2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New-HPEiLOPKICertificate&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Credential&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-Credential&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# or&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New-HPEiLOCertificate&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-iLOName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ilo1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ilo2&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Credential&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-Credential&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Thats pretty much it, after the iLO resets and you refresh the page, you will see your connection is now &lt;em&gt;secure&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-07-25-installing-pki-ssl-certificate-on-hpe-ilo/secure-site.png&quot; alt=&quot;Secure Site&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here is the complete code, cheers!:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4ddb9a0e8feb3768c742b5cf867a0cb8.js&quot;&gt; &lt;/script&gt;

</description>
			<pubDate>Thu, 25 Jul 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/installing-pki-ssl-certificate-on-hpe-ilo/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/installing-pki-ssl-certificate-on-hpe-ilo/</guid>
		</item>
		
	
		
		<item>
			<title>Using BLTouch with Klipper and the Ender3</title>
			<description>&lt;p&gt;I have been 3D printing for about a year now, its had its ups and downs, good times and bad.  Some times its the greatest thing, and sometimes I’m glad I don’t keep a baseball bat near my 3D Printer, because I may not still be the owner of one if I did.  I know all printers are different and everyone has their reasons for why or what they do and use for the build surface.  I have the &lt;a href=&quot;https://www.amazon.com/Comgrow-Creality-Ender-Aluminum-220x220x250mm/dp/B07BR3F9N6/ref=sr_1_1_sspa?keywords=ender+3&amp;amp;qid=1559158769&amp;amp;s=gateway&amp;amp;sr=8-1-spons&amp;amp;psc=1&quot;&gt;Ender3&lt;/a&gt;, its a great entry level printer for the price and I have spit out some amazing prints.  But one the most notorious issues with the Ender3 is the warped bed.  It seems like everyone has reported this issue.  And I think one thing all 3D Printer Hobbyist could agree on, is the first layer is one of the most important parts of the print.  And when you printing around .2mm layer hight, if the build surface isn’t perfect you’re going to have problems, especially with larger prints.&lt;/p&gt;

&lt;p&gt;There are a few things you could do about this, such as, just deal with it, replace the bed with something higher grade, or add a new surface, such as a piece of glass.  I chose to use a sensor on the hot end.  I went with the &lt;a href=&quot;https://www.amazon.com/BLTouch-Leveling-Printer-Official-Authorization/dp/B07GVCX74T/ref=sr_1_4?keywords=bltouch&amp;amp;qid=1559158792&amp;amp;s=gateway&amp;amp;sr=8-4&quot;&gt;BLTouch&lt;/a&gt; sensor.  It’s pretty much just a probe, that will make a &lt;em&gt;mesh&lt;/em&gt; of your build surface and allow for your Z axis to compensate for the imperfect surface with very small up and down Z axis movements.&lt;/p&gt;

&lt;p&gt;Now, I know there is a lot of YouTube videos out there on how to setup and use a BLTouch sensor, but, everything I found when I was setting mine up, was with using the Marlin firmware. Either Vanilla Marlin or the TH3D flavor.  Well, to complicate things even more, I am using &lt;a href=&quot;https://github.com/KevinOConnor/klipper&quot;&gt;Klipper&lt;/a&gt;.  I’m not going to dive into much about Klipper in this blog post, as its not really the focus.  Either you are already using Klipper and you know what it is, so keep reading, or go research Klipper and see if its for you.  Because these settings will &lt;strong&gt;NOT&lt;/strong&gt; work with any flavor of the Marlin firmware.&lt;/p&gt;

&lt;h2 id=&quot;values-youll-need&quot;&gt;Values You’ll Need&lt;/h2&gt;
&lt;p&gt;There are values you need when setting up your BLTouch, namely the X and Y offsets from the nozzle to the BLTouch, you can either measure these or, if you are using third party mods on your hot end, a lot of the designers will specify these values.  I am using the &lt;a href=&quot;https://www.thingiverse.com/thing:2759439&quot;&gt;Bullseye Cooling Fan Duct&lt;/a&gt; and the designer has provided the offset values on the Thingiverse page.  Using the Bullseye Fan Duct and the provided mount, the offsets are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X -42, Y -5&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next, you will need to know your bed size, the bed that ships with the Ender3 is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;220x220mm&lt;/code&gt;.  You need to know this for creating a bed mesh, which is what the BLTouch will build when probing.&lt;/p&gt;

&lt;h2 id=&quot;get-configuring&quot;&gt;Get Configuring&lt;/h2&gt;
&lt;p&gt;Here are the settings you need to add or update on in your Klipper &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;printer.cfg&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;You need to change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;endstop_pin&lt;/code&gt; value to use a virtual endstop, this is in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;z_stepper&lt;/code&gt; section.
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;endstop_pin: probe:z_virtual_endstop&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;You need to allow the Z Axis to go below the ‘0’ mark for negative warp, this can be done by editing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;position_min&lt;/code&gt; value, also in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;z_stepper&lt;/code&gt; section.
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;position_min: -3&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;You need to define the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[bltouch]&lt;/code&gt; section and values in the configuration file (a section is defined with square brackets, this section does not exist in the Ender3 printer.cfg by default, so you will need manually create it).  You can see that the X and Y offsets are the values I got from the Thingiverse page.
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[bltouch]
sensor_pin: ^PC4
control_pin: PA4
x_offset: -47.0
y_offset: -5.0
z_offset: 1.65
speed: 5.0
samples: 2
sample_retract_dist: 8.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;ul&gt;
      &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;samples&lt;/code&gt; value is how many times it checks each location in the bed mesh, more samples will take longer.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Next, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[bed_mesh]&lt;/code&gt; section needs to be manually defined.
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[bed_mesh]
speed: 80
horizontal_move_z: 5
min_point: 50,30
max_point: 230,230
probe_count: 5,5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;ul&gt;
      &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;probe_count&lt;/code&gt; is how many samples its going to take, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5,5&lt;/code&gt; is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5x5&lt;/code&gt; grid, a bigger grid will take longer, but may be more accurate.&lt;/li&gt;
      &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;min_point&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max_point&lt;/code&gt; is how big your bed is, with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;220x220mm&lt;/code&gt; build plate, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;230x230mm&lt;/code&gt; is about as large as you can go.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Now, add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[homing_override]&lt;/code&gt; section.  You can do what ever you want here, I am just setting the Z axis to home in the middle of the bed.
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[homing_override]
set_position_z:0
gcode:
 G1 Z10 F600
 G28 X Y
 G1 X166 Y120 F6000
 G28 Z
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;ul&gt;
      &lt;li&gt;PRO TIP: gcode sections in the printer.cfg need to be 4 spaced or you will get errors.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;There is one last thing to do, and that is configure your start and end gcode sequences to tell klipper to generate the bed mesh and use it.  This command is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BED_MESH_CALIBRATE&lt;/code&gt; called after &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G28&lt;/code&gt; (the homing override).  Now, here is what I do, I keep my start and end gcode sequences in the Klipper printer.cfg as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gcode_macro&lt;/code&gt;s.  This allows me to use multiple slicers and keep my start and end gcode the same.  I have them mapped to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;START_PRINT&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;END_PRINT&lt;/code&gt;, then in any slicer i am using, I can just put those in and let Klipper handle the sequences.  I have included my printer.cfg at the bottom of this page so you take a look at my start up and end print gcode.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;configure-the-z-offset&quot;&gt;Configure The Z Offset&lt;/h2&gt;
&lt;p&gt;So, for me this was the hardest part, I had the probe working, and at least stopping from crashing into the bed, but, I couldn’t figure out how to actually make the printer know the space from the probe being triggered, to the bottom of the nozzle.  Which is obviously crucial for the hotend to know how much lower to go past the point where the BLTouch is triggered and be the perfect height above the bed to start printing.  Well, its actually really simple.  At least thats how I feel about it now that I know how to do it.  And after figuring it out, the only time I have had to re-calibrate my Z offset is when I replace the nozzle.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Go into your printer.cfg and change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;z_offset&lt;/code&gt; to 10 in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[bltouch]&lt;/code&gt; section.  This number is completely arbitrary.  Just need a value there, and one that will be easy to do math with later.&lt;/li&gt;
  &lt;li&gt;Home the printer, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G28&lt;/code&gt;.  as long as your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[bltouch]&lt;/code&gt; settings are correct, the BLTouch pin should engage, and the Z axis should lower and stop, once its triggered.  I kept my finger on the power button at this point to stop the hotend from crashing into the bed if need be.&lt;/li&gt;
  &lt;li&gt;Next tell the printer to go into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Relative Position&lt;/code&gt; mode: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G91&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Now move the hotend over the spot the BLTouch probed to home the bed: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G1 X-47&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Get a piece of paper and get ready to bed level like you always do, lower the Z axis by -.05 until the nozzle scrapes the paper.  You can do this with the display control, or I use &lt;a href=&quot;https://itunes.apple.com/us/app/octopod-for-octoprint/id1412557625?mt=8&quot;&gt;OctoPod&lt;/a&gt; on my iOS device.&lt;/li&gt;
  &lt;li&gt;Once the Z axis is where it needs to be, you can run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GET_POSITION&lt;/code&gt; in the terminal and then just do the math:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[printer.cfg [bltouch] z_offset] - [z value from GET_POSITION] = z_offset&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;IE: 10 - 8.5 = 1.5&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Replace your the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;z_offset&lt;/code&gt; value in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[bltouch]&lt;/code&gt; section with your new calculated value.&lt;/li&gt;
  &lt;li&gt;Print and be happy as your first layer runs perfect!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I actually left my printer off for about 4 weeks recently, turned it on and fired off a print, first layer still layed perfect.  Cheers!&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;update&quot;&gt;Update&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;20190609 - A recent Klipper update moved the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;samples: 2&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sample_retract_distance: 8.0&lt;/code&gt; from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[bed_mesh]&lt;/code&gt; section to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[bltouch]&lt;/code&gt; section.  I have updated this article to reflect those changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;my-ender3-klipper-printercfg&quot;&gt;My Ender3 Klipper printer.cfg&lt;/h3&gt;

&lt;script src=&quot;https://gist.github.com/bd4955ba105b653bb81680927b4d1f87.js&quot;&gt; &lt;/script&gt;

</description>
			<pubDate>Tue, 04 Jun 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/using-bltouch-with-klipper-and-the-ender3/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/using-bltouch-with-klipper-and-the-ender3/</guid>
		</item>
		
	
		
		<item>
			<title>Klean Yer Keezer Lines</title>
			<description>&lt;p&gt;I’m not sure out there who needs to hear this, but clean your beer lines!  After a while of beer sitting, lines begin to stain and leave flavors that will be picked up by other beers.  I mean who wants to have a lingering coffee porter in your NEIPA?  No one, thats who.  There is no &lt;em&gt;one size fits all&lt;/em&gt; for how often you should clean your lines, it depends a lot on things like how long the beer has been siting in them, how often are they used, and what style of beer.  In the past, I would just replace the lines every 6 months.  There is a few things wrong with doing this, first of all, its costly, second of all, its a pain in that ass, and third, six months between cleaning/replacing is too long IMO.  Now I am rinsing lines every other month.  Maybe that is &lt;em&gt;too&lt;/em&gt; often, but after you see how easy it is to do, I could do it even more often and not really mind.&lt;/p&gt;

&lt;h2 id=&quot;build-it&quot;&gt;Build It&lt;/h2&gt;
&lt;p&gt;So, the most important part of this build, is the pump.  The good news is, if you built a keg washer based on my last post (&lt;a href=&quot;/cip-diy-keg-washer/&quot;&gt;CIP DIY Keg Washer&lt;/a&gt;), then you already have a pump that will work perfect for this.  That pump has the power to push cleaner through 4 taps, each with 10’ of beverage line.  If you have more then 4 taps, either you’ll have to do it in sections, or you &lt;em&gt;may&lt;/em&gt; need a more powerful pump.&lt;/p&gt;

&lt;p&gt;Here is the basic premise of this &lt;em&gt;line cleaner&lt;/em&gt;, you are going to pump cleaner &lt;em&gt;INTO&lt;/em&gt; &lt;em&gt;tap #1&lt;/em&gt;, then connect that line to the tap line next to it, so the cleaner will be coming &lt;em&gt;OUT&lt;/em&gt; &lt;em&gt;tap #2&lt;/em&gt;.  Then you connect &lt;em&gt;tap #2&lt;/em&gt; to &lt;em&gt;tap #3&lt;/em&gt;, and again, connect &lt;em&gt;tap #3&lt;/em&gt; and &lt;em&gt;tap #4&lt;/em&gt; lines together, and this will cause the cleaner to come out &lt;em&gt;tap #4&lt;/em&gt;, and back into the the bucket that the pump is in, allowing for the cleaner to be continuously recirculated through all taps and lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt; Connect everything together in a way allowing for cleaner to be pumped into &lt;em&gt;tap #1&lt;/em&gt; and come out &lt;em&gt;tap #4&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A key component of this will be hooking beverage line to beverage line.  Which means you need a custom fitting allowing for disconnect to connect to disconnect.  If you have old kegs lying around, I guess you could steal pieces from that.  You &lt;em&gt;could&lt;/em&gt; buy posts, but that would way more expensive then just replacing the lines regularly.  Im sure you already know what I did…of course, I designed something that could be 3D printed (&lt;a href=&quot;https://www.thingiverse.com/thing:3517302&quot;&gt;Thingiverse link&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-05-09-klean-yer-keezer-lines/coupler.png&quot; alt=&quot;Coupler&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’m actually pretty proud of this design, it was pretty in depth to make, and I got to learn some really interesting things with &lt;a href=&quot;https://www.autodesk.com/products/fusion-360/overview#banner&quot;&gt;Fustion360&lt;/a&gt; (something similar, not designed by me, but the same concept for ball locks can be found &lt;a href=&quot;https://www.thingiverse.com/thing:2684969&quot;&gt;here&lt;/a&gt;).  I printed two of these, allowing me to connect pin lock to pin lock disconnects together.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-05-09-klean-yer-keezer-lines/connection.jpg&quot; alt=&quot;Connection&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I had to get some rubber O-rings for them, #10 faucet O-rings from my local hardware store.  I don’t normally discuss print settings for things because there is so many variables, but one thing I will say, is print these at 100% infill as pressurized liquid will be flowing through them.  Or, if you don’t want to go the route of connecting beer lines together via the disconnects, if the barbs on your disconnects are removable, the you could remove the disconnect and use a pressure fitting to connect them.  I like the way I have it, because its also cleaning the disconnects this way.&lt;/p&gt;

&lt;p&gt;Outside of those two major things, the only other parts you need is a barb to go in place of your CIP Ball on your keg washer (see previous post), some hose or tubing, I just use the same silicone tube I use when kegging, and some actual &lt;a href=&quot;https://www.amazon.com/BLC-Beverage-System-Cleaner-32/dp/B074D9DV5P/ref=sr_1_1?keywords=BLC&amp;amp;qid=1560991190&amp;amp;s=gateway&amp;amp;sr=8-1&quot;&gt;BLC (Beer Line Cleaner)&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;use-it&quot;&gt;Use It&lt;/h2&gt;
&lt;p&gt;After you have all together, the rest is easy, mix up enough BLC in a bucket to submerge your pump, run your pump into tap #1, connect tap #1 line to tap #2 line, connect tap #2 to tap #3, I just used a small piece of silicone tube for this, then connect tap #3 line to tap #4 line.  &lt;strong&gt;BE SURE TO OPEN ALL YOUR TAPS!&lt;/strong&gt;  Turn the pump on and let the liquid flow though your keezers veins, and come out tap #4.  Now, my taps are close enough together I can do this with a five gallon bucket, but you may have to get creative if thats not the case for you.&lt;/p&gt;

&lt;p&gt;Thats pretty much it, let that recirculate for 15-20 minutes.  Empty the bucket and fill with hot clean water, and rinse for 10 minutes.  I usually rinse for 5 minutes, empty the bucket, fill again with hot clean water, and rinse another 5.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-05-09-klean-yer-keezer-lines/cleaning.jpg&quot; alt=&quot;Cleaning&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Thats it.  And I’m sure the patrons of your homemade beer will have much praise to give on how fresh and clean your homebrew has become.  Cheers!&lt;/p&gt;
</description>
			<pubDate>Thu, 09 May 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/klean-yer-keezer-lines/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/klean-yer-keezer-lines/</guid>
		</item>
		
	
		
		<item>
			<title>CIP DIY Keg Washer</title>
			<description>&lt;p&gt;Ok Ok, its time for an easy build, no software, no programing, no CLI (command line interface) this one is cake, you don’t even need any tools, just some time (and money), and it will make washing your kegs easy peasy.  And, in a later post, I’ll show you how to easily turn this washer into a keezer beer line cleaner!&lt;/p&gt;

&lt;p&gt;So, frankly, F washing kegs!  I mean if you are going to do it right you need to disassemble, remove the dip tube, wash, wash, rinse, rinse, blah blah.  Ain’t no one got time for that!  I’ve got a nice little build here that doesn’t break the bank and works pretty damn well.  lets get to it!&lt;/p&gt;

&lt;p&gt;Ok, down to business, this really doesn’t even need a build walk through but, I’m gonna give a little one, because……the pump works great to clean your beer lines as well (post to come) so I hope you buy one.  This list going to be a little lack luster, because I bought some of it at my local hardware.  But the few things you can get online are:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/gp/product/B01CGAD986/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&amp;amp;psc=1&quot;&gt;Submersible Pump&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/gp/product/B073GHFP6J/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&amp;amp;psc=1&quot;&gt;CIP Spray Ball&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B0768ZGGMZ/ref=cm_sw_r_tw_dp_U_x_LwTcDbJ8D4Q5R&quot;&gt;Liquid Keg Disconnect (I use pin lock)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Some hose or tube im sure you have laying around, only need like 6”.  Size is variable as the pump comes with multiple barbs.&lt;/li&gt;
  &lt;li&gt;A bucket.&lt;/li&gt;
  &lt;li&gt;I used under ground sprinkler 1/2” NPT PVC (this is what I got at my locale hardware).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, this build is pretty flipping easy.  Basically, you just need a PVC tube up from the pump outlet, with the CIP Ball on top, now I added a T at the bottom, used a 6” tube, a T, and a 16” tube, and used a barb that comes with the pump and a short piece of hose to the liquid disconnect to shoot cleaner/rinse up the dip tube as well.  Then the concept is straight forward, just fill a bucket with some water and oxyclean, put your &lt;em&gt;keg cleaner&lt;/em&gt; in there and shoot hot oxyclean through the keg for a while and then switch it with clean hot water and rinse!&lt;/p&gt;

&lt;p&gt;Boom, a keg cleaner.  For me, I use old 7.75gal kegs as fermenters, so I use this to clean them as well.  Works really good.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-05-07-cip-diy-keg-washer/washer.jpg&quot; alt=&quot;Washer&quot; /&gt;&lt;/p&gt;

&lt;p&gt;cake!  easy peasy build!  BEER TIME!&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;p&gt;https://beer.thegremlyn.com/2017/03/15/i-built-a-keg-washer-you-should-too/&lt;/p&gt;
</description>
			<pubDate>Tue, 07 May 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/cip-diy-keg-washer/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/cip-diy-keg-washer/</guid>
		</item>
		
	
		
		<item>
			<title>PiLess BrewPi</title>
			<description>&lt;p&gt;Its no secret that temperature control is a huge aspect of brewing beer successfully.  It can have dramatic side effects if you don’t keep the temperature in the yeasts range, or you may not be able to achieve flavors that you’re seeking from the yeast fermenting at a specific temperature.  Now, in my past life as @dotps1, I covered in detail how to make a BrewPi.  A temperature controller running with a Raspberry Pi and an Arduino board (that blog post can be found &lt;a href=&quot;https://dotps1.github.io/homebrewing/2018/01/22/brewing-your-own-brewpi.html&quot;&gt;here&lt;/a&gt;, for now anyway, I’m not sure how long I will be keeping https://dotps1.github.io up).  The BrewPi is defiantly a solid temperature controller solution, that allows for many customization, and the ability to create temperature profiles, allowing for temperature ramp up and cold crashing.  And most importantly, it handles temperature swing.  Unfortunately, the BrewPi is no longer officially supported on the Raspberry Pi/Arduino configuration, and as you can see the branch hasn’t been touched in years, https://github.com/BrewPi/brewpi-www/tree/legacy.  I made this clear in my last walk through, which is over a year old now, and I had to fork the project and fix a bunch of dependency issues, that probably are already out of date.&lt;/p&gt;

&lt;h2 id=&quot;enter-the-piless-brewpi&quot;&gt;Enter the PiLess BrewPi&lt;/h2&gt;
&lt;p&gt;So, theres another implementation of the BrewPi software out there, called &lt;a href=&quot;https://github.com/vitotai/BrewPiLess&quot;&gt;BrewPiLess&lt;/a&gt;.  And the best part is, it doesn’t need a Raspberry Pi, or even an Arduino Controller!  And the project is actively developed, which means new features, and bug fixes.  One of the really great features the BrewPiLess has, is that it supports logging data to &lt;a href=&quot;https://brewfather.com&quot;&gt;BrewFather&lt;/a&gt;.  There you can attach the device to a batch, and keep track of the temperature as the batch is fermenting, and all the data is stored in one place.&lt;/p&gt;

&lt;p&gt;I was able to get this up and running, oh, I’d say about 10x faster then I got the BrewPi up.  However, if you read my last blog on makeing a BrewPi, I housed everything in an outdoor sprinkler control box, it was huge and there where power cords and temperature probes hanging all over the place.  Well this time, I wanted something fully modular, where all the cords where removable, and much much smaller.  As small as absolutely possible.  I reached my goal, but if you want your &lt;em&gt;BPL&lt;/em&gt; exactly the same as mine, you will need to solder some connections in this build, and have access to a 3D Printer for the enclosure.  These are not show stoppers, there is plenty of other ways to put everything together, this is just &lt;em&gt;my way&lt;/em&gt; based on the things I regretted doing when I built my BrewPi, and features I wanted in this build.
&lt;img src=&quot;/images/2019-05-01-piless-brewpi/complete.jpg&quot; alt=&quot;Complete&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;shopping-list&quot;&gt;Shopping List&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Most of this stuff comes in bulk, so find a buddy that wants one too, and split the cost!&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B01IK9GEQG/ref=cm_sw_r_tw_dp_U_x_WnTcDb2X2FXPF&quot;&gt;ESP8266 NodeMCU&lt;/a&gt; (you don’t need two of these, but at that price, might as well, the second one is almost free)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B01MUATVXX/ref=cm_sw_r_tw_dp_U_x_DoTcDb4Y1JCNS&quot;&gt;Two Channel Relay Module&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B01GPUMP9C/ref=cm_sw_r_tw_dp_U_x_YoTcDbT2EFX3H&quot;&gt;20x4 LCD Module&lt;/a&gt; (this is optional if you would like a display on the controller)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B07CBS768L/ref=cm_sw_r_tw_dp_U_x_jpTcDbF87A192&quot;&gt;AC-&amp;gt;DC 5V PSU&lt;/a&gt; (this acts a power supply unit inside the enclosure, powering all the componets, else you can power things with USB bricks, but that sounds like a mess)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B014EJY0JE/ref=cm_sw_r_tw_dp_U_x_aqTcDbWWS21YC&quot;&gt;Mini XLR Male connectors (2 needed)&lt;/a&gt; (these are optional allowing for the temperature probes to be disconnected from the enclosure)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B01J33CF48/ref=cm_sw_r_tw_dp_U_x_DqTcDb4HBH9JT&quot;&gt;Mini XLR Female connectors (2 needed)&lt;/a&gt; (these are optional allowing for the temperature probes to be disconnected from the enclosure)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B01M3URWIT/ref=cm_sw_r_tw_dp_U_x_vrTcDb8AKMAJF&quot;&gt;AC 3-Pin Outlets (2 needed)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B00X73S52M/ref=cm_sw_r_tw_dp_U_x_TrTcDb1W0WM52&quot;&gt;3-Position Screw Terminal&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B00NWO68JI/ref=cm_sw_r_tw_dp_U_x_csTcDbKZ6CYAG&quot;&gt;AC Rocker Switch&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B00EU70ZL8/ref=cm_sw_r_tw_dp_U_x_BsTcDbMZ0JG19&quot;&gt;DS18B20 Temperature Probes (2 needed)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B0185FC5OK/ref=cm_sw_em_r_mt_dp_U_6sTcDb4JWZDCA&quot;&gt;4.7k Resistor&lt;/a&gt; (only 1 is needed, but good luck finding just 1 for sale)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B077X7MKHN/ref=cm_sw_r_tw_dp_U_x_VtTcDbCVHGJZA&quot;&gt;Breadboard Jumpers&lt;/a&gt; (really only need female jumpers for this project)&lt;/li&gt;
  &lt;li&gt;Misc screws, wire, shrink tube, and wire nuts/connectors&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;pro-tip&quot;&gt;Pro Tip&lt;/h2&gt;
&lt;p&gt;I am going to suggest starting this project by printing the enclosure.  I am going to suggest this for a few reasons, first of all, most the customization I used in my build are only really needed if you are going to use my enclosure design.  Things like the plugs, XLR connections, AC Rocker Switch and the LCD are all going to work perfect in my enclosure,  Second, it takes a bit to print, and well, everything mounts in the enclosure, so you’re going to kinda need that part right away.  If you’re not going to use my design, you can probably skip this part, and just mock everything up so you can figure out how your going to house this contraption.&lt;/p&gt;

&lt;p&gt;The enclosure I designed is available on &lt;a href=&quot;https://www.thingiverse.com/thing:3042974&quot;&gt;Thingiverse&lt;/a&gt;.  It is one of the first things I’ve designed, so I’m sure there are things that &lt;em&gt;could be done better&lt;/em&gt; but it works well enough for what it is.  I’m not going to go into print settings for this as its out of the scope of this walk through.  So, if you’re going this route, download the stl and get it printing because it will take a bit, you can print the lid while you are assembling the rest of the BPL.&lt;/p&gt;

&lt;h2 id=&quot;time-to-make-the-chimi-fing-changas&quot;&gt;Time to make the chimi-f***ing-changas&lt;/h2&gt;
&lt;p&gt;So, the first thing I want to say about this system, is that its dealing with 110v AC power, you will be running that power to the AC-&amp;gt;DC converter (the NodeMCU and LCD run on DC power), and to the relay module, which essentially turns on/off your power outlets, which will control your Heating and Cooling in your fermentation chamber.  I cannot over stress this enough, &lt;strong&gt;IF YOU ARE NOT COMFORTABLE WORKING WITH ELECTRICITY OR DON’T KNOW HOW BASIC ELECTRICAL WIRING WORKS, STOP WHAT YOU ARE DOING, PUT YOUR TOOLS DOWN, AND FIND SOMEONE WHO DOES&lt;/strong&gt;!  Ok, with that being said, lets get down to business.&lt;/p&gt;

&lt;h3 id=&quot;install-the-brewpiless-bin-on-the-esp8266-nodemcu&quot;&gt;Install the BrewPiLess bin on the ESP8266 NodeMCU&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Download the BrewPiLess Repository:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git clone https://github.com/vitotai/BrewPiLess.git&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;If you don’t have it installed, you will need to download and install &lt;a href=&quot;https://code.visualstudio.com&quot;&gt;VSCode&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Open the repository in VSCode.  If you don’t have &lt;a href=&quot;https://platformio.org/install/ide?install=vscode&quot;&gt;Platform.io&lt;/a&gt; installed, go to the extensions workspace and install it.
    &lt;ul&gt;
      &lt;li&gt;On my mac, it failed to install the first, and it was because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;virtualenv&lt;/code&gt; needed to be installed.  Completing the three steps listed in the &lt;em&gt;Perquisites&lt;/em&gt; section &lt;a href=&quot;http://docs.platformio.org/en/latest/installation.html#virtual-environment&quot;&gt;here&lt;/a&gt;, and then uninstall/reinstall the extension fixed the issue.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Connect the NodeMCU to your computer via USB, and flash the bin to the board (make sure you are in the working directory of the repo):
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;command+shit+p&lt;/code&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;PlatformIO: Build&lt;/code&gt;&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;PlatformIO: Upload&lt;/code&gt;&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;PlatformIO: Clean&lt;/code&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;After the flash is complete, the NodeMCU will begin broadcasting its own SSID, you need to connect to to this WiFi network to configure it to connect to your home WiFi.
    &lt;ul&gt;
      &lt;li&gt;Username: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brewpiless&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Password: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brewpiless&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Open a browser it should auto connect to a config page, where you can change the username, password, and the title.&lt;/li&gt;
      &lt;li&gt;Save the changes and on the next page enter you home wireless info.&lt;/li&gt;
      &lt;li&gt;After this is complete you can connect back to your home wifi.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;soldering&quot;&gt;Soldering&lt;/h3&gt;
&lt;p&gt;There are a few things to solder, and some need to be done before assembly:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Solder your wires to the AC-&amp;gt;DC 5V PSU, you won’t be able to do this after its in the enclosure.
    &lt;ul&gt;
      &lt;li&gt;On the &lt;strong&gt;POWER IN&lt;/strong&gt; side, you need 14-16 AWG wire, basically the same wire thats in the walls of your house, I clipped an old Molex computer cable and stole wire from that.  This wire needs to be heavier gauge because it will have the 110v that is coming from your house to it, then will convert that to 5v DC.&lt;/li&gt;
      &lt;li&gt;On the &lt;strong&gt;POWER OUT&lt;/strong&gt; side, you need &lt;strong&gt;THREE&lt;/strong&gt; Hot and Ground leads.  These will power the NodeMCU, LCD and Relay.  Just clip one end of the breadboard jumper wires for this.&lt;/li&gt;
      &lt;li&gt;you can either solder the wire right to the board, or there is screw terminals that you could get as well, that you would solder to the board, and then you can screw the wires into the terminals, the choice is yours.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;The temperature probes need to be soldered to the female XLR connectors, the wire to pin layout don’t matter really, just as long as you do both of them the same.
    &lt;ul&gt;
      &lt;li&gt;Unscrew the connector, put the plastic housing over the temperature probe wire, and solder the three wires from the probe to the three pin cups on the connector.&lt;/li&gt;
      &lt;li&gt;Repeat this step for the other temperature probe.&lt;/li&gt;
      &lt;li&gt;One thing I did was cut one probe a bit shorter then the other, for two reasons. First, the probe to monitor the fridge temperature didn’t need to be 6’ long.  Second, it makes it easier for me to keep track of which probe is for the chamber temperature and which is for the beer temperature.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;While you have your solder gear out, might as well solder the wires to the male fittings as well.
    &lt;ul&gt;
      &lt;li&gt;Sacrifice a few jumper wires for this, I would recommend using the same colors as the wires that where in the temperature probes so you can keep every thing lined up. The connectors are keyed so they can only go together one way.&lt;/li&gt;
      &lt;li&gt;leave about 2-3 inches (cut a jumper in half) of wire, these will connect to the three position screw terminal that is directly behind the connectors in the enclosure (see the &lt;em&gt;layout&lt;/em&gt; image below).&lt;/li&gt;
      &lt;li&gt;Solder the wires to the pin cups, again, be sure your wire colors match up, your basically just making a pass thru connection in the enclosure, that is detachable if need be.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;assembly&quot;&gt;Assembly&lt;/h3&gt;
&lt;p&gt;Wiring diagram:
&lt;img src=&quot;/images/2019-05-01-piless-brewpi/wiring.jpg&quot; alt=&quot;Wiring&quot; /&gt;
Layout diagram (I wasn’t able to find a 3D model of the AC-DC 5V PSU, that goes in with the Power IN facing way from the the LCD in the big empty space):
&lt;img src=&quot;/images/2019-05-01-piless-brewpi/layout.png&quot; alt=&quot;Layout&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;At this point, you can start putting all the pieces in the enclosure.
    &lt;ul&gt;
      &lt;li&gt;Place each board on its mounting posts, I used old computer motherboard screws to hold them down.&lt;/li&gt;
      &lt;li&gt;The three position screw terminal I glued to the post.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Use the diagram above to connect all the jumpers.
    &lt;ul&gt;
      &lt;li&gt;The power for the NodeMCU will be supplied from the AC-&amp;gt;DC 5V PSU to the 5V pin on the board.&lt;/li&gt;
      &lt;li&gt;Connect a ground lead from the AC-&amp;gt;DC 5V PSU to any ground on the NodeMCU board.&lt;/li&gt;
      &lt;li&gt;In the diagram it shows the 5V pin is used to power the relay module, but that is assuming the NodeMCU is being powered VIA the USB port.  Which is not the case, the 5V (maybe also labeled ‘Vin’) pin on the board will be used to power the NodeMCU itself, and then you can use one of the 3 power leads from the AC-&amp;gt;DC 5V PSU to power the relay module.&lt;/li&gt;
      &lt;li&gt;Be sure to add the resistor in the three position screw terminal when wiring in the temperature probes.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Next wire in the power switch and the outlets.
    &lt;ul&gt;
      &lt;li&gt;AC Rocker switch wiring digram:
 &lt;img src=&quot;/images/2019-05-01-piless-brewpi/switch_wiring.jpg&quot; alt=&quot;Switch Wiring&quot; /&gt;&lt;/li&gt;
      &lt;li&gt;From the power switch you will have three leads, 1 to the AC-&amp;gt;DC 5V PSU, and 1 for each outlet. I used lever action wire nuts for this connection because there is 4 14AWG wires connecting at this point.&lt;/li&gt;
      &lt;li&gt;The Relay acts as a switch to complete the circuit, so the hot goes in, and the back out to outlet, and the naturel goes directly to the outlet.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There really isn’t much more I can say about the wiring of this, all the information needed is in the diagram, there is more then one way to skin a cat, so just make sure your wiring is following the diagram and you’ll be fine.  One thing to note, my fridge that I have plugged in the cooling outlet must draw a lot of amps, because the power switch comes with a 5 amp fuse, and when it turned on it, blew that, I had to replace it with a 10 amp fuse.
&lt;img src=&quot;/images/2019-05-01-piless-brewpi/front_wiring.jpg&quot; alt=&quot;Front Wiring&quot; /&gt;
&lt;img src=&quot;/images/2019-05-01-piless-brewpi/rear_wiring.jpg&quot; alt=&quot;Rear Wiring&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;brewpiless-configuration&quot;&gt;BrewPiLess Configuration&lt;/h2&gt;
&lt;p&gt;Once everything is up an running, there isn’t much left to do.  Just need to set which plug is the hot and cold, and which probes are the chamber, and the beer.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Connect to your BrewPiLess via a web browser at http://brewpiless.local (or whatever you named it in the setup screen.)&lt;/li&gt;
  &lt;li&gt;Go to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Device Setup&lt;/code&gt; screen on the top right corner.
    &lt;ul&gt;
      &lt;li&gt;Be sure to click the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Erase EEPROM&lt;/code&gt; button at the top to be sure everything is reset.&lt;/li&gt;
      &lt;li&gt;Click &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Refresh Device List&lt;/code&gt; on the top load all your devices.&lt;/li&gt;
      &lt;li&gt;You have to manually select a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Device&lt;/code&gt; slot for each probe and plug, but these are arbitrary, they just have to be unique.&lt;/li&gt;
      &lt;li&gt;The temperature probes will have an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Address&lt;/code&gt; value.&lt;/li&gt;
      &lt;li&gt;Setup 4 devices:
        &lt;ul&gt;
          &lt;li&gt;Chamber Temp&lt;/li&gt;
          &lt;li&gt;Beer Temp&lt;/li&gt;
          &lt;li&gt;Chamber Heater&lt;/li&gt;
          &lt;li&gt;Chamber Cooler&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;I am not sure if there is a better way to then trial and error to identify which is which, for the probes you can just hold in your hand and the value will change on the display.  For the plugs you will need to actually set a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Beer&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fridge&lt;/code&gt; temperature value and then one or the other will turn on.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Once your get everything setup, I would recommend backing up the configuration from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Device Setup&lt;/code&gt; screen incase you ever need to reload or rebuild, then you won’t have to play the guessing game on which device is which.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;extra-credit&quot;&gt;Extra Credit&lt;/h2&gt;
&lt;p&gt;If your like me, you are going to want to change the temperature units from C to F, because the NodeMCU has such little amount of space, there is no room for webpages to handle customization.  Instead, you do it with commands:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Navigate to http://brewpiless.local/testcmd.htm&lt;/li&gt;
  &lt;li&gt;Issue this command:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;j{&quot;tempFormat&quot;:&quot;F&quot;}&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;If your getting in the Kveik craze, and want to ferment hot AF, the you need to increase the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tempSetMax&lt;/code&gt; value:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;j{&quot;tempSetMax&quot;:&quot;90.0&quot;}&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is plenty of customizing you can do, just check out the BrewPiLess wiki: https://github.com/vitotai/BrewPiLess/wiki&lt;/p&gt;

&lt;h2 id=&quot;time-for-a-cold-one&quot;&gt;Time for a Cold One&lt;/h2&gt;
&lt;p&gt;Whew, you did it!  Nice work!  Go pour yourself a cold one, I know I’m going too, sorry if I missed anything, this was a pretty intense walk through.  Cheers!&lt;/p&gt;
</description>
			<pubDate>Wed, 01 May 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/piless-brewpi/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/piless-brewpi/</guid>
		</item>
		
	
		
		<item>
			<title>Taplist Pi Zero</title>
			<description>&lt;p&gt;So, if in your homebrew life, you’ve moved on past bottling (because its it f***ing terrible) and are kegging your ferments, you’ve probably already come up with some way to label or mark your taps so you know what tap is pouring what beverage.  I know there is &lt;em&gt;a lot&lt;/em&gt; of articles out there on this topic, but, I wanted to share my experience on the matter, and hopefully, it can save you some time, and money.&lt;/p&gt;

&lt;p&gt;As you can probably tell, I’m a bit of a tech nerd, so obviously I wanted digital signage.  I mean there is several options out there to do this manually.  Tap handles with black board surfaces you can write on with chalk, or even black board spray paint, you could paint on your kegerator or keezer.  Or maybe make some other type of labels that hang on the taps or whatever.  But I didn’t want anything like that, I wanted an actual taplist.  One of the main reasons this was even remotely cost feasible for me, is I had an extra 22” LCD monitor laying around.  If you have to buy a monitor to pull this off, then this walk through probably isn’t for you, but if not here is a list of things you’ll need:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B01L3IU6XS/ref=cm_sw_em_r_mt_dp_U_ThTcDbZMH9BZH&quot;&gt;Raspberry Pi Zero&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B0012Y2LLE/ref=cm_sw_r_tw_dp_U_x_pkTcDbVDX8D6S&quot;&gt;MicroSD Card (8GB minimum)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B00GF9T3I0/ref=cm_sw_r_tw_dp_U_x_ilTcDbRG7EJBP&quot;&gt;1.2A Minimum Power Supply (basically any old cell phone charger)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B01KRKO4MM/ref=cm_sw_r_tw_dp_U_x_LlTcDbCGQ2E0G&quot;&gt;HDMI Cable (mini HDMI to what ever interface is on the display)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B01HP636I4/ref=cm_sw_r_tw_dp_U_x_amTcDb197F49S&quot;&gt;Raspberry Pi Zero Case (optional, you could also 3D print this too)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first time I did this, I used a Raspberry Pi 3, which is probably over kill for hardware to make a taplist, especially when all we are going to do is display a web page.  A few months ago, I need a Raspberry Pi for another project, and when I looked to buy one, they are like $30, however, at the time, I found a Raspberry Pi Zero for $5 &lt;em&gt;(at the time of this writing it is ~$15)&lt;/em&gt;.  It doesn’t have near the hardware resources, but again, we are just going to be displaying a webpage.  &lt;em&gt;(Also, with taplist.io, you can use a kindle fire stick, I haven’t ever set it up with that, but I do know that there instructions on the product page on how to set one up.)&lt;/em&gt;  So, lets get started.&lt;/p&gt;

&lt;h2 id=&quot;taplistio&quot;&gt;taplist.io&lt;/h2&gt;
&lt;p&gt;The premise of this digital taplist, uses a free product (for personal use) called &lt;a href=&quot;https://taplist.io&quot;&gt;Taplist.io&lt;/a&gt;.  You will need to create an account, and from there, you can create taps, build your beverage database, create kegs, attach kegs to taps.  I’m not going to go into very much detail on this part because there is so many variables, and so much customization you can do with it.  what ever you customize under the “Look And Feel” section of your dashboard, is what will be displayed on the final product when you are finished.  The other nice part is you get an online taplist you can share with anyone (you can find mine at the bottom of this page, by clicking the “beer mug” icon).&lt;/p&gt;

&lt;h2 id=&quot;setting-up-the-raspberry-pi-zero&quot;&gt;Setting up the Raspberry Pi Zero&lt;/h2&gt;
&lt;p&gt;For the first part of this build, we need to install and configure the Raspberry Pi Zero, we will be installing the latest version of &lt;a href=&quot;https://www.raspbian.org&quot;&gt;Raspbian Stretch Lite&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Download the latest img for &lt;strong&gt;Raspbian Stretch Lite&lt;/strong&gt; &lt;a href=&quot;https://www.raspberrypi.org/downloads/raspbian/&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Open the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Disk Utility&lt;/code&gt; app:
    &lt;ul&gt;
      &lt;li&gt;Press &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CMD+SPACE&lt;/code&gt; to open the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Spotlight&lt;/code&gt; application.&lt;/li&gt;
      &lt;li&gt;In the search bar type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Disk Utility&lt;/code&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;In the top left had corner, select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;View&lt;/code&gt;, and be sure &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Show All Devices&lt;/code&gt; is selected.&lt;/li&gt;
  &lt;li&gt;Next, you will need to be sure the SD card is formated with the &lt;a href=&quot;https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system&quot;&gt;FAT&lt;/a&gt; file system.
    &lt;ul&gt;
      &lt;li&gt;Select the SD drive in the left pane.&lt;/li&gt;
      &lt;li&gt;Select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Erase&lt;/code&gt; from the top.&lt;/li&gt;
      &lt;li&gt;Make sure you pick &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FAT (MS-DOS)&lt;/code&gt; for the file system, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MBR (Master Boot Record)&lt;/code&gt; for the partition.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;THIS WILL ERASE THE ENTIRE SD CARD, SO BE SURE YOU HAVE SAVED ANYTHING YOU WANT TO EVER SEE AGAIN!&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Open a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;terminal&lt;/code&gt; using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Spotlight&lt;/code&gt; tool (see step 2) and type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Terminal&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;In the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;terminal&lt;/code&gt; application, find your disk number by running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;diskutil list&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Note your disk number, it will be in the format of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/dev/disk2&lt;/code&gt;, it may not actually be the number &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt;, just look at the size of the disk and make sure its the correct one.&lt;/li&gt;
  &lt;li&gt;Unmount the disk with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;diskutil unmountDisk /dev/disk2&lt;/code&gt;, again, replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt; with number of your SD card.&lt;/li&gt;
  &lt;li&gt;write the image to the SD Card with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dd&lt;/code&gt;:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo dd bs=1m if=Downloads/raspbian-stretch-lite.img of=/dev/rdisk4 conv=sync&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Downloads/raspbian-stretch-lite.img&lt;/code&gt; with the path to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.img&lt;/code&gt; file you downloaded in step 1.&lt;/li&gt;
      &lt;li&gt;Again, replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rdisk4&lt;/code&gt; with the disk number you found in step 7.&lt;/li&gt;
      &lt;li&gt;This may take some time, took my system about 10 minutes on an 8GB SD Card with a Thunderbolt SD Card Reader.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;configuring-raspbian-lite-stretch&quot;&gt;Configuring Raspbian Lite Stretch&lt;/h2&gt;
&lt;p&gt;After the img is done writing to the SD card, its time to being configuring Raspbian.  Because the Raspberry Pi Zero has such little hardware, we are going to try to keep this as minimal as possible.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;SSH is disabled by default, so to enable it, you need to create an empty file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh&lt;/code&gt;:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;touch /Volumes/boot/ssh&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Next, you need to append &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dtoverlay=dwc2&lt;/code&gt; to the end of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/Volumes/boot/config.txt&lt;/code&gt;.  You can do this either with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;textEdit&lt;/code&gt; or with a terminal editor.&lt;/li&gt;
  &lt;li&gt;This next step is a little tricky, first open &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/Volumes/boot/cmdline.txt&lt;/code&gt;, and located the text &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rootwait&lt;/code&gt;, immediately after that, add a space, and then this text: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;modules-load=dwc2,g_ether&lt;/code&gt;.  So it should look like this:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rootwait modules-load=dwc2,g_ether&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Now go ahead and eject the SD card and then load it into the Raspberry Pi Zero and plug in the power.  It will take about 60 seconds to boot up, then connect it to your computer.&lt;/li&gt;
  &lt;li&gt;Next, go to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;System Preferences &amp;gt; Network&lt;/code&gt; and you will see a new device called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RNDIS/Ethernet Gadget&lt;/code&gt;.  &lt;img src=&quot;/images/2019-04-26-taplist-pi-zero/network.png&quot; alt=&quot;Network&quot; /&gt;  This is the Raspberry Pi Zero, you can share your internet connection to it, which will then all you to SSH to the device.&lt;/li&gt;
  &lt;li&gt;Go to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;System Preferences &amp;gt; Sharing&lt;/code&gt; and enable internet sharing for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RNDIS/Ethernet Gadget&lt;/code&gt;. &lt;img src=&quot;/images/2019-04-26-taplist-pi-zero/sharing.png&quot; alt=&quot;Sharing&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;You should now beable to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh&lt;/code&gt; to the Raspberry Pi Zero:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh pi@raspberrypi.local&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Default password is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;raspberry&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;Type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yes&lt;/code&gt; to accept the certificate thumbprint.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;After you are connected, there are a few things that need to be set, run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;raspi-config&lt;/code&gt; and update the following:
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;CHANGE THE DEFAULT PASSWORD&lt;/strong&gt; else anyone can now &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh&lt;/code&gt; to your taplist board with the default credentials!&lt;/li&gt;
      &lt;li&gt;Under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Boot Options&lt;/code&gt; select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Desktop/CLI&lt;/code&gt; and then select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Console Autologin&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;Lastly configure the wifi.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;You are now connected to your wifi, and can update the system:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo apt-get update -y&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo apt-get upgrade -y&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo apt-get dist-upgrade -y&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Now, install the minimum X Server Environment for Chromium:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo apt-get install --no-install-recommends xserver-xorg x11-xserver-utils xinit openbox&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo apt-get install --no-install-recommends chromium-browser&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;You need to configure the auto start commands, and to do this, you will have to use a terminal based editor, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vi&lt;/code&gt;.  I prefer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano&lt;/code&gt;:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo nano /etc/xdg/openbox/autostart&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Replace the entire contents of the file with this:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Disable any form of screen saver / screen blanking / power management
xset s off
xset s noblank
xset -dpms

# Allow quitting the X server with CTRL-ATL-Backspace
setxkbmap -option terminate:ctrl_alt_bksp

# Start Chromium in kiosk mode
sed -i &apos;s/&quot;exited_cleanly&quot;:false/&quot;exited_cleanly&quot;:true/&apos; ~/.config/chromium/&apos;Local State&apos;
sed -i &apos;s/&quot;exited_cleanly&quot;:false/&quot;exited_cleanly&quot;:true/; s/&quot;exit_type&quot;:&quot;[^&quot;]\+&quot;/&quot;exit_type&quot;:&quot;Normal&quot;/&apos; ~/.config/chromium/Default/Preferences
chromium-browser --disable-infobars --kiosk &apos;https://www.taplist.io/display&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;You need to configure X Server to autostart and boot and load the display web page.
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano ~/.bash_profile&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Add this to the file: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[ -z $DISPLAY &amp;amp;&amp;amp; $XDG_VTNR -eq 1 ]] &amp;amp;&amp;amp; startx -- -nocursor&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Save and close the file.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Lastly shut you Raspberry Pi Zero down &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo shutdown now&lt;/code&gt; and go attach it to your monitor.  You do not need to attach any peripherals, on its next boot, it will autologin as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pi&lt;/code&gt; user, and start up &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Chromium&lt;/code&gt; and navigate to https://www.taplist.io/display.  The very first time this boots, there will be a code on the screen that you need to go to https://taplist.io/activate and enter in.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;WHEW!  Thats it, hopefully you made it this far, and ended up with something like this &lt;img src=&quot;/images/2019-04-26-taplist-pi-zero/taplist.jpg&quot; alt=&quot;Taplist&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;https://brandonb.ca/raspberry-pi-zero-w-headless-setup-on-macos&lt;/li&gt;
  &lt;li&gt;https://bdking71.wordpress.com/2018/11/06/setup-an-information-kiosk-using-a-raspberry-pi-zero-w/&lt;/li&gt;
  &lt;li&gt;https://taplist.io/help/raspberry-pi-setup&lt;/li&gt;
&lt;/ul&gt;
</description>
			<pubDate>Fri, 26 Apr 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/taplist-pi-zero/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/taplist-pi-zero/</guid>
		</item>
		
	
		
		<item>
			<title>Mixed Ferm NEIPA (First Attempt)</title>
			<description>&lt;p&gt;So, my thought process on this was pretty simple, I have been reading a bit on doing an all &lt;a href=&quot;http://www.milkthefunk.com/wiki/Brettanomyces&quot;&gt;Brettanomyces&lt;/a&gt; fermented &lt;a href=&quot;http://dev.bjcp.org/beer-styles/21b-specialty-ipa-new-england-ipa/&quot;&gt;NEIPA&lt;/a&gt;.  I started reading on &lt;a href=&quot;www.milkthefunk.com/wiki&quot;&gt;Milk The Funk&lt;/a&gt; about different strains of Brett.  The &lt;a href=&quot;http://www.milkthefunk.com/wiki/White_Labs&quot;&gt;Brett Claussenii&lt;/a&gt; strain from White Labs caught my eye.  Especially based on the flavor profile:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Fruity, pineapple. Wine grape-like aroma, with light wood-like, floral, and citrus aromas. More fruit forward in the flavor, clean aftertaste with little to no “funk”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Upon my initial research on &lt;em&gt;MTF&lt;/em&gt; there where a few bullet points that just made an all brett NEIPA sound perfect:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Light fruit characteristics.&lt;/li&gt;
  &lt;li&gt;A longer lasting hop aroma and flavor due to Brett’s ability to constantly metabolize micro-oxygenation.&lt;/li&gt;
  &lt;li&gt;Perceived bitterness may be quite a bit lower than the same wort fermented with a clean ale yeast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are all things, to me, that seem to lend perfect to a NEIPA.  So, I went about planing a brewday.  Was looking a for a pretty simple grain bill, and I went about a hop bill based on a recent NEIPA I had from &lt;a href=&quot;https://www.arvonbrewingco.com&quot;&gt;Arvon Brewing&lt;/a&gt;, called Jurassic Haze that was amazing.  Here is my &lt;a href=&quot;https://share.brewfather.app/WJYYaXb9ubyGwB&quot;&gt;Brewfather Recipe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I picked up some WLP 645 from my LHBS, made a starter, and based on some reading I did you want to let it spin for a bit longer then a regular starter on the stir plate.  I let it go for about 6 days, then crashed it for 2 days.&lt;/p&gt;

&lt;p&gt;On to brew day.  Long story short, brew day went perfect, hit all my numbers, pH and everything.  Let it cool to about 75F, as the temp range of the brett was 70F-85F.  I pitched the brett, set my BrewPiLess to raise the temp from 75F to 85F over 14 days and then I started the waiting game.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Brewday Whirlpool:&lt;/em&gt;
&lt;img src=&quot;/images/2019-04-17-mixed-ferm-neipa-first-attempt/whirlpool.jpg&quot; alt=&quot;Whirlpool&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now this beer was a little pricey, the 6 gallons of wort was probably about 70-ish dollars, so I was watching pretty close to make sure fermentation took off, especially being a completely new yeast method to me.  Anyway, after day 1, nothing.  After day 2, nothing.  No krausen, no CO2, nothing.  Im starting to get worried.  Well, I went back to MTF and did a bit more reading, guess what, brett C, does &lt;em&gt;NOT&lt;/em&gt; attenuate wort well when pitched solo, like, it only attenuates 20%!  Long story short, if your WLP645 fully attenuates, its contaminated with sacc, see &lt;a href=&quot;http://brettanomycesproject.com/dissertation/pure-culture-fermentation/impact-of-pitching-rate/&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DAMNIT!  FML!&lt;/p&gt;

&lt;p&gt;So, being, the person I am, I panicked, not knowing what else to do, I decided to pitch some sacc yeast.  I mean what else could I do?  I really didn’t want the wort to get infected and waste all of it.  So, I called my LHBS, They had some Omega Labs Tropical Ale yeast &lt;a href=&quot;https://omegayeast.com/yeast/ales/tropical-ipa&quot;&gt;OYL-200&lt;/a&gt;.  This is a great yeast, it was actually formally classified as a brett.  Its great for both IPAs and NEIPAs, and well, its &lt;em&gt;brett-ish&lt;/em&gt;.  And it has a temp range of 70F-85F, perfection!  So I pitched that in at about 52ish hours post brett C. pitch.&lt;/p&gt;

&lt;p&gt;Within 12 hours, thing was bubbling like a tommy gun, I’m sure it helped it was at about 77F by this time.  Now, I also decided to make another small change this batch, no biotransform hops.  Now, incase you are not aware, at the start of the NEIPA craze, it was common practice to pitch dry hops at the peak of fermentation, about 24-72 hour in.  Well, this has since been “proven” wrong and wasteful of hops as all the aroma is taken out with the CO2.  So I decided to pass on this step, instead trying to dry hop closer to packaging.  Well, this damn thing bubbled for almost 2.5 weeks, and dropped to 1.005 on my first hydrometer reading, then I waited another 4 days, and it was at 1.004 (which I’m calling terminal gravity), so I added 3.5oz of hops, let it sit another three days, kegged, crashed and carbed.  The finished product is very good, to be honest, a little wierd, but a one of a kind.  lots of pineapple, honestly a lot of funk from the brett, very fruity, surprisingly full bodied, and over all, a very solid drinker!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-04-17-mixed-ferm-neipa-first-attempt/beer.jpg&quot; alt=&quot;Beer&quot; /&gt;&lt;/p&gt;
</description>
			<pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate>
			<link>https://tomohulk.github.io/mixed-ferm-neipa-first-attempt/</link>
			<guid isPermaLink="true">https://tomohulk.github.io/mixed-ferm-neipa-first-attempt/</guid>
		</item>
		
	
	
		
			
			<item>
				<title>Tag: 3dprinting</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/3dprinting/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/3dprinting/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>404 - Page not found</title>
				<description>&lt;p&gt;Sorry, we can’t find that page that you’re looking for. You can try again by going &lt;a href=&quot;/&quot;&gt;back to the homepage&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/&quot;&gt;&lt;img src=&quot;/images/404.jpg&quot; alt=&quot;Constructocat by https://github.com/jasoncostello&quot; style=&quot;width: 400px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/404.html</link>
				<guid isPermaLink="true">https://tomohulk.github.io/404.html</guid>
			</item>
			
		
	
		
			
			<item>
				<title>About</title>
				<description>&lt;p&gt;About me hmmm; where to start… well, I like beer.  I like to make beer, I like to drink beer.  I also like to talk about beer, and making beer.&lt;/p&gt;

&lt;p&gt;Do you need anything more then that?  Well if so, you can keep reading…  Beyond beer, I am a Husband and Father.  I have been in the tech game for the better part of a decade.  I work primarily with Microsoft Hyper-V, the Systems Center Suite, and a lot of PowerShell.  I have several published PowerShell Modules, Scripts and Functions, you can find them on the &lt;a href=&quot;https://powershellgallery.com&quot;&gt;PowerShell Gallery&lt;/a&gt; published under the username &lt;a href=&quot;https://dotps1.github.io&quot;&gt;@dotps1&lt;/a&gt;. &lt;em&gt;I have decided to abandon the dotps1 handle.  Why?  Doesn’t matter and I don’t have much more to say on that at this time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Outside of &lt;em&gt;who&lt;/em&gt; I am, I have a few hobbies; Homebrewing (obviously), 3D Printing, Mountain Biking, and Disc Golf.  Although, to be honest, with my family and a full time career, I don’t do half of those as much as I’d like, and don’t do the other half as much as a should.&lt;/p&gt;

&lt;p&gt;I homebrew mostly on the free time I get, most brewdays are time consuming so it tends to be an entire Saturday.  But, the one thing homebrewing has really opened up for me is DIY projects.  Things like temperature controllers.  Which got me into 3D printing so I was able to make parts at home.  Which got me into 3D design, So now I’m making parts that never existed before, improving on a base model, or adding features.&lt;/p&gt;

&lt;p&gt;I love to pedal, and its one of the few things I do to somewhat be active.  I pedal single track and on the road.  Although, less on the road these days because peoples eyes are on their screens and not road in front of them.  If I just lived somewhere a bit warmer, I could do it all year.  But until then, Ill just keep cultivating mass in the winter months.&lt;/p&gt;

&lt;p&gt;As far as Disc Golf goes, been doing it my whole life, just need the clock to open up some time for me to do it again.&lt;/p&gt;

&lt;p&gt;What you can you plan on finding here?&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Lots of brew day experiences, most of the time, something goes wrong.  Sometimes worse then others, which should lead to some interesting &lt;em&gt;homebrewed&lt;/em&gt; tales.&lt;/li&gt;
  &lt;li&gt;Probably some of the most obscure tech experiences that you’ll ever find, with fixes that neither you, or anyone you’ll ever meet will ever need, ever.&lt;/li&gt;
  &lt;li&gt;My &lt;em&gt;what I’d do different if i did it again&lt;/em&gt; on DIY projects, from a fully functional &lt;a href=&quot;https://github.com/vitotai/BrewPiLess&quot;&gt;BrewPiLess&lt;/a&gt;, to a prop Iron Man Reactor and stand (The stand I had to design from scratch and it turned out quite well.)&lt;/li&gt;
  &lt;li&gt;And maybe after enough beers, some really stupid rants on things like religion, god, death, politics, social culture, and possibly even some bullshit about movies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still here, impressive; this has probably been the worst &lt;em&gt;About&lt;/em&gt; page you’ve ever read, (if you’ve even made this far).  Bottom line is I’m just another lost soul doing things I somewhat enjoy to make time have some meaning.  I’m overly eccentric, I over think absolutely everything, I always assume the worst, but, sometimes, just sometimes, amongst all my self induced anxiety, I get to laugh a bit too, so cheers!&lt;/p&gt;
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/about/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/about/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: diy</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/diy/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/diy/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: dsc</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/dsc/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/dsc/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: homebrewing</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/homebrewing/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/homebrewing/</guid>
			</item>
			
		
	
		
			
			<item>
				<title></title>
				<description>&lt;div class=&quot;posts&quot;&gt;
  
    &lt;article class=&quot;post&quot;&gt;

      &lt;h1&gt;&lt;a href=&quot;/convertfrom-applockerpolicyxml/&quot;&gt;ConvertFrom-AppLockerPolicyXml&lt;/a&gt;&lt;/h1&gt;

      &lt;div class=&quot;entry&quot;&gt;
        &lt;i&gt;Convert the terrible output from Get-AppLockerPolicy to something worth a damn.&lt;/i&gt;
        &lt;p&gt;Hey-Oh!  Its been a while!  Even though I’ve been locked at home for the past year, I haven’t published any new content in forever.  Well, life has been pretty boring so I haven’t come across much worth sharing, and I’m also lazy.  But I do have something today finally worth blerg’n about.  So anyway, away we go!&lt;/p&gt;


      &lt;/div&gt;

      &lt;a href=&quot;/convertfrom-applockerpolicyxml/&quot; class=&quot;read-more&quot;&gt;Read More&lt;/a&gt;
    &lt;/article&gt;
  
    &lt;article class=&quot;post&quot;&gt;

      &lt;h1&gt;&lt;a href=&quot;/motorizing-your-grain-mill/&quot;&gt;Motorizing Your Grain Mill&lt;/a&gt;&lt;/h1&gt;

      &lt;div class=&quot;entry&quot;&gt;
        &lt;i&gt;How to turn your hand powered grain mill into a motorized one.&lt;/i&gt;
        &lt;p&gt;If you are like me, and most others I know who crush their own grain, you set up is pretty simple, a mill, and either you are hand cranking it, which sounds terrible, or you hooking your drill to it, and powering it that way.  I personally am the latter, I hook my battery powered DeWalt drill to the mill and try to hold the speed slow and steady.  This is a PITA for two reasons.  First, I can never hold the speed the same for the entire crush, especially if its a rather large grain bill, and, this may not be true, but I feel like it cannot be great for my drill to run it with the trigger barely pressed for 15 minutes.  And second, I cannot multitask when im grinding.  I have to just sit there and hold the drill with one hand and add additional grains to the hopper with the other.  I feel like its just a huge waste of time.  I have seen setups where people mount a drill and set the speed buy using a zip tie to get the trigger just right.  This wasn’t going to work for me because I don’t have a spare drill laying around I can donate to something like this, as it would have no other use.  And if I’m going to buy a drill for this purpose, then I might as well just buy a motor to power this thing.  And thats what I did.&lt;/p&gt;


      &lt;/div&gt;

      &lt;a href=&quot;/motorizing-your-grain-mill/&quot; class=&quot;read-more&quot;&gt;Read More&lt;/a&gt;
    &lt;/article&gt;
  
    &lt;article class=&quot;post&quot;&gt;

      &lt;h1&gt;&lt;a href=&quot;/nobody-got-time-for-that/&quot;&gt;Nobody Got Time For That&lt;/a&gt;&lt;/h1&gt;

      &lt;div class=&quot;entry&quot;&gt;
        &lt;i&gt;45 minute mash, no boil, Kveik HaziBoi, grain to glass in 5 days.&lt;/i&gt;
        &lt;p&gt;I have been tinkering with NEIPAs for a while now, in theory, they shouldn’t be &lt;em&gt;too&lt;/em&gt; hard to make, and to get an OK one, they really aren’t.  But I wanted something better then just OK.  After about 10 attempts and lots of trial and error and even more picking the brains of the Homebrewing Slack team (Bender, if you’re reading this, this is your shout out), I think I have finally done it, I mean just absolutely nailed it!  I personally think it all really came down to the water, but also, the now more readily available Kveik yeasts out there helped me as well.  Especially &lt;a href=&quot;https://omegayeast.com/yeast/norwegian-ales/voss-kveik&quot;&gt;Omega Voss&lt;/a&gt;, allowing to ferment at 90F+ you can turn beers around in 5-7 days.  And they are some of the best NEIPAs I’ve ever had, second to maybe &lt;a href=&quot;https://www.arvonbrewingco.com&quot;&gt;Arvon Brewing&lt;/a&gt;.  Anyway, I wanted to share my findings and what seems to really be working for me.  The best part is that the grain and water pretty much always stay the same, and you can just tinker with hops.&lt;/p&gt;


      &lt;/div&gt;

      &lt;a href=&quot;/nobody-got-time-for-that/&quot; class=&quot;read-more&quot;&gt;Read More&lt;/a&gt;
    &lt;/article&gt;
  

  &lt;!-- Pager --&gt;
  &lt;div class=&quot;pager&quot;&gt;
  
    
    
        &lt;a href=&quot;/page2&quot;&gt;Older Posts&lt;/a&gt;
    
  
  &lt;/div&gt;
&lt;/div&gt;
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: keezer</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/keezer/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/keezer/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: klipper</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/klipper/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/klipper/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: powershell</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/powershell/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/powershell/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: raspberrypi</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/raspberrypi/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/raspberrypi/</guid>
			</item>
			
		
	
		
			
			<item>
				<title></title>
				<description>[
  
    {
    
      &quot;title&quot;    : &quot;ConvertFrom-AppLockerPolicyXml&quot;,
      &quot;url&quot;      : &quot;/convertfrom-applockerpolicyxml/&quot;,
      &quot;category&quot; : &quot;powershell&quot;,
      &quot;tags&quot;     : &quot;powershell, windows&quot;,
      &quot;date&quot;     : &quot;2021-03-02 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;Convert the terrible output from Get-AppLockerPolicy to something worth a damn.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;Motorizing Your Grain Mill&quot;,
      &quot;url&quot;      : &quot;/motorizing-your-grain-mill/&quot;,
      &quot;category&quot; : &quot;homebrewing&quot;,
      &quot;tags&quot;     : &quot;homebrewing, diy&quot;,
      &quot;date&quot;     : &quot;2019-08-21 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;How to turn your hand powered grain mill into a motorized one.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;Nobody Got Time For That&quot;,
      &quot;url&quot;      : &quot;/nobody-got-time-for-that/&quot;,
      &quot;category&quot; : &quot;homebrewing&quot;,
      &quot;tags&quot;     : &quot;homebrewing&quot;,
      &quot;date&quot;     : &quot;2019-08-14 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;45 minute mash, no boil, Kveik HaziBoi, grain to glass in 5 days.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;Replace Failed Storage Pool HDD&quot;,
      &quot;url&quot;      : &quot;/replacing-failed-storage-pool-hdd/&quot;,
      &quot;category&quot; : &quot;powershell&quot;,
      &quot;tags&quot;     : &quot;powershell, windows, server&quot;,
      &quot;date&quot;     : &quot;2019-08-05 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;Replacing a failed hard disk drive in Windows Server Storage Spaces Storage Pool.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;Installing PKI SSL Certificate on HPE iLO&quot;,
      &quot;url&quot;      : &quot;/installing-pki-ssl-certificate-on-hpe-ilo/&quot;,
      &quot;category&quot; : &quot;powershell&quot;,
      &quot;tags&quot;     : &quot;powershell&quot;,
      &quot;date&quot;     : &quot;2019-07-25 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;Automating the process of creating a CSR and signing it with an Internal CA and installing it using PowerShell.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;Using BLTouch with Klipper and the Ender3&quot;,
      &quot;url&quot;      : &quot;/using-bltouch-with-klipper-and-the-ender3/&quot;,
      &quot;category&quot; : &quot;3dprinting&quot;,
      &quot;tags&quot;     : &quot;3dprinting, klipper&quot;,
      &quot;date&quot;     : &quot;2019-06-04 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;How to make your BLTouch Sensor work with the Klipper firmware and the Crealty Ender3.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;Klean Yer Keezer Lines&quot;,
      &quot;url&quot;      : &quot;/klean-yer-keezer-lines/&quot;,
      &quot;category&quot; : &quot;homebrewing&quot;,
      &quot;tags&quot;     : &quot;keezer, diy, 3dprinting&quot;,
      &quot;date&quot;     : &quot;2019-05-09 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;How to easily clean and rinse your keezer beverage lines.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;CIP DIY Keg Washer&quot;,
      &quot;url&quot;      : &quot;/cip-diy-keg-washer/&quot;,
      &quot;category&quot; : &quot;homebrewing&quot;,
      &quot;tags&quot;     : &quot;keezer, diy&quot;,
      &quot;date&quot;     : &quot;2019-05-07 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;Clean your kegs, the easy way.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;PiLess BrewPi&quot;,
      &quot;url&quot;      : &quot;/piless-brewpi/&quot;,
      &quot;category&quot; : &quot;homebrewing&quot;,
      &quot;tags&quot;     : &quot;homebrewing, raspberrypi, 3dprinting&quot;,
      &quot;date&quot;     : &quot;2019-05-01 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;Building a BrewPi without a Raspberry Pi using the BrewPiLess implementation.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;Taplist Pi Zero&quot;,
      &quot;url&quot;      : &quot;/taplist-pi-zero/&quot;,
      &quot;category&quot; : &quot;homebrewing&quot;,
      &quot;tags&quot;     : &quot;homebrewing, raspberrypi, keezer&quot;,
      &quot;date&quot;     : &quot;2019-04-26 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;A walk through for creating a digital taplist with Taplist.io and Raspberry Pi Zero.&quot;
      
    } ,
  
    {
    
      &quot;title&quot;    : &quot;Mixed Ferm NEIPA (First Attempt)&quot;,
      &quot;url&quot;      : &quot;/mixed-ferm-neipa-first-attempt/&quot;,
      &quot;category&quot; : &quot;homebrewing&quot;,
      &quot;tags&quot;     : &quot;homebrewing&quot;,
      &quot;date&quot;     : &quot;2019-04-17 00:00:00 +0000&quot;,
      &quot;description&quot; : &quot;An overview of creating a mixed fermentation NEIPA.&quot;
      
    } 
  
]
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/search.json</link>
				<guid isPermaLink="true">https://tomohulk.github.io/search.json</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Search</title>
				<description>&lt;!-- Html Elements for Search --&gt;
&lt;div id=&quot;search-container&quot;&gt;
&lt;i class=&quot;fas fa-search&quot;&gt;&lt;/i&gt;&lt;input type=&quot;text&quot; id=&quot;search-input&quot; placeholder=&quot;search posts...&quot; style=&quot;width: 96%;&quot; /&gt;
&lt;ul id=&quot;results-container&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;

&lt;!-- Script pointing to search-script.js --&gt;
&lt;script src=&quot;/assets/search.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;

&lt;!-- Configuration --&gt;
&lt;script&gt;
SimpleJekyllSearch({
  searchInput: document.getElementById(&apos;search-input&apos;),
  resultsContainer: document.getElementById(&apos;results-container&apos;),
  json: &apos;/search.json&apos;
})
&lt;/script&gt;

&lt;hr /&gt;

&lt;h3&gt;Tags&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/homebrewing&quot;&gt;homebrewing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/powershell&quot;&gt;powershell&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/keezer&quot;&gt;keezer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/diy&quot;&gt;diy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/3dprinting&quot;&gt;3dprinting&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/windows&quot;&gt;windows&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/raspberrypi&quot;&gt;raspberrypi&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/server&quot;&gt;server&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/tag/klipper&quot;&gt;klipper&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/search/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/search/</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: server</title>
				<description>
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/server/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/server/</guid>
			</item>
			
		
	
		
			
		
	
		
			
			<item>
				<title></title>
				<description>//
// IMPORTS
//

@import &quot;reset&quot;;
@import &quot;variables&quot;;
// Syntax highlighting @import is at the bottom of this file

/**************/
/* BASE RULES */
/**************/

html {
  font-size: 100%;
}

body {
	background: $black;
  font: 18px/1.4 $helvetica;
  color: $lightGray;
}

.container {
  margin: 0 auto;
  max-width: 740px;
  padding: 0 10px;
  width: 100%;
}

h1, h2, h3, h4, h5, h6 {
  font-family: $helveticaNeue;
  color: $lighterGray;
  font-weight: bold;

  line-height: 1.7;
  margin: 1em 0 15px;
  padding: 0;

  @include mobile {
    line-height: 1.4;
  }
}

h1 {
  font-size: 30px;
  a {
    color: inherit;
  }
}

h2 {
  font-size: 24px;
}

h3 {
  font-size: 20px;
}

h4 {
  font-size: 18px;
  color: $gray;
}

p {
  margin: 15px 0;
}

a {
  color: $blue;
  text-decoration: none;
	cursor: pointer;
  &amp;:hover, &amp;:active {
    color: $blue;
  }
}

ul, ol {
  margin: 15px 0;
  padding-left: 30px;
}

ul {
  list-style-type: disc;
}

ol {
  list-style-type: decimal;
}

ol ul, ul ol, ul ul, ol ol {
  margin: 0;
}

ul ul, ol ul {
  list-style-type: circle;
}

em, i {
  font-style: italic;
}

strong, b {
  font-weight: bold;
}

img {
  max-width: 100%;
}

// Fixes images in popup boxes from Google Translate
.gmnoprint img {
  max-width: none;
}

.date {
  font-style: italic;
  color: $gray;
}

// Specify the color of the selection
::-moz-selection {
  color: $blue;
  background: $darkGray;
}
::selection {
  color: $blue;
  background: $darkGray;
}

// Nicolas Gallagher&apos;s micro clearfix hack
// http://nicolasgallagher.com/micro-clearfix-hack/
.clearfix:before,
.clearfix:after {
    content: &quot; &quot;;
    display: table;
}

.clearfix:after {
    clear: both;
}

/*********************/
/* LAYOUT / SECTIONS */
/*********************/

//
// .masthead
//

.wrapper-masthead {
  margin-bottom: 50px;
}

.masthead {
  padding: 20px 0;
  border-bottom: 1px solid $darkGray;

  @include mobile {
    text-align: center;
  }
}

.site-avatar {
  float: left;
  width: 70px;
  height: 70px;
  margin-right: 15px;

  @include mobile {
    float: none;
    display: block;
    margin: 0 auto;
  }

  img {
    border-radius: 5px;
  }
}

.site-info {
  float: left;

  @include mobile {
    float: none;
    display: block;
    margin: 0 auto;
  }
}

.site-name {
  margin: 0;
  color: $lightGray;
  cursor: pointer;
  font-family: $helveticaNeue;
  font-weight: 300;
  font-size: 28px;
  letter-spacing: 1px;
}

.site-description {
  margin: -5px 0 0 0;
  color: $gray;
  font-size: 16px;

  @include mobile {
    margin: 3px 0;
  }
}

nav {
  float: right;
  margin-top: 23px; // @TODO: Vertically middle align
  font-family: $helveticaNeue;
  font-size: 18px;

  @include mobile {
    float: none;
    margin-top: 9px;
    display: block;
    font-size: 16px;
  }

  a {
    margin-left: 20px;
    color: $lightGray;
    text-align: right;
    font-weight: 300;
    letter-spacing: 1px;

    @include mobile {
      margin: 0 10px;
      color: $blue;
    }
  }
}

//
// .main
//

#main {
  margin-bottom: 6rem;
}

.posts &gt; .post {
  padding-bottom: 2em;
  border-bottom: 1px solid $darkGray;
}

.posts &gt; .post:last-child {
  padding-bottom: 1em;
  border-bottom: none;
}

.post {
  blockquote {
    margin: 1.8em .8em;
    border-left: 2px solid $gray;
    padding: 0.1em 1em;
    color: $gray;
    font-size: 22px;
    font-style: italic;
  }

  .comments {
    margin-top: 10px;
  }

  .read-more {
    text-transform: uppercase;
    font-size: 15px;
  }
}

.wrapper-footer {
  position: fixed;
  bottom: 0;
  width: 100%;
  margin-top: 50px;
  border-top: 1px solid #ddd;
  border-bottom: 1px solid #ddd;
  background-color: $darkGray;
}

footer {
  padding: 10px 0;
  text-align: center;
}

.fab, .fas {
  color:$blue !important;
  padding: 5px;
}

.pager {
  text-align: center;
}


// Settled on moving the import of syntax highlighting to the bottom of the CSS
// ... Otherwise it really bloats up the top of the CSS file and makes it difficult to find the start
@import &quot;highlights&quot;;
@import &quot;gists&quot;;
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/style.css</link>
				<guid isPermaLink="true">https://tomohulk.github.io/style.css</guid>
			</item>
			
		
	
		
			
			<item>
				<title>Tag: windows</title>
				<description></description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/tag/windows/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/tag/windows/</guid>
			</item>
			
		
	
		
			
			<item>
				<title></title>
				<description>@import &quot;jekyll-theme-primer&quot;;
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/assets/css/style.css</link>
				<guid isPermaLink="true">https://tomohulk.github.io/assets/css/style.css</guid>
			</item>
			
		
	
		
			
			<item>
				<title></title>
				<description>Sitemap: {{ &quot;sitemap.xml&quot; | absolute_url }}
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/robots.txt</link>
				<guid isPermaLink="true">https://tomohulk.github.io/robots.txt</guid>
			</item>
			
		
	
		
			
		
	
		
			
			<item>
				<title></title>
				<description>&lt;div class=&quot;posts&quot;&gt;
  {% for post in paginator.posts %}
    &lt;article class=&quot;post&quot;&gt;

      &lt;h1&gt;&lt;a href=&quot;{{ post.url | prepend: site.baseurl }}&quot;&gt;{{ post.title }}&lt;/a&gt;&lt;/h1&gt;

      &lt;div class=&quot;entry&quot;&gt;
        &lt;i&gt;{{ post.description }}&lt;/i&gt;
        {{ post.excerpt }}
      &lt;/div&gt;

      &lt;a href=&quot;{{ site.baseurl }}{{ post.url }}&quot; class=&quot;read-more&quot;&gt;Read More&lt;/a&gt;
    &lt;/article&gt;
  {% endfor %}

  &lt;!-- Pager --&gt;
  &lt;div class=&quot;pager&quot;&gt;
  {% if paginator.total_pages &gt; 1 %}
    {% if paginator.previous_page %}
        &lt;a href=&quot;{{ paginator.previous_page_path | prepend: site.baseurl | replace: &apos;//&apos;, &apos;/&apos; }}&quot;&gt;Newer Posts&lt;/a&gt;
        {% if paginator.next_page %}
          | 
        {% endif %}
    {% endif %}
    {% if paginator.next_page %}
        &lt;a href=&quot;{{ paginator.next_page_path | prepend: site.baseurl | replace: &apos;//&apos;, &apos;/&apos; }}&quot;&gt;Older Posts&lt;/a&gt;
    {% endif %}
  {% endif %}
  &lt;/div&gt;
&lt;/div&gt;
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/page2/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/page2/</guid>
			</item>
			
		
	
		
			
			<item>
				<title></title>
				<description>&lt;div class=&quot;posts&quot;&gt;
  {% for post in paginator.posts %}
    &lt;article class=&quot;post&quot;&gt;

      &lt;h1&gt;&lt;a href=&quot;{{ post.url | prepend: site.baseurl }}&quot;&gt;{{ post.title }}&lt;/a&gt;&lt;/h1&gt;

      &lt;div class=&quot;entry&quot;&gt;
        &lt;i&gt;{{ post.description }}&lt;/i&gt;
        {{ post.excerpt }}
      &lt;/div&gt;

      &lt;a href=&quot;{{ site.baseurl }}{{ post.url }}&quot; class=&quot;read-more&quot;&gt;Read More&lt;/a&gt;
    &lt;/article&gt;
  {% endfor %}

  &lt;!-- Pager --&gt;
  &lt;div class=&quot;pager&quot;&gt;
  {% if paginator.total_pages &gt; 1 %}
    {% if paginator.previous_page %}
        &lt;a href=&quot;{{ paginator.previous_page_path | prepend: site.baseurl | replace: &apos;//&apos;, &apos;/&apos; }}&quot;&gt;Newer Posts&lt;/a&gt;
        {% if paginator.next_page %}
          | 
        {% endif %}
    {% endif %}
    {% if paginator.next_page %}
        &lt;a href=&quot;{{ paginator.next_page_path | prepend: site.baseurl | replace: &apos;//&apos;, &apos;/&apos; }}&quot;&gt;Older Posts&lt;/a&gt;
    {% endif %}
  {% endif %}
  &lt;/div&gt;
&lt;/div&gt;
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/page3/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/page3/</guid>
			</item>
			
		
	
		
			
			<item>
				<title></title>
				<description>&lt;div class=&quot;posts&quot;&gt;
  {% for post in paginator.posts %}
    &lt;article class=&quot;post&quot;&gt;

      &lt;h1&gt;&lt;a href=&quot;{{ post.url | prepend: site.baseurl }}&quot;&gt;{{ post.title }}&lt;/a&gt;&lt;/h1&gt;

      &lt;div class=&quot;entry&quot;&gt;
        &lt;i&gt;{{ post.description }}&lt;/i&gt;
        {{ post.excerpt }}
      &lt;/div&gt;

      &lt;a href=&quot;{{ site.baseurl }}{{ post.url }}&quot; class=&quot;read-more&quot;&gt;Read More&lt;/a&gt;
    &lt;/article&gt;
  {% endfor %}

  &lt;!-- Pager --&gt;
  &lt;div class=&quot;pager&quot;&gt;
  {% if paginator.total_pages &gt; 1 %}
    {% if paginator.previous_page %}
        &lt;a href=&quot;{{ paginator.previous_page_path | prepend: site.baseurl | replace: &apos;//&apos;, &apos;/&apos; }}&quot;&gt;Newer Posts&lt;/a&gt;
        {% if paginator.next_page %}
          | 
        {% endif %}
    {% endif %}
    {% if paginator.next_page %}
        &lt;a href=&quot;{{ paginator.next_page_path | prepend: site.baseurl | replace: &apos;//&apos;, &apos;/&apos; }}&quot;&gt;Older Posts&lt;/a&gt;
    {% endif %}
  {% endif %}
  &lt;/div&gt;
&lt;/div&gt;
</description>
				<pubDate></pubDate>
				<link>https://tomohulk.github.io/page4/</link>
				<guid isPermaLink="true">https://tomohulk.github.io/page4/</guid>
			</item>
			
		
	
</channel>
</rss>
