<?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"><channel><title><![CDATA[ElijahLynn.net]]></title><description><![CDATA[Blog of Elijah Lynn: Technology, Life Lessons, Music, Portland]]></description><link>https://www.elijahlynn.net</link><generator>GatsbyJS</generator><lastBuildDate>Wed, 21 Aug 2024 23:16:31 GMT</lastBuildDate><item><title><![CDATA[A note about Merge/Pull Request titles and commit messages]]></title><description><![CDATA[Merge Request (GitLab) and Pull Request (GitHub) titles are commit messages when using a squash and merge strategy on GitHub or GitLab…]]></description><link>https://www.elijahlynn.net/blog/2024-08-21-a-note-about-squash-merge-pr-titles-commit-messages</link><guid isPermaLink="false">https://www.elijahlynn.net/blog/2024-08-21-a-note-about-squash-merge-pr-titles-commit-messages</guid><pubDate>Wed, 21 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Merge Request (GitLab) and Pull Request (GitHub) titles are commit messages when using a squash and merge strategy on GitHub or GitLab. Write your titles like they are going to be a commit message, because they are. &lt;/p&gt;
&lt;p&gt;examples of not great commit messages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed stuff (fixed what?)&lt;/li&gt;
&lt;li&gt;add initial config (for what?)&lt;/li&gt;
&lt;li&gt;WIP&lt;/li&gt;
&lt;li&gt;lol forgot this&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;examples of better commit messages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix null pointer exception in UserService when user data is null&lt;/li&gt;
&lt;li&gt;Improve load times by optimizing image assets&lt;/li&gt;
&lt;li&gt;Remove deprecated API usage from OrderService&lt;/li&gt;
&lt;li&gt;Update dependencies to latest versions to fix security vulnerabilities&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Arch Linux is the best distribution for beginners]]></title><description><![CDATA[This a stub/draft for now, public though.  AUR is the best for beginners  pacman wrapper is amazing, it gets from official Arch repo AND AUR…]]></description><link>https://www.elijahlynn.netblog/2020-12-3-arch-linux-best-distribution-beginners</link><guid isPermaLink="false">https://www.elijahlynn.netblog/2020-12-3-arch-linux-best-distribution-beginners</guid><pubDate>Thu, 03 Dec 2020 18:02:36 GMT</pubDate><content:encoded>&lt;p&gt;This a stub/draft for now, public though. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AUR is the best for beginners&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;yay&lt;/code&gt; pacman wrapper is amazing, it gets from official Arch repo AND AUR. &lt;/li&gt;
&lt;li&gt;Install 99% of packages this  if doesn’t exist can make your own AUR, but most of the time someone has already done this. &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AUR downfalls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most are not public repos to submit merge/pull requests against. I think they should all be on an AUR GitLab for collaboration&lt;/li&gt;
&lt;li&gt;Only way to communicate is to in comments on the AUR package page&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Other distros are a nightmare for installing things&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Writing just to write]]></title><description><![CDATA[Writing just to write. Writing is a habit that I want to create in my life. Something about the loop of outputting, then reading it back and…]]></description><link>https://www.elijahlynn.net/blog/2020-06-19-writing-just-to-write</link><guid isPermaLink="false">https://www.elijahlynn.net/blog/2020-06-19-writing-just-to-write</guid><pubDate>Fri, 19 Jun 2020 17:20:44 GMT</pubDate><content:encoded>&lt;p&gt;Writing just to write. Writing is a habit that I want to create in my life. Something about the loop of outputting, then reading it back and inputting it back into my brain and the cycle of that all that really helps me think better.&lt;/p&gt;
&lt;p&gt;Part of the habit is just writing, and I haven’t yet written here since I got the Netlify CMS functionality added to this site therefore I haven’t actually gotten to use this feature, which I am doing right now to write this post. &lt;br&gt;
&lt;br&gt;
I love the real-time preview that happens on the right side pane!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/98a24fd975466d51deadc01f72856526/netlify-cms-preview.gif&quot; alt=&quot;Animated GIF showing the realtime preview of Netlify CMS&quot; title=&quot;Netlify CMS Real-time Preview&quot;&gt;&lt;/p&gt;
&lt;p&gt;And another thing I really like is that Netlify CMS is 100% open source (as opposed to Medium, which is closed source). This means that I can actually tweak and modify the functionality as I like and when I find a bug I can file an upstream issue here &lt;a href=&quot;https://github.com/netlify/netlify-cms&quot;&gt;https://github.com/netlify/netlify-cms&lt;/a&gt;. &lt;br&gt;
&lt;br&gt;
Okay, time to publish, all about the momentum!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Netlify CMS is setup (#ultraworking)]]></title><description><![CDATA[I am writing this from elijahlynn.net/admin which is using the Netlify CMS and easily lets me add images and just have a better UI to enter…]]></description><link>https://www.elijahlynn.net/blog/netlify-cms-setup-ultraworking</link><guid isPermaLink="false">https://www.elijahlynn.net/blog/netlify-cms-setup-ultraworking</guid><pubDate>Sun, 24 May 2020 23:24:57 GMT</pubDate><content:encoded>&lt;p&gt;I am writing this from elijahlynn.net/admin which is using the Netlify CMS and easily lets me add images and just have a better UI to enter content. The idea here is that it reduces friction and then I can actually write more!&lt;br&gt;
&lt;br&gt;
Testing a screenshot upload right here. Hrm, cannot paste images, need to upstream that. I did add the image below from the UI though, which is great. &lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e19b1dc512692c1590cbdcbab329fe24/84ee5/2020-05-24_16-25.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 93.91891891891892%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABKElEQVQ4y9WSb0+DMBDG+bJoeCGL24fVbHZhbKKbVGgpLaUFfNwSwh/D4KVPjuZC8rs+dz1nDW02z5v108pfXeX7v4nnea7rPnT0OJJjy1J9XOT7p/z6rpu6WSKnhKRCGK2TJBUix49inpxupaLQjGfgrbX1DPVgkJxnWmtcPsFUVV2aaggrVWSZkFKBn4BtVWfKokQPFgBlUdUVbOOc4Jux7TyX50sc04TSxBjTNEt6hm3OBZzjNMYuG5gqtLH2ll8HM6UhjKdq3d7dkCGcppyxDCXgv42uuv8xVKctg/N8jndvQRCcyP5A9iEhIfLjMbpFGEYv29OWRK+7EyEH7FLvZnhmnCPwpZQyrCtjQmB+PEVO6e3927adbg9zWv27538KN3e3caQfhI89EpmOpLYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;2020 05 24 16 25&quot;
        title=&quot;&quot;
        src=&quot;/static/e19b1dc512692c1590cbdcbab329fe24/fcda8/2020-05-24_16-25.png&quot;
        srcset=&quot;/static/e19b1dc512692c1590cbdcbab329fe24/12f09/2020-05-24_16-25.png 148w,
/static/e19b1dc512692c1590cbdcbab329fe24/e4a3f/2020-05-24_16-25.png 295w,
/static/e19b1dc512692c1590cbdcbab329fe24/fcda8/2020-05-24_16-25.png 590w,
/static/e19b1dc512692c1590cbdcbab329fe24/efc66/2020-05-24_16-25.png 885w,
/static/e19b1dc512692c1590cbdcbab329fe24/84ee5/2020-05-24_16-25.png 1076w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;I started this blog in the beginning of 2019 doing an &lt;a href=&quot;https://www.ultraworking.com/&quot;&gt;Ultraworking&lt;/a&gt; marathon and didn’t really do much since then. Now I just did another Ultraworking session now that I signed up for 24/7 workcycles with &lt;a href=&quot;https://www.ultraworking.com/twg&quot;&gt;The Work Gym&lt;/a&gt; and finally got this last step finished in a focused 5.5 hour work session! This is fantastic! Ultraworking is sooo effective.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Filesystem Commands & Notes]]></title><description><![CDATA[I’ve been digging into using AWS’ fairly new NVMe SSDs for some performance tests with the goal of ring thousands of files and multiple…]]></description><link>https://www.elijahlynn.net/blog/2019-10-25-filesystem-commands-notes</link><guid isPermaLink="false">https://www.elijahlynn.net/blog/2019-10-25-filesystem-commands-notes</guid><pubDate>Fri, 25 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been digging into using AWS’ fairly new NVMe SSDs for some performance tests with the goal of &lt;code class=&quot;language-text&quot;&gt;tar&lt;/code&gt;ring thousands of files and multiple gigabytes in under a second. Because these operations are fairly fast on my local laptop NVMe SSD, and it turns out the SSD EBS volumes, which are not local, are pretty slow compared to my local. Just documenting some commands here, like a cheat sheet that I can use later. Out of the box a c5d.2xlarge (‘d’ = enhanced (d)isk) EC2 instance has a locally attached 200GB NVMe SSD. This allows for the lowest possible latency, however, it does not come with a filesystem and therefore isn’t mounted on boot. The below commands are how to take a raw volume, put a filesytem on it and then mount it for testing.    &lt;/p&gt;
&lt;p&gt;First, let’s list out our filesystems, their size and mount path with &lt;code class=&quot;language-text&quot;&gt;df --human&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# df -h                 
Filesystem      Size  Used Avail Use% Mounted on  
devtmpfs        7.6G   64K  7.6G   1% /dev        
tmpfs           7.6G     0  7.6G   0% /dev/shm    
/dev/nvme0n1p1  985G  8.9G  976G   1% /           &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We don’t see our superfast local SSD mounted above.&lt;/p&gt;
&lt;p&gt;All &lt;code class=&quot;language-text&quot;&gt;gp2&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;io1&lt;/code&gt; EBS volumes are mounted as /dev/nvme* devices (some have pointers from /dev/sdb etc). Here we have our root &lt;code class=&quot;language-text&quot;&gt;gp2&lt;/code&gt; general purpose SSD volume, &lt;code class=&quot;language-text&quot;&gt;/dev/nvme0n1p1&lt;/code&gt; mounted at &lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt; for the entire system to run on. But, we don’t see our &lt;em&gt;real&lt;/em&gt; NVMe SSD though, nor another &lt;code class=&quot;language-text&quot;&gt;io1&lt;/code&gt; volume I attached for testing. These raw volumes both will need filesystems created before they can become useable. I will only be targeting &lt;code class=&quot;language-text&quot;&gt;nvme2&lt;/code&gt; for these examples, the fast one. &lt;/p&gt;
&lt;p&gt;Let’s list out our attached volumes with &lt;code class=&quot;language-text&quot;&gt;ls -l&lt;/code&gt; (-l = ‘long format/more info, no long-option):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# ls -l /dev/nvme*
crw------- 1 root root 250, 0 Oct 24 23:45 /dev/nvme0 # This is the root gp2 volume. 
brw-rw---- 1 root disk 259, 2 Oct 24 23:46 /dev/nvme0n1
brw-rw---- 1 root disk 259, 5 Oct 24 23:46 /dev/nvme0n1p1
brw-rw---- 1 root disk 259, 6 Oct 24 23:45 /dev/nvme0n1p128
crw------- 1 root root 250, 1 Oct 24 23:45 /dev/nvme1 # A io1 volume I have attached for testing. 
brw-rw---- 1 root disk 259, 1 Oct 24 23:45 /dev/nvme1n1
crw------- 1 root root 250, 2 Oct 24 23:45 /dev/nvme2 # The _real_, local NVMe SSD. 
brw-rw---- 1 root disk 259, 0 Oct 26 00:48 /dev/nvme2n1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next, &lt;code class=&quot;language-text&quot;&gt;blockdev --getsize64 dev/nvme2n1&lt;/code&gt; to tell us how many blocks are on our attached volume, so we can verify that the 200GB volume that I provisioned is actually the &lt;code class=&quot;language-text&quot;&gt;nvme2&lt;/code&gt; because of the &lt;code class=&quot;language-text&quot;&gt;200000000000&lt;/code&gt;: &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# blockdev --getsize64 /dev/nvme2n1 
200000000000                                                  &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;lsblk&lt;/code&gt; appears to be a bit better for checking attached volume size as it lists human-readable form by default. It also lists partitions if they exist. &lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# lsblk                  
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT 
nvme0n1       259:2    0  1000G  0 disk            
├─nvme0n1p1   259:5    0  1000G  0 part /          
└─nvme0n1p128 259:6    0     1M  0 part            
nvme2n1       259:0    0 186.3G  0 disk            
nvme1n1       259:1    0    70G  0 disk            &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mount --show-labels&lt;/code&gt; - This is the infamous &lt;code class=&quot;language-text&quot;&gt;mount -l&lt;/code&gt;, which I always thought meant &lt;code class=&quot;language-text&quot;&gt;--list&lt;/code&gt; but it doesn’t, and is the reason why all documentation should always use “—long-options”, they are self-documenting. Sample output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# mount --show-labels
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=7908016k,nr_inodes=1977004,mode=755)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /dev/shm type tmpfs (rw,relatime)
/dev/nvme0n1p1 on / type ext4 (rw,noatime,data=ordered) [/]
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next is the &lt;code class=&quot;language-text&quot;&gt;file --special-files /dev/nvme2n1&lt;/code&gt; command that we use to tell us if there is a filesystem on the volume. Here is what it looks like if there is no filesystem.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# file --special-files /dev/nvme2n1
/dev/nvme2n1: data&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we make an XFS filesystem with &lt;code class=&quot;language-text&quot;&gt;mkfs --type xfs /dev/nvme2n1&lt;/code&gt; (&lt;code class=&quot;language-text&quot;&gt;yum install xfsprogs --yes&lt;/code&gt; if the prior command throws an error):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# mkfs --type xfs /dev/nvme2n1 
meta-data=/dev/nvme2n1           isize=512    agcount=4, agsize=12207032 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0
data     =                       bsize=4096   blocks=48828125, imaxpct=25
         =                       sunit=0      swidth=0 blks 
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=23841, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we have a filesystem and we verify with &lt;code class=&quot;language-text&quot;&gt;file --special-files /dev/nvme2n1&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# file --special-files /dev/nvme2n1 
/dev/nvme2n1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;lsblk&lt;/code&gt; shows that even though we have a filesystem, there still isn’t a partition on /dev/nvme2n1, and we don’t actually need one:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# lsblk                  
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT 
nvme0n1       259:2    0  1000G  0 disk            
├─nvme0n1p1   259:5    0  1000G  0 part /          
└─nvme0n1p128 259:6    0     1M  0 part            
nvme2n1       259:0    0 186.3G  0 disk            
nvme1n1       259:1    0    70G  0 disk            &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# fdisk -l

