<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Nathan Labadie]]></title><description><![CDATA[Startups, Technology, and Information Security]]></description><link>https://nathanlabadie.com/</link><image><url>https://nathanlabadie.com/favicon.png</url><title>Nathan Labadie</title><link>https://nathanlabadie.com/</link></image><generator>Ghost 5.68</generator><lastBuildDate>Mon, 06 Apr 2026 21:06:41 GMT</lastBuildDate><atom:link href="https://nathanlabadie.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Brothers DCPL2550DW and Deep Sleep]]></title><description><![CDATA[Losing a connection to your Brothers DCPL2550DW due to the deep sleep function? Here's the quick fix.]]></description><link>https://nathanlabadie.com/brothers-dcpl2550dw/</link><guid isPermaLink="false">612bba9c6c29d60419b1cd23</guid><category><![CDATA[printers]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Sun, 29 Aug 2021 17:08:09 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/08/unnamed.png" medium="image"/><content:encoded><![CDATA[<h2 id="quick-summary">Quick Summary</h2><img src="https://nathanlabadie.com/content/images/2021/08/unnamed.png" alt="Brothers DCPL2550DW and Deep Sleep"><p>You&apos;ve got a fancy new <a href="https://www.amazon.com/Brother-Monochrome-Multifunction-DCPL2550DW-Replenishment/dp/B0764P8F5J?ref=nathanlabadie.com">Brothers DCPL2550DW</a> printer for the office. It connects to wireless just fine, you&apos;re able to add it to Windows, you&apos;re able to print from your iPhone via AirPrint, and... it just stops responding. You walk over, reset the printer, everything is great again, and... it stops responding again. I went through all types of wireless and mDNS troubleshooting before finding the answer.</p><h2 id="meet-deep-sleep">Meet Deep Sleep</h2><p>Here&apos;s the thing: I swear this used to work just fine. I&apos;m guessing these issues are related to a firmware update that was applied a few months back. Unfortunately, the deep sleep function is a bit <em>too</em> aggressive since a wireless connection to the printer doesn&apos;t wake it back up. Here&apos;s how you disable deep sleep:</p><ol><li>Click the <code>Menu</code> button.</li><li>Click the <code>OK</code> &#xA0;button while on <code>1. General Setup</code> which should be the first option.</li><li>Click the <code>Down/Minus</code> button once to get to <code>2. Ecology</code> and click the <code>OK</code> button.</li><li>Click the <code>Down/Minus</code> button twice to get to <code>3. Sleep Time</code> and click the <code>OK</code> button. It&apos;ll say <code>1 Minues</code> by default.</li><li>Click the <code>Down/Minus</code> button <em>at the same time</em> as the <code>Stop/Exit</code> button. It will now display <code>Deep Sleep</code> on the LCD.</li><li>Change it to <code>Off</code> and click <code>OK</code>.</li><li>Unplug the printer and plug it back in.</li></ol><p>At that point you should be good to go. I have no idea how this was missed by Brothers QA since it&apos;s a pain to deal with. </p>]]></content:encoded></item><item><title><![CDATA[Blue Iris, DeepStack, and Docker]]></title><description><![CDATA[Blue Iris will detect generic motion, pass it to DeepStack for further analysis, and DeepStack will let you know if there's an actual person, bike, vehicle, etc in the video that's being analyzed. Each Blue Iris camera has configurable settings around the types of DeepStack detection too. ]]></description><link>https://nathanlabadie.com/blue-iris-and-deep/</link><guid isPermaLink="false">60e7a7b1c5e1b321c0795ee5</guid><category><![CDATA[deepstack]]></category><category><![CDATA[docker]]></category><category><![CDATA[blueiris]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Fri, 09 Jul 2021 02:54:57 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/07/tree.png" medium="image"/><content:encoded><![CDATA[<h2 id="summary">Summary</h2><img src="https://nathanlabadie.com/content/images/2021/07/tree.png" alt="Blue Iris, DeepStack, and Docker"><p>I&apos;m a fan of <a href="https://blueirissoftware.com/?ref=nathanlabadie.com">Blue Iris</a> for security camera recording. It&apos;s relatively easy to configure, supports a ton of cameras, and constantly adds new features. However, the downside is that it&apos;s robust motion detection is just that:<em> motion detection</em>. You&apos;ll get alerts on shadows, trees moving, cars driving, by etc. Me? I just want to get alerted on certain objects like people, cars, and the occasional bicycle. I don&apos;t care about the generic motion alerts. </p><p>Enter <a href="https://dev.deepstack.cc/?ref=nathanlabadie.com">DeepStack</a> for object-based detection, which has recently been incorporated into Blue Iris. Blue Iris will detect generic motion, pass it to DeepStack for further analysis, and DeepStack will let you know if there&apos;s an actual person, bike, vehicle, etc in the video capture that&apos;s being analyzed. Each Blue Iris camera has configurable settings around the types of DeepStack detection too. </p><p>Now, there is a version of DeepStack that <a href="https://docs.deepstack.cc/windows/?ref=nathanlabadie.com">runs on Windows</a>. You could technically have Blue Iris side-by-side with DeepStack on the Windows server <em>if </em>you&apos;ve got enough horsepower for both. Unfortunately I don&apos;t. Instead, I&apos;m going to be running DeepStack on my <a href="https://nathanlabadie.com/arch-linux-docker-and-nvidia/">Arch Linux Docker server</a> that has some free resources.</p><p>This guide will walk you through the configuration steps.</p><h2 id="configuring-deepstack-in-docker">Configuring DeepStack in Docker</h2><p>Keep in mind that I&apos;m assuming that you already have a server running <a href="https://www.docker.com/?ref=nathanlabadie.com">Docker</a>. This Docker server is where we&apos;ll be running the DeepStack container. You&apos;ll need two components, <code>docker</code> and <code>docker-compose</code>, to get this deployed. The first step is to create a &quot;home directory&quot; where DeepStack will like: one for the <code>docker-compose.yml</code> file, the other for the DeepStack storage directory. </p><p>Create the initial directories:</p><pre><code class="language-plaintext">sudo mkdir -p /opt/dockerfiles/deepstack/
sudo mkdir -p /opt/deepstack/</code></pre><p>Create the initial <code>.env</code> file for docker-compose:</p><pre><code class="language-plaintext">sudo vi /opt/dockerfiles/deepstack/.env

# Add the following to the file. Customize as needed.
# Your timezone, https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TZ=America/Detroit
PUID=1000
PGID=1000
# The directory where data and configuration will be stored.
ROOT=/opt</code></pre><p>Next create the <code>docker-compose.yml</code> file that you&apos;ll need. Please note that you can customize the port<code>15000</code> for where you&apos;ll connect from Blue Iris. For example, if your Docker server is <code>docker.env.internal</code>, then your DeepStack server would reside at <code>http://docker.env.internal:15000</code>. </p><pre><code class="language-plaintext">vi /opt/dockerfiles/deepstack/docker-compose.yml

# Add the following lines to the file. 

version: &quot;3.3&quot;

services:
  deepstack:
    image: deepquestai/deepstack:latest
    restart: unless-stopped
    container_name: deepstack
    ports:
      - &quot;15000:5000&quot;
    environment:
      - TZ=${TZ}
      - PUID=${PUID}
      - PGID=${PGID}
      - VISION-SCENE=True
      - VISION-FACE=True
      - VISION-DETECTION=True
    volumes:
      - ${ROOT}/deepstack:/datastore</code></pre><p>The next step is enabling the DeepStack container. Simply do the following:</p><pre><code class="language-plaintext">cd /opt/dockerfiles/deepstack

# To bring up the stack:
sudo docker-compose up -d

# To take down the stack:
sudo docker-compose down

# To watch the logs from the container:
sudo docker logs -f deepstacker

# Ultimately you&apos;ll want to bring up the container though:
sudo docker-compose up -d</code></pre><p>...and bam, you should have a DeepStack container running in Docker. Keep in mind this is the CPU version. It&apos;s fast enough and not as picky as the GPU version. You&apos;ll eventually see the screenshot below if you run the <code>logs</code> command above while Blue Iris is detecting motion.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/07/image.png" class="kg-image" alt="Blue Iris, DeepStack, and Docker" loading="lazy" width="830" height="514" srcset="https://nathanlabadie.com/content/images/size/w600/2021/07/image.png 600w, https://nathanlabadie.com/content/images/2021/07/image.png 830w" sizes="(min-width: 720px) 720px"></figure><p>Each one of those lines is a request submitted to DeepStack from Blue Iris, along with the time it took to process the image. Now, let&apos;s configure Blue Iris to connect to the DeepStack server. </p><h2 id="configuring-blue-iris-to-connect-to-deepstack">Configuring Blue Iris to Connect to DeepStack</h2><p>This is part is simple. Go into Blue Iris and click on the settings icon. When the menu pops up, click on the <code>AI</code> tab. </p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/07/image-1.png" class="kg-image" alt="Blue Iris, DeepStack, and Docker" loading="lazy" width="753" height="338" srcset="https://nathanlabadie.com/content/images/size/w600/2021/07/image-1.png 600w, https://nathanlabadie.com/content/images/2021/07/image-1.png 753w" sizes="(min-width: 720px) 720px"></figure><p>You&apos;d then plug in the DeepStack settings for Blue Iris. There isn&apos;t much to this. The <code>DeepStack server on IP/port:</code> should be the hostname of the docker server, followed by the port you&apos;d configured, e.g. <code>docker.env.internal</code> and <code>15000</code>. Make sure the items in the screenshot below are checked.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/07/image-2.png" class="kg-image" alt="Blue Iris, DeepStack, and Docker" loading="lazy" width="680" height="369" srcset="https://nathanlabadie.com/content/images/size/w600/2021/07/image-2.png 600w, https://nathanlabadie.com/content/images/2021/07/image-2.png 680w"></figure><p>Finally, click <code>OK</code> on the bottom. Next you&apos;ll need to configure each camera to utilize the DeepStack integration. It&apos;s not difficult: motion is detected by Blue Iris, Blue Iris sends the image to DeepStack, DeepStack sends the results back to Blue Iris, and Blue Iris determines if it&apos;s an alert. </p><p>Open up the camera settings, go to <code>Trigger</code>, and ensure <code>Motion sensor</code> is checked. You can then click on <code>Configure</code>.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/07/image-5.png" class="kg-image" alt="Blue Iris, DeepStack, and Docker" loading="lazy" width="623" height="286" srcset="https://nathanlabadie.com/content/images/size/w600/2021/07/image-5.png 600w, https://nathanlabadie.com/content/images/2021/07/image-5.png 623w"></figure><p>I just keep mine at reasonable defaults to ensure general motion will trigger the motion sensor. You can keep everything else unchecked unless you actually need it.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/07/image-10.png" class="kg-image" alt="Blue Iris, DeepStack, and Docker" loading="lazy" width="500" height="408"></figure><p>Click <code>OK</code> when done. Next, click on the <code>Artificial Intelligence...</code> button on the <code>Trigger</code> tab for the camera.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/07/image-11.png" class="kg-image" alt="Blue Iris, DeepStack, and Docker" loading="lazy" width="500" height="523"></figure><p>On in the <code>Artificial Intelligence</code> section, there are only a few items that need to be changed. I&apos;d recommend changing <code>To confirm</code> to just <code>person</code> if you only care about person detection. You can also change the minimum confidence. I&apos;ve had good luck with <code>70%</code>. Everything else can be left at defaults. Click <code>OK</code> when done.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/07/image-12.png" class="kg-image" alt="Blue Iris, DeepStack, and Docker" loading="lazy" width="500" height="414"></figure><p>Click <code>OK</code> again on the camera settings screen from before. You&apos;ll see the camera feed quickly restart. Congrats, you have DeepStack enabled for the camera.</p><h2 id="what-happens-next">What Happens Next?</h2><p>Well, when a generic motion alert happens, you&apos;ll notice a few things:</p><ol><li>The thumbnail for the alert will briefly appear in the alerts list in Blue Iris.</li><li>It&apos;ll (1) sit there for a second and disappear, or (2) remain in the alert list with a <code>person:N%</code> listed next to the thumbnail. </li></ol><p>The TL;DR version is that any motion alerts <em>not</em> matching the DeepStack detection will get removed from the alert list, e.g. the alert only persists if DeepStack says there&apos;s a 78% chance that there&apos;s a person in the fame. Much better detection, and almost zero false positives. Hope this helps!</p><!--kg-card-begin: html--><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous"></script>
<script>
    var contentsTitle = "Table of Contents"; // Set your title here, to avoid making a heading for it later
	var ToC = "<h2>"+contentsTitle+"</h2>";
    ToC += "<nav role='navigation' class='table-of-contents'><ul>";
    var first = false;
	$("h2,h3").each(function() {
		var el = $(this);
        if (first === false) {
        	first = true;
            $('<span id="dynamictoc"></span>').insertBefore(el);
        }
        var title = el.text();
		var link = "#" + el.attr("id");
        if (el.is("h2")) {
			ToC += "<li><a href='" + link + "'>" + title + "</a></li>";
        } else if (el.is("h3")) {
        	ToC += "<li style='margin-left:2em'><a href='" + link + "'>" + title + "</a></li>";
        }
	});
	ToC += "</ul></nav>";
    console.log(ToC);
	$("#dynamictoc").html(ToC);
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Reloading 40 S&W]]></title><description><![CDATA[This is just a quick time-lapse of 100 rounds of 40 S&W being reloaded. It's definitely not my favorite round to reload, but overall the shooting experience is much more tolerable with a new Glock 23 Gen 5 MOS. The same rounds out of an M&P Shield are like slapping your hand on concrete. ]]></description><link>https://nathanlabadie.com/reloading-40-s-w/</link><guid isPermaLink="false">6092a9d20fd9f8353bf145bd</guid><category><![CDATA[reloading]]></category><category><![CDATA[firearms]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Wed, 05 May 2021 14:34:54 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/05/IMG_1396_Original.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://nathanlabadie.com/content/images/2021/05/IMG_1396_Original.jpeg" alt="Reloading 40 S&amp;W"><p>This is just a quick time-lapse of 100 rounds of 40 S&amp;W being reloaded. It&apos;s definitely not my favorite round to reload, but overall the shooting experience is much more tolerable with a new <a href="https://us.glock.com/en/pistols/g23-gen5-mos?ref=nathanlabadie.com">Glock 23 Gen 5 MOS</a>. The same rounds out of an M&amp;P Shield are like slapping your hand on concrete. Much, much smoother with the Glock. For reference:</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/05/IMG_3406-1.png" class="kg-image" alt="Reloading 40 S&amp;W" loading="lazy" width="1733" height="1411" srcset="https://nathanlabadie.com/content/images/size/w600/2021/05/IMG_3406-1.png 600w, https://nathanlabadie.com/content/images/size/w1000/2021/05/IMG_3406-1.png 1000w, https://nathanlabadie.com/content/images/size/w1600/2021/05/IMG_3406-1.png 1600w, https://nathanlabadie.com/content/images/2021/05/IMG_3406-1.png 1733w" sizes="(min-width: 720px) 720px"></figure><p>Here&apos;s the recipe for the rounds being reloaded:</p><pre><code class="language-text">| Key          | Value      |
| ------------ | ---------- |
| Caliber      | 40 S&amp;W     |
| Bullet GR    | 180        |
| Bullet Type  | HP         |
| Powder Brand | Unique     |
| Powder GR    | 6.4        |
| C.O.A.L      | 1.131      |
| FPS          | 1096       |
| Date Tested  | 03/27/2021 | </code></pre><p>And finally the time-lapse. The actual reloading time was about 15 minutes, or roughly 9 seconds a round.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/EeX7GKT2HFs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><p>Happy reloading!</p>]]></content:encoded></item><item><title><![CDATA[Day of the D... MULCH]]></title><description><![CDATA[<p>I was looking at the tags I&apos;ve used, found one listed as <a href="https://nathanlabadie.com/tag/dirt/">#dirt</a>, and realized that it was almost a year ago that I had the genius idea of moving 10 yards of dirt by myself. Apparently I haven&apos;t learned anything since I just did the</p>]]></description><link>https://nathanlabadie.com/day-of-the-d/</link><guid isPermaLink="false">607868f9ad8ced5260b0bc17</guid><category><![CDATA[dirt]]></category><category><![CDATA[mulch]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Thu, 15 Apr 2021 16:37:55 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/04/teaserimage-Cigars-for-Yard-Work.png" medium="image"/><content:encoded><![CDATA[<img src="https://nathanlabadie.com/content/images/2021/04/teaserimage-Cigars-for-Yard-Work.png" alt="Day of the D... MULCH"><p>I was looking at the tags I&apos;ve used, found one listed as <a href="https://nathanlabadie.com/tag/dirt/">#dirt</a>, and realized that it was almost a year ago that I had the genius idea of moving 10 yards of dirt by myself. Apparently I haven&apos;t learned anything since I just did the same with 10 yards of mulch. The end result is great, but I have no idea why I keep doing this to myself. </p><p>The beginning:</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/04/IMG_3496.jpg" class="kg-image" alt="Day of the D... MULCH" loading="lazy" width="2000" height="1500" srcset="https://nathanlabadie.com/content/images/size/w600/2021/04/IMG_3496.jpg 600w, https://nathanlabadie.com/content/images/size/w1000/2021/04/IMG_3496.jpg 1000w, https://nathanlabadie.com/content/images/size/w1600/2021/04/IMG_3496.jpg 1600w, https://nathanlabadie.com/content/images/size/w2400/2021/04/IMG_3496.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><p>The end:</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://nathanlabadie.com/content/images/2021/04/IMG_3503.jpg" width="2000" height="1500" loading="lazy" alt="Day of the D... MULCH" srcset="https://nathanlabadie.com/content/images/size/w600/2021/04/IMG_3503.jpg 600w, https://nathanlabadie.com/content/images/size/w1000/2021/04/IMG_3503.jpg 1000w, https://nathanlabadie.com/content/images/size/w1600/2021/04/IMG_3503.jpg 1600w, https://nathanlabadie.com/content/images/size/w2400/2021/04/IMG_3503.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://nathanlabadie.com/content/images/2021/04/IMG_3504.jpg" width="2000" height="1500" loading="lazy" alt="Day of the D... MULCH" srcset="https://nathanlabadie.com/content/images/size/w600/2021/04/IMG_3504.jpg 600w, https://nathanlabadie.com/content/images/size/w1000/2021/04/IMG_3504.jpg 1000w, https://nathanlabadie.com/content/images/size/w1600/2021/04/IMG_3504.jpg 1600w, https://nathanlabadie.com/content/images/size/w2400/2021/04/IMG_3504.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://nathanlabadie.com/content/images/2021/04/IMG_3505.jpg" width="2000" height="1500" loading="lazy" alt="Day of the D... MULCH" srcset="https://nathanlabadie.com/content/images/size/w600/2021/04/IMG_3505.jpg 600w, https://nathanlabadie.com/content/images/size/w1000/2021/04/IMG_3505.jpg 1000w, https://nathanlabadie.com/content/images/size/w1600/2021/04/IMG_3505.jpg 1600w, https://nathanlabadie.com/content/images/size/w2400/2021/04/IMG_3505.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://nathanlabadie.com/content/images/2021/04/IMG_3507.jpg" width="2000" height="1500" loading="lazy" alt="Day of the D... MULCH" srcset="https://nathanlabadie.com/content/images/size/w600/2021/04/IMG_3507.jpg 600w, https://nathanlabadie.com/content/images/size/w1000/2021/04/IMG_3507.jpg 1000w, https://nathanlabadie.com/content/images/size/w1600/2021/04/IMG_3507.jpg 1600w, https://nathanlabadie.com/content/images/size/w2400/2021/04/IMG_3507.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure>]]></content:encoded></item><item><title><![CDATA[Goodbye Notion, Hello Obsidian]]></title><description><![CDATA[Imagine a not-slowly-dying Evernote, combined with a markdown editor, mixed with extensive information and knowledge mapping, and sprinkled with a bunch of tools and plugins to make sense of your data. You end up with Obsidian, which is really good at what it does. ]]></description><link>https://nathanlabadie.com/goodbye-notion-hello-obsidian/</link><guid isPermaLink="false">606fa9680290cb5e93ef01e8</guid><category><![CDATA[obsidian]]></category><category><![CDATA[notion]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Fri, 09 Apr 2021 17:07:13 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/04/2021-04-12_10-29-54.png" medium="image"/><content:encoded><![CDATA[<h2 id="preface">Preface</h2><img src="https://nathanlabadie.com/content/images/2021/04/2021-04-12_10-29-54.png" alt="Goodbye Notion, Hello Obsidian"><p>This is a follow-up to my <a href="https://nathanlabadie.com/improving-productivity-notion-and-nebo/">previous article</a> on Notion. I&apos;ll preface this with 3 points: (1) my knowledge and productivity software changes as frequently as my socks, (2) there is nothing inherently wrong with Notion, and (3) I&apos;ve accepted the fact that I&apos;ll never be happy with any single platform. </p><p>That being said, I was recently burned by <a href="Online workspace startup Notion hit by outage, citing DNS issues | TechCrunch">an outage</a> with Notion. The joy of a cloud-based information management platform is that you shouldn&apos;t need to worry about losing your data. The downside is that when it&apos;s down, <em>it&apos;s down</em>, and you don&apos;t have access to your notes or data. Unfortunately, I was in the latter category right before a meeting, so I ended up searching for a &quot;local&quot; knowledge repository.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/04/download.png" class="kg-image" alt="Goodbye Notion, Hello Obsidian" loading="lazy" width="259" height="194"></figure><p><a href="https://obsidian.md/?ref=nathanlabadie.com">Enter Obsidian</a>.</p><h2 id="what-is-obsidian">What is Obsidian? </h2><p>That&apos;s probably easiest to describe <a href="https://obsidian.md/?ref=nathanlabadie.com">from their website</a>: <em>Obsidian is a powerful knowledge base that works on top of a local folder of plain text Markdown files.</em> </p><p>Super clear and I can just quit typing, right? Yeah, probably not. I didn&apos;t really understand it at first either. Try this: imagine a not-slowly-dying Evernote, combined with a <a href="Markdown Guide">markdown editor</a>, mixed with extensive information and knowledge mapping, and sprinkled with a bunch of tools and plugins to make sense of your data. In reality, you&apos;d likely build a Frankenstein&apos;s monster that would smash your desk and shatter your iPad. Instead, you get... <em>Obsidian</em>, and most importantly,<em> it&apos;s really good at what it does. </em></p><h2 id="how-does-obsidian-work">How Does Obsidian Work?</h2><p>At a simple level: you dump lots of data and notes into Obsidian, leverage markdown for formatting, add some level of tagging and internal links, and Obsidian starts to make sense of the data and shows how everything is related. There are also a ton of plugins that can ride on top of the data to provide additional functionality. I&apos;ll cover the useful ones I&apos;ve found later in the article. However, rather than trying to reinvent the wheel by explaining Obsidian, I&apos;ll link to an outstanding video series that covers the basics in 12 minutes:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/QgbLb6QCK88?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><h2 id="how-do-i-get-my-notes-into-obsidian">How Do I Get My Notes Into Obsidian?</h2><p>Easy! They have a <a href="https://obsidian.md/download?ref=nathanlabadie.com">desktop application</a>. You can also sign up for insider build if you&apos;re <a href="https://help.obsidian.md/Advanced+topics/Contributing+to+Obsidian?ref=nathanlabadie.com">a contributor</a>. Best of all, the notes are simple markdown files that will work with any text editor. I store mine in Google Drive, but any storage provider should work just fine. </p><p>The only downside is a lack of a mobile application. There is one <a href="https://forum.obsidian.md/c/mobile/18?ref=nathanlabadie.com">in development</a> though, which is supposed to be released shortly. In my case it doesn&apos;t really matter: it&apos;s rare that I&apos;m taking notes from my phone. When I do, I simply use <a href="https://www.nebo.app/?ref=nathanlabadie.com">Nebo</a> or Apple Notes. The rough draft of the notes then gets copied, pasted, cleaned up, and added to Obsidian. In the end they&apos;re markdown files and can be opened with just about any editor.</p><h2 id="how-do-i-organize-my-data">How Do I Organize My Data?</h2><p>That&apos;s really up to you. Obsidian is <em>extremely</em> open and flexible for how you organize your data. Here are a few tips I&apos;ve picked up over the last few months.</p><h3 id="tags-are-for-searching">Tags Are For Searching</h3><p>Tags make it simple to search through your data, e.g. find everything that matches <code>#pilot-notes</code>. This also factors into the graph view since you can quickly isolate the graph down to specific tags. A recent trick I&apos;ve found is that you can use &quot;nested tags&quot; to improve organization. For example: <code>#pilot/notes</code>, <code>#pilot/active</code>, <code>#pilot/closed</code>, etc. You end up with a nice tree of tags in the navigation pane:</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/04/image-1.png" class="kg-image" alt="Goodbye Notion, Hello Obsidian" loading="lazy" width="303" height="393"></figure><h3 id="internal-links-are-for-knowledge">Internal Links Are For Knowledge</h3><p>Basically, any major &quot;concepts&quot; should be placed between <code>[[</code> and <code>]]</code>. For example, if I&apos;ve got running notes on a particular customer, I&apos;d always place <code>[[Customer ABC]]</code> in my notes like that. Why? Because then I can quickly find how they&apos;re all related. You&apos;re essentially building a bunch of internal links on that particular concept or topic. It&apos;ll also autocomplete after you type <code>[[</code> in your notes, which makes it easy to ensure you&apos;re always using the same topic. </p><h3 id="templates-are-your-friend">Templates Are Your Friend</h3><p><em>Templates</em> in Obsidian are outstanding. They allow you to quickly add the groundwork to a note without having to type everything out again. Let&apos;s say I&apos;m adding a new contact into my notes. I&apos;ll hit <code>CRTL+T</code> which I have mapped to the &quot;insert template&quot; function, start to type &quot;contact&quot;, and it&apos;ll bring up my contact template. Templates look something like this:</p><pre><code class="language-yaml">---
created: {{date:LLL}}
tags: [contacts]
---

| Key     | Value |
| ------- | ----- |
| Name    |       |
| Company |       |
| Title   |       |
| Email   |       |
| Mobile  |       |
| Office  |       |

</code></pre><p>You may be wondering about that text at the beginning: it&apos;s called front matter in YAML terms. I&apos;ll explain below. </p><h3 id="front-matter-helps-you-organize">Front Matter Helps You Organize</h3><p>Obsidian has a <a href="https://help.obsidian.md/Advanced+topics/YAML+front+matter?ref=nathanlabadie.com">short tutorial</a> on front matter. It&apos;s essentially metadata for your notes. The front matter in the template above will insert the date, e.g. <code>created: March 2, 2021 2:34 PM</code>, and automatically add a <code>#contacts</code> tag. It&apos;ll look something like this depending on your settings:</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/04/image-2.png" class="kg-image" alt="Goodbye Notion, Hello Obsidian" loading="lazy" width="516" height="209"></figure><h3 id="file-and-folder-organization-is-optional">File and Folder Organization Is Optional</h3><p>I cringe when I see people who dump all of their notes and attachments into a single folder. Fortunately, Obsidian doesn&apos;t really care about the directory structure in the &quot;vaults&quot; that it uses for notes. I still keep mine organized just because of personal preference.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/04/image-3.png" class="kg-image" alt="Goodbye Notion, Hello Obsidian" loading="lazy" width="415" height="274"></figure><h2 id="useful-community-plugins">Useful Community Plugins</h2><p>As of typing this, there are around 160 &quot;community plugins&quot; for Obsidian. These are contributed by users in the community. The application makes it painless to get them installed: it&apos;s literally just a few clicks in the UI. These are the ones that I use regularly.</p><h3 id="advanced-tables"><a href="https://github.com/tgrosinger/advanced-tables-obsidian?ref=nathanlabadie.com">Advanced Tables</a></h3><p>It makes formatting tables in markdown much, much easier. At this point I actually prefer markdown tables to &quot;real&quot; tables that you&apos;ll find in Excel. This is basically a must-have plugin, to the point that I&apos;d love to see it baked into the application itself. </p><h3 id="checklist"><a href="https://github.com/delashum/obsidian-checklist-plugin?ref=nathanlabadie.com">Checklist</a></h3><p>This will scan through your notes, look for any checklists, and display them in the sidebar. It&apos;s great if you take daily notes and have checklist items that are unresolved at the end of the day. For reference, a checklist item looks like this when it&apos;s done in markdown:</p><pre><code class="language-yaml">- [ ] This is an unchecked item.
- [ ] This is another one.
- [x] This is a checked item.</code></pre><h3 id="find-unlinked-files-and-unresolved-links"><a href="https://github.com/Vinzent03/find-unlinked-files?ref=nathanlabadie.com">Find Unlinked Files and Unresolved Links</a></h3><p>This will scan through your notes and find anything that&apos;s unlinked. As an example, let&apos;s say I&apos;m working on a project but haven&apos;t created a dedicated page for it, e.g. I&apos;ve got <code>[[My Project]]</code> scattered all through my notes but never created a centralized page. This plugin will list out all of your files and links that are referenced but don&apos;t exist. </p><h3 id="note-refactor"><a href="https://github.com/lynchjames/note-refactor-obsidian?ref=nathanlabadie.com">Note Refactor</a></h3><p>This plugin is great if you use something like <a href="https://help.obsidian.md/Plugins/Daily+notes?ref=nathanlabadie.com">Daily Notes</a> as your scratch pad. You can highlight chunks of text and &quot;refactor&quot; them into a dedicated page. The plugin takes care of the links between the two. </p><h2 id="closing-remarks">Closing Remarks</h2><p>Hopefully this gets you started down the path of using Obsidian. Fortunately, there is no &quot;right or wrong&quot; path with using Obsidian, just lots of recommendations. I&apos;ve been using it for 2-3 months without any issues or complaints. Hope this helps!</p>]]></content:encoded></item><item><title><![CDATA[Reloading: 300 BLK Recipes]]></title><description><![CDATA[<p>Around 15 years ago, a co-worker suggested that I look into reloading as a hobby. I knew nothing about the topic at the time. He suggested going the <em><a href="https://www.urbandictionary.com/define.php?term=buy+once+cry+once&amp;ref=nathanlabadie.com">buy once cry once</a></em> route: spend lots of money up-front for decent equipment, and you won&apos;t have to worry about</p>]]></description><link>https://nathanlabadie.com/300-blk-recipes/</link><guid isPermaLink="false">605269e231c90e4d984a2b42</guid><category><![CDATA[reloading]]></category><category><![CDATA[firearms]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Thu, 18 Mar 2021 02:12:02 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/03/330-BLK-vs-223-REM.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://nathanlabadie.com/content/images/2021/03/330-BLK-vs-223-REM.jpg" alt="Reloading: 300 BLK Recipes"><p>Around 15 years ago, a co-worker suggested that I look into reloading as a hobby. I knew nothing about the topic at the time. He suggested going the <em><a href="https://www.urbandictionary.com/define.php?term=buy+once+cry+once&amp;ref=nathanlabadie.com">buy once cry once</a></em> route: spend lots of money up-front for decent equipment, and you won&apos;t have to worry about replacing it later. I ended up ordering a <a href="https://www.dillonprecision.com/rl-550c-reloader_8_1_23594.html?ref=nathanlabadie.com">Dillon 550B</a>. It wasn&apos;t cheap, but it&apos;s held up amazingly well and is still the only reloading press that I own.</p><p>Fast-forward to present day. I picked up a <a href="https://www.midwayusa.com/product/1020438152?pid=988434&amp;ref=nathanlabadie.com">ProChrono DLX Chronograph</a> for measuring the speed of my rounds. It works extremely well: shoot, wait for the measurement, shoot, wait for the measurment, etc. You then use their app to pull all the shot strings onto your phone via Bluetooth. Honestly, I have no idea why I waited so long to purchase one. </p><p>That being said, I figured it was time to share all of my 300 BLK recipes and the associated data. Enjoy.</p><h3 id="300-blk125-gr1585-fps">300 BLK - 125 GR - 1585 FPS</h3><pre><code class="language-markdown">| Key          | Value      |
| ------------ | ---------- |
| Caliber      | 300 BLK    |
| Bullet GR    | 125        |
| Bullet Type  | Sierra HP  |
| Powder Brand | CFE BLK    |
| Powder GR    | 19.5       |
| C.O.A.L      | 2.060      |
| FPS          | 1585       |
| Date Tested  | 02/26/2021 |</code></pre><ul><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_125_GR_1585_FPS.png">Bullet Drop Card</a>.</li><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_125_GR_1585_FPS.pdf">Chronograph Data</a>.</li></ul><h3 id="300-blk125-gr1804-fps">300 BLK - 125 GR - 1804 FPS</h3><pre><code class="language-markdown">| Key          | Value      |
| ------------ | ---------- |
| Caliber      | 300 BLK    |
| Bullet GR    | 125        |
| Bullet Type  | Sierra HP  |
| Powder Brand | CFE BLK    |
| Powder GR    | 20.8       |
| C.O.A.L      | 2.231      |
| FPS          | 1804       |
| Date Tested  | 02/13/2021 |</code></pre><ul><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_125_GR_1804_FPS.png">Bullet Drop Card</a>.</li><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_125_GR_1804_FPS.pdf">Chronograph Data</a>.</li></ul><h3 id="300-blk125-gr1834-fps">300 BLK - 125 GR - 1834 FPS</h3><pre><code class="language-markdown">| Key          | Value      |
| ------------ | ---------- |
| Caliber      | 300 BLK    |
| Bullet GR    | 125        |
| Bullet Type  | Sierra HP  |
| Powder Brand | CFE BLK    |
| Powder GR    | 21.0       |
| C.O.A.L      | 2.220      |
| FPS          | 1834       |
| Date Tested  | 02/28/2021 |</code></pre><ul><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_125_GR_1834_FPS.png">Bullet Drop Card</a>.</li><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_125_GR_1834_FPS.pdf">Chronograph Data</a>.</li></ul><h3 id="300-blk155-gr1647-fps">300 BLK - 155 GR - 1647 FPS</h3><pre><code class="language-markdown">| Key          | Value       |
| ------------ | ----------- |
| Caliber      | 300 BLK     |
| Bullet GR    | 155         |
| Bullet Type  | Sierra HPBT |
| Powder Brand | CFE BLK     |
| Powder GR    | 20.0        |
| C.O.A.L      | 2.235       |
| FPS          | 1647        |
| Date Tested  | 02/06/2021  |</code></pre><ul><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_155_GR_1647_FPS.png">Bullet Drop Card</a>.</li><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_155_GR_1647_FPS.pdf">Chronograph Data</a>.</li></ul><h3 id="300-blk208-gr969-fps">300 BLK - 208 GR - 969 FPS</h3><pre><code class="language-markdown">| Key          | Value       |
| ------------ | ----------- |
| Caliber      | 300 BLK     |
| Bullet GR    | 208         |
| Bullet Type  | Sierra HPBT |
| Powder Brand | CFE BLK     |
| Powder GR    | 11.9        |
| C.O.A.L      | 2.250       |
| FPS          | 969         |
| Date Tested  | 02/06/2021  |</code></pre><ul><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_208_GR_969_FPS.png">Bullet Drop Card</a>.</li><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_208_GR_969_FPS.pdf">Chronograph Data</a>.</li></ul><h3 id="300-blk220-gr898-fps">300 BLK - 220 GR - 898 FPS</h3><pre><code class="language-markdown">| Key          | Value       |
| ------------ | ----------- |
| Caliber      | 300 BLK     |
| Bullet GR    | 220         |
| Bullet Type  | Sierra HPBT |
| Powder Brand | CFE BLK     |
| Powder GR    | 11.7        |
| C.O.A.L      | 2.260       |
| FPS          | 898         |
| Date Tested  | 02/26/2020  |</code></pre><ul><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_220_GR_898_FPS.png">Bullet Drop Card</a>.</li><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_220_GR_898_FPS.pdf">Chronograph Data</a>.</li></ul><h3 id="300-blk220-gr926-fps">300 BLK - 220 GR - 926 FPS</h3><pre><code class="language-markdown">| Key          | Value      |
| ------------ | ---------- |
| Caliber      | 300 BLK    |
| Bullet GR    | 220        |
| Bullet Type  | HPBT       |
| Powder Brand | CFE BLK    |
| Powder GR    | 11.8       |
| C.O.A.L      | 2.231      |
| FPS          | 926        |
| Date Tested  | 02/13/2021 |</code></pre><ul><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_220_GR_926_FPS.png">Bullet Drop Card</a>.</li><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_220_GR_926_FPS.pdf">Chronograph Data</a>.</li></ul><h3 id="300-blk220-gr1030-fps">300 BLK - 220 GR - 1030 FPS</h3><pre><code class="language-markdown">| Key          | Value       |
| ------------ | ----------- |
| Caliber      | 300 BLK     |
| Bullet GR    | 220         |
| Bullet Type  | Sierra HPBT |
| Powder Brand | CFE BLK     |
| Powder GR    | 12.0        |
| C.O.A.L      | 2.220       |
| FPS          | 1030        |
| Date Tested  | 02/28/2021  |</code></pre><ul><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_220_GR_1030_FPS.png">Bullet Drop Card</a>.</li><li><a href="https://nathanlabadie.com/uploads/reloading/300_BLK/300_BLK_220_GR_1030_FPS.pdf">Chronograph Data</a>.</li></ul><p>Hope this helps. These are my two favorite loads out of the list:</p><ul><li>300 BLK - 125 GR - 1834 FPS</li><li>300 BLK - 220 GR - 1030 FPS</li></ul><!--kg-card-begin: html--><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous"></script>
<script>
    var contentsTitle = "Table of Contents"; // Set your title here, to avoid making a heading for it later
	var ToC = "<h2>"+contentsTitle+"</h2>";
    ToC += "<nav role='navigation' class='table-of-contents'><ul>";
    var first = false;
	$("h2,h3").each(function() {
		var el = $(this);
        if (first === false) {
        	first = true;
            $('<span id="dynamictoc"></span>').insertBefore(el);
        }
        var title = el.text();
		var link = "#" + el.attr("id");
        if (el.is("h2")) {
			ToC += "<li><a href='" + link + "'>" + title + "</a></li>";
        } else if (el.is("h3")) {
        	ToC += "<li style='margin-left:2em'><a href='" + link + "'>" + title + "</a></li>";
        }
	});
	ToC += "</ul></nav>";
    console.log(ToC);
	$("#dynamictoc").html(ToC);