Disk /dev/nvme2n1: 200.0 GB, 200000000000 bytes, 390625000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/nvme1n1: 75.2 GB, 75161927680 bytes, 146800640 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/nvme0n1: 1073.7 GB, 1073741824000 bytes, 2097152000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt


#         Start          End    Size  Type            Name
 1         4096   2097151966   1000G  Linux filesyste Linux
128         2048         4095      1M  BIOS boot parti BIOS Boot Partition&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Below you can see that &lt;code class=&quot;language-text&quot;&gt;ebsnvme-id&lt;/code&gt; tells us if we have EBS devices or not:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@ip-10-247-114-103 ~]# /sbin/ebsnvme-id /dev/nvme2n1 
[ERROR] Not an EBS device: &amp;#39;/dev/nvme2n1&amp;#39;
[root@ip-10-247-114-103 ~]# /sbin/ebsnvme-id /dev/nvme1n1 
Volume ID: vol-03a0af9a8cad9be07
sdb                             
[root@ip-10-247-114-103 ~]# /sbin/ebsnvme-id /dev/nvme0n1 
Volume ID: vol-0350248eed34cb730
xvda                            &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And, in the spirit of not publishing this without finishing it because if I don’t publish it right now then it may never get published because kids are begging me “how many minutes are you going to be done working” right this minute and taking my headphones off to ask it as this is the weekend coming up and it is Friday night I am going to publish this in its confusing imperfections and touch it up later. &lt;/p&gt;
&lt;p&gt;@todo Fix it to be accurate&lt;br&gt;
@todo Put cheatsheat at top&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ultra Working Plus Run Breaks]]></title><description><![CDATA[tldr; Ultra Working + Run Breaks resulted in me running nearly 2 miles in short 2-3 minute increments.   Over this past weekend I completed…]]></description><link>https://www.elijahlynn.net/blog/2019-01-08-ultra-working-plus-run-breaks</link><guid isPermaLink="false">https://www.elijahlynn.net/blog/2019-01-08-ultra-working-plus-run-breaks</guid><pubDate>Tue, 08 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;tldr; Ultra Working + Run Breaks resulted in me running nearly 2 miles in short 2-3 minute increments.  &lt;/p&gt;
&lt;p&gt;Over this past weekend I completed an Ultra Working ”&lt;a href=&quot;http://www.workmarathon.com&quot;&gt;Work Marathon&lt;/a&gt;” which was a great success. The result of it was that I built this blog and now have a place to publish this article, which is something I had put off for quite sometime, yay for progress here!&lt;/p&gt;
&lt;p&gt;Yesterday was the first day back at my day job, where I doing DevOps and Drupal on VA.gov. Around noon, I decided to go ahead and apply the same format to yesterday which was a fantastic success. The work cycles are 30 minutes each with a 10 minute break in between. I was able to get 9 work cycles in from 12:40pm to 6:30pm.&lt;/p&gt;
&lt;p&gt;Now, instead of just taking the 10 minute break I modified them with something I have been doing off and on for the past 1-2 years. Which is do short, fast “Run Breaks”. A Run Break is almost just like a cigarette break (yes, I used to smoke the nicotine when I was a teenager) but obviously leaves you in a better state. I love Run Breaks because they don’t require a large mental effort or even changing into running clothes. Before, if I had made a goal to run a mile, I might have easily put it off whereas with a Run Break, it is so short that is hard to fail. &lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9589ad7a6620c1b013ad2b6b1b1ecf38/9b06d/soles-altra-lone-peak-3.0-running-shoes-run-breaks.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 126.35135135135134%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAZABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAMBBAUC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIB/9oADAMBAAIQAxAAAAFs58zt44FlFjOtCzxIxf/EAB0QAAICAQUAAAAAAAAAAAAAAAECABIyAxARMTP/2gAIAQEAAQUCBRVskfvKHHgiaZWorLR/Tb//xAAYEQACAwAAAAAAAAAAAAAAAAABEAISIf/aAAgBAwEBPwFSFcX/xAAYEQACAwAAAAAAAAAAAAAAAAAAARAREv/aAAgBAgEBPwERm4//xAAgEAACAQMEAwAAAAAAAAAAAAAAAREQITECAyJBI1FS/9oACAEBAAY/ArqWLxo44NE+4NyfqwkKesDt3NFX/8QAHRABAAIDAAMBAAAAAAAAAAAAAQARITFBUWGhsf/aAAgBAQABPyEs3ea8RBTSvePqAyyRcSrWGyK1GifiUQ4blCG12hqHbYdjlPohqE//2gAMAwEAAgADAAAAEGvfsP/EABYRAQEBAAAAAAAAAAAAAAAAAAEAQf/aAAgBAwEBPxDJCB6lv//EABcRAQEBAQAAAAAAAAAAAAAAAAEAESH/2gAIAQIBAT8QM2Sl2ewYZf/EAB8QAQACAgICAwAAAAAAAAAAAAEAESExQYFhkVFxof/aAAgBAQABPxAx+STgd4mUKSIugo6ZlK+GXs8QqKd5vh9NQKoCJxRh6IupaxDt5YELwDP3EEkdAdpY0ClxPwpomk//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;The soles of my Altra Lonepeak 3.0 running shoes, heavily worn down&quot;
        title=&quot;&quot;
        src=&quot;/static/9589ad7a6620c1b013ad2b6b1b1ecf38/1c72d/soles-altra-lone-peak-3.0-running-shoes-run-breaks.jpg&quot;
        srcset=&quot;/static/9589ad7a6620c1b013ad2b6b1b1ecf38/a80bd/soles-altra-lone-peak-3.0-running-shoes-run-breaks.jpg 148w,