</script>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[i3 and Arch Linux, Oh My]]></title><description><![CDATA[I'm one of those people that doesn't really have a preference on desktop environments. It doesn't really matter if it's Linux, Windows, or a Mac as long as I can get to my applications. Enter i3, a tiling window manager that stays out of the way and maximizes productivity. ]]></description><link>https://nathanlabadie.com/i3-and-arch-linux-oh-my/</link><guid isPermaLink="false">60214035c1744d08884c3ace</guid><category><![CDATA[arch]]></category><category><![CDATA[i3]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Tue, 09 Feb 2021 17:00:53 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/02/ab80af6b484454c4898b27a58fed0658.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="summary">Summary</h2><img src="https://nathanlabadie.com/content/images/2021/02/ab80af6b484454c4898b27a58fed0658.jpg" alt="i3 and Arch Linux, Oh My"><p>I&apos;m one of those people that doesn&apos;t really have a preference on desktop environments. It doesn&apos;t really matter if it&apos;s Linux, Windows, or a Mac as long as I can get to my applications. If anything, I find myself enjoying desktop environments less and less because they <em>get in the way</em> of applications. <a href="https://i3wm.org/?ref=nathanlabadie.com">Enter i3</a>, a tiling window manager that stays out of the way and maximizes productivity. </p><h2 id="background">Background</h2><p>Lots of people seem to like their Mac and Windows desktops since they provide a wealth of integrated features. A while back I found myself going the opposite route: I&apos;d run most of my applications full-screen mode so I <em>wouldn&apos;t</em> need to interact with the desktop. I didn&apos;t want a fancy start menu, a color-coded list of applications, or super-fancy effects as I moved around the environment: I simply wanted to use the application while the desktop stays out of the way.</p><p>I then discovered <a href="https://en.wikipedia.org/wiki/Tiling_window_manager?ref=nathanlabadie.com">tiling window managers</a>, specifically <a href="https://i3wm.org/?ref=nathanlabadie.com">i3</a>. It simply lays out all of your applications so they utilize maximum screen space. Opening a terminal? It takes up 100% of that monitor. Want to open a second one? Now they both have 50% of the desktop. Two terminals, <a href="https://signal.org/en/download/?ref=nathanlabadie.com">Signal Desktop</a>, and <a href="https://en.wikipedia.org/wiki/Thunar?ref=nathanlabadie.com">Thunar</a>? They each take up exactly 25% of the monitor by default. Perfect!</p><p>If this is what you&apos;re looking for, then you&apos;re in the right place.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/02/2021-02-09_11-31-52.gif" class="kg-image" alt="i3 and Arch Linux, Oh My" loading="lazy" width="1280" height="720"></figure><h2 id="i3-setup">i3 Setup</h2><h3 id="installing-the-os">Installing the OS</h3><p>I&apos;m running i3 on <a href="https://archlinux.org/?ref=nathanlabadie.com">Arch Linux</a>. It isn&apos;t always the easiest to configure, so I&apos;d highly recommend something like <a href="https://github.com/MatMoul/archfi?ref=nathanlabadie.com">archi</a> to make the process a whole lot faster. If you&apos;re looking for something a bit easier to install, try <a href="https://manjaro.org/downloads/community/i3/?ref=nathanlabadie.com">the i3 version</a> of Manjaro. It&apos;ll make the setup much, much easier. </p><p>These are the basic packages that I install once I&apos;m at the shell. You&apos;ll probably get prompted for questions at some point. I just say &quot;yes&quot; to everything or keep hitting return until the install is finished.</p><pre><code class="language-shell">pacman -S pacman-contrib base-devel sudo neovim bash-completion git nmap tcpdump mlocate bind-tools tmux zsh wget</code></pre><p>Next up is to install <code>paru</code>:</p><pre><code class="language-shell"># First switch to a non-root user
su - username
git https://aur.archlinux.org/paru.git
cd paru
makepkg -si</code></pre><p>This is totally personal preference here, but I like being able to type the command <code>vi</code> and have it run <a href="https://neovim.io/?ref=nathanlabadie.com">Neovim</a>.</p><pre><code class="language-shell">paru -S neovim-symlinks</code></pre><h3 id="install-i3-and-addons">Install i3 and Addons</h3><p>I&apos;ll preface this by saying these are <em>my</em> preferred addons and setup. You&apos;re free to swap them out as needed. The great thing about i3 is that you can basically pick-and-choose whatever components you&apos;d like, e.g. the web browser, file manager, chat client, etc. It&apos;s entirely up to you. I also happen to like <a href="https://draculatheme.com/?ref=nathanlabadie.com">the Dracula theme</a>. </p><p>That being said:</p><pre><code class="language-shell">paru -S google-chrome-beta lightdm-gtk-greeter ttf-meslo-nerd-font-powerlevel10k ranger rofi dunst xfce4-terminal \
lxappearance i3-wm i3lock i3blocks i3status imwheel picom scrot gimp bumblebee-status i3ipc-python \
python-tzlocal redshift dnf xorg-xbacklight network-manager-applet papirus-icon-theme ttf-opensans \
xautolock tmux thunar gvfs libfdk-aac gtkmm3 dracula-gtk-theme</code></pre><p>Yes, it&apos;s a lot of components, but you&apos;ll thank me later :). </p><p>Next, copy over the configuration files. There are a bunch of them. Rather than copying and pasting everything here, I&apos;ll just include them all as a download in the commands below. </p><pre><code class="language-shell">cd ~
wget https://nathanlabadie.com/uploads/i3wm-general-config.tar.gz
tar zvxf i3wm-general-config.tar.gz
cd i3wm-general-config
cp -rvf .config .local ~/
chmod +x .config/scripts/screenlock.sh</code></pre><p>A note on that <code>screenlock.sh</code> script: it&apos;ll auto-lock the screen after 15 minutes. It&apos;s easy enough to change in the file. Once it&apos;s locked, you&apos;ll notice a blank screen that randomly shows a circle when you mash on the keyboard. That&apos;s the password screen :). Quit mashing on the keyboard and just type in your password to unlock.</p><p>Now we&apos;ll enable <a href="https://wiki.archlinux.org/index.php/LightDM?ref=nathanlabadie.com">LightDM</a>:</p><pre><code class="language-shell">sudo systemctl enable lightdm</code></pre><p>And finally we&apos;ll tweak a few settings so fonts look better:</p><pre><code class="language-shel">sudo ln -s /etc/fonts/conf.avail/10-sub-pixel-rgb.conf /etc/fonts/conf.d/
sudo ln -s /etc/fonts/conf.avail/11-lcdfilter-default.conf /etc/fonts/conf.d/</code></pre><p>Lastly:</p><pre><code class="language-shell">sudo reboot</code></pre><h3 id="setting-the-gtk-theme">Setting the GTK Theme</h3><p>The last configuration tweak will be setting the GTK Theme to Dracula. I&apos;ll touch on these key combinations in a second. Hit <code>ALT+d</code> and you&apos;ll be presented with <a href="https://github.com/davatorium/rofi?ref=nathanlabadie.com">rofi</a>, the closest you&apos;ll find to a start menu. Type in <code>lxappearance</code> and you&apos;ll see a GTK settings menu open. Choose the Dracula theme. I&apos;d also switch the font to <code>Open Sans 11</code> since it generally looks pretty good.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/02/2021-02-09-11-40-42.png" class="kg-image" alt="i3 and Arch Linux, Oh My" loading="lazy" width="1311" height="665" srcset="https://nathanlabadie.com/content/images/size/w600/2021/02/2021-02-09-11-40-42.png 600w, https://nathanlabadie.com/content/images/size/w1000/2021/02/2021-02-09-11-40-42.png 1000w, https://nathanlabadie.com/content/images/2021/02/2021-02-09-11-40-42.png 1311w" sizes="(min-width: 720px) 720px"></figure><h3 id="i3-basics">i3 Basics</h3><p><a href="https://i3wm.org/docs/refcard.html?ref=nathanlabadie.com">This reference card</a> is probably the best you&apos;ll find for i3. I have a printed copy on my desk until the key commands become muscle memory. Below are additional commands that were mapped in the configuration above. I&apos;m using <code>ALT</code> as the modifier key in my setup, but you can also switch that to the <code>WIN</code> key if you feel that&apos;s more natural. </p><pre><code class="language-text">ALT+b = Google Chrome
ALT+return = xfce4-terminal
ALT+d = rofi, aka your start menu</code></pre><p>Another concept that took me a second to wrap my brain around was <code>horizontal</code> versus <code>vertical</code> when it came to stacking. My mind kept going back to how they were <em>separated</em>, e.g. &quot;horizontal&quot; meaning that they&apos;re separated with a horizontal line and stacked on top of each other. That is incorrect. It&apos;s how the applications are <em>aligned</em>, i.e. &quot;horizontal&quot; means they&apos;re side by side. </p><h3 id="i3-demonstration">i3 Demonstration</h3><p>Let&apos;s say you&apos;d like to do the following:</p><ol><li>Open Chrome and have it take up 50% of the left side.</li><li>Have a terminal in the upper-right 25%.</li><li>Have a file explorer in the lower-right 25%.</li></ol><p>You&apos;d just do the following key commands:</p><pre><code class="language-text">ALT+b = open a browser.
ALT+return = open a terminal, to the right by default.
ALT+v = the next window should be stacked vertically to above.
ALT+d = open rofi, aka the start menu
Type &quot;Thunar&quot; and hit return.</code></pre><p>You could even remove rofi from there by mapping Thunar to a key command in the <code>.config/i3/config</code> file. This is basically the gif that&apos;s displayed near the beginning of the article.</p><h2 id="conclusion">Conclusion</h2><p>There is a <em>ton</em> of customization that can be done with i3 to improve productivity. Just about every action can be mapped to a key command. I&apos;d highly recommend <a href="https://i3wm.org/docs/userguide.html?ref=nathanlabadie.com">reading through the docs</a> until you get everything tweaked to your liking. Hope this helps!</p><!--kg-card-begin: html--><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous"></script>
<script>
    var contentsTitle = "Table of Contents"; // Set your title here, to avoid making a heading for it later
	var ToC = "<h2>"+contentsTitle+"</h2>";
    ToC += "<nav role='navigation' class='table-of-contents'><ul>";
    var first = false;
	$("h2,h3").each(function() {
		var el = $(this);
        if (first === false) {
        	first = true;
            $('<span id="dynamictoc"></span>').insertBefore(el);
        }
        var title = el.text();
		var link = "#" + el.attr("id");
        if (el.is("h2")) {
			ToC += "<li><a href='" + link + "'>" + title + "</a></li>";
        } else if (el.is("h3")) {
        	ToC += "<li style='margin-left:2em'><a href='" + link + "'>" + title + "</a></li>";
        }
	});
	ToC += "</ul></nav>";
    console.log(ToC);
	$("#dynamictoc").html(ToC);
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[The Broken RFP Process: Formatting]]></title><description><![CDATA[<p>This is a follow-up to my <a href="https://nathanlabadie.com/the-broken-rfp-process/">previous post</a> on the broken RFP process. I&apos;d like to take a step back and cover what should be the easiest part of the RFP: the document format itself. Instead of straight-forward Word or Excel documents with question and answer sections, we&</p>]]></description><link>https://nathanlabadie.com/the-broken-rfp-process-part-2/</link><guid isPermaLink="false">60187b8247c018042cdbf6a9</guid><category><![CDATA[rfp]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Tue, 02 Feb 2021 17:19:25 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/02/RFP-process-790x400.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://nathanlabadie.com/content/images/2021/02/RFP-process-790x400.jpeg" alt="The Broken RFP Process: Formatting"><p>This is a follow-up to my <a href="https://nathanlabadie.com/the-broken-rfp-process/">previous post</a> on the broken RFP process. I&apos;d like to take a step back and cover what should be the easiest part of the RFP: the document format itself. Instead of straight-forward Word or Excel documents with question and answer sections, we&apos;ve moved to nonsensical formats such as a PDF embedded in an Excel spreadsheet that is part of a Word document that is tied together with macros. Please stop the insanity and stick with the basics. </p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/02/omg-laptop-computer-crash-wtf-100678098-large.jpeg" class="kg-image" alt="The Broken RFP Process: Formatting" loading="lazy" width="1200" height="800" srcset="https://nathanlabadie.com/content/images/size/w600/2021/02/omg-laptop-computer-crash-wtf-100678098-large.jpeg 600w, https://nathanlabadie.com/content/images/size/w1000/2021/02/omg-laptop-computer-crash-wtf-100678098-large.jpeg 1000w, https://nathanlabadie.com/content/images/2021/02/omg-laptop-computer-crash-wtf-100678098-large.jpeg 1200w" sizes="(min-width: 720px) 720px"></figure><h2 id="how-does-an-rfp-get-answered">How Does an RFP Get Answered?</h2><p>It&apos;d probably help to explain how the RFP gets answered before explaining why multi-pick color-coded dropdown macros are awful. Most companies do not have a dedicated &quot;We Answer RFPs&quot; department. The responsibility largely falls on the local sales team. The sales rep gets a copy of the RFP, the questions get a quick review to make sure the technology is a good fit, and the RFP gets handed to the sales engineer. The sales engineer then acts as a coordinator for the RFP.</p><p>What does coordinating an RFP response look like? Well, it&apos;s project management. The SE will answer as many questions as possible, send the unanswered questions to the correct teams, collect all of their responses, plug them back into the RFP, review it once again, etc. There are also tools available such as <a href="https://www.rfpio.com/?ref=nathanlabadie.com">RFPIO</a> that make it a bit easier. You import the RFP, it&apos;ll auto-answer what it can, you can assign questions to other people, etc. It makes it less painful, but it&apos;s still a manual and time-intensive process in the end. </p><h2 id="a-real-world-rfp-analogy">A Real-World RFP Analogy</h2><p>Let&apos;s say you&apos;d like to find out if a grocery store carries a particular item. Most people would simply call the store and ask. Take it a step further: the person you&apos;re speaking with is new to the store and doesn&apos;t actually know if they have it in stock. They simply put you on hold, call the department, get the answer, and relay it back to you. Problem solved!</p><p>Now, let&apos;s say instead of calling the store and asking, you decide to build a multi-tree automated phone application that will call on your behalf. It calls the store clerk, plays a pre-recorded message with the question, and allows them to press &quot;1&quot; for yes, &quot;2&quot; for no, or &quot;3&quot; for N/A. That same clerk presses &quot;2&quot; for no. They&apos;re now presented with a new set of choices such as &quot;we never carried this&quot;, &quot;we&apos;re currently out of stock&quot;, &quot;this is a special order item&quot;, etc. You also add a voicemail section at the very end where the clerk can add additional details.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2021/02/2021-02-02_09-56-25.png" class="kg-image" alt="The Broken RFP Process: Formatting" loading="lazy" width="1240" height="462" srcset="https://nathanlabadie.com/content/images/size/w600/2021/02/2021-02-02_09-56-25.png 600w, https://nathanlabadie.com/content/images/size/w1000/2021/02/2021-02-02_09-56-25.png 1000w, https://nathanlabadie.com/content/images/2021/02/2021-02-02_09-56-25.png 1240w" sizes="(min-width: 720px) 720px"></figure><p>Unfortunately though, the menu was missing a few pieces of logic, and it would disconnect the phone call on anything other than &quot;we never carried this&quot;. That is how most macro-enabled RFP multi-pick multi-cell dropdowns look to someone who is answering an RFP, complete with the missing logic because something wasn&#x2019;t copied and pasted correctly. I&apos;d run out of fingers and toes if I listed all the RFPs that involved fighting against macros, or RFPs that included direct links to file shares that only exist on the customer&apos;s network. </p><h2 id="what-s-wrong-with-my-document-format">What&apos;s Wrong With My Document Format?</h2><p>The TL;DR is that the more complex you make the RFP formatting, the more difficult it becomes to either (1) send the question to someone else on the team that can answer it, or (2) correctly upload it into an RFP tool. The obvious answer is &quot;just send the whole document to everyone&quot; and collect the answers, but that goes back to the <em>project management</em> issue that I described in the beginning. There will be lots of mistakes and unnecessary work if you&apos;re trying to coordinate 10-15 people answering separate copies of an RFP, especially when you have sections that overlap. </p><p>As an example, I just dealt with an issue where the &quot;completed&quot; RFP was exported, but the macro in the RFP only showed it as being 54% complete. Why? Because selecting an answer from a drop-down triggered a macro that caused other questions to appear, which in turn would trigger <em>other</em> questions. It might look fancy to someone showing off their Microsoft Office abilities, but I can promise anyone answering that RFP will wonder what the author was thinking when they put it together. </p><h2 id="what-should-my-rfp-format-look-like">What Should My RFP Format Look Like? </h2><p>The underlying theme is <em>keep it simple</em>, aka <a href="https://en.wikipedia.org/wiki/KISS_principle?ref=nathanlabadie.com">the KISS principle</a>. You&apos;re doing it incorrectly if you need to enable macros or create complex formulas in the RFP. That&apos;s also ignoring the fact that every security-minded individual absolutely cringes when they need to turn on macros just to review a document. Your goal is to get answers to your questions, not to build a Turing machine in Excel. As someone that has answered RFPs for close to two decades, the best ones typically follow this format:</p><ul><li>Written in Microsoft Excel.</li><li>The first sheet includes a basic description of the RFP and any additional instructions for completion. </li><li>Each sheet of the XLS references the major sections. This might be &quot;Company Description&quot;, &quot;Tech Questions&quot;, &quot;Security Assessment&quot;, etc.</li><li>Each sheet contains a header row that includes a description of the columns, e.g. &quot;Question Number&quot;, &quot;Question&quot;, &quot;Answer&quot;, and &quot;Additional Information&quot;. </li><li>The columns are <em>consistent</em>. Don&apos;t have &quot;Column D&quot; be the answer section for some questions, the additional information section for other questions, or potentially a drop-down for even more. That &quot;Column D&quot; should <em>always</em> be for the same type of answer.</li></ul><p>...and that&apos;s it. It makes copying and pasting simple for everyone involved. Best of all, the majority of RFP assistance tools can import and export that without any issues. I found <a href="https://nathanlabadie.com/uploads/RFP_Example_Template.xlsx">a perfect example</a> on the <a href="https://gmcboard.vermont.gov/?ref=nathanlabadie.com">State of Vermont Green Mountain Care Board</a> website. I have no idea who wrote that or what the RFP is for, but the person who put that XLS together is my hero. I&apos;d look at that during import and think &quot;this person knows what they are doing&quot;.</p><h2 id="conclusion">Conclusion</h2><p>Sarcasm and bad analogies aside, I truly hope this article causes someone to rethink their approach the next time they&apos;re building an RFP. You have questions, we have answers. Don&apos;t add unnecessary complexity between the two.</p><p>Random RFP writer person at the State of Vermont Green Mountain Care Board website, I salute you.</p>]]></content:encoded></item><item><title><![CDATA[Manjaro XFCE on VMware Workstation]]></title><description><![CDATA[I recently installed the XFCE edition of Manajaro on VMware Workstation. The install itself was painless, but I ended up needing to make a few tweaks before everything worked as expected on VMware. This guide will walk you through the changes that were made. ]]></description><link>https://nathanlabadie.com/manjaro-xfce-on-vmware-workstation/</link><guid isPermaLink="false">5ff4bcd4b40950044d61faf9</guid><category><![CDATA[arch]]></category><category><![CDATA[manjaro]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Tue, 05 Jan 2021 19:47:22 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2021/01/1024px-Manjaro-logo.svg.png" medium="image"/><content:encoded><![CDATA[<h2 id="summary">Summary</h2><img src="https://nathanlabadie.com/content/images/2021/01/1024px-Manjaro-logo.svg.png" alt="Manjaro XFCE on VMware Workstation"><p>I recently installed <a href="https://manjaro.org/downloads/official/xfce/?ref=nathanlabadie.com">the XFCE edition of Manajaro</a> on VMware Workstation. The install itself was painless, but I ended up needing to make a few tweaks before everything worked as expected on VMware. This guide will walk you through the changes that were made. </p><h2 id="list-of-tweaks">List of Tweaks</h2><h3 id="install-development-packages">Install Development Packages</h3><p>Not all of them are necessary, but without fail I&apos;ll eventually need them.</p><pre><code class="language-shell">sudo pacman -S pacman-contrib base-devel sudo neovim zsh</code></pre><h3 id="install-paru">Install Paru</h3><p>The <code>paru</code> command gives you access to the AUR repository that we&apos;ll need later.</p><pre><code class="language-shell">cd ~
git clone https://aur.archlinux.org/paru.git
cd paru
makepkg -si</code></pre><h3 id="configure-the-kernel-for-vmware">Configure the Kernel for VMware</h3><p><a href="https://archived.forum.manjaro.org/t/vmware-cant-change-screen-resolution/89090/35?ref=nathanlabadie.com">Taken from here</a>. </p><pre><code class="language-plaintext">sudo vi /etc/mkinitcpio.conf