/static/9589ad7a6620c1b013ad2b6b1b1ecf38/1c91a/soles-altra-lone-peak-3.0-running-shoes-run-breaks.jpg 295w,
/static/9589ad7a6620c1b013ad2b6b1b1ecf38/1c72d/soles-altra-lone-peak-3.0-running-shoes-run-breaks.jpg 590w,
/static/9589ad7a6620c1b013ad2b6b1b1ecf38/a8a14/soles-altra-lone-peak-3.0-running-shoes-run-breaks.jpg 885w,
/static/9589ad7a6620c1b013ad2b6b1b1ecf38/fbd2c/soles-altra-lone-peak-3.0-running-shoes-run-breaks.jpg 1180w,
/static/9589ad7a6620c1b013ad2b6b1b1ecf38/9b06d/soles-altra-lone-peak-3.0-running-shoes-run-breaks.jpg 2669w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The wear on my Altra running shoes of all my run breaks over the past 1-2 years&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Before Ultra Working though, I was lucky to get 1-2 Run Breaks in per day, and some days and weeks I would skip them altogether. I always had a goal of getting to do 1 Run Break per hour, especially since I work at home and know there are health consequences to those who don’t exercise and remain sedentary. So us “work at homers” need to be proactive about activating our lymph system and moving some blood around from time to time. So, I had a vision of running more and then came this past weekends Work Marathon. &lt;/p&gt;
&lt;p&gt;So back to yesterday, I applied the Work Marathon format and made a copy of the Google Sheet that was provided to us, this sheet is key to the program and gives the structure and sets the cadence. I also combined it with my lifetime subscription to &lt;a href=&quot;http://ssqt.co/mQd5Zg9&quot;&gt;Focus@Will&lt;/a&gt; (referral link, $20 credit for you, $20 gift card to me) and some Bose QC35 Noise Cancelling headphones which together are like a peanut butter and jelly sandwich, perfect pairing! Then for the breaks I decided to do combine my Run Breaks during the 10 minute break. I was amazed, it worked! Over the next 7-8 cycles, I ran around the block every break! Each run around the block is a little over .25 miles which meant I had run close to 2 miles! And the best thing about it is that not only was the Work Cycle format successful during my day job but I was able to incorporate my goal of running every hour into it. &lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b7097bb896cc6ee4ea1ed2c83244539d/f6b72/my-run-around-the-block-quarter-mile.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 133.78378378378378%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAIAAADzvTiPAAAACXBIWXMAAAsSAAALEgHS3X78AAADGElEQVQ4y2WU21LbMBCG/f5v1Ollr0sZhiYQoCUH42BLluWDnISk7be7cYDpju2RJe3h//eQHY/H/X4fmibG2Kn0fd/9J9w5HA4sWpWU0jiO2fF4Wi6XT0+/Fg+P36+ufj8/l2X1qrLdbvmWZblara6vr8VHCJVzVeV2ux1eM+xxySxxNgwDB+Mkh/0OHVw9Pj7azk4lqWScVWWJThNbHhbcSMm+yYfeYvbeA2dIKTSxDhFsEjZbRVFgDPPA5tesEslu7L9cua/ffizu57PZvKoqFHwdvA9t14lyWVXL1RLbuK1DwwN55pkoQuzzoiyKl4eHB5wTdD+oWNjO+/vFAp9t16OPSR6U0yQEdTi8QUeD0XFsuo6sGLqscv7nbOYc4UTOjRXjbxIxATTN4uBDw9NZ2HUIeZ7jzfu6rkM3YW7VA+EYNy8vL3xZGzTsiDIvmRSTKIdwIYxjLjnZlHCMVPa5KbQr6rOyebY8n6FCGFeVHe5s8hxCxs+ScY8iEeU64MSU7SslMY5WWJDan0vgXaawh8H54LXEz0li1baGAp4p3k8kmmcuQYbciFEUYmvKvm6kHjQctIhuNCD9AB04gbys2L6CRwqY7E3GCbw/y6BFmYwwNRpCjHzJVvZaVre3tzgkbErkgooFWlZMxrYd9e8FlkR5NpsRxjlCvWpn/LLZKBBq4WPxWCGCuZHq6XuvdLHoMJ4Gg0dEbLLx0XPS3uIRtiEDYkspCOkKnNFh/GC7ETg1Vs6EKZGge1d2zknFR1qyNYzYplFY8EMglwrjEOutFrmwzTu/u2P0MHPmc5Z3NoAQFIptgWnm1M3NDTPHJsmFlOx0OtEQ6w35yqXU2qhDQaRRYYGR9XrNBAQLKNh5UxHPFo8MTZ00GN9Pwo2DCj741QqRZmbNN3N1DQTQSvabSHvjjCKRFMEieJwDCEH+meSvCi4zTxsOA/SYssyE2FpLWlVjIkxiWAgEZQmbxBAsyKx1vc6DUaaPcLPZbGALzzDCly7I8w2Ro4yJDHzkSQdqE3RKaAMny6rG3l76lLW0HRwlinf4BxSL98uvRZxTAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Google Map distance measurement of my Run Break around the block&quot;
        title=&quot;&quot;
        src=&quot;/static/b7097bb896cc6ee4ea1ed2c83244539d/fcda8/my-run-around-the-block-quarter-mile.png&quot;
        srcset=&quot;/static/b7097bb896cc6ee4ea1ed2c83244539d/12f09/my-run-around-the-block-quarter-mile.png 148w,
/static/b7097bb896cc6ee4ea1ed2c83244539d/e4a3f/my-run-around-the-block-quarter-mile.png 295w,
/static/b7097bb896cc6ee4ea1ed2c83244539d/fcda8/my-run-around-the-block-quarter-mile.png 590w,
/static/b7097bb896cc6ee4ea1ed2c83244539d/f6b72/my-run-around-the-block-quarter-mile.png 615w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Google Map distance measurement of my Run Break around the block&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In closing, the Work Cycles format combined with the noise cancelling headphones and Focus@Will were already the perfect match, but adding in Run Breaks really tops it off!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Write It Out]]></title><description><![CDATA[I taught myself how to code when I was 30. I am 37 now and have had many days where I got my ass kicked. In the beginning, I got my ass…]]></description><link>https://www.elijahlynn.net/blog/2019-01-04-write-it-out</link><guid isPermaLink="false">https://www.elijahlynn.net/blog/2019-01-04-write-it-out</guid><pubDate>Fri, 04 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I taught myself how to code when I was 30. I am 37 now and have had many days where I got my ass kicked. In the beginning, I got my ass kicked more days than I kicked ass. At some point the tide turned, and I started kicking ass more than I got my ass kicked. At some point you just absorb something called intuition and you can figure things out much quicker than you were able to before, like driving a car I suppose.&lt;/p&gt;
&lt;p&gt;One tool I found along the way that I really, really value is a very simple technique for solving challenges that anyone in any profession can use. In the software industry this technique we use is called Rubber Duck Debugging. The concept is that you get yourself a cute rubber duck (or a BIG one), put it wherever you can make eye contact with it.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ba826a01589945bd56a76b043a81d9fb/4012a/life-size-rubber-duck-floating-on-water.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 590px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFAgP/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAXuEvBPkw0f/xAAaEAACAwEBAAAAAAAAAAAAAAAAAQIDBBEh/9oACAEBAAEFAnOuEHogPRWXM8OI/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/ARV//8QAGxAAAgIDAQAAAAAAAAAAAAAAAAEREhAhMnH/2gAIAQEABj8CsnPhEnQq6z//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhQTFRkdH/2gAIAQEAAT8hxXIQ6ZZ+IVPAGiVyQ8j1z//aAAwDAQACAAMAAAAQ/wAf/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/EDF//8QAFhEAAwAAAAAAAAAAAAAAAAAAAAER/9oACAECAQE/EGorP//EAB4QAQEAAgICAwAAAAAAAAAAAAERACExoUFRkcHR/9oACAEBAAE/EKCpCIXe9mNUAWqk4H76xDnf+ZqzKSC3y4qlJN6ejKuHxn//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Yellow Building Sized Rubber Duck floating on a river near a small city with medium sized skyscrapers in the background&quot;
        title=&quot;&quot;
        src=&quot;/static/ba826a01589945bd56a76b043a81d9fb/1c72d/life-size-rubber-duck-floating-on-water.jpg&quot;
        srcset=&quot;/static/ba826a01589945bd56a76b043a81d9fb/a80bd/life-size-rubber-duck-floating-on-water.jpg 148w,