# Change this line:
# MODULES=&quot;&quot;
# To this line:
MODULES=&quot;vsock vmw_vsock_vmci_transport vmw_balloon vmw_vmci vmwgfx&quot;

# Exit the file and run the following commands:
sudo mkinitcpio -P
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo reboot</code></pre><h3 id="fix-the-scroll-wheel">Fix the Scroll Wheel</h3><p>For some reason the scroll wheel is always wonky. The <code>imwheel</code> command can fix it so the scroll wheel behaves as expected. </p><pre><code class="language-shell">paru -S imwheel</code></pre><p>You&apos;ll also need this to start at boot. <a href="https://wiki.archlinux.org/index.php/IMWheel?ref=nathanlabadie.com">Taken from here</a>:</p><pre><code class="language-shell">mkdir -p ~/.config/systemd/user/
vi ~/.config/systemd/user/imwheel.service</code></pre><p>Add the following to the file above:</p><pre><code class="language-plaintext">[Unit]
Description=IMWheel
Wants=display-manager.service
After=display-manager.service

[Service]
Type=simple
Environment=XAUTHORITY=%h/.Xauthority
ExecStart=/usr/bin/imwheel -d
ExecStop=/usr/bin/pkill imwheel
RemainAfterExit=yes

[Install]
WantedBy=graphical-session.target</code></pre><p>Now enable the service:</p><pre><code class="language-shell">systemctl --user daemon-reload
systemctl --user enable --now imwheel
journalctl --user --unit imwheel</code></pre><h2 id="conclusion">Conclusion</h2><p>That should get a few of the VMware oddities out of the way. Have fun!</p><!--kg-card-begin: html--><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous"></script>
<script>
    var contentsTitle = "Table of Contents"; // Set your title here, to avoid making a heading for it later
	var ToC = "<h2>"+contentsTitle+"</h2>";
    ToC += "<nav role='navigation' class='table-of-contents'><ul>";
    var first = false;
	$("h2,h3").each(function() {
		var el = $(this);
        if (first === false) {
        	first = true;
            $('<span id="dynamictoc"></span>').insertBefore(el);
        }
        var title = el.text();
		var link = "#" + el.attr("id");
        if (el.is("h2")) {
			ToC += "<li><a href='" + link + "'>" + title + "</a></li>";
        } else if (el.is("h3")) {
        	ToC += "<li style='margin-left:2em'><a href='" + link + "'>" + title + "</a></li>";
        }
	});
	ToC += "</ul></nav>";
    console.log(ToC);
	$("#dynamictoc").html(ToC);
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Arch Linux, Docker, and NVIDIA]]></title><description><![CDATA[If you've stumbled across this article, it's likely because you've been trying to get Docker, docker-compose, and NVIDIA all working together nicely. It's one of those rabbit holes where you think you're this close to finding the correct answer, but never quite do. This article might help. ]]></description><link>https://nathanlabadie.com/arch-linux-docker-and-nvidia/</link><guid isPermaLink="false">5fd804303f109f044b149b2a</guid><category><![CDATA[docker]]></category><category><![CDATA[nvidia]]></category><category><![CDATA[arch]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Tue, 15 Dec 2020 04:55:12 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2020/12/Moby-logo.png" medium="image"/><content:encoded><![CDATA[<img src="https://nathanlabadie.com/content/images/2020/12/Moby-logo.png" alt="Arch Linux, Docker, and NVIDIA"><p><strong>Alternate Title:</strong> <em>Wading Through Massive Amounts of Incorrect and Obsolete Information to Get Docker and Docker-Compose Working With NVIDIA</em></p><h2 id="summary">Summary</h2><p>If you&apos;ve stumbled across this article, it&apos;s likely because you&apos;ve been trying to get Docker, docker-compose, and NVIDIA all working together nicely. It&apos;s one of those rabbit holes where you think you&apos;re <em>this close</em> to finding the correct answer, realize those answers were for the <em>previous</em> version of Docker or docker-compose, modify your search, and then realize you&apos;ve been reading replies on a Github issue that is 2 years old. Trust me, I&apos;ve been there and done that already. This article will hopefully provide the answer that you&apos;re looking for. </p><p>That being said, I&apos;ll preface this with all the versions I&apos;m using:</p><pre><code class="language-text">Arch Linux: 12-14-2020
Docker version 19.03.14, build 5eb3275d40
docker-compose version 1.27.4, build unknown
NVIDIA-SMI 455.45.01, Driver Version: 455.45.01, CUDA Version: 11.1
nvidia-container-runtime version 1.0.0-rc9</code></pre><p>Please note these instructions are specific to Arch Linux, but similar package names should apply for most Linux distributions.</p><h2 id="installing-related-packages">Installing Related Packages</h2><h3 id="paru">Paru</h3><p>You&apos;ll need <code>paru</code> since we&apos;re using the <a href="https://aur.archlinux.org/?ref=nathanlabadie.com">AUR package repository</a>. Quick instructions:</p><pre><code class="language-shell">pacman -S --needed git base-devel
git clone https://aur.archlinux.org/paru.git
cd paru
makepkg -si</code></pre><h3 id="docker">Docker</h3><pre><code class="language-shell">paru -S docker
sudo systemctl enable docker
sudo systemctl start docker</code></pre><h3 id="docker-compose">Docker-Compose</h3><pre><code class="language-shell">paru -S docker-compose</code></pre><h3 id="nvidia-drivers-and-components">NVIDIA Drivers and Components</h3><pre><code class="language-shell">paru -S nvidia nvidia-utils nvidia-container-toolkit nvidia-container-runtime</code></pre><h2 id="configuring-the-system">Configuring the System</h2><h3 id="loading-kernel-modules">Loading Kernel Modules</h3><p>This just ensures the correct modules are loaded between Docker and NVIDIA requirements. </p><pre><code class="language-text">sudo vi /etc/modules-load.d/custom.conf

# Add the following to the file
nvidia
nvidia-modeset
nvidia-drm
nvidia-uvm
aufs
overlay
macvlan</code></pre><h3 id="configuring-nvidia-runtime-for-docker">Configuring NVIDIA Runtime for Docker</h3><p>This adds the option to load NVIDIA drivers in a <code>docker-compose.yml</code> file.</p><pre><code class="language-text"># This should return the file if it exists.
which nvidia-container-runtime

# Edit the config file for Docker.
sudo vi /etc/docker/daemon.json

# Add the following to the file.
{
  &quot;default-runtime&quot;: &quot;nvidia&quot;,
  &quot;runtimes&quot;: {
    &quot;nvidia&quot;: {
      &quot;path&quot;: &quot;/usr/bin/nvidia-container-runtime&quot;,
      &quot;runtimeArgs&quot;: []
    }
  }
}</code></pre><h3 id="-and-finally-">...and finally:</h3><pre><code class="language-shell">sudo reboot</code></pre><h2 id="conclusion">Conclusion</h2><h3 id="testing-nvidia-drivers-on-the-host-os">Testing NVIDIA Drivers on the Host OS</h3><p>First, you&apos;ll want to verify that your Linux distribution can see the video card as expected. You&apos;ll be running this from the host OS, not the Docker container. The <code>nvidia-smi</code> command should be able to display information on your card. You <strong>do not</strong> need to run this as <code>root</code>.</p><pre><code class="language-text">~ &#x276F; nvidia-smi  

5m 20s nlabadie@nas
Mon Dec 14 23:34:46 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.45.01    Driver Version: 455.45.01    CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Quadro P620         Off  | 00000000:01:00.0 Off |                  N/A |
| 37%   50C    P0    N/A /  N/A |    227MiB /  1998MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    No running processes found
+-----------------------------------------------------------------------------+</code></pre><p>Don&apos;t worry about the lack of processes. You just want to make sure the NVIDIA card is recognized, e.g. Quadro P620.</p><h3 id="testing-nvidia-in-docker">Testing NVIDIA in Docker</h3><p>Based on the above output, we know that our card is working and detected. Next we&apos;ll try the same for Docker via a <code>docker-compose.yml</code> file.</p><pre><code class="language-text">cd ~
vi docker-compose.yml

# Add the following to the file.
version: &apos;2.3&apos;
services:
  nvidia-smi-test:
    runtime: nvidia
    image: nvidia/cuda:9.2-runtime-centos7</code></pre><p>Notice that <code>runtime: nvidia</code> under the <code>services:</code> section? That&apos;s what you&apos;ll need to add for it to be running with the NVIDIA runtime. Next we&apos;ll run <code>docker-compose up</code> to bring up that container. </p><pre><code class="language-text">~ &#x276F; docker-compose up -d     

Creating network &quot;nlabadie_default&quot; with the default driver
Pulling nvidia-smi-test (nvidia/cuda:9.2-runtime-centos7)...
9.2-runtime-centos7: Pulling from nvidia/cuda
75f829a71a1c: Pull complete
3bfd9bee7f23: Pull complete
e264677109d2: Pull complete
04be0f279c7b: Pull complete
c537f616fcbb: Pull complete
0e51dcda29db: Pull complete
Digest: sha256:ee19c7ccab11cc1df37b45417aae9077ac99a8fcee017012218dd57d6c27fe0d
Status: Downloaded newer image for nvidia/cuda:9.2-runtime-centos7
Creating nlabadie_nvidia-smi-test_1 ... done</code></pre><p>Finally, we&apos;ll make sure that <code>nvidia-smi</code> also works in the Docker container.</p><pre><code class="language-text">~ &#x276F; docker-compose run nvidia-smi-test                                         
Creating nlabadie_nvidia-smi-test_run ... done
# Notice the next prompt is different? 
# That&apos;s because you&apos;re like IN THE CONTAINER, man.

[root@16da75e7c31d /]# nvidia-smi

Tue Dec 15 04:46:38 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.45.01    Driver Version: 455.45.01    CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Quadro P620         Off  | 00000000:01:00.0 Off |                  N/A |
| 37%   50C    P0    N/A /  N/A |    227MiB /  1998MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+</code></pre><h3 id="finished">Finished</h3><p>The output shows that NVIDIA drivers are still accessible even within the Docker container. That&apos;s it! You can now run NVIDIA-enabled Docker containers via <code>docker-compose</code> and whatever fancy <code>docker-compose.yml</code> files that you have sitting around. </p><!--kg-card-begin: html--><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous"></script>
<script>
    var contentsTitle = "Table of Contents"; // Set your title here, to avoid making a heading for it later
	var ToC = "<h2>"+contentsTitle+"</h2>";
    ToC += "<nav role='navigation' class='table-of-contents'><ul>";
    var first = false;
	$("h2,h3").each(function() {
		var el = $(this);
        if (first === false) {
        	first = true;
            $('<span id="dynamictoc"></span>').insertBefore(el);
        }
        var title = el.text();
		var link = "#" + el.attr("id");
        if (el.is("h2")) {
			ToC += "<li><a href='" + link + "'>" + title + "</a></li>";
        } else if (el.is("h3")) {
        	ToC += "<li style='margin-left:2em'><a href='" + link + "'>" + title + "</a></li>";
        }
	});
	ToC += "</ul></nav>";
    console.log(ToC);
	$("#dynamictoc").html(ToC);
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[NiFi: Pulling Data from Splunk]]></title><description><![CDATA[Splunk has a fairly robust API. However, you'll occasionally get into situations where you need the data exported out of Splunk as syslog. This guide walks you through connecting to Splunk with Apache NiFi, pulling data in batches from Splunk via the API, and sending it out as syslog from NiFi.]]></description><link>https://nathanlabadie.com/nifi-pulling-data-from-splunk/</link><guid isPermaLink="false">5fca6f47d2cf564f9db31a90</guid><category><![CDATA[apache nifi]]></category><category><![CDATA[splunk]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Fri, 04 Dec 2020 19:49:01 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2020/12/NiFi-Logo.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="summary">Summary</h2><img src="https://nathanlabadie.com/content/images/2020/12/NiFi-Logo.jpg" alt="NiFi: Pulling Data from Splunk"><p>Splunk has a fairly robust API. However, you&apos;ll occasionally get into situations where you need the data exported out of Splunk as syslog. This guide walks you through connecting to Splunk with Apache NiFi, pulling data in batches from Splunk via the API, and sending it out as syslog from NiFi. Similar to the <a href="https://nathanlabadie.com/streaming-from-elastic-to-syslog-via-apache-nifi/">Elasticsearch tutorial</a>, the data is near real-time. In this case, we&apos;ll have NiFi querying Splunk for 1 minute of data from 5 minutes prior, with the query executing every minute.</p><h2 id="configuration">Configuration</h2><h3 id="nifi-setup">NiFi Setup</h3><p>This guide assumes you already have NiFi up and running. If not, I&apos;d <a href="https://nathanlabadie.com/the-basics-how/_">previously written a guide</a> on how to get it installed. You can also do a <a href="https://nathanlabadie.com/running-nifi-in-a-docker-container/">quick and easy install</a> with Docker.</p><h3 id="getsplunk-processor">GetSplunk Processor</h3><p>The first step is to configure the <code>GetSplunk</code> processor. Click on <code>Processor</code> in the top-left corner on the UI and drag it over to the canvas.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/12/image-2.png" class="kg-image" alt="NiFi: Pulling Data from Splunk" loading="lazy" width="1318" height="466" srcset="https://nathanlabadie.com/content/images/size/w600/2020/12/image-2.png 600w, https://nathanlabadie.com/content/images/size/w1000/2020/12/image-2.png 1000w, https://nathanlabadie.com/content/images/2020/12/image-2.png 1318w" sizes="(min-width: 720px) 720px"></figure><p>You&apos;ll then select <code>GetSplunk</code> from the list. Once the processor is on the canvas, double-click on it to access the settings. Keep in mind that we&apos;ll be running this every minute asking for <em>1 minute of data</em> from <em>5 minutes prior</em>. For example, if it&apos;s 12:10, then we&apos;d be asking for the data from 12:04 - 12:05. The next minute we&apos;d be asking for 12:05 - 12:06, then 12:06 - 12:07, etc.</p><p>Under the <code>Scheduling</code> tab, put in <code>1 min</code> for the <code>Run Schedule</code>.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/12/image-3.png" class="kg-image" alt="NiFi: Pulling Data from Splunk" loading="lazy" width="1030" height="522" srcset="https://nathanlabadie.com/content/images/size/w600/2020/12/image-3.png 600w, https://nathanlabadie.com/content/images/size/w1000/2020/12/image-3.png 1000w, https://nathanlabadie.com/content/images/2020/12/image-3.png 1030w" sizes="(min-width: 720px) 720px"></figure><p>Next click on the <code>Properties</code> tab. You&apos;ll want to plug in the following values. Keep in mind that my query is fairly simple: it just asks for everything in the <code>syslog</code> index on Splunk. You&apos;ll want to modify this for your environment. </p><pre><code class="language-PlainText">Scheme: https
Hostname: searchhead.splunk.company.internal
Port: 8089
Query: search index=&quot;syslog&quot;
Time Field Strategy: Event Time
Time Range Strategy: Provided
Earliest Time: -6m@m
Latest Time: -5m@m
Time Zone: UTC
Application: 
Owner: 
Token: 
Username: yoursplunkusername
Password: yoursplunkpassword
Security Protocol: TLSv1_2
Output Mode: RAW</code></pre><p>Click <code>Apply</code> at the bottom once you&apos;re finished. By default, this will come out as one giant blob of text. We&apos;ll split this up with the next processor.</p><p><em>For reference: if you wanted to pull an hour of logs every hour, e.g. batched logs, then you&apos;d change the <code>Earliest Time</code> to <code>-2h@h</code> and the <code>Latest Time</code> to <code>-1h@h</code>. You&apos;d then set the scheduling above so it runs every hour instead of every minute.</em></p><h3 id="splittext-processor">SplitText Processor</h3><p>Next we&apos;ll use the <code>SplitText</code> processor to chop up the previous blob of data into individual events. Drag a <code>SplitText</code> processor onto the canvas and double-click it to access the settings. </p><p>First, click on the <code>Settings</code> tab. Check <code>failure</code> and <code>original</code> under <code>Automatically Terminate Relationships</code>. Why? We&apos;re going to drop everything except for the split data. We don&apos;t need anything else.</p><p>Next, click on the <code>Properties</code> tab and enter the following:</p><pre><code class="language-PlainText">Line Split Count: 1</code></pre><p>The rest of the values can remain at the defaults. This tells NiFi to split each single line into an individual event. Click <code>Apply</code> when done. We&apos;ll now connect the <code>GetSplunk</code> processor to the <code>SplitText</code> processor. Draw a line between the two and click <code>Add</code> at the bottom of the pop-up. You&apos;ll end up with this:</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/12/image-6.png" class="kg-image" alt="NiFi: Pulling Data from Splunk" loading="lazy" width="569" height="378"></figure><p>Now that we have the individual events, we&apos;re going to send them to the <code>PutUDP</code> processor and redirect the events back out of NiFi.</p><h3 id="putudp-processor">PutUDP Processor</h3><p>Drag a <code>PutUDP</code> processor to the canvas. Double-click again to open up the processor settings. Under the <code>Settings</code> tab, check the boxes next to <code>Failure</code> and <code>Success</code> under <code>Automatically Terminate Relationships</code>. This is the last processor in the flow, so we&apos;ll be dropping everything after it hits this processor.</p><p>Next click on the <code>Properties</code> tab. There isn&apos;t much to change here.</p><pre><code class="language-PlainText">Hostname: syslogdestination.company.internal
Port: 514</code></pre><p>Click <code>Apply</code> when done. Similar to above, you&apos;ll then connect the <code>SplitText</code> processor to the <code>PutUDP</code> processor. Select <code>Splits</code> under the <code>For Relationships</code> section when it pops up.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/12/image-7.png" class="kg-image" alt="NiFi: Pulling Data from Splunk" loading="lazy" width="487" height="258"></figure><h3 id="enabling-the-flow">Enabling the Flow</h3><p>Finally, we&apos;ll need to enable everything we just created. Right-click anywhere on the blank canvas and select <code>Start</code>. Assuming there aren&apos;t any mistakes, the flow should fire up, start pulling data from Splunk, and streaming it back out in UDP.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/12/image-8.png" class="kg-image" alt="NiFi: Pulling Data from Splunk" loading="lazy" width="476" height="350"></figure><h2 id="conclusion">Conclusion</h2><p>The final product should look something like this:</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/12/image-9.png" class="kg-image" alt="NiFi: Pulling Data from Splunk" loading="lazy" width="377" height="441"></figure><p>If we watch the output with tcpdump, we should see something like this:</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/12/image-10.png" class="kg-image" alt="NiFi: Pulling Data from Splunk" loading="lazy" width="985" height="616" srcset="https://nathanlabadie.com/content/images/size/w600/2020/12/image-10.png 600w, https://nathanlabadie.com/content/images/2020/12/image-10.png 985w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: html--><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous"></script>
<script>
    var contentsTitle = "Table of Contents"; // Set your title here, to avoid making a heading for it later
	var ToC = "<h2>"+contentsTitle+"</h2>";
    ToC += "<nav role='navigation' class='table-of-contents'><ul>";
    var first = false;
	$("h2,h3").each(function() {
		var el = $(this);
        if (first === false) {
        	first = true;
            $('<span id="dynamictoc"></span>').insertBefore(el);
        }
        var title = el.text();
		var link = "#" + el.attr("id");
        if (el.is("h2")) {
			ToC += "<li><a href='" + link + "'>" + title + "</a></li>";
        } else if (el.is("h3")) {
        	ToC += "<li style='margin-left:2em'><a href='" + link + "'>" + title + "</a></li>";
        }
	});
	ToC += "</ul></nav>";
    console.log(ToC);
	$("#dynamictoc").html(ToC);
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Signal: The Secure Messaging  Client That You Should Be Using]]></title><description><![CDATA[Part of me always cringes when I see the "green text bubble" pop up on my phone. Why? It means it was sent in the clear using a protocol that was invented in the 1980s. Enter Signal: the free, open-source, encrypted, and multi-platform chat client. ]]></description><link>https://nathanlabadie.com/signal-the-secure-im-client/</link><guid isPermaLink="false">5fc552d43026a409f44a2578</guid><category><![CDATA[signal]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Tue, 01 Dec 2020 15:47:37 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2020/12/Signal_HP.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="background">Background</h2><img src="https://nathanlabadie.com/content/images/2020/12/Signal_HP.jpg" alt="Signal: The Secure Messaging  Client That You Should Be Using"><p>I&apos;ve used an iPhone for a long, long time. Part of me always cringes when I see the &quot;green text bubble&quot; pop up on my phone. Why? It means it was sent in the clear using a protocol <a href="https://en.wikipedia.org/wiki/SMS?ref=nathanlabadie.com">that was invented in the 1980s</a>. I&apos;m also not a fan of routing all of my messages through Facebook, WhatsApp, or any of the infinite number of chat clients where targeted advertising is the main driver. </p><p>Enter <a href="https://signal.org/?ref=nathanlabadie.com">Signal</a>: the free, open-source, encrypted, and cross-platform messaging client that you should be using.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/11/2020-11-30_15-28-34.png" class="kg-image" alt="Signal: The Secure Messaging  Client That You Should Be Using" loading="lazy" width="439" height="254"></figure><p><em>&quot;An encrypted chat client? That sounds really complicated.&quot;</em></p><p>Let me preface this by saying that I can barely add and subtract on a good day. Math is definitely not my strong point and part of the reason that I ended up with a degree in psychology. That being said, Signal is dead-simple to use and completely abstracts the &quot;fully encrypted&quot; component of the client. You don&apos;t need to send PGP keys, configure certificates from the OpenSSL command line, or set up any type of encryption gateway. <em>Signal is incredibly easy to use and just works.</em> The only requirement is that you need a phone number: I don&apos;t have a problem using my own, but there&apos;s nothing stopping you from using a <a href="https://voice.google.com/?ref=nathanlabadie.com">Google Voice number</a> instead. </p><h2 id="features">Features</h2><h3 id="overview">Overview</h3><p>There are really two components: the mobile client and the desktop client. Signal is a &quot;mobile first&quot; client, meaning you need to have it installed on your phone before you can set up a desktop client. The desktop client then sync with the phone install. After the phone install, you enable access to your contacts and it&apos;ll notify you of other users in your contact list that have Signal installed. &#xA0;</p><p>As mentioned above, one of the best features of Signal is that it&apos;s completely cross-platform. Android, iOS, Mac, Linux, and Windows all have the same user experience. This is also a major reason that I ended up going with Signal: my team is a mix of iOS and Android. This way everyone gets the same level of encryption, and I don&apos;t need to worry about data being sent in the clear. </p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/12/image.png" class="kg-image" alt="Signal: The Secure Messaging  Client That You Should Be Using" loading="lazy" width="804" height="490" srcset="https://nathanlabadie.com/content/images/size/w600/2020/12/image.png 600w, https://nathanlabadie.com/content/images/2020/12/image.png 804w" sizes="(min-width: 720px) 720px"></figure><h3 id="voice-and-video-chat">Voice and Video Chat</h3><p>Another outstanding feature of Signal is voice and video chat. Why? It&apos;s all encrypted end-to-end and works extremely well. I&apos;ve got spotty reception in my office which means there&apos;s a high likelihood of calls being dropped. On top of that, I&apos;ve had awful luck with Verizon WiFi calling. Even though I&apos;ve got a solid Internet connection, the WiFi call eventually gets dropped or someone ends up sounding like a robot. I haven&apos;t encountered the issue with Signal: both audio and video calls are crystal clear. In fact, the audio quality is <em>far better</em> than what I&apos;d find with a normal phone call. </p><h3 id="group-chat">Group Chat</h3><p>Signal recently added <a href="https://support.signal.org/hc/en-us/articles/360007319331-Group-chats?ref=nathanlabadie.com">decentralized group chat management</a>. Prior to that, it was a bit of a pain point when you had a team chat going: nobody could be kicked from the channel and instead they&apos;d need to voluntarily leave. However, that&apos;s been addressed in the recent releases. You can add people, remove people, designate administrators of the channel, etc. It works extremely well and could easily replace something like Teams and WhatsApp for a communication channel.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nathanlabadie.com/content/images/2020/12/SignalScreenshot-1.png" class="kg-image" alt="Signal: The Secure Messaging  Client That You Should Be Using" loading="lazy" width="366" height="600"><figcaption>Look at me. I am the captain now.</figcaption></figure><h2 id="summary">Summary</h2><p>It&apos;s well worth your time to give Signal a try. It&apos;s free, easy to use, and only takes a minute to set up. Most people are surprised when they see how many of their existing contacts already use Signal. It also has the majority of features that you&apos;d find in the more &quot;mainstream&quot; chat clients, minus <a href="https://www.facebook.com/business/ads/messenger-ads">the advertisements that go along with it</a>. You can also take comfort in knowing that if anyone were to tap your phone line or spy on your instant messages, it&apos;d cause someone to say <em>&quot;damn it, they must be using military-grade industrial encryption firewalls&quot;</em> just like in the movies.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://signal.org/?ref=nathanlabadie.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Signal Messenger: Speak Freely</div><div class="kg-bookmark-description">Say &#x201C;hello&#x201D; to a different messaging experience. An unexpected focus on privacy, combined with all of the features you expect.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://signal.org/assets/favicon/android-icon-192x192-2ce7be93a7e75de13098e18298fcb8910772ec2e035cea23f3c2ad438ff8e504.png" alt="Signal: The Secure Messaging  Client That You Should Be Using"><span class="kg-bookmark-author">Signal Messenger</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://signal.org/assets/og/og-image-ff2096df535eee499356de64b19fa8cebb9681ab1e78cca7330e7f8b8d5ec6d5.png" alt="Signal: The Secure Messaging  Client That You Should Be Using"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[The Broken RFP Process: Questions]]></title><description><![CDATA[RFPs are a simple fact of the business: you will have to answer them, and some will be better than others. However, over the last 5-10 years, I’ve watched as RFPs have become progressively more convoluted and irrelevant to the problem that the business is attempting to solve.]]></description><link>https://nathanlabadie.com/the-broken-rfp-process/</link><guid isPermaLink="false">5fa5b92a28dba843a9828760</guid><category><![CDATA[rfp]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Fri, 06 Nov 2020 21:01:05 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2020/11/RFP-process-790x400.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://nathanlabadie.com/content/images/2020/11/RFP-process-790x400.jpg" alt="The Broken RFP Process: Questions"><p>I&#x2019;ve worked in the information security space for over two decades. RFPs are a simple fact of the business: you will have to answer them, and some will be better than others. However, over the last 5-10 years, I&#x2019;ve watched as RFPs have become progressively more convoluted and irrelevant to the problem that the business is attempting to solve.</p><p>Many times you&apos;ll notice that RFPs are simply being reused and repurposed, e.g. add a few questions and the firewall RFP becomes the antivirus RFP which then becomes the SIEM RFP. It happens, and we&apos;re all guilty of a bit of copy-and-paste. Take that a step further and combine it with onerous procurement processes, perceived and real compliance mandates, and pages of unrelated question that get tacked onto the relevant questions, and eventually the overall purpose and goal of the RFP becomes completely unrecognizable.</p><p>Without realizing it, companies are shooting themselves in the foot: the focus becomes completing the Byzantine RFP process instead of identifying the correct technology.</p><p>That being said, let&#x2019;s translate the process to something we&#x2019;re all likely familiar with: purchasing a vehicle. Imagine that you&apos;re in the market for a truck, and leaning towards the Ford F150 or a Dodge Ram. Rather than reading the multitude of reviews or taking the trucks for a test drive, you show up at the dealership with a 400-question RFP that you&apos;d like the dealership to complete within 10 business days. The RFP includes questions such as:</p><ul><li>Describe the accomplishments and backgrounds of all executives at the company.</li><li>How many buttons are included on the dashboard of your vehicle? Describe the exact color and function of each button along with photos of each.</li><li>Please list the water and electric usage for all local and remote employees, along with methods implemented to reduce that consumption.</li><li>Describe the development methods used by the engineering teams assigned to the vehicles. If the answer is not &#x201C;Agile software development&#x201D;, please describe the training, certification, and practices used to follow your method of development on the Honda Pilot.</li><li>Describe your reasoning behind adding brakes to the vehicle, specifically when compared to the Nissan Maxima. Include at least 7 examples.</li><li>On a scale of 1-5, on average how many technicians are globally servicing motorcycles on a Tuesday between 3-7 PM Pacific time? What type of motorcycles? What is your SLA on servicing motorcycles?</li><li>Please describe how your vehicle can accelerate from 0 &#x2013; 178 MPH with exactly 5 occupants in the vehicle while pulling an oblong object attached with a 27-foot chain. Include diagrams and diagnostic output measurements.</li></ul><p>Sounds ridiculous, right? Unfortunately this has become the standard.</p><p>You walked into the dealership with the desired outcome of purchasing the &#x201C;better&#x201D; truck by going through the RFP process. Instead, you&#x2019;ll end up working with the dealership that told a low-level employee to BS their way through the answers as quickly as possible &#x201C;to get to the next step&#x201D;. The dealership already knows that the RFP is just a prelude to the test drive, which itself is likely the step before the actual purchase.</p><p>There has to be a better way to meet the goals of the business. Before sending out the next RFP, read through the questions and ask &#x201C;will these questions help my business identify the best solution, or are they going to get me a bunch of meaningless responses?&#x201D; If it&apos;s the latter, then it might be time to re-evalute the existing process.</p>]]></content:encoded></item><item><title><![CDATA[Improving Productivity: Notion, Nebo, and the iPad]]></title><description><![CDATA[This article covers my latest iteration of productivity tools and methods, with my latest being Notion in combination with Nebo.]]></description><link>https://nathanlabadie.com/improving-productivity-notion-and-nebo/</link><guid isPermaLink="false">5fa4132828dba843a9828585</guid><category><![CDATA[productivity]]></category><category><![CDATA[notion]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Thu, 05 Nov 2020 22:16:43 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2020/11/notion-2.png" medium="image"/><content:encoded><![CDATA[<h2 id="summary">Summary</h2><img src="https://nathanlabadie.com/content/images/2020/11/notion-2.png" alt="Improving Productivity: Notion, Nebo, and the iPad"><p><em>&quot;I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.&quot; --Bill Gates</em></p><p>I&apos;m a fan of finding the minimal amount of effort required to produce the maximum amount of results. Every 6-12 months I try to revisit my note-taking and productivity tools to find areas of improvement. This can range from spreadsheets, to note-taking applications, to the good ol&apos; pen and paper. This article covers my latest iteration of productivity tools and methods, with my latest being Notion in combination with Nebo.</p><h2 id="background">Background</h2><p>Most of my jobs over the years have required copious amounts of notes. This could range from customer meetings to internal notes to product documentation. It really comes down to two major functions: (1) ingesting the data and (2) organizing the data. If I had to look back, these are the applications and methods that I&apos;d previously used:</p><ul><li><strong>Pen and paper</strong>. I still use it quite a bit, but I&apos;ll eventually end up with yellow legal pads covered in scrawl. I always tell myself I&apos;ll transcribe the notes: instead I end up with cryptic phrases that seem to be written in dead languages. It also doesn&apos;t help that my handwriting is horrible and I can&apos;t always decipher what I was trying to write. </li><li><strong>Evernote</strong>. I used Evernote for years and years. It&apos;s still a great tool. However, I started to feel like development had stagnated with OneNote eating into a lot of the business. It also lacked a lot of the flexibility I was looking for: tagging and keywords only go so far. The abundance of integrations was also nice, but the core product started leaving a lot to be desired. </li><li><strong>OneNote</strong>. I&apos;ve tried multiple times to like OneNote. Really, I tried. I&apos;ve forced myself to use it for months at a time. I&apos;ve told myself the integration with Outlook was an awesome boost to productivity. The result in the end is always the same: <em>I don&apos;t like OneNote</em>. It&apos;s too flexible with notes being scattered everywhere, it&apos;s not always the most intuitive UI, and it never seems to fit in with the workflow that I&apos;m expecting. </li><li><strong>Trello, Apple Notes, Joplin, SimpleNotes, etc</strong>. There&apos;s a whole slew that I&apos;ve tried and quickly moved away from. </li></ul><h2 id="method">Method</h2><p>Going back to my comment above, I&apos;m looking for ways to improve (1) my data ingest and (2) my data organization. </p><h3 id="ingest">Ingest</h3><p>My handwriting is horrible but I like to write out my notes. My memory retention with typed notes isn&apos;t the best: I tend to forget everything since I know it&apos;s stored away somewhere else. On the other hand, when I write notes out, part of my brain goes back to high school and college where I <em>know</em> I need to remember the information for later use. The downside is that searching through my scrawl hasn&apos;t always been easy. I&apos;ll get back to that in a minute. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nathanlabadie.com/content/images/2020/11/2020-11-05_12-01-41.png" class="kg-image" alt="Improving Productivity: Notion, Nebo, and the iPad" loading="lazy" width="503" height="150"><figcaption>My scrawl.</figcaption></figure><h3 id="organization">Organization</h3><p>I&apos;m not a fan of free form note-taking applications. My <em>organized</em> notes are typically a glorified spreadsheet with lots of bullet points and structured data. It&apos;s less about form and more about function. The goal is to take all the handwritten data from the ingest phase, convert it to text, and get it organized somewhere. </p><h2 id="tools">Tools</h2><p>All of that being said, I&apos;ve found two applications that meet almost those exact requirements: <a href="https://www.notion.so/?ref=nathanlabadie.com">Notion</a> and <a href="https://www.nebo.app/?ref=nathanlabadie.com">Nebo</a>. There is no direct integration between the two, minus text being exported from Nebo and imported into Notion. That&apos;s all I really need between the two of them though. </p><h3 id="apple-ipad-air">Apple iPad Air</h3><p>The hardware part of the equation that ties them together is an <a href="https://www.apple.com/ipad-air/?ref=nathanlabadie.com">iPad Air</a> with an <a href="https://www.apple.com/apple-pencil?ref=nathanlabadie.com">Apple Pencil</a>. The iPad is Gen 4 and the Pencil is Gen 2. I can&apos;t speak to the previous generations since I&apos;d never owned one, but it really does an outstanding job with the feeling of &quot;natural&quot; handwriting on the iPad versus a pen and paper. The only minor annoyance was the feeling of writing on glass with the iPad. However, that&apos;s easy enough to correct with something <a href="https://www.amazon.com/gp/product/B0842389S3/?ref=nathanlabadie.com">a paper-feel screen protector</a>. $20 and it makes a huge difference on the &quot;feel&quot; of writing. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nathanlabadie.com/content/images/2020/11/IMG_2846.jpeg" class="kg-image" alt="Improving Productivity: Notion, Nebo, and the iPad" loading="lazy" width="2000" height="1500" srcset="https://nathanlabadie.com/content/images/size/w600/2020/11/IMG_2846.jpeg 600w, https://nathanlabadie.com/content/images/size/w1000/2020/11/IMG_2846.jpeg 1000w, https://nathanlabadie.com/content/images/size/w1600/2020/11/IMG_2846.jpeg 1600w, https://nathanlabadie.com/content/images/2020/11/IMG_2846.jpeg 2048w" sizes="(min-width: 720px) 720px"><figcaption>Pen and paper of the future.&#xA0;</figcaption></figure><h3 id="nebo">Nebo</h3><p>There are a few reasons that I ended up with Nebo:</p><ul><li>Simplicity. I don&apos;t need my handwriting recognition app to do anything fancy, e.g. heavy-duty note organization, PDF markups, mind maps, etc. I just want to quickly and easily convert my semi-legible scrawl to text.</li><li>Bullet lists. I don&apos;t want to use the keyboard when I write. Nebo has a super-easy function to create bullet lists, which I use quite a bit in my notes. </li><li>Easy corrections. Being able to scribble out letters, combine and separate words, have a custom dictionary, etc. </li><li>Reliable handwriting recognition and export. Nebo <em>really</em> excels at this. I&apos;d say it gets close to 99% of my handwriting correct, which is amazing since I can barely read most of what I write. </li></ul><p>Write notes in Nebo, convert to text, export to Notion.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nathanlabadie.com/content/images/2020/11/Nebo_Handwriting_Example.gif" class="kg-image" alt="Improving Productivity: Notion, Nebo, and the iPad" loading="lazy" width="1024" height="711"><figcaption>Scrawl to text.</figcaption></figure><h3 id="notion">Notion</h3><p>Notion is a tough one to describe. Imagine if a wiki, database, spreadsheet, notebook, and organizational app all got together and had a child. It&apos;d normally be a bunch of half-baked solutions. However, Notion seems to have snagged all the best parts from those and combined them into a highly functional and usable platform. Want to share a page like a wiki? No problem. Create a kanban page? Yep. Create an interactive database of all your active engagements? Sure!</p><p>There are a <a href="https://notionpages.com/getting-started-with-notion-boost-your-productivity/?ref=nathanlabadie.com">ton of tutorials</a> on effectively using Notion, and it&apos;s way beyond the scope of this article. We&apos;ll stick with the <em>organize</em> part of <em>ingest and organize</em>. Basically, once the notes are exported to Notion, they&apos;re placed on a page that I&apos;ve reserved as my &quot;exporting dumping ground&quot; for lack of a better term. Think of them as raw notes that will get cleaned up into something usable. The font is also funky when you first export them, but that&apos;s easy enough to correct with a format remover like <a href="https://apps.apple.com/us/app/paste-plain-text/id1407015686?mt=12&amp;ref=nathanlabadie.com">Paste Plain Text</a> or <a href="https://stevemiller.net/puretext/?ref=nathanlabadie.com">PureText</a>. You&apos;ll first end up with this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nathanlabadie.com/content/images/2020/11/2020-11-05_16-01-42.png" class="kg-image" alt="Improving Productivity: Notion, Nebo, and the iPad" loading="lazy" width="1035" height="430" srcset="https://nathanlabadie.com/content/images/size/w600/2020/11/2020-11-05_16-01-42.png 600w, https://nathanlabadie.com/content/images/size/w1000/2020/11/2020-11-05_16-01-42.png 1000w, https://nathanlabadie.com/content/images/2020/11/2020-11-05_16-01-42.png 1035w" sizes="(min-width: 720px) 720px"><figcaption>The initial export.</figcaption></figure><p>I&apos;ll then copy and paste this into my &quot;organized&quot; section, adding details as needed.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nathanlabadie.com/content/images/2020/11/2020-11-05_16-07-03.png" class="kg-image" alt="Improving Productivity: Notion, Nebo, and the iPad" loading="lazy" width="961" height="555" srcset="https://nathanlabadie.com/content/images/size/w600/2020/11/2020-11-05_16-07-03.png 600w, https://nathanlabadie.com/content/images/2020/11/2020-11-05_16-07-03.png 961w" sizes="(min-width: 720px) 720px"><figcaption>Sample notes.</figcaption></figure><p>...with everything going into the Notion &quot;database&quot; of organized data.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://nathanlabadie.com/content/images/2020/11/2020-11-05_16-05-01.png" class="kg-image" alt="Improving Productivity: Notion, Nebo, and the iPad" loading="lazy" width="1132" height="524" srcset="https://nathanlabadie.com/content/images/size/w600/2020/11/2020-11-05_16-05-01.png 600w, https://nathanlabadie.com/content/images/size/w1000/2020/11/2020-11-05_16-05-01.png 1000w, https://nathanlabadie.com/content/images/2020/11/2020-11-05_16-05-01.png 1132w" sizes="(min-width: 720px) 720px"><figcaption>Organized notes.</figcaption></figure><h2 id="conclusion">Conclusion</h2><p>I&apos;m sure this will change again in 6 months, but for the moment I&apos;m quite happy with the setup. It&apos;s the best of both worlds: I&apos;ve got my handwritten notes that are slightly committed to memory, along with the searchable and organized version. I&apos;d strongly suggest going through the tutorial videos linked above if you&apos;ve never used Notion. The learning curve is slightly steeper than something like OneNote or Evernote, but you&apos;ve got a ton of organizational options once it&apos;s up and running. </p>]]></content:encoded></item><item><title><![CDATA[Elasticsearch: Finding the DSL Query]]></title><description><![CDATA[One of the pain points of Elasticsearch has always been Elasticsearch DSL. This will show you how you how to obtain the DSL from a simple Elasticsearch query.]]></description><link>https://nathanlabadie.com/elasticsearch-finding-the-dsl-query/</link><guid isPermaLink="false">5f92f95dca52f57931258fc1</guid><category><![CDATA[elastic]]></category><dc:creator><![CDATA[Nathan Labadie]]></dc:creator><pubDate>Fri, 23 Oct 2020 16:04:21 GMT</pubDate><media:content url="https://nathanlabadie.com/content/images/2020/10/elastic-elasticsearch-logo-vector.png" medium="image"/><content:encoded><![CDATA[<h2 id="summary">Summary</h2><img src="https://nathanlabadie.com/content/images/2020/10/elastic-elasticsearch-logo-vector.png" alt="Elasticsearch: Finding the DSL Query"><p>One of the pain points of Elasticsearch has always been <a href="https://elasticsearch-dsl.readthedocs.io/en/latest/?ref=nathanlabadie.com">Elasticsearch DSL</a>. The queries never seem to make sense to me, they&apos;re always incorrect when I write them, and I&apos;ve never found a decent &quot;before and after&quot; for UI queries versus the DSL. A co-worker pointed me to a button in Kibana that I&apos;d seen a million times but stopped noticing: <code>Inspect</code>. It&apos;ll show you the DSL query from the query that you&apos;d built in the Kibana UI.</p><h2 id="details">Details</h2><h3 id="build-the-query">Build the Query</h3><p>The first step is easy: go into the Kibana UI and build the query like you normally would. In this case I&apos;m doing a search over the last 7 days for anything originating from Russia where the destination port is 22. I&apos;ve also thrown in a few other criteria just to make the DSL output slightly more complex.</p><p><code>geo.country:&quot;Russia&quot; AND dst_port:&quot;22&quot; AND interface:&quot;re1&quot; AND action:&quot;pass&quot;</code></p><p>Hello Vlad.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/10/2020-10-23_11-52-21.png" class="kg-image" alt="Elasticsearch: Finding the DSL Query" loading="lazy" width="2000" height="770" srcset="https://nathanlabadie.com/content/images/size/w600/2020/10/2020-10-23_11-52-21.png 600w, https://nathanlabadie.com/content/images/size/w1000/2020/10/2020-10-23_11-52-21.png 1000w, https://nathanlabadie.com/content/images/size/w1600/2020/10/2020-10-23_11-52-21.png 1600w, https://nathanlabadie.com/content/images/size/w2400/2020/10/2020-10-23_11-52-21.png 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="the-inspect-button">The Inspect Button</h3><p>Next click the <code>Inspect</code> button that I somehow never noticed. </p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/10/2020-10-23_11-52-21-1-1.png" class="kg-image" alt="Elasticsearch: Finding the DSL Query" loading="lazy" width="2000" height="770" srcset="https://nathanlabadie.com/content/images/size/w600/2020/10/2020-10-23_11-52-21-1-1.png 600w, https://nathanlabadie.com/content/images/size/w1000/2020/10/2020-10-23_11-52-21-1-1.png 1000w, https://nathanlabadie.com/content/images/size/w1600/2020/10/2020-10-23_11-52-21-1-1.png 1600w, https://nathanlabadie.com/content/images/size/w2400/2020/10/2020-10-23_11-52-21-1-1.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>On the next screen, click the <code>Request</code> tab. This will show you the DSL that was used in the query. There&apos;s even a copy button to make life easier.</p><figure class="kg-card kg-image-card"><img src="https://nathanlabadie.com/content/images/2020/10/2020-10-23_11-57-43.png" class="kg-image" alt="Elasticsearch: Finding the DSL Query" loading="lazy" width="2000" height="756" srcset="https://nathanlabadie.com/content/images/size/w600/2020/10/2020-10-23_11-57-43.png 600w, https://nathanlabadie.com/content/images/size/w1000/2020/10/2020-10-23_11-57-43.png 1000w, https://nathanlabadie.com/content/images/size/w1600/2020/10/2020-10-23_11-57-43.png 1600w, https://nathanlabadie.com/content/images/size/w2400/2020/10/2020-10-23_11-57-43.png 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="the-dsl-query">The DSL Query</h3><p>...and here&apos;s the resulting DSL output, which is way less intuitive than the query I&apos;d listed out at the beginning of the article.</p><pre><code class="language-json">{
  &quot;version&quot;: true,
  &quot;size&quot;: 500,
  &quot;sort&quot;: [
    {
      &quot;nifi_timestamp&quot;: {
        &quot;order&quot;: &quot;desc&quot;,
        &quot;unmapped_type&quot;: &quot;boolean&quot;
      }
    }
  ],
  &quot;aggs&quot;: {
    &quot;2&quot;: {
      &quot;date_histogram&quot;: {
        &quot;field&quot;: &quot;nifi_timestamp&quot;,
        &quot;fixed_interval&quot;: &quot;3h&quot;,
        &quot;time_zone&quot;: &quot;America/Detroit&quot;,
        &quot;min_doc_count&quot;: 1
      }
    }
  },
  &quot;stored_fields&quot;: [
    &quot;*&quot;
  ],
  &quot;script_fields&quot;: {},
  &quot;docvalue_fields&quot;: [
    {
      &quot;field&quot;: &quot;nifi_timestamp&quot;,
      &quot;format&quot;: &quot;date_time&quot;
    }
  ],
  &quot;_source&quot;: {
    &quot;excludes&quot;: []
  },
  &quot;query&quot;: {
    &quot;bool&quot;: {
      &quot;must&quot;: [
        {
          &quot;query_string&quot;: {
            &quot;query&quot;: &quot;geo.country:\&quot;Russia\&quot; AND dst_port:\&quot;22\&quot; AND interface:\&quot;re1\&quot; AND action:\&quot;pass\&quot;&quot;,
            &quot;analyze_wildcard&quot;: true,
            &quot;time_zone&quot;: &quot;America/Detroit&quot;
          }
        }
      ],
      &quot;filter&quot;: [
        {
          &quot;range&quot;: {
            &quot;nifi_timestamp&quot;: {
              &quot;gte&quot;: &quot;2020-10-16T15:48:34.313Z&quot;,
              &quot;lte&quot;: &quot;2020-10-23T15:48:34.313Z&quot;,
              &quot;format&quot;: &quot;strict_date_optional_time&quot;
            }
          }
        }
      ],
      &quot;should&quot;: [],
      &quot;must_not&quot;: []
    }
  },
  &quot;highlight&quot;: {
    &quot;pre_tags&quot;: [
      &quot;@kibana-highlighted-field@&quot;
    ],
    &quot;post_tags&quot;: [
      &quot;@/kibana-highlighted-field@&quot;
    ],
    &quot;fields&quot;: {
      &quot;*&quot;: {}
    },
    &quot;fragment_size&quot;: 2147483647
  }
}</code></pre><h2 id="conclusion">Conclusion</h2><p>This was one of those &quot;derp&quot; moments when I considered the amount of time I&apos;d spent trying to get DSL queries working. Hopefully this helps someone out.</p><!--kg-card-begin: html--><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous"></script>
<script>
    var contentsTitle = "Table of Contents"; // Set your title here, to avoid making a heading for it later
	var ToC = "<h2>"+contentsTitle+"</h2>";
    ToC += "<nav role='navigation' class='table-of-contents'><ul>";
    var first = false;
	$("h2,h3").each(function() {
		var el = $(this);
        if (first === false) {
        	first = true;
            $('<span id="dynamictoc"></span>').insertBefore(el);
        }
        var title = el.text();
		var link = "#" + el.attr("id");
        if (el.is("h2")) {
			ToC += "<li><a href='" + link + "'>" + title + "</a></li>";
        } else if (el.is("h3")) {
        	ToC += "<li style='margin-left:2em'><a href='" + link + "'>" + title + "</a></li>";
        }
	});
	ToC += "</ul></nav>";
    console.log(ToC);
	$("#dynamictoc").html(ToC);
</script><!--kg-card-end: html-->]]></content:encoded></item></channel></rss>