/static/ba826a01589945bd56a76b043a81d9fb/1c91a/life-size-rubber-duck-floating-on-water.jpg 295w,
/static/ba826a01589945bd56a76b043a81d9fb/1c72d/life-size-rubber-duck-floating-on-water.jpg 590w,
/static/ba826a01589945bd56a76b043a81d9fb/a8a14/life-size-rubber-duck-floating-on-water.jpg 885w,
/static/ba826a01589945bd56a76b043a81d9fb/4012a/life-size-rubber-duck-floating-on-water.jpg 980w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rubber Duck Project 2009 by kazuma jp
CC-BY 2.0 &lt;a href=&quot;https://www.flickr.com/photos/kazuma_jp/3928192219&quot;&gt;https://www.flickr.com/photos/kazuma_jp/3928192219&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And you talk to the Rubber Duck. You talk to the Rubber Duck out loud. You tell the Rubber Duck about your challenge. You explain the challenge, step by step, in detail to the Rubber Duck. You explain your challenge to your new friend, Rubber Duck.&lt;/p&gt;
&lt;p&gt;How many times has the act of explaining something led you to the answer mid-sentence?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;me: Hey Person McPerson, do you know where I put my …&lt;br&gt;
me: Oh, never-mind, I just remembered where I put it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was a pretty glorified example but it illustrates a point. The person didn’t even respond, but you now have an answer. This has happened to everyone on the planet at least once.&lt;/p&gt;
&lt;p&gt;You explain to Rubber Duck just like you would explain to your highly paid colleague whom has two input devices (ears) attached to a high-speed, functioning logic unit (brain) attached to an audible output device (mouth + vocal cords). When you are successful with a one-way dialogue with either your Rubber Duck or your Highly Paid Colleague you now have the answer and there are two differences between the two, the first is obvious which is cost, the second is independence, yup INDEPENDENCE! You didn’t need to wait, you figured it out yourself, and you further strengthened your psyche that you can figure shit out, which is one of the better highs in this life.&lt;/p&gt;
&lt;p&gt;The act of explaining your challenge out to Rubber Duck turns out to be extremely insightful and usually helpful and most importantly it is very effective. The Rubber Duck method has 100% of the time always produced progress for me. Sometimes challenges are hard and all challenges are solved with progress. Rubber Duck delivers progress, sometimes big gains, sometimes barely incremental progress, but it is progress.&lt;/p&gt;
&lt;p&gt;I use Rubber Duck debugging daily but not how I explained earlier. I don’t actually have a Rubber Duck and I don’t talk actually talk out loud to my Rubber Duck. Instead… my Rubber Duck is a text document, a daily journal that I type my challenges into, the file isn’t even named Rubber Duck Diary or anything like that. I don’t care if it gets erased or saved past my current challenge. I just open a text document, I type my current challenge, then solutionize just below. I do not care about punctuation or grammar. I just start typing, listing out thoughts and action steps that usually lead to uncovering the next piece of the puzzle, continuously making progress. It is like a loose to-do list, just a flow of the mind, and I love that it produces progress, every time.&lt;/p&gt;
&lt;p&gt;Rubber Duck = Progress.&lt;/p&gt;
&lt;p&gt;=======================================&lt;br&gt;
tl;dr&lt;/p&gt;
&lt;p&gt;Oh Rubber Duck, Rubber Duck&lt;br&gt;
Let me tell you&lt;br&gt;
I’ve got this challenge&lt;br&gt;
That I just need you to see&lt;br&gt;
Please let me type&lt;br&gt;
My thoughts into you&lt;br&gt;
Then tell me what you think&lt;br&gt;
Oh whats that&lt;br&gt;
You have a next step&lt;br&gt;
Why thank you kind fellow&lt;br&gt;
We shall meet again soon&lt;br&gt;
Rubber Duck, Rubber Duck…  &lt;/p&gt;
&lt;p&gt;(loop until challenge solved)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[It's alive!]]></title><description><![CDATA[This is my first post on my new blog! The site is built with Gatsby.js which is powered by React JS and GraphQL. It has offline support…]]></description><link>https://www.elijahlynn.net/blog/2019-01-02-its-alive</link><guid isPermaLink="false">https://www.elijahlynn.net/blog/2019-01-02-its-alive</guid><pubDate>Wed, 02 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is my first post on my new blog!&lt;/p&gt;
&lt;p&gt;The site is built with Gatsby.js which is powered by React JS and GraphQL. It has offline support thanks to a Service Worker! And for a superfast first load it also is using HTTP/2 (H2), I thought it was interesting that when pulling from the Service Worker cache it uses HTTP/1.1 as the protocol, so to test I needed to flush the Service Worker cache!&lt;/p&gt;
&lt;p&gt;I built this during day 1 of the &lt;a href=&quot;http://www.workmarathon.com&quot;&gt;Ultra Working Marathon&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The source code is at &lt;a href=&quot;https://gitlab.com/elijahlynn/www.elijahlynn.net&quot;&gt;https://gitlab.com/elijahlynn/www.elijahlynn.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I originally had it hosted on Surge but had issues with https and service worker registration and moved it to Netlify and setup autodeploy from GitLab!&lt;/p&gt;
&lt;p&gt;More to come!&lt;/p&gt;</content:encoded></item></channel></rss>